@jeffusion/bungee-core 5.20.0 → 5.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/config-worker/private-transport.d.ts +2 -0
  2. package/dist/data-admission/errors.d.ts +6 -1
  3. package/dist/gateway/contracts.d.ts +15 -4
  4. package/dist/gateway/forward-plugin.d.ts +2 -0
  5. package/dist/gateway/plugin.js +12 -2
  6. package/dist/gateway/request-plugin.d.ts +6 -0
  7. package/dist/gateway/responses-websocket-session.d.ts +18 -0
  8. package/dist/gateway/runtime.d.ts +1 -0
  9. package/dist/gateway/websocket-contracts.d.ts +1 -0
  10. package/dist/hooks/plugin-hooks.d.ts +2 -3
  11. package/dist/logger/access-log-writer.d.ts +2 -2
  12. package/dist/main.js +1199 -176
  13. package/dist/plugins/ai-transformer/index.js +1 -1
  14. package/dist/plugins/ai-transformer/index.js.map +4 -4
  15. package/dist/plugins/codex-router/control.js +6 -2
  16. package/dist/plugins/codex-router/control.js.map +4 -4
  17. package/dist/plugins/codex-router/index.js +498 -165
  18. package/dist/plugins/codex-router/index.js.map +13 -11
  19. package/dist/plugins/codex-router/manifest.json +124 -8
  20. package/dist/plugins/key-access/index.js +12 -2
  21. package/dist/plugins/key-access/index.js.map +3 -3
  22. package/dist/plugins/key-access/ingress.js +12 -2
  23. package/dist/plugins/key-access/ingress.js.map +3 -3
  24. package/dist/plugins/openai-messages-to-chat/index.js +6 -4
  25. package/dist/plugins/openai-messages-to-chat/index.js.map +4 -4
  26. package/dist/plugins/token-metering/index.js +1 -1
  27. package/dist/plugins/token-metering/index.js.map +4 -4
  28. package/dist/plugins/token-stats/manifest.json +16 -6
  29. package/dist/plugins/token-stats/ui/ClientModelPicker.svelte +13 -61
  30. package/dist/plugins/token-stats/ui/PriceModelPicker.svelte +18 -74
  31. package/dist/plugins/token-stats/ui/TokenStatsSettings.svelte +3 -2
  32. package/dist/plugins/token-stats/ui/model-search.ts +2 -45
  33. package/dist/plugins/token-stats/ui/pricing-catalog.ts +2 -1
  34. package/dist/scoped-plugin-registry.d.ts +7 -0
  35. package/dist/websocket/index.d.ts +1 -1
  36. package/dist/websocket/transport.d.ts +40 -18
  37. package/package.json +2 -2
  38. package/dist/plugins/chatgpt-oauth/ui/account-model.test.js +0 -69
  39. package/dist/plugins/local-accounts/ui/login-errors.test.ts +0 -22
  40. package/dist/plugins/token-stats/ui/client-model-search.test.ts +0 -58
  41. package/dist/plugins/token-stats/ui/pricing-catalog.test.ts +0 -114
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../../plugins/codex-router/server/index.ts", "../../../../llms/src/protocol-converters/registry.ts", "../../../../llms/src/providers/openai/protocol-conversion.ts", "../../../../llms/src/providers/openai/messages-compat-normalization.ts", "../../../../../node_modules/base64-js/index.js", "../../../../../node_modules/js-tiktoken/dist/chunk-VL2OQCWN.js", "../../../../../node_modules/js-tiktoken/dist/index.js", "../../../../llms/src/token-accounting/helpers.ts", "../../../../llms/src/token-accounting/capabilities.ts", "../../../../llms/src/token-accounting/session.ts", "../../../../llms/src/responses-codec/common.ts", "../../../../llms/src/responses-codec/request.ts", "../../../../llms/src/responses-codec/events.ts", "../../../../llms/src/responses-codec/result.ts", "../../../src/plugin-logger.ts", "../../../src/hooks/impl.ts", "../../../src/plugin.types.ts", "../../../src/plugins/sse-envelope.ts", "../../../src/plugin-extensions.ts", "../../../src/data-admission/errors.ts", "../../../src/plugin-durable-state.ts", "../../../src/plugin-services/host-rpc.ts", "../../../src/plugin-services/wire-contract.ts", "../../../src/plugin-services/rpc-runtime.ts", "../../../src/plugin-services/peer-channel-protocol.ts", "../../../src/plugin-services/peer-channel-hub.ts", "../../../src/plugin-services/snapshot-store.ts", "../../../src/plugin-services.ts", "../../../src/gateway/retry-action.ts", "../../../src/token-stats-window.ts", "../../../../../plugins/codex-router/server/history-rpc.ts", "../../../../../plugins/codex-router/server/protocol.ts", "../../../../../plugins/models-dev/contract.ts", "../../../../../plugins/codex-router/server/config.ts", "../../../../../plugins/codex-router/server/catalog.ts"],
3
+ "sources": ["../../../../../plugins/codex-router/server/index.ts", "../../../../llms/src/protocol-converters/registry.ts", "../../../../llms/src/providers/openai/protocol-conversion.ts", "../../../../llms/src/providers/openai/messages-compat-normalization.ts", "../../../../../node_modules/base64-js/index.js", "../../../../../node_modules/js-tiktoken/dist/chunk-VL2OQCWN.js", "../../../../../node_modules/js-tiktoken/dist/index.js", "../../../../llms/src/token-accounting/helpers.ts", "../../../../llms/src/token-accounting/capabilities.ts", "../../../../llms/src/token-accounting/session.ts", "../../../../llms/src/responses-codec/common.ts", "../../../../llms/src/responses-codec/request-preferences.ts", "../../../../llms/src/responses-codec/request.ts", "../../../../llms/src/responses-codec/events.ts", "../../../../llms/src/responses-codec/result.ts", "../../../../../plugins/codex-router/server/history.ts", "../../../src/plugin-logger.ts", "../../../src/hooks/impl.ts", "../../../src/plugin.types.ts", "../../../src/plugins/sse-envelope.ts", "../../../src/plugin-extensions.ts", "../../../src/data-admission/errors.ts", "../../../src/plugin-durable-state.ts", "../../../src/plugin-services/host-rpc.ts", "../../../src/plugin-services/wire-contract.ts", "../../../src/plugin-services/rpc-runtime.ts", "../../../src/plugin-services/peer-channel-protocol.ts", "../../../src/plugin-services/peer-channel-hub.ts", "../../../src/plugin-services/snapshot-store.ts", "../../../src/plugin-services.ts", "../../../src/gateway/retry-action.ts", "../../../src/token-stats-window.ts", "../../../../../plugins/codex-router/server/history-rpc.ts", "../../../../../plugins/codex-router/server/protocol.ts", "../../../../../plugins/models-dev/contract.ts", "../../../../../plugins/codex-router/server/config.ts", "../../../../../plugins/codex-router/server/catalog.ts"],
4
4
  "sourcesContent": [
5
- "import {createHash} from 'node:crypto';\nimport {decodeResponsesRequest,ResponsesCodecError} from '@jeffusion/bungee-llms/plugin-api';\nimport {historyRpc,historyClient,type HistoryClient} from './history-rpc';\nimport {protocolAdapter} from './protocol';\nimport { definePlugin, DataAdmissionError, type Plugin, type PluginInitContext, type PluginHooks } from '@jeffusion/bungee-core/plugin';\nimport { MODELS_DEV_CAPABILITIES_SERVICE_ID, MODELS_DEV_CAPABILITIES_CONTRACT_VERSION, type ModelsDevCapabilitiesService } from '../../models-dev/contract';\nimport manifest from '../manifest.json';\nimport type { PluginConfigField } from '@jeffusion/bungee-core/plugin';\nimport { parseBindings } from './config';\nimport { mergeCatalog, catalogEtag } from './catalog';\n\nexport const CodexRouterPlugin = definePlugin(class implements Plugin {\n static readonly name = 'codex-router';\n static readonly version = '1.0.0';\n static readonly configSchema = manifest.configSchema as unknown as PluginConfigField[];\n private readonly bindings;\n private history!:HistoryClient;\n private targets:PluginInitContext['dispatchTargets']=[];\n private catalog!: ModelsDevCapabilitiesService;\n constructor(options?: { models?: unknown }) { this.bindings = parseBindings(options?.models); }\n async init(context: PluginInitContext) {\n if (context.scope?.type !== 'route') throw new Error('codex_router_requires_route_scope');\n this.targets=context.dispatchTargets ?? [];\n this.history=historyClient(context.services!.rpc!.consume('codex-router',historyRpc));\n this.catalog = context.services!.consume('models-dev', MODELS_DEV_CAPABILITIES_SERVICE_ID, MODELS_DEV_CAPABILITIES_CONTRACT_VERSION);\n }\n bodyRequirements(context: { method: string; url: URL }) {\n return {request:context.method === 'POST' && /\\/responses$/.test(context.url.pathname) ? 'json-write' as const : 'none' as const, response: context.method === 'GET' && /\\/models$/.test(context.url.pathname) ? ['json' as const] : []};\n }\n register(hooks: PluginHooks) {\n hooks.onDispatchRequest.tapPromise('codex-router.binding', async ({context,targets,principal,servingRevision,signal}) => {\n if (context.method !== 'POST' || !/\\/responses$/.test(context.originalUrl.pathname)) return;\n const binding = this.bindings.find(binding => (binding.alias ?? binding.model) === context.body?.model);\n if (!binding) return;\n const target = targets.find(target => target.type === binding.target.type && target.id === binding.target.id);\n if (!target?.protocol) throw new DataAdmissionError(422,'codex_router_target_protocol_required');\n const capabilities=this.catalog.model(binding);\n if(!capabilities)throw new DataAdmissionError(503,'codex_router_model_unavailable');\n const scope=principal?.domain !== 'anonymous' && principal?.keyId ? createHash('sha256').update(JSON.stringify([principal,context.routeId,servingRevision ?? null,this.bindings])).digest('hex') : null;\n const input=structuredClone(context.body);\n if(input.previous_response_id){\n if(!scope)throw new DataAdmissionError(422,'codex_router_history_identity_required');\n const prior=await this.history.get({scope,id:input.previous_response_id},{signal});\n if(!prior)throw new DataAdmissionError(422,'codex_router_history_missing_start_new_conversation');\n const delta=typeof input.input === 'string' ? [{role:'user',content:input.input}] : input.input;\n if(!Array.isArray(delta))throw new DataAdmissionError(422,'codex_router_invalid_history');\n if(JSON.stringify(prior.target)!==JSON.stringify(binding.target) && prior.items.some((item:any)=>item.encrypted_content || item.type==='compaction'))throw new DataAdmissionError(422,'codex_router_unrestorable_history_start_new_conversation');\n input.input=[...prior.items,...delta];delete input.previous_response_id;\n }\n if(input.conversation || input.response_id)throw new DataAdmissionError(422,'codex_router_unsupported_history_reference');\n input.model=binding.model;\n const logicalInput=typeof input.input === 'string' ? [{role:'user',content:input.input}] : input.input;\n if(!Array.isArray(logicalInput))throw new DataAdmissionError(422,'codex_router_invalid_history');\n let toolNames;\n if(target.protocol!=='responses'){\n try {\n const decoded=decodeResponsesRequest(input,target.protocol,{reasoningEffort:capabilities.reasoning && binding.capabilityOverrides?.reasoningEffort===true,\n anthropicThinkingBudget:binding.capabilityOverrides?.anthropicThinkingBudget,maxOutputTokens:capabilities.outputLimit ?? undefined});\n context.body=decoded.body;toolNames=decoded.toolNames;\n }catch(error){if(error instanceof ResponsesCodecError)throw new DataAdmissionError(422,`codex_router_${error.code}`);throw error;}\n context.url.pathname=context.url.pathname.replace(/\\/responses$/,target.protocol==='chat_completions'?'/chat/completions':'/messages');\n }else context.body=input;\n const adapter=protocolAdapter({protocol:target.protocol==='responses'?undefined:target.protocol,model:binding.alias ?? binding.model,toolNames,signal,\n save:async(response)=>{if(scope && typeof response.id==='string')await this.history.put({scope,id:response.id,value:{target:binding.target,items:[...logicalInput,...response.output]}},{signal,operationId:crypto.randomUUID()});}});\n return {target:binding.target,adapter};\n });\n hooks.onBeforeRequest.tap('codex-router.catalog-validator', context => {\n if (context.method === 'GET' && /\\/models$/.test(context.originalUrl.pathname)) {\n for (const key of Object.keys(context.headers)) if (['if-none-match','if-modified-since'].includes(key.toLowerCase())) delete context.headers[key];\n }\n return context;\n });\n hooks.onResponse.tapPromise('codex-router.catalog', async (response, context) => {\n if (context.method !== 'GET' || !/\\/models$/.test(context.originalUrl.pathname) || !response.ok) return response;\n const native = await context.bodyHandle!.json({id:'codex-router.catalog',mandatory:true});\n const bindings=this.bindings.map(binding=>{\n const protocol=this.targets?.find(target=>target.type===binding.target.type && target.id===binding.target.id)?.protocol;\n return {...binding,capabilityOverrides:{...binding.capabilityOverrides,\n ...(protocol==='anthropic_messages'?{images:false}:{}),\n ...(protocol && protocol!=='responses' ? {reasoning:protocol==='chat_completions' ? binding.capabilityOverrides?.reasoningEffort===true : !!binding.capabilityOverrides?.anthropicThinkingBudget}:{}),\n }};\n });\n const body = mergeCatalog(native, bindings, this.catalog);\n const headers = new Headers(response.headers);\n for (const key of ['content-length','content-encoding','etag','last-modified']) headers.delete(key);\n headers.set('content-type','application/json');\n headers.set('cache-control','private, no-store');\n headers.set('etag', catalogEtag(body,this.catalog.status().version,context.originalUrl.searchParams.get('client_version') ?? ''));\n return new Response(JSON.stringify(body), {status:response.status,headers});\n });\n }\n});\nexport default CodexRouterPlugin;\n",
5
+ "import {createHash} from 'node:crypto';\nimport {decodeResponsesRequest,ResponsesCodecError} from '@jeffusion/bungee-llms/plugin-api';\nimport {historyRpc,historyClient,type HistoryClient} from './history-rpc';\nimport {protocolAdapter} from './protocol';\nimport { definePlugin, DataAdmissionError, type Plugin, type PluginInitContext, type PluginHooks } from '@jeffusion/bungee-core/plugin';\nimport { MODELS_DEV_CAPABILITIES_SERVICE_ID, MODELS_DEV_CAPABILITIES_CONTRACT_VERSION, type ModelsDevCapabilitiesService } from '../../models-dev/contract';\nimport manifest from '../manifest.json';\nimport type { PluginConfigField } from '@jeffusion/bungee-core/plugin';\nimport { parseBindings, bindingSource } from './config';\nimport { mergeCatalog, catalogEtag } from './catalog';\n\nexport const CodexRouterPlugin = definePlugin(class implements Plugin {\n static readonly name = 'codex-router';\n static readonly version = '1.0.0';\n static readonly configSchema = manifest.configSchema as unknown as PluginConfigField[];\n private readonly bindings;\n private history!:HistoryClient;\n private catalog!: ModelsDevCapabilitiesService;\n constructor(options?: { models?: unknown }) { this.bindings = parseBindings(options?.models); }\n async init(context: PluginInitContext) {\n if (context.scope?.type !== 'route') throw new Error('codex_router_requires_route_scope');\n this.history=historyClient(context.services!.rpc!.consume('codex-router',historyRpc));\n this.catalog = context.services!.consume('models-dev', MODELS_DEV_CAPABILITIES_SERVICE_ID, MODELS_DEV_CAPABILITIES_CONTRACT_VERSION);\n }\n bodyRequirements(context: { method: string; url: URL }) {\n return {request:context.method === 'POST' && /\\/responses$/.test(context.url.pathname) ? 'json-write' as const : 'none' as const, response: context.method === 'GET' && /\\/models$/.test(context.url.pathname) ? ['json' as const] : []};\n }\n register(hooks: PluginHooks) {\n hooks.onWebSocketSessionMode.tap('codex-router.session', url => /\\/responses$/.test(url.pathname) ? 'responses' : undefined);\n hooks.onDispatchRequest.tapPromise('codex-router.binding', async ({context,targets,principal,servingRevision,signal}) => {\n if (context.method !== 'POST' || !/\\/responses$/.test(context.originalUrl.pathname)) return;\n const binding = this.bindings.find(binding => bindingSource(binding) === context.body?.model);\n if (!binding) return;\n if (!targets.some(target => target.type === binding.target.type && target.id === binding.target.id)) throw new DataAdmissionError(422,'codex_router_target_unavailable');\n const protocol = binding.target.protocol;\n const capabilities=this.catalog.model(binding);\n if(!capabilities || capabilities.contextWindow === null || !capabilities.inputModalities.includes('text'))throw new DataAdmissionError(503,'codex_router_model_unavailable');\n const scope=principal?.domain !== 'anonymous' && principal?.keyId ? createHash('sha256').update(JSON.stringify([principal,context.routeId,servingRevision ?? null,this.bindings])).digest('hex') : null;\n const input=structuredClone(context.body);\n let requiredUpstreamId:string|undefined;\n let opaqueRestored=false;\n if(input.previous_response_id){\n if(!scope)throw new DataAdmissionError(422,'codex_router_history_identity_required');\n const prior=await this.history.get({scope,id:input.previous_response_id},{signal});\n if(!prior)throw new DataAdmissionError(422,'codex_router_history_missing_start_new_conversation');\n const delta=typeof input.input === 'string' ? [{role:'user',content:input.input}] : input.input;\n if(!Array.isArray(delta))throw new DataAdmissionError(422,'codex_router_invalid_history');\n if(prior.items.some((item:any)=>item.encrypted_content || item.type==='compaction')){\n if(protocol!=='responses' || JSON.stringify(prior.target)!==JSON.stringify(binding.target) || prior.origin?.provider!==binding.provider || prior.origin?.model!==binding.model || !prior.origin?.upstreamId)throw new DataAdmissionError(422,'codex_router_unrestorable_history_start_new_conversation');\n requiredUpstreamId=prior.origin.upstreamId;opaqueRestored=true;\n }\n input.input=[...prior.items,...delta];delete input.previous_response_id;\n }\n if(input.conversation || input.response_id)throw new DataAdmissionError(422,'codex_router_unsupported_history_reference');\n input.model=binding.model;\n let logicalInput=typeof input.input === 'string' ? [{role:'user',content:input.input}] : input.input;\n if(!Array.isArray(logicalInput))throw new DataAdmissionError(422,'codex_router_invalid_history');\n if(!opaqueRestored && logicalInput.some((item:any)=>item?.encrypted_content || item?.type==='compaction'))throw new DataAdmissionError(422,'codex_router_unrestorable_history_start_new_conversation');\n const hasTools=input.tools?.length || logicalInput.some((item:any)=>item?.type==='additional_tools' && item.tools?.length);\n if(hasTools && (!capabilities.toolCall || binding.capabilityOverrides?.tools===false))throw new DataAdmissionError(422,'codex_router_tools_unsupported');\n let toolNames;\n let diagnostics;\n if(protocol!=='responses'){\n try {\n const decoded=decodeResponsesRequest(input,protocol,{omitOptionalWebSearch:true,reasoningEffort:capabilities.reasoning && binding.capabilityOverrides?.reasoningEffort===true,\n reasoningHistory:capabilities.reasoning && binding.capabilityOverrides?.reasoning!==false,\n anthropicThinkingBudget:undefined,maxOutputTokens:capabilities.outputLimit ?? undefined});\n context.body=decoded.body;toolNames=decoded.toolNames;logicalInput=decoded.canonicalInput;\n diagnostics=decoded.diagnostics;\n }catch(error){if(error instanceof ResponsesCodecError)throw new DataAdmissionError(422,`codex_router_${error.code}`,undefined,{message:error.message,param:error.param});throw error;}\n context.url.pathname=context.url.pathname.replace(/\\/responses$/,protocol==='chat_completions'?'/chat/completions':'/messages');\n }else context.body=input;\n const adapter=protocolAdapter({protocol:protocol==='responses'?undefined:protocol,model:bindingSource(binding),toolNames,signal,\n save:async(response,responseContext)=>{if(scope && typeof response.id==='string')await this.history.put({scope,id:response.id,value:{target:binding.target,origin:{provider:binding.provider,model:binding.model,upstreamId:responseContext?.upstreamId},items:[...logicalInput,...response.output]}},{signal,operationId:crypto.randomUUID()});}});\n return {target:binding.target,protocol,requiredUpstreamId,adapter,...(protocol!=='responses'?{canonicalInput:logicalInput,diagnostics}:{})};\n });\n hooks.onBeforeRequest.tap('codex-router.catalog-validator', context => {\n if (context.method === 'GET' && /\\/models$/.test(context.originalUrl.pathname)) {\n for (const key of Object.keys(context.headers)) if (['if-none-match','if-modified-since'].includes(key.toLowerCase())) delete context.headers[key];\n }\n return context;\n });\n hooks.onResponse.tapPromise('codex-router.catalog', async (response, context) => {\n if (context.method !== 'GET' || !/\\/models$/.test(context.originalUrl.pathname) || !response.ok) return response;\n const native = await context.bodyHandle!.json({id:'codex-router.catalog',mandatory:true});\n const bindings=this.bindings.map(binding=>{\n const protocol=binding.target.protocol;\n return {...binding,capabilityOverrides:{...binding.capabilityOverrides,\n ...(protocol==='anthropic_messages'?{images:false}:{}),\n ...(protocol!=='responses' ? {reasoning:protocol==='chat_completions' ? binding.capabilityOverrides?.reasoningEffort===true : false}:{}),\n }};\n });\n const body = mergeCatalog(native, bindings, this.catalog);\n const headers = new Headers(response.headers);\n for (const key of ['content-length','content-encoding','etag','last-modified']) headers.delete(key);\n headers.set('content-type','application/json');\n headers.set('cache-control','private, no-store');\n headers.set('etag', catalogEtag(body,this.catalog.status().version,context.originalUrl.searchParams.get('client_version') ?? ''));\n return new Response(JSON.stringify(body), {status:response.status,headers});\n });\n }\n});\nexport default CodexRouterPlugin;\n",
6
6
  "import type { AIConverter, TransformDirection } from './base';\n\nexport class ProtocolTransformerRegistry {\n private static converters = new Map<TransformDirection, new () => AIConverter>();\n\n static register(from: string, to: string, ConverterClass: new () => AIConverter): void {\n const key: TransformDirection = `${from}-${to}`;\n this.converters.set(key, ConverterClass);\n }\n\n static get(from: string, to: string): AIConverter {\n const key: TransformDirection = `${from}-${to}`;\n const ConverterClass = this.converters.get(key);\n\n if (!ConverterClass) {\n const availableConverters = Array.from(this.converters.keys()).join(', ');\n throw new Error(\n `No converter found for \"${from}\" → \"${to}\".\\n`\n + `Available converters: ${availableConverters || 'none'}`\n );\n }\n\n return new ConverterClass();\n }\n\n static has(from: string, to: string): boolean {\n const key: TransformDirection = `${from}-${to}`;\n return this.converters.has(key);\n }\n\n static getAllDirections(): TransformDirection[] {\n return Array.from(this.converters.keys());\n }\n\n static clear(): void {\n this.converters.clear();\n }\n}\n",
7
7
  "export type JsonRecord = Record<string, unknown>;\n\nexport interface OpenAIProtocolConversionOptions {\n trimWhitespace?: boolean;\n}\n\nconst THINKING_TAG_PATTERN = /<thinking>([\\s\\S]*?)<\\/thinking>/gi;\nconst TOOL_CALL_CONTENT_TYPES = new Set([\n 'tool_use',\n 'tool_call',\n 'function_call',\n 'output_tool_call'\n]);\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction asString(value: unknown, trimWhitespace: boolean): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n return trimWhitespace ? value.trim() : value;\n}\n\nfunction normalizePath(pathname: string): string {\n if (pathname.length > 1 && pathname.endsWith('/')) {\n return pathname.slice(0, -1);\n }\n\n return pathname;\n}\n\nfunction isEnabledLike(value: unknown): boolean {\n if (value === true) {\n return true;\n }\n\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n return normalized === 'enabled'\n || normalized === 'enable'\n || normalized === 'true'\n || normalized === 'on'\n || normalized === '1';\n }\n\n if (!isRecord(value)) {\n return false;\n }\n\n const type = typeof value.type === 'string' ? value.type.trim().toLowerCase() : '';\n if (type === 'disabled' || type === 'disable' || type === 'off') {\n return false;\n }\n\n if (value.enabled === false) {\n return false;\n }\n\n if (value.enabled === true) {\n return true;\n }\n\n if (type === 'enabled' || type === 'enable') {\n return true;\n }\n\n return Object.keys(value).length > 0;\n}\n\nfunction isToolCallContentBlock(item: JsonRecord): boolean {\n const itemType = typeof item.type === 'string' ? item.type.trim().toLowerCase() : '';\n if (TOOL_CALL_CONTENT_TYPES.has(itemType) || itemType.endsWith('_call')) {\n return true;\n }\n\n const hasCallIdentifier = typeof item.id === 'string'\n || typeof item.call_id === 'string'\n || typeof item.name === 'string';\n const hasCallPayload = item.input !== undefined\n || item.arguments !== undefined\n || item.function !== undefined;\n\n return hasCallIdentifier && hasCallPayload;\n}\n\nfunction hasToolCalls(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n\n if (isRecord(value)) {\n return Object.keys(value).length > 0;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return false;\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (Array.isArray(parsed)) {\n return parsed.length > 0;\n }\n\n return isRecord(parsed);\n } catch {\n return true;\n }\n}\n\nfunction hasToolCallLikeContent(content: unknown): boolean {\n if (!Array.isArray(content)) {\n return false;\n }\n\n for (const item of content) {\n if (!isRecord(item)) {\n continue;\n }\n\n if (isToolCallContentBlock(item)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isAssistantToolCallMessage(message: JsonRecord): boolean {\n if (message.role !== 'assistant') {\n return false;\n }\n\n return hasToolCalls(message.tool_calls) || hasToolCallLikeContent(message.content);\n}\n\nfunction extractThinkingTagContent(content: string, trimWhitespace: boolean): string {\n THINKING_TAG_PATTERN.lastIndex = 0;\n const extracted: string[] = [];\n let matched: RegExpExecArray | null = THINKING_TAG_PATTERN.exec(content);\n while (matched !== null) {\n const block = asString(matched[1], trimWhitespace);\n if (block) {\n extracted.push(block);\n }\n matched = THINKING_TAG_PATTERN.exec(content);\n }\n\n if (extracted.length === 0) {\n return '';\n }\n\n return extracted.join('\\n\\n');\n}\n\nfunction extractReasoningFromArrayContent(content: unknown[], trimWhitespace: boolean): string {\n const reasoningTexts: string[] = [];\n\n for (const item of content) {\n if (!isRecord(item)) {\n continue;\n }\n\n const type = typeof item.type === 'string' ? item.type : '';\n if (type !== 'reasoning' && type !== 'thinking' && type !== 'reasoning_content') {\n continue;\n }\n\n const candidates: unknown[] = [\n item.text,\n item.content,\n item.reasoning,\n item.thinking\n ];\n\n for (const candidate of candidates) {\n const text = asString(candidate, trimWhitespace);\n if (text && text.length > 0) {\n reasoningTexts.push(text);\n break;\n }\n }\n }\n\n if (reasoningTexts.length === 0) {\n return '';\n }\n\n return reasoningTexts.join('\\n\\n');\n}\n\nfunction extractReasoningContent(content: unknown, trimWhitespace: boolean): string {\n if (typeof content === 'string') {\n return extractThinkingTagContent(content, trimWhitespace);\n }\n\n if (Array.isArray(content)) {\n return extractReasoningFromArrayContent(content, trimWhitespace);\n }\n\n return '';\n}\n\nfunction normalizeAnthropicUsage(usage: unknown): { input_tokens: number; output_tokens: number } {\n if (!isRecord(usage)) {\n return {\n input_tokens: 0,\n output_tokens: 0\n };\n }\n\n return {\n input_tokens: typeof usage.input_tokens === 'number' ? usage.input_tokens : 0,\n output_tokens: typeof usage.output_tokens === 'number' ? usage.output_tokens : 0\n };\n}\n\nfunction normalizeAssistantToolCallMessage(message: JsonRecord, trimWhitespace: boolean): JsonRecord {\n if (typeof message.reasoning_content === 'string') {\n const normalized = trimWhitespace ? message.reasoning_content.trim() : message.reasoning_content;\n if (normalized === message.reasoning_content) {\n return message;\n }\n\n return {\n ...message,\n reasoning_content: normalized\n };\n }\n\n return {\n ...message,\n reasoning_content: extractReasoningContent(message.content, trimWhitespace)\n };\n}\n\nfunction convertChatUserContentToResponsesContent(content: unknown): JsonRecord[] {\n if (typeof content === 'string') {\n const text = content.trim();\n return text ? [{ type: 'input_text', text }] : [{ type: 'input_text', text: '' }];\n }\n\n if (!Array.isArray(content)) {\n return [{ type: 'input_text', text: '' }];\n }\n\n const converted: JsonRecord[] = [];\n\n for (const part of content) {\n if (typeof part === 'string') {\n const text = part.trim();\n if (text) {\n converted.push({ type: 'input_text', text });\n }\n continue;\n }\n\n if (!isRecord(part)) {\n continue;\n }\n\n if (part.type === 'text' && typeof part.text === 'string') {\n converted.push({ type: 'input_text', text: part.text });\n continue;\n }\n\n if (part.type === 'image_url' && isRecord(part.image_url) && typeof part.image_url.url === 'string') {\n converted.push({ type: 'input_image', image_url: part.image_url.url });\n }\n }\n\n return converted.length > 0 ? converted : [{ type: 'input_text', text: '' }];\n}\n\nexport class OpenAIProtocolConversion {\n private readonly trimWhitespace: boolean;\n\n constructor(options?: OpenAIProtocolConversionOptions) {\n this.trimWhitespace = options?.trimWhitespace !== false;\n }\n\n isResponsesPath(pathname: string): boolean {\n const normalizedPath = normalizePath(pathname);\n return normalizedPath === '/v1/responses' || normalizedPath === '/responses';\n }\n\n isReasoningContext(body: JsonRecord): boolean {\n if (body.reasoning !== undefined && body.reasoning !== null) {\n return true;\n }\n\n if (typeof body.reasoning_effort === 'string' && body.reasoning_effort.trim().length > 0) {\n return true;\n }\n\n if (isEnabledLike(body.enable_thinking)) {\n return true;\n }\n\n return isEnabledLike(body.thinking);\n }\n\n normalizeResponsesReasoningBody(body: JsonRecord): JsonRecord {\n let changed = false;\n let normalizedBody = body;\n\n for (const key of ['input', 'messages'] as const) {\n const normalizedCollection = this.normalizeMessageCollection(normalizedBody, key);\n if (normalizedCollection.changed) {\n normalizedBody = normalizedCollection.body;\n changed = true;\n }\n }\n\n if (!changed) {\n return body;\n }\n\n return normalizedBody;\n }\n\n /** Normalize an already parsed object without reading or mutating a transport body. */\n ensureAssistantToolUseReasoningContent(body: unknown): unknown {\n if (!isRecord(body) || body.type !== 'message' || body.role !== 'assistant' || !Array.isArray(body.content)) {\n return body;\n }\n if (!body.content.some((block) => isRecord(block) && block.type === 'tool_use')\n || typeof body.reasoning_content === 'string') {\n return body;\n }\n return {\n ...body,\n reasoning_content: this.extractThinkingTextFromAnthropicContent(body.content)\n };\n }\n\n ensureMessagesStreamCompatibility(\n events: unknown[],\n ctx: { streamState: Map<string, unknown> }\n ): unknown[] {\n const withUsage = this.ensureMessageDeltaUsage(events, ctx);\n return this.ensureMessageStartReasoningContent(withUsage);\n }\n\n convertChatMessagesToResponsesInput(messages: unknown): { input: JsonRecord[]; instructions?: string } {\n if (!Array.isArray(messages)) {\n return { input: [] };\n }\n\n const input: JsonRecord[] = [];\n const instructionParts: string[] = [];\n\n for (const msg of messages) {\n if (!isRecord(msg)) {\n continue;\n }\n\n if (msg.role === 'system') {\n const text = typeof msg.content === 'string' ? msg.content.trim() : '';\n if (text) instructionParts.push(text);\n continue;\n }\n\n if (msg.role === 'user') {\n input.push({\n role: 'user',\n content: convertChatUserContentToResponsesContent(msg.content)\n });\n continue;\n }\n\n if (msg.role === 'assistant') {\n const assistantText = typeof msg.content === 'string' ? msg.content.trim() : '';\n if (assistantText) {\n input.push({\n role: 'assistant',\n content: [{ type: 'output_text', text: assistantText }]\n });\n }\n\n if (Array.isArray(msg.tool_calls)) {\n for (const toolCall of msg.tool_calls) {\n if (!isRecord(toolCall)) {\n continue;\n }\n\n const callId = typeof toolCall.id === 'string' ? toolCall.id : '';\n const functionObject = isRecord(toolCall.function) ? toolCall.function : undefined;\n if (!functionObject) {\n continue;\n }\n const functionName = typeof functionObject?.name === 'string' ? functionObject.name : '';\n if (!callId || !functionName) {\n continue;\n }\n\n input.push({\n type: 'function_call',\n call_id: callId,\n name: functionName,\n arguments: functionObject.arguments || '{}'\n });\n }\n }\n\n continue;\n }\n\n if (msg.role === 'tool') {\n const callId = typeof msg.tool_call_id === 'string' ? msg.tool_call_id : '';\n if (!callId) {\n continue;\n }\n\n input.push({\n type: 'function_call_output',\n call_id: callId,\n output: msg.content ?? ''\n });\n }\n }\n\n const instructions = instructionParts.length > 0 ? instructionParts.join('\\n') : undefined;\n return { input, instructions };\n }\n\n mapChatToolsToResponsesTools(chatTools: unknown): JsonRecord[] {\n if (!Array.isArray(chatTools)) {\n return [];\n }\n\n const mapped: JsonRecord[] = [];\n for (const tool of chatTools) {\n if (!isRecord(tool) || tool.type !== 'function' || !isRecord(tool.function)) {\n continue;\n }\n\n const name = typeof tool.function.name === 'string' ? tool.function.name : '';\n if (!name) {\n continue;\n }\n\n const parameters = isRecord(tool.function.parameters)\n ? tool.function.parameters\n : { type: 'object', properties: {} };\n\n mapped.push({\n type: 'function',\n name,\n description: typeof tool.function.description === 'string' ? tool.function.description : '',\n parameters\n });\n }\n\n return mapped;\n }\n\n convertResponsesInputToMessages(input: unknown): JsonRecord[] {\n if (typeof input === 'string') {\n const text = input.trim();\n return text ? [{ role: 'user', content: text }] : [];\n }\n\n if (!Array.isArray(input)) {\n return [];\n }\n\n const messages: JsonRecord[] = [];\n const pendingTopLevelInputParts: unknown[] = [];\n\n const flushPendingTopLevelInputParts = (): void => {\n if (pendingTopLevelInputParts.length === 0) {\n return;\n }\n\n messages.push({\n role: 'user',\n content: this.normalizeResponsesMessageContent([...pendingTopLevelInputParts])\n });\n\n pendingTopLevelInputParts.length = 0;\n };\n\n for (const item of input) {\n if (typeof item === 'string') {\n if (item.trim()) {\n pendingTopLevelInputParts.push({ type: 'input_text', text: item });\n }\n continue;\n }\n\n if (!isRecord(item)) {\n continue;\n }\n\n const itemType = item.type;\n\n if (\n itemType === 'input_text'\n || itemType === 'output_text'\n || itemType === 'input_image'\n || itemType === 'text'\n || itemType === 'image_url'\n ) {\n pendingTopLevelInputParts.push(item);\n continue;\n }\n\n if (itemType === 'function_call') {\n flushPendingTopLevelInputParts();\n\n const rawArgs = item.arguments;\n const argumentsString = typeof rawArgs === 'string'\n ? rawArgs\n : JSON.stringify(rawArgs || {});\n\n messages.push({\n role: 'assistant',\n content: null,\n tool_calls: [{\n id: item.call_id || item.id || '',\n type: 'function',\n function: {\n name: item.name || '',\n arguments: argumentsString\n }\n }]\n });\n continue;\n }\n\n if (itemType === 'function_call_output') {\n flushPendingTopLevelInputParts();\n\n messages.push({\n role: 'tool',\n tool_call_id: item.call_id || '',\n content: item.output ?? '',\n is_error: item.is_error === true || item.status === 'error' || item.status === 'failed'\n });\n continue;\n }\n\n if (itemType === 'message') {\n flushPendingTopLevelInputParts();\n\n const role = item.role || 'user';\n if (typeof role === 'string') {\n messages.push({\n role,\n content: this.normalizeResponsesMessageContent(item.content)\n });\n }\n continue;\n }\n\n if (typeof item.role === 'string') {\n flushPendingTopLevelInputParts();\n\n messages.push({\n role: item.role,\n content: this.normalizeResponsesMessageContent(item.content)\n });\n }\n }\n\n flushPendingTopLevelInputParts();\n\n return messages;\n }\n\n normalizeResponsesMessageContent(content: unknown): unknown {\n if (typeof content === 'string') {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return content;\n }\n\n const converted = content\n .map((part) => {\n if (typeof part === 'string') {\n return { type: 'text', text: part };\n }\n\n if (!isRecord(part)) {\n return null;\n }\n\n if (part.type === 'input_text' || part.type === 'output_text') {\n return { type: 'text', text: part.text || '' };\n }\n\n if (part.type === 'input_image') {\n const imageUrl = typeof part.image_url === 'string'\n ? part.image_url\n : isRecord(part.image_url)\n ? part.image_url.url\n : undefined;\n\n if (typeof imageUrl === 'string' && imageUrl) {\n return {\n type: 'image_url',\n image_url: { url: imageUrl }\n };\n }\n }\n\n return part;\n })\n .filter((part) => part !== null);\n\n return converted;\n }\n\n private normalizeMessageCollection(\n body: JsonRecord,\n key: 'input' | 'messages'\n ): { body: JsonRecord; changed: boolean } {\n const collection = body[key];\n if (!Array.isArray(collection)) {\n return { body, changed: false };\n }\n\n let changed = false;\n const normalizedCollection = collection.map((item) => {\n const normalizedItem = this.normalizeAssistantToolCallCandidate(item);\n if (normalizedItem.changed) {\n changed = true;\n }\n\n return normalizedItem.normalized;\n });\n\n if (!changed) {\n return { body, changed: false };\n }\n\n return {\n body: {\n ...body,\n [key]: normalizedCollection\n },\n changed: true\n };\n }\n\n private normalizeAssistantToolCallCandidate(\n value: unknown\n ): { normalized: unknown; changed: boolean } {\n if (!isRecord(value)) {\n return { normalized: value, changed: false };\n }\n\n let changed = false;\n let current: JsonRecord = value;\n\n if (isRecord(current.message)) {\n const nested = this.normalizeAssistantToolCallCandidate(current.message);\n if (nested.changed) {\n current = {\n ...current,\n message: nested.normalized\n };\n changed = true;\n }\n }\n\n if (!isAssistantToolCallMessage(current)) {\n return { normalized: current, changed };\n }\n\n const normalizedMessage = normalizeAssistantToolCallMessage(current, this.trimWhitespace);\n if (normalizedMessage !== current) {\n current = normalizedMessage;\n changed = true;\n }\n\n return { normalized: current, changed };\n }\n\n private extractThinkingTextFromAnthropicContent(content: unknown[]): string {\n const segments: string[] = [];\n\n for (const block of content) {\n if (!isRecord(block) || block.type !== 'thinking') {\n continue;\n }\n\n if (typeof block.thinking === 'string' && block.thinking.trim().length > 0) {\n segments.push(block.thinking.trim());\n }\n }\n\n return segments.join('\\n\\n');\n }\n\n private ensureMessageStartReasoningContent(events: unknown[]): unknown[] {\n return events.map((event) => {\n if (!isRecord(event) || event.type !== 'message_start' || !isRecord(event.message)) {\n return event;\n }\n\n const existingReasoningContent = event.message.reasoning_content;\n if (typeof existingReasoningContent === 'string') {\n return event;\n }\n\n return {\n ...event,\n message: {\n ...event.message,\n reasoning_content: ''\n }\n };\n });\n }\n\n private ensureMessageDeltaUsage(\n events: unknown[],\n ctx: { streamState: Map<string, unknown> }\n ): unknown[] {\n const lastUsageKey = 'messages_compat_last_usage';\n const cachedUsage = normalizeAnthropicUsage(ctx.streamState.get(lastUsageKey));\n\n return events.map((event) => {\n if (!isRecord(event) || event.type !== 'message_delta') {\n return event;\n }\n\n const normalizedUsage = normalizeAnthropicUsage(event.usage ?? cachedUsage);\n ctx.streamState.set(lastUsageKey, normalizedUsage);\n\n return {\n ...event,\n usage: normalizedUsage\n };\n });\n }\n}\n",
8
8
  "export interface OpenAIMessagesCompatibilityNormalizerOptions {\n strictValidation?: boolean;\n allowShortPathAlias?: boolean;\n}\n\nexport interface OpenAIMessagesCompatibilityRequestLike {\n method: string;\n url: {\n pathname: string;\n };\n}\n\nexport type OpenAIMessagesCompatibilityJsonObject = Record<string, unknown>;\n\ntype NormalizedMessageResult =\n | { ok: true; messages: OpenAIMessagesCompatibilityJsonObject[] }\n | { ok: false; message: string };\ntype NormalizedPartResult =\n | { ok: true; part: unknown }\n | { ok: false; message: string };\nexport type OpenAIMessagesCompatibilityBodyValidationResult =\n | { ok: true; body: OpenAIMessagesCompatibilityJsonObject }\n | { ok: false; message: string };\ntype NormalizedToolResult =\n | { ok: true; tool: OpenAIMessagesCompatibilityJsonObject }\n | { ok: false; message: string };\ntype NormalizedToolsResult =\n | { ok: true; tools?: OpenAIMessagesCompatibilityJsonObject[] }\n | { ok: false; message: string };\ntype NormalizedToolChoiceResult =\n | { ok: true; toolChoice?: OpenAIMessagesCompatibilityJsonObject | 'auto' | 'none' | 'required' }\n | { ok: false; message: string };\n\nconst RESPONSES_STYLE_FIELDS = [\n 'input',\n 'instructions',\n 'max_output_tokens',\n 'previous_response_id',\n 'conversation',\n 'response_id'\n] as const;\n\nconst THREAD_RESOURCE_FIELDS = [\n 'thread_id',\n 'assistant_id',\n 'run_id',\n 'attachments'\n] as const;\n\nconst SUPPORTED_ROLES = new Set(['system', 'developer', 'user', 'assistant', 'tool']);\n\nfunction isRecord(value: unknown): value is OpenAIMessagesCompatibilityJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwn(obj: OpenAIMessagesCompatibilityJsonObject, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction extractImageUrl(part: OpenAIMessagesCompatibilityJsonObject): string | undefined {\n const fromImageUrl = part.image_url;\n if (typeof fromImageUrl === 'string' && fromImageUrl.trim().length > 0) {\n return fromImageUrl;\n }\n\n if (isRecord(fromImageUrl)) {\n const nestedUrl = fromImageUrl.url;\n if (typeof nestedUrl === 'string' && nestedUrl.trim().length > 0) {\n return nestedUrl;\n }\n }\n\n const fallbackUrl = part.url;\n if (typeof fallbackUrl === 'string' && fallbackUrl.trim().length > 0) {\n return fallbackUrl;\n }\n\n return undefined;\n}\n\nfunction normalizeJsonSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== 'object') {\n return schema;\n }\n\n if (Array.isArray(schema)) {\n return schema.map((item) => normalizeJsonSchema(item));\n }\n\n const source = schema as Record<string, unknown>;\n const normalized: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(source)) {\n if (key === 'properties' && isRecord(value)) {\n const normalizedProperties: Record<string, unknown> = {};\n for (const [propertyName, propertySchema] of Object.entries(value)) {\n normalizedProperties[propertyName] = normalizeJsonSchema(propertySchema);\n }\n normalized[key] = normalizedProperties;\n continue;\n }\n\n normalized[key] = normalizeJsonSchema(value);\n }\n\n const typeValue = typeof normalized.type === 'string' ? normalized.type.toLowerCase() : '';\n if (typeValue === 'object') {\n const hasProperties = isRecord(normalized.properties);\n if (!hasProperties) {\n normalized.properties = {};\n }\n }\n\n return normalized;\n}\n\nfunction normalizeToolParametersSchema(schema: unknown): OpenAIMessagesCompatibilityJsonObject {\n if (!isRecord(schema)) {\n return { type: 'object', properties: {} };\n }\n\n const normalized = normalizeJsonSchema(schema);\n if (!isRecord(normalized)) {\n return { type: 'object', properties: {} };\n }\n\n const typeValue = typeof normalized.type === 'string' ? normalized.type.toLowerCase() : '';\n if (typeValue === 'object' && !isRecord(normalized.properties)) {\n normalized.properties = {};\n }\n\n return normalized;\n}\n\nexport class OpenAIMessagesCompatibilityNormalizer {\n private readonly strictValidation: boolean;\n\n private readonly allowShortPathAlias: boolean;\n\n constructor(options?: OpenAIMessagesCompatibilityNormalizerOptions) {\n this.strictValidation = options?.strictValidation !== false;\n this.allowShortPathAlias = options?.allowShortPathAlias !== false;\n }\n\n shouldHandleRequest(ctx: OpenAIMessagesCompatibilityRequestLike): boolean {\n if (ctx.method.toUpperCase() !== 'POST') {\n return false;\n }\n\n const normalizedPath = this.normalizePathname(ctx.url.pathname);\n if (normalizedPath === '/v1/messages') {\n return true;\n }\n\n return this.allowShortPathAlias && normalizedPath === '/messages';\n }\n\n validateAndNormalizeBody(rawBody: unknown): OpenAIMessagesCompatibilityBodyValidationResult {\n if (!isRecord(rawBody)) {\n return {\n ok: false,\n message: 'messages compatibility route requires a JSON object body.'\n };\n }\n\n const conflictingFields = this.collectConflictingFields(rawBody);\n if (this.strictValidation && conflictingFields.length > 0) {\n return {\n ok: false,\n message: `messages compatibility route does not accept these fields: ${conflictingFields.join(', ')}.`\n };\n }\n\n const model = rawBody.model;\n if (typeof model !== 'string' || model.trim().length === 0) {\n return {\n ok: false,\n message: 'messages compatibility route requires a non-empty \"model\" field.'\n };\n }\n\n const messages = rawBody.messages;\n if (!Array.isArray(messages) || messages.length === 0) {\n return {\n ok: false,\n message: 'messages compatibility route requires a non-empty \"messages\" array.'\n };\n }\n\n const normalizedMessages: OpenAIMessagesCompatibilityJsonObject[] = [];\n for (let i = 0; i < messages.length; i += 1) {\n const normalizedMessage = this.normalizeMessage(messages[i], i + 1);\n if (!normalizedMessage.ok) {\n return {\n ok: false,\n message: normalizedMessage.message\n };\n }\n\n normalizedMessages.push(...normalizedMessage.messages);\n }\n\n const normalizedBody: OpenAIMessagesCompatibilityJsonObject = {\n ...rawBody,\n model: model.trim(),\n messages: normalizedMessages\n };\n\n const normalizedTools = this.normalizeTools(rawBody.tools);\n if (!normalizedTools.ok) {\n return {\n ok: false,\n message: normalizedTools.message\n };\n }\n\n if (normalizedTools.tools && normalizedTools.tools.length > 0) {\n normalizedBody.tools = normalizedTools.tools;\n } else {\n delete normalizedBody.tools;\n }\n\n const normalizedToolChoice = this.normalizeToolChoice(rawBody.tool_choice);\n if (!normalizedToolChoice.ok) {\n return {\n ok: false,\n message: normalizedToolChoice.message\n };\n }\n\n if (normalizedToolChoice.toolChoice !== undefined) {\n normalizedBody.tool_choice = normalizedToolChoice.toolChoice;\n } else {\n delete normalizedBody.tool_choice;\n }\n\n if (!this.strictValidation) {\n for (const field of conflictingFields) {\n delete normalizedBody[field];\n }\n }\n\n return {\n ok: true,\n body: normalizedBody\n };\n }\n\n isOpenAIResponsePayload(payload: unknown): boolean {\n if (!isRecord(payload)) {\n return false;\n }\n\n if (Array.isArray(payload.choices) || Array.isArray(payload.output)) {\n return true;\n }\n\n const objectType = payload.object;\n if (typeof objectType === 'string') {\n return objectType === 'chat.completion' || objectType === 'response';\n }\n\n if (isRecord(payload.error) && typeof payload.error.message === 'string') {\n return true;\n }\n\n return false;\n }\n\n isOpenAIStreamChunk(chunk: unknown): boolean {\n if (!isRecord(chunk)) {\n return false;\n }\n\n if (Array.isArray(chunk.choices)) {\n return true;\n }\n\n const objectType = chunk.object;\n if (typeof objectType === 'string' && objectType.startsWith('chat.completion')) {\n return true;\n }\n\n const eventType = chunk.type;\n return typeof eventType === 'string' && eventType.startsWith('response.');\n }\n\n buildBadRequest(message: string): Response {\n return new Response(\n JSON.stringify({\n error: {\n type: 'invalid_request_error',\n message\n }\n }),\n {\n status: 400,\n headers: {\n 'Content-Type': 'application/json'\n }\n }\n );\n }\n\n private normalizePathname(pathname: string): string {\n if (pathname.length > 1 && pathname.endsWith('/')) {\n return pathname.slice(0, -1);\n }\n\n return pathname;\n }\n\n private collectConflictingFields(body: OpenAIMessagesCompatibilityJsonObject): string[] {\n const conflictingFields: string[] = [];\n\n for (const field of RESPONSES_STYLE_FIELDS) {\n if (hasOwn(body, field)) {\n conflictingFields.push(field);\n }\n }\n\n for (const field of THREAD_RESOURCE_FIELDS) {\n if (hasOwn(body, field)) {\n conflictingFields.push(field);\n }\n }\n\n return conflictingFields;\n }\n\n private parseToolsInput(rawTools: unknown):\n | { ok: true; tools: unknown[] }\n | { ok: false; message: string } {\n if (rawTools === undefined || rawTools === null) {\n return { ok: true, tools: [] };\n }\n\n if (Array.isArray(rawTools)) {\n return { ok: true, tools: rawTools };\n }\n\n if (typeof rawTools === 'string') {\n const trimmed = rawTools.trim();\n if (!trimmed) {\n return { ok: true, tools: [] };\n }\n\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n return { ok: true, tools: parsed };\n }\n\n if (isRecord(parsed)) {\n return { ok: true, tools: [parsed] };\n }\n\n return {\n ok: false,\n message: '\"tools\" must be an array/object or a JSON-encoded array/object.'\n };\n } catch {\n return {\n ok: false,\n message: '\"tools\" string is not valid JSON. Provide tools as array/object instead.'\n };\n }\n }\n\n if (isRecord(rawTools)) {\n const looksLikeSingleTool = typeof rawTools.name === 'string'\n || isRecord(rawTools.function)\n || rawTools.type === 'function';\n\n if (looksLikeSingleTool) {\n return { ok: true, tools: [rawTools] };\n }\n\n const entries = Object.values(rawTools);\n if (entries.every((entry) => isRecord(entry) || typeof entry === 'string')) {\n return { ok: true, tools: entries };\n }\n }\n\n return {\n ok: false,\n message: '\"tools\" must be an array/object or a JSON-encoded array/object.'\n };\n }\n\n private normalizeSingleTool(rawTool: unknown, index: number): NormalizedToolResult {\n let candidate: unknown = rawTool;\n if (typeof candidate === 'string') {\n const trimmed = candidate.trim();\n if (!trimmed) {\n return {\n ok: false,\n message: `tools[${index}] is empty. Expected a tool object.`\n };\n }\n\n try {\n candidate = JSON.parse(trimmed);\n } catch {\n return {\n ok: false,\n message: `tools[${index}] is not a valid JSON object.`\n };\n }\n }\n\n if (!isRecord(candidate)) {\n return {\n ok: false,\n message: `tools[${index}] must be an object.`\n };\n }\n\n const rawType = typeof candidate.type === 'string' ? candidate.type.trim().toLowerCase() : '';\n\n if (rawType && rawType !== 'function') {\n return {\n ok: false,\n message: `tools[${index}].type=\"${rawType}\" is not supported by chat completions. Use \"function\".`\n };\n }\n\n if (isRecord(candidate.function)) {\n const functionName = typeof candidate.function.name === 'string'\n ? candidate.function.name.trim()\n : '';\n if (!functionName) {\n return {\n ok: false,\n message: `tools[${index}].function.name must be a non-empty string.`\n };\n }\n\n const functionDescription = typeof candidate.function.description === 'string'\n ? candidate.function.description\n : typeof candidate.description === 'string'\n ? candidate.description\n : '';\n const rawParameters = candidate.function.parameters\n ?? candidate.function.input_schema\n ?? candidate.parameters\n ?? candidate.input_schema;\n\n return {\n ok: true,\n tool: {\n type: 'function',\n function: {\n name: functionName,\n description: functionDescription,\n parameters: normalizeToolParametersSchema(rawParameters)\n }\n }\n };\n }\n\n const name = typeof candidate.name === 'string' ? candidate.name.trim() : '';\n if (!name) {\n return {\n ok: false,\n message: `tools[${index}] must include either function.name or name.`\n };\n }\n\n const description = typeof candidate.description === 'string' ? candidate.description : '';\n const parameters = normalizeToolParametersSchema(candidate.input_schema ?? candidate.parameters);\n\n return {\n ok: true,\n tool: {\n type: 'function',\n function: {\n name,\n description,\n parameters\n }\n }\n };\n }\n\n private normalizeTools(rawTools: unknown): NormalizedToolsResult {\n const parsed = this.parseToolsInput(rawTools);\n if (!parsed.ok) {\n if (this.strictValidation) {\n return parsed;\n }\n\n return { ok: true, tools: undefined };\n }\n\n if (parsed.tools.length === 0) {\n return { ok: true, tools: undefined };\n }\n\n const normalizedTools: OpenAIMessagesCompatibilityJsonObject[] = [];\n for (let i = 0; i < parsed.tools.length; i += 1) {\n const normalizedTool = this.normalizeSingleTool(parsed.tools[i], i);\n if (!normalizedTool.ok) {\n if (this.strictValidation) {\n return normalizedTool;\n }\n\n continue;\n }\n\n normalizedTools.push(normalizedTool.tool);\n }\n\n if (normalizedTools.length === 0) {\n return { ok: true, tools: undefined };\n }\n\n return { ok: true, tools: normalizedTools };\n }\n\n private normalizeToolChoice(rawToolChoice: unknown): NormalizedToolChoiceResult {\n if (rawToolChoice === undefined || rawToolChoice === null) {\n return { ok: true, toolChoice: undefined };\n }\n\n if (typeof rawToolChoice === 'string') {\n const normalized = rawToolChoice.trim().toLowerCase();\n if (!normalized) {\n return { ok: true, toolChoice: undefined };\n }\n\n if (normalized === 'auto' || normalized === 'none' || normalized === 'required') {\n return { ok: true, toolChoice: normalized };\n }\n\n if (normalized === 'any') {\n return { ok: true, toolChoice: 'required' };\n }\n\n return {\n ok: false,\n message: `tool_choice=\"${normalized}\" is not supported.`\n };\n }\n\n if (!isRecord(rawToolChoice)) {\n return {\n ok: false,\n message: '\"tool_choice\" must be a string or object.'\n };\n }\n\n const typeValue = typeof rawToolChoice.type === 'string' ? rawToolChoice.type.trim().toLowerCase() : '';\n if (!typeValue) {\n return {\n ok: false,\n message: '\"tool_choice.type\" is required when tool_choice is an object.'\n };\n }\n\n if (typeValue === 'auto' || typeValue === 'none') {\n return { ok: true, toolChoice: typeValue };\n }\n\n if (typeValue === 'any' || typeValue === 'required') {\n return { ok: true, toolChoice: 'required' };\n }\n\n if (typeValue === 'tool') {\n const toolName = typeof rawToolChoice.name === 'string' ? rawToolChoice.name.trim() : '';\n if (!toolName) {\n return {\n ok: false,\n message: 'tool_choice with type \"tool\" requires a non-empty name.'\n };\n }\n\n return {\n ok: true,\n toolChoice: {\n type: 'function',\n function: {\n name: toolName\n }\n }\n };\n }\n\n if (typeValue === 'function') {\n const functionSpec = rawToolChoice.function;\n if (!isRecord(functionSpec)) {\n return {\n ok: false,\n message: 'tool_choice.type=\"function\" requires a function object.'\n };\n }\n\n const functionName = typeof functionSpec.name === 'string' ? functionSpec.name.trim() : '';\n if (!functionName) {\n return {\n ok: false,\n message: 'tool_choice.function.name must be a non-empty string.'\n };\n }\n\n return {\n ok: true,\n toolChoice: {\n type: 'function',\n function: {\n name: functionName\n }\n }\n };\n }\n\n return {\n ok: false,\n message: `tool_choice.type=\"${typeValue}\" is not supported.`\n };\n }\n\n private ensureAssistantToolCallReasoningContent(message: OpenAIMessagesCompatibilityJsonObject): void {\n if (message.role !== 'assistant') {\n return;\n }\n\n if (!Array.isArray(message.tool_calls) || message.tool_calls.length === 0) {\n return;\n }\n\n if (typeof message.reasoning_content === 'string') {\n message.reasoning_content = message.reasoning_content.trim().length > 0\n ? message.reasoning_content\n : '';\n return;\n }\n\n message.reasoning_content = '';\n }\n\n private normalizeMessage(rawMessage: unknown, messageIndex: number): NormalizedMessageResult {\n if (!isRecord(rawMessage)) {\n return {\n ok: false,\n message: `messages[${messageIndex}] must be an object.`\n };\n }\n\n const role = rawMessage.role;\n if (typeof role !== 'string' || !SUPPORTED_ROLES.has(role)) {\n return {\n ok: false,\n message: `messages[${messageIndex}].role must be one of: system, developer, user, assistant, tool.`\n };\n }\n\n if (role === 'tool') {\n const toolCallId = rawMessage.tool_call_id;\n if (typeof toolCallId !== 'string' || toolCallId.trim().length === 0) {\n return {\n ok: false,\n message: `messages[${messageIndex}] with role \"tool\" requires non-empty \"tool_call_id\".`\n };\n }\n }\n\n const normalizedMessage: OpenAIMessagesCompatibilityJsonObject = { ...rawMessage, role };\n const content = rawMessage.content;\n\n if (content === null) {\n if (role !== 'assistant') {\n return {\n ok: false,\n message: `messages[${messageIndex}].content can only be null when role is \"assistant\".`\n };\n }\n\n normalizedMessage.content = null;\n this.ensureAssistantToolCallReasoningContent(normalizedMessage);\n return {\n ok: true,\n messages: [normalizedMessage]\n };\n }\n\n if (typeof content === 'string') {\n normalizedMessage.content = content;\n this.ensureAssistantToolCallReasoningContent(normalizedMessage);\n return {\n ok: true,\n messages: [normalizedMessage]\n };\n }\n\n if (Array.isArray(content)) {\n if (role === 'user') {\n return this.normalizeUserMessageWithToolResults(rawMessage, messageIndex, content);\n }\n\n if (role === 'assistant') {\n return this.normalizeAssistantMessageWithToolUse(rawMessage, messageIndex, content);\n }\n\n const normalizedParts: unknown[] = [];\n\n for (let i = 0; i < content.length; i += 1) {\n const normalizedPart = this.normalizeContentPart(content[i], messageIndex, i + 1);\n if (!normalizedPart.ok) {\n if (this.strictValidation) {\n return {\n ok: false,\n message: normalizedPart.message\n };\n }\n\n normalizedParts.push(content[i]);\n continue;\n }\n\n normalizedParts.push(normalizedPart.part);\n }\n\n normalizedMessage.content = normalizedParts;\n this.ensureAssistantToolCallReasoningContent(normalizedMessage);\n return {\n ok: true,\n messages: [normalizedMessage]\n };\n }\n\n if (content === undefined) {\n const hasToolCalls = Array.isArray(rawMessage.tool_calls) && rawMessage.tool_calls.length > 0;\n if (role === 'assistant' && hasToolCalls) {\n this.ensureAssistantToolCallReasoningContent(normalizedMessage);\n return {\n ok: true,\n messages: [normalizedMessage]\n };\n }\n\n if (this.strictValidation) {\n return {\n ok: false,\n message: `messages[${messageIndex}].content is required unless assistant tool_calls are present.`\n };\n }\n }\n\n this.ensureAssistantToolCallReasoningContent(normalizedMessage);\n\n return {\n ok: true,\n messages: [normalizedMessage]\n };\n }\n\n private normalizeToolCallId(rawId: unknown, name: string, index: number): string {\n if (typeof rawId === 'string' && rawId.trim().length > 0) {\n return rawId.trim();\n }\n\n return `call_${name}_${index}`;\n }\n\n private normalizeToolResultContent(content: unknown): string {\n if (content === undefined || content === null) {\n return '';\n }\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n const normalizedBlocks = content\n .map((part) => {\n if (typeof part === 'string') {\n return { type: 'text', text: part };\n }\n\n if (!isRecord(part)) {\n return null;\n }\n\n if (part.type === 'text' && typeof part.text === 'string') {\n return { type: 'text', text: part.text };\n }\n\n if (part.type === 'image' && isRecord(part.source)) {\n if (part.source.type === 'url' && typeof part.source.url === 'string') {\n return {\n type: 'image_url',\n image_url: {\n url: part.source.url\n }\n };\n }\n\n if (\n part.source.type === 'base64'\n && typeof part.source.media_type === 'string'\n && typeof part.source.data === 'string'\n ) {\n return {\n type: 'image_url',\n image_url: {\n url: `data:${part.source.media_type};base64,${part.source.data}`\n }\n };\n }\n }\n\n return {\n type: 'text',\n text: JSON.stringify(part)\n };\n })\n .filter((part) => part !== null);\n\n if (normalizedBlocks.length === 0) {\n return '';\n }\n\n const first = normalizedBlocks[0];\n if (\n normalizedBlocks.length === 1\n && isRecord(first)\n && first.type === 'text'\n && typeof first.text === 'string'\n ) {\n return first.text;\n }\n\n return JSON.stringify(normalizedBlocks);\n }\n\n if (isRecord(content)) {\n if (hasOwn(content, 'content')) {\n return this.normalizeToolResultContent(content.content);\n }\n\n return JSON.stringify(content);\n }\n\n return String(content);\n }\n\n private extractThinkingText(part: unknown): string | undefined {\n if (!isRecord(part)) {\n return undefined;\n }\n\n if (part.type === 'thinking') {\n if (typeof part.thinking === 'string' && part.thinking.trim().length > 0) {\n return part.thinking;\n }\n\n if (typeof part.text === 'string' && part.text.trim().length > 0) {\n return part.text;\n }\n }\n\n if (part.type === 'reasoning') {\n if (typeof part.reasoning === 'string' && part.reasoning.trim().length > 0) {\n return part.reasoning;\n }\n\n if (typeof part.text === 'string' && part.text.trim().length > 0) {\n return part.text;\n }\n }\n\n if (part.type === 'reasoning_content' && typeof part.text === 'string' && part.text.trim().length > 0) {\n return part.text;\n }\n\n return undefined;\n }\n\n private normalizeUserMessageWithToolResults(\n rawMessage: OpenAIMessagesCompatibilityJsonObject,\n messageIndex: number,\n content: unknown[]\n ): NormalizedMessageResult {\n const toolMessages: OpenAIMessagesCompatibilityJsonObject[] = [];\n const userParts: unknown[] = [];\n\n for (let i = 0; i < content.length; i += 1) {\n const rawPart = content[i];\n if (isRecord(rawPart) && rawPart.type === 'tool_result') {\n const toolUseId = typeof rawPart.tool_use_id === 'string' ? rawPart.tool_use_id.trim() : '';\n if (!toolUseId) {\n if (this.strictValidation) {\n return {\n ok: false,\n message: `messages[${messageIndex}].content[${i + 1}] with type tool_result requires non-empty tool_use_id.`\n };\n }\n\n continue;\n }\n\n toolMessages.push({\n role: 'tool',\n tool_call_id: toolUseId,\n content: this.normalizeToolResultContent(rawPart.content)\n });\n continue;\n }\n\n const normalizedPart = this.normalizeContentPart(rawPart, messageIndex, i + 1);\n if (!normalizedPart.ok) {\n if (this.strictValidation) {\n return {\n ok: false,\n message: normalizedPart.message\n };\n }\n\n userParts.push(rawPart);\n continue;\n }\n\n userParts.push(normalizedPart.part);\n }\n\n const outputMessages: OpenAIMessagesCompatibilityJsonObject[] = [...toolMessages];\n if (userParts.length > 0 || toolMessages.length === 0) {\n outputMessages.push({\n ...rawMessage,\n role: 'user',\n content: userParts\n });\n }\n\n return {\n ok: true,\n messages: outputMessages\n };\n }\n\n private normalizeAssistantMessageWithToolUse(\n rawMessage: OpenAIMessagesCompatibilityJsonObject,\n messageIndex: number,\n content: unknown[]\n ): NormalizedMessageResult {\n const toolCalls: OpenAIMessagesCompatibilityJsonObject[] = [];\n const normalizedParts: unknown[] = [];\n const thinkingSegments: string[] = [];\n\n for (let i = 0; i < content.length; i += 1) {\n const rawPart = content[i];\n\n const thinkingText = this.extractThinkingText(rawPart);\n if (typeof thinkingText === 'string') {\n thinkingSegments.push(thinkingText);\n continue;\n }\n\n if (isRecord(rawPart) && rawPart.type === 'tool_use') {\n const functionName = typeof rawPart.name === 'string' ? rawPart.name.trim() : '';\n if (!functionName) {\n if (this.strictValidation) {\n return {\n ok: false,\n message: `messages[${messageIndex}].content[${i + 1}] with type tool_use requires non-empty name.`\n };\n }\n\n continue;\n }\n\n const argumentsValue = isRecord(rawPart.input) || Array.isArray(rawPart.input)\n ? rawPart.input\n : rawPart.input ?? {};\n\n toolCalls.push({\n id: this.normalizeToolCallId(rawPart.id, functionName, i),\n type: 'function',\n function: {\n name: functionName,\n arguments: JSON.stringify(argumentsValue)\n }\n });\n continue;\n }\n\n const normalizedPart = this.normalizeContentPart(rawPart, messageIndex, i + 1);\n if (!normalizedPart.ok) {\n if (this.strictValidation) {\n return {\n ok: false,\n message: normalizedPart.message\n };\n }\n\n normalizedParts.push(rawPart);\n continue;\n }\n\n normalizedParts.push(normalizedPart.part);\n }\n\n const normalizedMessage: OpenAIMessagesCompatibilityJsonObject = {\n ...rawMessage,\n role: 'assistant'\n };\n\n const reasoningFromMessage = typeof rawMessage.reasoning_content === 'string'\n ? rawMessage.reasoning_content.trim()\n : '';\n if (thinkingSegments.length > 0) {\n normalizedMessage.reasoning_content = thinkingSegments.join('\\n\\n');\n } else if (reasoningFromMessage.length > 0) {\n normalizedMessage.reasoning_content = reasoningFromMessage;\n }\n\n if (toolCalls.length > 0) {\n normalizedMessage.tool_calls = toolCalls;\n this.ensureAssistantToolCallReasoningContent(normalizedMessage);\n\n const textSegments: string[] = [];\n for (let i = 0; i < normalizedParts.length; i += 1) {\n const part = normalizedParts[i];\n if (isRecord(part) && part.type === 'text' && typeof part.text === 'string') {\n textSegments.push(part.text);\n continue;\n }\n\n if (this.strictValidation) {\n return {\n ok: false,\n message: `messages[${messageIndex}].content contains non-text blocks alongside tool_use, which is not supported.`\n };\n }\n\n textSegments.push(JSON.stringify(part));\n }\n\n const mergedText = textSegments.join('').trim();\n normalizedMessage.content = mergedText.length > 0 ? mergedText : null;\n\n return {\n ok: true,\n messages: [normalizedMessage]\n };\n }\n\n normalizedMessage.content = normalizedParts.length > 0 ? normalizedParts : '';\n this.ensureAssistantToolCallReasoningContent(normalizedMessage);\n return {\n ok: true,\n messages: [normalizedMessage]\n };\n }\n\n private normalizeContentPart(rawPart: unknown, messageIndex: number, partIndex: number): NormalizedPartResult {\n if (typeof rawPart === 'string') {\n return {\n ok: true,\n part: {\n type: 'text',\n text: rawPart\n }\n };\n }\n\n if (!isRecord(rawPart)) {\n return {\n ok: false,\n message: `messages[${messageIndex}].content[${partIndex}] must be a string or object part.`\n };\n }\n\n const partType = rawPart.type;\n\n if (partType === 'input_text' || partType === 'output_text') {\n if (typeof rawPart.text !== 'string') {\n return {\n ok: false,\n message: `messages[${messageIndex}].content[${partIndex}] with type ${String(partType)} requires string \"text\".`\n };\n }\n\n return {\n ok: true,\n part: {\n type: 'text',\n text: rawPart.text\n }\n };\n }\n\n if (partType === 'thinking' || partType === 'reasoning' || partType === 'reasoning_content') {\n const thinkingText = this.extractThinkingText(rawPart);\n if (typeof thinkingText !== 'string') {\n return {\n ok: false,\n message: `messages[${messageIndex}].content[${partIndex}] with type ${String(partType)} requires textual thinking content.`\n };\n }\n\n return {\n ok: true,\n part: {\n type: 'text',\n text: thinkingText\n }\n };\n }\n\n if (partType === 'input_image') {\n const imageUrl = extractImageUrl(rawPart);\n if (!imageUrl) {\n return {\n ok: false,\n message: `messages[${messageIndex}].content[${partIndex}] with type input_image requires image_url.`\n };\n }\n\n return {\n ok: true,\n part: {\n type: 'image_url',\n image_url: {\n url: imageUrl\n }\n }\n };\n }\n\n if (partType === 'image' && isRecord(rawPart.source)) {\n if (rawPart.source.type === 'url' && typeof rawPart.source.url === 'string') {\n return {\n ok: true,\n part: {\n type: 'image_url',\n image_url: {\n url: rawPart.source.url\n }\n }\n };\n }\n\n if (\n rawPart.source.type === 'base64'\n && typeof rawPart.source.media_type === 'string'\n && typeof rawPart.source.data === 'string'\n ) {\n return {\n ok: true,\n part: {\n type: 'image_url',\n image_url: {\n url: `data:${rawPart.source.media_type};base64,${rawPart.source.data}`\n }\n }\n };\n }\n }\n\n if (partType === 'tool_result') {\n return {\n ok: false,\n message: `messages[${messageIndex}].content[${partIndex}] with type tool_result must be represented as role=tool with tool_call_id.`\n };\n }\n\n if (partType === 'tool_use') {\n return {\n ok: false,\n message: `messages[${messageIndex}].content[${partIndex}] with type tool_use must be represented as assistant.tool_calls.`\n };\n }\n\n return {\n ok: true,\n part: rawPart\n };\n }\n}\n",
@@ -12,16 +12,18 @@
12
12
  "import type {\n CanonicalTokenAccountingEventV2,\n TokenAccountingAuthority,\n TokenAccountingOutcome,\n TokenAccountingSessionState\n} from './types';\nimport { TOKEN_ACCOUNTING_AUTHORITIES } from './types';\nimport { getEncoding, type Tiktoken } from 'js-tiktoken';\n\ntype JsonRecord = Record<string, unknown>;\n\ntype EncodingType = 'cl100k_base' | 'o200k_base';\n\nconst MODEL_ENCODING_MAP: Record<string, EncodingType> = {\n 'gpt-4o': 'o200k_base',\n 'gpt-4o-mini': 'o200k_base',\n 'gpt-4.1': 'o200k_base',\n 'gpt-4.1-mini': 'o200k_base',\n 'gpt-4.1-nano': 'o200k_base',\n 'o1': 'o200k_base',\n 'o1-mini': 'o200k_base',\n 'o1-preview': 'o200k_base',\n 'o3': 'o200k_base',\n 'o3-mini': 'o200k_base',\n 'gpt-4': 'cl100k_base',\n 'gpt-4-turbo': 'cl100k_base',\n 'gpt-4-32k': 'cl100k_base',\n 'gpt-3.5-turbo': 'cl100k_base',\n 'gpt-3.5': 'cl100k_base',\n claude: 'cl100k_base',\n 'claude-3': 'cl100k_base',\n 'claude-3.5': 'cl100k_base',\n gemini: 'cl100k_base',\n 'gemini-1.5': 'cl100k_base',\n 'gemini-2.0': 'cl100k_base',\n 'gemini-2.5': 'cl100k_base'\n};\n\nconst encodingCache = new Map<EncodingType, Tiktoken>();\n\nconst CANONICAL_EVENT_KEYS = new Set([\n 'requestId',\n 'attemptId',\n 'routeId',\n 'upstreamId',\n 'provider',\n 'model',\n 'streaming',\n 'inputTokens',\n 'outputTokens',\n 'cacheReadTokens',\n 'cacheWriteTokens',\n 'inputAuthority',\n 'outputAuthority',\n 'final',\n 'outcome',\n 'countedAt'\n]);\n\nexport function isRecord(value: unknown): value is JsonRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function asString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nexport function asFiniteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nexport function readNumber(record: JsonRecord | undefined, key: string): number | undefined {\n if (!record) {\n return undefined;\n }\n\n const value = record[key];\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : undefined;\n}\n\nexport function readRecord(record: JsonRecord | undefined, key: string): JsonRecord | undefined {\n if (!record) {\n return undefined;\n }\n\n const value = record[key];\n return isRecord(value) ? value : undefined;\n}\n\nexport function countTextTokens(text: string): number {\n if (!text) {\n return 0;\n }\n\n return Math.max(1, Math.ceil(text.length / 4));\n}\n\nfunction getEncodingForModel(model: string): EncodingType {\n const normalizedModel = model.trim().toLowerCase();\n if (MODEL_ENCODING_MAP[normalizedModel]) {\n return MODEL_ENCODING_MAP[normalizedModel];\n }\n\n for (const [prefix, encoding] of Object.entries(MODEL_ENCODING_MAP)) {\n if (normalizedModel.startsWith(prefix)) {\n return encoding;\n }\n }\n\n return 'cl100k_base';\n}\n\nfunction getEncodingCached(type: EncodingType): Tiktoken {\n let encoding = encodingCache.get(type);\n if (!encoding) {\n encoding = getEncoding(type);\n encodingCache.set(type, encoding);\n }\n\n return encoding;\n}\n\nexport function countModelTextTokens(text: string, model?: string): number {\n if (!text) {\n return 0;\n }\n\n if (!model) {\n return countTextTokens(text);\n }\n\n try {\n const encoding = getEncodingCached(getEncodingForModel(model));\n return encoding.encode(text).length;\n } catch {\n return countTextTokens(text);\n }\n}\n\nexport function countJsonLikeTokens(value: unknown): number {\n if (typeof value === 'string') {\n return countTextTokens(value);\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return 1;\n }\n\n if (value === null || value === undefined) {\n return 0;\n }\n\n if (Array.isArray(value)) {\n return value.reduce((sum, entry) => sum + countJsonLikeTokens(entry), 0);\n }\n\n if (isRecord(value)) {\n return Object.entries(value).reduce((sum, [key, entry]) => {\n return sum + countTextTokens(key) + countJsonLikeTokens(entry);\n }, 0);\n }\n\n return countTextTokens(String(value));\n}\n\nexport function clampTokens(value: number | undefined): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n return Number.isFinite(value) ? Math.min(Number.MAX_SAFE_INTEGER, Math.max(0, Math.floor(value))) : undefined;\n}\n\nexport function buildBaseEvent(\n state: TokenAccountingSessionState,\n overrides: Partial<CanonicalTokenAccountingEventV2>\n): CanonicalTokenAccountingEventV2 {\n return {\n requestId: state.requestId,\n attemptId: state.attemptId,\n routeId: state.routeId,\n upstreamId: state.upstreamId,\n provider: state.provider,\n model: state.model ?? 'unknown',\n streaming: state.streaming,\n inputAuthority: 'none',\n outputAuthority: 'none',\n final: false,\n outcome: 'completed',\n countedAt: new Date().toISOString(),\n ...overrides\n };\n}\n\nexport function createPartialTokenAccountingEvent(\n state: TokenAccountingSessionState,\n overrides: Partial<CanonicalTokenAccountingEventV2> = {}\n): CanonicalTokenAccountingEventV2 {\n return buildBaseEvent(state, {\n final: false,\n outcome: 'completed',\n ...overrides\n });\n}\n\nexport function finalizeTokenAccountingEvent(\n state: TokenAccountingSessionState,\n overrides: Partial<CanonicalTokenAccountingEventV2> = {},\n outcome: TokenAccountingOutcome = 'completed'\n): CanonicalTokenAccountingEventV2 {\n const isCompleted = outcome === 'completed';\n return buildBaseEvent(state, {\n final: isCompleted,\n outcome,\n ...overrides\n });\n}\n\nexport function assertCanonicalTokenAccountingEventV2(\n event: unknown\n): asserts event is CanonicalTokenAccountingEventV2 {\n if (!isRecord(event)) {\n throw new Error('Canonical token accounting event must be an object.');\n }\n\n for (const key of Object.keys(event)) {\n if (!CANONICAL_EVENT_KEYS.has(key)) {\n throw new Error(`Unexpected aggregate or legacy token accounting field: ${key}`);\n }\n }\n\n for (const key of ['requestId', 'attemptId', 'routeId', 'upstreamId', 'provider', 'model', 'countedAt']) {\n if (typeof event[key] !== 'string' || event[key].length === 0) {\n throw new Error(`Canonical token accounting event requires non-empty string field: ${key}`);\n }\n }\n\n if (typeof event.streaming !== 'boolean') {\n throw new Error('Canonical token accounting event requires boolean field: streaming');\n }\n\n if (typeof event.final !== 'boolean') {\n throw new Error('Canonical token accounting event requires boolean field: final');\n }\n\n if (event.outcome !== 'completed' && event.outcome !== 'aborted' && event.outcome !== 'failed') {\n throw new Error('Canonical token accounting event requires outcome completed|aborted|failed.');\n }\n\n if (event.final && event.outcome === 'aborted') {\n throw new Error('Aborted token accounting events must not be final.');\n }\n\n if (!TOKEN_ACCOUNTING_AUTHORITIES.includes(event.inputAuthority as TokenAccountingAuthority)) {\n throw new Error('Canonical token accounting event has invalid inputAuthority.');\n }\n\n if (!TOKEN_ACCOUNTING_AUTHORITIES.includes(event.outputAuthority as TokenAccountingAuthority)) {\n throw new Error('Canonical token accounting event has invalid outputAuthority.');\n }\n\n for (const key of ['inputTokens', 'outputTokens', 'cacheReadTokens', 'cacheWriteTokens'] as const) {\n if (event[key] !== undefined && !(typeof event[key] === 'number' && Number.isSafeInteger(event[key]) && event[key] >= 0)) {\n throw new Error(`Canonical token accounting event has invalid numeric field: ${key}`);\n }\n }\n\n if (Object.prototype.hasOwnProperty.call(event, 'source')) {\n throw new Error('Legacy source/hybrid semantics are not allowed in canonical token accounting events.');\n }\n\n if (Object.prototype.hasOwnProperty.call(event, 'logicalRequests') || Object.prototype.hasOwnProperty.call(event, 'upstreamAttempts')) {\n throw new Error('Plugin aggregate fields logicalRequests/upstreamAttempts must not appear on single llms events.');\n }\n\n if (event.inputAuthority === 'official') {\n if (!(typeof event.inputTokens === 'number' && Number.isSafeInteger(event.inputTokens) && event.inputTokens >= 0)) {\n throw new Error('Official inputAuthority requires inputTokens.');\n }\n\n }\n\n if (event.outputAuthority === 'official' && !(typeof event.outputTokens === 'number' && Number.isSafeInteger(event.outputTokens) && event.outputTokens >= 0)) {\n throw new Error('Official outputAuthority requires outputTokens.');\n }\n}\n",
13
13
  "import type { LLMProvider } from '../core/types';\nimport type {\n ProviderTokenAccountingCapabilities,\n ProviderTokenAccountingCapabilityMatrix,\n SupportedTokenAccountingProvider\n} from './types';\n\nexport const PROVIDER_TOKEN_ACCOUNTING_CAPABILITY_MATRIX = {\n openai: {\n provider: 'openai',\n supportsOfficialResponseUsage: true,\n supportsStreamingResponseUsage: true,\n supportsDedicatedCountEndpoint: true,\n supportsLocalTokenizer: true,\n supportsHeuristicFallback: true,\n dedicatedCountEndpoint: {\n supported: true,\n mode: 'input_estimate_only',\n defaultEnabled: false,\n endpoint: '/responses/input_tokens',\n livePathAuthority: false\n }\n },\n anthropic: {\n provider: 'anthropic',\n supportsOfficialResponseUsage: true,\n supportsStreamingResponseUsage: true,\n supportsDedicatedCountEndpoint: true,\n supportsLocalTokenizer: true,\n supportsHeuristicFallback: true,\n dedicatedCountEndpoint: {\n supported: true,\n mode: 'input_estimate_only',\n livePathAuthority: false,\n endpoint: '/v1/messages/count_tokens'\n }\n },\n gemini: {\n provider: 'gemini',\n supportsOfficialResponseUsage: true,\n supportsStreamingResponseUsage: true,\n supportsDedicatedCountEndpoint: true,\n supportsLocalTokenizer: true,\n supportsHeuristicFallback: true,\n countTokens: {\n supported: true,\n mode: 'input_estimate_only',\n livePathAuthority: false\n }\n }\n} as const satisfies ProviderTokenAccountingCapabilityMatrix;\n\nfunction normalizeProvider(provider: LLMProvider): SupportedTokenAccountingProvider {\n return String(provider).trim().toLowerCase() as SupportedTokenAccountingProvider;\n}\n\nexport function getProviderTokenAccountingCapabilities(provider: LLMProvider): ProviderTokenAccountingCapabilities {\n const capabilities = PROVIDER_TOKEN_ACCOUNTING_CAPABILITY_MATRIX[normalizeProvider(provider)];\n if (!capabilities) {\n throw new Error(`Unsupported token accounting provider: ${provider}`);\n }\n\n return capabilities;\n}\n",
14
14
  "import type { LLMProvider } from '../core/types';\nimport { getProviderTokenAccountingCapabilities } from './capabilities';\nimport {\n asString,\n clampTokens,\n countModelTextTokens,\n countJsonLikeTokens,\n countTextTokens,\n createPartialTokenAccountingEvent,\n finalizeTokenAccountingEvent,\n isRecord,\n readNumber,\n readRecord\n} from './helpers';\nimport type {\n CanonicalTokenAccountingEventV2,\n ProviderTokenAccountingAdapter,\n TokenAccountingSession,\n TokenAccountingSessionInput,\n TokenAccountingSessionState\n} from './types';\n\ntype JsonRecord = Record<string, unknown>;\n\nconst DEFERRED_MEDIA_KEYS = new Set([\n 'image_url', 'imageUrl', 'inline_data', 'inlineData', 'file_data', 'fileData',\n 'file_uri', 'fileUri', 'file_url', 'fileUrl', 'file_id', 'fileId', 'input_audio', 'inputAudio', 'audio_url', 'audioUrl',\n 'input_video', 'inputVideo', 'video_url', 'videoUrl'\n]);\nconst DEFERRED_MEDIA_TYPES = new Set([\n 'image', 'input_image', 'image_url', 'input_audio', 'audio', 'input_video', 'video',\n 'input_file', 'file'\n]);\nconst DEFERRED_METADATA_KEYS = new Set([\n 'model', 'role', 'type', 'status', 'index', 'id', 'mime_type', 'mimeType', 'detail'\n]);\n\n// Keep only bounded output fragments while the proxy is forwarding the stream.\n// Tokenization is deliberately deferred until finalization (one encode per side).\nconst MAX_STREAM_ESTIMATE_CHARS = 64 * 1024;\nconst MAX_STREAM_ESTIMATE_FRAGMENTS = 4096;\nconst MAX_INPUT_ESTIMATE_NODES = 4096;\nconst MAX_DEFERRED_MODEL_CHARS = 256;\ntype StreamEstimateState = TokenAccountingSessionState & {\n estimateFragments?: string[];\n estimateChars?: number;\n estimateTruncated?: boolean;\n requestEstimateTruncated?: boolean;\n deferFinalization?: boolean;\n deferredOutcome?: 'completed' | 'failed';\n estimateMediaSeen?: boolean;\n estimateNodes?: number;\n};\n\nfunction isDeferred(state: TokenAccountingSessionState): boolean {\n return (state as StreamEstimateState).deferFinalization === true;\n}\n\nfunction setSessionModel(state: TokenAccountingSessionState, value: unknown): void {\n const model = asString(value) ?? state.model ?? 'unknown';\n if (isDeferred(state) && model.length > MAX_DEFERRED_MODEL_CHARS) {\n state.model = model.slice(0, MAX_DEFERRED_MODEL_CHARS);\n (state as StreamEstimateState).requestEstimateTruncated = true;\n return;\n }\n state.model = model;\n}\n\nfunction observeOutput(state: TokenAccountingSessionState, value: unknown): void {\n if (state.outputAuthority === 'official') return;\n if (isDeferred(state) && typeof value === 'string' && isMediaDataUri(value)) {\n (state as StreamEstimateState).estimateMediaSeen = true;\n return;\n }\n const text = typeof value === 'string' ? value : JSON.stringify(value);\n if (!text) return;\n const estimateState = state as StreamEstimateState;\n const remaining = MAX_STREAM_ESTIMATE_CHARS - (estimateState.estimateChars ?? 0);\n if (remaining <= 0) {\n estimateState.estimateTruncated = true;\n return;\n }\n if ((estimateState.estimateFragments?.length ?? 0) >= MAX_STREAM_ESTIMATE_FRAGMENTS) {\n estimateState.estimateTruncated = true;\n return;\n }\n const fragment = text.slice(0, remaining);\n (estimateState.estimateFragments ??= []).push(fragment);\n estimateState.estimateChars = (estimateState.estimateChars ?? 0) + fragment.length;\n if (fragment.length < text.length) estimateState.estimateTruncated = true;\n}\n\nfunction observeBoundedOutput(state: TokenAccountingSessionState, value: unknown): void {\n if (state.outputAuthority === 'official') return;\n if (!isDeferred(state)) {\n if (typeof value === 'string') {\n observeOutput(state, value);\n return;\n }\n const bounded = boundedRequestSnapshot({ value });\n if (bounded.truncated) (state as StreamEstimateState).estimateTruncated = true;\n observeOutput(state, bounded.value.value);\n return;\n }\n const estimateState = state as StreamEstimateState;\n const nodesLeft = MAX_INPUT_ESTIMATE_NODES - (estimateState.estimateNodes ?? 0);\n if (nodesLeft < 3) {\n estimateState.estimateTruncated = true;\n return;\n }\n const bounded = typeof value === 'string'\n ? { value: { value: value.slice(0, MAX_STREAM_ESTIMATE_CHARS) }, truncated: value.length > MAX_STREAM_ESTIMATE_CHARS, nodesCopied: 0 }\n : boundedRequestSnapshot({ value }, Math.max(1, Math.floor(nodesLeft / 3)));\n estimateState.estimateNodes = (estimateState.estimateNodes ?? 0) + bounded.nodesCopied * 3;\n const filtered = stripDeferredMedia(bounded.value.value);\n if (bounded.truncated) estimateState.estimateTruncated = true;\n if (filtered.sawMedia) estimateState.estimateMediaSeen = true;\n if (filtered.hasContent) observeOutput(state, filtered.value);\n}\n\nfunction isMediaDataUri(value: string): boolean {\n return /^data:(?:image|audio|video)\\//i.test(value);\n}\n\nfunction stripDeferredMedia(value: unknown, key = ''): { value: unknown; sawMedia: boolean; hasContent: boolean } {\n if (key === 'tools' || key === 'tool_calls' || key === 'tool_use' || key === 'functionCall'\n || key === 'function_call' || key === 'arguments' || key === 'args') {\n return { value, sawMedia: false, hasContent: Array.isArray(value) ? value.length > 0 : value !== null && value !== undefined };\n }\n if (DEFERRED_MEDIA_KEYS.has(key)) return { value: undefined, sawMedia: true, hasContent: false };\n if (typeof value === 'string') {\n const dataUriPattern = /data:(?:image|audio|video)\\/[^\\s\"'<>)}\\]]+/gi;\n const stripped = value.replace(dataUriPattern, '');\n const sawMedia = stripped.length !== value.length;\n return { value: stripped || undefined, sawMedia, hasContent: stripped.length > 0 && !DEFERRED_METADATA_KEYS.has(key) };\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return { value, sawMedia: false, hasContent: !DEFERRED_METADATA_KEYS.has(key) };\n }\n if (Array.isArray(value)) {\n let sawMedia = false;\n let hasContent = false;\n const result: unknown[] = [];\n for (const item of value) {\n const filtered = stripDeferredMedia(item);\n sawMedia ||= filtered.sawMedia;\n hasContent ||= filtered.hasContent;\n if (filtered.value !== undefined) result.push(filtered.value);\n }\n return { value: result, sawMedia, hasContent };\n }\n if (!isRecord(value)) return { value, sawMedia: false, hasContent: false };\n if (asString(value.type) === 'tool_use' || asString(value.type) === 'function_call') return { value, sawMedia: false, hasContent: true };\n if (DEFERRED_MEDIA_TYPES.has(asString(value.type) ?? '')) return { value: undefined, sawMedia: true, hasContent: false };\n const result: JsonRecord = {};\n let sawMedia = false;\n let hasContent = false;\n for (const [childKey, child] of Object.entries(value)) {\n const filtered = stripDeferredMedia(child, childKey);\n sawMedia ||= filtered.sawMedia;\n hasContent ||= filtered.hasContent;\n if (filtered.value !== undefined) result[childKey] = filtered.value;\n }\n return { value: result, sawMedia, hasContent };\n}\n\nfunction clearObservedOutput(state: TokenAccountingSessionState): void {\n const estimateState = state as StreamEstimateState;\n estimateState.estimateFragments = undefined;\n estimateState.estimateChars = undefined;\n estimateState.estimateTruncated = false;\n estimateState.estimateMediaSeen = false;\n estimateState.estimateNodes = 0;\n}\n\nfunction estimatedStreamOutput(state: TokenAccountingSessionState): { tokens?: number; authority: 'local' | 'heuristic' | 'partial' | 'none' } {\n const estimateState = state as StreamEstimateState;\n const estimateChars = estimateState.estimateChars ?? 0;\n if (estimateChars === 0) return { authority: 'none' };\n if (isDeferred(state)) {\n const tokens = clampTokens(countTextTokens('x'.repeat(estimateChars)));\n return tokens === undefined\n ? { authority: 'none' }\n : { tokens, authority: estimateState.estimateTruncated || estimateState.estimateMediaSeen ? 'partial' : 'heuristic' };\n }\n const tokens = clampTokens(countModelTextTokens(estimateState.estimateFragments!.join(''), state.model));\n return tokens === undefined\n ? { authority: 'none' }\n : { tokens, authority: estimateState.estimateTruncated ? 'partial' : 'local' };\n}\n\nfunction finalizeMissingStreamOutput(state: TokenAccountingSessionState, interrupted = false): void {\n if (state.outputAuthority === 'official') return;\n const estimate = estimatedStreamOutput(state);\n state.outputTokens = estimate.tokens;\n state.outputAuthority = interrupted && estimate.tokens !== undefined ? 'partial' : estimate.authority;\n}\n\ntype BoundedRequest = { value: JsonRecord; truncated: boolean; nodesCopied: number };\n\nfunction boundedRequestSnapshot(body: JsonRecord, maxNodes = MAX_INPUT_ESTIMATE_NODES): BoundedRequest {\n let remaining = MAX_STREAM_ESTIMATE_CHARS;\n let nodes = maxNodes;\n let truncated = false;\n const copy = (value: unknown): unknown => {\n if (nodes <= 0 || remaining <= 0) {\n truncated = true;\n return undefined;\n }\n nodes -= 1;\n if (typeof value === 'string') {\n if (value.length > remaining) {\n truncated = true;\n const clipped = value.slice(0, remaining);\n remaining = 0;\n return clipped;\n }\n remaining -= value.length;\n return value;\n }\n if (value === null || typeof value === 'number' || typeof value === 'boolean') return value;\n if (Array.isArray(value)) {\n const result: unknown[] = [];\n for (let index = 0; index < value.length; index += 1) {\n if (nodes <= 0 || remaining <= 0) {\n truncated = true;\n break;\n }\n result.push(copy(value[index]));\n }\n if (result.length < value.length) truncated = true;\n return result;\n }\n if (!isRecord(value)) return undefined;\n const result: JsonRecord = {};\n for (const key in value) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) continue;\n if (nodes <= 0 || remaining <= key.length) {\n truncated = true;\n break;\n }\n remaining -= key.length;\n result[key] = copy(value[key]);\n }\n return result;\n };\n return { value: copy(body) as JsonRecord, truncated, nodesCopied: maxNodes - nodes };\n}\n\nfunction storeRequestForEstimate(state: TokenAccountingSessionState, body: JsonRecord, fields: string[]): void {\n const relevant: JsonRecord = {};\n if (body.model !== undefined) relevant.model = isDeferred(state) && typeof body.model === 'string'\n ? body.model.slice(0, MAX_DEFERRED_MODEL_CHARS)\n : body.model;\n for (const field of fields) {\n if (Object.prototype.hasOwnProperty.call(body, field)) relevant[field] = body[field];\n }\n const bounded = boundedRequestSnapshot(relevant);\n state.requestBody = bounded.value;\n (state as StreamEstimateState).requestEstimateTruncated = bounded.truncated\n || (typeof body.model === 'string' && isDeferred(state) && body.model.length > MAX_DEFERRED_MODEL_CHARS);\n}\n\nfunction estimateMissingInput(state: TokenAccountingSessionState): void {\n if (state.estimatedInputAuthority === 'official') return;\n const requestBody = state.requestBody;\n if (!requestBody) {\n state.estimatedInputTokens = undefined;\n state.estimatedInputAuthority = 'none';\n return;\n }\n const hasInput = state.provider === 'openai'\n ? requestBody.input !== undefined || requestBody.messages !== undefined\n : state.provider === 'anthropic'\n ? requestBody.system !== undefined || requestBody.messages !== undefined\n : requestBody.contents !== undefined || requestBody.systemInstruction !== undefined;\n if (!hasInput) {\n state.estimatedInputTokens = undefined;\n state.estimatedInputAuthority = 'none';\n return;\n }\n const bounded = isDeferred(state)\n ? { value: requestBody, truncated: false }\n : boundedRequestSnapshot(requestBody);\n if (isDeferred(state)) {\n const filtered = stripDeferredMedia(bounded.value);\n const estimateBody = { ...filtered.value as JsonRecord };\n delete estimateBody.model;\n const hasToolSchema = Array.isArray(estimateBody.tools) && estimateBody.tools.length > 0;\n const hasContent = filtered.hasContent || hasToolSchema;\n if (!hasContent) {\n state.estimatedInputTokens = undefined;\n state.estimatedInputAuthority = 'none';\n return;\n }\n state.estimatedInputTokens = clampTokens(countJsonLikeTokens(estimateBody));\n state.estimatedInputAuthority = bounded.truncated\n || (state as StreamEstimateState).requestEstimateTruncated\n || filtered.sawMedia\n ? 'partial'\n : 'heuristic';\n return;\n }\n const estimate = state.provider === 'openai'\n ? estimateOpenAIInputTokens(bounded.value)\n : state.provider === 'anthropic'\n ? estimateAnthropicInputTokens(bounded.value)\n : estimateGeminiInputTokens(bounded.value);\n state.estimatedInputTokens = estimate;\n state.estimatedInputAuthority = bounded.truncated || (state as StreamEstimateState).requestEstimateTruncated ? 'partial' : 'local';\n}\nfunction hasOpenAIOutput(body: JsonRecord): boolean {\n if (Array.isArray(body.output) && body.output.length > 0) return true;\n return Array.isArray(body.choices) && body.choices.some((choice) => {\n if (!isRecord(choice)) return false;\n const message = readRecord(choice, 'message') ?? readRecord(choice, 'delta');\n return !!message && (message.content !== undefined && message.content !== null\n || Array.isArray(message.tool_calls) && message.tool_calls.length > 0);\n });\n}\n\nfunction hasAnthropicOutput(body: JsonRecord): boolean {\n return Array.isArray(body.content) && body.content.length > 0;\n}\n\nfunction observeAnthropicOutput(state: TokenAccountingSessionState, body: JsonRecord): void {\n const blocks = Array.isArray(body.content) ? body.content : [];\n for (let index = 0; index < blocks.length && index < MAX_INPUT_ESTIMATE_NODES; index += 1) {\n observeBoundedOutput(state, blocks[index]);\n }\n if (blocks.length > MAX_INPUT_ESTIMATE_NODES && isDeferred(state)) (state as StreamEstimateState).estimateTruncated = true;\n}\n\nfunction hasGeminiOutput(body: JsonRecord): boolean {\n return Array.isArray(body.candidates) && body.candidates.some((candidate) => {\n const parts = readRecord(candidate, 'content')?.parts;\n return Array.isArray(parts) && parts.length > 0;\n });\n}\n\nfunction isErrorResponse(body: JsonRecord): boolean {\n const status = asString(body.status)?.toLowerCase();\n const type = asString(body.type)?.toLowerCase();\n return body.error !== undefined || status === 'error' || status === 'failed'\n || type === 'error' || type?.endsWith('.error') === true || type?.endsWith('.failed') === true;\n}\n\nfunction isDeferredFailure(body: JsonRecord): boolean {\n const status = asString(body.status)?.toLowerCase();\n const type = asString(body.type)?.toLowerCase();\n return isErrorResponse(body) || status === 'incomplete' || type === 'incomplete' || type?.endsWith('.incomplete') === true;\n}\n\nfunction observeOpenAIOutput(\n state: TokenAccountingSessionState,\n chunk: JsonRecord,\n includeResponseSnapshot = true,\n event?: string\n): void {\n if (state.outputAuthority === 'official') return;\n let nodes = MAX_INPUT_ESTIMATE_NODES;\n const truncated = () => {\n if (isDeferred(state)) (state as StreamEstimateState).estimateTruncated = true;\n };\n const type = event ?? asString(chunk.type);\n if (type === 'response.output_text.delta') {\n if (isDeferred(state)) observeBoundedOutput(state, chunk.delta);\n else observeOutput(state, chunk.delta);\n }\n if (type === 'response.function_call_arguments.delta') {\n if (isDeferred(state)) observeBoundedOutput(state, chunk.delta);\n else observeOutput(state, chunk.delta);\n }\n if (includeResponseSnapshot) {\n const response = readRecord(chunk, 'response');\n const responseOutput = Array.isArray(response?.output) ? response.output : Array.isArray(chunk.output) ? chunk.output : undefined;\n if (responseOutput !== undefined) {\n if (isDeferred(state)) {\n const limit = Math.min(responseOutput.length, nodes);\n for (let index = 0; index < limit; index += 1, nodes -= 1) {\n observeBoundedOutput(state, responseOutput[index]);\n }\n if (responseOutput.length > limit) truncated();\n } else observeOutput(state, responseOutput);\n }\n }\n const choices = Array.isArray(chunk.choices) ? chunk.choices : [];\n const choiceLimit = Math.min(choices.length, nodes);\n for (let index = 0; index < choiceLimit; index += 1, nodes -= 1) {\n const choice = choices[index];\n if (!isRecord(choice)) continue;\n const delta = readRecord(choice, 'delta') ?? (isDeferred(state) ? readRecord(choice, 'message') : undefined);\n if (delta?.content !== undefined) {\n if (isDeferred(state)) observeBoundedOutput(state, delta.content);\n else observeOutput(state, delta.content);\n }\n const calls = Array.isArray(delta?.tool_calls) ? delta.tool_calls : [];\n const callLimit = Math.min(calls.length, nodes);\n for (let callIndex = 0; callIndex < callLimit; callIndex += 1, nodes -= 1) {\n const call = calls[callIndex];\n const fn = readRecord(call, 'function');\n if (fn?.arguments !== undefined) {\n if (isDeferred(state)) observeBoundedOutput(state, fn.arguments);\n else observeOutput(state, fn.arguments);\n }\n }\n if (calls.length > callLimit) truncated();\n }\n if (choices.length > choiceLimit) truncated();\n}\n\nfunction replaceObservedOutput(state: TokenAccountingSessionState): void {\n const estimateState = state as StreamEstimateState;\n estimateState.estimateFragments = [];\n estimateState.estimateChars = 0;\n estimateState.estimateTruncated = false;\n estimateState.estimateMediaSeen = false;\n estimateState.estimateNodes = 0;\n}\n\nfunction observeGeminiOutput(state: TokenAccountingSessionState, chunk: JsonRecord): void {\n let nodes = MAX_INPUT_ESTIMATE_NODES;\n const candidates = Array.isArray(chunk.candidates) ? chunk.candidates : [];\n const candidateLimit = Math.min(candidates.length, nodes);\n for (let candidateIndex = 0; candidateIndex < candidateLimit; candidateIndex += 1, nodes -= 1) {\n const candidate = candidates[candidateIndex];\n const content = readRecord(candidate, 'content');\n const parts = Array.isArray(content?.parts) ? content.parts : [];\n const partLimit = Math.min(parts.length, nodes);\n for (let partIndex = 0; partIndex < partLimit; partIndex += 1, nodes -= 1) {\n const part = parts[partIndex];\n if (!isRecord(part)) continue;\n if (isDeferred(state) && (part.inlineData !== undefined || part.inline_data !== undefined || part.fileData !== undefined || part.file_data !== undefined)) {\n (state as StreamEstimateState).estimateMediaSeen = true;\n }\n if (typeof part.text === 'string') {\n if (isDeferred(state)) observeBoundedOutput(state, part.text);\n else observeOutput(state, part.text);\n }\n if (part.functionCall !== undefined) {\n if (isDeferred(state)) observeBoundedOutput(state, part.functionCall);\n else observeOutput(state, part.functionCall);\n }\n }\n if (parts.length > partLimit && isDeferred(state)) (state as StreamEstimateState).estimateTruncated = true;\n }\n if (candidates.length > candidateLimit && isDeferred(state)) (state as StreamEstimateState).estimateTruncated = true;\n}\n\nfunction countOpenAIStringTokens(value: unknown, model: string | undefined): number {\n return countModelTextTokens(asString(value) ?? '', model);\n}\n\nfunction countOpenAIJsonLikeTokens(value: unknown, model: string | undefined): number {\n if (typeof value === 'string') {\n return countOpenAIStringTokens(value, model);\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return 1;\n }\n\n if (value === null || value === undefined) {\n return 0;\n }\n\n if (Array.isArray(value)) {\n return value.reduce((total, item) => total + countOpenAIJsonLikeTokens(item, model), 0);\n }\n\n if (isRecord(value)) {\n return Object.entries(value).reduce((total, [key, item]) => {\n return total + countOpenAIStringTokens(key, model) + countOpenAIJsonLikeTokens(item, model);\n }, 0);\n }\n\n return countOpenAIStringTokens(String(value), model);\n}\n\nfunction estimateOpenAIImageTokens(part: JsonRecord): number {\n const imageUrl = readRecord(part, 'image_url');\n const detail = asString(part.detail) ?? asString(imageUrl?.detail);\n if (detail === 'low') {\n return 85;\n }\n\n return 170;\n}\n\nfunction estimateOpenAIToolCallTokens(toolCall: unknown, model: string | undefined): number {\n if (!isRecord(toolCall)) {\n return countOpenAIJsonLikeTokens(toolCall, model);\n }\n\n const toolFunction = readRecord(toolCall, 'function');\n return 12\n + countOpenAIStringTokens(toolCall.id, model)\n + countOpenAIStringTokens(toolCall.type, model)\n + countOpenAIStringTokens(toolFunction?.name, model)\n + countOpenAIStringTokens(toolFunction?.arguments, model)\n + countOpenAIJsonLikeTokens(toolCall, model);\n}\n\nfunction estimateOpenAIMessageTokens(message: unknown, model: string | undefined): number {\n if (!isRecord(message)) {\n return countOpenAIJsonLikeTokens(message, model);\n }\n\n const content = message.content;\n const toolCalls = Array.isArray(message.tool_calls) ? message.tool_calls : [];\n return 4\n + countOpenAIStringTokens(message.role, model)\n + countOpenAIStringTokens(message.name, model)\n + countOpenAIStringTokens(message.tool_call_id, model)\n + estimateOpenAIMessageContent(content, model)\n + toolCalls.reduce((total, toolCall) => total + estimateOpenAIToolCallTokens(toolCall, model), 0);\n}\n\nfunction safeTokenSum(...values: number[]): number | undefined {\n const total = values.reduce((sum, value) => sum + value, 0);\n return Number.isSafeInteger(total) && total >= 0 ? total : undefined;\n}\n\nfunction estimateGeminiInlineDataTokens(inlineData: JsonRecord): number {\n const mimeType = asString(inlineData.mimeType)?.toLowerCase() ?? '';\n\n if (mimeType.startsWith('image/')) {\n return 224;\n }\n\n if (mimeType.startsWith('video/')) {\n return 384;\n }\n\n if (mimeType.startsWith('audio/')) {\n return 128;\n }\n\n return 96;\n}\n\nfunction estimateGeminiFunctionCallTokens(functionCall: JsonRecord): number {\n return 12\n + countTextTokens(asString(functionCall.name) ?? '')\n + countJsonLikeTokens(functionCall.args);\n}\n\nfunction estimateGeminiFunctionResponseTokens(functionResponse: JsonRecord): number {\n return 12\n + countTextTokens(asString(functionResponse.name) ?? '')\n + countJsonLikeTokens(functionResponse.response);\n}\n\nfunction buildAnthropicStreamingEvent(\n state: TokenAccountingSessionState,\n overrides: Partial<CanonicalTokenAccountingEventV2> = {}\n): CanonicalTokenAccountingEventV2 {\n return createPartialTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none',\n ...overrides\n });\n}\n\nfunction estimateOpenAIMessageContent(content: unknown, model: string | undefined): number {\n if (typeof content === 'string') {\n return countModelTextTokens(content, model);\n }\n\n if (!Array.isArray(content)) {\n return countOpenAIJsonLikeTokens(content, model);\n }\n\n return content.reduce((total, part) => {\n if (!isRecord(part)) {\n return total + countOpenAIJsonLikeTokens(part, model);\n }\n\n const type = asString(part.type);\n if (type === 'text') {\n return total + countOpenAIStringTokens(part.text, model);\n }\n\n if (type === 'image_url' || type === 'image') {\n return total + estimateOpenAIImageTokens(part);\n }\n\n return total + countOpenAIJsonLikeTokens(part, model);\n }, 0);\n}\n\nfunction estimateOpenAIInputTokens(body: JsonRecord): number {\n const model = asString(body.model);\n if (body.input !== undefined) {\n return clampTokens(countOpenAIJsonLikeTokens(body.input, model) + 8) ?? 0;\n }\n const messages = Array.isArray(body.messages) ? body.messages : [];\n const messageTokens = messages.reduce((total, message) => total + estimateOpenAIMessageTokens(message, model), 0);\n\n const tools = Array.isArray(body.tools) ? body.tools : [];\n const toolTokens = tools.reduce((total, tool) => total + 16 + countOpenAIJsonLikeTokens(tool, model), 0);\n return clampTokens(messageTokens + toolTokens + 8) ?? 0;\n}\n\nfunction estimateOpenAIResponseOutputTokens(body: JsonRecord, model?: string): number {\n const choices = Array.isArray(body.choices) ? body.choices : [];\n return clampTokens(choices.reduce((total, choice) => {\n if (!isRecord(choice)) {\n return total + countOpenAIJsonLikeTokens(choice, model);\n }\n\n const message = readRecord(choice, 'message');\n const delta = readRecord(choice, 'delta');\n const toolCalls = Array.isArray(message?.tool_calls)\n ? message.tool_calls\n : Array.isArray(delta?.tool_calls)\n ? delta.tool_calls\n : [];\n\n return total\n + countOpenAIStringTokens(message?.role ?? delta?.role, model)\n + countOpenAIStringTokens(message?.tool_call_id, model)\n + estimateOpenAIMessageContent(message?.content ?? delta?.content, model)\n + toolCalls.reduce((toolTotal, toolCall) => toolTotal + estimateOpenAIToolCallTokens(toolCall, model), 0)\n + (asString(choice.finish_reason) === 'tool_calls' ? 4 : 0);\n }, 0)) ?? 0;\n}\n\nfunction openAIUsage(body: JsonRecord): JsonRecord | undefined {\n return readRecord(readRecord(body, 'response'), 'usage') ?? readRecord(body, 'usage');\n}\n\nfunction estimateOpenAIResponsesOutputTokens(response: JsonRecord, model?: string): number {\n const output = Array.isArray(response.output) ? response.output : [];\n return clampTokens(output.reduce((total, item) => {\n if (!isRecord(item)) return total + countOpenAIJsonLikeTokens(item, model);\n const content = Array.isArray(item.content) ? item.content : [];\n return total + content.reduce((contentTotal, part) => {\n if (isRecord(part) && typeof part.text === 'string') return contentTotal + countOpenAIStringTokens(part.text, model);\n return contentTotal + countOpenAIJsonLikeTokens(part, model);\n }, 0) + countOpenAIStringTokens(item.arguments, model);\n }, 0)) ?? 0;\n}\n\nfunction isDoneSentinel(chunk: JsonRecord): boolean {\n return chunk.data === '[DONE]' || chunk.type === '[DONE]';\n}\n\nfunction estimateAnthropicInputTokens(body: JsonRecord): number {\n const system = asString(body.system) ?? '';\n const messages = Array.isArray(body.messages) ? body.messages : [];\n const tools = Array.isArray(body.tools) ? body.tools : [];\n return clampTokens(\n countTextTokens(system)\n + messages.reduce((total, message) => total + countJsonLikeTokens(message), 0)\n + tools.reduce((total, tool) => total + 16 + countJsonLikeTokens(tool), 0)\n + 8\n ) ?? 0;\n}\n\nfunction estimateAnthropicOutputTokens(body: JsonRecord): number {\n const content = Array.isArray(body.content) ? body.content : [];\n return clampTokens(content.reduce((total, block) => total + countJsonLikeTokens(block), 0)) ?? 0;\n}\n\nfunction estimateGeminiPartTokens(part: unknown): number {\n if (!isRecord(part)) {\n return countJsonLikeTokens(part);\n }\n\n if (typeof part.text === 'string') {\n return countTextTokens(part.text);\n }\n\n if (isRecord(part.inlineData)) {\n return estimateGeminiInlineDataTokens(part.inlineData);\n }\n\n if (isRecord(part.functionCall)) {\n return estimateGeminiFunctionCallTokens(part.functionCall);\n }\n\n if (isRecord(part.functionResponse)) {\n return estimateGeminiFunctionResponseTokens(part.functionResponse);\n }\n\n return countJsonLikeTokens(part);\n}\n\nfunction estimateGeminiInputTokens(body: JsonRecord): number {\n const systemInstruction = readRecord(body, 'systemInstruction');\n const systemParts = Array.isArray(systemInstruction?.parts) ? systemInstruction.parts : [];\n const contents = Array.isArray(body.contents) ? body.contents : [];\n return clampTokens(\n systemParts.reduce((total, part) => total + estimateGeminiPartTokens(part), 0)\n + contents.reduce((total, item) => {\n if (!isRecord(item)) {\n return total + countJsonLikeTokens(item);\n }\n\n const parts = Array.isArray(item.parts) ? item.parts : [];\n return total + parts.reduce((partTotal, part) => partTotal + estimateGeminiPartTokens(part), 0);\n }, 0)\n + 8\n ) ?? 0;\n}\n\nfunction estimateGeminiOutputTokens(body: JsonRecord): number {\n const candidates = Array.isArray(body.candidates) ? body.candidates : [];\n return clampTokens(candidates.reduce((total, candidate) => {\n if (!isRecord(candidate)) {\n return total + countJsonLikeTokens(candidate);\n }\n\n const content = readRecord(candidate, 'content');\n const parts = Array.isArray(content?.parts) ? content.parts : [];\n return total + parts.reduce((partTotal, part) => partTotal + estimateGeminiPartTokens(part), 0);\n }, 0)) ?? 0;\n}\n\nfunction createOpenAIAdapter(): ProviderTokenAccountingAdapter {\n return {\n provider: 'openai',\n capabilities: getProviderTokenAccountingCapabilities('openai'),\n consumeRequest(state, body) {\n storeRequestForEstimate(state, body, ['input', 'messages', 'tools']);\n setSessionModel(state, body.model);\n },\n consumeResponse(state, body) {\n const usage = openAIUsage(body);\n const promptTokens = readNumber(usage, 'prompt_tokens') ?? readNumber(usage, 'input_tokens');\n const completionTokens = readNumber(usage, 'completion_tokens') ?? readNumber(usage, 'output_tokens');\n const responseStatus = asString(readRecord(body, 'response')?.status) ?? asString(body.status);\n const isIncomplete = responseStatus === 'incomplete' || asString(body.type) === 'response.incomplete';\n const isFailed = responseStatus === 'failed' || asString(body.type) === 'response.failed';\n const promptDetails = readRecord(usage, 'prompt_tokens_details') ?? readRecord(usage, 'input_tokens_details');\n const cacheReadTokens = readNumber(promptDetails, 'cached_tokens');\n if (isDeferred(state)) {\n if (promptTokens !== undefined) {\n state.estimatedInputTokens = promptTokens;\n state.estimatedInputAuthority = 'official';\n }\n if (completionTokens !== undefined) {\n state.outputTokens = completionTokens;\n state.outputAuthority = 'official';\n clearObservedOutput(state);\n }\n if (cacheReadTokens !== undefined) state.cacheReadTokens = cacheReadTokens;\n if (!isIncomplete && !isFailed && !isErrorResponse(body)) observeOpenAIOutput(state, body);\n state.protocolTerminalSeen = true;\n (state as StreamEstimateState).deferredOutcome = isIncomplete || isFailed || isErrorResponse(body) ? 'failed' : 'completed';\n return createPartialTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none'\n });\n }\n if (promptTokens === undefined) estimateMissingInput(state);\n const responseHasOutput = hasOpenAIOutput(body) && !isIncomplete && !isFailed && !isErrorResponse(body);\n const estimatedOutput = completionTokens === undefined && responseHasOutput\n ? (Array.isArray(body.output) ? estimateOpenAIResponsesOutputTokens(body, state.model) : estimateOpenAIResponseOutputTokens(body, state.model))\n : undefined;\n\n if (promptTokens !== undefined || completionTokens !== undefined) {\n state.finalReceived = true;\n return finalizeTokenAccountingEvent(state, {\n inputTokens: promptTokens ?? state.estimatedInputTokens,\n outputTokens: completionTokens ?? estimatedOutput,\n cacheReadTokens,\n cacheWriteTokens: undefined,\n inputAuthority: promptTokens !== undefined ? 'official' : (state.estimatedInputAuthority ?? 'heuristic'),\n outputAuthority: completionTokens !== undefined ? 'official' : estimatedOutput === undefined ? 'none' : 'local'\n }, isIncomplete || isFailed ? 'failed' : 'completed');\n }\n\n const outputTokens = estimatedOutput;\n state.finalReceived = true;\n state.outputTokens = outputTokens;\n state.outputAuthority = outputTokens === undefined ? 'none' : 'local';\n return finalizeTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority\n }, isIncomplete || isFailed ? 'failed' : 'completed');\n },\n consumeStreamChunk(state, chunk, event) {\n if (state.finalReceived || isDoneSentinel(chunk)) return null;\n const response = readRecord(chunk, 'response');\n const usage = openAIUsage(chunk);\n const promptTokens = readNumber(usage, 'prompt_tokens') ?? readNumber(usage, 'input_tokens');\n const completionTokens = readNumber(usage, 'completion_tokens') ?? readNumber(usage, 'output_tokens');\n const promptDetails = readRecord(usage, 'prompt_tokens_details') ?? readRecord(usage, 'input_tokens_details');\n if (promptTokens !== undefined) {\n state.estimatedInputTokens = promptTokens;\n state.estimatedInputAuthority = 'official';\n }\n if (completionTokens !== undefined) {\n state.outputTokens = completionTokens;\n state.outputAuthority = 'official';\n clearObservedOutput(state);\n }\n const reportedCache = readNumber(promptDetails, 'cached_tokens');\n if (reportedCache !== undefined) state.cacheReadTokens = reportedCache;\n const responseType = event ?? asString(chunk.type);\n const responseStatus = asString(response?.status);\n const responseCompleted = responseType === 'response.completed' || responseStatus === 'completed';\n observeOpenAIOutput(state, chunk, !responseCompleted, event);\n const choices = Array.isArray(chunk.choices) ? chunk.choices : [];\n if (choices.some((choice) => isRecord(choice) && asString(choice.finish_reason) !== undefined && choice.finish_reason !== null)) {\n state.protocolTerminalSeen = true;\n if (isDeferred(state)) (state as StreamEstimateState).deferredOutcome = 'completed';\n }\n if (isDeferred(state)) {\n if (responseCompleted) {\n (state as StreamEstimateState).deferredOutcome = 'completed';\n state.protocolTerminalSeen = true;\n if (completionTokens === undefined && state.outputAuthority !== 'official' && Array.isArray(response?.output)) {\n replaceObservedOutput(state);\n observeOpenAIOutput(state, { response });\n }\n } else if (responseType === 'response.incomplete' || responseType === 'response.failed'\n || responseStatus === 'incomplete' || responseStatus === 'failed') {\n (state as StreamEstimateState).deferredOutcome = 'failed';\n state.protocolTerminalSeen = true;\n }\n return createPartialTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none'\n });\n }\n if (responseCompleted) {\n if (completionTokens === undefined && state.outputAuthority !== 'official' && Array.isArray(response?.output)) {\n replaceObservedOutput(state);\n observeOpenAIOutput(state, { response });\n }\n if (completionTokens === undefined) finalizeMissingStreamOutput(state);\n if (promptTokens === undefined) estimateMissingInput(state);\n state.finalReceived = true;\n return finalizeTokenAccountingEvent(state, {\n inputTokens: promptTokens ?? state.estimatedInputTokens,\n outputTokens: completionTokens ?? state.outputTokens,\n cacheReadTokens: readNumber(readRecord(usage, 'input_tokens_details') ?? readRecord(usage, 'prompt_tokens_details'), 'cached_tokens') ?? state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: promptTokens !== undefined ? 'official' : (state.estimatedInputAuthority ?? 'heuristic'),\n outputAuthority: completionTokens !== undefined ? 'official' : (state.outputAuthority ?? 'none')\n });\n }\n if (responseType === 'response.incomplete' || responseType === 'response.failed'\n || responseStatus === 'incomplete' || responseStatus === 'failed') {\n state.finalReceived = true;\n const promptDetails = readRecord(usage, 'input_tokens_details') ?? readRecord(usage, 'prompt_tokens_details');\n const input = promptTokens === undefined ? undefined : promptTokens;\n const output = completionTokens;\n state.estimatedInputTokens = input ?? state.estimatedInputTokens;\n state.outputTokens = output ?? state.outputTokens;\n state.cacheReadTokens = readNumber(promptDetails, 'cached_tokens') ?? state.cacheReadTokens;\n if (output === undefined) finalizeMissingStreamOutput(state);\n if (input === undefined) estimateMissingInput(state);\n return finalizeTokenAccountingEvent(state, {\n inputTokens: input ?? state.estimatedInputTokens,\n outputTokens: output ?? state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: input !== undefined ? 'official' : (state.estimatedInputAuthority ?? 'heuristic'),\n outputAuthority: output !== undefined ? 'official' : (state.outputAuthority ?? 'none')\n }, 'failed');\n }\n return createPartialTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none'\n });\n },\n finalizeAbortedStream(state) {\n finalizeMissingStreamOutput(state, true);\n estimateMissingInput(state);\n return finalizeTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none'\n }, 'aborted');\n },\n finalizeCompletedStream(state) {\n if (state.finalReceived) return createPartialTokenAccountingEvent(state);\n state.finalReceived = true;\n finalizeMissingStreamOutput(state);\n estimateMissingInput(state);\n return finalizeTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none'\n }, (state as StreamEstimateState).deferredOutcome ?? (state.protocolTerminalSeen ? 'completed' : 'failed'));\n }\n };\n}\n\nfunction createAnthropicAdapter(): ProviderTokenAccountingAdapter {\n return {\n provider: 'anthropic',\n capabilities: getProviderTokenAccountingCapabilities('anthropic'),\n consumeRequest(state, body) {\n storeRequestForEstimate(state, body, ['system', 'messages', 'tools']);\n setSessionModel(state, body.model);\n },\n consumeResponse(state, body) {\n const usage = readRecord(body, 'usage');\n const inputTokens = readNumber(usage, 'input_tokens');\n const outputTokens = readNumber(usage, 'output_tokens');\n const cacheWriteTokens = readNumber(usage, 'cache_creation_input_tokens');\n const cacheReadTokens = readNumber(usage, 'cache_read_input_tokens');\n const totalInputTokens = inputTokens === undefined ? undefined : safeTokenSum(inputTokens, cacheWriteTokens ?? 0, cacheReadTokens ?? 0);\n if (isDeferred(state)) {\n if (totalInputTokens !== undefined) {\n state.estimatedInputTokens = totalInputTokens;\n state.estimatedInputAuthority = 'official';\n }\n if (outputTokens !== undefined) {\n state.outputTokens = outputTokens;\n state.outputAuthority = 'official';\n clearObservedOutput(state);\n }\n if (cacheReadTokens !== undefined) state.cacheReadTokens = cacheReadTokens;\n if (cacheWriteTokens !== undefined) state.cacheWriteTokens = cacheWriteTokens;\n const failed = isDeferredFailure(body);\n if (!failed) observeAnthropicOutput(state, body);\n state.protocolTerminalSeen = true;\n (state as StreamEstimateState).deferredOutcome = failed ? 'failed' : 'completed';\n return createPartialTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none'\n });\n }\n if (totalInputTokens === undefined) estimateMissingInput(state);\n const estimatedOutput = outputTokens === undefined && hasAnthropicOutput(body) && !isErrorResponse(body) ? estimateAnthropicOutputTokens(body) : undefined;\n\n if (usage && (inputTokens !== undefined || outputTokens !== undefined\n || readNumber(usage, 'cache_creation_input_tokens') !== undefined\n || readNumber(usage, 'cache_read_input_tokens') !== undefined)) {\n state.finalReceived = true;\n return finalizeTokenAccountingEvent(state, {\n inputTokens: totalInputTokens ?? state.estimatedInputTokens,\n outputTokens: outputTokens ?? estimatedOutput,\n cacheReadTokens,\n cacheWriteTokens,\n inputAuthority: totalInputTokens !== undefined ? 'official' : (state.estimatedInputAuthority ?? 'heuristic'),\n outputAuthority: outputTokens !== undefined ? 'official' : estimatedOutput === undefined ? 'none' : 'local'\n });\n }\n\n return finalizeTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: estimatedOutput,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: estimatedOutput === undefined ? 'none' : 'local'\n });\n },\n consumeStreamChunk(state, chunk, event) {\n if (state.finalReceived || isDoneSentinel(chunk)) return null;\n const type = event ?? asString(chunk.type);\n if (isDeferred(state) && type === 'error') {\n state.protocolTerminalSeen = true;\n (state as StreamEstimateState).deferredOutcome = 'failed';\n return createPartialTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none'\n });\n }\n if (type === 'message_start') {\n const message = readRecord(chunk, 'message');\n const usage = readRecord(message, 'usage');\n setSessionModel(state, message?.model);\n state.cacheWriteTokens = readNumber(usage, 'cache_creation_input_tokens') ?? state.cacheWriteTokens;\n state.cacheReadTokens = readNumber(usage, 'cache_read_input_tokens') ?? state.cacheReadTokens;\n const rawInputTokens = readNumber(usage, 'input_tokens');\n const totalInputTokens = rawInputTokens === undefined\n ? undefined\n : safeTokenSum(rawInputTokens, state.cacheWriteTokens ?? 0, state.cacheReadTokens ?? 0);\n state.estimatedInputTokens = totalInputTokens ?? state.estimatedInputTokens;\n if (totalInputTokens !== undefined) state.estimatedInputAuthority = 'official';\n\n const initialOutputTokens = readNumber(usage, 'output_tokens');\n state.outputTokens = initialOutputTokens ?? state.outputTokens;\n state.outputAuthority = initialOutputTokens !== undefined ? 'official' : 'none';\n if (initialOutputTokens !== undefined) clearObservedOutput(state);\n return buildAnthropicStreamingEvent(state, {\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority\n });\n }\n\n if (type === 'content_block_start') {\n const contentBlock = readRecord(chunk, 'content_block');\n if (contentBlock?.text !== undefined) {\n if (isDeferred(state)) observeBoundedOutput(state, contentBlock.text);\n else observeOutput(state, contentBlock.text);\n }\n return buildAnthropicStreamingEvent(state);\n }\n\n if (type === 'content_block_delta') {\n const delta = readRecord(chunk, 'delta');\n const deltaType = asString(delta?.type);\n if (deltaType === 'text_delta') {\n if (isDeferred(state)) observeBoundedOutput(state, delta?.text);\n else observeOutput(state, delta?.text);\n }\n if (deltaType === 'input_json_delta') observeOutput(state, delta?.partial_json);\n return buildAnthropicStreamingEvent(state);\n }\n\n if (type === 'content_block_stop') {\n return buildAnthropicStreamingEvent(state);\n }\n\n if (type === 'message_delta') {\n const usage = readRecord(chunk, 'usage');\n const outputTokens = readNumber(usage, 'output_tokens');\n const rawInputTokens = readNumber(usage, 'input_tokens');\n if (rawInputTokens !== undefined) {\n state.cacheWriteTokens = readNumber(usage, 'cache_creation_input_tokens') ?? state.cacheWriteTokens;\n state.cacheReadTokens = readNumber(usage, 'cache_read_input_tokens') ?? state.cacheReadTokens;\n const totalInput = safeTokenSum(rawInputTokens, state.cacheWriteTokens ?? 0, state.cacheReadTokens ?? 0);\n state.estimatedInputTokens = totalInput ?? state.estimatedInputTokens;\n if (totalInput !== undefined) state.estimatedInputAuthority = 'official';\n }\n if (outputTokens !== undefined) {\n state.outputTokens = outputTokens;\n state.outputAuthority = 'official';\n clearObservedOutput(state);\n }\n state.cacheWriteTokens = readNumber(usage, 'cache_creation_input_tokens') ?? state.cacheWriteTokens;\n state.cacheReadTokens = readNumber(usage, 'cache_read_input_tokens') ?? state.cacheReadTokens;\n\n return buildAnthropicStreamingEvent(state, {\n outputAuthority: state.outputTokens !== undefined ? (state.outputAuthority ?? 'none') : 'none'\n });\n }\n\n if (type === 'message_stop') {\n if (state.finalReceived) {\n return null;\n }\n\n state.protocolTerminalSeen = true;\n if (isDeferred(state)) {\n (state as StreamEstimateState).deferredOutcome ??= 'completed';\n return createPartialTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none'\n });\n }\n state.finalReceived = true;\n finalizeMissingStreamOutput(state);\n estimateMissingInput(state);\n return finalizeTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none'\n });\n }\n\n return null;\n },\n finalizeAbortedStream(state) {\n finalizeMissingStreamOutput(state, true);\n estimateMissingInput(state);\n return finalizeTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputTokens !== undefined ? (state.outputAuthority ?? 'partial') : 'none'\n }, 'aborted');\n },\n finalizeCompletedStream(state) {\n if (state.finalReceived) return buildAnthropicStreamingEvent(state);\n state.finalReceived = true;\n finalizeMissingStreamOutput(state);\n estimateMissingInput(state);\n return finalizeTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputTokens !== undefined ? (state.outputAuthority ?? 'partial') : 'none'\n }, (state as StreamEstimateState).deferredOutcome ?? (state.protocolTerminalSeen ? 'completed' : 'failed'));\n }\n };\n}\n\nfunction createGeminiAdapter(): ProviderTokenAccountingAdapter {\n return {\n provider: 'gemini',\n capabilities: getProviderTokenAccountingCapabilities('gemini'),\n consumeRequest(state, body) {\n storeRequestForEstimate(state, body, ['contents', 'systemInstruction']);\n setSessionModel(state, body.model);\n },\n consumeResponse(state, body) {\n const usageMetadata = readRecord(body, 'usageMetadata');\n const promptTokenCount = readNumber(usageMetadata, 'promptTokenCount');\n const candidatesTokenCount = readNumber(usageMetadata, 'candidatesTokenCount');\n const thoughtsTokenCount = readNumber(usageMetadata, 'thoughtsTokenCount') ?? 0;\n const toolUsePromptTokenCount = readNumber(usageMetadata, 'toolUsePromptTokenCount') ?? 0;\n const cachedContentTokenCount = readNumber(usageMetadata, 'cachedContentTokenCount');\n if (isDeferred(state)) {\n const input = promptTokenCount === undefined ? undefined : safeTokenSum(promptTokenCount, toolUsePromptTokenCount);\n const output = candidatesTokenCount === undefined ? undefined : safeTokenSum(candidatesTokenCount, thoughtsTokenCount);\n if (input !== undefined) {\n state.estimatedInputTokens = input;\n state.estimatedInputAuthority = 'official';\n }\n if (output !== undefined) {\n state.outputTokens = output;\n state.outputAuthority = 'official';\n clearObservedOutput(state);\n }\n if (cachedContentTokenCount !== undefined) state.cacheReadTokens = cachedContentTokenCount;\n const failed = isDeferredFailure(body);\n if (!failed) observeGeminiOutput(state, body);\n state.protocolTerminalSeen = true;\n (state as StreamEstimateState).deferredOutcome = failed ? 'failed' : 'completed';\n return createPartialTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: undefined,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none'\n });\n }\n if (promptTokenCount === undefined) estimateMissingInput(state);\n const estimatedOutput = candidatesTokenCount === undefined && hasGeminiOutput(body) && !isErrorResponse(body) ? estimateGeminiOutputTokens(body) : undefined;\n\n if (promptTokenCount !== undefined || candidatesTokenCount !== undefined) {\n state.finalReceived = true;\n return finalizeTokenAccountingEvent(state, {\n inputTokens: promptTokenCount === undefined ? state.estimatedInputTokens : safeTokenSum(promptTokenCount, toolUsePromptTokenCount) ?? state.estimatedInputTokens,\n outputTokens: candidatesTokenCount === undefined ? estimatedOutput : safeTokenSum(candidatesTokenCount, thoughtsTokenCount) ?? estimatedOutput,\n cacheReadTokens: cachedContentTokenCount,\n cacheWriteTokens: undefined,\n inputAuthority: promptTokenCount !== undefined && safeTokenSum(promptTokenCount, toolUsePromptTokenCount) !== undefined ? 'official' : (state.estimatedInputAuthority ?? 'heuristic'),\n outputAuthority: candidatesTokenCount !== undefined && safeTokenSum(candidatesTokenCount, thoughtsTokenCount) !== undefined ? 'official' : estimatedOutput === undefined ? 'none' : 'local'\n });\n }\n\n const outputTokens = estimatedOutput;\n state.finalReceived = true;\n state.outputTokens = outputTokens;\n state.outputAuthority = outputTokens === undefined ? 'none' : 'local';\n return finalizeTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority\n });\n },\n consumeStreamChunk(state, chunk, event) {\n if (state.finalReceived || isDoneSentinel(chunk)) return null;\n observeGeminiOutput(state, chunk);\n const usageMetadata = readRecord(chunk, 'usageMetadata');\n const promptTokenCount = readNumber(usageMetadata, 'promptTokenCount');\n const candidatesTokenCount = readNumber(usageMetadata, 'candidatesTokenCount');\n const thoughtsTokenCount = readNumber(usageMetadata, 'thoughtsTokenCount') ?? 0;\n const toolUsePromptTokenCount = readNumber(usageMetadata, 'toolUsePromptTokenCount') ?? 0;\n const reportedCacheRead = readNumber(usageMetadata, 'cachedContentTokenCount');\n const candidates = Array.isArray(chunk.candidates) ? chunk.candidates : [];\n if (candidates.some((candidate) => isRecord(candidate) && asString(candidate.finishReason) !== undefined)) {\n state.protocolTerminalSeen = true;\n if (isDeferred(state)) (state as StreamEstimateState).deferredOutcome ??= 'completed';\n }\n if (isDeferred(state) && isDeferredFailure(chunk)) {\n state.protocolTerminalSeen = true;\n (state as StreamEstimateState).deferredOutcome = 'failed';\n }\n if (isDeferred(state) && reportedCacheRead !== undefined && promptTokenCount === undefined && candidatesTokenCount === undefined) {\n state.cacheReadTokens = reportedCacheRead;\n return createPartialTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: undefined,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? 'none'\n });\n }\n if (promptTokenCount !== undefined || candidatesTokenCount !== undefined) {\n const input = promptTokenCount === undefined ? undefined : safeTokenSum(promptTokenCount, toolUsePromptTokenCount);\n const output = candidatesTokenCount === undefined ? undefined : safeTokenSum(candidatesTokenCount, thoughtsTokenCount);\n state.estimatedInputTokens = input ?? state.estimatedInputTokens;\n if (input !== undefined) state.estimatedInputAuthority = 'official';\n state.outputTokens = output ?? state.outputTokens;\n if (output !== undefined) {\n state.outputAuthority = 'official';\n clearObservedOutput(state);\n }\n const cacheRead = readNumber(usageMetadata, 'cachedContentTokenCount');\n if (cacheRead !== undefined) state.cacheReadTokens = cacheRead;\n return createPartialTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: undefined,\n inputAuthority: state.estimatedInputAuthority ?? 'heuristic',\n outputAuthority: state.outputAuthority ?? 'partial'\n });\n }\n\n return createPartialTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'heuristic',\n outputAuthority: state.outputAuthority ?? (state.outputTokens !== undefined ? 'partial' : 'none')\n });\n },\n finalizeAbortedStream(state) {\n finalizeMissingStreamOutput(state, true);\n estimateMissingInput(state);\n return finalizeTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? (state.outputTokens !== undefined ? 'partial' : 'none')\n }, 'aborted');\n },\n finalizeCompletedStream(state) {\n if (state.finalReceived) return createPartialTokenAccountingEvent(state);\n state.finalReceived = true;\n finalizeMissingStreamOutput(state);\n estimateMissingInput(state);\n return finalizeTokenAccountingEvent(state, {\n inputTokens: state.estimatedInputTokens,\n outputTokens: state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: state.cacheWriteTokens,\n inputAuthority: state.estimatedInputAuthority ?? 'none',\n outputAuthority: state.outputAuthority ?? (state.outputTokens !== undefined ? 'partial' : 'none')\n }, (state as StreamEstimateState).deferredOutcome ?? (state.protocolTerminalSeen ? 'completed' : 'failed'));\n }\n };\n}\n\nconst PROVIDER_ADAPTERS = {\n openai: createOpenAIAdapter(),\n anthropic: createAnthropicAdapter(),\n gemini: createGeminiAdapter()\n} as const satisfies Record<string, ProviderTokenAccountingAdapter>;\n\nfunction normalizeProvider(provider: LLMProvider): keyof typeof PROVIDER_ADAPTERS {\n return String(provider).trim().toLowerCase() as keyof typeof PROVIDER_ADAPTERS;\n}\n\nfunction getProviderAdapter(provider: LLMProvider): ProviderTokenAccountingAdapter {\n const adapter = PROVIDER_ADAPTERS[normalizeProvider(provider)];\n if (!adapter) {\n throw new Error(`Unsupported token accounting provider: ${provider}`);\n }\n\n return adapter;\n}\n\nexport function createTokenAccountingSession(\n input: TokenAccountingSessionInput,\n options: { deferFinalization?: boolean } = {}\n): TokenAccountingSession {\n const adapter = getProviderAdapter(input.provider);\n let terminalEvent: CanonicalTokenAccountingEventV2 | undefined;\n const state: TokenAccountingSessionState & StreamEstimateState = {\n provider: adapter.provider,\n routeId: input.routeId,\n upstreamId: input.upstreamId,\n requestId: input.requestId,\n attemptId: input.attemptId,\n streaming: input.streaming,\n model: input.model,\n finalReceived: false,\n deferFinalization: options.deferFinalization === true\n };\n\n return {\n consumeRequest({ body }) {\n adapter.consumeRequest(state, body);\n },\n consumeResponse({ body }): CanonicalTokenAccountingEventV2 {\n const event = adapter.consumeResponse(state, body);\n if (event.final || event.outcome !== 'completed') terminalEvent = event;\n return event;\n },\n consumeStreamChunk({ chunk, event: eventName }): CanonicalTokenAccountingEventV2 | null {\n const event = adapter.consumeStreamChunk(state, chunk, eventName);\n if (event && (event.final || event.outcome !== 'completed')) terminalEvent = event;\n return event;\n },\n finalizeCompletedStream(): CanonicalTokenAccountingEventV2 {\n if (terminalEvent) return terminalEvent;\n const event = adapter.finalizeCompletedStream(state);\n terminalEvent = event;\n return event;\n },\n finalizeAbortedStream(): CanonicalTokenAccountingEventV2 {\n if (terminalEvent) return terminalEvent;\n const event = adapter.finalizeAbortedStream(state);\n terminalEvent = event;\n return event;\n }\n };\n}\n",
15
- "export type ResponsesProtocol = 'chat_completions' | 'anthropic_messages';\nexport type JsonRecord = Record<string, unknown>;\nexport interface ResponsesToolName { name: string; namespace?: string; custom: boolean }\n/** Per-request wire-name authority; never infer namespaces by splitting a provider name. */\nexport type ResponsesToolNames = ReadonlyMap<string, ResponsesToolName>;\nexport interface ResponsesCodecLimits {\n maxRequestBytes: number;\n maxOutputBytes: number;\n maxArgumentBytes: number;\n maxItems: number;\n}\nexport const DEFAULT_RESPONSES_CODEC_LIMITS: Readonly<ResponsesCodecLimits> = Object.freeze({\n maxRequestBytes: 8 * 1024 * 1024,\n maxOutputBytes: 8 * 1024 * 1024,\n maxArgumentBytes: 1024 * 1024,\n maxItems: 1024,\n});\nexport interface ResponsesCodecCapabilities {\n reasoningEffort?: boolean;\n /** Explicit provider-approved thinking budget; do not guess budgets from effort labels. */\n anthropicThinkingBudget?: number;\n maxOutputTokens?: number;\n limits?: Partial<ResponsesCodecLimits>;\n}\nexport class ResponsesCodecError extends Error {\n constructor(readonly code: string, message: string) { super(message); this.name = 'ResponsesCodecError'; }\n}\nexport function fail(code: string, message: string): never { throw new ResponsesCodecError(code, message); }\nexport function record(value: unknown, where: string): JsonRecord {\n if (!value || typeof value !== 'object' || Array.isArray(value)) fail('invalid_payload', `${where} must be an object`);\n return value as JsonRecord;\n}\nexport function string(value: unknown, where: string, nonempty = false): string {\n if (typeof value !== 'string' || (nonempty && !value)) fail('invalid_payload', `${where} must be a${nonempty ? ' non-empty' : ''} string`);\n return value;\n}\nexport function list(value: unknown, where: string): unknown[] {\n if (!Array.isArray(value)) fail('invalid_payload', `${where} must be an array`);\n return value;\n}\nexport function limits(overrides?: Partial<ResponsesCodecLimits>): ResponsesCodecLimits {\n const result = { ...DEFAULT_RESPONSES_CODEC_LIMITS, ...overrides };\n for (const [key, value] of Object.entries(result)) {\n if (!Number.isSafeInteger(value) || value <= 0) fail('invalid_limit', `${key} must be a positive integer`);\n }\n return result;\n}\nexport function bytes(value: string): number { return new TextEncoder().encode(value).byteLength; }\nexport function bounded(value: string, max: number, where: string): string {\n if (bytes(value) > max) fail('resource_limit', `${where} exceeds ${max} bytes`);\n return value;\n}\nexport function serialized(value: unknown, max: number, where: string): string {\n let result: string | undefined;\n try { result = JSON.stringify(value); } catch { fail('invalid_payload', `${where} must be serializable JSON`); }\n if (result === undefined) fail('invalid_payload', `${where} must be serializable JSON`);\n return bounded(result, max, where);\n}\nexport function argumentObject(text: string): JsonRecord {\n let value: unknown;\n try { value = JSON.parse(text); } catch { fail('invalid_tool_arguments', 'Tool arguments must be complete JSON'); }\n return record(value, 'tool arguments');\n}\nexport function restoreTool(name: string, names: ResponsesToolNames): ResponsesToolName {\n const result = names.get(name);\n if (result) return result;\n if (names.size) fail('unknown_tool', `Provider returned undeclared tool ${name}`);\n return { name, custom: false };\n}\nexport function customInput(text: string): string {\n const value = argumentObject(text);\n if (Object.keys(value).length !== 1 || typeof value.input !== 'string') {\n fail('invalid_tool_arguments', 'Custom tools require exactly one string input property');\n }\n return value.input;\n}\n/** Decode only complete JSON-string characters. A split escape remains buffered. */\nexport function customInputPrefix(text: string): string {\n const prefix = /^\\s*\\{\\s*\"input\"\\s*:\\s*\"/.exec(text);\n if (!prefix) return '';\n let result = '';\n for (let i = prefix[0].length; i < text.length;) {\n const char = text[i];\n if (char === '\"') break;\n if (char !== '\\\\') { if (char.charCodeAt(0) < 32) fail('invalid_tool_arguments', 'Invalid JSON string character'); result += char; i++; continue; }\n const escape = text[i + 1];\n if (escape === undefined) break;\n const size = escape === 'u' ? 6 : 2;\n if (i + size > text.length) break;\n try { result += JSON.parse(`\"${text.slice(i, i + size)}\"`); } catch { fail('invalid_tool_arguments', 'Invalid JSON string escape'); }\n i += size;\n }\n return result;\n}\nexport interface Terminal { status: 'completed' | 'incomplete' | 'failed'; reason: string }\nexport function terminal(reason: unknown, protocol: ResponsesProtocol): Terminal {\n if (typeof reason !== 'string' || !reason) fail('missing_terminal', 'Upstream has no explicit completion reason');\n const completed = protocol === 'chat_completions' ? ['stop', 'tool_calls', 'function_call'] : ['end_turn', 'tool_use', 'stop_sequence'];\n if (completed.includes(reason)) return { status: 'completed', reason };\n if (reason === 'length' || reason === 'max_tokens' || reason === 'model_context_window_exceeded') return { status: 'incomplete', reason: 'max_output_tokens' };\n if (reason === 'content_filter' || reason === 'refusal') return { status: 'incomplete', reason: 'content_filter' };\n if (reason === 'error') return { status: 'failed', reason: 'upstream_error' };\n fail('unknown_terminal', `Unsupported upstream completion reason: ${reason}`);\n}\nfunction tokens(value: unknown, where: string): number {\n if (value === undefined) return 0;\n if (!Number.isSafeInteger(value) || (value as number) < 0) fail('invalid_usage', `${where} must be a non-negative integer`);\n return value as number;\n}\nexport function normalizeUsage(raw: unknown, protocol: ResponsesProtocol, prior: JsonRecord = {}): JsonRecord {\n if (raw === undefined || raw === null) return prior;\n const usage = record(raw, 'usage');\n const chat = protocol === 'chat_completions';\n const input = tokens(usage[chat ? 'prompt_tokens' : 'input_tokens'] ?? prior.input_tokens, 'input_tokens');\n const output = tokens(usage[chat ? 'completion_tokens' : 'output_tokens'] ?? prior.output_tokens, 'output_tokens');\n const details = chat ? usage.prompt_tokens_details : undefined;\n const cached = chat ? (details ? record(details, 'prompt_tokens_details').cached_tokens : undefined) : usage.cache_read_input_tokens;\n // Anthropic input_tokens excludes both cache classes; Responses input_tokens includes them.\n const cacheRead = tokens(cached ?? (prior.input_tokens_details as JsonRecord | undefined)?.cached_tokens, 'cached_tokens');\n const cacheWrite = chat ? 0 : tokens(usage.cache_creation_input_tokens, 'cache_creation_input_tokens');\n const totalInput = chat ? input : (usage.input_tokens === undefined ? input : input + cacheRead + cacheWrite);\n const reasoning = chat && usage.completion_tokens_details ? record(usage.completion_tokens_details, 'completion_tokens_details').reasoning_tokens : undefined;\n return { input_tokens: totalInput, output_tokens: output, total_tokens: totalInput + output,\n input_tokens_details: { cached_tokens: cacheRead },\n output_tokens_details: { reasoning_tokens: tokens(reasoning ?? (prior.output_tokens_details as JsonRecord | undefined)?.reasoning_tokens, 'reasoning_tokens') } };\n}\nexport function toolItem(id: string, name: string, args: string, names: ResponsesToolNames, status = 'completed'): JsonRecord {\n const original = restoreTool(name, names);\n const item: JsonRecord = { id: `fc_${id}`, type: original.custom ? 'custom_tool_call' : 'function_call', call_id: id, name: original.name, status };\n if (original.namespace) item.namespace = original.namespace;\n if (original.custom) item.input = customInput(args); else { argumentObject(args); item.arguments = args; }\n return item;\n}\nexport function responsePayload(id: string, model: string, output: JsonRecord[], end: Terminal, usage: JsonRecord, error?: unknown, createdAt = Math.floor(Date.now() / 1000)): JsonRecord {\n const result: JsonRecord = { id, object: 'response', created_at: createdAt, model, status: end.status, output, usage: Object.keys(usage).length ? usage : null };\n if (end.status === 'incomplete') result.incomplete_details = { reason: end.reason };\n if (end.status === 'failed') result.error = error ?? { code: end.reason, message: end.reason };\n return result;\n}\n",
16
- "import { OpenAIProtocolConversion } from '../providers/openai/protocol-conversion';\nimport { argumentObject, bounded, fail, limits, list, record, serialized, string,\n type JsonRecord, type ResponsesCodecCapabilities, type ResponsesProtocol, type ResponsesToolName, type ResponsesToolNames } from './common';\n\nconst contentNormalizer = new OpenAIProtocolConversion({ trimWhitespace: false });\n\nexport interface DecodedResponsesRequest { body: JsonRecord; toolNames: ResponsesToolNames }\n\n/** Converts only self-contained history. Reference resolution belongs to the caller. */\nexport function decodeResponsesRequest(raw: unknown, protocol: ResponsesProtocol, capabilities: ResponsesCodecCapabilities = {}): DecodedResponsesRequest {\n const body = record(raw, 'Responses request');\n const budget = limits(capabilities.limits);\n serialized(body, budget.maxRequestBytes, 'request');\n const supported = new Set(['model', 'input', 'instructions', 'tools', 'tool_choice', 'reasoning', 'text',\n 'stream', 'temperature', 'top_p', 'parallel_tool_calls', 'metadata', 'max_output_tokens',\n 'previous_response_id', 'conversation', 'response_id', 'background', 'n', 'truncation', 'include', 'store']);\n for (const key of Object.keys(body)) if (!supported.has(key)) fail('unsupported_request', `Unsupported Responses request field ${key}`);\n if (body.store === true) fail('unsupported_request', 'Stored Responses require caller-owned persistence');\n for (const key of ['previous_response_id', 'conversation', 'response_id']) {\n if (body[key] != null) fail('unresolved_reference', `${key} must be resolved before protocol conversion`);\n }\n if (body.background === true) fail('unsupported_request', 'Background Responses cannot be represented by this codec');\n if (body.n !== undefined && body.n !== 1) fail('unsupported_request', 'Only one response candidate is supported');\n if (body.truncation !== undefined && body.truncation !== 'disabled') fail('unsupported_request', 'Automatic input truncation cannot be represented');\n if (body.include !== undefined && list(body.include, 'include').length) fail('unsupported_request', 'Requested extra Responses output fields cannot be represented');\n const model = string(body.model, 'model', true);\n const toolNames = new Map<string, ResponsesToolName>();\n const byOriginal = new Map<string, string>();\n const tools: JsonRecord[] = [];\n const identity = (name: string, namespace?: string) => JSON.stringify([namespace ?? null, name]);\n const register = (name: string, namespace: string | undefined, custom: boolean): string => {\n const key = identity(name, namespace);\n if (byOriginal.has(key)) fail('tool_name_collision', `Duplicate tool ${namespace ? namespace + '.' : ''}${name}`);\n if (toolNames.size >= budget.maxItems) fail('resource_limit', 'Too many tools');\n // Always use short opaque names: arbitrary Unicode/namespace names and collisions are reversible.\n const wire = `bungee_tool_${toolNames.size}`;\n toolNames.set(wire, { name, namespace, custom }); byOriginal.set(key, wire);\n return wire;\n };\n const expandTool = (rawTool: unknown, namespace?: string): void => {\n const tool = record(rawTool, 'tool');\n if (tool.type === 'namespace') {\n if (namespace !== undefined) fail('unsupported_tool', 'Nested tool namespaces are not supported');\n const name = string(tool.name, 'namespace name', true);\n for (const child of list(tool.tools, 'namespace tools')) expandTool(child, name);\n return;\n }\n if (tool.type !== 'function' && tool.type !== 'custom') fail('unsupported_tool', `Hosted tool ${String(tool.type)} cannot be executed by Codex through this protocol`);\n const name = string(tool.name, 'tool name', true);\n const custom = tool.type === 'custom';\n if (tool.strict !== undefined && typeof tool.strict !== 'boolean') fail('invalid_payload', 'Tool strict must be boolean');\n if (protocol === 'anthropic_messages' && tool.strict === true) fail('unsupported_tool', 'Anthropic strict tool enforcement requires an explicit provider capability');\n if (custom && tool.format !== undefined) {\n const format = record(tool.format, 'custom format');\n if (format.type !== 'text' && format.type !== 'grammar') fail('unsupported_tool', 'Unknown custom tool format');\n }\n const wire = register(name, namespace, custom);\n const parameters = custom\n ? { type: 'object', properties: { input: { type: 'string' } }, required: ['input'], additionalProperties: false }\n : record(tool.parameters ?? { type: 'object', properties: {} }, 'tool parameters');\n const description = tool.description === undefined ? undefined : string(tool.description, 'tool description');\n const customHint = custom ? `Pass the complete original custom tool input verbatim in the input string.${tool.format ? ` Original input format: ${JSON.stringify(tool.format)}` : ''}` : undefined;\n if (protocol === 'chat_completions') {\n tools.push({ type: 'function', function: { name: wire, parameters, ...(description || customHint ? { description: [description, customHint].filter(Boolean).join('\\n') } : {}), ...(tool.strict !== undefined ? { strict: tool.strict } : {}) } });\n } else {\n tools.push({ name: wire, input_schema: parameters, ...(description || customHint ? { description: [description, customHint].filter(Boolean).join('\\n') } : {}) });\n }\n };\n if (body.tools !== undefined) for (const tool of list(body.tools, 'tools')) expandTool(tool);\n const resolve = (item: JsonRecord, custom: boolean): string => {\n const name = string(item.name, 'call name', true);\n const namespace = item.namespace === undefined ? undefined : string(item.namespace, 'call namespace', true);\n let wire = byOriginal.get(identity(name, namespace));\n // Historical calls need not appear in today's tool declarations. Preserve them in the same authority.\n if (wire === undefined) wire = register(name, namespace, custom);\n if (toolNames.get(wire)!.custom !== custom) fail('tool_name_collision', `Tool kind changed for ${name}`);\n return wire;\n };\n const normalizeContent = (rawContent: unknown, role: string): unknown => {\n if (typeof rawContent === 'string') return rawContent;\n const parts = list(rawContent, 'message content');\n for (const rawPart of parts) {\n const part = record(rawPart, 'content part');\n if (part.type === 'input_text' || part.type === 'output_text' || part.type === 'text') string(part.text, 'content text');\n else if (part.type === 'input_image' && role === 'user') {\n if (protocol !== 'chat_completions') fail('unsupported_content', 'Anthropic image conversion requires provider-specific URL/data support');\n string(part.image_url, 'image_url', true);\n if (part.detail !== undefined && !['auto', 'low', 'high'].includes(String(part.detail))) fail('unsupported_content', 'Unknown image detail');\n } else fail('unsupported_content', `Unsupported message content: ${String(part.type)}`);\n if (part.annotations !== undefined && list(part.annotations, 'annotations').length) fail('unsupported_content', 'Output annotations cannot be represented in input history');\n }\n // Reuse the existing text/image normalizer only after validating every part.\n const normalized = contentNormalizer.normalizeResponsesMessageContent(parts) as JsonRecord[];\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i] as JsonRecord;\n if (part.type === 'input_image' && part.detail !== undefined) (normalized[i].image_url as JsonRecord).detail = part.detail;\n }\n return normalized;\n };\n const chat: JsonRecord[] = [];\n const callIds = new Set<string>();\n const answered = new Set<string>();\n let pendingReasoning = '';\n const addMessage = (message: JsonRecord): void => {\n if (chat.length >= budget.maxItems) fail('resource_limit', 'Too many input messages');\n chat.push(message);\n };\n if (body.instructions !== undefined) addMessage({ role: 'system', content: string(body.instructions, 'instructions') });\n const input = typeof body.input === 'string' ? [{ role: 'user', content: body.input }] : list(body.input, 'input');\n if (input.length > budget.maxItems) fail('resource_limit', 'Too many input items');\n for (const rawItem of input) {\n const item = record(rawItem, 'input item');\n if (item.encrypted_content !== undefined || item.type === 'compaction') fail('unsupported_content', 'Encrypted reasoning and compaction cannot be restored');\n if (item.type === 'item_reference') fail('unresolved_reference', 'Input item references must be resolved before conversion');\n if (item.type === 'reasoning') {\n if (protocol !== 'chat_completions' || !capabilities.reasoningEffort) fail('unsupported_reasoning', 'Reasoning history requires an explicit compatible reasoning capability');\n const summary = list(item.summary, 'reasoning summary');\n pendingReasoning += summary.map(part => { const p = record(part, 'reasoning summary'); if (p.type !== 'summary_text') fail('unsupported_reasoning', 'Unknown reasoning summary'); return string(p.text, 'summary text'); }).join('');\n continue;\n }\n if (item.type === 'function_call' || item.type === 'custom_tool_call') {\n const custom = item.type === 'custom_tool_call';\n const id = string(item.call_id, 'call_id', true);\n if (callIds.has(id)) fail('invalid_tool_history', `Duplicate call_id ${id}`);\n callIds.add(id);\n const args = custom ? JSON.stringify({ input: string(item.input, 'custom input') }) : string(item.arguments, 'arguments');\n bounded(args, budget.maxArgumentBytes, 'arguments'); argumentObject(args);\n const call = { id, type: 'function', function: { name: resolve(item, custom), arguments: args } };\n const previous = chat.at(-1);\n if (previous?.role === 'assistant') {\n previous.tool_calls = [...(previous.tool_calls as JsonRecord[] ?? []), call];\n if (pendingReasoning) previous.reasoning_content = pendingReasoning;\n } else addMessage({ role: 'assistant', content: null, tool_calls: [call], ...(pendingReasoning ? { reasoning_content: pendingReasoning } : {}) });\n pendingReasoning = '';\n continue;\n }\n if (item.type === 'function_call_output' || item.type === 'custom_tool_call_output') {\n const id = string(item.call_id, 'call_id', true);\n if (!callIds.has(id) || answered.has(id)) fail('invalid_tool_history', `Unmatched or duplicate output ${id}`);\n answered.add(id);\n const output = typeof item.output === 'string' ? item.output : normalizeContent(item.output, 'tool');\n addMessage({ role: 'tool', tool_call_id: id, content: output, ...(item.is_error === true ? { is_error: true } : {}) });\n continue;\n }\n if (item.type !== undefined && item.type !== 'message') fail('unsupported_content', `Unsupported input item ${String(item.type)}`);\n const role = string(item.role, 'message role', true);\n if (!['user', 'assistant', 'system', 'developer'].includes(role)) fail('unsupported_content', `Unknown message role ${role}`);\n const message: JsonRecord = { role, content: normalizeContent(item.content, role) };\n if (pendingReasoning) { if (role !== 'assistant') fail('unsupported_reasoning', 'Reasoning must precede an assistant item'); message.reasoning_content = pendingReasoning; pendingReasoning = ''; }\n addMessage(message);\n }\n if (pendingReasoning) fail('unsupported_reasoning', 'Orphan reasoning history cannot be represented');\n const result: JsonRecord = { model, messages: chat };\n for (const key of ['stream', 'temperature', 'top_p', 'parallel_tool_calls', 'metadata']) if (body[key] !== undefined) result[key] = body[key];\n if (protocol === 'chat_completions' && body.stream === true) result.stream_options = { include_usage: true };\n const maxTokens = body.max_output_tokens ?? capabilities.maxOutputTokens;\n if (maxTokens !== undefined) {\n if (!Number.isSafeInteger(maxTokens) || (maxTokens as number) <= 0) fail('invalid_payload', 'max_output_tokens must be a positive integer');\n result[protocol === 'chat_completions' ? 'max_completion_tokens' : 'max_tokens'] = maxTokens;\n }\n if (tools.length) result.tools = tools;\n if (body.tool_choice !== undefined) {\n const choice = body.tool_choice;\n if (typeof choice === 'string') {\n if (!['auto', 'none', 'required'].includes(choice)) fail('unsupported_tool_choice', `Unsupported tool choice ${choice}`);\n result.tool_choice = protocol === 'chat_completions' ? choice : { type: choice === 'required' ? 'any' : choice };\n } else {\n const c = record(choice, 'tool_choice');\n if (c.type !== 'function' && c.type !== 'custom') fail('unsupported_tool_choice', 'Forced hosted tools are unsupported');\n const wire = byOriginal.get(identity(string(c.name, 'tool choice name', true), c.namespace === undefined ? undefined : string(c.namespace, 'tool choice namespace')));\n if (!wire || !tools.some(t => t.name === wire || (t.function as JsonRecord | undefined)?.name === wire)) fail('unsupported_tool_choice', 'Forced tool is not declared');\n result.tool_choice = protocol === 'chat_completions' ? { type: 'function', function: { name: wire } } : { type: 'tool', name: wire };\n }\n }\n if (body.reasoning !== undefined) {\n const reasoning = record(body.reasoning, 'reasoning');\n if (reasoning.summary !== undefined && reasoning.summary !== 'none') fail('unsupported_reasoning', 'Requested reasoning summaries are not guaranteed by this upstream protocol');\n if (reasoning.effort !== undefined && reasoning.effort !== 'none') {\n const effort = string(reasoning.effort, 'reasoning effort', true);\n if (protocol === 'chat_completions') {\n if (!capabilities.reasoningEffort) fail('unsupported_reasoning', 'Upstream does not advertise reasoning effort');\n result.reasoning_effort = effort;\n } else {\n const thinking = capabilities.anthropicThinkingBudget;\n if (!Number.isSafeInteger(thinking) || (thinking as number) < 1024 || typeof maxTokens !== 'number' || (thinking as number) >= maxTokens) fail('unsupported_reasoning', 'Anthropic thinking requires an explicit budget below max_output_tokens');\n result.thinking = { type: 'enabled', budget_tokens: thinking };\n }\n }\n }\n if (body.text !== undefined) {\n const text = record(body.text, 'text');\n if (text.verbosity !== undefined) fail('unsupported_request', 'Text verbosity cannot be represented');\n if (text.format !== undefined) {\n const format = record(text.format, 'text format');\n if (protocol !== 'chat_completions' && format.type !== 'text') fail('unsupported_request', 'Anthropic structured output requires a separate provider capability');\n if (format.type === 'json_schema') result.response_format = { type: 'json_schema', json_schema: { name: format.name, schema: format.schema, ...(format.strict !== undefined ? { strict: format.strict } : {}), ...(format.description !== undefined ? { description: format.description } : {}) } };\n else if (format.type === 'json_object' || format.type === 'text') { if (protocol === 'chat_completions') result.response_format = format; }\n else fail('unsupported_request', 'Unknown text format');\n }\n }\n if (protocol === 'anthropic_messages') {\n const system: string[] = [];\n const messages: JsonRecord[] = [];\n const append = (role: string, content: JsonRecord[]): void => {\n const previous = messages.at(-1);\n if (previous?.role === role) (previous.content as JsonRecord[]).push(...content);\n else messages.push({ role, content });\n };\n for (const msg of chat) {\n if (msg.role === 'system' || msg.role === 'developer') {\n if (messages.length) fail('unsupported_content', 'Mid-conversation system instructions cannot be relocated safely');\n system.push(typeof msg.content === 'string' ? msg.content : (msg.content as JsonRecord[]).map(p => string(p.text, 'system text')).join(''));\n continue;\n }\n if (msg.role === 'tool') {\n append('user', [{ type: 'tool_result', tool_use_id: msg.tool_call_id, content: msg.content, ...(msg.is_error ? { is_error: true } : {}) }]);\n } else {\n const content: JsonRecord[] = msg.content == null ? [] : typeof msg.content === 'string' ? [{ type: 'text', text: msg.content }] : msg.content as JsonRecord[];\n for (const call of msg.tool_calls as JsonRecord[] ?? []) {\n const fn = call.function as JsonRecord;\n content.push({ type: 'tool_use', id: call.id, name: fn.name, input: argumentObject(fn.arguments as string) });\n }\n append(msg.role as string, content);\n }\n }\n result.messages = messages;\n if (system.length) result.system = system.join('\\n');\n if (maxTokens === undefined) fail('missing_capability', 'Anthropic requires max_output_tokens or capabilities.maxOutputTokens');\n if (body.parallel_tool_calls !== undefined) {\n result.tool_choice = { ...record(result.tool_choice ?? { type: 'auto' }, 'tool_choice'), disable_parallel_tool_use: body.parallel_tool_calls === false };\n delete result.parallel_tool_calls;\n }\n }\n return { body: result, toolNames };\n}\n",
15
+ "export type ResponsesProtocol = 'chat_completions' | 'anthropic_messages';\nexport type JsonRecord = Record<string, unknown>;\nexport interface ResponsesToolName { name: string; namespace?: string; custom: boolean }\n/** Per-request wire-name authority; never infer namespaces by splitting a provider name. */\nexport type ResponsesToolNames = ReadonlyMap<string, ResponsesToolName>;\nexport interface ResponsesCodecLimits {\n maxRequestBytes: number;\n maxOutputBytes: number;\n maxArgumentBytes: number;\n maxItems: number;\n}\nexport const DEFAULT_RESPONSES_CODEC_LIMITS: Readonly<ResponsesCodecLimits> = Object.freeze({\n maxRequestBytes: 8 * 1024 * 1024,\n maxOutputBytes: 8 * 1024 * 1024,\n maxArgumentBytes: 1024 * 1024,\n maxItems: 1024,\n});\nexport interface ResponsesCodecCapabilities {\n reasoningEffort?: boolean;\n /** Plain reasoning history support is independent of effort parameter mapping. */\n reasoningHistory?: boolean;\n /** Codex declares optional hosted search even when the selected model has no search backend. */\n omitOptionalWebSearch?: boolean;\n /** Explicit provider-approved thinking budget; do not guess budgets from effort labels. */\n anthropicThinkingBudget?: number;\n maxOutputTokens?: number;\n limits?: Partial<ResponsesCodecLimits>;\n}\nexport interface ResponsesConversionDiagnostic {\n param: string;\n action: 'mapped' | 'omitted';\n reason: string;\n}\nexport class ResponsesCodecError extends Error {\n constructor(readonly code: string, message: string, readonly param?: string) { super(message); this.name = 'ResponsesCodecError'; }\n}\nexport function fail(code: string, message: string, param?: string): never { throw new ResponsesCodecError(code, message, param); }\nexport function atParam<T>(param: string, run: () => T): T {\n try { return run(); } catch (error) {\n if (error instanceof ResponsesCodecError && error.param === undefined) throw new ResponsesCodecError(error.code, error.message, param);\n throw error;\n }\n}\nexport function record(value: unknown, where: string): JsonRecord {\n if (!value || typeof value !== 'object' || Array.isArray(value)) fail('invalid_payload', `${where} must be an object`);\n return value as JsonRecord;\n}\nexport function string(value: unknown, where: string, nonempty = false): string {\n if (typeof value !== 'string' || (nonempty && !value)) fail('invalid_payload', `${where} must be a${nonempty ? ' non-empty' : ''} string`);\n return value;\n}\nexport function list(value: unknown, where: string): unknown[] {\n if (!Array.isArray(value)) fail('invalid_payload', `${where} must be an array`);\n return value;\n}\nexport function limits(overrides?: Partial<ResponsesCodecLimits>): ResponsesCodecLimits {\n const result = { ...DEFAULT_RESPONSES_CODEC_LIMITS, ...overrides };\n for (const [key, value] of Object.entries(result)) {\n if (!Number.isSafeInteger(value) || value <= 0) fail('invalid_limit', `${key} must be a positive integer`);\n }\n return result;\n}\nexport function bytes(value: string): number { return new TextEncoder().encode(value).byteLength; }\nexport function bounded(value: string, max: number, where: string): string {\n if (bytes(value) > max) fail('resource_limit', `${where} exceeds ${max} bytes`);\n return value;\n}\nexport function serialized(value: unknown, max: number, where: string): string {\n let result: string | undefined;\n try { result = JSON.stringify(value); } catch { fail('invalid_payload', `${where} must be serializable JSON`); }\n if (result === undefined) fail('invalid_payload', `${where} must be serializable JSON`);\n return bounded(result, max, where);\n}\nexport function argumentObject(text: string): JsonRecord {\n let value: unknown;\n try { value = JSON.parse(text); } catch { fail('invalid_tool_arguments', 'Tool arguments must be complete JSON'); }\n return record(value, 'tool arguments');\n}\nexport function restoreTool(name: string, names: ResponsesToolNames): ResponsesToolName {\n const result = names.get(name);\n if (result) return result;\n if (names.size) fail('unknown_tool', `Provider returned undeclared tool ${name}`);\n return { name, custom: false };\n}\nexport function customInput(text: string): string {\n const value = argumentObject(text);\n if (Object.keys(value).length !== 1 || typeof value.input !== 'string') {\n fail('invalid_tool_arguments', 'Custom tools require exactly one string input property');\n }\n return value.input;\n}\n/** Decode only complete JSON-string characters. A split escape remains buffered. */\nexport function customInputPrefix(text: string): string {\n const prefix = /^\\s*\\{\\s*\"input\"\\s*:\\s*\"/.exec(text);\n if (!prefix) return '';\n let result = '';\n for (let i = prefix[0].length; i < text.length;) {\n const char = text[i];\n if (char === '\"') break;\n if (char !== '\\\\') { if (char.charCodeAt(0) < 32) fail('invalid_tool_arguments', 'Invalid JSON string character'); result += char; i++; continue; }\n const escape = text[i + 1];\n if (escape === undefined) break;\n const size = escape === 'u' ? 6 : 2;\n if (i + size > text.length) break;\n try { result += JSON.parse(`\"${text.slice(i, i + size)}\"`); } catch { fail('invalid_tool_arguments', 'Invalid JSON string escape'); }\n i += size;\n }\n return result;\n}\nexport interface Terminal { status: 'completed' | 'incomplete' | 'failed'; reason: string }\nexport function terminal(reason: unknown, protocol: ResponsesProtocol): Terminal {\n if (typeof reason !== 'string' || !reason) fail('missing_terminal', 'Upstream has no explicit completion reason');\n const completed = protocol === 'chat_completions' ? ['stop', 'tool_calls', 'function_call'] : ['end_turn', 'tool_use', 'stop_sequence'];\n if (completed.includes(reason)) return { status: 'completed', reason };\n if (reason === 'length' || reason === 'max_tokens' || reason === 'model_context_window_exceeded') return { status: 'incomplete', reason: 'max_output_tokens' };\n if (reason === 'content_filter' || reason === 'refusal') return { status: 'incomplete', reason: 'content_filter' };\n if (reason === 'error') return { status: 'failed', reason: 'upstream_error' };\n fail('unknown_terminal', `Unsupported upstream completion reason: ${reason}`);\n}\nfunction tokens(value: unknown, where: string): number {\n if (value === undefined) return 0;\n if (!Number.isSafeInteger(value) || (value as number) < 0) fail('invalid_usage', `${where} must be a non-negative integer`);\n return value as number;\n}\nexport function normalizeUsage(raw: unknown, protocol: ResponsesProtocol, prior: JsonRecord = {}): JsonRecord {\n if (raw === undefined || raw === null) return prior;\n const usage = record(raw, 'usage');\n const chat = protocol === 'chat_completions';\n const input = tokens(usage[chat ? 'prompt_tokens' : 'input_tokens'] ?? prior.input_tokens, 'input_tokens');\n const output = tokens(usage[chat ? 'completion_tokens' : 'output_tokens'] ?? prior.output_tokens, 'output_tokens');\n const details = chat ? usage.prompt_tokens_details : undefined;\n const cached = chat ? (details ? record(details, 'prompt_tokens_details').cached_tokens : undefined) : usage.cache_read_input_tokens;\n // Anthropic input_tokens excludes both cache classes; Responses input_tokens includes them.\n const cacheRead = tokens(cached ?? (prior.input_tokens_details as JsonRecord | undefined)?.cached_tokens, 'cached_tokens');\n const cacheWrite = chat ? 0 : tokens(usage.cache_creation_input_tokens, 'cache_creation_input_tokens');\n const totalInput = chat ? input : (usage.input_tokens === undefined ? input : input + cacheRead + cacheWrite);\n const reasoning = chat && usage.completion_tokens_details ? record(usage.completion_tokens_details, 'completion_tokens_details').reasoning_tokens : undefined;\n return { input_tokens: totalInput, output_tokens: output, total_tokens: totalInput + output,\n input_tokens_details: { cached_tokens: cacheRead },\n output_tokens_details: { reasoning_tokens: tokens(reasoning ?? (prior.output_tokens_details as JsonRecord | undefined)?.reasoning_tokens, 'reasoning_tokens') } };\n}\nexport function toolItem(id: string, name: string, args: string, names: ResponsesToolNames, status = 'completed'): JsonRecord {\n const original = restoreTool(name, names);\n const item: JsonRecord = { id: `fc_${id}`, type: original.custom ? 'custom_tool_call' : 'function_call', call_id: id, name: original.name, status };\n if (original.namespace) item.namespace = original.namespace;\n if (original.custom) item.input = customInput(args); else { argumentObject(args); item.arguments = args; }\n return item;\n}\nexport function responsePayload(id: string, model: string, output: JsonRecord[], end: Terminal, usage: JsonRecord, error?: unknown, createdAt = Math.floor(Date.now() / 1000)): JsonRecord {\n const result: JsonRecord = { id, object: 'response', created_at: createdAt, model, status: end.status, output, usage: Object.keys(usage).length ? usage : null };\n if (end.status === 'incomplete') result.incomplete_details = { reason: end.reason };\n if (end.status === 'failed') result.error = error ?? { code: end.reason, message: end.reason };\n return result;\n}\n",
16
+ "import { atParam, fail, record, string, type JsonRecord, type ResponsesCodecCapabilities,\n type ResponsesConversionDiagnostic, type ResponsesProtocol } from './common';\n\nfunction fields(value: JsonRecord, allowed: readonly string[], path: string): void {\n for (const key of Object.keys(value)) if (!allowed.includes(key)) {\n // Do not echo a caller-controlled key or its value in the message.\n fail('unsupported_request', 'Unrecognized request option', `${path}.${key}`);\n }\n}\n\n/** Known preferences may be omitted; output constraints are handled by the request renderer. */\nexport function applyResponsesPreferences(body: JsonRecord, result: JsonRecord, protocol: ResponsesProtocol,\n capabilities: ResponsesCodecCapabilities, maxTokens: unknown, diagnostics: ResponsesConversionDiagnostic[]): void {\n const note = (param: string, action: 'mapped' | 'omitted', reason: string) => diagnostics.push({param, action, reason});\n if (body.stream_options !== undefined) atParam('stream_options', () => {\n const options = record(body.stream_options, 'stream_options');\n fields(options, ['include_usage', 'reasoning_summary_delivery'], 'stream_options');\n if (options.include_usage !== undefined) {\n if (typeof options.include_usage !== 'boolean') fail('invalid_payload', 'Usage preference must be boolean', 'stream_options.include_usage');\n note('stream_options.include_usage', protocol === 'chat_completions' && body.stream === true ? 'mapped' : 'omitted',\n protocol === 'chat_completions' && body.stream === true ? 'stream_usage_required' : 'target_usage_events');\n }\n if (options.reasoning_summary_delivery !== undefined) {\n if (options.reasoning_summary_delivery !== 'sequential_cutoff') fail('unsupported_request', 'Unsupported summary delivery preference', 'stream_options.reasoning_summary_delivery');\n note('stream_options.reasoning_summary_delivery', 'omitted', 'source_summary_delivery_not_applicable');\n }\n });\n if (body.access_programs !== undefined) atParam('access_programs', () => {\n const programs = record(body.access_programs, 'access_programs');\n fields(programs, ['cyber'], 'access_programs');\n if (programs.cyber !== undefined && programs.cyber !== 'standard') {\n if (programs.cyber === 'daybreak_blue' || programs.cyber === 'daybreak_red') {\n fail('unsupported_access_program', 'Selected access program cannot be represented by the target protocol', 'access_programs.cyber');\n }\n fail('invalid_payload', 'Invalid access program', 'access_programs.cyber');\n }\n note('access_programs', 'omitted', 'target_uses_own_access_policy');\n });\n if (body.reasoning !== undefined) atParam('reasoning', () => {\n const reasoning = record(body.reasoning, 'reasoning');\n fields(reasoning, ['effort', 'summary', 'context'], 'reasoning');\n if (reasoning.summary !== undefined) {\n if (typeof reasoning.summary !== 'string' || !['none', 'auto', 'concise', 'detailed'].includes(reasoning.summary)) fail('invalid_payload', 'Invalid reasoning summary preference', 'reasoning.summary');\n note('reasoning.summary', 'omitted', 'target_summary_not_guaranteed');\n }\n if (reasoning.context !== undefined) {\n if (reasoning.context !== 'all_turns') fail('unsupported_reasoning', 'Unsupported reasoning context preference', 'reasoning.context');\n note('reasoning.context', 'omitted', 'source_reasoning_context_not_applicable');\n }\n if (reasoning.effort !== undefined) atParam('reasoning.effort', () => {\n const effort = string(reasoning.effort, 'reasoning effort', true);\n if (protocol === 'chat_completions' && capabilities.reasoningEffort) {\n result.reasoning_effort = effort;\n note('reasoning.effort', 'mapped', 'target_reasoning_effort');\n } else if (protocol === 'anthropic_messages' && capabilities.anthropicThinkingBudget !== undefined && effort !== 'none') {\n const budget = capabilities.anthropicThinkingBudget;\n if (!Number.isSafeInteger(budget) || budget < 1024 || typeof maxTokens !== 'number' || budget >= maxTokens) {\n fail('unsupported_reasoning', 'Anthropic thinking requires an explicit budget below max_output_tokens');\n }\n result.thinking = {type: 'enabled', budget_tokens: budget};\n note('reasoning.effort', 'mapped', 'explicit_target_thinking_budget');\n } else note('reasoning.effort', 'omitted', 'target_reasoning_effort_unavailable');\n });\n });\n if (body.text !== undefined) atParam('text', () => {\n const text = record(body.text, 'text');\n fields(text, ['verbosity', 'format'], 'text');\n if (text.verbosity !== undefined) {\n if (typeof text.verbosity !== 'string' || !['low', 'medium', 'high'].includes(text.verbosity)) fail('invalid_payload', 'Invalid text verbosity preference', 'text.verbosity');\n note('text.verbosity', 'omitted', 'target_verbosity_not_available');\n }\n });\n}\n",
17
+ "import { OpenAIProtocolConversion } from '../providers/openai/protocol-conversion';\nimport { argumentObject, atParam, bounded, fail, limits, list, record, serialized, string,\n type JsonRecord, type ResponsesCodecCapabilities, type ResponsesConversionDiagnostic, type ResponsesProtocol, type ResponsesToolName, type ResponsesToolNames } from './common';\nimport { applyResponsesPreferences } from './request-preferences';\n\nconst contentNormalizer = new OpenAIProtocolConversion({ trimWhitespace: false });\n\nexport interface DecodedResponsesRequest {\n body: JsonRecord;\n toolNames: ResponsesToolNames;\n canonicalInput: JsonRecord[];\n diagnostics: ResponsesConversionDiagnostic[];\n}\n\n// Compare JSON definitions independently of object key order; arrays retain their order.\nfunction definitionKey(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(definitionKey).join(',')}]`;\n if (value && typeof value === 'object') return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${definitionKey((value as JsonRecord)[key])}`).join(',')}}`;\n return JSON.stringify(value);\n}\n\n/** Converts only self-contained history. Reference resolution belongs to the caller. */\nexport function decodeResponsesRequest(raw: unknown, protocol: ResponsesProtocol, capabilities: ResponsesCodecCapabilities = {}): DecodedResponsesRequest {\n const body = record(raw, 'Responses request');\n const budget = limits(capabilities.limits);\n serialized(body, budget.maxRequestBytes, 'request');\n const supported = new Set(['model', 'input', 'instructions', 'tools', 'tool_choice', 'reasoning', 'text',\n 'stream', 'temperature', 'top_p', 'parallel_tool_calls', 'metadata', 'max_output_tokens',\n 'previous_response_id', 'conversation', 'response_id', 'background', 'n', 'truncation', 'include', 'store', 'prompt_cache_key', 'client_metadata', 'stream_options', 'access_programs']);\n for (const key of Object.keys(body)) if (!supported.has(key)) fail('unsupported_request', 'Unrecognized Responses request field', key);\n if (body.store === true) fail('unsupported_request', 'Stored Responses require caller-owned persistence');\n for (const key of ['previous_response_id', 'conversation', 'response_id']) {\n if (body[key] != null) fail('unresolved_reference', `${key} must be resolved before protocol conversion`);\n }\n if (body.background === true) fail('unsupported_request', 'Background Responses cannot be represented by this codec');\n if (body.n !== undefined && body.n !== 1) fail('unsupported_request', 'Only one response candidate is supported');\n if (body.truncation !== undefined && body.truncation !== 'disabled') fail('unsupported_request', 'Automatic input truncation cannot be represented');\n // This asks for encrypted output if available; it does not supply opaque input history.\n // Converted providers return no encrypted output. Actual encrypted input remains rejected below.\n if (body.include !== undefined && list(body.include, 'include').some(field => field !== 'reasoning.encrypted_content')) fail('unsupported_request', 'Requested extra Responses output fields cannot be represented');\n if (body.prompt_cache_key !== undefined) string(body.prompt_cache_key, 'prompt_cache_key');\n if (body.client_metadata !== undefined) record(body.client_metadata, 'client_metadata');\n const model = string(body.model, 'model', true);\n const diagnostics: ResponsesConversionDiagnostic[] = [];\n const input = atParam('input', () => typeof body.input === 'string' ? [{ role: 'user', content: body.input }] : list(body.input, 'input'));\n if (input.length > budget.maxItems) fail('resource_limit', 'Too many input items', 'input');\n const canonicalInput: JsonRecord[] = [];\n const toolNames = new Map<string, ResponsesToolName>();\n const byOriginal = new Map<string, string>();\n const definitions = new Map<string, string>();\n let examinedTools = 0;\n const tools: JsonRecord[] = [];\n const identity = (name: string, namespace?: string) => JSON.stringify([namespace ?? null, name]);\n const register = (name: string, namespace: string | undefined, custom: boolean): string => {\n const key = identity(name, namespace);\n if (byOriginal.has(key)) fail('tool_name_collision', 'Duplicate tool identity');\n if (toolNames.size >= budget.maxItems) fail('resource_limit', 'Too many tools');\n // Always use short opaque names: arbitrary Unicode/namespace names and collisions are reversible.\n const wire = `bungee_tool_${toolNames.size}`;\n toolNames.set(wire, { name, namespace, custom }); byOriginal.set(key, wire);\n return wire;\n };\n const expandTool = (rawTool: unknown, namespace?: string, path = 'tools'): void => {\n if (++examinedTools > budget.maxItems) fail('resource_limit', 'Too many tool declarations');\n const tool = record(rawTool, 'tool');\n if (namespace === undefined && capabilities.omitOptionalWebSearch && ['web_search','web_search_preview'].includes(String(tool.type))\n && (body.tool_choice === undefined || body.tool_choice === 'auto' || body.tool_choice === 'none')) return;\n const allowed = tool.type === 'namespace' ? ['type','name','description','tools']\n : tool.type === 'custom' ? ['type','name','description','format'] : ['type','name','description','parameters','strict'];\n for (const key of Object.keys(tool)) if (!allowed.includes(key)) fail('unsupported_tool', 'Unsupported tool definition field', `${path}.${key}`);\n if (tool.type === 'namespace') {\n if (namespace !== undefined) fail('unsupported_tool', 'Nested tool namespaces are not supported');\n const name = string(tool.name, 'namespace name', true);\n for (const [index, child] of list(tool.tools, 'namespace tools').entries()) {\n const childPath = `${path}.tools[${index}]`;\n atParam(childPath, () => expandTool(child, name, childPath));\n }\n return;\n }\n if (tool.type !== 'function' && tool.type !== 'custom') fail('unsupported_tool', 'This tool type cannot be executed by Codex through the target protocol');\n serialized(tool, budget.maxArgumentBytes, 'tool definition');\n const name = string(tool.name, 'tool name', true);\n const custom = tool.type === 'custom';\n if (tool.strict !== undefined && typeof tool.strict !== 'boolean') fail('invalid_payload', 'Tool strict must be boolean');\n if (protocol === 'anthropic_messages' && tool.strict === true) fail('unsupported_tool', 'Anthropic strict tool enforcement requires an explicit provider capability');\n if (custom && tool.format !== undefined) {\n const format = record(tool.format, 'custom format');\n if (format.type !== 'text' && format.type !== 'grammar') fail('unsupported_tool', 'Unknown custom tool format');\n }\n const key = identity(name, namespace);\n const signature = definitionKey(tool);\n if (definitions.has(key)) {\n if (definitions.get(key) !== signature) fail('tool_name_collision', 'Conflicting definitions for the same tool identity');\n return;\n }\n const wire = register(name, namespace, custom);\n definitions.set(key, signature);\n const parameters = custom\n ? { type: 'object', properties: { input: { type: 'string' } }, required: ['input'], additionalProperties: false }\n : record(tool.parameters ?? { type: 'object', properties: {} }, 'tool parameters');\n const description = tool.description === undefined ? undefined : string(tool.description, 'tool description');\n const customHint = custom ? `Pass the complete original custom tool input verbatim in the input string.${tool.format ? ` Original input format: ${JSON.stringify(tool.format)}` : ''}` : undefined;\n if (protocol === 'chat_completions') {\n tools.push({ type: 'function', function: { name: wire, parameters, ...(description || customHint ? { description: [description, customHint].filter(Boolean).join('\\n') } : {}), ...(tool.strict !== undefined ? { strict: tool.strict } : {}) } });\n } else {\n tools.push({ name: wire, input_schema: parameters, ...(description || customHint ? { description: [description, customHint].filter(Boolean).join('\\n') } : {}) });\n }\n };\n if (body.tools !== undefined) atParam('tools', () => {\n for (const [index, tool] of list(body.tools, 'tools').entries()) atParam(`tools[${index}]`, () => expandTool(tool, undefined, `tools[${index}]`));\n });\n // Behavior reference: cc-switch b4a0794 collect_input_declared_tools. Tool carriers\n // are declarations, not messages. Use this codec's existing reversible name authority.\n for (const [index, rawItem] of input.entries()) atParam(`input[${index}]`, () => {\n const item = record(rawItem, 'input item');\n if (item.type !== 'additional_tools') { canonicalInput.push(item); return; }\n if (item.content !== undefined) fail('invalid_payload', 'A tool declaration carrier cannot also contain message content', `input[${index}].content`);\n for (const [toolIndex, tool] of list(item.tools, 'additional tools').entries()) {\n const toolPath = `input[${index}].tools[${toolIndex}]`;\n atParam(toolPath, () => expandTool(tool, undefined, toolPath));\n }\n });\n const resolve = (item: JsonRecord, custom: boolean): string => {\n const name = string(item.name, 'call name', true);\n const namespace = item.namespace === undefined ? undefined : string(item.namespace, 'call namespace', true);\n let wire = byOriginal.get(identity(name, namespace));\n // Historical calls need not appear in today's tool declarations. Preserve them in the same authority.\n if (wire === undefined) wire = register(name, namespace, custom);\n if (toolNames.get(wire)!.custom !== custom) fail('tool_name_collision', 'Historical tool kind conflicts with its current declaration');\n return wire;\n };\n const normalizeContent = (rawContent: unknown, role: string): unknown => {\n if (typeof rawContent === 'string') return rawContent;\n const parts = list(rawContent, 'message content');\n for (const rawPart of parts) {\n const part = record(rawPart, 'content part');\n if (part.type === 'input_text' || part.type === 'output_text' || part.type === 'text') string(part.text, 'content text');\n else if (part.type === 'refusal' && role === 'assistant') string(part.refusal,'refusal');\n else if (part.type === 'input_image' && role === 'user') {\n if (protocol !== 'chat_completions') fail('unsupported_content', 'Anthropic image conversion requires provider-specific URL/data support');\n string(part.image_url, 'image_url', true);\n if (part.detail !== undefined && !['auto', 'low', 'high'].includes(String(part.detail))) fail('unsupported_content', 'Unknown image detail');\n } else fail('unsupported_content', 'Unsupported message content type');\n if (part.annotations !== undefined && list(part.annotations, 'annotations').length) fail('unsupported_content', 'Output annotations cannot be represented in input history');\n }\n // Reuse the existing text/image normalizer only after validating every part.\n const normalized = contentNormalizer.normalizeResponsesMessageContent(parts.map(raw=>{const part=raw as JsonRecord;return part.type==='refusal'?{type:'output_text',text:part.refusal}:part;})) as JsonRecord[];\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i] as JsonRecord;\n if (part.type === 'input_image' && part.detail !== undefined) (normalized[i].image_url as JsonRecord).detail = part.detail;\n }\n return normalized;\n };\n const chat: JsonRecord[] = [];\n const messageParams = new WeakMap<JsonRecord, string>();\n let messageParam = 'instructions';\n const callIds = new Set<string>();\n const answered = new Set<string>();\n let pendingReasoning = '';\n const addMessage = (message: JsonRecord): void => {\n if (chat.length >= budget.maxItems) fail('resource_limit', 'Too many input messages');\n chat.push(message);\n messageParams.set(message, messageParam);\n };\n if (body.instructions !== undefined) addMessage({ role: 'system', content: string(body.instructions, 'instructions') });\n for (const [inputIndex, rawItem] of input.entries()) atParam(`input[${inputIndex}]`, () => {\n messageParam = `input[${inputIndex}]`;\n const item = record(rawItem, 'input item');\n if (item.type === 'additional_tools') return;\n if (item.encrypted_content != null || item.type === 'compaction') fail('unsupported_content', 'Encrypted reasoning and compaction cannot be restored');\n if (item.type === 'item_reference') fail('unresolved_reference', 'Input item references must be resolved before conversion');\n if (item.type === 'reasoning') {\n if (protocol !== 'chat_completions' || !(capabilities.reasoningHistory || capabilities.reasoningEffort)) fail('unsupported_reasoning', 'Reasoning history requires an explicit compatible reasoning capability');\n if (item.content != null) fail('unsupported_reasoning', 'Reasoning content requires an explicit history mapping', `${messageParam}.content`);\n const summary = list(item.summary, 'reasoning summary');\n pendingReasoning += summary.map(part => { const p = record(part, 'reasoning summary'); if (p.type !== 'summary_text') fail('unsupported_reasoning', 'Unknown reasoning summary'); return string(p.text, 'summary text'); }).join('');\n return;\n }\n if (item.type === 'function_call' || item.type === 'custom_tool_call') {\n const custom = item.type === 'custom_tool_call';\n const id = string(item.call_id, 'call_id', true);\n if (callIds.has(id)) fail('invalid_tool_history', 'Duplicate tool call identifier');\n callIds.add(id);\n const args = custom ? JSON.stringify({ input: string(item.input, 'custom input') }) : string(item.arguments, 'arguments');\n bounded(args, budget.maxArgumentBytes, 'arguments'); argumentObject(args);\n const call = { id, type: 'function', function: { name: resolve(item, custom), arguments: args } };\n const previous = chat.at(-1);\n if (previous?.role === 'assistant') {\n previous.tool_calls = [...(previous.tool_calls as JsonRecord[] ?? []), call];\n if (pendingReasoning) previous.reasoning_content = pendingReasoning;\n } else addMessage({ role: 'assistant', content: null, tool_calls: [call], ...(pendingReasoning ? { reasoning_content: pendingReasoning } : {}) });\n pendingReasoning = '';\n return;\n }\n if (item.type === 'function_call_output' || item.type === 'custom_tool_call_output') {\n const id = string(item.call_id, 'call_id', true);\n if (!callIds.has(id) || answered.has(id)) fail('invalid_tool_history', 'Unmatched or duplicate tool result');\n answered.add(id);\n const output = typeof item.output === 'string' ? item.output : normalizeContent(item.output, 'tool');\n addMessage({ role: 'tool', tool_call_id: id, content: output, ...(item.is_error === true ? { is_error: true } : {}) });\n return;\n }\n if (item.type !== undefined && item.type !== 'message') fail('unsupported_content', 'Unsupported input item type');\n const role = string(item.role, 'message role', true);\n if (!['user', 'assistant', 'system', 'developer'].includes(role)) fail('unsupported_content', 'Unknown message role');\n const message: JsonRecord = { role, content: normalizeContent(item.content, role) };\n if (pendingReasoning) { if (role !== 'assistant') fail('unsupported_reasoning', 'Reasoning must precede an assistant item'); message.reasoning_content = pendingReasoning; pendingReasoning = ''; }\n addMessage(message);\n });\n if (pendingReasoning) fail('unsupported_reasoning', 'Orphan reasoning history cannot be represented');\n const result: JsonRecord = { model, messages: chat };\n for (const key of ['stream', 'temperature', 'top_p', 'parallel_tool_calls', 'metadata']) if (body[key] !== undefined) result[key] = body[key];\n if (protocol === 'chat_completions' && body.stream === true) result.stream_options = { include_usage: true };\n const maxTokens = body.max_output_tokens ?? capabilities.maxOutputTokens;\n if (maxTokens !== undefined) {\n if (!Number.isSafeInteger(maxTokens) || (maxTokens as number) <= 0) fail('invalid_payload', 'max_output_tokens must be a positive integer');\n result[protocol === 'chat_completions' ? 'max_completion_tokens' : 'max_tokens'] = maxTokens;\n }\n if (tools.length) result.tools = tools;\n if (body.tool_choice !== undefined) {\n const choice = body.tool_choice;\n if (typeof choice === 'string') {\n if (!['auto', 'none', 'required'].includes(choice)) fail('unsupported_tool_choice', `Unsupported tool choice ${choice}`);\n result.tool_choice = protocol === 'chat_completions' ? choice : { type: choice === 'required' ? 'any' : choice };\n } else {\n const c = record(choice, 'tool_choice');\n if (c.type !== 'function' && c.type !== 'custom') fail('unsupported_tool_choice', 'Forced hosted tools are unsupported');\n const wire = byOriginal.get(identity(string(c.name, 'tool choice name', true), c.namespace === undefined ? undefined : string(c.namespace, 'tool choice namespace')));\n if (!wire || !tools.some(t => t.name === wire || (t.function as JsonRecord | undefined)?.name === wire)) fail('unsupported_tool_choice', 'Forced tool is not declared');\n result.tool_choice = protocol === 'chat_completions' ? { type: 'function', function: { name: wire } } : { type: 'tool', name: wire };\n }\n }\n applyResponsesPreferences(body, result, protocol, capabilities, maxTokens, diagnostics);\n if (body.text !== undefined) atParam('text.format', () => {\n const text = record(body.text, 'text');\n if (text.format !== undefined) {\n const format = record(text.format, 'text format');\n const allowed = format.type === 'json_schema' ? ['type','name','schema','strict','description'] : ['type'];\n for (const key of Object.keys(format)) if (!allowed.includes(key)) fail('unsupported_request', 'Unsupported output format field', `text.format.${key}`);\n if (format.type === 'json_schema') {\n atParam('text.format.name', () => string(format.name, 'output schema name', true));\n atParam('text.format.schema', () => record(format.schema, 'output schema'));\n if (format.strict !== undefined && typeof format.strict !== 'boolean') fail('invalid_payload', 'Output schema strict must be boolean', 'text.format.strict');\n if (format.description !== undefined) atParam('text.format.description', () => string(format.description, 'output schema description'));\n }\n if (protocol !== 'chat_completions' && format.type !== 'text') fail('unsupported_request', 'Anthropic structured output requires a separate provider capability');\n if (format.type === 'json_schema') result.response_format = { type: 'json_schema', json_schema: { name: format.name, schema: format.schema, ...(format.strict !== undefined ? { strict: format.strict } : {}), ...(format.description !== undefined ? { description: format.description } : {}) } };\n else if (format.type === 'json_object' || format.type === 'text') { if (protocol === 'chat_completions') result.response_format = format; }\n else fail('unsupported_request', 'Unknown text format');\n }\n });\n if (protocol === 'anthropic_messages') {\n const system: string[] = [];\n const messages: JsonRecord[] = [];\n const append = (role: string, content: JsonRecord[]): void => {\n const previous = messages.at(-1);\n if (previous?.role === role) (previous.content as JsonRecord[]).push(...content);\n else messages.push({ role, content });\n };\n for (const msg of chat) {\n if (msg.role === 'system' || msg.role === 'developer') {\n if (messages.length) fail('unsupported_content', 'Mid-conversation system instructions cannot be relocated safely', `${messageParams.get(msg)}.role`);\n system.push(typeof msg.content === 'string' ? msg.content : (msg.content as JsonRecord[]).map(p => string(p.text, 'system text')).join(''));\n continue;\n }\n if (msg.role === 'tool') {\n append('user', [{ type: 'tool_result', tool_use_id: msg.tool_call_id, content: msg.content, ...(msg.is_error ? { is_error: true } : {}) }]);\n } else {\n const content: JsonRecord[] = msg.content == null ? [] : typeof msg.content === 'string' ? [{ type: 'text', text: msg.content }] : msg.content as JsonRecord[];\n for (const call of msg.tool_calls as JsonRecord[] ?? []) {\n const fn = call.function as JsonRecord;\n content.push({ type: 'tool_use', id: call.id, name: fn.name, input: argumentObject(fn.arguments as string) });\n }\n append(msg.role as string, content);\n }\n }\n result.messages = messages;\n if (system.length) result.system = system.join('\\n');\n if (maxTokens === undefined) fail('missing_capability', 'Anthropic requires max_output_tokens or capabilities.maxOutputTokens');\n if (body.parallel_tool_calls !== undefined) {\n result.tool_choice = { ...record(result.tool_choice ?? { type: 'auto' }, 'tool_choice'), disable_parallel_tool_use: body.parallel_tool_calls === false };\n delete result.parallel_tool_calls;\n }\n }\n return { body: result, toolNames, canonicalInput, diagnostics };\n}\n",
17
18
  "import { argumentObject, bounded, bytes, customInput, customInputPrefix, fail, limits, list, normalizeUsage, record, responsePayload, restoreTool, serialized, string, terminal, toolItem,\n type JsonRecord, type ResponsesCodecLimits, type ResponsesProtocol, type ResponsesToolName, type ResponsesToolNames, type Terminal } from './common';\n\ninterface OutputState {\n key: string; index: number; kind: 'text' | 'reasoning' | 'tool' | 'refusal'; id: string;\n text: string; name: string; callId: string; args: string; emittedInput: string;\n original?: ResponsesToolName; added: boolean; closed: boolean;\n}\n\n/** Incremental payload codec. SSE framing and transport cancellation remain caller-owned.\n * Chat terminal is deferred until finish() so trailing usage-only chunks are retained.\n * Anthropic additionally requires message_stop, not merely a stop_reason in message_delta.\n */\nexport class ResponsesEventEncoder {\n private readonly budget: ResponsesCodecLimits;\n private readonly id = `resp_${crypto.randomUUID().replaceAll('-', '')}`;\n private readonly createdAt = Math.floor(Date.now() / 1000);\n private readonly output: OutputState[] = [];\n private readonly states = new Map<string, OutputState>();\n private readonly anthropicBlocks = new Map<number, OutputState>();\n private usage: JsonRecord = {};\n private end?: Terminal;\n private error?: unknown;\n private started = false;\n private anthropicStarted = false;\n private anthropicStopped = false;\n private finalized = false;\n private poisoned = false;\n private sequence = 0;\n private retained = 0;\n\n constructor(readonly protocol: ResponsesProtocol, readonly model: string,\n readonly toolNames: ResponsesToolNames = new Map(), configuredLimits?: Partial<ResponsesCodecLimits>) {\n this.budget = limits(configuredLimits);\n }\n\n private event(type: string, fields: JsonRecord = {}): JsonRecord {\n return { type, sequence_number: this.sequence++, ...fields };\n }\n private start(events: JsonRecord[]): void {\n if (this.started) return;\n this.started = true;\n const payload = { id: this.id, object: 'response', created_at: this.createdAt, model: this.model, status: 'in_progress', output: [], usage: null };\n events.push(this.event('response.created', { response: payload }), this.event('response.in_progress', { response: { ...payload } }));\n }\n private retain(text: string): void {\n this.retained += bytes(text);\n if (this.retained > this.budget.maxOutputBytes) fail('resource_limit', 'Accumulated response output exceeds maxOutputBytes');\n }\n private state(key: string, kind: OutputState['kind']): OutputState {\n const existing = this.states.get(key);\n if (existing) { if (existing.kind !== kind) fail('invalid_stream', 'Output item changed kind'); return existing; }\n if (this.output.length >= this.budget.maxItems) fail('resource_limit', 'Too many output items');\n const state: OutputState = { key, index: this.output.length, kind, id: `${this.id}_item_${this.output.length}`, text: '', name: '', callId: '', args: '', emittedInput: '', added: false, closed: false };\n this.states.set(key, state); this.output.push(state); return state;\n }\n private fields(state: OutputState): JsonRecord {\n return { response_id: this.id, item_id: state.id, output_index: state.index };\n }\n private item(state: OutputState, status: string, strict = false): JsonRecord {\n if (state.kind === 'tool') {\n if (strict) return { ...toolItem(state.callId, state.name, state.args || '{}', this.toolNames, status), id: state.id };\n const original = state.original ?? restoreTool(state.name, this.toolNames);\n return { id: state.id, type: original.custom ? 'custom_tool_call' : 'function_call', call_id: state.callId,\n name: original.name, ...(original.namespace ? { namespace: original.namespace } : {}), status,\n ...(original.custom ? { input: state.emittedInput } : { arguments: state.args }) };\n }\n if (state.kind === 'reasoning') return { id: state.id, type: 'reasoning', summary: status === 'in_progress' ? [] : [{ type: 'summary_text', text: state.text }] };\n return { id: state.id, type: 'message', role: 'assistant', status,\n content: status === 'in_progress' ? [] : [this.part(state)] };\n }\n private part(state: OutputState): JsonRecord {\n return state.kind === 'refusal' ? { type: 'refusal', refusal: state.text }\n : state.kind === 'reasoning' ? { type: 'summary_text', text: state.text }\n : { type: 'output_text', text: state.text, annotations: [] };\n }\n private add(state: OutputState, events: JsonRecord[], final = false): void {\n if (state.added) return;\n if (state.kind === 'tool') {\n // Names may arrive in fragments; wait until the exact authority name resolves.\n if (!state.callId || !state.name || (this.toolNames.size && !this.toolNames.has(state.name))) return;\n if (!final && !state.args && [...this.toolNames.keys()].some(name => name !== state.name && name.startsWith(state.name))) return;\n state.original = restoreTool(state.name, this.toolNames);\n }\n state.added = true;\n const initial = this.item(state, 'in_progress');\n if (state.kind === 'tool') { if (state.original?.custom) initial.input = ''; else initial.arguments = ''; }\n events.push(this.event('response.output_item.added', { response_id: this.id, output_index: state.index, item: initial }));\n if (state.kind !== 'tool') {\n const part = state.kind === 'reasoning' ? { type: 'summary_text', text: '' } : state.kind === 'refusal' ? { type: 'refusal', refusal: '' } : { type: 'output_text', text: '', annotations: [] };\n events.push(this.event(state.kind === 'reasoning' ? 'response.reasoning_summary_part.added' : 'response.content_part.added',\n { ...this.fields(state), [state.kind === 'reasoning' ? 'summary_index' : 'content_index']: 0, part }));\n }\n }\n private appendText(state: OutputState, delta: string, events: JsonRecord[]): void {\n if (state.closed) fail('invalid_stream', 'Delta arrived after content block stop');\n this.retain(delta); state.text += delta; this.add(state, events);\n const type = state.kind === 'reasoning' ? 'response.reasoning_summary_text.delta' : state.kind === 'refusal' ? 'response.refusal.delta' : 'response.output_text.delta';\n if (delta) events.push(this.event(type, { ...this.fields(state), [state.kind === 'reasoning' ? 'summary_index' : 'content_index']: 0, delta }));\n }\n private emitArgs(state: OutputState, events: JsonRecord[], fragment = '', first = false): void {\n if (!state.added) return;\n if (state.original?.custom) {\n const prefix = customInputPrefix(state.args);\n if (!prefix.startsWith(state.emittedInput)) fail('invalid_tool_arguments', 'Custom input prefix changed');\n const delta = prefix.slice(state.emittedInput.length);\n state.emittedInput = prefix;\n if (delta) events.push(this.event('response.custom_tool_call_input.delta', { ...this.fields(state), delta }));\n } else {\n const delta = first ? state.args : fragment;\n if (delta) events.push(this.event('response.function_call_arguments.delta', { ...this.fields(state), delta }));\n }\n }\n private toolDelta(state: OutputState, raw: JsonRecord, events: JsonRecord[]): void {\n if (state.closed) fail('invalid_stream', 'Tool delta arrived after content block stop');\n if (raw.id !== undefined) {\n const id = string(raw.id, 'tool call id', true);\n if (state.callId && state.callId !== id) fail('invalid_stream', 'Tool call id changed');\n if (!state.callId) this.retain(id);\n state.callId = id;\n }\n const fn = raw.function === undefined ? {} : record(raw.function, 'tool function');\n if (fn.name !== undefined) {\n const name = string(fn.name, 'tool name');\n if (state.added && name) fail('invalid_stream', 'Tool name changed after output_item.added');\n this.retain(name); state.name += name;\n }\n const args = fn.arguments === undefined ? '' : string(fn.arguments, 'tool arguments delta');\n this.retain(args); state.args = bounded(state.args + args, this.budget.maxArgumentBytes, 'tool arguments');\n const wasAdded = state.added;\n this.add(state, events); this.emitArgs(state, events, args, !wasAdded);\n }\n\n push(raw: unknown): JsonRecord[] {\n if (this.poisoned) fail('invalid_stream', 'Encoder cannot continue after a codec error');\n if (this.finalized) fail('invalid_stream', 'Event arrived after response terminal');\n try {\n const chunk = record(raw, 'stream event');\n serialized(chunk, this.budget.maxOutputBytes, 'stream event');\n const events: JsonRecord[] = [];\n this.start(events);\n if (chunk.error !== undefined || chunk.type === 'error') {\n this.error = record(chunk.error, 'upstream error');\n this.end = { status: 'failed', reason: 'upstream_error' };\n this.anthropicStopped = true;\n return [...events, ...this.complete()];\n }\n if (this.protocol === 'chat_completions') this.chat(chunk, events); else this.anthropic(chunk, events);\n return events;\n } catch (error) { this.poisoned = true; throw error; }\n }\n private chat(chunk: JsonRecord, events: JsonRecord[]): void {\n const choices = list(chunk.choices, 'choices');\n if (choices.length > 1) fail('unsupported_response', 'Multiple response candidates are not supported');\n if (choices.length) {\n const choice = record(choices[0], 'choice');\n if (choice.index !== undefined && choice.index !== 0) fail('unsupported_response', 'Only choice index 0 is supported');\n const delta = record(choice.delta ?? {}, 'choice delta');\n for (const key of Object.keys(delta)) if (!['role', 'content', 'refusal', 'reasoning_content', 'reasoning', 'tool_calls', 'function_call', 'annotations'].includes(key)) fail('unsupported_content', `Unsupported Chat output field ${key}`);\n if (delta.annotations !== undefined && list(delta.annotations, 'annotations').length) fail('unsupported_content', 'Chat output annotations cannot be faithfully converted');\n if (delta.role !== undefined && delta.role !== 'assistant') fail('unsupported_response', 'Response role must be assistant');\n if (this.end && Object.values(delta).some(v => v !== undefined && v !== null && v !== '' && (!Array.isArray(v) || v.length))) fail('invalid_stream', 'Output arrived after finish_reason');\n const reasoning = delta.reasoning_content ?? delta.reasoning;\n if (reasoning !== undefined && reasoning !== null) this.appendText(this.state('reasoning', 'reasoning'), string(reasoning, 'reasoning delta'), events);\n if (delta.content !== undefined && delta.content !== null) this.appendText(this.state('text', 'text'), string(delta.content, 'text delta'), events);\n if (delta.refusal !== undefined && delta.refusal !== null) this.appendText(this.state('refusal', 'refusal'), string(delta.refusal, 'refusal delta'), events);\n if (delta.tool_calls !== undefined) {\n for (const rawTool of list(delta.tool_calls, 'tool_calls')) {\n const tool = record(rawTool, 'tool call');\n if (!Number.isSafeInteger(tool.index) || (tool.index as number) < 0) fail('invalid_stream', 'Streamed tool requires a non-negative integer index');\n if (tool.type !== undefined && tool.type !== 'function') fail('unsupported_tool', 'Unknown upstream tool call type');\n this.toolDelta(this.state(`tool:${tool.index}`, 'tool'), tool, events);\n }\n }\n if (delta.function_call !== undefined) fail('unsupported_response', 'Legacy function_call lacks a stable call_id');\n if (choice.finish_reason !== undefined && choice.finish_reason !== null) {\n const next = terminal(choice.finish_reason, this.protocol);\n if (this.end && (this.end.status !== next.status || this.end.reason !== next.reason)) fail('invalid_stream', 'Conflicting finish reasons');\n this.end = next;\n }\n }\n this.usage = normalizeUsage(chunk.usage, this.protocol, this.usage);\n }\n private anthropic(chunk: JsonRecord, events: JsonRecord[]): void {\n if (chunk.type === 'ping') return;\n if (this.anthropicStopped) fail('invalid_stream', 'Event arrived after message_stop');\n if (chunk.type === 'message_start') {\n if (this.anthropicStarted) fail('invalid_stream', 'Duplicate message_start');\n const message = record(chunk.message, 'message');\n this.anthropicStarted = true;\n this.usage = normalizeUsage(message.usage, this.protocol, this.usage); return;\n }\n if (!this.anthropicStarted) fail('invalid_stream', 'Anthropic event arrived before message_start');\n if (chunk.type === 'message_delta') {\n const delta = record(chunk.delta, 'message delta');\n if (delta.stop_reason != null) {\n const next = terminal(delta.stop_reason, this.protocol);\n if (this.end && (this.end.status !== next.status || this.end.reason !== next.reason)) fail('invalid_stream', 'Conflicting stop reasons');\n this.end = next;\n }\n this.usage = normalizeUsage(chunk.usage, this.protocol, this.usage); return;\n }\n if (chunk.type === 'message_stop') {\n if (!this.end) fail('missing_terminal', 'message_stop has no preceding stop_reason');\n if ([...this.anthropicBlocks.values()].some(s => !s.closed)) fail('invalid_stream', 'message_stop arrived before content_block_stop');\n this.anthropicStopped = true; return;\n }\n if (!Number.isSafeInteger(chunk.index) || (chunk.index as number) < 0) fail('invalid_stream', 'Anthropic content requires a non-negative integer index');\n const index = chunk.index as number;\n if (this.end) fail('invalid_stream', 'Content arrived after stop_reason');\n if (chunk.type === 'content_block_start') {\n if (this.anthropicBlocks.has(index)) fail('invalid_stream', 'Duplicate content_block_start');\n const block = record(chunk.content_block, 'content block');\n const kind = block.type === 'tool_use' ? 'tool' : block.type === 'text' ? 'text' : block.type === 'thinking' ? 'reasoning' : undefined;\n if (!kind) fail('unsupported_content', `Unsupported Anthropic block ${String(block.type)}`);\n const state = this.state(`block:${index}`, kind); this.anthropicBlocks.set(index, state);\n if (kind === 'tool') {\n const input = record(block.input ?? {}, 'tool input');\n this.toolDelta(state, { id: block.id, function: { name: block.name, ...(Object.keys(input).length ? { arguments: serialized(input, this.budget.maxArgumentBytes, 'tool input') } : {}) } }, events);\n } else this.appendText(state, string(block[kind === 'text' ? 'text' : 'thinking'] ?? '', 'block text'), events);\n return;\n }\n const state = this.anthropicBlocks.get(index);\n if (!state || state.closed) fail('invalid_stream', 'Content event has no open block');\n if (chunk.type === 'content_block_stop') { state.closed = true; return; }\n if (chunk.type !== 'content_block_delta') fail('unsupported_response', `Unknown Anthropic event ${String(chunk.type)}`);\n const delta = record(chunk.delta, 'content delta');\n if (delta.type === 'input_json_delta' && state.kind === 'tool') this.toolDelta(state, { function: { arguments: delta.partial_json } }, events);\n else if (delta.type === 'text_delta' && state.kind === 'text') this.appendText(state, string(delta.text, 'text delta'), events);\n else if (delta.type === 'thinking_delta' && state.kind === 'reasoning') this.appendText(state, string(delta.thinking, 'thinking delta'), events);\n else if (delta.type === 'signature_delta' && state.kind === 'reasoning') {\n // Signature is provider-bound replay authority: exposing plain summaries cannot preserve it.\n bounded(string(delta.signature, 'signature'), this.budget.maxArgumentBytes, 'signature');\n } else fail('unsupported_content', `Unsupported content delta ${String(delta.type)}`);\n }\n\n private complete(): JsonRecord[] {\n if (!this.end) fail('missing_terminal', 'Stream ended without an explicit upstream terminal');\n const events: JsonRecord[] = [];\n const items: JsonRecord[] = [];\n const callIds = new Set<string>();\n for (const state of this.output) {\n const strict = this.end.status === 'completed';\n if (state.kind === 'tool') {\n if (!state.callId || !state.name) fail('invalid_tool_arguments', 'Tool call is missing id or name');\n if (callIds.has(state.callId)) fail('invalid_tool_arguments', 'Duplicate provider call_id');\n callIds.add(state.callId);\n state.original ??= restoreTool(state.name, this.toolNames);\n this.add(state, events, true);\n if (!state.added) fail('unknown_tool', `Unknown tool ${state.name}`);\n if (strict) {\n argumentObject(state.args || '{}');\n if (state.original.custom) {\n const text = customInput(state.args);\n if (!text.startsWith(state.emittedInput)) fail('invalid_tool_arguments', 'Custom tool input changed');\n if (text.length > state.emittedInput.length) events.push(this.event('response.custom_tool_call_input.delta', { ...this.fields(state), delta: text.slice(state.emittedInput.length) }));\n state.emittedInput = text;\n }\n }\n }\n const item = this.item(state, this.end.status === 'completed' ? 'completed' : 'incomplete', strict);\n const fields = this.fields(state);\n if (state.kind === 'tool') {\n const custom = state.original!.custom;\n events.push(this.event(custom ? 'response.custom_tool_call_input.done' : 'response.function_call_arguments.done',\n { ...fields, [custom ? 'input' : 'arguments']: custom ? item.input : item.arguments }));\n } else {\n const reasoning = state.kind === 'reasoning';\n const textField = state.kind === 'refusal' ? 'refusal' : 'text';\n events.push(this.event(reasoning ? 'response.reasoning_summary_text.done' : state.kind === 'refusal' ? 'response.refusal.done' : 'response.output_text.done',\n { ...fields, [reasoning ? 'summary_index' : 'content_index']: 0, [textField]: state.text }));\n events.push(this.event(reasoning ? 'response.reasoning_summary_part.done' : 'response.content_part.done',\n { ...fields, [reasoning ? 'summary_index' : 'content_index']: 0, part: this.part(state) }));\n }\n events.push(this.event('response.output_item.done', { response_id: this.id, output_index: state.index, item }));\n items.push(item);\n }\n const response = responsePayload(this.id, this.model, items, this.end, this.usage, this.error, this.createdAt);\n serialized(response, this.budget.maxOutputBytes, 'final response');\n events.push(this.event(`response.${this.end.status}`, { response }));\n this.finalized = true;\n return events;\n }\n finish(): JsonRecord[] {\n if (this.poisoned) fail('invalid_stream', 'Encoder cannot finish after a codec error');\n if (this.finalized) return [];\n try {\n if (this.protocol === 'anthropic_messages' && !this.anthropicStopped) fail('missing_terminal', 'Anthropic stream ended before message_stop');\n return this.complete();\n } catch (error) { this.poisoned = true; throw error; }\n }\n}\n",
18
19
  "import { fail, list, record, serialized, limits, responsePayload, type JsonRecord, type ResponsesCodecLimits, type ResponsesProtocol, type ResponsesToolNames } from './common';\nimport { ResponsesEventEncoder } from './events';\n\n/** JSON and SSE share the same validation and item/terminal semantics. */\nexport function encodeResponsesResult(raw: unknown, protocol: ResponsesProtocol, model: string,\n toolNames: ResponsesToolNames = new Map(), configuredLimits?: Partial<ResponsesCodecLimits>): JsonRecord {\n const body = record(raw, 'upstream response');\n const budget = limits(configuredLimits);\n serialized(body, budget.maxOutputBytes, 'upstream response');\n if (body.error !== undefined || body.type === 'error') return responsePayload(`resp_${crypto.randomUUID().replaceAll('-', '')}`, model, [], { status: 'failed', reason: 'upstream_error' }, {}, record(body.error, 'upstream error'));\n const encoder = new ResponsesEventEncoder(protocol, model, toolNames, configuredLimits);\n if (protocol === 'chat_completions') {\n const choices = list(body.choices, 'choices');\n if (choices.length !== 1) fail('unsupported_response', 'Exactly one response choice is required');\n const choice = record(choices[0], 'choice');\n const message = record(choice.message, 'message');\n const delta: JsonRecord = { ...message };\n if (message.tool_calls !== undefined) delta.tool_calls = list(message.tool_calls, 'tool_calls').map((tool, index) => ({ ...record(tool, 'tool call'), index }));\n encoder.push({ choices: [{ index: choice.index ?? 0, delta, finish_reason: choice.finish_reason }], usage: body.usage });\n } else {\n encoder.push({ type: 'message_start', message: { usage: body.usage } });\n for (const [index, rawBlock] of list(body.content, 'content').entries()) {\n const block = record(rawBlock, 'content block');\n encoder.push({ type: 'content_block_start', index, content_block: block });\n encoder.push({ type: 'content_block_stop', index });\n }\n encoder.push({ type: 'message_delta', delta: { stop_reason: body.stop_reason } });\n encoder.push({ type: 'message_stop' });\n }\n const end = encoder.finish().at(-1);\n if (!end) fail('missing_terminal', 'JSON response has no terminal result');\n return record(end.response, 'Responses result');\n}\n",
20
+ "/** Escape UTF-16 code units so fixed RPC slices never contain lone surrogates. */\nexport function serializeHistory(value:unknown):string {return JSON.stringify(value).replace(/[\\uD800-\\uDFFF]/g,unit=>'\\\\u'+unit.charCodeAt(0).toString(16).padStart(4,'0'));}\n/** Ephemeral control-process cache: no storage/database access, bounded across all workers. */\nexport class HistoryCache {\n private entries = new Map<string,{text:string;bytes:number;expires:number}>();\n private used=0;\n constructor(private limits={maxEntries:512,maxBytes:32*1024*1024,maxEntryBytes:8*1024*1024,ttlMs:600_000},private now=Date.now) {}\n sweep(){for(const [key,entry] of this.entries)if(entry.expires<=this.now()){this.used-=entry.bytes;this.entries.delete(key);}}\n get(scope:string,id:string){this.sweep();const entry=this.entries.get(JSON.stringify([scope,id]));return entry ? JSON.parse(entry.text) : null;}\n readText(scope:string,id:string){this.sweep();return this.entries.get(JSON.stringify([scope,id]))?.text ?? null;}\n put(scope:string,id:string,value:unknown){\n this.sweep();const text=serializeHistory(value);const bytes=Buffer.byteLength(text);if(bytes>this.limits.maxEntryBytes)throw new Error('codex_router_history_limit');\n const key=JSON.stringify([scope,id]),old=this.entries.get(key);if(old){this.used-=old.bytes;this.entries.delete(key);}\n while(this.entries.size>=this.limits.maxEntries||this.used+bytes>this.limits.maxBytes){const oldest=this.entries.keys().next().value;if(oldest===undefined)throw new Error('codex_router_history_limit');const item=this.entries.get(oldest)!;this.used-=item.bytes;this.entries.delete(oldest);}\n this.entries.set(key,{text,bytes,expires:this.now()+this.limits.ttlMs});this.used+=bytes;\n }\n clear(){this.entries.clear();this.used=0;}\n status(){this.sweep();return {entries:this.entries.size,bytes:this.used};}\n}\n\nexport class HistoryTransport {\n private pending=new Map<string,{scope:string;id:string;total:number;parts:string[];bytes:number;expires:number}>();\n private retained=0;\n constructor(readonly cache=new HistoryCache()){}\n sweep(){const now=Date.now();for(const [key,entry] of this.pending)if(entry.expires<=now){this.retained-=entry.bytes;this.pending.delete(key);}this.cache.sweep();}\n get({scope,id,index}:{scope:string;id:string;index:number}){const text=this.cache.readText(scope,id);if(text===null)return null;if(index*8192>=text.length)return null;return {data:text.slice(index*8192,(index+1)*8192),done:(index+1)*8192>=text.length};}\n put({scope,id,index,total,data}:{scope:string;id:string;index:number;total:number;data:string}){\n this.sweep();const key=JSON.stringify([scope,id]);let entry=this.pending.get(key);\n if(index===0){if(entry){this.retained-=entry.bytes;this.pending.delete(key);}if(this.pending.size>=128)throw new Error('codex_router_history_busy');entry={scope,id,total,parts:[],bytes:0,expires:Date.now()+30_000};this.pending.set(key,entry);}\n if(!entry||entry.total!==total||entry.parts.length!==index)throw new Error('codex_router_history_chunks_invalid');\n const bytes=Buffer.byteLength(data);if(entry.bytes+bytes>8*1024*1024||this.retained+bytes>8*1024*1024)throw new Error('codex_router_history_limit');\n entry.parts.push(data);entry.bytes+=bytes;this.retained+=bytes;\n if(index+1===total){this.pending.delete(key);this.retained-=entry.bytes;this.cache.put(scope,id,JSON.parse(entry.parts.join('')));}return null;\n }\n clear(){this.pending.clear();this.retained=0;this.cache.clear();}\n}\n",
19
21
  "/** Shared process sink; the public SDK must not bundle file transports into plugins. */\ntype Context = Readonly<Record<string, unknown>>;\ntype LogMethod = { (context: Context, message?: string): void; (message: string): void };\nexport interface PluginLogSink {\n info: LogMethod; warn: LogMethod; error: LogMethod; debug: LogMethod; fatal: LogMethod;\n child(bindings: Context): PluginLogSink;\n}\nconst sinkKey = Symbol.for('@jeffusion/bungee/plugin-log-sink');\nexport function installPluginLogSink(sink: PluginLogSink): void {\n (globalThis as Record<symbol, unknown>)[sinkKey] = sink;\n}\nfunction createLogger(bindings: Context = {}): PluginLogSink {\n const method = (level: 'info' | 'warn' | 'error' | 'debug' | 'fatal'): LogMethod =>\n (value: Context | string, message?: string) => {\n const sink = (globalThis as Record<symbol, unknown>)[sinkKey] as PluginLogSink | undefined;\n if (sink) {\n if (typeof value === 'string') sink[level](bindings, value);\n else sink[level]({...bindings, ...value}, message);\n } else if (level !== 'debug' || process.env.LOG_LEVEL === 'debug') {\n const write = level === 'fatal' ? console.error : console[level];\n write(message ?? (typeof value === 'string' ? value : ''), typeof value === 'string' ? bindings : {...bindings, ...value});\n }\n };\n return {info: method('info'), warn: method('warn'), error: method('error'), debug: method('debug'),\n fatal: method('fatal'), child: extra => createLogger({...bindings, ...extra})};\n}\nexport const logger = createLogger();\n",
20
22
  "/**\n * Hook 实现类\n *\n * 提供 4 种 Hook 类型的实现:\n * - AsyncParallelHook: 异步并行执行\n * - AsyncSeriesHook: 异步串行执行\n * - AsyncSeriesBailHook: 异步串行可中断\n * - AsyncSeriesWaterfallHook: 异步串行瀑布\n */\n\nimport { logger } from '../plugin-logger';\n/** Host-supplied view refresh, run between every waterfall tap. */\nexport const WATERFALL_VIEW_TRANSFORM = Symbol('waterfall-view-transform');\nimport type {\n TapInfo,\n Tap,\n IAsyncParallelHook,\n IAsyncSeriesHook,\n IAsyncSeriesBailHook,\n IAsyncSeriesWaterfallHook,\n IAsyncSeriesMapHook,\n HookStats,\n} from './types';\n\n/**\n * 标准化 TapInfo\n */\nfunction normalizeTapInfo(info: TapInfo | string): TapInfo {\n if (typeof info === 'string') {\n return { name: info, stage: 0 };\n }\n return { ...info, stage: info.stage ?? 0 };\n}\n\n/**\n * 基础 Hook 类\n */\nabstract class BaseHook<T extends any[]> {\n protected taps: Tap<T, any>[] = [];\n protected name: string;\n protected callCount = 0;\n protected totalTimeMs = 0;\n\n constructor(name?: string) {\n this.name = name ?? 'anonymous';\n }\n\n /**\n * 同步注册\n */\n tap(info: TapInfo | string, fn: (...args: T) => any): void {\n const tapInfo = normalizeTapInfo(info);\n this.taps.push({ info: tapInfo, type: 'sync', fn });\n this.sortTaps();\n }\n\n /**\n * 异步回调风格注册\n */\n tapAsync(info: TapInfo | string, fn: (...args: any[]) => void): void {\n const tapInfo = normalizeTapInfo(info);\n this.taps.push({ info: tapInfo, type: 'async', fn });\n this.sortTaps();\n }\n\n /**\n * Promise 风格注册\n */\n tapPromise(info: TapInfo | string, fn: (...args: T) => Promise<any>): void {\n const tapInfo = normalizeTapInfo(info);\n this.taps.push({ info: tapInfo, type: 'promise', fn });\n this.sortTaps();\n }\n\n /**\n * 检查是否有注册的回调\n */\n hasCallbacks(): boolean {\n return this.taps.length > 0;\n }\n\n /**\n * 获取统计信息\n */\n getStats(): HookStats {\n return {\n name: this.name,\n tapCount: this.taps.length,\n callCount: this.callCount,\n totalTimeMs: this.totalTimeMs,\n avgTimeMs: this.callCount > 0 ? this.totalTimeMs / this.callCount : 0,\n };\n }\n\n /**\n * 重置统计信息\n */\n resetStats(): void {\n this.callCount = 0;\n this.totalTimeMs = 0;\n }\n\n /**\n * 清空所有注册的回调\n */\n clear(): void {\n this.taps = [];\n }\n\n /**\n * 按 stage 排序(稳定排序)\n */\n private sortTaps(): void {\n this.taps.sort((a, b) => (a.info.stage ?? 0) - (b.info.stage ?? 0));\n }\n\n /**\n * 执行单个 tap\n */\n protected async executeTap<R>(\n tap: Tap<T, R>,\n args: T\n ): Promise<R | undefined> {\n try {\n if (tap.type === 'sync') {\n return tap.fn(...args);\n } else if (tap.type === 'promise') {\n return await tap.fn(...args);\n } else {\n // async (callback style)\n return await new Promise<R | undefined>((resolve, reject) => {\n const done = (err?: Error, result?: R) => {\n if (err) reject(err);\n else resolve(result);\n };\n tap.fn(...args, done);\n });\n }\n } catch (error) {\n logger.error(\n { error, hookName: this.name, pluginName: tap.info.name },\n 'Error in hook callback'\n );\n throw error;\n }\n }\n}\n\n/** Synchronous providers use the same registration, ordering and statistics as async hooks. */\nexport class SyncBailHook<T extends any[] = [], R = unknown> extends BaseHook<T> {\n override tapAsync(): never { throw new Error('synchronous provider requires tap'); }\n override tapPromise(): never { throw new Error('synchronous provider requires tap'); }\n call(...args: T): R | undefined {\n const started = performance.now();\n this.callCount++;\n try {\n for (const tap of this.taps) {\n const result = tap.fn(...args);\n if (result && typeof result.then === 'function') throw new Error('synchronous provider returned a Promise');\n if (result !== undefined) return result as R;\n }\n return undefined;\n } finally { this.totalTimeMs += performance.now() - started; }\n }\n}\n\n/**\n * 异步并行 Hook\n * 所有回调并行执行,全部完成后返回\n */\nexport class AsyncParallelHook<T extends any[] = []>\n extends BaseHook<T>\n implements IAsyncParallelHook<T>\n{\n async promise(...args: T): Promise<void> {\n if (this.taps.length === 0) return;\n\n const startTime = performance.now();\n this.callCount++;\n\n try {\n // 并行执行所有回调,错误独立处理不影响其他\n await Promise.all(\n this.taps.map(async (tap) => {\n try {\n await this.executeTap(tap, args);\n } catch (error) {\n // 并行 Hook 中单个回调的错误不应影响其他回调\n logger.error(\n { error, hookName: this.name, pluginName: tap.info.name },\n 'Error in parallel hook callback (ignored)'\n );\n }\n })\n );\n } finally {\n this.totalTimeMs += performance.now() - startTime;\n }\n }\n}\n\n/**\n * 异步串行 Hook\n * 所有回调按顺序串行执行\n */\nexport class AsyncSeriesHook<T extends any[] = []>\n extends BaseHook<T>\n implements IAsyncSeriesHook<T>\n{\n async promise(...args: T): Promise<void> {\n if (this.taps.length === 0) return;\n\n const startTime = performance.now();\n this.callCount++;\n\n try {\n for (const tap of this.taps) {\n await this.executeTap(tap, args);\n }\n } finally {\n this.totalTimeMs += performance.now() - startTime;\n }\n }\n}\n\n/**\n * 异步串行可中断 Hook\n * 任意回调返回非 undefined 值则停止执行并返回该值\n */\nexport class AsyncSeriesBailHook<T extends any[] = [], R = any>\n extends BaseHook<T>\n implements IAsyncSeriesBailHook<T, R>\n{\n async promise(...args: T): Promise<R | undefined> {\n if (this.taps.length === 0) return undefined;\n\n const startTime = performance.now();\n this.callCount++;\n\n try {\n for (const tap of this.taps) {\n const result = await this.executeTap<R>(tap, args);\n if (result !== undefined) {\n logger.debug(\n { hookName: this.name, pluginName: tap.info.name },\n 'Hook bailed with result'\n );\n return result;\n }\n }\n return undefined;\n } finally {\n this.totalTimeMs += performance.now() - startTime;\n }\n }\n}\n\n/**\n * 异步串行瀑布 Hook\n * 每个回调的返回值作为下一个回调的第一个参数\n */\nexport class AsyncSeriesWaterfallHook<T, A extends any[] = []>\n extends BaseHook<[T, ...A]>\n implements IAsyncSeriesWaterfallHook<T, A>\n{\n async promise(value: T, ...args: A): Promise<T> {\n if (this.taps.length === 0) return value;\n\n const startTime = performance.now();\n this.callCount++;\n\n try {\n let current = value;\n for (const tap of this.taps) {\n const result = await this.executeTap<T>(tap, [current, ...args] as [T, ...A]);\n // 只有返回非 undefined 时才更新值\n if (result !== undefined) {\n const transform = args[0]?.[WATERFALL_VIEW_TRANSFORM];\n current = typeof transform === 'function' ? await transform(result,current) : result;\n }\n }\n return current;\n } finally {\n this.totalTimeMs += performance.now() - startTime;\n }\n }\n}\n\n/**\n * 异步串行映射 Hook\n * 支持 N:M 转换:每个回调处理输入,可以返回 0 到多个输出\n *\n * 执行流程:\n * 1. 初始输入:单个 chunk\n * 2. 每个插件处理当前的所有 chunks,返回新的 chunks 数组\n * 3. 下一个插件处理上一步的所有输出\n *\n * 返回值约定:\n * - null/undefined: 不处理,原样输出当前 chunk\n * - []: 缓冲当前 chunk,不输出(N:0)\n * - [chunk]: 1:1 转换\n * - [chunk1, chunk2, ...]: 1:M 拆分\n *\n * 性能优化:\n * - 同步优先执行:sync tap 直接同步调用,跳过 Promise 开销\n * - 适用于流式响应处理等高频调用场景\n */\nexport class AsyncSeriesMapHook<T, A extends any[] = []>\n extends BaseHook<[T, ...A]>\n implements IAsyncSeriesMapHook<T, A>\n{\n /**\n * 同步执行单个 tap(跳过 Promise 开销)\n */\n private executeTapSync<R>(tap: Tap<[T, ...A], R>, args: [T, ...A]): R | undefined {\n try {\n return tap.fn(...args);\n } catch (error) {\n logger.error(\n { error, hookName: this.name, pluginName: tap.info.name },\n 'Error in hook callback'\n );\n throw error;\n }\n }\n\n async promise(value: T, ...args: A): Promise<T[]> {\n // 如果没有注册任何回调,直接返回原始值\n if (this.taps.length === 0) return [value];\n\n const startTime = performance.now();\n this.callCount++;\n\n try {\n // 初始输入为单个 chunk\n let chunks: T[] = [value];\n\n // 依次应用每个插件的转换\n for (const tap of this.taps) {\n const newChunks: T[] = [];\n\n // 对当前的每个 chunk 应用转换\n for (const chunk of chunks) {\n try {\n // 同步优先执行:sync tap 直接同步调用,跳过 Promise 开销\n const result = tap.type === 'sync'\n ? this.executeTapSync<T[] | null | undefined>(tap, [chunk, ...args] as [T, ...A])\n : await this.executeTap<T[] | null | undefined>(tap, [chunk, ...args] as [T, ...A]);\n\n if (result === null || result === undefined) {\n // 不处理,原样输出\n newChunks.push(chunk);\n } else if (Array.isArray(result)) {\n // N:M 转换\n // [] = 缓冲(不输出)\n // [item] = 1:1 转换\n // [item1, item2, ...] = 1:M 拆分\n newChunks.push(...result);\n } else {\n // 非法返回值,警告并原样输出\n logger.warn(\n { hookName: this.name, pluginName: tap.info.name, result },\n 'AsyncSeriesMapHook callback must return an array or null'\n );\n newChunks.push(chunk);\n }\n } catch (error) {\n // 单个 chunk 处理失败,记录错误并原样输出\n logger.error(\n { error, hookName: this.name, pluginName: tap.info.name },\n 'Error in AsyncSeriesMapHook callback'\n );\n if ((args[0] as { strict?: boolean } | undefined)?.strict) {\n throw error;\n }\n newChunks.push(chunk);\n }\n }\n\n chunks = newChunks;\n }\n\n return chunks;\n } finally {\n this.totalTimeMs += performance.now() - startTime;\n }\n }\n}\n",
21
23
  "/**\n * Plugin 系统类型定义\n */\n\n/**\n * 插件配置值类型\n * 定义了插件配置中允许的值类型,比 `any` 更具体\n */\nexport type PluginConfigValue =\n | string\n | number\n | boolean\n | null\n | PluginConfigValue[]\n | { [key: string]: PluginConfigValue };\n\nexport interface CredentialOutboundHeaderProfile {\n readonly passthrough: readonly string[];\n readonly set: Readonly<Record<string, string>>;\n}\n\nexport interface CredentialRequestPolicy {\n readonly pathname: string;\n readonly methods: readonly string[];\n readonly outboundHeaders?: CredentialOutboundHeaderProfile;\n}\n\n// ============ Manifest 类型定义 ============\n\n/**\n * 插件 manifest.json 规范\n *\n * manifest.json 是插件的声明性配置文件,作为插件元数据的唯一真相来源。\n * 框架通过读取此文件来发现插件能力,无需执行插件代码。\n *\n * @example\n * ```json\n * {\n * \"name\": \"token-stats\",\n * \"version\": \"1.0.0\",\n * \"description\": \"Track AI API token usage\",\n * \"main\": \"server/index.ts\",\n * \"ui\": {\n * \"components\": [\n * { \"name\": \"TokenStatsChart\", \"entry\": \"ui/TokenStatsChart.svelte\" }\n * ]\n * },\n * \"contributes\": {\n * \"nativeWidgets\": [...],\n * \"api\": [...]\n * },\n * \"translations\": { \"en\": {...}, \"zh-CN\": {...} }\n * }\n * ```\n */\nexport interface PluginManifest {\n /**\n * 插件唯一标识符(必填)\n * 用于路由、存储命名空间等\n */\n name: string;\n\n /**\n * 插件版本号(必填)\n * 遵循 semver 规范\n */\n version: string;\n\n schemaVersion?: number | string;\n artifactKind?: string;\n\n /**\n * 插件描述(支持翻译键)\n */\n description?: string;\n\n /**\n * 图标(Material Icon 名称或 URL)\n */\n icon?: string;\n\n /**\n * 作者信息\n */\n author?: string | {\n name: string;\n email?: string;\n url?: string;\n };\n\n /**\n * 许可证\n */\n license?: string;\n\n /**\n * 项目主页\n */\n homepage?: string;\n\n /**\n * 代码仓库\n */\n repository?: string | {\n type: string;\n url: string;\n };\n\n /**\n * 关键词(用于搜索)\n */\n keywords?: string[];\n\n /**\n * 服务端入口配置\n */\n main?: string;\n\n capabilities?: string[];\n /** Global plugins run once for all routes whenever activated; defaults to scoped bindings. */\n runtimeScope?: 'global' | 'scoped';\n services?: import('./plugin-services').PluginServiceDeclarations;\n /** Optional control-plane runtime capability. */\n ingress?: { entry: string };\n management?: { loginComponent?: string };\n control?: {\n entry: string;\n rpc: Array<{\n name: string;\n access: 'bound-attempt';\n }>;\n };\n /**\n * UI 扩展模式(冻结边界)\n * - none: 无 UI 扩展\n * - native-static: 原生静态组件(依赖构建期注册表,不支持运行时注入)\n * - sandbox-iframe: 独立沙箱扩展(通过 iframe 隔离,独立服务资源)\n */\n uiExtensionMode?: 'none' | 'native-static' | 'sandbox-iframe';\n\n /**\n * UI 组件配置\n */\n ui?: {\n /**\n * 组件列表\n * 用于自动注册到组件白名单\n */\n components?: Array<{\n /** 组件名称(用于 nativeWidgets.component 引用) */\n name: string;\n /** 组件入口文件路径(相对于插件根目录) */\n entry: string;\n }>;\n };\n\n /**\n * 权限声明\n * 用于安全预检(用户上传插件场景)\n */\n permissions?: Array<\n | 'network' // 网络访问\n | 'storage' // 持久化存储\n | 'filesystem' // 文件系统访问\n | string // 自定义权限\n >;\n\n /**\n * 插件依赖\n */\n dependencies?: Record<string, string>;\n\n /** Optional providers are never included in automatic activation closure. */\n optionalDependencies?: Record<string, string>;\n\n /**\n * 引擎版本要求\n */\n engines?: {\n bungee?: string;\n node?: string;\n };\n\n /**\n * 贡献点配置\n */\n contributes?: {\n /**\n * 原生仪表板组件\n */\n nativeWidgets?: Array<{\n id: string;\n title: string;\n size: 'small' | 'medium' | 'large' | 'full';\n component: string;\n presentation?: 'kpi';\n props?: Record<string, any>;\n }>;\n\n /**\n * API 端点\n */\n api?: Array<{\n path: string;\n methods: Array<'GET' | 'POST' | 'PUT' | 'DELETE'>;\n handler: string;\n execution: 'control';\n capability?: string;\n methodCapabilities?: Record<string,string>;\n }>;\n resourceExtensions?: Array<{resource:'api-key';component:string;path:'/keys/:keyId'}>;\n upstreamSources?: Array<{\n id: string;\n label: string;\n listAccounts: string;\n createDraft: string;\n credentialPolicy: {\n allowedOrigins: string[];\n allowedRequests: CredentialRequestPolicy[];\n allowedHeaderNames: string[];\n };\n }>;\n\n /**\n * iframe 仪表板组件(Legacy)\n */\n widgets?: Array<{\n title: string;\n path: string;\n size?: 'small' | 'medium' | 'large' | 'full';\n }>;\n\n /**\n * 导航菜单\n */\n navigation?: Array<{\n label: string;\n path: string;\n icon?: string;\n target?: 'sidebar' | 'header';\n component?: string;\n }>;\n\n /**\n * 设置页路径\n */\n settings?: string;\n\n /**\n * 原生静态设置组件名称(仅 builtin 插件可声明)\n */\n nativeSettingsComponent?: string;\n\n /**\n * 命令贡献\n */\n commands?: Array<{\n command: string;\n title: string;\n category?: string;\n icon?: string;\n }>;\n };\n\n /**\n * UI 展示元数据(新架构)\n * 用于存放 UI 相关的元数据,支持翻译键\n */\n metadata?: {\n /** 显示名称(支持翻译键) */\n name?: string;\n /** 描述(支持翻译键) */\n description?: string;\n /** 图标 */\n icon?: string;\n /** 贡献点配置(与顶层 contributes 合并) */\n contributes?: PluginManifest['contributes'];\n };\n\n /**\n * 配置 Schema\n * 用于动态生成配置表单\n */\n configSchema?: PluginConfigField[];\n\n /**\n * 多语言翻译\n */\n translations?: PluginTranslations;\n}\n\n/**\n * 从 manifest 加载的插件信息\n * 包含 manifest 数据和解析后的路径信息\n */\nexport interface LoadedPluginManifest extends PluginManifest {\n /** 插件根目录的绝对路径 */\n pluginDir: string;\n /** manifest.json 文件的绝对路径 */\n manifestPath: string;\n /** 服务端入口的绝对路径 */\n mainPath?: string;\n /** 控制面入口的绝对路径 */\n controlPath?: string;\n uiAssetsPath?: string;\n}\n\n// 导出 Hook 系统类型\nexport type {\n PluginHooks,\n RequestContext,\n MutableRequestContext,\n ResponseContext,\n ErrorContext,\n StreamChunkContext,\n FinallyContext,\n PluginInitContext,\n PluginLogger,\n} from './hooks';\n\nexport { createPluginHooks, clearHooks, getHooksStats, resetHooksStats } from './hooks';\nexport type { TapInfo } from './hooks';\n\n/**\n * 插件配置字段类型\n */\nexport type PluginConfigFieldType =\n | 'string' // 文本输入\n | 'number' // 数字输入\n | 'boolean' // 复选框\n | 'select' // 单选下拉\n | 'multiselect' // 多选下拉\n | 'textarea' // 多行文本\n | 'json' // JSON 编辑器\n | 'gateway_target'\n | 'model_mapping'\n | 'object' // 对象(嵌套表单)\n | 'array'; // 数组(列表编辑器)\n\n/**\n * 验证规则\n */\nexport interface ValidationRule {\n /**\n * 正则表达式模式\n */\n pattern?: string;\n\n /**\n * 最小值/最小长度\n */\n min?: number;\n\n /**\n * 最大值/最大长度\n */\n max?: number;\n\n /**\n * 自定义错误消息\n */\n message?: string;\n}\n\n/**\n * 字段转换规则(可序列化)\n * 用于定义虚拟字段与实际字段之间的转换关系\n */\nexport interface FieldTransform {\n /**\n * 转换类型\n */\n type: 'split' | 'concat' | 'compute';\n\n /**\n * split 类型专用:分隔符\n * @example '-' 将 \"a-b\" 拆分为 [\"a\", \"b\"]\n */\n separator?: string;\n\n /**\n * split/concat 类型专用:目标字段列表\n * @example ['from', 'to']\n */\n fields?: string[];\n}\n\nexport type PluginShowIfCondition =\n | {\n field: string;\n value: PluginConfigValue;\n }\n | {\n all: PluginShowIfCondition[];\n }\n | {\n any: PluginShowIfCondition[];\n };\n\n/**\n * 插件翻译内容\n *\n * 用于为插件的 UI 元素提供多语言支持\n *\n * 格式说明:\n * - 第一层 key 为语言代码(如 'en', 'zh-CN')\n * - 第二层 key 为翻译键(使用点号分隔的扁平结构)\n * - 系统会自动为所有翻译键添加 `plugins.{pluginName}` 前缀\n *\n * @example\n * ```typescript\n * static readonly translations: PluginTranslations = {\n * 'en': {\n * 'field.label': 'Field Label',\n * 'field.description': 'Field description text',\n * 'options.value1.label': 'Option 1'\n * },\n * 'zh-CN': {\n * 'field.label': '字段标签',\n * 'field.description': '字段描述文本',\n * 'options.value1.label': '选项 1'\n * }\n * };\n * ```\n */\nexport type PluginTranslations = Record<string, Record<string, string>>;\n\n/**\n * 插件配置字段定义\n * 用于动态生成配置表单\n */\nexport interface PluginConfigField {\n /**\n * 字段名(配置对象的 key)\n */\n name: string;\n\n /**\n * 字段类型\n */\n type: PluginConfigFieldType;\n\n /**\n * 显示标签(支持 i18n key 或直接字符串)\n */\n label: string;\n\n /**\n * 是否必填\n */\n required?: boolean;\n\n /**\n * 默认值\n */\n default?: PluginConfigValue;\n\n /**\n * select/multiselect 的选项列表\n */\n options?: Array<{\n label: string;\n value: string;\n description?: string;\n }>;\n\n /**\n * 描述/帮助文本\n */\n description?: string;\n\n /**\n * 占位符文本\n */\n placeholder?: string;\n\n catalogPlugin?: string;\n sourceCatalogProviderField?: string;\n targetCatalogProviderField?: string;\n\n /**\n * 验证规则\n */\n validation?: ValidationRule;\n\n /**\n * 条件显示(依赖其他字段的值)\n */\n showIf?: PluginShowIfCondition;\n\n /**\n * 子字段定义(type=object 时使用)\n */\n properties?: PluginConfigField[];\n\n /**\n * 数组元素类型(type=array 时使用)\n */\n items?: PluginConfigField;\n\n /**\n * 字段转换规则(可序列化)\n * 定义虚拟字段与实际字段之间的映射关系\n *\n * 当设置此属性时:\n * - 该字段为\"虚拟字段\",仅用于 UI 交互\n * - UI 输入值会根据转换规则展开为多个实际字段\n * - 实际字段的值会根据转换规则合并显示在 UI 中\n * - 虚拟字段本身不会保存到配置中\n *\n * @example\n * // 将 \"anthropic-openai\" 拆分为 { from: \"anthropic\", to: \"openai\" }\n * fieldTransform: {\n * type: 'split',\n * separator: '-',\n * fields: ['from', 'to']\n * }\n */\n fieldTransform?: FieldTransform;\n}\n\n/**\n * 类型守卫:检查插件类是否有 configSchema\n */\nexport function hasConfigSchema(\n PluginClass: any\n): PluginClass is { configSchema: PluginConfigField[] } {\n return 'configSchema' in PluginClass && Array.isArray(PluginClass.configSchema);\n}\n\n/**\n * Plugin 存储接口\n * 提供基于 Key-Value 的持久化存储能力\n */\n/** Trusted observation plugins may execute SQL only against access.db, never config.db.\n * Callers must perform database work within the callback; hosts revoke subsequent operations.\n */\nexport interface PluginObservationStorage {\n withDatabase<T>(operation: (database: import('bun:sqlite').Database) => T): T;\n}\n\n/** Result of a strict, side-effect-free namespaced KV read. */\nexport type PluginStorageReadResult<T> =\n | { readonly found: false }\n | { readonly found: true; readonly value: T };\n\nexport interface PluginStorage {\n readonly observation?: PluginObservationStorage;\n /** Immediate namespaced KV access for cross-process shared values. */\n uncached?(): PluginStorage;\n /** Flush pending KV writes during host disposal. */\n flush?(): Promise<void>;\n\n /** Legacy embedder extension; the core does not construct or grant it by name. */\n readonly metering?: TokenStatsMeteringStorage;\n /**\n * 获取值\n * @param key 键\n * @returns 值,如果不存在则返回 null\n */\n get<T = any>(key: string): Promise<T | null>;\n\n /**\n * 严格只读获取值:直接读取当前命名空间的已提交数据。\n * 不访问/回填/刷新 LRU 缓存,也不清除过期记录;SQL/JSON 错误直接抛出。\n * 有效 JSON null 视为 found:true,缺失或已过期视为 found:false。\n * 可选仅为既有 embedder / 测试 fixture 的源码兼容;Bungee 实际存储实现必须提供。\n */\n readStrict?<T = unknown>(key: string): Promise<PluginStorageReadResult<T>>;\n\n /**\n * 设置值\n * @param key 键\n * @param value 值(必须可序列化)\n * @param ttlSeconds 过期时间(秒),可选\n */\n set(key: string, value: any, ttlSeconds?: number): Promise<void>;\n\n /**\n * 删除值\n * @param key 键\n */\n delete(key: string): Promise<void>;\n\n /**\n * 获取所有键(支持前缀过滤)\n * @param prefix 前缀,可选\n */\n keys(prefix?: string): Promise<string[]>;\n\n /**\n * 清空存储(仅限当前插件的命名空间)\n */\n clear(): Promise<void>;\n\n /**\n * 原子递增操作\n * 原子地递增指定对象字段的值,避免并发竞争\n * @param key 键\n * @param field 字段名\n * @param delta 递增量(默认1,可为负数)\n * @returns 递增后的新值\n */\n increment(key: string, field: string, delta?: number): Promise<number>;\n\n /**\n * 比较并交换操作\n * 仅当当前值等于期望值时,才更新为新值(原子操作)\n * @param key 键\n * @param field 字段名\n * @param expected 期望的当前值\n * @param newValue 新值\n * @returns 是否更新成功\n */\n compareAndSet(key: string, field: string, expected: any, newValue: any): Promise<boolean>;\n}\n\nexport type TokenStatsMetricName =\n | 'inputTokens' | 'outputTokens' | 'officialInputTokens' | 'officialOutputTokens'\n | 'estimatedInputTokens' | 'estimatedOutputTokens' | 'cacheReadTokens' | 'cacheWriteTokens'\n | 'partialOutputs' | 'logicalRequests' | 'upstreamAttempts' | 'observationIncompleteAttempts'\n | 'inputAuthorityOfficial' | 'inputAuthorityLocal' | 'inputAuthorityHeuristic' | 'inputAuthorityPartial' | 'inputAuthorityNone'\n | 'outputAuthorityOfficial' | 'outputAuthorityLocal' | 'outputAuthorityHeuristic' | 'outputAuthorityPartial' | 'outputAuthorityNone';\n\nexport type TokenStatsMetrics = Partial<Record<TokenStatsMetricName, number>>;\n\nexport type TokenStatsGroupBy = 'model' | 'time';\nexport type TokenStatsRange = '1h' | '12h' | '24h' | '1d' | '7d' | '30d' | 'day' | 'week' | 'month';\n\nexport type TokenStatsValueSource = 'usage' | 'estimated' | 'partial' | 'unknown';\n\n/** One ended upstream attempt; provider is the wire protocol family, not a vendor name. */\nexport interface TokenStatsAttempt {\n readonly key_id?: string | null;\n readonly attempt_id: string;\n readonly request_id: string;\n readonly finished_at_ms: number;\n readonly route_id: string;\n readonly upstream_id: string;\n readonly provider: string;\n readonly outcome: string;\n readonly model: string;\n readonly input_tokens: number | null;\n readonly output_tokens: number | null;\n readonly input_source: TokenStatsValueSource;\n readonly output_source: TokenStatsValueSource;\n readonly cache_read_tokens: number | null;\n readonly cache_write_tokens: number | null;\n readonly cost_usd: number | null;\n readonly observation_incomplete: boolean;\n}\n\nexport type TokenStatsSnapshotMetrics = Record<TokenStatsMetricName, number> & {\n readonly estimatedCostUsd: number | null;\n};\n\nexport interface TokenStatsMeteringStorage {\n recordAttempt(row: TokenStatsAttempt): Promise<void>;\n queryWindowSnapshot(input: {\n asOfMs: number;\n range: TokenStatsRange;\n groupBy: TokenStatsGroupBy;\n timeZone?: string;\n keyId?: string;\n }): Promise<{\n all: TokenStatsSnapshotMetrics;\n data: Array<{ dimension: string; bucketStartMs?: number; metrics: TokenStatsSnapshotMetrics }>;\n bucketMs?: number;\n bucketStarts?: number[];\n /** Exclusive end of the last displayed bucket; calendar axes include future periods. */\n bucketEndMs?: number;\n present: boolean;\n }>;\n}\n\n/**\n * Plugin 元数据接口\n * 用于 UI 展示和系统集成\n */\nexport interface PluginMetadata {\n /**\n * 显示名称(支持翻译键或直接字符串)\n * 默认使用插件的 name,此字段用于提供更友好的 UI 显示名\n *\n * 支持翻译键格式:包含 `.` 且不包含空格\n * @example 'metadata.displayName' // 翻译键,会自动翻译\n * @example 'My Plugin' // 直接字符串,不翻译\n */\n name?: string;\n\n /**\n * 插件描述(支持翻译键或直接字符串)\n * 用于 UI 展示插件的详细说明\n *\n * 支持翻译键格式:包含 `.` 且不包含空格\n * @example 'metadata.description' // 翻译键,会自动翻译\n * @example 'A demo plugin for testing' // 直接字符串,不翻译\n */\n description?: string;\n\n /**\n * 图标(Material Icon 名称或 URL)\n */\n icon?: string;\n\n /**\n * 作者信息\n */\n author?: {\n name: string;\n email?: string;\n url?: string;\n } | string;\n\n /**\n * 许可证\n */\n license?: string;\n\n /**\n * 项目主页\n */\n homepage?: string;\n\n /**\n * 代码仓库\n */\n repository?: {\n type: string;\n url: string;\n } | string;\n\n /**\n * 关键词(用于搜索)\n */\n keywords?: string[];\n\n /**\n * 分类\n */\n categories?: string[];\n\n /**\n * 插件激活事件\n * 声明插件何时被激活\n */\n activationEvents?: string[];\n\n /**\n * 插件能力声明\n * 声明插件使用的系统能力\n */\n /**\n * 插件权限声明\n * 声明插件需要的系统权限(如 network, storage, api:routes 等)\n */\n permissions?: string[];\n\n capabilities?: {\n /**\n * 是否需要网络访问\n */\n network?: boolean;\n\n /**\n * 是否需要文件系统访问\n */\n filesystem?: boolean;\n\n /**\n * 是否需要数据库访问\n */\n database?: boolean;\n\n /**\n * 自定义能力声明\n */\n custom?: string[];\n };\n\n /**\n * 依赖的其他插件\n */\n dependencies?: Record<string, string>;\n\n /**\n * 可选依赖\n */\n optionalDependencies?: Record<string, string>;\n\n /**\n * 引擎版本要求\n */\n engines?: {\n bungee?: string;\n node?: string;\n };\n\n /**\n * 贡献点配置\n * 统一声明插件提供的 UI 和功能能力\n */\n contributes?: {\n /**\n * 导航集成\n */\n navigation?: Array<{\n label: string;\n path: string;\n icon?: string;\n target?: 'sidebar' | 'header'; // 默认 sidebar\n /** Optional statically registered native page component. */\n component?: string;\n }>;\n\n /**\n * 仪表板集成\n */\n widgets?: Array<{\n title: string;\n path: string;\n size?: 'small' | 'medium' | 'large' | 'full'; // small=1x1, medium=2x1, large=2x2, full=4x2\n }>;\n\n /**\n * 设置页路径\n */\n settings?: string;\n\n /**\n * 命令贡献\n * 声明插件提供的命令\n */\n commands?: Array<{\n command: string;\n title: string;\n category?: string;\n icon?: string;\n }>;\n\n /**\n * 配置贡献\n * 声明插件的配置项\n */\n configuration?: {\n title?: string;\n properties: Record<string, {\n type: 'string' | 'number' | 'boolean' | 'array' | 'object';\n default?: any;\n description?: string;\n enum?: any[];\n items?: any;\n properties?: any;\n }>;\n };\n\n /**\n * 原生仪表板组件(非 iframe)\n *\n * 与 widgets 不同,nativeWidgets 直接渲染为 Svelte 组件,\n * 可以复用主应用的图表库和样式系统。\n *\n * 安全说明:组件必须是内置的,插件只能通过 component 名称引用白名单中的组件\n *\n * @example\n * ```typescript\n * nativeWidgets: [{\n * id: 'token-stats-chart',\n * title: 'Token 统计',\n * size: 'medium',\n * component: 'TokenStatsChart',\n * props: { days: 7 }\n * }]\n * ```\n */\n nativeWidgets?: Array<{\n /** 唯一标识符 */\n id: string;\n /** 显示标题(支持 i18n key) */\n title: string;\n /** 尺寸:small=1x1, medium=2x1, large=2x2, full=4x2 */\n size: 'small' | 'medium' | 'large' | 'full';\n /** 组件名称(映射到内置组件白名单) */\n component: string;\n presentation?: 'kpi';\n /** 传递给组件的 props */\n props?: Record<string, any>;\n }>;\n\n /**\n * API 端点贡献\n *\n * 允许插件注册自己的 API 端点,端点路径强制在 /api/plugins/:pluginName/ 命名空间下。\n * 只有 global scope 的插件实例才能处理 API 请求。\n *\n * @example\n * ```typescript\n * api: [{\n * path: '/stats', // 实际路径: /api/plugins/my-plugin/stats\n * methods: ['GET'],\n * handler: 'getStats', // 调用控制面处理器的 getStats 方法\n * execution: 'control'\n * }]\n * ```\n */\n api?: Array<{\n /** 相对路径(相对于 /api/plugins/:pluginName) */\n path: string;\n /** 支持的 HTTP 方法 */\n methods: Array<'GET' | 'POST' | 'PUT' | 'DELETE'>;\n /** 处理器方法名(Plugin 类的方法) */\n handler: string;\n execution: 'control';\n capability?: string;\n methodCapabilities?: Record<string,string>;\n }>;\n };\n\n /**\n * @deprecated 使用 contributes.widgets 和 contributes.settings 代替\n */\n ui?: {\n dashboard?: Array<{\n id: string;\n title: string;\n path: string;\n size?: { w: number; h: number };\n }>;\n settings?: string;\n };\n}\n\n\n// ============ Plugin 接口 ============\n\nimport type { PluginHooks, PluginInitContext } from './hooks';\n\n/**\n * Plugin 接口(基于 Hook Registry 模式)\n *\n * 所有插件必须实现此接口。插件不再直接定义钩子方法,而是通过 register(hooks) 方法注册回调。\n *\n * @example\n * ```typescript\n * export const MyPlugin = definePlugin(\n * class implements Plugin {\n * static readonly name = 'my-plugin';\n * static readonly version = '1.0.0';\n *\n * bodyRequirements(): PluginBodyRequirements { return { request: 'none' }; }\n * register(hooks: PluginHooks) {\n * // 并行执行的初始化(非阻塞)\n * hooks.onRequestInit.tapPromise({ name: 'my-plugin' }, async (ctx) => {\n * await this.recordMetric();\n * });\n *\n * // 串行执行的请求修改(阻塞)\n * hooks.onBeforeRequest.tapPromise({ name: 'my-plugin' }, async (ctx) => {\n * ctx.headers['X-Custom'] = 'value';\n * return ctx;\n * });\n * }\n * }\n * );\n * ```\n */\n/** SDK 3: content demand is evaluated before reading each selected request body. */\nexport interface PluginBodyRequirementContext {\n readonly requestId: string;\n readonly method: string;\n readonly url: URL;\n readonly routeId?: string;\n readonly serviceId?: string;\n readonly upstreamId?: string;\n readonly stage: 'route' | 'selected';\n}\nexport interface PluginBodyRequirements {\n readonly request: 'none' | 'json-read' | 'json-write';\n readonly response?: readonly ('json' | 'sse-json')[];\n /** Replay retention is independent of content decoding. */\n readonly replay?: boolean;\n /** Optional bounded observation never upgrades forwarding demands. */\n readonly observe?: Readonly<{ request?: boolean; response?: boolean; sse?: boolean }>;\n}\nexport interface SSEEnvelope {\n data: string;\n json?: unknown;\n event?: string;\n id?: string;\n retry?: string;\n comments?: string[];\n /** Original complete event; remove after modifying data or metadata. */\n raw?: string;\n}\nexport interface Plugin {\n bodyRequirements(context: PluginBodyRequirementContext): PluginBodyRequirements;\n resolveAdmissionModel?: import('./data-admission/worker').WorkerAdmissionPlugin['resolveAdmissionModel'];\n prepareAdmissionAttempt?: import('./data-admission/worker').WorkerAdmissionPlugin['prepareAdmissionAttempt'];\n /**\n * 插件初始化\n * 在 register 之前调用,用于初始化配置和资源\n */\n init?(context: PluginInitContext): Promise<void>;\n\n /**\n * 注册 Hooks\n * 插件在此方法中选择需要的 hooks 并注册回调\n *\n * 流式处理现在也通过 Hook 注册:\n * - hooks.onStreamChunk: 处理流式响应的每个 chunk(支持 N:M 转换)\n * - hooks.onFlushStream: 流结束时刷新缓冲区\n */\n register(hooks: PluginHooks): void;\n\n /**\n * 重置状态(对象池使用)\n */\n reset?(): void | Promise<void>;\n\n /**\n * 插件销毁\n */\n onDestroy?(): Promise<void>;\n}\n\n/**\n * Plugin 构造器类型\n * 约束插件类必须提供静态元数据\n */\nexport type PluginConstructor = {\n new (...args: any[]): Plugin;\n\n /**\n * 插件唯一标识符(静态属性,必填)\n */\n readonly name: string;\n\n /**\n * 插件版本号(静态属性,必填)\n */\n readonly version: string;\n\n /**\n * 插件配置 Schema(静态属性,可选)\n * 如果插件需要配置,应定义此静态属性来描述配置项\n */\n readonly configSchema?: PluginConfigField[];\n\n /**\n * 插件扩展元数据(静态属性,可选)\n * 用于 UI 集成、权限声明、依赖管理等高级功能\n */\n readonly metadata?: PluginMetadata;\n\n /**\n * 插件翻译内容(静态属性,可选)\n *\n * 用于提供插件 UI 元素的多语言翻译\n * 系统会自动收集并注册到前端 i18n 系统\n */\n readonly translations?: PluginTranslations;\n\n};\n\n/**\n * 插件定义辅助函数\n * 提供编译时类型检查,确保插件满足所有静态和实例要求\n *\n * @example\n * ```typescript\n * export const MyPlugin = definePlugin(\n * class implements Plugin {\n * static readonly name = 'my-plugin';\n * static readonly version = '1.0.0';\n * static readonly metadata = {\n * name: 'My Plugin',\n * description: 'My plugin description',\n * icon: 'extension'\n * };\n *\n * constructor(options: MyOptions) { }\n *\n * bodyRequirements(): PluginBodyRequirements { return { request: 'none' }; }\n * register(hooks: PluginHooks) {\n * hooks.onBeforeRequest.tapPromise({ name: 'my-plugin' }, async (ctx) => {\n * // Plugin logic here\n * return ctx;\n * });\n * }\n * }\n * );\n *\n * export default MyPlugin;\n * ```\n */\nexport function definePlugin<T extends Plugin>(\n plugin: PluginConstructor & { new(...args: any[]): T }\n): typeof plugin {\n return plugin;\n}\n\n/**\n * 运行时辅助函数:获取插件实例的名称\n * 从插件类的静态属性读取\n */\nexport function getPluginName(plugin: Plugin): string {\n return (plugin.constructor as PluginConstructor).name;\n}\n\n/**\n * 运行时辅助函数:获取插件实例的版本\n * 从插件类的静态属性读取\n */\nexport function getPluginVersion(plugin: Plugin): string {\n return (plugin.constructor as PluginConstructor).version;\n}\n\n/**\n * 运行时辅助函数:获取插件实例的描述\n * 从插件类的 metadata.description 静态属性读取\n */\nexport function getPluginDescription(plugin: Plugin): string | undefined {\n return (plugin.constructor as PluginConstructor).metadata?.description;\n}\n\n/**\n * 运行时辅助函数:获取插件实例的元数据\n * 从插件类的静态属性读取\n */\nexport function getPluginMetadata(plugin: Plugin): PluginMetadata | undefined {\n return (plugin.constructor as PluginConstructor).metadata;\n}\n",
22
24
  "import type { SSEEnvelope } from '../plugin.types';\n\n/** Explicit protocol output mapping. Original event names are never inferred from payload.type. */\nexport function protocolSSEOutput(payloads: readonly unknown[], protocol: string, source?: SSEEnvelope): SSEEnvelope[] {\n return payloads.map((json, index) => {\n const envelope: SSEEnvelope = { data: JSON.stringify(json), json };\n if (source?.id !== undefined) envelope.id = source.id;\n if (source?.retry !== undefined) envelope.retry = source.retry;\n if (index === 0 && source?.comments) envelope.comments = [...source.comments];\n // These converters deliberately create Anthropic/Responses protocol event names.\n if ((protocol === 'anthropic' || protocol === 'responses') && json !== null && typeof json === 'object') {\n const type = (json as Record<string, unknown>).type;\n if (typeof type === 'string') envelope.event = type;\n }\n return envelope;\n });\n}\n",
23
25
  "import type { PluginDurableState, DurableJson } from './plugin-durable-state';\n\n/** Anonymous is an explicit, signed data identity; it carries no key authority. */\nexport type DataPrincipal = { readonly domain: string; readonly keyId: string; readonly credentialVersion: number };\nexport const ANONYMOUS_PRINCIPAL: DataPrincipal = Object.freeze({domain: 'anonymous', keyId: '', credentialVersion: 0});\nexport interface AdmissionRequirement { readonly plugin: string; readonly routeIds: readonly string[] }\n/** Public contracts. Business rules belong to the implementing plugin. */\nexport interface ManagementSubject {\n readonly id: string;\n readonly provider: string;\n readonly capabilities: readonly string[];\n readonly requiresPasswordChange?: boolean;\n}\nexport interface ManagementProvider {\n authenticate(request: Request): Promise<ManagementSubject | null>;\n authorize(subject: ManagementSubject, capability: string): boolean;\n login(request: Request): Promise<Response>;\n logout(request: Request): Promise<Response>;\n bootstrap(input: unknown): Promise<void>;\n hasIdentity(): boolean;\n revokeSessions(): void;\n validateWrite?(request: Request): void;\n csrfToken?(request: Request): string | undefined;\n /** Optional browser cookie renewal after successful session verification. Must not extend the server-side absolute deadline. */\n sessionCookie?(request: Request): string | undefined;\n}\nexport interface AdmissionTarget {\n /** Host-pinned entry scope for one internal handoff. */\n readonly entryRouteId?: string;\n readonly requestId: string;\n readonly attemptId: string;\n readonly principal: DataPrincipal;\n readonly routeId: string;\n readonly serviceId: string | null;\n readonly upstreamId: string;\n readonly url: string;\n readonly model: string | null;\n readonly now: number;\n}\nexport interface AdmissionDenial {\n readonly error: string;\n readonly status: 401 | 403 | 429 | 503 | 422;\n readonly retryAfter?: number;\n}\nexport interface AdmissionPlan {\n /** A complete JSON state replacement, staged by Host before the common decision. */\n readonly state?: DurableJson;\n /** Immutable policy snapshot retained by the grant for subsequent attempts. */\n readonly snapshot?: DurableJson;\n readonly denial?: AdmissionDenial;\n}\nexport interface IngressPlugin {\n /** Effective policy demand; no policy means no content decoding. */\n bodyRequirements(target: AdmissionTarget, policy: DurableJson): { readonly request: 'none' | 'json-read' };\n /** Optional per-principal state. Policies are frozen; plans receive only this key's clones.\n * Expiry must mean absence is behaviorally equivalent to retaining the state. */\n keyedState?: {\n readonly capacity: number;\n policyForKey(policy: DurableJson, keyId: string): DurableJson;\n expiresAt(state: DurableJson): number;\n reconcile(state: DurableJson, policy: DurableJson, now: number): DurableJson;\n };\n authenticate?(request: Request, policy: DurableJson, now: number): DataPrincipal | null;\n resolveIdentity?(target: AdmissionTarget, policy: DurableJson): DataPrincipal;\n plan(target: AdmissionTarget, policy: DurableJson, state: DurableJson): AdmissionPlan;\n beforeAttempt?(target: AdmissionTarget, snapshot: DurableJson): AdmissionDenial | null;\n}\nexport interface IngressPluginModule { createIngress(): IngressPlugin }\nexport interface PluginStateRpcContext {\n readonly state: PluginDurableState;\n readonly requestId: string;\n readonly attemptId: string;\n readonly principal: DataPrincipal;\n}\nexport interface PluginPolicyPublication {\n readonly version: number;\n readonly value: DurableJson;\n}\n",
24
- "/** Shared inert error contract; importing it never loads admission runtime modules. */\nexport class DataAdmissionError extends Error {\n readonly name = 'DataAdmissionError';\n constructor(readonly status: number, readonly code: string, readonly retryAfter?: number) { super(code); }\n}\n\n/** Plugin bundles have their own class identity; normalize their explicit error contract. */\nexport function normalizeAdmissionError(error: unknown): DataAdmissionError | null {\n if (error instanceof DataAdmissionError) return error;\n if (!(error instanceof Error) || error.name !== 'DataAdmissionError') return null;\n const value = error as Error & {status?: unknown; code?: unknown; retryAfter?: unknown};\n if (typeof value.status !== 'number' || ![401,403,409,422,429,503].includes(value.status)\n || typeof value.code !== 'string' || !/^[a-zA-Z0-9_.-]{1,128}$/.test(value.code)\n || (value.retryAfter !== undefined && (typeof value.retryAfter !== 'number' || !Number.isFinite(value.retryAfter) || value.retryAfter < 0))) return null;\n return new DataAdmissionError(value.status,value.code,value.retryAfter as number | undefined);\n}\n",
26
+ "export interface DataAdmissionErrorDetails { message?: string; param?: string }\nfunction safeDetails(details?: DataAdmissionErrorDetails): DataAdmissionErrorDetails | undefined {\n if (!details) return undefined;\n const message = typeof details.message === 'string' && details.message.length <= 512 && !/[\\x00-\\x1f\\x7f]/.test(details.message) ? details.message : undefined;\n const param = typeof details.param === 'string' && details.param.length <= 256 && /^[a-zA-Z_$][\\w.$\\[\\]-]*$/.test(details.param) ? details.param : undefined;\n return message === undefined && param === undefined ? undefined : Object.freeze({message, param});\n}\n/** Shared inert error contract; importing it never loads admission runtime modules. */\nexport class DataAdmissionError extends Error {\n readonly name = 'DataAdmissionError';\n readonly details?: DataAdmissionErrorDetails;\n constructor(readonly status: number, readonly code: string, readonly retryAfter?: number, details?: DataAdmissionErrorDetails) {\n super(code); this.details = safeDetails(details);\n }\n}\n\n/** Plugin bundles have their own class identity; normalize their explicit error contract. */\nexport function normalizeAdmissionError(error: unknown): DataAdmissionError | null {\n if (error instanceof DataAdmissionError) return error;\n if (!(error instanceof Error) || error.name !== 'DataAdmissionError') return null;\n const value = error as Error & {status?: unknown; code?: unknown; retryAfter?: unknown; details?: DataAdmissionErrorDetails};\n if (typeof value.status !== 'number' || ![401,403,409,422,429,503].includes(value.status)\n || typeof value.code !== 'string' || !/^[a-zA-Z0-9_.-]{1,128}$/.test(value.code)\n || (value.retryAfter !== undefined && (typeof value.retryAfter !== 'number' || !Number.isFinite(value.retryAfter) || value.retryAfter < 0))) return null;\n return new DataAdmissionError(value.status,value.code,value.retryAfter as number | undefined,value.details);\n}\n",
25
27
  "import type { Database } from 'bun:sqlite';\nimport { createHash } from 'node:crypto';\n\n/** Configuration migration owns this DDL; constructors never modify schema. */\nexport const PLUGIN_DURABLE_STATE_SCHEMA_SQL = `\nCREATE TABLE plugin_durable_records (\n namespace TEXT NOT NULL, key TEXT NOT NULL, version INTEGER NOT NULL CHECK(version > 0),\n value_json TEXT NOT NULL, PRIMARY KEY(namespace, key)\n) STRICT;\nCREATE TABLE plugin_durable_commands (\n namespace TEXT NOT NULL, command_id TEXT NOT NULL, fingerprint TEXT NOT NULL,\n result_json TEXT NOT NULL, PRIMARY KEY(namespace, command_id)\n) STRICT;\n`;\nexport type DurableJson = null | boolean | number | string | DurableJson[] | { [key: string]: DurableJson };\nexport interface DurableRecord { readonly key: string; readonly version: number; readonly value: DurableJson }\nexport interface DurableMutation { key: string; expectedVersion: number; value: DurableJson }\nexport interface DurableCommand { commandId: string; mutations: readonly DurableMutation[] }\n/**\n * Host-only execution options. `extend` runs inside the SAME immediate\n * transaction, after the record mutations and the command row: it is the\n * outbox seam that commits a communication record atomically with the business\n * state. A throw from `extend` rolls back the whole command, and an idempotent\n * replay never runs it again (the first committed run already wrote its rows).\n */\nexport interface DurableCommandOptions { readonly extend?: () => void }\nexport interface PluginDurableState {\n get(key: string): DurableRecord | null;\n list(): readonly DurableRecord[];\n execute(command: DurableCommand, options?: DurableCommandOptions): readonly DurableRecord[];\n}\nexport class DurableStateConflictError extends Error {\n readonly code = 'durable_state_conflict';\n constructor() { super('Durable state version conflict'); this.name = 'DurableStateConflictError'; }\n}\n/** Plugins load as independent bundles, so the host's error has a different constructor. */\nexport function isDurableStateConflictError(error: unknown): error is DurableStateConflictError {\n return error instanceof Error && 'code' in error && error.code === 'durable_state_conflict';\n}\nconst MAX_BYTES = 1024 * 1024;\nfunction identifier(value: unknown): asserts value is string {\n if (typeof value !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/.test(value)) throw new Error('Invalid durable state identifier');\n}\n/** Reject objects with behavior, lossy JSON values and cycles before JSON.stringify. */\nfunction encode(value: unknown): string {\n const ancestors = new Set<object>();\n function check(current: unknown, depth: number): void {\n if (depth > 64) throw new Error('Durable state nesting limit exceeded');\n if (current === null || typeof current === 'string' || typeof current === 'boolean') return;\n if (typeof current === 'number' && Number.isFinite(current)) return;\n if (typeof current !== 'object' || current === null || ancestors.has(current)) throw new Error('Durable state must be pure JSON');\n const array = Array.isArray(current);\n if (!array && Object.getPrototypeOf(current) !== Object.prototype && Object.getPrototypeOf(current) !== null) throw new Error('Durable state must be pure JSON');\n ancestors.add(current);\n const descriptors = Object.getOwnPropertyDescriptors(current);\n if (Reflect.ownKeys(current).some(key => typeof key === 'symbol')) throw new Error('Durable state must be pure JSON');\n if (array) {\n const length = (current as unknown[]).length;\n const indices = Object.keys(descriptors).filter(key => key !== 'length');\n if (indices.length !== length || indices.some((key, index) => key !== String(index))) throw new Error('Durable state must be pure JSON');\n }\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (array && key === 'length') continue;\n if (!descriptor.enumerable || !('value' in descriptor)) throw new Error('Durable state must be pure JSON');\n check(descriptor.value, depth + 1);\n }\n ancestors.delete(current);\n }\n check(value, 0);\n const json = JSON.stringify(value);\n if (Buffer.byteLength(json) > MAX_BYTES) throw new Error('Durable state size limit exceeded');\n return json;\n}\ntype Row = { key: string; version: number; value_json: string };\nfunction record(row: Row): DurableRecord {\n return Object.freeze({ key: row.key, version: row.version, value: JSON.parse(row.value_json) as DurableJson });\n}\n\n/** Host-only factory. Inject only the returned namespace capability into trusted plugins.\n * Consumers validate their own record schema. expectedVersion=0 requires absence.\n * Null values are retained records, so versions and historical command IDs never reset.\n */\nexport class PluginDurableStateStore {\n constructor(private readonly db: Database) {}\n /**\n * Host-only: the shared database this store's records live in, so a host-owned\n * durable journal can run its own atomic planner/reader against exactly the\n * same `plugin_durable_records` rows the plugin sees. Never exposed through\n * `PluginServices` and never handed to a plugin.\n */\n get database(): Database { return this.db; }\n forNamespace(namespace: string): PluginDurableState {\n identifier(namespace);\n const db = this.db;\n const get = (key: string): DurableRecord | null => {\n identifier(key);\n const row = db.query<Row, [string, string]>('SELECT key,version,value_json FROM plugin_durable_records WHERE namespace = ? AND key = ?').get(namespace, key);\n return row ? record(row) : null;\n };\n return Object.freeze({\n get,\n list: () => Object.freeze(db.query<Row, [string]>('SELECT key,version,value_json FROM plugin_durable_records WHERE namespace = ? ORDER BY key').all(namespace).map(record)),\n execute: (command: DurableCommand, options?: DurableCommandOptions): readonly DurableRecord[] => {\n identifier(command.commandId);\n if (!Array.isArray(command.mutations) || command.mutations.length === 0 || command.mutations.length > 256) throw new Error('Invalid durable state command');\n if (options !== undefined && options !== null && typeof options.extend !== 'undefined' && typeof options.extend !== 'function') throw new Error('Invalid durable state options');\n const keys = new Set<string>();\n const mutations = command.mutations.map(mutation => {\n identifier(mutation.key);\n if (keys.has(mutation.key) || !Number.isSafeInteger(mutation.expectedVersion) || mutation.expectedVersion < 0 || mutation.expectedVersion >= Number.MAX_SAFE_INTEGER) throw new Error('Invalid durable state mutation');\n keys.add(mutation.key);\n return { key: mutation.key, expectedVersion: mutation.expectedVersion, json: encode(mutation.value) };\n });\n const commandJson = JSON.stringify(mutations);\n if (Buffer.byteLength(commandJson) > MAX_BYTES) throw new Error('Durable state command size limit exceeded');\n const fingerprint = createHash('sha256').update(commandJson).digest('hex');\n return db.transaction(() => {\n const prior = db.query<{ fingerprint: string; result_json: string }, [string, string]>('SELECT fingerprint,result_json FROM plugin_durable_commands WHERE namespace = ? AND command_id = ?').get(namespace, command.commandId);\n if (prior) {\n if (prior.fingerprint !== fingerprint) throw new Error('Durable state command ID already used');\n return Object.freeze((JSON.parse(prior.result_json) as DurableRecord[]).map(item => Object.freeze(item)));\n }\n const results: DurableRecord[] = [];\n for (const mutation of mutations) {\n const current = get(mutation.key);\n if ((current?.version ?? 0) !== mutation.expectedVersion) throw new DurableStateConflictError();\n const version = mutation.expectedVersion + 1;\n db.query(`INSERT INTO plugin_durable_records(namespace,key,version,value_json) VALUES (?,?,?,?)\n ON CONFLICT(namespace,key) DO UPDATE SET version=excluded.version,value_json=excluded.value_json`).run(namespace, mutation.key, version, mutation.json);\n results.push(record({ key: mutation.key, version, value_json: mutation.json }));\n }\n db.query('INSERT INTO plugin_durable_commands(namespace,command_id,fingerprint,result_json) VALUES (?,?,?,?)').run(namespace, command.commandId, fingerprint, JSON.stringify(results));\n // Outbox seam: same transaction, same connection, first execution only.\n options?.extend?.();\n return Object.freeze(results);\n }).immediate();\n },\n });\n }\n}\n",
26
28
  "/**\n * Same-process host RPC adapter (P4): lets the canonical `PluginServiceHost`\n * lifecycle own RPC publications/consumption without a second plugin framework\n * and without faking a wire transport.\n *\n * The parent injects the trusted owner token, endpoint identity, required\n * placement/callee/journal callbacks, and the real host lease callback. Real\n * cross-process transport is NOT implemented: the required placement resolver\n * returns an exact endpoint registered in the exposed runtime, `ambiguous`, or\n * `null` meaning \"use the explicit local channel\". Commands run only through the\n * accepted runtime kernel. Journal-backed policies require `CommandJournal`;\n * application-owned `none` commands may execute without a journal and expose no\n * journal result/reconciliation capability. Caller identity, purpose, scope,\n * leases, and deadlines are host decisions; plugin call options may only carry\n * `signal`/`timeoutMs`/`operationId`, snapshotted without invoking accessors.\n *\n * Command binding errors are mapped once by the kernel to its fixed-code\n * `RpcInvocationError` (own `code`, no cause/message/raw operation id); the\n * client rebuilds a fresh public `RpcServiceError` from that code and the\n * validated operation id of the current call. No error instance is reused.\n */\nimport { assertSupportedServiceDeclarations, isCrossProcessSelfService } from './contracts';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { isProxy } from 'node:util/types';\nimport type {\n PluginServiceConsumption,\n PluginServiceDeclarations,\n PluginServiceProcess,\n PluginServicePublication,\n PluginServiceScope,\n} from './contracts';\nimport {\n RpcServiceRuntime,\n type RpcAdmissionGrant,\n type RpcAdmissionRequest,\n type RpcCaller,\n type RpcCommandAction,\n type RpcCommandExecution,\n type RpcCommandExecutor,\n type RpcDrainResult,\n type RpcEndpointBinding,\n type RpcEndpointHandle,\n type RpcHandlerContext,\n type RpcHandlerMap,\n type RpcInvocationErrorCode,\n type RpcInvokeRequest,\n type RpcRuntimeLimits,\n type RpcRuntimeStatus,\n} from './rpc-runtime';\nimport {\n type CommandAtomicPlanner,\n type CommandExternalExecutor,\n type CommandJournal,\n} from './command-journal';\nimport {\n defineRpcService,\n assertRpcData,\n encodeRpcJson,\n decodeRpcJson,\n RPC_JSON_MAX_BYTES,\n type RpcCallPurpose,\n type InferRpcData,\n type RpcCommandPolicy,\n type RpcJson,\n type RpcMethodDefinition,\n} from './wire-contract';\n\n/* -------------------------------------------------------------------------- */\n/* Fixed-code public errors */\n/* -------------------------------------------------------------------------- */\n\nexport type RpcServiceErrorCode =\n | RpcInvocationErrorCode\n | 'undeclared'\n | 'unavailable'\n | 'ambiguous_placement'\n | 'invalid_registration';\n\nconst SERVICE_ERROR_MESSAGES: Record<RpcServiceErrorCode, string> = {\n unauthorized: 'RPC call is not authorized',\n not_ready: 'RPC endpoint is not ready',\n retired: 'RPC endpoint is retiring',\n revoked: 'RPC endpoint generation was revoked',\n unsupported_method: 'RPC method is not published',\n wrong_purpose: 'RPC method is not published for this purpose',\n invalid_input: 'RPC input is not valid',\n invalid_output: 'RPC output is not valid',\n invalid_operation_id: 'RPC command operation id is invalid',\n overloaded: 'RPC runtime is at capacity',\n cancelled: 'RPC call was cancelled',\n timeout: 'RPC call deadline exceeded',\n unknown: 'RPC command outcome is unknown',\n capability_unavailable: 'RPC command execution is unavailable',\n closed: 'RPC runtime is closed',\n failed: 'RPC call failed',\n conflict: 'RPC command identity conflicts with an existing record',\n expired: 'RPC command result has expired',\n pending: 'RPC command is still pending',\n rejected: 'RPC command was rejected',\n missing: 'RPC command has no stored result',\n storage_failure: 'RPC command storage failed',\n deadlock: 'RPC call chain would deadlock',\n call_depth_exceeded: 'RPC call depth exceeded',\n undeclared: 'RPC service is not declared by the manifest',\n unavailable: 'RPC service is unavailable',\n ambiguous_placement: 'RPC service placement is ambiguous',\n invalid_registration: 'RPC registration is invalid',\n};\n\nconst SERVICE_ERROR_CODES = new Set<RpcServiceErrorCode>(Object.keys(SERVICE_ERROR_MESSAGES) as RpcServiceErrorCode[]);\n\n/** Fixed-code error. It never carries a provider cause, message, or payload. */\nexport class RpcServiceError extends Error {\n readonly name = 'RpcServiceError';\n readonly code: RpcServiceErrorCode;\n readonly operationId: string | null;\n\n constructor(code: RpcServiceErrorCode, operationId: string | null = null) {\n super(SERVICE_ERROR_MESSAGES[code]);\n this.code = code;\n this.operationId = operationId;\n }\n}\n\nfunction ownStringProperty(target: unknown, name: string): string | null {\n if (target === null || (typeof target !== 'object' && typeof target !== 'function')) return null;\n let descriptor: PropertyDescriptor | undefined;\n try { descriptor = Object.getOwnPropertyDescriptor(target, name); } catch { return null; }\n if (descriptor === undefined || !('value' in descriptor) || typeof descriptor.value !== 'string') return null;\n return descriptor.value;\n}\n\n/**\n * Rebuilds a fresh public error from the kernel's fixed code and the validated\n * operation id of THIS call. It never reuses the incoming instance, never reads\n * its operation id, and never reads a cause or message.\n */\nexport function toRpcServiceError(error: unknown, operationId: string | null): RpcServiceError {\n const raw = ownStringProperty(error, 'code');\n const code = raw !== null && SERVICE_ERROR_CODES.has(raw as RpcServiceErrorCode)\n ? raw as RpcServiceErrorCode\n : 'failed';\n return new RpcServiceError(code, operationId);\n}\n\n/* -------------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------------- */\n\nexport interface RpcCallOptions {\n readonly signal?: AbortSignal;\n readonly timeoutMs?: number;\n readonly operationId?: string;\n}\n\nexport type RpcCommandClientExtras<D extends RpcMethodDefinition> = D extends { readonly command: RpcCommandPolicy }\n ? {\n /** Durable committed result query; runs through the same runtime lease/deadline as execute. */\n queryResult(operationId: string): Promise<InferRpcData<D['output']>>;\n /** Explicit host-authorized reconciliation for an unknown command outcome. */\n reconcile(operationId: string, input: InferRpcData<D['input']>): Promise<InferRpcData<D['output']>>;\n }\n : Record<never, never>;\n\nexport type RpcMethodClient<D extends RpcMethodDefinition> =\n ((input: InferRpcData<D['input']>, options?: RpcCallOptions) => Promise<InferRpcData<D['output']>>)\n & RpcCommandClientExtras<D>;\n\n/** Public plugin-facing RPC client derived from a literal contract. */\nexport type AsyncRpcClient<M extends Record<string, RpcMethodDefinition>> = {\n readonly [K in keyof M]: RpcMethodClient<M[K]>;\n};\n\n/** Logical placement identity, independent of any physical address or generation. */\nexport interface HostRpcServiceDescriptor {\n readonly provider: string;\n readonly service: string;\n readonly major: number;\n readonly kind: 'rpc';\n readonly process: PluginServiceProcess;\n readonly scope: PluginServiceScope;\n}\n\n/** Physical endpoint identity supplied by the trusted host for one owner instance. */\nexport interface HostRpcLifecycleIdentity {\n readonly endpoint: string;\n readonly instance: string;\n readonly generation: number;\n readonly catalog: string;\n /** Trusted callee subject; never derived from plugin input. */\n readonly subject: string;\n}\n\n/** Canonical owner lifecycle view; the adapter never keeps a second copy. */\nexport interface HostRpcLifecycleState {\n readonly ready: boolean;\n readonly retiring: boolean;\n readonly revoked: boolean;\n}\n\n/** Host-minted invocation frame; the real principal lives in the host callee frame. */\nexport interface HostRpcInvocationContext {\n readonly purpose: RpcCallPurpose;\n /** Opaque host correlation token; the leaf only trusts the required resolver. */\n readonly token: object;\n readonly signal?: AbortSignal;\n readonly deadlineAt?: number;\n}\n\nexport interface HostRpcLeaseRequest {\n readonly role: 'caller' | 'callee';\n readonly plugin: string;\n readonly scope: string;\n readonly state: HostRpcLifecycleState;\n readonly purpose: RpcCallPurpose;\n readonly operationId: string | null;\n /** Logical target provider. */\n readonly provider: string;\n}\n\nexport interface HostRpcLeaseGrant {\n readonly release: () => void;\n /** Host-verified existing request lease; only honored for request/attempt. */\n readonly allowRetired?: boolean;\n}\n\nexport type HostRpcAcquireLease = (request: HostRpcLeaseRequest) => HostRpcLeaseGrant;\n\nexport interface HostRpcMethodCapability {\n /** Synchronous private-state CAS planner for a `local-transaction` command. */\n readonly atomic?: CommandAtomicPlanner;\n /** Reconcile capability for an `external-contract` command. */\n readonly external?: CommandExternalExecutor;\n}\n\nexport type HostRpcCommandCapabilities<M extends Record<string, RpcMethodDefinition>> = {\n readonly [K in keyof M]?: HostRpcMethodCapability;\n};\n\n/** Everything the canonical host exposes for one owner to use RPC services. */\nexport interface HostRpcOwnerInput {\n readonly token: object;\n readonly plugin: string;\n /** Canonical owner scope: `'global'` or a trusted binding scope key. */\n readonly scope: string;\n readonly declarations: PluginServiceDeclarations;\n readonly dependencies: Readonly<Record<string, string>>;\n readonly lifecycle: HostRpcLifecycleIdentity;\n /** Canonical lifecycle source of truth; the adapter copies nothing. */\n readonly getLifecycleState: () => HostRpcLifecycleState;\n readonly acquireLease: HostRpcAcquireLease;\n readonly registerPublication?: (publication: PluginServicePublication) => void;\n readonly registerConsumption?: (consumption: PluginServiceConsumption, localProviderToken?: object) => void;\n readonly onDispose?: (cleanup: () => void) => void;\n readonly canCall?: (target: { readonly provider: string; readonly service: string; readonly major: number; readonly method: string }) => boolean;\n /** Required host invocation-frame resolver; null for plain plugin background calls. */\n readonly resolveInvocationContext: () => HostRpcInvocationContext | null;\n}\n\n/** Trusted peer broker input. This capability is never part of PluginServices. */\nexport interface HostRpcRemoteCallerInput extends HostRpcOwnerInput {\n readonly process: PluginServiceProcess;\n /** Must verify the current authenticated peer frame and logical caller authority. */\n readonly authorizeIncoming: (request: RpcAdmissionRequest, endpoint: NonNullable<ReturnType<RpcServiceRuntime['endpointInfo']>>) => boolean;\n}\n\nexport interface HostRpcRemoteCallerHandle {\n invokeTracked(request: Omit<RpcInvokeRequest, 'caller' | 'callerToken'>): ReturnType<RpcServiceRuntime['invokeTracked']>;\n dispose(): Promise<RpcDrainResult>;\n}\n\n/** Exact placement delegated to the host. `null` means \"use the explicit local channel\". */\nexport type HostRpcPlacementResolution =\n | { readonly kind: 'endpoint'; readonly endpoint: RpcEndpointHandle }\n | { readonly kind: 'ambiguous' }\n | null\n | undefined;\n\nexport interface HostRpcPlacementRequest {\n readonly provider: string;\n readonly service: string;\n readonly major: number;\n readonly method: string;\n readonly scope: PluginServiceScope;\n readonly bindingScope?: string;\n readonly caller: RpcCaller;\n readonly purpose?: RpcCallPurpose;\n}\n\nexport type HostRpcPlacementResolver = (request: HostRpcPlacementRequest) => HostRpcPlacementResolution;\n\nexport interface HostRpcJournalRequest {\n readonly provider: string;\n readonly service: string;\n readonly major: number;\n readonly method: string;\n readonly scope: PluginServiceScope;\n /** Binding scope key when `scope` is `binding`; keeps two bindings apart. */\n readonly bindingScope?: string;\n readonly policy: RpcCommandPolicy;\n readonly atomic?: CommandAtomicPlanner;\n readonly external?: CommandExternalExecutor;\n}\n\n/** Host-owned durable journal factory; `null` refuses commands for this key. */\nexport type HostRpcJournalResolver = (request: HostRpcJournalRequest) => CommandJournal | null;\n\n/** Trusted opaque callee context resolver. */\nexport type HostRpcCalleeResolver = (request: RpcAdmissionRequest, publication: HostRpcServiceDescriptor) => unknown;\n\n/**\n * Host-provided frame for one admitted native RPC handler. It lets the SAME\n * `PluginServiceHost` invocation store the real purpose/deadline/cancellation\n * for the duration of the handler, bound to the exact published owner, so a\n * channel operation started inside a native handler is authorized by the real\n * frame (never downgraded to `background`, never given a forged purpose).\n */\nexport interface HostRpcHandlerFrame {\n readonly purpose: RpcCallPurpose;\n readonly deadlineAt?: number;\n readonly signal?: AbortSignal;\n /** Exact published owner the call targets; `null` for a remote (peer) route. */\n readonly ownerToken: object | null;\n readonly operationId: string | null;\n}\n\nexport interface HostRpcAdapterOptions {\n readonly process: PluginServiceProcess;\n readonly limits?: RpcRuntimeLimits;\n readonly hostLifetime?: AbortSignal;\n readonly maxCallDepth?: number;\n /** Required host placement authority. */\n readonly resolvePlacement: HostRpcPlacementResolver;\n /** Required host journal authority. */\n readonly resolveJournal: HostRpcJournalResolver;\n /** Required trusted opaque callee frame authority. */\n readonly resolveCallee: HostRpcCalleeResolver;\n /**\n * Host callback that enters the exact published owner's trusted invocation\n * frame for one native handler call. The canonical `PluginServiceHost` wires\n * it to its OWN invocation store, so a native RPC handler shares one\n * purpose/deadline/cancel resolver with local dispatch and channel work.\n */\n readonly enterHostHandlerFrame?: (frame: HostRpcHandlerFrame, run: () => unknown) => unknown;\n}\n\nexport interface HostRpcPublication {\n readonly descriptor: HostRpcServiceDescriptor;\n}\n\n/** Host-only readonly directory entry for one real registered publication. */\nexport interface HostRpcPublicationView {\n readonly provider: string;\n readonly service: string;\n readonly major: number;\n readonly scope: PluginServiceScope;\n readonly scopeKey: string;\n readonly ready: boolean;\n readonly lifecycle: HostRpcLifecycleIdentity;\n /** The kernel-selected binding of the exact endpoint handle; never re-derived. */\n readonly binding: RpcEndpointBinding;\n}\n\nexport interface HostRpcOwnerHandle {\n readonly owner: HostRpcOwnerInput;\n publish<const M extends Record<string, RpcMethodDefinition>>(\n contract: { readonly id: string; readonly version: number; readonly methods: M },\n handlers: RpcHandlerMap<M, unknown>,\n capabilities?: HostRpcCommandCapabilities<M>,\n ): HostRpcPublication;\n consume<const M extends Record<string, RpcMethodDefinition>>(\n provider: string,\n contract: { readonly id: string; readonly version: number; readonly methods: M },\n ): AsyncRpcClient<M>;\n /** Canonical host hook: ready maps to kernel `markReady`. */\n markReady(): void;\n /** Canonical host hook: retirement maps to kernel `retire`. */\n retire(): void;\n /**\n * Canonical host hook: disposal maps to kernel `revoke` + bounded `drain`.\n * Returns the REAL drain verdict; `drained: false` is reported, never hidden.\n */\n dispose(): Promise<RpcDrainResult>;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Internal helpers */\n/* -------------------------------------------------------------------------- */\n\nconst SEP = '\\0';\nconst DEFAULT_MAX_CALL_DEPTH = 32;\nconst CALL_OPTION_KEYS = ['signal', 'timeoutMs', 'operationId'] as const;\nconst EMPTY_OPTIONS: RpcCallOptions = Object.freeze({});\n\ninterface ActiveFrame {\n readonly purpose: RpcCallPurpose;\n readonly depth: number;\n readonly chain: readonly string[];\n readonly deadlineAt: number;\n readonly signal: AbortSignal;\n}\n\n/** Host frame inheritance only: purpose, call chain, deadline, and cancellation. */\nconst FRAME_STORE = new AsyncLocalStorage<ActiveFrame>();\n\ninterface RegisteredPublication {\n readonly key: string;\n readonly handle: RpcEndpointHandle;\n readonly provider: string;\n readonly scopeKey: string;\n readonly scope: PluginServiceScope;\n readonly contractId: string;\n readonly contractVersion: number;\n readonly ownerState: OwnerState;\n}\n\ninterface OwnerState {\n readonly owner: HostRpcOwnerInput;\n readonly plugin: string;\n readonly scope: string;\n readonly scopeKind: PluginServiceScope;\n readonly callerSubject: string;\n readonly lifecycle: HostRpcLifecycleIdentity;\n readonly publications: Set<RegisteredPublication>;\n readonly process: PluginServiceProcess;\n readonly local: boolean;\n readonly authorizeIncoming?: HostRpcRemoteCallerInput['authorizeIncoming'];\n /** RPC capability revocation, independent of eventual resource reclamation. */\n revoked: boolean;\n released: boolean;\n}\n\ninterface CalleeInfo {\n readonly provider: string;\n readonly scopeKey: string;\n readonly scope: PluginServiceScope;\n readonly frame: unknown;\n /** Exact published owner token, or `null` for a remote (peer) route. */\n readonly ownerToken: object | null;\n}\n\ntype Handler = (input: unknown, context: RpcHandlerContext<unknown>) => unknown;\n\ntype RouteResolution =\n | { readonly kind: 'publication'; readonly publication: RegisteredPublication }\n | { readonly kind: 'remote'; readonly handle: RpcEndpointHandle }\n | { readonly kind: 'ambiguous' }\n | { readonly kind: 'missing' };\n\nconst CALLEE_INFO = new WeakMap<object, CalleeInfo>();\n\n/** Reads the trusted opaque callee frame the host resolver produced for an admitted call. */\nexport function readHostRpcCalleeFrame(callee: unknown): unknown {\n if (callee === null || typeof callee !== 'object') return null;\n return CALLEE_INFO.get(callee as object)?.frame ?? null;\n}\n\nfunction publicationKey(provider: string, scopeKey: string, service: string, major: number): string {\n return `${provider}${SEP}${scopeKey}${SEP}${service}${SEP}${major}`;\n}\n\nfunction scopeKindOf(scope: string): PluginServiceScope {\n return scope === 'global' ? 'global' : 'binding';\n}\n\nfunction callerSubjectFor(plugin: string, scope: string): string {\n return scope === 'global' ? plugin : `${plugin}@${scope}`;\n}\n\nfunction normalizeOperationId(operationId: unknown): string {\n if (typeof operationId !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(operationId)) {\n throw new RpcServiceError('invalid_operation_id');\n }\n return operationId;\n}\n\n/** Combines cancellation signals without depending on `AbortSignal.any` being present. */\nfunction anySignal(signals: readonly AbortSignal[]): AbortSignal {\n if (signals.length === 1) return signals[0];\n const native = (AbortSignal as unknown as { any?: (values: AbortSignal[]) => AbortSignal }).any;\n if (typeof native === 'function') return native.call(AbortSignal, [...signals]);\n const controller = new AbortController();\n const abort = (): void => controller.abort();\n for (const signal of signals) {\n if (signal.aborted) { abort(); break; }\n signal.addEventListener('abort', abort, { once: true });\n }\n return controller.signal;\n}\n\nfunction requirePurpose(definition: RpcMethodDefinition, purpose: RpcCallPurpose): RpcCallPurpose {\n if (!definition.purposes.includes(purpose)) throw new RpcServiceError('wrong_purpose');\n return purpose;\n}\n\n/** Own-descriptor snapshot of the trusted lifecycle identity; no accessor ever runs. */\nfunction snapshotLifecycle(value: unknown): HostRpcLifecycleIdentity {\n if (value === null || typeof value !== 'object' || isProxy(value)) throw new RpcServiceError('invalid_registration');\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) throw new RpcServiceError('invalid_registration');\n const read = (name: string): unknown => {\n const descriptor = Object.getOwnPropertyDescriptor(value, name);\n if (descriptor === undefined || !descriptor.enumerable || !('value' in descriptor)) {\n throw new RpcServiceError('invalid_registration');\n }\n return descriptor.value;\n };\n const allowed = new Set(['endpoint', 'instance', 'generation', 'catalog', 'subject']);\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string' || !allowed.has(key)) throw new RpcServiceError('invalid_registration');\n }\n const endpoint = read('endpoint');\n const instance = read('instance');\n const generation = read('generation');\n const catalog = read('catalog');\n const subject = read('subject');\n if (typeof endpoint !== 'string' || !endpoint || typeof instance !== 'string' || !instance\n || !Number.isSafeInteger(generation) || (generation as number) < 1\n || typeof catalog !== 'string' || typeof subject !== 'string' || !subject) {\n throw new RpcServiceError('invalid_registration');\n }\n return Object.freeze({ endpoint, instance, generation: generation as number, catalog, subject });\n}\n\n/** Own-descriptor snapshot of a dependencies record; accessors are rejected, never invoked. */\nfunction snapshotDependencies(value: unknown): Readonly<Record<string, string>> {\n if (value === undefined) return Object.freeze({});\n if (value === null || typeof value !== 'object' || isProxy(value)) throw new RpcServiceError('invalid_registration');\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) throw new RpcServiceError('invalid_registration');\n const result: Record<string, string> = {};\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string') throw new RpcServiceError('invalid_registration');\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor === undefined || !descriptor.enumerable || !('value' in descriptor) || typeof descriptor.value !== 'string') {\n throw new RpcServiceError('invalid_registration');\n }\n result[key] = descriptor.value;\n }\n return Object.freeze(result);\n}\n\n/**\n * Copies own enumerable data-function properties only. Accessors, proxies,\n * prototype methods, symbol keys, and unknown keys are rejected before any value\n * is read, so no plugin getter ever runs.\n */\nfunction snapshotHandlers(methods: Record<string, RpcMethodDefinition>, handler: unknown): Map<string, Handler> {\n if (handler === null || typeof handler !== 'object' || isProxy(handler)) throw new RpcServiceError('invalid_registration');\n const prototype = Object.getPrototypeOf(handler);\n if (prototype !== Object.prototype && prototype !== null) throw new RpcServiceError('invalid_registration');\n const allowed = new Set(Object.keys(methods));\n const collected = new Map<string, Handler>();\n for (const key of Reflect.ownKeys(handler)) {\n if (typeof key !== 'string' || !allowed.has(key)) throw new RpcServiceError('invalid_registration');\n const descriptor = Object.getOwnPropertyDescriptor(handler, key);\n if (descriptor === undefined || !descriptor.enumerable || !('value' in descriptor) || typeof descriptor.value !== 'function') {\n throw new RpcServiceError('invalid_registration');\n }\n collected.set(key, descriptor.value as Handler);\n }\n for (const name of allowed) if (!collected.has(name)) throw new RpcServiceError('invalid_registration');\n return collected;\n}\n\n/**\n * Snapshots one command capability through own descriptors only. Proxies, accessors,\n * unknown keys, and non-function planner/reconcile values are rejected before any\n * value is read, so no plugin getter ever runs and no mutable capability object is\n * retained.\n */\nfunction snapshotCapability(value: unknown): HostRpcMethodCapability {\n if (value === null || typeof value !== 'object' || isProxy(value)) throw new RpcServiceError('invalid_registration');\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) throw new RpcServiceError('invalid_registration');\n let atomic: CommandAtomicPlanner | undefined;\n let external: CommandExternalExecutor | undefined;\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string' || (key !== 'atomic' && key !== 'external')) throw new RpcServiceError('invalid_registration');\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor === undefined || !descriptor.enumerable || !('value' in descriptor)) {\n throw new RpcServiceError('invalid_registration');\n }\n if (key === 'atomic') {\n if (typeof descriptor.value !== 'function') throw new RpcServiceError('invalid_registration');\n atomic = descriptor.value as CommandAtomicPlanner;\n } else {\n external = snapshotExternal(descriptor.value);\n }\n }\n const record: { atomic?: CommandAtomicPlanner; external?: CommandExternalExecutor } = {};\n if (atomic !== undefined) record.atomic = atomic;\n if (external !== undefined) record.external = external;\n return Object.freeze(record);\n}\n\n/** Snapshots the `external.reconcile` function without retaining the plugin's object. */\nfunction snapshotExternal(value: unknown): CommandExternalExecutor {\n if (value === null || typeof value !== 'object' || isProxy(value)) throw new RpcServiceError('invalid_registration');\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) throw new RpcServiceError('invalid_registration');\n for (const key of Reflect.ownKeys(value)) {\n if (key !== 'reconcile') throw new RpcServiceError('invalid_registration');\n }\n const descriptor = Object.getOwnPropertyDescriptor(value, 'reconcile');\n if (descriptor === undefined || !descriptor.enumerable || !('value' in descriptor) || typeof descriptor.value !== 'function') {\n throw new RpcServiceError('invalid_registration');\n }\n return Object.freeze({ reconcile: descriptor.value as CommandExternalExecutor['reconcile'] });\n}\n\n/**\n * Descriptor-safe snapshot of the command capabilities record. Every key must name a\n * declared command method; accessors, proxies, symbol keys, unknown/non-command\n * methods, and unknown capability fields are rejected before `register`, so a failed\n * snapshot can never leave a ghost endpoint. The snapshot is frozen and independent\n * of the plugin's mutable objects.\n */\nfunction snapshotCapabilities(\n methodTable: Record<string, RpcMethodDefinition>,\n value: unknown,\n): Readonly<Record<string, HostRpcMethodCapability>> | null {\n if (value === undefined) return null;\n if (value === null || typeof value !== 'object' || isProxy(value)) throw new RpcServiceError('invalid_registration');\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) throw new RpcServiceError('invalid_registration');\n const record: Record<string, HostRpcMethodCapability> = {};\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string' || !Object.hasOwn(methodTable, key)) throw new RpcServiceError('invalid_registration');\n const definition = methodTable[key];\n if (definition === undefined || definition.kind !== 'command') throw new RpcServiceError('invalid_registration');\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor === undefined || !descriptor.enumerable || !('value' in descriptor)) {\n throw new RpcServiceError('invalid_registration');\n }\n if (descriptor.value === undefined) continue;\n record[key] = snapshotCapability(descriptor.value);\n }\n return Object.freeze(record);\n}\n\n/** Snapshots plugin call options without invoking accessors or accepting unknown keys. */\nfunction snapshotCallOptions(options: RpcCallOptions | undefined): RpcCallOptions {\n if (options === undefined) return EMPTY_OPTIONS;\n if (options === null || typeof options !== 'object' || isProxy(options)) throw new RpcServiceError('invalid_input');\n const prototype = Object.getPrototypeOf(options);\n if (prototype !== Object.prototype && prototype !== null) throw new RpcServiceError('invalid_input');\n const result: { signal?: AbortSignal; timeoutMs?: number; operationId?: string } = {};\n for (const key of Reflect.ownKeys(options)) {\n if (typeof key !== 'string' || !(CALL_OPTION_KEYS as readonly string[]).includes(key)) {\n throw new RpcServiceError('invalid_input');\n }\n const descriptor = Object.getOwnPropertyDescriptor(options, key);\n if (descriptor === undefined || !descriptor.enumerable || !('value' in descriptor)) {\n throw new RpcServiceError('invalid_input');\n }\n (result as Record<string, unknown>)[key] = descriptor.value;\n }\n if (result.signal !== undefined && !(result.signal instanceof AbortSignal)) throw new RpcServiceError('invalid_input');\n if (result.timeoutMs !== undefined\n && (typeof result.timeoutMs !== 'number' || !Number.isSafeInteger(result.timeoutMs) || result.timeoutMs < 0)) {\n throw new RpcServiceError('invalid_input');\n }\n if (result.operationId !== undefined && typeof result.operationId !== 'string') throw new RpcServiceError('invalid_input');\n return Object.freeze(result);\n}\n\nfunction defineContract<const M extends Record<string, RpcMethodDefinition>>(\n contract: { readonly id: string; readonly version: number; readonly methods: M },\n): { readonly id: string; readonly version: number; readonly methods: M } {\n try {\n return defineRpcService(contract) as unknown as { readonly id: string; readonly version: number; readonly methods: M };\n } catch {\n throw new RpcServiceError('invalid_registration');\n }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Adapter */\n/* -------------------------------------------------------------------------- */\n\nexport class HostRpcAdapter {\n readonly runtime: RpcServiceRuntime<unknown>;\n readonly #options: HostRpcAdapterOptions;\n readonly #process: PluginServiceProcess;\n readonly #maxCallDepth: number;\n readonly #ownersByToken = new WeakMap<object, OwnerState>();\n readonly #ownersByCaller = new Map<string, OwnerState>();\n readonly #publications = new Map<string, RegisteredPublication>();\n readonly #capabilities = new Map<string, Readonly<Record<string, HostRpcMethodCapability>>>();\n #closed = false;\n\n constructor(options: HostRpcAdapterOptions) {\n if (options === null || typeof options !== 'object' || typeof options.process !== 'string') {\n throw new RpcServiceError('invalid_registration');\n }\n if (typeof options.resolvePlacement !== 'function' || typeof options.resolveJournal !== 'function'\n || typeof options.resolveCallee !== 'function') {\n throw new RpcServiceError('invalid_registration');\n }\n this.#options = options;\n this.#process = options.process;\n this.#maxCallDepth = Number.isSafeInteger(options.maxCallDepth) && (options.maxCallDepth as number) > 0\n ? options.maxCallDepth as number : DEFAULT_MAX_CALL_DEPTH;\n this.runtime = new RpcServiceRuntime<unknown>({\n admit: (request) => this.#admit(request),\n commandExecutor: this.#commandExecutor(),\n hostLifetime: options.hostLifetime,\n limits: options.limits,\n });\n }\n\n status(): RpcRuntimeStatus {\n return this.runtime.status();\n }\n\n /**\n * Host-only readonly directory of this adapter's *real* registered\n * publications: the kernel-selected binding (endpoint/process/instance/\n * generation/catalog/scope/subject) of the exact endpoint handle, its owner\n * lifecycle identity and its current readiness. It is a plain snapshot for\n * host decision making (peer routing/validation); it grants nothing, exposes\n * no SDK surface and is never exposed through `PluginServices`.\n */\n publicationView(): readonly HostRpcPublicationView[] {\n const view: HostRpcPublicationView[] = [];\n for (const publication of this.#publications.values()) {\n const info = this.runtime.endpointInfo(publication.handle);\n if (info === null) continue;\n const lifecycle = publication.ownerState.lifecycle;\n const state = publication.ownerState.owner.getLifecycleState();\n view.push(Object.freeze({\n provider: publication.provider,\n service: publication.contractId,\n major: publication.contractVersion,\n scope: publication.scope,\n scopeKey: publication.scopeKey,\n ready: state.ready && !state.retiring && !state.revoked,\n lifecycle: Object.freeze({\n endpoint: lifecycle.endpoint, instance: lifecycle.instance,\n generation: lifecycle.generation, catalog: lifecycle.catalog, subject: lifecycle.subject,\n }),\n binding: info.binding,\n }));\n }\n return Object.freeze(view);\n }\n\n /** Closes the process runtime; the parent awaits this in the canonical shutdown. */\n async dispose(options: { readonly timeoutMs?: number } = {}) {\n this.#closed = true;\n return this.runtime.dispose(options);\n }\n\n /* ------------------------------ owners ---------------------------------- */\n\n createOwner(input: HostRpcOwnerInput): HostRpcOwnerHandle {\n return this.#ownerHandle(this.#createOwnerState(input, this.#process, true));\n }\n\n /** Imports an authenticated concrete caller, not a plugin instance or SDK facade. */\n createRemoteCaller(input: HostRpcRemoteCallerInput): HostRpcRemoteCallerHandle {\n if (!['control', 'worker', 'ingress'].includes(input?.process) || typeof input?.authorizeIncoming !== 'function') {\n throw new RpcServiceError('invalid_registration');\n }\n const authorize = input.authorizeIncoming;\n const state = this.#createOwnerState(input, input.process, false, authorize);\n return Object.freeze({\n invokeTracked: (request: Omit<RpcInvokeRequest, 'caller' | 'callerToken'>) => this.runtime.invokeTracked({\n ...request, caller: Object.freeze({ subject: state.callerSubject, scope: state.scopeKind }), callerToken: state.owner.token,\n }),\n dispose: () => this.#disposeOwner(state),\n });\n }\n\n #createOwnerState(input: HostRpcOwnerInput, process: PluginServiceProcess, local: boolean,\n authorizeIncoming?: HostRpcRemoteCallerInput['authorizeIncoming']): OwnerState {\n if (this.#closed) throw new RpcServiceError('closed');\n if (input === null || typeof input !== 'object' || input.token === null || typeof input.token !== 'object') {\n throw new RpcServiceError('invalid_registration');\n }\n if (typeof input.plugin !== 'string' || !input.plugin || typeof input.scope !== 'string' || !input.scope) {\n throw new RpcServiceError('invalid_registration');\n }\n if (typeof input.getLifecycleState !== 'function' || typeof input.acquireLease !== 'function'\n || typeof input.resolveInvocationContext !== 'function') {\n throw new RpcServiceError('invalid_registration');\n }\n if (this.#ownersByToken.has(input.token)) throw new RpcServiceError('invalid_registration');\n const callerSubject = callerSubjectFor(input.plugin, input.scope);\n if (local && this.#ownersByCaller.has(callerSubject)) throw new RpcServiceError('invalid_registration');\n const state: OwnerState = {\n owner: input,\n plugin: input.plugin,\n scope: input.scope,\n scopeKind: scopeKindOf(input.scope),\n callerSubject,\n lifecycle: snapshotLifecycle(input.lifecycle),\n publications: new Set(),\n process, local, authorizeIncoming,\n revoked: false,\n released: false,\n };\n // Fail closed before any publication: dependency records must be snapshot-clean.\n snapshotDependencies(input.dependencies);\n if (Object.hasOwn(input, 'optionalDependencies')) throw new RpcServiceError('invalid_registration');\n try { assertSupportedServiceDeclarations(input.declarations); } catch { throw new RpcServiceError('invalid_registration'); }\n this.#ownersByToken.set(input.token, state);\n if (local) this.#ownersByCaller.set(callerSubject, state);\n return state;\n }\n\n #ownerHandle(state: OwnerState): HostRpcOwnerHandle {\n return Object.freeze({\n owner: state.owner,\n publish: <const M extends Record<string, RpcMethodDefinition>>(\n contract: { readonly id: string; readonly version: number; readonly methods: M },\n handlers: RpcHandlerMap<M, unknown>,\n capabilities?: HostRpcCommandCapabilities<M>,\n ) => this.#publish(state, contract, handlers, capabilities),\n consume: <const M extends Record<string, RpcMethodDefinition>>(\n provider: string,\n contract: { readonly id: string; readonly version: number; readonly methods: M },\n ) => this.#consume(state, provider, contract),\n markReady: () => { this.#markReady(state); },\n retire: () => { this.#retire(state); },\n dispose: () => this.#disposeOwner(state),\n });\n }\n\n #markReady(state: OwnerState): void {\n if (state.revoked || state.released || this.#closed) throw new RpcServiceError('closed');\n for (const publication of state.publications) this.runtime.markReady(publication.handle);\n }\n\n #retire(state: OwnerState): void {\n if (state.released) return;\n for (const publication of state.publications) this.runtime.retire(publication.handle);\n }\n\n /** Revoke + REAL bounded drain. Resources are dropped only after a drained verdict. */\n async #disposeOwner(state: OwnerState): Promise<RpcDrainResult> {\n if (state.released) return Object.freeze({ drained: true, active: 0 });\n state.revoked = true;\n this.runtime.revokeCaller(state.callerSubject, state.owner.token);\n for (const publication of state.publications) this.runtime.revoke(publication.handle);\n const result = await this.runtime.drainOwner(state.callerSubject, [...state.publications].map(publication => publication.handle), { callerToken: state.owner.token });\n if (result.drained) this.#releaseOwner(state);\n return result;\n }\n\n /** Drops publication/capability/owner mapping so the same logical owner can be recreated. */\n #releaseOwner(state: OwnerState): void {\n for (const publication of state.publications) {\n this.#publications.delete(publication.key);\n this.#capabilities.delete(publication.key);\n }\n state.publications.clear();\n state.released = true;\n if (this.#ownersByCaller.get(state.callerSubject) === state) this.#ownersByCaller.delete(state.callerSubject);\n }\n\n /* ---------------------------- publications ------------------------------ */\n\n #publish<const M extends Record<string, RpcMethodDefinition>>(\n state: OwnerState,\n contractInput: { readonly id: string; readonly version: number; readonly methods: M },\n handlers: RpcHandlerMap<M, unknown>,\n capabilities?: HostRpcCommandCapabilities<M>,\n ): HostRpcPublication {\n const lifecycleState = state.owner.getLifecycleState();\n if (state.revoked || state.released || this.#closed || lifecycleState.revoked || lifecycleState.retiring) {\n throw new RpcServiceError('closed');\n }\n const contract = defineContract(contractInput);\n if (this.#matchPublication(state, contract.id, contract.version) === null) throw new RpcServiceError('undeclared');\n const key = publicationKey(state.plugin, state.scope, contract.id, contract.version);\n // Duplicate detection happens BEFORE register so no ghost endpoint is created.\n if (this.#publications.has(key)) throw new RpcServiceError('invalid_registration');\n const methodTable = contract.methods as Record<string, RpcMethodDefinition>;\n const collected = snapshotHandlers(methodTable, handlers);\n // Snapshot capabilities BEFORE `register`: a hostile accessor must fail closed with\n // zero endpoints and no parent publication callback, never leave a ghost endpoint.\n const capabilityRecord = snapshotCapabilities(methodTable, capabilities);\n const wrapped: Record<string, Handler> = {};\n for (const [name, definition] of Object.entries(methodTable)) {\n const chainKey = `${state.plugin}${SEP}${state.scope}${SEP}${contract.id}${SEP}${contract.version}${SEP}${name}`;\n wrapped[name] = this.#wrapHandler(collected.get(name) as Handler, definition, chainKey);\n }\n const binding: RpcEndpointBinding = {\n endpoint: state.lifecycle.endpoint,\n process: this.#process,\n instance: state.lifecycle.instance,\n generation: state.lifecycle.generation,\n catalog: state.lifecycle.catalog,\n scope: state.scopeKind,\n subject: state.lifecycle.subject,\n };\n let handle: RpcEndpointHandle;\n try {\n handle = this.runtime.register({\n provider: state.plugin,\n binding,\n contract,\n handler: wrapped as unknown as RpcHandlerMap<M, unknown>,\n });\n } catch {\n throw new RpcServiceError('invalid_registration');\n }\n const descriptor: HostRpcServiceDescriptor = Object.freeze({\n provider: state.plugin, service: contract.id, major: contract.version, kind: 'rpc',\n process: this.#process, scope: state.scopeKind,\n });\n const publication: RegisteredPublication = {\n key, handle, provider: state.plugin, scopeKey: state.scope, scope: state.scopeKind,\n contractId: contract.id, contractVersion: contract.version, ownerState: state,\n };\n this.#publications.set(key, publication);\n state.publications.add(publication);\n if (capabilityRecord !== null && Object.keys(capabilityRecord).length > 0) {\n this.#capabilities.set(key, capabilityRecord);\n }\n try {\n state.owner.registerPublication?.({\n id: contract.id, version: contract.version, kind: 'rpc', process: this.#process, scope: 'global',\n });\n } catch {\n // Roll back completely: no ghost endpoint, no reservation, no capability.\n this.runtime.revoke(handle);\n this.#publications.delete(key);\n this.#capabilities.delete(key);\n state.publications.delete(publication);\n throw new RpcServiceError('invalid_registration');\n }\n return Object.freeze({ descriptor });\n }\n\n #wrapHandler(original: Handler, definition: RpcMethodDefinition, chainKey: string): Handler {\n // Commands are framed once by `#commandExecutor` for the whole journal capability\n // (execute/query/reconcile); framing the business handler again here would inflate\n // depth and could manufacture false same-method cycles.\n if (definition.kind === 'command') return original;\n return (input, context) => this.#runInFrame(context, chainKey, () => original(input, context));\n }\n\n /** Runs `run` inside one inherited host frame: purpose, chain, deadline, cancellation. */\n #runInFrame(context: RpcHandlerContext<unknown>, chainKey: string, run: () => unknown): unknown {\n const parent = FRAME_STORE.getStore() ?? null;\n const depth = (parent?.depth ?? 0) + 1;\n if (depth > this.#maxCallDepth) throw new RpcServiceError('call_depth_exceeded', context.operationId);\n const actualDeadline = typeof context.deadlineAt === 'number' ? context.deadlineAt : Number.POSITIVE_INFINITY;\n const frame: ActiveFrame = Object.freeze({\n purpose: context.purpose,\n depth,\n chain: Object.freeze([...(parent?.chain ?? []), chainKey]),\n deadlineAt: parent === null ? actualDeadline : Math.min(parent.deadlineAt, actualDeadline),\n // A nested call must also abort when the parent call is cancelled.\n signal: parent === null ? context.signal : anySignal([parent.signal, context.signal]),\n });\n const enter = this.#options.enterHostHandlerFrame;\n if (enter === undefined) return FRAME_STORE.run(frame, run);\n // The canonical host enters its OWN live invocation frame for the exact\n // published owner, so channel work and nested local dispatch inside this\n // handler inherit the real purpose/deadline/cancel and the exact owner\n // authority instead of being re-interpreted as an unauthenticated background\n // task. `ownerToken` is host-private (`CALLEE_INFO`), never a payload field.\n const info = context.callee !== null && typeof context.callee === 'object'\n ? CALLEE_INFO.get(context.callee as object)\n : undefined;\n const hostFrame: HostRpcHandlerFrame = {\n purpose: frame.purpose,\n ...(Number.isFinite(frame.deadlineAt) ? { deadlineAt: frame.deadlineAt } : {}),\n signal: frame.signal,\n ownerToken: info?.ownerToken ?? null,\n operationId: context.operationId ?? null,\n };\n return FRAME_STORE.run(frame, () => enter(hostFrame, run));\n }\n\n /* ----------------------------- consumption ------------------------------ */\n\n #consume<const M extends Record<string, RpcMethodDefinition>>(\n state: OwnerState,\n provider: string,\n contractInput: { readonly id: string; readonly version: number; readonly methods: M },\n ): AsyncRpcClient<M> {\n if (state.released || this.#closed) throw new RpcServiceError('closed');\n if (typeof provider !== 'string' || !provider) throw new RpcServiceError('invalid_registration');\n const contract = defineContract(contractInput);\n const declaration = this.#matchConsumption(state, provider, contract.id, contract.version);\n if (declaration === null) throw new RpcServiceError('undeclared');\n if (!isCrossProcessSelfService(state.plugin, declaration, state.owner.declarations) && (provider === state.plugin || !Object.hasOwn(state.owner.dependencies, provider))) throw new RpcServiceError('undeclared');\n const scopeKey = 'global';\n const firstMethod = Object.keys(contract.methods as Record<string, RpcMethodDefinition>)[0];\n const route = this.#resolveRoute(state, { provider, service: contract.id, major: contract.version, method: firstMethod }, scopeKey);\n if (route.kind === 'ambiguous') throw new RpcServiceError('ambiguous_placement');\n if (route.kind === 'missing') {\n throw new RpcServiceError('unavailable');\n }\n state.owner.registerConsumption?.(declaration, route.kind === 'publication' ? route.publication.ownerState.owner.token : undefined);\n const methodTable = contract.methods as Record<string, RpcMethodDefinition>;\n const client: Record<string, unknown> = {};\n for (const [method, definition] of Object.entries(methodTable)) {\n client[method] = this.#makeMethodClient(state, provider, contract, method, definition);\n }\n return Object.freeze(client) as AsyncRpcClient<M>;\n }\n\n #makeMethodClient<const M extends Record<string, RpcMethodDefinition>>(\n state: OwnerState,\n provider: string,\n contract: { readonly id: string; readonly version: number; readonly methods: M },\n method: string,\n definition: RpcMethodDefinition,\n ): unknown {\n const target = { provider, service: contract.id, major: contract.version, method };\n const invoke = (action: RpcCommandAction | undefined, input: unknown, operationId: string | null, options: RpcCallOptions) =>\n this.#invokeAction(state, target, definition, action, input, operationId, options);\n const call = async (input: unknown, options?: RpcCallOptions): Promise<unknown> => {\n const snapshot = snapshotCallOptions(options);\n const operationId = this.#operationId(definition, snapshot);\n return invoke(definition.kind === 'command' ? 'execute' : undefined, input, operationId, snapshot);\n };\n if (definition.kind !== 'command') return call;\n const queryResult = (operationId: string): Promise<unknown> =>\n invoke('query-result', null, normalizeOperationId(operationId), EMPTY_OPTIONS);\n const reconcile = (operationId: string, input: unknown): Promise<unknown> =>\n invoke('reconcile', input, normalizeOperationId(operationId), EMPTY_OPTIONS);\n return Object.assign(call, { queryResult, reconcile });\n }\n\n #operationId(definition: RpcMethodDefinition, options: RpcCallOptions): string | null {\n const raw = options.operationId;\n if (definition.kind === 'query') {\n if (raw !== undefined) throw new RpcServiceError('invalid_operation_id');\n return null;\n }\n if (raw === undefined) throw new RpcServiceError('invalid_operation_id');\n return normalizeOperationId(raw);\n }\n\n async #invokeAction(\n state: OwnerState,\n target: { readonly provider: string; readonly service: string; readonly major: number; readonly method: string },\n definition: RpcMethodDefinition,\n action: RpcCommandAction | undefined,\n input: unknown,\n operationId: string | null,\n options: RpcCallOptions,\n ): Promise<RpcJson> {\n if (state.revoked || state.released || this.#closed) throw new RpcServiceError('closed', operationId);\n // The manifest consumption and its canonical dependency record are re-validated on\n // every call: a removed declaration or dependency is refused.\n const scopeKey = this.#targetScope(state, target);\n if (scopeKey === null) throw new RpcServiceError('undeclared', operationId);\n const parent = FRAME_STORE.getStore() ?? null;\n if (parent !== null && parent.chain.includes(`${target.provider}${SEP}${scopeKey}${SEP}${target.service}${SEP}${target.major}${SEP}${target.method}`)) {\n throw new RpcServiceError('deadlock');\n }\n // Enforce the consumer contract's own input schema/byte bound before the provider\n // sees the call. `query-result` carries only the null control DTO, never business input.\n if (action !== 'query-result') {\n try {\n const limit = definition.maxInputBytes ?? RPC_JSON_MAX_BYTES;\n input = decodeRpcJson(encodeRpcJson(input, limit), limit);\n assertRpcData(definition.input, input, limit);\n } catch {\n throw new RpcServiceError('invalid_input', operationId);\n }\n }\n const caller = Object.freeze({ subject: state.callerSubject, scope: state.scopeKind });\n // Resolve the host invocation frame exactly once; purpose and request share that snapshot.\n const invocation = state.owner.resolveInvocationContext();\n const purpose = this.#selectPurpose(state, definition, invocation);\n const route = this.#resolveRoute(state, target, scopeKey, purpose);\n if (route.kind === 'ambiguous') throw new RpcServiceError('ambiguous_placement');\n if (route.kind === 'missing') throw new RpcServiceError('unavailable');\n const request = this.#buildRequest(target, caller, purpose, input, operationId, action, options, parent, invocation, state.owner.token);\n try {\n const result = await this.runtime.invoke(request);\n try { assertRpcData(definition.output, result, definition.maxOutputBytes); }\n catch { throw new RpcServiceError('invalid_output', operationId); }\n return result;\n } catch (error) {\n throw toRpcServiceError(error, operationId);\n }\n }\n\n /** Purpose is inherited, never rank-converted; the method must explicitly allow it. */\n #selectPurpose(state: OwnerState, definition: RpcMethodDefinition, invocation: HostRpcInvocationContext | null): RpcCallPurpose {\n const parent = FRAME_STORE.getStore() ?? null;\n if (parent !== null) return requirePurpose(definition, parent.purpose);\n if (invocation !== null) return requirePurpose(definition, invocation.purpose);\n const ready = state.owner.getLifecycleState().ready;\n return requirePurpose(definition, ready ? 'background' : 'bootstrap');\n }\n\n #buildRequest(\n target: { readonly provider: string; readonly service: string; readonly major: number; readonly method: string },\n caller: RpcCaller,\n purpose: RpcCallPurpose,\n input: unknown,\n operationId: string | null,\n action: RpcCommandAction | undefined,\n options: RpcCallOptions,\n parent: ActiveFrame | null,\n invocation: HostRpcInvocationContext | null,\n callerToken: object,\n ) {\n let timeoutMs = options.timeoutMs;\n const deadlineAt = Math.min(parent?.deadlineAt ?? Infinity, invocation?.deadlineAt ?? Infinity);\n if (parent !== null && Number.isFinite(parent.deadlineAt)) {\n const remaining = Math.floor(parent.deadlineAt - Date.now());\n timeoutMs = timeoutMs === undefined ? remaining : Math.min(timeoutMs, remaining);\n }\n if (invocation?.deadlineAt !== undefined) {\n const remaining = Math.floor(invocation.deadlineAt - Date.now());\n timeoutMs = timeoutMs === undefined ? remaining : Math.min(timeoutMs, remaining);\n }\n if (timeoutMs !== undefined && (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0)) {\n throw new RpcServiceError('timeout', operationId);\n }\n const explicitSignal = options.signal;\n const parentSignal = parent?.signal;\n let signal = explicitSignal === undefined\n ? parentSignal\n : parentSignal === undefined ? explicitSignal : anySignal([explicitSignal, parentSignal]);\n if (invocation?.signal !== undefined) signal = signal === undefined ? invocation.signal : anySignal([signal, invocation.signal]);\n const request: {\n target: { provider: string; service: string; major: number; method: string };\n caller: RpcCaller;\n callerToken: object;\n purpose: RpcCallPurpose;\n input: unknown;\n operationId?: string;\n commandAction?: RpcCommandAction;\n signal?: AbortSignal;\n timeoutMs?: number;\n deadlineAt?: number;\n } = {\n target: { provider: target.provider, service: target.service, major: target.major, method: target.method },\n caller,\n callerToken,\n purpose,\n input,\n };\n if (operationId !== null) request.operationId = operationId;\n if (action !== undefined) request.commandAction = action;\n if (signal !== undefined) request.signal = signal;\n if (timeoutMs !== undefined) request.timeoutMs = timeoutMs;\n if (Number.isFinite(deadlineAt)) request.deadlineAt = deadlineAt;\n return request;\n }\n\n /* ------------------------------- routing -------------------------------- */\n\n #matchPublication(state: OwnerState, id: string, version: number): PluginServicePublication | null {\n return state.owner.declarations.provides?.find((value) =>\n value.id === id && value.version === version\n && (value.kind ?? 'local') === 'rpc'\n && value.process === this.#process\n && (value.scope ?? 'global') === 'global' && state.scope === 'global') ?? null;\n }\n\n #matchConsumption(state: OwnerState, provider: string, id: string, version: number): PluginServiceConsumption | null {\n return state.owner.declarations.consumes?.find((value) =>\n value.plugin === provider && value.id === id && value.version === version\n && (value.kind ?? 'local') === 'rpc'\n && value.process === state.process) ?? null;\n }\n\n #targetScope(\n state: OwnerState,\n target: { readonly provider: string; readonly service: string; readonly major: number },\n ): string | null {\n const consumption = state.owner.declarations.consumes?.find((value) =>\n value.plugin === target.provider && value.id === target.service && value.version === target.major\n && (value.kind ?? 'local') === 'rpc' && value.process === state.process) ?? null;\n if (consumption === null) return null;\n if (!isCrossProcessSelfService(state.plugin, consumption, state.owner.declarations) && (target.provider === state.plugin || !Object.hasOwn(state.owner.dependencies, target.provider))) return null;\n return 'global';\n }\n\n /** Host placement authority runs first; `null` opts into the explicit local channel. */\n #resolveRoute(\n state: OwnerState,\n target: { readonly provider: string; readonly service: string; readonly major: number; readonly method: string },\n scopeKey: string,\n purpose?: RpcCallPurpose,\n ): RouteResolution {\n let placement: HostRpcPlacementResolution;\n try {\n placement = this.#options.resolvePlacement({\n provider: target.provider,\n service: target.service,\n major: target.major,\n method: target.method,\n scope: scopeKey === 'global' ? 'global' : 'binding',\n ...(scopeKey === 'global' ? {} : { bindingScope: scopeKey }),\n caller: Object.freeze({ subject: state.callerSubject, scope: state.scopeKind }),\n purpose,\n });\n } catch {\n return { kind: 'missing' };\n }\n if (placement !== null && placement !== undefined) {\n if (placement.kind === 'ambiguous') return { kind: 'ambiguous' };\n return { kind: 'remote', handle: placement.endpoint };\n }\n const publication = this.#publications.get(publicationKey(target.provider, scopeKey, target.service, target.major));\n return publication === undefined ? { kind: 'missing' } : { kind: 'publication', publication };\n }\n\n /* ----------------------------- admission -------------------------------- */\n\n #admit(request: RpcAdmissionRequest): RpcAdmissionGrant<unknown> | null {\n if (this.#closed) return null;\n const state = request.callerToken === undefined ? this.#ownersByCaller.get(request.caller.subject)\n : this.#ownersByToken.get(request.callerToken);\n if (state === undefined || state.revoked || state.released) return null;\n if (state.callerSubject !== request.caller.subject\n || (request.caller.scope !== undefined && state.scopeKind !== request.caller.scope)) return null;\n const callerState = state.owner.getLifecycleState();\n if (callerState.revoked) return null;\n if (state.owner.canCall !== undefined && !state.owner.canCall({ ...request.target })) return null;\n if (!callerState.ready && request.purpose !== 'bootstrap') return null;\n const target = { ...request.target };\n const scopeKey = this.#targetScope(state, target);\n if (scopeKey === null) return null;\n const route = this.#resolveRoute(state, target, scopeKey, request.purpose);\n if (route.kind === 'ambiguous' || route.kind === 'missing') return null;\n const publication = route.kind === 'publication' ? route.publication : null;\n const endpoint = route.kind === 'publication' ? route.publication.handle : route.handle;\n // The callee publication is built from the REAL kernel-bound endpoint identity, never\n // from the adapter process or a plugin-supplied location. A foreign/unconfirmable\n // endpoint, or one whose provider/service/major/scope disagrees with the requested\n // target, is refused before any lease or callee frame is produced.\n const info = this.runtime.endpointInfo(endpoint);\n if (info === null) return null;\n if (info.provider !== target.provider || info.contract.id !== target.service || info.contract.version !== target.major) {\n return null;\n }\n const scope = info.binding.scope;\n if ((scopeKey === 'global') !== (scope === 'global')) return null;\n if (!state.local) {\n try { if (state.authorizeIncoming?.(request, info) !== true) return null; }\n catch { return null; }\n if (state.revoked || state.released || this.#closed) return null;\n }\n const provider = info.provider;\n // Logical clients can be relocated without retaining an unrelated local provider.\n const consumption = this.#matchConsumption(state, target.provider, target.service, target.major)!;\n state.owner.registerConsumption?.(consumption, publication?.ownerState.owner.token);\n // Resolve the trusted callee frame before any lease so a throwing host\n // resolver cannot leak leases.\n const hostFrame = this.#options.resolveCallee(\n request,\n Object.freeze({ provider, service: target.service, major: target.major, kind: 'rpc', process: info.binding.process, scope }),\n );\n // Caller lease holds the issuing owner for the whole call lifespan.\n let callerRelease: () => void = () => undefined;\n try {\n const lease = state.owner.acquireLease({\n role: 'caller', plugin: state.plugin, scope: state.scope, state: callerState,\n purpose: request.purpose, operationId: request.operationId, provider: target.provider,\n });\n if (lease === null || typeof lease !== 'object' || typeof lease.release !== 'function') return null;\n callerRelease = once(() => { try { lease.release(); } catch { /* host-owned */ } });\n } catch { return null; }\n // Callee lease holds the provider (local only). A callee the kernel will refuse\n // (revoked / retiring without an existing-lease proof / unready non-bootstrap)\n // is NOT leased here, so the kernel reports the exact state instead of a lease error.\n let calleeRelease: (() => void) | null = null;\n let allowRetired = false;\n if (publication !== null) {\n const calleeState = publication.ownerState.owner.getLifecycleState();\n const runnable = calleeState.revoked ? false\n : calleeState.retiring ? (request.purpose === 'request' || request.purpose === 'attempt')\n : (calleeState.ready || request.purpose === 'bootstrap');\n if (runnable) {\n try {\n const lease = publication.ownerState.owner.acquireLease({\n role: 'callee', plugin: publication.provider, scope: publication.scopeKey, state: calleeState,\n purpose: request.purpose, operationId: request.operationId, provider: target.provider,\n });\n if (lease === null || typeof lease !== 'object' || typeof lease.release !== 'function') {\n callerRelease();\n return null;\n }\n calleeRelease = once(() => { try { lease.release(); } catch { /* host-owned */ } });\n allowRetired = lease.allowRetired === true\n && (request.purpose === 'request' || request.purpose === 'attempt');\n } catch { callerRelease(); return null; }\n }\n }\n const callee = Object.freeze({});\n CALLEE_INFO.set(callee, { provider, scopeKey, scope, frame: hostFrame, ownerToken: publication?.ownerState.owner.token ?? null });\n const release = once(() => {\n try { calleeRelease?.(); } catch { /* host-owned */ }\n try { callerRelease(); } catch { /* host-owned */ }\n });\n // A host callback can synchronously dispose this capability before a task exists.\n // Recheck after every admission callback has returned, before handing the kernel a grant.\n if (state.revoked || state.released || this.#closed) { release(); return null; }\n return {\n endpoint, callee, release, callerToken: state.owner.token,\n allowUnready: request.purpose === 'bootstrap',\n allowRetired,\n };\n }\n\n /* ------------------------------ commands -------------------------------- */\n\n #commandExecutor(): RpcCommandExecutor<unknown> {\n const run = async (\n execution: Omit<RpcCommandExecution<unknown>, 'executeBusiness'>,\n action: RpcCommandAction,\n ): Promise<unknown> => {\n const callee = execution.context.callee;\n const info = callee !== null && typeof callee === 'object' ? CALLEE_INFO.get(callee as object) : undefined;\n if (info === undefined) throw new RpcServiceError('capability_unavailable', execution.operationId);\n const chainKey = `${info.provider}${SEP}${info.scopeKey}${SEP}${execution.contract.id}${SEP}${execution.contract.version}${SEP}${execution.method}`;\n const journal = this.#journalFor(info, execution);\n // Application-owned CAS/idempotency (e.g. a budget ledger or credential\n // version fence) has one transaction authority. No parallel journal is\n // created for an explicitly non-deduplicated command.\n if (journal === null && execution.definition.command?.deduplication === 'none') {\n if (action !== 'execute') throw new RpcServiceError('capability_unavailable', execution.operationId);\n return this.#runInFrame(execution.context, chainKey, () => (execution as RpcCommandExecution<unknown>).executeBusiness());\n }\n if (journal === null) throw new RpcServiceError('capability_unavailable', execution.operationId);\n // Every journal action (execute/query/reconcile) runs inside the real RPC frame so\n // the business handler and any nested external-reconcile RPC inherit purpose,\n // chain, deadline, and cancellation. Commands are framed once here, not in #wrapHandler.\n return this.#runInFrame(execution.context, chainKey, () => {\n if (action === 'execute') return journal.execute(execution as RpcCommandExecution<unknown>);\n if (action === 'query-result') return journal.query(execution.operationId, execution.context.caller);\n return journal.reconcile(execution);\n });\n };\n return {\n execute: (execution) => run(execution, 'execute'),\n queryResult: (execution) => run(execution, 'query-result'),\n reconcile: (execution) => run(execution, 'reconcile'),\n };\n }\n\n #journalFor(\n info: CalleeInfo,\n execution: Omit<RpcCommandExecution<unknown>, 'executeBusiness'>,\n ): CommandJournal | null {\n const policy = execution.definition.command;\n if (policy === undefined) throw new RpcServiceError('capability_unavailable', execution.operationId);\n const capability = this.#capabilities.get(\n publicationKey(info.provider, info.scopeKey, execution.contract.id, execution.contract.version),\n )?.[execution.method];\n try {\n return this.#options.resolveJournal({\n provider: info.provider,\n service: execution.contract.id,\n major: execution.contract.version,\n method: execution.method,\n scope: info.scope,\n ...(info.scope === 'binding' ? { bindingScope: info.scopeKey } : {}),\n policy,\n ...(capability?.atomic === undefined ? {} : { atomic: capability.atomic }),\n ...(capability?.external === undefined ? {} : { external: capability.external }),\n }) ?? null;\n } catch {\n throw new RpcServiceError('capability_unavailable', execution.operationId);\n }\n }\n}\n\nfunction once(action: () => void): () => void {\n let done = false;\n return () => { if (done) return; done = true; action(); };\n}\n",
27
29
  "/**\n * Plugin service RPC data contract (P1/P4): a dependency-free schema DSL, a\n * bounded strict-JSON codec, and service/method contract validation.\n *\n * Scope boundary: this module validates *data shapes only*. It deliberately\n * grants no wire authorization — host identity, generation, scope/lease, call\n * context, and permissions must be enforced by the host RPC adapter, never by a\n * schema check here. In particular `command.deduplication` is a declared intent;\n * real local transactions and any cross-system exactly-once behavior belong to\n * the host and to the external contract, not to this file.\n *\n * Everything that reaches validation is first cloned from own property\n * descriptors into bounded pure JSON, so no getter, proxy trap, or `toJSON` is\n * ever invoked and no non-JSON shape is silently accepted.\n */\nimport { isProxy } from 'node:util/types';\n\nexport type RpcCallKind = 'query' | 'command';\nexport type RpcCallPurpose = 'bootstrap' | 'background' | 'management' | 'request' | 'attempt';\nexport type RpcCommandDeduplication = 'local-transaction' | 'external-contract' | 'none';\n\n/** Declared intent only; the host owns the actual transaction and retention. */\nexport interface RpcCommandPolicy {\n readonly deduplication: RpcCommandDeduplication;\n /**\n * `null` means the result is retained permanently and durably: it survives a\n * restart and is never recomputed. A positive number is a retention window in\n * milliseconds. Retention is a host/storage concern; this is declaration only.\n */\n readonly resultRetentionMs: number | null;\n readonly quotaBytes: number;\n readonly maxResultBytes: number;\n}\n\n/** Pure JSON: null, boolean, finite number, string, arrays, and plain records. */\nexport type RpcJson =\n | null\n | boolean\n | number\n | string\n | readonly RpcJson[]\n | { readonly [key: string]: RpcJson };\n\n/**\n * Data schema DSL. `object` rejects unknown fields, `optional` lists real\n * optional keys, and `json` carries an optional explicit byte bound (default:\n * the RPC envelope).\n */\nexport type RpcDataSchema =\n | { readonly type: 'string'; readonly minLength?: number; readonly maxLength?: number }\n | { readonly type: 'number'; readonly integer?: boolean; readonly minimum?: number; readonly maximum?: number }\n | { readonly type: 'boolean' }\n | { readonly type: 'null' }\n | { readonly type: 'literal'; readonly value: RpcJson }\n | { readonly type: 'array'; readonly items: RpcDataSchema; readonly maxItems?: number }\n | {\n readonly type: 'object';\n readonly properties: { readonly [key: string]: RpcDataSchema };\n readonly optional?: readonly string[];\n }\n | { readonly type: 'record'; readonly values: RpcDataSchema; readonly maxEntries?: number }\n | { readonly type: 'union'; readonly variants: readonly RpcDataSchema[] }\n | { readonly type: 'json'; readonly maxBytes?: number };\n\n/** Flattens intersections so optional modifiers survive as real optional keys. */\ntype Simplify<T> = { [K in keyof T]: T[K] };\n\ntype OptionalNames<S> = S extends { readonly optional: readonly (infer K extends string)[] } ? K : never;\n\ntype InferObject<P extends Record<string, RpcDataSchema>, O extends string> = Simplify<\n { [K in keyof P as K extends O ? never : K]: InferRpcData<P[K]> } &\n { [K in Extract<keyof P, O>]?: InferRpcData<P[K]> }\n>;\n\n/** Derives the TypeScript type described by a `RpcDataSchema`. */\nexport type InferRpcData<S> =\n RpcDataSchema extends S ? RpcJson : S extends { readonly type: 'string' }\n ? string\n : S extends { readonly type: 'number' }\n ? number\n : S extends { readonly type: 'boolean' }\n ? boolean\n : S extends { readonly type: 'null' }\n ? null\n : S extends { readonly type: 'literal'; readonly value: infer V extends RpcJson }\n ? V\n : S extends { readonly type: 'json' }\n ? RpcJson\n : S extends { readonly type: 'array'; readonly items: infer I extends RpcDataSchema }\n ? InferRpcData<I>[]\n : S extends { readonly type: 'record'; readonly values: infer V extends RpcDataSchema }\n ? { [key: string]: InferRpcData<V> }\n : S extends { readonly type: 'union'; readonly variants: infer VS }\n ? VS extends readonly (infer V extends RpcDataSchema)[]\n ? InferRpcData<V>\n : never\n : S extends { readonly type: 'object'; readonly properties: infer P extends Record<string, RpcDataSchema> }\n ? InferObject<P, OptionalNames<S>>\n : never;\n\nexport interface RpcMethodDefinition {\n readonly kind: RpcCallKind;\n readonly input: RpcDataSchema;\n readonly output: RpcDataSchema;\n readonly purposes: readonly RpcCallPurpose[];\n readonly timeoutMs?: number;\n readonly maxInputBytes?: number;\n readonly maxOutputBytes?: number;\n readonly command?: RpcCommandPolicy;\n}\n\nexport interface RpcServiceContract<\n M extends Record<string, RpcMethodDefinition> = Record<string, RpcMethodDefinition>,\n> {\n readonly id: string;\n readonly version: number;\n readonly methods: M;\n}\n\nexport const RPC_JSON_MAX_BYTES = 64 * 1024;\n/** Metadata contract/schema inputs are pure JSON and bounded well below the envelope. */\nexport const RPC_CONTRACT_MAX_BYTES = 256 * 1024;\n\nconst JSON_MAX_DEPTH = 64;\nconst SCHEMA_MAX_DEPTH = 64;\nconst RPC_MAX_TIMEOUT_MS = 300_000;\nconst RPC_MAX_METHODS = 128;\nconst RPC_SERVICE_ID = /^[a-z][a-z0-9.-]{0,127}$/;\nconst RPC_METHOD_NAME = /^[A-Za-z_][A-Za-z0-9_.-]{0,127}$/;\nconst RPC_CALL_PURPOSES = new Set<RpcCallPurpose>(['bootstrap', 'background', 'management', 'request', 'attempt']);\nconst RPC_COMMAND_DEDUPLICATION = new Set<RpcCommandDeduplication>(['local-transaction', 'external-contract', 'none']);\nconst RPC_COMMAND_POLICY_KEYS = new Set(['deduplication', 'resultRetentionMs', 'quotaBytes', 'maxResultBytes']);\nconst CONTRACT_KEYS = ['id', 'version', 'methods'] as const;\nconst METHOD_KEYS = [\n 'kind',\n 'input',\n 'output',\n 'purposes',\n 'timeoutMs',\n 'maxInputBytes',\n 'maxOutputBytes',\n 'command',\n] as const;\n\nexport type RpcProtocolErrorCode = 'invalid_data' | 'size_limit' | 'invalid_contract';\n\n/** Fixed-code error. It never carries payload, secrets, keys, or arbitrary objects. */\nexport class RpcProtocolError extends Error {\n readonly name = 'RpcProtocolError';\n\n constructor(\n readonly code: RpcProtocolErrorCode,\n message: string,\n ) {\n super(message);\n }\n}\n\n/** Reports a fixed schema category only — never a user property name or value. */\nfunction failData(category: string): never {\n throw new RpcProtocolError('invalid_data', `invalid_data in ${category}`);\n}\n\nfunction failSize(): never {\n throw new RpcProtocolError('size_limit', 'size_limit: JSON value exceeds the byte limit');\n}\n\nfunction failContract(reason: string): never {\n throw new RpcProtocolError('invalid_contract', `invalid_contract: ${reason}`);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n if (isProxy(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isPositiveSafeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\n\nfunction isNonNegativeSafeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction hasLoneSurrogate(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code >= 0xd800 && code <= 0xdbff) {\n if (index + 1 >= value.length) return true;\n const next = value.charCodeAt(index + 1);\n if (next < 0xdc00 || next > 0xdfff) return true;\n index += 1;\n } else if (code >= 0xdc00 && code <= 0xdfff) {\n return true;\n }\n }\n return false;\n}\n\nfunction isArrayIndex(key: string, length: number): boolean {\n if (!/^(?:0|[1-9]\\d*)$/.test(key)) return false;\n const index = Number(key);\n return Number.isSafeInteger(index) && index >= 0 && index < length;\n}\n\nfunction assertKnownKeys(input: Record<string, unknown>, allowed: readonly string[], category: string): void {\n for (const key of Object.keys(input)) {\n if (!allowed.includes(key)) failContract(`unknown ${category} field`);\n }\n}\n\n/**\n * Running lower bound of the JSON byte size, used to reject oversized input\n * before it is fully cloned or stringified. Every accounting term is an\n * underestimate (escapes only ever add bytes), so a positive budget never\n * rejects a value that would actually fit.\n */\ninterface SnapshotBudget {\n left: number;\n}\n\nfunction spend(budget: SnapshotBudget, bytes: number): void {\n budget.left -= bytes;\n if (budget.left < 0) failSize();\n}\n\n/**\n * Validates and deep-clones a value into a plain pure-JSON graph. Object\n * descriptors are inspected before any value is read, so accessors and `toJSON`\n * are never invoked. Cycles, holes, non-plain objects, non-enumerable or symbol\n * keys, non-finite numbers, lone surrogates, and over-deep nesting are rejected;\n * the budget rejects oversized values early.\n */\nfunction snapshot(value: unknown, depth: number, ancestors: Set<object>, budget: SnapshotBudget): RpcJson {\n if (value === null) {\n spend(budget, 4);\n return null;\n }\n if (typeof value === 'boolean') {\n spend(budget, value ? 4 : 5);\n return value;\n }\n if (typeof value === 'string') {\n if (hasLoneSurrogate(value)) failData('string');\n spend(budget, Buffer.byteLength(value, 'utf8') + 2);\n return value;\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) failData('number');\n spend(budget, 1);\n return value;\n }\n if (typeof value !== 'object') failData('json');\n const object = value as object;\n if (isProxy(object)) failData('json');\n if (ancestors.has(object)) failData('json');\n const nextDepth = depth + 1;\n if (nextDepth > JSON_MAX_DEPTH) failData('json');\n if (Array.isArray(object)) {\n if (Object.getPrototypeOf(object) !== Array.prototype) failData('array');\n const lengthDescriptor = Object.getOwnPropertyDescriptor(object, 'length');\n if (!lengthDescriptor || !('value' in lengthDescriptor) || typeof lengthDescriptor.value !== 'number') {\n failData('array');\n }\n const length = lengthDescriptor.value;\n if (!Number.isSafeInteger(length) || length < 0) failData('array');\n if (length > budget.left) failSize();\n spend(budget, 2);\n if (length > 1) spend(budget, length - 1);\n ancestors.add(object);\n const items: RpcJson[] = new Array(length);\n let count = 0;\n for (const key of Reflect.ownKeys(object)) {\n if (key === 'length') continue;\n if (typeof key !== 'string' || !isArrayIndex(key, length)) failData('array');\n const descriptor = Object.getOwnPropertyDescriptor(object, key);\n if (!descriptor || !descriptor.enumerable || !('value' in descriptor)) failData('array');\n items[Number(key)] = snapshot(descriptor.value, nextDepth, ancestors, budget);\n count += 1;\n }\n if (count !== length) failData('array');\n ancestors.delete(object);\n return items;\n }\n const prototype = Object.getPrototypeOf(object);\n if (prototype !== Object.prototype && prototype !== null) failData('object');\n const keys = Reflect.ownKeys(object);\n if (keys.length > budget.left) failSize();\n spend(budget, 2);\n if (keys.length > 1) spend(budget, keys.length - 1);\n ancestors.add(object);\n const result: Record<string, RpcJson> = {};\n for (const key of keys) {\n if (typeof key !== 'string') failData('object');\n if (hasLoneSurrogate(key)) failData('object');\n const descriptor = Object.getOwnPropertyDescriptor(object, key);\n if (!descriptor || !descriptor.enumerable || !('value' in descriptor)) failData('object');\n spend(budget, Buffer.byteLength(key, 'utf8') + 3);\n // defineProperty keeps a literal `__proto__` key an own data property instead of polluting the prototype.\n Object.defineProperty(result, key, {\n value: snapshot(descriptor.value, nextDepth, ancestors, budget),\n enumerable: true,\n writable: true,\n configurable: true,\n });\n }\n ancestors.delete(object);\n return result;\n}\n\n/** Clones a contract/schema input as bounded pure JSON, mapping pure-JSON errors to invalid_contract. */\nfunction snapshotPureInput(input: unknown): RpcJson {\n try {\n const pure = snapshot(input, 0, new Set(), { left: RPC_CONTRACT_MAX_BYTES });\n if (Buffer.byteLength(JSON.stringify(pure), 'utf8') > RPC_CONTRACT_MAX_BYTES) failContract('input must be bounded pure JSON data');\n return pure;\n } catch (error) {\n if (error instanceof RpcProtocolError && (error.code === 'invalid_data' || error.code === 'size_limit')) {\n failContract('input must be bounded pure JSON data');\n }\n throw error;\n }\n}\n\n/** Strict scanner: rejects duplicate keys, trailing content, and deep nesting. */\nfunction scanJson(text: string): void {\n let index = 0;\n const numberPattern = /-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/y;\n const fail = (): never => {\n throw new RpcProtocolError('invalid_data', 'invalid JSON text');\n };\n const whitespace = (): void => {\n while (index < text.length) {\n const character = text[index];\n if (character === ' ' || character === '\\t' || character === '\\n' || character === '\\r') index += 1;\n else break;\n }\n };\n const string = (): string => {\n if (text[index] !== '\"') return fail();\n const start = index;\n index += 1;\n while (index < text.length) {\n const character = text[index];\n if (character === '\"') {\n index += 1;\n try {\n const value: unknown = JSON.parse(text.slice(start, index));\n if (typeof value !== 'string') return fail();\n return value;\n } catch (error) {\n if (error instanceof RpcProtocolError) throw error;\n return fail();\n }\n }\n if (character === undefined) return fail();\n if (character.charCodeAt(0) < 0x20) return fail();\n if (character === '\\\\') {\n index += 1;\n const escape = text[index];\n if (escape === 'u') {\n if (!/^[0-9a-fA-F]{4}$/.test(text.slice(index + 1, index + 5))) return fail();\n index += 5;\n continue;\n }\n if (escape === undefined || !'\"\\\\/bfnrt'.includes(escape)) return fail();\n index += 1;\n continue;\n }\n index += 1;\n }\n return fail();\n };\n const value = (depth: number): void => {\n whitespace();\n const character = text[index];\n if (character === '{') {\n if (depth >= JSON_MAX_DEPTH) return fail();\n index += 1;\n whitespace();\n const keys = new Set<string>();\n if (text[index] === '}') {\n index += 1;\n return;\n }\n while (true) {\n whitespace();\n const key = string();\n if (keys.has(key)) return fail();\n keys.add(key);\n whitespace();\n if (text[index] !== ':') return fail();\n index += 1;\n value(depth + 1);\n whitespace();\n if (text[index] === '}') {\n index += 1;\n return;\n }\n if (text[index] !== ',') return fail();\n index += 1;\n }\n }\n if (character === '[') {\n if (depth >= JSON_MAX_DEPTH) return fail();\n index += 1;\n whitespace();\n if (text[index] === ']') {\n index += 1;\n return;\n }\n while (true) {\n value(depth + 1);\n whitespace();\n if (text[index] === ']') {\n index += 1;\n return;\n }\n if (text[index] !== ',') return fail();\n index += 1;\n }\n }\n if (character === '\"') {\n string();\n return;\n }\n if (text.startsWith('true', index)) {\n index += 4;\n return;\n }\n if (text.startsWith('false', index)) {\n index += 5;\n return;\n }\n if (text.startsWith('null', index)) {\n index += 4;\n return;\n }\n numberPattern.lastIndex = index;\n const match = numberPattern.exec(text);\n if (match === null) return fail();\n index = numberPattern.lastIndex;\n };\n value(0);\n whitespace();\n if (index !== text.length) fail();\n}\n\n/** Rejects numbers that overflowed to Infinity and lone surrogates after parsing. */\nfunction assertJsonGraph(value: unknown): void {\n const stack: unknown[] = [value];\n while (stack.length > 0) {\n const current = stack.pop();\n if (typeof current === 'number') {\n if (!Number.isFinite(current)) failData('json');\n continue;\n }\n if (typeof current === 'string') {\n if (hasLoneSurrogate(current)) failData('string');\n continue;\n }\n if (Array.isArray(current)) {\n for (const item of current) stack.push(item);\n continue;\n }\n if (current !== null && typeof current === 'object') {\n for (const key of Object.keys(current)) {\n if (hasLoneSurrogate(key)) failData('object');\n stack.push((current as Record<string, unknown>)[key]);\n }\n }\n }\n}\n\n/**\n * Serializes a pure-JSON value under a UTF-8 byte bound. Oversized values are\n * rejected by the running budget before a large clone is built. `maxBytes` may\n * be raised for independent, larger data channels; the default stays the control\n * envelope limit.\n */\nexport function encodeRpcJson(value: unknown, maxBytes: number = RPC_JSON_MAX_BYTES): string {\n assertByteLimit(maxBytes);\n const clone = snapshot(value, 0, new Set(), { left: maxBytes });\n const text = JSON.stringify(clone);\n if (typeof text !== 'string') failData('json');\n if (Buffer.byteLength(text, 'utf8') > maxBytes) failSize();\n return text;\n}\n\n/** Deterministic encoding for signed RPC metadata, retaining every legal JSON key. */\nexport function encodeCanonicalRpcJson(value: unknown, maxBytes: number = RPC_JSON_MAX_BYTES): string {\n assertByteLimit(maxBytes);\n const clone = snapshot(value, 0, new Set(), { left: maxBytes });\n const canonical = (item: RpcJson): string => {\n if (item === null || typeof item !== 'object') return JSON.stringify(item);\n if (Array.isArray(item)) return `[${item.map(canonical).join(',')}]`;\n const record = item as Readonly<Record<string, RpcJson>>;\n return `{${Object.keys(record).sort().map(key => `${JSON.stringify(key)}:${canonical(record[key])}`).join(',')}}`;\n };\n const text = canonical(clone);\n if (Buffer.byteLength(text, 'utf8') > maxBytes) failSize();\n return text;\n}\n\n/** Parses strict, bounded pure JSON. Non-finite numbers and lone surrogates are rejected. */\nexport function decodeRpcJson(text: string, maxBytes: number = RPC_JSON_MAX_BYTES): RpcJson {\n assertByteLimit(maxBytes);\n if (typeof text !== 'string') failData('json');\n if (Buffer.byteLength(text, 'utf8') > maxBytes) failSize();\n scanJson(text);\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new RpcProtocolError('invalid_data', 'invalid JSON text');\n }\n assertJsonGraph(parsed);\n return parsed as RpcJson;\n}\n\nfunction jsonEquals(left: RpcJson, right: RpcJson): boolean {\n if (left === right) return true;\n if (typeof left !== typeof right) return false;\n if (Array.isArray(left) !== Array.isArray(right)) return false;\n if (Array.isArray(left)) {\n if (!Array.isArray(right) || left.length !== right.length) return false;\n for (let index = 0; index < left.length; index += 1) {\n if (!jsonEquals(left[index], right[index])) return false;\n }\n return true;\n }\n if (typeof left === 'object' && left !== null && right !== null && typeof right === 'object') {\n const leftRecord = left as Record<string, RpcJson>;\n const rightRecord = right as Record<string, RpcJson>;\n const keys = Object.keys(leftRecord);\n if (keys.length !== Object.keys(rightRecord).length) return false;\n for (const key of keys) {\n if (!Object.prototype.hasOwnProperty.call(rightRecord, key)) return false;\n if (!jsonEquals(leftRecord[key], rightRecord[key])) return false;\n }\n return true;\n }\n return false;\n}\n\nfunction checkOptionalNonNegative(value: unknown, field: string): number | undefined {\n if (value === undefined) return undefined;\n if (!isNonNegativeSafeInteger(value)) failContract(`${field} must be a non-negative safe integer`);\n return value;\n}\n\nfunction checkOptionalFinite(value: unknown, field: string): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== 'number' || !Number.isFinite(value)) failContract(`${field} must be a finite number`);\n return value;\n}\n\nfunction checkSchema(input: unknown, depth: number, seen: Set<object>): void {\n if (depth > SCHEMA_MAX_DEPTH) failContract('schema nesting exceeds the limit');\n if (!isPlainObject(input)) failContract('schema must be a plain object');\n if (seen.has(input)) failContract('schema must not contain cycles');\n seen.add(input);\n const type = input.type;\n if (type === 'string') {\n assertKnownKeys(input, ['type', 'minLength', 'maxLength'], 'schema');\n const min = checkOptionalNonNegative(input.minLength, 'minLength');\n const max = checkOptionalNonNegative(input.maxLength, 'maxLength');\n if (min !== undefined && max !== undefined && min > max) failContract('string minLength must not exceed maxLength');\n } else if (type === 'number') {\n assertKnownKeys(input, ['type', 'integer', 'minimum', 'maximum'], 'schema');\n if (input.integer !== undefined && typeof input.integer !== 'boolean') failContract('number integer flag must be boolean');\n const min = checkOptionalFinite(input.minimum, 'minimum');\n const max = checkOptionalFinite(input.maximum, 'maximum');\n if (min !== undefined && max !== undefined && min > max) failContract('number minimum must not exceed maximum');\n } else if (type === 'boolean') {\n assertKnownKeys(input, ['type'], 'schema');\n } else if (type === 'null') {\n assertKnownKeys(input, ['type'], 'schema');\n } else if (type === 'literal') {\n assertKnownKeys(input, ['type', 'value'], 'schema');\n if (!Object.prototype.hasOwnProperty.call(input, 'value')) failContract('literal schema requires a value');\n try {\n snapshot(input.value, 0, new Set(), { left: Infinity });\n } catch (error) {\n if (error instanceof RpcProtocolError && error.code === 'invalid_data') {\n failContract('literal value must be pure JSON');\n }\n throw error;\n }\n } else if (type === 'array') {\n assertKnownKeys(input, ['type', 'items', 'maxItems'], 'schema');\n if (!Object.prototype.hasOwnProperty.call(input, 'items')) failContract('array schema requires items');\n checkSchema(input.items, depth + 1, seen);\n checkOptionalNonNegative(input.maxItems, 'maxItems');\n } else if (type === 'object') {\n assertKnownKeys(input, ['type', 'properties', 'optional'], 'schema');\n const properties = input.properties;\n if (!isPlainObject(properties)) failContract('object schema requires a properties record');\n for (const key of Object.keys(properties)) checkSchema(properties[key], depth + 1, seen);\n const optional = input.optional;\n if (optional !== undefined) {\n if (!Array.isArray(optional)) failContract('object optional must be an array of field names');\n const names = new Set<string>();\n for (const name of optional) {\n if (typeof name !== 'string') failContract('object optional entries must be strings');\n if (names.has(name)) failContract('object optional entries must be unique');\n names.add(name);\n if (!Object.prototype.hasOwnProperty.call(properties, name)) {\n failContract('object optional names must exist in properties');\n }\n }\n }\n } else if (type === 'record') {\n assertKnownKeys(input, ['type', 'values', 'maxEntries'], 'schema');\n if (!Object.prototype.hasOwnProperty.call(input, 'values')) failContract('record schema requires values');\n checkSchema(input.values, depth + 1, seen);\n checkOptionalNonNegative(input.maxEntries, 'maxEntries');\n } else if (type === 'union') {\n assertKnownKeys(input, ['type', 'variants'], 'schema');\n const variants = input.variants;\n if (!Array.isArray(variants) || variants.length === 0) {\n failContract('union schema requires a non-empty variants array');\n }\n for (const variant of variants) checkSchema(variant, depth + 1, seen);\n } else if (type === 'json') {\n assertKnownKeys(input, ['type', 'maxBytes'], 'schema');\n if (input.maxBytes !== undefined && !isPositiveSafeInteger(input.maxBytes)) {\n failContract('json schema maxBytes must be a positive safe integer');\n }\n } else {\n failContract('unknown schema type');\n }\n seen.delete(input);\n}\n\nfunction validateValue(schema: RpcDataSchema, value: unknown): void {\n switch (schema.type) {\n case 'string': {\n if (typeof value !== 'string') failData('string');\n if (schema.minLength !== undefined && value.length < schema.minLength) failData('string');\n if (schema.maxLength !== undefined && value.length > schema.maxLength) failData('string');\n return;\n }\n case 'number': {\n if (typeof value !== 'number' || !Number.isFinite(value)) failData('number');\n if (schema.integer === true && !Number.isInteger(value)) failData('number');\n if (schema.minimum !== undefined && value < schema.minimum) failData('number');\n if (schema.maximum !== undefined && value > schema.maximum) failData('number');\n return;\n }\n case 'boolean': {\n if (typeof value !== 'boolean') failData('boolean');\n return;\n }\n case 'null': {\n if (value !== null) failData('null');\n return;\n }\n case 'literal': {\n if (!jsonEquals(schema.value, value as RpcJson)) failData('literal');\n return;\n }\n case 'array': {\n if (!Array.isArray(value)) failData('array');\n if (schema.maxItems !== undefined && value.length > schema.maxItems) failData('array');\n for (const item of value) validateValue(schema.items, item);\n return;\n }\n case 'object': {\n if (!isPlainObject(value)) failData('object');\n const optional = new Set(schema.optional ?? []);\n for (const key of Object.keys(value)) {\n if (!Object.prototype.hasOwnProperty.call(schema.properties, key)) failData('object');\n }\n for (const key of Object.keys(schema.properties)) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n if (!optional.has(key)) failData('object');\n continue;\n }\n validateValue(schema.properties[key], value[key]);\n }\n return;\n }\n case 'record': {\n if (!isPlainObject(value)) failData('record');\n const keys = Object.keys(value);\n if (schema.maxEntries !== undefined && keys.length > schema.maxEntries) failData('record');\n for (const key of keys) validateValue(schema.values, value[key]);\n return;\n }\n case 'union': {\n for (const variant of schema.variants) {\n try {\n validateValue(variant, value);\n return;\n } catch (error) {\n if (!(error instanceof RpcProtocolError) || error.code !== 'invalid_data') throw error;\n }\n }\n failData('union');\n }\n case 'json': {\n const maxBytes = schema.maxBytes ?? RPC_JSON_MAX_BYTES;\n const text = JSON.stringify(value);\n if (typeof text !== 'string' || Buffer.byteLength(text, 'utf8') > maxBytes) failData('json');\n return;\n }\n }\n}\n\n/**\n * Asserts a runtime value matches the schema. The whole value is first cloned\n * into bounded pure JSON without invoking accessors, then validated. Throws\n * `RpcProtocolError` with `invalid_data` (value) or `invalid_contract` (malformed\n * schema).\n */\n/** Validates a standalone data schema (lane contract registration) without a value. */\nexport function assertRpcDataSchema(schema: RpcDataSchema): void {\n const pure = snapshotPureInput(schema);\n checkSchema(pure, 0, new Set());\n}\n\nexport function assertRpcData<S extends RpcDataSchema>(\n schema: S,\n value: unknown,\n maxBytes?: number,\n): asserts value is InferRpcData<S> { const pureSchema = snapshotPureInput(schema);\n checkSchema(pureSchema, 0, new Set());\n const checkedSchema = pureSchema as unknown as RpcDataSchema;\n const limit = maxBytes ?? (checkedSchema.type === 'json' ? checkedSchema.maxBytes ?? RPC_JSON_MAX_BYTES : RPC_JSON_MAX_BYTES);\n assertByteLimit(limit);\n let pureValue: RpcJson;\n try { pureValue = snapshot(value, 0, new Set(), { left: limit }); }\n catch (error) {\n if (error instanceof RpcProtocolError && error.code === 'size_limit') failData('json');\n throw error;\n }\n if (Buffer.byteLength(JSON.stringify(pureValue), 'utf8') > limit) failData('json');\n validateValue(checkedSchema, pureValue);\n}\n\nfunction assertByteLimit(maxBytes: number): void {\n if (!isPositiveSafeInteger(maxBytes)) failContract('maxBytes must be a positive safe integer');\n}\n\nfunction checkByteLimit(value: unknown, field: string): number | undefined {\n if (value === undefined) return undefined;\n if (!isPositiveSafeInteger(value) || value > RPC_JSON_MAX_BYTES) {\n failContract(`${field} must be a positive integer no larger than the RPC envelope`);\n }\n return value;\n}\n\nfunction checkCommandPolicy(policy: Record<string, unknown>, maxOutputBytes: number): void {\n const keys = Object.keys(policy);\n if (keys.length !== RPC_COMMAND_POLICY_KEYS.size || keys.some((key) => !RPC_COMMAND_POLICY_KEYS.has(key))) {\n failContract('command policy fields are fixed');\n }\n const deduplication = policy.deduplication;\n if (typeof deduplication !== 'string' || !RPC_COMMAND_DEDUPLICATION.has(deduplication as RpcCommandDeduplication)) {\n failContract('invalid command deduplication');\n }\n const retention = policy.resultRetentionMs;\n if (retention !== null && !isPositiveSafeInteger(retention)) {\n failContract('resultRetentionMs must be a positive integer or null');\n }\n const maxResultBytes = policy.maxResultBytes;\n if (!isPositiveSafeInteger(maxResultBytes)) failContract('maxResultBytes must be a positive safe integer');\n if (maxResultBytes > maxOutputBytes) failContract('maxResultBytes must not exceed maxOutputBytes');\n const quotaBytes = policy.quotaBytes;\n if (!isPositiveSafeInteger(quotaBytes)) failContract('quotaBytes must be a positive safe integer');\n if (quotaBytes < maxResultBytes) failContract('quotaBytes must be able to hold maxResultBytes');\n}\n\nfunction checkMethod(definition: Record<string, unknown>): void {\n assertKnownKeys(definition, METHOD_KEYS, 'method');\n const kind = definition.kind;\n if (kind !== 'query' && kind !== 'command') failContract('method kind must be query or command');\n checkSchema(definition.input, 0, new Set());\n checkSchema(definition.output, 0, new Set());\n const purposes = definition.purposes;\n if (!Array.isArray(purposes) || purposes.length === 0) failContract('purposes must be a non-empty array');\n const seenPurposes = new Set<string>();\n for (const purpose of purposes) {\n if (typeof purpose !== 'string' || !RPC_CALL_PURPOSES.has(purpose as RpcCallPurpose)) failContract('invalid purpose');\n if (seenPurposes.has(purpose)) failContract('purposes must be unique');\n seenPurposes.add(purpose);\n }\n if (definition.timeoutMs !== undefined) {\n if (!isPositiveSafeInteger(definition.timeoutMs) || definition.timeoutMs > RPC_MAX_TIMEOUT_MS) {\n failContract('timeoutMs must be a positive integer no larger than the timeout bound');\n }\n }\n checkByteLimit(definition.maxInputBytes, 'maxInputBytes');\n const maxOutputBytes = checkByteLimit(definition.maxOutputBytes, 'maxOutputBytes');\n const command = definition.command;\n if (kind === 'command') {\n if (!isPlainObject(command)) failContract('command methods require an explicit command policy');\n checkCommandPolicy(command, maxOutputBytes ?? RPC_JSON_MAX_BYTES);\n } else if (command !== undefined) {\n failContract('query methods must not declare a command policy');\n }\n}\n\nfunction checkContract(contract: unknown): void {\n if (!isPlainObject(contract)) failContract('contract must be a plain object');\n assertKnownKeys(contract, CONTRACT_KEYS, 'contract');\n if (typeof contract.id !== 'string' || !RPC_SERVICE_ID.test(contract.id)) failContract('invalid service id');\n if (!isPositiveSafeInteger(contract.version)) failContract('service version must be a positive safe integer');\n const methods = contract.methods;\n if (!isPlainObject(methods)) failContract('methods must be a plain object');\n const names = Object.keys(methods);\n if (names.length === 0) failContract('service must declare at least one method');\n if (names.length > RPC_MAX_METHODS) failContract('service declares too many methods');\n for (const name of names) {\n if (!RPC_METHOD_NAME.test(name)) failContract('invalid method name');\n const definition = methods[name];\n if (!isPlainObject(definition)) failContract('method definition must be a plain object');\n checkMethod(definition);\n }\n}\n\nfunction deepFreeze(value: unknown): unknown {\n if (Array.isArray(value)) {\n for (const item of value) deepFreeze(item);\n return Object.freeze(value);\n }\n if (isPlainObject(value)) {\n for (const key of Object.keys(value)) deepFreeze(value[key]);\n return Object.freeze(value);\n }\n return value;\n}\n\n/**\n * Validates a service contract and returns a deep-frozen pure clone. The caller's\n * objects are never read through accessors, never frozen, and never modified;\n * `methods` keeps its literal types so clients can derive call signatures.\n */\nexport function defineRpcService<const M extends Record<string, RpcMethodDefinition>>(contract: {\n readonly id: string;\n readonly version: number;\n readonly methods: M;\n}): RpcServiceContract<M> {\n const pure = snapshotPureInput(contract);\n checkContract(pure);\n return deepFreeze(pure) as unknown as RpcServiceContract<M>;\n}\n",
@@ -32,13 +34,13 @@
32
34
  "/** Public same-process plugin services. Cross-process callers require the host RPC adapter. */\nimport type { PluginServiceDeclarations, PluginServiceProcess } from './plugin-services/contracts';\nimport { assertSupportedServiceDeclarations, isCrossProcessSelfSnapshot } from './plugin-services/contracts';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { HostRpcAdapter, RpcServiceError, type HostRpcAdapterOptions, type HostRpcLifecycleIdentity, type HostRpcOwnerHandle, type HostRpcInvocationContext, type HostRpcLeaseRequest, type HostRpcLeaseGrant, type HostRpcHandlerFrame } from './plugin-services/host-rpc';\nimport type { RpcCallPurpose, RpcMethodDefinition } from './plugin-services/wire-contract';\nimport type { HostChannelOperation, HostChannelOwnerHandle, PluginChannelCapabilities, PluginChannelOwnerInput, PluginEventServices, PluginSnapshotServices, PluginStreamServices } from './plugin-services/channels';\nexport { defineRpcService } from './plugin-services/wire-contract';\nexport { RpcServiceError } from './plugin-services/host-rpc';\nexport { HostSnapshotStore, type HostSnapshotStoreOptions } from './plugin-services/snapshot-store';\nexport type { AsyncRpcClient, HostRpcCommandCapabilities, RpcCallOptions, RpcServiceErrorCode } from './plugin-services/host-rpc';\nexport type { RpcHandlerMap, RpcHandlerContext } from './plugin-services/rpc-runtime';\nexport type { RpcDataSchema, RpcMethodDefinition, InferRpcData } from './plugin-services/wire-contract';\nexport type { PluginServiceDeclarations, PluginServicePublication, PluginServiceConsumption, PluginServiceProcess, PluginServiceKind, PluginServiceScope } from './plugin-services/contracts';\nexport type {\n PluginStreamServices, PluginSnapshotServices, PluginEventServices, PluginStreamContract, PluginSnapshotContract,\n PluginEventContract, PluginChannelPublication, PluginStreamReadInput, PluginStreamWriteInput, PluginStreamDuplexInput,\n PluginSnapshotView, PluginSnapshotStatus, PluginEventPublisher, PluginChannelCapabilities, HostChannelPublicationView,\n PluginSnapshotVersionSource, HostSnapshotStoreOptionsView,\n} from './plugin-services/channels';\nexport type { PluginChannelDuplexSession, PluginChannelDuplexResult } from './plugin-services/peer-channel-hub';\n\nconst CHANNEL_KINDS = new Set(['events', 'snapshot', 'stream']);\n\nexport interface PluginServices {\n /** Explicit owner-bound background invocation; never inherits a stale/request frame. */\n runBackground?<T>(run: () => T): T;\n onDispose(cleanup: () => void): void;\n publish<T extends object>(serviceId: string, contractVersion: number, implementation: T): void;\n consume<T extends object>(provider: string, serviceId: string, contractVersion: number): Readonly<T>;\n /** Typed asynchronous data-only services, when the host communication runtime is configured. */\n readonly rpc?: Pick<HostRpcOwnerHandle, 'publish' | 'consume'>;\n /** Bounded, cancelable chunked byte channels over the authenticated peer link. */\n readonly stream?: PluginStreamServices;\n /** Transient notifications and durable at-least-once topics. */\n readonly events?: PluginEventServices;\n /** Versioned immutable snapshots with digest verification. */\n readonly snapshot?: PluginSnapshotServices;\n /** Explicit deployment capabilities for the channel lanes (checked before declaring work). */\n readonly channelCapabilities?: PluginChannelCapabilities;\n}\n\nexport interface PluginServiceCommunications extends Omit<HostRpcAdapterOptions, 'process' | 'enterHostHandlerFrame'> {\n /** Real process/owner identity supplied by the runtime, never invented by the plugin. */\n readonly identity: (plugin: string, scope: string) => HostRpcLifecycleIdentity;\n /**\n * Trusted host hook, called for one declared RPC consumption before the\n * adapter resolves its route. It lets the host register the native remote\n * proxy for the consumer's own contract so `resolvePlacement` can select it.\n * A host that does not implement remote routing simply omits it.\n */\n readonly ensureRemoteRoute?: (input: {\n readonly plugin: string;\n readonly scope: string;\n readonly provider: string;\n readonly contract: { readonly id: string; readonly version: number; readonly methods: Record<string, RpcMethodDefinition> };\n }) => void;\n /**\n * Host-owned event/snapshot/stream adapter. It is created by the same process\n * composition that owns the peer link, so channel work rides the one\n * authenticated transport and the canonical owner lifecycle.\n */\n readonly channels?: (input: PluginChannelOwnerInput) => HostChannelOwnerHandle;\n}\nexport interface PluginServiceInvocation {\n readonly purpose: RpcCallPurpose;\n /** Exact pre-admission lease returned by this host; request/attempt require it. */\n readonly lease?: () => void;\n readonly callee?: unknown;\n readonly signal?: AbortSignal;\n readonly deadlineAt?: number;\n}\ninterface LeaseProof { readonly retained: ReadonlySet<Owner>; released: boolean }\ninterface InvocationFrame extends HostRpcInvocationContext { readonly proof?: LeaseProof; readonly callee?: unknown; readonly ownerAuthority?: Owner; readonly peerAuthenticated?: boolean }\ninterface RpcReference { readonly owner: Owner }\n\ntype Owner = {\n plugin: string; scope: string; dependencies: Readonly<Record<string, string>>;\n ready: boolean; retiring: boolean; revoked: boolean; cleaning: boolean; leases: number;\n pending: Set<Promise<unknown>>; waiters: Array<() => void>; cleanups: Set<() => void>;\n consumed: Set<Owner>;\n rpcConsumed: Map<string, RpcReference>;\n rpc?: HostRpcOwnerHandle;\n channels?: HostChannelOwnerHandle;\n};\ntype Publication = { owner: Owner; id: string; version: number; kind: 'local' | 'rpc'; implementation?: object };\n\n/** Cleanup failed after the context was fully revoked; runtime teardown must still run. */\nexport class PluginServiceCleanupError extends AggregateError {\n constructor(failures: readonly unknown[]) { super(failures, 'Plugin service cleanup failed'); }\n}\n\nexport class PluginServiceHost {\n readonly rpc?: HostRpcAdapter;\n private readonly frames = new AsyncLocalStorage<InvocationFrame>();\n private readonly leaseProofs = new WeakMap<() => void, LeaseProof>();\n private readonly liveInvocations = new WeakSet<object>();\n private readonly ownerTokens = new WeakSet<object>();\n private readonly disposals = new WeakMap<Owner, Promise<void>>();\n private readonly communications?: PluginServiceCommunications;\n constructor(readonly process: PluginServiceProcess = 'worker', communications?: PluginServiceCommunications) {\n this.communications = communications;\n if (communications) this.rpc = new HostRpcAdapter({\n ...communications, process,\n enterHostHandlerFrame: (hostFrame, run) => this.runHostHandlerFrame(hostFrame, run),\n });\n }\n private contracts?: ReadonlyMap<string, PluginServiceDeclarations>;\n setDeclarations(contracts: ReadonlyMap<string, PluginServiceDeclarations>): void {\n for (const declarations of contracts.values()) assertSupportedServiceDeclarations(declarations);\n this.contracts = new Map(contracts);\n }\n /** Trusted host view of the declared service graph; never exposed to plugins. */\n serviceDeclarations(): ReadonlyMap<string, PluginServiceDeclarations> { return this.contracts ?? new Map(); }\n private owners = new Map<string, Owner>();\n private contexts = new WeakMap<PluginServices, Owner>();\n private publications = new Map<string, Publication>();\n private key(plugin: string, scope: string): string { return `${plugin}\\0${scope}`; }\n private publicationKey(plugin: string, scope: string, id: string, version: number): string {\n return `${plugin}\\0${scope}\\0${id}\\0${version}`;\n }\n isReady(plugin: string, scope = 'global'): boolean {\n const owner = this.owners.get(this.key(plugin, scope));\n return !!owner?.ready && !owner.retiring && !owner.revoked;\n }\n /** Trusted runtime entry; not exposed through PluginServices. */\n runInInvocation<T>(context: PluginServices, invocation: PluginServiceInvocation, run: () => T): T {\n const owner = this.contexts.get(context);\n if (!owner || owner.revoked || this.owners.get(this.key(owner.plugin, owner.scope)) !== owner) throw new RpcServiceError('unauthorized');\n const proof = invocation.lease === undefined ? undefined : this.leaseProofs.get(invocation.lease);\n if (invocation.purpose === 'request' || invocation.purpose === 'attempt') {\n if (!proof || proof.released || !proof.retained.has(owner)) throw new RpcServiceError('unauthorized');\n } else if (owner.retiring) throw new RpcServiceError('retired');\n const frame: InvocationFrame = Object.freeze({ ...invocation, proof, token: Object.freeze({}) });\n this.liveInvocations.add(frame.token);\n return this.frames.run(frame, () => {\n try {\n const result = run();\n if (result && (typeof result === 'object' || typeof result === 'function') && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).finally(() => this.liveInvocations.delete(frame.token)) as T;\n }\n this.liveInvocations.delete(frame.token);\n return result;\n } catch (error) { this.liveInvocations.delete(frame.token); throw error; }\n });\n }\n /** Broker-only entry after physical-peer and per-call identity projection. */\n runPeerInvocation<T>(purpose: 'request' | 'attempt', callee: unknown, run: () => T): T {\n const frame: InvocationFrame = Object.freeze({purpose, callee, peerAuthenticated: true, token: Object.freeze({})});\n this.liveInvocations.add(frame.token);\n return this.frames.run(frame, () => {\n try {\n const result = run();\n if (result && typeof (result as any).then === 'function') return Promise.resolve(result).finally(() => this.liveInvocations.delete(frame.token)) as T;\n this.liveInvocations.delete(frame.token); return result;\n } catch (error) { this.liveInvocations.delete(frame.token); throw error; }\n });\n }\n /** Read by the trusted callee resolver to carry management/request authority. */\n currentInvocation(): Readonly<HostRpcInvocationContext & { readonly callee?: unknown }> | null {\n const frame = this.frames.getStore();\n return frame === undefined || !this.liveInvocations.has(frame.token) ? null : Object.freeze({ purpose: frame.purpose, token: frame.token, signal: frame.signal, deadlineAt: frame.deadlineAt, callee: frame.callee });\n }\n /**\n * Enters one live host-handler frame bound to the exact published owner, so a\n * native RPC handler shares the SAME trusted invocation store as local\n * dispatch. The frame is live only for the handler's real duration; a stale\n * (settled) frame is therefore never observable.\n */\n private runHostHandlerFrame(host: HostRpcHandlerFrame, run: () => unknown): unknown {\n const owner = host.ownerToken !== null && this.ownerTokens.has(host.ownerToken) ? host.ownerToken as Owner : undefined;\n const frame: InvocationFrame = Object.freeze({\n purpose: host.purpose,\n token: Object.freeze({}),\n ...(host.signal === undefined ? {} : { signal: host.signal }),\n ...(host.deadlineAt === undefined ? {} : { deadlineAt: host.deadlineAt }),\n ...(owner === undefined ? {} : { ownerAuthority: owner }),\n });\n this.liveInvocations.add(frame.token);\n const settle = (): void => { this.liveInvocations.delete(frame.token); };\n return this.frames.run(frame, () => {\n try {\n const result = run();\n if (result !== null && (typeof result === 'object' || typeof result === 'function') && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).finally(settle);\n }\n settle();\n return result;\n } catch (error) { settle(); throw error; }\n });\n }\n createContext(plugin: string, scope = 'global', dependencies: Readonly<Record<string, string>> = {}): PluginServices {\n const key = this.key(plugin, scope);\n if (this.owners.has(key)) throw new Error(`Service context already exists: ${plugin}/${scope}`);\n const declarations = this.contracts?.get(plugin);\n if (!this.rpc && (declarations?.provides?.some(service => service.process === this.process && service.kind === 'rpc')\n || declarations?.consumes?.some(service => service.process === this.process && service.kind === 'rpc'))) {\n throw new RpcServiceError('capability_unavailable');\n }\n const channelProvider = declarations?.provides?.some(service => service.process === this.process && CHANNEL_KINDS.has(service.kind ?? 'local')) === true;\n const channelConsumer = declarations?.consumes?.some(service => service.process === this.process && CHANNEL_KINDS.has(service.kind ?? 'local')) === true;\n // A declared channel provider or required consumer without the host channel\n // adapter is refused here (capability_unavailable), never silently degraded.\n if ((channelProvider || channelConsumer) && this.communications?.channels === undefined) {\n throw new RpcServiceError('capability_unavailable');\n }\n const owner: Owner = { plugin, scope, dependencies: Object.freeze({ ...dependencies }), consumed: new Set(), rpcConsumed: new Map(), ready: false, retiring: false, revoked: false, cleaning: false, leases: 0, pending: new Set(), waiters: [], cleanups: new Set() };\n this.owners.set(key, owner);\n this.ownerTokens.add(owner);\n try {\n if (this.rpc) {\n owner.rpc = this.rpc.createOwner({\n token: owner, plugin, scope, dependencies: owner.dependencies,\n declarations: this.contracts?.get(plugin) ?? {}, lifecycle: this.communications!.identity(plugin, scope),\n getLifecycleState: () => ({ ready: owner.ready, retiring: owner.retiring, revoked: owner.revoked }),\n acquireLease: request => this.acquireRpcLease(owner, request),\n resolveInvocationContext: () => this.currentInvocation(),\n registerPublication: publication => {\n const publicationKey = this.publicationKey(plugin, scope, publication.id, publication.version);\n if (this.publications.has(publicationKey)) throw new RpcServiceError('invalid_registration');\n this.publications.set(publicationKey, { owner, id: publication.id, version: publication.version, kind: 'rpc' });\n },\n registerConsumption: (declaration, providerToken) => {\n const referenceKey = this.publicationKey(declaration.plugin, 'global', declaration.id, declaration.version);\n if (providerToken) {\n const provider = [...this.owners.values()].find(candidate => candidate === providerToken);\n if (!provider || provider.revoked) throw new RpcServiceError('unavailable');\n owner.rpcConsumed.set(referenceKey, { owner: provider });\n } else owner.rpcConsumed.delete(referenceKey);\n },\n });\n }\n if (this.communications?.channels !== undefined && (channelProvider || channelConsumer)) {\n owner.channels = this.communications.channels({\n plugin, scope, declarations: this.contracts?.get(plugin) ?? {},\n dependencies: owner.dependencies,\n lifecycle: this.communications.identity(plugin, scope),\n getLifecycleState: () => ({ ready: owner.ready, retiring: owner.retiring, revoked: owner.revoked }),\n trackPending: (pending: Promise<unknown>) => {\n owner.pending.add(pending);\n void pending.finally(() => { owner.pending.delete(pending); this.notify(owner); }).catch(() => {});\n },\n beginOperation: (options) => this.beginChannelOperation(plugin, scope, options),\n });\n }\n } catch (error) { this.owners.delete(key); throw error; }\n const assertActive = (target = owner) => {\n if (target.revoked || (target.retiring && !target.cleaning && !owner.cleaning && target.leases === 0 && target.pending.size === 0)) throw new Error(`Plugin service handle revoked: ${target.plugin}`);\n };\n const wrap = (value: unknown, provider: Owner, receiver?: object): any => {\n if (typeof value === 'function') return (...args: unknown[]) => {\n assertActive(); assertActive(provider);\n const guardArgument = (arg: unknown): unknown => {\n if (typeof arg === 'function') return (...callbackArgs: unknown[]) => {\n assertActive(); assertActive(provider);\n const result = Reflect.apply(arg, undefined, callbackArgs);\n if (result && typeof result.then === 'function') {\n const pending = Promise.resolve(result);\n owner.pending.add(pending); provider.pending.add(pending);\n void pending.finally(() => { owner.pending.delete(pending); provider.pending.delete(pending); this.notify(owner); this.notify(provider); }).catch(() => {});\n return pending;\n }\n return result;\n };\n if (Array.isArray(arg)) return Object.freeze(arg.map(guardArgument));\n if (arg && typeof arg === 'object') return Object.freeze(Object.fromEntries(Object.entries(arg).map(([key, value]) => [key, guardArgument(value)])));\n return arg;\n };\n const guarded = args.map(guardArgument);\n const result = Reflect.apply(value, receiver, guarded);\n if (result && typeof result.then === 'function') {\n const pending = Promise.resolve(result).then(output => { assertActive(); assertActive(provider); return wrap(output, provider); });\n owner.pending.add(pending); provider.pending.add(pending);\n void pending.finally(() => { owner.pending.delete(pending); provider.pending.delete(pending); this.notify(owner); this.notify(provider); }).catch(() => {});\n return pending;\n }\n return wrap(result, provider);\n };\n if (Array.isArray(value)) return Object.freeze(value.map(item => wrap(item, provider)));\n if (value && typeof value === 'object') {\n // A fresh facade prevents access to implementation identity or mutable provider fields.\n const facade: Record<string, unknown> = {};\n for (const key of Object.keys(value)) Object.defineProperty(facade, key, {\n enumerable: true, get: () => { assertActive(); assertActive(provider); return wrap((value as any)[key], provider, value as object); },\n });\n return Object.freeze(facade);\n }\n return value;\n };\n const consume = <T extends object>(provider: string, id: string, version: number): Readonly<T> => {\n assertActive();\n const declaration = this.contracts?.get(plugin)?.consumes?.find(value => value.plugin === provider && value.id === id && value.version === version && value.process === this.process);\n if (this.contracts && !declaration) throw new Error(`Undeclared plugin service consumption: ${plugin} -> ${provider}/${id}`);\n if (declaration?.kind && declaration.kind !== 'local') throw new Error('Non-local services require their asynchronous host adapter');\n if (provider === plugin || !Object.hasOwn(owner.dependencies, provider)) throw new Error(`Undeclared plugin service dependency: ${plugin} -> ${provider}`);\n const targetScope = 'global';\n const publication = this.publications.get(this.publicationKey(provider, targetScope, id, version));\n if (!publication || !publication.owner.ready || publication.owner.retiring || publication.owner.revoked) {\n if ([...this.publications.values()].some(value => value.owner.plugin === provider && value.owner.scope === targetScope && value.id === id && value.version !== version)) throw new Error(`Plugin service contract mismatch: ${provider}/${id}`);\n throw new Error(`Plugin service not ready: ${provider}/${id}`);\n }\n owner.consumed.add(publication.owner);\n return wrap(publication.implementation, publication.owner);\n };\n const context: PluginServices = Object.freeze({\n runBackground: <T>(run: () => T): T => {\n if (this.contexts.get(context) !== owner || this.owners.get(key) !== owner\n || !owner.ready || owner.retiring || owner.revoked) throw new RpcServiceError('retired');\n const release = this.acquireLease(plugin, scope);\n try {\n const result = this.runInInvocation(context, { purpose: 'background' }, run);\n if (result && (typeof result === 'object' || typeof result === 'function') && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).finally(release) as T;\n }\n release();\n return result;\n } catch (error) { release(); throw error; }\n },\n onDispose: (cleanup: () => void) => { assertActive(); owner.cleanups.add(cleanup); },\n publish: <T extends object>(id: string, version: number, implementation: T) => {\n assertActive();\n const candidates = this.contracts?.get(plugin)?.provides?.filter(value => value.id === id && value.version === version && value.process === this.process);\n const declaration = candidates?.[0];\n if (this.contracts && !declaration) throw new Error(`Undeclared plugin service publication: ${plugin}/${id}`);\n if (declaration?.kind && declaration.kind !== 'local') throw new Error('Non-local services require their asynchronous host adapter');\n if (owner.scope !== 'global') throw new Error('Only global providers may publish global services');\n if (!Number.isSafeInteger(version) || version < 1) throw new Error('Invalid service contract version');\n const publicationKey = this.publicationKey(plugin, owner.scope, id, version);\n if (this.publications.has(publicationKey)) throw new Error(`Service already published: ${plugin}/${id}`);\n this.publications.set(publicationKey, { owner, id, version, implementation, kind: 'local' });\n },\n consume: <T extends object>(provider: string, id: string, version: number): Readonly<T> => consume<T>(provider, id, version),\n rpc: owner.rpc === undefined ? undefined : (() => {\n const ownerHandle = owner.rpc!;\n const prepare = (provider: string, contract: { readonly id: string; readonly version: number; readonly methods: Record<string, RpcMethodDefinition> }): void => {\n try { this.communications?.ensureRemoteRoute?.({ plugin, scope: owner.scope, provider, contract }); }\n catch { /* an unroutable remote declaration stays unavailable, never guessed */ }\n };\n return Object.freeze({\n publish: ownerHandle.publish,\n consume: <const M extends Record<string, RpcMethodDefinition>>(provider: string, contract: { readonly id: string; readonly version: number; readonly methods: M }) => {\n prepare(provider, contract);\n return ownerHandle.consume(provider, contract);\n },\n });\n })(),\n stream: owner.channels?.stream,\n events: owner.channels?.events,\n snapshot: owner.channels?.snapshot,\n channelCapabilities: owner.channels?.capabilities,\n });\n this.contexts.set(context, owner);\n return context;\n }\n markReady(plugin: string, scope = 'global', expectedContext?: PluginServices): void {\n const owner = this.requireOwner(plugin, scope, expectedContext);\n if (owner.retiring || owner.revoked) throw new Error(`Plugin service disposed: ${plugin}`);\n for (const publication of this.contracts?.get(plugin)?.provides ?? []) {\n if (publication.kind === 'rpc' && publication.process === this.process && (publication.scope ?? 'global') === (scope === 'global' ? 'global' : 'binding')\n && this.publications.get(this.publicationKey(plugin, scope, publication.id, publication.version))?.kind !== 'rpc') throw new RpcServiceError('not_ready');\n }\n owner.rpc?.markReady();\n owner.channels?.markReady();\n owner.ready = true;\n }\n retire(plugin: string, scope = 'global', expectedContext?: PluginServices): void {\n const owner = this.requireOwner(plugin, scope, expectedContext);\n owner.retiring = true;\n owner.rpc?.retire();\n try { owner.channels?.retire(); } catch { /* host-owned */ }\n }\n /**\n * Host-only: retires admission for EVERY live owner at once. It is wired to\n * the real drain admission point, so after it no new bootstrap/background work\n * is admitted while every already-accepted lease, result and terminal keeps\n * draining normally (nothing is revoked here).\n */\n retireAll(): void {\n for (const owner of this.owners.values()) {\n if (owner.revoked) continue;\n owner.retiring = true;\n try { owner.rpc?.retire(); } catch { /* host-owned */ }\n try { owner.channels?.retire(); } catch { /* host-owned */ }\n }\n }\n /**\n * Host-only: begins ONE channel operation for an owner. It applies the exact\n * same invocation-frame rules as an RPC call (management only from a\n * management frame, request/attempt only with a live retained lease proof, no\n * new work while retiring, bootstrap-only before ready) and holds a real\n * owner lease for the operation's whole lifetime, so owner disposal can never\n * race a live lane task. `null` refuses the operation.\n */\n beginChannelOperation(\n plugin: string,\n scope = 'global',\n incoming?: {\n readonly purpose?: RpcCallPurpose;\n readonly deadlineAt?: number;\n readonly signal?: AbortSignal;\n readonly authenticated?: boolean;\n /**\n * Host-managed background work: the operation runs in an EXPLICIT\n * independent background context and deliberately ignores any frame the\n * caller happens to be inside (typically a closed bootstrap/init closure).\n */\n readonly background?: boolean;\n },\n ): HostChannelOperation | null {\n const owner = this.owners.get(this.key(plugin, scope));\n if (!owner || owner.revoked) return null;\n if (this.owners.get(this.key(plugin, scope)) !== owner) return null;\n const stored = this.frames.getStore();\n let frame: InvocationFrame | undefined;\n if (incoming?.background === true) {\n // Explicit Host background context: no inherited purpose/deadline/signal.\n frame = undefined;\n } else {\n // A stale (already settled) frame is REFUSED: a finished invocation must\n // never be reused as fresh authority nor laundered into another purpose.\n // Legitimate background work either runs outside a frame or asks for the\n // explicit Host background context above.\n if (stored !== undefined && !this.liveInvocations.has(stored.token)) return null;\n frame = stored;\n }\n const leaseBound = frame !== undefined\n && (frame.purpose === 'request' || frame.purpose === 'attempt')\n && ((frame.proof !== undefined && !frame.proof.released && frame.proof.retained.has(owner))\n || frame.ownerAuthority === owner);\n if (frame !== undefined && (frame.purpose === 'request' || frame.purpose === 'attempt') && !leaseBound) return null;\n // A peer-authenticated inbound channel request carries the caller host's real\n // purpose, but only request/attempt/background may cross that boundary: a peer\n // may never claim management or bootstrap authority for a provider lease.\n const peerPurpose = frame === undefined && incoming?.authenticated === true\n && (incoming.purpose === 'request' || incoming.purpose === 'attempt' || incoming.purpose === 'background')\n ? incoming.purpose\n : undefined;\n const purpose = frame?.purpose ?? peerPurpose ?? 'background';\n const requestBound = leaseBound || peerPurpose === 'request' || peerPurpose === 'attempt';\n // Retirement refuses NEW work; already-accepted request/attempt work finishes.\n if (owner.retiring && !requestBound) return null;\n if (!owner.ready && !requestBound && purpose !== 'bootstrap') return null;\n const deadlineAt = minDefined(frame?.deadlineAt, incoming?.deadlineAt);\n const signal = combineAbortSignals(frame?.signal, incoming?.signal);\n owner.leases += 1;\n let released = false;\n const release = () => { if (released) return; released = true; owner.leases -= 1; this.notify(owner); };\n return Object.freeze({\n purpose,\n ...(signal === undefined ? {} : { signal }),\n ...(deadlineAt === undefined ? {} : { deadlineAt }),\n release,\n });\n }\n\n /** Capture before admission; release only after all consumers finish old-request processing. */\n acquireLease(plugin: string, scope = 'global'): () => void {\n const owner = this.requireOwner(plugin, scope);\n if (!owner.ready || owner.retiring || owner.revoked) throw new Error(`Plugin service not ready: ${plugin}`);\n const retained = new Set<Owner>();\n const retain = (target: Owner): void => {\n if (retained.has(target)) return;\n if (!target.ready || target.retiring || target.revoked) throw new Error(`Plugin service not ready: ${target.plugin}`);\n retained.add(target);\n for (const provider of this.dependencyOwners(target)) retain(provider);\n for (const provider of target.consumed) if (provider.ready && !provider.retiring && !provider.revoked) retain(provider);\n // A declared in-process channel provider is an exact required\n // reference too, and its ready provider owner enters the lease proof so a\n // request/attempt frame can authorize real channel work on it.\n for (const provider of this.channelDependencyOwners(target)) {\n if (provider.ready && !provider.retiring && !provider.revoked) retain(provider);\n }\n for (const reference of target.rpcConsumed.values()) retain(reference.owner);\n };\n retain(owner);\n for (const target of retained) target.leases++;\n let released = false;\n const proof: LeaseProof = { retained, released: false };\n const release = () => { if (released) return; released = true; proof.released = true; for (const target of retained) { target.leases--; this.notify(target); } };\n this.leaseProofs.set(release, proof);\n return release;\n }\n\n references(plugin: string): ReadonlyArray<{ plugin: string; scope: string; leases: number }> {\n return [...this.owners.values()].filter(o => !o.revoked && (o.plugin === plugin || [...this.dependencyOwners(o), ...this.consumedOwners(o)].some(provider => provider.plugin === plugin)))\n .map(o => Object.freeze({ plugin: o.plugin, scope: o.scope, leases: o.leases }));\n }\n /** Stop admission immediately, preserve acquired handles until leases and calls drain. */\n dispose(plugin: string, scope = 'global', expectedContext?: PluginServices): Promise<void> {\n let owner: Owner;\n try { owner = this.requireOwner(plugin, scope, expectedContext); } catch (error) { return Promise.reject(error); }\n const existing = this.disposals.get(owner);\n if (existing) return existing;\n let resolve!: () => void;\n let reject!: (error: unknown) => void;\n const task = new Promise<void>((accept, fail) => { resolve = accept; reject = fail; });\n // Install before cleanup can synchronously re-enter disposal.\n this.disposals.set(owner, task);\n void this.disposeOwner(owner).then(() => {\n this.disposals.delete(owner); resolve();\n }, error => { this.disposals.delete(owner); reject(error); });\n return task;\n }\n private async disposeOwner(owner: Owner): Promise<void> {\n const { plugin, scope } = owner;\n const hasPublications = [...this.publications.values()].some(publication => publication.owner === owner);\n if (hasPublications) {\n const dependents = [...this.owners.values()].filter(candidate => candidate !== owner && !candidate.revoked && (this.dependencyOwners(candidate).includes(owner) || this.consumedOwners(candidate).includes(owner)));\n if (dependents.length) throw new Error(`Plugin service provider is referenced: ${plugin} <- ${dependents.map(candidate => `${candidate.plugin}/${candidate.scope}`).join(', ')}`);\n }\n owner.retiring = true;\n owner.rpc?.retire();\n try { owner.channels?.retire(); } catch { /* host-owned */ }\n if (owner.leases || owner.pending.size) await new Promise<void>(resolve => owner.waiters.push(resolve));\n if (owner.channels) {\n try { await owner.channels.dispose(); } catch { /* provider release is best-effort here */ }\n }\n if (owner.rpc) {\n const result = await owner.rpc.dispose();\n if (!result.drained) throw new RpcServiceError('timeout');\n }\n // Cleanup may invoke its cached unsubscribe handle after drain, before final revocation.\n owner.cleaning = true;\n const failures: unknown[] = [];\n try {\n for (const cleanup of owner.cleanups) { try { cleanup(); } catch (error) { failures.push(error); } }\n } finally {\n owner.cleanups.clear(); owner.consumed.clear(); owner.rpcConsumed.clear(); owner.cleaning = false;\n owner.revoked = true; owner.ready = false;\n for (const [key, publication] of this.publications) if (publication.owner === owner) this.publications.delete(key);\n if (this.owners.get(this.key(plugin, scope)) === owner) this.owners.delete(this.key(plugin, scope));\n }\n if (failures.length) throw new PluginServiceCleanupError(failures);\n }\n /** Actual local provider owners, not activation edges to another process/binding. */\n private dependencyOwners(owner: Owner): Owner[] {\n const result = new Set<Owner>();\n for (const dependency of Object.keys(owner.dependencies)) {\n const declarations = this.contracts?.get(owner.plugin)?.consumes?.filter(service => service.plugin === dependency && service.process === this.process);\n if (declarations?.length) {\n for (const service of declarations) {\n // RPC providers are retained through `rpcConsumed`/`acquireRpcLease`,\n // never here. A local channel provider (events/snapshot/stream) IS a\n // real provider owner, so a request/attempt lease must retain it too,\n // or `beginChannelOperation` would refuse exact in-process channel work.\n if ((service.kind ?? 'local') === 'rpc') continue;\n const provider = this.owners.get(this.key(dependency, 'global'));\n if (provider) result.add(provider);\n }\n } else {\n const provider = this.owners.get(this.key(dependency, 'global'));\n if (provider) result.add(provider);\n }\n }\n return [...result];\n }\n /** Local providers of this owner's declared channel consumptions. */\n private channelDependencyOwners(owner: Owner): Owner[] {\n const result = new Set<Owner>();\n for (const service of this.contracts?.get(owner.plugin)?.consumes ?? []) {\n if (service.process !== this.process) continue;\n if (!CHANNEL_KINDS.has(service.kind ?? 'local')) continue;\n if (typeof service.plugin !== 'string' || !service.plugin) continue;\n if (isCrossProcessSelfSnapshot(owner.plugin, service, this.contracts?.get(owner.plugin) ?? {})) continue;\n if (!Object.hasOwn(owner.dependencies, service.plugin)) continue;\n const provider = this.owners.get(this.key(service.plugin, 'global'));\n if (provider) result.add(provider);\n }\n return [...result];\n }\n /** Consumers release all actual references before providers. */\n disposalOrder(): ReadonlyArray<{ plugin: string; scope: string }> {\n const visited = new Set<Owner>(), visiting = new Set<Owner>(), ordered: Owner[] = [];\n const visit = (owner: Owner): void => {\n if (visited.has(owner)) return;\n if (visiting.has(owner)) throw new Error('Plugin service reference cycle during disposal');\n visiting.add(owner);\n for (const provider of [...this.dependencyOwners(owner), ...this.consumedOwners(owner)]) if (!provider.revoked) visit(provider);\n visiting.delete(owner); visited.add(owner); ordered.push(owner);\n };\n for (const owner of this.owners.values()) visit(owner);\n return ordered.reverse().map(owner => Object.freeze({ plugin: owner.plugin, scope: owner.scope }));\n }\n private requireOwner(plugin: string, scope: string, expectedContext?: PluginServices): Owner {\n const owner = this.owners.get(this.key(plugin, scope));\n if (!owner) throw new Error(`Missing plugin service context: ${plugin}/${scope}`);\n if (expectedContext && this.contexts.get(expectedContext) !== owner) throw new Error(`Stale plugin service context: ${plugin}/${scope}`);\n return owner;\n }\n private notify(owner: Owner): void {\n if (!owner.leases && !owner.pending.size) for (const resolve of owner.waiters.splice(0)) resolve();\n }\n private consumedOwners(owner: Owner): Owner[] {\n return [...new Set([...owner.consumed, ...[...owner.rpcConsumed.values()].map(reference => reference.owner)])];\n }\n /** Each real RPC task borrows the canonical owner until actual business work settles. */\n private acquireRpcLease(owner: Owner, request: HostRpcLeaseRequest): HostRpcLeaseGrant {\n if (owner.revoked || this.owners.get(this.key(owner.plugin, owner.scope)) !== owner) throw new RpcServiceError('revoked');\n const frame = this.frames.getStore();\n if (frame && !this.liveInvocations.has(frame.token)) throw new RpcServiceError('unauthorized');\n if (request.purpose === 'management' && frame?.purpose !== 'management') throw new RpcServiceError('unauthorized');\n const existing = (request.purpose === 'request' || request.purpose === 'attempt')\n && frame?.purpose === request.purpose && ((frame.proof !== undefined && !frame.proof.released && frame.proof.retained.has(owner)) || (request.role === 'callee' && frame.peerAuthenticated === true));\n if ((request.purpose === 'request' || request.purpose === 'attempt') && !existing) throw new RpcServiceError('unauthorized');\n if (owner.retiring && !existing) throw new RpcServiceError('retired');\n if (!owner.ready && request.purpose !== 'bootstrap') throw new RpcServiceError('not_ready');\n owner.leases++;\n let released = false;\n return { allowRetired: existing, release: () => { if (released) return; released = true; owner.leases--; this.notify(owner); } };\n }\n}\n\n/** Smallest defined deadline, or undefined when neither side has one. */\nfunction minDefined(left: number | undefined, right: number | undefined): number | undefined {\n if (left === undefined) return right;\n if (right === undefined) return left;\n return Math.min(left, right);\n}\n\n/** Combines local and peer-provided abort signals without dropping either. */\nfunction combineAbortSignals(...signals: ReadonlyArray<AbortSignal | undefined>): AbortSignal | undefined {\n const present = signals.filter((signal): signal is AbortSignal => signal !== undefined);\n if (present.length === 0) return undefined;\n if (present.length === 1) return present[0];\n const any = (AbortSignal as unknown as { any?: (list: readonly AbortSignal[]) => AbortSignal }).any;\n if (typeof any === 'function') return any.call(AbortSignal, present);\n const controller = new AbortController();\n const abort = (signal: AbortSignal) => { if (!controller.signal.aborted) controller.abort(signal.reason); };\n for (const signal of present) {\n if (signal.aborted) { abort(signal); break; }\n signal.addEventListener('abort', () => abort(signal), { once: true });\n }\n return controller.signal;\n}\n\nexport const TOKEN_METERING_SERVICE_ID = 'token-metering.v1';\nexport const TOKEN_METERING_CONTRACT_VERSION = 1;\nexport type TokenMeteringSource = 'official' | 'estimated' | 'partial' | 'none';\nexport type TokenMeteringAuthority = 'official' | 'local' | 'heuristic' | 'partial' | 'none';\nexport interface TokenMeteringResult {\n readonly requestId: string; readonly attemptId: string; readonly routeId: string; readonly upstreamId: string;\n readonly keyId?: string | null;\n readonly provider: string; readonly model?: string; readonly pricingProvider?: string;\n readonly inputTokens?: number; readonly outputTokens?: number; readonly cacheReadTokens?: number; readonly cacheWriteTokens?: number;\n readonly inputSource: TokenMeteringSource; readonly outputSource: TokenMeteringSource;\n readonly inputAuthority: TokenMeteringAuthority; readonly outputAuthority: TokenMeteringAuthority;\n readonly complete: boolean; readonly observationIncomplete: boolean;\n readonly outcome: 'completed' | 'failed' | 'aborted'; readonly finishedAtMs: number; readonly settlementVersion: number;\n}\nexport interface TokenMeteringSubscription {\n /** Omit for degradable all-request reporting; required consumers bind their admitted request. */\n readonly requestId?: string;\n readonly required?: boolean;\n readonly onResult: (result: TokenMeteringResult) => void | Promise<void>;\n readonly onFailure?: (error: unknown, result: TokenMeteringResult) => void | Promise<void>;\n}\nexport interface TokenMeteringService {\n /** Final completion boundary: await this request's required settlement/failure callbacks before releasing its host lease. */\n drainRequest(requestId: string): Promise<void>;\n subscribe(subscription: TokenMeteringSubscription): () => void;\n prepareAttempt(input: Readonly<{ requestId: string; attemptId: string; routeId: string; upstreamId: string; url: string; body: unknown }>): Readonly<{ supported: boolean; provider?: string; model?: string; pricingProvider?: string }>;\n /** Consumer calls before request admission to pin demand; framework init also captures report subscriptions. */\n prepareRequest(requestId: string): boolean;\n}\n\nexport const TOKEN_PRICING_SERVICE_ID = 'token-stats.pricing.v1';\nexport const TOKEN_PRICING_CONTRACT_VERSION = 1;\n/** Costs are quantized to safe integer nanoUSD (1 USD = 1e9 nanoUSD); unknown remains null. */\nexport interface TokenPricingService {\n canPrice(input: Readonly<{ model?: string; pricingProvider?: string }>): Promise<boolean>;\n price(result: TokenMeteringResult): Promise<Readonly<{ costUsd: number | null; costNanoUsd: number | null }>>;\n}\n",
33
35
  "/** Declarative repair request; the host owns the next upstream attempt. */\nconst retryActionBrand=Symbol.for('@jeffusion/bungee/request-retry-action');\nexport class RequestRetryAction extends Error {\n readonly body:unknown;\n constructor(body: unknown, readonly reason: string) {\n super('gateway request repair retry');\n this.name = 'RequestRetryAction';\n Object.defineProperty(this,retryActionBrand,{value:true});\n Object.defineProperty(this,'body',{value:body,enumerable:false});\n }\n /** Plugins and host may bundle the SDK independently in the same process. */\n static [Symbol.hasInstance](value:unknown):boolean {\n return value instanceof Error && (value as unknown as Record<symbol,unknown>)[retryActionBrand]===true;\n }\n}\n",
34
36
  "import type { TokenStatsRange } from './plugin.types';\n\nconst HOUR = 3_600_000;\nexport const TOKEN_STATS_RETENTION_MS = 31 * 24 * HOUR;\nexport const TOKEN_STATS_RANGES = ['1h', '12h', '24h', '1d', '7d', '30d', 'day', 'week', 'month'] as const;\n\n/** Recent page ranges are consecutive elapsed hours; calendar ranges use local dates. */\nexport function tokenStatsWindow(range: TokenStatsRange, asOfMs: number, timeZone = 'UTC') {\n if (range === '1h' || range === '12h' || range === '24h') {\n const duration = { '1h': HOUR, '12h': 12 * HOUR, '24h': 24 * HOUR };\n const bucketMs = { '1h': 300_000, '12h': HOUR, '24h': 2 * HOUR }[range];\n return { startMs: asOfMs - duration[range], endMs: asOfMs, bucketMs };\n }\n if (range === '1d' || range === '7d' || range === '30d') {\n const days = { '1d': 1, '7d': 7, '30d': 30 }[range];\n const bucketMs = range === '1d' ? HOUR : 24 * HOUR;\n const startMs = asOfMs - days * 24 * HOUR;\n const bucketStarts = Array.from({ length: range === '1d' ? 24 : days }, (_, i) => startMs + i * bucketMs);\n return { startMs, endMs: asOfMs, bucketMs, bucketStarts };\n }\n const format = new Intl.DateTimeFormat('en-US', {\n timeZone, year: 'numeric', month: 'numeric', day: 'numeric',\n hour: 'numeric', minute: 'numeric', second: 'numeric', hourCycle: 'h23',\n });\n const parts = (ms: number) => Object.fromEntries(format.formatToParts(ms)\n .filter(part => part.type !== 'literal').map(part => [part.type, Number(part.value)]));\n const today = parts(asOfMs);\n const day = Date.UTC(today.year!, today.month! - 1, today.day!);\n // Resolve each local midnight separately so DST days can contain 23 or 25 hours.\n const midnight = (date: number) => {\n let candidate = date;\n for (let i = 0; i < 4; i++) {\n const p = parts(candidate);\n const local = Date.UTC(p.year!, p.month! - 1, p.day!, p.hour!, p.minute!, p.second!);\n const next = candidate + date - local;\n if (next === candidate) return candidate;\n candidate = next;\n }\n return candidate;\n };\n if (range === 'day') {\n const startMs = midnight(day);\n const bucketEndMs = midnight(day + 24 * HOUR);\n const bucketStarts = Array.from({ length: Math.ceil((bucketEndMs - startMs) / HOUR) }, (_, i) => startMs + i * HOUR);\n return { startMs, endMs: asOfMs, bucketMs: HOUR, bucketStarts, bucketEndMs };\n }\n const firstDay = range === 'month' ? Date.UTC(today.year!, today.month! - 1, 1)\n : day - ((new Date(day).getUTCDay() + 6) % 7) * 24 * HOUR;\n const nextPeriod = range === 'month' ? Date.UTC(today.year!, today.month!, 1) : firstDay + 7 * 24 * HOUR;\n const days = (nextPeriod - firstDay) / (24 * HOUR);\n const bucketStarts = Array.from({ length: days }, (_, i) => midnight(firstDay + i * 24 * HOUR));\n return { startMs: bucketStarts[0]!, endMs: asOfMs, bucketMs: 24 * HOUR, bucketStarts, bucketEndMs: midnight(nextPeriod) };\n}\n",
35
- "import {defineRpcService} from '@jeffusion/bungee-core/plugin';\nconst key={type:'string',minLength:1,maxLength:512} as const;\n/** Each canonical RPC frame is <=64 KiB; long histories use bounded ordered chunks. */\nexport const historyRpc=defineRpcService({id:'codex-router.history.v1',version:1,methods:{\n get:{kind:'query',input:{type:'object',properties:{scope:key,id:key,index:{type:'number',integer:true,minimum:0,maximum:1023}}},output:{type:'json',maxBytes:65536},purposes:['background','request','attempt']},\n put:{kind:'command',input:{type:'object',properties:{scope:key,id:key,index:{type:'number',integer:true,minimum:0,maximum:1023},total:{type:'number',integer:true,minimum:1,maximum:1024},data:{type:'string',maxLength:8192}}},output:{type:'null'},purposes:['background','request','attempt'],command:{deduplication:'none',resultRetentionMs:1,quotaBytes:1024,maxResultBytes:1024}},\n}});\nexport interface HistoryClient {\n get(input:{scope:string;id:string},options?:{signal?:AbortSignal}):Promise<any>;\n put(input:{scope:string;id:string;value:any},options:{signal?:AbortSignal;operationId:string}):Promise<unknown>;\n}\nexport function historyClient(rpc:any):HistoryClient {\n return {\n async get({scope,id},options){let text='';for(let index=0;index<1024;index++){\n options?.signal?.throwIfAborted();const part=await rpc.get({scope,id,index},options);if(part===null)return null;\n text+=part.data;if(Buffer.byteLength(text)>8*1024*1024)throw new Error('codex_router_history_limit');\n if(part.done)return JSON.parse(text);\n }throw new Error('codex_router_history_limit');},\n async put({scope,id,value},options){const text=JSON.stringify(value),total=Math.ceil(text.length/8192);\n if(total>1024||Buffer.byteLength(text)>8*1024*1024)throw new Error('codex_router_history_limit');\n for(let index=0;index<total;index++){options.signal?.throwIfAborted();await rpc.put({scope,id,index,total,data:text.slice(index*8192,(index+1)*8192)},{...options,operationId:`${options.operationId}-${index}`});}\n },\n };\n}\n",
36
- "import {protocolSSEOutput,type Plugin,type PluginHooks} from '@jeffusion/bungee-core/plugin';\nimport {ResponsesEventEncoder,encodeResponsesResult,type ResponsesProtocol,type ResponsesToolNames} from '@jeffusion/bungee-llms/plugin-api';\n\nexport function protocolAdapter(input:{protocol?:ResponsesProtocol;model:string;toolNames?:ResponsesToolNames;save:(response:any)=>Promise<void>;signal:AbortSignal}):Plugin {\n const encoder=input.protocol ? new ResponsesEventEncoder(input.protocol,input.model,input.toolNames) : undefined;\n let nativeTerminal:any;\n let flushed=false;\n const terminal=async(events:Record<string,any>[])=>{\n for(const event of events)if(event.response && ['response.completed','response.incomplete'].includes(event.type)) {\n input.signal.throwIfAborted(); await input.save(event.response);\n }\n return events;\n };\n return {\n bodyRequirements(){return {request:'none',response:['json','sse-json']};},\n register(hooks:PluginHooks){\n hooks.onResponse.tapPromise('codex-router.protocol',async(response,context)=>{\n if(!response.ok || !response.headers.get('content-type')?.includes('json'))return response;\n const raw=await context.bodyHandle!.json({id:'codex-router.protocol',mandatory:true});\n const body=input.protocol ? encodeResponsesResult(raw,input.protocol,input.model,input.toolNames) : {...raw as any,model:input.model};\n if(['completed','incomplete'].includes(body.status)){input.signal.throwIfAborted();await input.save(body);}\n const headers=new Headers(response.headers);headers.delete('content-length');headers.delete('content-encoding');headers.set('content-type','application/json');\n return new Response(JSON.stringify(body),{status:response.status,headers});\n });\n hooks.onStreamChunk.tapPromise('codex-router.protocol',async(envelope)=>{\n if(!encoder){\n const event=envelope.json as any;\n if(event?.response && ['response.completed','response.incomplete'].includes(event.type))nativeTerminal={...event.response,model:input.model};\n if(event?.response)return protocolSSEOutput([{...event,response:{...event.response,model:input.model}}],'responses',envelope);\n return [envelope];\n }\n if(envelope.data==='[DONE]')return [];\n const events=await terminal(encoder.push(envelope.json));return protocolSSEOutput(events,'responses',envelope);\n });\n hooks.onFlushStream.tapPromise('codex-router.protocol',async(chunks)=>{\n if(flushed)return chunks;flushed=true;\n if(encoder)return [...chunks,...protocolSSEOutput(await terminal(encoder.finish()),'responses')];\n if(nativeTerminal){input.signal.throwIfAborted();await input.save(nativeTerminal);}\n return chunks;\n });\n },\n };\n}\n",
37
+ "import {serializeHistory} from './history';\nimport {defineRpcService} from '@jeffusion/bungee-core/plugin';\nconst key={type:'string',minLength:1,maxLength:512} as const;\n/** Each canonical RPC frame is <=64 KiB; long histories use bounded ordered chunks. */\nexport const historyRpc=defineRpcService({id:'codex-router.history.v1',version:1,methods:{\n get:{kind:'query',input:{type:'object',properties:{scope:key,id:key,index:{type:'number',integer:true,minimum:0,maximum:1023}}},output:{type:'json',maxBytes:65536},purposes:['background','request','attempt']},\n put:{kind:'command',input:{type:'object',properties:{scope:key,id:key,index:{type:'number',integer:true,minimum:0,maximum:1023},total:{type:'number',integer:true,minimum:1,maximum:1024},data:{type:'string',maxLength:8192}}},output:{type:'null'},purposes:['background','request','attempt'],command:{deduplication:'none',resultRetentionMs:1,quotaBytes:1024,maxResultBytes:1024}},\n}});\nexport interface HistoryClient {\n get(input:{scope:string;id:string},options?:{signal?:AbortSignal}):Promise<any>;\n put(input:{scope:string;id:string;value:any},options:{signal?:AbortSignal;operationId:string}):Promise<unknown>;\n}\nexport function historyClient(rpc:any):HistoryClient {\n return {\n async get({scope,id},options){let text='';for(let index=0;index<1024;index++){\n options?.signal?.throwIfAborted();const part=await rpc.get({scope,id,index},options);if(part===null)return null;\n text+=part.data;if(Buffer.byteLength(text)>8*1024*1024)throw new Error('codex_router_history_limit');\n if(part.done)return JSON.parse(text);\n }throw new Error('codex_router_history_limit');},\n async put({scope,id,value},options){const text=serializeHistory(value),total=Math.ceil(text.length/8192);\n if(total>1024||Buffer.byteLength(text)>8*1024*1024)throw new Error('codex_router_history_limit');\n for(let index=0;index<total;index++){options.signal?.throwIfAborted();await rpc.put({scope,id,index,total,data:text.slice(index*8192,(index+1)*8192)},{...options,operationId:`${options.operationId}-${index}`});}\n },\n };\n}\n",
38
+ "import {protocolSSEOutput,type Plugin,type PluginHooks} from '@jeffusion/bungee-core/plugin';\nimport {ResponsesEventEncoder,encodeResponsesResult,type ResponsesProtocol,type ResponsesToolNames} from '@jeffusion/bungee-llms/plugin-api';\n\nexport function protocolAdapter(input:{protocol?:ResponsesProtocol;model:string;toolNames?:ResponsesToolNames;save:(response:any,context:any)=>Promise<void>;signal:AbortSignal}):Plugin {\n const encoder=input.protocol ? new ResponsesEventEncoder(input.protocol,input.model,input.toolNames) : undefined;\n let nativeTerminal:any;\n let sourceContext:any;\n let flushed=false;\n const terminal=async(events:Record<string,any>[])=>{\n for(const event of events)if(event.response && ['response.completed','response.incomplete'].includes(event.type)) {\n input.signal.throwIfAborted(); await input.save(event.response,sourceContext);\n }\n return events;\n };\n return {\n bodyRequirements(){return {request:'none',response:['json','sse-json']};},\n register(hooks:PluginHooks){\n hooks.onResponse.tapPromise('codex-router.protocol',async(response,context)=>{\n if(!response.ok || !response.headers.get('content-type')?.includes('json'))return response;\n const raw=await context.bodyHandle!.json({id:'codex-router.protocol',mandatory:true});\n const body=input.protocol ? encodeResponsesResult(raw,input.protocol,input.model,input.toolNames) : {...raw as any,model:input.model};\n if(['completed','incomplete'].includes(body.status)){input.signal.throwIfAborted();await input.save(body,context);}\n const headers=new Headers(response.headers);headers.delete('content-length');headers.delete('content-encoding');headers.set('content-type','application/json');\n return new Response(JSON.stringify(body),{status:response.status,headers});\n });\n hooks.onStreamChunk.tapPromise('codex-router.protocol',async(envelope,context)=>{\n sourceContext=context;\n if(!encoder){\n const event=envelope.json as any;\n if(event?.response && ['response.completed','response.incomplete'].includes(event.type))nativeTerminal={...event.response,model:input.model};\n if(event?.response)return protocolSSEOutput([{...event,response:{...event.response,model:input.model}}],'responses',envelope);\n return [envelope];\n }\n if(envelope.data==='[DONE]')return [];\n const events=await terminal(encoder.push(envelope.json));return protocolSSEOutput(events,'responses',envelope);\n });\n hooks.onFlushStream.tapPromise('codex-router.protocol',async(chunks)=>{\n if(flushed)return chunks;flushed=true;\n if(encoder)return [...chunks,...protocolSSEOutput(await terminal(encoder.finish()),'responses')];\n if(nativeTerminal){input.signal.throwIfAborted();await input.save(nativeTerminal,sourceContext);}\n return chunks;\n });\n },\n };\n}\n",
37
39
  "/**\n * Public contract of the models-dev catalog provider.\n *\n * This is the ONLY file other plugins may import from models-dev. It contains the\n * declared service identity, the wire-contract snapshot literal and the data types\n * of the read surface; it never exposes the downloader, the private storage keys or\n * the internal catalog representation.\n *\n * Consumers must declare a real dependency on `models-dev` and consume the local\n * service for their own process. The service methods are synchronous and read an\n * already-loaded in-memory view: no per-request network or SQL is performed.\n */\n\n/** Provider plugin name. Must match the manifest. */\nexport const MODELS_DEV_PLUGIN_NAME = 'models-dev';\n\n/** The single upstream source; models-dev is the only component allowed to fetch it. */\nexport const MODELS_DEV_SOURCE_URL = 'https://models.dev/api.json';\n\n/** Same-process local read service, published in both the control and worker processes. */\nexport const MODELS_DEV_CATALOG_SERVICE_ID = 'models-dev.catalog.v1';\nexport const MODELS_DEV_CATALOG_CONTRACT_VERSION = 1;\n\n/** Versioned immutable snapshot of the full catalog, published by the control writer. */\nexport const MODELS_DEV_CATALOG_SNAPSHOT_ID = 'models-dev.catalog.snapshot.v1';\nexport const MODELS_DEV_CATALOG_SNAPSHOT_CONTRACT_VERSION = 1;\n/**\n * One atomic record keeps fetchedAt and the immutable catalog with its version.\n * The catalog remains unrestricted JSON so every upstream field is preserved.\n */\nexport const MODELS_DEV_CATALOG_SNAPSHOT_SCHEMA = Object.freeze({\n type: 'object', properties: {\n version: { type: 'number', integer: true, minimum: 1 },\n fetchedAt: { type: 'number', minimum: 0 },\n catalog: { type: 'json', maxBytes: 32 * 1024 * 1024 },\n },\n} as const);\nexport const MODELS_DEV_CATALOG_SNAPSHOT_CONTRACT = Object.freeze({\n id: MODELS_DEV_CATALOG_SNAPSHOT_ID,\n version: MODELS_DEV_CATALOG_SNAPSHOT_CONTRACT_VERSION,\n content: MODELS_DEV_CATALOG_SNAPSHOT_SCHEMA,\n});\n\n/** Catalog availability is separate from whether the service is published. */\nexport type ModelsDevCatalogState = 'empty' | 'ready' | 'stale' | 'failed';\n\nexport interface ModelsDevCatalogStatus {\n readonly state: ModelsDevCatalogState;\n /** Monotonic published data version; `null` before the first successful load. */\n readonly version: number | null;\n readonly fetchedAt: number | null;\n readonly providerCount: number;\n readonly modelCount: number;\n /** Last failure reason; `null` after a fully successful load. */\n readonly error: string | null;\n}\n\nexport interface ModelsDevProviderSummary {\n readonly provider: string;\n readonly name: string;\n /** Normalized upstream API base (`provider.api`), or `null` when models.dev declares none. */\n readonly api: string | null;\n readonly modelCount: number;\n}\n\n/** One selectable catalog model. `provider` is the pricing provider, never the protocol. */\nexport interface ModelsDevModelOption {\n readonly provider: string;\n readonly providerName: string;\n readonly model: string;\n readonly name: string;\n}\n\nexport interface ModelsDevModelPage {\n readonly models: readonly ModelsDevModelOption[];\n readonly total: number;\n /** 1-based page actually returned. */\n readonly page: number;\n readonly pageSize: number;\n}\n\n/** USD per million tokens, applied to the whole request at this input threshold. */\nexport interface ModelsDevContextTier {\n readonly minimumInputTokens: number;\n readonly input: number;\n readonly output: number;\n readonly cacheRead: number | null;\n readonly cacheWrite: number | null;\n}\n\n/** A resolved catalog entry with optional ascending context price bands. */\nexport interface ModelsDevModelMatch {\n readonly provider: string;\n readonly model: string;\n readonly input: number;\n readonly output: number;\n readonly cacheRead: number | null;\n readonly cacheWrite: number | null;\n readonly tiered: boolean;\n readonly contextTiers?: readonly ModelsDevContextTier[];\n}\n\nexport interface ModelsDevProviderMatch {\n readonly provider: string;\n}\n\n/**\n * The declared local read surface. Implementations must be side-effect free and\n * must never throw for a miss/corruption of the current view: an unavailable\n * catalog returns an `empty`/`failed` status instead of a fabricated price.\n */\nexport interface ModelsDevCatalogService {\n status(): ModelsDevCatalogStatus;\n providers(): readonly ModelsDevProviderSummary[];\n modelOptions(input?: { readonly provider?: string; readonly search?: string; readonly page?: number; readonly pageSize?: number }): ModelsDevModelPage;\n /**\n * Resolve exactly one catalog entry for a client model name.\n *\n * `url` (when supplied) is canonicalized to host + path and matched against the\n * full catalog's `provider.api`; more than one candidate is ambiguous and returns\n * null. `pricingProvider` is a catalog provider id and takes priority over URL and\n * prefix inference. A model id present under several providers without an explicit\n * provider is ambiguous. Matching defaults to exact and case-sensitive.\n * `estimate` additionally permits normalized names, original-lab prices and\n * dated members of the same family. Explicit provider IDs remain binding;\n * an unresolved URL is only a hint in estimate mode.\n */\n resolveModel(input: { readonly model: string; readonly pricingProvider?: string; readonly url?: string; readonly mode?: 'exact' | 'estimate' }): ModelsDevModelMatch | null;\n /** Resolve one provider from a real upstream URL via `provider.api`; ambiguous/none => null. */\n resolveProvider(input: { readonly url: string }): ModelsDevProviderMatch | null;\n}\n\n/** Capability reads are additive; existing catalog.v1 consumers stay unchanged. */\nexport const MODELS_DEV_CAPABILITIES_SERVICE_ID = 'models-dev.capabilities.v1';\nexport const MODELS_DEV_CAPABILITIES_CONTRACT_VERSION = 1;\nexport interface ModelsDevCapabilities {\n readonly provider: string;\n readonly model: string;\n readonly name: string;\n readonly contextWindow: number | null;\n readonly outputLimit: number | null;\n readonly toolCall: boolean;\n readonly reasoning: boolean;\n readonly inputModalities: readonly string[];\n}\nexport interface ModelsDevCapabilitiesService {\n status(): ModelsDevCatalogStatus;\n model(input: { readonly provider: string; readonly model: string }): ModelsDevCapabilities | null;\n}\n",
38
- "export interface ModelBinding {\n provider: string;\n model: string;\n alias?: string;\n target: { type: 'route' | 'service'; id: string };\n capabilityOverrides?: { contextWindow?: number; tools?: boolean; reasoning?: boolean; images?: boolean; reasoningEffort?: boolean; anthropicThinkingBudget?: number };\n}\nexport function parseBindings(value: unknown): readonly ModelBinding[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.length > 100) throw new Error('codex_router_invalid_bindings');\n const ids = new Set<string>();\n return Object.freeze(value.map(entry => {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)\n || Object.keys(entry).some(key => !['provider','model','alias','target','capabilityOverrides'].includes(key))) throw new Error('codex_router_invalid_bindings');\n for (const text of [entry.provider, entry.model, ...(entry.alias === undefined ? [] : [entry.alias])]) {\n if (typeof text !== 'string' || !text || text !== text.trim() || text.length > 512 || /[\\x00-\\x1f\\x7f]/.test(text)) throw new Error('codex_router_invalid_bindings');\n }\n const target = entry.target;\n if (!target || !['route','service'].includes(target.type) || typeof target.id !== 'string' || !target.id\n || Object.keys(target).some(key => !['type','id'].includes(key))) throw new Error('codex_router_invalid_target');\n const publicId = entry.alias ?? entry.model;\n if (ids.has(publicId)) throw new Error('codex_router_model_conflict');\n ids.add(publicId);\n const overrides = entry.capabilityOverrides;\n if (overrides !== undefined) {\n if (!overrides || typeof overrides !== 'object' || Array.isArray(overrides)) throw new Error('codex_router_invalid_capabilities');\n for (const [key, val] of Object.entries(overrides)) {\n if (['contextWindow','anthropicThinkingBudget'].includes(key) ? typeof val !== 'number' || !Number.isSafeInteger(val) || val < 1\n : !['tools','reasoning','images','reasoningEffort'].includes(key) || typeof val !== 'boolean') throw new Error('codex_router_invalid_capabilities');\n }\n }\n return Object.freeze(structuredClone(entry)) as ModelBinding;\n }));\n}\n",
39
- "import { createHash } from 'node:crypto';\nimport type { ModelsDevCapabilitiesService } from '../../models-dev/contract';\nimport type { ModelBinding } from './config';\nimport template from './model-template-0.160.1.json';\n\nexport function mergeCatalog(native: unknown, bindings: readonly ModelBinding[], catalog: ModelsDevCapabilitiesService): unknown {\n if (!native || typeof native !== 'object' || Array.isArray(native)) throw new Error('codex_router_invalid_catalog');\n const body = native as Record<string, any>;\n // Generic OpenAI consumers retain their original shape. Codex requires richer models.\n const rich = Array.isArray(body.models);\n if (!rich && !Array.isArray(body.data)) throw new Error('codex_router_invalid_catalog');\n const existing = rich ? body.models : body.data;\n const ids = new Set(existing.map((entry: any) => rich ? entry.slug : entry.id));\n const added: any[] = [];\n for (const binding of bindings) {\n const id = binding.alias ?? binding.model;\n if (ids.has(id)) throw new Error('codex_router_model_conflict');\n ids.add(id);\n const info = catalog.model(binding);\n if (!info || info.contextWindow === null || !info.inputModalities.includes('text')) continue;\n if (!rich) { added.push({id, object: 'model', owned_by: binding.provider}); continue; }\n const overrides = binding.capabilityOverrides;\n const context = Math.min(info.contextWindow, overrides?.contextWindow ?? info.contextWindow);\n const reasoning = info.reasoning && overrides?.reasoning !== false;\n // Only the implemented protocol subset is advertised; catalog fields are not promises of hosted tools.\n added.push({...template, slug:id, display_name:info.name, description:`${info.name} (${binding.provider})`,\n context_window:context, max_context_window:context, auto_compact_token_limit:Math.floor(context * 0.85),\n input_modalities: ['text', ...(info.inputModalities.includes('image') && overrides?.images !== false ? ['image'] : [])],\n supported_reasoning_levels: reasoning ? ['low','medium','high'].map(effort => ({effort,description:effort})) : [],\n default_reasoning_level:reasoning ? 'medium' : 'none', support_verbosity:false,\n });\n }\n return {...body, [rich ? 'models' : 'data']: [...existing, ...added]};\n}\n/** No shared identity cache: the upstream's per-request catalog is merged on demand. */\nexport function catalogEtag(body: unknown, version: number | null, clientVersion: string): string {\n return `\"${createHash('sha256').update(JSON.stringify([body,version,clientVersion])).digest('hex')}\"`;\n}\n"
40
+ "import type { LLMProtocol } from '@jeffusion/bungee-types';\n\nexport interface ModelBinding {\n provider: string;\n model: string;\n source?: string;\n sourceProvider?: string;\n sourceProtocol?: 'responses';\n alias?: string;\n target: { type: 'route' | 'service'; id: string; protocol: LLMProtocol };\n capabilityOverrides?: { contextWindow?: number; tools?: boolean; reasoning?: boolean; images?: boolean; reasoningEffort?: boolean; anthropicThinkingBudget?: number };\n}\n/** The model in the client request; model itself is the upstream destination. */\nexport function bindingSource(binding: ModelBinding): string { return binding.source ?? binding.alias ?? binding.model; }\nexport function parseBindings(value: unknown): readonly ModelBinding[] {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.length > 100) throw new Error('codex_router_invalid_bindings');\n const ids = new Set<string>();\n return Object.freeze(value.map(entry => {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)\n || Object.keys(entry).some(key => !['provider','model','source','sourceProvider','sourceProtocol','alias','target','capabilityOverrides'].includes(key))\n || (entry.source !== undefined && entry.alias !== undefined)\n || (entry.sourceProvider !== undefined && entry.source === undefined)) throw new Error('codex_router_invalid_bindings');\n for (const text of [entry.provider, entry.model, ...(entry.source === undefined ? [] : [entry.source]), ...(entry.sourceProvider === undefined ? [] : [entry.sourceProvider]), ...(entry.alias === undefined ? [] : [entry.alias])]) {\n if (typeof text !== 'string' || !text || text !== text.trim() || text.length > 512 || /[\\x00-\\x1f\\x7f]/.test(text)) throw new Error('codex_router_invalid_bindings');\n }\n if (entry.sourceProtocol !== undefined && entry.sourceProtocol !== 'responses') throw new Error('codex_router_source_protocol_unsupported');\n const target = entry.target;\n if (!target || !['route','service'].includes(target.type) || typeof target.id !== 'string' || !target.id\n || Object.keys(target).some(key => !['type','id','protocol'].includes(key))) throw new Error('codex_router_invalid_target');\n if (target.protocol === undefined) throw new Error('codex_router_target_protocol_required');\n if (!['responses','chat_completions','anthropic_messages'].includes(target.protocol)) throw new Error('codex_router_target_protocol_invalid');\n const publicId = bindingSource(entry);\n if (ids.has(publicId)) throw new Error('codex_router_model_conflict');\n ids.add(publicId);\n const overrides = entry.capabilityOverrides;\n if (overrides !== undefined) {\n if (!overrides || typeof overrides !== 'object' || Array.isArray(overrides)) throw new Error('codex_router_invalid_capabilities');\n for (const [key, val] of Object.entries(overrides)) {\n if (['contextWindow','anthropicThinkingBudget'].includes(key) ? typeof val !== 'number' || !Number.isSafeInteger(val) || val < 1\n : !['tools','reasoning','images','reasoningEffort'].includes(key) || typeof val !== 'boolean') throw new Error('codex_router_invalid_capabilities');\n }\n }\n return Object.freeze(structuredClone(entry)) as ModelBinding;\n }));\n}\n",
41
+ "import { createHash } from 'node:crypto';\nimport type { ModelsDevCapabilitiesService } from '../../models-dev/contract';\nimport { bindingSource, type ModelBinding } from './config';\nimport template from './model-template-0.160.1.json';\n\nexport function mergeCatalog(native: unknown, bindings: readonly ModelBinding[], catalog: ModelsDevCapabilitiesService): unknown {\n if (!native || typeof native !== 'object' || Array.isArray(native)) throw new Error('codex_router_invalid_catalog');\n const body = native as Record<string, any>;\n // Generic OpenAI consumers retain their original shape. Codex requires richer models.\n const rich = Array.isArray(body.models);\n if (!rich && !Array.isArray(body.data)) throw new Error('codex_router_invalid_catalog');\n const existing = rich ? body.models : body.data;\n const ids = new Set(existing.map((entry: any) => rich ? entry.slug : entry.id));\n const added: any[] = [];\n const replacements = new Map<string, any>();\n const unavailable = new Set<string>();\n const bound = new Set<string>();\n for (const binding of bindings) {\n const id = bindingSource(binding);\n if (bound.has(id) || (ids.has(id) && binding.source === undefined)) throw new Error('codex_router_model_conflict');\n bound.add(id);\n const replace = ids.has(id);\n ids.add(id);\n const info = catalog.model(binding);\n if (!info || info.contextWindow === null || !info.inputModalities.includes('text')) {\n if (replace) unavailable.add(id);\n continue;\n }\n if (!rich) {\n const model = {id, object: 'model', owned_by: binding.provider};\n if (replace) replacements.set(id, model); else added.push(model);\n continue;\n }\n const overrides = binding.capabilityOverrides;\n const context = Math.min(info.contextWindow, overrides?.contextWindow ?? info.contextWindow);\n const reasoning = info.reasoning && overrides?.reasoning !== false;\n // Only the implemented protocol subset is advertised; catalog fields are not promises of hosted tools.\n const model = {...template, slug:id, display_name:info.name, description:`${info.name} (${binding.provider})`,\n context_window:context, max_context_window:context, auto_compact_token_limit:Math.floor(context * 0.85),\n input_modalities: ['text', ...(info.inputModalities.includes('image') && overrides?.images !== false ? ['image'] : [])],\n supported_reasoning_levels: reasoning ? ['low','medium','high'].map(effort => ({effort,description:effort})) : [],\n default_reasoning_level:reasoning ? 'medium' : 'none', support_verbosity:false,\n };\n if (replace) replacements.set(id, model); else added.push(model);\n }\n return {...body, [rich ? 'models' : 'data']: [...existing.filter((entry: any) => !unavailable.has(rich ? entry.slug : entry.id))\n .map((entry: any) => replacements.get(rich ? entry.slug : entry.id) ?? entry), ...added]};\n}\n/** No shared identity cache: the upstream's per-request catalog is merged on demand. */\nexport function catalogEtag(body: unknown, version: number | null, clientVersion: string): string {\n return `\"${createHash('sha256').update(JSON.stringify([body,version,clientVersion])).digest('hex')}\"`;\n}\n"
40
42
  ],
41
- "mappings": "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",
42
- "debugId": "E29014A25F222FA164756E2164756E21",
43
+ "mappings": "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",
44
+ "debugId": "3BEC03CB648CDF5064756E2164756E21",
43
45
  "names": []
44
46
  }