{"version":3,"sources":["../../../src/harness/v1/events.ts","../../../src/harness/v1/session.ts","../../../src/harness/v1/harness.ts"],"names":["randomUUID","RequestContext","createHash"],"mappings":"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","file":"index.cjs","sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { SessionRecord } from '../../storage/domains/harness';\n\nexport interface HarnessEventBase {\n  id: string;\n  timestamp: number;\n  sessionId?: string;\n  subagentSessionId?: string;\n  runId?: string;\n  signalId?: string;\n  queuedItemId?: string;\n}\n\nexport interface SessionCreatedEvent extends HarnessEventBase {\n  type: 'session_created';\n  resourceId: string;\n  threadId: string;\n  parentSessionId?: string;\n  modeId: string;\n  modelId: string;\n}\n\nexport interface ModeChangedEvent extends HarnessEventBase {\n  type: 'mode_changed';\n  modeId: string;\n  previousModeId: string;\n}\n\nexport interface ModelChangedEvent extends HarnessEventBase {\n  type: 'model_changed';\n  modelId: string;\n  previousModelId: string;\n}\n\nexport interface ThreadClonedEvent extends HarnessEventBase {\n  type: 'thread_cloned';\n  threadId: string;\n  resourceId: string;\n  sourceThreadId: string;\n  title?: string;\n}\n\nexport interface CustomEvent extends HarnessEventBase {\n  type: string;\n  payload?: JsonSerializable;\n}\n\nexport type HarnessEvent = SessionCreatedEvent | ModeChangedEvent | ModelChangedEvent | ThreadClonedEvent | CustomEvent;\nexport type HarnessEventListener = (event: HarnessEvent) => void | Promise<void>;\nexport type HarnessEventUnsubscribe = () => void;\n\nexport const HARNESS_EVENT_ID_PREFIX = 'harness-v1';\n\nexport interface ParsedHarnessEventId {\n  epoch: string;\n  sequence: number;\n}\n\nexport class HarnessValidationError extends Error {\n  constructor(\n    readonly path: string,\n    message: string,\n  ) {\n    super(`${path}: ${message}`);\n    this.name = 'HarnessValidationError';\n  }\n}\n\nexport class HarnessEventSerializationError extends HarnessValidationError {\n  constructor(\n    readonly eventType: string,\n    readonly reason: EventSerializationReason,\n    readonly sessionId?: string,\n  ) {\n    super('event.payload', `custom event \"${eventType}\" payload is not JSON-serializable: ${reason}`);\n    this.name = 'HarnessEventSerializationError';\n  }\n}\n\nexport type EventSerializationReason =\n  | 'undefined'\n  | 'function'\n  | 'symbol'\n  | 'bigint'\n  | 'date'\n  | 'map'\n  | 'set'\n  | 'typed-array'\n  | 'non-plain-object'\n  | 'cycle';\n\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonSerializable = JsonPrimitive | JsonSerializable[] | { [key: string]: JsonSerializable };\n\ntype DistributiveOmit<T, K extends keyof never> = T extends unknown ? Omit<T, K> : never;\nexport type EmitInput = DistributiveOmit<HarnessEvent, 'id' | 'timestamp' | 'sessionId'>;\n\nexport interface EmitterScope {\n  sessionId?: string;\n}\n\nexport function formatHarnessEventId(epoch: string, sequence: number): string {\n  if (epoch.length === 0 || epoch.includes(':')) {\n    throw new HarnessValidationError('eventId.epoch', 'epoch must be non-empty and must not contain \":\"');\n  }\n  if (!Number.isSafeInteger(sequence) || sequence < 0) {\n    throw new HarnessValidationError('eventId.sequence', 'sequence must be a non-negative safe integer');\n  }\n  return `${HARNESS_EVENT_ID_PREFIX}:${epoch}:${sequence}`;\n}\n\nexport function parseHarnessEventId(eventId: string): ParsedHarnessEventId {\n  const parts = eventId.split(':');\n  if (parts.length !== 3 || parts[0] !== HARNESS_EVENT_ID_PREFIX || parts[1] === '' || parts[2] === '') {\n    throw new HarnessValidationError('lastEventId', 'expected event id grammar harness-v1:<epoch>:<seq>');\n  }\n\n  const sequenceText = parts[2]!;\n  if (!/^(0|[1-9][0-9]*)$/.test(sequenceText)) {\n    throw new HarnessValidationError('lastEventId', 'event id sequence must be an unsigned decimal integer');\n  }\n\n  const sequence = Number(sequenceText);\n  if (!Number.isSafeInteger(sequence)) {\n    throw new HarnessValidationError('lastEventId', 'event id sequence must be within JavaScript safe integer range');\n  }\n\n  return { epoch: parts[1]!, sequence };\n}\n\nexport function sessionCreatedPayload(\n  record: SessionRecord,\n): Omit<SessionCreatedEvent, keyof HarnessEventBase | 'type'> {\n  return {\n    resourceId: record.resourceId,\n    threadId: record.threadId,\n    parentSessionId: record.parentSessionId,\n    modeId: record.modeId,\n    modelId: record.modelId,\n  };\n}\n\nexport function assertCustomEventType(eventType: string): void {\n  if (RESERVED_EVENT_TYPES.has(eventType) || RESERVED_EVENT_PREFIXES.some(prefix => eventType.startsWith(prefix))) {\n    throw new HarnessValidationError('event.type', `\"${eventType}\" is reserved by the harness`);\n  }\n  if (!eventType.includes('.')) {\n    throw new HarnessValidationError('event.type', 'custom event types must be namespaced with a dot');\n  }\n}\n\nexport function assertJsonSerializable(eventType: string, sessionId: string | undefined, value: unknown): void {\n  visitJsonValue(eventType, sessionId, value, new WeakSet<object>());\n}\n\nexport class EventEmitter {\n  private readonly listeners: HarnessEventListener[] = [];\n  private epoch?: string;\n  private seq: number;\n  private readonly scope: EmitterScope;\n  private readonly onEvent?: HarnessEventListener;\n\n  constructor(\n    scope: EmitterScope = {},\n    opts: { onEvent?: HarnessEventListener; epoch?: string; nextSequence?: number } = {},\n  ) {\n    this.scope = scope;\n    this.onEvent = opts.onEvent;\n    this.epoch = opts.epoch;\n    this.seq = opts.nextSequence ?? 0;\n    formatHarnessEventId(this.epoch ?? 'pending-epoch', this.seq);\n  }\n\n  scoped(scope: EmitterScope): EventEmitter {\n    return new EventEmitter(\n      { ...this.scope, ...scope },\n      {\n        onEvent: event => this.forward(event),\n      },\n    );\n  }\n\n  subscribe(listener: HarnessEventListener): HarnessEventUnsubscribe {\n    this.listeners.push(listener);\n    return () => {\n      const index = this.listeners.indexOf(listener);\n      if (index !== -1) this.listeners.splice(index, 1);\n    };\n  }\n\n  emit(event: EmitInput, overrides?: { sessionId?: string }): HarnessEvent {\n    const sessionId = overrides?.sessionId ?? this.scope.sessionId;\n    this.validateCustomEvent(event, sessionId);\n    const stamped = {\n      ...event,\n      id: formatHarnessEventId(this.epochId, this.seq++),\n      timestamp: Date.now(),\n      ...(sessionId !== undefined && { sessionId }),\n    } as HarnessEvent;\n    this.dispatch(stamped);\n    return stamped;\n  }\n\n  forward(event: HarnessEvent): void {\n    this.dispatch(event);\n  }\n\n  get listenerCount(): number {\n    return this.listeners.length;\n  }\n\n  get epochId(): string {\n    this.epoch ??= randomUUID();\n    return this.epoch;\n  }\n\n  private validateCustomEvent(event: EmitInput, sessionId: string | undefined): void {\n    const eventType = (event as { type?: unknown }).type;\n    if (typeof eventType !== 'string' || RESERVED_EVENT_TYPES.has(eventType)) return;\n\n    assertCustomEventType(eventType);\n    if (Object.prototype.hasOwnProperty.call(event, 'payload')) {\n      assertJsonSerializable(eventType, sessionId, (event as { payload?: unknown }).payload);\n    }\n  }\n\n  private dispatch(event: HarnessEvent): void {\n    if (this.onEvent) {\n      try {\n        const result = this.onEvent(event);\n        if (result && typeof (result as Promise<void>).catch === 'function') {\n          (result as Promise<void>).catch(err => console.error('[harness/v1] event persistence rejected:', err));\n        }\n      } catch (err) {\n        console.error('[harness/v1] event persistence threw:', err);\n      }\n    }\n\n    for (const listener of [...this.listeners]) {\n      try {\n        const result = listener(event);\n        if (result && typeof (result as Promise<void>).catch === 'function') {\n          (result as Promise<void>).catch(err => console.error('[harness/v1] event listener rejected:', err));\n        }\n      } catch (err) {\n        console.error('[harness/v1] event listener threw:', err);\n      }\n    }\n  }\n}\n\nconst RESERVED_EVENT_TYPES = new Set(['session_created', 'mode_changed', 'model_changed', 'thread_cloned']);\n\nconst RESERVED_EVENT_PREFIXES = ['session_', 'thread_'];\n\nfunction visitJsonValue(eventType: string, sessionId: string | undefined, value: unknown, seen: WeakSet<object>): void {\n  if (value === undefined) throwSerialization(eventType, sessionId, 'undefined');\n  if (typeof value === 'function') throwSerialization(eventType, sessionId, 'function');\n  if (typeof value === 'symbol') throwSerialization(eventType, sessionId, 'symbol');\n  if (typeof value === 'bigint') throwSerialization(eventType, sessionId, 'bigint');\n  if (value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return;\n  if (value instanceof Date) throwSerialization(eventType, sessionId, 'date');\n  if (value instanceof Map) throwSerialization(eventType, sessionId, 'map');\n  if (value instanceof Set) throwSerialization(eventType, sessionId, 'set');\n  if (ArrayBuffer.isView(value)) throwSerialization(eventType, sessionId, 'typed-array');\n  if (typeof value !== 'object') return;\n\n  if (seen.has(value)) throwSerialization(eventType, sessionId, 'cycle');\n  seen.add(value);\n\n  if (Array.isArray(value)) {\n    for (const item of value) visitJsonValue(eventType, sessionId, item, seen);\n    seen.delete(value);\n    return;\n  }\n\n  const prototype = Object.getPrototypeOf(value);\n  if (prototype !== Object.prototype && prototype !== null) {\n    throwSerialization(eventType, sessionId, 'non-plain-object');\n  }\n\n  for (const item of Object.values(value)) {\n    visitJsonValue(eventType, sessionId, item, seen);\n  }\n  seen.delete(value);\n}\n\nfunction throwSerialization(eventType: string, sessionId: string | undefined, reason: EventSerializationReason): never {\n  throw new HarnessEventSerializationError(eventType, reason, sessionId);\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { RequestContext } from '@internal/core/request-context';\nimport type { MastraDBMessage } from '../../agent/message-list';\nimport type { MastraMemory, StorageThreadType } from '../../memory';\nimport type { DynamicArgument } from '../../types';\nimport type { EventEmitter } from './events';\nimport type { HarnessMode } from './mode';\nimport type { CloneSessionOptions, SessionConfig } from './session.types';\n\nexport class Session {\n  /** Stable identity. Frozen at construction. */\n  readonly #id: string;\n  readonly #ownerId: string;\n  readonly #resourceId: string;\n  readonly #threadId: string;\n  readonly #createdAt: Date;\n  readonly #lastActivityAt: Date;\n  readonly #memory: MastraMemory | DynamicArgument<MastraMemory>;\n  readonly #events: EventEmitter;\n  // readonly parentSessionId?: string;\n  // readonly subagentDepth: number;\n\n  #modelId: string;\n  #mode: HarnessMode;\n\n  constructor(config: SessionConfig) {\n    this.#id = config.id;\n    this.#ownerId = config.ownerId;\n    this.#resourceId = config.resourceId;\n    this.#threadId = config.threadId;\n    this.#mode = config.mode;\n    this.#modelId = config.model;\n    this.#createdAt = config.createdAt;\n    this.#lastActivityAt = config.lastActivityAt;\n    this.#memory = config.memory;\n    this.#events = config.events;\n  }\n\n  get id(): string {\n    return this.#id;\n  }\n\n  get ownerId(): string {\n    return this.#ownerId;\n  }\n\n  get resourceId(): string {\n    return this.#resourceId;\n  }\n\n  get threadId(): string {\n    return this.#threadId;\n  }\n\n  get createdAt(): Date {\n    return this.#createdAt;\n  }\n\n  async clone(opts: CloneSessionOptions = {}): Promise<Session> {\n    const result = await (\n      await this.#resolveMemory()\n    ).cloneThread({\n      sourceThreadId: this.#threadId,\n      newThreadId: opts.threadId,\n      resourceId: opts.resourceId ?? this.#resourceId,\n      title: opts.title,\n      metadata: opts.metadata,\n      options: opts.messageLimit !== undefined ? { messageLimit: opts.messageLimit } : undefined,\n    });\n\n    const cloneId = opts.sessionId ?? randomUUID();\n    const clone = new Session({\n      id: cloneId,\n      ownerId: this.#ownerId,\n      threadId: result.thread.id,\n      resourceId: result.thread.resourceId,\n      mode: opts.mode ?? this.#mode,\n      model: opts.modelId ?? this.#modelId,\n      createdAt: result.thread.createdAt,\n      lastActivityAt: result.thread.updatedAt,\n      memory: this.#memory,\n      events: this.#events.scoped({ sessionId: cloneId }),\n    });\n\n    this.#events.emit({\n      type: 'thread_cloned',\n      threadId: clone.threadId,\n      resourceId: clone.resourceId,\n      sourceThreadId: this.#threadId,\n      title: opts.title,\n    });\n\n    return clone;\n  }\n\n  async getThread(): Promise<StorageThreadType | null> {\n    return (await this.#resolveMemory()).getThreadById({ threadId: this.#threadId });\n  }\n\n  async getMessages(): Promise<MastraDBMessage[]> {\n    const result = await (\n      await this.#resolveMemory()\n    ).recall({ threadId: this.#threadId, resourceId: this.#resourceId });\n    return result.messages;\n  }\n\n  async saveMessages(\n    messages: MastraDBMessage[],\n  ): Promise<{ messages: MastraDBMessage[]; usage?: { tokens: number } }> {\n    return (await this.#resolveMemory()).saveMessages({ messages });\n  }\n\n  getModelId(): string {\n    return this.#modelId;\n  }\n\n  setModelId(modelId: string) {\n    const previousModelId = this.#modelId;\n    this.#modelId = modelId;\n    if (modelId !== previousModelId) {\n      this.#events.emit({ type: 'model_changed', modelId, previousModelId });\n    }\n  }\n\n  getMode(): HarnessMode {\n    return this.#mode;\n  }\n\n  setMode(mode: HarnessMode) {\n    const previousModeId = this.#mode.id;\n    this.#mode = mode;\n    if (mode.id !== previousModeId) {\n      this.#events.emit({ type: 'mode_changed', modeId: mode.id, previousModeId });\n    }\n  }\n\n  async #buildRequestContext(requestContext?: RequestContext): Promise<RequestContext> {\n    requestContext ??= new RequestContext();\n    const harnessContext = {\n      threadId: this.#threadId,\n      resourceId: this.#resourceId,\n      modeId: this.#mode.id,\n\n      // harnessId: this.id,\n      // state: this.getState(),\n      // getState: () => this.getState(),\n      // setState: updates => this.setState(updates),\n      // updateState: updater => this.updateState(updater),\n      // threadId: this.currentThreadId,\n      // resourceId: this.resourceId,\n      // modeId: this.currentModeId,\n      // abortSignal: this.abortController?.signal,\n      // workspace: this.workspace,\n      // emitEvent: event => this.emit(event),\n      // registerQuestion: params => this.registerQuestion(params),\n      // registerPlanApproval: params => this.registerPlanApproval(params),\n      // getSubagentModelId: params => this.getSubagentModelId(params),\n    };\n\n    requestContext.set('harness', harnessContext);\n\n    // if (this.workspaceFn) {\n    //   const resolved = await Promise.resolve(this.workspaceFn({ requestContext }));\n    //   harnessContext.workspace = resolved;\n    //   // Cache for getWorkspace() so callers outside request flow (e.g. /skills) can access it\n    //   this.workspace = resolved;\n    // }\n\n    return requestContext;\n  }\n\n  async #resolveMemory(): Promise<MastraMemory> {\n    const mem = this.#memory;\n    if (!mem) {\n      throw new Error('Memory is not configured on this Harness');\n    }\n    if (typeof mem !== 'function') {\n      return mem;\n    }\n    const requestContext = await this.#buildRequestContext();\n    const resolved = await mem({ requestContext });\n    if (!resolved) {\n      throw new Error('Dynamic memory factory returned empty value');\n    }\n    return resolved;\n  }\n}\n","import { createHash, randomUUID } from 'node:crypto';\n\nimport type { MastraMemory } from '../../memory';\nimport type { MastraCompositeStore } from '../../storage';\nimport type { HarnessStorage, SessionRecord } from '../../storage/domains/harness';\nimport type { DynamicArgument } from '../../types';\nimport { EventEmitter, sessionCreatedPayload } from './events';\nimport type { HarnessEventListener, HarnessEventUnsubscribe } from './events';\nimport type { HarnessConfig } from './harness.types';\nimport type { HarnessMode } from './mode';\nimport { Session } from './session';\nimport type { CloneSessionOptions } from './session.types';\n\ntype SessionByIdOptions = {\n  sessionId: string;\n  resourceId?: string;\n};\n\ntype SessionByThreadOptions = {\n  sessionId?: undefined;\n  threadId: string;\n  resourceId: string;\n  modeId?: string;\n  modelId?: string;\n};\n\ntype SessionOptions = SessionByIdOptions | SessionByThreadOptions;\n\nexport class Harness<MODES extends HarnessMode[]> {\n  readonly #ownerId: string;\n  readonly #defaultMode: string;\n  readonly #modesById = new Map<string, MODES[number]>();\n  readonly #storage?: HarnessStorage;\n  readonly #compositeStorage?: MastraCompositeStore;\n  readonly #memory: MastraMemory | DynamicArgument<MastraMemory>;\n  readonly #events: EventEmitter;\n\n  constructor(config: HarnessConfig<MODES>) {\n    if (!config.modes.length) {\n      throw new Error('The harness needs modes to operate.');\n    }\n\n    this.#ownerId = config.ownerId ?? randomUUID();\n    this.#defaultMode = config.defaultModeId ?? config.modes[0]!.id;\n    this.#storage = config.storage;\n    this.#compositeStorage = config.mastra?.getStorage();\n    this.#memory = config.memory;\n    this.#events = new EventEmitter();\n\n    const modes = config.modes ?? [];\n    for (const mode of modes) {\n      if (this.#modesById.has(mode.id)) {\n        throw new Error(`Duplicate mode id \"${mode.id}\" found when creating the Harness`);\n      }\n\n      if (mode.tools && mode.additionalTools) {\n        throw new Error(`Mode \"${mode.id} cannot set both \"tools\" and \"additionalTools\" - choose replace OR augment`);\n      }\n      this.#modesById.set(mode.id, mode);\n    }\n  }\n\n  get ownerId(): string {\n    return this.#ownerId;\n  }\n\n  subscribe(listener: HarnessEventListener): HarnessEventUnsubscribe {\n    return this.#events.subscribe(listener);\n  }\n\n  emit(event: Parameters<EventEmitter['emit']>[0]): ReturnType<EventEmitter['emit']> {\n    return this.#events.emit(event);\n  }\n\n  listModes(): HarnessMode[] {\n    return [...this.#modesById.values()];\n  }\n\n  /**\n   * Look up a single mode by id. Returns `undefined` if no mode with that id\n   * is registered. For the throwing variant used during request resolution,\n   * see the internal `_getMode` helper.\n   */\n  getMode(modeId: string): HarnessMode | undefined {\n    return this.#modesById.get(modeId);\n  }\n\n  async listSessions(): Promise<SessionRecord[]> {\n    const storage = await this.#requireStorage();\n    return storage.listSessions();\n  }\n\n  async session(opts: SessionOptions): Promise<Session> {\n    const storage = await this.#requireStorage();\n\n    if ('threadId' in opts) {\n      return this.#sessionByThread(storage, opts);\n    }\n\n    const record = await this.#loadSessionRecord(storage, opts.sessionId, opts.resourceId);\n    return this.#sessionFromRecord(record);\n  }\n\n  async cloneSession(session: Session, opts: CloneSessionOptions = {}): Promise<Session> {\n    const storage = await this.#requireStorage();\n    const source = await this.#loadSessionRecord(storage, session.id, session.resourceId);\n    const modeId = opts.modeId ?? source.modeId;\n    const mode = this.#modesById.get(modeId);\n    if (!mode) {\n      throw new Error(`Harness session \"${source.id}\" cannot clone into unknown mode \"${modeId}\"`);\n    }\n\n    const clone = await session.clone({\n      ...opts,\n      resourceId: opts.resourceId ?? source.resourceId,\n      mode,\n      modelId: opts.modelId ?? source.modelId,\n    });\n    const record: SessionRecord = {\n      ...source,\n      id: clone.id,\n      ownerId: this.#ownerId,\n      threadId: clone.threadId,\n      resourceId: clone.resourceId,\n      parentSessionId: opts.parentSessionId ?? source.id,\n      origin: opts.origin ?? source.origin,\n      modeId: opts.modeId ?? source.modeId,\n      modelId: opts.modelId ?? source.modelId,\n    };\n\n    await storage.saveSession(record);\n    this.#events.emit({ type: 'session_created', ...sessionCreatedPayload(record) });\n    return this.#sessionFromRecord(record);\n  }\n\n  async #sessionByThread(storage: HarnessStorage, opts: SessionByThreadOptions): Promise<Session> {\n    const id = this.#sessionIdFor(opts.resourceId, opts.threadId);\n    const existing = await storage.loadSession(id);\n    if (existing) {\n      return this.#sessionFromRecord(existing);\n    }\n\n    const modeId = opts.modeId ?? this.#defaultMode;\n    const mode = this.#modesById.get(modeId);\n    if (!mode) {\n      throw new Error(`Harness session for thread \"${opts.threadId}\" cannot use unknown mode \"${modeId}\"`);\n    }\n\n    const record: SessionRecord = {\n      id,\n      ownerId: this.#ownerId,\n      threadId: opts.threadId,\n      resourceId: opts.resourceId,\n      origin: 'top-level',\n      modeId,\n      modelId: opts.modelId ?? mode.defaultModelId,\n      createdAt: new Date(),\n      lastActivityAt: new Date(),\n    };\n\n    await storage.saveSession(record);\n    this.#events.emit({ type: 'session_created', ...sessionCreatedPayload(record) });\n    return this.#sessionFromRecord(record);\n  }\n\n  async #loadSessionRecord(storage: HarnessStorage, sessionId: string, resourceId?: string): Promise<SessionRecord> {\n    const record = await storage.loadSession(sessionId);\n    if (!record) {\n      throw new Error(`Harness session \"${sessionId}\" was not found`);\n    }\n    if (resourceId && record.resourceId !== resourceId) {\n      throw new Error(`Harness session \"${sessionId}\" does not belong to resource \"${resourceId}\"`);\n    }\n    return record;\n  }\n\n  async #requireStorage(): Promise<HarnessStorage> {\n    if (this.#storage) {\n      return this.#storage;\n    }\n\n    const storage = await this.#compositeStorage?.getStore('harness');\n    if (!storage) {\n      throw new Error('Harness session storage is not configured');\n    }\n    return storage;\n  }\n\n  #sessionFromRecord(record: SessionRecord): Session {\n    const mode = record.modeId ? this.#modesById.get(record.modeId) : this.#modesById.values().next().value;\n    if (!mode) {\n      throw new Error(`Harness session \"${record.id}\" references unknown mode \"${record.modeId}\"`);\n    }\n\n    return new Session({\n      id: record.id,\n      ownerId: record.ownerId,\n      threadId: record.threadId,\n      resourceId: record.resourceId,\n      mode: mode,\n      model: record.modelId,\n      createdAt: record.createdAt,\n      lastActivityAt: record.lastActivityAt,\n      memory: this.#memory,\n      events: this.#events.scoped({ sessionId: record.id }),\n    });\n  }\n\n  #sessionIdFor(resourceId: string, threadId: string): string {\n    const hash = createHash('sha256').update(`${resourceId}\\0${threadId}`).digest('hex').slice(0, 32);\n    return `sess-${hash}`;\n  }\n}\n"]}