agent-inspect 1.5.0 → 1.6.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 (85) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +12 -4
  3. package/docs/API.md +124 -9
  4. package/docs/ARCHITECTURE.md +4 -0
  5. package/docs/CLI.md +41 -12
  6. package/docs/KNOWN-ISSUES.md +8 -1
  7. package/docs/LIMITATIONS.md +11 -2
  8. package/docs/SCHEMA.md +16 -6
  9. package/package.json +21 -1
  10. package/packages/cli/dist/index.cjs +2449 -157
  11. package/packages/cli/dist/index.cjs.map +1 -1
  12. package/packages/cli/dist/index.mjs +2450 -158
  13. package/packages/cli/dist/index.mjs.map +1 -1
  14. package/packages/core/dist/advanced.cjs +839 -18
  15. package/packages/core/dist/advanced.cjs.map +1 -1
  16. package/packages/core/dist/advanced.d.cts +98 -3
  17. package/packages/core/dist/advanced.d.ts +98 -3
  18. package/packages/core/dist/advanced.mjs +7 -4
  19. package/packages/core/dist/chunk-57S5D6HR.mjs +655 -0
  20. package/packages/core/dist/chunk-57S5D6HR.mjs.map +1 -0
  21. package/packages/core/dist/chunk-6QSLZCBJ.mjs +743 -0
  22. package/packages/core/dist/chunk-6QSLZCBJ.mjs.map +1 -0
  23. package/packages/core/dist/chunk-6SZPTECC.mjs +342 -0
  24. package/packages/core/dist/chunk-6SZPTECC.mjs.map +1 -0
  25. package/packages/core/dist/{chunk-QX3ZMPUF.mjs → chunk-74XZ6N7Q.mjs} +13 -55
  26. package/packages/core/dist/chunk-74XZ6N7Q.mjs.map +1 -0
  27. package/packages/core/dist/{chunk-QPAU2TPA.mjs → chunk-HR7G62IE.mjs} +4 -4
  28. package/packages/core/dist/{chunk-QPAU2TPA.mjs.map → chunk-HR7G62IE.mjs.map} +1 -1
  29. package/packages/core/dist/chunk-S4YWKV4G.mjs +48 -0
  30. package/packages/core/dist/chunk-S4YWKV4G.mjs.map +1 -0
  31. package/packages/core/dist/chunk-TFLPUZ56.mjs +1571 -0
  32. package/packages/core/dist/chunk-TFLPUZ56.mjs.map +1 -0
  33. package/packages/core/dist/{chunk-Q6EPNB3V.mjs → chunk-TZISEVLQ.mjs} +34 -183
  34. package/packages/core/dist/chunk-TZISEVLQ.mjs.map +1 -0
  35. package/packages/core/dist/chunk-U2BGPESY.mjs +150 -0
  36. package/packages/core/dist/chunk-U2BGPESY.mjs.map +1 -0
  37. package/packages/core/dist/chunk-VTIB5MDK.mjs +304 -0
  38. package/packages/core/dist/chunk-VTIB5MDK.mjs.map +1 -0
  39. package/packages/core/dist/{chunk-5EMIZZXD.mjs → chunk-Y56BPA3B.mjs} +87 -4
  40. package/packages/core/dist/chunk-Y56BPA3B.mjs.map +1 -0
  41. package/packages/core/dist/diff.d.cts +3 -2
  42. package/packages/core/dist/diff.d.ts +3 -2
  43. package/packages/core/dist/exporters.cjs.map +1 -1
  44. package/packages/core/dist/exporters.d.cts +3 -2
  45. package/packages/core/dist/exporters.d.ts +3 -2
  46. package/packages/core/dist/exporters.mjs +2 -2
  47. package/packages/core/dist/index.cjs +2975 -229
  48. package/packages/core/dist/index.cjs.map +1 -1
  49. package/packages/core/dist/index.d.cts +27 -6
  50. package/packages/core/dist/index.d.ts +27 -6
  51. package/packages/core/dist/index.mjs +113 -60
  52. package/packages/core/dist/index.mjs.map +1 -1
  53. package/packages/core/dist/{log-config-BzGmDYum.d.cts → inspect-event-Des4JDHo.d.cts} +1 -31
  54. package/packages/core/dist/{log-config-BzGmDYum.d.ts → inspect-event-Des4JDHo.d.ts} +1 -31
  55. package/packages/core/dist/log-config-BnH8Ykcb.d.cts +33 -0
  56. package/packages/core/dist/log-config-C1GcJPIM.d.ts +33 -0
  57. package/packages/core/dist/logs.d.cts +3 -2
  58. package/packages/core/dist/logs.d.ts +3 -2
  59. package/packages/core/dist/logs.mjs +3 -3
  60. package/packages/core/dist/persisted-inspect-event-0kaRADsp.d.cts +56 -0
  61. package/packages/core/dist/persisted-inspect-event-DiFto0K2.d.ts +56 -0
  62. package/packages/core/dist/persisted.cjs +38 -40
  63. package/packages/core/dist/persisted.cjs.map +1 -1
  64. package/packages/core/dist/persisted.d.cts +6 -55
  65. package/packages/core/dist/persisted.d.ts +6 -55
  66. package/packages/core/dist/persisted.mjs +4 -2
  67. package/packages/core/dist/readers.cjs +2590 -0
  68. package/packages/core/dist/readers.cjs.map +1 -0
  69. package/packages/core/dist/readers.d.cts +80 -0
  70. package/packages/core/dist/readers.d.ts +80 -0
  71. package/packages/core/dist/readers.mjs +9 -0
  72. package/packages/core/dist/readers.mjs.map +1 -0
  73. package/packages/core/dist/{types-CNbheSdk.d.cts → types-DB8jB6Jg.d.cts} +7 -1
  74. package/packages/core/dist/{types-Bkt7LS01.d.ts → types-tSix7tfv.d.ts} +7 -1
  75. package/packages/core/dist/writers.cjs +997 -0
  76. package/packages/core/dist/writers.cjs.map +1 -0
  77. package/packages/core/dist/writers.d.cts +62 -0
  78. package/packages/core/dist/writers.d.ts +62 -0
  79. package/packages/core/dist/writers.mjs +9 -0
  80. package/packages/core/dist/writers.mjs.map +1 -0
  81. package/packages/core/dist/chunk-5EMIZZXD.mjs.map +0 -1
  82. package/packages/core/dist/chunk-Q6EPNB3V.mjs.map +0 -1
  83. package/packages/core/dist/chunk-QX3ZMPUF.mjs.map +0 -1
  84. package/packages/core/dist/chunk-XDBND27A.mjs +0 -975
  85. package/packages/core/dist/chunk-XDBND27A.mjs.map +0 -1
@@ -1,11 +1,15 @@
1
- import { T as TraceEvent, R as RunSummary, a as TraceMetadata, b as TraceMetadataStatus, S as StepType, c as StepStatus, d as TraceCorrelationMetadata, e as RedactionProfile, I as InspectRunOptions, f as StepOptions, O as ObserveOptions } from './types-CNbheSdk.cjs';
2
- export { A as ActiveStepContext, E as ErrorInfo, g as ExecutionContext, h as Run, i as RunCompletedEvent, j as RunStartedEvent, k as RunStatus, l as Step, m as StepCompletedEvent, n as StepMetadata, o as StepStartedEvent, p as TokenMetadata, q as TraceEventBase, r as TraceSchemaVersion, s as isStepStatus, t as isStepType, u as isTraceEvent } from './types-CNbheSdk.cjs';
3
- export { A as AttributionConfidence, E as EventSource, I as InspectEvent, a as InspectKind, b as InspectNode, c as InspectRunTree, L as LogEventMapping, d as LogIngestConfig, R as RedactionRule, e as RedactionStrategy } from './log-config-BzGmDYum.cjs';
4
- import { PersistedInspectEvent } from './persisted.cjs';
5
- export { InspectEventToPersistedOptions, PersistedEventSource, PersistedEventSourceType, PersistedEventStatus, PersistedInspectError, PersistedSchemaVersion, PersistedToInspectEventOptions, PersistedToTraceEventOptions, PersistedTokenUsage, PersistedTraceContext, PersistedTreeBridgeOptions, TraceEventToPersistedOptions, inspectEventToPersistedInspectEvent, inspectEventsToPersistedInspectEvents, isPersistedInspectEvent, persistedInspectEventToInspectEvent, persistedInspectEventToTraceEvents, persistedInspectEventsToInspectEvents, persistedInspectEventsToRunTrees, persistedInspectEventsToTraceEvents, traceEventToPersistedInspectEvent, traceEventsToPersistedInspectEvents, traceEventsToPersistedRunTrees } from './persisted.cjs';
1
+ import { T as TraceEvent, R as RunSummary, a as TraceMetadata, b as TraceMetadataStatus, S as StepType, c as StepStatus, d as TraceCorrelationMetadata, e as RedactionProfile, I as InspectRunOptions, f as StepOptions, O as ObserveOptions } from './types-DB8jB6Jg.cjs';
2
+ export { A as ActiveStepContext, E as ErrorInfo, g as ExecutionContext, h as Run, i as RunCompletedEvent, j as RunStartedEvent, k as RunStatus, l as Step, m as StepCompletedEvent, n as StepMetadata, o as StepStartedEvent, p as TokenMetadata, q as TraceEventBase, r as TraceSchemaVersion, s as isStepStatus, t as isStepType, u as isTraceEvent } from './types-DB8jB6Jg.cjs';
3
+ export { A as AttributionConfidence, E as EventSource, a as InspectEvent, I as InspectKind, b as InspectNode, c as InspectRunTree } from './inspect-event-Des4JDHo.cjs';
4
+ import { P as PersistedInspectEvent } from './persisted-inspect-event-0kaRADsp.cjs';
5
+ export { a as PersistedEventSource, b as PersistedEventSourceType, c as PersistedEventStatus, d as PersistedInspectError, e as PersistedSchemaVersion, f as PersistedTokenUsage, g as PersistedTraceContext, i as isPersistedInspectEvent } from './persisted-inspect-event-0kaRADsp.cjs';
6
+ export { InspectEventToPersistedOptions, PersistedToInspectEventOptions, PersistedToTraceEventOptions, PersistedTreeBridgeOptions, TraceEventToPersistedOptions, inspectEventToPersistedInspectEvent, inspectEventsToPersistedInspectEvents, persistedInspectEventToInspectEvent, persistedInspectEventToTraceEvents, persistedInspectEventsToInspectEvents, persistedInspectEventsToRunTrees, persistedInspectEventsToTraceEvents, traceEventToPersistedInspectEvent, traceEventsToPersistedInspectEvents, traceEventsToPersistedRunTrees } from './persisted.cjs';
7
+ export { L as LogEventMapping, a as LogIngestConfig, R as RedactionRule, b as RedactionStrategy } from './log-config-BnH8Ykcb.cjs';
6
8
  export { DEFAULT_LOG_INGEST_CONFIG, DEFAULT_REDACT_KEYS, EventNormalizer, JsonLogParser, LiveLogAccumulator, LiveLogAccumulatorOptions, LiveLogUpdate, Log4jsParser, LogSourceFormat, LogToTreeResult, NormalizeOptions, ParseLogLineOptions, ParseLogsOptions, ParseResult, ParserWarning, ParserWarningCode, RawLogRecord, Redactor, RedactorOptions, RenderTreeOptions, TreeBuilder, TreeBuilderOptions, loadLogIngestConfig, matchMapping, mergeLogIngestConfig, parseLogLine, parseLogsToTrees, renderRunTree, renderRunTrees, wildcardMatch } from './logs.cjs';
7
- export { DEFAULT_MAX_EVENT_BYTES, DEFAULT_MAX_METADATA_VALUE_LENGTH, DEFAULT_MAX_PREVIEW_LENGTH, DEFAULT_TRACE_DIR_NAME, FALLBACK_TRACE_DIR, MAX_NAME_LENGTH, MAX_TERMINAL_DEPTH, MAX_TERMINAL_NAME_LENGTH, RUNS_DIR_NAME, ResolvedRedactionProfile, TERMINAL_INDENT, TraceSafetyOptions, createRunId, createStepId, ensureTraceDir, formatDuration, formatError, formatTerminalName, formatTimestamp, getCurrentContext, getCurrentCorrelationMetadata, getCurrentDepth, getCurrentRunId, getCurrentRunName, getCurrentStepId, getDefaultTraceDir, getIndent, getParentStepId, getTraceDirFromContext, getTraceFilePath, getTraceSafetyFromContext, hasActiveContext, isSilentContext, prepareMetadataForDisk, prepareTraceEventForDisk, printError, printFailedAt, printRunComplete, printRunStart, printStepComplete, printStepStart, renderErrorLine, renderRunSummary, renderStepLine, resolveRedactionProfile, resolveTraceSafetyOptions, runWithContext, runWithStepContext, truncateName, warn } from './advanced.cjs';
9
+ export { CreateInspectorOptions, DEFAULT_MAX_EVENT_BYTES, DEFAULT_MAX_METADATA_VALUE_LENGTH, DEFAULT_MAX_PREVIEW_LENGTH, DEFAULT_TRACE_DIR_NAME, FALLBACK_TRACE_DIR, Inspector, InspectorCaptureOptions, InspectorObserveOptions, InspectorRunOptions, InspectorRuntime, InspectorRuntimeContext, InspectorRuntimeDiagnostics, InspectorRuntimeOptions, InspectorStepOptions, MAX_NAME_LENGTH, MAX_TERMINAL_DEPTH, MAX_TERMINAL_NAME_LENGTH, RUNS_DIR_NAME, ResolvedRedactionProfile, TERMINAL_INDENT, TraceSafetyOptions, createInspector, createInspectorRuntime, createRunId, createStepId, ensureTraceDir, formatDuration, formatError, formatTerminalName, formatTimestamp, getCurrentContext, getCurrentCorrelationMetadata, getCurrentDepth, getCurrentRunId, getCurrentRunName, getCurrentStepId, getDefaultTraceDir, getIndent, getParentStepId, getTraceDirFromContext, getTraceFilePath, getTraceSafetyFromContext, hasActiveContext, isSilentContext, prepareMetadataForDisk, prepareTraceEventForDisk, printError, printFailedAt, printRunComplete, printRunStart, printStepComplete, printStepStart, renderErrorLine, renderRunSummary, renderStepLine, resolveRedactionProfile, resolveTraceSafetyOptions, runWithContext, runWithStepContext, truncateName, warn } from './advanced.cjs';
8
10
  import { Stats } from 'node:fs';
11
+ export { BufferedFileWriterOptions, BufferedFileWriterOverflowMode, CompositeTraceWriterOptions, FileTraceWriterOptions, MemoryTraceWriter, TraceWriter, TraceWriterStats, bufferedFileWriter, compositeWriter, fileWriter, memoryWriter, nullWriter } from './writers.cjs';
12
+ export { DEFAULT_TRACE_READERS, TraceFormatCandidate, TraceFormatDetectionResult, TraceFormatDetectionStatus, TraceInput, TraceReadError, TraceReadErrorCode, TraceReadOptions, TraceReadResult, TraceReadWarning, TraceReadWarningSeverity, TraceReader, TraceReaderDetectOptions, TraceReaderReadOptions, agentInspectJsonlReader, detectTraceFormat, openTrace, readTrace } from './readers.cjs';
9
13
  export { DiffKind, DiffOptions, DiffPath, DiffPathSegment, DiffSeverity, RenderDiffOptions, RunComparable, RunDiffItem, RunDiffResult, RunDiffSummary, StepComparable, diffRuns, diffTraceEvents, manualTraceEventsToComparableRun, renderRunDiff } from './diff.cjs';
10
14
  export { EXPORT_PAYLOAD_VERSION, ExportFormat, ExportOptions, ExportResult, ExportValidationResult, OpenInferenceExport, OpenInferenceSpan, TraceExporter, compactAttributes, escapeHtml, escapeMarkdown, exportHtml, exportMarkdown, exportOpenInference, exportOtlpJson, exportRunTree, flattenTree, manualTraceEventsToRunTree, mergeExportDefaults, redactRunTreeForExport, safeString, stableJson, summarizeTree, validateExport, validateExportContent } from './exporters.cjs';
11
15
 
@@ -38,13 +42,28 @@ declare function listTraceFiles(traceDir: string): Promise<string[]>;
38
42
  declare function getRunIdFromTraceFileName(fileName: string): string | undefined;
39
43
 
40
44
  type TraceJsonlFormat = "0.1" | "0.2" | "mixed" | "empty";
45
+ type ParsedTraceJsonlRow = {
46
+ format: "0.1";
47
+ event: TraceEvent;
48
+ sourceLine: number;
49
+ } | {
50
+ format: "0.2";
51
+ event: PersistedInspectEvent;
52
+ sourceLine: number;
53
+ };
41
54
  interface ParseTraceJsonlResult {
42
55
  format: TraceJsonlFormat;
56
+ /** Count of valid source JSONL rows before any one-to-many normalization. */
57
+ sourceEventCount: number;
43
58
  events: TraceEvent[];
44
59
  persisted: PersistedInspectEvent[];
60
+ /** Valid source rows in JSONL order, before cross-version normalization. */
61
+ rows: ParsedTraceJsonlRow[];
45
62
  }
46
63
  interface ParseTraceJsonlOptions {
47
64
  validate?: (value: unknown) => value is TraceEvent;
65
+ /** Emit parse warnings through the standard AgentInspect warning channel (default true). */
66
+ warnings?: boolean;
48
67
  }
49
68
  /**
50
69
  * Parses JSONL content into normalized v0.1 {@link TraceEvent} rows.
@@ -141,6 +160,8 @@ interface RunWhatSummary {
141
160
  totalTokens?: {
142
161
  input: number;
143
162
  output: number;
163
+ total?: number;
164
+ cached?: number;
144
165
  };
145
166
  correlation?: TraceCorrelationMetadata;
146
167
  failedStepNames: string[];
@@ -1,11 +1,15 @@
1
- import { T as TraceEvent, R as RunSummary, a as TraceMetadata, b as TraceMetadataStatus, S as StepType, c as StepStatus, d as TraceCorrelationMetadata, e as RedactionProfile, I as InspectRunOptions, f as StepOptions, O as ObserveOptions } from './types-Bkt7LS01.js';
2
- export { A as ActiveStepContext, E as ErrorInfo, g as ExecutionContext, h as Run, i as RunCompletedEvent, j as RunStartedEvent, k as RunStatus, l as Step, m as StepCompletedEvent, n as StepMetadata, o as StepStartedEvent, p as TokenMetadata, q as TraceEventBase, r as TraceSchemaVersion, s as isStepStatus, t as isStepType, u as isTraceEvent } from './types-Bkt7LS01.js';
3
- export { A as AttributionConfidence, E as EventSource, I as InspectEvent, a as InspectKind, b as InspectNode, c as InspectRunTree, L as LogEventMapping, d as LogIngestConfig, R as RedactionRule, e as RedactionStrategy } from './log-config-BzGmDYum.js';
4
- import { PersistedInspectEvent } from './persisted.js';
5
- export { InspectEventToPersistedOptions, PersistedEventSource, PersistedEventSourceType, PersistedEventStatus, PersistedInspectError, PersistedSchemaVersion, PersistedToInspectEventOptions, PersistedToTraceEventOptions, PersistedTokenUsage, PersistedTraceContext, PersistedTreeBridgeOptions, TraceEventToPersistedOptions, inspectEventToPersistedInspectEvent, inspectEventsToPersistedInspectEvents, isPersistedInspectEvent, persistedInspectEventToInspectEvent, persistedInspectEventToTraceEvents, persistedInspectEventsToInspectEvents, persistedInspectEventsToRunTrees, persistedInspectEventsToTraceEvents, traceEventToPersistedInspectEvent, traceEventsToPersistedInspectEvents, traceEventsToPersistedRunTrees } from './persisted.js';
1
+ import { T as TraceEvent, R as RunSummary, a as TraceMetadata, b as TraceMetadataStatus, S as StepType, c as StepStatus, d as TraceCorrelationMetadata, e as RedactionProfile, I as InspectRunOptions, f as StepOptions, O as ObserveOptions } from './types-tSix7tfv.js';
2
+ export { A as ActiveStepContext, E as ErrorInfo, g as ExecutionContext, h as Run, i as RunCompletedEvent, j as RunStartedEvent, k as RunStatus, l as Step, m as StepCompletedEvent, n as StepMetadata, o as StepStartedEvent, p as TokenMetadata, q as TraceEventBase, r as TraceSchemaVersion, s as isStepStatus, t as isStepType, u as isTraceEvent } from './types-tSix7tfv.js';
3
+ export { A as AttributionConfidence, E as EventSource, a as InspectEvent, I as InspectKind, b as InspectNode, c as InspectRunTree } from './inspect-event-Des4JDHo.js';
4
+ import { P as PersistedInspectEvent } from './persisted-inspect-event-DiFto0K2.js';
5
+ export { a as PersistedEventSource, b as PersistedEventSourceType, c as PersistedEventStatus, d as PersistedInspectError, e as PersistedSchemaVersion, f as PersistedTokenUsage, g as PersistedTraceContext, i as isPersistedInspectEvent } from './persisted-inspect-event-DiFto0K2.js';
6
+ export { InspectEventToPersistedOptions, PersistedToInspectEventOptions, PersistedToTraceEventOptions, PersistedTreeBridgeOptions, TraceEventToPersistedOptions, inspectEventToPersistedInspectEvent, inspectEventsToPersistedInspectEvents, persistedInspectEventToInspectEvent, persistedInspectEventToTraceEvents, persistedInspectEventsToInspectEvents, persistedInspectEventsToRunTrees, persistedInspectEventsToTraceEvents, traceEventToPersistedInspectEvent, traceEventsToPersistedInspectEvents, traceEventsToPersistedRunTrees } from './persisted.js';
7
+ export { L as LogEventMapping, a as LogIngestConfig, R as RedactionRule, b as RedactionStrategy } from './log-config-C1GcJPIM.js';
6
8
  export { DEFAULT_LOG_INGEST_CONFIG, DEFAULT_REDACT_KEYS, EventNormalizer, JsonLogParser, LiveLogAccumulator, LiveLogAccumulatorOptions, LiveLogUpdate, Log4jsParser, LogSourceFormat, LogToTreeResult, NormalizeOptions, ParseLogLineOptions, ParseLogsOptions, ParseResult, ParserWarning, ParserWarningCode, RawLogRecord, Redactor, RedactorOptions, RenderTreeOptions, TreeBuilder, TreeBuilderOptions, loadLogIngestConfig, matchMapping, mergeLogIngestConfig, parseLogLine, parseLogsToTrees, renderRunTree, renderRunTrees, wildcardMatch } from './logs.js';
7
- export { DEFAULT_MAX_EVENT_BYTES, DEFAULT_MAX_METADATA_VALUE_LENGTH, DEFAULT_MAX_PREVIEW_LENGTH, DEFAULT_TRACE_DIR_NAME, FALLBACK_TRACE_DIR, MAX_NAME_LENGTH, MAX_TERMINAL_DEPTH, MAX_TERMINAL_NAME_LENGTH, RUNS_DIR_NAME, ResolvedRedactionProfile, TERMINAL_INDENT, TraceSafetyOptions, createRunId, createStepId, ensureTraceDir, formatDuration, formatError, formatTerminalName, formatTimestamp, getCurrentContext, getCurrentCorrelationMetadata, getCurrentDepth, getCurrentRunId, getCurrentRunName, getCurrentStepId, getDefaultTraceDir, getIndent, getParentStepId, getTraceDirFromContext, getTraceFilePath, getTraceSafetyFromContext, hasActiveContext, isSilentContext, prepareMetadataForDisk, prepareTraceEventForDisk, printError, printFailedAt, printRunComplete, printRunStart, printStepComplete, printStepStart, renderErrorLine, renderRunSummary, renderStepLine, resolveRedactionProfile, resolveTraceSafetyOptions, runWithContext, runWithStepContext, truncateName, warn } from './advanced.js';
9
+ export { CreateInspectorOptions, DEFAULT_MAX_EVENT_BYTES, DEFAULT_MAX_METADATA_VALUE_LENGTH, DEFAULT_MAX_PREVIEW_LENGTH, DEFAULT_TRACE_DIR_NAME, FALLBACK_TRACE_DIR, Inspector, InspectorCaptureOptions, InspectorObserveOptions, InspectorRunOptions, InspectorRuntime, InspectorRuntimeContext, InspectorRuntimeDiagnostics, InspectorRuntimeOptions, InspectorStepOptions, MAX_NAME_LENGTH, MAX_TERMINAL_DEPTH, MAX_TERMINAL_NAME_LENGTH, RUNS_DIR_NAME, ResolvedRedactionProfile, TERMINAL_INDENT, TraceSafetyOptions, createInspector, createInspectorRuntime, createRunId, createStepId, ensureTraceDir, formatDuration, formatError, formatTerminalName, formatTimestamp, getCurrentContext, getCurrentCorrelationMetadata, getCurrentDepth, getCurrentRunId, getCurrentRunName, getCurrentStepId, getDefaultTraceDir, getIndent, getParentStepId, getTraceDirFromContext, getTraceFilePath, getTraceSafetyFromContext, hasActiveContext, isSilentContext, prepareMetadataForDisk, prepareTraceEventForDisk, printError, printFailedAt, printRunComplete, printRunStart, printStepComplete, printStepStart, renderErrorLine, renderRunSummary, renderStepLine, resolveRedactionProfile, resolveTraceSafetyOptions, runWithContext, runWithStepContext, truncateName, warn } from './advanced.js';
8
10
  import { Stats } from 'node:fs';
11
+ export { BufferedFileWriterOptions, BufferedFileWriterOverflowMode, CompositeTraceWriterOptions, FileTraceWriterOptions, MemoryTraceWriter, TraceWriter, TraceWriterStats, bufferedFileWriter, compositeWriter, fileWriter, memoryWriter, nullWriter } from './writers.js';
12
+ export { DEFAULT_TRACE_READERS, TraceFormatCandidate, TraceFormatDetectionResult, TraceFormatDetectionStatus, TraceInput, TraceReadError, TraceReadErrorCode, TraceReadOptions, TraceReadResult, TraceReadWarning, TraceReadWarningSeverity, TraceReader, TraceReaderDetectOptions, TraceReaderReadOptions, agentInspectJsonlReader, detectTraceFormat, openTrace, readTrace } from './readers.js';
9
13
  export { DiffKind, DiffOptions, DiffPath, DiffPathSegment, DiffSeverity, RenderDiffOptions, RunComparable, RunDiffItem, RunDiffResult, RunDiffSummary, StepComparable, diffRuns, diffTraceEvents, manualTraceEventsToComparableRun, renderRunDiff } from './diff.js';
10
14
  export { EXPORT_PAYLOAD_VERSION, ExportFormat, ExportOptions, ExportResult, ExportValidationResult, OpenInferenceExport, OpenInferenceSpan, TraceExporter, compactAttributes, escapeHtml, escapeMarkdown, exportHtml, exportMarkdown, exportOpenInference, exportOtlpJson, exportRunTree, flattenTree, manualTraceEventsToRunTree, mergeExportDefaults, redactRunTreeForExport, safeString, stableJson, summarizeTree, validateExport, validateExportContent } from './exporters.js';
11
15
 
@@ -38,13 +42,28 @@ declare function listTraceFiles(traceDir: string): Promise<string[]>;
38
42
  declare function getRunIdFromTraceFileName(fileName: string): string | undefined;
39
43
 
40
44
  type TraceJsonlFormat = "0.1" | "0.2" | "mixed" | "empty";
45
+ type ParsedTraceJsonlRow = {
46
+ format: "0.1";
47
+ event: TraceEvent;
48
+ sourceLine: number;
49
+ } | {
50
+ format: "0.2";
51
+ event: PersistedInspectEvent;
52
+ sourceLine: number;
53
+ };
41
54
  interface ParseTraceJsonlResult {
42
55
  format: TraceJsonlFormat;
56
+ /** Count of valid source JSONL rows before any one-to-many normalization. */
57
+ sourceEventCount: number;
43
58
  events: TraceEvent[];
44
59
  persisted: PersistedInspectEvent[];
60
+ /** Valid source rows in JSONL order, before cross-version normalization. */
61
+ rows: ParsedTraceJsonlRow[];
45
62
  }
46
63
  interface ParseTraceJsonlOptions {
47
64
  validate?: (value: unknown) => value is TraceEvent;
65
+ /** Emit parse warnings through the standard AgentInspect warning channel (default true). */
66
+ warnings?: boolean;
48
67
  }
49
68
  /**
50
69
  * Parses JSONL content into normalized v0.1 {@link TraceEvent} rows.
@@ -141,6 +160,8 @@ interface RunWhatSummary {
141
160
  totalTokens?: {
142
161
  input: number;
143
162
  output: number;
163
+ total?: number;
164
+ cached?: number;
144
165
  };
145
166
  correlation?: TraceCorrelationMetadata;
146
167
  failedStepNames: string[];
@@ -1,19 +1,26 @@
1
- import { getCurrentContext, warn, createStepId, getCurrentDepth, getParentStepId, getTraceSafetyFromContext, runWithStepContext, formatError, truncateName, getDefaultTraceDir, isTraceEvent, parseDuration, formatTimestamp, formatDuration, readTraceEvents, createRunId, resolveTraceSafetyOptions, runWithContext, getTraceFilePath, prepareTraceEventForDisk, writeTraceEvent, printStepStart, printStepComplete, printError, printFailedAt, initializeTraceFile, printRunStart, printRunComplete } from './chunk-XDBND27A.mjs';
2
- export { DEFAULT_MAX_EVENT_BYTES, DEFAULT_MAX_METADATA_VALUE_LENGTH, DEFAULT_MAX_PREVIEW_LENGTH, DEFAULT_TRACE_DIR_NAME, FALLBACK_TRACE_DIR, MAX_NAME_LENGTH, MAX_TERMINAL_DEPTH, MAX_TERMINAL_NAME_LENGTH, RUNS_DIR_NAME, TERMINAL_INDENT, createRunId, createStepId, ensureTraceDir, formatDuration, formatError, formatTerminalName, formatTimestamp, getCurrentContext, getCurrentCorrelationMetadata, getCurrentDepth, getCurrentRunId, getCurrentRunName, getCurrentStepId, getDefaultTraceDir, getIndent, getParentStepId, getRunIdFromTraceFileName, getTraceDirFromContext, getTraceFilePath, getTraceSafetyFromContext, hasActiveContext, initializeTraceFile, isSilentContext, isStepStatus, isStepType, isTraceEvent, listTraceFiles, parseDuration, parseTraceJsonl, prepareMetadataForDisk, prepareTraceEventForDisk, printError, printFailedAt, printRunComplete, printRunStart, printStepComplete, printStepStart, readTraceEvents, readTraceFile, renderErrorLine, renderRunSummary, renderStepLine, resolveTraceSafetyOptions, runWithContext, runWithStepContext, serializeEvent, truncateName, unknownTraceFormatMessage, validateEvent, warn, writeTraceEvent } from './chunk-XDBND27A.mjs';
3
- export { inspectEventToPersistedInspectEvent, inspectEventsToPersistedInspectEvents, persistedInspectEventToInspectEvent, persistedInspectEventsToInspectEvents, persistedInspectEventsToRunTrees, traceEventToPersistedInspectEvent, traceEventsToPersistedInspectEvents, traceEventsToPersistedRunTrees } from './chunk-Q6EPNB3V.mjs';
4
- import { buildRunStartedMetadata } from './chunk-QX3ZMPUF.mjs';
5
- export { isPersistedInspectEvent, persistedInspectEventToTraceEvents, persistedInspectEventsToTraceEvents } from './chunk-QX3ZMPUF.mjs';
6
- export { DEFAULT_LOG_INGEST_CONFIG, EventNormalizer, JsonLogParser, LiveLogAccumulator, Log4jsParser, loadLogIngestConfig, matchMapping, mergeLogIngestConfig, parseLogLine, parseLogsToTrees, renderRunTree, renderRunTrees, wildcardMatch } from './chunk-QPAU2TPA.mjs';
7
- import './chunk-7TGZLWEE.mjs';
8
- export { TreeBuilder } from './chunk-E5F2LQCX.mjs';
9
- import { exportMarkdown, exportHtml, manualTraceEventsToRunTree, redactRunTreeForExport } from './chunk-5EMIZZXD.mjs';
10
- export { EXPORT_PAYLOAD_VERSION, exportHtml, exportMarkdown, exportOpenInference, exportOtlpJson, exportRunTree, manualTraceEventsToRunTree, mergeExportDefaults, redactRunTreeForExport, validateExport, validateExportContent } from './chunk-5EMIZZXD.mjs';
11
- export { resolveRedactionProfile } from './chunk-EDTQHZPM.mjs';
12
- export { DEFAULT_REDACT_KEYS, Redactor } from './chunk-VU6O5QAH.mjs';
1
+ import { getCurrentContext, getCurrentDepth, getParentStepId, getTraceSafetyFromContext, runWithStepContext, runWithContext, printStepStart, printStepComplete, printError, printFailedAt, printRunStart, printRunComplete } from './chunk-6QSLZCBJ.mjs';
2
+ export { MAX_TERMINAL_DEPTH, MAX_TERMINAL_NAME_LENGTH, TERMINAL_INDENT, createInspector, createInspectorRuntime, formatTerminalName, getCurrentContext, getCurrentCorrelationMetadata, getCurrentDepth, getCurrentRunId, getCurrentRunName, getCurrentStepId, getIndent, getParentStepId, getTraceDirFromContext, getTraceSafetyFromContext, hasActiveContext, isSilentContext, printError, printFailedAt, printRunComplete, printRunStart, printStepComplete, printStepStart, renderErrorLine, renderRunSummary, renderStepLine, runWithContext, runWithStepContext } from './chunk-6QSLZCBJ.mjs';
3
+ export { inspectEventToPersistedInspectEvent, inspectEventsToPersistedInspectEvents } from './chunk-U2BGPESY.mjs';
4
+ export { DEFAULT_LOG_INGEST_CONFIG, EventNormalizer, JsonLogParser, LiveLogAccumulator, Log4jsParser, loadLogIngestConfig, matchMapping, mergeLogIngestConfig, parseLogLine, parseLogsToTrees, renderRunTree, renderRunTrees, wildcardMatch } from './chunk-HR7G62IE.mjs';
5
+ import { redactTraceEventsForReport, exportMarkdown, exportHtml, manualTraceEventsToRunTree, redactRunTreeForExport } from './chunk-Y56BPA3B.mjs';
6
+ export { EXPORT_PAYLOAD_VERSION, exportHtml, exportMarkdown, exportOpenInference, exportOtlpJson, exportRunTree, manualTraceEventsToRunTree, mergeExportDefaults, redactRunTreeForExport, validateExport, validateExportContent } from './chunk-Y56BPA3B.mjs';
13
7
  export { diffRuns, diffTraceEvents, manualTraceEventsToComparableRun, renderRunDiff } from './chunk-YWAOOXLR.mjs';
14
8
  import './chunk-BT7CATSD.mjs';
15
9
  import { escapeMarkdown, escapeHtml } from './chunk-HY7H3CQM.mjs';
16
10
  export { compactAttributes, escapeHtml, escapeMarkdown, flattenTree, safeString, stableJson, summarizeTree } from './chunk-HY7H3CQM.mjs';
11
+ export { bufferedFileWriter, compositeWriter, fileWriter, memoryWriter, nullWriter } from './chunk-6SZPTECC.mjs';
12
+ import { readTraceEventsFromFile, resolveTraceSafetyOptions, prepareTraceEventForDisk, writeTraceEvent, initializeTraceFile } from './chunk-57S5D6HR.mjs';
13
+ export { DEFAULT_MAX_EVENT_BYTES, DEFAULT_MAX_METADATA_VALUE_LENGTH, DEFAULT_MAX_PREVIEW_LENGTH, getRunIdFromTraceFileName, initializeTraceFile, listTraceFiles, prepareMetadataForDisk, prepareTraceEventForDisk, readTraceEvents, readTraceFile, resolveTraceSafetyOptions, serializeEvent, validateEvent, writeTraceEvent } from './chunk-57S5D6HR.mjs';
14
+ export { resolveRedactionProfile } from './chunk-EDTQHZPM.mjs';
15
+ export { DEFAULT_REDACT_KEYS, Redactor } from './chunk-VU6O5QAH.mjs';
16
+ export { DEFAULT_TRACE_READERS, TraceReadError, agentInspectJsonlReader, detectTraceFormat, openTrace, readTrace } from './chunk-TFLPUZ56.mjs';
17
+ export { persistedInspectEventToInspectEvent, persistedInspectEventsToInspectEvents, persistedInspectEventsToRunTrees, traceEventToPersistedInspectEvent, traceEventsToPersistedInspectEvents, traceEventsToPersistedRunTrees } from './chunk-TZISEVLQ.mjs';
18
+ import { buildRunStartedMetadata } from './chunk-S4YWKV4G.mjs';
19
+ export { TreeBuilder } from './chunk-E5F2LQCX.mjs';
20
+ import { warn, createStepId, formatError, truncateName, getDefaultTraceDir, parseTraceJsonl, parseDuration, formatTimestamp, formatDuration, isTraceEvent, createRunId, getTraceFilePath } from './chunk-VTIB5MDK.mjs';
21
+ export { DEFAULT_TRACE_DIR_NAME, FALLBACK_TRACE_DIR, MAX_NAME_LENGTH, RUNS_DIR_NAME, createRunId, createStepId, ensureTraceDir, formatDuration, formatError, formatTimestamp, getDefaultTraceDir, getTraceFilePath, isStepStatus, isStepType, isTraceEvent, parseDuration, parseTraceJsonl, truncateName, unknownTraceFormatMessage, warn } from './chunk-VTIB5MDK.mjs';
22
+ export { isPersistedInspectEvent, persistedInspectEventToTraceEvents, persistedInspectEventsToTraceEvents } from './chunk-74XZ6N7Q.mjs';
23
+ import './chunk-7TGZLWEE.mjs';
17
24
  import { readdir, stat, readFile } from 'fs/promises';
18
25
  import path from 'path';
19
26
  import { createReadStream } from 'fs';
@@ -55,12 +62,10 @@ var TraceDirectory = class {
55
62
  function isFiniteNumber(v) {
56
63
  return typeof v === "number" && Number.isFinite(v);
57
64
  }
58
- function safeParseJson(line) {
59
- try {
60
- return JSON.parse(line);
61
- } catch {
62
- return void 0;
63
- }
65
+ function parseIsoToMs(value) {
66
+ if (value === void 0) return void 0;
67
+ const parsed = Date.parse(value);
68
+ return Number.isFinite(parsed) ? parsed : void 0;
64
69
  }
65
70
  async function extractMetadata(filePath, _quickScan) {
66
71
  const stats = await stat(filePath);
@@ -69,8 +74,7 @@ async function extractMetadata(filePath, _quickScan) {
69
74
  runIdFromFile = runIdFromFile.slice(0, -".jsonl".length);
70
75
  }
71
76
  const raw = await readFile(filePath, "utf-8");
72
- const lines = raw.split(/\r?\n/);
73
- let eventCount = 0;
77
+ const parsedTrace = parseTraceJsonl(raw, { warnings: false });
74
78
  let runId;
75
79
  let name;
76
80
  let startedAt;
@@ -80,16 +84,32 @@ async function extractMetadata(filePath, _quickScan) {
80
84
  let hasRunCompleted = false;
81
85
  let runCompletedStatus;
82
86
  let anyStepError = false;
83
- let anyKnownEvent = false;
84
- for (const line of lines) {
85
- const trimmed = line.trim();
86
- if (trimmed === "") continue;
87
- const parsed = safeParseJson(trimmed);
88
- if (!parsed) continue;
89
- if (!isTraceEvent(parsed)) continue;
90
- const e = parsed;
91
- anyKnownEvent = true;
92
- eventCount += 1;
87
+ const anyKnownEvent = parsedTrace.sourceEventCount > 0;
88
+ let persistedStatus;
89
+ const persistedRun = parsedTrace.persisted.find(
90
+ (event) => event.kind === "RUN"
91
+ );
92
+ if (persistedRun) {
93
+ runId = persistedRun.runId;
94
+ if (persistedRun.name.trim() !== "") {
95
+ name = persistedRun.name;
96
+ }
97
+ startedAt = parseIsoToMs(persistedRun.startedAt) ?? parseIsoToMs(persistedRun.timestamp);
98
+ endedAt = parseIsoToMs(persistedRun.endedAt);
99
+ if (isFiniteNumber(persistedRun.durationMs)) {
100
+ explicitDurationMs = persistedRun.durationMs;
101
+ if (endedAt === void 0 && startedAt !== void 0) {
102
+ endedAt = startedAt + persistedRun.durationMs;
103
+ }
104
+ }
105
+ if (persistedRun.status === "ok") persistedStatus = "success";
106
+ else if (persistedRun.status === "error") persistedStatus = "error";
107
+ else if (persistedRun.status === "running") persistedStatus = "running";
108
+ else if (persistedRun.status === "unknown") persistedStatus = "unknown";
109
+ } else {
110
+ runId = parsedTrace.persisted[0]?.runId;
111
+ }
112
+ for (const e of parsedTrace.events) {
93
113
  if (runId === void 0 && typeof e.runId === "string") {
94
114
  runId = e.runId;
95
115
  }
@@ -126,6 +146,8 @@ async function extractMetadata(filePath, _quickScan) {
126
146
  status = runCompletedStatus;
127
147
  } else if (anyStepError) {
128
148
  status = "error";
149
+ } else if (persistedStatus !== void 0) {
150
+ status = persistedStatus;
129
151
  } else if (hasRunStarted && !hasRunCompleted) {
130
152
  status = "running";
131
153
  } else if (anyKnownEvent) {
@@ -141,12 +163,15 @@ async function extractMetadata(filePath, _quickScan) {
141
163
  startedAt,
142
164
  endedAt,
143
165
  durationMs,
144
- eventCount,
166
+ eventCount: parsedTrace.sourceEventCount,
145
167
  filePath,
146
168
  fileSize: stats.size,
147
169
  createdAt: stats.birthtime
148
170
  };
149
171
  }
172
+ function isNonNegativeFiniteNumber(value) {
173
+ return typeof value === "number" && Number.isFinite(value) && value >= 0;
174
+ }
150
175
  function buildRunSummary(events) {
151
176
  const started = events.find(
152
177
  (e) => e.event === "run_started"
@@ -169,8 +194,10 @@ function buildRunSummary(events) {
169
194
  name: s.name,
170
195
  status: "running",
171
196
  parentId: s.parentId,
172
- tokensInput: typeof s.metadata?.tokens?.input === "number" ? s.metadata.tokens.input : void 0,
173
- tokensOutput: typeof s.metadata?.tokens?.output === "number" ? s.metadata.tokens.output : void 0
197
+ tokensInput: isNonNegativeFiniteNumber(s.metadata?.tokens?.input) ? s.metadata.tokens.input : void 0,
198
+ tokensOutput: isNonNegativeFiniteNumber(s.metadata?.tokens?.output) ? s.metadata.tokens.output : void 0,
199
+ tokensTotal: isNonNegativeFiniteNumber(s.metadata?.tokens?.total) ? s.metadata.tokens.total : void 0,
200
+ tokensCached: isNonNegativeFiniteNumber(s.metadata?.tokens?.cached) ? s.metadata.tokens.cached : void 0
174
201
  });
175
202
  }
176
203
  }
@@ -192,7 +219,11 @@ function buildRunSummary(events) {
192
219
  let longestStep;
193
220
  let totalTokensInput = 0;
194
221
  let totalTokensOutput = 0;
195
- let hasAnyTokens = false;
222
+ let totalTokensTotal = 0;
223
+ let totalTokensCached = 0;
224
+ let tokenBearingSteps = 0;
225
+ let stepsWithKnownTotal = 0;
226
+ let hasCachedTokens = false;
196
227
  const depthCache = /* @__PURE__ */ new Map();
197
228
  const computeDepth = (stepId) => {
198
229
  const cached = depthCache.get(stepId);
@@ -221,10 +252,21 @@ function buildRunSummary(events) {
221
252
  longestStep = { name: s.name, durationMs: s.durationMs, type: s.type };
222
253
  }
223
254
  }
224
- if (typeof s.tokensInput === "number" || typeof s.tokensOutput === "number") {
225
- hasAnyTokens = true;
226
- if (typeof s.tokensInput === "number") totalTokensInput += s.tokensInput;
227
- if (typeof s.tokensOutput === "number") totalTokensOutput += s.tokensOutput;
255
+ if (s.tokensInput !== void 0 || s.tokensOutput !== void 0 || s.tokensTotal !== void 0 || s.tokensCached !== void 0) {
256
+ tokenBearingSteps += 1;
257
+ if (s.tokensInput !== void 0) totalTokensInput += s.tokensInput;
258
+ if (s.tokensOutput !== void 0) totalTokensOutput += s.tokensOutput;
259
+ if (s.tokensTotal !== void 0) {
260
+ totalTokensTotal += s.tokensTotal;
261
+ stepsWithKnownTotal += 1;
262
+ } else if (s.tokensInput !== void 0 && s.tokensOutput !== void 0) {
263
+ totalTokensTotal += s.tokensInput + s.tokensOutput;
264
+ stepsWithKnownTotal += 1;
265
+ }
266
+ if (s.tokensCached !== void 0) {
267
+ totalTokensCached += s.tokensCached;
268
+ hasCachedTokens = true;
269
+ }
228
270
  }
229
271
  }
230
272
  const summary = {
@@ -239,7 +281,14 @@ function buildRunSummary(events) {
239
281
  errorSteps,
240
282
  maxDepth,
241
283
  ...longestStep ? { longestStep } : {},
242
- ...hasAnyTokens ? { totalTokens: { input: totalTokensInput, output: totalTokensOutput } } : {}
284
+ ...tokenBearingSteps > 0 ? {
285
+ totalTokens: {
286
+ input: totalTokensInput,
287
+ output: totalTokensOutput,
288
+ ...stepsWithKnownTotal === tokenBearingSteps ? { total: totalTokensTotal } : {},
289
+ ...hasCachedTokens ? { cached: totalTokensCached } : {}
290
+ }
291
+ } : {}
243
292
  };
244
293
  return summary;
245
294
  }
@@ -544,9 +593,17 @@ function renderRunWhat(summary, options = {}) {
544
593
  `Status: ${summary.status} \xB7 Duration: ${duration} \xB7 Steps: ${summary.totalSteps} (${stepMixLine(summary)})`
545
594
  );
546
595
  if (summary.totalTokens) {
547
- lines.push(
548
- `Tokens: ${summary.totalTokens.input} in / ${summary.totalTokens.output} out`
549
- );
596
+ const tokenParts = [
597
+ `${summary.totalTokens.input} in`,
598
+ `${summary.totalTokens.output} out`
599
+ ];
600
+ if (summary.totalTokens.total !== void 0) {
601
+ tokenParts.push(`${summary.totalTokens.total} total`);
602
+ }
603
+ if (summary.totalTokens.cached !== void 0) {
604
+ tokenParts.push(`${summary.totalTokens.cached} cached`);
605
+ }
606
+ lines.push(`Tokens: ${tokenParts.join(" / ")}`);
550
607
  }
551
608
  if (showCorrelation && summary.correlation) {
552
609
  const parts = [];
@@ -609,12 +666,15 @@ footer{margin-top:2rem;font-size:0.85rem;color:#555}
609
666
  `.trim();
610
667
  function buildRunReport(events, options) {
611
668
  const profile = options.redactionProfile ?? "local";
612
- const whatSummary = buildRunWhatSummary(events);
669
+ const safeEvents = redactTraceEventsForReport(events, {
670
+ redactionProfile: profile
671
+ });
672
+ const whatSummary = buildRunWhatSummary(safeEvents);
613
673
  const whatText = renderRunWhat(whatSummary, {
614
674
  correlation: options.correlation !== false
615
675
  });
616
- const timelineText = renderTimeline(buildRunTimeline(events));
617
- const tree = resolveTree(events, profile);
676
+ const timelineText = renderTimeline(buildRunTimeline(safeEvents));
677
+ const tree = resolveTree(safeEvents, profile);
618
678
  const exportOpts = {
619
679
  includeMetadata: false,
620
680
  includeAttributes: options.includeAttributes === true,
@@ -696,6 +756,8 @@ ${attrsSection}
696
756
  fileExtension: ".html"
697
757
  };
698
758
  }
759
+
760
+ // packages/core/src/stats.ts
699
761
  function percentile(sorted, p) {
700
762
  if (sorted.length === 0) return void 0;
701
763
  const idx = Math.min(
@@ -706,19 +768,10 @@ function percentile(sorted, p) {
706
768
  }
707
769
  async function readRunStartedMetadata(filePath) {
708
770
  try {
709
- const raw = await readFile(filePath, "utf-8");
710
- for (const line of raw.split(/\r?\n/)) {
711
- const trimmed = line.trim();
712
- if (trimmed === "") continue;
713
- let parsed;
714
- try {
715
- parsed = JSON.parse(trimmed);
716
- } catch {
717
- continue;
718
- }
719
- if (!isTraceEvent(parsed)) continue;
720
- if (parsed.event !== "run_started") continue;
721
- const rs = parsed;
771
+ const events = await readTraceEventsFromFile(filePath);
772
+ for (const event of events) {
773
+ if (event.event !== "run_started") continue;
774
+ const rs = event;
722
775
  if (rs.metadata && typeof rs.metadata === "object") {
723
776
  return rs.metadata;
724
777
  }
@@ -777,7 +830,7 @@ async function buildTraceStats(metas, options) {
777
830
  });
778
831
  }
779
832
  try {
780
- const events = await readTraceEvents(m.runId, options.traceDir);
833
+ const events = await readTraceEventsFromFile(m.filePath);
781
834
  if (events.length === 0) continue;
782
835
  const summary = buildRunSummary(events);
783
836
  totalSteps += summary.totalSteps;
@@ -965,7 +1018,7 @@ async function searchTraces(metas, options) {
965
1018
  if (options.status && m.status !== options.status) continue;
966
1019
  let events = [];
967
1020
  try {
968
- events = await readTraceEvents(m.runId, options.traceDir);
1021
+ events = await readTraceEventsFromFile(m.filePath);
969
1022
  } catch {
970
1023
  continue;
971
1024
  }