agent-inspect 6.31.6 → 6.31.7

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 (35) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +1 -1
  3. package/docs/AI-SDK-ADOPTION.md +62 -34
  4. package/package.json +1 -1
  5. package/packages/cli/dist/{chunk-YXDNWHNJ.mjs → chunk-QV73NM25.mjs} +97 -25
  6. package/packages/cli/dist/chunk-QV73NM25.mjs.map +1 -0
  7. package/packages/cli/dist/index.cjs +414 -81
  8. package/packages/cli/dist/index.cjs.map +1 -1
  9. package/packages/cli/dist/index.mjs +322 -62
  10. package/packages/cli/dist/index.mjs.map +1 -1
  11. package/packages/cli/dist/{src-H22KNWAZ.mjs → src-KFOBXFPN.mjs} +3 -3
  12. package/packages/cli/dist/{src-H22KNWAZ.mjs.map → src-KFOBXFPN.mjs.map} +1 -1
  13. package/packages/core/dist/advanced.cjs +94 -22
  14. package/packages/core/dist/advanced.cjs.map +1 -1
  15. package/packages/core/dist/advanced.mjs +4 -4
  16. package/packages/core/dist/{chunk-OSGNGRHF.mjs → chunk-3RV3JILQ.mjs} +34 -16
  17. package/packages/core/dist/chunk-3RV3JILQ.mjs.map +1 -0
  18. package/packages/core/dist/{chunk-EXGQLMVB.mjs → chunk-7YYS742B.mjs} +49 -12
  19. package/packages/core/dist/chunk-7YYS742B.mjs.map +1 -0
  20. package/packages/core/dist/{chunk-Q5SLKV2Y.mjs → chunk-QLYUWKK7.mjs} +19 -2
  21. package/packages/core/dist/chunk-QLYUWKK7.mjs.map +1 -0
  22. package/packages/core/dist/exporters.cjs +224 -47
  23. package/packages/core/dist/exporters.cjs.map +1 -1
  24. package/packages/core/dist/exporters.mjs +178 -38
  25. package/packages/core/dist/exporters.mjs.map +1 -1
  26. package/packages/core/dist/persisted.cjs +17 -0
  27. package/packages/core/dist/persisted.cjs.map +1 -1
  28. package/packages/core/dist/persisted.mjs +2 -2
  29. package/packages/core/dist/readers.cjs +48 -13
  30. package/packages/core/dist/readers.cjs.map +1 -1
  31. package/packages/core/dist/readers.mjs +2 -2
  32. package/packages/cli/dist/chunk-YXDNWHNJ.mjs.map +0 -1
  33. package/packages/core/dist/chunk-EXGQLMVB.mjs.map +0 -1
  34. package/packages/core/dist/chunk-OSGNGRHF.mjs.map +0 -1
  35. package/packages/core/dist/chunk-Q5SLKV2Y.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 6.31.7
4
+
5
+ ### Patch Changes
6
+
7
+ - 3f7abb5: Make timeline depth resolution cycle-safe and stack-safe for cyclic or very deep parent chains (GitHub #453 / #454).
8
+ - 3f7abb5: Preserve framework source attribution on CLI export via the persisted tree bridge, emit numeric OTLP StatusCode/SpanKind enums, map numeric status 0/1/2 on import, and harden OTLP nested validation with field-path diagnostics.
9
+
3
10
  ## 6.31.6
4
11
 
5
12
  ### Patch Changes
package/README.md CHANGED
@@ -213,7 +213,7 @@ The root package is enough for custom capture, the CLI, checks, and Evidence wor
213
213
 
214
214
  ## Status and documentation
215
215
 
216
- **Current published baseline:** **6.31.6** · persisted schema `1.0` · Node.js `>=20` · MIT.
216
+ **Current published baseline:** **6.31.7** · persisted schema `1.0` · Node.js `>=20` · MIT.
217
217
 
218
218
  Legacy v0.1 and v0.2 traces remain readable. Check the npm badge and [changelog](CHANGELOG.md) for the current published version.
219
219
 
@@ -2,10 +2,12 @@
2
2
 
3
3
  Blessed path for **Vercel AI SDK** + AgentInspect — local traces only, metadata-first by default.
4
4
 
5
+ **Peer:** `ai@^6.0.0` — tested with **`ai@6.0.210`**. This guide does not claim AI SDK 7 support.
6
+
5
7
  ## Install
6
8
 
7
9
  ```bash
8
- npm install agent-inspect @agent-inspect/ai-sdk ai
10
+ npm install agent-inspect @agent-inspect/ai-sdk ai@6.0.210
9
11
  ```
10
12
 
11
13
  Or bootstrap a project:
@@ -20,54 +22,79 @@ npx agent-inspect init --framework ai-sdk
20
22
  import { generateText } from "ai";
21
23
  import { agentInspect } from "@agent-inspect/ai-sdk";
22
24
 
23
- await generateText({
24
- model: yourModel,
25
- prompt: "Hello",
26
- experimental_telemetry: {
27
- isEnabled: true,
28
- recordInputs: false,
29
- recordOutputs: false,
30
- integrations: [
31
- agentInspect({
32
- traceDir: ".agent-inspect",
33
- runName: "support-agent",
34
- capture: "metadata-only",
35
- }),
36
- ],
37
- },
25
+ const integration = agentInspect({
26
+ traceDir: ".agent-inspect",
27
+ runName: "support-agent",
28
+ capture: "metadata-only",
38
29
  });
30
+
31
+ try {
32
+ await generateText({
33
+ model: yourModel,
34
+ prompt: "Hello",
35
+ experimental_telemetry: {
36
+ isEnabled: true,
37
+ recordInputs: false,
38
+ recordOutputs: false,
39
+ integrations: [integration],
40
+ },
41
+ });
42
+ } finally {
43
+ await integration.flush();
44
+ await integration.close();
45
+ }
39
46
  ```
40
47
 
48
+ Pass the integration only through `experimental_telemetry.integrations`. AgentInspect does **not** expose `getTelemetryMetadata()` or `getTelemetryHandlers()`.
49
+
41
50
  ## `streamText` (metadata-only)
42
51
 
43
52
  ```ts
44
53
  import { streamText } from "ai";
45
54
  import { agentInspect } from "@agent-inspect/ai-sdk";
46
55
 
47
- const result = streamText({
48
- model: yourModel,
49
- prompt: "Hello",
50
- experimental_telemetry: {
51
- isEnabled: true,
52
- recordInputs: false,
53
- recordOutputs: false,
54
- integrations: [
55
- agentInspect({
56
- traceDir: ".agent-inspect",
57
- runName: "stream-demo",
58
- capture: "metadata-only",
59
- }),
60
- ],
61
- },
56
+ const integration = agentInspect({
57
+ traceDir: ".agent-inspect",
58
+ runName: "stream-demo",
59
+ capture: "metadata-only",
62
60
  });
63
61
 
64
- for await (const _chunk of result.textStream) {
65
- // consume stream
62
+ try {
63
+ const result = streamText({
64
+ model: yourModel,
65
+ prompt: "Hello",
66
+ experimental_telemetry: {
67
+ isEnabled: true,
68
+ recordInputs: false,
69
+ recordOutputs: false,
70
+ integrations: [integration],
71
+ },
72
+ });
73
+
74
+ for await (const _chunk of result.textStream) {
75
+ // consume stream
76
+ }
77
+ } finally {
78
+ await integration.flush();
79
+ await integration.close();
66
80
  }
67
81
  ```
68
82
 
69
83
  Streaming lifecycle metadata is captured; raw token streams are not persisted by default.
70
84
 
85
+ ## Concurrent generations
86
+
87
+ Create a **new** `agentInspect()` instance for each concurrent generation. Do not share one integration across overlapping `generateText` / `streamText` calls.
88
+
89
+ ## Diagnostics
90
+
91
+ ```ts
92
+ const d = integration.getDiagnostics();
93
+ console.log(d.writeFailures, d.lifecycleWarnings, d.lastWarning, d.capture);
94
+ ```
95
+
96
+ Use `onDiagnostic` in options for live callbacks. Failures degrade locally; they do not throw into your agent return path.
97
+
71
98
  ## Tool calls
72
99
 
73
100
  Tool spans appear when the model invokes tools. Keep `recordInputs` / `recordOutputs` false unless you explicitly accept content capture risk.
@@ -110,10 +137,11 @@ Use `--fail-on-observation` only when the run records explicit OUTCOME events.
110
137
 
111
138
  | Symptom | Fix |
112
139
  | ------- | --- |
113
- | No trace file | Ensure `experimental_telemetry.isEnabled: true` and integrations include `agentInspect()` |
140
+ | No trace file | Ensure `experimental_telemetry.isEnabled: true` and `integrations: [integration]` |
114
141
  | Empty trace | Confirm `AGENT_INSPECT` is not `0` |
115
142
  | Prompts in trace | Set `recordInputs: false` and `recordOutputs: false` on the AI SDK call |
116
143
  | Wrong directory | Pass `traceDir` to `agentInspect()` or set `AGENT_INSPECT_TRACE_DIR` |
144
+ | Mixed concurrent runs | Use a separate `agentInspect()` instance per overlapping generation |
117
145
 
118
146
  ## Recipes (no network)
119
147
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-inspect",
3
- "version": "6.31.6",
3
+ "version": "6.31.7",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Local evidence debugger and trajectory-test toolkit for TypeScript AI agents — execution trees, TraceContract checks, Evidence v2, and read-only MCP",
@@ -2243,6 +2243,8 @@ function renderTraceStats(stats) {
2243
2243
  }
2244
2244
 
2245
2245
  // packages/core/src/timeline.ts
2246
+ var ROOT_TIMELINE_DEPTH = 0;
2247
+ var MAX_TIMELINE_DEPTH = 1e3;
2246
2248
  function finite(n) {
2247
2249
  return typeof n === "number" && Number.isFinite(n);
2248
2250
  }
@@ -2313,16 +2315,51 @@ function buildRunTimeline(events, options = {}) {
2313
2315
  const computeDepth = (stepId) => {
2314
2316
  const cached = depthCache.get(stepId);
2315
2317
  if (cached !== void 0) return cached;
2316
- const node = steps.get(stepId);
2317
- if (!node) return 0;
2318
- const parent = node.parentId;
2319
- if (typeof parent !== "string" || parent.trim() === "" || !steps.has(parent)) {
2320
- depthCache.set(stepId, 0);
2321
- return 0;
2318
+ const ancestry = [];
2319
+ const ancestryIndexes = /* @__PURE__ */ new Map();
2320
+ let currentStepId = stepId;
2321
+ let resolvedDepth;
2322
+ while (resolvedDepth === void 0) {
2323
+ const cachedDepth = depthCache.get(currentStepId);
2324
+ if (cachedDepth !== void 0) {
2325
+ resolvedDepth = cachedDepth;
2326
+ continue;
2327
+ }
2328
+ const cycleStart = ancestryIndexes.get(currentStepId);
2329
+ if (cycleStart !== void 0) {
2330
+ const cycleStepIds = ancestry.splice(cycleStart);
2331
+ for (const cycleStepId of cycleStepIds) {
2332
+ depthCache.set(cycleStepId, ROOT_TIMELINE_DEPTH);
2333
+ }
2334
+ resolvedDepth = ROOT_TIMELINE_DEPTH;
2335
+ continue;
2336
+ }
2337
+ const currentStep = steps.get(currentStepId);
2338
+ if (!currentStep) {
2339
+ resolvedDepth = ROOT_TIMELINE_DEPTH;
2340
+ continue;
2341
+ }
2342
+ ancestryIndexes.set(currentStepId, ancestry.length);
2343
+ ancestry.push(currentStepId);
2344
+ const parentId = currentStep.parentId;
2345
+ if (typeof parentId !== "string" || parentId.trim() === "" || !steps.has(parentId)) {
2346
+ ancestry.pop();
2347
+ depthCache.set(currentStepId, ROOT_TIMELINE_DEPTH);
2348
+ resolvedDepth = ROOT_TIMELINE_DEPTH;
2349
+ continue;
2350
+ }
2351
+ currentStepId = parentId;
2352
+ }
2353
+ ancestry.reverse();
2354
+ for (const ancestorStepId of ancestry) {
2355
+ resolvedDepth = Math.min(MAX_TIMELINE_DEPTH, resolvedDepth + 1);
2356
+ depthCache.set(ancestorStepId, resolvedDepth);
2357
+ }
2358
+ const resolvedStepDepth = depthCache.get(stepId);
2359
+ if (resolvedStepDepth === void 0) {
2360
+ throw new Error(`Failed to resolve timeline depth for step "${stepId}"`);
2322
2361
  }
2323
- const d = Math.min(1e3, computeDepth(parent) + 1);
2324
- depthCache.set(stepId, d);
2325
- return d;
2362
+ return resolvedStepDepth;
2326
2363
  };
2327
2364
  const entries = [];
2328
2365
  for (const [stepId, s] of steps.entries()) {
@@ -11882,6 +11919,23 @@ function persistedInspectEventToInspectEvent(event) {
11882
11919
  if (event.durationMs !== void 0 && Number.isFinite(event.durationMs) && event.durationMs >= 0) {
11883
11920
  out.durationMs = event.durationMs;
11884
11921
  }
11922
+ if (event.startedAt !== void 0) {
11923
+ const started = parseIsoToMs3(event.startedAt);
11924
+ if (!started.invalidTimestamp) {
11925
+ attrs.startedAtMs = started.ms;
11926
+ out.timestamp = started.ms;
11927
+ }
11928
+ }
11929
+ if (event.endedAt !== void 0) {
11930
+ const ended = parseIsoToMs3(event.endedAt);
11931
+ if (!ended.invalidTimestamp) {
11932
+ attrs.endedAtMs = ended.ms;
11933
+ if (out.durationMs === void 0 && typeof attrs.startedAtMs === "number" && ended.ms >= attrs.startedAtMs) {
11934
+ out.durationMs = ended.ms - attrs.startedAtMs;
11935
+ }
11936
+ }
11937
+ }
11938
+ out.attributes = compactAttributes3(attrs);
11885
11939
  return out;
11886
11940
  }
11887
11941
  function persistedInspectEventsToInspectEvents(events, options) {
@@ -12943,20 +12997,38 @@ function extractOtlpDocument(root) {
12943
12997
  function mapOtlpStatus(status) {
12944
12998
  if (!isRecord11(status)) return void 0;
12945
12999
  const rawCode = status.code;
12946
- if (typeof rawCode !== "string") return void 0;
12947
- switch (rawCode.toUpperCase()) {
12948
- case "STATUS_CODE_OK":
12949
- case "OK":
12950
- return "ok";
12951
- case "STATUS_CODE_ERROR":
12952
- case "ERROR":
12953
- return "error";
12954
- case "STATUS_CODE_UNSET":
12955
- case "UNSET":
12956
- return "unknown";
12957
- default:
12958
- return "unknown";
13000
+ if (typeof rawCode === "number" && Number.isFinite(rawCode)) {
13001
+ switch (rawCode) {
13002
+ case 0:
13003
+ return "unknown";
13004
+ case 1:
13005
+ return "ok";
13006
+ case 2:
13007
+ return "error";
13008
+ default:
13009
+ return "unknown";
13010
+ }
13011
+ }
13012
+ if (typeof rawCode === "string") {
13013
+ const trimmed = rawCode.trim();
13014
+ if (/^\d+$/.test(trimmed)) {
13015
+ return mapOtlpStatus({ code: Number(trimmed) });
13016
+ }
13017
+ switch (trimmed.toUpperCase()) {
13018
+ case "STATUS_CODE_OK":
13019
+ case "OK":
13020
+ return "ok";
13021
+ case "STATUS_CODE_ERROR":
13022
+ case "ERROR":
13023
+ return "error";
13024
+ case "STATUS_CODE_UNSET":
13025
+ case "UNSET":
13026
+ return "unknown";
13027
+ default:
13028
+ return "unknown";
13029
+ }
12959
13030
  }
13031
+ return void 0;
12960
13032
  }
12961
13033
  function readOtlpKind(attributes, pathPrefix) {
12962
13034
  const warnings = [];
@@ -14887,6 +14959,6 @@ function renderGateReport(result, options = {}) {
14887
14959
  return renderGateSummaryMarkdown(result);
14888
14960
  }
14889
14961
 
14890
- export { ATTRIBUTION_CONFIDENCES, COHORT_METRIC_IDS, DEFAULT_REDACT_KEYS, DEFAULT_SUITE_ARTIFACTS_DIR, EVIDENCE_FORMAT_VERSION, EVIDENCE_HTML_FILENAME, EVIDENCE_MANIFEST_FILENAME, Redactor, TraceDirectory, TraceReadError, TreeBuilder, aggregateBundleSafeStatus, aggregateSessionCheckResults, analyzeCohort, applyProfileMetadataCaps, assertBundlePathContained, assertEvidenceRelativePath, buildActivitySummary, buildBundleMetadata, buildBundleSummaryMarkdown, buildEvidenceCausalFailureViewHtml, buildEvidenceCiPackage, buildEvidenceCircuitViewHtml, buildEvidenceContractsViewHtml, buildEvidenceDiffViewHtml, buildEvidenceHtmlShell, buildEvidenceManifest, buildEvidenceOutcomesViewHtml, buildEvidenceProvenanceViewHtml, buildEvidenceSafetyViewHtml, buildEvidenceTimelineViewHtml, buildEvidenceToolsLlmViewHtml, buildEvidenceTreeViewHtml, buildLocalExplanation, buildPlaceholderArtifact, buildRunSummary, buildRunTimeline, buildRunWhatSummary, buildSessionIndex, buildTraceStats, buildZipArchive, bundleFailsOnSafety, bundleRunAssetRelativePath, collectTraceSchemaVersions, compactAttributes, createBaselineRegressionRule, createLlmUsageRule, createMaxStepDurationRule, createObservedOutcomeRule, createRequireCompletedRule, createRunDepthRule, createRunDurationRule, createRunStatusRule, createSafetyOversizedAttributeRule, createSafetyRawContentRule, createSafetyRedactionRule, createSafetySecretPatternRule, createStallDetectionRule, createStructureCycleRule, createStructureOrphanRule, createStructureParallelWidthRule, createStructureRelationshipRule, createToolUsageRule, defaultBundleOutputPath, defaultSuiteConfigTemplate, defineTraceContract, diffRuns, diffTraceEvents, enrichSessionRunRecord, escapeHtml, escapeMarkdown, evaluateTraceContract, extractMetadata, extractOutcomesFromTraceEvents, filterMetasBySessionScope, filterTraces, flattenTree, formatDuration2 as formatDuration, formatStepLabel, formatTimestamp, gateHasThresholds, getIndent, getTraceFilePath, inferEvidenceFileRole, isAgentInspectTrace, isAttributionConfidence, isCredentialSensitiveKey, isPersistedInspectEvent, loadSessionRunRecords, loadSuiteConfig, loadTraceMetadataList, manualTraceEventsToComparableRun, nanoid, normalizeBundleOutputPath, openTrace, parseCohortMetricList, parseDuration, parseDurationFilter, parseGateList, parseTraceJsonl, persistedInspectEventsToTraceEvents, projectLogicalEvents, renderActivitySummaryHuman, renderCohortReport, renderErrorLine, renderGateReport, renderObservedOutcomesHtml, renderObservedOutcomesMarkdown, renderRunDiff, renderRunWhat, renderStepLine, renderSuiteReport, renderTimeline, renderTraceStats, resolveBundleRunIds, resolveRedactionProfile, resolveSuiteTemplate, resolveTraceDir, runGate, runSuite, runTraceChecks, safeString, sanitizeBundleRunId, searchTraces, serializeEvidenceManifest, sha256Hex, stableJson, stringContainsHighConfidenceCredential, summarizeObservedOutcomes, summarizeSemanticParity, traceEventToPersistedInspectEvent, truncateName, truncateStringForProfile, validateEvent, validateSuiteConfig, verifyEvidenceDirectory, zeroKinds };
14891
- //# sourceMappingURL=chunk-YXDNWHNJ.mjs.map
14892
- //# sourceMappingURL=chunk-YXDNWHNJ.mjs.map
14962
+ export { ATTRIBUTION_CONFIDENCES, COHORT_METRIC_IDS, DEFAULT_REDACT_KEYS, DEFAULT_SUITE_ARTIFACTS_DIR, EVIDENCE_FORMAT_VERSION, EVIDENCE_HTML_FILENAME, EVIDENCE_MANIFEST_FILENAME, Redactor, TraceDirectory, TraceReadError, TreeBuilder, aggregateBundleSafeStatus, aggregateSessionCheckResults, analyzeCohort, applyProfileMetadataCaps, assertBundlePathContained, assertEvidenceRelativePath, buildActivitySummary, buildBundleMetadata, buildBundleSummaryMarkdown, buildEvidenceCausalFailureViewHtml, buildEvidenceCiPackage, buildEvidenceCircuitViewHtml, buildEvidenceContractsViewHtml, buildEvidenceDiffViewHtml, buildEvidenceHtmlShell, buildEvidenceManifest, buildEvidenceOutcomesViewHtml, buildEvidenceProvenanceViewHtml, buildEvidenceSafetyViewHtml, buildEvidenceTimelineViewHtml, buildEvidenceToolsLlmViewHtml, buildEvidenceTreeViewHtml, buildLocalExplanation, buildPlaceholderArtifact, buildRunSummary, buildRunTimeline, buildRunWhatSummary, buildSessionIndex, buildTraceStats, buildZipArchive, bundleFailsOnSafety, bundleRunAssetRelativePath, collectTraceSchemaVersions, compactAttributes, createBaselineRegressionRule, createLlmUsageRule, createMaxStepDurationRule, createObservedOutcomeRule, createRequireCompletedRule, createRunDepthRule, createRunDurationRule, createRunStatusRule, createSafetyOversizedAttributeRule, createSafetyRawContentRule, createSafetyRedactionRule, createSafetySecretPatternRule, createStallDetectionRule, createStructureCycleRule, createStructureOrphanRule, createStructureParallelWidthRule, createStructureRelationshipRule, createToolUsageRule, defaultBundleOutputPath, defaultSuiteConfigTemplate, defineTraceContract, diffRuns, diffTraceEvents, enrichSessionRunRecord, escapeHtml, escapeMarkdown, evaluateTraceContract, extractMetadata, extractOutcomesFromTraceEvents, filterMetasBySessionScope, filterTraces, flattenTree, formatDuration2 as formatDuration, formatStepLabel, formatTimestamp, gateHasThresholds, getIndent, getTraceFilePath, inferEvidenceFileRole, isAgentInspectTrace, isAttributionConfidence, isCredentialSensitiveKey, isPersistedInspectEvent, loadSessionRunRecords, loadSuiteConfig, loadTraceMetadataList, manualTraceEventsToComparableRun, nanoid, normalizeBundleOutputPath, openTrace, parseCohortMetricList, parseDuration, parseDurationFilter, parseGateList, parseTraceJsonl, persistedInspectEventsToRunTrees, persistedInspectEventsToTraceEvents, projectLogicalEvents, renderActivitySummaryHuman, renderCohortReport, renderErrorLine, renderGateReport, renderObservedOutcomesHtml, renderObservedOutcomesMarkdown, renderRunDiff, renderRunWhat, renderStepLine, renderSuiteReport, renderTimeline, renderTraceStats, resolveBundleRunIds, resolveRedactionProfile, resolveSuiteTemplate, resolveTraceDir, runGate, runSuite, runTraceChecks, safeString, sanitizeBundleRunId, searchTraces, serializeEvidenceManifest, sha256Hex, stableJson, stringContainsHighConfidenceCredential, summarizeObservedOutcomes, summarizeSemanticParity, traceEventToPersistedInspectEvent, truncateName, truncateStringForProfile, validateEvent, validateSuiteConfig, verifyEvidenceDirectory, zeroKinds };
14963
+ //# sourceMappingURL=chunk-QV73NM25.mjs.map
14964
+ //# sourceMappingURL=chunk-QV73NM25.mjs.map