@jeffusion/bungee-core 5.20.0 → 5.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config-worker/private-transport.d.ts +2 -0
- package/dist/data-admission/errors.d.ts +6 -1
- package/dist/gateway/contracts.d.ts +15 -4
- package/dist/gateway/forward-plugin.d.ts +2 -0
- package/dist/gateway/plugin.js +12 -2
- package/dist/gateway/request-plugin.d.ts +6 -0
- package/dist/gateway/responses-websocket-session.d.ts +18 -0
- package/dist/gateway/runtime.d.ts +1 -0
- package/dist/gateway/websocket-contracts.d.ts +1 -0
- package/dist/hooks/plugin-hooks.d.ts +2 -3
- package/dist/logger/access-log-writer.d.ts +2 -2
- package/dist/main.js +1199 -176
- package/dist/plugins/ai-transformer/index.js +1 -1
- package/dist/plugins/ai-transformer/index.js.map +4 -4
- package/dist/plugins/codex-router/control.js +6 -2
- package/dist/plugins/codex-router/control.js.map +4 -4
- package/dist/plugins/codex-router/index.js +498 -165
- package/dist/plugins/codex-router/index.js.map +13 -11
- package/dist/plugins/codex-router/manifest.json +124 -8
- package/dist/plugins/key-access/index.js +12 -2
- package/dist/plugins/key-access/index.js.map +3 -3
- package/dist/plugins/key-access/ingress.js +12 -2
- package/dist/plugins/key-access/ingress.js.map +3 -3
- package/dist/plugins/openai-messages-to-chat/index.js +6 -4
- package/dist/plugins/openai-messages-to-chat/index.js.map +4 -4
- package/dist/plugins/token-metering/index.js +1 -1
- package/dist/plugins/token-metering/index.js.map +4 -4
- package/dist/plugins/token-stats/manifest.json +16 -6
- package/dist/plugins/token-stats/ui/ClientModelPicker.svelte +13 -61
- package/dist/plugins/token-stats/ui/PriceModelPicker.svelte +18 -74
- package/dist/plugins/token-stats/ui/TokenStatsSettings.svelte +3 -2
- package/dist/plugins/token-stats/ui/model-search.ts +2 -45
- package/dist/plugins/token-stats/ui/pricing-catalog.ts +2 -1
- package/dist/scoped-plugin-registry.d.ts +7 -0
- package/dist/websocket/index.d.ts +1 -1
- package/dist/websocket/transport.d.ts +40 -18
- package/package.json +2 -2
- package/dist/plugins/chatgpt-oauth/ui/account-model.test.js +0 -69
- package/dist/plugins/local-accounts/ui/login-errors.test.ts +0 -22
- package/dist/plugins/token-stats/ui/client-model-search.test.ts +0 -58
- package/dist/plugins/token-stats/ui/pricing-catalog.test.ts +0 -114
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// plugins/codex-router/server/history.ts
|
|
3
|
+
function serializeHistory(value) {
|
|
4
|
+
return JSON.stringify(value).replace(/[\uD800-\uDFFF]/g, (unit) => "\\u" + unit.charCodeAt(0).toString(16).padStart(4, "0"));
|
|
5
|
+
}
|
|
6
|
+
|
|
3
7
|
class HistoryCache {
|
|
4
8
|
limits;
|
|
5
9
|
now;
|
|
@@ -27,7 +31,7 @@ class HistoryCache {
|
|
|
27
31
|
}
|
|
28
32
|
put(scope, id, value) {
|
|
29
33
|
this.sweep();
|
|
30
|
-
const text =
|
|
34
|
+
const text = serializeHistory(value);
|
|
31
35
|
const bytes = Buffer.byteLength(text);
|
|
32
36
|
if (bytes > this.limits.maxEntryBytes)
|
|
33
37
|
throw new Error("codex_router_history_limit");
|
|
@@ -717,4 +721,4 @@ export {
|
|
|
717
721
|
control_default as default
|
|
718
722
|
};
|
|
719
723
|
|
|
720
|
-
//# debugId=
|
|
724
|
+
//# debugId=FA2574E059661D9664756E2164756E21
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../plugins/codex-router/server/history.ts", "../../../src/plugin-logger.ts", "../../../src/hooks/impl.ts", "../../../src/plugin-extensions.ts", "../../../src/plugin-durable-state.ts", "../../../src/plugin-services/host-rpc.ts", "../../../src/plugin-services/wire-contract.ts", "../../../src/plugin-services/rpc-runtime.ts", "../../../src/plugin-services/peer-channel-protocol.ts", "../../../src/plugin-services/peer-channel-hub.ts", "../../../src/plugin-services/snapshot-store.ts", "../../../src/plugin-services.ts", "../../../src/gateway/retry-action.ts", "../../../src/token-stats-window.ts", "../../../../../plugins/codex-router/server/history-rpc.ts", "../../../../../plugins/models-dev/contract.ts", "../../../../../plugins/codex-router/server/control.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/** Ephemeral control-process cache: no storage/database access, bounded across all workers. */\nexport class HistoryCache {\n private entries = new Map<string,{text:string;bytes:number;expires:number}>();\n private used=0;\n constructor(private limits={maxEntries:512,maxBytes:32*1024*1024,maxEntryBytes:8*1024*1024,ttlMs:600_000},private now=Date.now) {}\n sweep(){for(const [key,entry] of this.entries)if(entry.expires<=this.now()){this.used-=entry.bytes;this.entries.delete(key);}}\n get(scope:string,id:string){this.sweep();const entry=this.entries.get(JSON.stringify([scope,id]));return entry ? JSON.parse(entry.text) : null;}\n readText(scope:string,id:string){this.sweep();return this.entries.get(JSON.stringify([scope,id]))?.text ?? null;}\n put(scope:string,id:string,value:unknown){\n this.sweep();const text=
|
|
5
|
+
"/** Escape UTF-16 code units so fixed RPC slices never contain lone surrogates. */\nexport function serializeHistory(value:unknown):string {return JSON.stringify(value).replace(/[\\uD800-\\uDFFF]/g,unit=>'\\\\u'+unit.charCodeAt(0).toString(16).padStart(4,'0'));}\n/** Ephemeral control-process cache: no storage/database access, bounded across all workers. */\nexport class HistoryCache {\n private entries = new Map<string,{text:string;bytes:number;expires:number}>();\n private used=0;\n constructor(private limits={maxEntries:512,maxBytes:32*1024*1024,maxEntryBytes:8*1024*1024,ttlMs:600_000},private now=Date.now) {}\n sweep(){for(const [key,entry] of this.entries)if(entry.expires<=this.now()){this.used-=entry.bytes;this.entries.delete(key);}}\n get(scope:string,id:string){this.sweep();const entry=this.entries.get(JSON.stringify([scope,id]));return entry ? JSON.parse(entry.text) : null;}\n readText(scope:string,id:string){this.sweep();return this.entries.get(JSON.stringify([scope,id]))?.text ?? null;}\n put(scope:string,id:string,value:unknown){\n this.sweep();const text=serializeHistory(value);const bytes=Buffer.byteLength(text);if(bytes>this.limits.maxEntryBytes)throw new Error('codex_router_history_limit');\n const key=JSON.stringify([scope,id]),old=this.entries.get(key);if(old){this.used-=old.bytes;this.entries.delete(key);}\n while(this.entries.size>=this.limits.maxEntries||this.used+bytes>this.limits.maxBytes){const oldest=this.entries.keys().next().value;if(oldest===undefined)throw new Error('codex_router_history_limit');const item=this.entries.get(oldest)!;this.used-=item.bytes;this.entries.delete(oldest);}\n this.entries.set(key,{text,bytes,expires:this.now()+this.limits.ttlMs});this.used+=bytes;\n }\n clear(){this.entries.clear();this.used=0;}\n status(){this.sweep();return {entries:this.entries.size,bytes:this.used};}\n}\n\nexport class HistoryTransport {\n private pending=new Map<string,{scope:string;id:string;total:number;parts:string[];bytes:number;expires:number}>();\n private retained=0;\n constructor(readonly cache=new HistoryCache()){}\n sweep(){const now=Date.now();for(const [key,entry] of this.pending)if(entry.expires<=now){this.retained-=entry.bytes;this.pending.delete(key);}this.cache.sweep();}\n get({scope,id,index}:{scope:string;id:string;index:number}){const text=this.cache.readText(scope,id);if(text===null)return null;if(index*8192>=text.length)return null;return {data:text.slice(index*8192,(index+1)*8192),done:(index+1)*8192>=text.length};}\n put({scope,id,index,total,data}:{scope:string;id:string;index:number;total:number;data:string}){\n this.sweep();const key=JSON.stringify([scope,id]);let entry=this.pending.get(key);\n if(index===0){if(entry){this.retained-=entry.bytes;this.pending.delete(key);}if(this.pending.size>=128)throw new Error('codex_router_history_busy');entry={scope,id,total,parts:[],bytes:0,expires:Date.now()+30_000};this.pending.set(key,entry);}\n if(!entry||entry.total!==total||entry.parts.length!==index)throw new Error('codex_router_history_chunks_invalid');\n const bytes=Buffer.byteLength(data);if(entry.bytes+bytes>8*1024*1024||this.retained+bytes>8*1024*1024)throw new Error('codex_router_history_limit');\n entry.parts.push(data);entry.bytes+=bytes;this.retained+=bytes;\n if(index+1===total){this.pending.delete(key);this.retained-=entry.bytes;this.cache.put(scope,id,JSON.parse(entry.parts.join('')));}return null;\n }\n clear(){this.pending.clear();this.retained=0;this.cache.clear();}\n}\n",
|
|
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 { PluginDurableState, DurableJson } from './plugin-durable-state';\n\n/** Anonymous is an explicit, signed data identity; it carries no key authority. */\nexport type DataPrincipal = { readonly domain: string; readonly keyId: string; readonly credentialVersion: number };\nexport const ANONYMOUS_PRINCIPAL: DataPrincipal = Object.freeze({domain: 'anonymous', keyId: '', credentialVersion: 0});\nexport interface AdmissionRequirement { readonly plugin: string; readonly routeIds: readonly string[] }\n/** Public contracts. Business rules belong to the implementing plugin. */\nexport interface ManagementSubject {\n readonly id: string;\n readonly provider: string;\n readonly capabilities: readonly string[];\n readonly requiresPasswordChange?: boolean;\n}\nexport interface ManagementProvider {\n authenticate(request: Request): Promise<ManagementSubject | null>;\n authorize(subject: ManagementSubject, capability: string): boolean;\n login(request: Request): Promise<Response>;\n logout(request: Request): Promise<Response>;\n bootstrap(input: unknown): Promise<void>;\n hasIdentity(): boolean;\n revokeSessions(): void;\n validateWrite?(request: Request): void;\n csrfToken?(request: Request): string | undefined;\n /** Optional browser cookie renewal after successful session verification. Must not extend the server-side absolute deadline. */\n sessionCookie?(request: Request): string | undefined;\n}\nexport interface AdmissionTarget {\n /** Host-pinned entry scope for one internal handoff. */\n readonly entryRouteId?: string;\n readonly requestId: string;\n readonly attemptId: string;\n readonly principal: DataPrincipal;\n readonly routeId: string;\n readonly serviceId: string | null;\n readonly upstreamId: string;\n readonly url: string;\n readonly model: string | null;\n readonly now: number;\n}\nexport interface AdmissionDenial {\n readonly error: string;\n readonly status: 401 | 403 | 429 | 503 | 422;\n readonly retryAfter?: number;\n}\nexport interface AdmissionPlan {\n /** A complete JSON state replacement, staged by Host before the common decision. */\n readonly state?: DurableJson;\n /** Immutable policy snapshot retained by the grant for subsequent attempts. */\n readonly snapshot?: DurableJson;\n readonly denial?: AdmissionDenial;\n}\nexport interface IngressPlugin {\n /** Effective policy demand; no policy means no content decoding. */\n bodyRequirements(target: AdmissionTarget, policy: DurableJson): { readonly request: 'none' | 'json-read' };\n /** Optional per-principal state. Policies are frozen; plans receive only this key's clones.\n * Expiry must mean absence is behaviorally equivalent to retaining the state. */\n keyedState?: {\n readonly capacity: number;\n policyForKey(policy: DurableJson, keyId: string): DurableJson;\n expiresAt(state: DurableJson): number;\n reconcile(state: DurableJson, policy: DurableJson, now: number): DurableJson;\n };\n authenticate?(request: Request, policy: DurableJson, now: number): DataPrincipal | null;\n resolveIdentity?(target: AdmissionTarget, policy: DurableJson): DataPrincipal;\n plan(target: AdmissionTarget, policy: DurableJson, state: DurableJson): AdmissionPlan;\n beforeAttempt?(target: AdmissionTarget, snapshot: DurableJson): AdmissionDenial | null;\n}\nexport interface IngressPluginModule { createIngress(): IngressPlugin }\nexport interface PluginStateRpcContext {\n readonly state: PluginDurableState;\n readonly requestId: string;\n readonly attemptId: string;\n readonly principal: DataPrincipal;\n}\nexport interface PluginPolicyPublication {\n readonly version: number;\n readonly value: DurableJson;\n}\n",
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
"/** Public same-process plugin services. Cross-process callers require the host RPC adapter. */\nimport type { PluginServiceDeclarations, PluginServiceProcess } from './plugin-services/contracts';\nimport { assertSupportedServiceDeclarations, isCrossProcessSelfSnapshot } from './plugin-services/contracts';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { HostRpcAdapter, RpcServiceError, type HostRpcAdapterOptions, type HostRpcLifecycleIdentity, type HostRpcOwnerHandle, type HostRpcInvocationContext, type HostRpcLeaseRequest, type HostRpcLeaseGrant, type HostRpcHandlerFrame } from './plugin-services/host-rpc';\nimport type { RpcCallPurpose, RpcMethodDefinition } from './plugin-services/wire-contract';\nimport type { HostChannelOperation, HostChannelOwnerHandle, PluginChannelCapabilities, PluginChannelOwnerInput, PluginEventServices, PluginSnapshotServices, PluginStreamServices } from './plugin-services/channels';\nexport { defineRpcService } from './plugin-services/wire-contract';\nexport { RpcServiceError } from './plugin-services/host-rpc';\nexport { HostSnapshotStore, type HostSnapshotStoreOptions } from './plugin-services/snapshot-store';\nexport type { AsyncRpcClient, HostRpcCommandCapabilities, RpcCallOptions, RpcServiceErrorCode } from './plugin-services/host-rpc';\nexport type { RpcHandlerMap, RpcHandlerContext } from './plugin-services/rpc-runtime';\nexport type { RpcDataSchema, RpcMethodDefinition, InferRpcData } from './plugin-services/wire-contract';\nexport type { PluginServiceDeclarations, PluginServicePublication, PluginServiceConsumption, PluginServiceProcess, PluginServiceKind, PluginServiceScope } from './plugin-services/contracts';\nexport type {\n PluginStreamServices, PluginSnapshotServices, PluginEventServices, PluginStreamContract, PluginSnapshotContract,\n PluginEventContract, PluginChannelPublication, PluginStreamReadInput, PluginStreamWriteInput, PluginStreamDuplexInput,\n PluginSnapshotView, PluginSnapshotStatus, PluginEventPublisher, PluginChannelCapabilities, HostChannelPublicationView,\n PluginSnapshotVersionSource, HostSnapshotStoreOptionsView,\n} from './plugin-services/channels';\nexport type { PluginChannelDuplexSession, PluginChannelDuplexResult } from './plugin-services/peer-channel-hub';\n\nconst CHANNEL_KINDS = new Set(['events', 'snapshot', 'stream']);\n\nexport interface PluginServices {\n /** Explicit owner-bound background invocation; never inherits a stale/request frame. */\n runBackground?<T>(run: () => T): T;\n onDispose(cleanup: () => void): void;\n publish<T extends object>(serviceId: string, contractVersion: number, implementation: T): void;\n consume<T extends object>(provider: string, serviceId: string, contractVersion: number): Readonly<T>;\n /** Typed asynchronous data-only services, when the host communication runtime is configured. */\n readonly rpc?: Pick<HostRpcOwnerHandle, 'publish' | 'consume'>;\n /** Bounded, cancelable chunked byte channels over the authenticated peer link. */\n readonly stream?: PluginStreamServices;\n /** Transient notifications and durable at-least-once topics. */\n readonly events?: PluginEventServices;\n /** Versioned immutable snapshots with digest verification. */\n readonly snapshot?: PluginSnapshotServices;\n /** Explicit deployment capabilities for the channel lanes (checked before declaring work). */\n readonly channelCapabilities?: PluginChannelCapabilities;\n}\n\nexport interface PluginServiceCommunications extends Omit<HostRpcAdapterOptions, 'process' | 'enterHostHandlerFrame'> {\n /** Real process/owner identity supplied by the runtime, never invented by the plugin. */\n readonly identity: (plugin: string, scope: string) => HostRpcLifecycleIdentity;\n /**\n * Trusted host hook, called for one declared RPC consumption before the\n * adapter resolves its route. It lets the host register the native remote\n * proxy for the consumer's own contract so `resolvePlacement` can select it.\n * A host that does not implement remote routing simply omits it.\n */\n readonly ensureRemoteRoute?: (input: {\n readonly plugin: string;\n readonly scope: string;\n readonly provider: string;\n readonly contract: { readonly id: string; readonly version: number; readonly methods: Record<string, RpcMethodDefinition> };\n }) => void;\n /**\n * Host-owned event/snapshot/stream adapter. It is created by the same process\n * composition that owns the peer link, so channel work rides the one\n * authenticated transport and the canonical owner lifecycle.\n */\n readonly channels?: (input: PluginChannelOwnerInput) => HostChannelOwnerHandle;\n}\nexport interface PluginServiceInvocation {\n readonly purpose: RpcCallPurpose;\n /** Exact pre-admission lease returned by this host; request/attempt require it. */\n readonly lease?: () => void;\n readonly callee?: unknown;\n readonly signal?: AbortSignal;\n readonly deadlineAt?: number;\n}\ninterface LeaseProof { readonly retained: ReadonlySet<Owner>; released: boolean }\ninterface InvocationFrame extends HostRpcInvocationContext { readonly proof?: LeaseProof; readonly callee?: unknown; readonly ownerAuthority?: Owner; readonly peerAuthenticated?: boolean }\ninterface RpcReference { readonly owner: Owner }\n\ntype Owner = {\n plugin: string; scope: string; dependencies: Readonly<Record<string, string>>;\n ready: boolean; retiring: boolean; revoked: boolean; cleaning: boolean; leases: number;\n pending: Set<Promise<unknown>>; waiters: Array<() => void>; cleanups: Set<() => void>;\n consumed: Set<Owner>;\n rpcConsumed: Map<string, RpcReference>;\n rpc?: HostRpcOwnerHandle;\n channels?: HostChannelOwnerHandle;\n};\ntype Publication = { owner: Owner; id: string; version: number; kind: 'local' | 'rpc'; implementation?: object };\n\n/** Cleanup failed after the context was fully revoked; runtime teardown must still run. */\nexport class PluginServiceCleanupError extends AggregateError {\n constructor(failures: readonly unknown[]) { super(failures, 'Plugin service cleanup failed'); }\n}\n\nexport class PluginServiceHost {\n readonly rpc?: HostRpcAdapter;\n private readonly frames = new AsyncLocalStorage<InvocationFrame>();\n private readonly leaseProofs = new WeakMap<() => void, LeaseProof>();\n private readonly liveInvocations = new WeakSet<object>();\n private readonly ownerTokens = new WeakSet<object>();\n private readonly disposals = new WeakMap<Owner, Promise<void>>();\n private readonly communications?: PluginServiceCommunications;\n constructor(readonly process: PluginServiceProcess = 'worker', communications?: PluginServiceCommunications) {\n this.communications = communications;\n if (communications) this.rpc = new HostRpcAdapter({\n ...communications, process,\n enterHostHandlerFrame: (hostFrame, run) => this.runHostHandlerFrame(hostFrame, run),\n });\n }\n private contracts?: ReadonlyMap<string, PluginServiceDeclarations>;\n setDeclarations(contracts: ReadonlyMap<string, PluginServiceDeclarations>): void {\n for (const declarations of contracts.values()) assertSupportedServiceDeclarations(declarations);\n this.contracts = new Map(contracts);\n }\n /** Trusted host view of the declared service graph; never exposed to plugins. */\n serviceDeclarations(): ReadonlyMap<string, PluginServiceDeclarations> { return this.contracts ?? new Map(); }\n private owners = new Map<string, Owner>();\n private contexts = new WeakMap<PluginServices, Owner>();\n private publications = new Map<string, Publication>();\n private key(plugin: string, scope: string): string { return `${plugin}\\0${scope}`; }\n private publicationKey(plugin: string, scope: string, id: string, version: number): string {\n return `${plugin}\\0${scope}\\0${id}\\0${version}`;\n }\n isReady(plugin: string, scope = 'global'): boolean {\n const owner = this.owners.get(this.key(plugin, scope));\n return !!owner?.ready && !owner.retiring && !owner.revoked;\n }\n /** Trusted runtime entry; not exposed through PluginServices. */\n runInInvocation<T>(context: PluginServices, invocation: PluginServiceInvocation, run: () => T): T {\n const owner = this.contexts.get(context);\n if (!owner || owner.revoked || this.owners.get(this.key(owner.plugin, owner.scope)) !== owner) throw new RpcServiceError('unauthorized');\n const proof = invocation.lease === undefined ? undefined : this.leaseProofs.get(invocation.lease);\n if (invocation.purpose === 'request' || invocation.purpose === 'attempt') {\n if (!proof || proof.released || !proof.retained.has(owner)) throw new RpcServiceError('unauthorized');\n } else if (owner.retiring) throw new RpcServiceError('retired');\n const frame: InvocationFrame = Object.freeze({ ...invocation, proof, token: Object.freeze({}) });\n this.liveInvocations.add(frame.token);\n return this.frames.run(frame, () => {\n try {\n const result = run();\n if (result && (typeof result === 'object' || typeof result === 'function') && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).finally(() => this.liveInvocations.delete(frame.token)) as T;\n }\n this.liveInvocations.delete(frame.token);\n return result;\n } catch (error) { this.liveInvocations.delete(frame.token); throw error; }\n });\n }\n /** Broker-only entry after physical-peer and per-call identity projection. */\n runPeerInvocation<T>(purpose: 'request' | 'attempt', callee: unknown, run: () => T): T {\n const frame: InvocationFrame = Object.freeze({purpose, callee, peerAuthenticated: true, token: Object.freeze({})});\n this.liveInvocations.add(frame.token);\n return this.frames.run(frame, () => {\n try {\n const result = run();\n if (result && typeof (result as any).then === 'function') return Promise.resolve(result).finally(() => this.liveInvocations.delete(frame.token)) as T;\n this.liveInvocations.delete(frame.token); return result;\n } catch (error) { this.liveInvocations.delete(frame.token); throw error; }\n });\n }\n /** Read by the trusted callee resolver to carry management/request authority. */\n currentInvocation(): Readonly<HostRpcInvocationContext & { readonly callee?: unknown }> | null {\n const frame = this.frames.getStore();\n return frame === undefined || !this.liveInvocations.has(frame.token) ? null : Object.freeze({ purpose: frame.purpose, token: frame.token, signal: frame.signal, deadlineAt: frame.deadlineAt, callee: frame.callee });\n }\n /**\n * Enters one live host-handler frame bound to the exact published owner, so a\n * native RPC handler shares the SAME trusted invocation store as local\n * dispatch. The frame is live only for the handler's real duration; a stale\n * (settled) frame is therefore never observable.\n */\n private runHostHandlerFrame(host: HostRpcHandlerFrame, run: () => unknown): unknown {\n const owner = host.ownerToken !== null && this.ownerTokens.has(host.ownerToken) ? host.ownerToken as Owner : undefined;\n const frame: InvocationFrame = Object.freeze({\n purpose: host.purpose,\n token: Object.freeze({}),\n ...(host.signal === undefined ? {} : { signal: host.signal }),\n ...(host.deadlineAt === undefined ? {} : { deadlineAt: host.deadlineAt }),\n ...(owner === undefined ? {} : { ownerAuthority: owner }),\n });\n this.liveInvocations.add(frame.token);\n const settle = (): void => { this.liveInvocations.delete(frame.token); };\n return this.frames.run(frame, () => {\n try {\n const result = run();\n if (result !== null && (typeof result === 'object' || typeof result === 'function') && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).finally(settle);\n }\n settle();\n return result;\n } catch (error) { settle(); throw error; }\n });\n }\n createContext(plugin: string, scope = 'global', dependencies: Readonly<Record<string, string>> = {}): PluginServices {\n const key = this.key(plugin, scope);\n if (this.owners.has(key)) throw new Error(`Service context already exists: ${plugin}/${scope}`);\n const declarations = this.contracts?.get(plugin);\n if (!this.rpc && (declarations?.provides?.some(service => service.process === this.process && service.kind === 'rpc')\n || declarations?.consumes?.some(service => service.process === this.process && service.kind === 'rpc'))) {\n throw new RpcServiceError('capability_unavailable');\n }\n const channelProvider = declarations?.provides?.some(service => service.process === this.process && CHANNEL_KINDS.has(service.kind ?? 'local')) === true;\n const channelConsumer = declarations?.consumes?.some(service => service.process === this.process && CHANNEL_KINDS.has(service.kind ?? 'local')) === true;\n // A declared channel provider or required consumer without the host channel\n // adapter is refused here (capability_unavailable), never silently degraded.\n if ((channelProvider || channelConsumer) && this.communications?.channels === undefined) {\n throw new RpcServiceError('capability_unavailable');\n }\n const owner: Owner = { plugin, scope, dependencies: Object.freeze({ ...dependencies }), consumed: new Set(), rpcConsumed: new Map(), ready: false, retiring: false, revoked: false, cleaning: false, leases: 0, pending: new Set(), waiters: [], cleanups: new Set() };\n this.owners.set(key, owner);\n this.ownerTokens.add(owner);\n try {\n if (this.rpc) {\n owner.rpc = this.rpc.createOwner({\n token: owner, plugin, scope, dependencies: owner.dependencies,\n declarations: this.contracts?.get(plugin) ?? {}, lifecycle: this.communications!.identity(plugin, scope),\n getLifecycleState: () => ({ ready: owner.ready, retiring: owner.retiring, revoked: owner.revoked }),\n acquireLease: request => this.acquireRpcLease(owner, request),\n resolveInvocationContext: () => this.currentInvocation(),\n registerPublication: publication => {\n const publicationKey = this.publicationKey(plugin, scope, publication.id, publication.version);\n if (this.publications.has(publicationKey)) throw new RpcServiceError('invalid_registration');\n this.publications.set(publicationKey, { owner, id: publication.id, version: publication.version, kind: 'rpc' });\n },\n registerConsumption: (declaration, providerToken) => {\n const referenceKey = this.publicationKey(declaration.plugin, 'global', declaration.id, declaration.version);\n if (providerToken) {\n const provider = [...this.owners.values()].find(candidate => candidate === providerToken);\n if (!provider || provider.revoked) throw new RpcServiceError('unavailable');\n owner.rpcConsumed.set(referenceKey, { owner: provider });\n } else owner.rpcConsumed.delete(referenceKey);\n },\n });\n }\n if (this.communications?.channels !== undefined && (channelProvider || channelConsumer)) {\n owner.channels = this.communications.channels({\n plugin, scope, declarations: this.contracts?.get(plugin) ?? {},\n dependencies: owner.dependencies,\n lifecycle: this.communications.identity(plugin, scope),\n getLifecycleState: () => ({ ready: owner.ready, retiring: owner.retiring, revoked: owner.revoked }),\n trackPending: (pending: Promise<unknown>) => {\n owner.pending.add(pending);\n void pending.finally(() => { owner.pending.delete(pending); this.notify(owner); }).catch(() => {});\n },\n beginOperation: (options) => this.beginChannelOperation(plugin, scope, options),\n });\n }\n } catch (error) { this.owners.delete(key); throw error; }\n const assertActive = (target = owner) => {\n if (target.revoked || (target.retiring && !target.cleaning && !owner.cleaning && target.leases === 0 && target.pending.size === 0)) throw new Error(`Plugin service handle revoked: ${target.plugin}`);\n };\n const wrap = (value: unknown, provider: Owner, receiver?: object): any => {\n if (typeof value === 'function') return (...args: unknown[]) => {\n assertActive(); assertActive(provider);\n const guardArgument = (arg: unknown): unknown => {\n if (typeof arg === 'function') return (...callbackArgs: unknown[]) => {\n assertActive(); assertActive(provider);\n const result = Reflect.apply(arg, undefined, callbackArgs);\n if (result && typeof result.then === 'function') {\n const pending = Promise.resolve(result);\n owner.pending.add(pending); provider.pending.add(pending);\n void pending.finally(() => { owner.pending.delete(pending); provider.pending.delete(pending); this.notify(owner); this.notify(provider); }).catch(() => {});\n return pending;\n }\n return result;\n };\n if (Array.isArray(arg)) return Object.freeze(arg.map(guardArgument));\n if (arg && typeof arg === 'object') return Object.freeze(Object.fromEntries(Object.entries(arg).map(([key, value]) => [key, guardArgument(value)])));\n return arg;\n };\n const guarded = args.map(guardArgument);\n const result = Reflect.apply(value, receiver, guarded);\n if (result && typeof result.then === 'function') {\n const pending = Promise.resolve(result).then(output => { assertActive(); assertActive(provider); return wrap(output, provider); });\n owner.pending.add(pending); provider.pending.add(pending);\n void pending.finally(() => { owner.pending.delete(pending); provider.pending.delete(pending); this.notify(owner); this.notify(provider); }).catch(() => {});\n return pending;\n }\n return wrap(result, provider);\n };\n if (Array.isArray(value)) return Object.freeze(value.map(item => wrap(item, provider)));\n if (value && typeof value === 'object') {\n // A fresh facade prevents access to implementation identity or mutable provider fields.\n const facade: Record<string, unknown> = {};\n for (const key of Object.keys(value)) Object.defineProperty(facade, key, {\n enumerable: true, get: () => { assertActive(); assertActive(provider); return wrap((value as any)[key], provider, value as object); },\n });\n return Object.freeze(facade);\n }\n return value;\n };\n const consume = <T extends object>(provider: string, id: string, version: number): Readonly<T> => {\n assertActive();\n const declaration = this.contracts?.get(plugin)?.consumes?.find(value => value.plugin === provider && value.id === id && value.version === version && value.process === this.process);\n if (this.contracts && !declaration) throw new Error(`Undeclared plugin service consumption: ${plugin} -> ${provider}/${id}`);\n if (declaration?.kind && declaration.kind !== 'local') throw new Error('Non-local services require their asynchronous host adapter');\n if (provider === plugin || !Object.hasOwn(owner.dependencies, provider)) throw new Error(`Undeclared plugin service dependency: ${plugin} -> ${provider}`);\n const targetScope = 'global';\n const publication = this.publications.get(this.publicationKey(provider, targetScope, id, version));\n if (!publication || !publication.owner.ready || publication.owner.retiring || publication.owner.revoked) {\n if ([...this.publications.values()].some(value => value.owner.plugin === provider && value.owner.scope === targetScope && value.id === id && value.version !== version)) throw new Error(`Plugin service contract mismatch: ${provider}/${id}`);\n throw new Error(`Plugin service not ready: ${provider}/${id}`);\n }\n owner.consumed.add(publication.owner);\n return wrap(publication.implementation, publication.owner);\n };\n const context: PluginServices = Object.freeze({\n runBackground: <T>(run: () => T): T => {\n if (this.contexts.get(context) !== owner || this.owners.get(key) !== owner\n || !owner.ready || owner.retiring || owner.revoked) throw new RpcServiceError('retired');\n const release = this.acquireLease(plugin, scope);\n try {\n const result = this.runInInvocation(context, { purpose: 'background' }, run);\n if (result && (typeof result === 'object' || typeof result === 'function') && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).finally(release) as T;\n }\n release();\n return result;\n } catch (error) { release(); throw error; }\n },\n onDispose: (cleanup: () => void) => { assertActive(); owner.cleanups.add(cleanup); },\n publish: <T extends object>(id: string, version: number, implementation: T) => {\n assertActive();\n const candidates = this.contracts?.get(plugin)?.provides?.filter(value => value.id === id && value.version === version && value.process === this.process);\n const declaration = candidates?.[0];\n if (this.contracts && !declaration) throw new Error(`Undeclared plugin service publication: ${plugin}/${id}`);\n if (declaration?.kind && declaration.kind !== 'local') throw new Error('Non-local services require their asynchronous host adapter');\n if (owner.scope !== 'global') throw new Error('Only global providers may publish global services');\n if (!Number.isSafeInteger(version) || version < 1) throw new Error('Invalid service contract version');\n const publicationKey = this.publicationKey(plugin, owner.scope, id, version);\n if (this.publications.has(publicationKey)) throw new Error(`Service already published: ${plugin}/${id}`);\n this.publications.set(publicationKey, { owner, id, version, implementation, kind: 'local' });\n },\n consume: <T extends object>(provider: string, id: string, version: number): Readonly<T> => consume<T>(provider, id, version),\n rpc: owner.rpc === undefined ? undefined : (() => {\n const ownerHandle = owner.rpc!;\n const prepare = (provider: string, contract: { readonly id: string; readonly version: number; readonly methods: Record<string, RpcMethodDefinition> }): void => {\n try { this.communications?.ensureRemoteRoute?.({ plugin, scope: owner.scope, provider, contract }); }\n catch { /* an unroutable remote declaration stays unavailable, never guessed */ }\n };\n return Object.freeze({\n publish: ownerHandle.publish,\n consume: <const M extends Record<string, RpcMethodDefinition>>(provider: string, contract: { readonly id: string; readonly version: number; readonly methods: M }) => {\n prepare(provider, contract);\n return ownerHandle.consume(provider, contract);\n },\n });\n })(),\n stream: owner.channels?.stream,\n events: owner.channels?.events,\n snapshot: owner.channels?.snapshot,\n channelCapabilities: owner.channels?.capabilities,\n });\n this.contexts.set(context, owner);\n return context;\n }\n markReady(plugin: string, scope = 'global', expectedContext?: PluginServices): void {\n const owner = this.requireOwner(plugin, scope, expectedContext);\n if (owner.retiring || owner.revoked) throw new Error(`Plugin service disposed: ${plugin}`);\n for (const publication of this.contracts?.get(plugin)?.provides ?? []) {\n if (publication.kind === 'rpc' && publication.process === this.process && (publication.scope ?? 'global') === (scope === 'global' ? 'global' : 'binding')\n && this.publications.get(this.publicationKey(plugin, scope, publication.id, publication.version))?.kind !== 'rpc') throw new RpcServiceError('not_ready');\n }\n owner.rpc?.markReady();\n owner.channels?.markReady();\n owner.ready = true;\n }\n retire(plugin: string, scope = 'global', expectedContext?: PluginServices): void {\n const owner = this.requireOwner(plugin, scope, expectedContext);\n owner.retiring = true;\n owner.rpc?.retire();\n try { owner.channels?.retire(); } catch { /* host-owned */ }\n }\n /**\n * Host-only: retires admission for EVERY live owner at once. It is wired to\n * the real drain admission point, so after it no new bootstrap/background work\n * is admitted while every already-accepted lease, result and terminal keeps\n * draining normally (nothing is revoked here).\n */\n retireAll(): void {\n for (const owner of this.owners.values()) {\n if (owner.revoked) continue;\n owner.retiring = true;\n try { owner.rpc?.retire(); } catch { /* host-owned */ }\n try { owner.channels?.retire(); } catch { /* host-owned */ }\n }\n }\n /**\n * Host-only: begins ONE channel operation for an owner. It applies the exact\n * same invocation-frame rules as an RPC call (management only from a\n * management frame, request/attempt only with a live retained lease proof, no\n * new work while retiring, bootstrap-only before ready) and holds a real\n * owner lease for the operation's whole lifetime, so owner disposal can never\n * race a live lane task. `null` refuses the operation.\n */\n beginChannelOperation(\n plugin: string,\n scope = 'global',\n incoming?: {\n readonly purpose?: RpcCallPurpose;\n readonly deadlineAt?: number;\n readonly signal?: AbortSignal;\n readonly authenticated?: boolean;\n /**\n * Host-managed background work: the operation runs in an EXPLICIT\n * independent background context and deliberately ignores any frame the\n * caller happens to be inside (typically a closed bootstrap/init closure).\n */\n readonly background?: boolean;\n },\n ): HostChannelOperation | null {\n const owner = this.owners.get(this.key(plugin, scope));\n if (!owner || owner.revoked) return null;\n if (this.owners.get(this.key(plugin, scope)) !== owner) return null;\n const stored = this.frames.getStore();\n let frame: InvocationFrame | undefined;\n if (incoming?.background === true) {\n // Explicit Host background context: no inherited purpose/deadline/signal.\n frame = undefined;\n } else {\n // A stale (already settled) frame is REFUSED: a finished invocation must\n // never be reused as fresh authority nor laundered into another purpose.\n // Legitimate background work either runs outside a frame or asks for the\n // explicit Host background context above.\n if (stored !== undefined && !this.liveInvocations.has(stored.token)) return null;\n frame = stored;\n }\n const leaseBound = frame !== undefined\n && (frame.purpose === 'request' || frame.purpose === 'attempt')\n && ((frame.proof !== undefined && !frame.proof.released && frame.proof.retained.has(owner))\n || frame.ownerAuthority === owner);\n if (frame !== undefined && (frame.purpose === 'request' || frame.purpose === 'attempt') && !leaseBound) return null;\n // A peer-authenticated inbound channel request carries the caller host's real\n // purpose, but only request/attempt/background may cross that boundary: a peer\n // may never claim management or bootstrap authority for a provider lease.\n const peerPurpose = frame === undefined && incoming?.authenticated === true\n && (incoming.purpose === 'request' || incoming.purpose === 'attempt' || incoming.purpose === 'background')\n ? incoming.purpose\n : undefined;\n const purpose = frame?.purpose ?? peerPurpose ?? 'background';\n const requestBound = leaseBound || peerPurpose === 'request' || peerPurpose === 'attempt';\n // Retirement refuses NEW work; already-accepted request/attempt work finishes.\n if (owner.retiring && !requestBound) return null;\n if (!owner.ready && !requestBound && purpose !== 'bootstrap') return null;\n const deadlineAt = minDefined(frame?.deadlineAt, incoming?.deadlineAt);\n const signal = combineAbortSignals(frame?.signal, incoming?.signal);\n owner.leases += 1;\n let released = false;\n const release = () => { if (released) return; released = true; owner.leases -= 1; this.notify(owner); };\n return Object.freeze({\n purpose,\n ...(signal === undefined ? {} : { signal }),\n ...(deadlineAt === undefined ? {} : { deadlineAt }),\n release,\n });\n }\n\n /** Capture before admission; release only after all consumers finish old-request processing. */\n acquireLease(plugin: string, scope = 'global'): () => void {\n const owner = this.requireOwner(plugin, scope);\n if (!owner.ready || owner.retiring || owner.revoked) throw new Error(`Plugin service not ready: ${plugin}`);\n const retained = new Set<Owner>();\n const retain = (target: Owner): void => {\n if (retained.has(target)) return;\n if (!target.ready || target.retiring || target.revoked) throw new Error(`Plugin service not ready: ${target.plugin}`);\n retained.add(target);\n for (const provider of this.dependencyOwners(target)) retain(provider);\n for (const provider of target.consumed) if (provider.ready && !provider.retiring && !provider.revoked) retain(provider);\n // A declared in-process channel provider is an exact required\n // reference too, and its ready provider owner enters the lease proof so a\n // request/attempt frame can authorize real channel work on it.\n for (const provider of this.channelDependencyOwners(target)) {\n if (provider.ready && !provider.retiring && !provider.revoked) retain(provider);\n }\n for (const reference of target.rpcConsumed.values()) retain(reference.owner);\n };\n retain(owner);\n for (const target of retained) target.leases++;\n let released = false;\n const proof: LeaseProof = { retained, released: false };\n const release = () => { if (released) return; released = true; proof.released = true; for (const target of retained) { target.leases--; this.notify(target); } };\n this.leaseProofs.set(release, proof);\n return release;\n }\n\n references(plugin: string): ReadonlyArray<{ plugin: string; scope: string; leases: number }> {\n return [...this.owners.values()].filter(o => !o.revoked && (o.plugin === plugin || [...this.dependencyOwners(o), ...this.consumedOwners(o)].some(provider => provider.plugin === plugin)))\n .map(o => Object.freeze({ plugin: o.plugin, scope: o.scope, leases: o.leases }));\n }\n /** Stop admission immediately, preserve acquired handles until leases and calls drain. */\n dispose(plugin: string, scope = 'global', expectedContext?: PluginServices): Promise<void> {\n let owner: Owner;\n try { owner = this.requireOwner(plugin, scope, expectedContext); } catch (error) { return Promise.reject(error); }\n const existing = this.disposals.get(owner);\n if (existing) return existing;\n let resolve!: () => void;\n let reject!: (error: unknown) => void;\n const task = new Promise<void>((accept, fail) => { resolve = accept; reject = fail; });\n // Install before cleanup can synchronously re-enter disposal.\n this.disposals.set(owner, task);\n void this.disposeOwner(owner).then(() => {\n this.disposals.delete(owner); resolve();\n }, error => { this.disposals.delete(owner); reject(error); });\n return task;\n }\n private async disposeOwner(owner: Owner): Promise<void> {\n const { plugin, scope } = owner;\n const hasPublications = [...this.publications.values()].some(publication => publication.owner === owner);\n if (hasPublications) {\n const dependents = [...this.owners.values()].filter(candidate => candidate !== owner && !candidate.revoked && (this.dependencyOwners(candidate).includes(owner) || this.consumedOwners(candidate).includes(owner)));\n if (dependents.length) throw new Error(`Plugin service provider is referenced: ${plugin} <- ${dependents.map(candidate => `${candidate.plugin}/${candidate.scope}`).join(', ')}`);\n }\n owner.retiring = true;\n owner.rpc?.retire();\n try { owner.channels?.retire(); } catch { /* host-owned */ }\n if (owner.leases || owner.pending.size) await new Promise<void>(resolve => owner.waiters.push(resolve));\n if (owner.channels) {\n try { await owner.channels.dispose(); } catch { /* provider release is best-effort here */ }\n }\n if (owner.rpc) {\n const result = await owner.rpc.dispose();\n if (!result.drained) throw new RpcServiceError('timeout');\n }\n // Cleanup may invoke its cached unsubscribe handle after drain, before final revocation.\n owner.cleaning = true;\n const failures: unknown[] = [];\n try {\n for (const cleanup of owner.cleanups) { try { cleanup(); } catch (error) { failures.push(error); } }\n } finally {\n owner.cleanups.clear(); owner.consumed.clear(); owner.rpcConsumed.clear(); owner.cleaning = false;\n owner.revoked = true; owner.ready = false;\n for (const [key, publication] of this.publications) if (publication.owner === owner) this.publications.delete(key);\n if (this.owners.get(this.key(plugin, scope)) === owner) this.owners.delete(this.key(plugin, scope));\n }\n if (failures.length) throw new PluginServiceCleanupError(failures);\n }\n /** Actual local provider owners, not activation edges to another process/binding. */\n private dependencyOwners(owner: Owner): Owner[] {\n const result = new Set<Owner>();\n for (const dependency of Object.keys(owner.dependencies)) {\n const declarations = this.contracts?.get(owner.plugin)?.consumes?.filter(service => service.plugin === dependency && service.process === this.process);\n if (declarations?.length) {\n for (const service of declarations) {\n // RPC providers are retained through `rpcConsumed`/`acquireRpcLease`,\n // never here. A local channel provider (events/snapshot/stream) IS a\n // real provider owner, so a request/attempt lease must retain it too,\n // or `beginChannelOperation` would refuse exact in-process channel work.\n if ((service.kind ?? 'local') === 'rpc') continue;\n const provider = this.owners.get(this.key(dependency, 'global'));\n if (provider) result.add(provider);\n }\n } else {\n const provider = this.owners.get(this.key(dependency, 'global'));\n if (provider) result.add(provider);\n }\n }\n return [...result];\n }\n /** Local providers of this owner's declared channel consumptions. */\n private channelDependencyOwners(owner: Owner): Owner[] {\n const result = new Set<Owner>();\n for (const service of this.contracts?.get(owner.plugin)?.consumes ?? []) {\n if (service.process !== this.process) continue;\n if (!CHANNEL_KINDS.has(service.kind ?? 'local')) continue;\n if (typeof service.plugin !== 'string' || !service.plugin) continue;\n if (isCrossProcessSelfSnapshot(owner.plugin, service, this.contracts?.get(owner.plugin) ?? {})) continue;\n if (!Object.hasOwn(owner.dependencies, service.plugin)) continue;\n const provider = this.owners.get(this.key(service.plugin, 'global'));\n if (provider) result.add(provider);\n }\n return [...result];\n }\n /** Consumers release all actual references before providers. */\n disposalOrder(): ReadonlyArray<{ plugin: string; scope: string }> {\n const visited = new Set<Owner>(), visiting = new Set<Owner>(), ordered: Owner[] = [];\n const visit = (owner: Owner): void => {\n if (visited.has(owner)) return;\n if (visiting.has(owner)) throw new Error('Plugin service reference cycle during disposal');\n visiting.add(owner);\n for (const provider of [...this.dependencyOwners(owner), ...this.consumedOwners(owner)]) if (!provider.revoked) visit(provider);\n visiting.delete(owner); visited.add(owner); ordered.push(owner);\n };\n for (const owner of this.owners.values()) visit(owner);\n return ordered.reverse().map(owner => Object.freeze({ plugin: owner.plugin, scope: owner.scope }));\n }\n private requireOwner(plugin: string, scope: string, expectedContext?: PluginServices): Owner {\n const owner = this.owners.get(this.key(plugin, scope));\n if (!owner) throw new Error(`Missing plugin service context: ${plugin}/${scope}`);\n if (expectedContext && this.contexts.get(expectedContext) !== owner) throw new Error(`Stale plugin service context: ${plugin}/${scope}`);\n return owner;\n }\n private notify(owner: Owner): void {\n if (!owner.leases && !owner.pending.size) for (const resolve of owner.waiters.splice(0)) resolve();\n }\n private consumedOwners(owner: Owner): Owner[] {\n return [...new Set([...owner.consumed, ...[...owner.rpcConsumed.values()].map(reference => reference.owner)])];\n }\n /** Each real RPC task borrows the canonical owner until actual business work settles. */\n private acquireRpcLease(owner: Owner, request: HostRpcLeaseRequest): HostRpcLeaseGrant {\n if (owner.revoked || this.owners.get(this.key(owner.plugin, owner.scope)) !== owner) throw new RpcServiceError('revoked');\n const frame = this.frames.getStore();\n if (frame && !this.liveInvocations.has(frame.token)) throw new RpcServiceError('unauthorized');\n if (request.purpose === 'management' && frame?.purpose !== 'management') throw new RpcServiceError('unauthorized');\n const existing = (request.purpose === 'request' || request.purpose === 'attempt')\n && frame?.purpose === request.purpose && ((frame.proof !== undefined && !frame.proof.released && frame.proof.retained.has(owner)) || (request.role === 'callee' && frame.peerAuthenticated === true));\n if ((request.purpose === 'request' || request.purpose === 'attempt') && !existing) throw new RpcServiceError('unauthorized');\n if (owner.retiring && !existing) throw new RpcServiceError('retired');\n if (!owner.ready && request.purpose !== 'bootstrap') throw new RpcServiceError('not_ready');\n owner.leases++;\n let released = false;\n return { allowRetired: existing, release: () => { if (released) return; released = true; owner.leases--; this.notify(owner); } };\n }\n}\n\n/** Smallest defined deadline, or undefined when neither side has one. */\nfunction minDefined(left: number | undefined, right: number | undefined): number | undefined {\n if (left === undefined) return right;\n if (right === undefined) return left;\n return Math.min(left, right);\n}\n\n/** Combines local and peer-provided abort signals without dropping either. */\nfunction combineAbortSignals(...signals: ReadonlyArray<AbortSignal | undefined>): AbortSignal | undefined {\n const present = signals.filter((signal): signal is AbortSignal => signal !== undefined);\n if (present.length === 0) return undefined;\n if (present.length === 1) return present[0];\n const any = (AbortSignal as unknown as { any?: (list: readonly AbortSignal[]) => AbortSignal }).any;\n if (typeof any === 'function') return any.call(AbortSignal, present);\n const controller = new AbortController();\n const abort = (signal: AbortSignal) => { if (!controller.signal.aborted) controller.abort(signal.reason); };\n for (const signal of present) {\n if (signal.aborted) { abort(signal); break; }\n signal.addEventListener('abort', () => abort(signal), { once: true });\n }\n return controller.signal;\n}\n\nexport const TOKEN_METERING_SERVICE_ID = 'token-metering.v1';\nexport const TOKEN_METERING_CONTRACT_VERSION = 1;\nexport type TokenMeteringSource = 'official' | 'estimated' | 'partial' | 'none';\nexport type TokenMeteringAuthority = 'official' | 'local' | 'heuristic' | 'partial' | 'none';\nexport interface TokenMeteringResult {\n readonly requestId: string; readonly attemptId: string; readonly routeId: string; readonly upstreamId: string;\n readonly keyId?: string | null;\n readonly provider: string; readonly model?: string; readonly pricingProvider?: string;\n readonly inputTokens?: number; readonly outputTokens?: number; readonly cacheReadTokens?: number; readonly cacheWriteTokens?: number;\n readonly inputSource: TokenMeteringSource; readonly outputSource: TokenMeteringSource;\n readonly inputAuthority: TokenMeteringAuthority; readonly outputAuthority: TokenMeteringAuthority;\n readonly complete: boolean; readonly observationIncomplete: boolean;\n readonly outcome: 'completed' | 'failed' | 'aborted'; readonly finishedAtMs: number; readonly settlementVersion: number;\n}\nexport interface TokenMeteringSubscription {\n /** Omit for degradable all-request reporting; required consumers bind their admitted request. */\n readonly requestId?: string;\n readonly required?: boolean;\n readonly onResult: (result: TokenMeteringResult) => void | Promise<void>;\n readonly onFailure?: (error: unknown, result: TokenMeteringResult) => void | Promise<void>;\n}\nexport interface TokenMeteringService {\n /** Final completion boundary: await this request's required settlement/failure callbacks before releasing its host lease. */\n drainRequest(requestId: string): Promise<void>;\n subscribe(subscription: TokenMeteringSubscription): () => void;\n prepareAttempt(input: Readonly<{ requestId: string; attemptId: string; routeId: string; upstreamId: string; url: string; body: unknown }>): Readonly<{ supported: boolean; provider?: string; model?: string; pricingProvider?: string }>;\n /** Consumer calls before request admission to pin demand; framework init also captures report subscriptions. */\n prepareRequest(requestId: string): boolean;\n}\n\nexport const TOKEN_PRICING_SERVICE_ID = 'token-stats.pricing.v1';\nexport const TOKEN_PRICING_CONTRACT_VERSION = 1;\n/** Costs are quantized to safe integer nanoUSD (1 USD = 1e9 nanoUSD); unknown remains null. */\nexport interface TokenPricingService {\n canPrice(input: Readonly<{ model?: string; pricingProvider?: string }>): Promise<boolean>;\n price(result: TokenMeteringResult): Promise<Readonly<{ costUsd: number | null; costNanoUsd: number | null }>>;\n}\n",
|
|
17
17
|
"/** Declarative repair request; the host owns the next upstream attempt. */\nconst retryActionBrand=Symbol.for('@jeffusion/bungee/request-retry-action');\nexport class RequestRetryAction extends Error {\n readonly body:unknown;\n constructor(body: unknown, readonly reason: string) {\n super('gateway request repair retry');\n this.name = 'RequestRetryAction';\n Object.defineProperty(this,retryActionBrand,{value:true});\n Object.defineProperty(this,'body',{value:body,enumerable:false});\n }\n /** Plugins and host may bundle the SDK independently in the same process. */\n static [Symbol.hasInstance](value:unknown):boolean {\n return value instanceof Error && (value as unknown as Record<symbol,unknown>)[retryActionBrand]===true;\n }\n}\n",
|
|
18
18
|
"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",
|
|
19
|
-
"import {defineRpcService} from '@jeffusion/bungee-core/plugin';\nconst key={type:'string',minLength:1,maxLength:512} as const;\n/** Each canonical RPC frame is <=64 KiB; long histories use bounded ordered chunks. */\nexport const historyRpc=defineRpcService({id:'codex-router.history.v1',version:1,methods:{\n get:{kind:'query',input:{type:'object',properties:{scope:key,id:key,index:{type:'number',integer:true,minimum:0,maximum:1023}}},output:{type:'json',maxBytes:65536},purposes:['background','request','attempt']},\n put:{kind:'command',input:{type:'object',properties:{scope:key,id:key,index:{type:'number',integer:true,minimum:0,maximum:1023},total:{type:'number',integer:true,minimum:1,maximum:1024},data:{type:'string',maxLength:8192}}},output:{type:'null'},purposes:['background','request','attempt'],command:{deduplication:'none',resultRetentionMs:1,quotaBytes:1024,maxResultBytes:1024}},\n}});\nexport interface HistoryClient {\n get(input:{scope:string;id:string},options?:{signal?:AbortSignal}):Promise<any>;\n put(input:{scope:string;id:string;value:any},options:{signal?:AbortSignal;operationId:string}):Promise<unknown>;\n}\nexport function historyClient(rpc:any):HistoryClient {\n return {\n async get({scope,id},options){let text='';for(let index=0;index<1024;index++){\n options?.signal?.throwIfAborted();const part=await rpc.get({scope,id,index},options);if(part===null)return null;\n text+=part.data;if(Buffer.byteLength(text)>8*1024*1024)throw new Error('codex_router_history_limit');\n if(part.done)return JSON.parse(text);\n }throw new Error('codex_router_history_limit');},\n async put({scope,id,value},options){const text=
|
|
19
|
+
"import {serializeHistory} from './history';\nimport {defineRpcService} from '@jeffusion/bungee-core/plugin';\nconst key={type:'string',minLength:1,maxLength:512} as const;\n/** Each canonical RPC frame is <=64 KiB; long histories use bounded ordered chunks. */\nexport const historyRpc=defineRpcService({id:'codex-router.history.v1',version:1,methods:{\n get:{kind:'query',input:{type:'object',properties:{scope:key,id:key,index:{type:'number',integer:true,minimum:0,maximum:1023}}},output:{type:'json',maxBytes:65536},purposes:['background','request','attempt']},\n put:{kind:'command',input:{type:'object',properties:{scope:key,id:key,index:{type:'number',integer:true,minimum:0,maximum:1023},total:{type:'number',integer:true,minimum:1,maximum:1024},data:{type:'string',maxLength:8192}}},output:{type:'null'},purposes:['background','request','attempt'],command:{deduplication:'none',resultRetentionMs:1,quotaBytes:1024,maxResultBytes:1024}},\n}});\nexport interface HistoryClient {\n get(input:{scope:string;id:string},options?:{signal?:AbortSignal}):Promise<any>;\n put(input:{scope:string;id:string;value:any},options:{signal?:AbortSignal;operationId:string}):Promise<unknown>;\n}\nexport function historyClient(rpc:any):HistoryClient {\n return {\n async get({scope,id},options){let text='';for(let index=0;index<1024;index++){\n options?.signal?.throwIfAborted();const part=await rpc.get({scope,id,index},options);if(part===null)return null;\n text+=part.data;if(Buffer.byteLength(text)>8*1024*1024)throw new Error('codex_router_history_limit');\n if(part.done)return JSON.parse(text);\n }throw new Error('codex_router_history_limit');},\n async put({scope,id,value},options){const text=serializeHistory(value),total=Math.ceil(text.length/8192);\n if(total>1024||Buffer.byteLength(text)>8*1024*1024)throw new Error('codex_router_history_limit');\n for(let index=0;index<total;index++){options.signal?.throwIfAborted();await rpc.put({scope,id,index,total,data:text.slice(index*8192,(index+1)*8192)},{...options,operationId:`${options.operationId}-${index}`});}\n },\n };\n}\n",
|
|
20
20
|
"/**\n * Public contract of the models-dev catalog provider.\n *\n * This is the ONLY file other plugins may import from models-dev. It contains the\n * declared service identity, the wire-contract snapshot literal and the data types\n * of the read surface; it never exposes the downloader, the private storage keys or\n * the internal catalog representation.\n *\n * Consumers must declare a real dependency on `models-dev` and consume the local\n * service for their own process. The service methods are synchronous and read an\n * already-loaded in-memory view: no per-request network or SQL is performed.\n */\n\n/** Provider plugin name. Must match the manifest. */\nexport const MODELS_DEV_PLUGIN_NAME = 'models-dev';\n\n/** The single upstream source; models-dev is the only component allowed to fetch it. */\nexport const MODELS_DEV_SOURCE_URL = 'https://models.dev/api.json';\n\n/** Same-process local read service, published in both the control and worker processes. */\nexport const MODELS_DEV_CATALOG_SERVICE_ID = 'models-dev.catalog.v1';\nexport const MODELS_DEV_CATALOG_CONTRACT_VERSION = 1;\n\n/** Versioned immutable snapshot of the full catalog, published by the control writer. */\nexport const MODELS_DEV_CATALOG_SNAPSHOT_ID = 'models-dev.catalog.snapshot.v1';\nexport const MODELS_DEV_CATALOG_SNAPSHOT_CONTRACT_VERSION = 1;\n/**\n * One atomic record keeps fetchedAt and the immutable catalog with its version.\n * The catalog remains unrestricted JSON so every upstream field is preserved.\n */\nexport const MODELS_DEV_CATALOG_SNAPSHOT_SCHEMA = Object.freeze({\n type: 'object', properties: {\n version: { type: 'number', integer: true, minimum: 1 },\n fetchedAt: { type: 'number', minimum: 0 },\n catalog: { type: 'json', maxBytes: 32 * 1024 * 1024 },\n },\n} as const);\nexport const MODELS_DEV_CATALOG_SNAPSHOT_CONTRACT = Object.freeze({\n id: MODELS_DEV_CATALOG_SNAPSHOT_ID,\n version: MODELS_DEV_CATALOG_SNAPSHOT_CONTRACT_VERSION,\n content: MODELS_DEV_CATALOG_SNAPSHOT_SCHEMA,\n});\n\n/** Catalog availability is separate from whether the service is published. */\nexport type ModelsDevCatalogState = 'empty' | 'ready' | 'stale' | 'failed';\n\nexport interface ModelsDevCatalogStatus {\n readonly state: ModelsDevCatalogState;\n /** Monotonic published data version; `null` before the first successful load. */\n readonly version: number | null;\n readonly fetchedAt: number | null;\n readonly providerCount: number;\n readonly modelCount: number;\n /** Last failure reason; `null` after a fully successful load. */\n readonly error: string | null;\n}\n\nexport interface ModelsDevProviderSummary {\n readonly provider: string;\n readonly name: string;\n /** Normalized upstream API base (`provider.api`), or `null` when models.dev declares none. */\n readonly api: string | null;\n readonly modelCount: number;\n}\n\n/** One selectable catalog model. `provider` is the pricing provider, never the protocol. */\nexport interface ModelsDevModelOption {\n readonly provider: string;\n readonly providerName: string;\n readonly model: string;\n readonly name: string;\n}\n\nexport interface ModelsDevModelPage {\n readonly models: readonly ModelsDevModelOption[];\n readonly total: number;\n /** 1-based page actually returned. */\n readonly page: number;\n readonly pageSize: number;\n}\n\n/** USD per million tokens, applied to the whole request at this input threshold. */\nexport interface ModelsDevContextTier {\n readonly minimumInputTokens: number;\n readonly input: number;\n readonly output: number;\n readonly cacheRead: number | null;\n readonly cacheWrite: number | null;\n}\n\n/** A resolved catalog entry with optional ascending context price bands. */\nexport interface ModelsDevModelMatch {\n readonly provider: string;\n readonly model: string;\n readonly input: number;\n readonly output: number;\n readonly cacheRead: number | null;\n readonly cacheWrite: number | null;\n readonly tiered: boolean;\n readonly contextTiers?: readonly ModelsDevContextTier[];\n}\n\nexport interface ModelsDevProviderMatch {\n readonly provider: string;\n}\n\n/**\n * The declared local read surface. Implementations must be side-effect free and\n * must never throw for a miss/corruption of the current view: an unavailable\n * catalog returns an `empty`/`failed` status instead of a fabricated price.\n */\nexport interface ModelsDevCatalogService {\n status(): ModelsDevCatalogStatus;\n providers(): readonly ModelsDevProviderSummary[];\n modelOptions(input?: { readonly provider?: string; readonly search?: string; readonly page?: number; readonly pageSize?: number }): ModelsDevModelPage;\n /**\n * Resolve exactly one catalog entry for a client model name.\n *\n * `url` (when supplied) is canonicalized to host + path and matched against the\n * full catalog's `provider.api`; more than one candidate is ambiguous and returns\n * null. `pricingProvider` is a catalog provider id and takes priority over URL and\n * prefix inference. A model id present under several providers without an explicit\n * provider is ambiguous. Matching defaults to exact and case-sensitive.\n * `estimate` additionally permits normalized names, original-lab prices and\n * dated members of the same family. Explicit provider IDs remain binding;\n * an unresolved URL is only a hint in estimate mode.\n */\n resolveModel(input: { readonly model: string; readonly pricingProvider?: string; readonly url?: string; readonly mode?: 'exact' | 'estimate' }): ModelsDevModelMatch | null;\n /** Resolve one provider from a real upstream URL via `provider.api`; ambiguous/none => null. */\n resolveProvider(input: { readonly url: string }): ModelsDevProviderMatch | null;\n}\n\n/** Capability reads are additive; existing catalog.v1 consumers stay unchanged. */\nexport const MODELS_DEV_CAPABILITIES_SERVICE_ID = 'models-dev.capabilities.v1';\nexport const MODELS_DEV_CAPABILITIES_CONTRACT_VERSION = 1;\nexport interface ModelsDevCapabilities {\n readonly provider: string;\n readonly model: string;\n readonly name: string;\n readonly contextWindow: number | null;\n readonly outputLimit: number | null;\n readonly toolCall: boolean;\n readonly reasoning: boolean;\n readonly inputModalities: readonly string[];\n}\nexport interface ModelsDevCapabilitiesService {\n status(): ModelsDevCatalogStatus;\n model(input: { readonly provider: string; readonly model: string }): ModelsDevCapabilities | null;\n}\n",
|
|
21
21
|
"import {HistoryTransport} from './history';\nimport {historyRpc} from './history-rpc';\nimport type { ControlHostContext, PluginControl, ControlPlugin } from '@jeffusion/bungee-core/plugin';\nimport { MODELS_DEV_CATALOG_SERVICE_ID, MODELS_DEV_CATALOG_CONTRACT_VERSION, MODELS_DEV_CAPABILITIES_SERVICE_ID, MODELS_DEV_CAPABILITIES_CONTRACT_VERSION, type ModelsDevCatalogService, type ModelsDevCapabilitiesService } from '../../models-dev/contract';\nexport function createControl(host: ControlHostContext): PluginControl {\n const history=new HistoryTransport();\n const timer=setInterval(()=>history.sweep(),30_000);timer.unref?.();\n host.signal.addEventListener('abort',()=>{clearInterval(timer);history.clear();},{once:true});\n host.services!.rpc!.publish(historyRpc,{get:input=>history.get(input),put:input=>history.put(input)});\n return {\n rpc:[], start() {}, async dispose() {clearInterval(timer);history.clear();},\n api:[{path:'/catalog', methods:['GET'], handler:'getCatalog', invoke:async ({request}) => {\n if (host.signal.aborted) return Response.json({error:'inactive'},{status:503});\n const params = new URL(request.url).searchParams;\n const page = Number(params.get('page') ?? 1);\n if (!Number.isSafeInteger(page) || page < 1 || page > 400\n || ['provider','search','page'].some(key => params.getAll(key).length > 1 || (params.get(key)?.length ?? 0) > 512)) return Response.json({error:'invalid_query'},{status:400});\n const catalog = host.services!.consume<ModelsDevCatalogService>('models-dev',MODELS_DEV_CATALOG_SERVICE_ID,MODELS_DEV_CATALOG_CONTRACT_VERSION);\n const capabilities = host.services!.consume<ModelsDevCapabilitiesService>('models-dev',MODELS_DEV_CAPABILITIES_SERVICE_ID,MODELS_DEV_CAPABILITIES_CONTRACT_VERSION);\n const result = catalog.modelOptions({provider:params.get('provider') ?? undefined,search:params.get('search') ?? undefined,page,pageSize:50});\n return Response.json({...result,providers:catalog.providers(),status:catalog.status(),models:result.models.map(model => ({...model,capabilities:capabilities.model(model)}))});\n }}],\n };\n}\nexport default {createControl} satisfies ControlPlugin;\n"
|
|
22
22
|
],
|
|
23
|
-
"mappings": "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",
|
|
24
|
-
"debugId": "
|
|
23
|
+
"mappings": "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",
|
|
24
|
+
"debugId": "FA2574E059661D9664756E2164756E21",
|
|
25
25
|
"names": []
|
|
26
26
|
}
|