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.
Files changed (41) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/docs/BUNDLES.md +31 -9
  4. package/docs/CI-ARTIFACTS.md +10 -1
  5. package/docs/CLI.md +20 -4
  6. package/package.json +1 -1
  7. package/packages/cli/dist/{chunk-TO4VENHV.mjs → chunk-36IJ76LH.mjs} +1857 -158
  8. package/packages/cli/dist/chunk-36IJ76LH.mjs.map +1 -0
  9. package/packages/cli/dist/index.cjs +10764 -8877
  10. package/packages/cli/dist/index.cjs.map +1 -1
  11. package/packages/cli/dist/index.mjs +825 -754
  12. package/packages/cli/dist/index.mjs.map +1 -1
  13. package/packages/cli/dist/{src-Z5W27YCW.mjs → src-YFN3Q3GP.mjs} +3 -3
  14. package/packages/cli/dist/{src-Z5W27YCW.mjs.map → src-YFN3Q3GP.mjs.map} +1 -1
  15. package/packages/core/dist/advanced.cjs +1718 -18
  16. package/packages/core/dist/advanced.cjs.map +1 -1
  17. package/packages/core/dist/advanced.d.cts +338 -4
  18. package/packages/core/dist/advanced.d.ts +338 -4
  19. package/packages/core/dist/advanced.mjs +1166 -12
  20. package/packages/core/dist/advanced.mjs.map +1 -1
  21. package/packages/core/dist/checks.cjs +105 -14
  22. package/packages/core/dist/checks.cjs.map +1 -1
  23. package/packages/core/dist/checks.d.cts +2 -2
  24. package/packages/core/dist/checks.d.ts +2 -2
  25. package/packages/core/dist/checks.mjs +1 -1
  26. package/packages/core/dist/chunk-F7STQ5JF.mjs +479 -0
  27. package/packages/core/dist/chunk-F7STQ5JF.mjs.map +1 -0
  28. package/packages/core/dist/{chunk-EQVXDGGU.mjs → chunk-QT6CQ2XA.mjs} +107 -16
  29. package/packages/core/dist/chunk-QT6CQ2XA.mjs.map +1 -0
  30. package/packages/core/dist/diff.mjs +3 -477
  31. package/packages/core/dist/diff.mjs.map +1 -1
  32. package/packages/core/dist/{index-BblJEdYZ.d.ts → index-BO7l0iAe.d.ts} +44 -1
  33. package/packages/core/dist/{index-DyKk7iR9.d.cts → index-mdFcxSOR.d.cts} +44 -1
  34. package/packages/core/dist/reporters.cjs +25 -0
  35. package/packages/core/dist/reporters.cjs.map +1 -1
  36. package/packages/core/dist/reporters.d.cts +16 -2
  37. package/packages/core/dist/reporters.d.ts +16 -2
  38. package/packages/core/dist/reporters.mjs +24 -1
  39. package/packages/core/dist/reporters.mjs.map +1 -1
  40. package/packages/cli/dist/chunk-TO4VENHV.mjs.map +0 -1
  41. package/packages/core/dist/chunk-EQVXDGGU.mjs.map +0 -1
@@ -1,479 +1,5 @@
1
- import { source_default } from './chunk-BT7CATSD.mjs';
2
- import { stableJson } from './chunk-CAWPF22J.mjs';
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 { createSafetyRawContentRule as $, type TraceCheckRuleCategory as A, type BaselineRegressionRuleOptions as B, type TraceCheckSeverity as C, type DecisionRuleOptions as D, type TraceCheckStatus as E, type TraceCheckSummary as F, type GuardrailRuleOptions as G, type TraceSignalRuleOptions as H, createBaselineRegressionRule as I, createDecisionRule as J, createGuardrailRule as K, type LlmUsageRuleOptions as L, type MaxStepDurationRuleOptions as M, createLlmUsageRule as N, type ObservedOutcomeRuleOptions as O, createMaxStepDurationRule as P, createObservedOutcomeRule as Q, type RetrievalRuleOptions as R, type SafetyOversizedAttributeRuleOptions as S, type TraceCheckInput as T, createRequireCompletedRule as U, createRetrievalRule as V, createRunDepthRule as W, createRunDurationRule as X, createRunEventCountRule as Y, createRunStatusRule as Z, createSafetyOversizedAttributeRule as _, type TraceCheckResult as a, createSafetyRedactionRule as a0, createSafetySecretPatternRule as a1, createStallDetectionRule as a2, createStructureCycleRule as a3, createStructureIncompleteRule as a4, createStructureOrphanRule as a5, createStructureParallelWidthRule as a6, createStructureRelationshipRule as a7, createToolFailureRule as a8, createToolOrderingRule as a9, createToolUsageRule as aa, runTraceChecks as ab, type RunDepthRuleOptions as b, type RunDurationRuleOptions as c, type RunEventCountRuleOptions as d, type RunStatusRuleOptions as e, type RunTraceChecksOptions as f, type SafetyRawContentRuleOptions as g, type SafetyRedactionRuleOptions as h, type SafetySecretPattern as i, type SafetySecretPatternRuleOptions as j, type StallDetectionRuleOptions as k, type StructureIncompleteRuleOptions as l, type StructureOrphanRuleOptions as m, type StructureParallelWidthRuleOptions as n, type StructureRelationshipRuleOptions as o, type ToolFailureRuleOptions as p, type ToolOrderingRuleOptions as q, type ToolUsageRuleOptions as r, type TraceCheckContext as s, type TraceCheckDiagnostic as t, type TraceCheckDiagnosticCode as u, type TraceCheckEvidence as v, type TraceCheckFacts as w, type TraceCheckFinding as x, type TraceCheckFindingStatus as y, type TraceCheckRule as z };
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 };