@tangle-network/agent-eval 0.125.0 → 0.126.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CHANGELOG.md +62 -35
  2. package/README.md +270 -189
  3. package/dist/analyst/index.d.ts +15 -145
  4. package/dist/analyst/index.js +33 -47
  5. package/dist/analyst/index.js.map +1 -1
  6. package/dist/benchmarks/index.d.ts +45 -162
  7. package/dist/benchmarks/index.js +8 -9
  8. package/dist/campaign/index.d.ts +3674 -5393
  9. package/dist/campaign/index.js +21 -95
  10. package/dist/{chunk-R226UZOI.js → chunk-474LBSOX.js} +2 -2
  11. package/dist/{chunk-HM6V7F3M.js → chunk-FO7HEH76.js} +3 -3
  12. package/dist/chunk-IILEIWGW.js +635 -0
  13. package/dist/chunk-IILEIWGW.js.map +1 -0
  14. package/dist/{chunk-EQUK3RFS.js → chunk-J5SQWP6Y.js} +8 -5
  15. package/dist/chunk-J5SQWP6Y.js.map +1 -0
  16. package/dist/{chunk-W5B3ZGP3.js → chunk-KE2VWPZX.js} +8 -6
  17. package/dist/{chunk-W5B3ZGP3.js.map → chunk-KE2VWPZX.js.map} +1 -1
  18. package/dist/{chunk-DT7OXY3C.js → chunk-LUNF2SEL.js} +538 -851
  19. package/dist/chunk-LUNF2SEL.js.map +1 -0
  20. package/dist/chunk-NGUYT5CI.js +4637 -0
  21. package/dist/chunk-NGUYT5CI.js.map +1 -0
  22. package/dist/{chunk-QFQZ3U3X.js → chunk-OCFJACJU.js} +2 -2
  23. package/dist/{chunk-GID26AN4.js → chunk-P22LJ3Y2.js} +4 -6
  24. package/dist/{chunk-GID26AN4.js.map → chunk-P22LJ3Y2.js.map} +1 -1
  25. package/dist/{chunk-SJT4OBVL.js → chunk-SDPM6554.js} +3 -3
  26. package/dist/{chunk-D5JZ7UDZ.js → chunk-UCLVDLCH.js} +136 -50
  27. package/dist/chunk-UCLVDLCH.js.map +1 -0
  28. package/dist/chunk-VMUENW6F.js +7274 -0
  29. package/dist/chunk-VMUENW6F.js.map +1 -0
  30. package/dist/{chunk-JKDNAOF5.js → chunk-W4L6C2XT.js} +2 -2
  31. package/dist/chunk-WGXIEX7P.js +116 -0
  32. package/dist/chunk-WGXIEX7P.js.map +1 -0
  33. package/dist/{chunk-GRCDRKII.js → chunk-WS3NZZQQ.js} +58 -20
  34. package/dist/chunk-WS3NZZQQ.js.map +1 -0
  35. package/dist/cli.js +3 -3
  36. package/dist/contract/index.d.ts +3220 -3094
  37. package/dist/contract/index.js +173 -42
  38. package/dist/contract/index.js.map +1 -1
  39. package/dist/control.js +2 -3
  40. package/dist/fuzz.d.ts +14 -1
  41. package/dist/fuzz.js +1 -1
  42. package/dist/hosted/index.d.ts +8 -1
  43. package/dist/index.d.ts +71 -687
  44. package/dist/index.js +178 -497
  45. package/dist/index.js.map +1 -1
  46. package/dist/openapi.json +1 -1
  47. package/dist/rl.d.ts +5 -100
  48. package/dist/rl.js +4 -5
  49. package/dist/rl.js.map +1 -1
  50. package/dist/{run-campaign-I3JXKVAK.js → run-campaign-LVFKZCEU.js} +3 -3
  51. package/dist/traces.js +2 -3
  52. package/dist/wire/index.d.ts +14 -1
  53. package/dist/wire/index.js +3 -3
  54. package/docs/campaign-proposers.md +363 -168
  55. package/docs/design/loop-taxonomy.md +142 -190
  56. package/docs/design.md +1 -1
  57. package/docs/distributed-driver.md +8 -11
  58. package/docs/feature-guide.md +20 -19
  59. package/docs/knowledge-readiness.md +2 -5
  60. package/docs/multi-shot-optimization.md +35 -27
  61. package/docs/rollout.md +5 -5
  62. package/package.json +4 -4
  63. package/dist/chunk-A62YMFWA.js +0 -9269
  64. package/dist/chunk-A62YMFWA.js.map +0 -1
  65. package/dist/chunk-A6GT67HT.js +0 -550
  66. package/dist/chunk-A6GT67HT.js.map +0 -1
  67. package/dist/chunk-D5JZ7UDZ.js.map +0 -1
  68. package/dist/chunk-DT7OXY3C.js.map +0 -1
  69. package/dist/chunk-EQUK3RFS.js.map +0 -1
  70. package/dist/chunk-GC4ATIKK.js +0 -317
  71. package/dist/chunk-GC4ATIKK.js.map +0 -1
  72. package/dist/chunk-GRCDRKII.js.map +0 -1
  73. package/dist/chunk-LOW3U7JZ.js +0 -328
  74. package/dist/chunk-LOW3U7JZ.js.map +0 -1
  75. package/dist/chunk-PMITBABE.js +0 -3841
  76. package/dist/chunk-PMITBABE.js.map +0 -1
  77. /package/dist/{chunk-R226UZOI.js.map → chunk-474LBSOX.js.map} +0 -0
  78. /package/dist/{chunk-HM6V7F3M.js.map → chunk-FO7HEH76.js.map} +0 -0
  79. /package/dist/{chunk-QFQZ3U3X.js.map → chunk-OCFJACJU.js.map} +0 -0
  80. /package/dist/{chunk-SJT4OBVL.js.map → chunk-SDPM6554.js.map} +0 -0
  81. /package/dist/{chunk-JKDNAOF5.js.map → chunk-W4L6C2XT.js.map} +0 -0
  82. /package/dist/{run-campaign-I3JXKVAK.js.map → run-campaign-LVFKZCEU.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  fsCampaignStorage,
3
3
  runCampaign
4
- } from "./chunk-D5JZ7UDZ.js";
4
+ } from "./chunk-UCLVDLCH.js";
5
5
  import {
6
6
  __export
7
7
  } from "./chunk-PZ5AY32C.js";
@@ -763,4 +763,4 @@ export {
763
763
  retrievalMetricsAtCutoff,
764
764
  benchmarks_exports
765
765
  };
766
- //# sourceMappingURL=chunk-JKDNAOF5.js.map
766
+ //# sourceMappingURL=chunk-W4L6C2XT.js.map
@@ -0,0 +1,116 @@
1
+ // src/concurrency.ts
2
+ var Mutex = class {
3
+ locked = false;
4
+ waiters = [];
5
+ async acquire() {
6
+ if (!this.locked) {
7
+ this.locked = true;
8
+ return () => this.release();
9
+ }
10
+ return new Promise((resolve) => {
11
+ this.waiters.push(() => {
12
+ resolve(() => this.release());
13
+ });
14
+ });
15
+ }
16
+ release() {
17
+ const next = this.waiters.shift();
18
+ if (next) {
19
+ next();
20
+ } else {
21
+ this.locked = false;
22
+ }
23
+ }
24
+ async runExclusive(fn) {
25
+ const release = await this.acquire();
26
+ try {
27
+ return await fn();
28
+ } finally {
29
+ release();
30
+ }
31
+ }
32
+ /** True iff someone holds the lock right now. Diagnostics only. */
33
+ get isLocked() {
34
+ return this.locked;
35
+ }
36
+ /** Pending waiter count. Diagnostics only. */
37
+ get pending() {
38
+ return this.waiters.length;
39
+ }
40
+ };
41
+ async function mapConcurrent(items, concurrency, map) {
42
+ if (!Number.isInteger(concurrency) || concurrency < 1) {
43
+ throw new Error(`mapConcurrent: concurrency must be a positive integer, got ${concurrency}`);
44
+ }
45
+ if (items.length === 0) return [];
46
+ const results = new Array(items.length);
47
+ let nextIndex = 0;
48
+ let stopped = false;
49
+ let failed = false;
50
+ let failure;
51
+ const worker = async () => {
52
+ while (!stopped) {
53
+ const index = nextIndex;
54
+ nextIndex += 1;
55
+ if (index >= items.length) return;
56
+ try {
57
+ results[index] = await map(items[index], index);
58
+ } catch (error) {
59
+ stopped = true;
60
+ if (!failed) {
61
+ failed = true;
62
+ failure = error;
63
+ }
64
+ }
65
+ }
66
+ };
67
+ await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));
68
+ if (failed) throw failure;
69
+ return results;
70
+ }
71
+
72
+ // src/run-score.ts
73
+ var DEFAULT_RUN_SCORE_WEIGHTS = {
74
+ success: 4,
75
+ goalProgress: 2,
76
+ repoGroundedness: 1.5,
77
+ driftPenalty: -1.5,
78
+ toolUseQuality: 1,
79
+ patchQuality: 1.25,
80
+ testReality: 1.5,
81
+ finalGate: 3,
82
+ reviewerBlockers: -2,
83
+ costUsd: -0.2,
84
+ wallSeconds: -0.1
85
+ };
86
+ function aggregateRunScore(score, weights = {}) {
87
+ const w = { ...DEFAULT_RUN_SCORE_WEIGHTS, ...weights };
88
+ return w.success * clamp01(score.success) + w.goalProgress * clamp01(score.goalProgress) + w.repoGroundedness * clamp01(score.repoGroundedness) + w.driftPenalty * clamp01(score.driftPenalty) + w.toolUseQuality * clamp01(score.toolUseQuality) + w.patchQuality * clamp01(score.patchQuality) + w.testReality * clamp01(score.testReality) + w.finalGate * clamp01(score.finalGate) + w.reviewerBlockers * clamp01(score.reviewerBlockers) + w.costUsd * Math.max(0, finiteOrZero(score.costUsd)) + w.wallSeconds * Math.max(0, finiteOrZero(score.wallSeconds) / 60);
89
+ }
90
+ function clamp01(value) {
91
+ if (!Number.isFinite(value)) return 0;
92
+ return Math.max(0, Math.min(1, value));
93
+ }
94
+ function finiteOrZero(value) {
95
+ return Number.isFinite(value) ? value : 0;
96
+ }
97
+
98
+ // src/abort-signal.ts
99
+ function combineAbortSignals(...signals) {
100
+ const active = [
101
+ ...new Set(signals.filter((signal) => signal !== void 0))
102
+ ];
103
+ if (active.length === 0) return void 0;
104
+ if (active.length === 1) return active[0];
105
+ return AbortSignal.any(active);
106
+ }
107
+
108
+ export {
109
+ combineAbortSignals,
110
+ Mutex,
111
+ mapConcurrent,
112
+ DEFAULT_RUN_SCORE_WEIGHTS,
113
+ aggregateRunScore,
114
+ clamp01
115
+ };
116
+ //# sourceMappingURL=chunk-WGXIEX7P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/concurrency.ts","../src/run-score.ts","../src/abort-signal.ts"],"sourcesContent":["/**\n * concurrency — small primitives the evolution loop needs.\n *\n * `Mutex` is a zero-dep async lock with FIFO fairness. The evolution loop\n * uses it to serialise checkout/build/commit sequences inside a single\n * pool slot, and to gate concurrent JSONL writers (see\n * `lockedJsonlReferenceReplayStore`).\n *\n * Deliberately minimal — no priority queue, no timeouts. If you need\n * those, swap to `async-mutex` at the call site.\n */\n\nexport class Mutex {\n private locked = false\n private readonly waiters: Array<() => void> = []\n\n async acquire(): Promise<() => void> {\n if (!this.locked) {\n this.locked = true\n return () => this.release()\n }\n return new Promise<() => void>((resolve) => {\n this.waiters.push(() => {\n resolve(() => this.release())\n })\n })\n }\n\n private release(): void {\n const next = this.waiters.shift()\n if (next) {\n next()\n } else {\n this.locked = false\n }\n }\n\n async runExclusive<T>(fn: () => Promise<T> | T): Promise<T> {\n const release = await this.acquire()\n try {\n return await fn()\n } finally {\n release()\n }\n }\n\n /** True iff someone holds the lock right now. Diagnostics only. */\n get isLocked(): boolean {\n return this.locked\n }\n\n /** Pending waiter count. Diagnostics only. */\n get pending(): number {\n return this.waiters.length\n }\n}\n\n/**\n * Map independent work with a fixed worker count while preserving input order.\n * After the first rejection, no new items start; already-running work is allowed\n * to settle before the returned promise rejects. Partial results are discarded.\n */\nexport async function mapConcurrent<T, R>(\n items: readonly T[],\n concurrency: number,\n map: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new Error(`mapConcurrent: concurrency must be a positive integer, got ${concurrency}`)\n }\n if (items.length === 0) return []\n\n const results = new Array<R>(items.length)\n let nextIndex = 0\n let stopped = false\n let failed = false\n let failure: unknown\n\n const worker = async (): Promise<void> => {\n while (!stopped) {\n const index = nextIndex\n nextIndex += 1\n if (index >= items.length) return\n\n try {\n results[index] = await map(items[index]!, index)\n } catch (error) {\n stopped = true\n if (!failed) {\n failed = true\n failure = error\n }\n }\n }\n }\n\n await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()))\n if (failed) throw failure\n return results\n}\n","export interface RunScore {\n success: number\n goalProgress: number\n repoGroundedness: number\n driftPenalty: number\n toolUseQuality: number\n patchQuality: number\n testReality: number\n finalGate: number\n reviewerBlockers: number\n costUsd: number\n wallSeconds: number\n notes?: string[]\n}\n\nexport interface RunScoreWeights {\n success: number\n goalProgress: number\n repoGroundedness: number\n driftPenalty: number\n toolUseQuality: number\n patchQuality: number\n testReality: number\n finalGate: number\n reviewerBlockers: number\n costUsd: number\n wallSeconds: number\n}\n\nexport const DEFAULT_RUN_SCORE_WEIGHTS: RunScoreWeights = {\n success: 4,\n goalProgress: 2,\n repoGroundedness: 1.5,\n driftPenalty: -1.5,\n toolUseQuality: 1,\n patchQuality: 1.25,\n testReality: 1.5,\n finalGate: 3,\n reviewerBlockers: -2,\n costUsd: -0.2,\n wallSeconds: -0.1,\n}\n\nexport function aggregateRunScore(score: RunScore, weights: Partial<RunScoreWeights> = {}): number {\n const w = { ...DEFAULT_RUN_SCORE_WEIGHTS, ...weights }\n return (\n w.success * clamp01(score.success) +\n w.goalProgress * clamp01(score.goalProgress) +\n w.repoGroundedness * clamp01(score.repoGroundedness) +\n w.driftPenalty * clamp01(score.driftPenalty) +\n w.toolUseQuality * clamp01(score.toolUseQuality) +\n w.patchQuality * clamp01(score.patchQuality) +\n w.testReality * clamp01(score.testReality) +\n w.finalGate * clamp01(score.finalGate) +\n w.reviewerBlockers * clamp01(score.reviewerBlockers) +\n w.costUsd * Math.max(0, finiteOrZero(score.costUsd)) +\n w.wallSeconds * Math.max(0, finiteOrZero(score.wallSeconds) / 60)\n )\n}\n\nexport function clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n return Math.max(0, Math.min(1, value))\n}\n\nfunction finiteOrZero(value: number): number {\n return Number.isFinite(value) ? value : 0\n}\n","/** Combine active cancellation sources without wrapping a single source. */\nexport function combineAbortSignals(\n ...signals: Array<AbortSignal | undefined>\n): AbortSignal | undefined {\n const active = [\n ...new Set(signals.filter((signal): signal is AbortSignal => signal !== undefined)),\n ]\n if (active.length === 0) return undefined\n if (active.length === 1) return active[0]\n return AbortSignal.any(active)\n}\n"],"mappings":"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","names":[]}
@@ -187,7 +187,11 @@ var CostLedger = class {
187
187
  }
188
188
  /** Wait until every call started by this ledger has produced a durable outcome. */
189
189
  async waitForIdle(options = {}) {
190
- if (this.activeCallIds.size === 0) return true;
190
+ const hasActiveMatch = () => [...this.activeCallIds].some((callId) => {
191
+ const record = this.records.get(callId);
192
+ return record !== void 0 && matches(record, options.filter);
193
+ });
194
+ if (!hasActiveMatch()) return true;
191
195
  const timeoutMs = options.timeoutMs ?? 5e3;
192
196
  assertTimeout(timeoutMs, "waitForIdle.timeoutMs");
193
197
  return new Promise((resolve) => {
@@ -197,10 +201,12 @@ var CostLedger = class {
197
201
  if (timer !== void 0) clearTimeout(timer);
198
202
  resolve(settled);
199
203
  };
200
- const onIdle = () => finish(true);
204
+ const onIdle = () => {
205
+ if (!hasActiveMatch()) finish(true);
206
+ };
201
207
  this.idleWaiters.add(onIdle);
202
208
  timer = setTimeout(() => finish(false), timeoutMs);
203
- if (this.activeCallIds.size === 0) onIdle();
209
+ onIdle();
204
210
  });
205
211
  }
206
212
  /** Settle a call left pending by a crashed process after reconciling with the provider. */
@@ -384,9 +390,7 @@ var CostLedger = class {
384
390
  }
385
391
  releaseActiveCall(callId) {
386
392
  this.activeCallIds.delete(callId);
387
- if (this.activeCallIds.size > 0) return;
388
- for (const resolve of this.idleWaiters) resolve();
389
- this.idleWaiters.clear();
393
+ for (const resolve of [...this.idleWaiters]) resolve();
390
394
  }
391
395
  commitOutcome(pending, error, observed) {
392
396
  try {
@@ -510,9 +514,23 @@ function costForUsage(model, usage) {
510
514
  function costForTokenPricing(pricing, usage) {
511
515
  assertTokenCount(usage.inputTokens, "usage.inputTokens");
512
516
  assertTokenCount(usage.outputTokens, "usage.outputTokens");
517
+ if (usage.cachedTokens !== void 0) {
518
+ assertTokenCount(usage.cachedTokens, "usage.cachedTokens");
519
+ }
520
+ if (usage.cacheWriteTokens !== void 0) {
521
+ assertTokenCount(usage.cacheWriteTokens, "usage.cacheWriteTokens");
522
+ }
513
523
  assertNonNegative(pricing.inputUsdPerMillion, "pricing.inputUsdPerMillion");
524
+ if (pricing.cachedInputUsdPerMillion !== void 0) {
525
+ assertNonNegative(pricing.cachedInputUsdPerMillion, "pricing.cachedInputUsdPerMillion");
526
+ }
527
+ if (pricing.cacheWriteUsdPerMillion !== void 0) {
528
+ assertNonNegative(pricing.cacheWriteUsdPerMillion, "pricing.cacheWriteUsdPerMillion");
529
+ }
514
530
  assertNonNegative(pricing.outputUsdPerMillion, "pricing.outputUsdPerMillion");
515
- return usage.inputTokens / 1e6 * pricing.inputUsdPerMillion + usage.outputTokens / 1e6 * pricing.outputUsdPerMillion;
531
+ const cachedInputRate = pricing.cachedInputUsdPerMillion ?? pricing.inputUsdPerMillion;
532
+ const cacheWriteRate = pricing.cacheWriteUsdPerMillion ?? pricing.inputUsdPerMillion;
533
+ return usage.inputTokens / 1e6 * pricing.inputUsdPerMillion + (usage.cachedTokens ?? 0) / 1e6 * cachedInputRate + (usage.cacheWriteTokens ?? 0) / 1e6 * cacheWriteRate + usage.outputTokens / 1e6 * pricing.outputUsdPerMillion;
516
534
  }
517
535
  async function settle(promise, signal) {
518
536
  return await new Promise((resolve) => {
@@ -535,7 +553,16 @@ async function settle(promise, signal) {
535
553
  function buildReceipt(pending, observed, error) {
536
554
  assertUsage(observed);
537
555
  assertString(observed.model, "receipt.model");
538
- const estimated = costForUsage(observed.model, observed);
556
+ if (observed.actualCostUsd !== void 0 && observed.customTokenPricing !== void 0) {
557
+ throw new ValidationError(
558
+ "CostLedger: a receipt cannot have both actualCostUsd and customTokenPricing"
559
+ );
560
+ }
561
+ const customPricingSnapshot = observed.customTokenPricing === void 0 ? void 0 : pricingSnapshot(observed.customTokenPricing);
562
+ const estimated = customPricingSnapshot ? {
563
+ costUsd: costFromPricing(observed, customPricingSnapshot),
564
+ costUnknown: false
565
+ } : costForUsage(observed.model, observed);
539
566
  const hasActual = observed.actualCostUsd !== void 0;
540
567
  if (hasActual && observed.costUnknown === true) {
541
568
  throw new ValidationError(
@@ -545,7 +572,11 @@ function buildReceipt(pending, observed, error) {
545
572
  if (hasActual) assertNonNegative(observed.actualCostUsd, "actualCostUsd");
546
573
  const usageUnknown = observed.usageUnknown === true;
547
574
  const costUnknown = observed.costUnknown === true || !hasActual && (usageUnknown || estimated.costUnknown);
548
- const resolvedPricing = !hasActual && !costUnknown ? resolveModelPricing(observed.model) : null;
575
+ const resolvedModelPricing = !customPricingSnapshot && !hasActual && !costUnknown ? resolveModelPricing(observed.model) : null;
576
+ const receiptPricing = !hasActual && !costUnknown ? customPricingSnapshot ?? (resolvedModelPricing ? {
577
+ inputUsdPerThousand: resolvedModelPricing.input,
578
+ outputUsdPerThousand: resolvedModelPricing.output
579
+ } : void 0) : void 0;
549
580
  return parseReceipt(
550
581
  {
551
582
  status: "settled",
@@ -562,12 +593,7 @@ function buildReceipt(pending, observed, error) {
562
593
  costUsd: costUnknown ? 0 : hasActual ? observed.actualCostUsd : estimated.costUsd,
563
594
  costUnknown,
564
595
  usageUnknown,
565
- ...resolvedPricing ? {
566
- pricing: {
567
- inputUsdPerThousand: resolvedPricing.input,
568
- outputUsdPerThousand: resolvedPricing.output
569
- }
570
- } : {},
596
+ ...receiptPricing ? { pricing: receiptPricing } : {},
571
597
  ...hasActual ? { actualCostUsd: observed.actualCostUsd } : {},
572
598
  ...pending.maximumCostUsd === void 0 ? {} : { maximumCostUsd: pending.maximumCostUsd },
573
599
  ...error ? { error } : {},
@@ -580,11 +606,12 @@ function buildReceipt(pending, observed, error) {
580
606
  var NonEmptyString = z.string().refine((value) => value.trim().length > 0, "must be non-empty");
581
607
  var TokenCount = z.number().int().nonnegative().finite();
582
608
  var NonNegative = z.number().nonnegative().finite();
583
- var Positive = z.number().positive().finite();
584
609
  var Tags = z.record(NonEmptyString, z.string());
585
610
  var CostPricingSchema = z.strictObject({
586
- inputUsdPerThousand: Positive,
587
- outputUsdPerThousand: Positive
611
+ inputUsdPerThousand: NonNegative,
612
+ cachedInputUsdPerThousand: NonNegative.optional(),
613
+ cacheWriteUsdPerThousand: NonNegative.optional(),
614
+ outputUsdPerThousand: NonNegative
588
615
  });
589
616
  var CostCallBaseShape = {
590
617
  callId: NonEmptyString,
@@ -780,7 +807,18 @@ function cloneReceipt(receipt) {
780
807
  };
781
808
  }
782
809
  function costFromPricing(usage, pricing) {
783
- return (usage.inputTokens + (usage.cachedTokens ?? 0) + (usage.cacheWriteTokens ?? 0)) / 1e3 * pricing.inputUsdPerThousand + usage.outputTokens / 1e3 * pricing.outputUsdPerThousand;
810
+ const cachedInputRate = pricing.cachedInputUsdPerThousand ?? pricing.inputUsdPerThousand;
811
+ const cacheWriteRate = pricing.cacheWriteUsdPerThousand ?? pricing.inputUsdPerThousand;
812
+ return usage.inputTokens / 1e3 * pricing.inputUsdPerThousand + (usage.cachedTokens ?? 0) / 1e3 * cachedInputRate + (usage.cacheWriteTokens ?? 0) / 1e3 * cacheWriteRate + usage.outputTokens / 1e3 * pricing.outputUsdPerThousand;
813
+ }
814
+ function pricingSnapshot(pricing) {
815
+ costForTokenPricing(pricing, { inputTokens: 0, outputTokens: 0 });
816
+ return {
817
+ inputUsdPerThousand: pricing.inputUsdPerMillion / 1e3,
818
+ ...pricing.cachedInputUsdPerMillion === void 0 ? {} : { cachedInputUsdPerThousand: pricing.cachedInputUsdPerMillion / 1e3 },
819
+ ...pricing.cacheWriteUsdPerMillion === void 0 ? {} : { cacheWriteUsdPerThousand: pricing.cacheWriteUsdPerMillion / 1e3 },
820
+ outputUsdPerThousand: pricing.outputUsdPerMillion / 1e3
821
+ };
784
822
  }
785
823
  function emptyRollup(channel) {
786
824
  return {
@@ -888,4 +926,4 @@ export {
888
926
  costForUsage,
889
927
  costForTokenPricing
890
928
  };
891
- //# sourceMappingURL=chunk-GRCDRKII.js.map
929
+ //# sourceMappingURL=chunk-WS3NZZQQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"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\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 error?: string\n}\n\nexport type CostLedgerRecord = PendingCostCall | CostReceipt\n\n/** @deprecated Read-only compatibility shape. New paid work uses `runPaidCall`. */\nexport type CostLedgerEntry = Omit<\n CostReceipt,\n 'status' | 'callId' | 'phase' | 'actor' | 'maximumCostUsd' | 'usageUnknown' | 'pricing' | 'error'\n>\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 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 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 committedAndReservedUsd: 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 ${committedAndReservedUsd} already committed or reserved`,\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 CostCallEventV1 {\n version: 1\n record: CostLedgerRecord\n}\n\ninterface CostCallEventV2 {\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 = CostCallEventV1 | CostCallEventV2\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 if (this.records.has(callId)) {\n return {\n succeeded: false,\n callId,\n error: new CostCallConflictError(`CostLedger: callId '${callId}' already exists`),\n }\n }\n this.ensureCostLimitPersisted(callId)\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\n const maximumCostUsd = this.resolveMaximum(input.maximumCharge)\n if (this.costCeilingUsd !== undefined && 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 (this.costCeilingUsd !== undefined) {\n const committedAndReserved = summary.totalCostUsd + summary.reservedCostUsd\n if (committedAndReserved + maximumCostUsd! > this.costCeilingUsd) {\n return {\n succeeded: false,\n callId,\n error: new CostCeilingReachedError(\n this.costCeilingUsd,\n committedAndReserved,\n maximumCostUsd!,\n input.phase,\n input.actor,\n ),\n }\n }\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 } 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: { 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(pending, observed, options.error)\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 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), error.message)\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 commitOutcome<T>(\n pending: PendingCostCall,\n error: Error,\n observed: CostReceiptInput,\n ): PaidCallResult<T> {\n try {\n const receipt = this.commitReceipt(pending, observed, error.message)\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(\n pending,\n unknownReceipt(pending.model),\n toError(receiptError).message,\n )\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 error?: string,\n ): CostReceipt {\n const receipt = buildReceipt(pending, observed, 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 (record.reasoningTokens !== undefined || record.cacheWriteTokens !== undefined)\n ? { version: 2, record: cloneReceipt(record) }\n : { version: 1, record: cloneRecord(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 error?: string,\n): CostReceipt {\n assertUsage(observed)\n assertString(observed.model, 'receipt.model')\n if (observed.actualCostUsd !== undefined && observed.customTokenPricing !== undefined) {\n throw new ValidationError(\n 'CostLedger: a receipt cannot have both actualCostUsd and 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 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 const usageUnknown = observed.usageUnknown === true\n const costUnknown =\n observed.costUnknown === true || (!hasActual && (usageUnknown || estimated.costUnknown))\n const resolvedModelPricing =\n !customPricingSnapshot && !hasActual && !costUnknown\n ? resolveModelPricing(observed.model)\n : null\n const receiptPricing =\n !hasActual && !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 ? 0 : hasActual ? observed.actualCostUsd! : estimated.costUsd,\n costUnknown,\n usageUnknown,\n ...(receiptPricing ? { pricing: receiptPricing } : {}),\n ...(hasActual ? { actualCostUsd: observed.actualCostUsd } : {}),\n ...(pending.maximumCostUsd === undefined ? {} : { maximumCostUsd: pending.maximumCostUsd }),\n ...(error ? { error } : {}),\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 error: z.string().optional(),\n}\nconst LegacyCostReceiptSchema = z\n .strictObject(CostReceiptBaseShape)\n .superRefine((receipt, ctx) => validateCostReceipt(receipt, ctx))\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 },\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) {\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.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 (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\nconst CostLedgerEventSchema = z.union([\n z.strictObject({\n version: z.literal(1),\n record: z.union([PendingCostCallSchema, LegacyCostReceiptSchema]),\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 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 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 JSON.stringify(before.tags ?? {}) === JSON.stringify(after.tags ?? {})\n )\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.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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","names":[]}
package/dist/cli.js CHANGED
@@ -5,13 +5,13 @@ import {
5
5
  runRpcBatch,
6
6
  runRpcOnce,
7
7
  startServerAsync
8
- } from "./chunk-HM6V7F3M.js";
8
+ } from "./chunk-FO7HEH76.js";
9
9
  import {
10
10
  runRolloutReleaseCli
11
11
  } from "./chunk-IPYXE555.js";
12
12
  import "./chunk-MAX3TN3C.js";
13
- import "./chunk-EQUK3RFS.js";
14
- import "./chunk-GRCDRKII.js";
13
+ import "./chunk-J5SQWP6Y.js";
14
+ import "./chunk-WS3NZZQQ.js";
15
15
  import "./chunk-VI2UW6B6.js";
16
16
  import "./chunk-PC4UYEBM.js";
17
17
  import "./chunk-ONWEPEDO.js";