@tangle-network/agent-eval 0.120.0 → 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.
- package/CHANGELOG.md +12 -0
- package/package.json +1 -1
- package/dist/analyst/index.d.ts +0 -3111
- package/dist/analyst/index.js +0 -403
- package/dist/analyst/index.js.map +0 -1
- package/dist/authenticity/index.d.ts +0 -161
- package/dist/authenticity/index.js +0 -215
- package/dist/authenticity/index.js.map +0 -1
- package/dist/belief-state/index.d.ts +0 -1301
- package/dist/belief-state/index.js +0 -2152
- package/dist/belief-state/index.js.map +0 -1
- package/dist/benchmarks/index.d.ts +0 -974
- package/dist/benchmarks/index.js +0 -60
- package/dist/benchmarks/index.js.map +0 -1
- package/dist/builder-eval/index.d.ts +0 -695
- package/dist/builder-eval/index.js +0 -366
- package/dist/builder-eval/index.js.map +0 -1
- package/dist/campaign/index.d.ts +0 -7454
- package/dist/campaign/index.js +0 -272
- package/dist/campaign/index.js.map +0 -1
- package/dist/chunk-32BZXMSO.js +0 -3878
- package/dist/chunk-32BZXMSO.js.map +0 -1
- package/dist/chunk-3A246TSA.js +0 -998
- package/dist/chunk-3A246TSA.js.map +0 -1
- package/dist/chunk-3RF76KTD.js +0 -84
- package/dist/chunk-3RF76KTD.js.map +0 -1
- package/dist/chunk-3YYRZDON.js +0 -45
- package/dist/chunk-3YYRZDON.js.map +0 -1
- package/dist/chunk-4I2E3LLO.js +0 -1030
- package/dist/chunk-4I2E3LLO.js.map +0 -1
- package/dist/chunk-ARU2PZFM.js +0 -312
- package/dist/chunk-ARU2PZFM.js.map +0 -1
- package/dist/chunk-BOD4O7OF.js +0 -40
- package/dist/chunk-BOD4O7OF.js.map +0 -1
- package/dist/chunk-DPZAEKA6.js +0 -880
- package/dist/chunk-DPZAEKA6.js.map +0 -1
- package/dist/chunk-DTJ6QUQB.js +0 -131
- package/dist/chunk-DTJ6QUQB.js.map +0 -1
- package/dist/chunk-GGE4NNQT.js +0 -65
- package/dist/chunk-GGE4NNQT.js.map +0 -1
- package/dist/chunk-H5UD2323.js +0 -286
- package/dist/chunk-H5UD2323.js.map +0 -1
- package/dist/chunk-HHWE3POT.js +0 -94
- package/dist/chunk-HHWE3POT.js.map +0 -1
- package/dist/chunk-HKUCJ437.js +0 -787
- package/dist/chunk-HKUCJ437.js.map +0 -1
- package/dist/chunk-JHCHEVET.js +0 -274
- package/dist/chunk-JHCHEVET.js.map +0 -1
- package/dist/chunk-JHOJHHU7.js +0 -867
- package/dist/chunk-JHOJHHU7.js.map +0 -1
- package/dist/chunk-JM2SKQMS.js +0 -750
- package/dist/chunk-JM2SKQMS.js.map +0 -1
- package/dist/chunk-JN2FCO5W.js +0 -7958
- package/dist/chunk-JN2FCO5W.js.map +0 -1
- package/dist/chunk-K4DBDHLK.js +0 -158
- package/dist/chunk-K4DBDHLK.js.map +0 -1
- package/dist/chunk-K6N6XJJX.js +0 -306
- package/dist/chunk-K6N6XJJX.js.map +0 -1
- package/dist/chunk-MA6HLL3S.js +0 -65
- package/dist/chunk-MA6HLL3S.js.map +0 -1
- package/dist/chunk-MAZ26DC7.js +0 -99
- package/dist/chunk-MAZ26DC7.js.map +0 -1
- package/dist/chunk-MOXWMGPC.js +0 -577
- package/dist/chunk-MOXWMGPC.js.map +0 -1
- package/dist/chunk-NJC7U437.js +0 -626
- package/dist/chunk-NJC7U437.js.map +0 -1
- package/dist/chunk-NPCTHQIO.js +0 -91
- package/dist/chunk-NPCTHQIO.js.map +0 -1
- package/dist/chunk-ONWEPEDO.js +0 -57
- package/dist/chunk-ONWEPEDO.js.map +0 -1
- package/dist/chunk-OYZAPX5G.js +0 -1526
- package/dist/chunk-OYZAPX5G.js.map +0 -1
- package/dist/chunk-PC4UYEBM.js +0 -166
- package/dist/chunk-PC4UYEBM.js.map +0 -1
- package/dist/chunk-PICTDURQ.js +0 -766
- package/dist/chunk-PICTDURQ.js.map +0 -1
- package/dist/chunk-PJQFMIOX.js +0 -1182
- package/dist/chunk-PJQFMIOX.js.map +0 -1
- package/dist/chunk-PXD6ZFNY.js +0 -1107
- package/dist/chunk-PXD6ZFNY.js.map +0 -1
- package/dist/chunk-PXE2VKMX.js +0 -140
- package/dist/chunk-PXE2VKMX.js.map +0 -1
- package/dist/chunk-PZ5AY32C.js +0 -10
- package/dist/chunk-PZ5AY32C.js.map +0 -1
- package/dist/chunk-QBRSJK47.js +0 -622
- package/dist/chunk-QBRSJK47.js.map +0 -1
- package/dist/chunk-QWMPPZ3X.js +0 -550
- package/dist/chunk-QWMPPZ3X.js.map +0 -1
- package/dist/chunk-S3UZOQ5Y.js +0 -328
- package/dist/chunk-S3UZOQ5Y.js.map +0 -1
- package/dist/chunk-S5TT5R3L.js +0 -2668
- package/dist/chunk-S5TT5R3L.js.map +0 -1
- package/dist/chunk-T4SQEITX.js +0 -95
- package/dist/chunk-T4SQEITX.js.map +0 -1
- package/dist/chunk-TT4KNT67.js +0 -124
- package/dist/chunk-TT4KNT67.js.map +0 -1
- package/dist/chunk-U5CHZ5M3.js +0 -357
- package/dist/chunk-U5CHZ5M3.js.map +0 -1
- package/dist/chunk-ULOKLHIQ.js +0 -1937
- package/dist/chunk-ULOKLHIQ.js.map +0 -1
- package/dist/chunk-VI2UW6B6.js +0 -162
- package/dist/chunk-VI2UW6B6.js.map +0 -1
- package/dist/chunk-VQMK5FMP.js +0 -247
- package/dist/chunk-VQMK5FMP.js.map +0 -1
- package/dist/chunk-VSMTAMNK.js +0 -53
- package/dist/chunk-VSMTAMNK.js.map +0 -1
- package/dist/chunk-VZSRQ272.js +0 -149
- package/dist/chunk-VZSRQ272.js.map +0 -1
- package/dist/chunk-WW2A73HW.js +0 -159
- package/dist/chunk-WW2A73HW.js.map +0 -1
- package/dist/chunk-X4UCIOTZ.js +0 -136
- package/dist/chunk-X4UCIOTZ.js.map +0 -1
- package/dist/chunk-XDIRG3TO.js +0 -1266
- package/dist/chunk-XDIRG3TO.js.map +0 -1
- package/dist/chunk-XJYR7XFV.js +0 -317
- package/dist/chunk-XJYR7XFV.js.map +0 -1
- package/dist/chunk-ZET2UAYW.js +0 -89
- package/dist/chunk-ZET2UAYW.js.map +0 -1
- package/dist/chunk-ZZUXHH3R.js +0 -99
- package/dist/chunk-ZZUXHH3R.js.map +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +0 -112
- package/dist/cli.js.map +0 -1
- package/dist/contract/index.d.ts +0 -4969
- package/dist/contract/index.js +0 -1653
- package/dist/contract/index.js.map +0 -1
- package/dist/control.d.ts +0 -1013
- package/dist/control.js +0 -34
- package/dist/control.js.map +0 -1
- package/dist/fuzz.d.ts +0 -759
- package/dist/fuzz.js +0 -714
- package/dist/fuzz.js.map +0 -1
- package/dist/hosted/index.d.ts +0 -730
- package/dist/hosted/index.js +0 -14
- package/dist/hosted/index.js.map +0 -1
- package/dist/index.d.ts +0 -16780
- package/dist/index.js +0 -12168
- package/dist/index.js.map +0 -1
- package/dist/matrix/index.d.ts +0 -155
- package/dist/matrix/index.js +0 -8
- package/dist/matrix/index.js.map +0 -1
- package/dist/meta-eval/index.d.ts +0 -1030
- package/dist/meta-eval/index.js +0 -417
- package/dist/meta-eval/index.js.map +0 -1
- package/dist/multishot/index.d.ts +0 -579
- package/dist/multishot/index.js +0 -589
- package/dist/multishot/index.js.map +0 -1
- package/dist/openapi.json +0 -992
- package/dist/pipelines/index.d.ts +0 -567
- package/dist/pipelines/index.js +0 -515
- package/dist/pipelines/index.js.map +0 -1
- package/dist/reporting.d.ts +0 -1277
- package/dist/reporting.js +0 -48
- package/dist/reporting.js.map +0 -1
- package/dist/rl.d.ts +0 -4092
- package/dist/rl.js +0 -1724
- package/dist/rl.js.map +0 -1
- package/dist/run-campaign-HNFPJET4.js +0 -14
- package/dist/run-campaign-HNFPJET4.js.map +0 -1
- package/dist/storyboard/index.d.ts +0 -279
- package/dist/storyboard/index.js +0 -767
- package/dist/storyboard/index.js.map +0 -1
- package/dist/trace-attributes.d.ts +0 -52
- package/dist/trace-attributes.js +0 -62
- package/dist/trace-attributes.js.map +0 -1
- package/dist/traces.d.ts +0 -2343
- package/dist/traces.js +0 -249
- package/dist/traces.js.map +0 -1
- package/dist/wire/index.d.ts +0 -1252
- package/dist/wire/index.js +0 -81
- package/dist/wire/index.js.map +0 -1
package/dist/chunk-H5UD2323.js
DELETED
|
@@ -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":[]}
|
package/dist/chunk-HHWE3POT.js
DELETED
|
@@ -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":";AAQO,SAAS,qBAAqB,OAAsD;AACzF,QAAM,SAAS,oBAAI,IAA2B;AAC9C,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,OAAO,IAAI,KAAK,GAAG;AACpC,QAAI,YAAY,CAAC,SAAS,UAAU,IAAI,GAAG;AACzC,YAAM,IAAI,MAAM,mBAAmB,KAAK,GAAG,mCAAmC;AAAA,IAChF;AACA,WAAO,IAAI,KAAK,KAAK,IAAI;AAAA,EAC3B;AAEA,QAAM,cAAc,oBAAI,IAAoB;AAC5C,QAAM,eAAe,oBAAI,IAA6B;AACtD,aAAW,QAAQ,OAAO,OAAO,GAAG;AAClC,UAAM,SAAS,aAAa,IAAI,KAAK,QAAQ,KAAK,CAAC;AACnD,WAAO,KAAK,IAAI;AAChB,iBAAa,IAAI,KAAK,UAAU,MAAM;AAAA,EACxC;AAEA,aAAW,CAAC,UAAU,MAAM,KAAK,cAAc;AAC7C,QAAI,OAAO,KAAK,CAAC,SAAS,KAAK,UAAU,QAAQ,KAAK,QAAQ,IAAI,GAAG;AACnE,iBAAW,QAAQ,OAAQ,aAAY,IAAI,KAAK,KAAK,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAC9E;AAAA,IACF;AACA,UAAM,iBAAiB,oBAAI,IAAY;AACvC,UAAM,cAAc,oBAAI,IAAY;AACpC,eAAW,QAAQ,QAAQ;AACzB,UAAI,KAAK,UAAU,QAAQ,KAAK,QAAQ,QAAQ,KAAK,MAAM,KAAK,MAAO;AACvE,qBAAe,IAAI,KAAK,GAAG;AAC3B,YAAM,WAAW,KAAK,SAAS,KAAK;AACpC,UAAI,aAAa,KAAM,aAAY,IAAI,QAAQ;AAC/C,kBAAY,IAAI,KAAK,KAAK,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAAA,IACrD;AACA,UAAM,aAAa,CAAC,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACxD,UAAM,oBAAoB,oBAAI,IAA6B;AAC3D,eAAW,QAAQ,QAAQ;AACzB,UAAI,eAAe,IAAI,KAAK,GAAG,EAAG;AAClC,YAAM,UAAU,WAAW,YAAY,KAAK,KAAM;AAClD,YAAM,eAAe,WAAW,OAAO;AACvC,UAAI,iBAAiB,UAAa,eAAe,KAAK,KAAM;AAC1D,oBAAY,IAAI,KAAK,KAAK,QAAQ,QAAQ,KAAK,GAAG,CAAC;AACnD;AAAA,MACF;AACA,YAAM,WAAW,kBAAkB,IAAI,OAAO,KAAK,CAAC;AACpD,eAAS,KAAK,IAAI;AAClB,wBAAkB,IAAI,SAAS,QAAQ;AAAA,IACzC;AAEA,QAAI,cAAc;AAClB,eAAW,CAAC,EAAE,OAAO,KAAK,CAAC,GAAG,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG;AAC1E,YAAM,UAAU,CAAC,GAAG,OAAO,EAAE;AAAA,QAC3B,CAAC,GAAG,MAAM,EAAE,QAAS,EAAE,SAAU,EAAE,MAAO,EAAE,OAAQ,EAAE,IAAI,cAAc,EAAE,GAAG;AAAA,MAC/E;AACA,UAAI,YAA6B,CAAC;AAClC,UAAI,eAAe,OAAO;AAC1B,YAAM,QAAQ,MAAM;AAClB,YAAI,UAAU,WAAW,GAAG;AAC1B,sBAAY,IAAI,UAAU,CAAC,EAAG,KAAK,QAAQ,UAAU,UAAU,WAAW,CAAC;AAAA,QAC7E,WAAW,UAAU,SAAS,GAAG;AAC/B,qBAAW,QAAQ,UAAW,aAAY,IAAI,KAAK,KAAK,QAAQ,QAAQ,KAAK,GAAG,CAAC;AACjF,yBAAe;AAAA,QACjB;AACA,oBAAY,CAAC;AACb,uBAAe,OAAO;AAAA,MACxB;AAEA,iBAAW,QAAQ,SAAS;AAC1B,YAAI,UAAU,SAAS,KAAK,KAAK,SAAU,aAAc,OAAM;AAC/D,kBAAU,KAAK,IAAI;AACnB,uBAAe,KAAK,IAAI,cAAc,KAAK,GAAI;AAAA,MACjD;AACA,YAAM;AACN,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,GAAkB,GAA2B;AAC7D,SAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;AACzE;AAEA,SAAS,QAAQ,MAAc,KAAa,OAAwB;AAClE,SAAO,KAAK,UAAU,UAAU,SAAY,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC;AAC9E;AAEA,SAAS,WAAW,QAA2B,QAAwB;AACrE,MAAI,MAAM;AACV,MAAI,OAAO,OAAO;AAClB,SAAO,MAAM,MAAM;AACjB,UAAM,SAAU,MAAM,SAAU;AAChC,QAAI,OAAO,MAAM,KAAM,OAAQ,OAAM,SAAS;AAAA,QACzC,QAAO;AAAA,EACd;AACA,SAAO;AACT;","names":[]}
|