agent-inspect 6.31.8 → 6.31.10

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 (53) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/package.json +1 -1
  4. package/packages/cli/dist/{chunk-6FE47XSF.mjs → chunk-JCKC4ZRV.mjs} +212 -12
  5. package/packages/cli/dist/chunk-JCKC4ZRV.mjs.map +1 -0
  6. package/packages/cli/dist/index.cjs +215 -11
  7. package/packages/cli/dist/index.cjs.map +1 -1
  8. package/packages/cli/dist/index.mjs +4 -4
  9. package/packages/cli/dist/index.mjs.map +1 -1
  10. package/packages/cli/dist/{src-NXAYHG34.mjs → src-4UD7JNDR.mjs} +3 -3
  11. package/packages/cli/dist/{src-NXAYHG34.mjs.map → src-4UD7JNDR.mjs.map} +1 -1
  12. package/packages/core/dist/advanced.cjs +202 -15
  13. package/packages/core/dist/advanced.cjs.map +1 -1
  14. package/packages/core/dist/advanced.d.cts +1 -1
  15. package/packages/core/dist/advanced.d.ts +1 -1
  16. package/packages/core/dist/advanced.mjs +90 -15
  17. package/packages/core/dist/advanced.mjs.map +1 -1
  18. package/packages/core/dist/checks.cjs +79 -0
  19. package/packages/core/dist/checks.cjs.map +1 -1
  20. package/packages/core/dist/checks.d.cts +1 -1
  21. package/packages/core/dist/checks.d.ts +1 -1
  22. package/packages/core/dist/checks.mjs +3 -2
  23. package/packages/core/dist/{chunk-L5WLVBW4.mjs → chunk-AHUZNHFI.mjs} +4 -55
  24. package/packages/core/dist/chunk-AHUZNHFI.mjs.map +1 -0
  25. package/packages/core/dist/{chunk-2CCRUI42.mjs → chunk-CPQAOJW4.mjs} +72 -3
  26. package/packages/core/dist/chunk-CPQAOJW4.mjs.map +1 -0
  27. package/packages/core/dist/{chunk-2IRRUNIN.mjs → chunk-OAUNS5CS.mjs} +3 -3
  28. package/packages/core/dist/{chunk-2IRRUNIN.mjs.map → chunk-OAUNS5CS.mjs.map} +1 -1
  29. package/packages/core/dist/{chunk-IJJSPJXV.mjs → chunk-QOC3PJO3.mjs} +4 -4
  30. package/packages/core/dist/{chunk-IJJSPJXV.mjs.map → chunk-QOC3PJO3.mjs.map} +1 -1
  31. package/packages/core/dist/chunk-S6LQBLX5.mjs +67 -0
  32. package/packages/core/dist/chunk-S6LQBLX5.mjs.map +1 -0
  33. package/packages/core/dist/{chunk-VQUB3WRI.mjs → chunk-SSG3ICI4.mjs} +28 -3
  34. package/packages/core/dist/chunk-SSG3ICI4.mjs.map +1 -0
  35. package/packages/core/dist/index.cjs +89 -1
  36. package/packages/core/dist/index.cjs.map +1 -1
  37. package/packages/core/dist/index.mjs +3 -2
  38. package/packages/core/dist/index.mjs.map +1 -1
  39. package/packages/core/dist/persisted.cjs +11 -0
  40. package/packages/core/dist/persisted.cjs.map +1 -1
  41. package/packages/core/dist/persisted.mjs +4 -3
  42. package/packages/core/dist/persisted.mjs.map +1 -1
  43. package/packages/core/dist/{programmatic-gZTWLObB.d.cts → programmatic-BLlC7Ytq.d.cts} +1 -1
  44. package/packages/core/dist/{programmatic-gZTWLObB.d.ts → programmatic-BLlC7Ytq.d.ts} +1 -1
  45. package/packages/core/dist/readers.cjs +11 -0
  46. package/packages/core/dist/readers.cjs.map +1 -1
  47. package/packages/core/dist/readers.d.cts +1 -1
  48. package/packages/core/dist/readers.d.ts +1 -1
  49. package/packages/core/dist/readers.mjs +4 -3
  50. package/packages/cli/dist/chunk-6FE47XSF.mjs.map +0 -1
  51. package/packages/core/dist/chunk-2CCRUI42.mjs.map +0 -1
  52. package/packages/core/dist/chunk-L5WLVBW4.mjs.map +0 -1
  53. package/packages/core/dist/chunk-VQUB3WRI.mjs.map +0 -1
@@ -1252,11 +1252,23 @@ var init_trace_event_safety = __esm({
1252
1252
  init_persisted_inspect_event();
1253
1253
  }
1254
1254
  });
1255
+ function getSharedContextStorage() {
1256
+ const host = globalThis;
1257
+ const existing = host[GLOBAL_CONTEXT_ALS_KEY];
1258
+ if (existing instanceof async_hooks.AsyncLocalStorage) {
1259
+ return existing;
1260
+ }
1261
+ const created = new async_hooks.AsyncLocalStorage();
1262
+ host[GLOBAL_CONTEXT_ALS_KEY] = created;
1263
+ return created;
1264
+ }
1265
+ var GLOBAL_CONTEXT_ALS_KEY;
1255
1266
  var init_context = __esm({
1256
1267
  "packages/core/src/context.ts"() {
1257
1268
  init_correlation_metadata();
1258
1269
  init_trace_event_safety();
1259
- new async_hooks.AsyncLocalStorage();
1270
+ GLOBAL_CONTEXT_ALS_KEY = "agent-inspect:execution-context-als:v1";
1271
+ getSharedContextStorage();
1260
1272
  }
1261
1273
  });
1262
1274
  var init_inspector_runtime = __esm({
@@ -4784,6 +4796,17 @@ var init_programmatic = __esm({
4784
4796
  summary: "Trace contains a parentId cycle.",
4785
4797
  remediation: "Use visibility-first tree linking for legacy fixtures; prefer acyclic capture for new adapter output.",
4786
4798
  relatedCodes: ["structure.cycle"]
4799
+ },
4800
+ AI_TRACE_CONTRACT_INPUT_INVALID: {
4801
+ code: "AI_TRACE_CONTRACT_INPUT_INVALID",
4802
+ summary: "evaluateTraceContract expects ({ read }, contract) or use evaluateTraceContractRead(read, contract).",
4803
+ remediation: "Pass TraceCheckInput as the first argument: evaluateTraceContract({ read }, contract).",
4804
+ relatedCodes: ["AI_CHECK_INVALID_ARGUMENTS"]
4805
+ },
4806
+ AI_INSPECT_RUN_UNSUPPORTED_OPTION: {
4807
+ code: "AI_INSPECT_RUN_UNSUPPORTED_OPTION",
4808
+ summary: 'inspectRun does not accept a "writer" option.',
4809
+ remediation: "Use createInspector({ writer }) then inspector.run(...). inspectRun persists via the global JSONL path (schema 0.1)."
4787
4810
  }
4788
4811
  });
4789
4812
  }
@@ -6524,6 +6547,45 @@ function createToolOrderingRule(options) {
6524
6547
  requireEndpoints: false
6525
6548
  });
6526
6549
  }
6550
+ function createToolFailureRule(options) {
6551
+ return {
6552
+ id: "tool.failures",
6553
+ category: "tool",
6554
+ defaultSeverity: "error",
6555
+ evaluate(context) {
6556
+ const tools = finishedEvents(context, "TOOL");
6557
+ const failures = tools.filter((event) => event.status === "error");
6558
+ const retries = tools.map((event) => ({ event, count: retryCount(event) })).filter((item) => item.count !== void 0);
6559
+ const findings = [];
6560
+ if (options.maxFailures !== void 0 && failures.length > options.maxFailures) {
6561
+ findings.push(
6562
+ failFinding(
6563
+ "tool.failures",
6564
+ `Tool failure count ${failures.length} exceeded ${options.maxFailures}.`,
6565
+ failures.map((event) => eventEvidence(event)),
6566
+ { maxFailures: options.maxFailures },
6567
+ failures.length
6568
+ )
6569
+ );
6570
+ }
6571
+ if (options.maxRetries !== void 0) {
6572
+ const excessiveRetries = retries.filter((item) => item.count > options.maxRetries);
6573
+ if (excessiveRetries.length > 0) {
6574
+ findings.push(
6575
+ failFinding(
6576
+ "tool.failures",
6577
+ `Tool retry count exceeded ${options.maxRetries}.`,
6578
+ excessiveRetries.map((item) => eventEvidence(item.event, "attributes.retryCount")),
6579
+ { maxRetries: options.maxRetries },
6580
+ excessiveRetries.map((item) => ({ tool: toolName(item.event), retries: item.count }))
6581
+ )
6582
+ );
6583
+ }
6584
+ }
6585
+ return findings;
6586
+ }
6587
+ };
6588
+ }
6527
6589
  function createLlmUsageRule(options) {
6528
6590
  return {
6529
6591
  id: "llm.usage",
@@ -9505,7 +9567,72 @@ function defineTraceContract(input3) {
9505
9567
  ...alternatives ? { alternatives } : {}
9506
9568
  };
9507
9569
  }
9570
+ function isTraceReadLike(value) {
9571
+ if (typeof value !== "object" || value === null) return false;
9572
+ const candidate = value;
9573
+ return typeof candidate.format === "string" && Array.isArray(candidate.runs) && Array.isArray(candidate.events);
9574
+ }
9575
+ function isTraceCheckInputLike(value) {
9576
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
9577
+ return false;
9578
+ }
9579
+ return isTraceReadLike(value.read);
9580
+ }
9581
+ function looksLikeTraceContract(value) {
9582
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
9583
+ return false;
9584
+ }
9585
+ if (isTraceReadLike(value) || isTraceCheckInputLike(value)) {
9586
+ return false;
9587
+ }
9588
+ return true;
9589
+ }
9590
+ function invalidContractInputResult() {
9591
+ return {
9592
+ ok: false,
9593
+ status: "error",
9594
+ format: "unknown",
9595
+ summary: {
9596
+ passed: 0,
9597
+ failed: 0,
9598
+ warnings: 0,
9599
+ errors: 1,
9600
+ rulesEvaluated: 0
9601
+ },
9602
+ findings: [],
9603
+ diagnostics: [
9604
+ {
9605
+ code: "AI_CHECK_INVALID_ARGUMENTS",
9606
+ message: formatProgrammaticDiagnostic("AI_TRACE_CONTRACT_INPUT_INVALID"),
9607
+ severity: "error"
9608
+ }
9609
+ ],
9610
+ ruleExecutions: []
9611
+ };
9612
+ }
9613
+ function validateEvaluateTraceContractArgs(input3, contract) {
9614
+ if (isTraceCheckInputLike(input3) && looksLikeTraceContract(contract)) {
9615
+ return void 0;
9616
+ }
9617
+ if (looksLikeTraceContract(input3) && (isTraceCheckInputLike(contract) || isTraceReadLike(contract))) {
9618
+ return invalidContractInputResult();
9619
+ }
9620
+ if (isTraceReadLike(input3)) {
9621
+ return invalidContractInputResult();
9622
+ }
9623
+ if (!isTraceCheckInputLike(input3)) {
9624
+ return invalidContractInputResult();
9625
+ }
9626
+ if (!looksLikeTraceContract(contract)) {
9627
+ return invalidContractInputResult();
9628
+ }
9629
+ return void 0;
9630
+ }
9508
9631
  function evaluateTraceContract(input3, contract, options = {}) {
9632
+ const inputGuard = validateEvaluateTraceContractArgs(input3, contract);
9633
+ if (inputGuard !== void 0) {
9634
+ return inputGuard;
9635
+ }
9509
9636
  const shapeErrors = [
9510
9637
  ...validateAllowedStatusesShape(contract.run?.allowedStatuses),
9511
9638
  ...validateAlternativesShape(contract.alternatives),
@@ -9654,6 +9781,7 @@ var init_contract = __esm({
9654
9781
  init_retry_safety();
9655
9782
  init_tool_arguments();
9656
9783
  init_outcomes();
9784
+ init_programmatic();
9657
9785
  init_contract_scope();
9658
9786
  init_tool_arguments();
9659
9787
  ALLOWED_STATUS_ALIASES = {
@@ -14297,18 +14425,36 @@ var init_readers = __esm({
14297
14425
  function diagnostic5(code, message, severity = "error", caseId) {
14298
14426
  return { code, message, severity, ...caseId !== void 0 ? { caseId } : {} };
14299
14427
  }
14300
- function buildCaseRules(suiteCase, config) {
14428
+ function buildCaseAssertions(suiteCase, config) {
14301
14429
  const rules = [];
14302
14430
  const select = new Set(config.checks?.select ?? []);
14303
- if (select.has("run.status")) {
14431
+ const configDiagnostics = [];
14432
+ const evalConfig = config.eval;
14433
+ const declaredSelect = [...select];
14434
+ for (const id of declaredSelect) {
14435
+ if (!KNOWN_SUITE_SELECT_IDS.has(id)) {
14436
+ configDiagnostics.push(
14437
+ diagnostic5(
14438
+ "AI_SUITE_UNKNOWN_SELECTOR",
14439
+ `Unknown or unsupported suite check selector "${id}".`,
14440
+ "error",
14441
+ suiteCase.id
14442
+ )
14443
+ );
14444
+ }
14445
+ }
14446
+ if (select.has("run.status") || evalConfig?.requireSuccess === true) {
14304
14447
  rules.push(createRunStatusRule());
14448
+ select.add("run.status");
14305
14449
  }
14306
14450
  const requiredTools = [
14307
14451
  ...config.checks?.tool?.required ?? [],
14452
+ ...evalConfig?.requiredTools ?? [],
14308
14453
  ...suiteCase.requireTools ?? []
14309
14454
  ];
14310
14455
  const forbiddenTools = [
14311
14456
  ...config.checks?.tool?.forbidden ?? [],
14457
+ ...evalConfig?.forbiddenTools ?? [],
14312
14458
  ...suiteCase.forbidTools ?? []
14313
14459
  ];
14314
14460
  if (requiredTools.length > 0 || forbiddenTools.length > 0) {
@@ -14320,20 +14466,51 @@ function buildCaseRules(suiteCase, config) {
14320
14466
  );
14321
14467
  select.add("tool.usage");
14322
14468
  }
14323
- const maxDurationMs = suiteCase.maxDurationMs ?? config.checks?.run?.maxDurationMs ?? config.eval?.maxDurationMs;
14469
+ const maxDurationMs = suiteCase.maxDurationMs ?? config.checks?.run?.maxDurationMs ?? evalConfig?.maxDurationMs;
14324
14470
  if (maxDurationMs !== void 0) {
14325
14471
  rules.push(createRunDurationRule({ maxDurationMs }));
14326
14472
  select.add("run.duration");
14327
14473
  }
14328
- const llm = config.checks?.llm;
14329
- if (llm?.allowedModels !== void 0 || llm?.maxTotalTokens !== void 0) {
14330
- rules.push(createLlmUsageRule(llm));
14474
+ const maxDepth = config.checks?.run?.maxDepth ?? evalConfig?.maxDepth;
14475
+ if (maxDepth !== void 0) {
14476
+ rules.push(createRunDepthRule({ maxDepth }));
14477
+ select.add("run.depth");
14478
+ }
14479
+ if (evalConfig?.maxRetries !== void 0) {
14480
+ rules.push(createToolFailureRule({ maxRetries: evalConfig.maxRetries }));
14481
+ select.add("tool.failures");
14482
+ }
14483
+ const allowedModels = config.checks?.llm?.allowedModels;
14484
+ const maxTotalTokens = config.checks?.llm?.maxTotalTokens ?? evalConfig?.maxTotalTokens;
14485
+ if (allowedModels !== void 0 || maxTotalTokens !== void 0) {
14486
+ rules.push(
14487
+ createLlmUsageRule({
14488
+ ...allowedModels !== void 0 ? { allowedModels } : {},
14489
+ ...maxTotalTokens !== void 0 ? { maxTotalTokens } : {}
14490
+ })
14491
+ );
14331
14492
  select.add("llm.usage");
14332
14493
  }
14333
14494
  if (select.has("outcome.status")) {
14334
14495
  rules.push(createObservedOutcomeRule({ failOn: ["failed"] }));
14335
14496
  }
14336
- return { rules, select: [...select] };
14497
+ const observationCount = suiteCase.expectedObservations?.length ?? 0;
14498
+ if (rules.length === 0 && observationCount === 0 && configDiagnostics.length === 0) {
14499
+ configDiagnostics.push(
14500
+ diagnostic5(
14501
+ "AI_SUITE_NO_ASSERTIONS",
14502
+ `Suite case "${suiteCase.id}" declares no effective checks, eval controls, or expected observations.`,
14503
+ "error",
14504
+ suiteCase.id
14505
+ )
14506
+ );
14507
+ }
14508
+ return {
14509
+ rules,
14510
+ select: [...select],
14511
+ observationCount,
14512
+ configDiagnostics
14513
+ };
14337
14514
  }
14338
14515
  function outcomesFromRead(read) {
14339
14516
  const persistedOutcomes = extractOutcomesFromPersistedEvents(
@@ -14414,8 +14591,20 @@ async function runSuiteCase(suiteCase, config, options) {
14414
14591
  ]
14415
14592
  };
14416
14593
  }
14417
- const { rules, select } = buildCaseRules(suiteCase, config);
14418
- const checkResult = rules.length > 0 ? runTraceChecks({ read }, { rules, select }) : {
14594
+ const compiled = buildCaseAssertions(suiteCase, config);
14595
+ if (compiled.configDiagnostics.length > 0) {
14596
+ return {
14597
+ id: suiteCase.id,
14598
+ status: "error",
14599
+ tracePath: resolved.tracePath,
14600
+ ...resolved.runId !== void 0 ? { runId: resolved.runId } : {},
14601
+ checkOk: false,
14602
+ ...config.eval?.requireSuccess === true ? { evalOk: false } : {},
14603
+ message: compiled.configDiagnostics.map((item) => item.message).join("; "),
14604
+ diagnostics: compiled.configDiagnostics
14605
+ };
14606
+ }
14607
+ const checkResult = compiled.rules.length > 0 ? runTraceChecks({ read }, { rules: compiled.rules, select: compiled.select }) : {
14419
14608
  ok: true,
14420
14609
  status: "pass",
14421
14610
  format: read.format,
@@ -14443,6 +14632,9 @@ async function runSuiteCase(suiteCase, config, options) {
14443
14632
  ];
14444
14633
  const checkOk = checkResult.ok;
14445
14634
  const observationsOk = observationResult.ok;
14635
+ const evalOk = config.eval?.requireSuccess === true ? checkResult.findings.every(
14636
+ (finding) => finding.ruleId !== "run.status" || finding.status !== "fail"
14637
+ ) && checkResult.diagnostics.every((item) => item.severity !== "error") : void 0;
14446
14638
  const ok = checkOk && observationsOk;
14447
14639
  const status = ok ? "pass" : checkResult.status === "error" ? "error" : "fail";
14448
14640
  return {
@@ -14451,6 +14643,7 @@ async function runSuiteCase(suiteCase, config, options) {
14451
14643
  tracePath: resolved.tracePath,
14452
14644
  ...resolved.runId !== void 0 ? { runId: resolved.runId } : {},
14453
14645
  checkOk,
14646
+ ...evalOk !== void 0 ? { evalOk } : {},
14454
14647
  observationsOk,
14455
14648
  diagnostics,
14456
14649
  ...ok ? {} : {
@@ -14495,6 +14688,7 @@ async function runSuite(options = {}) {
14495
14688
  diagnostics
14496
14689
  };
14497
14690
  }
14691
+ var KNOWN_SUITE_SELECT_IDS;
14498
14692
  var init_run = __esm({
14499
14693
  "packages/core/src/suite/run.ts"() {
14500
14694
  init_checks2();
@@ -14502,6 +14696,15 @@ var init_run = __esm({
14502
14696
  init_readers();
14503
14697
  init_load2();
14504
14698
  init_resolve2();
14699
+ KNOWN_SUITE_SELECT_IDS = /* @__PURE__ */ new Set([
14700
+ "run.status",
14701
+ "run.duration",
14702
+ "run.depth",
14703
+ "outcome.status",
14704
+ "tool.usage",
14705
+ "tool.failures",
14706
+ "llm.usage"
14707
+ ]);
14505
14708
  }
14506
14709
  });
14507
14710
 
@@ -15732,6 +15935,7 @@ var init_inspect_run = __esm({
15732
15935
  "packages/core/src/inspect-run.ts"() {
15733
15936
  init_correlation_metadata();
15734
15937
  init_context();
15938
+ init_programmatic();
15735
15939
  init_storage();
15736
15940
  init_terminal();
15737
15941
  init_trace_directory();
@@ -16249,7 +16453,7 @@ var init_src = __esm({
16249
16453
  });
16250
16454
 
16251
16455
  // package.json
16252
- var version = "6.31.8";
16456
+ var version = "6.31.10";
16253
16457
 
16254
16458
  // packages/cli/src/list.ts
16255
16459
  init_advanced();