{"version":3,"file":"voiceTools.mjs","names":[],"sources":["../../src/schemas/voiceTools.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis';\nimport { type Static, type TSchema, Type } from 'typebox';\nimport { Check, Errors } from 'typebox/value';\n\n/** Voice-owned Cordis service for the live tool registrar and active session. */\nexport const DOOM_VOICE_TOOLS_SERVICE = 'doom/voice-tools';\n\n/** The two stable Pi tools that expose registered voice capabilities. */\nexport const VOICE_DESCRIBE_TOOL_NAME = 'describe_voice_tools' as const;\nexport const VOICE_USE_TOOL_NAME = 'use_voice_tools' as const;\nexport const VOICE_FACADE_TOOL_NAMES = [VOICE_DESCRIBE_TOOL_NAME, VOICE_USE_TOOL_NAME] as const;\n/** The standalone Pi tool owned by an active autonomous Voice session. */\nexport const VOICE_NARRATE_TOOL_NAME = 'narrate' as const;\n/** Every Pi tool whose availability is owned by autonomous Voice mode. */\nexport const VOICE_MODE_TOOL_NAMES = [...VOICE_FACADE_TOOL_NAMES, VOICE_NARRATE_TOOL_NAME] as const;\nexport const VOICE_TOOL_DEFAULT_TIMEOUT_MS = 10_000;\nexport const VOICE_TOOL_MAX_TIMEOUT_MS = 30_000;\nexport const VOICE_TOOL_MAX_BATCH_ITEMS = 16;\nexport const VOICE_TOOL_MAX_INPUT_BYTES = 64 * 1024;\nexport const VOICE_TOOL_MAX_BATCH_BYTES = 256 * 1024;\nexport const VOICE_TOOL_MAX_SCHEMA_BYTES = 32 * 1024;\nexport const VOICE_TOOL_MAX_JSON_DEPTH = 16;\nexport const VOICE_TOOL_TERMINAL_OPERATION_LIMIT = 256;\nexport const VOICE_TOOL_MAX_IDENTIFIER_LENGTH = 128;\nexport const VOICE_TOOL_MAX_LABEL_LENGTH = 96;\nexport const VOICE_TOOL_MAX_DESCRIPTION_LENGTH = 240;\nexport const VOICE_TOOL_MAX_ERROR_MESSAGE_LENGTH = 240;\nexport const VOICE_TOOL_MAX_DOMAIN_COUNT = 32;\n\nconst SAFE_IDENTIFIER = /^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$/u;\nconst SAFE_NAME = /^[a-z][a-z0-9_:-]*$/u;\nconst MAX_ORDER = 1_000;\n\nexport const VOICE_TOOL_ERROR_CODE = {\n  hostUnavailable: 'VOICE_TOOL_HOST_UNAVAILABLE',\n  inactive: 'VOICE_TOOL_INACTIVE',\n  staleSession: 'VOICE_TOOL_STALE_SESSION',\n  staleCatalog: 'VOICE_TOOL_STALE_CATALOG',\n  notFound: 'VOICE_TOOL_NOT_FOUND',\n  nameConflict: 'VOICE_TOOL_NAME_CONFLICT',\n  invalidInput: 'VOICE_TOOL_INVALID_INPUT',\n  invalidResult: 'VOICE_TOOL_INVALID_RESULT',\n  executionFailed: 'VOICE_TOOL_EXECUTION_FAILED',\n  timeout: 'VOICE_TOOL_TIMEOUT',\n  aborted: 'VOICE_TOOL_ABORTED',\n  cancelled: 'VOICE_TOOL_CANCELLED',\n  registrationDisposed: 'VOICE_TOOL_REGISTRATION_DISPOSED',\n  sessionShutdown: 'VOICE_TOOL_SESSION_SHUTDOWN',\n  batchStopped: 'VOICE_TOOL_BATCH_STOPPED',\n  reloadQueued: 'VOICE_TOOL_RELOAD_QUEUED',\n  invalidRequest: 'VOICE_TOOL_INVALID_REQUEST',\n} as const;\n\nexport const VOICE_TOOL_HOST_UNAVAILABLE = VOICE_TOOL_ERROR_CODE.hostUnavailable;\nexport const VOICE_TOOL_INACTIVE = VOICE_TOOL_ERROR_CODE.inactive;\nexport const VOICE_TOOL_STALE_SESSION = VOICE_TOOL_ERROR_CODE.staleSession;\nexport const VOICE_TOOL_STALE_CATALOG = VOICE_TOOL_ERROR_CODE.staleCatalog;\nexport const VOICE_TOOL_NOT_FOUND = VOICE_TOOL_ERROR_CODE.notFound;\nexport const VOICE_TOOL_NAME_CONFLICT = VOICE_TOOL_ERROR_CODE.nameConflict;\nexport const VOICE_TOOL_INVALID_INPUT = VOICE_TOOL_ERROR_CODE.invalidInput;\nexport const VOICE_TOOL_INVALID_RESULT = VOICE_TOOL_ERROR_CODE.invalidResult;\nexport const VOICE_TOOL_TIMEOUT = VOICE_TOOL_ERROR_CODE.timeout;\nexport const VOICE_TOOL_ABORTED = VOICE_TOOL_ERROR_CODE.aborted;\nexport const VOICE_TOOL_EXECUTION_FAILED = VOICE_TOOL_ERROR_CODE.executionFailed;\nexport const VOICE_TOOL_BATCH_STOPPED = VOICE_TOOL_ERROR_CODE.batchStopped;\n\nexport const VoiceToolDescriptorSchema = Type.Object(\n  {\n    source: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH, pattern: SAFE_IDENTIFIER.source }),\n    id: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH, pattern: SAFE_IDENTIFIER.source }),\n    name: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH, pattern: SAFE_NAME.source }),\n    label: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_LABEL_LENGTH }),\n    description: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_DESCRIPTION_LENGTH }),\n    order: Type.Integer({ minimum: 0, maximum: MAX_ORDER }),\n    inputSchema: Type.Unknown(),\n    resultSchema: Type.Unknown(),\n    timeoutMs: Type.Optional(Type.Integer({ minimum: 1, maximum: VOICE_TOOL_MAX_TIMEOUT_MS })),\n  },\n  { additionalProperties: false },\n);\nexport interface VoiceToolDescriptor {\n  readonly source: string;\n  readonly id: string;\n  readonly name: string;\n  readonly label: string;\n  readonly description: string;\n  readonly order: number;\n  readonly inputSchema: TSchema;\n  readonly resultSchema: TSchema;\n  readonly timeoutMs?: number;\n}\n\nexport const VoiceToolBatchCallSchema = Type.Object(\n  {\n    name: Type.String({\n      minLength: 1,\n      maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH,\n      pattern: SAFE_NAME.source,\n      description: 'Capability name exactly as describe_voice_tools reported it.',\n    }),\n    input: Type.Unknown({\n      description:\n        'Arguments for this capability, shaped by the input_schema that describe_voice_tools returns when called with names. Pass an empty object for a capability that takes none.',\n    }),\n  },\n  { additionalProperties: false },\n);\nexport type VoiceToolBatchCall = Static<typeof VoiceToolBatchCallSchema>;\n\nexport const VoiceToolDescribeInputSchema = Type.Object(\n  {\n    names: Type.Optional(\n      Type.Array(\n        Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH, pattern: SAFE_NAME.source }),\n        {\n          maxItems: VOICE_TOOL_MAX_BATCH_ITEMS,\n          description:\n            'Capabilities to describe in full, including their input schemas. Omit to list every registered capability by name and description only.',\n        },\n      ),\n    ),\n  },\n  { additionalProperties: false },\n);\nexport type VoiceToolDescribeInput = Static<typeof VoiceToolDescribeInputSchema>;\n\nexport const VoiceToolCatalogTokenSchema = Type.String({\n  minLength: 1,\n  maxLength: 512,\n  description:\n    'Opaque catalog token from the most recent describe_voice_tools result, copied verbatim. It is invalidated whenever a capability registers or deregisters and whenever autonomous voice is activated or deactivated.',\n});\nexport type VoiceToolCatalogToken = Static<typeof VoiceToolCatalogTokenSchema>;\n\nexport const VoiceToolUseInputSchema = Type.Object(\n  {\n    catalogToken: VoiceToolCatalogTokenSchema,\n    calls: Type.Array(VoiceToolBatchCallSchema, {\n      minItems: 1,\n      maxItems: VOICE_TOOL_MAX_BATCH_ITEMS,\n      description:\n        'Capability calls to run in this order. All of them are validated before any of them run, so a single invalid call rejects the whole batch.',\n    }),\n  },\n  { additionalProperties: false },\n);\nexport type VoiceToolUseInput = Static<typeof VoiceToolUseInputSchema>;\n\nexport const VoiceToolErrorCodeSchema = Type.Union([\n  Type.Literal('VOICE_TOOL_HOST_UNAVAILABLE'),\n  Type.Literal('VOICE_TOOL_INACTIVE'),\n  Type.Literal('VOICE_TOOL_STALE_SESSION'),\n  Type.Literal('VOICE_TOOL_STALE_CATALOG'),\n  Type.Literal('VOICE_TOOL_NOT_FOUND'),\n  Type.Literal('VOICE_TOOL_NAME_CONFLICT'),\n  Type.Literal('VOICE_TOOL_INVALID_INPUT'),\n  Type.Literal('VOICE_TOOL_INVALID_RESULT'),\n  Type.Literal('VOICE_TOOL_EXECUTION_FAILED'),\n  Type.Literal('VOICE_TOOL_TIMEOUT'),\n  Type.Literal('VOICE_TOOL_ABORTED'),\n  Type.Literal('VOICE_TOOL_CANCELLED'),\n  Type.Literal('VOICE_TOOL_REGISTRATION_DISPOSED'),\n  Type.Literal('VOICE_TOOL_SESSION_SHUTDOWN'),\n  Type.Literal('VOICE_TOOL_BATCH_STOPPED'),\n  Type.Literal('VOICE_TOOL_RELOAD_QUEUED'),\n  Type.Literal('VOICE_TOOL_INVALID_REQUEST'),\n]);\nexport type VoiceToolErrorCode = Static<typeof VoiceToolErrorCodeSchema>;\n\nexport const VoiceToolErrorSchema = Type.Object(\n  {\n    code: VoiceToolErrorCodeSchema,\n    message: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_ERROR_MESSAGE_LENGTH }),\n    retryable: Type.Optional(Type.Boolean()),\n  },\n  { additionalProperties: false },\n);\nexport type VoiceToolErrorPayload = Static<typeof VoiceToolErrorSchema>;\n\nexport const VoiceToolConflictDiagnosticSchema = Type.Object(\n  {\n    name: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH }),\n    message: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_ERROR_MESSAGE_LENGTH }),\n    claims: Type.Array(\n      Type.Object(\n        {\n          source: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH }),\n          id: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH }),\n        },\n        { additionalProperties: false },\n      ),\n      { minItems: 2, maxItems: VOICE_TOOL_MAX_BATCH_ITEMS },\n    ),\n  },\n  { additionalProperties: false },\n);\nexport type VoiceToolConflictDiagnostic = Static<typeof VoiceToolConflictDiagnosticSchema>;\n\nexport const VoiceToolCatalogEntrySchema = Type.Object(\n  {\n    source: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH }),\n    id: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH }),\n    name: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH }),\n    label: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_LABEL_LENGTH }),\n    description: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_DESCRIPTION_LENGTH }),\n    order: Type.Integer({ minimum: 0, maximum: MAX_ORDER }),\n    inputSchema: Type.Unknown(),\n    enabled: Type.Boolean(),\n  },\n  { additionalProperties: false },\n);\nexport type VoiceToolCatalogEntry = Static<typeof VoiceToolCatalogEntrySchema>;\n\nexport const VoiceToolCatalogSnapshotSchema = Type.Object(\n  {\n    hostGeneration: Type.String({ minLength: 1, maxLength: 256 }),\n    catalogRevision: Type.Integer({ minimum: 0 }),\n    catalogToken: VoiceToolCatalogTokenSchema,\n    tools: Type.Array(VoiceToolCatalogEntrySchema, { maxItems: VOICE_TOOL_MAX_BATCH_ITEMS * 8 }),\n    conflicts: Type.Array(VoiceToolConflictDiagnosticSchema, { maxItems: VOICE_TOOL_MAX_BATCH_ITEMS * 8 }),\n    unknownNames: Type.Array(Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH }), {\n      maxItems: VOICE_TOOL_MAX_BATCH_ITEMS,\n    }),\n  },\n  { additionalProperties: false },\n);\nexport type VoiceToolCatalogSnapshot = Static<typeof VoiceToolCatalogSnapshotSchema>;\n\nexport const VoiceToolBatchItemResultSchema = Type.Object(\n  {\n    index: Type.Integer({ minimum: 0, maximum: VOICE_TOOL_MAX_BATCH_ITEMS }),\n    name: Type.String({ minLength: 1, maxLength: VOICE_TOOL_MAX_IDENTIFIER_LENGTH }),\n    status: Type.Union([\n      Type.Literal('completed'),\n      Type.Literal('failed'),\n      Type.Literal('cancelled'),\n      Type.Literal('not_executed'),\n      Type.Literal('preflight_failed'),\n    ]),\n    result: Type.Optional(Type.Unknown()),\n    error: Type.Optional(VoiceToolErrorSchema),\n  },\n  { additionalProperties: false },\n);\nexport type VoiceToolBatchItemResult = Static<typeof VoiceToolBatchItemResultSchema>;\n\nexport const VoiceToolBatchResultSchema = Type.Object(\n  {\n    status: Type.Union([\n      Type.Literal('completed'),\n      Type.Literal('rejected'),\n      Type.Literal('cancelled'),\n      Type.Literal('stopped'),\n    ]),\n    catalogToken: VoiceToolCatalogTokenSchema,\n    results: Type.Array(VoiceToolBatchItemResultSchema, { maxItems: VOICE_TOOL_MAX_BATCH_ITEMS }),\n    errors: Type.Optional(Type.Array(VoiceToolErrorSchema, { maxItems: VOICE_TOOL_MAX_BATCH_ITEMS })),\n  },\n  { additionalProperties: false },\n);\nexport type VoiceToolBatchResult = Static<typeof VoiceToolBatchResultSchema>;\n\nexport interface VoiceToolExecutionContext<Context = unknown> {\n  readonly sessionId: string;\n  readonly hostGeneration: string;\n  readonly operationId: string;\n  readonly batchIndex: number;\n  readonly batchSize: number;\n  readonly signal: AbortSignal;\n  readonly context: Context;\n}\n\nexport interface VoiceToolDefinition<Context = unknown> {\n  readonly descriptor: VoiceToolDescriptor;\n  execute(input: unknown, execution: VoiceToolExecutionContext<Context>): unknown;\n}\n\nexport interface VoiceToolRegistrationHandle {\n  readonly source: string;\n  readonly id: string;\n  readonly registrationGeneration: string;\n  dispose(): void;\n}\n\nexport interface VoiceToolSessionHandle<Context = unknown> {\n  readonly sessionId: string;\n  readonly hostGeneration: string;\n  readonly active: boolean;\n  setActive(active: boolean): void;\n  subscribe(listener: () => void): () => void;\n  describe(input?: VoiceToolDescribeInput): VoiceToolCatalogSnapshot;\n  executeBatch(\n    input: VoiceToolUseInput,\n    context: Context,\n    options?: VoiceToolExecuteOptions,\n  ): Promise<VoiceToolBatchResult>;\n  useVoiceTools(\n    input: VoiceToolUseInput,\n    context: Context,\n    options?: VoiceToolExecuteOptions,\n  ): Promise<VoiceToolBatchResult>;\n  dispose(): void;\n}\n\nexport interface VoiceToolExecuteOptions {\n  readonly signal?: AbortSignal;\n  readonly operationId?: string;\n}\n\nexport interface VoiceToolRegistrationOptions<Context = unknown> {\n  readonly sessionId?: string;\n  readonly context?: Context;\n}\n\nexport interface DoomVoiceToolsService<SessionContext = unknown> {\n  readonly generation: string;\n  register<ContributionContext = SessionContext>(\n    definition: VoiceToolDefinition<ContributionContext>,\n    options?: VoiceToolRegistrationOptions<ContributionContext>,\n  ): VoiceToolRegistrationHandle;\n  bindSession(sessionId: string, context?: SessionContext): VoiceToolSessionHandle<SessionContext>;\n  readSession(sessionId: string): VoiceToolSessionHandle<SessionContext> | undefined;\n  subscribeSession(\n    sessionId: string,\n    listener: (session: VoiceToolSessionHandle<SessionContext> | undefined) => void,\n  ): () => void;\n  dispose(): void;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n  interface Context {\n    'doom/voice-tools': DoomVoiceToolsService;\n  }\n}\n\nexport class VoiceToolError extends Error {\n  readonly code: VoiceToolErrorCode;\n  readonly retryable: boolean;\n\n  constructor(code: VoiceToolErrorCode, message: string, retryable = false) {\n    super(message);\n    this.name = 'VoiceToolError';\n    this.code = code;\n    this.retryable = retryable;\n  }\n}\n\ninterface VoiceToolClaim<Context> {\n  readonly descriptor: VoiceToolDescriptor;\n  readonly execute: VoiceToolDefinition<Context>['execute'];\n  readonly registrationGeneration: string;\n  readonly sessionId?: string;\n  readonly context?: Context;\n  readonly fingerprint: string;\n}\n\ninterface VoiceToolOperation {\n  readonly controller: AbortController;\n  readonly registrationGeneration: string;\n}\n\ninterface VoiceToolSessionState<Context> {\n  readonly token: symbol;\n  readonly sessionId: string;\n  readonly hostGeneration: string;\n  readonly context: Context | undefined;\n  active: boolean;\n  revision: number;\n  disposed: boolean;\n  readonly operations: Map<string, VoiceToolOperation>;\n  readonly terminal: Map<string, VoiceToolBatchResult>;\n  readonly listeners: Set<() => void>;\n}\n\ninterface VoiceToolRegistryRoot {\n  readonly generation: string;\n  readonly claims: Map<string, VoiceToolClaim<unknown>[]>;\n  readonly sessions: Map<string, VoiceToolSessionState<unknown>>;\n  readonly sessionHandles: Map<string, VoiceToolSessionHandle<unknown>>;\n  readonly sessionListeners: Map<string, Set<(session: VoiceToolSessionHandle<unknown> | undefined) => void>>;\n  sequence: number;\n  disposed: boolean;\n}\n\nfunction normalizedText(value: string, label: string, maximum: number, pattern?: RegExp): string {\n  const normalized = value.trim();\n  if (!normalized || normalized.length > maximum || hasControlCharacter(normalized)) {\n    throw new VoiceToolError('VOICE_TOOL_INVALID_REQUEST', `Invalid ${label}.`);\n  }\n  if (pattern && !pattern.test(normalized)) throw new VoiceToolError('VOICE_TOOL_INVALID_REQUEST', `Invalid ${label}.`);\n  return normalized;\n}\n\nfunction hasControlCharacter(value: string): boolean {\n  for (const character of value) {\n    const code = character.codePointAt(0);\n    if (code !== undefined && (code <= 0x1f || code === 0x7f)) return true;\n  }\n  return false;\n}\n\nfunction validSessionId(value: string): string {\n  return normalizedText(value, 'session id', 256);\n}\n\nfunction validOperationId(value: string): string {\n  return normalizedText(value, 'operation id', VOICE_TOOL_MAX_IDENTIFIER_LENGTH);\n}\n\nfunction jsonText(value: unknown, maximumDepth = VOICE_TOOL_MAX_JSON_DEPTH): string {\n  const seen = new WeakSet<object>();\n  const visit = (candidate: unknown, depth: number): string => {\n    if (depth > maximumDepth) throw new VoiceToolError('VOICE_TOOL_INVALID_REQUEST', 'JSON nesting is too deep.');\n    if (candidate === null) return 'null';\n    if (typeof candidate === 'string') return JSON.stringify(candidate);\n    if (typeof candidate === 'boolean') return candidate ? 'true' : 'false';\n    if (typeof candidate === 'number') {\n      if (!Number.isFinite(candidate))\n        throw new VoiceToolError('VOICE_TOOL_INVALID_REQUEST', 'JSON numbers must be finite.');\n      return JSON.stringify(candidate);\n    }\n    if (typeof candidate !== 'object')\n      throw new VoiceToolError('VOICE_TOOL_INVALID_REQUEST', 'JSON values must be serializable.');\n    if (seen.has(candidate))\n      throw new VoiceToolError('VOICE_TOOL_INVALID_REQUEST', 'Cyclic JSON values are not supported.');\n    const prototype = Object.getPrototypeOf(candidate);\n    if (prototype !== Object.prototype && prototype !== null && !Array.isArray(candidate)) {\n      throw new VoiceToolError('VOICE_TOOL_INVALID_REQUEST', 'Only JSON objects and arrays are supported.');\n    }\n    seen.add(candidate);\n    let result: string;\n    if (Array.isArray(candidate)) {\n      result = `[${candidate.map((item) => visit(item, depth + 1)).join(',')}]`;\n    } else {\n      const entries = Object.keys(candidate)\n        .sort()\n        .map((key) => `${JSON.stringify(key)}:${visit((candidate as Record<string, unknown>)[key], depth + 1)}`);\n      result = `{${entries.join(',')}}`;\n    }\n    seen.delete(candidate);\n    return result;\n  };\n  return visit(value, 0);\n}\n\nfunction cloneJson<T>(value: T, maximumBytes: number, message = 'JSON payload exceeds its limit.'): T {\n  const text = jsonText(value);\n  const bytes = new TextEncoder().encode(text).byteLength;\n  if (bytes > maximumBytes) throw new VoiceToolError('VOICE_TOOL_INVALID_REQUEST', message);\n  return JSON.parse(text) as T;\n}\n\nfunction schemaClone(schema: TSchema): TSchema {\n  const cloned = cloneJson(schema, VOICE_TOOL_MAX_SCHEMA_BYTES, 'Voice tool schema exceeds its limit.');\n  if (typeof cloned !== 'object' || cloned === null || Array.isArray(cloned)) {\n    throw new VoiceToolError('VOICE_TOOL_INVALID_REQUEST', 'Voice tool schemas must be JSON objects.');\n  }\n  return cloned as TSchema;\n}\n\nfunction validateDescriptor(descriptor: VoiceToolDescriptor): VoiceToolDescriptor {\n  if (!Check(VoiceToolDescriptorSchema, descriptor)) {\n    const detail = Errors(VoiceToolDescriptorSchema, descriptor)\n      .slice(0, 2)\n      .map((error) => `${error.instancePath || '/'} ${error.message}`)\n      .join('; ');\n    throw new VoiceToolError('VOICE_TOOL_INVALID_REQUEST', `Invalid voice tool descriptor: ${detail}`);\n  }\n  const inputSchema = schemaClone(descriptor.inputSchema);\n  const resultSchema = schemaClone(descriptor.resultSchema);\n  return cloneJson(\n    {\n      ...descriptor,\n      source: normalizedText(descriptor.source, 'voice tool source', VOICE_TOOL_MAX_IDENTIFIER_LENGTH, SAFE_IDENTIFIER),\n      id: normalizedText(descriptor.id, 'voice tool id', VOICE_TOOL_MAX_IDENTIFIER_LENGTH, SAFE_IDENTIFIER),\n      name: normalizedText(descriptor.name, 'voice tool name', VOICE_TOOL_MAX_IDENTIFIER_LENGTH, SAFE_NAME),\n      label: normalizedText(descriptor.label, 'voice tool label', VOICE_TOOL_MAX_LABEL_LENGTH),\n      description: normalizedText(descriptor.description, 'voice tool description', VOICE_TOOL_MAX_DESCRIPTION_LENGTH),\n      inputSchema,\n      resultSchema,\n      ...(descriptor.timeoutMs === undefined\n        ? {}\n        : { timeoutMs: Math.min(descriptor.timeoutMs, VOICE_TOOL_MAX_TIMEOUT_MS) }),\n    },\n    VOICE_TOOL_MAX_SCHEMA_BYTES * 2,\n  );\n}\n\nfunction descriptorFingerprint(descriptor: VoiceToolDescriptor): string {\n  return jsonText(descriptor, VOICE_TOOL_MAX_SCHEMA_BYTES * 2);\n}\n\nfunction catalogToken(session: VoiceToolSessionState<unknown>): string {\n  return `${session.hostGeneration}:${session.revision}`;\n}\n\nfunction notify(session: VoiceToolSessionState<unknown>): void {\n  for (const listener of session.listeners) listener();\n}\n\nfunction abortOperations(\n  session: VoiceToolSessionState<unknown>,\n  reason: string,\n  registrationGeneration?: string,\n): void {\n  for (const [operationId, operation] of session.operations) {\n    if (registrationGeneration !== undefined && operation.registrationGeneration !== registrationGeneration) continue;\n    operation.controller.abort(reason);\n    session.operations.delete(operationId);\n  }\n}\n\nfunction abortRegistrationOperations(root: VoiceToolRegistryRoot, registrationGeneration: string): void {\n  for (const session of root.sessions.values()) {\n    if (!session.disposed) abortOperations(session, 'Voice tool registration was disposed.', registrationGeneration);\n  }\n}\n\nfunction claimsForSession(root: VoiceToolRegistryRoot, sessionId: string, name?: string): VoiceToolClaim<unknown>[] {\n  const source = root.claims;\n  if (name) {\n    return (source.get(name) ?? []).filter((claim) => claim.sessionId === undefined || claim.sessionId === sessionId);\n  }\n  return [...source.values()].flatMap((claims) =>\n    claims.filter((claim) => claim.sessionId === undefined || claim.sessionId === sessionId),\n  );\n}\n\nfunction activeClaim(\n  root: VoiceToolRegistryRoot,\n  sessionId: string,\n  name: string,\n): { claim?: VoiceToolClaim<unknown>; conflict?: VoiceToolConflictDiagnostic } {\n  const claims = claimsForSession(root, sessionId, name);\n  if (claims.length === 0) return {};\n  const fingerprints = new Set(claims.map((claim) => claim.fingerprint));\n  if (fingerprints.size > 1) {\n    return {\n      conflict: {\n        name,\n        message: `Voice tool '${name}' has conflicting registrations.`,\n        claims: claims\n          .slice(0, VOICE_TOOL_MAX_BATCH_ITEMS)\n          .map((claim) => ({ source: claim.descriptor.source, id: claim.descriptor.id })),\n      },\n    };\n  }\n  return { claim: claims[0] };\n}\n\nfunction catalog(\n  root: VoiceToolRegistryRoot,\n  session: VoiceToolSessionState<unknown>,\n  names?: readonly string[],\n): VoiceToolCatalogSnapshot {\n  const grouped = new Map<string, VoiceToolClaim<unknown>[]>();\n  for (const claim of claimsForSession(root, session.sessionId)) {\n    const current = grouped.get(claim.descriptor.name) ?? [];\n    current.push(claim);\n    grouped.set(claim.descriptor.name, current);\n  }\n  const conflicts: VoiceToolConflictDiagnostic[] = [];\n  const tools: VoiceToolCatalogEntry[] = [];\n  const selected = names ? new Set(names) : undefined;\n  const unknownNames = names\n    ? [...new Set(names)].filter((name) => !grouped.has(name)).slice(0, VOICE_TOOL_MAX_BATCH_ITEMS)\n    : [];\n  for (const [name, claims] of grouped) {\n    if (selected && !selected.has(name)) continue;\n    const fingerprints = new Set(claims.map((claim) => claim.fingerprint));\n    if (fingerprints.size > 1) {\n      conflicts.push({\n        name,\n        message: `Voice tool '${name}' has conflicting registrations.`,\n        claims: claims\n          .slice(0, VOICE_TOOL_MAX_BATCH_ITEMS)\n          .map((claim) => ({ source: claim.descriptor.source, id: claim.descriptor.id })),\n      });\n      continue;\n    }\n    const descriptor = claims[0]?.descriptor;\n    if (!descriptor) continue;\n    tools.push({\n      source: descriptor.source,\n      id: descriptor.id,\n      name: descriptor.name,\n      label: descriptor.label,\n      description: descriptor.description,\n      order: descriptor.order,\n      inputSchema: cloneJson(descriptor.inputSchema, VOICE_TOOL_MAX_SCHEMA_BYTES),\n      enabled: session.active,\n    });\n  }\n  if (names) {\n    const requestedOrder = new Map([...new Set(names)].map((name, index) => [name, index]));\n    tools.sort(\n      (left, right) =>\n        (requestedOrder.get(left.name) ?? Number.MAX_SAFE_INTEGER) -\n        (requestedOrder.get(right.name) ?? Number.MAX_SAFE_INTEGER),\n    );\n  } else {\n    tools.sort(\n      (left, right) =>\n        left.order - right.order ||\n        left.name.localeCompare(right.name) ||\n        left.source.localeCompare(right.source) ||\n        left.id.localeCompare(right.id),\n    );\n  }\n  conflicts.sort((left, right) => left.name.localeCompare(right.name));\n  return {\n    hostGeneration: session.hostGeneration,\n    catalogRevision: session.revision,\n    catalogToken: catalogToken(session),\n    tools,\n    conflicts,\n    unknownNames,\n  };\n}\n\nfunction refreshSessions(root: VoiceToolRegistryRoot): void {\n  for (const session of root.sessions.values()) {\n    if (!session.disposed) {\n      session.revision += 1;\n      notify(session);\n    }\n  }\n}\n\nfunction notifySessionListeners(root: VoiceToolRegistryRoot, sessionId: string): void {\n  const session = root.sessionHandles.get(sessionId);\n  for (const listener of root.sessionListeners.get(sessionId) ?? []) listener(session);\n}\n\nfunction errorPayload(\n  error: unknown,\n  fallbackCode: VoiceToolErrorCode = 'VOICE_TOOL_EXECUTION_FAILED',\n): VoiceToolErrorPayload {\n  if (error instanceof VoiceToolError) {\n    return {\n      code: error.code,\n      message: error.message.slice(0, VOICE_TOOL_MAX_ERROR_MESSAGE_LENGTH),\n      retryable: error.retryable,\n    };\n  }\n  return { code: fallbackCode, message: 'Voice tool execution failed.' };\n}\n\nfunction resultError(\n  index: number,\n  call: VoiceToolBatchCall,\n  error: VoiceToolErrorPayload,\n  status: VoiceToolBatchItemResult['status'] = 'failed',\n): VoiceToolBatchItemResult {\n  return { index, name: call.name, status, error };\n}\n\nfunction timeoutFor(claim: VoiceToolClaim<unknown>): number {\n  return Math.min(claim.descriptor.timeoutMs ?? VOICE_TOOL_DEFAULT_TIMEOUT_MS, VOICE_TOOL_MAX_TIMEOUT_MS);\n}\n\nfunction combineSignal(\n  signal: AbortSignal | undefined,\n  timeoutMs: number,\n): { signal: AbortSignal; controller: AbortController; dispose: () => void; timedOut: () => boolean } {\n  const controller = new AbortController();\n  const timeoutSignal = AbortSignal.timeout(timeoutMs);\n  const abort = (reason: unknown) => controller.abort(reason);\n  const abortFromCaller = () => abort(signal?.reason ?? 'Voice tool call aborted.');\n  const abortFromTimeout = () => abort(timeoutSignal.reason ?? 'Voice tool call timed out.');\n  if (signal) {\n    signal.addEventListener('abort', abortFromCaller, { once: true });\n    if (signal.aborted) abortFromCaller();\n  }\n  timeoutSignal.addEventListener('abort', abortFromTimeout, { once: true });\n  return {\n    signal: controller.signal,\n    controller,\n    timedOut: () => timeoutSignal.aborted,\n    dispose: () => {\n      signal?.removeEventListener('abort', abortFromCaller);\n      timeoutSignal.removeEventListener('abort', abortFromTimeout);\n    },\n  };\n}\n\nfunction preflightInput(schema: TSchema, input: unknown): unknown {\n  let cloned: unknown;\n  try {\n    cloned = cloneJson(input, VOICE_TOOL_MAX_INPUT_BYTES, 'Voice tool input exceeds its limit.');\n    if (!Check(schema, cloned)) {\n      const detail = Errors(schema, cloned)\n        .slice(0, 2)\n        .map((error) => `${error.instancePath || '/'} ${error.message}`)\n        .join('; ');\n      throw new VoiceToolError('VOICE_TOOL_INVALID_INPUT', `Voice tool input is invalid: ${detail}`);\n    }\n  } catch (error) {\n    if (error instanceof VoiceToolError && error.code === 'VOICE_TOOL_INVALID_INPUT') throw error;\n    throw new VoiceToolError('VOICE_TOOL_INVALID_INPUT', 'Voice tool input is invalid.');\n  }\n  return cloned;\n}\n\nfunction validateOutput(schema: TSchema, output: unknown): unknown {\n  let cloned: unknown;\n  try {\n    cloned = cloneJson(output, VOICE_TOOL_MAX_INPUT_BYTES, 'Voice tool result exceeds its limit.');\n    if (!Check(schema, cloned))\n      throw new VoiceToolError('VOICE_TOOL_INVALID_RESULT', 'Voice tool returned an invalid result.');\n  } catch (error) {\n    if (error instanceof VoiceToolError && error.code === 'VOICE_TOOL_INVALID_RESULT') throw error;\n    throw new VoiceToolError('VOICE_TOOL_INVALID_RESULT', 'Voice tool returned an invalid result.');\n  }\n  return cloned;\n}\n\nfunction requestErrors(session: VoiceToolSessionState<unknown>, input: VoiceToolUseInput): VoiceToolErrorPayload[] {\n  const errors: VoiceToolErrorPayload[] = [];\n  if (input.catalogToken !== catalogToken(session)) {\n    errors.push({ code: 'VOICE_TOOL_STALE_CATALOG', message: 'The voice tool catalog is stale.', retryable: true });\n  }\n  if (!session.active)\n    errors.push({ code: 'VOICE_TOOL_INACTIVE', message: 'Autonomous voice is not active.', retryable: true });\n  return errors;\n}\n\nasync function runBatch<Context>(\n  root: VoiceToolRegistryRoot,\n  session: VoiceToolSessionState<Context>,\n  input: VoiceToolUseInput,\n  context: Context,\n  options: VoiceToolExecuteOptions,\n): Promise<VoiceToolBatchResult> {\n  const requestedOperationId = options.operationId ? validOperationId(options.operationId) : undefined;\n  if (requestedOperationId) {\n    const terminal = session.terminal.get(requestedOperationId);\n    if (terminal) return cloneJson(terminal, VOICE_TOOL_MAX_BATCH_BYTES);\n  }\n  const globalErrors = requestErrors(session as VoiceToolSessionState<unknown>, input);\n  if (input.calls.length > VOICE_TOOL_MAX_BATCH_ITEMS) {\n    globalErrors.push({ code: 'VOICE_TOOL_INVALID_REQUEST', message: 'Voice tool batch contains too many calls.' });\n  }\n  let batchJson = '';\n  try {\n    batchJson = jsonText(input, VOICE_TOOL_MAX_JSON_DEPTH);\n    if (new TextEncoder().encode(batchJson).byteLength > VOICE_TOOL_MAX_BATCH_BYTES) {\n      globalErrors.push({ code: 'VOICE_TOOL_INVALID_REQUEST', message: 'Voice tool batch exceeds its limit.' });\n    }\n  } catch (error) {\n    globalErrors.push(errorPayload(error, 'VOICE_TOOL_INVALID_REQUEST'));\n  }\n  void batchJson;\n\n  const results: VoiceToolBatchItemResult[] = [];\n  const preflight: Array<{\n    call: VoiceToolBatchCall;\n    claim?: VoiceToolClaim<unknown>;\n    input?: unknown;\n    error?: VoiceToolErrorPayload;\n  }> = [];\n  if (globalErrors.length === 0) {\n    for (const [index, call] of input.calls.entries()) {\n      const resolved = activeClaim(root, session.sessionId, call.name);\n      if (resolved.conflict) {\n        preflight.push({ call, error: { code: 'VOICE_TOOL_NAME_CONFLICT', message: resolved.conflict.message } });\n        continue;\n      }\n      if (!resolved.claim) {\n        preflight.push({\n          call,\n          error: { code: 'VOICE_TOOL_NOT_FOUND', message: `Unknown voice tool '${call.name}'.` },\n        });\n        continue;\n      }\n      if (\n        !root.claims\n          .get(call.name)\n          ?.some((claim) => claim.registrationGeneration === resolved.claim?.registrationGeneration)\n      ) {\n        preflight.push({\n          call,\n          error: {\n            code: 'VOICE_TOOL_REGISTRATION_DISPOSED',\n            message: 'Voice tool registration was disposed.',\n            retryable: true,\n          },\n        });\n        continue;\n      }\n      try {\n        preflight.push({\n          call,\n          claim: resolved.claim,\n          input: preflightInput(resolved.claim.descriptor.inputSchema, call.input),\n        });\n      } catch (error) {\n        preflight.push({ call, error: errorPayload(error, 'VOICE_TOOL_INVALID_INPUT') });\n      }\n      void index;\n    }\n  }\n  if (globalErrors.length > 0 || preflight.some((item) => item.error)) {\n    const errors = [...globalErrors, ...preflight.flatMap((item) => (item.error ? [item.error] : []))];\n    for (const [index, call] of input.calls.entries()) {\n      const item = preflight[index];\n      results.push(\n        item?.error\n          ? resultError(index, call, item.error, 'preflight_failed')\n          : resultError(\n              index,\n              call,\n              errors[0] ?? { code: 'VOICE_TOOL_INVALID_REQUEST', message: 'Voice tool batch was rejected.' },\n              'not_executed',\n            ),\n      );\n    }\n    const rejected: VoiceToolBatchResult = {\n      status: 'rejected',\n      catalogToken: catalogToken(session as VoiceToolSessionState<unknown>),\n      results,\n      errors: errors.slice(0, VOICE_TOOL_MAX_BATCH_ITEMS),\n    };\n    if (requestedOperationId) {\n      session.terminal.set(requestedOperationId, rejected);\n      while (session.terminal.size > VOICE_TOOL_TERMINAL_OPERATION_LIMIT)\n        session.terminal.delete(session.terminal.keys().next().value as string);\n    }\n    return rejected;\n  }\n\n  root.sequence += 1;\n  const operationId = requestedOperationId ?? validOperationId(`voice:${root.sequence}`);\n  const batchSize = input.calls.length;\n  let status: VoiceToolBatchResult['status'] = 'completed';\n  for (const [index, item] of preflight.entries()) {\n    if (session.disposed) {\n      status = 'cancelled';\n      results.push(\n        resultError(\n          index,\n          item.call,\n          { code: 'VOICE_TOOL_SESSION_SHUTDOWN', message: 'Voice session is shutting down.', retryable: true },\n          'cancelled',\n        ),\n      );\n      continue;\n    }\n    if (options.signal?.aborted) {\n      status = 'cancelled';\n      results.push(\n        resultError(\n          index,\n          item.call,\n          { code: 'VOICE_TOOL_CANCELLED', message: 'Voice tool batch was cancelled.', retryable: true },\n          'cancelled',\n        ),\n      );\n      continue;\n    }\n    const claim = item.claim;\n    if (!claim || item.input === undefined) {\n      results.push(\n        resultError(index, item.call, {\n          code: 'VOICE_TOOL_INVALID_REQUEST',\n          message: 'Voice tool call was not prepared.',\n        }),\n      );\n      continue;\n    }\n    const operationKey = `${operationId}:${index}`;\n    const combined = combineSignal(options.signal, timeoutFor(claim));\n    session.operations.set(operationKey, {\n      controller: combined.controller,\n      registrationGeneration: claim.registrationGeneration,\n    });\n    let itemResult: VoiceToolBatchItemResult;\n    try {\n      const value = await Promise.race([\n        Promise.resolve(\n          claim.execute(item.input, {\n            sessionId: session.sessionId,\n            hostGeneration: session.hostGeneration,\n            operationId,\n            batchIndex: index,\n            batchSize,\n            signal: combined.signal,\n            context: claim.context ?? context,\n          }),\n        ),\n        new Promise<never>((_, reject) => {\n          combined.signal.addEventListener(\n            'abort',\n            () =>\n              reject(\n                new VoiceToolError(\n                  combined.timedOut() ? 'VOICE_TOOL_TIMEOUT' : 'VOICE_TOOL_ABORTED',\n                  combined.timedOut() ? 'Voice tool call timed out.' : 'Voice tool call was aborted.',\n                  true,\n                ),\n              ),\n            { once: true },\n          );\n        }),\n      ]);\n      if (session.disposed)\n        throw new VoiceToolError('VOICE_TOOL_SESSION_SHUTDOWN', 'Voice session is shutting down.', true);\n      if (!session.active) throw new VoiceToolError('VOICE_TOOL_INACTIVE', 'Autonomous voice is not active.', true);\n      if (catalogToken(session as VoiceToolSessionState<unknown>) !== input.catalogToken) {\n        throw new VoiceToolError('VOICE_TOOL_STALE_CATALOG', 'The voice tool catalog is stale.', true);\n      }\n      const currentClaim = activeClaim(root, session.sessionId, item.call.name);\n      if (currentClaim.conflict) throw new VoiceToolError('VOICE_TOOL_NAME_CONFLICT', currentClaim.conflict.message);\n      if (!currentClaim.claim || currentClaim.claim.registrationGeneration !== claim.registrationGeneration) {\n        throw new VoiceToolError('VOICE_TOOL_REGISTRATION_DISPOSED', 'Voice tool registration was disposed.', true);\n      }\n      const result = validateOutput(claim.descriptor.resultSchema, value);\n      itemResult = { index, name: item.call.name, status: 'completed', result };\n      if (\n        typeof result === 'object' &&\n        result !== null &&\n        !Array.isArray(result) &&\n        (result as { stopBatch?: unknown }).stopBatch === 'session-reload'\n      ) {\n        status = 'stopped';\n      }\n    } catch (error) {\n      const payload = errorPayload(\n        error,\n        combined.timedOut()\n          ? 'VOICE_TOOL_TIMEOUT'\n          : options.signal?.aborted\n            ? 'VOICE_TOOL_CANCELLED'\n            : 'VOICE_TOOL_EXECUTION_FAILED',\n      );\n      const itemStatus: VoiceToolBatchItemResult['status'] =\n        payload.code === 'VOICE_TOOL_CANCELLED' || payload.code === 'VOICE_TOOL_ABORTED' ? 'cancelled' : 'failed';\n      if (itemStatus === 'cancelled') status = 'cancelled';\n      itemResult = resultError(index, item.call, payload, itemStatus);\n    } finally {\n      combined.dispose();\n      session.operations.delete(operationKey);\n    }\n    results.push(itemResult);\n    if (status === 'stopped') {\n      for (const [laterIndex, later] of preflight.entries()) {\n        if (laterIndex <= index) continue;\n        results.push(\n          resultError(\n            laterIndex,\n            later.call,\n            {\n              code: 'VOICE_TOOL_BATCH_STOPPED',\n              message: 'Batch stopped because a session reload was queued.',\n              retryable: true,\n            },\n            'not_executed',\n          ),\n        );\n      }\n      break;\n    }\n  }\n  results.sort((left, right) => left.index - right.index);\n  const result: VoiceToolBatchResult = {\n    status,\n    catalogToken: catalogToken(session as VoiceToolSessionState<unknown>),\n    results,\n  };\n  session.terminal.set(operationId, result as VoiceToolBatchResult);\n  while (session.terminal.size > VOICE_TOOL_TERMINAL_OPERATION_LIMIT)\n    session.terminal.delete(session.terminal.keys().next().value as string);\n  return result;\n}\n\nfunction createSession<Context>(\n  root: VoiceToolRegistryRoot,\n  sessionId: string,\n  context: Context | undefined,\n): VoiceToolSessionHandle<Context> {\n  root.sequence += 1;\n  const state: VoiceToolSessionState<Context> = {\n    token: Symbol(sessionId),\n    sessionId,\n    hostGeneration: `${root.generation}:voice-session:${root.sequence}`,\n    context,\n    active: false,\n    revision: 0,\n    disposed: false,\n    operations: new Map(),\n    terminal: new Map(),\n    listeners: new Set(),\n  };\n  root.sessions.set(sessionId, state as VoiceToolSessionState<unknown>);\n  const handle: VoiceToolSessionHandle<Context> = {\n    sessionId,\n    hostGeneration: state.hostGeneration,\n    get active() {\n      return state.active;\n    },\n    setActive(active) {\n      if (state.disposed || state.active === active) return;\n      state.active = active;\n      state.revision += 1;\n      if (!active) abortOperations(state as VoiceToolSessionState<unknown>, 'Voice host became inactive.');\n      notify(state as VoiceToolSessionState<unknown>);\n    },\n    subscribe(listener) {\n      if (state.disposed) return () => undefined;\n      state.listeners.add(listener);\n      return () => state.listeners.delete(listener);\n    },\n    describe(input = {}) {\n      const names = input.names\n        ? [\n            ...new Set(\n              input.names.map((name) =>\n                normalizedText(name, 'voice tool name', VOICE_TOOL_MAX_IDENTIFIER_LENGTH, SAFE_NAME),\n              ),\n            ),\n          ]\n        : undefined;\n      return catalog(root, state as VoiceToolSessionState<unknown>, names);\n    },\n    executeBatch(input, executeContext, options = {}) {\n      if (state.disposed) {\n        return Promise.resolve({\n          status: 'rejected',\n          catalogToken: catalogToken(state as VoiceToolSessionState<unknown>),\n          results: input.calls.map((call, index) =>\n            resultError(\n              index,\n              call,\n              { code: 'VOICE_TOOL_SESSION_SHUTDOWN', message: 'Voice session is shutting down.', retryable: true },\n              'not_executed',\n            ),\n          ),\n          errors: [\n            { code: 'VOICE_TOOL_SESSION_SHUTDOWN', message: 'Voice session is shutting down.', retryable: true },\n          ],\n        });\n      }\n      return runBatch(root, state, input, executeContext, options);\n    },\n    useVoiceTools(input, executeContext, options = {}) {\n      return this.executeBatch(input, executeContext, options);\n    },\n    dispose() {\n      if (state.disposed) return;\n      state.disposed = true;\n      state.active = false;\n      abortOperations(state as VoiceToolSessionState<unknown>, 'Voice host session disposed.');\n      state.listeners.clear();\n      if (root.sessions.get(sessionId) === state) root.sessions.delete(sessionId);\n      if (root.sessionHandles.get(sessionId) === handle) root.sessionHandles.delete(sessionId);\n      notifySessionListeners(root, sessionId);\n    },\n  };\n  root.sessionHandles.set(sessionId, handle as VoiceToolSessionHandle<unknown>);\n  notifySessionListeners(root, sessionId);\n  return handle;\n}\n\nfunction registerDefinition<Context = unknown>(\n  root: VoiceToolRegistryRoot,\n  definition: VoiceToolDefinition<Context>,\n  options: VoiceToolRegistrationOptions<Context> = {},\n): VoiceToolRegistrationHandle {\n  if (root.disposed) throw new VoiceToolError('VOICE_TOOL_HOST_UNAVAILABLE', 'Voice tools are disposed.');\n  const descriptor = validateDescriptor(definition.descriptor);\n  root.sequence += 1;\n  const registrationGeneration = `${root.generation}:voice-tool:${root.sequence}`;\n  const claim: VoiceToolClaim<Context> = {\n    descriptor,\n    execute: (input, execution) => definition.execute(input, execution),\n    registrationGeneration,\n    ...(options.sessionId === undefined ? {} : { sessionId: validSessionId(options.sessionId) }),\n    ...(options.context === undefined ? {} : { context: options.context }),\n    fingerprint: descriptorFingerprint(descriptor),\n  };\n  const key = descriptor.name;\n  for (const [registeredName, registeredClaims] of root.claims) {\n    const replaced = registeredClaims.filter(\n      (candidate) => candidate.descriptor.source === descriptor.source && candidate.descriptor.id === descriptor.id,\n    );\n    if (replaced.length === 0) continue;\n    for (const candidate of replaced) abortRegistrationOperations(root, candidate.registrationGeneration);\n    const remaining = registeredClaims.filter((candidate) => !replaced.includes(candidate));\n    if (remaining.length === 0) root.claims.delete(registeredName);\n    else root.claims.set(registeredName, remaining);\n  }\n  const claims = root.claims.get(key) ?? [];\n  claims.push(claim as VoiceToolClaim<unknown>);\n  root.claims.set(key, claims);\n  refreshSessions(root);\n  let disposed = false;\n  return {\n    source: descriptor.source,\n    id: descriptor.id,\n    registrationGeneration,\n    dispose() {\n      if (disposed) return;\n      disposed = true;\n      abortRegistrationOperations(root, registrationGeneration);\n      const current = root.claims.get(key);\n      if (!current) return;\n      const index = current.findIndex((candidate) => candidate.registrationGeneration === registrationGeneration);\n      if (index < 0) return;\n      current.splice(index, 1);\n      if (current.length === 0) root.claims.delete(key);\n      refreshSessions(root);\n    },\n  };\n}\n\n/** Creates the Voice-owned live registrar and session service. */\nexport function createDoomVoiceToolsService<SessionContext = unknown>(\n  generation: string,\n): DoomVoiceToolsService<SessionContext> {\n  const normalizedGeneration = normalizedText(generation, 'voice service generation', 256);\n  const root: VoiceToolRegistryRoot = {\n    generation: normalizedGeneration,\n    claims: new Map(),\n    sessions: new Map(),\n    sessionHandles: new Map(),\n    sessionListeners: new Map(),\n    sequence: 0,\n    disposed: false,\n  };\n  const service: DoomVoiceToolsService<SessionContext> = {\n    generation: normalizedGeneration,\n    register<ContributionContext = SessionContext>(\n      definition: VoiceToolDefinition<ContributionContext>,\n      options: VoiceToolRegistrationOptions<ContributionContext> = {},\n    ) {\n      return registerDefinition(root, definition, options);\n    },\n    bindSession(id, context) {\n      if (root.disposed) throw new VoiceToolError('VOICE_TOOL_HOST_UNAVAILABLE', 'Voice tools are disposed.');\n      const key = validSessionId(id);\n      const existing = root.sessions.get(key);\n      if (existing)\n        throw new VoiceToolError('VOICE_TOOL_HOST_UNAVAILABLE', `Voice tool session '${key}' is already bound.`);\n      return createSession(root, key, context);\n    },\n    readSession(id) {\n      const key = validSessionId(id);\n      return root.sessionHandles.get(key) as VoiceToolSessionHandle<SessionContext> | undefined;\n    },\n    subscribeSession(id, listener) {\n      if (root.disposed) return () => undefined;\n      const key = validSessionId(id);\n      const listeners = root.sessionListeners.get(key) ?? new Set();\n      listeners.add(listener as (session: VoiceToolSessionHandle<unknown> | undefined) => void);\n      root.sessionListeners.set(key, listeners);\n      listener(root.sessionHandles.get(key) as VoiceToolSessionHandle<SessionContext> | undefined);\n      return () => {\n        listeners.delete(listener as (session: VoiceToolSessionHandle<unknown> | undefined) => void);\n        if (listeners.size === 0) root.sessionListeners.delete(key);\n      };\n    },\n    dispose() {\n      if (root.disposed) return;\n      root.disposed = true;\n      for (const session of root.sessionHandles.values()) session.dispose();\n      for (const claim of root.claims.values()) {\n        for (const registration of claim) {\n          abortRegistrationOperations(root, registration.registrationGeneration);\n        }\n      }\n      root.claims.clear();\n      root.sessionListeners.clear();\n    },\n  };\n  return Object.freeze(service);\n}\n\nexport function readDoomVoiceToolsService(context: Context): DoomVoiceToolsService | undefined {\n  return context.get(DOOM_VOICE_TOOLS_SERVICE) as DoomVoiceToolsService | undefined;\n}\n\nexport function requireDoomVoiceToolsService(context: Context): DoomVoiceToolsService {\n  const service = readDoomVoiceToolsService(context);\n  if (!service) throw new Error('Doom voice tools are unavailable. Load @agimon-ai/doompi-voice.');\n  return service;\n}\n"],"mappings":"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"}