@tangle-network/agent-eval 0.139.3 → 0.140.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/analyst/index.d.ts +15 -13
- package/dist/analyst/index.d.ts.map +1 -1
- package/dist/analyst/index.js +6 -6
- package/dist/{benchmark-DDVdWcwA.d.ts → benchmark-DxaZfy0w.d.ts} +3 -3
- package/dist/{benchmark-DDVdWcwA.d.ts.map → benchmark-DxaZfy0w.d.ts.map} +1 -1
- package/dist/{benchmark-command-xvi2liH7.js → benchmark-command-CK0UnXAD.js} +54 -33
- package/dist/benchmark-command-CK0UnXAD.js.map +1 -0
- package/dist/benchmarks/index.d.ts +1 -1
- package/dist/benchmarks/index.js +1 -1
- package/dist/{benchmarks-zxhy1QV3.js → benchmarks-HwoBE32G.js} +4 -4
- package/dist/{benchmarks-zxhy1QV3.js.map → benchmarks-HwoBE32G.js.map} +1 -1
- package/dist/campaign/index.d.ts +5 -5
- package/dist/campaign/index.js +3 -3
- package/dist/{campaign-DrS6_hLd.js → campaign-BzjYNYVZ.js} +5 -5
- package/dist/{campaign-DrS6_hLd.js.map → campaign-BzjYNYVZ.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{client-BohnDFBq.d.ts → client-BoqGxEqx.d.ts} +4 -4
- package/dist/{client-BohnDFBq.d.ts.map → client-BoqGxEqx.d.ts.map} +1 -1
- package/dist/{completion-verifier-IPoP4fQO.d.ts → completion-verifier-D15NHYSk.d.ts} +5 -5
- package/dist/{completion-verifier-IPoP4fQO.d.ts.map → completion-verifier-D15NHYSk.d.ts.map} +1 -1
- package/dist/contract/index.d.ts +10 -10
- package/dist/contract/index.js +6 -6
- package/dist/control.d.ts +2 -2
- package/dist/{cost-ledger-CZ9diLxY.js → cost-ledger-DMFxsLKr.js} +22 -8
- package/dist/cost-ledger-DMFxsLKr.js.map +1 -0
- package/dist/{cost-ledger-DKgyIWRj.d.ts → cost-ledger-FuQvHxPm.d.ts} +8 -2
- package/dist/{cost-ledger-DKgyIWRj.d.ts.map → cost-ledger-FuQvHxPm.d.ts.map} +1 -1
- package/dist/{default-registry-B8vf7Rmf.d.ts → default-registry-Ci7wAAR8.d.ts} +5 -5
- package/dist/{default-registry-B8vf7Rmf.d.ts.map → default-registry-Ci7wAAR8.d.ts.map} +1 -1
- package/dist/{default-registry-BgJJItGr.js → default-registry-DCp-6hc-.js} +3 -3
- package/dist/{default-registry-BgJJItGr.js.map → default-registry-DCp-6hc-.js.map} +1 -1
- package/dist/{dspy-rlm-engine-DTkVyDX-.js → dspy-rlm-engine-Bkak4nzo.js} +11 -4
- package/dist/dspy-rlm-engine-Bkak4nzo.js.map +1 -0
- package/dist/{eval-campaign-BmptJj50.js → eval-campaign-YdkpWWoT.js} +2 -2
- package/dist/{eval-campaign-BmptJj50.js.map → eval-campaign-YdkpWWoT.js.map} +1 -1
- package/dist/{exact-types-MaaFcllV.d.ts → exact-types-B0lJV3tu.d.ts} +2 -2
- package/dist/{exact-types-MaaFcllV.d.ts.map → exact-types-B0lJV3tu.d.ts.map} +1 -1
- package/dist/{external-optimizer-contracts-BrxY2Sli.d.ts → external-optimizer-contracts-nb7c_WAR.d.ts} +12 -2
- package/dist/{external-optimizer-contracts-BrxY2Sli.d.ts.map → external-optimizer-contracts-nb7c_WAR.d.ts.map} +1 -1
- package/dist/{extract-usage-DZs601Va.js → extract-usage-C5vMw-0R.js} +2 -2
- package/dist/{extract-usage-DZs601Va.js.map → extract-usage-C5vMw-0R.js.map} +1 -1
- package/dist/{feedback-trajectory-BJUWOkJM.d.ts → feedback-trajectory-BCHqzLh3.d.ts} +3 -3
- package/dist/{feedback-trajectory-BJUWOkJM.d.ts.map → feedback-trajectory-BCHqzLh3.d.ts.map} +1 -1
- package/dist/fuzz.d.ts +1 -1
- package/dist/fuzz.js +1 -1
- package/dist/hosted/index.d.ts +3 -3
- package/dist/{index-_66rVpwN.d.ts → index-CKI1CXTL.d.ts} +5 -5
- package/dist/{index-_66rVpwN.d.ts.map → index-CKI1CXTL.d.ts.map} +1 -1
- package/dist/{index-CWOPCJiw.d.ts → index-D2enbqA0.d.ts} +2 -2
- package/dist/{index-CWOPCJiw.d.ts.map → index-D2enbqA0.d.ts.map} +1 -1
- package/dist/{index-BTm_P9aC.d.ts → index-DCP4I2Qx.d.ts} +10 -10
- package/dist/{index-BTm_P9aC.d.ts.map → index-DCP4I2Qx.d.ts.map} +1 -1
- package/dist/{index-CtR1xh4V.d.ts → index-DFLVtPZ9.d.ts} +3 -3
- package/dist/{index-CtR1xh4V.d.ts.map → index-DFLVtPZ9.d.ts.map} +1 -1
- package/dist/index.d.ts +23 -23
- package/dist/index.js +13 -13
- package/dist/{insight-report-Bu5Wi9tG.d.ts → insight-report-Bh_8ksel.d.ts} +4 -4
- package/dist/{insight-report-Bu5Wi9tG.d.ts.map → insight-report-Bh_8ksel.d.ts.map} +1 -1
- package/dist/{integrity-COTh3DTH.d.ts → integrity-DRXobPEs.d.ts} +2 -2
- package/dist/{integrity-COTh3DTH.d.ts.map → integrity-DRXobPEs.d.ts.map} +1 -1
- package/dist/{kind-factory-CFxA0JQX.js → kind-factory-DB7nIs35.js} +2 -2
- package/dist/{kind-factory-CFxA0JQX.js.map → kind-factory-DB7nIs35.js.map} +1 -1
- package/dist/{llm-client-bkztEfIx.js → llm-client-B3WXSH5Y.js} +2 -2
- package/dist/{llm-client-bkztEfIx.js.map → llm-client-B3WXSH5Y.js.map} +1 -1
- package/dist/meta-eval/index.d.ts +2 -2
- package/dist/multishot/index.d.ts +2 -2
- package/dist/openapi.json +1 -1
- package/dist/{release-report-fZarvIm-.d.ts → release-report-B_bQOHM-.d.ts} +3 -3
- package/dist/{release-report-fZarvIm-.d.ts.map → release-report-B_bQOHM-.d.ts.map} +1 -1
- package/dist/{replay-DjG4IG60.d.ts → replay-BqTgoioO.d.ts} +6 -6
- package/dist/{replay-DjG4IG60.d.ts.map → replay-BqTgoioO.d.ts.map} +1 -1
- package/dist/{replay-SA4OB7O7.js → replay-k2MsOmv5.js} +4 -4
- package/dist/{replay-SA4OB7O7.js.map → replay-k2MsOmv5.js.map} +1 -1
- package/dist/reporting.d.ts +4 -4
- package/dist/{researcher-BxhtGfKa.d.ts → researcher-C6lzl-rP.d.ts} +5 -5
- package/dist/{researcher-BxhtGfKa.d.ts.map → researcher-C6lzl-rP.d.ts.map} +1 -1
- package/dist/{reward-hacking-CqSLiV51.d.ts → reward-hacking-CEVVmy3h.d.ts} +2 -2
- package/dist/{reward-hacking-CqSLiV51.d.ts.map → reward-hacking-CEVVmy3h.d.ts.map} +1 -1
- package/dist/rl.d.ts +5 -5
- package/dist/rl.js +1 -1
- package/dist/rollout/index.d.ts +1 -1
- package/dist/{rubric-predictive-validity-DQBQj6uV.d.ts → rubric-predictive-validity-C2CthIfY.d.ts} +2 -2
- package/dist/{rubric-predictive-validity-DQBQj6uV.d.ts.map → rubric-predictive-validity-C2CthIfY.d.ts.map} +1 -1
- package/dist/{run-evidence-C4RcRQT5.d.ts → run-evidence-8Ou28QSa.d.ts} +3 -3
- package/dist/{run-evidence-C4RcRQT5.d.ts.map → run-evidence-8Ou28QSa.d.ts.map} +1 -1
- package/dist/{run-record-CztDMXVF.d.ts → run-record-Tb3TTtUn.d.ts} +2 -2
- package/dist/{run-record-CztDMXVF.d.ts.map → run-record-Tb3TTtUn.d.ts.map} +1 -1
- package/dist/{semantic-concept-judge-BuIJ9IfB.js → semantic-concept-judge-DJQtFr95.js} +3 -3
- package/dist/{semantic-concept-judge-BuIJ9IfB.js.map → semantic-concept-judge-DJQtFr95.js.map} +1 -1
- package/dist/{server-DaCpLfi0.js → server-Cu4M3NSO.js} +3 -3
- package/dist/{server-DaCpLfi0.js.map → server-Cu4M3NSO.js.map} +1 -1
- package/dist/{single-run-lock-BTTtPZ9N.js → single-run-lock-CiQThJxB.js} +22 -12
- package/dist/single-run-lock-CiQThJxB.js.map +1 -0
- package/dist/{skill-usage-B-BFS8M2.d.ts → skill-usage-CVVnoIx-.d.ts} +26 -10
- package/dist/skill-usage-CVVnoIx-.d.ts.map +1 -0
- package/dist/{skillopt-optimization-method-BbGnCC53.js → skillopt-optimization-method-CSBQ8Qma.js} +4 -4
- package/dist/{skillopt-optimization-method-BbGnCC53.js.map → skillopt-optimization-method-CSBQ8Qma.js.map} +1 -1
- package/dist/{skillopt-optimization-method-_s0Tub7Y.d.ts → skillopt-optimization-method-D1dqGzzH.d.ts} +11 -11
- package/dist/{skillopt-optimization-method-_s0Tub7Y.d.ts.map → skillopt-optimization-method-D1dqGzzH.d.ts.map} +1 -1
- package/dist/{statistics-B5d0Zd-z.d.ts → statistics-B4u_CiFd.d.ts} +2 -2
- package/dist/{statistics-B5d0Zd-z.d.ts.map → statistics-B4u_CiFd.d.ts.map} +1 -1
- package/dist/{store-otlp-DX4fGIcf.js → store-otlp-vRByAR6h.js} +2 -2
- package/dist/{store-otlp-DX4fGIcf.js.map → store-otlp-vRByAR6h.js.map} +1 -1
- package/dist/{summary-report-Cg7BifAM.d.ts → summary-report-o3eJ3gxG.d.ts} +3 -3
- package/dist/{summary-report-Cg7BifAM.d.ts.map → summary-report-o3eJ3gxG.d.ts.map} +1 -1
- package/dist/{tool-groups-CdYq22lX.d.ts → tool-groups-DVQTy9lq.d.ts} +8 -8
- package/dist/{tool-groups-CdYq22lX.d.ts.map → tool-groups-DVQTy9lq.d.ts.map} +1 -1
- package/dist/traces.d.ts +6 -6
- package/dist/traces.js +4 -4
- package/dist/{types-uPrS6mD-.d.ts → types-BjMFz88h.d.ts} +2 -2
- package/dist/{types-uPrS6mD-.d.ts.map → types-BjMFz88h.d.ts.map} +1 -1
- package/dist/{types-DoEYskCd.d.ts → types-D3jh6F98.d.ts} +4 -4
- package/dist/{types-DoEYskCd.d.ts.map → types-D3jh6F98.d.ts.map} +1 -1
- package/dist/{types-BBFNHxSK.d.ts → types-Dk7PB7vh.d.ts} +5 -5
- package/dist/{types-BBFNHxSK.d.ts.map → types-Dk7PB7vh.d.ts.map} +1 -1
- package/dist/wire/index.d.ts +3 -3
- package/dist/wire/index.js +1 -1
- package/package.json +1 -1
- package/dist/benchmark-command-xvi2liH7.js.map +0 -1
- package/dist/cost-ledger-CZ9diLxY.js.map +0 -1
- package/dist/dspy-rlm-engine-DTkVyDX-.js.map +0 -1
- package/dist/single-run-lock-BTTtPZ9N.js.map +0 -1
- package/dist/skill-usage-B-BFS8M2.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cost-ledger-CZ9diLxY.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 summary = this.summary()\n if (summary.unresolvedCalls > 0) {\n return {\n succeeded: false,\n callId,\n error: new CostAccountingIncompleteError(\n `CostLedger: ${summary.unresolvedCalls} unresolved call(s) must be reconciled before new paid work`,\n ),\n }\n }\n if (this.costCeilingUsd === undefined) break\n if (this.hasIncompleteSettledCall()) {\n return {\n succeeded: false,\n callId,\n error: new CostAccountingIncompleteError(\n `CostLedger: accounting is incomplete; refusing paid call '${input.actor}' during '${input.phase}'`,\n ),\n }\n }\n if (summary.totalCostUsd + maximumCostUsd! > this.costCeilingUsd) {\n return {\n succeeded: false,\n callId,\n error: new CostCeilingReachedError(\n this.costCeilingUsd,\n summary.totalCostUsd,\n maximumCostUsd!,\n input.phase,\n input.actor,\n ),\n }\n }\n if (\n summary.totalCostUsd + summary.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.values()].find(\n (record): record is PendingCostCall =>\n record.callId === callId && record.status === 'pending',\n )\n if (!pending) throw new CostCallConflictError(`CostLedger: no pending call '${callId}'`)\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 private hasIncompleteSettledCall(): boolean {\n return [...this.records.values()].some(\n (record) =>\n record.status === 'settled' &&\n (record.costUnknown ||\n record.usageUnknown ||\n (record.maximumCostUsd !== undefined && record.costUsd > record.maximumCostUsd)),\n )\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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dspy-rlm-engine-DTkVyDX-.js","names":["isRecord"],"sources":["../src/analyst/trace-tool-callback.ts","../src/analyst/dspy-rlm-engine.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto'\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http'\nimport { closeServer, listenLocal, sendJson } from '../campaign/external-optimizer-http'\nimport type { TraceAnalysisToolDescriptor } from '../trace-analyst/tools'\n\nconst MAX_REQUEST_BYTES = 1_000_000\nconst MAX_RESPONSE_BYTES = 4_000_000\n\nexport interface TraceToolCallback {\n url: string\n token: string\n calls: () => number\n close: () => Promise<void>\n}\n\n/** Expose one bounded trace-tool set only on an authenticated loopback socket. */\nexport async function startTraceToolCallback(args: {\n tools: readonly TraceAnalysisToolDescriptor[]\n maxCalls: number\n signal?: AbortSignal\n}): Promise<TraceToolCallback> {\n if (!Number.isSafeInteger(args.maxCalls) || args.maxCalls <= 0) {\n throw new TypeError('trace tool callback maxCalls must be a positive safe integer')\n }\n args.signal?.throwIfAborted()\n const byName = new Map(args.tools.map((tool) => [tool.name, tool]))\n if (byName.size !== args.tools.length) {\n throw new Error('trace tool callback received duplicate tool names')\n }\n\n const token = randomBytes(32).toString('hex')\n let calls = 0\n let accepting = true\n let closePromise: Promise<void> | undefined\n const activeControllers = new Set<AbortController>()\n const activeHandlers = new Set<Promise<void>>()\n const server = createServer((request, response) => {\n if (!accepting) {\n sendJsonIfOpen(response, 503, { error: 'trace tool callback is closing' })\n return\n }\n const controller = new AbortController()\n const abortRequest = (): void => {\n request.destroy()\n response.destroy()\n }\n activeControllers.add(controller)\n controller.signal.addEventListener('abort', abortRequest, { once: true })\n\n let handler!: Promise<void>\n handler = handleRequest(request, response, controller.signal).finally(() => {\n controller.signal.removeEventListener('abort', abortRequest)\n activeControllers.delete(controller)\n activeHandlers.delete(handler)\n })\n activeHandlers.add(handler)\n void handler.catch(() => undefined)\n })\n const port = await listenLocal(server)\n const close = (): Promise<void> => {\n closePromise ??= closeCallback()\n return closePromise\n }\n const onAbort = (): void => {\n void close().catch(() => undefined)\n }\n args.signal?.addEventListener('abort', onAbort, { once: true })\n if (args.signal?.aborted) onAbort()\n\n return {\n url: `http://127.0.0.1:${port}/call`,\n token,\n calls: () => calls,\n close,\n }\n\n async function handleRequest(\n request: IncomingMessage,\n response: ServerResponse,\n signal: AbortSignal,\n ): Promise<void> {\n try {\n if (request.method !== 'POST' || request.url !== '/call') {\n sendJsonIfOpen(response, 404, { error: 'not found' })\n return\n }\n if (request.headers.authorization !== `Bearer ${token}`) {\n sendJsonIfOpen(response, 401, { error: 'unauthorized' })\n return\n }\n if (calls >= args.maxCalls) {\n sendJsonIfOpen(response, 429, { error: 'trace tool call limit reached' })\n return\n }\n const body = await readJson(request)\n if (!isRecord(body) || typeof body.name !== 'string' || !('args' in body)) {\n sendJsonIfOpen(response, 400, { error: 'name and args are required' })\n return\n }\n const tool = byName.get(body.name)\n if (!tool) {\n sendJsonIfOpen(response, 404, { error: `unknown trace tool '${body.name}'` })\n return\n }\n calls += 1\n const result = await tool.handler(body.args, { signal })\n const encoded = JSON.stringify({ result })\n if (Buffer.byteLength(encoded) > MAX_RESPONSE_BYTES) {\n sendJsonIfOpen(response, 413, { error: 'trace tool response too large' })\n return\n }\n response.writeHead(200, {\n 'content-type': 'application/json; charset=utf-8',\n 'content-length': String(Buffer.byteLength(encoded)),\n })\n response.end(encoded)\n } catch (error) {\n sendJsonIfOpen(response, signal.aborted ? 499 : 400, {\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n async function closeCallback(): Promise<void> {\n args.signal?.removeEventListener('abort', onAbort)\n accepting = false\n const closingServer = closeServer(server)\n server.closeIdleConnections?.()\n for (const controller of activeControllers) controller.abort()\n const [serverResult] = await Promise.allSettled([\n closingServer,\n waitForActiveHandlers(activeHandlers),\n ])\n if (activeControllers.size !== 0 || activeHandlers.size !== 0) {\n throw new Error('trace tool callback closed with active requests')\n }\n if (serverResult?.status === 'rejected') throw serverResult.reason\n }\n}\n\nasync function waitForActiveHandlers(activeHandlers: Set<Promise<void>>): Promise<void> {\n while (activeHandlers.size > 0) {\n await Promise.allSettled([...activeHandlers])\n }\n}\n\nfunction readJson(request: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n let size = 0\n const chunks: Buffer[] = []\n request.on('data', (chunk: Buffer) => {\n size += chunk.length\n if (size > MAX_REQUEST_BYTES) {\n reject(new Error('trace tool request too large'))\n request.destroy()\n return\n }\n chunks.push(chunk)\n })\n request.on('error', reject)\n request.on('end', () => {\n try {\n resolve(JSON.parse(Buffer.concat(chunks).toString('utf8')))\n } catch (error) {\n reject(error)\n }\n })\n })\n}\n\nfunction sendJsonIfOpen(response: ServerResponse, status: number, body: unknown): void {\n if (response.destroyed || response.writableEnded) return\n sendJson(response, status, body)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import {\n type ExternalOptimizerModelProxy,\n type ExternalOptimizerRunnerCommand,\n removeCredentialEnvironment,\n} from '../campaign/external-optimizer-contracts'\nimport { startExternalOptimizerModelProxy } from '../campaign/external-optimizer-model-proxy'\nimport { runWithCleanup } from '../campaign/external-optimizer-resources'\nimport { runExternalOptimizerProcess } from '../campaign/external-optimizer-subprocess'\nimport type { CustomTokenPricing } from '../cost-ledger'\nimport { resolveModelPricing } from '../metrics'\nimport type { TraceAnalysisEngine, TraceAnalysisEngineResult } from './engine'\nimport { type RawAnalystFinding, RawAnalystFindingSchema } from './finding-signature'\nimport { startTraceToolCallback } from './trace-tool-callback'\n\nconst DEFAULT_TIMEOUT_MS = 10 * 60_000\nconst DEFAULT_MODEL_OUTPUT_TOKENS = 4_096\nconst DEFAULT_MAX_COST_USD = 1\nconst MAX_MODEL_REQUEST_BYTES = 16 * 1024 * 1024\nconst MAX_MODEL_RESPONSE_BYTES = 4 * 1024 * 1024\nconst BRIDGE_MODULE = 'agent_eval_rpc.dspy_rlm_bridge'\n/** Bumped whenever this engine's execution behavior changes. */\nconst DSPY_RLM_ENGINE_VERSION = '1.0.0'\n\nexport interface DspyRlmTraceEngineOptions {\n baseUrl: string\n apiKey: string\n model: string\n /** Exact provider rates. Required when the model is absent from the pricing table. */\n pricing?: CustomTokenPricing\n /** Maximum provider spend for one investigation. Default: 1 USD. */\n maxCostUsd?: number\n /** Controller response cap. Default: 4096. */\n maxOutputTokens?: number\n /** Python command used to load agent-eval-rpc[dspy]. Default: python. */\n runner?: ExternalOptimizerRunnerCommand\n /** Whole investigation deadline. Default: 10 minutes. */\n timeoutMs?: number\n}\n\n/** Use the official DSPy RLM as a bounded recursive trace-analysis engine. */\nexport function createDspyRlmTraceEngine(options: DspyRlmTraceEngineOptions): TraceAnalysisEngine {\n assertOptions(options)\n const maxOutputTokens = options.maxOutputTokens ?? DEFAULT_MODEL_OUTPUT_TOKENS\n if (!Number.isSafeInteger(maxOutputTokens) || maxOutputTokens <= 0) {\n throw new TypeError('DSPy RLM maxOutputTokens must be a positive safe integer')\n }\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {\n throw new TypeError('DSPy RLM timeoutMs must be a positive safe integer')\n }\n const maxCostUsd = options.maxCostUsd ?? DEFAULT_MAX_COST_USD\n if (!Number.isFinite(maxCostUsd) || maxCostUsd <= 0) {\n throw new TypeError('DSPy RLM maxCostUsd must be positive and finite')\n }\n const pricing = options.pricing ?? pricingForModel(options.model)\n\n const runner = sanitizedRunner(options.runner)\n return {\n id: 'dspy-rlm',\n description: 'Official DSPy RLM with bounded trace tools and metered model calls.',\n model: options.model,\n version: DSPY_RLM_ENGINE_VERSION,\n executionConfig: {\n bridge_module: BRIDGE_MODULE,\n base_url: options.baseUrl,\n model: options.model,\n api_key_provided: true,\n pricing: { ...pricing },\n max_cost_usd: maxCostUsd,\n max_output_tokens: maxOutputTokens,\n timeout_ms: timeoutMs,\n max_request_bytes: MAX_MODEL_REQUEST_BYTES,\n max_response_bytes: MAX_MODEL_RESPONSE_BYTES,\n runner: runner ? 'caller-supplied' : 'default',\n runner_command: runner?.command ?? null,\n },\n async analyze(request) {\n const callback = await startTraceToolCallback({\n tools: request.tools,\n maxCalls: request.limits.maxToolCalls,\n ...(request.signal ? { signal: request.signal } : {}),\n })\n let modelProxy: ExternalOptimizerModelProxy | undefined\n const result = await runWithCleanup({\n label: 'DSPy RLM trace-analysis resources',\n run: async () => {\n modelProxy = await startExternalOptimizerModelProxy({\n upstreamBaseUrl: options.baseUrl,\n upstreamApiKey: options.apiKey,\n model: options.model,\n budget: {\n maxCostUsd,\n maxRequests: request.limits.maxIterations + request.limits.maxLlmCalls + 1,\n maxRequestBytes: MAX_MODEL_REQUEST_BYTES,\n maxResponseBytes: MAX_MODEL_RESPONSE_BYTES,\n maxOutputTokensPerRequest: maxOutputTokens,\n requestTimeoutMs: timeoutMs,\n pricing,\n },\n costLedger: request.costLedger,\n channel: 'analyst',\n phase: request.costPhase,\n actor: request.analystId,\n ...(request.costTags ? { tags: request.costTags } : {}),\n ...(request.signal ? { signal: request.signal } : {}),\n })\n request.log?.('trace analyst engine started', {\n engine: 'dspy-rlm',\n model: options.model,\n tools: request.tools.map((tool) => tool.name),\n limits: request.limits,\n })\n const raw = await runExternalOptimizerProcess<unknown>({\n label: 'DSPy RLM trace analysis',\n tempPrefix: 'agent-eval-dspy-rlm-',\n module: BRIDGE_MODULE,\n input: {\n operation: 'analyze',\n question: request.question,\n instructions: request.instructions,\n modelProxy: {\n baseUrl: modelProxy.baseUrl,\n apiKey: modelProxy.apiKey,\n model: options.model,\n maxOutputTokens,\n },\n toolCallback: {\n url: callback.url,\n token: callback.token,\n },\n toolSpecs: request.tools.map(({ name, description, parameters }) => ({\n name,\n description,\n parameters,\n })),\n limits: {\n maxIterations: request.limits.maxIterations,\n maxLlmCalls: request.limits.maxLlmCalls,\n maxOutputChars: request.limits.maxOutputChars,\n },\n },\n ...(runner ? { runner } : {}),\n timeoutMs,\n ...(request.signal ? { signal: request.signal } : {}),\n })\n const parsed = parseBridgeOutput(raw, (index, reason) => {\n request.log?.('finding rejected: bridge row failed schema validation', {\n engine: 'dspy-rlm',\n index,\n reason,\n })\n })\n const successfulCompletions = modelProxy.successfulCompletions()\n const requestAttempts = modelProxy.requestAttempts()\n if (parsed.modelCalls !== successfulCompletions) {\n throw new Error(\n `DSPy RLM reported ${parsed.modelCalls} model calls, but the provider proxy recorded ${successfulCompletions}`,\n )\n }\n return {\n ...parsed,\n toolCalls: callback.calls(),\n runtime: {\n ...parsed.runtime,\n modelRequestAttempts: requestAttempts,\n modelSuccessfulCompletions: successfulCompletions,\n },\n } satisfies TraceAnalysisEngineResult\n },\n cleanup: async () => {\n const results = await Promise.allSettled([\n ...(modelProxy ? [modelProxy.close()] : []),\n callback.close(),\n ])\n const errors = results.flatMap((entry) =>\n entry.status === 'rejected' ? [entry.reason] : [],\n )\n if (errors.length > 0) {\n throw new AggregateError(errors, 'DSPy RLM resource cleanup failed')\n }\n },\n })\n request.log?.('trace analyst engine completed', {\n engine: 'dspy-rlm',\n model_calls: result.modelCalls,\n model_request_attempts: result.runtime.modelRequestAttempts,\n tool_calls: result.toolCalls,\n findings: result.findings.length,\n })\n return result\n },\n }\n}\n\nfunction parseBridgeOutput(\n value: unknown,\n onRejectedFinding: (index: number, reason: string) => void,\n): Omit<TraceAnalysisEngineResult, 'toolCalls'> {\n if (!isRecord(value)) throw new Error('DSPy RLM bridge output must be an object')\n if (typeof value.answer !== 'string' || !value.answer.trim()) {\n throw new Error('DSPy RLM bridge returned no answer')\n }\n if (!Array.isArray(value.findings)) {\n throw new Error('DSPy RLM bridge findings must be an array')\n }\n // Findings are model output: one malformed row is model noise, not a bridge\n // fault, and the rest of the paid investigation must survive it. Rejected\n // rows are logged per row and counted in runtime.rejectedFindings.\n let rejectedFindings = 0\n const findings: RawAnalystFinding[] = []\n value.findings.forEach((finding, index) => {\n const parsed = RawAnalystFindingSchema.safeParse(finding)\n if (!parsed.success) {\n rejectedFindings += 1\n onRejectedFinding(\n index,\n parsed.error.issues.map((issue) => `${issue.path.join('.')}: ${issue.message}`).join('; '),\n )\n return\n }\n findings.push(parsed.data)\n })\n if (!Array.isArray(value.trajectory)) {\n throw new Error('DSPy RLM bridge trajectory must be an array')\n }\n if (!Number.isSafeInteger(value.modelCalls) || (value.modelCalls as number) <= 0) {\n throw new Error('DSPy RLM bridge modelCalls must be a positive safe integer')\n }\n if (!isRecord(value.runtime)) {\n throw new Error('DSPy RLM bridge runtime must be an object')\n }\n return {\n answer: value.answer,\n findings,\n trajectory: value.trajectory,\n modelCalls: value.modelCalls as number,\n runtime: { ...value.runtime, rejectedFindings },\n }\n}\n\nfunction assertOptions(options: DspyRlmTraceEngineOptions): void {\n for (const [name, value] of [\n ['baseUrl', options.baseUrl],\n ['apiKey', options.apiKey],\n ['model', options.model],\n ] as const) {\n if (typeof value !== 'string' || !value.trim()) {\n throw new TypeError(`DSPy RLM ${name} must be a non-empty string`)\n }\n }\n}\n\nfunction pricingForModel(model: string): CustomTokenPricing {\n const pricing = resolveModelPricing(model)\n if (!pricing) {\n throw new Error(\n `no pricing is configured for '${model}'; provide DspyRlmTraceEngineOptions.pricing`,\n )\n }\n return {\n inputUsdPerMillion: pricing.input * 1_000,\n outputUsdPerMillion: pricing.output * 1_000,\n }\n}\n\nfunction sanitizedRunner(\n runner: ExternalOptimizerRunnerCommand | undefined,\n): ExternalOptimizerRunnerCommand | undefined {\n if (!runner) return undefined\n return {\n ...(runner.command ? { command: runner.command } : {}),\n ...(runner.args ? { args: runner.args } : {}),\n ...(runner.env ? { env: removeCredentialEnvironment(runner.env) } : {}),\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"single-run-lock-BTTtPZ9N.js","names":["MAX_TIMER_DELAY_MS"],"sources":["../src/campaign/external-optimizer-contracts.ts","../src/campaign/external-optimizer-http.ts","../src/campaign/external-optimizer-model-proxy.ts","../src/campaign/external-optimizer-resources.ts","../src/campaign/external-optimizer-subprocess.ts","../src/campaign/search-ledger-errors.ts","../src/campaign/search-ledger-file.ts","../src/campaign/storage.ts","../src/campaign/single-run-lock.ts"],"sourcesContent":["import type { CustomTokenPricing } from '../cost-ledger'\nimport { costForTokenPricing } from '../cost-ledger'\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\n\nexport interface ExternalOptimizerRunnerCommand {\n command?: string\n args?: readonly string[]\n env?: NodeJS.ProcessEnv\n}\n\nexport type ExternalOptimizerResumeMode = 'never' | 'if-compatible' | 'required'\n\nexport type ExternalTextCandidate = string | Record<string, string>\n\nexport interface ExternalTextEvaluationRequest {\n candidate: ExternalTextCandidate\n exampleId: string\n}\n\nexport interface ExternalOptimizerCallback {\n url: string\n token: string\n evaluations: () => number\n close: () => Promise<void>\n}\n\nexport interface ExternalOptimizerModelBudget {\n /** Maximum optimizer-model spend, independent of task-evaluation spend. */\n maxCostUsd: number\n /** Network attempts, including provider retries. */\n maxRequests: number\n /** Reject a request body above this byte count. */\n maxRequestBytes: number\n /** Reject a provider response above this byte count. */\n maxResponseBytes: number\n /** Reject a request asking the provider for more output tokens. */\n maxOutputTokensPerRequest: number\n /** Rates used to estimate cost when the provider omits a valid `usage.cost`. */\n pricing: CustomTokenPricing\n /** Per-provider-request deadline. Default: 300,000 ms. */\n requestTimeoutMs?: number\n}\n\nexport interface ExternalOptimizerModelProxy {\n /** OpenAI-compatible base URL supplied to the optimizer process. */\n baseUrl: string\n /** Ephemeral credential supplied only to the local proxy. */\n apiKey: string\n /** Provider requests admitted during this proxy process, including failures. */\n requestAttempts: () => number\n /** Complete successful provider responses recorded during this proxy process. */\n successfulCompletions: () => number\n close: () => Promise<void>\n}\n\nexport function isCandidateText(value: unknown, maxChars: number): value is string {\n return typeof value === 'string' && value.trim().length > 0 && value.length <= maxChars\n}\n\nexport function isExternalTextCandidate(value: unknown): value is ExternalTextCandidate {\n if (typeof value === 'string') return value.trim().length > 0\n if (!isRecord(value)) return false\n const entries = Object.entries(value)\n return (\n entries.length > 0 &&\n entries.every(\n ([name, content]) =>\n name.trim().length > 0 && name.trim() === name && typeof content === 'string',\n )\n )\n}\n\nexport function assertJsonValue(value: unknown, label: string, seen = new Set<object>()): void {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return\n if (typeof value === 'number' && Number.isFinite(value)) return\n if (Array.isArray(value)) {\n if (seen.has(value)) throw new Error(`${label} must be JSON-serializable`)\n seen.add(value)\n for (const item of value) assertJsonValue(item, label, seen)\n seen.delete(value)\n return\n }\n if (typeof value === 'object') {\n if (seen.has(value)) throw new Error(`${label} must be JSON-serializable`)\n const prototype = Object.getPrototypeOf(value)\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(`${label} must be JSON-serializable`)\n }\n seen.add(value)\n for (const item of Object.values(value)) assertJsonValue(item, label, seen)\n seen.delete(value)\n return\n }\n throw new Error(`${label} must be JSON-serializable`)\n}\n\nexport function assertNoCredentialValues(\n value: unknown,\n path: string,\n credentialLocation = 'runner.env',\n): void {\n if (Array.isArray(value)) {\n for (const [index, item] of value.entries()) {\n assertNoCredentialValues(item, `${path}[${index}]`, credentialLocation)\n }\n return\n }\n if (!isRecord(value)) return\n for (const [key, item] of Object.entries(value)) {\n if (isCredentialKey(key)) {\n throw new Error(`${path}.${key} must be supplied through ${credentialLocation}`)\n }\n assertNoCredentialValues(item, `${path}.${key}`, credentialLocation)\n }\n}\n\nexport function removeCredentialEnvironment(\n environment: Readonly<Record<string, string | undefined>>,\n): Record<string, string> {\n const sanitized: Record<string, string> = {}\n for (const [key, value] of Object.entries(environment)) {\n if (value !== undefined && !isCredentialKey(key)) sanitized[key] = value\n }\n return sanitized\n}\n\nexport function assertExternalOptimizerModelBudget(\n value: ExternalOptimizerModelBudget,\n label: string,\n): void {\n if (!value || typeof value !== 'object') {\n throw new Error(`${label} is required`)\n }\n for (const [field, entry] of [\n ['maxRequests', value.maxRequests],\n ['maxRequestBytes', value.maxRequestBytes],\n ['maxResponseBytes', value.maxResponseBytes],\n ['maxOutputTokensPerRequest', value.maxOutputTokensPerRequest],\n ] as const) {\n if (!Number.isSafeInteger(entry) || entry <= 0) {\n throw new Error(`${label}.${field} must be a positive safe integer`)\n }\n }\n if (!Number.isFinite(value.maxCostUsd) || value.maxCostUsd <= 0) {\n throw new Error(`${label}.maxCostUsd must be positive and finite`)\n }\n if (\n value.requestTimeoutMs !== undefined &&\n (!Number.isSafeInteger(value.requestTimeoutMs) ||\n value.requestTimeoutMs <= 0 ||\n value.requestTimeoutMs > MAX_TIMER_DELAY_MS)\n ) {\n throw new Error(`${label}.requestTimeoutMs must be between 1 and ${MAX_TIMER_DELAY_MS}`)\n }\n costForTokenPricing(value.pricing, { inputTokens: 1, outputTokens: 1 })\n}\n\nexport function safePathComponent(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/g, '_')\n}\n\nfunction isCredentialKey(key: string): boolean {\n const normalized = key\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/-/g, '_')\n .toLowerCase()\n const segments = normalized.split('_')\n return segments.some((segment) =>\n [\n 'auth',\n 'authorization',\n 'cookie',\n 'credential',\n 'credentials',\n 'key',\n 'password',\n 'secret',\n 'session',\n 'token',\n ].includes(segment),\n )\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { Server, ServerResponse } from 'node:http'\n\nexport function listenLocal(server: Server): Promise<number> {\n return new Promise((resolvePromise, reject) => {\n server.once('error', reject)\n server.listen(0, '127.0.0.1', () => {\n server.off('error', reject)\n const address = server.address()\n if (!address || typeof address === 'string') {\n reject(new Error('external optimizer callback did not bind a TCP port'))\n return\n }\n resolvePromise(address.port)\n })\n })\n}\n\nexport function closeServer(server: Server): Promise<void> {\n return new Promise((resolvePromise, reject) => {\n server.close((error) => (error ? reject(error) : resolvePromise()))\n })\n}\n\nexport function sendJson(response: ServerResponse, status: number, body: unknown): void {\n response.writeHead(status, { 'content-type': 'application/json; charset=utf-8' })\n response.end(JSON.stringify(body))\n}\n","import { randomBytes } from 'node:crypto'\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http'\nimport type {\n CostChannel,\n CostLedgerHandle,\n CostReceiptInput,\n CustomTokenPricing,\n} from '../cost-ledger'\nimport { costForTokenPricing } from '../cost-ledger'\nimport {\n assertExternalOptimizerModelBudget,\n type ExternalOptimizerModelBudget,\n type ExternalOptimizerModelProxy,\n isRecord,\n} from './external-optimizer-contracts'\nimport { closeServer, listenLocal, sendJson } from './external-optimizer-http'\n\nconst MODEL_PROXY_PATHS = new Set(['/v1/chat/completions', '/v1/responses'])\n\ninterface ProviderProxyResponse {\n status: number\n contentType: string\n body: Uint8Array\n receipt: CostReceiptInput\n usageComplete: boolean\n usageError?: string\n}\n\n/**\n * Put an OpenAI-compatible optimizer behind the shared cost ledger.\n *\n * The child process receives only a loopback URL and an ephemeral token.\n * Provider credentials stay in this process. Every request reserves its\n * conservative byte-count input bound plus the provider-enforced output cap\n * before it leaves the machine.\n */\nexport async function startExternalOptimizerModelProxy(args: {\n upstreamBaseUrl: string\n upstreamApiKey: string\n model: string\n budget: ExternalOptimizerModelBudget\n costLedger: CostLedgerHandle\n phase: string\n actor: string\n /** Cost-ledger channel. Defaults to `optimizer`. */\n channel?: CostChannel\n tags?: Record<string, string>\n initialUsage?: {\n requests: number\n costUsd: number\n }\n fetchImpl?: typeof fetch\n signal?: AbortSignal\n}): Promise<ExternalOptimizerModelProxy> {\n assertModelProxyConfig(args)\n args.signal?.throwIfAborted()\n const token = randomLocalToken()\n const fetchImpl = args.fetchImpl ?? fetch\n let requestCount = 0\n let successfulCompletionCount = 0\n let totalRequestCount = args.initialUsage?.requests ?? 0\n let committedForBudget = args.initialUsage?.costUsd ?? 0\n let reservedForBudget = 0\n let accepting = true\n let closePromise: Promise<void> | undefined\n const activeControllers = new Set<AbortController>()\n const activeHandlers = new Set<Promise<void>>()\n\n const server = createServer((request, response) => {\n if (!accepting) {\n sendJsonIfOpen(response, 503, { error: 'external optimizer model proxy is closing' })\n return\n }\n\n const controller = new AbortController()\n const abortRequest = (): void => {\n request.destroy()\n response.destroy()\n }\n activeControllers.add(controller)\n controller.signal.addEventListener('abort', abortRequest, { once: true })\n\n let handler!: Promise<void>\n handler = handleModelProxyRequest({\n request,\n response,\n controller,\n token,\n args,\n fetchImpl,\n nextReservation: (maximumCostUsd) => {\n if (totalRequestCount >= args.budget.maxRequests) {\n return { accepted: false as const, reason: 'optimizer model request limit reached' }\n }\n if (\n committedForBudget + reservedForBudget + maximumCostUsd >\n args.budget.maxCostUsd + Number.EPSILON\n ) {\n return { accepted: false as const, reason: 'optimizer model cost limit reached' }\n }\n requestCount += 1\n totalRequestCount += 1\n reservedForBudget += maximumCostUsd\n return { accepted: true as const }\n },\n settleReservation: (maximumCostUsd, chargedCostUsd) => {\n reservedForBudget = Math.max(0, reservedForBudget - maximumCostUsd)\n committedForBudget += chargedCostUsd\n },\n recordSuccessfulCompletion: () => {\n successfulCompletionCount += 1\n },\n }).finally(() => {\n controller.signal.removeEventListener('abort', abortRequest)\n activeControllers.delete(controller)\n activeHandlers.delete(handler)\n })\n activeHandlers.add(handler)\n void handler.catch(() => undefined)\n })\n const port = await listenLocal(server)\n const close = (): Promise<void> => {\n closePromise ??= closeModelProxy()\n return closePromise\n }\n const onAbort = (): void => {\n void close().catch(() => undefined)\n }\n args.signal?.addEventListener('abort', onAbort, { once: true })\n if (args.signal?.aborted) onAbort()\n return {\n baseUrl: `http://127.0.0.1:${port}/v1`,\n apiKey: token,\n requestAttempts: () => requestCount,\n successfulCompletions: () => successfulCompletionCount,\n close,\n }\n\n async function closeModelProxy(): Promise<void> {\n args.signal?.removeEventListener('abort', onAbort)\n accepting = false\n const closingServer = closeServer(server)\n server.closeIdleConnections?.()\n for (const controller of activeControllers) controller.abort()\n const [serverResult] = await Promise.allSettled([\n closingServer,\n waitForActiveHandlers(activeHandlers),\n ])\n if (activeControllers.size !== 0 || activeHandlers.size !== 0) {\n throw new Error('external optimizer model proxy closed with active request work')\n }\n if (serverResult?.status === 'rejected') throw serverResult.reason\n }\n}\n\nasync function handleModelProxyRequest(args: {\n request: IncomingMessage\n response: ServerResponse\n controller: AbortController\n token: string\n args: {\n upstreamBaseUrl: string\n upstreamApiKey: string\n model: string\n budget: ExternalOptimizerModelBudget\n costLedger: CostLedgerHandle\n phase: string\n actor: string\n channel?: CostChannel\n tags?: Record<string, string>\n }\n fetchImpl: typeof fetch\n nextReservation: (maximumCostUsd: number) =>\n | { accepted: true }\n | {\n accepted: false\n reason: 'optimizer model request limit reached' | 'optimizer model cost limit reached'\n }\n settleReservation: (maximumCostUsd: number, chargedCostUsd: number) => void\n recordSuccessfulCompletion: () => void\n}): Promise<void> {\n const { controller, request, response } = args\n try {\n const path = request.url ? new URL(request.url, 'http://127.0.0.1').pathname : ''\n if (request.method !== 'POST' || !MODEL_PROXY_PATHS.has(path)) {\n sendJsonIfOpen(response, 404, { error: 'not found' })\n return\n }\n if (request.headers.authorization !== `Bearer ${args.token}`) {\n sendJsonIfOpen(response, 401, { error: 'unauthorized' })\n return\n }\n\n const body = await readBody(request, args.args.budget.maxRequestBytes)\n const parsed = parseModelProxyRequest(body, args.args.model, args.args.budget)\n const maximumUsage = conservativeMaximumUsage(\n body.byteLength,\n parsed.maxOutputTokens,\n args.args.budget.pricing,\n )\n const maximumCostUsd = costForTokenPricing(args.args.budget.pricing, maximumUsage)\n const reservation = args.nextReservation(maximumCostUsd)\n if (!reservation.accepted) {\n sendJsonIfOpen(response, 429, { error: reservation.reason })\n return\n }\n\n const timeout = setTimeout(\n () => controller.abort(),\n args.args.budget.requestTimeoutMs ?? 300_000,\n )\n let chargedForBudget = maximumCostUsd\n try {\n const paid = await args.args.costLedger.runPaidCall<ProviderProxyResponse>({\n channel: args.args.channel ?? 'optimizer',\n phase: args.args.phase,\n actor: args.args.actor,\n ...(args.args.tags ? { tags: args.args.tags } : {}),\n model: args.args.model,\n maximumCharge: {\n customTokenPricing: args.args.budget.pricing,\n ...maximumUsage,\n },\n execute: async () =>\n forwardModelProxyRequest({\n fetchImpl: args.fetchImpl,\n upstreamBaseUrl: args.args.upstreamBaseUrl,\n upstreamApiKey: args.args.upstreamApiKey,\n path,\n body,\n model: args.args.model,\n pricing: args.args.budget.pricing,\n maxOutputTokens: parsed.maxOutputTokens,\n maxResponseBytes: args.args.budget.maxResponseBytes,\n signal: controller.signal,\n }),\n receipt: (result) => result.receipt,\n receiptFromError: () => ({\n model: args.args.model,\n inputTokens: 0,\n outputTokens: 0,\n costUnknown: true,\n usageUnknown: true,\n }),\n })\n if (!paid.succeeded) {\n chargedForBudget = paid.receipt\n ? paid.receipt.usageUnknown || paid.receipt.costUnknown\n ? maximumCostUsd\n : paid.receipt.costUsd\n : 0\n sendJsonIfOpen(\n response,\n isAbortError(paid.error)\n ? 504\n : paid.error instanceof ProviderResponseTooLargeError\n ? 502\n : 429,\n { error: paid.error.message },\n )\n return\n }\n chargedForBudget = paid.value.usageComplete ? paid.receipt.costUsd : maximumCostUsd\n if (!paid.value.usageComplete) {\n sendJsonIfOpen(response, 502, {\n error: paid.value.usageError ?? 'optimizer model response omitted complete token usage',\n })\n return\n }\n if (paid.value.usageError) {\n sendJsonIfOpen(response, 502, { error: paid.value.usageError })\n return\n }\n if (paid.value.status >= 200 && paid.value.status < 300) {\n args.recordSuccessfulCompletion()\n }\n if (response.destroyed || response.writableEnded) return\n response.writeHead(paid.value.status, {\n 'content-type': paid.value.contentType,\n 'content-length': String(paid.value.body.byteLength),\n })\n response.end(paid.value.body)\n } finally {\n clearTimeout(timeout)\n args.settleReservation(maximumCostUsd, chargedForBudget)\n }\n } catch (error) {\n const status =\n error instanceof RequestBodyTooLargeError\n ? 413\n : error instanceof Error && isAbortError(error)\n ? 503\n : 400\n sendJsonIfOpen(response, status, { error: toErrorMessage(error) })\n }\n}\n\nasync function waitForActiveHandlers(activeHandlers: Set<Promise<void>>): Promise<void> {\n while (activeHandlers.size > 0) {\n await Promise.allSettled([...activeHandlers])\n }\n}\n\nfunction sendJsonIfOpen(response: ServerResponse, status: number, body: unknown): void {\n if (response.destroyed || response.writableEnded) return\n sendJson(response, status, body)\n}\n\nasync function forwardModelProxyRequest(args: {\n fetchImpl: typeof fetch\n upstreamBaseUrl: string\n upstreamApiKey: string\n path: string\n body: Uint8Array\n model: string\n pricing: CustomTokenPricing\n maxOutputTokens: number\n maxResponseBytes: number\n signal: AbortSignal\n}): Promise<ProviderProxyResponse> {\n const upstream = modelProxyUpstreamUrl(args.upstreamBaseUrl, args.path)\n const response = await args.fetchImpl(upstream, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${args.upstreamApiKey}`,\n 'content-type': 'application/json',\n },\n body: args.body.buffer.slice(\n args.body.byteOffset,\n args.body.byteOffset + args.body.byteLength,\n ) as ArrayBuffer,\n signal: args.signal,\n redirect: 'error',\n })\n const body = await readProviderResponseBody(response, args.maxResponseBytes)\n const usage = parseProviderUsage(body)\n const successful = response.status >= 200 && response.status < 300\n const zeroUsage =\n successful &&\n usage !== undefined &&\n usage.inputTokens +\n usage.outputTokens +\n (usage.cachedTokens ?? 0) +\n (usage.cacheWriteTokens ?? 0) ===\n 0\n const usageError = zeroUsage\n ? 'optimizer model provider reported zero token usage for a successful response'\n : successful && usage !== undefined && usage.outputTokens > args.maxOutputTokens\n ? `optimizer model provider reported ${usage.outputTokens} output tokens, exceeding requested limit ${args.maxOutputTokens}`\n : undefined\n return {\n status: response.status,\n contentType: response.headers.get('content-type') ?? 'application/json',\n body,\n receipt:\n usage && !zeroUsage\n ? {\n model: args.model,\n ...usage,\n ...(usage.actualCostUsd === undefined ? { customTokenPricing: args.pricing } : {}),\n }\n : {\n model: args.model,\n inputTokens: 0,\n outputTokens: 0,\n costUnknown: true,\n usageUnknown: true,\n },\n usageComplete: usage !== undefined && !zeroUsage,\n ...(usageError ? { usageError } : {}),\n }\n}\n\nfunction parseModelProxyRequest(\n body: Uint8Array,\n expectedModel: string,\n budget: ExternalOptimizerModelBudget,\n): { maxOutputTokens: number } {\n let value: unknown\n try {\n value = JSON.parse(Buffer.from(body).toString('utf8'))\n } catch {\n throw new Error('optimizer model request must be valid JSON')\n }\n if (!isRecord(value)) throw new Error('optimizer model request must be a JSON object')\n if (value.model !== expectedModel) {\n throw new Error(`optimizer model request must use configured model '${expectedModel}'`)\n }\n if (value.stream !== undefined && value.stream !== false) {\n throw new Error('streaming optimizer model requests are not supported')\n }\n for (const field of ['n', 'best_of', 'candidate_count', 'num_candidates'] as const) {\n if (value[field] !== undefined && value[field] !== 1) {\n throw new Error(`optimizer model request ${field} must be 1 when supplied`)\n }\n }\n const suppliedMaximums = [\n value.max_output_tokens,\n value.max_completion_tokens,\n value.max_tokens,\n ].filter((maximum) => maximum !== undefined)\n if (\n suppliedMaximums.length === 0 ||\n suppliedMaximums.some((maximum) => !Number.isSafeInteger(maximum) || (maximum as number) <= 0)\n ) {\n throw new Error('optimizer model request requires a positive output-token limit')\n }\n const maxOutputTokens = Math.max(...(suppliedMaximums as number[]))\n if (maxOutputTokens > budget.maxOutputTokensPerRequest) {\n throw new Error('optimizer model request exceeds maxOutputTokensPerRequest')\n }\n return { maxOutputTokens }\n}\n\nfunction modelProxyUpstreamUrl(baseUrl: string, requestPath: string): string {\n const upstream = new URL(baseUrl)\n const basePath = upstream.pathname.replace(/\\/+$/, '')\n const suffix = basePath.endsWith('/v1') ? requestPath.replace(/^\\/v1/, '') : requestPath\n upstream.pathname = `${basePath}${suffix}`\n return upstream.toString()\n}\n\nfunction parseProviderUsage(\n body: Uint8Array,\n):\n | Omit<CostReceiptInput, 'model' | 'customTokenPricing' | 'costUnknown' | 'usageUnknown'>\n | undefined {\n let value: unknown\n try {\n value = JSON.parse(Buffer.from(body).toString('utf8'))\n } catch {\n return undefined\n }\n if (!isRecord(value) || !isRecord(value.usage)) return undefined\n const usage = value.usage\n const totalInputTokens = usage.input_tokens ?? usage.prompt_tokens\n const outputTokens = usage.output_tokens ?? usage.completion_tokens\n if (\n !Number.isSafeInteger(totalInputTokens) ||\n (totalInputTokens as number) < 0 ||\n !Number.isSafeInteger(outputTokens) ||\n (outputTokens as number) < 0\n ) {\n return undefined\n }\n const inputDetails = isRecord(usage.input_tokens_details)\n ? usage.input_tokens_details\n : isRecord(usage.prompt_tokens_details)\n ? usage.prompt_tokens_details\n : {}\n const outputDetails = isRecord(usage.output_tokens_details)\n ? usage.output_tokens_details\n : isRecord(usage.completion_tokens_details)\n ? usage.completion_tokens_details\n : {}\n const cachedTokens = optionalTokenCount(inputDetails, [\n 'cached_tokens',\n 'cache_read_tokens',\n 'cache_read_input_tokens',\n ])\n const cacheWriteTokens = optionalTokenCount(inputDetails, [\n 'cache_write_tokens',\n 'cache_creation_tokens',\n 'cache_creation_input_tokens',\n ])\n const reasoningTokens = optionalTokenCount(outputDetails, ['reasoning_tokens'])\n const actualCostUsd =\n typeof usage.cost === 'number' && Number.isFinite(usage.cost) && usage.cost >= 0\n ? usage.cost\n : undefined\n if (\n cachedTokens === INVALID_TOKEN_COUNT ||\n cacheWriteTokens === INVALID_TOKEN_COUNT ||\n reasoningTokens === INVALID_TOKEN_COUNT\n ) {\n return undefined\n }\n const classifiedInputTokens = (cachedTokens ?? 0) + (cacheWriteTokens ?? 0)\n if (\n classifiedInputTokens > (totalInputTokens as number) ||\n (reasoningTokens ?? 0) > (outputTokens as number)\n ) {\n return undefined\n }\n return {\n inputTokens: (totalInputTokens as number) - classifiedInputTokens,\n outputTokens: outputTokens as number,\n ...(cachedTokens === undefined ? {} : { cachedTokens }),\n ...(cacheWriteTokens === undefined ? {} : { cacheWriteTokens }),\n ...(reasoningTokens === undefined ? {} : { reasoningTokens }),\n ...(actualCostUsd === undefined ? {} : { actualCostUsd }),\n }\n}\n\nconst INVALID_TOKEN_COUNT = Symbol('invalid-token-count')\n\nfunction optionalTokenCount(\n details: Record<string, unknown>,\n fields: readonly string[],\n): number | undefined | typeof INVALID_TOKEN_COUNT {\n let found: number | undefined\n for (const field of fields) {\n const value = details[field]\n if (value === undefined || value === null) continue\n if (!Number.isSafeInteger(value) || (value as number) < 0) return INVALID_TOKEN_COUNT\n if (found !== undefined && found !== value) return INVALID_TOKEN_COUNT\n found = value as number\n }\n return found\n}\n\nfunction conservativeMaximumUsage(\n inputTokenUpperBound: number,\n outputTokenUpperBound: number,\n pricing: CustomTokenPricing,\n): Pick<CostReceiptInput, 'inputTokens' | 'outputTokens' | 'cachedTokens' | 'cacheWriteTokens'> {\n const inputRates = [\n pricing.inputUsdPerMillion,\n pricing.cachedInputUsdPerMillion ?? pricing.inputUsdPerMillion,\n pricing.cacheWriteUsdPerMillion ?? pricing.inputUsdPerMillion,\n ]\n const mostExpensiveInputClass = inputRates.indexOf(Math.max(...inputRates))\n return {\n inputTokens: mostExpensiveInputClass === 0 ? inputTokenUpperBound : 0,\n ...(mostExpensiveInputClass === 1 ? { cachedTokens: inputTokenUpperBound } : {}),\n ...(mostExpensiveInputClass === 2 ? { cacheWriteTokens: inputTokenUpperBound } : {}),\n outputTokens: outputTokenUpperBound,\n }\n}\n\nasync function readProviderResponseBody(response: Response, maxBytes: number): Promise<Uint8Array> {\n const declaredLength = response.headers.get('content-length')\n if (declaredLength !== null) {\n const parsedLength = Number(declaredLength)\n if (Number.isFinite(parsedLength) && parsedLength > maxBytes) {\n throw new ProviderResponseTooLargeError()\n }\n }\n if (!response.body) return new Uint8Array()\n\n const reader = response.body.getReader()\n const chunks: Uint8Array[] = []\n let totalBytes = 0\n try {\n while (true) {\n const next = await reader.read()\n if (next.done) break\n totalBytes += next.value.byteLength\n if (totalBytes > maxBytes) {\n await reader.cancel()\n throw new ProviderResponseTooLargeError()\n }\n chunks.push(next.value)\n }\n } finally {\n reader.releaseLock()\n }\n\n const body = new Uint8Array(totalBytes)\n let offset = 0\n for (const chunk of chunks) {\n body.set(chunk, offset)\n offset += chunk.byteLength\n }\n return body\n}\n\nfunction assertModelProxyConfig(args: {\n upstreamBaseUrl: string\n upstreamApiKey: string\n model: string\n budget: ExternalOptimizerModelBudget\n phase: string\n actor: string\n tags?: Record<string, string>\n initialUsage?: {\n requests: number\n costUsd: number\n }\n}): void {\n for (const [label, value] of [\n ['upstreamBaseUrl', args.upstreamBaseUrl],\n ['upstreamApiKey', args.upstreamApiKey],\n ['model', args.model],\n ['phase', args.phase],\n ['actor', args.actor],\n ] as const) {\n if (typeof value !== 'string' || !value.trim() || value.trim() !== value) {\n throw new Error(`external optimizer model proxy: ${label} must be trimmed and non-empty`)\n }\n }\n let parsed: URL\n try {\n parsed = new URL(args.upstreamBaseUrl)\n } catch {\n throw new Error('external optimizer model proxy: upstreamBaseUrl must be an HTTP(S) URL')\n }\n if (\n (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') ||\n parsed.username ||\n parsed.password ||\n parsed.search ||\n parsed.hash\n ) {\n throw new Error(\n 'external optimizer model proxy: upstreamBaseUrl must be an HTTP(S) URL without credentials, query, or fragment',\n )\n }\n assertExternalOptimizerModelBudget(args.budget, 'external optimizer model proxy: budget')\n if (args.tags !== undefined) {\n for (const [key, value] of Object.entries(args.tags)) {\n if (!key.trim() || key.trim() !== key || !value.trim() || value.trim() !== value) {\n throw new Error('external optimizer model proxy: tags must be trimmed and non-empty')\n }\n }\n }\n if (args.initialUsage !== undefined) {\n if (\n !Number.isSafeInteger(args.initialUsage.requests) ||\n args.initialUsage.requests < 0 ||\n !Number.isFinite(args.initialUsage.costUsd) ||\n args.initialUsage.costUsd < 0\n ) {\n throw new Error(\n 'external optimizer model proxy: initialUsage must contain non-negative requests and cost',\n )\n }\n if (\n args.initialUsage.requests > args.budget.maxRequests ||\n args.initialUsage.costUsd > args.budget.maxCostUsd + Number.EPSILON\n ) {\n throw new Error('external optimizer model proxy: initialUsage exceeds the configured budget')\n }\n }\n}\n\nclass RequestBodyTooLargeError extends Error {}\n\nclass ProviderResponseTooLargeError extends Error {\n constructor() {\n super('optimizer model response exceeds maxResponseBytes')\n }\n}\n\nfunction readBody(request: IncomingMessage, maximumBytes: number): Promise<Uint8Array> {\n return new Promise((resolvePromise, reject) => {\n let size = 0\n let tooLarge = false\n const chunks: Buffer[] = []\n request.on('data', (chunk: Buffer) => {\n if (tooLarge) return\n size += chunk.byteLength\n if (size > maximumBytes) {\n tooLarge = true\n chunks.length = 0\n return\n }\n chunks.push(chunk)\n })\n request.on('error', reject)\n request.on('end', () => {\n if (tooLarge) {\n reject(new RequestBodyTooLargeError('optimizer model request body too large'))\n return\n }\n resolvePromise(new Uint8Array(Buffer.concat(chunks)))\n })\n })\n}\n\nfunction randomLocalToken(): string {\n return randomBytes(32).toString('hex')\n}\n\nfunction isAbortError(error: Error): boolean {\n return error.name === 'AbortError' || error.message.toLowerCase().includes('abort')\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","import type {\n ExternalOptimizerCallback,\n ExternalOptimizerModelProxy,\n} from './external-optimizer-contracts'\n\nexport async function runWithCleanup<T>(args: {\n label: string\n run: () => Promise<T>\n cleanup: () => Promise<void>\n}): Promise<T> {\n let value: T | undefined\n let operationError: Error | undefined\n try {\n value = await args.run()\n } catch (cause) {\n operationError = toError(cause)\n }\n\n let cleanupError: Error | undefined\n try {\n await args.cleanup()\n } catch (cause) {\n cleanupError = toError(cause)\n }\n\n if (operationError && cleanupError) {\n throw new AggregateError(\n [operationError, cleanupError],\n `${operationError.message}; ${args.label} cleanup failed: ${cleanupError.message}`,\n )\n }\n if (operationError) throw operationError\n if (cleanupError) {\n throw new Error(`${args.label} cleanup failed: ${cleanupError.message}`, {\n cause: cleanupError,\n })\n }\n return value as T\n}\n\nexport async function closeExternalOptimizerResources(args: {\n label: string\n callback: ExternalOptimizerCallback\n modelProxy?: ExternalOptimizerModelProxy\n}): Promise<void> {\n const results = await Promise.allSettled([\n ...(args.modelProxy ? [args.modelProxy.close()] : []),\n args.callback.close(),\n ])\n const errors = results.flatMap((result) => (result.status === 'rejected' ? [result.reason] : []))\n if (errors.length > 0) {\n throw new AggregateError(errors, `${args.label}: failed to close optimizer resources`)\n }\n}\n\nfunction toError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause))\n}\n","import { type ChildProcess, spawn } from 'node:child_process'\nimport { lstat, mkdtemp, open, rm, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { isAbsolute, join, resolve } from 'node:path'\nimport { type ExternalOptimizerRunnerCommand, isRecord } from './external-optimizer-contracts'\nimport { runWithCleanup } from './external-optimizer-resources'\n\nconst MAX_PROCESS_OUTPUT_CHARS = 64_000\nconst MAX_PROCESS_INPUT_BYTES = 64 * 1024 * 1024\nconst MAX_PROCESS_RESULT_BYTES = 4 * 1024 * 1024\nconst PROCESS_TERMINATION_GRACE_MS = 5_000\nconst PROCESS_TERMINATION_POLL_MS = 25\nconst PROCESS_KILL_WAIT_MS = 1_000\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\nconst PROCESS_OUTPUT_HEAD_CHARS = MAX_PROCESS_OUTPUT_CHARS / 2\nconst PROCESS_OUTPUT_TAIL_CHARS = MAX_PROCESS_OUTPUT_CHARS - PROCESS_OUTPUT_HEAD_CHARS\n\ninterface ProcessOutputCapture {\n full: string | undefined\n head: string\n tail: string\n totalChars: number\n}\n\nexport async function runExternalOptimizerProcess<TOutput>(args: {\n label: string\n tempPrefix: string\n module: string\n input: unknown\n runner?: ExternalOptimizerRunnerCommand\n timeoutMs: number\n signal?: AbortSignal\n}): Promise<TOutput> {\n if (\n !Number.isSafeInteger(args.timeoutMs) ||\n args.timeoutMs <= 0 ||\n args.timeoutMs > MAX_TIMER_DELAY_MS\n ) {\n throw new Error(`${args.label} timeoutMs must be between 1 and ${MAX_TIMER_DELAY_MS}`)\n }\n if (process.platform === 'win32') {\n throw new Error(\n `${args.label} requires POSIX process-group cleanup; run the optimizer through WSL or Linux`,\n )\n }\n throwIfAborted(args.signal, args.label)\n const dir = await mkdtemp(join(tmpdir(), args.tempPrefix))\n const inputPath = join(dir, 'input.json')\n const outputPath = join(dir, 'output.json')\n return runWithCleanup({\n label: `${args.label} temporary directory`,\n run: async () => {\n const serializedInput = JSON.stringify(args.input)\n if (serializedInput === undefined) {\n throw new Error(`${args.label} input must be JSON-serializable`)\n }\n const inputJson = `${serializedInput}\\n`\n const inputBytes = Buffer.byteLength(inputJson)\n if (inputBytes > MAX_PROCESS_INPUT_BYTES) {\n throw new Error(\n `${args.label} input exceeds ${MAX_PROCESS_INPUT_BYTES} bytes (${inputBytes})`,\n )\n }\n await writeFile(inputPath, inputJson)\n const command = resolveRunnerCommand(args.runner?.command ?? 'python')\n const commandArgs = [\n ...(args.runner?.args ?? ['-m', args.module]),\n '--input',\n inputPath,\n '--output',\n outputPath,\n ]\n await runProcess({\n label: args.label,\n command,\n args: commandArgs,\n cwd: dir,\n env: args.runner?.env,\n timeoutMs: args.timeoutMs,\n signal: args.signal,\n })\n throwIfAborted(args.signal, args.label)\n const raw = JSON.parse(\n await readBoundedTextFile(outputPath, MAX_PROCESS_RESULT_BYTES, `${args.label} output`),\n ) as unknown\n throwIfAborted(args.signal, args.label)\n if (!isRecord(raw)) throw new Error(`${args.label} output must be a JSON object`)\n return raw as TOutput\n },\n cleanup: () => rm(dir, { recursive: true, force: true }),\n })\n}\n\nfunction resolveRunnerCommand(command: string): string {\n if (isAbsolute(command) || (!command.includes('/') && !command.includes('\\\\'))) return command\n return resolve(command)\n}\n\nasync function readBoundedTextFile(path: string, maxBytes: number, label: string): Promise<string> {\n const entry = await lstat(path)\n if (!entry.isFile()) throw new Error(`${label} must be a regular file`)\n const file = await open(path, 'r')\n try {\n const buffer = Buffer.allocUnsafe(maxBytes + 1)\n let bytesRead = 0\n while (bytesRead < buffer.byteLength) {\n const chunk = await file.read(buffer, bytesRead, buffer.byteLength - bytesRead, bytesRead)\n if (chunk.bytesRead === 0) break\n bytesRead += chunk.bytesRead\n }\n if (bytesRead > maxBytes) {\n throw new Error(`${label} exceeds ${maxBytes} bytes`)\n }\n return buffer.subarray(0, bytesRead).toString('utf8')\n } finally {\n await file.close()\n }\n}\n\nfunction runProcess(args: {\n label: string\n command: string\n args: string[]\n cwd: string | undefined\n env: NodeJS.ProcessEnv | undefined\n timeoutMs: number\n signal: AbortSignal | undefined\n}): Promise<void> {\n throwIfAborted(args.signal, args.label)\n return new Promise((resolvePromise, reject) => {\n const child = spawn(args.command, args.args, {\n cwd: args.cwd,\n env: { ...safeProcessEnvironment(), ...args.env },\n stdio: ['ignore', 'pipe', 'pipe'],\n detached: process.platform !== 'win32',\n windowsHide: true,\n })\n const stdout = createProcessOutputCapture()\n const stderr = createProcessOutputCapture()\n let settled = false\n let timeout: NodeJS.Timeout | undefined\n const onAbort = () => finish(abortReason(args.signal!, args.label))\n const finish = (error?: Error) => {\n if (settled) return\n settled = true\n if (timeout) clearTimeout(timeout)\n args.signal?.removeEventListener('abort', onAbort)\n void terminateProcessTree(child).then(\n () => {\n if (error) reject(error)\n else resolvePromise()\n },\n (cleanupError: unknown) => {\n if (error) {\n const cleanup =\n cleanupError instanceof Error ? cleanupError : new Error(String(cleanupError))\n reject(\n new AggregateError(\n [error, cleanup],\n `${error.message}; ${args.label} process cleanup failed: ${cleanup.message}`,\n ),\n )\n return\n }\n reject(\n new Error(\n `${args.label} process cleanup failed: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`,\n ),\n )\n },\n )\n }\n timeout = setTimeout(() => {\n finish(new Error(`${args.label} exceeded ${args.timeoutMs}ms`))\n }, args.timeoutMs)\n args.signal?.addEventListener('abort', onAbort, { once: true })\n if (args.signal?.aborted) onAbort()\n child.stdout.on('data', (chunk: Buffer) => {\n appendProcessOutput(stdout, chunk)\n })\n child.stderr.on('data', (chunk: Buffer) => {\n appendProcessOutput(stderr, chunk)\n })\n child.on('error', (error) => {\n finish(new Error(`${args.label} could not start: ${error.message}`))\n })\n child.on('close', (code) => {\n if (code === 0) {\n finish()\n return\n }\n finish(\n new Error(\n `${args.label} exited ${String(code)}. stderr=${summarizeProcessOutput(stderr)} stdout=${summarizeProcessOutput(stdout)}`,\n ),\n )\n })\n })\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined, label: string): void {\n if (signal?.aborted) throw abortReason(signal, label)\n}\n\nfunction abortReason(signal: AbortSignal, label: string): Error {\n return signal.reason instanceof Error\n ? signal.reason\n : new Error(`${label} aborted`, { cause: signal.reason })\n}\n\nfunction safeProcessEnvironment(): NodeJS.ProcessEnv {\n const allowed = [\n 'PATH',\n 'HOME',\n 'USER',\n 'LOGNAME',\n 'SHELL',\n 'TMPDIR',\n 'TMP',\n 'TEMP',\n 'LANG',\n 'LANGUAGE',\n 'LC_ALL',\n 'VIRTUAL_ENV',\n 'PYTHONPATH',\n 'SYSTEMROOT',\n 'COMSPEC',\n 'PATHEXT',\n 'WINDIR',\n ] as const\n return Object.fromEntries(\n allowed.flatMap((name) => {\n const value = process.env[name]\n return value === undefined ? [] : [[name, value]]\n }),\n )\n}\n\nasync function terminateProcessTree(child: ChildProcess): Promise<void> {\n const pid = child.pid\n if (!pid) return\n if (process.platform === 'win32') {\n throw new Error('native Windows process-tree cleanup is unsupported')\n }\n\n if (!signalProcessGroup(pid, 'SIGTERM')) return\n if (await waitForProcessGroupExit(pid, PROCESS_TERMINATION_GRACE_MS)) return\n if (!signalProcessGroup(pid, 'SIGKILL')) return\n if (await waitForProcessGroupExit(pid, PROCESS_KILL_WAIT_MS)) return\n throw new Error(`process group ${pid} remained alive after SIGKILL`)\n}\n\nfunction signalProcessGroup(pid: number, signal: NodeJS.Signals): boolean {\n try {\n process.kill(-pid, signal)\n return true\n } catch (error) {\n if (isMissingProcessError(error)) return false\n throw error\n }\n}\n\nasync function waitForProcessGroupExit(pid: number, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs\n while (processGroupExists(pid)) {\n const remainingMs = deadline - Date.now()\n if (remainingMs <= 0) return false\n await new Promise((resolve) =>\n setTimeout(resolve, Math.min(PROCESS_TERMINATION_POLL_MS, remainingMs)),\n )\n }\n return true\n}\n\nfunction processGroupExists(pid: number): boolean {\n try {\n process.kill(-pid, 0)\n return true\n } catch (error) {\n if (isMissingProcessError(error)) return false\n throw error\n }\n}\n\nfunction isMissingProcessError(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n (error as { code?: unknown }).code === 'ESRCH'\n )\n}\n\nfunction createProcessOutputCapture(): ProcessOutputCapture {\n return { full: '', head: '', tail: '', totalChars: 0 }\n}\n\nfunction appendProcessOutput(capture: ProcessOutputCapture, chunk: Buffer): void {\n const text = chunk.toString()\n capture.totalChars += text.length\n if (capture.full !== undefined) {\n const combined = `${capture.full}${text}`\n if (combined.length <= MAX_PROCESS_OUTPUT_CHARS) {\n capture.full = combined\n return\n }\n capture.head = combined.slice(0, PROCESS_OUTPUT_HEAD_CHARS)\n capture.tail = combined.slice(-PROCESS_OUTPUT_TAIL_CHARS)\n capture.full = undefined\n return\n }\n capture.tail = `${capture.tail}${text}`.slice(-PROCESS_OUTPUT_TAIL_CHARS)\n}\n\nfunction summarizeProcessOutput(capture: ProcessOutputCapture, max = 4_000): string {\n const raw =\n capture.full ??\n `${capture.head}\\n...[${capture.totalChars - capture.head.length - capture.tail.length} chars omitted]...\\n${capture.tail}`\n const compact = raw.trim().replace(/\\s+/g, ' ')\n if (compact.length <= max) return compact\n const headChars = Math.floor(max / 3)\n const tailChars = max - headChars\n return `${compact.slice(0, headChars)}...[${compact.length - max} chars omitted]...${compact.slice(-tailChars)}`\n}\n","import { ValidationError } from '../errors'\n\n/** Base error for invalid search-ledger input or operations. */\nexport class SearchLedgerError extends ValidationError {}\n\n/** Error raised when durable search-ledger data fails an integrity check. */\nexport class SearchLedgerIntegrityError extends SearchLedgerError {}\n\n/** Error raised when an event identifier is reused with different content. */\nexport class SearchLedgerConflictError extends SearchLedgerError {}\n","/** Campaign binding of the generic journal file layer to search-ledger errors. */\n\nimport {\n appendLedgerLine,\n type FileLockResult,\n type LedgerFileContext,\n tryWithLedgerFileLock,\n withLedgerFileLock,\n} from '../ledger-core'\nimport { SearchLedgerIntegrityError } from './search-ledger-errors'\n\nexport const SEARCH_LEDGER_FILE_CONTEXT: LedgerFileContext = {\n subject: 'search ledger',\n integrityError: (message, options) => new SearchLedgerIntegrityError(message, options),\n}\n\nexport function appendSearchLedgerLine(path: string, line: string): void {\n appendLedgerLine(path, line, SEARCH_LEDGER_FILE_CONTEXT)\n}\n\nexport function withSearchLedgerFileLock<T>(ledgerPath: string, run: () => T): T {\n return withLedgerFileLock(ledgerPath, SEARCH_LEDGER_FILE_CONTEXT, run)\n}\n\nexport type { FileLockResult }\n\nexport function tryWithSearchLedgerFileLock<T>(\n ledgerPath: string,\n run: () => T,\n): FileLockResult<T> {\n return tryWithLedgerFileLock(ledgerPath, SEARCH_LEDGER_FILE_CONTEXT, run)\n}\n","import { createRequire } from 'node:module'\nimport { join } from 'node:path'\nimport { CostLedger } from '../cost-ledger'\nimport { appendSearchLedgerLine, tryWithSearchLedgerFileLock } from './search-ledger-file'\n\n/**\n * `CampaignStorage` — the filesystem seam `runCampaign` writes through\n * (run/cell dirs, the resumability cache, per-cell artifacts, trace spans).\n *\n * The default (`fsCampaignStorage`) is the Node filesystem — identical\n * behavior to the inline `node:fs` calls it replaces, so existing CLI\n * consumers are unaffected. `inMemoryCampaignStorage` keeps everything in a\n * `Map`, so the substrate runs in environments WITHOUT a filesystem\n * (Cloudflare Workers, Deno Deploy, other edge runtimes) — the campaign\n * still produces its `CampaignResult` (cells + aggregates) in memory;\n * artifacts/traces simply aren't persisted to disk.\n *\n * Paths are opaque keys to the in-memory adapter — it does not parse them,\n * so the same `join(...)`-built paths work unchanged across both adapters.\n */\nexport interface CampaignStorage {\n /** Ensure a directory exists (recursive). No-op for in-memory. */\n ensureDir(dir: string): void\n /** Does this path exist (as a written file or an ensured dir)? */\n exists(path: string): boolean\n /** Read a UTF-8 file; `undefined` when missing or unreadable. */\n read(path: string): string | undefined\n /** Write a file (string or bytes). Parent dir is assumed ensured. */\n write(path: string, content: string | Uint8Array): void\n /** Append only when the current UTF-8 byte length matches `expectedBytes`.\n * Returns the new length, or undefined when another writer won. */\n append(path: string, content: string, expectedBytes: number): number | undefined\n}\n\n/** Node-filesystem storage — the default. Lazily requires `node:fs` so the\n * module imports cleanly in non-Node runtimes (where the caller passes\n * `inMemoryCampaignStorage` instead and never constructs this).\n *\n * `createRequire(import.meta.url)` is the ESM-native lazy require — a bare\n * `require` is a ReferenceError under `\"type\": \"module\"`, which is exactly\n * the shape this package publishes. */\nexport function fsCampaignStorage(): CampaignStorage {\n const nodeRequire = createRequire(import.meta.url)\n const { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } = nodeRequire(\n 'node:fs',\n ) as typeof import('node:fs')\n return {\n ensureDir(dir) {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n },\n exists(path) {\n return existsSync(path)\n },\n read(path) {\n try {\n return readFileSync(path, 'utf8')\n } catch {\n return undefined\n }\n },\n write(path, content) {\n writeFileSync(path, content as Uint8Array)\n },\n append(path, content, expectedBytes) {\n const result = tryWithSearchLedgerFileLock(path, () => {\n let actualBytes = 0\n try {\n actualBytes = statSync(path).size\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n }\n if (actualBytes !== expectedBytes) return undefined\n appendSearchLedgerLine(path, content)\n return expectedBytes + Buffer.byteLength(content)\n })\n return result.acquired ? result.value : undefined\n },\n }\n}\n\n/** In-memory storage for filesystem-less runtimes. Artifacts + trace spans\n * live in a `Map` for the duration of the run; the `CampaignResult` is\n * fully populated, but nothing is persisted to disk. */\nexport function inMemoryCampaignStorage(): CampaignStorage {\n const files = new Map<string, string | Uint8Array>()\n const dirs = new Set<string>()\n return {\n ensureDir(dir) {\n dirs.add(dir)\n },\n exists(path) {\n return files.has(path) || dirs.has(path)\n },\n read(path) {\n const value = files.get(path)\n if (value === undefined) return undefined\n return typeof value === 'string' ? value : new TextDecoder().decode(value)\n },\n write(path, content) {\n files.set(path, content)\n },\n append(path, content, expectedBytes) {\n const current = files.get(path)\n const currentText =\n current === undefined\n ? ''\n : typeof current === 'string'\n ? current\n : new TextDecoder().decode(current)\n const currentBytes = new TextEncoder().encode(currentText).byteLength\n if (currentBytes !== expectedBytes) return undefined\n files.set(path, `${currentText}${content}`)\n return currentBytes + new TextEncoder().encode(content).byteLength\n },\n }\n}\n\n/** Open the durable spend account stored beside a logical run. */\nexport function createRunCostLedger(input: {\n storage: CampaignStorage\n runDir: string\n costCeilingUsd?: number\n}): CostLedger {\n const path = join(input.runDir, 'cost-ledger.jsonl')\n input.storage.ensureDir(input.runDir)\n return new CostLedger({\n costCeilingUsd: input.costCeilingUsd,\n persistence: {\n read: () => {\n const stored = input.storage.read(path)\n if (stored === undefined && input.storage.exists(path)) {\n throw new Error(`CostLedger: cannot read existing event log '${path}'`)\n }\n const events = stored ?? ''\n return {\n revision: String(new TextEncoder().encode(events).byteLength),\n events,\n }\n },\n append: (expectedRevision, event) => {\n const expectedBytes = Number(expectedRevision)\n if (!Number.isSafeInteger(expectedBytes) || expectedBytes < 0) {\n throw new Error(`CostLedger: invalid storage revision '${expectedRevision}'`)\n }\n const next = input.storage.append(path, event, expectedBytes)\n return next === undefined ? undefined : String(next)\n },\n },\n })\n}\n","/**\n * Single-run lock for evaluations that share one mutable environment.\n *\n * Two concurrent runs against a shared stateful gym silently corrupt each\n * other: each resets/mutates environment state mid-cell of the other, and\n * every score from both becomes garbage that LOOKS like worker variance\n * (agent-lab R357 burned hours on flip-flopping scores before tracing them\n * to exactly this). The fix is a pid lockfile: refuse to start while a live\n * holder exists, reclaim stale locks whose pid is gone, release only if the\n * lock is still ours.\n *\n * `alsoCheck` exists because independent runners can guard the same shared\n * resource with differently named lockfiles; a runner must respect all of\n * them even though it writes only its own.\n */\n\nimport {\n type AtomicFileLockUnavailable,\n probeAtomicFileLock,\n tryAcquireAtomicFileLock,\n} from '../ledger-core/atomic-file-lock'\n\nexport interface SingleRunLockOptions {\n /** Lockfile this runner writes (and checks). */\n readonly lockPath: string\n /** Other runners' lockfiles guarding the same resource; checked, never written. */\n readonly alsoCheck?: readonly string[]\n /** Install a process 'exit' hook that releases the lock. Default true. */\n readonly releaseOnExit?: boolean\n /** Owner pid recorded in the lockfile metadata. Default process.pid. */\n readonly pid?: number\n}\n\nexport interface SingleRunLock {\n /** Remove the lockfile if this process still owns it. Idempotent. */\n release(): void\n}\n\nfunction assertAvailable(path: string): void {\n const unavailable = probeAtomicFileLock({ lockPath: path })\n if (unavailable) throw unavailableError(path, unavailable)\n}\n\nfunction unavailableError(path: string, unavailable: AtomicFileLockUnavailable): Error {\n if (unavailable.reason === 'recovery') {\n return new Error(\n `single-run lock recovery is already in progress (${path}); refusing a concurrent run`,\n )\n }\n return new Error(\n `single-run lock held by live pid ${unavailable.holder.pid} (${path}); refusing a concurrent run on the shared resource`,\n )\n}\n\n/**\n * Acquire the lock or throw naming the live holder. A stale lock (holder pid\n * no longer running) is reclaimed by one contender. An interrupted reclaim\n * leaves a marker that fails closed instead of admitting overlapping runs.\n */\nexport function acquireSingleRunLock(opts: SingleRunLockOptions): SingleRunLock {\n const pid = opts.pid ?? process.pid\n if (!Number.isSafeInteger(pid) || pid <= 0)\n throw new Error('single-run lock pid must be a positive integer')\n for (const path of opts.alsoCheck ?? []) assertAvailable(path)\n const acquisition = tryAcquireAtomicFileLock({\n lockPath: opts.lockPath,\n pid,\n })\n if (!acquisition.acquired) throw unavailableError(opts.lockPath, acquisition)\n const releaseOnExit = opts.releaseOnExit ?? true\n let released = false\n const release = (): void => {\n if (released) return\n released = true\n if (releaseOnExit) process.off('exit', release)\n try {\n acquisition.lock.release()\n } catch {\n // release is best-effort; a leftover stale lock is reclaimed on next acquire\n }\n }\n try {\n for (const path of opts.alsoCheck ?? []) assertAvailable(path)\n } catch (error) {\n release()\n throw error\n }\n if (releaseOnExit) process.on('exit', release)\n return { release }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-usage-B-BFS8M2.d.ts","names":[],"sources":["../src/run-score.ts","../src/run-critic.ts","../src/semantic-concept-judge.ts","../src/analyst/define.ts","../src/analyst/dspy-rlm-engine.ts","../src/analyst/finding-subject.ts","../src/analyst/findings-store.ts","../src/analyst/kinds/control-integrity.ts","../src/analyst/kinds/failure-mode.ts","../src/analyst/kinds/improvement.ts","../src/analyst/kinds/knowledge-gap.ts","../src/analyst/kinds/knowledge-poisoning.ts","../src/analyst/kinds/index.ts","../src/analyst/kinds/skill-usage.ts"],"mappings":"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"}
|