@tangle-network/agent-eval 0.120.1 → 0.120.2

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 (171) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/package.json +1 -1
  3. package/dist/analyst/index.d.ts +0 -3111
  4. package/dist/analyst/index.js +0 -403
  5. package/dist/analyst/index.js.map +0 -1
  6. package/dist/authenticity/index.d.ts +0 -161
  7. package/dist/authenticity/index.js +0 -215
  8. package/dist/authenticity/index.js.map +0 -1
  9. package/dist/belief-state/index.d.ts +0 -1301
  10. package/dist/belief-state/index.js +0 -2152
  11. package/dist/belief-state/index.js.map +0 -1
  12. package/dist/benchmarks/index.d.ts +0 -974
  13. package/dist/benchmarks/index.js +0 -60
  14. package/dist/benchmarks/index.js.map +0 -1
  15. package/dist/builder-eval/index.d.ts +0 -695
  16. package/dist/builder-eval/index.js +0 -366
  17. package/dist/builder-eval/index.js.map +0 -1
  18. package/dist/campaign/index.d.ts +0 -7454
  19. package/dist/campaign/index.js +0 -272
  20. package/dist/campaign/index.js.map +0 -1
  21. package/dist/chunk-32BZXMSO.js +0 -3878
  22. package/dist/chunk-32BZXMSO.js.map +0 -1
  23. package/dist/chunk-3A246TSA.js +0 -998
  24. package/dist/chunk-3A246TSA.js.map +0 -1
  25. package/dist/chunk-3RF76KTD.js +0 -84
  26. package/dist/chunk-3RF76KTD.js.map +0 -1
  27. package/dist/chunk-3YYRZDON.js +0 -45
  28. package/dist/chunk-3YYRZDON.js.map +0 -1
  29. package/dist/chunk-4I2E3LLO.js +0 -1030
  30. package/dist/chunk-4I2E3LLO.js.map +0 -1
  31. package/dist/chunk-ARU2PZFM.js +0 -312
  32. package/dist/chunk-ARU2PZFM.js.map +0 -1
  33. package/dist/chunk-BOD4O7OF.js +0 -40
  34. package/dist/chunk-BOD4O7OF.js.map +0 -1
  35. package/dist/chunk-DPZAEKA6.js +0 -880
  36. package/dist/chunk-DPZAEKA6.js.map +0 -1
  37. package/dist/chunk-DTJ6QUQB.js +0 -131
  38. package/dist/chunk-DTJ6QUQB.js.map +0 -1
  39. package/dist/chunk-GGE4NNQT.js +0 -65
  40. package/dist/chunk-GGE4NNQT.js.map +0 -1
  41. package/dist/chunk-H5UD2323.js +0 -286
  42. package/dist/chunk-H5UD2323.js.map +0 -1
  43. package/dist/chunk-HHWE3POT.js +0 -94
  44. package/dist/chunk-HHWE3POT.js.map +0 -1
  45. package/dist/chunk-HKUCJ437.js +0 -787
  46. package/dist/chunk-HKUCJ437.js.map +0 -1
  47. package/dist/chunk-JHCHEVET.js +0 -274
  48. package/dist/chunk-JHCHEVET.js.map +0 -1
  49. package/dist/chunk-JHOJHHU7.js +0 -867
  50. package/dist/chunk-JHOJHHU7.js.map +0 -1
  51. package/dist/chunk-JM2SKQMS.js +0 -750
  52. package/dist/chunk-JM2SKQMS.js.map +0 -1
  53. package/dist/chunk-JN2FCO5W.js +0 -7958
  54. package/dist/chunk-JN2FCO5W.js.map +0 -1
  55. package/dist/chunk-K4DBDHLK.js +0 -158
  56. package/dist/chunk-K4DBDHLK.js.map +0 -1
  57. package/dist/chunk-K6N6XJJX.js +0 -306
  58. package/dist/chunk-K6N6XJJX.js.map +0 -1
  59. package/dist/chunk-MA6HLL3S.js +0 -65
  60. package/dist/chunk-MA6HLL3S.js.map +0 -1
  61. package/dist/chunk-MAZ26DC7.js +0 -99
  62. package/dist/chunk-MAZ26DC7.js.map +0 -1
  63. package/dist/chunk-MOXWMGPC.js +0 -577
  64. package/dist/chunk-MOXWMGPC.js.map +0 -1
  65. package/dist/chunk-NJC7U437.js +0 -626
  66. package/dist/chunk-NJC7U437.js.map +0 -1
  67. package/dist/chunk-NPCTHQIO.js +0 -91
  68. package/dist/chunk-NPCTHQIO.js.map +0 -1
  69. package/dist/chunk-ONWEPEDO.js +0 -57
  70. package/dist/chunk-ONWEPEDO.js.map +0 -1
  71. package/dist/chunk-OYZAPX5G.js +0 -1526
  72. package/dist/chunk-OYZAPX5G.js.map +0 -1
  73. package/dist/chunk-PC4UYEBM.js +0 -166
  74. package/dist/chunk-PC4UYEBM.js.map +0 -1
  75. package/dist/chunk-PICTDURQ.js +0 -766
  76. package/dist/chunk-PICTDURQ.js.map +0 -1
  77. package/dist/chunk-PJQFMIOX.js +0 -1182
  78. package/dist/chunk-PJQFMIOX.js.map +0 -1
  79. package/dist/chunk-PXD6ZFNY.js +0 -1107
  80. package/dist/chunk-PXD6ZFNY.js.map +0 -1
  81. package/dist/chunk-PXE2VKMX.js +0 -140
  82. package/dist/chunk-PXE2VKMX.js.map +0 -1
  83. package/dist/chunk-PZ5AY32C.js +0 -10
  84. package/dist/chunk-PZ5AY32C.js.map +0 -1
  85. package/dist/chunk-QBRSJK47.js +0 -622
  86. package/dist/chunk-QBRSJK47.js.map +0 -1
  87. package/dist/chunk-QWMPPZ3X.js +0 -550
  88. package/dist/chunk-QWMPPZ3X.js.map +0 -1
  89. package/dist/chunk-S3UZOQ5Y.js +0 -328
  90. package/dist/chunk-S3UZOQ5Y.js.map +0 -1
  91. package/dist/chunk-S5TT5R3L.js +0 -2668
  92. package/dist/chunk-S5TT5R3L.js.map +0 -1
  93. package/dist/chunk-T4SQEITX.js +0 -95
  94. package/dist/chunk-T4SQEITX.js.map +0 -1
  95. package/dist/chunk-TT4KNT67.js +0 -124
  96. package/dist/chunk-TT4KNT67.js.map +0 -1
  97. package/dist/chunk-U5CHZ5M3.js +0 -357
  98. package/dist/chunk-U5CHZ5M3.js.map +0 -1
  99. package/dist/chunk-ULOKLHIQ.js +0 -1937
  100. package/dist/chunk-ULOKLHIQ.js.map +0 -1
  101. package/dist/chunk-VI2UW6B6.js +0 -162
  102. package/dist/chunk-VI2UW6B6.js.map +0 -1
  103. package/dist/chunk-VQMK5FMP.js +0 -247
  104. package/dist/chunk-VQMK5FMP.js.map +0 -1
  105. package/dist/chunk-VSMTAMNK.js +0 -53
  106. package/dist/chunk-VSMTAMNK.js.map +0 -1
  107. package/dist/chunk-VZSRQ272.js +0 -149
  108. package/dist/chunk-VZSRQ272.js.map +0 -1
  109. package/dist/chunk-WW2A73HW.js +0 -159
  110. package/dist/chunk-WW2A73HW.js.map +0 -1
  111. package/dist/chunk-X4UCIOTZ.js +0 -136
  112. package/dist/chunk-X4UCIOTZ.js.map +0 -1
  113. package/dist/chunk-XDIRG3TO.js +0 -1266
  114. package/dist/chunk-XDIRG3TO.js.map +0 -1
  115. package/dist/chunk-XJYR7XFV.js +0 -317
  116. package/dist/chunk-XJYR7XFV.js.map +0 -1
  117. package/dist/chunk-ZET2UAYW.js +0 -89
  118. package/dist/chunk-ZET2UAYW.js.map +0 -1
  119. package/dist/chunk-ZZUXHH3R.js +0 -99
  120. package/dist/chunk-ZZUXHH3R.js.map +0 -1
  121. package/dist/cli.d.ts +0 -1
  122. package/dist/cli.js +0 -112
  123. package/dist/cli.js.map +0 -1
  124. package/dist/contract/index.d.ts +0 -4972
  125. package/dist/contract/index.js +0 -1654
  126. package/dist/contract/index.js.map +0 -1
  127. package/dist/control.d.ts +0 -1013
  128. package/dist/control.js +0 -34
  129. package/dist/control.js.map +0 -1
  130. package/dist/fuzz.d.ts +0 -759
  131. package/dist/fuzz.js +0 -714
  132. package/dist/fuzz.js.map +0 -1
  133. package/dist/hosted/index.d.ts +0 -730
  134. package/dist/hosted/index.js +0 -14
  135. package/dist/hosted/index.js.map +0 -1
  136. package/dist/index.d.ts +0 -16780
  137. package/dist/index.js +0 -12168
  138. package/dist/index.js.map +0 -1
  139. package/dist/matrix/index.d.ts +0 -155
  140. package/dist/matrix/index.js +0 -8
  141. package/dist/matrix/index.js.map +0 -1
  142. package/dist/meta-eval/index.d.ts +0 -1030
  143. package/dist/meta-eval/index.js +0 -417
  144. package/dist/meta-eval/index.js.map +0 -1
  145. package/dist/multishot/index.d.ts +0 -579
  146. package/dist/multishot/index.js +0 -589
  147. package/dist/multishot/index.js.map +0 -1
  148. package/dist/openapi.json +0 -992
  149. package/dist/pipelines/index.d.ts +0 -567
  150. package/dist/pipelines/index.js +0 -515
  151. package/dist/pipelines/index.js.map +0 -1
  152. package/dist/reporting.d.ts +0 -1277
  153. package/dist/reporting.js +0 -48
  154. package/dist/reporting.js.map +0 -1
  155. package/dist/rl.d.ts +0 -4092
  156. package/dist/rl.js +0 -1724
  157. package/dist/rl.js.map +0 -1
  158. package/dist/run-campaign-HNFPJET4.js +0 -14
  159. package/dist/run-campaign-HNFPJET4.js.map +0 -1
  160. package/dist/storyboard/index.d.ts +0 -279
  161. package/dist/storyboard/index.js +0 -767
  162. package/dist/storyboard/index.js.map +0 -1
  163. package/dist/trace-attributes.d.ts +0 -52
  164. package/dist/trace-attributes.js +0 -62
  165. package/dist/trace-attributes.js.map +0 -1
  166. package/dist/traces.d.ts +0 -2343
  167. package/dist/traces.js +0 -249
  168. package/dist/traces.js.map +0 -1
  169. package/dist/wire/index.d.ts +0 -1252
  170. package/dist/wire/index.js +0 -81
  171. package/dist/wire/index.js.map +0 -1
@@ -1,286 +0,0 @@
1
- import {
2
- LLM_CACHED_TOKEN_ATTR_KEYS,
3
- LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,
4
- LLM_COST_ATTR_KEYS,
5
- LLM_INPUT_TOKEN_ATTR_KEYS,
6
- LLM_OUTPUT_TOKEN_ATTR_KEYS,
7
- LLM_REASONING_TOKEN_ATTR_KEYS,
8
- RUN_COST_ATTR_KEYS
9
- } from "./chunk-K4DBDHLK.js";
10
-
11
- // src/trace/execution-measurements.ts
12
- var TOKEN_MEASUREMENT_KEY_GROUPS = [
13
- LLM_INPUT_TOKEN_ATTR_KEYS,
14
- LLM_OUTPUT_TOKEN_ATTR_KEYS,
15
- LLM_REASONING_TOKEN_ATTR_KEYS,
16
- LLM_CACHED_TOKEN_ATTR_KEYS,
17
- LLM_CACHE_WRITE_TOKEN_ATTR_KEYS
18
- ];
19
- var EXECUTION_MEASUREMENT_KEY_GROUPS = [
20
- ...TOKEN_MEASUREMENT_KEY_GROUPS,
21
- LLM_COST_ATTR_KEYS
22
- ];
23
- function summarizeExecutionMeasurements(spans) {
24
- const byId = /* @__PURE__ */ new Map();
25
- for (const span of spans) {
26
- if (byId.has(span.id)) {
27
- throw new Error(`summarizeExecutionMeasurements: duplicate span id "${span.id}"`);
28
- }
29
- byId.set(span.id, span);
30
- }
31
- const tokenMeasurementKeys = TOKEN_MEASUREMENT_KEY_GROUPS.flat();
32
- const candidates = spans.filter(
33
- (span) => span.modelCall || !span.aggregate && readNumber(span.attributes, tokenMeasurementKeys) !== void 0
34
- );
35
- const candidateIds = new Set(candidates.map((span) => span.id));
36
- const candidateChildren = /* @__PURE__ */ new Map();
37
- for (const candidate of candidates) {
38
- const parentId = nearestCandidateParent(candidate, byId, candidateIds);
39
- if (!parentId) continue;
40
- const children = candidateChildren.get(parentId) ?? [];
41
- children.push(candidate);
42
- candidateChildren.set(parentId, children);
43
- }
44
- const aggregateIds = classifyAggregateSpans(candidates, candidateChildren);
45
- const untypedRunCostIds = new Set(
46
- spans.filter(
47
- (span) => !span.modelCall && !span.aggregate && !candidateIds.has(span.id) && readNumber(span.attributes, RUN_COST_ATTR_KEYS) !== void 0
48
- ).map((span) => span.id)
49
- );
50
- const aggregateSourceIds = new Set(
51
- spans.filter(
52
- (span) => span.aggregate || aggregateIds.has(span.id) || untypedRunCostIds.has(span.id)
53
- ).map((span) => span.id)
54
- );
55
- const calls = candidates.filter((span) => !aggregateIds.has(span.id));
56
- const input = reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_INPUT_TOKEN_ATTR_KEYS);
57
- const reasoning = reconcileMeasurement(
58
- calls,
59
- byId,
60
- aggregateSourceIds,
61
- LLM_REASONING_TOKEN_ATTR_KEYS
62
- );
63
- const output = reconcileMeasurement(
64
- calls,
65
- byId,
66
- aggregateSourceIds,
67
- LLM_OUTPUT_TOKEN_ATTR_KEYS,
68
- LLM_REASONING_TOKEN_ATTR_KEYS
69
- );
70
- const cached = reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_CACHED_TOKEN_ATTR_KEYS);
71
- const cacheWrite = reconcileMeasurement(
72
- calls,
73
- byId,
74
- aggregateSourceIds,
75
- LLM_CACHE_WRITE_TOKEN_ATTR_KEYS
76
- );
77
- const aggregate = summarizeAggregateMeasurements(
78
- spans,
79
- byId,
80
- /* @__PURE__ */ new Set([...aggregateIds, ...untypedRunCostIds])
81
- );
82
- return {
83
- tokenUsage: {
84
- input: input.value ?? 0,
85
- output: Math.max(output.value ?? 0, reasoning.value ?? 0),
86
- ...reasoning.value !== void 0 ? { reasoning: reasoning.value } : {},
87
- ...cached.value !== void 0 ? { cached: cached.value } : {},
88
- ...cacheWrite.value !== void 0 ? { cacheWrite: cacheWrite.value } : {}
89
- },
90
- modelCallCount: calls.length,
91
- callSpanIds: calls.map((span) => span.id),
92
- cost: reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_COST_ATTR_KEYS),
93
- ...aggregate ? { aggregate } : {}
94
- };
95
- }
96
- function recordAggregateMeasurements(raw, aggregate) {
97
- if (!aggregate) return;
98
- raw.aggregate_prompt_tokens = aggregate.tokenUsage.input;
99
- raw.aggregate_completion_tokens = aggregate.tokenUsage.output;
100
- if (aggregate.tokenUsage.reasoning !== void 0)
101
- raw.aggregate_reasoning_tokens = aggregate.tokenUsage.reasoning;
102
- if (aggregate.tokenUsage.cached !== void 0)
103
- raw.aggregate_cached_tokens = aggregate.tokenUsage.cached;
104
- if (aggregate.tokenUsage.cacheWrite !== void 0)
105
- raw.aggregate_cache_write_tokens = aggregate.tokenUsage.cacheWrite;
106
- if (aggregate.costUsd !== void 0) raw.aggregate_cost_usd = aggregate.costUsd;
107
- }
108
- function summarizeAggregateMeasurements(spans, byId, aggregateIds) {
109
- const aggregates = spans.filter((span) => span.aggregate || aggregateIds.has(span.id));
110
- const input = reconcileTopLevelMeasurement(aggregates, byId, LLM_INPUT_TOKEN_ATTR_KEYS);
111
- const output = reconcileTopLevelMeasurement(aggregates, byId, LLM_OUTPUT_TOKEN_ATTR_KEYS);
112
- const reasoning = reconcileTopLevelMeasurement(aggregates, byId, LLM_REASONING_TOKEN_ATTR_KEYS);
113
- const cached = reconcileTopLevelMeasurement(aggregates, byId, LLM_CACHED_TOKEN_ATTR_KEYS);
114
- const cacheWrite = reconcileTopLevelMeasurement(aggregates, byId, LLM_CACHE_WRITE_TOKEN_ATTR_KEYS);
115
- const costUsd = reconcileTopLevelMeasurement(aggregates, byId, LLM_COST_ATTR_KEYS);
116
- if (input === void 0 && output === void 0 && reasoning === void 0 && cached === void 0 && cacheWrite === void 0 && costUsd === void 0)
117
- return void 0;
118
- return {
119
- tokenUsage: {
120
- input: input ?? 0,
121
- output: output ?? reasoning ?? 0,
122
- ...reasoning !== void 0 ? { reasoning } : {},
123
- ...cached !== void 0 ? { cached } : {},
124
- ...cacheWrite !== void 0 ? { cacheWrite } : {}
125
- },
126
- ...costUsd !== void 0 ? { costUsd } : {}
127
- };
128
- }
129
- function reconcileTopLevelMeasurement(spans, byId, keys) {
130
- const selected = /* @__PURE__ */ new Map();
131
- for (const span of spans) {
132
- const value = readNumber(span.attributes, keys);
133
- if (value !== void 0) selected.set(span.id, value);
134
- }
135
- for (const spanId of [...selected.keys()]) {
136
- const span = byId.get(spanId);
137
- if (!span) continue;
138
- if (ancestorIds(span, byId).some((ancestorId) => selected.has(ancestorId))) {
139
- selected.delete(spanId);
140
- }
141
- }
142
- return selected.size > 0 ? [...selected.values()].reduce((total, value) => total + value, 0) : void 0;
143
- }
144
- function reconcileMeasurement(calls, byId, aggregateSourceIds, keys, fallbackKeys) {
145
- const selected = /* @__PURE__ */ new Map();
146
- const callIds = new Set(calls.map((call) => call.id));
147
- let reportingCalls = 0;
148
- for (const call of calls) {
149
- const primary = nearestMeasurement(call, byId, callIds, aggregateSourceIds, keys);
150
- const fallback = fallbackKeys ? nearestMeasurement(call, byId, callIds, aggregateSourceIds, fallbackKeys) : void 0;
151
- const source = primary && fallback && primary.span.id === fallback.span.id ? { span: primary.span, value: Math.max(primary.value, fallback.value) } : primary ?? fallback;
152
- if (!source) continue;
153
- reportingCalls += 1;
154
- selected.set(source.span.id, source.value);
155
- }
156
- for (const spanId of [...selected.keys()]) {
157
- const span = byId.get(spanId);
158
- if (!span) continue;
159
- if (ancestorIds(span, byId).some(
160
- (ancestorId) => selected.has(ancestorId) && !callIds.has(ancestorId)
161
- )) {
162
- selected.delete(spanId);
163
- }
164
- }
165
- return {
166
- ...selected.size > 0 ? { value: [...selected.values()].reduce((total, value) => total + value, 0) } : {},
167
- reportingCalls,
168
- complete: calls.length > 0 && reportingCalls === calls.length
169
- };
170
- }
171
- function nearestMeasurement(call, byId, callIds, aggregateSourceIds, keys) {
172
- let current = call;
173
- const seen = /* @__PURE__ */ new Set();
174
- while (current && !seen.has(current.id)) {
175
- seen.add(current.id);
176
- const value = readNumber(current.attributes, keys);
177
- if (value !== void 0 && (current.id === call.id || !callIds.has(current.id) && aggregateSourceIds.has(current.id))) {
178
- return { span: current, value };
179
- }
180
- current = current.parentId ? byId.get(current.parentId) : void 0;
181
- }
182
- return void 0;
183
- }
184
- function classifyAggregateSpans(candidates, childrenById) {
185
- const aggregateIds = /* @__PURE__ */ new Set();
186
- const summaries = /* @__PURE__ */ new Map();
187
- const visiting = /* @__PURE__ */ new Set();
188
- const visit = (span) => {
189
- const cached = summaries.get(span.id);
190
- if (cached) return cached;
191
- if (visiting.has(span.id)) return emptyRetainedCallSummary();
192
- visiting.add(span.id);
193
- const descendants = emptyRetainedCallSummary();
194
- for (const child of childrenById.get(span.id) ?? []) {
195
- const childDescendants = visit(child);
196
- if (!aggregateIds.has(child.id)) addRetainedCall(descendants, child);
197
- addRetainedCallSummary(descendants, childDescendants);
198
- }
199
- if (descendants.callCount > 0 && (!span.modelCall || hasCompatibleDescendantMeasurements(span, descendants))) {
200
- aggregateIds.add(span.id);
201
- }
202
- visiting.delete(span.id);
203
- summaries.set(span.id, descendants);
204
- return descendants;
205
- };
206
- for (const candidate of candidates) visit(candidate);
207
- return aggregateIds;
208
- }
209
- function emptyRetainedCallSummary() {
210
- return {
211
- callCount: 0,
212
- measurements: EXECUTION_MEASUREMENT_KEY_GROUPS.map(() => ({
213
- total: 0,
214
- reportingCalls: 0
215
- }))
216
- };
217
- }
218
- function addRetainedCall(summary, span) {
219
- summary.callCount += 1;
220
- for (let index = 0; index < EXECUTION_MEASUREMENT_KEY_GROUPS.length; index += 1) {
221
- const value = readNumber(span.attributes, EXECUTION_MEASUREMENT_KEY_GROUPS[index]);
222
- if (value === void 0) continue;
223
- const measurement = summary.measurements[index];
224
- measurement.total += value;
225
- measurement.reportingCalls += 1;
226
- }
227
- }
228
- function addRetainedCallSummary(target, source) {
229
- target.callCount += source.callCount;
230
- for (let index = 0; index < target.measurements.length; index += 1) {
231
- const measurement = target.measurements[index];
232
- const sourceMeasurement = source.measurements[index];
233
- measurement.total += sourceMeasurement.total;
234
- measurement.reportingCalls += sourceMeasurement.reportingCalls;
235
- }
236
- }
237
- function hasCompatibleDescendantMeasurements(span, descendants) {
238
- let parentMeasurements = 0;
239
- let descendantMeasurements = 0;
240
- for (let index = 0; index < EXECUTION_MEASUREMENT_KEY_GROUPS.length; index += 1) {
241
- const keys = EXECUTION_MEASUREMENT_KEY_GROUPS[index];
242
- const parentValue = readNumber(span.attributes, keys);
243
- const measurement = descendants.measurements[index];
244
- if (parentValue !== void 0) parentMeasurements += 1;
245
- if (measurement.reportingCalls > 0) descendantMeasurements += 1;
246
- if (parentValue === void 0 || measurement.reportingCalls === 0) continue;
247
- if (measurement.reportingCalls !== descendants.callCount) continue;
248
- if (Math.abs(parentValue - measurement.total) > 1e-12) return false;
249
- }
250
- return parentMeasurements === 0 || descendantMeasurements > 0;
251
- }
252
- function ancestorIds(span, byId) {
253
- const ids = [];
254
- const seen = /* @__PURE__ */ new Set();
255
- let parentId = span.parentId;
256
- while (parentId && !seen.has(parentId)) {
257
- ids.push(parentId);
258
- seen.add(parentId);
259
- parentId = byId.get(parentId)?.parentId;
260
- }
261
- return ids;
262
- }
263
- function nearestCandidateParent(span, byId, candidateIds) {
264
- const seen = /* @__PURE__ */ new Set();
265
- let parentId = span.parentId;
266
- while (parentId && !seen.has(parentId)) {
267
- if (candidateIds.has(parentId)) return parentId;
268
- seen.add(parentId);
269
- parentId = byId.get(parentId)?.parentId;
270
- }
271
- return void 0;
272
- }
273
- function readNumber(attributes, keys) {
274
- for (const key of keys) {
275
- const value = attributes[key];
276
- const parsed = typeof value === "number" ? value : typeof value === "string" && value.length > 0 ? Number(value) : Number.NaN;
277
- if (Number.isFinite(parsed) && parsed >= 0) return parsed;
278
- }
279
- return void 0;
280
- }
281
-
282
- export {
283
- summarizeExecutionMeasurements,
284
- recordAggregateMeasurements
285
- };
286
- //# sourceMappingURL=chunk-H5UD2323.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/trace/execution-measurements.ts"],"sourcesContent":["import type { RunTokenUsage } from '../run-record'\nimport {\n LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,\n LLM_CACHED_TOKEN_ATTR_KEYS,\n LLM_COST_ATTR_KEYS,\n LLM_INPUT_TOKEN_ATTR_KEYS,\n LLM_OUTPUT_TOKEN_ATTR_KEYS,\n LLM_REASONING_TOKEN_ATTR_KEYS,\n RUN_COST_ATTR_KEYS,\n} from './otlp-attributes'\n\nexport interface ExecutionMeasurementSpan {\n id: string\n parentId?: string\n attributes: Record<string, unknown>\n modelCall: boolean\n aggregate: boolean\n}\n\nexport interface MeasurementCoverage {\n value?: number\n reportingCalls: number\n complete: boolean\n}\n\nexport interface ExecutionMeasurements {\n tokenUsage: RunTokenUsage\n modelCallCount: number\n callSpanIds: string[]\n cost: MeasurementCoverage\n aggregate?: {\n tokenUsage: RunTokenUsage\n costUsd?: number\n }\n}\n\nconst TOKEN_MEASUREMENT_KEY_GROUPS = [\n LLM_INPUT_TOKEN_ATTR_KEYS,\n LLM_OUTPUT_TOKEN_ATTR_KEYS,\n LLM_REASONING_TOKEN_ATTR_KEYS,\n LLM_CACHED_TOKEN_ATTR_KEYS,\n LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,\n] as const\n\nconst EXECUTION_MEASUREMENT_KEY_GROUPS = [\n ...TOKEN_MEASUREMENT_KEY_GROUPS,\n LLM_COST_ATTR_KEYS,\n] as const\n\ninterface RetainedCallSummary {\n callCount: number\n measurements: Array<{\n total: number\n reportingCalls: number\n }>\n}\n\n/**\n * Reconcile execution measurements across nested telemetry wrappers.\n * A measured parent is used only when a descendant call does not report the\n * same field, so aggregate wrappers neither duplicate complete child data nor\n * erase complementary parent fields.\n */\nexport function summarizeExecutionMeasurements(\n spans: ExecutionMeasurementSpan[],\n): ExecutionMeasurements {\n const byId = new Map<string, ExecutionMeasurementSpan>()\n for (const span of spans) {\n if (byId.has(span.id)) {\n throw new Error(`summarizeExecutionMeasurements: duplicate span id \"${span.id}\"`)\n }\n byId.set(span.id, span)\n }\n const tokenMeasurementKeys = TOKEN_MEASUREMENT_KEY_GROUPS.flat()\n const candidates = spans.filter(\n (span) =>\n span.modelCall ||\n (!span.aggregate && readNumber(span.attributes, tokenMeasurementKeys) !== undefined),\n )\n const candidateIds = new Set(candidates.map((span) => span.id))\n const candidateChildren = new Map<string, ExecutionMeasurementSpan[]>()\n for (const candidate of candidates) {\n const parentId = nearestCandidateParent(candidate, byId, candidateIds)\n if (!parentId) continue\n const children = candidateChildren.get(parentId) ?? []\n children.push(candidate)\n candidateChildren.set(parentId, children)\n }\n const aggregateIds = classifyAggregateSpans(candidates, candidateChildren)\n const untypedRunCostIds = new Set(\n spans\n .filter(\n (span) =>\n !span.modelCall &&\n !span.aggregate &&\n !candidateIds.has(span.id) &&\n readNumber(span.attributes, RUN_COST_ATTR_KEYS) !== undefined,\n )\n .map((span) => span.id),\n )\n const aggregateSourceIds = new Set(\n spans\n .filter(\n (span) => span.aggregate || aggregateIds.has(span.id) || untypedRunCostIds.has(span.id),\n )\n .map((span) => span.id),\n )\n\n const calls = candidates.filter((span) => !aggregateIds.has(span.id))\n const input = reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_INPUT_TOKEN_ATTR_KEYS)\n const reasoning = reconcileMeasurement(\n calls,\n byId,\n aggregateSourceIds,\n LLM_REASONING_TOKEN_ATTR_KEYS,\n )\n const output = reconcileMeasurement(\n calls,\n byId,\n aggregateSourceIds,\n LLM_OUTPUT_TOKEN_ATTR_KEYS,\n LLM_REASONING_TOKEN_ATTR_KEYS,\n )\n const cached = reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_CACHED_TOKEN_ATTR_KEYS)\n const cacheWrite = reconcileMeasurement(\n calls,\n byId,\n aggregateSourceIds,\n LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,\n )\n const aggregate = summarizeAggregateMeasurements(\n spans,\n byId,\n new Set([...aggregateIds, ...untypedRunCostIds]),\n )\n\n return {\n tokenUsage: {\n input: input.value ?? 0,\n output: Math.max(output.value ?? 0, reasoning.value ?? 0),\n ...(reasoning.value !== undefined ? { reasoning: reasoning.value } : {}),\n ...(cached.value !== undefined ? { cached: cached.value } : {}),\n ...(cacheWrite.value !== undefined ? { cacheWrite: cacheWrite.value } : {}),\n },\n modelCallCount: calls.length,\n callSpanIds: calls.map((span) => span.id),\n cost: reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_COST_ATTR_KEYS),\n ...(aggregate ? { aggregate } : {}),\n }\n}\n\nexport function recordAggregateMeasurements(\n raw: Record<string, number>,\n aggregate: ExecutionMeasurements['aggregate'],\n): void {\n if (!aggregate) return\n raw.aggregate_prompt_tokens = aggregate.tokenUsage.input\n raw.aggregate_completion_tokens = aggregate.tokenUsage.output\n if (aggregate.tokenUsage.reasoning !== undefined)\n raw.aggregate_reasoning_tokens = aggregate.tokenUsage.reasoning\n if (aggregate.tokenUsage.cached !== undefined)\n raw.aggregate_cached_tokens = aggregate.tokenUsage.cached\n if (aggregate.tokenUsage.cacheWrite !== undefined)\n raw.aggregate_cache_write_tokens = aggregate.tokenUsage.cacheWrite\n if (aggregate.costUsd !== undefined) raw.aggregate_cost_usd = aggregate.costUsd\n}\n\nfunction summarizeAggregateMeasurements(\n spans: ExecutionMeasurementSpan[],\n byId: Map<string, ExecutionMeasurementSpan>,\n aggregateIds: Set<string>,\n): ExecutionMeasurements['aggregate'] {\n const aggregates = spans.filter((span) => span.aggregate || aggregateIds.has(span.id))\n const input = reconcileTopLevelMeasurement(aggregates, byId, LLM_INPUT_TOKEN_ATTR_KEYS)\n const output = reconcileTopLevelMeasurement(aggregates, byId, LLM_OUTPUT_TOKEN_ATTR_KEYS)\n const reasoning = reconcileTopLevelMeasurement(aggregates, byId, LLM_REASONING_TOKEN_ATTR_KEYS)\n const cached = reconcileTopLevelMeasurement(aggregates, byId, LLM_CACHED_TOKEN_ATTR_KEYS)\n const cacheWrite = reconcileTopLevelMeasurement(aggregates, byId, LLM_CACHE_WRITE_TOKEN_ATTR_KEYS)\n const costUsd = reconcileTopLevelMeasurement(aggregates, byId, LLM_COST_ATTR_KEYS)\n if (\n input === undefined &&\n output === undefined &&\n reasoning === undefined &&\n cached === undefined &&\n cacheWrite === undefined &&\n costUsd === undefined\n )\n return undefined\n return {\n tokenUsage: {\n input: input ?? 0,\n output: output ?? reasoning ?? 0,\n ...(reasoning !== undefined ? { reasoning } : {}),\n ...(cached !== undefined ? { cached } : {}),\n ...(cacheWrite !== undefined ? { cacheWrite } : {}),\n },\n ...(costUsd !== undefined ? { costUsd } : {}),\n }\n}\n\nfunction reconcileTopLevelMeasurement(\n spans: ExecutionMeasurementSpan[],\n byId: Map<string, ExecutionMeasurementSpan>,\n keys: readonly string[],\n): number | undefined {\n const selected = new Map<string, number>()\n for (const span of spans) {\n const value = readNumber(span.attributes, keys)\n if (value !== undefined) selected.set(span.id, value)\n }\n for (const spanId of [...selected.keys()]) {\n const span = byId.get(spanId)\n if (!span) continue\n if (ancestorIds(span, byId).some((ancestorId) => selected.has(ancestorId))) {\n selected.delete(spanId)\n }\n }\n return selected.size > 0\n ? [...selected.values()].reduce((total, value) => total + value, 0)\n : undefined\n}\n\nfunction reconcileMeasurement(\n calls: ExecutionMeasurementSpan[],\n byId: Map<string, ExecutionMeasurementSpan>,\n aggregateSourceIds: Set<string>,\n keys: readonly string[],\n fallbackKeys?: readonly string[],\n): MeasurementCoverage {\n const selected = new Map<string, number>()\n const callIds = new Set(calls.map((call) => call.id))\n let reportingCalls = 0\n\n for (const call of calls) {\n const primary = nearestMeasurement(call, byId, callIds, aggregateSourceIds, keys)\n const fallback = fallbackKeys\n ? nearestMeasurement(call, byId, callIds, aggregateSourceIds, fallbackKeys)\n : undefined\n const source =\n primary && fallback && primary.span.id === fallback.span.id\n ? { span: primary.span, value: Math.max(primary.value, fallback.value) }\n : (primary ?? fallback)\n if (!source) continue\n reportingCalls += 1\n selected.set(source.span.id, source.value)\n }\n\n for (const spanId of [...selected.keys()]) {\n const span = byId.get(spanId)\n if (!span) continue\n if (\n ancestorIds(span, byId).some(\n (ancestorId) => selected.has(ancestorId) && !callIds.has(ancestorId),\n )\n ) {\n selected.delete(spanId)\n }\n }\n\n return {\n ...(selected.size > 0\n ? { value: [...selected.values()].reduce((total, value) => total + value, 0) }\n : {}),\n reportingCalls,\n complete: calls.length > 0 && reportingCalls === calls.length,\n }\n}\n\nfunction nearestMeasurement(\n call: ExecutionMeasurementSpan,\n byId: Map<string, ExecutionMeasurementSpan>,\n callIds: Set<string>,\n aggregateSourceIds: Set<string>,\n keys: readonly string[],\n): { span: ExecutionMeasurementSpan; value: number } | undefined {\n let current: ExecutionMeasurementSpan | undefined = call\n const seen = new Set<string>()\n while (current && !seen.has(current.id)) {\n seen.add(current.id)\n const value = readNumber(current.attributes, keys)\n if (\n value !== undefined &&\n (current.id === call.id || (!callIds.has(current.id) && aggregateSourceIds.has(current.id)))\n ) {\n return { span: current, value }\n }\n current = current.parentId ? byId.get(current.parentId) : undefined\n }\n return undefined\n}\n\nfunction classifyAggregateSpans(\n candidates: ExecutionMeasurementSpan[],\n childrenById: Map<string, ExecutionMeasurementSpan[]>,\n): Set<string> {\n const aggregateIds = new Set<string>()\n const summaries = new Map<string, RetainedCallSummary>()\n const visiting = new Set<string>()\n\n const visit = (span: ExecutionMeasurementSpan): RetainedCallSummary => {\n const cached = summaries.get(span.id)\n if (cached) return cached\n if (visiting.has(span.id)) return emptyRetainedCallSummary()\n visiting.add(span.id)\n\n const descendants = emptyRetainedCallSummary()\n for (const child of childrenById.get(span.id) ?? []) {\n const childDescendants = visit(child)\n if (!aggregateIds.has(child.id)) addRetainedCall(descendants, child)\n addRetainedCallSummary(descendants, childDescendants)\n }\n\n if (\n descendants.callCount > 0 &&\n (!span.modelCall || hasCompatibleDescendantMeasurements(span, descendants))\n ) {\n aggregateIds.add(span.id)\n }\n\n visiting.delete(span.id)\n summaries.set(span.id, descendants)\n return descendants\n }\n\n for (const candidate of candidates) visit(candidate)\n return aggregateIds\n}\n\nfunction emptyRetainedCallSummary(): RetainedCallSummary {\n return {\n callCount: 0,\n measurements: EXECUTION_MEASUREMENT_KEY_GROUPS.map(() => ({\n total: 0,\n reportingCalls: 0,\n })),\n }\n}\n\nfunction addRetainedCall(summary: RetainedCallSummary, span: ExecutionMeasurementSpan): void {\n summary.callCount += 1\n for (let index = 0; index < EXECUTION_MEASUREMENT_KEY_GROUPS.length; index += 1) {\n const value = readNumber(span.attributes, EXECUTION_MEASUREMENT_KEY_GROUPS[index]!)\n if (value === undefined) continue\n const measurement = summary.measurements[index]!\n measurement.total += value\n measurement.reportingCalls += 1\n }\n}\n\nfunction addRetainedCallSummary(target: RetainedCallSummary, source: RetainedCallSummary): void {\n target.callCount += source.callCount\n for (let index = 0; index < target.measurements.length; index += 1) {\n const measurement = target.measurements[index]!\n const sourceMeasurement = source.measurements[index]!\n measurement.total += sourceMeasurement.total\n measurement.reportingCalls += sourceMeasurement.reportingCalls\n }\n}\n\nfunction hasCompatibleDescendantMeasurements(\n span: ExecutionMeasurementSpan,\n descendants: RetainedCallSummary,\n): boolean {\n let parentMeasurements = 0\n let descendantMeasurements = 0\n for (let index = 0; index < EXECUTION_MEASUREMENT_KEY_GROUPS.length; index += 1) {\n const keys = EXECUTION_MEASUREMENT_KEY_GROUPS[index]!\n const parentValue = readNumber(span.attributes, keys)\n const measurement = descendants.measurements[index]!\n if (parentValue !== undefined) parentMeasurements += 1\n if (measurement.reportingCalls > 0) descendantMeasurements += 1\n if (parentValue === undefined || measurement.reportingCalls === 0) continue\n if (measurement.reportingCalls !== descendants.callCount) continue\n if (Math.abs(parentValue - measurement.total) > 1e-12) return false\n }\n return parentMeasurements === 0 || descendantMeasurements > 0\n}\n\nfunction ancestorIds(\n span: ExecutionMeasurementSpan,\n byId: Map<string, ExecutionMeasurementSpan>,\n): string[] {\n const ids: string[] = []\n const seen = new Set<string>()\n let parentId = span.parentId\n while (parentId && !seen.has(parentId)) {\n ids.push(parentId)\n seen.add(parentId)\n parentId = byId.get(parentId)?.parentId\n }\n return ids\n}\n\nfunction nearestCandidateParent(\n span: ExecutionMeasurementSpan,\n byId: Map<string, ExecutionMeasurementSpan>,\n candidateIds: Set<string>,\n): string | undefined {\n const seen = new Set<string>()\n let parentId = span.parentId\n while (parentId && !seen.has(parentId)) {\n if (candidateIds.has(parentId)) return parentId\n seen.add(parentId)\n parentId = byId.get(parentId)?.parentId\n }\n return undefined\n}\n\nfunction readNumber(\n attributes: Record<string, unknown>,\n keys: readonly string[],\n): number | undefined {\n for (const key of keys) {\n const value = attributes[key]\n const parsed =\n typeof value === 'number'\n ? value\n : typeof value === 'string' && value.length > 0\n ? Number(value)\n : Number.NaN\n if (Number.isFinite(parsed) && parsed >= 0) return parsed\n }\n return undefined\n}\n"],"mappings":"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","names":[]}
@@ -1,94 +0,0 @@
1
- // src/trace/execution-tracks.ts
2
- function executionTrackByLane(lanes) {
3
- const unique = /* @__PURE__ */ new Map();
4
- for (const lane of lanes) {
5
- const existing = unique.get(lane.key);
6
- if (existing && !sameLane(existing, lane)) {
7
- throw new Error(`execution lane '${lane.key}' has conflicting scope or timing`);
8
- }
9
- unique.set(lane.key, lane);
10
- }
11
- const trackByLane = /* @__PURE__ */ new Map();
12
- const lanesByScope = /* @__PURE__ */ new Map();
13
- for (const lane of unique.values()) {
14
- const scoped = lanesByScope.get(lane.scopeKey) ?? [];
15
- scoped.push(lane);
16
- lanesByScope.set(lane.scopeKey, scoped);
17
- }
18
- for (const [scopeKey, scoped] of lanesByScope) {
19
- if (scoped.some((lane) => lane.start === null && lane.end === null)) {
20
- for (const lane of scoped) trackByLane.set(lane.key, trackId("lane", lane.key));
21
- continue;
22
- }
23
- const incompleteKeys = /* @__PURE__ */ new Set();
24
- const boundarySet = /* @__PURE__ */ new Set();
25
- for (const lane of scoped) {
26
- if (lane.start !== null && lane.end !== null && lane.end > lane.start) continue;
27
- incompleteKeys.add(lane.key);
28
- const boundary = lane.start ?? lane.end;
29
- if (boundary !== null) boundarySet.add(boundary);
30
- trackByLane.set(lane.key, trackId("lane", lane.key));
31
- }
32
- const boundaries = [...boundarySet].sort((a, b) => a - b);
33
- const completeBySegment = /* @__PURE__ */ new Map();
34
- for (const lane of scoped) {
35
- if (incompleteKeys.has(lane.key)) continue;
36
- const segment = upperBound(boundaries, lane.start);
37
- const nextBoundary = boundaries[segment];
38
- if (nextBoundary !== void 0 && nextBoundary < lane.end) {
39
- trackByLane.set(lane.key, trackId("lane", lane.key));
40
- continue;
41
- }
42
- const complete = completeBySegment.get(segment) ?? [];
43
- complete.push(lane);
44
- completeBySegment.set(segment, complete);
45
- }
46
- let serialTrack = 0;
47
- for (const [, segment] of [...completeBySegment].sort(([a], [b]) => a - b)) {
48
- const ordered = [...segment].sort(
49
- (a, b) => a.start - b.start || a.end - b.end || a.key.localeCompare(b.key)
50
- );
51
- let component = [];
52
- let componentEnd = Number.NEGATIVE_INFINITY;
53
- const flush = () => {
54
- if (component.length === 1) {
55
- trackByLane.set(component[0].key, trackId("serial", scopeKey, serialTrack));
56
- } else if (component.length > 1) {
57
- for (const lane of component) trackByLane.set(lane.key, trackId("lane", lane.key));
58
- serialTrack += 1;
59
- }
60
- component = [];
61
- componentEnd = Number.NEGATIVE_INFINITY;
62
- };
63
- for (const lane of ordered) {
64
- if (component.length > 0 && lane.start >= componentEnd) flush();
65
- component.push(lane);
66
- componentEnd = Math.max(componentEnd, lane.end);
67
- }
68
- flush();
69
- serialTrack += 1;
70
- }
71
- }
72
- return trackByLane;
73
- }
74
- function sameLane(a, b) {
75
- return a.scopeKey === b.scopeKey && a.start === b.start && a.end === b.end;
76
- }
77
- function trackId(kind, key, index) {
78
- return JSON.stringify(index === void 0 ? [kind, key] : [kind, key, index]);
79
- }
80
- function upperBound(sorted, target) {
81
- let low = 0;
82
- let high = sorted.length;
83
- while (low < high) {
84
- const middle = low + high >>> 1;
85
- if (sorted[middle] <= target) low = middle + 1;
86
- else high = middle;
87
- }
88
- return low;
89
- }
90
-
91
- export {
92
- executionTrackByLane
93
- };
94
- //# sourceMappingURL=chunk-HHWE3POT.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/trace/execution-tracks.ts"],"sourcesContent":["export interface ExecutionLane {\n key: string\n scopeKey: string\n start: number | null\n end: number | null\n}\n\n/** Assign lanes to serial tracks without joining concurrent or ambiguously timed work. */\nexport function executionTrackByLane(lanes: readonly ExecutionLane[]): Map<string, string> {\n const unique = new Map<string, ExecutionLane>()\n for (const lane of lanes) {\n const existing = unique.get(lane.key)\n if (existing && !sameLane(existing, lane)) {\n throw new Error(`execution lane '${lane.key}' has conflicting scope or timing`)\n }\n unique.set(lane.key, lane)\n }\n\n const trackByLane = new Map<string, string>()\n const lanesByScope = new Map<string, ExecutionLane[]>()\n for (const lane of unique.values()) {\n const scoped = lanesByScope.get(lane.scopeKey) ?? []\n scoped.push(lane)\n lanesByScope.set(lane.scopeKey, scoped)\n }\n\n for (const [scopeKey, scoped] of lanesByScope) {\n if (scoped.some((lane) => lane.start === null && lane.end === null)) {\n for (const lane of scoped) trackByLane.set(lane.key, trackId('lane', lane.key))\n continue\n }\n const incompleteKeys = new Set<string>()\n const boundarySet = new Set<number>()\n for (const lane of scoped) {\n if (lane.start !== null && lane.end !== null && lane.end > lane.start) continue\n incompleteKeys.add(lane.key)\n const boundary = lane.start ?? lane.end\n if (boundary !== null) boundarySet.add(boundary)\n trackByLane.set(lane.key, trackId('lane', lane.key))\n }\n const boundaries = [...boundarySet].sort((a, b) => a - b)\n const completeBySegment = new Map<number, ExecutionLane[]>()\n for (const lane of scoped) {\n if (incompleteKeys.has(lane.key)) continue\n const segment = upperBound(boundaries, lane.start!)\n const nextBoundary = boundaries[segment]\n if (nextBoundary !== undefined && nextBoundary < lane.end!) {\n trackByLane.set(lane.key, trackId('lane', lane.key))\n continue\n }\n const complete = completeBySegment.get(segment) ?? []\n complete.push(lane)\n completeBySegment.set(segment, complete)\n }\n\n let serialTrack = 0\n for (const [, segment] of [...completeBySegment].sort(([a], [b]) => a - b)) {\n const ordered = [...segment].sort(\n (a, b) => a.start! - b.start! || a.end! - b.end! || a.key.localeCompare(b.key),\n )\n let component: ExecutionLane[] = []\n let componentEnd = Number.NEGATIVE_INFINITY\n const flush = () => {\n if (component.length === 1) {\n trackByLane.set(component[0]!.key, trackId('serial', scopeKey, serialTrack))\n } else if (component.length > 1) {\n for (const lane of component) trackByLane.set(lane.key, trackId('lane', lane.key))\n serialTrack += 1\n }\n component = []\n componentEnd = Number.NEGATIVE_INFINITY\n }\n\n for (const lane of ordered) {\n if (component.length > 0 && lane.start! >= componentEnd) flush()\n component.push(lane)\n componentEnd = Math.max(componentEnd, lane.end!)\n }\n flush()\n serialTrack += 1\n }\n }\n\n return trackByLane\n}\n\nfunction sameLane(a: ExecutionLane, b: ExecutionLane): boolean {\n return a.scopeKey === b.scopeKey && a.start === b.start && a.end === b.end\n}\n\nfunction trackId(kind: string, key: string, index?: number): string {\n return JSON.stringify(index === undefined ? [kind, key] : [kind, key, index])\n}\n\nfunction upperBound(sorted: readonly number[], target: number): number {\n let low = 0\n let high = sorted.length\n while (low < high) {\n const middle = (low + high) >>> 1\n if (sorted[middle]! <= target) low = middle + 1\n else high = middle\n }\n return low\n}\n"],"mappings":"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","names":[]}