@tangle-network/agent-eval 0.137.0 → 0.139.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 +78 -0
- package/README.md +34 -0
- package/dist/analyst/index.d.ts +485 -104
- package/dist/analyst/index.d.ts.map +1 -1
- package/dist/analyst/index.js +10 -607
- package/dist/analyst/index.js.map +1 -1
- package/dist/{benchmark-YDrpumqB.js → benchmark-CYtcIF2V.js} +299 -159
- package/dist/benchmark-CYtcIF2V.js.map +1 -0
- package/dist/{benchmark-CHX4orG7.d.ts → benchmark-DDVdWcwA.d.ts} +67 -15
- package/dist/benchmark-DDVdWcwA.d.ts.map +1 -0
- package/dist/benchmark-command-BKfjOBJ5.js +4537 -0
- package/dist/benchmark-command-BKfjOBJ5.js.map +1 -0
- package/dist/benchmarks/index.d.ts +1 -1
- package/dist/benchmarks/index.js +1 -1
- package/dist/{benchmarks-DCLkQOmc.js → benchmarks-zxhy1QV3.js} +4 -3
- package/dist/{benchmarks-DCLkQOmc.js.map → benchmarks-zxhy1QV3.js.map} +1 -1
- package/dist/campaign/index.d.ts +5 -5
- package/dist/campaign/index.js +4 -3
- package/dist/{campaign-lgObcHFC.js → campaign-DrS6_hLd.js} +19 -11
- package/dist/campaign-DrS6_hLd.js.map +1 -0
- package/dist/canonical-D011XM8r.js +86 -0
- package/dist/canonical-D011XM8r.js.map +1 -0
- package/dist/cli.js +10 -3
- package/dist/cli.js.map +1 -1
- package/dist/{client-C8L6h6Wf.d.ts → client-BohnDFBq.d.ts} +4 -4
- package/dist/{client-C8L6h6Wf.d.ts.map → client-BohnDFBq.d.ts.map} +1 -1
- package/dist/{completion-verifier-DSyRNVzU.d.ts → completion-verifier-IPoP4fQO.d.ts} +178 -4
- package/dist/completion-verifier-IPoP4fQO.d.ts.map +1 -0
- package/dist/contract/index.d.ts +10 -10
- package/dist/contract/index.js +9 -8
- package/dist/contract/index.js.map +1 -1
- package/dist/control.d.ts +2 -2
- package/dist/{cost-ledger-D-5_-dhi.js → cost-ledger-CZ9diLxY.js} +90 -45
- package/dist/cost-ledger-CZ9diLxY.js.map +1 -0
- package/dist/{cost-ledger-D2o6JOrL.d.ts → cost-ledger-DKgyIWRj.d.ts} +6 -2
- package/dist/cost-ledger-DKgyIWRj.d.ts.map +1 -0
- package/dist/default-registry-B8vf7Rmf.d.ts +118 -0
- package/dist/default-registry-B8vf7Rmf.d.ts.map +1 -0
- package/dist/default-registry-BgJJItGr.js +2364 -0
- package/dist/default-registry-BgJJItGr.js.map +1 -0
- package/dist/dspy-rlm-engine-DTkVyDX-.js +344 -0
- package/dist/dspy-rlm-engine-DTkVyDX-.js.map +1 -0
- package/dist/{eval-campaign-CHqfLnff.js → eval-campaign-BmptJj50.js} +2 -2
- package/dist/{eval-campaign-CHqfLnff.js.map → eval-campaign-BmptJj50.js.map} +1 -1
- package/dist/exact-types-MaaFcllV.d.ts +234 -0
- package/dist/exact-types-MaaFcllV.d.ts.map +1 -0
- package/dist/external-optimizer-contracts-BrxY2Sli.d.ts +32 -0
- package/dist/external-optimizer-contracts-BrxY2Sli.d.ts.map +1 -0
- package/dist/{extract-usage-p-56bh8q.js → extract-usage-DZs601Va.js} +2 -2
- package/dist/{extract-usage-p-56bh8q.js.map → extract-usage-DZs601Va.js.map} +1 -1
- package/dist/{feedback-trajectory-N_F0PwHz.d.ts → feedback-trajectory-BJUWOkJM.d.ts} +3 -2
- package/dist/feedback-trajectory-BJUWOkJM.d.ts.map +1 -0
- package/dist/fuzz.d.ts +1 -1
- package/dist/fuzz.js +1 -1
- package/dist/{hf-dataset-DBJXXoY1.js → hf-dataset-XggBupCr.js} +2 -2
- package/dist/{hf-dataset-DBJXXoY1.js.map → hf-dataset-XggBupCr.js.map} +1 -1
- package/dist/hosted/index.d.ts +3 -3
- package/dist/{index-C-Pr4OWg.d.ts → index-BTm_P9aC.d.ts} +12 -11
- package/dist/index-BTm_P9aC.d.ts.map +1 -0
- package/dist/{index-U3RHOShi.d.ts → index-CWOPCJiw.d.ts} +2 -2
- package/dist/{index-U3RHOShi.d.ts.map → index-CWOPCJiw.d.ts.map} +1 -1
- package/dist/{index-DRNl6g_N.d.ts → index-CtR1xh4V.d.ts} +3 -3
- package/dist/{index-DRNl6g_N.d.ts.map → index-CtR1xh4V.d.ts.map} +1 -1
- package/dist/index-DEb46kc6.d.ts.map +1 -1
- package/dist/{index-BnP1QJUv.d.ts → index-_66rVpwN.d.ts} +5 -5
- package/dist/{index-BnP1QJUv.d.ts.map → index-_66rVpwN.d.ts.map} +1 -1
- package/dist/index.d.ts +35 -55
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +55 -514
- package/dist/index.js.map +1 -1
- package/dist/{insight-report-B9ooYH_g.d.ts → insight-report-Bu5Wi9tG.d.ts} +4 -4
- package/dist/{insight-report-B9ooYH_g.d.ts.map → insight-report-Bu5Wi9tG.d.ts.map} +1 -1
- package/dist/{integrity-CKxosZ5Z.d.ts → integrity-COTh3DTH.d.ts} +2 -2
- package/dist/{integrity-CKxosZ5Z.d.ts.map → integrity-COTh3DTH.d.ts.map} +1 -1
- package/dist/kind-factory-CFxA0JQX.js +2133 -0
- package/dist/kind-factory-CFxA0JQX.js.map +1 -0
- package/dist/ledger-core/index.js +2 -1
- package/dist/{ledger-core-t6sItivm.js → ledger-core-Dxz0Rkwa.js} +210 -99
- package/dist/ledger-core-Dxz0Rkwa.js.map +1 -0
- package/dist/{llm-client-DKB25jV8.js → llm-client-bkztEfIx.js} +5 -5
- package/dist/llm-client-bkztEfIx.js.map +1 -0
- 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/{proposal-findings-DCawte-y.js → proposal-findings-2GIUo1et.js} +2 -68
- package/dist/proposal-findings-2GIUo1et.js.map +1 -0
- package/dist/{release-report-CofgVNZt.d.ts → release-report-fZarvIm-.d.ts} +3 -3
- package/dist/{release-report-CofgVNZt.d.ts.map → release-report-fZarvIm-.d.ts.map} +1 -1
- package/dist/{replay-K8FaC0CB.d.ts → replay-DjG4IG60.d.ts} +34 -143
- package/dist/replay-DjG4IG60.d.ts.map +1 -0
- package/dist/{replay-Bju0T8Ls.js → replay-SA4OB7O7.js} +48 -136
- package/dist/replay-SA4OB7O7.js.map +1 -0
- package/dist/reporting.d.ts +4 -4
- package/dist/{researcher-Da0Wj-bt.d.ts → researcher-BxhtGfKa.d.ts} +5 -5
- package/dist/{researcher-Da0Wj-bt.d.ts.map → researcher-BxhtGfKa.d.ts.map} +1 -1
- package/dist/{reward-hacking-CQ3hTCO3.d.ts → reward-hacking-CqSLiV51.d.ts} +2 -2
- package/dist/{reward-hacking-CQ3hTCO3.d.ts.map → reward-hacking-CqSLiV51.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/rollout/index.js +2 -2
- package/dist/{rollout-DQFl0UXA.js → rollout-8nj3mYvx.js} +2 -2
- package/dist/{rollout-DQFl0UXA.js.map → rollout-8nj3mYvx.js.map} +1 -1
- package/dist/{rubric-predictive-validity-C4sztLR3.d.ts → rubric-predictive-validity-DQBQj6uV.d.ts} +2 -2
- package/dist/{rubric-predictive-validity-C4sztLR3.d.ts.map → rubric-predictive-validity-DQBQj6uV.d.ts.map} +1 -1
- package/dist/{run-evidence-BDIircdA.d.ts → run-evidence-C4RcRQT5.d.ts} +3 -3
- package/dist/{run-evidence-BDIircdA.d.ts.map → run-evidence-C4RcRQT5.d.ts.map} +1 -1
- package/dist/{run-record-BPCa2rQ8.d.ts → run-record-CztDMXVF.d.ts} +2 -2
- package/dist/{run-record-BPCa2rQ8.d.ts.map → run-record-CztDMXVF.d.ts.map} +1 -1
- package/dist/{semantic-concept-judge-Bz64IckK.js → semantic-concept-judge-BuIJ9IfB.js} +49 -6
- package/dist/semantic-concept-judge-BuIJ9IfB.js.map +1 -0
- package/dist/{server-KjXZZUDX.js → server-DaCpLfi0.js} +3 -3
- package/dist/{server-KjXZZUDX.js.map → server-DaCpLfi0.js.map} +1 -1
- package/dist/single-run-lock-BTTtPZ9N.js +989 -0
- package/dist/single-run-lock-BTTtPZ9N.js.map +1 -0
- package/dist/{skill-usage-CFDLLlhF.d.ts → skill-usage-B-BFS8M2.d.ts} +65 -40
- package/dist/skill-usage-B-BFS8M2.d.ts.map +1 -0
- package/dist/{skillopt-optimization-method-f4o9sUT4.js → skillopt-optimization-method-BbGnCC53.js} +20 -979
- package/dist/skillopt-optimization-method-BbGnCC53.js.map +1 -0
- package/dist/{skillopt-optimization-method-BpbnlvAZ.d.ts → skillopt-optimization-method-_s0Tub7Y.d.ts} +11 -39
- package/dist/skillopt-optimization-method-_s0Tub7Y.d.ts.map +1 -0
- package/dist/{statistics-_7P642CN.d.ts → statistics-B5d0Zd-z.d.ts} +2 -2
- package/dist/{statistics-_7P642CN.d.ts.map → statistics-B5d0Zd-z.d.ts.map} +1 -1
- package/dist/store-otlp-DX4fGIcf.js +757 -0
- package/dist/store-otlp-DX4fGIcf.js.map +1 -0
- package/dist/{summary-report-DHipz9Kx.d.ts → summary-report-Cg7BifAM.d.ts} +3 -3
- package/dist/{summary-report-DHipz9Kx.d.ts.map → summary-report-Cg7BifAM.d.ts.map} +1 -1
- package/dist/tool-groups-CdYq22lX.d.ts +258 -0
- package/dist/tool-groups-CdYq22lX.d.ts.map +1 -0
- package/dist/traces.d.ts +7 -6
- package/dist/traces.js +5 -4
- package/dist/{types-CTGbIm57.d.ts → types-BBFNHxSK.d.ts} +5 -5
- package/dist/{types-CTGbIm57.d.ts.map → types-BBFNHxSK.d.ts.map} +1 -1
- package/dist/{types-CKswbJGO.d.ts → types-DoEYskCd.d.ts} +5 -5
- package/dist/{types-CKswbJGO.d.ts.map → types-DoEYskCd.d.ts.map} +1 -1
- package/dist/{types-CTvKfr5F.d.ts → types-uPrS6mD-.d.ts} +2 -2
- package/dist/{types-CTvKfr5F.d.ts.map → types-uPrS6mD-.d.ts.map} +1 -1
- package/dist/usage-receipt-CgxMEBZq.js +134 -0
- package/dist/usage-receipt-CgxMEBZq.js.map +1 -0
- package/dist/wire/index.d.ts +3 -3
- package/dist/wire/index.js +1 -1
- package/docs/trace-analysis.md +191 -385
- package/package.json +5 -4
- package/dist/analyze-runs-PVtnfjvA.d.ts +0 -72
- package/dist/analyze-runs-PVtnfjvA.d.ts.map +0 -1
- package/dist/benchmark-CHX4orG7.d.ts.map +0 -1
- package/dist/benchmark-YDrpumqB.js.map +0 -1
- package/dist/campaign-lgObcHFC.js.map +0 -1
- package/dist/completion-verifier-DSyRNVzU.d.ts.map +0 -1
- package/dist/concurrency-MUjT7VjM.js +0 -109
- package/dist/concurrency-MUjT7VjM.js.map +0 -1
- package/dist/cost-ledger-D-5_-dhi.js.map +0 -1
- package/dist/cost-ledger-D2o6JOrL.d.ts.map +0 -1
- package/dist/default-registry-CLXbRt0f.js +0 -2594
- package/dist/default-registry-CLXbRt0f.js.map +0 -1
- package/dist/default-registry-Dc5D_Loc.d.ts +0 -202
- package/dist/default-registry-Dc5D_Loc.d.ts.map +0 -1
- package/dist/feedback-trajectory-N_F0PwHz.d.ts.map +0 -1
- package/dist/index-C-Pr4OWg.d.ts.map +0 -1
- package/dist/ledger-core-t6sItivm.js.map +0 -1
- package/dist/llm-client-DKB25jV8.js.map +0 -1
- package/dist/proposal-findings-DCawte-y.js.map +0 -1
- package/dist/registry-BdM7SuTr.d.ts +0 -124
- package/dist/registry-BdM7SuTr.d.ts.map +0 -1
- package/dist/replay-Bju0T8Ls.js.map +0 -1
- package/dist/replay-K8FaC0CB.d.ts.map +0 -1
- package/dist/semantic-concept-judge-Bz64IckK.js.map +0 -1
- package/dist/skill-usage-CFDLLlhF.d.ts.map +0 -1
- package/dist/skillopt-optimization-method-BpbnlvAZ.d.ts.map +0 -1
- package/dist/skillopt-optimization-method-f4o9sUT4.js.map +0 -1
- package/dist/tools-DZk2Jn64.js +0 -1876
- package/dist/tools-DZk2Jn64.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
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,13 +1,15 @@
|
|
|
1
1
|
import { o as Severity } from "./multi-layer-verifier-BHY1gWAc.js";
|
|
2
|
-
import { c as CostLedgerHandle } from "./cost-ledger-
|
|
2
|
+
import { b as CustomTokenPricing, c as CostLedgerHandle } from "./cost-ledger-DKgyIWRj.js";
|
|
3
3
|
import { C as TraceEvent, _ as Span, f as Run, n as BudgetLedgerEntry, t as Artifact } from "./schema-BtVldJ3T.js";
|
|
4
|
-
import "./index-
|
|
5
|
-
import { q as LlmClientOptions } from "./types-
|
|
4
|
+
import "./index-CtR1xh4V.js";
|
|
5
|
+
import { q as LlmClientOptions } from "./types-uPrS6mD-.js";
|
|
6
6
|
import { s as TraceStore } from "./store-CT9YIIve.js";
|
|
7
|
-
import { i as AnalystFinding, n as AnalystContext, t as Analyst } from "./types-
|
|
8
|
-
import { i as
|
|
7
|
+
import { i as AnalystFinding, n as AnalystContext, r as AnalystCost, t as Analyst, x as TraceAnalysisStore } from "./types-DoEYskCd.js";
|
|
8
|
+
import { i as TraceAnalystDefinition } from "./default-registry-B8vf7Rmf.js";
|
|
9
|
+
import { l as ExactCapableAnalyst } from "./exact-types-MaaFcllV.js";
|
|
10
|
+
import { r as ExternalOptimizerRunnerCommand } from "./external-optimizer-contracts-BrxY2Sli.js";
|
|
11
|
+
import { i as TraceAnalysisEngine } from "./tool-groups-CdYq22lX.js";
|
|
9
12
|
import { b as SupervisorRunTree, y as SupervisorRunSources } from "./types-Dea6tiVI.js";
|
|
10
|
-
import { AxAIArgs, AxAIService } from "@ax-llm/ax";
|
|
11
13
|
import { z } from "zod";
|
|
12
14
|
//#region src/run-score.d.ts
|
|
13
15
|
interface RunScore {
|
|
@@ -183,34 +185,48 @@ declare function runSemanticConceptJudge(input: SemanticConceptJudgeInput, optio
|
|
|
183
185
|
*/
|
|
184
186
|
declare function createSemanticConceptJudge(options?: SemanticConceptJudgeOptions): (input: SemanticConceptJudgeInput) => Promise<SemanticConceptJudgeResult>;
|
|
185
187
|
//#endregion
|
|
186
|
-
//#region src/analyst/
|
|
187
|
-
interface CreateAnalystAiConfig {
|
|
188
|
-
/** OpenAI-compatible API key forwarded as `Authorization: Bearer`.
|
|
189
|
-
* cli-bridge ignores the value on loopback but Ax requires a non-empty string. */
|
|
190
|
-
apiKey: string;
|
|
191
|
-
/** OpenAI-compatible base URL — e.g. `https://router.tangle.tools/v1` or a
|
|
192
|
-
* cli-bridge loopback. */
|
|
193
|
-
baseUrl?: string;
|
|
194
|
-
/** Additional headers required by the gateway, such as tenant or execution policy. */
|
|
195
|
-
headers?: Record<string, string>;
|
|
196
|
-
/** Model id forwarded to analyst calls. */
|
|
197
|
-
model: string;
|
|
198
|
-
/** Ax provider name. Defaults to the OpenAI-compatible client. */
|
|
199
|
-
provider?: AxAIArgs<unknown>['name'];
|
|
200
|
-
}
|
|
188
|
+
//#region src/analyst/define.d.ts
|
|
201
189
|
/**
|
|
202
|
-
*
|
|
203
|
-
* (`createTraceAnalystKind({ ai })`).
|
|
190
|
+
* Define a reusable trace-research question.
|
|
204
191
|
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
* …). Consumers were each re-rolling `ai({ name, apiKey, apiURL, config })`
|
|
209
|
-
* behind an `as (a: any) => any` cast to dodge the enum; this is the one
|
|
210
|
-
* canonical constructor so they don't have to — and don't take a direct
|
|
211
|
-
* `@ax-llm/ax` dependency for it.
|
|
192
|
+
* The returned value contains no model, credentials, or execution state. Bind
|
|
193
|
+
* it to any TraceAnalysisEngine with `runTraceAnalyst` or
|
|
194
|
+
* `createTraceAnalyst`.
|
|
212
195
|
*/
|
|
213
|
-
declare function
|
|
196
|
+
declare function defineTraceAnalyst(definition: TraceAnalystDefinition): TraceAnalystDefinition;
|
|
197
|
+
interface DefineCustomAnalystOptions {
|
|
198
|
+
id: string;
|
|
199
|
+
description: string;
|
|
200
|
+
version?: string;
|
|
201
|
+
cost: AnalystCost;
|
|
202
|
+
analyze: Analyst<TraceAnalysisStore>['analyze'];
|
|
203
|
+
}
|
|
204
|
+
interface DefineExactCustomAnalystOptions extends DefineCustomAnalystOptions {
|
|
205
|
+
/** Canonical JSON for behavior knobs not already bound by `version`. */
|
|
206
|
+
executionConfig: Readonly<Record<string, unknown>>;
|
|
207
|
+
}
|
|
208
|
+
/** Construct a registrable analyst from a hand-written analyze function. */
|
|
209
|
+
declare function defineCustomAnalyst(options: DefineExactCustomAnalystOptions): ExactCapableAnalyst<TraceAnalysisStore>;
|
|
210
|
+
declare function defineCustomAnalyst(options: DefineCustomAnalystOptions): Analyst<TraceAnalysisStore>;
|
|
211
|
+
//#endregion
|
|
212
|
+
//#region src/analyst/dspy-rlm-engine.d.ts
|
|
213
|
+
interface DspyRlmTraceEngineOptions {
|
|
214
|
+
baseUrl: string;
|
|
215
|
+
apiKey: string;
|
|
216
|
+
model: string;
|
|
217
|
+
/** Exact provider rates. Required when the model is absent from the pricing table. */
|
|
218
|
+
pricing?: CustomTokenPricing;
|
|
219
|
+
/** Maximum provider spend for one investigation. Default: 1 USD. */
|
|
220
|
+
maxCostUsd?: number;
|
|
221
|
+
/** Controller response cap. Default: 4096. */
|
|
222
|
+
maxOutputTokens?: number;
|
|
223
|
+
/** Python command used to load agent-eval-rpc[dspy]. Default: python. */
|
|
224
|
+
runner?: ExternalOptimizerRunnerCommand;
|
|
225
|
+
/** Whole investigation deadline. Default: 10 minutes. */
|
|
226
|
+
timeoutMs?: number;
|
|
227
|
+
}
|
|
228
|
+
/** Use the official DSPy RLM as a bounded recursive trace-analysis engine. */
|
|
229
|
+
declare function createDspyRlmTraceEngine(options: DspyRlmTraceEngineOptions): TraceAnalysisEngine;
|
|
214
230
|
//#endregion
|
|
215
231
|
//#region src/analyst/finding-subject.d.ts
|
|
216
232
|
/**
|
|
@@ -412,7 +428,7 @@ declare function diffFindings(previous: PersistedFinding[], current: PersistedFi
|
|
|
412
428
|
/** Translate typed supervisor-run integrity issues into the shared analyst envelope. */
|
|
413
429
|
declare function emitControlIntegrityFindings(input: SupervisorRunSources | SupervisorRunTree, producedAt: string): AnalystFinding[];
|
|
414
430
|
/** Deterministic Analyst adapter for `SupervisorRunSources | SupervisorRunTree`. */
|
|
415
|
-
declare class ControlIntegrityAnalyst implements
|
|
431
|
+
declare class ControlIntegrityAnalyst implements ExactCapableAnalyst<SupervisorRunSources | SupervisorRunTree> {
|
|
416
432
|
readonly id = "control-integrity";
|
|
417
433
|
readonly description = "Deterministic supervisor-run integrity checks with explicit unavailable evidence.";
|
|
418
434
|
readonly inputKind: 'custom';
|
|
@@ -421,21 +437,25 @@ declare class ControlIntegrityAnalyst implements Analyst<SupervisorRunSources |
|
|
|
421
437
|
est_usd_per_run: number;
|
|
422
438
|
};
|
|
423
439
|
readonly version = "2.0.0";
|
|
440
|
+
readonly executionConfig: {
|
|
441
|
+
readonly kind: 'control-integrity';
|
|
442
|
+
readonly produced_at_source: 'tags.producedAt-or-system-clock';
|
|
443
|
+
};
|
|
424
444
|
analyze(input: SupervisorRunSources | SupervisorRunTree, ctx: AnalystContext): Promise<AnalystFinding[]>;
|
|
425
445
|
}
|
|
426
446
|
declare const CONTROL_INTEGRITY_ANALYST: ControlIntegrityAnalyst;
|
|
427
447
|
//#endregion
|
|
428
448
|
//#region src/analyst/kinds/failure-mode.d.ts
|
|
429
|
-
declare const FAILURE_MODE_KIND_SPEC:
|
|
449
|
+
declare const FAILURE_MODE_KIND_SPEC: TraceAnalystDefinition;
|
|
430
450
|
//#endregion
|
|
431
451
|
//#region src/analyst/kinds/improvement.d.ts
|
|
432
|
-
declare const IMPROVEMENT_KIND_SPEC:
|
|
452
|
+
declare const IMPROVEMENT_KIND_SPEC: TraceAnalystDefinition;
|
|
433
453
|
//#endregion
|
|
434
454
|
//#region src/analyst/kinds/knowledge-gap.d.ts
|
|
435
|
-
declare const KNOWLEDGE_GAP_KIND_SPEC:
|
|
455
|
+
declare const KNOWLEDGE_GAP_KIND_SPEC: TraceAnalystDefinition;
|
|
436
456
|
//#endregion
|
|
437
457
|
//#region src/analyst/kinds/knowledge-poisoning.d.ts
|
|
438
|
-
declare const KNOWLEDGE_POISONING_KIND_SPEC:
|
|
458
|
+
declare const KNOWLEDGE_POISONING_KIND_SPEC: TraceAnalystDefinition;
|
|
439
459
|
//#endregion
|
|
440
460
|
//#region src/analyst/kinds/index.d.ts
|
|
441
461
|
/**
|
|
@@ -443,7 +463,7 @@ declare const KNOWLEDGE_POISONING_KIND_SPEC: TraceAnalystKindSpec;
|
|
|
443
463
|
* use: failure-mode first (no upstream deps), gap + poisoning next
|
|
444
464
|
* (both depend on failures), improvement last (chains all three).
|
|
445
465
|
*/
|
|
446
|
-
declare const DEFAULT_TRACE_ANALYST_KINDS: readonly
|
|
466
|
+
declare const DEFAULT_TRACE_ANALYST_KINDS: readonly TraceAnalystDefinition[];
|
|
447
467
|
//#endregion
|
|
448
468
|
//#region src/analyst/kinds/skill-usage.d.ts
|
|
449
469
|
type SkillKind = 'public' | 'private';
|
|
@@ -496,7 +516,7 @@ interface SkillUsageScanConfig {
|
|
|
496
516
|
declare function buildSkillUsageReport(config: SkillUsageScanConfig): SkillUsageReport;
|
|
497
517
|
/** Pure rule pass over a report → findings. Exported for direct/unit use. */
|
|
498
518
|
declare function emitSkillUsageFindings(report: SkillUsageReport, producedAt: string): AnalystFinding[];
|
|
499
|
-
declare class SkillUsageAnalyst implements
|
|
519
|
+
declare class SkillUsageAnalyst implements ExactCapableAnalyst<SkillUsageReport> {
|
|
500
520
|
readonly id = "skill-usage";
|
|
501
521
|
readonly description = "Deterministic multi-signal skill-usage analysis: flags dead skills, measurement-invisible (orchestrated) usage, discovery gaps, public-repo leaks, bloat, missing evals, and missing run-logging.";
|
|
502
522
|
readonly inputKind: 'custom';
|
|
@@ -505,9 +525,14 @@ declare class SkillUsageAnalyst implements Analyst<SkillUsageReport> {
|
|
|
505
525
|
est_usd_per_run: number;
|
|
506
526
|
};
|
|
507
527
|
readonly version = "1.0.0";
|
|
528
|
+
readonly executionConfig: {
|
|
529
|
+
readonly kind: 'skill-usage';
|
|
530
|
+
readonly bloat_line_threshold: 300;
|
|
531
|
+
readonly produced_at_source: 'tags.producedAt-or-system-clock';
|
|
532
|
+
};
|
|
508
533
|
analyze(input: SkillUsageReport, ctx: AnalystContext): Promise<AnalystFinding[]>;
|
|
509
534
|
}
|
|
510
535
|
declare const SKILL_USAGE_ANALYST: SkillUsageAnalyst;
|
|
511
536
|
//#endregion
|
|
512
|
-
export { parseFindingSubject as A,
|
|
513
|
-
//# sourceMappingURL=skill-usage-
|
|
537
|
+
export { RunScore as $, parseFindingSubject as A, ConceptSpec as B, FINDING_SUBJECT_KINDS as C, FindingSubjectStringSchema as D, FindingSubjectKind as E, DefineExactCustomAnalystOptions as F, SemanticConceptJudgeOptions as G, DEFAULT_COMPLEXITY_WEIGHTS as H, defineCustomAnalyst as I, runSemanticConceptJudge as J, SemanticConceptJudgeResult as K, defineTraceAnalyst as L, DspyRlmTraceEngineOptions as M, createDspyRlmTraceEngine as N, KIND_EXPECTED_SUBJECTS as O, DefineCustomAnalystOptions as P, DEFAULT_RUN_SCORE_WEIGHTS as Q, ConceptComplexity as R, FINDING_SUBJECT_GRAMMAR_PROMPT as S, FindingSubject as T, SEMANTIC_CONCEPT_JUDGE_VERSION as U, ConceptWeightStrategy as V, SemanticConceptJudgeInput as W, RunCriticOptions as X, RunCritic as Y, RunTrace as Z, FindingsDiff as _, SkillUsageScanConfig as a, defaultIsMaterial as b, DEFAULT_TRACE_ANALYST_KINDS as c, IMPROVEMENT_KIND_SPEC as d, RunScoreWeights as et, FAILURE_MODE_KIND_SPEC as f, DiffPolicy as g, emitControlIntegrityFindings as h, SkillUsageReport as i, renderFindingSubject as j, findingSubjectGrammarPromptFor as k, KNOWLEDGE_POISONING_KIND_SPEC as l, ControlIntegrityAnalyst as m, SkillUsageAnalyst as n, clamp01 as nt, buildSkillUsageReport as o, CONTROL_INTEGRITY_ANALYST as p, createSemanticConceptJudge as q, SkillUsageRecord as r, emitSkillUsageFindings as s, SKILL_USAGE_ANALYST as t, aggregateRunScore as tt, KNOWLEDGE_GAP_KIND_SPEC as u, FindingsStore as v, FINDING_SUBJECT_SYNTAX as w, diffFindings as x, PersistedFinding as y, ConceptFinding as z };
|
|
538
|
+
//# sourceMappingURL=skill-usage-B-BFS8M2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|