agent-inspect 6.14.2 → 6.16.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 +14 -6
  2. package/README.md +2 -2
  3. package/docs/API.md +19 -3
  4. package/package.json +2 -2
  5. package/packages/cli/dist/{chunk-AACUXCHT.mjs → chunk-LFSBMUCD.mjs} +115 -10
  6. package/packages/cli/dist/chunk-LFSBMUCD.mjs.map +1 -0
  7. package/packages/cli/dist/index.cjs +126 -10
  8. package/packages/cli/dist/index.cjs.map +1 -1
  9. package/packages/cli/dist/index.mjs +4 -4
  10. package/packages/cli/dist/index.mjs.map +1 -1
  11. package/packages/cli/dist/{src-ABTS4GO4.mjs → src-5J2HPOJ3.mjs} +3 -3
  12. package/packages/cli/dist/{src-ABTS4GO4.mjs.map → src-5J2HPOJ3.mjs.map} +1 -1
  13. package/packages/core/dist/advanced.cjs +114 -7
  14. package/packages/core/dist/advanced.cjs.map +1 -1
  15. package/packages/core/dist/advanced.d.cts +2 -2
  16. package/packages/core/dist/advanced.d.ts +2 -2
  17. package/packages/core/dist/advanced.mjs +3 -2
  18. package/packages/core/dist/advanced.mjs.map +1 -1
  19. package/packages/core/dist/checks.cjs +115 -6
  20. package/packages/core/dist/checks.cjs.map +1 -1
  21. package/packages/core/dist/checks.d.cts +16 -6
  22. package/packages/core/dist/checks.d.ts +16 -6
  23. package/packages/core/dist/checks.mjs +2 -1
  24. package/packages/core/dist/chunk-FWK3Q3OJ.mjs +56 -0
  25. package/packages/core/dist/chunk-FWK3Q3OJ.mjs.map +1 -0
  26. package/packages/core/dist/{chunk-5N2OBM7S.mjs → chunk-HT54OLPE.mjs} +53 -6
  27. package/packages/core/dist/chunk-HT54OLPE.mjs.map +1 -0
  28. package/packages/core/dist/{chunk-BHMXLDLK.mjs → chunk-NF4ZHNTC.mjs} +63 -9
  29. package/packages/core/dist/chunk-NF4ZHNTC.mjs.map +1 -0
  30. package/packages/core/dist/index-B259NKkH.d.cts +102 -0
  31. package/packages/core/dist/index-B9ZGvUVL.d.ts +102 -0
  32. package/packages/core/dist/{index-D9HBequ_.d.ts → index-BsCcOKxy.d.ts} +1 -1
  33. package/packages/core/dist/{index-BY6XZ5aG.d.cts → index-Xk9X-yjY.d.cts} +1 -1
  34. package/packages/core/dist/readers.cjs +108 -3
  35. package/packages/core/dist/readers.cjs.map +1 -1
  36. package/packages/core/dist/readers.d.cts +27 -78
  37. package/packages/core/dist/readers.d.ts +27 -78
  38. package/packages/core/dist/readers.mjs +2 -1
  39. package/packages/cli/dist/chunk-AACUXCHT.mjs.map +0 -1
  40. package/packages/core/dist/chunk-5N2OBM7S.mjs.map +0 -1
  41. package/packages/core/dist/chunk-BHMXLDLK.mjs.map +0 -1
@@ -6354,6 +6354,64 @@ var init_resolve2 = __esm({
6354
6354
  }
6355
6355
  });
6356
6356
 
6357
+ // packages/core/src/diagnostics/programmatic.ts
6358
+ function formatProgrammaticDiagnostic(code, detail) {
6359
+ const spec = PROGRAMMATIC_DIAGNOSTIC_SPECS[code];
6360
+ const summary = detail?.trim() ? detail.trim() : spec.summary;
6361
+ return `${code}: ${summary} Remediation: ${spec.remediation}`;
6362
+ }
6363
+ var PROGRAMMATIC_DIAGNOSTIC_SPECS;
6364
+ var init_programmatic = __esm({
6365
+ "packages/core/src/diagnostics/programmatic.ts"() {
6366
+ PROGRAMMATIC_DIAGNOSTIC_SPECS = Object.freeze({
6367
+ AI_TRACE_INPUT_INVALID: {
6368
+ code: "AI_TRACE_INPUT_INVALID",
6369
+ summary: 'Expected { type: "file", path }, { type: "directory", path }, { type: "string", content }, { type: "buffer", content }, or { type: "stdin" }.',
6370
+ remediation: "For a file path, use openTraceFile(path).",
6371
+ relatedCodes: ["invalid_input"]
6372
+ },
6373
+ AI_TRACE_FORMAT_UNSUPPORTED: {
6374
+ code: "AI_TRACE_FORMAT_UNSUPPORTED",
6375
+ summary: "No trace reader could detect the input format.",
6376
+ remediation: "Pass an AgentInspect JSONL file via openTraceFile, or set options.format to a registered reader.",
6377
+ relatedCodes: ["unsupported_format"]
6378
+ },
6379
+ AI_TRACE_FORMAT_AMBIGUOUS: {
6380
+ code: "AI_TRACE_FORMAT_AMBIGUOUS",
6381
+ summary: "Multiple trace readers matched the input with equal confidence.",
6382
+ remediation: "Set options.format explicitly to disambiguate the reader.",
6383
+ relatedCodes: ["ambiguous_format"]
6384
+ },
6385
+ AI_TRACE_FACTS_INPUT_NOT_NORMALIZED: {
6386
+ code: "AI_TRACE_FACTS_INPUT_NOT_NORMALIZED",
6387
+ summary: "TraceFacts requires TraceReadResult or PersistedInspectEvent[].",
6388
+ remediation: "Use openTraceFile() to normalize a JSONL trace first."
6389
+ },
6390
+ AI_TRACE_CONTRACT_RUN_SELECTION_REQUIRED: {
6391
+ code: "AI_TRACE_CONTRACT_RUN_SELECTION_REQUIRED",
6392
+ summary: "Multiple runs are available; select a run before executing checks.",
6393
+ remediation: "Pass options.runId or TraceCheckInput.selectedRun.",
6394
+ relatedCodes: ["AI_CHECK_RUN_SELECTION_REQUIRED"]
6395
+ },
6396
+ AI_TRACE_RELATIONSHIP_SELF_PARENT: {
6397
+ code: "AI_TRACE_RELATIONSHIP_SELF_PARENT",
6398
+ summary: "A parentId equals its own event/step id.",
6399
+ remediation: "Reject at capture (AI_LANGGRAPH_SELF_PARENT_REJECTED) or drop via logical projection; do not invent replacement parents.",
6400
+ relatedCodes: [
6401
+ "AI_LANGGRAPH_SELF_PARENT_REJECTED",
6402
+ "AI_LOGICAL_SELF_PARENT_REMOVED"
6403
+ ]
6404
+ },
6405
+ AI_TRACE_RELATIONSHIP_CYCLE: {
6406
+ code: "AI_TRACE_RELATIONSHIP_CYCLE",
6407
+ summary: "Trace contains a parentId cycle.",
6408
+ remediation: "Use visibility-first tree linking for legacy fixtures; prefer acyclic capture for new adapter output.",
6409
+ relatedCodes: ["structure.cycle"]
6410
+ }
6411
+ });
6412
+ }
6413
+ });
6414
+
6357
6415
  // packages/core/src/safety/sensitive-key.ts
6358
6416
  function normalizeSensitiveKey(value) {
6359
6417
  return value.toLowerCase().replace(/[^a-z0-9_]/g, "");
@@ -6624,7 +6682,10 @@ function projectLogicalEvents(events) {
6624
6682
  if (originalParentId === event.eventId) {
6625
6683
  diagnostics.push({
6626
6684
  code: "AI_LOGICAL_SELF_PARENT_REMOVED",
6627
- message: `Removed self-parent edge on ${event.eventId}.`,
6685
+ message: formatProgrammaticDiagnostic(
6686
+ "AI_TRACE_RELATIONSHIP_SELF_PARENT",
6687
+ `Removed self-parent edge on ${event.eventId}.`
6688
+ ),
6628
6689
  eventIds: [event.eventId]
6629
6690
  });
6630
6691
  const { parentId: _drop, ...rest } = event;
@@ -6656,7 +6717,10 @@ function projectLogicalEvents(events) {
6656
6717
  if (nextParent === event.eventId) {
6657
6718
  diagnostics.push({
6658
6719
  code: "AI_LOGICAL_SELF_PARENT_REMOVED",
6659
- message: `Removed self-parent edge on ${event.eventId} (was ${originalParentId}).`,
6720
+ message: formatProgrammaticDiagnostic(
6721
+ "AI_TRACE_RELATIONSHIP_SELF_PARENT",
6722
+ `Removed self-parent edge on ${event.eventId} (was ${originalParentId}).`
6723
+ ),
6660
6724
  eventIds: [event.eventId]
6661
6725
  });
6662
6726
  const { parentId: _drop, ...rest } = event;
@@ -6720,6 +6784,7 @@ function pickString(record, keys) {
6720
6784
  }
6721
6785
  var init_logical_events = __esm({
6722
6786
  "packages/core/src/checks/logical-events.ts"() {
6787
+ init_programmatic();
6723
6788
  }
6724
6789
  });
6725
6790
 
@@ -6748,7 +6813,11 @@ function summarizeSemanticParity(events) {
6748
6813
  }
6749
6814
  var init_trace_facts = __esm({
6750
6815
  "packages/core/src/checks/trace-facts.ts"() {
6816
+ init_programmatic();
6751
6817
  init_logical_events();
6818
+ formatProgrammaticDiagnostic(
6819
+ "AI_TRACE_FACTS_INPUT_NOT_NORMALIZED"
6820
+ );
6752
6821
  }
6753
6822
  });
6754
6823
 
@@ -6859,7 +6928,13 @@ function resolveSelectedRun(input3, runId) {
6859
6928
  if (input3.read.runs.length === 0) {
6860
6929
  return {
6861
6930
  diagnostics: [
6862
- diagnostic3("AI_CHECK_RUN_SELECTION_REQUIRED", "No runs are available for checks.")
6931
+ diagnostic3(
6932
+ "AI_CHECK_RUN_SELECTION_REQUIRED",
6933
+ formatProgrammaticDiagnostic(
6934
+ "AI_TRACE_CONTRACT_RUN_SELECTION_REQUIRED",
6935
+ "No runs are available for checks."
6936
+ )
6937
+ )
6863
6938
  ]
6864
6939
  };
6865
6940
  }
@@ -6867,7 +6942,7 @@ function resolveSelectedRun(input3, runId) {
6867
6942
  diagnostics: [
6868
6943
  diagnostic3(
6869
6944
  "AI_CHECK_RUN_SELECTION_REQUIRED",
6870
- "Multiple runs are available; select a run before executing checks."
6945
+ formatProgrammaticDiagnostic("AI_TRACE_CONTRACT_RUN_SELECTION_REQUIRED")
6871
6946
  )
6872
6947
  ]
6873
6948
  };
@@ -7596,7 +7671,7 @@ function createStructureCycleRule() {
7596
7671
  findings.push(
7597
7672
  failFinding(
7598
7673
  "structure.cycle",
7599
- "Trace contains a parentId cycle.",
7674
+ formatProgrammaticDiagnostic("AI_TRACE_RELATIONSHIP_CYCLE"),
7600
7675
  cycle.map((item) => eventEvidence(item, "parentId")),
7601
7676
  "acyclic parentId graph",
7602
7677
  cycle.map((item) => item.eventId).sort()
@@ -8163,11 +8238,13 @@ function runTraceChecks(input3, options = {}) {
8163
8238
  var SEVERITY_RANK, STATUS_RANK, CONFIDENCE_RANK, DEFAULT_SENSITIVE_KEYS, DEFAULT_RAW_CONTENT_KEYS, DEFAULT_SAFE_RAW_CONTENT_PATH_PREFIXES, SAFE_USAGE_LEAF_KEYS, DEFAULT_SECRET_PATTERNS;
8164
8239
  var init_checks2 = __esm({
8165
8240
  "packages/core/src/checks/index.ts"() {
8241
+ init_programmatic();
8166
8242
  init_outcomes();
8167
8243
  init_sensitive_key();
8168
8244
  init_logical_events();
8169
8245
  init_logical_events();
8170
8246
  init_trace_facts();
8247
+ init_programmatic();
8171
8248
  init_sensitive_key();
8172
8249
  init_contract();
8173
8250
  SEVERITY_RANK = {
@@ -8860,6 +8937,35 @@ var init_tree_bridge = __esm({
8860
8937
  init_to_inspect_event();
8861
8938
  }
8862
8939
  });
8940
+ function isTraceInput(input3) {
8941
+ if (typeof input3 !== "object" || input3 === null || Array.isArray(input3)) {
8942
+ return false;
8943
+ }
8944
+ const record = input3;
8945
+ switch (record.type) {
8946
+ case "file":
8947
+ case "directory":
8948
+ return typeof record.path === "string";
8949
+ case "string":
8950
+ return typeof record.content === "string";
8951
+ case "buffer":
8952
+ return Buffer.isBuffer(record.content);
8953
+ case "stdin":
8954
+ return true;
8955
+ default:
8956
+ return false;
8957
+ }
8958
+ }
8959
+ function assertTraceInput(input3) {
8960
+ if (isTraceInput(input3)) return;
8961
+ throw new TraceReadError("invalid_input", TRACE_INPUT_INVALID_MESSAGE, [
8962
+ {
8963
+ code: "AI_TRACE_INPUT_INVALID",
8964
+ message: TRACE_INPUT_INVALID_MESSAGE,
8965
+ severity: "error"
8966
+ }
8967
+ ]);
8968
+ }
8863
8969
  function normalizeCandidate(reader, candidate) {
8864
8970
  const confidence = Number.isFinite(candidate.confidence) ? Math.max(0, Math.min(1, candidate.confidence)) : 0;
8865
8971
  return {
@@ -10006,6 +10112,7 @@ function mapOtlpEventsToPersisted(document) {
10006
10112
  };
10007
10113
  }
10008
10114
  async function detectTraceFormat(input3, options = {}) {
10115
+ assertTraceInput(input3);
10009
10116
  const readers = options.readers ?? DEFAULT_TRACE_READERS;
10010
10117
  if (options.format !== void 0) {
10011
10118
  const reader = findReaderByFormat(options.format, readers);
@@ -10102,19 +10209,20 @@ async function detectTraceFormat(input3, options = {}) {
10102
10209
  };
10103
10210
  }
10104
10211
  async function readTrace(input3, options = {}) {
10212
+ assertTraceInput(input3);
10105
10213
  const readers = options.readers ?? DEFAULT_TRACE_READERS;
10106
10214
  const detection = await detectTraceFormat(input3, options);
10107
10215
  if (detection.status === "unsupported" || detection.format === void 0) {
10108
10216
  throw new TraceReadError(
10109
10217
  "unsupported_format",
10110
- "No trace reader could detect the input format.",
10218
+ formatProgrammaticDiagnostic("AI_TRACE_FORMAT_UNSUPPORTED"),
10111
10219
  detection.warnings
10112
10220
  );
10113
10221
  }
10114
10222
  if (detection.status === "ambiguous") {
10115
10223
  throw new TraceReadError(
10116
10224
  "ambiguous_format",
10117
- "Multiple trace readers matched the input with equal confidence.",
10225
+ formatProgrammaticDiagnostic("AI_TRACE_FORMAT_AMBIGUOUS"),
10118
10226
  detection.warnings
10119
10227
  );
10120
10228
  }
@@ -10122,7 +10230,10 @@ async function readTrace(input3, options = {}) {
10122
10230
  if (!reader) {
10123
10231
  throw new TraceReadError(
10124
10232
  "unsupported_format",
10125
- `No trace reader is registered for format "${detection.format}".`,
10233
+ formatProgrammaticDiagnostic(
10234
+ "AI_TRACE_FORMAT_UNSUPPORTED",
10235
+ `No trace reader is registered for format "${detection.format}".`
10236
+ ),
10126
10237
  detection.warnings
10127
10238
  );
10128
10239
  }
@@ -10151,12 +10262,13 @@ async function readTrace(input3, options = {}) {
10151
10262
  function openTrace(input3, options = {}) {
10152
10263
  return readTrace(input3, options);
10153
10264
  }
10154
- var DEFAULT_MAX_TRACE_INPUT_BYTES, MIN_DETECTION_CONFIDENCE, AMBIGUOUS_CONFIDENCE_DELTA, resolvedInputCache, OPENINFERENCE_READER_FORMAT, OTLP_READER_FORMAT, OPENINFERENCE_SPAN_KEYS, OPENINFERENCE_SENSITIVE_ATTRIBUTE_KEYS, OTLP_SPAN_KEYS, TraceReadError, openInferenceJsonReader, otlpJsonReader, agentInspectJsonlReader, DEFAULT_TRACE_READERS;
10265
+ var DEFAULT_MAX_TRACE_INPUT_BYTES, MIN_DETECTION_CONFIDENCE, AMBIGUOUS_CONFIDENCE_DELTA, resolvedInputCache, OPENINFERENCE_READER_FORMAT, OTLP_READER_FORMAT, OPENINFERENCE_SPAN_KEYS, OPENINFERENCE_SENSITIVE_ATTRIBUTE_KEYS, OTLP_SPAN_KEYS, TraceReadError, TRACE_INPUT_INVALID_MESSAGE, openInferenceJsonReader, otlpJsonReader, agentInspectJsonlReader, DEFAULT_TRACE_READERS;
10155
10266
  var init_readers = __esm({
10156
10267
  "packages/core/src/readers/index.ts"() {
10157
10268
  init_read_trace();
10158
10269
  init_from_trace_event();
10159
10270
  init_tree_bridge();
10271
+ init_programmatic();
10160
10272
  DEFAULT_MAX_TRACE_INPUT_BYTES = 10 * 1024 * 1024;
10161
10273
  MIN_DETECTION_CONFIDENCE = 0.5;
10162
10274
  AMBIGUOUS_CONFIDENCE_DELTA = 0.05;
@@ -10230,6 +10342,9 @@ var init_readers = __esm({
10230
10342
  this.warnings = warnings;
10231
10343
  }
10232
10344
  };
10345
+ TRACE_INPUT_INVALID_MESSAGE = formatProgrammaticDiagnostic(
10346
+ "AI_TRACE_INPUT_INVALID"
10347
+ );
10233
10348
  openInferenceJsonReader = {
10234
10349
  format: OPENINFERENCE_READER_FORMAT,
10235
10350
  name: "OpenInference JSON",
@@ -12370,7 +12485,7 @@ var init_src = __esm({
12370
12485
  });
12371
12486
 
12372
12487
  // package.json
12373
- var version = "6.14.2";
12488
+ var version = "6.16.0";
12374
12489
 
12375
12490
  // packages/cli/src/list.ts
12376
12491
  init_advanced();
@@ -12700,6 +12815,7 @@ init_tree_bridge();
12700
12815
 
12701
12816
  // packages/core/src/entries/readers.ts
12702
12817
  init_readers();
12818
+ init_programmatic();
12703
12819
 
12704
12820
  // packages/cli/src/read-run.ts
12705
12821
  function mapReaderFormat(format) {