@tangle-network/agent-eval 0.214.0 → 0.215.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.
- package/CHANGELOG.md +13 -0
- package/dist/adapters/http.d.ts +3 -3
- package/dist/{agent-profile-BGyt2z8U.d.ts → agent-profile-DmzL8KaJ.d.ts} +5 -5
- package/dist/{agent-profile-BGyt2z8U.d.ts.map → agent-profile-DmzL8KaJ.d.ts.map} +1 -1
- package/dist/analyst/index.d.ts +13 -13
- package/dist/analyst/index.js +7 -7
- package/dist/{analyze-runs-BlslTkOJ.d.ts → analyze-runs-BhFLOztS.d.ts} +4 -4
- package/dist/{analyze-runs-BlslTkOJ.d.ts.map → analyze-runs-BhFLOztS.d.ts.map} +1 -1
- package/dist/{benchmark-command-CMmeV-_Z.js → benchmark-command-CgpGi7vY.js} +9 -9
- package/dist/{benchmark-command-CMmeV-_Z.js.map → benchmark-command-CgpGi7vY.js.map} +1 -1
- package/dist/benchmarks/index.d.ts +5 -5
- package/dist/benchmarks/index.js +3 -3
- package/dist/campaign/index.d.ts +7 -7
- package/dist/campaign/index.js +4 -4
- package/dist/{campaign-Cuw3DQKF.js → campaign-CpnsCgfz.js} +7 -7
- package/dist/{campaign-Cuw3DQKF.js.map → campaign-CpnsCgfz.js.map} +1 -1
- package/dist/{chat-client-Bnx8NZe4.js → chat-client-DthPOYGd.js} +2 -2
- package/dist/{chat-client-Bnx8NZe4.js.map → chat-client-DthPOYGd.js.map} +1 -1
- package/dist/{chat-json-call-CZI1NoGZ.js → chat-json-call-BrKsyspg.js} +2 -2
- package/dist/{chat-json-call-CZI1NoGZ.js.map → chat-json-call-BrKsyspg.js.map} +1 -1
- package/dist/cli.js +3 -3
- package/dist/contract/index.d.ts +11 -11
- package/dist/contract/index.js +7 -7
- package/dist/{cost-ledger-DbQdN3nO.d.ts → cost-ledger-CO7UyEcQ.d.ts} +3 -8
- package/dist/{cost-ledger-DbQdN3nO.d.ts.map → cost-ledger-CO7UyEcQ.d.ts.map} +1 -1
- package/dist/{cost-ledger-DFOeLeJi.js → cost-ledger-D2FnJPBF.js} +27 -23
- package/dist/cost-ledger-D2FnJPBF.js.map +1 -0
- package/dist/{default-registry-BAiTePcB.d.ts → default-registry-B4B7GMvI.d.ts} +6 -6
- package/dist/{default-registry-BAiTePcB.d.ts.map → default-registry-B4B7GMvI.d.ts.map} +1 -1
- package/dist/{default-registry-BhYGMVbV.js → default-registry-KP4-Tolz.js} +3 -3
- package/dist/{default-registry-BhYGMVbV.js.map → default-registry-KP4-Tolz.js.map} +1 -1
- package/dist/{define-agent-eval-FGtpqnh4.js → define-agent-eval-BdfnqXeP.js} +3 -3
- package/dist/{define-agent-eval-FGtpqnh4.js.map → define-agent-eval-BdfnqXeP.js.map} +1 -1
- package/dist/{define-agent-eval-CZdBPUkk.d.ts → define-agent-eval-DfXvNho5.d.ts} +8 -8
- package/dist/{define-agent-eval-CZdBPUkk.d.ts.map → define-agent-eval-DfXvNho5.d.ts.map} +1 -1
- package/dist/diagnosis/index.d.ts +2 -2
- package/dist/{dspy-rlm-engine-OMBXVN0u.js → dspy-rlm-engine-DZfHM7kT.js} +3 -3
- package/dist/{dspy-rlm-engine-OMBXVN0u.js.map → dspy-rlm-engine-DZfHM7kT.js.map} +1 -1
- package/dist/{engine-BzOR5Ygn.d.ts → engine-C37HS2kr.d.ts} +5 -5
- package/dist/{engine-BzOR5Ygn.d.ts.map → engine-C37HS2kr.d.ts.map} +1 -1
- package/dist/evaluation.d.ts +3 -3
- package/dist/evaluation.js +1 -1
- package/dist/{exact-types-DjhfZglz.d.ts → exact-types-Dlb73wN4.d.ts} +2 -2
- package/dist/{exact-types-DjhfZglz.d.ts.map → exact-types-Dlb73wN4.d.ts.map} +1 -1
- package/dist/experiment/index.d.ts +1 -1
- package/dist/{external-optimizer-process-DCZx5PdG.js → external-optimizer-process-GngofQML.js} +2 -2
- package/dist/{external-optimizer-process-DCZx5PdG.js.map → external-optimizer-process-GngofQML.js.map} +1 -1
- package/dist/{external-optimizer-subprocess-CA3aXT8I.js → external-optimizer-subprocess-BUxifb8g.js} +3 -3
- package/dist/{external-optimizer-subprocess-CA3aXT8I.js.map → external-optimizer-subprocess-BUxifb8g.js.map} +1 -1
- package/dist/{feedback-trajectory-CX01700m.d.ts → feedback-trajectory-BLN_6fEs.d.ts} +3 -3
- package/dist/{feedback-trajectory-CX01700m.d.ts.map → feedback-trajectory-BLN_6fEs.d.ts.map} +1 -1
- package/dist/fuzz.d.ts +1 -1
- package/dist/fuzz.js +1 -1
- package/dist/{index-D_rfXep9.d.ts → index-B3WBm953.d.ts} +10 -10
- package/dist/{index-D_rfXep9.d.ts.map → index-B3WBm953.d.ts.map} +1 -1
- package/dist/{index-BTwxP7L0.d.ts → index-B7m2uzJL.d.ts} +10 -10
- package/dist/{index-BTwxP7L0.d.ts.map → index-B7m2uzJL.d.ts.map} +1 -1
- package/dist/{index-D0_l25We.d.ts → index-CPJJr98o.d.ts} +2 -2
- package/dist/{index-D0_l25We.d.ts.map → index-CPJJr98o.d.ts.map} +1 -1
- package/dist/{index-DNgf5gyG.d.ts → index-Ch9VxCpK.d.ts} +2 -2
- package/dist/{index-DNgf5gyG.d.ts.map → index-Ch9VxCpK.d.ts.map} +1 -1
- package/dist/{index-BWiAAWrk.d.ts → index-tYLUvk_w.d.ts} +8 -8
- package/dist/{index-BWiAAWrk.d.ts.map → index-tYLUvk_w.d.ts.map} +1 -1
- package/dist/index.d.ts +25 -25
- package/dist/index.js +13 -13
- package/dist/{integrity-zloavsM_.d.ts → integrity-CCAxGVK6.d.ts} +2 -2
- package/dist/{integrity-zloavsM_.d.ts.map → integrity-CCAxGVK6.d.ts.map} +1 -1
- package/dist/{judge-gate-B1_O0QIs.d.ts → judge-gate-DNcUrRFA.d.ts} +2 -2
- package/dist/{judge-gate-B1_O0QIs.d.ts.map → judge-gate-DNcUrRFA.d.ts.map} +1 -1
- package/dist/{kind-factory-CMlOx08-.js → kind-factory-AaEhUADH.js} +2 -2
- package/dist/{kind-factory-CMlOx08-.js.map → kind-factory-AaEhUADH.js.map} +1 -1
- package/dist/{llm-client-C_o62yG1.js → llm-client-DQveoxSM.js} +2 -2
- package/dist/{llm-client-C_o62yG1.js.map → llm-client-DQveoxSM.js.map} +1 -1
- package/dist/{llm-judge-Dw0rDpve.js → llm-judge-Cd5s5Ei6.js} +4 -4
- package/dist/{llm-judge-Dw0rDpve.js.map → llm-judge-Cd5s5Ei6.js.map} +1 -1
- package/dist/matrix/index.d.ts +2 -2
- package/dist/{matrix-CQwid3kj.d.ts → matrix-DXVAJMLD.d.ts} +4 -4
- package/dist/{matrix-CQwid3kj.d.ts.map → matrix-DXVAJMLD.d.ts.map} +1 -1
- package/dist/meta-eval/index.d.ts +2 -2
- package/dist/{mint-CDy-brUR.d.ts → mint-DCGoBYhB.d.ts} +2 -2
- package/dist/{mint-CDy-brUR.d.ts.map → mint-DCGoBYhB.d.ts.map} +1 -1
- package/dist/multishot/golden/index.d.ts +1 -1
- package/dist/multishot/index.d.ts +2 -2
- package/dist/openapi.json +1 -1
- package/dist/{prime-protocol-B7et3tI7.d.ts → prime-protocol-BHia9vDz.d.ts} +3 -3
- package/dist/{prime-protocol-B7et3tI7.d.ts.map → prime-protocol-BHia9vDz.d.ts.map} +1 -1
- package/dist/{produced-state-C1cTYK6w.js → produced-state-BGp4BX8t.js} +4 -4
- package/dist/{produced-state-C1cTYK6w.js.map → produced-state-BGp4BX8t.js.map} +1 -1
- package/dist/{registry-BL7H33tj.d.ts → registry-CMYIaDgS.d.ts} +5 -5
- package/dist/{registry-BL7H33tj.d.ts.map → registry-CMYIaDgS.d.ts.map} +1 -1
- package/dist/{release-confidence-C4kI7lQi.d.ts → release-confidence-BK2QCB5M.d.ts} +3 -3
- package/dist/{release-confidence-C4kI7lQi.d.ts.map → release-confidence-BK2QCB5M.d.ts.map} +1 -1
- package/dist/reporting.d.ts +3 -3
- package/dist/{researcher-DuIJ9IaA.d.ts → researcher-f6mZhh58.d.ts} +5 -5
- package/dist/{researcher-DuIJ9IaA.d.ts.map → researcher-f6mZhh58.d.ts.map} +1 -1
- package/dist/{reward-hacking-C6Kp54Av.d.ts → reward-hacking-DHA7c1l8.d.ts} +2 -2
- package/dist/{reward-hacking-C6Kp54Av.d.ts.map → reward-hacking-DHA7c1l8.d.ts.map} +1 -1
- package/dist/rl.d.ts +8 -8
- package/dist/rollout/index.d.ts +2 -2
- package/dist/{rubric-predictive-validity-BiNNEjpG.d.ts → rubric-predictive-validity-2SgHxoa5.d.ts} +2 -2
- package/dist/{rubric-predictive-validity-BiNNEjpG.d.ts.map → rubric-predictive-validity-2SgHxoa5.d.ts.map} +1 -1
- package/dist/{run-record-p2AYTrCn.d.ts → run-record-D1Hw-Jml.d.ts} +2 -2
- package/dist/{run-record-p2AYTrCn.d.ts.map → run-record-D1Hw-Jml.d.ts.map} +1 -1
- package/dist/search/index.d.ts +2 -2
- package/dist/{search-kernel-BWp7hfJn.d.ts → search-kernel-BqyBZ9Wm.d.ts} +4 -4
- package/dist/{search-kernel-BWp7hfJn.d.ts.map → search-kernel-BqyBZ9Wm.d.ts.map} +1 -1
- package/dist/{semantic-concept-judge-sDBNg_mI.js → semantic-concept-judge-BPqbwIVs.js} +6 -6
- package/dist/{semantic-concept-judge-sDBNg_mI.js.map → semantic-concept-judge-BPqbwIVs.js.map} +1 -1
- package/dist/{server-BRpadnVt.js → server-DbcC7xMl.js} +3 -3
- package/dist/{server-BRpadnVt.js.map → server-DbcC7xMl.js.map} +1 -1
- package/dist/{skillopt-optimization-method-CvaFGm95.js → skillopt-optimization-method-Dcepr6QL.js} +5 -5
- package/dist/{skillopt-optimization-method-CvaFGm95.js.map → skillopt-optimization-method-Dcepr6QL.js.map} +1 -1
- package/dist/{statistical-heldout-DZaTo3gZ.d.ts → statistical-heldout-CJTj2EoS.d.ts} +3 -3
- package/dist/{statistical-heldout-DZaTo3gZ.d.ts.map → statistical-heldout-CJTj2EoS.d.ts.map} +1 -1
- package/dist/{store-otlp-0AiS29kg.js → store-otlp-DWVhUgEj.js} +2 -2
- package/dist/{store-otlp-0AiS29kg.js.map → store-otlp-DWVhUgEj.js.map} +1 -1
- package/dist/{store-tool-spans-BAcBBSM8.js → store-tool-spans-BNICrhsb.js} +3 -3
- package/dist/{store-tool-spans-BAcBBSM8.js.map → store-tool-spans-BNICrhsb.js.map} +1 -1
- package/dist/{store-tool-spans-DuvZ4YWb.d.ts → store-tool-spans-BNzls3OD.d.ts} +7 -7
- package/dist/{store-tool-spans-DuvZ4YWb.d.ts.map → store-tool-spans-BNzls3OD.d.ts.map} +1 -1
- package/dist/{summary-report-CK0ueoJd.d.ts → summary-report-C-CtItCN.d.ts} +2 -2
- package/dist/{summary-report-CK0ueoJd.d.ts.map → summary-report-C-CtItCN.d.ts.map} +1 -1
- package/dist/{systemone-review-BReh3mvm.d.ts → systemone-review-C4dZgrgN.d.ts} +2 -2
- package/dist/{systemone-review-BReh3mvm.d.ts.map → systemone-review-C4dZgrgN.d.ts.map} +1 -1
- package/dist/systemone.d.ts +79 -4
- package/dist/systemone.d.ts.map +1 -1
- package/dist/systemone.js +185 -2
- package/dist/systemone.js.map +1 -1
- package/dist/{tool-groups-DOriCbkR.d.ts → tool-groups-BKRrtqy4.d.ts} +3 -3
- package/dist/tool-groups-BKRrtqy4.d.ts.map +1 -0
- package/dist/{trace-questions-RCaYLkwH.d.ts → trace-questions-CLx8vt6t.d.ts} +4 -4
- package/dist/{trace-questions-RCaYLkwH.d.ts.map → trace-questions-CLx8vt6t.d.ts.map} +1 -1
- package/dist/trace-repair/index.d.ts +3 -3
- package/dist/traces.d.ts +6 -6
- package/dist/traces.js +3 -3
- package/dist/{types-CMnPcbW5.d.ts → types-CGEmVYOk.d.ts} +6 -6
- package/dist/{types-CMnPcbW5.d.ts.map → types-CGEmVYOk.d.ts.map} +1 -1
- package/dist/{types-Lub7o6bN.d.ts → types-DBZ7keha.d.ts} +2 -2
- package/dist/{types-Lub7o6bN.d.ts.map → types-DBZ7keha.d.ts.map} +1 -1
- package/dist/{types-KEkKkETv.d.ts → types-DHb5TI36.d.ts} +4 -4
- package/dist/{types-KEkKkETv.d.ts.map → types-DHb5TI36.d.ts.map} +1 -1
- package/dist/{types-Dj0Qv2qi.d.ts → types-DinHtRJp.d.ts} +3 -3
- package/dist/{types-Dj0Qv2qi.d.ts.map → types-DinHtRJp.d.ts.map} +1 -1
- package/dist/wire/index.d.ts +3 -3
- package/dist/wire/index.js +1 -1
- package/docs/campaign-proposers.md +3 -0
- package/docs/public-api.md +47 -19
- package/docs/systemone-integrations.md +1 -0
- package/docs/systemone.md +34 -0
- package/package.json +1 -1
- package/dist/cost-ledger-DFOeLeJi.js.map +0 -1
- package/dist/tool-groups-DOriCbkR.d.ts.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as LlmClient } from "./llm-client-
|
|
1
|
+
import { n as LlmClient } from "./llm-client-DQveoxSM.js";
|
|
2
2
|
//#region src/analyst/chat-client.ts
|
|
3
3
|
/**
|
|
4
4
|
* Provider-neutral chat contract for every model call made by agent-eval.
|
|
@@ -114,4 +114,4 @@ function openAiCompatibleClient(opts) {
|
|
|
114
114
|
//#endregion
|
|
115
115
|
export { createChatClient as t };
|
|
116
116
|
|
|
117
|
-
//# sourceMappingURL=chat-client-
|
|
117
|
+
//# sourceMappingURL=chat-client-DthPOYGd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-client-Bnx8NZe4.js","names":[],"sources":["../src/analyst/chat-client.ts"],"sourcesContent":["/**\n * Provider-neutral chat contract for every model call made by agent-eval.\n *\n * The caller owns model execution. Evaluation code receives canonical requests\n * and results without importing a provider SDK, and agent-eval reads no\n * environment variable to find a provider credential: every transport is bound\n * at the call site.\n *\n * Two ways to bind one. `custom` and `sandbox-sdk` take a `chat` function the\n * caller wrote. `openai-compatible` takes an endpoint and a credential the\n * caller passes as values, and agent-eval issues the HTTP request itself.\n *\n * WHY THE THIRD ONE EXISTS. Every consumer that wanted a plain OpenAI-style\n * endpoint had to hand-write the same fetch loop — retry on 429 and 5xx,\n * `json_schema` degrade, fenced-JSON stripping, and, load-bearing here, the\n * `servedModel` echo that `assertServedModel` and `assertCrossFamilyServed`\n * read. A hand-written transport that omits `servedModel` makes both identity\n * checks read `unreported`, so the two-vendor judge rule they enforce silently\n * measures nothing. Measured motive: agent-eval 0.172.1 exported no such\n * transport, so a two-model judge panel in discovery-lab reached\n * `createChatClient({ transport: 'custom', baseUrl, apiKey })` — fields that\n * exist on no transport option — and every call threw\n * `TypeError: opts.chat is not a function`, which surfaced as\n * `aggregateJudgeVerdicts: all 2 judges failed`.\n *\n * The credential still never comes from agent-eval's environment. `baseUrl`\n * and the bearer are required arguments with no default and no fallback, so a\n * misconfigured caller gets a refusal at construction, never a call to an\n * endpoint it did not name.\n */\n\nimport {\n type LlmCallRequest,\n type LlmCallResult,\n LlmClient,\n type LlmClientOptions,\n} from '../llm-client'\n\n/**\n * Unified chat interface using the package's canonical LLM request and result.\n */\nexport interface ChatClient {\n /** Display name of the bound transport, included in telemetry. */\n readonly transport: ChatTransport\n /** Default model when the caller omits one. */\n readonly defaultModel?: string\n /** Total provider attempts this transport can make for one chat call. */\n readonly maximumAttempts?: number\n\n /** Implementations must enforce `req.maxTokens` when it is present. */\n chat(req: ChatRequest, opts?: ChatCallOpts): Promise<ChatResponse>\n}\n\nexport type ChatTransport =\n | 'sandbox-sdk' // box.streamPrompt() — chat completion via sandbox SDK\n | 'custom' // caller-adapted SDK or transport\n | 'openai-compatible' // caller-named /v1 endpoint, driven by this package\n | 'mock' // test-time injection\n\nexport interface ChatRequest extends Omit<LlmCallRequest, 'model'> {\n /** Optional — falls back to ChatClient.defaultModel. */\n model?: string\n}\n\nexport type ChatResponse = LlmCallResult\n\nexport interface ChatCallOpts {\n /** Cancel the in-flight request. */\n signal?: AbortSignal\n /** Hard USD ceiling for this single call (informational; the underlying transport may not enforce). */\n maxCostUsd?: number\n /** Correlation tag carried into request headers when the transport allows. */\n correlationId?: string\n /** Stable provider idempotency key for retries/redrives of one paid call. */\n idempotencyKey?: string\n}\n\n// ── Factory ─────────────────────────────────────────────────────────\n\nexport type CreateChatClientOpts =\n | SandboxSdkTransportOpts\n | CustomTransportOpts\n | OpenAiCompatibleTransportOpts\n | MockTransportOpts\n\ninterface BaseTransportOpts {\n defaultModel?: string\n /** Total provider attempts. Required for opaque transports used in capped runs. */\n maximumAttempts?: number\n}\n\n/**\n * Sandbox-SDK transport. The caller supplies a canonical chat function for an\n * already-configured Sandbox handle, so agent-eval does not import the SDK.\n */\nexport interface SandboxSdkTransportOpts extends BaseTransportOpts {\n transport: 'sandbox-sdk'\n chat: (req: ChatRequest, opts?: ChatCallOpts) => Promise<ChatResponse>\n}\n\n/** Caller-adapted SDK or transport returning the canonical ChatResponse shape. */\nexport interface CustomTransportOpts extends BaseTransportOpts {\n transport: 'custom'\n chat: (req: ChatRequest, opts?: ChatCallOpts) => Promise<ChatResponse>\n}\n\n/**\n * OpenAI-compatible HTTP transport: the caller names a `/v1` endpoint and\n * hands over a bearer, and this package drives `POST {baseUrl}/chat/completions`.\n *\n * Use this instead of hand-rolling a `custom` transport around `fetch`. The\n * result carries `servedModel` — the model id the provider echoed, verbatim —\n * which is the only field `assertServedModel` and `assertCrossFamilyServed`\n * can read to witness a gateway answering from a different model than the one\n * requested.\n *\n * `baseUrl` ends at the `/v1` prefix; the `/chat/completions` path is this\n * package's to append. A `baseUrl` that already carries the path is a\n * construction error, not a request to a doubled URL.\n *\n * Exactly one credential form is required — `apiKey`, `bearer`, or\n * `authHeader`. There is no environment fallback: agent-eval never goes\n * looking for a key.\n */\nexport interface OpenAiCompatibleTransportOpts\n extends BaseTransportOpts,\n Pick<\n LlmClientOptions,\n | 'assertServedModel'\n | 'customTokenPricing'\n | 'deadlineMs'\n | 'defaultTimeoutMs'\n | 'fetch'\n | 'jsonPayloadMode'\n | 'jsonSchemaTransport'\n | 'minIntervalMs'\n | 'provider'\n | 'rawSink'\n | 'signal'\n | 'thinking'\n > {\n transport: 'openai-compatible'\n /** Endpoint ending at the `/v1` prefix. Required — there is no default endpoint. */\n baseUrl: string\n /** Bearer credential. One of `apiKey`, `bearer`, or `authHeader` is required. */\n apiKey?: string\n /** Bearer credential, alternate spelling. */\n bearer?: string\n /** Non-bearer authorization header, for endpoints that want their own scheme. */\n authHeader?: { name: string; value: string }\n}\n\n/**\n * Mock transport for tests. The handler receives the request and returns\n * whatever the test wants. No retries, no JSON-schema degrade.\n */\nexport interface MockTransportOpts extends BaseTransportOpts {\n transport: 'mock'\n handler: (req: ChatRequest, opts?: ChatCallOpts) => Promise<ChatResponse>\n}\n\n/**\n * Build a ChatClient bound to a specific transport. The returned client\n * is safe to share across analysts in a single registry run.\n */\nexport function createChatClient(opts: CreateChatClientOpts): ChatClient {\n switch (opts.transport) {\n case 'sandbox-sdk':\n return {\n transport: 'sandbox-sdk',\n defaultModel: opts.defaultModel,\n maximumAttempts: opts.maximumAttempts,\n chat: async (req, callOpts) => opts.chat(resolveModel(req, opts.defaultModel), callOpts),\n }\n case 'custom':\n return {\n transport: 'custom',\n defaultModel: opts.defaultModel,\n maximumAttempts: opts.maximumAttempts,\n chat: async (req, callOpts) => opts.chat(resolveModel(req, opts.defaultModel), callOpts),\n }\n case 'openai-compatible':\n return openAiCompatibleClient(opts)\n case 'mock':\n return {\n transport: 'mock',\n defaultModel: opts.defaultModel,\n maximumAttempts: 1,\n chat: async (req, callOpts) => opts.handler(resolveModel(req, opts.defaultModel), callOpts),\n }\n }\n}\n\nfunction resolveModel(req: ChatRequest, defaultModel: string | undefined): ChatRequest {\n if (req.model) return req\n if (!defaultModel) {\n throw new Error(\n 'ChatClient.chat: no model on request and no defaultModel on the client. ' +\n 'Either pass req.model or bind defaultModel at createChatClient().',\n )\n }\n return { ...req, model: defaultModel }\n}\n\n/**\n * Build the OpenAI-compatible client, refusing a half-configured one first.\n *\n * Both refusals are construction-time on purpose. A missing credential or a\n * doubled path is a caller mistake that a request would turn into a 401 or a\n * 404 from an endpoint the caller did not intend to reach — the failure then\n * reads as a provider problem instead of a configuration one.\n */\nfunction openAiCompatibleClient(opts: OpenAiCompatibleTransportOpts): ChatClient {\n const baseUrl = opts.baseUrl?.trim().replace(/\\/+$/, '') ?? ''\n if (!baseUrl) {\n throw new Error(\n \"createChatClient({ transport: 'openai-compatible' }): baseUrl is required and has no default.\",\n )\n }\n if (/\\/chat\\/completions$/.test(baseUrl)) {\n throw new Error(\n \"createChatClient({ transport: 'openai-compatible' }): baseUrl ends at the /v1 prefix; \" +\n `this package appends /chat/completions. Got ${baseUrl}`,\n )\n }\n if (!opts.apiKey?.trim() && !opts.bearer?.trim() && !opts.authHeader) {\n throw new Error(\n \"createChatClient({ transport: 'openai-compatible' }): one of apiKey, bearer, or authHeader \" +\n 'is required. agent-eval reads no environment variable for a credential.',\n )\n }\n\n const clientOptions: LlmClientOptions = {\n baseUrl,\n ...(opts.apiKey ? { apiKey: opts.apiKey } : {}),\n ...(opts.bearer ? { bearer: opts.bearer } : {}),\n ...(opts.authHeader ? { authHeader: opts.authHeader } : {}),\n ...(opts.maximumAttempts === undefined ? {} : { maximumAttempts: opts.maximumAttempts }),\n ...(opts.assertServedModel === undefined ? {} : { assertServedModel: opts.assertServedModel }),\n ...(opts.customTokenPricing === undefined\n ? {}\n : { customTokenPricing: opts.customTokenPricing }),\n ...(opts.deadlineMs === undefined ? {} : { deadlineMs: opts.deadlineMs }),\n ...(opts.defaultTimeoutMs === undefined ? {} : { defaultTimeoutMs: opts.defaultTimeoutMs }),\n ...(opts.fetch === undefined ? {} : { fetch: opts.fetch }),\n ...(opts.jsonPayloadMode === undefined ? {} : { jsonPayloadMode: opts.jsonPayloadMode }),\n ...(opts.jsonSchemaTransport === undefined\n ? {}\n : { jsonSchemaTransport: opts.jsonSchemaTransport }),\n ...(opts.minIntervalMs === undefined ? {} : { minIntervalMs: opts.minIntervalMs }),\n ...(opts.provider === undefined ? {} : { provider: opts.provider }),\n ...(opts.rawSink === undefined ? {} : { rawSink: opts.rawSink }),\n ...(opts.signal === undefined ? {} : { signal: opts.signal }),\n ...(opts.thinking === undefined ? {} : { thinking: opts.thinking }),\n }\n const client = new LlmClient(clientOptions)\n\n return {\n transport: 'openai-compatible',\n ...(opts.defaultModel ? { defaultModel: opts.defaultModel } : {}),\n maximumAttempts: client.maximumAttempts,\n chat: async (req, callOpts) => {\n const resolved = resolveModel(req, opts.defaultModel)\n return client.call(resolved as LlmCallRequest, {\n ...(callOpts?.signal ? { signal: callOpts.signal } : {}),\n ...(callOpts?.idempotencyKey ? { idempotencyKey: callOpts.idempotencyKey } : {}),\n })\n },\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat-client-DthPOYGd.js","names":[],"sources":["../src/analyst/chat-client.ts"],"sourcesContent":["/**\n * Provider-neutral chat contract for every model call made by agent-eval.\n *\n * The caller owns model execution. Evaluation code receives canonical requests\n * and results without importing a provider SDK, and agent-eval reads no\n * environment variable to find a provider credential: every transport is bound\n * at the call site.\n *\n * Two ways to bind one. `custom` and `sandbox-sdk` take a `chat` function the\n * caller wrote. `openai-compatible` takes an endpoint and a credential the\n * caller passes as values, and agent-eval issues the HTTP request itself.\n *\n * WHY THE THIRD ONE EXISTS. Every consumer that wanted a plain OpenAI-style\n * endpoint had to hand-write the same fetch loop — retry on 429 and 5xx,\n * `json_schema` degrade, fenced-JSON stripping, and, load-bearing here, the\n * `servedModel` echo that `assertServedModel` and `assertCrossFamilyServed`\n * read. A hand-written transport that omits `servedModel` makes both identity\n * checks read `unreported`, so the two-vendor judge rule they enforce silently\n * measures nothing. Measured motive: agent-eval 0.172.1 exported no such\n * transport, so a two-model judge panel in discovery-lab reached\n * `createChatClient({ transport: 'custom', baseUrl, apiKey })` — fields that\n * exist on no transport option — and every call threw\n * `TypeError: opts.chat is not a function`, which surfaced as\n * `aggregateJudgeVerdicts: all 2 judges failed`.\n *\n * The credential still never comes from agent-eval's environment. `baseUrl`\n * and the bearer are required arguments with no default and no fallback, so a\n * misconfigured caller gets a refusal at construction, never a call to an\n * endpoint it did not name.\n */\n\nimport {\n type LlmCallRequest,\n type LlmCallResult,\n LlmClient,\n type LlmClientOptions,\n} from '../llm-client'\n\n/**\n * Unified chat interface using the package's canonical LLM request and result.\n */\nexport interface ChatClient {\n /** Display name of the bound transport, included in telemetry. */\n readonly transport: ChatTransport\n /** Default model when the caller omits one. */\n readonly defaultModel?: string\n /** Total provider attempts this transport can make for one chat call. */\n readonly maximumAttempts?: number\n\n /** Implementations must enforce `req.maxTokens` when it is present. */\n chat(req: ChatRequest, opts?: ChatCallOpts): Promise<ChatResponse>\n}\n\nexport type ChatTransport =\n | 'sandbox-sdk' // box.streamPrompt() — chat completion via sandbox SDK\n | 'custom' // caller-adapted SDK or transport\n | 'openai-compatible' // caller-named /v1 endpoint, driven by this package\n | 'mock' // test-time injection\n\nexport interface ChatRequest extends Omit<LlmCallRequest, 'model'> {\n /** Optional — falls back to ChatClient.defaultModel. */\n model?: string\n}\n\nexport type ChatResponse = LlmCallResult\n\nexport interface ChatCallOpts {\n /** Cancel the in-flight request. */\n signal?: AbortSignal\n /** Hard USD ceiling for this single call (informational; the underlying transport may not enforce). */\n maxCostUsd?: number\n /** Correlation tag carried into request headers when the transport allows. */\n correlationId?: string\n /** Stable provider idempotency key for retries/redrives of one paid call. */\n idempotencyKey?: string\n}\n\n// ── Factory ─────────────────────────────────────────────────────────\n\nexport type CreateChatClientOpts =\n | SandboxSdkTransportOpts\n | CustomTransportOpts\n | OpenAiCompatibleTransportOpts\n | MockTransportOpts\n\ninterface BaseTransportOpts {\n defaultModel?: string\n /** Total provider attempts. Required for opaque transports used in capped runs. */\n maximumAttempts?: number\n}\n\n/**\n * Sandbox-SDK transport. The caller supplies a canonical chat function for an\n * already-configured Sandbox handle, so agent-eval does not import the SDK.\n */\nexport interface SandboxSdkTransportOpts extends BaseTransportOpts {\n transport: 'sandbox-sdk'\n chat: (req: ChatRequest, opts?: ChatCallOpts) => Promise<ChatResponse>\n}\n\n/** Caller-adapted SDK or transport returning the canonical ChatResponse shape. */\nexport interface CustomTransportOpts extends BaseTransportOpts {\n transport: 'custom'\n chat: (req: ChatRequest, opts?: ChatCallOpts) => Promise<ChatResponse>\n}\n\n/**\n * OpenAI-compatible HTTP transport: the caller names a `/v1` endpoint and\n * hands over a bearer, and this package drives `POST {baseUrl}/chat/completions`.\n *\n * Use this instead of hand-rolling a `custom` transport around `fetch`. The\n * result carries `servedModel` — the model id the provider echoed, verbatim —\n * which is the only field `assertServedModel` and `assertCrossFamilyServed`\n * can read to witness a gateway answering from a different model than the one\n * requested.\n *\n * `baseUrl` ends at the `/v1` prefix; the `/chat/completions` path is this\n * package's to append. A `baseUrl` that already carries the path is a\n * construction error, not a request to a doubled URL.\n *\n * Exactly one credential form is required — `apiKey`, `bearer`, or\n * `authHeader`. There is no environment fallback: agent-eval never goes\n * looking for a key.\n */\nexport interface OpenAiCompatibleTransportOpts\n extends BaseTransportOpts,\n Pick<\n LlmClientOptions,\n | 'assertServedModel'\n | 'customTokenPricing'\n | 'deadlineMs'\n | 'defaultTimeoutMs'\n | 'fetch'\n | 'jsonPayloadMode'\n | 'jsonSchemaTransport'\n | 'minIntervalMs'\n | 'provider'\n | 'rawSink'\n | 'signal'\n | 'thinking'\n > {\n transport: 'openai-compatible'\n /** Endpoint ending at the `/v1` prefix. Required — there is no default endpoint. */\n baseUrl: string\n /** Bearer credential. One of `apiKey`, `bearer`, or `authHeader` is required. */\n apiKey?: string\n /** Bearer credential, alternate spelling. */\n bearer?: string\n /** Non-bearer authorization header, for endpoints that want their own scheme. */\n authHeader?: { name: string; value: string }\n}\n\n/**\n * Mock transport for tests. The handler receives the request and returns\n * whatever the test wants. No retries, no JSON-schema degrade.\n */\nexport interface MockTransportOpts extends BaseTransportOpts {\n transport: 'mock'\n handler: (req: ChatRequest, opts?: ChatCallOpts) => Promise<ChatResponse>\n}\n\n/**\n * Build a ChatClient bound to a specific transport. The returned client\n * is safe to share across analysts in a single registry run.\n */\nexport function createChatClient(opts: CreateChatClientOpts): ChatClient {\n switch (opts.transport) {\n case 'sandbox-sdk':\n return {\n transport: 'sandbox-sdk',\n defaultModel: opts.defaultModel,\n maximumAttempts: opts.maximumAttempts,\n chat: async (req, callOpts) => opts.chat(resolveModel(req, opts.defaultModel), callOpts),\n }\n case 'custom':\n return {\n transport: 'custom',\n defaultModel: opts.defaultModel,\n maximumAttempts: opts.maximumAttempts,\n chat: async (req, callOpts) => opts.chat(resolveModel(req, opts.defaultModel), callOpts),\n }\n case 'openai-compatible':\n return openAiCompatibleClient(opts)\n case 'mock':\n return {\n transport: 'mock',\n defaultModel: opts.defaultModel,\n maximumAttempts: 1,\n chat: async (req, callOpts) => opts.handler(resolveModel(req, opts.defaultModel), callOpts),\n }\n }\n}\n\nfunction resolveModel(req: ChatRequest, defaultModel: string | undefined): ChatRequest {\n if (req.model) return req\n if (!defaultModel) {\n throw new Error(\n 'ChatClient.chat: no model on request and no defaultModel on the client. ' +\n 'Either pass req.model or bind defaultModel at createChatClient().',\n )\n }\n return { ...req, model: defaultModel }\n}\n\n/**\n * Build the OpenAI-compatible client, refusing a half-configured one first.\n *\n * Both refusals are construction-time on purpose. A missing credential or a\n * doubled path is a caller mistake that a request would turn into a 401 or a\n * 404 from an endpoint the caller did not intend to reach — the failure then\n * reads as a provider problem instead of a configuration one.\n */\nfunction openAiCompatibleClient(opts: OpenAiCompatibleTransportOpts): ChatClient {\n const baseUrl = opts.baseUrl?.trim().replace(/\\/+$/, '') ?? ''\n if (!baseUrl) {\n throw new Error(\n \"createChatClient({ transport: 'openai-compatible' }): baseUrl is required and has no default.\",\n )\n }\n if (/\\/chat\\/completions$/.test(baseUrl)) {\n throw new Error(\n \"createChatClient({ transport: 'openai-compatible' }): baseUrl ends at the /v1 prefix; \" +\n `this package appends /chat/completions. Got ${baseUrl}`,\n )\n }\n if (!opts.apiKey?.trim() && !opts.bearer?.trim() && !opts.authHeader) {\n throw new Error(\n \"createChatClient({ transport: 'openai-compatible' }): one of apiKey, bearer, or authHeader \" +\n 'is required. agent-eval reads no environment variable for a credential.',\n )\n }\n\n const clientOptions: LlmClientOptions = {\n baseUrl,\n ...(opts.apiKey ? { apiKey: opts.apiKey } : {}),\n ...(opts.bearer ? { bearer: opts.bearer } : {}),\n ...(opts.authHeader ? { authHeader: opts.authHeader } : {}),\n ...(opts.maximumAttempts === undefined ? {} : { maximumAttempts: opts.maximumAttempts }),\n ...(opts.assertServedModel === undefined ? {} : { assertServedModel: opts.assertServedModel }),\n ...(opts.customTokenPricing === undefined\n ? {}\n : { customTokenPricing: opts.customTokenPricing }),\n ...(opts.deadlineMs === undefined ? {} : { deadlineMs: opts.deadlineMs }),\n ...(opts.defaultTimeoutMs === undefined ? {} : { defaultTimeoutMs: opts.defaultTimeoutMs }),\n ...(opts.fetch === undefined ? {} : { fetch: opts.fetch }),\n ...(opts.jsonPayloadMode === undefined ? {} : { jsonPayloadMode: opts.jsonPayloadMode }),\n ...(opts.jsonSchemaTransport === undefined\n ? {}\n : { jsonSchemaTransport: opts.jsonSchemaTransport }),\n ...(opts.minIntervalMs === undefined ? {} : { minIntervalMs: opts.minIntervalMs }),\n ...(opts.provider === undefined ? {} : { provider: opts.provider }),\n ...(opts.rawSink === undefined ? {} : { rawSink: opts.rawSink }),\n ...(opts.signal === undefined ? {} : { signal: opts.signal }),\n ...(opts.thinking === undefined ? {} : { thinking: opts.thinking }),\n }\n const client = new LlmClient(clientOptions)\n\n return {\n transport: 'openai-compatible',\n ...(opts.defaultModel ? { defaultModel: opts.defaultModel } : {}),\n maximumAttempts: client.maximumAttempts,\n chat: async (req, callOpts) => {\n const resolved = resolveModel(req, opts.defaultModel)\n return client.call(resolved as LlmCallRequest, {\n ...(callOpts?.signal ? { signal: callOpts.signal } : {}),\n ...(callOpts?.idempotencyKey ? { idempotencyKey: callOpts.idempotencyKey } : {}),\n })\n },\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as extractJsonPayload, o as costReceiptFromLlm, s as costReceiptFromLlmError, u as maximumChargeForLlmRequest } from "./llm-client-
|
|
1
|
+
import { c as extractJsonPayload, o as costReceiptFromLlm, s as costReceiptFromLlmError, u as maximumChargeForLlmRequest } from "./llm-client-DQveoxSM.js";
|
|
2
2
|
//#region src/chat-json-call.ts
|
|
3
3
|
/** Parse a JSON answer out of a model response. The transport may fence it. */
|
|
4
4
|
function parseJsonAnswer(response, actor) {
|
|
@@ -60,4 +60,4 @@ async function paidJsonChat(input) {
|
|
|
60
60
|
//#endregion
|
|
61
61
|
export { paidJsonChat as n, paidChat as t };
|
|
62
62
|
|
|
63
|
-
//# sourceMappingURL=chat-json-call-
|
|
63
|
+
//# sourceMappingURL=chat-json-call-BrKsyspg.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-json-call-
|
|
1
|
+
{"version":3,"file":"chat-json-call-BrKsyspg.js","names":[],"sources":["../src/chat-json-call.ts"],"sourcesContent":["/**\n * One paid model call through a caller-owned `ChatClient`, metered by the\n * cost ledger.\n *\n * agent-eval executes no paid model: the transport is supplied by the caller\n * and the credential never enters this package. What stays here is the\n * accounting around the call — the priced maximum reserved before it runs, the\n * stable call id forwarded as the provider idempotency key, the receipt\n * settled from the response, and an honest unknown-usage receipt when the\n * transport failed.\n *\n * The judges, the wire judge endpoint, and the in-process trace-analysis\n * engine all make the same call in the same order; this is the one copy of\n * that sequence. `paidChat` is the sequence; `paidJsonChat` adds the JSON\n * answer parse that a structured caller needs.\n */\n\nimport type { ChatClient, ChatResponse } from './analyst/chat-client'\nimport type { CostChannel, CostLedgerHandle, CostReceipt, CustomTokenPricing } from './cost-ledger'\nimport {\n costReceiptFromLlm,\n costReceiptFromLlmError,\n extractJsonPayload,\n type LlmCallRequest,\n maximumChargeForLlmRequest,\n} from './llm-client'\n\nexport interface PaidChatInput {\n /** Caller-owned transport. One `chat()` call. */\n chat: ChatClient\n /** The exact canonical request, including its JSON-mode or schema fields. */\n request: LlmCallRequest\n ledger: CostLedgerHandle\n channel: CostChannel\n phase: string\n actor: string\n tags?: Record<string, string>\n signal?: AbortSignal\n /** Endpoint rates used when the transport reports no billed amount. */\n pricing?: CustomTokenPricing\n}\n\nexport type PaidJsonChatInput = PaidChatInput\n\nexport type PaidChatResult =\n | { succeeded: true; response: ChatResponse; receipt: CostReceipt }\n | { succeeded: false; error: Error; receipt?: CostReceipt }\n\nexport type PaidJsonChatResult<T> =\n | { succeeded: true; value: T; response: ChatResponse; receipt: CostReceipt }\n | { succeeded: false; error: Error; receipt?: CostReceipt }\n\n/** Parse a JSON answer out of a model response. The transport may fence it. */\nfunction parseJsonAnswer<T>(response: ChatResponse, actor: string): T {\n try {\n return JSON.parse(extractJsonPayload(response.content)) as T\n } catch (error) {\n throw new Error(\n `${actor}: model answer was not JSON — ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n}\n\n/** Reserve, execute, and settle one caller-owned chat call. */\nexport async function paidChat(input: PaidChatInput): Promise<PaidChatResult> {\n const paid = await input.ledger.runPaidCall({\n channel: input.channel,\n phase: input.phase,\n actor: input.actor,\n model: input.request.model,\n ...(input.tags && Object.keys(input.tags).length > 0 ? { tags: input.tags } : {}),\n maximumCharge: maximumChargeForLlmRequest(input.request, {\n ...(input.chat.maximumAttempts === undefined\n ? {}\n : { maximumAttempts: input.chat.maximumAttempts }),\n ...(input.pricing ? { customTokenPricing: input.pricing } : {}),\n }),\n ...(input.signal ? { signal: input.signal } : {}),\n execute: (signal, callId) => input.chat.chat(input.request, { signal, idempotencyKey: callId }),\n receipt: (response) => costReceiptFromLlm(response, input.pricing),\n receiptFromError: (error) => costReceiptFromLlmError(error, input.pricing),\n })\n if (!paid.succeeded) {\n return {\n succeeded: false,\n error: paid.error,\n ...(paid.receipt ? { receipt: paid.receipt } : {}),\n }\n }\n return { succeeded: true, response: paid.value, receipt: paid.receipt }\n}\n\nexport async function paidJsonChat<T>(input: PaidJsonChatInput): Promise<PaidJsonChatResult<T>> {\n const paid = await paidChat(input)\n if (!paid.succeeded) return paid\n // The call completed and was billed. A malformed answer is a contract\n // failure AFTER the money was spent, so it keeps the settled receipt instead\n // of reporting the spend as unknown.\n try {\n return {\n succeeded: true,\n value: parseJsonAnswer<T>(paid.response, input.actor),\n response: paid.response,\n receipt: paid.receipt,\n }\n } catch (error) {\n return {\n succeeded: false,\n error: error instanceof Error ? error : new Error(String(error)),\n receipt: paid.receipt,\n }\n }\n}\n"],"mappings":";;;AAqDA,SAAS,gBAAmB,UAAwB,OAAkB;CACpE,IAAI;EACF,OAAO,KAAK,MAAM,mBAAmB,SAAS,OAAO,CAAC;CACxD,SAAS,OAAO;EACd,MAAM,IAAI,MACR,GAAG,MAAM,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAChG;CACF;AACF;;AAGA,eAAsB,SAAS,OAA+C;CAC5E,MAAM,OAAO,MAAM,MAAM,OAAO,YAAY;EAC1C,SAAS,MAAM;EACf,OAAO,MAAM;EACb,OAAO,MAAM;EACb,OAAO,MAAM,QAAQ;EACrB,GAAI,MAAM,QAAQ,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;EAC/E,eAAe,2BAA2B,MAAM,SAAS;GACvD,GAAI,MAAM,KAAK,oBAAoB,KAAA,IAC/B,CAAC,IACD,EAAE,iBAAiB,MAAM,KAAK,gBAAgB;GAClD,GAAI,MAAM,UAAU,EAAE,oBAAoB,MAAM,QAAQ,IAAI,CAAC;EAC/D,CAAC;EACD,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;EAC/C,UAAU,QAAQ,WAAW,MAAM,KAAK,KAAK,MAAM,SAAS;GAAE;GAAQ,gBAAgB;EAAO,CAAC;EAC9F,UAAU,aAAa,mBAAmB,UAAU,MAAM,OAAO;EACjE,mBAAmB,UAAU,wBAAwB,OAAO,MAAM,OAAO;CAC3E,CAAC;CACD,IAAI,CAAC,KAAK,WACR,OAAO;EACL,WAAW;EACX,OAAO,KAAK;EACZ,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;CAClD;CAEF,OAAO;EAAE,WAAW;EAAM,UAAU,KAAK;EAAO,SAAS,KAAK;CAAQ;AACxE;AAEA,eAAsB,aAAgB,OAA0D;CAC9F,MAAM,OAAO,MAAM,SAAS,KAAK;CACjC,IAAI,CAAC,KAAK,WAAW,OAAO;CAI5B,IAAI;EACF,OAAO;GACL,WAAW;GACX,OAAO,gBAAmB,KAAK,UAAU,MAAM,KAAK;GACpD,UAAU,KAAK;GACf,SAAS,KAAK;EAChB;CACF,SAAS,OAAO;EACd,OAAO;GACL,WAAW;GACX,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;GAC/D,SAAS,KAAK;EAChB;CACF;AACF"}
|
package/dist/cli.js
CHANGED
|
@@ -4,9 +4,9 @@ import { i as replaySearchLedgerText } from "./search-ledger-d7V8o9Lk.js";
|
|
|
4
4
|
import { t as renderSearchSummary } from "./search-summary-CBvz3u_S.js";
|
|
5
5
|
import { c as hostedTenantFromEnv, g as SearchRunKindSchema, r as shipSearchLedger, t as SearchShipConflictError, u as SEARCH_LEDGER_BATCH_MAX_BYTES } from "./search-shipper-er4pK5_Y.js";
|
|
6
6
|
import { i as runRolloutReleaseCli } from "./hf-dataset-BR2yhuNn.js";
|
|
7
|
-
import { t as createChatClient } from "./chat-client-
|
|
8
|
-
import { t as runAnalystBenchmarkCommand } from "./benchmark-command-
|
|
9
|
-
import { a as runRpcBatch, o as runRpcOnce, p as handleVersion, r as startServerAsync, s as buildOpenApi } from "./server-
|
|
7
|
+
import { t as createChatClient } from "./chat-client-DthPOYGd.js";
|
|
8
|
+
import { t as runAnalystBenchmarkCommand } from "./benchmark-command-CgpGi7vY.js";
|
|
9
|
+
import { a as runRpcBatch, o as runRpcOnce, p as handleVersion, r as startServerAsync, s as buildOpenApi } from "./server-DbcC7xMl.js";
|
|
10
10
|
import { C as editCredit, S as front, _ as surfaceTextEdits, c as metaSearch, d as renderMetaSearchText, m as landscape, n as taskMatrix, o as skillManifold, p as formatLandscape, r as formatSkillManifold, t as tree, w as editCreditText } from "./tree-rXLW3M_4.js";
|
|
11
11
|
import { t as runSupervisorRunCommand } from "./report-command-CtIIsQKP.js";
|
|
12
12
|
import { createHash } from "node:crypto";
|
package/dist/contract/index.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { c as CostLedgerHandle } from "../cost-ledger-
|
|
2
|
-
import { _ as ProposalFinding, i as AnalystFinding, v as ProposalFindingOrigin, x as makeProposalFinding } from "../types-
|
|
3
|
-
import { A as createChatClient, T as CreateChatClientOpts, x as ChatClient } from "../types-
|
|
4
|
-
import { $ as paretoSignificanceGate, G as BuildEvidenceVectorOptions, J as ParetoSignificanceGateOptions, K as EvidenceVector, Q as paretoPolicy, U as AxisEvidence, W as AxisVerdict, X as PromotionPolicy, Y as PromotionObjective, Z as buildEvidenceVector, q as ObjectiveSource } from "../statistical-heldout-
|
|
5
|
-
import { C as JudgeDimension, H as SurfaceProposer, M as OptimizerConfig, R as Scenario, S as JudgeConfig, V as SessionScript, _ as GateDecision, a as CampaignResult, b as GenerationRecord, c as CampaignTraceWriter, d as DispatchContext, f as DispatchFn, g as GateContribution, h as GateContext, i as CampaignCostMeter, j as MutableSurface, l as CodeSurface, m as GateCheckStatus, n as CampaignArtifactWriter, p as Gate, r as CampaignCellResult, t as CampaignAggregates, v as GateResult, w as JudgeScore, y as GenerationCandidate } from "../types-
|
|
6
|
-
import { $i as RunImprovementLoopOptions, $r as GepaOptimizationRecipe, Bi as ReferenceEquivalenceJudgeInput, Ci as compareOptimizationMethods, Dr as DefaultProductionGateOptions, Er as DefaultProductionGateCheck, Fa as campaignSplitDigest, Gi as runReferenceEquivalenceJudge, Gr as SkillOptOptimizationMethodConfig, Hi as ReferenceEquivalenceJudgeResult, Ji as llmJudge, Jr as skillOptOptimizationMethod, Ki as LlmJudgeDimension, Kr as SkillOptRunnerCommand, Oa as FinalEvidencePolicy, Or as DefaultProductionRewardHackingOptions, Qi as transientDispatchFailure, Qr as GepaOptimizationMethodConfig, Ri as REFERENCE_EQUIVALENCE_INPUT_LIMITS, Si as OptimizationTokenUsage, Ti as ComparisonCost, Tr as heldOutGate, Ui as ReferenceEquivalenceScenario, Vi as ReferenceEquivalenceJudgeOptions, Wi as createReferenceEquivalenceJudge, Wr as composeGate, Xr as GepaEngineOptions, Yr as GepaAdaptiveEngineRun, Zr as GepaEngineRun, _a as runCampaign, _i as OptimizationMethodProvenance, ai as ExternalTextOptimizationMethodConfig, ci as ExternalOptimizationExample, di as CompareOptimizationMethodsOptions, ea as RunImprovementLoopResult, ei as GepaRunnerCommand, fa as RunEvalOptions, fi as OptimizationMethod, ga as RunCampaignOptions, ha as CampaignCellRetryPolicy, hi as OptimizationMethodInput, ii as externalTextOptimizationMethod, ka as FinalEvidenceUse, kr as defaultProductionGate, li as ExternalTextEvaluationResponse, ma as CampaignCellFailureReceipt, ni as OpenAICompatibleOptimizerModel, oi as ExternalTextOptimizerContext, pa as runEval, pi as OptimizationMethodComparison, qi as LlmJudgeOptions, qr as SkillOptTrainerConfig, ri as OptimizerModelBudget, si as ExternalTextOptimizerResult, ta as runImprovementLoop, ti as gepaOptimizationMethod, vi as OptimizationMethodResult, wr as HeldOutGateOptions, xi as OptimizationPackageSource, zi as REFERENCE_EQUIVALENCE_JUDGE_VERSION } from "../index-
|
|
7
|
-
import { $t as fsCampaignStorage, Zt as CampaignStorage, en as inMemoryCampaignStorage } from "../search-kernel-
|
|
1
|
+
import { c as CostLedgerHandle } from "../cost-ledger-CO7UyEcQ.js";
|
|
2
|
+
import { _ as ProposalFinding, i as AnalystFinding, v as ProposalFindingOrigin, x as makeProposalFinding } from "../types-DHb5TI36.js";
|
|
3
|
+
import { A as createChatClient, T as CreateChatClientOpts, x as ChatClient } from "../types-DBZ7keha.js";
|
|
4
|
+
import { $ as paretoSignificanceGate, G as BuildEvidenceVectorOptions, J as ParetoSignificanceGateOptions, K as EvidenceVector, Q as paretoPolicy, U as AxisEvidence, W as AxisVerdict, X as PromotionPolicy, Y as PromotionObjective, Z as buildEvidenceVector, q as ObjectiveSource } from "../statistical-heldout-CJTj2EoS.js";
|
|
5
|
+
import { C as JudgeDimension, H as SurfaceProposer, M as OptimizerConfig, R as Scenario, S as JudgeConfig, V as SessionScript, _ as GateDecision, a as CampaignResult, b as GenerationRecord, c as CampaignTraceWriter, d as DispatchContext, f as DispatchFn, g as GateContribution, h as GateContext, i as CampaignCostMeter, j as MutableSurface, l as CodeSurface, m as GateCheckStatus, n as CampaignArtifactWriter, p as Gate, r as CampaignCellResult, t as CampaignAggregates, v as GateResult, w as JudgeScore, y as GenerationCandidate } from "../types-CGEmVYOk.js";
|
|
6
|
+
import { $i as RunImprovementLoopOptions, $r as GepaOptimizationRecipe, Bi as ReferenceEquivalenceJudgeInput, Ci as compareOptimizationMethods, Dr as DefaultProductionGateOptions, Er as DefaultProductionGateCheck, Fa as campaignSplitDigest, Gi as runReferenceEquivalenceJudge, Gr as SkillOptOptimizationMethodConfig, Hi as ReferenceEquivalenceJudgeResult, Ji as llmJudge, Jr as skillOptOptimizationMethod, Ki as LlmJudgeDimension, Kr as SkillOptRunnerCommand, Oa as FinalEvidencePolicy, Or as DefaultProductionRewardHackingOptions, Qi as transientDispatchFailure, Qr as GepaOptimizationMethodConfig, Ri as REFERENCE_EQUIVALENCE_INPUT_LIMITS, Si as OptimizationTokenUsage, Ti as ComparisonCost, Tr as heldOutGate, Ui as ReferenceEquivalenceScenario, Vi as ReferenceEquivalenceJudgeOptions, Wi as createReferenceEquivalenceJudge, Wr as composeGate, Xr as GepaEngineOptions, Yr as GepaAdaptiveEngineRun, Zr as GepaEngineRun, _a as runCampaign, _i as OptimizationMethodProvenance, ai as ExternalTextOptimizationMethodConfig, ci as ExternalOptimizationExample, di as CompareOptimizationMethodsOptions, ea as RunImprovementLoopResult, ei as GepaRunnerCommand, fa as RunEvalOptions, fi as OptimizationMethod, ga as RunCampaignOptions, ha as CampaignCellRetryPolicy, hi as OptimizationMethodInput, ii as externalTextOptimizationMethod, ka as FinalEvidenceUse, kr as defaultProductionGate, li as ExternalTextEvaluationResponse, ma as CampaignCellFailureReceipt, ni as OpenAICompatibleOptimizerModel, oi as ExternalTextOptimizerContext, pa as runEval, pi as OptimizationMethodComparison, qi as LlmJudgeOptions, qr as SkillOptTrainerConfig, ri as OptimizerModelBudget, si as ExternalTextOptimizerResult, ta as runImprovementLoop, ti as gepaOptimizationMethod, vi as OptimizationMethodResult, wr as HeldOutGateOptions, xi as OptimizationPackageSource, zi as REFERENCE_EQUIVALENCE_JUDGE_VERSION } from "../index-B3WBm953.js";
|
|
7
|
+
import { $t as fsCampaignStorage, Zt as CampaignStorage, en as inMemoryCampaignStorage } from "../search-kernel-BqyBZ9Wm.js";
|
|
8
8
|
import { i as InMemoryOutcomeStore, n as FileSystemOutcomeStore, o as OutcomeStore, r as FileSystemOutcomeStoreOptions, t as DeploymentOutcome } from "../outcome-store-CNt4iZ67.js";
|
|
9
9
|
import { r as HostedTenant } from "../client-BzL9niqi.js";
|
|
10
|
-
import { _ as ReleaseSummary, a as summarizeExecution, c as ExecutionInsight, d as InsightReport, f as InterRaterInsight, g as Recommendation, h as OutcomeCorrelationInsight, i as analyzeRuns, l as FailureClassTally, m as LiftInsight, n as ExecutionReport, o as CostProvenanceSummary, p as JudgeInsight, r as SummarizeExecutionOptions, s as ExecutionErrorOutcomeCell, t as AnalyzeRunsOptions, u as FailureClusterInsight, v as ScalarDistribution, y as TokenUsageInsight } from "../analyze-runs-
|
|
11
|
-
import { _ as SelfImproveMethodResult, a as DefinedAgentEval, c as SelfImproveMethodOptions, d as SelfImproveProposerOptions, f as SelfImproveProposerResult, g as SelfImproveMethodProvenance, h as selfImprove, i as DefineAgentEvalOptions, l as SelfImproveOptions, m as SelfImproveRunError, n as AgentEvalEvaluateOptions, o as defineAgentEval, p as SelfImproveResult, r as AgentEvalImproveOptions, s as SelfImproveBudget, t as AgentEvalAgent, u as SelfImproveProgressEvent } from "../define-agent-eval-
|
|
12
|
-
import { $ as FromRunRecordDirOptions, A as CodeAgentSessionActionKind, At as verifyCandidateExperimentComparison, B as AgentTraceConversation, C as fromOpenCodeSession, Ct as evaluatePairedMeasurements, D as parseCodeAgentJsonlFile, Dt as sealCandidateBenchmarkTask, E as parseCodeAgentJsonl, Et as sealCandidateBenchmarkSuite, F as CodeAgentSessionSource, G as AuthoringProvenance, H as AgentTraceIndex, I as CodeAgentSessionTerminalStatus, J as partitionRunsByAuthoringModel, K as PartitionByAuthoringModelResult, L as observeCodeAgentSession, M as CodeAgentSessionActionSurface, N as CodeAgentSessionExecutionReceipt, O as streamCodeAgentJsonlFile, Ot as sealCandidateExperiment, P as CodeAgentSessionObservation, Q as evalReportingSuite, R as AgentTraceContributor, S as fromKimiCodeSession, St as SealCandidateBenchmarkSuiteOptions, T as fromPiSession, Tt as runCandidateExperiment, U as AgentTraceRange, V as AgentTraceFile, W as AgentTraceRecord, X as EvalReportingSuiteOptions, Y as EvalReportingSuiteInput, Z as EvalReportingSuiteResult, _ as CodeAgentSessionIntakeResult, _t as EvaluatePairedMeasurementsOptions, a as FromFeedbackTableOptions, at as CompareAgentProfileImprovementExperimentOptions, b as fromClaudeCodeSession, bt as PairedMeasurementEvaluation, c as CodeAgentStoreObservation, ct as measuredComparisonFromAgentProfileImprovementExperiment, d as CodeAgentStoreScope, dt as sealAgentProfileImprovementSuite, et as FromRunRecordDirResult, f as CodeAgentStoreSession, ft as sealAgentProfileImprovementTask, g as CodeAgentSessionIntakeOptions, gt as CompareCandidateExperimentOptions, h as CodeAgentSessionDiagnostic, ht as CandidateExperimentRun, i as FeedbackTableRow, it as AgentProfileImprovementExperimentRun, j as CodeAgentSessionActionStatus, k as CodeAgentSessionAction, kt as verifyCandidateExperiment, l as CodeAgentStoreRejection, lt as runAgentProfileImprovementExperiment, m as CodeAgentJsonlLine, mt as CandidateExperimentExecutionInput, n as fromOtelSpans, nt as fromRunRecordDir, o as FromFeedbackTableResult, ot as RunAgentProfileImprovementExperimentOptions, p as observeCodeAgentStore, pt as verifyAgentProfileImprovementExperimentComparison, q as parseAgentTrace, r as FeedbackTableMeta, rt as AgentProfileImprovementExperimentExecutionInput, s as fromFeedbackTable, st as SealAgentProfileImprovementSuiteOptions, t as FromOtelSpansOptions, tt as RunRecordRejection, u as CodeAgentStoreRejections, ut as sealAgentProfileImprovementExperiment, v as CodeAgentSessionMetrics, vt as PairedMeasurement, w as fromPiGraphSession, wt as measuredComparisonFromCandidateExperiment, x as fromCodexSession, xt as RunCandidateExperimentOptions, y as ParsedCodeAgentJsonl, yt as PairedMeasurementAdapter, z as AgentTraceContributorType } from "../index-
|
|
13
|
-
import { n as buildDefaultAnalystRegistry, t as DefaultAnalystRegistryOptions } from "../default-registry-
|
|
10
|
+
import { _ as ReleaseSummary, a as summarizeExecution, c as ExecutionInsight, d as InsightReport, f as InterRaterInsight, g as Recommendation, h as OutcomeCorrelationInsight, i as analyzeRuns, l as FailureClassTally, m as LiftInsight, n as ExecutionReport, o as CostProvenanceSummary, p as JudgeInsight, r as SummarizeExecutionOptions, s as ExecutionErrorOutcomeCell, t as AnalyzeRunsOptions, u as FailureClusterInsight, v as ScalarDistribution, y as TokenUsageInsight } from "../analyze-runs-BhFLOztS.js";
|
|
11
|
+
import { _ as SelfImproveMethodResult, a as DefinedAgentEval, c as SelfImproveMethodOptions, d as SelfImproveProposerOptions, f as SelfImproveProposerResult, g as SelfImproveMethodProvenance, h as selfImprove, i as DefineAgentEvalOptions, l as SelfImproveOptions, m as SelfImproveRunError, n as AgentEvalEvaluateOptions, o as defineAgentEval, p as SelfImproveResult, r as AgentEvalImproveOptions, s as SelfImproveBudget, t as AgentEvalAgent, u as SelfImproveProgressEvent } from "../define-agent-eval-DfXvNho5.js";
|
|
12
|
+
import { $ as FromRunRecordDirOptions, A as CodeAgentSessionActionKind, At as verifyCandidateExperimentComparison, B as AgentTraceConversation, C as fromOpenCodeSession, Ct as evaluatePairedMeasurements, D as parseCodeAgentJsonlFile, Dt as sealCandidateBenchmarkTask, E as parseCodeAgentJsonl, Et as sealCandidateBenchmarkSuite, F as CodeAgentSessionSource, G as AuthoringProvenance, H as AgentTraceIndex, I as CodeAgentSessionTerminalStatus, J as partitionRunsByAuthoringModel, K as PartitionByAuthoringModelResult, L as observeCodeAgentSession, M as CodeAgentSessionActionSurface, N as CodeAgentSessionExecutionReceipt, O as streamCodeAgentJsonlFile, Ot as sealCandidateExperiment, P as CodeAgentSessionObservation, Q as evalReportingSuite, R as AgentTraceContributor, S as fromKimiCodeSession, St as SealCandidateBenchmarkSuiteOptions, T as fromPiSession, Tt as runCandidateExperiment, U as AgentTraceRange, V as AgentTraceFile, W as AgentTraceRecord, X as EvalReportingSuiteOptions, Y as EvalReportingSuiteInput, Z as EvalReportingSuiteResult, _ as CodeAgentSessionIntakeResult, _t as EvaluatePairedMeasurementsOptions, a as FromFeedbackTableOptions, at as CompareAgentProfileImprovementExperimentOptions, b as fromClaudeCodeSession, bt as PairedMeasurementEvaluation, c as CodeAgentStoreObservation, ct as measuredComparisonFromAgentProfileImprovementExperiment, d as CodeAgentStoreScope, dt as sealAgentProfileImprovementSuite, et as FromRunRecordDirResult, f as CodeAgentStoreSession, ft as sealAgentProfileImprovementTask, g as CodeAgentSessionIntakeOptions, gt as CompareCandidateExperimentOptions, h as CodeAgentSessionDiagnostic, ht as CandidateExperimentRun, i as FeedbackTableRow, it as AgentProfileImprovementExperimentRun, j as CodeAgentSessionActionStatus, k as CodeAgentSessionAction, kt as verifyCandidateExperiment, l as CodeAgentStoreRejection, lt as runAgentProfileImprovementExperiment, m as CodeAgentJsonlLine, mt as CandidateExperimentExecutionInput, n as fromOtelSpans, nt as fromRunRecordDir, o as FromFeedbackTableResult, ot as RunAgentProfileImprovementExperimentOptions, p as observeCodeAgentStore, pt as verifyAgentProfileImprovementExperimentComparison, q as parseAgentTrace, r as FeedbackTableMeta, rt as AgentProfileImprovementExperimentExecutionInput, s as fromFeedbackTable, st as SealAgentProfileImprovementSuiteOptions, t as FromOtelSpansOptions, tt as RunRecordRejection, u as CodeAgentStoreRejections, ut as sealAgentProfileImprovementExperiment, v as CodeAgentSessionMetrics, vt as PairedMeasurement, w as fromPiGraphSession, wt as measuredComparisonFromCandidateExperiment, x as fromCodexSession, xt as RunCandidateExperimentOptions, y as ParsedCodeAgentJsonl, yt as PairedMeasurementAdapter, z as AgentTraceContributorType } from "../index-B7m2uzJL.js";
|
|
13
|
+
import { n as buildDefaultAnalystRegistry, t as DefaultAnalystRegistryOptions } from "../default-registry-B4B7GMvI.js";
|
|
14
14
|
export { type AgentEvalAgent, type AgentEvalEvaluateOptions, type AgentEvalImproveOptions, type AgentProfileImprovementExperimentExecutionInput, type AgentProfileImprovementExperimentRun, type AgentTraceContributor, type AgentTraceContributorType, type AgentTraceConversation, type AgentTraceFile, type AgentTraceIndex, type AgentTraceRange, type AgentTraceRecord, type AnalystFinding, type AnalyzeRunsOptions, type AuthoringProvenance, type AxisEvidence, type AxisVerdict, type BuildEvidenceVectorOptions, type CampaignAggregates, type CampaignArtifactWriter, type CampaignCellFailureReceipt, type CampaignCellResult, type CampaignCellRetryPolicy, type CampaignCostMeter, type CampaignResult, type CampaignStorage, type CampaignTraceWriter, type CandidateExperimentExecutionInput, type CandidateExperimentRun, type ChatClient, type CodeAgentJsonlLine, type CodeAgentSessionAction, type CodeAgentSessionActionKind, type CodeAgentSessionActionStatus, type CodeAgentSessionActionSurface, type CodeAgentSessionDiagnostic, type CodeAgentSessionExecutionReceipt, type CodeAgentSessionIntakeOptions, type CodeAgentSessionIntakeResult, type CodeAgentSessionMetrics, type CodeAgentSessionObservation, type CodeAgentSessionSource, type CodeAgentSessionTerminalStatus, type CodeAgentStoreObservation, type CodeAgentStoreRejection, type CodeAgentStoreRejections, type CodeAgentStoreScope, type CodeAgentStoreSession, type CodeSurface, type CompareAgentProfileImprovementExperimentOptions, type CompareCandidateExperimentOptions, type CompareOptimizationMethodsOptions, type ComparisonCost, type CostLedgerHandle, type CostProvenanceSummary, type CreateChatClientOpts, type DefaultAnalystRegistryOptions, type DefaultProductionGateCheck, type DefaultProductionGateOptions, type DefaultProductionRewardHackingOptions, type DefineAgentEvalOptions, type DefinedAgentEval, type DeploymentOutcome, type DispatchFn as Dispatch, type DispatchContext, type EvalReportingSuiteInput, type EvalReportingSuiteOptions, type EvalReportingSuiteResult, type EvaluatePairedMeasurementsOptions, type EvidenceVector, type ExecutionErrorOutcomeCell, type ExecutionInsight, type ExecutionReport, type ExternalOptimizationExample, type ExternalTextEvaluationResponse, type ExternalTextOptimizationMethodConfig, type ExternalTextOptimizerContext, type ExternalTextOptimizerResult, type FailureClassTally, type FailureClusterInsight, type FeedbackTableMeta, type FeedbackTableRow, FileSystemOutcomeStore, type FileSystemOutcomeStoreOptions, type FinalEvidencePolicy, type FinalEvidenceUse, type FromFeedbackTableOptions, type FromFeedbackTableResult, type FromOtelSpansOptions, type FromRunRecordDirOptions, type FromRunRecordDirResult, type Gate, type GateCheckStatus, type GateContext, type GateContribution, type GateDecision, type GateResult, type GenerationCandidate, type GenerationRecord, type GepaAdaptiveEngineRun, type GepaEngineOptions, type GepaEngineRun, type GepaOptimizationMethodConfig, type GepaOptimizationRecipe, type GepaRunnerCommand, type HeldOutGateOptions, type HostedTenant, InMemoryOutcomeStore, type InsightReport, type InterRaterInsight, type JudgeConfig, type JudgeDimension, type JudgeInsight, type JudgeScore, type LiftInsight, type LlmJudgeDimension, type LlmJudgeOptions, type MutableSurface, type ObjectiveSource, type OpenAICompatibleOptimizerModel, type OptimizationMethod, type OptimizationMethodComparison, type OptimizationMethodInput, type OptimizationMethodProvenance, type OptimizationMethodResult, type OptimizationPackageSource, type OptimizationTokenUsage, type OptimizerConfig, type OptimizerModelBudget, type OutcomeCorrelationInsight, type OutcomeStore, type PairedMeasurement, type PairedMeasurementAdapter, type PairedMeasurementEvaluation, type ParetoSignificanceGateOptions, type ParsedCodeAgentJsonl, type PartitionByAuthoringModelResult, type PromotionObjective, type PromotionPolicy, type ProposalFinding, type ProposalFindingOrigin, REFERENCE_EQUIVALENCE_INPUT_LIMITS, REFERENCE_EQUIVALENCE_JUDGE_VERSION, type Recommendation, type ReferenceEquivalenceJudgeInput, type ReferenceEquivalenceJudgeOptions, type ReferenceEquivalenceJudgeResult, type ReferenceEquivalenceScenario, type ReleaseSummary, type RunAgentProfileImprovementExperimentOptions, type RunCampaignOptions, type RunCandidateExperimentOptions, type RunEvalOptions, type RunImprovementLoopOptions, type RunImprovementLoopResult, type RunRecordRejection, type ScalarDistribution, type Scenario, type SealAgentProfileImprovementSuiteOptions, type SealCandidateBenchmarkSuiteOptions, type SelfImproveBudget, type SelfImproveMethodOptions, type SelfImproveMethodProvenance, type SelfImproveMethodResult, type SelfImproveOptions, type SelfImproveProgressEvent, type SelfImproveProposerOptions, type SelfImproveProposerResult, type SelfImproveResult, SelfImproveRunError, type SessionScript, type SkillOptOptimizationMethodConfig, type SkillOptRunnerCommand, type SkillOptTrainerConfig, type SummarizeExecutionOptions, type SurfaceProposer, type TokenUsageInsight, analyzeRuns, buildDefaultAnalystRegistry, buildEvidenceVector, campaignSplitDigest, compareOptimizationMethods, composeGate, createChatClient, createReferenceEquivalenceJudge, defaultProductionGate, defineAgentEval, evalReportingSuite, evaluatePairedMeasurements, externalTextOptimizationMethod, fromClaudeCodeSession, fromCodexSession, fromFeedbackTable, fromKimiCodeSession, fromOpenCodeSession, fromOtelSpans, fromPiGraphSession, fromPiSession, fromRunRecordDir, fsCampaignStorage, gepaOptimizationMethod, heldOutGate, inMemoryCampaignStorage, llmJudge, makeProposalFinding, measuredComparisonFromAgentProfileImprovementExperiment, measuredComparisonFromCandidateExperiment, observeCodeAgentSession, observeCodeAgentStore, paretoPolicy, paretoSignificanceGate, parseAgentTrace, parseCodeAgentJsonl, parseCodeAgentJsonlFile, partitionRunsByAuthoringModel, runAgentProfileImprovementExperiment, runCampaign, runCandidateExperiment, runEval, runImprovementLoop, runReferenceEquivalenceJudge, sealAgentProfileImprovementExperiment, sealAgentProfileImprovementSuite, sealAgentProfileImprovementTask, sealCandidateBenchmarkSuite, sealCandidateBenchmarkTask, sealCandidateExperiment, selfImprove, skillOptOptimizationMethod, streamCodeAgentJsonlFile, summarizeExecution, transientDispatchFailure, verifyAgentProfileImprovementExperimentComparison, verifyCandidateExperiment, verifyCandidateExperimentComparison };
|
package/dist/contract/index.js
CHANGED
|
@@ -4,19 +4,19 @@ import { t as decidePairedPromotion } from "../paired-promotion-decision-BN6IQTi
|
|
|
4
4
|
import { a as heldoutSignificance } from "../statistical-heldout-1Gbmex7v.js";
|
|
5
5
|
import { n as summarizeExecution, t as analyzeRuns } from "../analyze-runs-3xpby3p2.js";
|
|
6
6
|
import { a as parseRunRecordSafe } from "../run-record-DlTZ_lqe.js";
|
|
7
|
-
import { K as defaultProductionGate, a as transientDispatchFailure, c as compareOptimizationMethods, h as runImprovementLoop, nt as runEval, rt as runCampaign, t as llmJudge } from "../llm-judge-
|
|
7
|
+
import { K as defaultProductionGate, a as transientDispatchFailure, c as compareOptimizationMethods, h as runImprovementLoop, nt as runEval, rt as runCampaign, t as llmJudge } from "../llm-judge-Cd5s5Ei6.js";
|
|
8
8
|
import { i as isModelPriced, n as estimateCost } from "../metrics-BKaPBtIG.js";
|
|
9
|
-
import { i as CostLedger } from "../cost-ledger-
|
|
9
|
+
import { i as CostLedger } from "../cost-ledger-D2FnJPBF.js";
|
|
10
10
|
import { G as campaignSplitDigest } from "../campaign-evidence-OcUciD-N.js";
|
|
11
11
|
import { h as mapConcurrentRange } from "../journal-DvKCvjty.js";
|
|
12
|
-
import { C as inMemoryCampaignStorage, S as fsCampaignStorage } from "../external-optimizer-subprocess-
|
|
13
|
-
import { n as SelfImproveRunError, r as selfImprove, t as defineAgentEval } from "../define-agent-eval-
|
|
14
|
-
import { t as buildDefaultAnalystRegistry } from "../default-registry-
|
|
12
|
+
import { C as inMemoryCampaignStorage, S as fsCampaignStorage } from "../external-optimizer-subprocess-BUxifb8g.js";
|
|
13
|
+
import { n as SelfImproveRunError, r as selfImprove, t as defineAgentEval } from "../define-agent-eval-BdfnqXeP.js";
|
|
14
|
+
import { t as buildDefaultAnalystRegistry } from "../default-registry-KP4-Tolz.js";
|
|
15
15
|
import { t as extractUsage } from "../extract-usage-BrnzRJ6H.js";
|
|
16
16
|
import { i as makeProposalFinding } from "../types-CW5b90JH.js";
|
|
17
|
-
import { t as createChatClient } from "../chat-client-
|
|
17
|
+
import { t as createChatClient } from "../chat-client-DthPOYGd.js";
|
|
18
18
|
import { n as InMemoryOutcomeStore, t as FileSystemOutcomeStore } from "../outcome-store-DUcMj-3D.js";
|
|
19
|
-
import { c as heldOutGate, g as runReferenceEquivalenceJudge, h as createReferenceEquivalenceJudge, l as composeGate, m as REFERENCE_EQUIVALENCE_JUDGE_VERSION, n as gepaOptimizationMethod, p as REFERENCE_EQUIVALENCE_INPUT_LIMITS, t as skillOptOptimizationMethod, u as externalTextOptimizationMethod } from "../skillopt-optimization-method-
|
|
19
|
+
import { c as heldOutGate, g as runReferenceEquivalenceJudge, h as createReferenceEquivalenceJudge, l as composeGate, m as REFERENCE_EQUIVALENCE_JUDGE_VERSION, n as gepaOptimizationMethod, p as REFERENCE_EQUIVALENCE_INPUT_LIMITS, t as skillOptOptimizationMethod, u as externalTextOptimizationMethod } from "../skillopt-optimization-method-Dcepr6QL.js";
|
|
20
20
|
import { n as paretoPolicy, r as paretoSignificanceGate, t as buildEvidenceVector } from "../promotion-policy-CWW35UWq.js";
|
|
21
21
|
import { t as fromOtelSpans } from "../otel-spans-C8YIJWy1.js";
|
|
22
22
|
import { createHash } from "node:crypto";
|
|
@@ -230,13 +230,8 @@ declare class CostLedger {
|
|
|
230
230
|
private captureFailure;
|
|
231
231
|
private commitReceipt;
|
|
232
232
|
private resolveMaximum;
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
* Total settled cost with each unknown-cost call charged its reserved
|
|
236
|
-
* maximum. A provider that omits a call's cost cannot make the ceiling check
|
|
237
|
-
* under-count: the call is bounded by what it was allowed to spend.
|
|
238
|
-
*/
|
|
239
|
-
private conservativeSettledCostUsd;
|
|
233
|
+
/** Compute admission totals in record order without building reporting rollups. */
|
|
234
|
+
private admissionState;
|
|
240
235
|
private appendRecord;
|
|
241
236
|
private ensureCostLimitPersisted;
|
|
242
237
|
private appendEvent;
|
|
@@ -259,4 +254,4 @@ declare function costForUsage(model: string, usage: CostUsage): CostResult;
|
|
|
259
254
|
declare function costForTokenPricing(pricing: CustomTokenPricing, usage: Pick<CostUsage, 'inputTokens' | 'outputTokens' | 'cachedTokens' | 'cacheWriteTokens'>): number;
|
|
260
255
|
//#endregion
|
|
261
256
|
export { PendingCostCall as C, costForUsage as D, costForTokenPricing as E, modelPriceKey as O, PaidCallResult as S, RunPaidCallInput as T, CostReservationExceededError as _, CostChannel as a, CustomTokenPricing as b, CostLedgerHandle as c, CostLedgerPersistenceError as d, CostLedgerSummary as f, CostReceiptInput as g, CostReceiptCaptureError as h, CostCeilingReachedError as i, CostLedgerOptions as l, CostReceipt as m, CostAccountingIncompleteError as n, CostLedger as o, CostProvenance as p, CostCallConflictError as r, CostLedgerFilter as s, ChannelRollup as t, CostLedgerPersistence as u, CostResult as v, PendingCostCallView as w, MaximumCharge as x, CostUsage as y };
|
|
262
|
-
//# sourceMappingURL=cost-ledger-
|
|
257
|
+
//# sourceMappingURL=cost-ledger-CO7UyEcQ.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost-ledger-
|
|
1
|
+
{"version":3,"file":"cost-ledger-CO7UyEcQ.d.ts","names":[],"sources":["../src/cost-ledger.ts"],"mappings":";;KAIY;;KAGA;EACN;EAAkB;;EAClB;EAAmB;;EACnB;EAAoB;;UAET;EACf;;EAEA;;EAEA;;EAEA;;EAEA;;UAGQ;EACR;EACA,SAAS;EACT;EACA;EACA;EACA;EACA,OAAO;EACP;;UAGe,wBAAwB;EACvC;;UAGe,4BAA4B;EAC3C;;UAGe,oBAAoB,cAAc;EACjD;EACA;EACA;EACA;;EAEA;IACE;IACA;IACA;IACA;;;EAGF;;EAEA;;;EAGA;;UAKe,yBAAyB;EACxC;;EAEA,qBAAqB;EACrB;;EAEA;EACA;EACA;;;UAIe;;EAEf;;EAEA;;EAEA;EACA;;KAGU;EACN;;EAEA,oBAAoB;IAClB,KAAK;EACN;IAAkB;UAER,iBAAiB;EAChC;EACA,SAAS;EACT;EACA;;EAEA;EACA,OAAO;EACP,SAAS;;EAET,gBAAgB;;EAEhB,QAAQ,QAAQ,aAAa,iBAAiB,QAAQ;EACtD,QAAQ,OAAO,IAAI;EACnB,kBAAkB,OAAO,QAAQ;;KAGvB,eAAe;EACrB;EAAiB;EAAgB,OAAO;EAAG,SAAS;;EACpD;EAAkB;EAAiB,OAAO;EAAO,UAAU;;UAEhD;EACf,SAAS;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,gBAAgB;EAChB,WAAW;EACX;EACA;EACA;EACA;EACA;;UAGe;EACf,UAAU;EACV;EACA,OAAO;;UAGQ;;EAEf;;EAEA,SAAS;;;UAIM;EACf;IAAU;IAAkB;;EAC5B,OAAO,0BAA0B;;UAGlB;EACf;EACA,cAAc;;EAEd,oBAAoB;;cAGT,gCAAgC;EAC3C,YACE,oBACA,sBACA,sBACA,eACA;;cAQS,sCAAsC;cAEtC,qCAAqC;EAChD,YAAY,eAAe,mBAAmB;;cAOnC,8BAA8B;WAChC;WACA,UAAU;EAEnB,YACE,iBACA;IAAW;IAAiB,UAAU;IAAa;;;cAQ1C,mCAAmC;WACrC;WACA,UAAU;EAEnB,YAAY,gBAAgB,iBAAiB,UAAU;;cAU5C,gCAAgC;WAClC;WACA,UAAU;WACV,cAAc;EAEvB,YAAY,gBAAgB,gBAAgB,uBAAuB,UAAU;;;cAgClE;mBACM;mBACA;mBACA;mBACA;UACT;UACA;UACA;WACC;mBACQ;EAEjB,YAAY,iBAAiB;EAwDvB,YAAY,GAAG,OAAO,iBAAiB,KAAK,QAAQ,eAAe;;EA8GnE,YAAY,UAAS,wBAA6B;;EA0BxD,UACE,gBACA,UAAU,kBACV;IAAW;IAAkB;MAC5B;EAiBH,KAAK,SAAS,mBAAmB;;EAQjC,YAAY,SAAS,mBAAmB;EAcxC,QAAQ,SAAS,mBAAmB;EAkFpC,cAAc;EAYd;UAIc;UAoDN;UAsCA;UAKM;UAoBN;UAmBA;UAkBA;UAcA;;UAgCA;UAwBA;UAYA;UAMA;;;;;;;;KA0BE,mBAAmB,KAC7B,YACA,cAAc,8CAEd,QAAQ,KAAK;;iBAGC,cAAc;UAIb;EACf;EACA;;iBAGc,aAAa,eAAe,OAAO,YAAY;;iBAc/C,oBACd,SAAS,oBACT,OAAO,KAAK"}
|
|
@@ -108,25 +108,25 @@ var CostLedger = class {
|
|
|
108
108
|
callId,
|
|
109
109
|
error: new CostCallConflictError(`CostLedger: callId '${callId}' already exists`)
|
|
110
110
|
};
|
|
111
|
-
const
|
|
112
|
-
if (
|
|
111
|
+
const admission = this.admissionState();
|
|
112
|
+
if (admission.unresolvedCalls > 0) return {
|
|
113
113
|
succeeded: false,
|
|
114
114
|
callId,
|
|
115
|
-
error: new CostAccountingIncompleteError(`CostLedger: ${
|
|
115
|
+
error: new CostAccountingIncompleteError(`CostLedger: ${admission.unresolvedCalls} unresolved call(s) must be reconciled before new paid work`)
|
|
116
116
|
};
|
|
117
117
|
if (this.costCeilingUsd === void 0) break;
|
|
118
|
-
if (
|
|
118
|
+
if (admission.budgetBreached) return {
|
|
119
119
|
succeeded: false,
|
|
120
120
|
callId,
|
|
121
121
|
error: new CostAccountingIncompleteError(`CostLedger: a settled call exceeded its enforced maximum; refusing paid call '${input.actor}' during '${input.phase}'`)
|
|
122
122
|
};
|
|
123
|
-
const committedCostUsd =
|
|
123
|
+
const { committedCostUsd } = admission;
|
|
124
124
|
if (committedCostUsd + maximumCostUsd > this.costCeilingUsd) return {
|
|
125
125
|
succeeded: false,
|
|
126
126
|
callId,
|
|
127
127
|
error: new CostCeilingReachedError(this.costCeilingUsd, committedCostUsd, maximumCostUsd, input.phase, input.actor)
|
|
128
128
|
};
|
|
129
|
-
if (committedCostUsd +
|
|
129
|
+
if (committedCostUsd + admission.reservedCostUsd + maximumCostUsd <= this.costCeilingUsd) break;
|
|
130
130
|
await this.waitForReservationRelease(input.signal);
|
|
131
131
|
}
|
|
132
132
|
pending = {
|
|
@@ -188,8 +188,8 @@ var CostLedger = class {
|
|
|
188
188
|
}
|
|
189
189
|
/** Settle a call left pending by a crashed process after reconciling with the provider. */
|
|
190
190
|
reconcile(callId, observed, options = {}) {
|
|
191
|
-
const pending =
|
|
192
|
-
if (
|
|
191
|
+
const pending = this.records.get(callId);
|
|
192
|
+
if (pending?.status !== "pending") throw new CostCallConflictError(`CostLedger: no pending call '${callId}'`);
|
|
193
193
|
if (this.activeCallIds.has(callId)) throw new CostCallConflictError(`CostLedger: call '${callId}' is still active`);
|
|
194
194
|
this.ensureCostLimitPersisted(callId);
|
|
195
195
|
return this.commitReceipt(pending, observed, options.failed === true || options.error !== void 0, options.error);
|
|
@@ -407,21 +407,25 @@ var CostLedger = class {
|
|
|
407
407
|
}
|
|
408
408
|
return priced.costUsd;
|
|
409
409
|
}
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
total += record.costUnknown ? record.maximumCostUsd ?? record.costUsd : record.costUsd;
|
|
410
|
+
/** Compute admission totals in record order without building reporting rollups. */
|
|
411
|
+
admissionState() {
|
|
412
|
+
let unresolvedCalls = 0;
|
|
413
|
+
let reservedCostUsd = 0;
|
|
414
|
+
let committedCostUsd = 0;
|
|
415
|
+
let budgetBreached = false;
|
|
416
|
+
for (const record of this.records.values()) if (record.status === "pending") {
|
|
417
|
+
if (!this.activeCallIds.has(record.callId) || this.lateCallIds.has(record.callId)) unresolvedCalls += 1;
|
|
418
|
+
reservedCostUsd += record.maximumCostUsd ?? 0;
|
|
419
|
+
} else {
|
|
420
|
+
if (record.maximumCostUsd !== void 0 && record.costUsd > record.maximumCostUsd) budgetBreached = true;
|
|
421
|
+
committedCostUsd += record.costUnknown ? record.maximumCostUsd ?? record.costUsd : record.costUsd;
|
|
423
422
|
}
|
|
424
|
-
return
|
|
423
|
+
return {
|
|
424
|
+
unresolvedCalls,
|
|
425
|
+
reservedCostUsd,
|
|
426
|
+
committedCostUsd,
|
|
427
|
+
budgetBreached
|
|
428
|
+
};
|
|
425
429
|
}
|
|
426
430
|
appendRecord(record) {
|
|
427
431
|
const callId = record.callId;
|
|
@@ -895,4 +899,4 @@ function assertString(value, name) {
|
|
|
895
899
|
//#endregion
|
|
896
900
|
export { CostLedgerPersistenceError as a, costForTokenPricing as c, CostLedger as i, costForUsage as l, CostCallConflictError as n, CostReceiptCaptureError as o, CostCeilingReachedError as r, CostReservationExceededError as s, CostAccountingIncompleteError as t, modelPriceKey as u };
|
|
897
901
|
|
|
898
|
-
//# sourceMappingURL=cost-ledger-
|
|
902
|
+
//# sourceMappingURL=cost-ledger-D2FnJPBF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-ledger-D2FnJPBF.js","names":[],"sources":["../src/cost-ledger.ts"],"sourcesContent":["import { z } from 'zod'\nimport { ValidationError } from './errors'\nimport { estimateCost, isModelPriced, resolveModelPricing } from './metrics'\n\nexport type CostChannel = 'agent' | 'judge' | 'verifier' | 'analyst' | 'driver' | (string & {})\n\n/** How a USD amount was obtained. */\nexport type CostProvenance =\n | { kind: 'observed'; usd: number }\n | { kind: 'estimated'; usd: number }\n | { kind: 'uncaptured'; usd: null }\n\nexport interface CostUsage {\n inputTokens: number\n /** Includes reasoning tokens when the provider bills them as output. */\n outputTokens: number\n /** Reasoning-token subset of outputTokens, when reported. */\n reasoningTokens?: number\n /** Prompt tokens served from a provider cache. */\n cachedTokens?: number\n /** Prompt tokens written into a provider cache. */\n cacheWriteTokens?: number\n}\n\ninterface CostCallBase {\n callId: string\n channel: CostChannel\n phase: string\n actor: string\n model: string\n maximumCostUsd?: number\n tags?: Record<string, string>\n timestamp: number\n}\n\nexport interface PendingCostCall extends CostCallBase {\n status: 'pending'\n}\n\nexport interface PendingCostCallView extends PendingCostCall {\n state: 'active' | 'late' | 'interrupted'\n}\n\nexport interface CostReceipt extends CostCallBase, CostUsage {\n status: 'settled'\n costUsd: number\n costUnknown: boolean\n usageUnknown?: boolean\n /** Rates used to estimate cost locally. Absent when cost is provider-reported or unknown. */\n pricing?: {\n inputUsdPerThousand: number\n cachedInputUsdPerThousand?: number\n cacheWriteUsdPerThousand?: number\n outputUsdPerThousand: number\n }\n /** Cost reported by the provider, not a local token-price calculation. */\n actualCostUsd?: number\n /** Known non-provider amount supplied by an external executor. */\n estimatedCostUsd?: number\n /** Why the call failed. `'paid-call-failed'` is the ledger's own value for\n * recovery settles; a reconciling caller may record its own reason. */\n error?: string\n}\n\nexport type CostLedgerRecord = PendingCostCall | CostReceipt\n\nexport interface CostReceiptInput extends CostUsage {\n model: string\n /** Caller-supplied rates for a local estimate when the provider does not report billed cost. */\n customTokenPricing?: CustomTokenPricing\n actualCostUsd?: number\n /** A known estimate from an external executor that cannot provide token pricing. */\n estimatedCostUsd?: number\n costUnknown?: boolean\n usageUnknown?: boolean\n}\n\n/** Per-million token rates for a model or endpoint not covered by package pricing. */\nexport interface CustomTokenPricing {\n /** Non-cached input tokens. */\n inputUsdPerMillion: number\n /** Cache-read tokens. Falls back to the normal input rate when omitted. */\n cachedInputUsdPerMillion?: number\n /** Cache-creation or cache-write tokens. Falls back to the normal input rate when omitted. */\n cacheWriteUsdPerMillion?: number\n outputUsdPerMillion: number\n}\n\nexport type MaximumCharge =\n | { externallyEnforcedMaximumUsd: number }\n | ({\n customTokenPricing: CustomTokenPricing\n } & Pick<CostUsage, 'inputTokens' | 'outputTokens' | 'cachedTokens' | 'cacheWriteTokens'>)\n | ({ model: string } & CostUsage)\n\nexport interface RunPaidCallInput<T> {\n callId?: string\n channel: CostChannel\n phase: string\n actor: string\n /** Used before a provider receipt exists and on failures without one. */\n model?: string\n tags?: Record<string, string>\n signal?: AbortSignal\n /** Provider-enforced dollar maximum, or maximum token usage with known pricing. Required when capped. */\n maximumCharge?: MaximumCharge\n /** `callId` can be forwarded as the provider's idempotency key. */\n execute(signal: AbortSignal, callId: string): Promise<T>\n receipt(value: T): CostReceiptInput\n receiptFromError?(error: Error): CostReceiptInput | undefined\n}\n\nexport type PaidCallResult<T> =\n | { succeeded: true; callId: string; value: T; receipt: CostReceipt }\n | { succeeded: false; callId?: string; error: Error; receipt?: CostReceipt }\n\nexport interface ChannelRollup {\n channel: CostChannel\n calls: number\n inputTokens: number\n outputTokens: number\n reasoningTokens?: number\n cachedTokens: number\n cacheWriteTokens?: number\n costUsd: number\n unpricedCalls: number\n unknownUsageCalls: number\n}\n\nexport interface CostLedgerSummary {\n totalCalls: number\n pendingCalls: number\n unresolvedCalls: number\n reservedCostUsd: number\n inputTokens: number\n outputTokens: number\n reasoningTokens?: number\n cachedTokens: number\n cacheWriteTokens?: number\n totalCostUsd: number\n costProvenance: CostProvenance\n byChannel: ChannelRollup[]\n unpricedModels: string[]\n fullyPriced: boolean\n usageComplete: boolean\n accountingComplete: boolean\n incompleteReasons: string[]\n}\n\nexport interface CostLedgerFilter {\n channel?: CostChannel\n phase?: string\n tags?: Record<string, string>\n}\n\nexport interface CostLedgerWaitOptions {\n /** Maximum time to wait for active provider calls. Default 5 seconds. */\n timeoutMs?: number\n /** Wait only for calls matching this attribution filter. */\n filter?: CostLedgerFilter\n}\n\n/** Append-only storage. `append` must atomically reject stale revisions. */\nexport interface CostLedgerPersistence {\n read(): { revision: string; events: string }\n append(expectedRevision: string, event: string): string | undefined\n}\n\nexport interface CostLedgerOptions {\n costCeilingUsd?: number\n persistence?: CostLedgerPersistence\n /** Import already-settled receipts without admitting new paid work. */\n receipts?: readonly CostReceipt[]\n}\n\nexport class CostCeilingReachedError extends ValidationError {\n constructor(\n ceilingUsd: number,\n committedUsd: number,\n requestedUsd: number,\n phase: string,\n actor: string,\n ) {\n super(\n `CostLedger: reserving ${requestedUsd} for '${actor}' during '${phase}' would exceed ceiling ${ceilingUsd} with ${committedUsd} already committed`,\n )\n }\n}\n\nexport class CostAccountingIncompleteError extends ValidationError {}\n\nexport class CostReservationExceededError extends ValidationError {\n constructor(actor: string, actualUsd: number, maximumUsd: number) {\n super(\n `CostLedger: '${actor}' charged ${actualUsd}, exceeding its enforced maximum ${maximumUsd}`,\n )\n }\n}\n\nexport class CostCallConflictError extends ValidationError {\n readonly callId?: string\n readonly receipt?: CostReceipt\n\n constructor(\n message: string,\n options: { callId?: string; receipt?: CostReceipt; cause?: unknown } = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause })\n this.callId = options.callId\n this.receipt = options.receipt ? cloneReceipt(options.receipt) : undefined\n }\n}\n\nexport class CostLedgerPersistenceError extends ValidationError {\n readonly callId?: string\n readonly receipt?: CostReceipt\n\n constructor(cause: unknown, callId?: string, receipt?: CostReceipt) {\n super(\n `CostLedger: failed to persist${callId ? ` call '${callId}'` : ''}: ${toError(cause).message}`,\n { cause },\n )\n this.callId = callId\n this.receipt = receipt ? cloneReceipt(receipt) : undefined\n }\n}\n\nexport class CostReceiptCaptureError extends ValidationError {\n readonly callId: string\n readonly receipt?: CostReceipt\n readonly receiptError: Error\n\n constructor(callId: string, cause: unknown, receiptError: unknown, receipt?: CostReceipt) {\n super(`CostLedger: could not capture the provider receipt for call '${callId}'`, { cause })\n this.callId = callId\n this.receipt = receipt ? cloneReceipt(receipt) : undefined\n this.receiptError = toError(receiptError)\n }\n}\n\ninterface PendingCostCallEvent {\n version: 1\n record: PendingCostCall\n}\n\ninterface SettledCostCallEvent {\n version: 2\n record: CostReceipt\n}\n\ninterface CompletedTasksEvent {\n version: 1\n completedTasks: number\n}\n\ninterface CostLimitEvent {\n version: 1\n costCeilingUsd: number\n}\n\ntype CostCallEvent = PendingCostCallEvent | SettledCostCallEvent\ntype CostLedgerEvent = CostCallEvent | CompletedTasksEvent | CostLimitEvent\n\n/** Run-wide paid-call admission, durable call state, receipts, and summaries. */\nexport class CostLedger {\n private readonly records = new Map<string, CostLedgerRecord>()\n private readonly activeCallIds = new Set<string>()\n private readonly lateCallIds = new Set<string>()\n private readonly idleWaiters = new Set<() => void>()\n private completedTasks = 0\n private revision = 'memory'\n private costLimitPersisted = false\n readonly costCeilingUsd?: number\n private readonly persistence?: CostLedgerPersistence\n\n constructor(input?: number | CostLedgerOptions) {\n const options = typeof input === 'number' ? { costCeilingUsd: input } : (input ?? {})\n this.persistence = options.persistence\n if (options.costCeilingUsd !== undefined) {\n assertNonNegative(options.costCeilingUsd, 'costCeilingUsd')\n }\n\n let persistedCostCeilingUsd: number | undefined\n if (this.persistence) {\n let stored: ReturnType<CostLedgerPersistence['read']>\n try {\n stored = this.persistence.read()\n } catch (cause) {\n throw new CostLedgerPersistenceError(cause)\n }\n assertString(stored.revision, 'persistence revision')\n this.revision = stored.revision\n const restored = parseEvents(stored.events)\n for (const record of restored.records) this.records.set(record.callId, record)\n this.completedTasks = restored.completedTasks\n persistedCostCeilingUsd = restored.costCeilingUsd\n }\n\n if (\n options.costCeilingUsd !== undefined &&\n persistedCostCeilingUsd !== undefined &&\n options.costCeilingUsd !== persistedCostCeilingUsd\n ) {\n throw new ValidationError(\n `CostLedger: requested cost ceiling ${options.costCeilingUsd} does not match persisted ceiling ${persistedCostCeilingUsd}`,\n )\n }\n this.costCeilingUsd = persistedCostCeilingUsd ?? options.costCeilingUsd\n this.costLimitPersisted =\n !this.persistence ||\n this.costCeilingUsd === undefined ||\n persistedCostCeilingUsd !== undefined\n\n if (\n this.costCeilingUsd !== undefined &&\n [...this.records.values()].some(\n (record) => record.status === 'pending' && record.maximumCostUsd === undefined,\n )\n ) {\n throw new ValidationError('CostLedger: capped event log contains an unbounded pending call')\n }\n\n if (options.receipts?.length) {\n const imported = options.receipts.map((receipt, index) =>\n parseImportedReceipt(receipt, `imported receipt ${index + 1}`),\n )\n this.ensureCostLimitPersisted()\n for (const receipt of imported) this.appendRecord(receipt)\n }\n }\n\n async runPaidCall<T>(input: RunPaidCallInput<T>): Promise<PaidCallResult<T>> {\n let callId: string | undefined\n let pending: PendingCostCall | undefined\n try {\n callId = resolveCallId(input.callId)\n validateAttribution(input)\n if (input.signal?.aborted) {\n return { succeeded: false, callId, error: abortError(input.signal) }\n }\n this.ensureCostLimitPersisted(callId)\n\n const maximumCostUsd = this.resolveMaximum(input.maximumCharge)\n const existing = this.records.get(callId)\n if (existing) {\n return {\n succeeded: false,\n callId,\n error: new CostCallConflictError(\n existing.status === 'pending'\n ? `CostLedger: callId '${callId}' is unresolved and must be reconciled before retry`\n : `CostLedger: callId '${callId}' already exists`,\n { callId },\n ),\n }\n }\n\n if (!pending) {\n while (true) {\n if (this.records.has(callId)) {\n return {\n succeeded: false,\n callId,\n error: new CostCallConflictError(`CostLedger: callId '${callId}' already exists`),\n }\n }\n const admission = this.admissionState()\n if (admission.unresolvedCalls > 0) {\n return {\n succeeded: false,\n callId,\n error: new CostAccountingIncompleteError(\n `CostLedger: ${admission.unresolvedCalls} unresolved call(s) must be reconciled before new paid work`,\n ),\n }\n }\n if (this.costCeilingUsd === undefined) break\n if (admission.budgetBreached) {\n return {\n succeeded: false,\n callId,\n error: new CostAccountingIncompleteError(\n `CostLedger: a settled call exceeded its enforced maximum; refusing paid call '${input.actor}' during '${input.phase}'`,\n ),\n }\n }\n // A settled call whose cost the provider left unknown is charged its\n // reserved maximum here, so the ceiling is enforced against a real\n // upper bound and one under-reported response cannot let later calls\n // silently exceed the budget — while still permitting them.\n const { committedCostUsd } = admission\n if (committedCostUsd + maximumCostUsd! > this.costCeilingUsd) {\n return {\n succeeded: false,\n callId,\n error: new CostCeilingReachedError(\n this.costCeilingUsd,\n committedCostUsd,\n maximumCostUsd!,\n input.phase,\n input.actor,\n ),\n }\n }\n if (\n committedCostUsd + admission.reservedCostUsd + maximumCostUsd! <=\n this.costCeilingUsd\n ) {\n break\n }\n await this.waitForReservationRelease(input.signal)\n }\n\n pending = {\n status: 'pending',\n callId,\n channel: input.channel,\n phase: input.phase,\n actor: input.actor,\n model: pendingModel(input),\n ...(maximumCostUsd === undefined ? {} : { maximumCostUsd }),\n ...(input.tags ? { tags: { ...input.tags } } : {}),\n timestamp: Date.now(),\n }\n this.appendRecord(pending)\n this.activeCallIds.add(callId)\n }\n } catch (error) {\n return { succeeded: false, ...(callId ? { callId } : {}), error: toError(error) }\n }\n\n try {\n return await this.execute(input, pending)\n } catch (error) {\n return { succeeded: false, callId: pending.callId, error: toError(error) }\n } finally {\n if (!this.lateCallIds.has(pending.callId)) this.releaseActiveCall(pending.callId)\n }\n }\n\n /** Wait until every call started by this ledger has produced a durable outcome. */\n async waitForIdle(options: CostLedgerWaitOptions = {}): Promise<boolean> {\n const hasActiveMatch = (): boolean =>\n [...this.activeCallIds].some((callId) => {\n const record = this.records.get(callId)\n return record !== undefined && matches(record, options.filter)\n })\n if (!hasActiveMatch()) return true\n const timeoutMs = options.timeoutMs ?? 5_000\n assertTimeout(timeoutMs, 'waitForIdle.timeoutMs')\n return new Promise<boolean>((resolve) => {\n let timer: ReturnType<typeof setTimeout> | undefined\n const finish = (settled: boolean): void => {\n this.idleWaiters.delete(onIdle)\n if (timer !== undefined) clearTimeout(timer)\n resolve(settled)\n }\n const onIdle = (): void => {\n if (!hasActiveMatch()) finish(true)\n }\n this.idleWaiters.add(onIdle)\n timer = setTimeout(() => finish(false), timeoutMs)\n onIdle()\n })\n }\n\n /** Settle a call left pending by a crashed process after reconciling with the provider. */\n reconcile(\n callId: string,\n observed: CostReceiptInput,\n options: { failed?: boolean; error?: string } = {},\n ): CostReceipt {\n const pending = this.records.get(callId)\n if (pending?.status !== 'pending') {\n throw new CostCallConflictError(`CostLedger: no pending call '${callId}'`)\n }\n if (this.activeCallIds.has(callId)) {\n throw new CostCallConflictError(`CostLedger: call '${callId}' is still active`)\n }\n this.ensureCostLimitPersisted(callId)\n return this.commitReceipt(\n pending,\n observed,\n options.failed === true || options.error !== undefined,\n options.error,\n )\n }\n\n list(filter?: CostLedgerFilter): CostReceipt[] {\n return [...this.records.values()]\n .filter((record): record is CostReceipt => record.status === 'settled')\n .filter((receipt) => matches(receipt, filter))\n .map(cloneReceipt)\n }\n\n /** Read pending calls without exposing mutable ledger state. */\n listPending(filter?: CostLedgerFilter): PendingCostCallView[] {\n return [...this.records.values()]\n .filter((record): record is PendingCostCall => record.status === 'pending')\n .filter((record) => matches(record, filter))\n .map((record) => ({\n ...clonePendingCall(record),\n state: this.lateCallIds.has(record.callId)\n ? 'late'\n : this.activeCallIds.has(record.callId)\n ? 'active'\n : 'interrupted',\n }))\n }\n\n summary(filter?: CostLedgerFilter): CostLedgerSummary {\n const records = [...this.records.values()].filter((record) => matches(record, filter))\n const pending = records.filter(\n (record): record is PendingCostCall => record.status === 'pending',\n )\n const receipts = records.filter((record): record is CostReceipt => record.status === 'settled')\n const byChannel = new Map<string, ChannelRollup>()\n const unpriced = new Set<string>()\n const incompleteReasons: string[] = pending.map(\n (record) => `call '${record.callId}' for '${record.actor}' is pending`,\n )\n let inputTokens = 0\n let outputTokens = 0\n let reasoningTokens = 0\n let cachedTokens = 0\n let cacheWriteTokens = 0\n let totalCostUsd = 0\n\n for (const receipt of receipts) {\n inputTokens += receipt.inputTokens\n outputTokens += receipt.outputTokens\n reasoningTokens += receipt.reasoningTokens ?? 0\n cachedTokens += receipt.cachedTokens ?? 0\n cacheWriteTokens += receipt.cacheWriteTokens ?? 0\n totalCostUsd += receipt.costUsd\n if (receipt.costUnknown) {\n unpriced.add(receipt.model)\n incompleteReasons.push(\n receipt.error ?? `cost unknown for '${receipt.actor}' using '${receipt.model}'`,\n )\n }\n if (receipt.usageUnknown) {\n incompleteReasons.push(\n `token usage unknown for '${receipt.actor}' using '${receipt.model}'`,\n )\n }\n if (receipt.maximumCostUsd !== undefined && receipt.costUsd > receipt.maximumCostUsd) {\n incompleteReasons.push(\n `'${receipt.actor}' charged ${receipt.costUsd}, exceeding its enforced maximum ${receipt.maximumCostUsd}`,\n )\n }\n const rollup = byChannel.get(receipt.channel) ?? emptyRollup(receipt.channel)\n rollup.calls += 1\n rollup.inputTokens += receipt.inputTokens\n rollup.outputTokens += receipt.outputTokens\n rollup.reasoningTokens = (rollup.reasoningTokens ?? 0) + (receipt.reasoningTokens ?? 0)\n rollup.cachedTokens += receipt.cachedTokens ?? 0\n rollup.cacheWriteTokens = (rollup.cacheWriteTokens ?? 0) + (receipt.cacheWriteTokens ?? 0)\n rollup.costUsd += receipt.costUsd\n if (receipt.costUnknown) rollup.unpricedCalls += 1\n if (receipt.usageUnknown) rollup.unknownUsageCalls += 1\n byChannel.set(receipt.channel, rollup)\n }\n\n return {\n totalCalls: receipts.length,\n pendingCalls: pending.length,\n unresolvedCalls: pending.filter(\n (record) => !this.activeCallIds.has(record.callId) || this.lateCallIds.has(record.callId),\n ).length,\n reservedCostUsd: pending.reduce((sum, record) => sum + (record.maximumCostUsd ?? 0), 0),\n inputTokens,\n outputTokens,\n reasoningTokens,\n cachedTokens,\n cacheWriteTokens,\n totalCostUsd,\n costProvenance:\n pending.length > 0 || receipts.some((receipt) => receipt.costUnknown)\n ? { kind: 'uncaptured', usd: null }\n : receipts.every((receipt) => receipt.actualCostUsd !== undefined)\n ? { kind: 'observed', usd: totalCostUsd }\n : { kind: 'estimated', usd: totalCostUsd },\n byChannel: [...byChannel.values()].sort((a, b) => a.channel.localeCompare(b.channel)),\n unpricedModels: [...unpriced].sort(),\n fullyPriced: unpriced.size === 0,\n usageComplete: pending.length === 0 && receipts.every((receipt) => !receipt.usageUnknown),\n accountingComplete: incompleteReasons.length === 0,\n incompleteReasons: [...new Set(incompleteReasons)],\n }\n }\n\n markCompleted(count = 1): void {\n if (!Number.isInteger(count) || count < 0) {\n throw new ValidationError(\n `CostLedger.markCompleted: count must be a non-negative integer, got ${count}`,\n )\n }\n if (count === 0) return\n this.ensureCostLimitPersisted()\n this.appendEvent({ version: 1, completedTasks: count })\n this.completedTasks += count\n }\n\n costPerCompletedTask(): number | null {\n return this.completedTasks === 0 ? null : this.summary().totalCostUsd / this.completedTasks\n }\n\n private async execute<T>(\n input: RunPaidCallInput<T>,\n pending: PendingCostCall,\n ): Promise<PaidCallResult<T>> {\n const signal = input.signal ?? new AbortController().signal\n if (signal.aborted) {\n return this.commitOutcome(pending, abortError(signal), {\n model: pending.model,\n inputTokens: 0,\n outputTokens: 0,\n actualCostUsd: 0,\n })\n }\n\n const operation = Promise.resolve().then(() => input.execute(signal, pending.callId))\n const settled = await settle(operation, signal)\n if (settled.kind === 'aborted') {\n this.lateCallIds.add(pending.callId)\n this.captureLateOutcome(input, pending, operation)\n return paidFailure(pending.callId, abortError(signal))\n }\n if (settled.kind === 'error') {\n let observed: CostReceiptInput | undefined\n try {\n observed = input.receiptFromError?.(settled.error)\n } catch (receiptError) {\n return this.captureFailure(pending, settled.error, receiptError)\n }\n return this.commitOutcome(pending, settled.error, observed ?? unknownReceipt(pending.model))\n }\n\n try {\n const receipt = this.commitReceipt(pending, input.receipt(settled.value))\n if (receipt.maximumCostUsd !== undefined && receipt.costUsd > receipt.maximumCostUsd) {\n return paidFailure(\n pending.callId,\n new CostReservationExceededError(pending.actor, receipt.costUsd, receipt.maximumCostUsd),\n receipt,\n )\n }\n return { succeeded: true, callId: pending.callId, value: settled.value, receipt }\n } catch (receiptError) {\n if (\n receiptError instanceof CostLedgerPersistenceError ||\n receiptError instanceof CostCallConflictError\n ) {\n return paidFailure(pending.callId, receiptError)\n }\n return this.captureFailure(pending, receiptError, receiptError)\n }\n }\n\n private captureLateOutcome<T>(\n input: RunPaidCallInput<T>,\n pending: PendingCostCall,\n operation: Promise<T>,\n ): void {\n void operation\n .then(\n (value) => {\n if (this.records.get(pending.callId)?.status !== 'pending') return\n try {\n this.commitReceipt(pending, input.receipt(value))\n } catch {\n // A failed durable settlement leaves the reservation pending and blocks new paid work.\n }\n },\n (cause) => {\n if (this.records.get(pending.callId)?.status !== 'pending') return\n const error = toError(cause)\n try {\n const observed = input.receiptFromError?.(error)\n this.commitReceipt(pending, observed ?? unknownReceipt(pending.model), true)\n } catch (receiptError) {\n if (\n receiptError instanceof CostLedgerPersistenceError ||\n receiptError instanceof CostCallConflictError\n ) {\n return\n }\n this.captureFailure(pending, error, receiptError)\n }\n },\n )\n .finally(() => {\n this.lateCallIds.delete(pending.callId)\n this.releaseActiveCall(pending.callId)\n })\n }\n\n private releaseActiveCall(callId: string): void {\n this.activeCallIds.delete(callId)\n for (const resolve of [...this.idleWaiters]) resolve()\n }\n\n private async waitForReservationRelease(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) throw abortError(signal)\n await new Promise<void>((resolve, reject) => {\n let finished = false\n const finish = (error?: Error): void => {\n if (finished) return\n finished = true\n this.idleWaiters.delete(onRelease)\n signal?.removeEventListener('abort', onAbort)\n if (error) reject(error)\n else resolve()\n }\n const onRelease = (): void => finish()\n const onAbort = (): void => finish(abortError(signal!))\n this.idleWaiters.add(onRelease)\n signal?.addEventListener('abort', onAbort, { once: true })\n if (this.activeCallIds.size === 0) onRelease()\n })\n }\n\n private commitOutcome<T>(\n pending: PendingCostCall,\n error: Error,\n observed: CostReceiptInput,\n ): PaidCallResult<T> {\n try {\n const receipt = this.commitReceipt(pending, observed, true)\n return paidFailure(pending.callId, error, receipt)\n } catch (receiptError) {\n if (\n receiptError instanceof CostLedgerPersistenceError ||\n receiptError instanceof CostCallConflictError\n ) {\n return paidFailure(pending.callId, receiptError)\n }\n return this.captureFailure(pending, error, receiptError)\n }\n }\n\n private captureFailure<T>(\n pending: PendingCostCall,\n cause: unknown,\n receiptError: unknown,\n ): PaidCallResult<T> {\n try {\n const receipt = this.commitReceipt(pending, unknownReceipt(pending.model), true)\n return paidFailure(\n pending.callId,\n new CostReceiptCaptureError(pending.callId, cause, receiptError, receipt),\n receipt,\n )\n } catch (error) {\n const typed = error instanceof Error ? error : toError(error)\n return paidFailure(pending.callId, typed)\n }\n }\n\n private commitReceipt(\n pending: PendingCostCall,\n observed: CostReceiptInput,\n failed = false,\n error?: string,\n ): CostReceipt {\n const receipt = buildReceipt(pending, observed, failed, error)\n if (this.records.get(pending.callId)?.status !== 'pending') {\n throw new CostCallConflictError(`CostLedger: call '${pending.callId}' is not pending`)\n }\n this.appendRecord(receipt)\n return cloneReceipt(receipt)\n }\n\n private resolveMaximum(maximum: MaximumCharge | undefined): number | undefined {\n if (!maximum) {\n if (this.costCeilingUsd !== undefined) {\n throw new CostAccountingIncompleteError(\n 'CostLedger: capped paid calls require a hard maximumCharge before execution',\n )\n }\n return undefined\n }\n if ('externallyEnforcedMaximumUsd' in maximum) {\n assertNonNegative(\n maximum.externallyEnforcedMaximumUsd,\n 'maximumCharge.externallyEnforcedMaximumUsd',\n )\n return maximum.externallyEnforcedMaximumUsd\n }\n if ('customTokenPricing' in maximum) {\n return costForTokenPricing(maximum.customTokenPricing, maximum)\n }\n const priced = costForUsage(maximum.model, maximum)\n if (priced.costUnknown) {\n if (this.costCeilingUsd !== undefined) {\n throw new CostAccountingIncompleteError(\n `CostLedger: cannot reserve unpriced model '${maximum.model}' in a capped run`,\n )\n }\n return undefined\n }\n return priced.costUsd\n }\n\n /** Compute admission totals in record order without building reporting rollups. */\n private admissionState() {\n let unresolvedCalls = 0\n let reservedCostUsd = 0\n let committedCostUsd = 0\n let budgetBreached = false\n for (const record of this.records.values()) {\n if (record.status === 'pending') {\n if (!this.activeCallIds.has(record.callId) || this.lateCallIds.has(record.callId)) {\n unresolvedCalls += 1\n }\n reservedCostUsd += record.maximumCostUsd ?? 0\n } else {\n if (record.maximumCostUsd !== undefined && record.costUsd > record.maximumCostUsd) {\n budgetBreached = true\n }\n // Unknown settled costs consume their reserved maximum for admission.\n committedCostUsd += record.costUnknown\n ? (record.maximumCostUsd ?? record.costUsd)\n : record.costUsd\n }\n }\n return { unresolvedCalls, reservedCostUsd, committedCostUsd, budgetBreached }\n }\n\n private appendRecord(record: CostLedgerRecord): void {\n const callId = record.callId\n const receipt = record.status === 'settled' ? record : undefined\n validateTransition(this.records, record)\n const event: CostCallEvent =\n record.status === 'settled'\n ? { version: 2, record: cloneReceipt(record) }\n : { version: 1, record: clonePendingCall(record) }\n this.appendEvent(event, callId, receipt)\n this.records.set(callId, cloneRecord(record))\n }\n\n private ensureCostLimitPersisted(callId?: string): void {\n if (this.costLimitPersisted || this.costCeilingUsd === undefined) return\n this.appendEvent({ version: 1, costCeilingUsd: this.costCeilingUsd }, callId)\n this.costLimitPersisted = true\n }\n\n private appendEvent(event: CostLedgerEvent, callId?: string, receipt?: CostReceipt): void {\n try {\n if (this.persistence) {\n const nextRevision = this.persistence.append(this.revision, `${JSON.stringify(event)}\\n`)\n if (nextRevision === undefined) {\n throw new CostCallConflictError(\n `CostLedger: persisted revision changed while writing call '${callId}'`,\n { callId, receipt },\n )\n }\n assertString(nextRevision, 'persistence revision')\n this.revision = nextRevision\n }\n } catch (cause) {\n if (cause instanceof CostCallConflictError) throw cause\n throw new CostLedgerPersistenceError(cause, callId, receipt)\n }\n }\n}\n\n/** Public callback surface for a shared cost ledger.\n *\n * Declaration bundles may expose this type through multiple package subpaths.\n * Keeping callback contracts structural lets those subpaths compose while the\n * concrete {@link CostLedger} retains its private durable state.\n */\nexport type CostLedgerHandle = Pick<\n CostLedger,\n Exclude<keyof CostLedger, 'listPending' | 'waitForIdle'>\n> &\n Partial<Pick<CostLedger, 'listPending' | 'waitForIdle'>>\n\n/** Return the canonical pricing-table key, or null when the model is unpriced. */\nexport function modelPriceKey(model: string): string | null {\n return isModelPriced(model) ? model : null\n}\n\nexport interface CostResult {\n costUsd: number\n costUnknown: boolean\n}\n\nexport function costForUsage(model: string, usage: CostUsage): CostResult {\n assertUsage(usage)\n if (!resolveModelPricing(model)) return { costUsd: 0, costUnknown: true }\n return {\n costUsd: estimateCost(\n usage.inputTokens + (usage.cachedTokens ?? 0) + (usage.cacheWriteTokens ?? 0),\n usage.outputTokens,\n model,\n ),\n costUnknown: false,\n }\n}\n\n/** Price token counts with caller-supplied per-million rates. */\nexport function costForTokenPricing(\n pricing: CustomTokenPricing,\n usage: Pick<CostUsage, 'inputTokens' | 'outputTokens' | 'cachedTokens' | 'cacheWriteTokens'>,\n): number {\n assertTokenCount(usage.inputTokens, 'usage.inputTokens')\n assertTokenCount(usage.outputTokens, 'usage.outputTokens')\n if (usage.cachedTokens !== undefined) {\n assertTokenCount(usage.cachedTokens, 'usage.cachedTokens')\n }\n if (usage.cacheWriteTokens !== undefined) {\n assertTokenCount(usage.cacheWriteTokens, 'usage.cacheWriteTokens')\n }\n assertNonNegative(pricing.inputUsdPerMillion, 'pricing.inputUsdPerMillion')\n if (pricing.cachedInputUsdPerMillion !== undefined) {\n assertNonNegative(pricing.cachedInputUsdPerMillion, 'pricing.cachedInputUsdPerMillion')\n }\n if (pricing.cacheWriteUsdPerMillion !== undefined) {\n assertNonNegative(pricing.cacheWriteUsdPerMillion, 'pricing.cacheWriteUsdPerMillion')\n }\n assertNonNegative(pricing.outputUsdPerMillion, 'pricing.outputUsdPerMillion')\n const cachedInputRate = pricing.cachedInputUsdPerMillion ?? pricing.inputUsdPerMillion\n const cacheWriteRate = pricing.cacheWriteUsdPerMillion ?? pricing.inputUsdPerMillion\n return (\n (usage.inputTokens / 1_000_000) * pricing.inputUsdPerMillion +\n ((usage.cachedTokens ?? 0) / 1_000_000) * cachedInputRate +\n ((usage.cacheWriteTokens ?? 0) / 1_000_000) * cacheWriteRate +\n (usage.outputTokens / 1_000_000) * pricing.outputUsdPerMillion\n )\n}\n\ntype Settled<T> =\n | { kind: 'value'; value: T }\n | { kind: 'error'; error: Error }\n | { kind: 'aborted' }\n\nasync function settle<T>(promise: Promise<T>, signal: AbortSignal): Promise<Settled<T>> {\n return await new Promise((resolve) => {\n let done = false\n const finish = (value: Settled<T>): void => {\n if (done) return\n done = true\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n }\n const onAbort = () => finish({ kind: 'aborted' })\n signal.addEventListener('abort', onAbort, { once: true })\n if (signal.aborted) onAbort()\n promise.then(\n (value) => finish({ kind: 'value', value }),\n (error) => finish({ kind: 'error', error: toError(error) }),\n )\n })\n}\n\nfunction buildReceipt(\n pending: PendingCostCall,\n observed: CostReceiptInput,\n failed = false,\n error?: string,\n): CostReceipt {\n assertUsage(observed)\n assertString(observed.model, 'receipt.model')\n const suppliedAmounts = [\n observed.actualCostUsd,\n observed.estimatedCostUsd,\n observed.customTokenPricing,\n ].filter((value) => value !== undefined)\n if (suppliedAmounts.length > 1) {\n throw new ValidationError(\n 'CostLedger: a receipt can have only one of actualCostUsd, estimatedCostUsd, or customTokenPricing',\n )\n }\n const customPricingSnapshot =\n observed.customTokenPricing === undefined\n ? undefined\n : pricingSnapshot(observed.customTokenPricing)\n const estimated = customPricingSnapshot\n ? {\n costUsd: costFromPricing(observed, customPricingSnapshot),\n costUnknown: false,\n }\n : costForUsage(observed.model, observed)\n const hasActual = observed.actualCostUsd !== undefined\n const hasExternalEstimate = observed.estimatedCostUsd !== undefined\n if (hasActual && observed.costUnknown === true) {\n throw new ValidationError(\n 'CostLedger: a receipt cannot have both actualCostUsd and costUnknown=true',\n )\n }\n if (hasActual) assertNonNegative(observed.actualCostUsd!, 'actualCostUsd')\n if (hasExternalEstimate) assertNonNegative(observed.estimatedCostUsd!, 'estimatedCostUsd')\n if (hasExternalEstimate && observed.costUnknown === true) {\n throw new ValidationError(\n 'CostLedger: a receipt cannot have both estimatedCostUsd and costUnknown=true',\n )\n }\n const usageUnknown = observed.usageUnknown === true\n const costUnknown =\n observed.costUnknown === true ||\n (!hasActual && !hasExternalEstimate && (usageUnknown || estimated.costUnknown))\n const resolvedModelPricing =\n !customPricingSnapshot && !hasActual && !hasExternalEstimate && !costUnknown\n ? resolveModelPricing(observed.model)\n : null\n const receiptPricing =\n !hasActual && !hasExternalEstimate && !costUnknown\n ? (customPricingSnapshot ??\n (resolvedModelPricing\n ? {\n inputUsdPerThousand: resolvedModelPricing.input,\n outputUsdPerThousand: resolvedModelPricing.output,\n }\n : undefined))\n : undefined\n return parseReceipt(\n {\n status: 'settled',\n callId: pending.callId,\n channel: pending.channel,\n phase: pending.phase,\n actor: pending.actor,\n model: observed.model,\n inputTokens: observed.inputTokens,\n outputTokens: observed.outputTokens,\n ...(observed.reasoningTokens === undefined\n ? {}\n : { reasoningTokens: observed.reasoningTokens }),\n ...(observed.cachedTokens === undefined ? {} : { cachedTokens: observed.cachedTokens }),\n ...(observed.cacheWriteTokens === undefined\n ? {}\n : { cacheWriteTokens: observed.cacheWriteTokens }),\n costUsd: costUnknown\n ? 0\n : hasActual\n ? observed.actualCostUsd!\n : hasExternalEstimate\n ? observed.estimatedCostUsd!\n : estimated.costUsd,\n costUnknown,\n usageUnknown,\n ...(receiptPricing ? { pricing: receiptPricing } : {}),\n ...(hasActual ? { actualCostUsd: observed.actualCostUsd } : {}),\n ...(hasExternalEstimate ? { estimatedCostUsd: observed.estimatedCostUsd } : {}),\n ...(pending.maximumCostUsd === undefined ? {} : { maximumCostUsd: pending.maximumCostUsd }),\n ...(failed ? { error: error ?? 'paid-call-failed' } : {}),\n ...(pending.tags ? { tags: { ...pending.tags } } : {}),\n timestamp: pending.timestamp,\n },\n 'provider receipt',\n )\n}\n\nconst NonEmptyString = z.string().refine((value) => value.trim().length > 0, 'must be non-empty')\nconst TokenCount = z.number().int().nonnegative().finite()\nconst NonNegative = z.number().nonnegative().finite()\nconst Tags = z.record(NonEmptyString, z.string())\nconst CostPricingSchema = z.strictObject({\n inputUsdPerThousand: NonNegative,\n cachedInputUsdPerThousand: NonNegative.optional(),\n cacheWriteUsdPerThousand: NonNegative.optional(),\n outputUsdPerThousand: NonNegative,\n})\nconst CostCallBaseShape = {\n callId: NonEmptyString,\n channel: NonEmptyString,\n phase: NonEmptyString,\n actor: NonEmptyString,\n model: NonEmptyString,\n maximumCostUsd: NonNegative.optional(),\n tags: Tags.optional(),\n timestamp: NonNegative,\n}\nconst PendingCostCallSchema = z.strictObject({\n status: z.literal('pending'),\n ...CostCallBaseShape,\n})\nconst CostReceiptBaseShape = {\n status: z.literal('settled'),\n ...CostCallBaseShape,\n inputTokens: TokenCount,\n outputTokens: TokenCount,\n cachedTokens: TokenCount.optional(),\n costUsd: NonNegative,\n costUnknown: z.boolean(),\n usageUnknown: z.boolean().default(false),\n pricing: CostPricingSchema.optional(),\n actualCostUsd: NonNegative.optional(),\n estimatedCostUsd: NonNegative.optional(),\n error: NonEmptyString.optional(),\n}\nconst CostReceiptSchema = z\n .strictObject({\n ...CostReceiptBaseShape,\n reasoningTokens: TokenCount.optional(),\n cacheWriteTokens: TokenCount.optional(),\n })\n .superRefine((receipt, ctx) => validateCostReceipt(receipt, ctx))\n\nfunction validateCostReceipt(\n receipt: CostUsage & {\n costUsd: number\n costUnknown: boolean\n usageUnknown: boolean\n pricing?: NonNullable<CostReceipt['pricing']>\n actualCostUsd?: number\n estimatedCostUsd?: number\n },\n ctx: z.RefinementCtx,\n): void {\n if (receipt.reasoningTokens !== undefined && receipt.reasoningTokens > receipt.outputTokens) {\n ctx.addIssue({ code: 'custom', message: 'reasoningTokens must not exceed outputTokens' })\n }\n\n if (receipt.actualCostUsd !== undefined && receipt.estimatedCostUsd !== undefined) {\n ctx.addIssue({\n code: 'custom',\n message: 'actual and external estimated costs cannot both be present',\n })\n }\n\n if (receipt.actualCostUsd !== undefined) {\n if (receipt.costUnknown || receipt.costUsd !== receipt.actualCostUsd) {\n ctx.addIssue({ code: 'custom', message: 'actual cost must be known and equal costUsd' })\n }\n if (receipt.pricing !== undefined) {\n ctx.addIssue({ code: 'custom', message: 'actual cost must not include estimated pricing' })\n }\n return\n }\n\n if (receipt.estimatedCostUsd !== undefined) {\n if (receipt.costUnknown || receipt.costUsd !== receipt.estimatedCostUsd) {\n ctx.addIssue({ code: 'custom', message: 'external estimate must be known and equal costUsd' })\n }\n if (receipt.pricing !== undefined) {\n ctx.addIssue({ code: 'custom', message: 'external estimate must not include token pricing' })\n }\n return\n }\n\n if (receipt.costUnknown) {\n if (receipt.costUsd !== 0) {\n ctx.addIssue({ code: 'custom', message: 'unknown cost must have costUsd 0' })\n }\n if (receipt.pricing !== undefined) {\n ctx.addIssue({ code: 'custom', message: 'unknown cost must not include estimated pricing' })\n }\n return\n }\n\n if (receipt.usageUnknown) {\n ctx.addIssue({ code: 'custom', message: 'known estimated cost requires known usage' })\n }\n if (!receipt.pricing) {\n ctx.addIssue({ code: 'custom', message: 'known estimated cost requires a pricing snapshot' })\n return\n }\n\n const expected = costFromPricing(receipt, receipt.pricing)\n if (!costAmountsMatch(receipt.costUsd, expected)) {\n ctx.addIssue({\n code: 'custom',\n message: `estimated cost ${receipt.costUsd} does not match pricing snapshot ${expected}`,\n })\n }\n}\n\nfunction costAmountsMatch(left: number, right: number): boolean {\n const scale = Math.max(1, Math.abs(left), Math.abs(right))\n return Math.abs(left - right) <= Number.EPSILON * scale * 8\n}\n\nconst CostLedgerEventSchema = z.union([\n z.strictObject({\n version: z.literal(1),\n record: PendingCostCallSchema,\n }),\n z.strictObject({\n version: z.literal(2),\n record: CostReceiptSchema,\n }),\n z.strictObject({\n version: z.literal(1),\n completedTasks: TokenCount,\n }),\n z.strictObject({\n version: z.literal(1),\n costCeilingUsd: NonNegative,\n }),\n])\n\nfunction parseEvents(serialized: string): {\n records: CostLedgerRecord[]\n completedTasks: number\n costCeilingUsd?: number\n} {\n const records = new Map<string, CostLedgerRecord>()\n let completedTasks = 0\n let costCeilingUsd: number | undefined\n let lineNumber = 0\n try {\n for (const line of completeJournalPrefix(serialized).split('\\n')) {\n if (!line.trim()) continue\n lineNumber += 1\n const event = CostLedgerEventSchema.parse(JSON.parse(line)) as CostLedgerEvent\n if ('record' in event) {\n const record = event.record\n validateTransition(records, record)\n records.set(record.callId, cloneRecord(record))\n } else if ('completedTasks' in event) {\n completedTasks += event.completedTasks\n if (!Number.isSafeInteger(completedTasks)) {\n throw new ValidationError('CostLedger: completed task count exceeds safe integer range')\n }\n } else {\n if (costCeilingUsd !== undefined) {\n throw new ValidationError('CostLedger: duplicate persisted cost ceiling')\n }\n costCeilingUsd = event.costCeilingUsd\n }\n }\n return {\n records: [...records.values()],\n completedTasks,\n ...(costCeilingUsd === undefined ? {} : { costCeilingUsd }),\n }\n } catch (cause) {\n throw new ValidationError(\n `CostLedger: invalid persisted event ${lineNumber || 1}: ${validationMessage(cause)}`,\n { cause },\n )\n }\n}\n\nfunction completeJournalPrefix(serialized: string): string {\n if (!serialized || serialized.endsWith('\\n')) return serialized\n const finalNewline = serialized.lastIndexOf('\\n')\n const tail = serialized.slice(finalNewline + 1)\n try {\n JSON.parse(tail)\n } catch {\n return finalNewline < 0 ? '' : serialized.slice(0, finalNewline + 1)\n }\n throw new ValidationError(\n 'CostLedger: complete final persisted event is missing its newline terminator',\n )\n}\n\nfunction validateTransition(\n records: ReadonlyMap<string, CostLedgerRecord>,\n record: CostLedgerRecord,\n): void {\n const current = records.get(record.callId)\n if (!current) return\n if (record.status === 'pending' || current.status === 'settled') {\n throw new CostCallConflictError(`CostLedger: duplicate callId '${record.callId}'`)\n }\n if (!sameAttribution(current, record)) {\n throw new ValidationError(`CostLedger: receipt attribution changed for call '${record.callId}'`)\n }\n}\n\nfunction sameAttribution(before: CostCallBase, after: CostCallBase): boolean {\n return (\n before.channel === after.channel &&\n before.phase === after.phase &&\n before.actor === after.actor &&\n before.maximumCostUsd === after.maximumCostUsd &&\n before.timestamp === after.timestamp &&\n sameTags(before.tags, after.tags)\n )\n}\n\nfunction sameTags(\n left: Readonly<Record<string, string>> | undefined,\n right: Readonly<Record<string, string>> | undefined,\n): boolean {\n const leftEntries = Object.entries(left ?? {}).sort(([a], [b]) => a.localeCompare(b))\n const rightEntries = Object.entries(right ?? {}).sort(([a], [b]) => a.localeCompare(b))\n return JSON.stringify(leftEntries) === JSON.stringify(rightEntries)\n}\n\nfunction parseReceipt(value: unknown, path: string): CostReceipt {\n try {\n return CostReceiptSchema.parse(value) as CostReceipt\n } catch (cause) {\n throw new ValidationError(`CostLedger: invalid ${path}: ${validationMessage(cause)}`, { cause })\n }\n}\n\nfunction parseImportedReceipt(value: unknown, path: string): CostReceipt {\n if (typeof value !== 'object' || value === null) return parseReceipt(value, path)\n const candidate = { ...value } as Record<string, unknown>\n if (\n candidate.status === 'settled' &&\n candidate.actualCostUsd === undefined &&\n candidate.estimatedCostUsd === undefined &&\n candidate.costUnknown === false &&\n candidate.pricing === undefined &&\n typeof candidate.model === 'string'\n ) {\n const pricing = resolveModelPricing(candidate.model)\n if (pricing) {\n candidate.pricing = {\n inputUsdPerThousand: pricing.input,\n outputUsdPerThousand: pricing.output,\n }\n }\n }\n return parseReceipt(candidate, path)\n}\n\nfunction validateAttribution(\n input: Pick<RunPaidCallInput<unknown>, 'channel' | 'phase' | 'actor' | 'model' | 'tags'>,\n): void {\n assertString(input.channel, 'channel')\n assertString(input.phase, 'phase')\n assertString(input.actor, 'actor')\n if (input.model !== undefined) assertString(input.model, 'model')\n if (input.tags !== undefined) {\n const parsed = Tags.safeParse(input.tags)\n if (!parsed.success)\n throw new ValidationError(`CostLedger: invalid tags: ${parsed.error.message}`)\n }\n}\n\nfunction matches(record: CostCallBase, filter: CostLedgerFilter | undefined): boolean {\n if (!filter) return true\n if (filter.channel !== undefined && record.channel !== filter.channel) return false\n if (filter.phase !== undefined && record.phase !== filter.phase) return false\n return Object.entries(filter.tags ?? {}).every(([key, value]) => record.tags?.[key] === value)\n}\n\nfunction cloneRecord(record: CostLedgerRecord): CostLedgerRecord {\n if (record.status === 'settled') return cloneReceipt(record)\n return clonePendingCall(record)\n}\n\nfunction clonePendingCall(record: PendingCostCall): PendingCostCall {\n const { tags, ...rest } = record\n return { ...rest, ...(tags ? { tags: { ...tags } } : {}) }\n}\n\nfunction cloneReceipt(receipt: CostReceipt): CostReceipt {\n const { pricing, tags, ...rest } = receipt\n return {\n ...rest,\n ...(tags ? { tags: { ...tags } } : {}),\n ...(pricing ? { pricing: { ...pricing } } : {}),\n }\n}\n\nfunction costFromPricing(usage: CostUsage, pricing: NonNullable<CostReceipt['pricing']>): number {\n const cachedInputRate = pricing.cachedInputUsdPerThousand ?? pricing.inputUsdPerThousand\n const cacheWriteRate = pricing.cacheWriteUsdPerThousand ?? pricing.inputUsdPerThousand\n return (\n (usage.inputTokens / 1000) * pricing.inputUsdPerThousand +\n ((usage.cachedTokens ?? 0) / 1000) * cachedInputRate +\n ((usage.cacheWriteTokens ?? 0) / 1000) * cacheWriteRate +\n (usage.outputTokens / 1000) * pricing.outputUsdPerThousand\n )\n}\n\nfunction pricingSnapshot(pricing: CustomTokenPricing): NonNullable<CostReceipt['pricing']> {\n costForTokenPricing(pricing, { inputTokens: 0, outputTokens: 0 })\n return {\n inputUsdPerThousand: pricing.inputUsdPerMillion / 1000,\n ...(pricing.cachedInputUsdPerMillion === undefined\n ? {}\n : { cachedInputUsdPerThousand: pricing.cachedInputUsdPerMillion / 1000 }),\n ...(pricing.cacheWriteUsdPerMillion === undefined\n ? {}\n : { cacheWriteUsdPerThousand: pricing.cacheWriteUsdPerMillion / 1000 }),\n outputUsdPerThousand: pricing.outputUsdPerMillion / 1000,\n }\n}\n\nfunction emptyRollup(channel: CostChannel): ChannelRollup {\n return {\n channel,\n calls: 0,\n inputTokens: 0,\n outputTokens: 0,\n reasoningTokens: 0,\n cachedTokens: 0,\n cacheWriteTokens: 0,\n costUsd: 0,\n unpricedCalls: 0,\n unknownUsageCalls: 0,\n }\n}\n\nfunction pendingModel(input: RunPaidCallInput<unknown>): string {\n if (input.model) return input.model\n if (input.maximumCharge && 'model' in input.maximumCharge) return input.maximumCharge.model\n return 'unknown'\n}\n\nfunction unknownReceipt(model: string): CostReceiptInput {\n return { model, inputTokens: 0, outputTokens: 0, costUnknown: true, usageUnknown: true }\n}\n\nfunction resolveCallId(input: string | undefined): string {\n if (input !== undefined) {\n assertString(input, 'callId')\n return input\n }\n if (typeof globalThis.crypto?.randomUUID !== 'function') {\n throw new ValidationError('CostLedger: crypto.randomUUID is required when callId is omitted')\n }\n return globalThis.crypto.randomUUID()\n}\n\nfunction abortError(signal: AbortSignal): Error {\n const reason = (signal as { reason?: unknown }).reason\n if (reason instanceof Error) return reason\n const error = new Error('CostLedger: paid call aborted')\n error.name = 'AbortError'\n return error\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value))\n}\n\nfunction paidFailure<T>(callId: string, error: Error, receipt?: CostReceipt): PaidCallResult<T> {\n return {\n succeeded: false,\n callId,\n error,\n ...(receipt ? { receipt: cloneReceipt(receipt) } : {}),\n }\n}\n\nfunction validationMessage(cause: unknown): string {\n return cause instanceof z.ZodError ? z.prettifyError(cause) : toError(cause).message\n}\n\nfunction assertUsage(usage: CostUsage): void {\n assertTokenCount(usage.inputTokens, 'inputTokens')\n assertTokenCount(usage.outputTokens, 'outputTokens')\n if (usage.reasoningTokens !== undefined) {\n assertTokenCount(usage.reasoningTokens, 'reasoningTokens')\n if (usage.reasoningTokens > usage.outputTokens) {\n throw new ValidationError('CostLedger: reasoningTokens must not exceed outputTokens')\n }\n }\n if (usage.cachedTokens !== undefined) assertTokenCount(usage.cachedTokens, 'cachedTokens')\n if (usage.cacheWriteTokens !== undefined) {\n assertTokenCount(usage.cacheWriteTokens, 'cacheWriteTokens')\n }\n}\n\nfunction assertTokenCount(value: unknown, name: string): asserts value is number {\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n throw new ValidationError(\n `CostLedger: ${name} must be a non-negative integer, got ${String(value)}`,\n )\n }\n}\n\nfunction assertNonNegative(value: unknown, name: string): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n throw new ValidationError(\n `CostLedger: ${name} must be a non-negative finite number, got ${String(value)}`,\n )\n }\n}\n\nfunction assertTimeout(value: unknown, name: string): asserts value is number {\n if (\n typeof value !== 'number' ||\n !Number.isSafeInteger(value) ||\n value < 0 ||\n value > 2_147_483_647\n ) {\n throw new ValidationError(\n `CostLedger: ${name} must be a non-negative safe integer no greater than 2147483647, got ${String(value)}`,\n )\n }\n}\n\nfunction assertString(value: unknown, name: string): asserts value is string {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new ValidationError(`CostLedger: ${name} must be a non-empty string`)\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { O as TraceAnalysisStore, i as AnalystFinding, n as AnalystContext } from "./types-
|
|
2
|
-
import { l as ExactCapableAnalyst } from "./exact-types-
|
|
3
|
-
import { n as AnalystRegistry, r as AnalystRegistryOptions } from "./registry-
|
|
4
|
-
import { a as TraceAnalystLimits, i as TraceAnalysisEngineResult, l as RawAnalystFinding, n as TraceAnalysisEngine } from "./engine-
|
|
5
|
-
import { t as TraceToolGroupName } from "./tool-groups-
|
|
1
|
+
import { O as TraceAnalysisStore, i as AnalystFinding, n as AnalystContext } from "./types-DHb5TI36.js";
|
|
2
|
+
import { l as ExactCapableAnalyst } from "./exact-types-Dlb73wN4.js";
|
|
3
|
+
import { n as AnalystRegistry, r as AnalystRegistryOptions } from "./registry-CMYIaDgS.js";
|
|
4
|
+
import { a as TraceAnalystLimits, i as TraceAnalysisEngineResult, l as RawAnalystFinding, n as TraceAnalysisEngine } from "./engine-C37HS2kr.js";
|
|
5
|
+
import { t as TraceToolGroupName } from "./tool-groups-BKRrtqy4.js";
|
|
6
6
|
//#region src/trace-analyst/behavioral-metrics.d.ts
|
|
7
7
|
type SuboptimalCode = 'monotonic-input-growth' | 'output-length-decay' | 'single-tool-dependency' | 'no-self-verification';
|
|
8
8
|
interface SuboptimalSignal {
|
|
@@ -110,4 +110,4 @@ interface DefaultAnalystRegistryOptions {
|
|
|
110
110
|
declare function buildDefaultAnalystRegistry(options?: DefaultAnalystRegistryOptions): AnalystRegistry;
|
|
111
111
|
//#endregion
|
|
112
112
|
export { createTraceAnalyst as a, BehavioralAnalystOptions as c, TraceAnalystDefinition as i, behavioralAnalyst as l, buildDefaultAnalystRegistry as n, renderPriorFindings as o, CreateTraceAnalystOptions as r, runTraceAnalyst as s, DefaultAnalystRegistryOptions as t, deriveEfficiencyFindings as u };
|
|
113
|
-
//# sourceMappingURL=default-registry-
|
|
113
|
+
//# sourceMappingURL=default-registry-B4B7GMvI.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-registry-
|
|
1
|
+
{"version":3,"file":"default-registry-B4B7GMvI.d.ts","names":[],"sources":["../src/trace-analyst/behavioral-metrics.ts","../src/analyst/behavioral-analyst.ts","../src/analyst/kind-factory.ts","../src/analyst/default-registry.ts"],"mappings":";;;;;;KAoBY;UAMK;EACf,MAAM;EACN;;EAEA;;EAEA,UAAU;;UAGK;;EAEf;EACA;;EAEA,gBAAgB;;EAEhB;EACA;EACA,eAAe;EACf;EACA;;EAEA;EACA;EACA,SAAS;;UAGM;EACf;EACA;EACA,sBAAsB;EACtB,uBAAuB;;;;UC1BR;;EAEf;;EAEA;;;;;;iBA+Dc,yBACd,SAAS,mBACT;EAAQ;EAAoB;IAC3B;;iBAkCa,kBACd,UAAS,2BACR,oBAAoB;;;;UCrHN;EACf;EACA;EACA;EACA;;EAEA,sBAAsB,SAAS;;EAE/B;;EAEA,WAAW;;EAEX,kBACE,OAAO,oBACP,SAAS,wCACe;EAC1B,SAAS,QAAQ;EACjB,eAAe,KAAK,mBAAmB,SAAS,mBAAmB;EACnE;EACA;;UAGe;EACf,QAAQ;;EAER;EACA;;;iBAIoB,gBAAgB;EACpC,YAAY;EACZ,QAAQ;EACR,OAAO;EACP,SAAS;EACT;IACE,QAAQ;;iBAgHI,mBACd,YAAY,wBACZ,SAAS,4BACR,oBAAoB;iBA2RP,oBAAoB,OAAO;;;UChc1B;;;;;;EAMf,SAAS;EACT,uBAAuB;;EAEvB;EACA,aAAa;EACb,WAAW;;iBAGG,4BACd,UAAS,gCACR"}
|