agent-inspect 4.3.0 → 4.4.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 (97) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/docs/API.md +3 -0
  3. package/docs/CLI.md +3 -0
  4. package/docs/SCHEMA.md +27 -1
  5. package/package.json +1 -1
  6. package/packages/cli/dist/{chunk-BS5LSKZ3.mjs → chunk-ORHDQUT6.mjs} +198 -7
  7. package/packages/cli/dist/chunk-ORHDQUT6.mjs.map +1 -0
  8. package/packages/cli/dist/index.cjs +409 -17
  9. package/packages/cli/dist/index.cjs.map +1 -1
  10. package/packages/cli/dist/index.mjs +176 -10
  11. package/packages/cli/dist/index.mjs.map +1 -1
  12. package/packages/cli/dist/{src-YFMPWEIS.mjs → src-FJOHPC4X.mjs} +3 -3
  13. package/packages/cli/dist/{src-YFMPWEIS.mjs.map → src-FJOHPC4X.mjs.map} +1 -1
  14. package/packages/core/dist/advanced.cjs +201 -9
  15. package/packages/core/dist/advanced.cjs.map +1 -1
  16. package/packages/core/dist/advanced.d.cts +12 -8
  17. package/packages/core/dist/advanced.d.ts +12 -8
  18. package/packages/core/dist/advanced.mjs +30 -13
  19. package/packages/core/dist/advanced.mjs.map +1 -1
  20. package/packages/core/dist/checks.cjs +117 -18
  21. package/packages/core/dist/checks.cjs.map +1 -1
  22. package/packages/core/dist/checks.d.cts +11 -3
  23. package/packages/core/dist/checks.d.ts +11 -3
  24. package/packages/core/dist/checks.mjs +42 -1
  25. package/packages/core/dist/checks.mjs.map +1 -1
  26. package/packages/core/dist/{chunk-2ZXEMWGK.mjs → chunk-3USJVBLA.mjs} +3 -3
  27. package/packages/core/dist/{chunk-2ZXEMWGK.mjs.map → chunk-3USJVBLA.mjs.map} +1 -1
  28. package/packages/core/dist/{chunk-HY7H3CQM.mjs → chunk-CAWPF22J.mjs} +4 -3
  29. package/packages/core/dist/chunk-CAWPF22J.mjs.map +1 -0
  30. package/packages/core/dist/{chunk-XUNJMAPD.mjs → chunk-KNYL56KZ.mjs} +38 -3
  31. package/packages/core/dist/chunk-KNYL56KZ.mjs.map +1 -0
  32. package/packages/core/dist/{chunk-IZBJAZGF.mjs → chunk-P366CCL2.mjs} +34 -3
  33. package/packages/core/dist/chunk-P366CCL2.mjs.map +1 -0
  34. package/packages/core/dist/{chunk-4JVGFNQH.mjs → chunk-ULCGIRTC.mjs} +95 -8
  35. package/packages/core/dist/chunk-ULCGIRTC.mjs.map +1 -0
  36. package/packages/core/dist/chunk-VFO76UH3.mjs +228 -0
  37. package/packages/core/dist/chunk-VFO76UH3.mjs.map +1 -0
  38. package/packages/core/dist/{chunk-NQZPZ2FN.mjs → chunk-WRE4CNPF.mjs} +6 -3
  39. package/packages/core/dist/chunk-WRE4CNPF.mjs.map +1 -0
  40. package/packages/core/dist/{chunk-A4V2H3YU.mjs → chunk-ZWA5RWMV.mjs} +40 -4
  41. package/packages/core/dist/chunk-ZWA5RWMV.mjs.map +1 -0
  42. package/packages/core/dist/{context-DjY-jvQk.d.cts → context-BbfkMYjz.d.cts} +5 -3
  43. package/packages/core/dist/{context-BDZmi53V.d.ts → context-Cp8NRbBX.d.ts} +5 -3
  44. package/packages/core/dist/diff.cjs.map +1 -1
  45. package/packages/core/dist/diff.d.cts +3 -3
  46. package/packages/core/dist/diff.d.ts +3 -3
  47. package/packages/core/dist/diff.mjs +1 -1
  48. package/packages/core/dist/exporters.cjs +137 -1
  49. package/packages/core/dist/exporters.cjs.map +1 -1
  50. package/packages/core/dist/exporters.d.cts +6 -3
  51. package/packages/core/dist/exporters.d.ts +6 -3
  52. package/packages/core/dist/exporters.mjs +71 -6
  53. package/packages/core/dist/exporters.mjs.map +1 -1
  54. package/packages/core/dist/index.cjs +181 -6
  55. package/packages/core/dist/index.cjs.map +1 -1
  56. package/packages/core/dist/index.d.cts +14 -7
  57. package/packages/core/dist/index.d.ts +14 -7
  58. package/packages/core/dist/index.mjs +51 -7
  59. package/packages/core/dist/index.mjs.map +1 -1
  60. package/packages/core/dist/{inspect-event-CYAV7Hxm.d.cts → inspect-event-IqwOHbGo.d.cts} +1 -1
  61. package/packages/core/dist/{inspect-event-CYAV7Hxm.d.ts → inspect-event-IqwOHbGo.d.ts} +1 -1
  62. package/packages/core/dist/{log-config-BNQ9UTmP.d.cts → log-config-CW8w5YQ9.d.cts} +1 -1
  63. package/packages/core/dist/{log-config-D3Yp1SZN.d.ts → log-config-SRA4xTp8.d.ts} +1 -1
  64. package/packages/core/dist/logs.d.cts +3 -3
  65. package/packages/core/dist/logs.d.ts +3 -3
  66. package/packages/core/dist/{persisted-inspect-event-BLvb0jSX.d.ts → persisted-inspect-event-DruwqARZ.d.ts} +1 -1
  67. package/packages/core/dist/{persisted-inspect-event-D5SjBz9b.d.cts → persisted-inspect-event-Gd-W8vB7.d.cts} +1 -1
  68. package/packages/core/dist/persisted.cjs +67 -1
  69. package/packages/core/dist/persisted.cjs.map +1 -1
  70. package/packages/core/dist/persisted.d.cts +5 -5
  71. package/packages/core/dist/persisted.d.ts +5 -5
  72. package/packages/core/dist/persisted.mjs +3 -3
  73. package/packages/core/dist/readers.cjs +72 -3
  74. package/packages/core/dist/readers.cjs.map +1 -1
  75. package/packages/core/dist/readers.d.cts +2 -2
  76. package/packages/core/dist/readers.d.ts +2 -2
  77. package/packages/core/dist/readers.mjs +5 -5
  78. package/packages/core/dist/readers.mjs.map +1 -1
  79. package/packages/core/dist/{types-CQun9LW6.d.ts → types-B1X87dUW.d.cts} +16 -2
  80. package/packages/core/dist/{types-C-llnPH0.d.cts → types-BVkjSd0q.d.ts} +16 -2
  81. package/packages/core/dist/types-CvsKGweN.d.cts +12 -0
  82. package/packages/core/dist/types-CvsKGweN.d.ts +12 -0
  83. package/packages/core/dist/writers.cjs +2 -1
  84. package/packages/core/dist/writers.cjs.map +1 -1
  85. package/packages/core/dist/writers.d.cts +2 -2
  86. package/packages/core/dist/writers.d.ts +2 -2
  87. package/packages/core/dist/writers.mjs +3 -4
  88. package/packages/core/dist/writers.mjs.map +1 -1
  89. package/packages/cli/dist/chunk-BS5LSKZ3.mjs.map +0 -1
  90. package/packages/core/dist/chunk-4JVGFNQH.mjs.map +0 -1
  91. package/packages/core/dist/chunk-A4V2H3YU.mjs.map +0 -1
  92. package/packages/core/dist/chunk-EDTQHZPM.mjs +0 -88
  93. package/packages/core/dist/chunk-EDTQHZPM.mjs.map +0 -1
  94. package/packages/core/dist/chunk-HY7H3CQM.mjs.map +0 -1
  95. package/packages/core/dist/chunk-IZBJAZGF.mjs.map +0 -1
  96. package/packages/core/dist/chunk-NQZPZ2FN.mjs.map +0 -1
  97. package/packages/core/dist/chunk-XUNJMAPD.mjs.map +0 -1
@@ -1,5 +1,69 @@
1
1
  'use strict';
2
2
 
3
+ require('crypto');
4
+ require('fs/promises');
5
+ var path = require('path');
6
+ var os = require('os');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var path__default = /*#__PURE__*/_interopDefault(path);
11
+ var os__default = /*#__PURE__*/_interopDefault(os);
12
+
13
+ // packages/core/src/outcomes/types.ts
14
+ var OUTCOME_ATTRIBUTE_STATUS_KEY = "outcomeStatus";
15
+ var OUTCOME_ATTRIBUTE_EXPECTATION_KEY = "expectation";
16
+ var OUTCOME_ATTRIBUTE_METHOD_KEY = "method";
17
+ var OUTCOME_ATTRIBUTE_OBSERVED_AT_KEY = "observedAt";
18
+ var RUNS_DIR_NAME = "runs";
19
+ path__default.default.join(
20
+ os__default.default.tmpdir(),
21
+ "agent-inspect",
22
+ RUNS_DIR_NAME
23
+ );
24
+
25
+ // packages/core/src/outcomes/extract.ts
26
+ function isOutcomeStatus(value) {
27
+ return value === "passed" || value === "failed" || value === "unknown" || value === "skipped";
28
+ }
29
+ function parseMethod(value) {
30
+ if (typeof value !== "string" || value.trim() === "") return void 0;
31
+ return value;
32
+ }
33
+ function fromPersistedOutcome(event) {
34
+ if (event.kind !== "OUTCOME") return void 0;
35
+ const attrs = event.attributes ?? {};
36
+ const statusRaw = attrs[OUTCOME_ATTRIBUTE_STATUS_KEY];
37
+ if (!isOutcomeStatus(statusRaw)) return void 0;
38
+ const expectation = typeof attrs[OUTCOME_ATTRIBUTE_EXPECTATION_KEY] === "string" ? attrs[OUTCOME_ATTRIBUTE_EXPECTATION_KEY] : event.name;
39
+ const observedAtRaw = attrs[OUTCOME_ATTRIBUTE_OBSERVED_AT_KEY];
40
+ const observedAt = typeof observedAtRaw === "string" ? Date.parse(observedAtRaw) : typeof observedAtRaw === "number" && Number.isFinite(observedAtRaw) ? observedAtRaw : Date.parse(event.timestamp);
41
+ return {
42
+ outcomeId: event.eventId,
43
+ runId: event.runId,
44
+ ...event.parentId !== void 0 ? { parentId: event.parentId } : {},
45
+ name: event.name,
46
+ expectation,
47
+ status: statusRaw,
48
+ ...parseMethod(attrs[OUTCOME_ATTRIBUTE_METHOD_KEY]) !== void 0 ? { method: parseMethod(attrs[OUTCOME_ATTRIBUTE_METHOD_KEY]) } : {},
49
+ ...event.outputSummary !== void 0 ? { actual: event.outputSummary } : {},
50
+ ...attrs.evidence !== void 0 ? { evidence: attrs.evidence } : {},
51
+ observedAt: Number.isFinite(observedAt) ? observedAt : Date.parse(event.timestamp)
52
+ };
53
+ }
54
+ function extractOutcomesFromPersistedEvents(events) {
55
+ const out = [];
56
+ for (const event of events) {
57
+ const outcome = fromPersistedOutcome(event);
58
+ if (outcome) out.push(outcome);
59
+ }
60
+ return out.sort((a, b) => a.observedAt - b.observedAt || a.name.localeCompare(b.name));
61
+ }
62
+ function outcomesMatchingStatus(outcomes, statuses) {
63
+ const set = new Set(statuses);
64
+ return outcomes.filter((outcome) => set.has(outcome.status));
65
+ }
66
+
3
67
  // packages/core/src/checks/index.ts
4
68
  var SEVERITY_RANK = {
5
69
  error: 0,
@@ -267,7 +331,7 @@ function stripPrefix(name, prefixes) {
267
331
  }
268
332
  return name;
269
333
  }
270
- function eventEvidence(event, path) {
334
+ function eventEvidence(event, path3) {
271
335
  return {
272
336
  runId: event.runId,
273
337
  eventId: event.eventId,
@@ -277,7 +341,7 @@ function eventEvidence(event, path) {
277
341
  kind: event.kind,
278
342
  name: event.name,
279
343
  status: event.status,
280
- ...path ? { path } : {}
344
+ ...path3 ? { path: path3 } : {}
281
345
  };
282
346
  }
283
347
  function runEvidence(run) {
@@ -351,9 +415,9 @@ function sortedStrings(values) {
351
415
  function normalizedKey(value) {
352
416
  return value.toLowerCase().replace(/[^a-z0-9_]/g, "");
353
417
  }
354
- function lastPathSegment(path) {
355
- const parts = path.split(".");
356
- return parts[parts.length - 1] ?? path;
418
+ function lastPathSegment(path3) {
419
+ const parts = path3.split(".");
420
+ return parts[parts.length - 1] ?? path3;
357
421
  }
358
422
  function valueType(value) {
359
423
  if (Array.isArray(value)) return "array";
@@ -367,12 +431,12 @@ function serializedByteLength(value) {
367
431
  return void 0;
368
432
  }
369
433
  }
370
- function pushValueEntries(entries, event, value, path, key, depth = 0) {
371
- entries.push({ event, path, key, value });
434
+ function pushValueEntries(entries, event, value, path3, key, depth = 0) {
435
+ entries.push({ event, path: path3, key, value });
372
436
  if (depth >= 8) return;
373
437
  if (Array.isArray(value)) {
374
438
  for (const [index, item] of value.entries()) {
375
- pushValueEntries(entries, event, item, `${path}.${index}`, String(index), depth + 1);
439
+ pushValueEntries(entries, event, item, `${path3}.${index}`, String(index), depth + 1);
376
440
  }
377
441
  return;
378
442
  }
@@ -382,7 +446,7 @@ function pushValueEntries(entries, event, value, path, key, depth = 0) {
382
446
  entries,
383
447
  event,
384
448
  value[nestedKey],
385
- `${path}.${nestedKey}`,
449
+ `${path3}.${nestedKey}`,
386
450
  nestedKey,
387
451
  depth + 1
388
452
  );
@@ -463,9 +527,9 @@ function eventDurationMs(event) {
463
527
  }
464
528
  function treeShape(nodes) {
465
529
  const lines = [];
466
- const visit = (node, path) => {
467
- lines.push(`${path}:${node.event.kind}:${node.event.name}:${node.event.status ?? "unknown"}`);
468
- node.children.forEach((child, index) => visit(child, `${path}.${index}`));
530
+ const visit = (node, path3) => {
531
+ lines.push(`${path3}:${node.event.kind}:${node.event.name}:${node.event.status ?? "unknown"}`);
532
+ node.children.forEach((child, index) => visit(child, `${path3}.${index}`));
469
533
  };
470
534
  nodes.forEach((node, index) => visit(node, String(index)));
471
535
  return lines;
@@ -514,9 +578,9 @@ function retrievalShape(context) {
514
578
  function guardrailShape(context) {
515
579
  return guardrailEvents(context).map((event) => signalName(event, ["guardrailName", "guardrail", "guardrailId"], ["guardrail:"])).sort((a, b) => a.localeCompare(b));
516
580
  }
517
- function firstEvidenceForKind(context, kind, path) {
581
+ function firstEvidenceForKind(context, kind, path3) {
518
582
  const event = context.events.find((candidate) => candidate.kind === kind);
519
- return event ? [eventEvidence(event, path)] : runEvidence(context.selectedRun);
583
+ return event ? [eventEvidence(event, path3)] : runEvidence(context.selectedRun);
520
584
  }
521
585
  function baselineDiffFinding(message, evidence, expected, actual) {
522
586
  return failFinding("baseline.regression", message, evidence, expected, actual);
@@ -1007,13 +1071,13 @@ function createStructureCycleRule() {
1007
1071
  const seenCycles = /* @__PURE__ */ new Set();
1008
1072
  const findings = [];
1009
1073
  for (const event of [...context.events].sort((a, b) => a.eventId.localeCompare(b.eventId))) {
1010
- const path = [];
1074
+ const path3 = [];
1011
1075
  const seenAt = /* @__PURE__ */ new Map();
1012
1076
  let current = event;
1013
1077
  while (current) {
1014
1078
  const existing = seenAt.get(current.eventId);
1015
1079
  if (existing !== void 0) {
1016
- const cycle = path.slice(existing);
1080
+ const cycle = path3.slice(existing);
1017
1081
  const key = cycle.map((item) => item.eventId).sort().join("\0");
1018
1082
  if (!seenCycles.has(key)) {
1019
1083
  seenCycles.add(key);
@@ -1029,8 +1093,8 @@ function createStructureCycleRule() {
1029
1093
  }
1030
1094
  break;
1031
1095
  }
1032
- seenAt.set(current.eventId, path.length);
1033
- path.push(current);
1096
+ seenAt.set(current.eventId, path3.length);
1097
+ path3.push(current);
1034
1098
  current = current.parentId ? byId.get(current.parentId) : void 0;
1035
1099
  }
1036
1100
  }
@@ -1566,6 +1630,40 @@ function createBaselineRegressionRule(options) {
1566
1630
  }
1567
1631
  };
1568
1632
  }
1633
+ function createObservedOutcomeRule(options = {}) {
1634
+ const failOn = options.failOn ?? ["failed"];
1635
+ return {
1636
+ id: "outcome.status",
1637
+ category: "run",
1638
+ defaultSeverity: "error",
1639
+ evaluate(context) {
1640
+ const outcomes = extractOutcomesFromPersistedEvents(context.events);
1641
+ const matching = outcomesMatchingStatus(outcomes, failOn);
1642
+ if (matching.length === 0) return [];
1643
+ return [
1644
+ failFinding(
1645
+ "outcome.status",
1646
+ `Observed outcome count ${matching.length} matched [${failOn.join(", ")}].`,
1647
+ matching.map((outcome) => ({
1648
+ runId: outcome.runId,
1649
+ eventId: outcome.outcomeId,
1650
+ ...outcome.parentId !== void 0 ? { parentId: outcome.parentId } : {},
1651
+ kind: "OUTCOME",
1652
+ name: outcome.name,
1653
+ status: outcome.status,
1654
+ path: `outcome.${outcome.name}`
1655
+ })),
1656
+ { failOn },
1657
+ matching.map((outcome) => ({
1658
+ name: outcome.name,
1659
+ status: outcome.status,
1660
+ expectation: outcome.expectation
1661
+ }))
1662
+ )
1663
+ ];
1664
+ }
1665
+ };
1666
+ }
1569
1667
  function runTraceChecks(input, options = {}) {
1570
1668
  const selected = resolveSelectedRun(input, options.runId);
1571
1669
  if (selected.diagnostics.length > 0) {
@@ -1616,6 +1714,7 @@ exports.createDecisionRule = createDecisionRule;
1616
1714
  exports.createGuardrailRule = createGuardrailRule;
1617
1715
  exports.createLlmUsageRule = createLlmUsageRule;
1618
1716
  exports.createMaxStepDurationRule = createMaxStepDurationRule;
1717
+ exports.createObservedOutcomeRule = createObservedOutcomeRule;
1619
1718
  exports.createRequireCompletedRule = createRequireCompletedRule;
1620
1719
  exports.createRetrievalRule = createRetrievalRule;
1621
1720
  exports.createRunDepthRule = createRunDepthRule;