@tangle-network/agent-eval 0.117.1 → 0.118.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/analyst/index.d.ts +2772 -21
  3. package/dist/analyst/index.js +7 -6
  4. package/dist/analyst/index.js.map +1 -1
  5. package/dist/belief-state/index.d.ts +706 -10
  6. package/dist/belief-state/index.js +2 -1
  7. package/dist/belief-state/index.js.map +1 -1
  8. package/dist/benchmarks/index.d.ts +958 -14
  9. package/dist/benchmarks/index.js +12 -10
  10. package/dist/builder-eval/index.d.ts +449 -4
  11. package/dist/builder-eval/index.js +4 -3
  12. package/dist/builder-eval/index.js.map +1 -1
  13. package/dist/campaign/index.d.ts +4275 -73
  14. package/dist/campaign/index.js +12 -10
  15. package/dist/{chunk-VF3XSYTI.js → chunk-33JA4TFA.js} +6 -6
  16. package/dist/{chunk-4JLWXDYA.js → chunk-3EHHMC6E.js} +2 -2
  17. package/dist/{chunk-CCZIVI3F.js → chunk-BFW56GTT.js} +2 -2
  18. package/dist/{chunk-YZPO4UHR.js → chunk-DP3BBMYJ.js} +100 -143
  19. package/dist/chunk-DP3BBMYJ.js.map +1 -0
  20. package/dist/{chunk-E4BUPP7Z.js → chunk-HKUCJ437.js} +38 -66
  21. package/dist/chunk-HKUCJ437.js.map +1 -0
  22. package/dist/{chunk-HZHNRYHK.js → chunk-K6N6XJJX.js} +2 -2
  23. package/dist/chunk-KSDQVPLR.js +286 -0
  24. package/dist/chunk-KSDQVPLR.js.map +1 -0
  25. package/dist/chunk-MA6HLL3S.js +65 -0
  26. package/dist/chunk-MA6HLL3S.js.map +1 -0
  27. package/dist/{chunk-MGEHEHSN.js → chunk-OIIMMLRB.js} +11 -11
  28. package/dist/{chunk-DXZRATT5.js → chunk-OYZAPX5G.js} +3 -3
  29. package/dist/chunk-PXE2VKMX.js +140 -0
  30. package/dist/chunk-PXE2VKMX.js.map +1 -0
  31. package/dist/{chunk-JSJZ4PJ6.js → chunk-Q442S5AS.js} +17 -17
  32. package/dist/{chunk-ODVOOEWQ.js → chunk-QBRSJK47.js} +2 -2
  33. package/dist/{chunk-S2F4J57L.js → chunk-QKEGNI5B.js} +77 -32
  34. package/dist/chunk-QKEGNI5B.js.map +1 -0
  35. package/dist/{chunk-5UF54T55.js → chunk-S3UZOQ5Y.js} +34 -7
  36. package/dist/chunk-S3UZOQ5Y.js.map +1 -0
  37. package/dist/{chunk-FQNLDL4D.js → chunk-SVH2ANFD.js} +136 -4
  38. package/dist/chunk-SVH2ANFD.js.map +1 -0
  39. package/dist/{chunk-GQCZRZ7L.js → chunk-U5CHZ5M3.js} +9 -9
  40. package/dist/{chunk-TVVP3ZZQ.js → chunk-VQMK5FMP.js} +2 -1
  41. package/dist/{chunk-TVVP3ZZQ.js.map → chunk-VQMK5FMP.js.map} +1 -1
  42. package/dist/chunk-WDHBCA3M.js +31 -0
  43. package/dist/chunk-WDHBCA3M.js.map +1 -0
  44. package/dist/{chunk-HQPHZGL6.js → chunk-YLMUS4MM.js} +9 -9
  45. package/dist/{chunk-LQUTGLOZ.js → chunk-ZET2UAYW.js} +15 -65
  46. package/dist/chunk-ZET2UAYW.js.map +1 -0
  47. package/dist/contract/index.d.ts +4012 -38
  48. package/dist/contract/index.js +56 -29
  49. package/dist/contract/index.js.map +1 -1
  50. package/dist/control.d.ts +1013 -9
  51. package/dist/control.js +4 -3
  52. package/dist/fuzz.d.ts +194 -4
  53. package/dist/fuzz.js +3 -3
  54. package/dist/hosted/index.d.ts +498 -17
  55. package/dist/index.d.ts +10982 -1286
  56. package/dist/index.js +97 -80
  57. package/dist/index.js.map +1 -1
  58. package/dist/matrix/index.d.ts +139 -4
  59. package/dist/meta-eval/index.d.ts +862 -15
  60. package/dist/meta-eval/index.js +2 -1
  61. package/dist/meta-eval/index.js.map +1 -1
  62. package/dist/multishot/index.d.ts +214 -14
  63. package/dist/openapi.json +1 -1
  64. package/dist/pipelines/index.d.ts +392 -7
  65. package/dist/pipelines/index.js +5 -3
  66. package/dist/pipelines/index.js.map +1 -1
  67. package/dist/reporting.d.ts +1277 -17
  68. package/dist/rl.d.ts +2359 -28
  69. package/dist/rl.js +6 -5
  70. package/dist/rl.js.map +1 -1
  71. package/dist/storyboard/index.d.ts +86 -1
  72. package/dist/trace-attributes.d.ts +16 -0
  73. package/dist/trace-attributes.js +32 -0
  74. package/dist/trace-attributes.js.map +1 -0
  75. package/dist/traces.d.ts +1970 -697
  76. package/dist/traces.js +49 -32
  77. package/dist/wire/index.d.ts +655 -9
  78. package/docs/insight-report.md +44 -0
  79. package/package.json +9 -3
  80. package/dist/adversarial-B7loGVVX.d.ts +0 -19
  81. package/dist/analyst-C8HHvfJp.d.ts +0 -88
  82. package/dist/analyze-runs--2x39HZ7.d.ts +0 -81
  83. package/dist/baseline-DKq3gJpP.d.ts +0 -141
  84. package/dist/calibration-C8MTS7cw.d.ts +0 -101
  85. package/dist/chunk-5UF54T55.js.map +0 -1
  86. package/dist/chunk-E4BUPP7Z.js.map +0 -1
  87. package/dist/chunk-FQNLDL4D.js.map +0 -1
  88. package/dist/chunk-LQUTGLOZ.js.map +0 -1
  89. package/dist/chunk-S2F4J57L.js.map +0 -1
  90. package/dist/chunk-YZPO4UHR.js.map +0 -1
  91. package/dist/code-agent-session-CjZsVd19.d.ts +0 -87
  92. package/dist/control-6vuGfmDH.d.ts +0 -258
  93. package/dist/cost-ledger-DWy3XdJc.d.ts +0 -183
  94. package/dist/dataset-NENEzRgk.d.ts +0 -115
  95. package/dist/default-registry-DaK8b3fv.d.ts +0 -155
  96. package/dist/emitter-CjD7vUwv.d.ts +0 -122
  97. package/dist/errors-oeQrLqXC.d.ts +0 -74
  98. package/dist/failure-cluster-DOAcSJ87.d.ts +0 -76
  99. package/dist/feedback-trajectory-BUnM58xL.d.ts +0 -348
  100. package/dist/gepa-eESocoDi.d.ts +0 -642
  101. package/dist/index-PdX4VnPA.d.ts +0 -423
  102. package/dist/insight-report-DY4nDW9Q.d.ts +0 -310
  103. package/dist/integrity-DqlBiLyK.d.ts +0 -81
  104. package/dist/judge-calibration-7C-IDmKr.d.ts +0 -145
  105. package/dist/kind-factory-ClZmO25A.d.ts +0 -171
  106. package/dist/llm-client-qoDd18Qz.d.ts +0 -289
  107. package/dist/multi-layer-verifier-BsqKuLyN.d.ts +0 -150
  108. package/dist/off-policy-DiwuKKg7.d.ts +0 -132
  109. package/dist/outcome-store-rnXLEqSn.d.ts +0 -63
  110. package/dist/policy-edit-wG9uFEFm.d.ts +0 -455
  111. package/dist/pre-registration-BWQhJ3vz.d.ts +0 -761
  112. package/dist/provenance-DpjwyseI.d.ts +0 -541
  113. package/dist/query-CF7PG61p.d.ts +0 -35
  114. package/dist/raw-provider-sink-C46HDghv.d.ts +0 -132
  115. package/dist/release-report-C8G2i5Xi.d.ts +0 -236
  116. package/dist/researcher-C8XyxQsu.d.ts +0 -387
  117. package/dist/rubric-predictive-validity-p49lLVrE.d.ts +0 -105
  118. package/dist/run-record-BDH49H2E.d.ts +0 -360
  119. package/dist/runtime-trajectory-DGBIUt4B.d.ts +0 -49
  120. package/dist/schema-B3Q3l9Z_.d.ts +0 -201
  121. package/dist/semantic-concept-judge-CXnPEJbf.d.ts +0 -723
  122. package/dist/sequential-5iSVfzl2.d.ts +0 -139
  123. package/dist/series-convergence-D5OWMBg6.d.ts +0 -33
  124. package/dist/statistics-KUnG73jH.d.ts +0 -494
  125. package/dist/storage-DrX3v_5B.d.ts +0 -50
  126. package/dist/store-C1YxJDEK.d.ts +0 -248
  127. package/dist/store-DGqD0Pyo.d.ts +0 -116
  128. package/dist/summary-report-C5bKFfm-.d.ts +0 -445
  129. package/dist/test-graded-scenario-B0ybnPY7.d.ts +0 -166
  130. package/dist/types-BSw1rOUB.d.ts +0 -634
  131. package/dist/types-BUxNaJ8c.d.ts +0 -108
  132. package/dist/types-BkfcQnxV.d.ts +0 -313
  133. package/dist/verdict-C9MlYujm.d.ts +0 -35
  134. /package/dist/{chunk-VF3XSYTI.js.map → chunk-33JA4TFA.js.map} +0 -0
  135. /package/dist/{chunk-4JLWXDYA.js.map → chunk-3EHHMC6E.js.map} +0 -0
  136. /package/dist/{chunk-CCZIVI3F.js.map → chunk-BFW56GTT.js.map} +0 -0
  137. /package/dist/{chunk-HZHNRYHK.js.map → chunk-K6N6XJJX.js.map} +0 -0
  138. /package/dist/{chunk-MGEHEHSN.js.map → chunk-OIIMMLRB.js.map} +0 -0
  139. /package/dist/{chunk-DXZRATT5.js.map → chunk-OYZAPX5G.js.map} +0 -0
  140. /package/dist/{chunk-JSJZ4PJ6.js.map → chunk-Q442S5AS.js.map} +0 -0
  141. /package/dist/{chunk-ODVOOEWQ.js.map → chunk-QBRSJK47.js.map} +0 -0
  142. /package/dist/{chunk-GQCZRZ7L.js.map → chunk-U5CHZ5M3.js.map} +0 -0
  143. /package/dist/{chunk-HQPHZGL6.js.map → chunk-YLMUS4MM.js.map} +0 -0
@@ -0,0 +1,140 @@
1
+ // src/trace/extract-usage.ts
2
+ import { SSEChunkParser } from "@tangle-network/agent-core/sse";
3
+ import {
4
+ firstTokenCount,
5
+ TOKEN_USAGE_INPUT_KEYS,
6
+ TOKEN_USAGE_OUTPUT_KEYS,
7
+ tokenUsageSource
8
+ } from "@tangle-network/agent-core/telemetry";
9
+ var INPUT_OTHER_KEYS = ["input_other"];
10
+ var EXCLUSIVE_REASONING_KEYS = ["reasoning", "reasoning_tokens", "reasoningTokens"];
11
+ var INCLUSIVE_REASONING_KEYS = ["reasoning_output_tokens", "reasoningOutputTokens"];
12
+ var INPUT_DETAIL_KEYS = ["prompt_tokens_details", "input_tokens_details"];
13
+ var OUTPUT_DETAIL_KEYS = ["completion_tokens_details", "output_tokens_details"];
14
+ var CACHED_KEYS = [
15
+ "cache",
16
+ "cached_tokens",
17
+ "cached_input_tokens",
18
+ "cache_read_tokens",
19
+ "cache_read_input_tokens",
20
+ "cachedTokens",
21
+ "cachedInputTokens",
22
+ "cacheReadTokens",
23
+ "cacheReadInputTokens",
24
+ "input_cache_read"
25
+ ];
26
+ var CACHE_WRITE_KEYS = [
27
+ "cache_creation_tokens",
28
+ "cache_creation_input_tokens",
29
+ "cacheCreationTokens",
30
+ "cacheCreationInputTokens",
31
+ "input_cache_creation"
32
+ ];
33
+ function nestedRecord(source, key) {
34
+ const value = source[key];
35
+ return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
36
+ }
37
+ function nestedNumber(source, recordKeys, valueKeys) {
38
+ for (const recordKey of recordKeys) {
39
+ const value = firstTokenCount(nestedRecord(source, recordKey), valueKeys);
40
+ if (value !== void 0) return value;
41
+ }
42
+ return void 0;
43
+ }
44
+ function extractUsage(body) {
45
+ if (!body || typeof body !== "object") return null;
46
+ const obj = body;
47
+ const usage = tokenUsageSource(obj);
48
+ const input = firstTokenCount(usage, TOKEN_USAGE_INPUT_KEYS);
49
+ const inputOther = firstTokenCount(usage, INPUT_OTHER_KEYS);
50
+ const output = firstTokenCount(usage, TOKEN_USAGE_OUTPUT_KEYS);
51
+ const exclusiveReasoning = firstTokenCount(usage, EXCLUSIVE_REASONING_KEYS);
52
+ const inclusiveReasoning = firstTokenCount(usage, INCLUSIVE_REASONING_KEYS) ?? nestedNumber(usage, OUTPUT_DETAIL_KEYS, ["reasoning_tokens", "reasoningTokens"]);
53
+ const reasoning = exclusiveReasoning ?? inclusiveReasoning;
54
+ const nestedCache = nestedRecord(usage, "cache");
55
+ const cached = firstTokenCount(usage, CACHED_KEYS) ?? firstTokenCount(nestedCache, ["read"]) ?? nestedNumber(usage, INPUT_DETAIL_KEYS, ["cached_tokens", "cachedTokens"]);
56
+ const cacheWrite = firstTokenCount(usage, CACHE_WRITE_KEYS) ?? firstTokenCount(nestedCache, ["write"]);
57
+ if (input === void 0 && inputOther === void 0 && output === void 0 && reasoning === void 0 && cached === void 0 && cacheWrite === void 0)
58
+ return null;
59
+ const result = {
60
+ input: (input ?? 0) + (inputOther ?? 0),
61
+ output: (output ?? (inclusiveReasoning !== void 0 ? inclusiveReasoning : 0)) + (exclusiveReasoning ?? 0)
62
+ };
63
+ if (reasoning !== void 0) result.reasoning = reasoning;
64
+ if (cached !== void 0) result.cached = cached;
65
+ if (cacheWrite !== void 0) result.cacheWrite = cacheWrite;
66
+ return result;
67
+ }
68
+ function extractUsageFromSse(text, options = {}) {
69
+ const mode = options.mode ?? "cumulative";
70
+ let input = 0;
71
+ let output = 0;
72
+ let reasoning = 0;
73
+ let sawReasoning = false;
74
+ let cached = 0;
75
+ let sawCached = false;
76
+ let cacheWrite = 0;
77
+ let sawCacheWrite = false;
78
+ let found = false;
79
+ const parser = new SSEChunkParser({ transform: parseSseJson });
80
+ const events = [...parser.push(text), ...parser.flush()];
81
+ const merge = mode === "delta" ? (current, next) => current + next : Math.max;
82
+ for (const event of events) {
83
+ const usage = extractUsage(event.data);
84
+ if (!usage) continue;
85
+ input = merge(input, usage.input);
86
+ output = merge(output, usage.output);
87
+ if (usage.reasoning !== void 0) {
88
+ reasoning = merge(reasoning, usage.reasoning);
89
+ sawReasoning = true;
90
+ }
91
+ if (usage.cached !== void 0) {
92
+ cached = merge(cached, usage.cached);
93
+ sawCached = true;
94
+ }
95
+ if (usage.cacheWrite !== void 0) {
96
+ cacheWrite = merge(cacheWrite, usage.cacheWrite);
97
+ sawCacheWrite = true;
98
+ }
99
+ found = true;
100
+ }
101
+ if (!found) return null;
102
+ return {
103
+ input,
104
+ output,
105
+ ...sawReasoning ? { reasoning } : {},
106
+ ...sawCached ? { cached } : {},
107
+ ...sawCacheWrite ? { cacheWrite } : {}
108
+ };
109
+ }
110
+ function parseSseJson(raw) {
111
+ const payload = raw.trim();
112
+ if (!payload || payload === "[DONE]") return null;
113
+ try {
114
+ return JSON.parse(payload);
115
+ } catch {
116
+ return null;
117
+ }
118
+ }
119
+ async function extractUsageFromResponse(response, sseOptions) {
120
+ let text;
121
+ try {
122
+ text = await response.clone().text();
123
+ } catch {
124
+ return null;
125
+ }
126
+ let json;
127
+ try {
128
+ json = JSON.parse(text);
129
+ } catch {
130
+ json = void 0;
131
+ }
132
+ return extractUsage(json) ?? extractUsageFromSse(text, sseOptions);
133
+ }
134
+
135
+ export {
136
+ extractUsage,
137
+ extractUsageFromSse,
138
+ extractUsageFromResponse
139
+ };
140
+ //# sourceMappingURL=chunk-PXE2VKMX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/trace/extract-usage.ts"],"sourcesContent":["/**\n * Provider response and SSE usage extraction.\n *\n * Missing usage returns `null`; reported zeroes and cache-only activity remain\n * distinguishable from absent telemetry.\n */\n\nimport { SSEChunkParser } from '@tangle-network/agent-core/sse'\nimport {\n firstTokenCount,\n TOKEN_USAGE_INPUT_KEYS,\n TOKEN_USAGE_OUTPUT_KEYS,\n tokenUsageSource,\n} from '@tangle-network/agent-core/telemetry'\nimport type { RunTokenUsage } from '../run-record'\n\nexport type ExtractedUsage = RunTokenUsage\nexport type SseUsageMode = 'cumulative' | 'delta'\n\nexport interface ExtractUsageFromSseOptions {\n /** Provider usage events are cumulative snapshots unless explicitly marked as deltas. */\n mode?: SseUsageMode\n}\n\nconst INPUT_OTHER_KEYS = ['input_other'] as const\nconst EXCLUSIVE_REASONING_KEYS = ['reasoning', 'reasoning_tokens', 'reasoningTokens'] as const\nconst INCLUSIVE_REASONING_KEYS = ['reasoning_output_tokens', 'reasoningOutputTokens'] as const\nconst INPUT_DETAIL_KEYS = ['prompt_tokens_details', 'input_tokens_details'] as const\nconst OUTPUT_DETAIL_KEYS = ['completion_tokens_details', 'output_tokens_details'] as const\nconst CACHED_KEYS = [\n 'cache',\n 'cached_tokens',\n 'cached_input_tokens',\n 'cache_read_tokens',\n 'cache_read_input_tokens',\n 'cachedTokens',\n 'cachedInputTokens',\n 'cacheReadTokens',\n 'cacheReadInputTokens',\n 'input_cache_read',\n] as const\nconst CACHE_WRITE_KEYS = [\n 'cache_creation_tokens',\n 'cache_creation_input_tokens',\n 'cacheCreationTokens',\n 'cacheCreationInputTokens',\n 'input_cache_creation',\n] as const\n\nfunction nestedRecord(\n source: Record<string, unknown>,\n key: string,\n): Record<string, unknown> | undefined {\n const value = source[key]\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined\n}\n\nfunction nestedNumber(\n source: Record<string, unknown>,\n recordKeys: readonly string[],\n valueKeys: readonly string[],\n): number | undefined {\n for (const recordKey of recordKeys) {\n const value = firstTokenCount(nestedRecord(source, recordKey), valueKeys)\n if (value !== undefined) return value\n }\n return undefined\n}\n\n/**\n * Pull `{ input, output, cached?, cacheWrite? }` from a parsed response\n * body. Accepts a top-level `usage` object (the common case) or a body that IS\n * the usage object. Returns null only when none of those categories is present.\n */\nexport function extractUsage(body: unknown): ExtractedUsage | null {\n if (!body || typeof body !== 'object') return null\n const obj = body as Record<string, unknown>\n const usage = tokenUsageSource(obj)\n const input = firstTokenCount(usage, TOKEN_USAGE_INPUT_KEYS)\n const inputOther = firstTokenCount(usage, INPUT_OTHER_KEYS)\n const output = firstTokenCount(usage, TOKEN_USAGE_OUTPUT_KEYS)\n const exclusiveReasoning = firstTokenCount(usage, EXCLUSIVE_REASONING_KEYS)\n const inclusiveReasoning =\n firstTokenCount(usage, INCLUSIVE_REASONING_KEYS) ??\n nestedNumber(usage, OUTPUT_DETAIL_KEYS, ['reasoning_tokens', 'reasoningTokens'])\n const reasoning = exclusiveReasoning ?? inclusiveReasoning\n const nestedCache = nestedRecord(usage, 'cache')\n const cached =\n firstTokenCount(usage, CACHED_KEYS) ??\n firstTokenCount(nestedCache, ['read']) ??\n nestedNumber(usage, INPUT_DETAIL_KEYS, ['cached_tokens', 'cachedTokens'])\n const cacheWrite =\n firstTokenCount(usage, CACHE_WRITE_KEYS) ?? firstTokenCount(nestedCache, ['write'])\n if (\n input === undefined &&\n inputOther === undefined &&\n output === undefined &&\n reasoning === undefined &&\n cached === undefined &&\n cacheWrite === undefined\n )\n return null\n const result: ExtractedUsage = {\n input: (input ?? 0) + (inputOther ?? 0),\n output:\n (output ?? (inclusiveReasoning !== undefined ? inclusiveReasoning : 0)) +\n (exclusiveReasoning ?? 0),\n }\n if (reasoning !== undefined) result.reasoning = reasoning\n if (cached !== undefined) result.cached = cached\n if (cacheWrite !== undefined) result.cacheWrite = cacheWrite\n return result\n}\n\n/**\n * Extract token usage from a complete SSE response body using the shared SSE\n * frame parser. Cumulative snapshots are the fail-safe default because summing\n * them inflates billing; callers with explicit delta events opt into `mode: 'delta'`.\n */\nexport function extractUsageFromSse(\n text: string,\n options: ExtractUsageFromSseOptions = {},\n): ExtractedUsage | null {\n const mode = options.mode ?? 'cumulative'\n let input = 0\n let output = 0\n let reasoning = 0\n let sawReasoning = false\n let cached = 0\n let sawCached = false\n let cacheWrite = 0\n let sawCacheWrite = false\n let found = false\n const parser = new SSEChunkParser<unknown>({ transform: parseSseJson })\n const events = [...parser.push(text), ...parser.flush()]\n const merge = mode === 'delta' ? (current: number, next: number) => current + next : Math.max\n\n for (const event of events) {\n const usage = extractUsage(event.data)\n if (!usage) continue\n input = merge(input, usage.input)\n output = merge(output, usage.output)\n if (usage.reasoning !== undefined) {\n reasoning = merge(reasoning, usage.reasoning)\n sawReasoning = true\n }\n if (usage.cached !== undefined) {\n cached = merge(cached, usage.cached)\n sawCached = true\n }\n if (usage.cacheWrite !== undefined) {\n cacheWrite = merge(cacheWrite, usage.cacheWrite)\n sawCacheWrite = true\n }\n found = true\n }\n if (!found) return null\n return {\n input,\n output,\n ...(sawReasoning ? { reasoning } : {}),\n ...(sawCached ? { cached } : {}),\n ...(sawCacheWrite ? { cacheWrite } : {}),\n }\n}\n\nfunction parseSseJson(raw: string): unknown | null {\n const payload = raw.trim()\n if (!payload || payload === '[DONE]') return null\n try {\n return JSON.parse(payload)\n } catch {\n return null\n }\n}\n\n/**\n * Extract usage from an HTTP `Response` without consuming the caller's body:\n * clones, reads the text, and tries the JSON parser first, then the SSE\n * accumulator. Best-effort — returns null on any read/parse miss so a usage tee\n * never takes down the underlying call.\n */\nexport async function extractUsageFromResponse(\n response: Response,\n sseOptions?: ExtractUsageFromSseOptions,\n): Promise<ExtractedUsage | null> {\n let text: string\n try {\n text = await response.clone().text()\n } catch {\n return null\n }\n let json: unknown\n try {\n json = JSON.parse(text)\n } catch {\n json = undefined\n }\n return extractUsage(json) ?? extractUsageFromSse(text, sseOptions)\n}\n"],"mappings":"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","names":[]}
@@ -15,7 +15,7 @@ import {
15
15
  runImprovementLoop,
16
16
  surfaceContentHash,
17
17
  surfaceHash
18
- } from "./chunk-HQPHZGL6.js";
18
+ } from "./chunk-YLMUS4MM.js";
19
19
  import {
20
20
  SearchLedgerConflictError,
21
21
  SearchLedgerError,
@@ -48,7 +48,14 @@ import {
48
48
  makePolicyEditCandidateRecord,
49
49
  policyEditsFromFindings,
50
50
  validatePolicyEditCandidateRecord
51
- } from "./chunk-MGEHEHSN.js";
51
+ } from "./chunk-OIIMMLRB.js";
52
+ import {
53
+ callLlm,
54
+ callLlmJson,
55
+ costReceiptFromLlm,
56
+ costReceiptFromLlmError,
57
+ maximumChargeForLlmRequest
58
+ } from "./chunk-NJC7U437.js";
52
59
  import {
53
60
  eProcess,
54
61
  mcnemar,
@@ -57,33 +64,26 @@ import {
57
64
  pairedRiskDifference,
58
65
  wilcoxonSignedRank
59
66
  } from "./chunk-PJQFMIOX.js";
67
+ import {
68
+ CostAccountingIncompleteError,
69
+ CostLedger
70
+ } from "./chunk-VCTY3W6J.js";
60
71
  import {
61
72
  analyzeTraces
62
- } from "./chunk-4JLWXDYA.js";
73
+ } from "./chunk-3EHHMC6E.js";
63
74
  import {
64
75
  OtlpFileTraceStore
65
- } from "./chunk-S2F4J57L.js";
76
+ } from "./chunk-QKEGNI5B.js";
66
77
  import {
67
78
  modelHasSnapshot,
68
79
  validateRunRecord
69
- } from "./chunk-5UF54T55.js";
80
+ } from "./chunk-S3UZOQ5Y.js";
70
81
  import {
71
82
  buildAgentProfileCell
72
83
  } from "./chunk-XJYR7XFV.js";
73
84
  import {
74
85
  canonicalize
75
86
  } from "./chunk-VSMTAMNK.js";
76
- import {
77
- callLlm,
78
- callLlmJson,
79
- costReceiptFromLlm,
80
- costReceiptFromLlmError,
81
- maximumChargeForLlmRequest
82
- } from "./chunk-NJC7U437.js";
83
- import {
84
- CostAccountingIncompleteError,
85
- CostLedger
86
- } from "./chunk-VCTY3W6J.js";
87
87
  import {
88
88
  AgentEvalError,
89
89
  ValidationError
@@ -8098,4 +8098,4 @@ export {
8098
8098
  verifyCodeSurface,
8099
8099
  resolveWorktreePath
8100
8100
  };
8101
- //# sourceMappingURL=chunk-JSJZ4PJ6.js.map
8101
+ //# sourceMappingURL=chunk-Q442S5AS.js.map
@@ -6,7 +6,7 @@ import {
6
6
  groupBy,
7
7
  hasCapturedToolArgs,
8
8
  toolSpans
9
- } from "./chunk-LQUTGLOZ.js";
9
+ } from "./chunk-ZET2UAYW.js";
10
10
 
11
11
  // src/failure-taxonomy.ts
12
12
  var DEFAULT_RULES = [
@@ -619,4 +619,4 @@ export {
619
619
  iqr,
620
620
  welchsTTest
621
621
  };
622
- //# sourceMappingURL=chunk-ODVOOEWQ.js.map
622
+ //# sourceMappingURL=chunk-QBRSJK47.js.map
@@ -1,19 +1,28 @@
1
1
  import {
2
2
  NotFoundError
3
3
  } from "./chunk-ONWEPEDO.js";
4
+ import {
5
+ INPUT_VALUE,
6
+ LLM_CACHED_TOKENS,
7
+ LLM_CACHE_WRITE_TOKENS,
8
+ LLM_COST_USD,
9
+ LLM_INPUT_TOKENS,
10
+ LLM_MODEL_NAME,
11
+ LLM_OUTPUT_TOKENS,
12
+ LLM_REASONING_TOKENS,
13
+ OPENINFERENCE_SPAN_KIND,
14
+ OUTPUT_VALUE,
15
+ TOOL_ARGS_CAPTURED,
16
+ TOOL_LATENCY_MS,
17
+ TOOL_NAME
18
+ } from "./chunk-WDHBCA3M.js";
4
19
 
5
20
  // src/trace/otlp-attributes.ts
6
- var OPENINFERENCE_SPAN_KIND = "openinference.span.kind";
7
- var LLM_MODEL_NAME = "llm.model_name";
8
- var LLM_INPUT_TOKENS = "llm.token_count.prompt";
9
- var LLM_OUTPUT_TOKENS = "llm.token_count.completion";
10
- var LLM_CACHED_TOKENS = "llm.token_count.prompt_cache_hit";
11
- var LLM_COST_USD = "llm.cost_usd";
12
- var TOOL_NAME = "tool.name";
13
- var TOOL_ARGS_CAPTURED = "tool.args_captured";
14
- var TOOL_LATENCY_MS = "tool.latency_ms";
15
- var INPUT_VALUE = "input.value";
16
- var OUTPUT_VALUE = "output.value";
21
+ import {
22
+ GEN_AI_INPUT_TOKEN_KEYS,
23
+ GEN_AI_MODEL_KEYS,
24
+ GEN_AI_OUTPUT_TOKEN_KEYS
25
+ } from "@tangle-network/agent-core/telemetry";
17
26
  var TOOL_SPAN_ATTRIBUTE_KEYS = [
18
27
  TOOL_NAME,
19
28
  TOOL_ARGS_CAPTURED,
@@ -26,35 +35,73 @@ var LLM_MODEL_ATTR_KEYS = [
26
35
  LLM_MODEL_NAME,
27
36
  "inference.llm.model_name",
28
37
  "llm.model",
29
- "gen_ai.request.model",
30
- "gen_ai.response.model"
38
+ ...GEN_AI_MODEL_KEYS,
39
+ "tangle.model"
31
40
  ];
32
41
  var LLM_INPUT_TOKEN_ATTR_KEYS = [
33
42
  LLM_INPUT_TOKENS,
34
43
  "inference.llm.input_tokens",
35
44
  "llm.input_tokens",
36
- "gen_ai.usage.input_tokens",
37
- "gen_ai.usage.prompt_tokens"
45
+ ...GEN_AI_INPUT_TOKEN_KEYS,
46
+ "tangle.tokens.in",
47
+ "tokens.in"
38
48
  ];
39
49
  var LLM_OUTPUT_TOKEN_ATTR_KEYS = [
40
50
  LLM_OUTPUT_TOKENS,
41
51
  "inference.llm.output_tokens",
42
52
  "llm.output_tokens",
43
- "gen_ai.usage.output_tokens",
44
- "gen_ai.usage.completion_tokens"
53
+ ...GEN_AI_OUTPUT_TOKEN_KEYS,
54
+ "tangle.tokens.out",
55
+ "tokens.out"
56
+ ];
57
+ var LLM_REASONING_TOKEN_ATTR_KEYS = [
58
+ LLM_REASONING_TOKENS,
59
+ "inference.llm.reasoning_tokens",
60
+ "llm.reasoning_tokens",
61
+ "gen_ai.usage.reasoning_tokens",
62
+ "gen_ai.usage.reasoning_output_tokens",
63
+ "reasoning_tokens",
64
+ "reasoning_output_tokens",
65
+ "tangle.tokens.reasoning",
66
+ "gen_ai.usage.output_tokens_details.reasoning_tokens",
67
+ "gen_ai.usage.completion_tokens_details.reasoning_tokens"
45
68
  ];
46
69
  var LLM_CACHED_TOKEN_ATTR_KEYS = [
47
70
  LLM_CACHED_TOKENS,
48
71
  "inference.llm.cached_tokens",
49
72
  "llm.cached_tokens",
50
- "gen_ai.usage.cached_tokens"
73
+ "gen_ai.usage.cached_tokens",
74
+ "gen_ai.usage.prompt_tokens_details.cached_tokens",
75
+ "gen_ai.usage.input_tokens_details.cached_tokens",
76
+ "gen_ai.usage.cache_read_tokens",
77
+ "gen_ai.usage.cache_read_input_tokens",
78
+ "cache_read_tokens",
79
+ "cache_read_input_tokens",
80
+ "input_cache_read",
81
+ "tangle.tokens.cached"
82
+ ];
83
+ var LLM_CACHE_WRITE_TOKEN_ATTR_KEYS = [
84
+ LLM_CACHE_WRITE_TOKENS,
85
+ "inference.llm.cache_write_tokens",
86
+ "llm.cache_write_tokens",
87
+ "gen_ai.usage.cache_creation_tokens",
88
+ "gen_ai.usage.cache_creation_input_tokens",
89
+ "cache_creation_tokens",
90
+ "cache_creation_input_tokens",
91
+ "input_cache_creation",
92
+ "tangle.tokens.cache_write"
51
93
  ];
52
94
  var LLM_COST_ATTR_KEYS = [
53
95
  LLM_COST_USD,
54
96
  "inference.llm.cost.total",
55
97
  "llm.cost.total",
56
- "gen_ai.usage.cost"
98
+ "gen_ai.usage.cost",
99
+ "gen_ai.usage.cost_usd",
100
+ "tangle.cost.usd",
101
+ "cost.usd",
102
+ "cost"
57
103
  ];
104
+ var RUN_COST_ATTR_KEYS = ["tangle.cost.usd", "cost.usd"];
58
105
  var TOOL_NAME_ATTR_KEYS = [TOOL_NAME, "inference.tool.name"];
59
106
  function toolSpanOtlpAttributes(span) {
60
107
  const argsCaptured = span.argsCaptured !== false;
@@ -104,7 +151,8 @@ function projectOtlpFlatLine(raw) {
104
151
  const trace_id = stringField(raw, "trace_id") ?? stringField(raw, "traceId");
105
152
  const span_id = stringField(raw, "span_id") ?? stringField(raw, "spanId");
106
153
  if (!trace_id || !span_id) return null;
107
- const parent_id = stringField(raw, "parent_span_id") ?? stringField(raw, "parentSpanId") ?? null;
154
+ const rawParentId = stringField(raw, "parent_span_id") ?? stringField(raw, "parentSpanId") ?? null;
155
+ const parent_id = normalizeParentSpanId(trace_id, span_id, rawParentId);
108
156
  const name = stringField(raw, "name") ?? "unknown";
109
157
  const start_time = stringField(raw, "start_time") ?? stringField(raw, "startTime") ?? "";
110
158
  const end_time = stringField(raw, "end_time") ?? stringField(raw, "endTime") ?? start_time;
@@ -139,6 +187,11 @@ function projectOtlpFlatLine(raw) {
139
187
  attributes
140
188
  };
141
189
  }
190
+ function normalizeParentSpanId(traceId, spanId, parentId) {
191
+ if (!parentId) return null;
192
+ const prefix = `${traceId}:`;
193
+ return spanId.startsWith(prefix) && !parentId.startsWith(prefix) ? `${prefix}${parentId}` : parentId;
194
+ }
142
195
  function readOtlpStatus(raw) {
143
196
  const status = raw.status;
144
197
  if (status && typeof status === "object" && !Array.isArray(status)) {
@@ -1031,23 +1084,15 @@ function assertStringArray(v, label) {
1031
1084
  }
1032
1085
 
1033
1086
  export {
1034
- OPENINFERENCE_SPAN_KIND,
1035
- LLM_MODEL_NAME,
1036
- LLM_INPUT_TOKENS,
1037
- LLM_OUTPUT_TOKENS,
1038
- LLM_CACHED_TOKENS,
1039
- LLM_COST_USD,
1040
- TOOL_NAME,
1041
- TOOL_ARGS_CAPTURED,
1042
- TOOL_LATENCY_MS,
1043
- INPUT_VALUE,
1044
- OUTPUT_VALUE,
1045
1087
  SPAN_KIND_ATTR_KEYS,
1046
1088
  LLM_MODEL_ATTR_KEYS,
1047
1089
  LLM_INPUT_TOKEN_ATTR_KEYS,
1048
1090
  LLM_OUTPUT_TOKEN_ATTR_KEYS,
1091
+ LLM_REASONING_TOKEN_ATTR_KEYS,
1049
1092
  LLM_CACHED_TOKEN_ATTR_KEYS,
1093
+ LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,
1050
1094
  LLM_COST_ATTR_KEYS,
1095
+ RUN_COST_ATTR_KEYS,
1051
1096
  TOOL_NAME_ATTR_KEYS,
1052
1097
  applyToolSpanOtlpAttributes,
1053
1098
  traceSpanKindToOpenInferenceKind,
@@ -1071,4 +1116,4 @@ export {
1071
1116
  buildTraceAnalystTools,
1072
1117
  traceAnalystFunctionGroup
1073
1118
  };
1074
- //# sourceMappingURL=chunk-S2F4J57L.js.map
1119
+ //# sourceMappingURL=chunk-QKEGNI5B.js.map