@jeffusion/bungee-core 5.23.0 → 5.23.1

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../../plugins/codex-router/server/index.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/llm-protocol-adapter/contract.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", "../../../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/llm-protocol-adapter/contract.ts", "../../../../../plugins/codex-router/server/protocol.ts", "../../../../../plugins/codex-router/server/config.ts", "../../../../../plugins/codex-router/server/catalog.ts", "../../../../../plugins/codex-router/contract.ts", "../../../../../plugins/codex-router/server/catalog-validators.ts"],
4
4
  "sourcesContent": [
5
- "import {createHash} from 'node:crypto';\nimport {ADAPTER_PLUGIN,CONVERSION_SERVICE_ID,CONVERSION_VERSION,historyRpc,historyClient,type HistoryClient,type ConversionService,type CollaborationRelay} from '../../llm-protocol-adapter/contract';\nimport {protocolAdapter} from './protocol';\nimport { definePlugin, DataAdmissionError, type Plugin, type PluginInitContext, type PluginHooks, type DispatchRequestPreparationInput } 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, parseCollaborationRelay, 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 readonly relay?:CollaborationRelay;\n private history!:HistoryClient;\n private catalog!: ModelsDevCapabilitiesService;\n private conversion!:ConversionService;\n constructor(options?: { models?: unknown; collaborationRelay?: unknown }) { this.bindings = parseBindings(options?.models); this.relay = parseCollaborationRelay(options?.collaborationRelay); }\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(ADAPTER_PLUGIN,historyRpc));\n this.conversion=context.services!.consume(ADAPTER_PLUGIN,CONVERSION_SERVICE_ID,CONVERSION_VERSION);\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}) => {\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.conversion.resolveCapabilities({provider:binding.provider,model:binding.model,targetProtocol:protocol,restrictions:binding.capabilityOverrides});\n if(!capabilities || capabilities.contextWindow === null || !capabilities.inputModalities.includes('text'))throw new DataAdmissionError(503,'codex_router_model_unavailable');\n context.body={...context.body,model:binding.model};\n return {target:binding.target,protocol,prepareRequest:async ({context,principal,servingRevision,signal,executeAuxiliary,webSocketConnection}:DispatchRequestPreparationInput)=>{\n const entryScope=createHash('sha256').update(JSON.stringify([context.routeId,servingRevision ?? null,this.bindings,this.relay])).digest('hex');\n const scope=principal?.domain !== 'anonymous' && principal?.keyId ? createHash('sha256').update(JSON.stringify([principal,entryScope])).digest('hex') : null;\n let 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(protocol!=='responses' && !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 relayDiagnostics:any[]=[];\n if(protocol!=='responses') {\n try {\n const inspected=this.conversion.inspectAgentMessages(input);\n for(const message of inspected.messages)if(message.encryptedContents.length>1)throw new DataAdmissionError(422,'llm_adapter_agent_message_multiple_encrypted_blocks',undefined,{param:message.encryptedContents[1].param,message:'Multiple encrypted agent blocks cannot be restored losslessly'});\n const replacements=[];\n for(const message of inspected.messages)for(const encrypted of message.encryptedContents) {\n if(!this.relay)throw new DataAdmissionError(422,'llm_adapter_agent_message_relay_required',undefined,{param:encrypted.param,message:'Encrypted agent content requires a configured relay'});\n const text=await this.conversion.relayAgentMessage({message:input.input[message.inputIndex],contentIndex:encrypted.contentIndex,param:encrypted.param,relay:this.relay,entryScope,scope,requestId:context.requestId,signal,executeAuxiliary,webSocketConnection});\n replacements.push({param:encrypted.param,text});\n }\n if(replacements.length){const replaced=this.conversion.replaceAgentMessageEncryptedContent(input,replacements);input=replaced.body;relayDiagnostics=replaced.diagnostics;}\n } catch(error) {const e=error as any;if(typeof e.code==='string' && e.name!=='DataAdmissionError')throw new DataAdmissionError(422,`llm_adapter_${e.code}`,undefined,{message:'Agent message cannot be converted',param:e.param});throw error;}\n }\n let diagnostics;\n let session;\n try {session=this.conversion.createSession({sourceProtocol:'responses',targetProtocol:protocol,model:binding.model,responseModel:bindingSource(binding),provider:binding.provider,profile:capabilities,selectedEffort:input.reasoning?.effort,...(protocol!=='responses'?{agentMessageDelivery:'plaintext' as const}:{})});} catch(error) {const e=error as any;if(typeof e.code==='string')throw new DataAdmissionError(422,`llm_adapter_${e.code}`,undefined,{message:e.message,param:e.param});throw error;}\n try {\n const decoded=session.convertRequest(input);context.body=structuredClone(decoded.body);\n if(protocol!=='responses')logicalInput=structuredClone(decoded.canonicalHistory);\n // Host logs may flush after the consumer lease is revoked during drain.\n diagnostics=structuredClone([...relayDiagnostics,...decoded.diagnostics]);\n } catch(error) {session.dispose();const e=error as any;if(typeof e.code==='string')throw new DataAdmissionError(422,`llm_adapter_${e.code}`,undefined,{message:e.message,param:e.param});throw error;}\n if(protocol!=='responses')context.url.pathname=context.url.pathname.replace(/\\/responses$/,protocol==='chat_completions'?'/chat/completions':'/messages');\n const adapter=protocolAdapter({session,protocol,model:bindingSource(binding),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 {requiredUpstreamId,adapter,...(protocol!=='responses'?{canonicalInput:logicalInput,diagnostics}:{})};\n }};\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 body = mergeCatalog(native,this.bindings,this.conversion);\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 {ADAPTER_PLUGIN,CONVERSION_SERVICE_ID,CONVERSION_VERSION,historyRpc,historyClient,type HistoryClient,type ConversionService,type CollaborationRelay} from '../../llm-protocol-adapter/contract';\nimport {protocolAdapter} from './protocol';\nimport { definePlugin, DataAdmissionError, type Plugin, type PluginInitContext, type PluginHooks, type DispatchRequestPreparationInput } from '@jeffusion/bungee-core/plugin';\nimport manifest from '../manifest.json';\nimport type { PluginConfigField } from '@jeffusion/bungee-core/plugin';\nimport { parseBindings, parseCollaborationRelay, bindingSource } from './config';\nimport { mergeCatalog, catalogEtag } from './catalog';\nimport { catalogValidatorsClient } from '../contract';\nimport { catalogValidatorKey } from './catalog-validators';\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 readonly relay?:CollaborationRelay;\n private history!:HistoryClient;\n private validators?: ReturnType<typeof catalogValidatorsClient>;\n private readonly catalogRequests = new Map<string, {key: string; signal: AbortSignal}>();\n private conversion!:ConversionService;\n constructor(options?: { models?: unknown; collaborationRelay?: unknown }) { this.bindings = parseBindings(options?.models); this.relay = parseCollaborationRelay(options?.collaborationRelay); }\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(ADAPTER_PLUGIN,historyRpc));\n this.conversion=context.services!.consume(ADAPTER_PLUGIN,CONVERSION_SERVICE_ID,CONVERSION_VERSION);\n try { this.validators = catalogValidatorsClient(context.services!); } catch { /* Optional notification state must not block generation. */ }\n context.services!.onDispose?.(() => this.catalogRequests.clear());\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.tap('codex-router.catalog-identity', input => {\n const key = catalogValidatorKey(input, this.bindings);\n if (key) this.catalogRequests.set(input.context.requestId, {key, signal: input.signal});\n });\n hooks.onDispatchRequest.tapPromise('codex-router.binding', async ({context,targets}) => {\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 // The final route does not run entry finally hooks. Transfer ownership to\n // the per-request dispatch adapter before validation/preparation can fail.\n const notification = this.catalogRequests.get(context.requestId);\n this.catalogRequests.delete(context.requestId);\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.conversion.resolveCapabilities({provider:binding.provider,model:binding.model,targetProtocol:protocol,restrictions:binding.capabilityOverrides});\n if(!capabilities || capabilities.contextWindow === null || !capabilities.inputModalities.includes('text'))throw new DataAdmissionError(503,'codex_router_model_unavailable');\n context.body={...context.body,model:binding.model};\n return {target:binding.target,protocol,prepareRequest:async ({context,principal,servingRevision,signal,executeAuxiliary,webSocketConnection}:DispatchRequestPreparationInput)=>{\n const entryScope=createHash('sha256').update(JSON.stringify([context.routeId,servingRevision ?? null,this.bindings,this.relay])).digest('hex');\n const scope=principal?.domain !== 'anonymous' && principal?.keyId ? createHash('sha256').update(JSON.stringify([principal,entryScope])).digest('hex') : null;\n let 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(protocol!=='responses' && !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 relayDiagnostics:any[]=[];\n if(protocol!=='responses') {\n try {\n const inspected=this.conversion.inspectAgentMessages(input);\n for(const message of inspected.messages)if(message.encryptedContents.length>1)throw new DataAdmissionError(422,'llm_adapter_agent_message_multiple_encrypted_blocks',undefined,{param:message.encryptedContents[1].param,message:'Multiple encrypted agent blocks cannot be restored losslessly'});\n const replacements=[];\n for(const message of inspected.messages)for(const encrypted of message.encryptedContents) {\n if(!this.relay)throw new DataAdmissionError(422,'llm_adapter_agent_message_relay_required',undefined,{param:encrypted.param,message:'Encrypted agent content requires a configured relay'});\n const text=await this.conversion.relayAgentMessage({message:input.input[message.inputIndex],contentIndex:encrypted.contentIndex,param:encrypted.param,relay:this.relay,entryScope,scope,requestId:context.requestId,signal,executeAuxiliary,webSocketConnection});\n replacements.push({param:encrypted.param,text});\n }\n if(replacements.length){const replaced=this.conversion.replaceAgentMessageEncryptedContent(input,replacements);input=replaced.body;relayDiagnostics=replaced.diagnostics;}\n } catch(error) {const e=error as any;if(typeof e.code==='string' && e.name!=='DataAdmissionError')throw new DataAdmissionError(422,`llm_adapter_${e.code}`,undefined,{message:'Agent message cannot be converted',param:e.param});throw error;}\n }\n let diagnostics;\n let session;\n try {session=this.conversion.createSession({sourceProtocol:'responses',targetProtocol:protocol,model:binding.model,responseModel:bindingSource(binding),provider:binding.provider,profile:capabilities,selectedEffort:input.reasoning?.effort,...(protocol!=='responses'?{agentMessageDelivery:'plaintext' as const}:{})});} catch(error) {const e=error as any;if(typeof e.code==='string')throw new DataAdmissionError(422,`llm_adapter_${e.code}`,undefined,{message:e.message,param:e.param});throw error;}\n try {\n const decoded=session.convertRequest(input);context.body=structuredClone(decoded.body);\n if(protocol!=='responses')logicalInput=structuredClone(decoded.canonicalHistory);\n // Host logs may flush after the consumer lease is revoked during drain.\n diagnostics=structuredClone([...relayDiagnostics,...decoded.diagnostics]);\n } catch(error) {session.dispose();const e=error as any;if(typeof e.code==='string')throw new DataAdmissionError(422,`llm_adapter_${e.code}`,undefined,{message:e.message,param:e.param});throw error;}\n const converted=protocolAdapter({session,protocol,model:bindingSource(binding),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 const adapter: Plugin = {bodyRequirements: converted.bodyRequirements.bind(converted), register: hooks => {\n converted.register(hooks);\n hooks.onRawResponse.tapPromise('codex-router.catalog-notification', async result => {\n await this.rewriteCatalogNotification(result.response, notification);\n return result;\n });\n }};\n return {requiredUpstreamId,adapter,...(protocol!=='responses'?{canonicalInput:logicalInput,diagnostics}:{})};\n }};\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.onRawResponse.tapPromise('codex-router.catalog-notification', async (result, context) => {\n if (context.method === 'POST' && /\\/responses$/.test(context.originalUrl.pathname)) {\n await this.rewriteCatalogNotification(result.response, this.catalogRequests.get(context.requestId));\n }\n return result;\n });\n hooks.onResponse.tapPromise('codex-router.catalog', async (response, context) => {\n const record = this.catalogRequests.get(context.requestId);\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 body = JSON.stringify(mergeCatalog(native,this.bindings,this.conversion));\n const etag = catalogEtag(body);\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', etag);\n if (record && this.validators) {\n try { await this.validators.put({key: record.key, etag}, {signal: record.signal, timeoutMs: 1000, operationId: crypto.randomUUID()}); }\n catch { /* Directory delivery does not depend on transient notification state. */ }\n }\n return new Response(body, {status:response.status,headers});\n });\n hooks.onFinally.tap('codex-router.catalog-cleanup', context => { this.catalogRequests.delete(context.requestId); });\n }\n private async rewriteCatalogNotification(response: Response, record?: {key: string; signal: AbortSignal}) {\n response.headers.delete('x-models-etag');\n if (record && this.validators) {\n try {\n const etag = await this.validators.get({key: record.key}, {signal: record.signal, timeoutMs: 1000});\n if (etag && !record.signal.aborted) response.headers.set('x-models-etag', etag);\n } catch { /* Missing/shared-state failures leave the generation body untouched. */ }\n }\n }\n reset() { this.catalogRequests.clear(); }\n});\nexport default CodexRouterPlugin;\n",
6
6
  "/** 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",
7
7
  "/**\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",
8
8
  "import type { PluginConfigConstraint, PluginRuntimeScope } from '@jeffusion/bungee-types';\nexport type { PluginConfigConstraint, PluginAllowedTuplesConstraint, PluginRuntimeScope } from '@jeffusion/bungee-types';\n/**\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 providers run once whenever activated; global-and-scoped also retains application bindings. Defaults to scoped. */\n runtimeScope?: PluginRuntimeScope;\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 configConstraints?: readonly PluginConfigConstraint[];\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 listClientModels?(input: {page?:number;pageSize?:number;keyword?:string}): Promise<{models:string[];total:number;page:number;pageSize:number}>;\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",
@@ -21,11 +21,12 @@
21
21
  "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",
22
22
  "import type { ModelsDevCapabilities } from '../models-dev/contract';\nimport type { LLMProtocol, ProtocolSession, ProtocolSessionContext, ProtocolReasoningPolicy, ProtocolSessionCapabilities } from '@jeffusion/bungee-llms/plugin-api';\nimport type { AgentMessageInspectionResult, AgentMessagePlaintextReplacement, ResponsesCodecLimits, ResponsesConversionDiagnostic } from '@jeffusion/bungee-llms/plugin-api';\nimport type { ExecuteGatewayAuxiliary, GatewayDispatchTarget } from '@jeffusion/bungee-core/plugin';\nexport type { AgentMessageInspectionResult, AgentMessagePlaintextReplacement } from '@jeffusion/bungee-llms/plugin-api';\nexport interface CollaborationRelay { target: GatewayDispatchTarget & {protocol: 'responses'}; model: string }\nexport interface AgentMessageRelayInput {\n message: unknown; contentIndex: number; param: string;\n relay: CollaborationRelay; entryScope: string; webSocketConnection?: {readonly id:string;readonly signal:AbortSignal}; scope: string | null; requestId: string;\n signal: AbortSignal; executeAuxiliary: ExecuteGatewayAuxiliary;\n}\nexport type { LLMProtocol, ProtocolSession, ProtocolRequestConversion, ProtocolSessionContext } from '@jeffusion/bungee-llms/plugin-api';\nexport const ADAPTER_PLUGIN = 'llm-protocol-adapter';\nexport const CONVERSION_SERVICE_ID = 'llm-protocol-adapter.conversion.v1';\nexport const CONVERSION_VERSION = 1;\nexport interface CapabilityContext {\n provider: string;\n model: string;\n targetProtocol: LLMProtocol;\n restrictions?: {\n tools?: boolean;\n images?: boolean;\n reasoning?: boolean;\n contextWindow?: number;\n };\n}\nexport interface EffectiveCapabilities extends ModelsDevCapabilities {\n supportedEfforts: readonly string[];\n defaultEffort: string | null;\n rulesVersion: string;\n wirePolicy: ProtocolReasoningPolicy | null;\n codecCapabilities: ProtocolSessionCapabilities;\n}\nexport interface AdapterSession extends ProtocolSession {\n validateAttempt(input: {\n model: string;\n protocol: LLMProtocol;\n body: unknown;\n url?: string;\n }): {\n model: string;\n effort: string | null;\n catalogVersion: number | null;\n rulesVersion: string;\n };\n}\nexport interface ConversionService {\n inspectAgentMessages(raw: unknown, options?: {limits?: Partial<ResponsesCodecLimits>}): AgentMessageInspectionResult;\n replaceAgentMessageEncryptedContent(raw: unknown, replacements: readonly AgentMessagePlaintextReplacement[], options?: {limits?: Partial<ResponsesCodecLimits>}): {body: Record<string, unknown>; diagnostics: ResponsesConversionDiagnostic[]};\n relayAgentMessage(input: AgentMessageRelayInput): Promise<string>;\n dispose(): void;\n describe(): {\n rulesVersion: string;\n protocols: readonly string[];\n matrix: readonly {\n sourceProtocol: string;\n targetProtocol: string;\n mode: string;\n }[];\n };\n resolveCapabilities(context: CapabilityContext): EffectiveCapabilities | null;\n createSession(context: ProtocolSessionContext & {\n profile?: EffectiveCapabilities;\n provider?: string;\n selectedEffort?: string;\n }): AdapterSession;\n}\n/** Escape surrogate units before bounded RPC slicing. */\nfunction serializeHistory(value: unknown): string { return JSON.stringify(value).replace(/[\\uD800-\\uDFFF]/g, unit => '\\\\u' + unit.charCodeAt(0).toString(16).padStart(4, '0')); }\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: 'llm-protocol-adapter.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: {\n scope: string;\n id: string;\n }, options?: {\n signal?: AbortSignal;\n }): Promise<any>;\n put(input: {\n scope: string;\n id: string;\n value: any;\n }, options: {\n signal?: AbortSignal;\n operationId: string;\n }): Promise<unknown>;\n}\nexport function historyClient(rpc: any): HistoryClient {\n return {\n async get({ scope, id }, options) {\n let text = '';\n for (let index = 0; index < 1024; index++) {\n options?.signal?.throwIfAborted();\n const part = await rpc.get({ scope, id, index }, options);\n if (part === null)\n return null;\n text += part.data;\n if (Buffer.byteLength(text) > 8 * 1024 * 1024)\n throw new Error('llm_adapter_history_limit');\n if (part.done)\n return JSON.parse(text);\n }\n throw new Error('llm_adapter_history_limit');\n },\n async put({ scope, id, value }, options) {\n const text = serializeHistory(value), total = Math.ceil(text.length / 8192);\n if (total > 1024 || Buffer.byteLength(text) > 8 * 1024 * 1024)\n throw new Error('llm_adapter_history_limit');\n for (let index = 0; index < total; index++) {\n options.signal?.throwIfAborted();\n await rpc.put({ scope, id, index, total, data: text.slice(index * 8192, (index + 1) * 8192) }, { ...options, operationId: `${options.operationId}-${index}` });\n }\n },\n };\n}\n",
23
23
  "import { logger, protocolSSEOutput, DataAdmissionError, type Plugin, type PluginHooks } from '@jeffusion/bungee-core/plugin';\nimport type { AdapterSession, LLMProtocol } from '../../llm-protocol-adapter/contract';\n/** Codex transport integration only; all codec and state-machine methods are public service calls. */\nexport function protocolAdapter(input: {\n session: AdapterSession;\n protocol: LLMProtocol;\n model: string;\n save: (response: any, context: any) => Promise<void>;\n signal: AbortSignal;\n}): Plugin {\n let nativeTerminal: any, sourceContext: any, flushed = false;\n const dispose = () => input.session.dispose();\n input.signal.addEventListener('abort', dispose, { once: true });\n const release = () => { input.signal.removeEventListener('abort', dispose); dispose(); };\n const convert = <T>(run: () => T): T => { try {\n return run();\n }\n catch (error) {\n const e = error as any;\n if (typeof e.code === 'string')\n throw new DataAdmissionError(422, `llm_adapter_${e.code}`, undefined, { message: e.message, param: e.param });\n throw error;\n } };\n const remember = (events: any[]) => { for (const event of events)\n if (event.type === 'response.completed')\n nativeTerminal = event.response; };\n return { bodyRequirements() { return { request: 'none', response: ['json', 'sse-json'] }; }, register(hooks: PluginHooks) {\n hooks.onValidateOutbound.tapPromise('codex-router.target', async (context) => { input.signal.throwIfAborted(); const result = convert(() => input.session.validateAttempt({ model: context.model ?? input.model, protocol: input.protocol, body: context.body, url: context.url })); logger.info({ requestId: context.requestId, attemptId: context.attemptId, ...result }, 'llm_adapter_target_validated'); return context; });\n hooks.onResponse.tapPromise('codex-router.protocol', async (response, context) => {\n if (!response.ok || !response.headers.get('content-type')?.includes('json'))\n return response;\n const raw = await context.bodyHandle!.json({ id: 'codex-router.protocol', mandatory: true });\n const body: any = structuredClone(convert(() => input.session.convertResponse(raw)));\n body.model = input.model;\n if (body.status === 'completed') {\n input.signal.throwIfAborted();\n await input.save(body, context);\n }\n release();\n const headers = new Headers(response.headers);\n headers.delete('content-length');\n headers.delete('content-encoding');\n 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 input.signal.throwIfAborted();\n if (envelope.data === '[DONE]')\n return [];\n if (envelope.json === undefined)\n return [envelope];\n const events = structuredClone(convert(() => input.session.push(envelope.json)));\n remember(events);\n return protocolSSEOutput(events.map(e => e.response ? { ...e, response: { ...e.response as any, model: input.model } } : e), 'responses', envelope);\n });\n hooks.onFlushStream.tapPromise('codex-router.protocol', async (chunks) => {\n if (flushed)\n return chunks;\n flushed = true;\n input.signal.throwIfAborted();\n const events = structuredClone(convert(() => input.session.finish()));\n remember(events);\n if (nativeTerminal) {\n input.signal.throwIfAborted();\n await input.save(nativeTerminal, sourceContext);\n }\n release();\n return [...chunks, ...protocolSSEOutput(events, 'responses')];\n });\n hooks.onError.tap('codex-router.protocol-error', () => { nativeTerminal = undefined; release(); });\n } };\n}\n",
24
- "/**\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;\n/** Upstream control values; null/default do not name a concrete effort level. */\nexport type ModelsDevReasoningEffortValue = null | 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' | 'default';\n/** Validated models.dev reasoning_options, without inferred controls or levels. */\nexport type ModelsDevReasoningOption =\n | { readonly type: 'effort'; readonly values: readonly ModelsDevReasoningEffortValue[] }\n | { readonly type: 'toggle' }\n | { readonly type: 'budget_tokens'; readonly min?: number; readonly max?: number };\nexport type ModelsDevReasoningOptionsStatus = 'known' | 'missing' | 'invalid';\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 /** null for missing/invalid metadata; a validated empty list remains known. */\n readonly reasoningOptions: readonly ModelsDevReasoningOption[] | null;\n readonly reasoningOptionsStatus: ModelsDevReasoningOptionsStatus;\n /** Version of the same complete snapshot that supplied all fields of this result. */\n readonly catalogVersion: number;\n readonly inputModalities: readonly string[];\n}\nexport interface ModelsDevCapabilitiesService {\n status(): ModelsDevCatalogStatus;\n /** Without a provider, require a unique exact model or a declared API URL match. */\n model(input: { readonly provider?: string; readonly model: string; readonly url?: string }): ModelsDevCapabilities | null;\n}\n",
25
24
  "import type { LLMProtocol } from '@jeffusion/bungee-types';\nimport type { CollaborationRelay } from '../../llm-protocol-adapter/contract';\n\nexport function parseCollaborationRelay(value: unknown): CollaborationRelay | undefined {\n if (value === undefined) return;\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('codex_router_invalid_collaboration_relay');\n const relay = value as Record<string,any>, target = relay.target;\n if (Object.keys(relay).some(key => !['target','model'].includes(key)) || typeof relay.model !== 'string' || !relay.model || relay.model !== relay.model.trim() || relay.model.length > 512 || /[\\x00-\\x1f\\x7f]/.test(relay.model)\n || !target || typeof target !== 'object' || Array.isArray(target) || !['route','service'].includes(target.type) || typeof target.id !== 'string' || !target.id || target.id !== target.id.trim() || target.id.length > 512 || /[\\x00-\\x1f\\x7f]/.test(target.id) || target.protocol !== 'responses' || Object.keys(target).some(key=>!['type','id','protocol'].includes(key))) throw new Error('codex_router_invalid_collaboration_relay');\n return Object.freeze(structuredClone(relay)) as CollaborationRelay;\n}\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 };\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'].includes(key) ? typeof val !== 'number' || !Number.isSafeInteger(val) || val < 1\n : !['tools','reasoning','images'].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",
26
- "import { createHash } from 'node:crypto';\nimport type { ConversionService } from '../../llm-protocol-adapter/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: ConversionService): 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.resolveCapabilities({provider:binding.provider,model:binding.model,targetProtocol:binding.target.protocol,restrictions:binding.capabilityOverrides});\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: info.supportedEfforts.map(effort => ({effort,description:effort})),\n supports_reasoning_effort_updates:info.supportedEfforts.length>0, default_reasoning_level:info.defaultEffort ?? '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"
25
+ "import { createHash } from 'node:crypto';\nimport type { ConversionService } from '../../llm-protocol-adapter/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: ConversionService): 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.resolveCapabilities({provider:binding.provider,model:binding.model,targetProtocol:binding.target.protocol,restrictions:binding.capabilityOverrides});\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: info.supportedEfforts.map(effort => ({effort,description:effort})),\n supports_reasoning_effort_updates:info.supportedEfforts.length>0, default_reasoning_level:info.defaultEffort ?? '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/** Hash exactly the serialized UTF-8 representation returned to the client. */\nexport function catalogEtag(body: string): string {\n return `\"${createHash('sha256').update(body, 'utf8').digest('hex')}\"`;\n}\n",
26
+ "import { defineRpcService, type PluginServices } from '@jeffusion/bungee-core/plugin';\n\nconst key = {type: 'string', minLength: 64, maxLength: 64} as const;\nconst etag = {type: 'string', minLength: 66, maxLength: 66} as const;\n\n/** Only directory validators cross workers; no catalog bodies or credentials. */\nexport const catalogValidatorsRpc = defineRpcService({\n id: 'codex-router.catalog-validators.v1', version: 1, methods: {\n get: {kind: 'query', input: {type: 'object', properties: {key}},\n output: {type: 'union', variants: [etag, {type: 'null'}]}, purposes: ['request', 'attempt']},\n put: {kind: 'command', input: {type: 'object', properties: {key, etag}},\n output: {type: 'null'}, purposes: ['request', 'attempt'],\n command: {deduplication: 'none', resultRetentionMs: 1, quotaBytes: 1024, maxResultBytes: 1024}},\n },\n});\n\nexport function catalogValidatorsClient(services: PluginServices) {\n return services.rpc!.consume('codex-router', catalogValidatorsRpc);\n}\n",
27
+ "import { createHash } from 'node:crypto';\nimport type { DispatchRequestInput } from '@jeffusion/bungee-core/plugin';\nimport type { ModelBinding } from './config';\n\nfunction header(headers: Record<string, string>, name: string): string {\n return Object.entries(headers).find(([key]) => key.toLowerCase() === name)?.[1] ?? '';\n}\n\n/** Request headers are captured at entry dispatch, before provider rewrites. */\nexport function catalogValidatorKey({context, principal, servingRevision}: DispatchRequestInput, bindings: readonly ModelBinding[]): string | null {\n const directory = context.method === 'GET' && /\\/models$/.test(context.originalUrl.pathname);\n const generation = context.method === 'POST' && /\\/responses$/.test(context.originalUrl.pathname);\n if ((!directory && !generation) || !context.routeId) return null;\n const versions = context.originalUrl.searchParams.getAll('client_version');\n const version = directory ? versions.length === 1 ? versions[0] : '' : header(context.headers, 'version');\n if (!version || version.length > 128 || /[\\u0000-\\u0020\\u007f]/.test(version)) return null;\n // Account headers partition records only; authorization still belongs to the host.\n return createHash('sha256').update(JSON.stringify([\n context.routeId, servingRevision ?? null, bindings,\n principal ? [principal.domain, principal.keyId, principal.credentialVersion] : ['anonymous', '', 0],\n header(context.headers, 'authorization'), header(context.headers, 'x-api-key'), header(context.headers, 'api-key'),\n header(context.headers, 'chatgpt-account-id'), version,\n ])).digest('hex');\n}\n\n/** Ephemeral control-process LRU. Reads affect eviction, never the publication TTL. */\nexport class CatalogValidators {\n private readonly entries = new Map<string, {etag: string; expires: number}>();\n constructor(private readonly now = Date.now) {}\n private sweep(): void {\n const now = this.now();\n for (const [key, entry] of this.entries) if (entry.expires <= now) this.entries.delete(key);\n }\n get(key: string): string | null {\n this.sweep();\n const entry = this.entries.get(key);\n if (!entry) return null;\n this.entries.delete(key);\n this.entries.set(key, entry);\n return entry.etag;\n }\n put(key: string, etag: string): null {\n if (!/^[a-f0-9]{64}$/.test(key) || !/^\"[a-f0-9]{64}\"$/.test(etag)) throw new Error('codex_router_invalid_catalog_validator');\n this.sweep();\n this.entries.delete(key);\n if (this.entries.size >= 512) this.entries.delete(this.entries.keys().next().value!);\n this.entries.set(key, {etag, expires: this.now() + 600_000});\n return null;\n }\n clear(): void { this.entries.clear(); }\n}\n"
27
28
  ],
28
- "mappings": "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",
29
- "debugId": "15F3624284EDF84064756E2164756E21",
29
+ "mappings": "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",
30
+ "debugId": "C5F01ADAD6007FBF64756E2164756E21",
30
31
  "names": []
31
32
  }
@@ -25,25 +25,18 @@
25
25
  "llm-protocol-adapter": "^1.0.0"
26
26
  },
27
27
  "services": {
28
- "provides": [],
29
- "consumes": [
28
+ "provides": [
30
29
  {
31
- "id": "models-dev.catalog.v1",
30
+ "id": "codex-router.catalog-validators.v1",
32
31
  "version": 1,
33
32
  "process": "control",
34
- "plugin": "models-dev",
35
- "kind": "local"
36
- },
33
+ "kind": "rpc"
34
+ }
35
+ ],
36
+ "consumes": [
37
37
  {
38
38
  "id": "models-dev.catalog.v1",
39
39
  "version": 1,
40
- "process": "worker",
41
- "plugin": "models-dev",
42
- "kind": "local"
43
- },
44
- {
45
- "id": "models-dev.capabilities.v1",
46
- "version": 1,
47
40
  "process": "control",
48
41
  "plugin": "models-dev",
49
42
  "kind": "local"
@@ -51,7 +44,7 @@
51
44
  {
52
45
  "id": "models-dev.capabilities.v1",
53
46
  "version": 1,
54
- "process": "worker",
47
+ "process": "control",
55
48
  "plugin": "models-dev",
56
49
  "kind": "local"
57
50
  },
@@ -75,6 +68,13 @@
75
68
  "process": "worker",
76
69
  "plugin": "llm-protocol-adapter",
77
70
  "kind": "rpc"
71
+ },
72
+ {
73
+ "id": "codex-router.catalog-validators.v1",
74
+ "version": 1,
75
+ "process": "worker",
76
+ "plugin": "codex-router",
77
+ "kind": "rpc"
78
78
  }
79
79
  ]
80
80
  },
@@ -5886,7 +5886,8 @@ async function relayPayload(result, param, signal) {
5886
5886
  if (result.status < 200 || result.status >= 300)
5887
5887
  throw new DataAdmissionError(result.status === 401 || result.status === 429 ? result.status : 502, "llm_adapter_relay_upstream_failed", undefined, { param, message: `Relay upstream rejected the request (HTTP ${result.status})` });
5888
5888
  let response;
5889
- if (result.bodyHandle.identity.contentType.includes("text/event-stream") || result.bodyHandle.identity.contentType.includes("application/octet-stream")) {
5889
+ const contentType = result.bodyHandle.identity.contentType;
5890
+ if (contentType === "" || contentType.includes("text/event-stream") || contentType.includes("application/octet-stream")) {
5890
5891
  const iterator = result.bodyHandle.events({ id: "llm-adapter.relay", mandatory: true, signal })[Symbol.asyncIterator]();
5891
5892
  let call, callIndex, args = "", argumentBytes = 0, argumentsDone, outputDone = false, terminal = false, done = false;
5892
5893
  const reasoning = new Map;
@@ -5976,7 +5977,7 @@ async function relayPayload(result, param, signal) {
5976
5977
  } finally {
5977
5978
  await iterator.return?.();
5978
5979
  }
5979
- } else if (result.bodyHandle.identity.contentType.includes("json"))
5980
+ } else if (contentType.includes("json"))
5980
5981
  response = await result.bodyHandle.json({ id: "llm-adapter.relay", mandatory: true, signal });
5981
5982
  else
5982
5983
  invalid(param);
@@ -6390,4 +6391,4 @@ export {
6390
6391
  control_default as default
6391
6392
  };
6392
6393
 
6393
- //# debugId=6DAF6016267E58B764756E2164756E21
6394
+ //# debugId=6F7D783A1BAB181564756E2164756E21