@agent-finops/core 0.9.6 → 0.9.8

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.
@@ -8,8 +8,8 @@ declare const financialEvidenceWithAmountSchema: z.ZodEnum<{
8
8
  }>;
9
9
  export declare const receiptModeValues: readonly ["local", "connected", "mixed", "sample"];
10
10
  export declare const receiptModeSchema: z.ZodEnum<{
11
- mixed: "mixed";
12
11
  local: "local";
12
+ mixed: "mixed";
13
13
  sample: "sample";
14
14
  connected: "connected";
15
15
  }>;
@@ -26,8 +26,8 @@ export type ReceiptSourceKind = z.infer<typeof receiptSourceKindSchema>;
26
26
  export declare const receiptProvenanceOriginValues: readonly ["provider_reported", "locally_observed", "user_declared", "sample"];
27
27
  export declare const receiptProvenanceOriginSchema: z.ZodEnum<{
28
28
  provider_reported: "provider_reported";
29
- sample: "sample";
30
29
  user_declared: "user_declared";
30
+ sample: "sample";
31
31
  locally_observed: "locally_observed";
32
32
  }>;
33
33
  export type ReceiptProvenanceOrigin = z.infer<typeof receiptProvenanceOriginSchema>;
@@ -40,9 +40,9 @@ export declare const receiptTransformationSchema: z.ZodEnum<{
40
40
  export type ReceiptTransformation = z.infer<typeof receiptTransformationSchema>;
41
41
  export declare const receiptAccountingBasisValues: readonly ["provider_billed", "api_equivalent", "user_declared"];
42
42
  export declare const receiptAccountingBasisSchema: z.ZodEnum<{
43
- api_equivalent: "api_equivalent";
44
- provider_billed: "provider_billed";
45
43
  user_declared: "user_declared";
44
+ provider_billed: "provider_billed";
45
+ api_equivalent: "api_equivalent";
46
46
  }>;
47
47
  export type ReceiptAccountingBasis = z.infer<typeof receiptAccountingBasisSchema>;
48
48
  export declare const receiptMappingGapCodeValues: readonly ["cost_unsplit", "cost_unpriced", "model_unmapped", "provider_unmapped", "source_record_unmapped"];
@@ -57,9 +57,9 @@ export type ReceiptMappingGapCode = z.infer<typeof receiptMappingGapCodeSchema>;
57
57
  export declare const receiptFreshnessSchema: z.ZodPipe<z.ZodObject<{
58
58
  status: z.ZodEnum<{
59
59
  error: "error";
60
- not_checked: "not_checked";
61
- stale: "stale";
62
60
  fresh: "fresh";
61
+ stale: "stale";
62
+ not_checked: "not_checked";
63
63
  }>;
64
64
  checkedAt: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
65
65
  latestEvidenceAt: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
@@ -68,9 +68,9 @@ export declare const receiptFreshnessSchema: z.ZodPipe<z.ZodObject<{
68
68
  errorCode?: string | undefined;
69
69
  latestEvidenceAt?: string | undefined;
70
70
  checkedAt?: string | undefined;
71
- status: "error" | "not_checked" | "stale" | "fresh";
71
+ status: "error" | "fresh" | "stale" | "not_checked";
72
72
  }, {
73
- status: "error" | "not_checked" | "stale" | "fresh";
73
+ status: "error" | "fresh" | "stale" | "not_checked";
74
74
  checkedAt?: string | undefined;
75
75
  latestEvidenceAt?: string | undefined;
76
76
  errorCode?: string | undefined;
@@ -95,9 +95,9 @@ export declare const receiptSourceSchema: z.ZodObject<{
95
95
  freshness: z.ZodPipe<z.ZodObject<{
96
96
  status: z.ZodEnum<{
97
97
  error: "error";
98
- not_checked: "not_checked";
99
- stale: "stale";
100
98
  fresh: "fresh";
99
+ stale: "stale";
100
+ not_checked: "not_checked";
101
101
  }>;
102
102
  checkedAt: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
103
103
  latestEvidenceAt: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
@@ -106,9 +106,9 @@ export declare const receiptSourceSchema: z.ZodObject<{
106
106
  errorCode?: string | undefined;
107
107
  latestEvidenceAt?: string | undefined;
108
108
  checkedAt?: string | undefined;
109
- status: "error" | "not_checked" | "stale" | "fresh";
109
+ status: "error" | "fresh" | "stale" | "not_checked";
110
110
  }, {
111
- status: "error" | "not_checked" | "stale" | "fresh";
111
+ status: "error" | "fresh" | "stale" | "not_checked";
112
112
  checkedAt?: string | undefined;
113
113
  latestEvidenceAt?: string | undefined;
114
114
  errorCode?: string | undefined;
@@ -125,8 +125,8 @@ export declare function createReceiptSourceRecordReference(sourceId: string, sou
125
125
  export declare const receiptProvenanceSchema: z.ZodObject<{
126
126
  origin: z.ZodEnum<{
127
127
  provider_reported: "provider_reported";
128
- sample: "sample";
129
128
  user_declared: "user_declared";
129
+ sample: "sample";
130
130
  locally_observed: "locally_observed";
131
131
  }>;
132
132
  transformations: z.ZodArray<z.ZodEnum<{
@@ -147,9 +147,9 @@ export declare const receiptTokenUsageLineSchema: z.ZodObject<{
147
147
  sourceId: z.ZodString;
148
148
  observedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
149
149
  granularity: z.ZodEnum<{
150
+ session: "session";
150
151
  call: "call";
151
152
  invocation: "invocation";
152
- session: "session";
153
153
  daily_aggregate: "daily_aggregate";
154
154
  usage_bucket: "usage_bucket";
155
155
  billing_bucket: "billing_bucket";
@@ -159,8 +159,8 @@ export declare const receiptTokenUsageLineSchema: z.ZodObject<{
159
159
  provenance: z.ZodObject<{
160
160
  origin: z.ZodEnum<{
161
161
  provider_reported: "provider_reported";
162
- sample: "sample";
163
162
  user_declared: "user_declared";
163
+ sample: "sample";
164
164
  locally_observed: "locally_observed";
165
165
  }>;
166
166
  transformations: z.ZodArray<z.ZodEnum<{
@@ -180,9 +180,9 @@ export declare const receiptFinancialCostLineSchema: z.ZodObject<{
180
180
  amountUsd: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
181
181
  currency: z.ZodLiteral<"USD">;
182
182
  accountingBasis: z.ZodEnum<{
183
- api_equivalent: "api_equivalent";
184
- provider_billed: "provider_billed";
185
183
  user_declared: "user_declared";
184
+ provider_billed: "provider_billed";
185
+ api_equivalent: "api_equivalent";
186
186
  }>;
187
187
  financialEvidence: z.ZodEnum<{
188
188
  estimated: "estimated";
@@ -193,9 +193,9 @@ export declare const receiptFinancialCostLineSchema: z.ZodObject<{
193
193
  sourceId: z.ZodString;
194
194
  observedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
195
195
  granularity: z.ZodEnum<{
196
+ session: "session";
196
197
  call: "call";
197
198
  invocation: "invocation";
198
- session: "session";
199
199
  daily_aggregate: "daily_aggregate";
200
200
  usage_bucket: "usage_bucket";
201
201
  billing_bucket: "billing_bucket";
@@ -205,8 +205,8 @@ export declare const receiptFinancialCostLineSchema: z.ZodObject<{
205
205
  provenance: z.ZodObject<{
206
206
  origin: z.ZodEnum<{
207
207
  provider_reported: "provider_reported";
208
- sample: "sample";
209
208
  user_declared: "user_declared";
209
+ sample: "sample";
210
210
  locally_observed: "locally_observed";
211
211
  }>;
212
212
  transformations: z.ZodArray<z.ZodEnum<{
@@ -232,9 +232,9 @@ export declare const receiptLineSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
232
232
  sourceId: z.ZodString;
233
233
  observedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
234
234
  granularity: z.ZodEnum<{
235
+ session: "session";
235
236
  call: "call";
236
237
  invocation: "invocation";
237
- session: "session";
238
238
  daily_aggregate: "daily_aggregate";
239
239
  usage_bucket: "usage_bucket";
240
240
  billing_bucket: "billing_bucket";
@@ -244,8 +244,8 @@ export declare const receiptLineSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
244
244
  provenance: z.ZodObject<{
245
245
  origin: z.ZodEnum<{
246
246
  provider_reported: "provider_reported";
247
- sample: "sample";
248
247
  user_declared: "user_declared";
248
+ sample: "sample";
249
249
  locally_observed: "locally_observed";
250
250
  }>;
251
251
  transformations: z.ZodArray<z.ZodEnum<{
@@ -263,9 +263,9 @@ export declare const receiptLineSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
263
263
  amountUsd: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
264
264
  currency: z.ZodLiteral<"USD">;
265
265
  accountingBasis: z.ZodEnum<{
266
- api_equivalent: "api_equivalent";
267
- provider_billed: "provider_billed";
268
266
  user_declared: "user_declared";
267
+ provider_billed: "provider_billed";
268
+ api_equivalent: "api_equivalent";
269
269
  }>;
270
270
  financialEvidence: z.ZodEnum<{
271
271
  estimated: "estimated";
@@ -276,9 +276,9 @@ export declare const receiptLineSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
276
276
  sourceId: z.ZodString;
277
277
  observedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
278
278
  granularity: z.ZodEnum<{
279
+ session: "session";
279
280
  call: "call";
280
281
  invocation: "invocation";
281
- session: "session";
282
282
  daily_aggregate: "daily_aggregate";
283
283
  usage_bucket: "usage_bucket";
284
284
  billing_bucket: "billing_bucket";
@@ -288,8 +288,8 @@ export declare const receiptLineSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
288
288
  provenance: z.ZodObject<{
289
289
  origin: z.ZodEnum<{
290
290
  provider_reported: "provider_reported";
291
- sample: "sample";
292
291
  user_declared: "user_declared";
292
+ sample: "sample";
293
293
  locally_observed: "locally_observed";
294
294
  }>;
295
295
  transformations: z.ZodArray<z.ZodEnum<{
@@ -326,9 +326,9 @@ export declare const receiptMappingGapSchema: z.ZodPipe<z.ZodObject<{
326
326
  export type ReceiptMappingGap = z.infer<typeof receiptMappingGapSchema>;
327
327
  export declare const receiptCostTotalSchema: z.ZodObject<{
328
328
  accountingBasis: z.ZodEnum<{
329
- api_equivalent: "api_equivalent";
330
- provider_billed: "provider_billed";
331
329
  user_declared: "user_declared";
330
+ provider_billed: "provider_billed";
331
+ api_equivalent: "api_equivalent";
332
332
  }>;
333
333
  financialEvidence: z.ZodEnum<{
334
334
  estimated: "estimated";
@@ -345,8 +345,8 @@ declare const receiptBodyObjectSchema: z.ZodObject<{
345
345
  schemaVersion: z.ZodLiteral<"0.1.0">;
346
346
  generatedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
347
347
  mode: z.ZodEnum<{
348
- mixed: "mixed";
349
348
  local: "local";
349
+ mixed: "mixed";
350
350
  sample: "sample";
351
351
  connected: "connected";
352
352
  }>;
@@ -374,9 +374,9 @@ declare const receiptBodyObjectSchema: z.ZodObject<{
374
374
  freshness: z.ZodPipe<z.ZodObject<{
375
375
  status: z.ZodEnum<{
376
376
  error: "error";
377
- not_checked: "not_checked";
378
- stale: "stale";
379
377
  fresh: "fresh";
378
+ stale: "stale";
379
+ not_checked: "not_checked";
380
380
  }>;
381
381
  checkedAt: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
382
382
  latestEvidenceAt: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
@@ -385,9 +385,9 @@ declare const receiptBodyObjectSchema: z.ZodObject<{
385
385
  errorCode?: string | undefined;
386
386
  latestEvidenceAt?: string | undefined;
387
387
  checkedAt?: string | undefined;
388
- status: "error" | "not_checked" | "stale" | "fresh";
388
+ status: "error" | "fresh" | "stale" | "not_checked";
389
389
  }, {
390
- status: "error" | "not_checked" | "stale" | "fresh";
390
+ status: "error" | "fresh" | "stale" | "not_checked";
391
391
  checkedAt?: string | undefined;
392
392
  latestEvidenceAt?: string | undefined;
393
393
  errorCode?: string | undefined;
@@ -404,9 +404,9 @@ declare const receiptBodyObjectSchema: z.ZodObject<{
404
404
  sourceId: z.ZodString;
405
405
  observedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
406
406
  granularity: z.ZodEnum<{
407
+ session: "session";
407
408
  call: "call";
408
409
  invocation: "invocation";
409
- session: "session";
410
410
  daily_aggregate: "daily_aggregate";
411
411
  usage_bucket: "usage_bucket";
412
412
  billing_bucket: "billing_bucket";
@@ -416,8 +416,8 @@ declare const receiptBodyObjectSchema: z.ZodObject<{
416
416
  provenance: z.ZodObject<{
417
417
  origin: z.ZodEnum<{
418
418
  provider_reported: "provider_reported";
419
- sample: "sample";
420
419
  user_declared: "user_declared";
420
+ sample: "sample";
421
421
  locally_observed: "locally_observed";
422
422
  }>;
423
423
  transformations: z.ZodArray<z.ZodEnum<{
@@ -435,9 +435,9 @@ declare const receiptBodyObjectSchema: z.ZodObject<{
435
435
  amountUsd: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
436
436
  currency: z.ZodLiteral<"USD">;
437
437
  accountingBasis: z.ZodEnum<{
438
- api_equivalent: "api_equivalent";
439
- provider_billed: "provider_billed";
440
438
  user_declared: "user_declared";
439
+ provider_billed: "provider_billed";
440
+ api_equivalent: "api_equivalent";
441
441
  }>;
442
442
  financialEvidence: z.ZodEnum<{
443
443
  estimated: "estimated";
@@ -448,9 +448,9 @@ declare const receiptBodyObjectSchema: z.ZodObject<{
448
448
  sourceId: z.ZodString;
449
449
  observedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
450
450
  granularity: z.ZodEnum<{
451
+ session: "session";
451
452
  call: "call";
452
453
  invocation: "invocation";
453
- session: "session";
454
454
  daily_aggregate: "daily_aggregate";
455
455
  usage_bucket: "usage_bucket";
456
456
  billing_bucket: "billing_bucket";
@@ -460,8 +460,8 @@ declare const receiptBodyObjectSchema: z.ZodObject<{
460
460
  provenance: z.ZodObject<{
461
461
  origin: z.ZodEnum<{
462
462
  provider_reported: "provider_reported";
463
- sample: "sample";
464
463
  user_declared: "user_declared";
464
+ sample: "sample";
465
465
  locally_observed: "locally_observed";
466
466
  }>;
467
467
  transformations: z.ZodArray<z.ZodEnum<{
@@ -500,8 +500,8 @@ export declare const agentEconomicsReceiptV0DraftSchema: z.ZodObject<{
500
500
  schemaVersion: z.ZodLiteral<"0.1.0">;
501
501
  generatedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
502
502
  mode: z.ZodEnum<{
503
- mixed: "mixed";
504
503
  local: "local";
504
+ mixed: "mixed";
505
505
  sample: "sample";
506
506
  connected: "connected";
507
507
  }>;
@@ -529,9 +529,9 @@ export declare const agentEconomicsReceiptV0DraftSchema: z.ZodObject<{
529
529
  freshness: z.ZodPipe<z.ZodObject<{
530
530
  status: z.ZodEnum<{
531
531
  error: "error";
532
- not_checked: "not_checked";
533
- stale: "stale";
534
532
  fresh: "fresh";
533
+ stale: "stale";
534
+ not_checked: "not_checked";
535
535
  }>;
536
536
  checkedAt: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
537
537
  latestEvidenceAt: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
@@ -540,9 +540,9 @@ export declare const agentEconomicsReceiptV0DraftSchema: z.ZodObject<{
540
540
  errorCode?: string | undefined;
541
541
  latestEvidenceAt?: string | undefined;
542
542
  checkedAt?: string | undefined;
543
- status: "error" | "not_checked" | "stale" | "fresh";
543
+ status: "error" | "fresh" | "stale" | "not_checked";
544
544
  }, {
545
- status: "error" | "not_checked" | "stale" | "fresh";
545
+ status: "error" | "fresh" | "stale" | "not_checked";
546
546
  checkedAt?: string | undefined;
547
547
  latestEvidenceAt?: string | undefined;
548
548
  errorCode?: string | undefined;
@@ -559,9 +559,9 @@ export declare const agentEconomicsReceiptV0DraftSchema: z.ZodObject<{
559
559
  sourceId: z.ZodString;
560
560
  observedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
561
561
  granularity: z.ZodEnum<{
562
+ session: "session";
562
563
  call: "call";
563
564
  invocation: "invocation";
564
- session: "session";
565
565
  daily_aggregate: "daily_aggregate";
566
566
  usage_bucket: "usage_bucket";
567
567
  billing_bucket: "billing_bucket";
@@ -571,8 +571,8 @@ export declare const agentEconomicsReceiptV0DraftSchema: z.ZodObject<{
571
571
  provenance: z.ZodObject<{
572
572
  origin: z.ZodEnum<{
573
573
  provider_reported: "provider_reported";
574
- sample: "sample";
575
574
  user_declared: "user_declared";
575
+ sample: "sample";
576
576
  locally_observed: "locally_observed";
577
577
  }>;
578
578
  transformations: z.ZodArray<z.ZodEnum<{
@@ -590,9 +590,9 @@ export declare const agentEconomicsReceiptV0DraftSchema: z.ZodObject<{
590
590
  amountUsd: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
591
591
  currency: z.ZodLiteral<"USD">;
592
592
  accountingBasis: z.ZodEnum<{
593
- api_equivalent: "api_equivalent";
594
- provider_billed: "provider_billed";
595
593
  user_declared: "user_declared";
594
+ provider_billed: "provider_billed";
595
+ api_equivalent: "api_equivalent";
596
596
  }>;
597
597
  financialEvidence: z.ZodEnum<{
598
598
  estimated: "estimated";
@@ -603,9 +603,9 @@ export declare const agentEconomicsReceiptV0DraftSchema: z.ZodObject<{
603
603
  sourceId: z.ZodString;
604
604
  observedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
605
605
  granularity: z.ZodEnum<{
606
+ session: "session";
606
607
  call: "call";
607
608
  invocation: "invocation";
608
- session: "session";
609
609
  daily_aggregate: "daily_aggregate";
610
610
  usage_bucket: "usage_bucket";
611
611
  billing_bucket: "billing_bucket";
@@ -615,8 +615,8 @@ export declare const agentEconomicsReceiptV0DraftSchema: z.ZodObject<{
615
615
  provenance: z.ZodObject<{
616
616
  origin: z.ZodEnum<{
617
617
  provider_reported: "provider_reported";
618
- sample: "sample";
619
618
  user_declared: "user_declared";
619
+ sample: "sample";
620
620
  locally_observed: "locally_observed";
621
621
  }>;
622
622
  transformations: z.ZodArray<z.ZodEnum<{
@@ -657,8 +657,8 @@ export declare const agentEconomicsReceiptV0Schema: z.ZodObject<{
657
657
  schemaVersion: z.ZodLiteral<"0.1.0">;
658
658
  generatedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
659
659
  mode: z.ZodEnum<{
660
- mixed: "mixed";
661
660
  local: "local";
661
+ mixed: "mixed";
662
662
  sample: "sample";
663
663
  connected: "connected";
664
664
  }>;
@@ -686,9 +686,9 @@ export declare const agentEconomicsReceiptV0Schema: z.ZodObject<{
686
686
  freshness: z.ZodPipe<z.ZodObject<{
687
687
  status: z.ZodEnum<{
688
688
  error: "error";
689
- not_checked: "not_checked";
690
- stale: "stale";
691
689
  fresh: "fresh";
690
+ stale: "stale";
691
+ not_checked: "not_checked";
692
692
  }>;
693
693
  checkedAt: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
694
694
  latestEvidenceAt: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
@@ -697,9 +697,9 @@ export declare const agentEconomicsReceiptV0Schema: z.ZodObject<{
697
697
  errorCode?: string | undefined;
698
698
  latestEvidenceAt?: string | undefined;
699
699
  checkedAt?: string | undefined;
700
- status: "error" | "not_checked" | "stale" | "fresh";
700
+ status: "error" | "fresh" | "stale" | "not_checked";
701
701
  }, {
702
- status: "error" | "not_checked" | "stale" | "fresh";
702
+ status: "error" | "fresh" | "stale" | "not_checked";
703
703
  checkedAt?: string | undefined;
704
704
  latestEvidenceAt?: string | undefined;
705
705
  errorCode?: string | undefined;
@@ -716,9 +716,9 @@ export declare const agentEconomicsReceiptV0Schema: z.ZodObject<{
716
716
  sourceId: z.ZodString;
717
717
  observedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
718
718
  granularity: z.ZodEnum<{
719
+ session: "session";
719
720
  call: "call";
720
721
  invocation: "invocation";
721
- session: "session";
722
722
  daily_aggregate: "daily_aggregate";
723
723
  usage_bucket: "usage_bucket";
724
724
  billing_bucket: "billing_bucket";
@@ -728,8 +728,8 @@ export declare const agentEconomicsReceiptV0Schema: z.ZodObject<{
728
728
  provenance: z.ZodObject<{
729
729
  origin: z.ZodEnum<{
730
730
  provider_reported: "provider_reported";
731
- sample: "sample";
732
731
  user_declared: "user_declared";
732
+ sample: "sample";
733
733
  locally_observed: "locally_observed";
734
734
  }>;
735
735
  transformations: z.ZodArray<z.ZodEnum<{
@@ -747,9 +747,9 @@ export declare const agentEconomicsReceiptV0Schema: z.ZodObject<{
747
747
  amountUsd: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
748
748
  currency: z.ZodLiteral<"USD">;
749
749
  accountingBasis: z.ZodEnum<{
750
- api_equivalent: "api_equivalent";
751
- provider_billed: "provider_billed";
752
750
  user_declared: "user_declared";
751
+ provider_billed: "provider_billed";
752
+ api_equivalent: "api_equivalent";
753
753
  }>;
754
754
  financialEvidence: z.ZodEnum<{
755
755
  estimated: "estimated";
@@ -760,9 +760,9 @@ export declare const agentEconomicsReceiptV0Schema: z.ZodObject<{
760
760
  sourceId: z.ZodString;
761
761
  observedAt: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
762
762
  granularity: z.ZodEnum<{
763
+ session: "session";
763
764
  call: "call";
764
765
  invocation: "invocation";
765
- session: "session";
766
766
  daily_aggregate: "daily_aggregate";
767
767
  usage_bucket: "usage_bucket";
768
768
  billing_bucket: "billing_bucket";
@@ -772,8 +772,8 @@ export declare const agentEconomicsReceiptV0Schema: z.ZodObject<{
772
772
  provenance: z.ZodObject<{
773
773
  origin: z.ZodEnum<{
774
774
  provider_reported: "provider_reported";
775
- sample: "sample";
776
775
  user_declared: "user_declared";
776
+ sample: "sample";
777
777
  locally_observed: "locally_observed";
778
778
  }>;
779
779
  transformations: z.ZodArray<z.ZodEnum<{
@@ -809,9 +809,9 @@ export declare const agentEconomicsReceiptV0Schema: z.ZodObject<{
809
809
  id: z.ZodString;
810
810
  costTotals: z.ZodArray<z.ZodObject<{
811
811
  accountingBasis: z.ZodEnum<{
812
- api_equivalent: "api_equivalent";
813
- provider_billed: "provider_billed";
814
812
  user_declared: "user_declared";
813
+ provider_billed: "provider_billed";
814
+ api_equivalent: "api_equivalent";
815
815
  }>;
816
816
  financialEvidence: z.ZodEnum<{
817
817
  estimated: "estimated";
package/dist/analyze.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { generateSpendInsights } from "./insights.js";
2
+ import { safeUntrustedLabel, safeUntrustedLabels, WITHHELD_AGENT_LABEL, WITHHELD_ENTITY_LABEL, WITHHELD_OPERATION_LABEL } from "./untrustedLabel.js";
2
3
  import { costConfidenceValues, hasModeledWorkloadEvidence, hasPricedEvidence, spendComparisonKey, spendSummarySchema } from "./schema.js";
3
4
  const confidenceRank = {
4
5
  verified: 0,
@@ -154,11 +155,27 @@ export function generateWorkflowWatch(records) {
154
155
  const hasRunLevelEvidence = groupRecords.every(hasModeledWorkloadEvidence);
155
156
  const suggestedOptimization = workflowDiagnosticFor(workflowKey, agentId, hasRunLevelEvidence);
156
157
  return {
157
- id: slugify(["workflow", clientId, projectId, workflowKey].join("-")),
158
- clientId,
159
- projectId,
160
- workflowKey,
161
- agentId,
158
+ // The id is a STRUCTURED field beside the neutralized prose and it is
159
+ // rendered. Slug the neutralized forms, not the raw grouping keys.
160
+ id: slugify([
161
+ "workflow",
162
+ safeEntity(clientId),
163
+ safeEntity(projectId),
164
+ safeWorkflowLabel(workflowKey)
165
+ ].join("-")),
166
+ // Neutralized, not raw. These fields ship inside the SpendSummary that
167
+ // the MCP tools hand to an agent, so leaving them raw beside neutralized
168
+ // prose is the same inversion as the repeated-read array: the human sees
169
+ // the redaction and the agent gets the payload.
170
+ //
171
+ // workflowWatchAmount re-matches these against the records to recompute
172
+ // a display amount. An ordinary name is byte-identical, so that match is
173
+ // unaffected; a name that reads like an instruction loses its amount,
174
+ // which is the right way round.
175
+ clientId: safeEntity(clientId),
176
+ projectId: safeEntity(projectId),
177
+ workflowKey: safeWorkflowLabel(workflowKey),
178
+ agentId: safeUntrustedLabel(agentId, WITHHELD_AGENT_LABEL),
162
179
  amountUsd,
163
180
  shareOfSpend,
164
181
  recordCount: groupRecords.length,
@@ -168,8 +185,8 @@ export function generateWorkflowWatch(records) {
168
185
  suggestedOptimization,
169
186
  applyArtifact: `Before changing this workload: ${suggestedOptimization}`,
170
187
  verificationPlan: hasRunLevelEvidence
171
- ? `Reconcile ${workflowKey} to its owner and budget, then define one reversible candidate and compare matched future accepted outcomes plus provider-reported cost.`
172
- : `Reconcile ${workflowKey} to its owner and budget, then collect call-level workload evidence before modeling or applying a cost change.`
188
+ ? `Reconcile ${safeWorkflowLabel(workflowKey)} to its owner and budget, then define one reversible candidate and compare matched future accepted outcomes plus provider-reported cost.`
189
+ : `Reconcile ${safeWorkflowLabel(workflowKey)} to its owner and budget, then collect call-level workload evidence before modeling or applying a cost change.`
173
190
  };
174
191
  })
175
192
  .filter((entry) => entry.amountUsd > 0)
@@ -186,16 +203,16 @@ export function generateRecommendations(records) {
186
203
  recommendations.push({
187
204
  id: "model-downgrade",
188
205
  title: "Review expensive model workloads for downgrade candidates",
189
- rationale: `${topModel.key} is the largest cost driver in the current local sample.`,
206
+ rationale: `${safeEntity(topModel.key)} is the largest cost driver in the current local sample.`,
190
207
  whyItMatters: "Premium model usage tends to become invisible once agents are running in the background. Spend owners need a clear rule for which jobs deserve the expensive model.",
191
- nextAction: `Audit the top ${topModel.key} operations and move low-risk summarization, extraction, and draft work to a cheaper model tier first.`,
208
+ nextAction: `Audit the top ${safeEntity(topModel.key)} operations and move low-risk summarization, extraction, and draft work to a cheaper model tier first.`,
192
209
  priority: "high",
193
210
  // The high-level recommendation does not know which model-specific rule
194
211
  // will pass quality verification. Dollar math lives in the exact cut
195
212
  // candidate; concentration alone earns no flat percentage.
196
213
  estimatedImpactUsd: 0,
197
214
  confidence: topModel.confidence,
198
- relatedKeys: [topModel.key]
215
+ relatedKeys: [safeEntity(topModel.key)]
199
216
  });
200
217
  }
201
218
  const highInputTokenRecords = decisionRecords.filter((record) => record.inputTokens >= 100_000);
@@ -209,7 +226,7 @@ export function generateRecommendations(records) {
209
226
  priority: "high",
210
227
  estimatedImpactUsd: 0,
211
228
  confidence: combinedConfidence(highInputTokenRecords.map((record) => record.costConfidence)),
212
- relatedKeys: unique(highInputTokenRecords.map((record) => record.model))
229
+ relatedKeys: safeUntrustedLabels(unique(highInputTokenRecords.map((record) => record.model)))
213
230
  });
214
231
  }
215
232
  // An operation label alone does not prove identical inputs. Require an
@@ -229,7 +246,7 @@ export function generateRecommendations(records) {
229
246
  priority: "medium",
230
247
  estimatedImpactUsd: roundMoney(sumRecords(cacheableRecords)),
231
248
  confidence: combinedConfidence(cacheableRecords.map((record) => record.costConfidence)),
232
- relatedKeys: repeatedOperations
249
+ relatedKeys: safeUntrustedLabels(repeatedOperations, WITHHELD_OPERATION_LABEL)
233
250
  });
234
251
  }
235
252
  const agentSpend = breakdown(decisionRecords, (record) => record.agentId);
@@ -238,13 +255,13 @@ export function generateRecommendations(records) {
238
255
  recommendations.push({
239
256
  id: "agent-caps",
240
257
  title: "Confirm the owner and budget for the highest-cost agent",
241
- rationale: `${topAgent.key} accounts for a material share of sampled usage.`,
258
+ rationale: `${safeEntity(topAgent.key)} accounts for a material share of sampled usage.`,
242
259
  whyItMatters: "Concentration is an accountability signal, but it does not by itself prove abnormal behavior or an avoidable dollar amount.",
243
- nextAction: `Confirm ${topAgent.key}'s owner and approved range, then collect run-level evidence before proposing a warning threshold or hard cap.`,
260
+ nextAction: `Confirm ${safeEntity(topAgent.key)}'s owner and approved range, then collect run-level evidence before proposing a warning threshold or hard cap.`,
244
261
  priority: "high",
245
262
  estimatedImpactUsd: 0,
246
263
  confidence: topAgent.confidence,
247
- relatedKeys: [topAgent.key]
264
+ relatedKeys: [safeEntity(topAgent.key)]
248
265
  });
249
266
  }
250
267
  const batchableRecords = decisionRecords.filter((record) => record.workloadSemantics?.batchEligible === true &&
@@ -262,7 +279,7 @@ export function generateRecommendations(records) {
262
279
  return total + (record.amountUsd ?? 0) * (1 - retained);
263
280
  }, 0)),
264
281
  confidence: combinedConfidence(batchableRecords.map((record) => record.costConfidence)),
265
- relatedKeys: unique(batchableRecords.map((record) => record.operation).filter(isPresent))
282
+ relatedKeys: safeUntrustedLabels(unique(batchableRecords.map((record) => record.operation).filter(isPresent)), WITHHELD_OPERATION_LABEL)
266
283
  });
267
284
  }
268
285
  return recommendations;
@@ -335,9 +352,33 @@ function isLocalAgentRecord(record) {
335
352
  return record.providerCostType === "local_agent_logs";
336
353
  }
337
354
  function workflowDiagnosticFor(workflowKey, agentId, hasRunLevelEvidence) {
355
+ const workflow = safeWorkflowLabel(workflowKey);
356
+ const agent = safeUntrustedLabel(agentId, WITHHELD_AGENT_LABEL);
338
357
  return hasRunLevelEvidence
339
- ? `Confirm the owner and approved budget for ${workflowKey} (${agentId}), reconcile the observed spend, and define one reversible candidate with an accepted-outcome quality bar before approval.`
340
- : `Confirm the owner and approved budget for ${workflowKey} (${agentId}), reconcile the observed spend, and collect call-level provenance before proposing a reversible optimization.`;
358
+ ? `Confirm the owner and approved budget for ${workflow} (${agent}), reconcile the observed spend, and define one reversible candidate with an accepted-outcome quality bar before approval.`
359
+ : `Confirm the owner and approved budget for ${workflow} (${agent}), reconcile the observed spend, and collect call-level provenance before proposing a reversible optimization.`;
360
+ }
361
+ /**
362
+ * The workflow key IS `record.operation` — a provider/adapter string, untrusted
363
+ * end to end. It reaches `suggestedOptimization`, `applyArtifact` and
364
+ * `verificationPlan`, and those three are rendered as product prose that the
365
+ * report layer deliberately never blanks. So it is neutralized here, at the
366
+ * interpolation point, exactly as the cut-list builders do.
367
+ *
368
+ * The ENTRY's own identity fields are neutralized too: they travel inside the
369
+ * SpendSummary that the MCP tools return, so a raw field sitting beside
370
+ * neutralized prose hands an agent exactly what the human was protected from.
371
+ */
372
+ function safeWorkflowLabel(workflowKey) {
373
+ return safeUntrustedLabel(workflowKey, WITHHELD_OPERATION_LABEL);
374
+ }
375
+ /**
376
+ * A breakdown key rendered for a HUMAN — a model id, an agent id, an
377
+ * operation label. Display only: the raw key is still what the record filters
378
+ * match on, and rewriting a matching key would empty the cohort.
379
+ */
380
+ function safeEntity(value) {
381
+ return safeUntrustedLabel(value, WITHHELD_ENTITY_LABEL);
341
382
  }
342
383
  function slugify(value) {
343
384
  return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");