agent-inspect 6.8.0 → 6.10.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.
- package/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/docs/BUNDLES.md +31 -9
- package/docs/CI-ARTIFACTS.md +10 -1
- package/docs/CLI.md +20 -4
- package/package.json +1 -1
- package/packages/cli/dist/{chunk-TO4VENHV.mjs → chunk-36IJ76LH.mjs} +1857 -158
- package/packages/cli/dist/chunk-36IJ76LH.mjs.map +1 -0
- package/packages/cli/dist/index.cjs +10764 -8877
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +825 -754
- package/packages/cli/dist/index.mjs.map +1 -1
- package/packages/cli/dist/{src-Z5W27YCW.mjs → src-YFN3Q3GP.mjs} +3 -3
- package/packages/cli/dist/{src-Z5W27YCW.mjs.map → src-YFN3Q3GP.mjs.map} +1 -1
- package/packages/core/dist/advanced.cjs +1718 -18
- package/packages/core/dist/advanced.cjs.map +1 -1
- package/packages/core/dist/advanced.d.cts +338 -4
- package/packages/core/dist/advanced.d.ts +338 -4
- package/packages/core/dist/advanced.mjs +1166 -12
- package/packages/core/dist/advanced.mjs.map +1 -1
- package/packages/core/dist/checks.cjs +105 -14
- package/packages/core/dist/checks.cjs.map +1 -1
- package/packages/core/dist/checks.d.cts +2 -2
- package/packages/core/dist/checks.d.ts +2 -2
- package/packages/core/dist/checks.mjs +1 -1
- package/packages/core/dist/chunk-F7STQ5JF.mjs +479 -0
- package/packages/core/dist/chunk-F7STQ5JF.mjs.map +1 -0
- package/packages/core/dist/{chunk-EQVXDGGU.mjs → chunk-QT6CQ2XA.mjs} +107 -16
- package/packages/core/dist/chunk-QT6CQ2XA.mjs.map +1 -0
- package/packages/core/dist/diff.mjs +3 -477
- package/packages/core/dist/diff.mjs.map +1 -1
- package/packages/core/dist/{index-BblJEdYZ.d.ts → index-BO7l0iAe.d.ts} +44 -1
- package/packages/core/dist/{index-DyKk7iR9.d.cts → index-mdFcxSOR.d.cts} +44 -1
- package/packages/core/dist/reporters.cjs +25 -0
- package/packages/core/dist/reporters.cjs.map +1 -1
- package/packages/core/dist/reporters.d.cts +16 -2
- package/packages/core/dist/reporters.d.ts +16 -2
- package/packages/core/dist/reporters.mjs +24 -1
- package/packages/core/dist/reporters.mjs.map +1 -1
- package/packages/cli/dist/chunk-TO4VENHV.mjs.map +0 -1
- package/packages/core/dist/chunk-EQVXDGGU.mjs.map +0 -1
|
@@ -1,479 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
// packages/core/src/diff/comparable.ts
|
|
5
|
-
function extractOutputPreview(meta) {
|
|
6
|
-
if (meta === void 0) return void 0;
|
|
7
|
-
if ("outputPreview" in meta) return meta.outputPreview;
|
|
8
|
-
if ("resultPreview" in meta) return meta.resultPreview;
|
|
9
|
-
return void 0;
|
|
10
|
-
}
|
|
11
|
-
function mapStepStatus(s) {
|
|
12
|
-
if (s === void 0) return "running";
|
|
13
|
-
return s;
|
|
14
|
-
}
|
|
15
|
-
function manualTraceEventsToComparableRun(events) {
|
|
16
|
-
const started = events.find((e) => e.event === "run_started");
|
|
17
|
-
if (!started || started.event !== "run_started") {
|
|
18
|
-
throw new Error("Invalid trace: missing run_started");
|
|
19
|
-
}
|
|
20
|
-
const rs = started;
|
|
21
|
-
const runId = rs.runId;
|
|
22
|
-
const completedAll = events.filter((e) => e.event === "run_completed");
|
|
23
|
-
const lastCompleted = completedAll[completedAll.length - 1];
|
|
24
|
-
let runStatus;
|
|
25
|
-
if (lastCompleted === void 0) runStatus = "running";
|
|
26
|
-
else runStatus = lastCompleted.status;
|
|
27
|
-
const durationMs = lastCompleted !== void 0 && Number.isFinite(lastCompleted.durationMs) ? lastCompleted.durationMs : void 0;
|
|
28
|
-
const steps = /* @__PURE__ */ new Map();
|
|
29
|
-
let order = 0;
|
|
30
|
-
for (const e of events) {
|
|
31
|
-
if (e.event !== "step_started") continue;
|
|
32
|
-
const s = e;
|
|
33
|
-
const meta = s.metadata ? { ...s.metadata } : void 0;
|
|
34
|
-
steps.set(s.stepId, {
|
|
35
|
-
id: s.stepId,
|
|
36
|
-
parentId: s.parentId,
|
|
37
|
-
name: s.name,
|
|
38
|
-
type: s.type,
|
|
39
|
-
order: order++,
|
|
40
|
-
timestamp: s.timestamp,
|
|
41
|
-
metadata: meta
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
for (const e of events) {
|
|
45
|
-
if (e.event !== "step_completed") continue;
|
|
46
|
-
const acc = steps.get(e.stepId);
|
|
47
|
-
if (!acc) continue;
|
|
48
|
-
acc.status = e.status;
|
|
49
|
-
acc.durationMs = e.durationMs;
|
|
50
|
-
if (e.error?.message) acc.errorMsg = e.error.message;
|
|
51
|
-
const extra = e;
|
|
52
|
-
if (extra.metadata !== void 0 && typeof extra.metadata === "object") {
|
|
53
|
-
acc.metadata = { ...acc.metadata ?? {}, ...extra.metadata };
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
const nodes = /* @__PURE__ */ new Map();
|
|
57
|
-
for (const acc of steps.values()) {
|
|
58
|
-
let meta = acc.metadata ? { ...acc.metadata } : void 0;
|
|
59
|
-
if (acc.parentId !== void 0 && !steps.has(acc.parentId)) {
|
|
60
|
-
meta = { ...meta ?? {}, agent_inspect_diff_parent_missing: true };
|
|
61
|
-
}
|
|
62
|
-
const outputPreview = extractOutputPreview(meta);
|
|
63
|
-
if (meta !== void 0 && ("outputPreview" in meta || "resultPreview" in meta)) {
|
|
64
|
-
delete meta.outputPreview;
|
|
65
|
-
delete meta.resultPreview;
|
|
66
|
-
}
|
|
67
|
-
const sc = {
|
|
68
|
-
id: acc.id,
|
|
69
|
-
name: acc.name,
|
|
70
|
-
type: acc.type,
|
|
71
|
-
status: mapStepStatus(acc.status),
|
|
72
|
-
durationMs: acc.durationMs,
|
|
73
|
-
error: acc.errorMsg,
|
|
74
|
-
metadata: meta && Object.keys(meta).length > 0 ? meta : void 0,
|
|
75
|
-
outputPreview,
|
|
76
|
-
children: []
|
|
77
|
-
};
|
|
78
|
-
nodes.set(acc.id, sc);
|
|
79
|
-
}
|
|
80
|
-
const roots = [];
|
|
81
|
-
const sortByOrder = (a, b) => {
|
|
82
|
-
const oa = steps.get(a.id)?.order ?? 0;
|
|
83
|
-
const ob = steps.get(b.id)?.order ?? 0;
|
|
84
|
-
return oa - ob;
|
|
85
|
-
};
|
|
86
|
-
for (const acc of steps.values()) {
|
|
87
|
-
const node = nodes.get(acc.id);
|
|
88
|
-
if (acc.parentId !== void 0 && nodes.has(acc.parentId)) {
|
|
89
|
-
nodes.get(acc.parentId).children.push(node);
|
|
90
|
-
} else {
|
|
91
|
-
roots.push(node);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
roots.sort(sortByOrder);
|
|
95
|
-
for (const n of nodes.values()) {
|
|
96
|
-
n.children.sort(sortByOrder);
|
|
97
|
-
}
|
|
98
|
-
return {
|
|
99
|
-
runId,
|
|
100
|
-
name: rs.name,
|
|
101
|
-
status: runStatus,
|
|
102
|
-
durationMs,
|
|
103
|
-
steps: roots
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// packages/core/src/diff/engine.ts
|
|
108
|
-
var DEFAULT_THRESHOLD_MS = 0;
|
|
109
|
-
function pathSeg(step, index) {
|
|
110
|
-
return { index, name: step.name, stepId: step.id };
|
|
111
|
-
}
|
|
112
|
-
function buildPath(segments) {
|
|
113
|
-
return { path: [...segments] };
|
|
114
|
-
}
|
|
115
|
-
function pairSteps(left, right) {
|
|
116
|
-
const usedRight = /* @__PURE__ */ new Set();
|
|
117
|
-
const pairs = [];
|
|
118
|
-
for (let i = 0; i < left.length; i++) {
|
|
119
|
-
const L = left[i];
|
|
120
|
-
let R = right.find((r) => !usedRight.has(r.id) && r.id === L.id);
|
|
121
|
-
if (R === void 0 && i < right.length && !usedRight.has(right[i].id)) {
|
|
122
|
-
const cand = right[i];
|
|
123
|
-
if (cand.name === L.name && (cand.type ?? "") === (L.type ?? "")) {
|
|
124
|
-
R = cand;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
if (R === void 0) {
|
|
128
|
-
R = right.find(
|
|
129
|
-
(r) => !usedRight.has(r.id) && r.name === L.name && (r.type ?? "") === (L.type ?? "")
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
if (R !== void 0) {
|
|
133
|
-
usedRight.add(R.id);
|
|
134
|
-
pairs.push([L, R]);
|
|
135
|
-
} else {
|
|
136
|
-
pairs.push([L, void 0]);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
for (const R of right) {
|
|
140
|
-
if (!usedRight.has(R.id)) {
|
|
141
|
-
pairs.push([void 0, R]);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return pairs;
|
|
145
|
-
}
|
|
146
|
-
function compareLeafSteps(L, R, segments, opts, out) {
|
|
147
|
-
const path = buildPath(segments);
|
|
148
|
-
if (L.name !== R.name) {
|
|
149
|
-
out.push({
|
|
150
|
-
kind: "structure",
|
|
151
|
-
severity: "warning",
|
|
152
|
-
message: "Step name differs",
|
|
153
|
-
path,
|
|
154
|
-
left: L.name,
|
|
155
|
-
right: R.name
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
if ((L.type ?? "") !== (R.type ?? "")) {
|
|
159
|
-
out.push({
|
|
160
|
-
kind: "step-type",
|
|
161
|
-
severity: "warning",
|
|
162
|
-
message: "Step type differs",
|
|
163
|
-
path,
|
|
164
|
-
left: L.type,
|
|
165
|
-
right: R.type
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
if ((L.status ?? "") !== (R.status ?? "")) {
|
|
169
|
-
out.push({
|
|
170
|
-
kind: "step-status",
|
|
171
|
-
severity: "warning",
|
|
172
|
-
message: "Step status differs",
|
|
173
|
-
path,
|
|
174
|
-
left: L.status,
|
|
175
|
-
right: R.status
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
const le = L.error ?? "";
|
|
179
|
-
const re = R.error ?? "";
|
|
180
|
-
if (le !== re) {
|
|
181
|
-
out.push({
|
|
182
|
-
kind: "error",
|
|
183
|
-
severity: "error",
|
|
184
|
-
message: "Step error message differs",
|
|
185
|
-
path,
|
|
186
|
-
left: le || void 0,
|
|
187
|
-
right: re || void 0
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
if (!opts.ignoreDuration) {
|
|
191
|
-
const ld = L.durationMs;
|
|
192
|
-
const rd = R.durationMs;
|
|
193
|
-
const th = opts.durationThresholdMs;
|
|
194
|
-
let differs = false;
|
|
195
|
-
if (ld === void 0 && rd === void 0) differs = false;
|
|
196
|
-
else if (ld === void 0 || rd === void 0) differs = true;
|
|
197
|
-
else differs = Math.abs(ld - rd) > th;
|
|
198
|
-
if (differs) {
|
|
199
|
-
out.push({
|
|
200
|
-
kind: "duration",
|
|
201
|
-
severity: "info",
|
|
202
|
-
message: "Step duration differs",
|
|
203
|
-
path,
|
|
204
|
-
left: ld,
|
|
205
|
-
right: rd
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
const lm = stableJson(L.metadata ?? {});
|
|
210
|
-
const rm = stableJson(R.metadata ?? {});
|
|
211
|
-
if (lm !== rm) {
|
|
212
|
-
out.push({
|
|
213
|
-
kind: "metadata",
|
|
214
|
-
severity: "info",
|
|
215
|
-
message: "Step metadata differs",
|
|
216
|
-
path,
|
|
217
|
-
left: L.metadata,
|
|
218
|
-
right: R.metadata
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
const lo = stableJson(L.outputPreview ?? null);
|
|
222
|
-
const ro = stableJson(R.outputPreview ?? null);
|
|
223
|
-
if (lo !== ro) {
|
|
224
|
-
out.push({
|
|
225
|
-
kind: "output",
|
|
226
|
-
severity: "info",
|
|
227
|
-
message: "Output preview differs",
|
|
228
|
-
path,
|
|
229
|
-
left: L.outputPreview,
|
|
230
|
-
right: R.outputPreview
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
function compareRecursive(L, R, segments, opts, out) {
|
|
235
|
-
compareLeafSteps(L, R, segments, opts, out);
|
|
236
|
-
const pairs = pairSteps(L.children, R.children);
|
|
237
|
-
let ci = 0;
|
|
238
|
-
for (const [lch, rch] of pairs) {
|
|
239
|
-
if (lch !== void 0 && rch !== void 0) {
|
|
240
|
-
compareRecursive(lch, rch, [...segments, pathSeg(lch, ci)], opts, out);
|
|
241
|
-
} else if (lch !== void 0) {
|
|
242
|
-
out.push({
|
|
243
|
-
kind: "step-removed",
|
|
244
|
-
severity: "warning",
|
|
245
|
-
message: `Step only in left run: ${lch.name}`,
|
|
246
|
-
path: buildPath([...segments, pathSeg(lch, ci)]),
|
|
247
|
-
left: lch.id,
|
|
248
|
-
right: void 0
|
|
249
|
-
});
|
|
250
|
-
} else if (rch !== void 0) {
|
|
251
|
-
out.push({
|
|
252
|
-
kind: "step-added",
|
|
253
|
-
severity: "warning",
|
|
254
|
-
message: `Step only in right run: ${rch.name}`,
|
|
255
|
-
path: buildPath([...segments, pathSeg(rch, ci)]),
|
|
256
|
-
left: void 0,
|
|
257
|
-
right: rch.id
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
ci += 1;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
function mergeDiffDefaults(options) {
|
|
264
|
-
return {
|
|
265
|
-
ignoreDuration: options?.ignoreDuration ?? false,
|
|
266
|
-
durationThresholdMs: options?.durationThresholdMs !== void 0 ? options.durationThresholdMs : DEFAULT_THRESHOLD_MS,
|
|
267
|
-
focus: options?.focus ?? "all",
|
|
268
|
-
check: options?.check ?? "all"
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
function kindMatchesFilter(kind, merged) {
|
|
272
|
-
const { focus, check } = merged;
|
|
273
|
-
if (check !== "all") {
|
|
274
|
-
if (check === "structure") {
|
|
275
|
-
if (!["step-added", "step-removed", "structure", "step-type"].includes(kind)) return false;
|
|
276
|
-
} else if (check === "outputs") {
|
|
277
|
-
if (!["metadata", "output"].includes(kind)) return false;
|
|
278
|
-
} else if (check === "errors") {
|
|
279
|
-
if (!["run-status", "step-status", "error"].includes(kind)) return false;
|
|
280
|
-
} else if (check === "timing") {
|
|
281
|
-
if (kind !== "duration") return false;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
if (focus !== "all") {
|
|
285
|
-
if (focus === "errors") {
|
|
286
|
-
if (!["run-status", "step-status", "error"].includes(kind)) return false;
|
|
287
|
-
} else if (focus === "structure") {
|
|
288
|
-
if (!["step-added", "step-removed", "structure", "step-type"].includes(kind)) return false;
|
|
289
|
-
} else if (focus === "outputs") {
|
|
290
|
-
if (!["metadata", "output"].includes(kind)) return false;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
return true;
|
|
294
|
-
}
|
|
295
|
-
function diffRuns(left, right, options) {
|
|
296
|
-
const merged = mergeDiffDefaults(options);
|
|
297
|
-
const opts = {
|
|
298
|
-
ignoreDuration: merged.ignoreDuration,
|
|
299
|
-
durationThresholdMs: merged.durationThresholdMs
|
|
300
|
-
};
|
|
301
|
-
const raw = [];
|
|
302
|
-
if ((left.status ?? "") !== (right.status ?? "")) {
|
|
303
|
-
raw.push({
|
|
304
|
-
kind: "run-status",
|
|
305
|
-
severity: "warning",
|
|
306
|
-
message: "Run completion status differs",
|
|
307
|
-
left: left.status,
|
|
308
|
-
right: right.status
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
if (!merged.ignoreDuration) {
|
|
312
|
-
const ld = left.durationMs;
|
|
313
|
-
const rd = right.durationMs;
|
|
314
|
-
const th = merged.durationThresholdMs;
|
|
315
|
-
let differs = false;
|
|
316
|
-
if (ld === void 0 && rd === void 0) differs = false;
|
|
317
|
-
else if (ld === void 0 || rd === void 0) differs = true;
|
|
318
|
-
else differs = Math.abs(ld - rd) > th;
|
|
319
|
-
if (differs) {
|
|
320
|
-
raw.push({
|
|
321
|
-
kind: "duration",
|
|
322
|
-
severity: "info",
|
|
323
|
-
message: "Run duration differs",
|
|
324
|
-
left: ld,
|
|
325
|
-
right: rd
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
const pairs = pairSteps(left.steps, right.steps);
|
|
330
|
-
let idx = 0;
|
|
331
|
-
for (const [ls, rs] of pairs) {
|
|
332
|
-
if (ls !== void 0 && rs !== void 0) {
|
|
333
|
-
compareRecursive(ls, rs, [pathSeg(ls, idx)], opts, raw);
|
|
334
|
-
idx += 1;
|
|
335
|
-
} else if (ls !== void 0) {
|
|
336
|
-
raw.push({
|
|
337
|
-
kind: "step-removed",
|
|
338
|
-
severity: "warning",
|
|
339
|
-
message: `Step only in left run: ${ls.name}`,
|
|
340
|
-
path: buildPath([pathSeg(ls, idx)]),
|
|
341
|
-
left: ls.id,
|
|
342
|
-
right: void 0
|
|
343
|
-
});
|
|
344
|
-
idx += 1;
|
|
345
|
-
} else if (rs !== void 0) {
|
|
346
|
-
raw.push({
|
|
347
|
-
kind: "step-added",
|
|
348
|
-
severity: "warning",
|
|
349
|
-
message: `Step only in right run: ${rs.name}`,
|
|
350
|
-
path: buildPath([pathSeg(rs, idx)]),
|
|
351
|
-
left: void 0,
|
|
352
|
-
right: rs.id
|
|
353
|
-
});
|
|
354
|
-
idx += 1;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
const differences = raw.filter((d) => kindMatchesFilter(d.kind, merged));
|
|
358
|
-
let errors = 0;
|
|
359
|
-
let warnings = 0;
|
|
360
|
-
let info = 0;
|
|
361
|
-
for (const d of differences) {
|
|
362
|
-
if (d.severity === "error") errors += 1;
|
|
363
|
-
else if (d.severity === "warning") warnings += 1;
|
|
364
|
-
else info += 1;
|
|
365
|
-
}
|
|
366
|
-
const firstVisible = differences[0];
|
|
367
|
-
const firstDivergence = firstVisible !== void 0 ? {
|
|
368
|
-
kind: "first-divergence",
|
|
369
|
-
severity: firstVisible.severity,
|
|
370
|
-
message: `First divergence: ${firstVisible.message}`,
|
|
371
|
-
path: firstVisible.path,
|
|
372
|
-
left: firstVisible.left,
|
|
373
|
-
right: firstVisible.right
|
|
374
|
-
} : void 0;
|
|
375
|
-
const summary = {
|
|
376
|
-
leftRunId: left.runId,
|
|
377
|
-
rightRunId: right.runId,
|
|
378
|
-
totalDifferences: differences.length,
|
|
379
|
-
errors,
|
|
380
|
-
warnings,
|
|
381
|
-
info,
|
|
382
|
-
firstDivergence
|
|
383
|
-
};
|
|
384
|
-
return { summary, differences };
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// packages/core/src/diff/renderer.ts
|
|
388
|
-
function formatPath(path) {
|
|
389
|
-
if (path === void 0 || path.path.length === 0) {
|
|
390
|
-
return "(run)";
|
|
391
|
-
}
|
|
392
|
-
return path.path.map((s) => s.name).join(" > ");
|
|
393
|
-
}
|
|
394
|
-
function formatValue(v, verbose) {
|
|
395
|
-
if (v === void 0) return "(undefined)";
|
|
396
|
-
if (typeof v === "string") return v;
|
|
397
|
-
if (typeof v === "number" || typeof v === "boolean") return String(v);
|
|
398
|
-
const s = JSON.stringify(v);
|
|
399
|
-
if (verbose || s.length <= 120) return s;
|
|
400
|
-
return `${s.slice(0, 117)}...`;
|
|
401
|
-
}
|
|
402
|
-
function renderRunDiff(result, options) {
|
|
403
|
-
const json = options?.json === true;
|
|
404
|
-
const verbose = options?.verbose === true;
|
|
405
|
-
const color = options?.color === true;
|
|
406
|
-
if (json) {
|
|
407
|
-
return JSON.stringify(result, null, 2);
|
|
408
|
-
}
|
|
409
|
-
const sev = (s, level) => {
|
|
410
|
-
if (!color) return s;
|
|
411
|
-
if (level === "error") return source_default.red(s);
|
|
412
|
-
if (level === "warning") return source_default.yellow(s);
|
|
413
|
-
return source_default.gray(s);
|
|
414
|
-
};
|
|
415
|
-
const lines = [];
|
|
416
|
-
const { summary } = result;
|
|
417
|
-
lines.push("Run diff");
|
|
418
|
-
lines.push(`Left: ${summary.leftRunId}`);
|
|
419
|
-
lines.push(`Right: ${summary.rightRunId}`);
|
|
420
|
-
lines.push("");
|
|
421
|
-
lines.push("Summary:");
|
|
422
|
-
lines.push(` Differences: ${summary.totalDifferences}`);
|
|
423
|
-
lines.push(` Errors: ${summary.errors}`);
|
|
424
|
-
lines.push(` Warnings: ${summary.warnings}`);
|
|
425
|
-
lines.push(` Info: ${summary.info}`);
|
|
426
|
-
lines.push("");
|
|
427
|
-
const fd = summary.firstDivergence;
|
|
428
|
-
const firstKind = result.differences[0]?.kind;
|
|
429
|
-
if (fd !== void 0) {
|
|
430
|
-
lines.push("First divergence:");
|
|
431
|
-
const where = formatPath(fd.path);
|
|
432
|
-
const displayKind = firstKind ?? fd.kind;
|
|
433
|
-
lines.push(` ${displayKind} at ${where}`);
|
|
434
|
-
if (fd.left !== void 0 || fd.right !== void 0) {
|
|
435
|
-
lines.push(` left: ${formatValue(fd.left, verbose)}`);
|
|
436
|
-
lines.push(` right: ${formatValue(fd.right, verbose)}`);
|
|
437
|
-
}
|
|
438
|
-
lines.push("");
|
|
439
|
-
}
|
|
440
|
-
lines.push("Differences:");
|
|
441
|
-
if (result.differences.length === 0) {
|
|
442
|
-
lines.push(" (none)");
|
|
443
|
-
return lines.join("\n");
|
|
444
|
-
}
|
|
445
|
-
const showSides = (kind) => verbose || [
|
|
446
|
-
"run-status",
|
|
447
|
-
"step-status",
|
|
448
|
-
"error",
|
|
449
|
-
"duration",
|
|
450
|
-
"step-type",
|
|
451
|
-
"structure",
|
|
452
|
-
"step-added",
|
|
453
|
-
"step-removed"
|
|
454
|
-
].includes(kind);
|
|
455
|
-
for (const d of result.differences) {
|
|
456
|
-
const tag = sev(`[${d.severity}]`, d.severity);
|
|
457
|
-
const pathStr = d.path !== void 0 ? ` ${formatPath(d.path)}` : "";
|
|
458
|
-
lines.push(` ${tag} ${d.kind}${pathStr}`);
|
|
459
|
-
lines.push(` ${d.message}`);
|
|
460
|
-
if (d.left !== void 0 || d.right !== void 0) {
|
|
461
|
-
if (showSides(d.kind)) {
|
|
462
|
-
lines.push(` left: ${formatValue(d.left, verbose)}`);
|
|
463
|
-
lines.push(` right: ${formatValue(d.right, verbose)}`);
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
return lines.join("\n");
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
// packages/core/src/diff/index.ts
|
|
471
|
-
function diffTraceEvents(leftEvents, rightEvents, options) {
|
|
472
|
-
const left = manualTraceEventsToComparableRun(leftEvents);
|
|
473
|
-
const right = manualTraceEventsToComparableRun(rightEvents);
|
|
474
|
-
return diffRuns(left, right, options);
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
export { diffRuns, diffTraceEvents, manualTraceEventsToComparableRun, renderRunDiff };
|
|
1
|
+
export { diffRuns, diffTraceEvents, manualTraceEventsToComparableRun, renderRunDiff } from './chunk-F7STQ5JF.mjs';
|
|
2
|
+
import './chunk-BT7CATSD.mjs';
|
|
3
|
+
import './chunk-CAWPF22J.mjs';
|
|
478
4
|
//# sourceMappingURL=diff.mjs.map
|
|
479
5
|
//# sourceMappingURL=diff.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diff/comparable.ts","../src/diff/engine.ts","../src/diff/renderer.ts","../src/diff/index.ts"],"names":[],"mappings":"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","file":"diff.mjs","sourcesContent":["import type {\n RunCompletedEvent,\n RunStartedEvent,\n StepCompletedEvent,\n StepStartedEvent,\n StepType,\n TraceEvent,\n} from \"../types.js\";\n\nimport type { RunComparable, StepComparable } from \"./types.js\";\n\ntype StepAcc = {\n id: string;\n parentId?: string;\n name: string;\n type: StepType;\n order: number;\n timestamp: number;\n metadata?: Record<string, unknown>;\n status?: \"success\" | \"error\";\n durationMs?: number;\n errorMsg?: string;\n};\n\nfunction extractOutputPreview(meta: Record<string, unknown> | undefined): unknown {\n if (meta === undefined) return undefined;\n if (\"outputPreview\" in meta) return meta.outputPreview;\n if (\"resultPreview\" in meta) return meta.resultPreview;\n return undefined;\n}\n\nfunction mapStepStatus(s: \"success\" | \"error\" | undefined): string {\n if (s === undefined) return \"running\";\n return s;\n}\n\n/**\n * Normalize v0.1 manual JSONL events into a comparable run tree.\n * Does not mutate input events.\n */\nexport function manualTraceEventsToComparableRun(events: TraceEvent[]): RunComparable {\n const started = events.find((e) => e.event === \"run_started\");\n if (!started || started.event !== \"run_started\") {\n throw new Error(\"Invalid trace: missing run_started\");\n }\n\n const rs = started as RunStartedEvent;\n const runId = rs.runId;\n\n const completedAll = events.filter((e) => e.event === \"run_completed\");\n const lastCompleted = completedAll[completedAll.length - 1] as RunCompletedEvent | undefined;\n\n let runStatus: string | undefined;\n if (lastCompleted === undefined) runStatus = \"running\";\n else runStatus = lastCompleted.status;\n\n const durationMs =\n lastCompleted !== undefined && Number.isFinite(lastCompleted.durationMs)\n ? lastCompleted.durationMs\n : undefined;\n\n const steps = new Map<string, StepAcc>();\n let order = 0;\n\n for (const e of events) {\n if (e.event !== \"step_started\") continue;\n const s = e as StepStartedEvent;\n const meta = s.metadata ? { ...(s.metadata as Record<string, unknown>) } : undefined;\n steps.set(s.stepId, {\n id: s.stepId,\n parentId: s.parentId,\n name: s.name,\n type: s.type,\n order: order++,\n timestamp: s.timestamp,\n metadata: meta,\n });\n }\n\n for (const e of events) {\n if (e.event !== \"step_completed\") continue;\n const acc = steps.get(e.stepId);\n if (!acc) continue;\n acc.status = e.status;\n acc.durationMs = e.durationMs;\n if (e.error?.message) acc.errorMsg = e.error.message;\n const extra = e as StepCompletedEvent & { metadata?: Record<string, unknown> };\n if (extra.metadata !== undefined && typeof extra.metadata === \"object\") {\n acc.metadata = { ...(acc.metadata ?? {}), ...extra.metadata };\n }\n }\n\n const nodes = new Map<string, StepComparable>();\n\n for (const acc of steps.values()) {\n let meta = acc.metadata ? { ...acc.metadata } : undefined;\n if (acc.parentId !== undefined && !steps.has(acc.parentId)) {\n meta = { ...(meta ?? {}), agent_inspect_diff_parent_missing: true };\n }\n\n // Previews are compared as their own \"output\" dimension; strip them from\n // the metadata copy so one preview change is not also reported as a\n // metadata diff.\n const outputPreview = extractOutputPreview(meta);\n if (meta !== undefined && (\"outputPreview\" in meta || \"resultPreview\" in meta)) {\n delete meta.outputPreview;\n delete meta.resultPreview;\n }\n\n const sc: StepComparable = {\n id: acc.id,\n name: acc.name,\n type: acc.type,\n status: mapStepStatus(acc.status),\n durationMs: acc.durationMs,\n error: acc.errorMsg,\n metadata: meta && Object.keys(meta).length > 0 ? meta : undefined,\n outputPreview,\n children: [],\n };\n nodes.set(acc.id, sc);\n }\n\n const roots: StepComparable[] = [];\n const sortByOrder = (a: StepComparable, b: StepComparable) => {\n const oa = steps.get(a.id)?.order ?? 0;\n const ob = steps.get(b.id)?.order ?? 0;\n return oa - ob;\n };\n\n for (const acc of steps.values()) {\n const node = nodes.get(acc.id)!;\n if (acc.parentId !== undefined && nodes.has(acc.parentId)) {\n nodes.get(acc.parentId)!.children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n roots.sort(sortByOrder);\n for (const n of nodes.values()) {\n n.children.sort(sortByOrder);\n }\n\n return {\n runId,\n name: rs.name,\n status: runStatus,\n durationMs,\n steps: roots,\n };\n}\n","import { stableJson } from \"../exporters/helpers.js\";\n\nimport type {\n DiffKind,\n DiffOptions,\n DiffPath,\n DiffPathSegment,\n RunComparable,\n RunDiffItem,\n RunDiffResult,\n RunDiffSummary,\n StepComparable,\n} from \"./types.js\";\n\nconst DEFAULT_THRESHOLD_MS = 0;\n\nfunction pathSeg(step: StepComparable, index: number): DiffPathSegment {\n return { index, name: step.name, stepId: step.id };\n}\n\nfunction buildPath(segments: DiffPathSegment[]): DiffPath {\n return { path: [...segments] };\n}\n\n/** Pair steps: match by id, then same index, then name+type. */\nexport function pairSteps(\n left: StepComparable[],\n right: StepComparable[],\n): Array<[StepComparable | undefined, StepComparable | undefined]> {\n const usedRight = new Set<string>();\n const pairs: Array<[StepComparable | undefined, StepComparable | undefined]> = [];\n\n for (let i = 0; i < left.length; i++) {\n const L = left[i]!;\n let R = right.find((r) => !usedRight.has(r.id) && r.id === L.id);\n if (R === undefined && i < right.length && !usedRight.has(right[i]!.id)) {\n const cand = right[i]!;\n if (cand.name === L.name && (cand.type ?? \"\") === (L.type ?? \"\")) {\n R = cand;\n }\n }\n if (R === undefined) {\n R = right.find(\n (r) =>\n !usedRight.has(r.id) &&\n r.name === L.name &&\n (r.type ?? \"\") === (L.type ?? \"\"),\n );\n }\n if (R !== undefined) {\n usedRight.add(R.id);\n pairs.push([L, R]);\n } else {\n pairs.push([L, undefined]);\n }\n }\n\n for (const R of right) {\n if (!usedRight.has(R.id)) {\n pairs.push([undefined, R]);\n }\n }\n\n return pairs;\n}\n\nfunction compareLeafSteps(\n L: StepComparable,\n R: StepComparable,\n segments: DiffPathSegment[],\n opts: Required<Pick<DiffOptions, \"ignoreDuration\" | \"durationThresholdMs\">>,\n out: RunDiffItem[],\n): void {\n const path = buildPath(segments);\n\n if (L.name !== R.name) {\n out.push({\n kind: \"structure\",\n severity: \"warning\",\n message: \"Step name differs\",\n path,\n left: L.name,\n right: R.name,\n });\n }\n\n if ((L.type ?? \"\") !== (R.type ?? \"\")) {\n out.push({\n kind: \"step-type\",\n severity: \"warning\",\n message: \"Step type differs\",\n path,\n left: L.type,\n right: R.type,\n });\n }\n\n if ((L.status ?? \"\") !== (R.status ?? \"\")) {\n out.push({\n kind: \"step-status\",\n severity: \"warning\",\n message: \"Step status differs\",\n path,\n left: L.status,\n right: R.status,\n });\n }\n\n const le = L.error ?? \"\";\n const re = R.error ?? \"\";\n if (le !== re) {\n out.push({\n kind: \"error\",\n severity: \"error\",\n message: \"Step error message differs\",\n path,\n left: le || undefined,\n right: re || undefined,\n });\n }\n\n if (!opts.ignoreDuration) {\n const ld = L.durationMs;\n const rd = R.durationMs;\n const th = opts.durationThresholdMs;\n let differs = false;\n if (ld === undefined && rd === undefined) differs = false;\n else if (ld === undefined || rd === undefined) differs = true;\n else differs = Math.abs(ld - rd) > th;\n if (differs) {\n out.push({\n kind: \"duration\",\n severity: \"info\",\n message: \"Step duration differs\",\n path,\n left: ld,\n right: rd,\n });\n }\n }\n\n const lm = stableJson(L.metadata ?? {});\n const rm = stableJson(R.metadata ?? {});\n if (lm !== rm) {\n out.push({\n kind: \"metadata\",\n severity: \"info\",\n message: \"Step metadata differs\",\n path,\n left: L.metadata,\n right: R.metadata,\n });\n }\n\n const lo = stableJson(L.outputPreview ?? null);\n const ro = stableJson(R.outputPreview ?? null);\n if (lo !== ro) {\n out.push({\n kind: \"output\",\n severity: \"info\",\n message: \"Output preview differs\",\n path,\n left: L.outputPreview,\n right: R.outputPreview,\n });\n }\n}\n\nfunction compareRecursive(\n L: StepComparable,\n R: StepComparable,\n segments: DiffPathSegment[],\n opts: Required<Pick<DiffOptions, \"ignoreDuration\" | \"durationThresholdMs\">>,\n out: RunDiffItem[],\n): void {\n compareLeafSteps(L, R, segments, opts, out);\n\n const pairs = pairSteps(L.children, R.children);\n let ci = 0;\n for (const [lch, rch] of pairs) {\n if (lch !== undefined && rch !== undefined) {\n compareRecursive(lch, rch, [...segments, pathSeg(lch, ci)], opts, out);\n } else if (lch !== undefined) {\n out.push({\n kind: \"step-removed\",\n severity: \"warning\",\n message: `Step only in left run: ${lch.name}`,\n path: buildPath([...segments, pathSeg(lch, ci)]),\n left: lch.id,\n right: undefined,\n });\n } else if (rch !== undefined) {\n out.push({\n kind: \"step-added\",\n severity: \"warning\",\n message: `Step only in right run: ${rch.name}`,\n path: buildPath([...segments, pathSeg(rch, ci)]),\n left: undefined,\n right: rch.id,\n });\n }\n ci += 1;\n }\n}\n\nfunction mergeDiffDefaults(options?: DiffOptions): Required<\n Pick<DiffOptions, \"ignoreDuration\" | \"durationThresholdMs\" | \"focus\" | \"check\">\n> {\n return {\n ignoreDuration: options?.ignoreDuration ?? false,\n durationThresholdMs:\n options?.durationThresholdMs !== undefined\n ? options.durationThresholdMs\n : DEFAULT_THRESHOLD_MS,\n focus: options?.focus ?? \"all\",\n check: options?.check ?? \"all\",\n };\n}\n\nfunction kindMatchesFilter(kind: DiffKind, merged: ReturnType<typeof mergeDiffDefaults>): boolean {\n const { focus, check } = merged;\n\n if (check !== \"all\") {\n if (check === \"structure\") {\n if (![\"step-added\", \"step-removed\", \"structure\", \"step-type\"].includes(kind)) return false;\n } else if (check === \"outputs\") {\n if (![\"metadata\", \"output\"].includes(kind)) return false;\n } else if (check === \"errors\") {\n if (![\"run-status\", \"step-status\", \"error\"].includes(kind)) return false;\n } else if (check === \"timing\") {\n if (kind !== \"duration\") return false;\n }\n }\n\n if (focus !== \"all\") {\n if (focus === \"errors\") {\n if (![\"run-status\", \"step-status\", \"error\"].includes(kind)) return false;\n } else if (focus === \"structure\") {\n if (![\"step-added\", \"step-removed\", \"structure\", \"step-type\"].includes(kind)) return false;\n } else if (focus === \"outputs\") {\n if (![\"metadata\", \"output\"].includes(kind)) return false;\n }\n }\n\n return true;\n}\n\nexport function diffRuns(\n left: RunComparable,\n right: RunComparable,\n options?: DiffOptions,\n): RunDiffResult {\n const merged = mergeDiffDefaults(options);\n const opts = {\n ignoreDuration: merged.ignoreDuration,\n durationThresholdMs: merged.durationThresholdMs,\n };\n\n const raw: RunDiffItem[] = [];\n\n if ((left.status ?? \"\") !== (right.status ?? \"\")) {\n raw.push({\n kind: \"run-status\",\n severity: \"warning\",\n message: \"Run completion status differs\",\n left: left.status,\n right: right.status,\n });\n }\n\n if (!merged.ignoreDuration) {\n const ld = left.durationMs;\n const rd = right.durationMs;\n const th = merged.durationThresholdMs;\n let differs = false;\n if (ld === undefined && rd === undefined) differs = false;\n else if (ld === undefined || rd === undefined) differs = true;\n else differs = Math.abs(ld - rd) > th;\n if (differs) {\n raw.push({\n kind: \"duration\",\n severity: \"info\",\n message: \"Run duration differs\",\n left: ld,\n right: rd,\n });\n }\n }\n\n const pairs = pairSteps(left.steps, right.steps);\n let idx = 0;\n for (const [ls, rs] of pairs) {\n if (ls !== undefined && rs !== undefined) {\n compareRecursive(ls, rs, [pathSeg(ls, idx)], opts, raw);\n idx += 1;\n } else if (ls !== undefined) {\n raw.push({\n kind: \"step-removed\",\n severity: \"warning\",\n message: `Step only in left run: ${ls.name}`,\n path: buildPath([pathSeg(ls, idx)]),\n left: ls.id,\n right: undefined,\n });\n idx += 1;\n } else if (rs !== undefined) {\n raw.push({\n kind: \"step-added\",\n severity: \"warning\",\n message: `Step only in right run: ${rs.name}`,\n path: buildPath([pathSeg(rs, idx)]),\n left: undefined,\n right: rs.id,\n });\n idx += 1;\n }\n }\n\n const differences = raw.filter((d) => kindMatchesFilter(d.kind, merged));\n\n let errors = 0;\n let warnings = 0;\n let info = 0;\n for (const d of differences) {\n if (d.severity === \"error\") errors += 1;\n else if (d.severity === \"warning\") warnings += 1;\n else info += 1;\n }\n\n const firstVisible = differences[0];\n const firstDivergence: RunDiffItem | undefined =\n firstVisible !== undefined\n ? {\n kind: \"first-divergence\",\n severity: firstVisible.severity,\n message: `First divergence: ${firstVisible.message}`,\n path: firstVisible.path,\n left: firstVisible.left,\n right: firstVisible.right,\n }\n : undefined;\n\n const summary: RunDiffSummary = {\n leftRunId: left.runId,\n rightRunId: right.runId,\n totalDifferences: differences.length,\n errors,\n warnings,\n info,\n firstDivergence,\n };\n\n return { summary, differences };\n}\n","import chalk from \"chalk\";\n\nimport type { RenderDiffOptions, RunDiffResult } from \"./types.js\";\n\nfunction formatPath(path?: import(\"./types.js\").DiffPath): string {\n if (path === undefined || path.path.length === 0) {\n return \"(run)\";\n }\n return path.path.map((s) => s.name).join(\" > \");\n}\n\nfunction formatValue(v: unknown, verbose: boolean): string {\n if (v === undefined) return \"(undefined)\";\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n const s = JSON.stringify(v);\n if (verbose || s.length <= 120) return s;\n return `${s.slice(0, 117)}...`;\n}\n\nexport function renderRunDiff(result: RunDiffResult, options?: RenderDiffOptions): string {\n const json = options?.json === true;\n const verbose = options?.verbose === true;\n const color = options?.color === true;\n\n if (json) {\n return JSON.stringify(result, null, 2);\n }\n\n const sev = (s: string, level: \"error\" | \"warning\" | \"info\"): string => {\n if (!color) return s;\n if (level === \"error\") return chalk.red(s);\n if (level === \"warning\") return chalk.yellow(s);\n return chalk.gray(s);\n };\n\n const lines: string[] = [];\n const { summary } = result;\n\n lines.push(\"Run diff\");\n lines.push(`Left: ${summary.leftRunId}`);\n lines.push(`Right: ${summary.rightRunId}`);\n lines.push(\"\");\n lines.push(\"Summary:\");\n lines.push(` Differences: ${summary.totalDifferences}`);\n lines.push(` Errors: ${summary.errors}`);\n lines.push(` Warnings: ${summary.warnings}`);\n lines.push(` Info: ${summary.info}`);\n lines.push(\"\");\n\n const fd = summary.firstDivergence;\n const firstKind = result.differences[0]?.kind;\n if (fd !== undefined) {\n lines.push(\"First divergence:\");\n const where = formatPath(fd.path);\n const displayKind = firstKind ?? fd.kind;\n lines.push(` ${displayKind} at ${where}`);\n if (fd.left !== undefined || fd.right !== undefined) {\n lines.push(` left: ${formatValue(fd.left, verbose)}`);\n lines.push(` right: ${formatValue(fd.right, verbose)}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"Differences:\");\n if (result.differences.length === 0) {\n lines.push(\" (none)\");\n return lines.join(\"\\n\");\n }\n\n const showSides = (kind: string): boolean =>\n verbose ||\n [\n \"run-status\",\n \"step-status\",\n \"error\",\n \"duration\",\n \"step-type\",\n \"structure\",\n \"step-added\",\n \"step-removed\",\n ].includes(kind);\n\n for (const d of result.differences) {\n const tag = sev(`[${d.severity}]`, d.severity);\n const pathStr = d.path !== undefined ? ` ${formatPath(d.path)}` : \"\";\n lines.push(` ${tag} ${d.kind}${pathStr}`);\n lines.push(` ${d.message}`);\n if (d.left !== undefined || d.right !== undefined) {\n if (showSides(d.kind)) {\n lines.push(` left: ${formatValue(d.left, verbose)}`);\n lines.push(` right: ${formatValue(d.right, verbose)}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n","import type { TraceEvent } from \"../types.js\";\n\nimport { manualTraceEventsToComparableRun } from \"./comparable.js\";\nimport { diffRuns } from \"./engine.js\";\nimport type { DiffOptions, RunDiffResult } from \"./types.js\";\n\nexport type {\n DiffSeverity,\n DiffKind,\n DiffPathSegment,\n DiffPath,\n RunDiffItem,\n StepComparable,\n RunComparable,\n RunDiffSummary,\n RunDiffResult,\n DiffOptions,\n RenderDiffOptions,\n} from \"./types.js\";\n\nexport { manualTraceEventsToComparableRun } from \"./comparable.js\";\nexport { diffRuns } from \"./engine.js\";\nexport { renderRunDiff } from \"./renderer.js\";\n\n/**\n * @experimental Compare two v0.1 manual traces as normalized trees (read-only).\n * Subject to refinement before a future stability declaration.\n */\nexport function diffTraceEvents(\n leftEvents: TraceEvent[],\n rightEvents: TraceEvent[],\n options?: DiffOptions,\n): RunDiffResult {\n const left = manualTraceEventsToComparableRun(leftEvents);\n const right = manualTraceEventsToComparableRun(rightEvents);\n return diffRuns(left, right, options);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"diff.mjs"}
|
|
@@ -17,6 +17,20 @@ type TraceCheckSeverity = "error" | "warning" | "info";
|
|
|
17
17
|
* evolve during the v1.x experimental period.
|
|
18
18
|
*/
|
|
19
19
|
type TraceCheckRuleCategory = "run" | "tool" | "llm" | "structure" | "baseline" | "safety" | "reader";
|
|
20
|
+
/**
|
|
21
|
+
* Experimental safety finding taxonomy (additive on `TraceCheckFinding`).
|
|
22
|
+
*
|
|
23
|
+
* Distinct from `TraceCheckRuleCategory` (which classifies rules, not findings).
|
|
24
|
+
*
|
|
25
|
+
* @experimental Available through `agent-inspect/checks`; see `docs/SAFETY-POLICY.md`.
|
|
26
|
+
*/
|
|
27
|
+
type SafetyFindingCategory = "credential" | "personal-data" | "identifier" | "raw-content" | "path" | "size" | "structure";
|
|
28
|
+
/**
|
|
29
|
+
* Experimental detector confidence for safety findings.
|
|
30
|
+
*
|
|
31
|
+
* @experimental Available through `agent-inspect/checks`; see `docs/SAFETY-POLICY.md`.
|
|
32
|
+
*/
|
|
33
|
+
type SafetyFindingConfidence = "high" | "medium" | "low";
|
|
20
34
|
/**
|
|
21
35
|
* Experimental trace-check finding status.
|
|
22
36
|
*
|
|
@@ -72,6 +86,30 @@ interface TraceCheckFinding {
|
|
|
72
86
|
expected?: unknown;
|
|
73
87
|
actual?: unknown;
|
|
74
88
|
evidence: TraceCheckEvidence[];
|
|
89
|
+
/**
|
|
90
|
+
* Additive safety taxonomy (6.9+). Omitted for non-safety / structural rules.
|
|
91
|
+
*
|
|
92
|
+
* @experimental
|
|
93
|
+
*/
|
|
94
|
+
category?: SafetyFindingCategory;
|
|
95
|
+
/**
|
|
96
|
+
* Additive detector confidence (6.9+).
|
|
97
|
+
*
|
|
98
|
+
* @experimental
|
|
99
|
+
*/
|
|
100
|
+
confidence?: SafetyFindingConfidence;
|
|
101
|
+
/**
|
|
102
|
+
* Detector id when known (rule id or redaction detector id).
|
|
103
|
+
*
|
|
104
|
+
* @experimental
|
|
105
|
+
*/
|
|
106
|
+
detector?: string;
|
|
107
|
+
/**
|
|
108
|
+
* Recommended remediation action (e.g. redact, review, keep).
|
|
109
|
+
*
|
|
110
|
+
* @experimental
|
|
111
|
+
*/
|
|
112
|
+
action?: string;
|
|
75
113
|
}
|
|
76
114
|
/**
|
|
77
115
|
* Experimental diagnostic emitted when check execution cannot complete normally.
|
|
@@ -350,6 +388,11 @@ interface SafetyRedactionRuleOptions {
|
|
|
350
388
|
*/
|
|
351
389
|
interface SafetyRawContentRuleOptions {
|
|
352
390
|
forbiddenKeys?: readonly string[];
|
|
391
|
+
/**
|
|
392
|
+
* Path prefixes (dot-separated, case-insensitive) whose terminal keys are
|
|
393
|
+
* treated as metrics rather than raw prompts (e.g. `tokenUsage`, `usage`).
|
|
394
|
+
*/
|
|
395
|
+
safePathPrefixes?: readonly string[];
|
|
353
396
|
includeSummaries?: boolean;
|
|
354
397
|
maxFindings?: number;
|
|
355
398
|
}
|
|
@@ -615,4 +658,4 @@ declare function createObservedOutcomeRule(options?: ObservedOutcomeRuleOptions)
|
|
|
615
658
|
*/
|
|
616
659
|
declare function runTraceChecks(input: TraceCheckInput, options?: RunTraceChecksOptions): TraceCheckResult;
|
|
617
660
|
|
|
618
|
-
export {
|
|
661
|
+
export { createRunStatusRule as $, type TraceCheckFindingStatus as A, type BaselineRegressionRuleOptions as B, type TraceCheckRule as C, type DecisionRuleOptions as D, type TraceCheckRuleCategory as E, type TraceCheckSeverity as F, type GuardrailRuleOptions as G, type TraceCheckStatus as H, type TraceCheckSummary as I, type TraceSignalRuleOptions as J, createBaselineRegressionRule as K, type LlmUsageRuleOptions as L, type MaxStepDurationRuleOptions as M, createDecisionRule as N, type ObservedOutcomeRuleOptions as O, createGuardrailRule as P, createLlmUsageRule as Q, type RetrievalRuleOptions as R, type SafetyFindingCategory as S, type TraceCheckInput as T, createMaxStepDurationRule as U, createObservedOutcomeRule as V, createRequireCompletedRule as W, createRetrievalRule as X, createRunDepthRule as Y, createRunDurationRule as Z, createRunEventCountRule as _, type TraceCheckResult as a, createSafetyOversizedAttributeRule as a0, createSafetyRawContentRule as a1, createSafetyRedactionRule as a2, createSafetySecretPatternRule as a3, createStallDetectionRule as a4, createStructureCycleRule as a5, createStructureIncompleteRule as a6, createStructureOrphanRule as a7, createStructureParallelWidthRule as a8, createStructureRelationshipRule as a9, createToolFailureRule as aa, createToolOrderingRule as ab, createToolUsageRule as ac, runTraceChecks as ad, type RunDepthRuleOptions as b, type RunDurationRuleOptions as c, type RunEventCountRuleOptions as d, type RunStatusRuleOptions as e, type RunTraceChecksOptions as f, type SafetyFindingConfidence as g, type SafetyOversizedAttributeRuleOptions as h, type SafetyRawContentRuleOptions as i, type SafetyRedactionRuleOptions as j, type SafetySecretPattern as k, type SafetySecretPatternRuleOptions as l, type StallDetectionRuleOptions as m, type StructureIncompleteRuleOptions as n, type StructureOrphanRuleOptions as o, type StructureParallelWidthRuleOptions as p, type StructureRelationshipRuleOptions as q, type ToolFailureRuleOptions as r, type ToolOrderingRuleOptions as s, type ToolUsageRuleOptions as t, type TraceCheckContext as u, type TraceCheckDiagnostic as v, type TraceCheckDiagnosticCode as w, type TraceCheckEvidence as x, type TraceCheckFacts as y, type TraceCheckFinding as z };
|