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.
- package/CHANGELOG.md +6 -0
- package/docs/API.md +3 -0
- package/docs/CLI.md +3 -0
- package/docs/SCHEMA.md +27 -1
- package/package.json +1 -1
- package/packages/cli/dist/{chunk-BS5LSKZ3.mjs → chunk-ORHDQUT6.mjs} +198 -7
- package/packages/cli/dist/chunk-ORHDQUT6.mjs.map +1 -0
- package/packages/cli/dist/index.cjs +409 -17
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +176 -10
- package/packages/cli/dist/index.mjs.map +1 -1
- package/packages/cli/dist/{src-YFMPWEIS.mjs → src-FJOHPC4X.mjs} +3 -3
- package/packages/cli/dist/{src-YFMPWEIS.mjs.map → src-FJOHPC4X.mjs.map} +1 -1
- package/packages/core/dist/advanced.cjs +201 -9
- package/packages/core/dist/advanced.cjs.map +1 -1
- package/packages/core/dist/advanced.d.cts +12 -8
- package/packages/core/dist/advanced.d.ts +12 -8
- package/packages/core/dist/advanced.mjs +30 -13
- package/packages/core/dist/advanced.mjs.map +1 -1
- package/packages/core/dist/checks.cjs +117 -18
- package/packages/core/dist/checks.cjs.map +1 -1
- package/packages/core/dist/checks.d.cts +11 -3
- package/packages/core/dist/checks.d.ts +11 -3
- package/packages/core/dist/checks.mjs +42 -1
- package/packages/core/dist/checks.mjs.map +1 -1
- package/packages/core/dist/{chunk-2ZXEMWGK.mjs → chunk-3USJVBLA.mjs} +3 -3
- package/packages/core/dist/{chunk-2ZXEMWGK.mjs.map → chunk-3USJVBLA.mjs.map} +1 -1
- package/packages/core/dist/{chunk-HY7H3CQM.mjs → chunk-CAWPF22J.mjs} +4 -3
- package/packages/core/dist/chunk-CAWPF22J.mjs.map +1 -0
- package/packages/core/dist/{chunk-XUNJMAPD.mjs → chunk-KNYL56KZ.mjs} +38 -3
- package/packages/core/dist/chunk-KNYL56KZ.mjs.map +1 -0
- package/packages/core/dist/{chunk-IZBJAZGF.mjs → chunk-P366CCL2.mjs} +34 -3
- package/packages/core/dist/chunk-P366CCL2.mjs.map +1 -0
- package/packages/core/dist/{chunk-4JVGFNQH.mjs → chunk-ULCGIRTC.mjs} +95 -8
- package/packages/core/dist/chunk-ULCGIRTC.mjs.map +1 -0
- package/packages/core/dist/chunk-VFO76UH3.mjs +228 -0
- package/packages/core/dist/chunk-VFO76UH3.mjs.map +1 -0
- package/packages/core/dist/{chunk-NQZPZ2FN.mjs → chunk-WRE4CNPF.mjs} +6 -3
- package/packages/core/dist/chunk-WRE4CNPF.mjs.map +1 -0
- package/packages/core/dist/{chunk-A4V2H3YU.mjs → chunk-ZWA5RWMV.mjs} +40 -4
- package/packages/core/dist/chunk-ZWA5RWMV.mjs.map +1 -0
- package/packages/core/dist/{context-DjY-jvQk.d.cts → context-BbfkMYjz.d.cts} +5 -3
- package/packages/core/dist/{context-BDZmi53V.d.ts → context-Cp8NRbBX.d.ts} +5 -3
- package/packages/core/dist/diff.cjs.map +1 -1
- package/packages/core/dist/diff.d.cts +3 -3
- package/packages/core/dist/diff.d.ts +3 -3
- package/packages/core/dist/diff.mjs +1 -1
- package/packages/core/dist/exporters.cjs +137 -1
- package/packages/core/dist/exporters.cjs.map +1 -1
- package/packages/core/dist/exporters.d.cts +6 -3
- package/packages/core/dist/exporters.d.ts +6 -3
- package/packages/core/dist/exporters.mjs +71 -6
- package/packages/core/dist/exporters.mjs.map +1 -1
- package/packages/core/dist/index.cjs +181 -6
- package/packages/core/dist/index.cjs.map +1 -1
- package/packages/core/dist/index.d.cts +14 -7
- package/packages/core/dist/index.d.ts +14 -7
- package/packages/core/dist/index.mjs +51 -7
- package/packages/core/dist/index.mjs.map +1 -1
- package/packages/core/dist/{inspect-event-CYAV7Hxm.d.cts → inspect-event-IqwOHbGo.d.cts} +1 -1
- package/packages/core/dist/{inspect-event-CYAV7Hxm.d.ts → inspect-event-IqwOHbGo.d.ts} +1 -1
- package/packages/core/dist/{log-config-BNQ9UTmP.d.cts → log-config-CW8w5YQ9.d.cts} +1 -1
- package/packages/core/dist/{log-config-D3Yp1SZN.d.ts → log-config-SRA4xTp8.d.ts} +1 -1
- package/packages/core/dist/logs.d.cts +3 -3
- package/packages/core/dist/logs.d.ts +3 -3
- package/packages/core/dist/{persisted-inspect-event-BLvb0jSX.d.ts → persisted-inspect-event-DruwqARZ.d.ts} +1 -1
- package/packages/core/dist/{persisted-inspect-event-D5SjBz9b.d.cts → persisted-inspect-event-Gd-W8vB7.d.cts} +1 -1
- package/packages/core/dist/persisted.cjs +67 -1
- package/packages/core/dist/persisted.cjs.map +1 -1
- package/packages/core/dist/persisted.d.cts +5 -5
- package/packages/core/dist/persisted.d.ts +5 -5
- package/packages/core/dist/persisted.mjs +3 -3
- package/packages/core/dist/readers.cjs +72 -3
- package/packages/core/dist/readers.cjs.map +1 -1
- package/packages/core/dist/readers.d.cts +2 -2
- package/packages/core/dist/readers.d.ts +2 -2
- package/packages/core/dist/readers.mjs +5 -5
- package/packages/core/dist/readers.mjs.map +1 -1
- package/packages/core/dist/{types-CQun9LW6.d.ts → types-B1X87dUW.d.cts} +16 -2
- package/packages/core/dist/{types-C-llnPH0.d.cts → types-BVkjSd0q.d.ts} +16 -2
- package/packages/core/dist/types-CvsKGweN.d.cts +12 -0
- package/packages/core/dist/types-CvsKGweN.d.ts +12 -0
- package/packages/core/dist/writers.cjs +2 -1
- package/packages/core/dist/writers.cjs.map +1 -1
- package/packages/core/dist/writers.d.cts +2 -2
- package/packages/core/dist/writers.d.ts +2 -2
- package/packages/core/dist/writers.mjs +3 -4
- package/packages/core/dist/writers.mjs.map +1 -1
- package/packages/cli/dist/chunk-BS5LSKZ3.mjs.map +0 -1
- package/packages/core/dist/chunk-4JVGFNQH.mjs.map +0 -1
- package/packages/core/dist/chunk-A4V2H3YU.mjs.map +0 -1
- package/packages/core/dist/chunk-EDTQHZPM.mjs +0 -88
- package/packages/core/dist/chunk-EDTQHZPM.mjs.map +0 -1
- package/packages/core/dist/chunk-HY7H3CQM.mjs.map +0 -1
- package/packages/core/dist/chunk-IZBJAZGF.mjs.map +0 -1
- package/packages/core/dist/chunk-NQZPZ2FN.mjs.map +0 -1
- 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,
|
|
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
|
-
...
|
|
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(
|
|
355
|
-
const parts =
|
|
356
|
-
return parts[parts.length - 1] ??
|
|
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,
|
|
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, `${
|
|
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
|
-
`${
|
|
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,
|
|
467
|
-
lines.push(`${
|
|
468
|
-
node.children.forEach((child, index) => visit(child, `${
|
|
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,
|
|
581
|
+
function firstEvidenceForKind(context, kind, path3) {
|
|
518
582
|
const event = context.events.find((candidate) => candidate.kind === kind);
|
|
519
|
-
return event ? [eventEvidence(event,
|
|
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
|
|
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 =
|
|
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,
|
|
1033
|
-
|
|
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;
|