agent-inspect 1.4.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 (111) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +34 -6
  3. package/docs/ADAPTERS.md +6 -0
  4. package/docs/API.md +132 -9
  5. package/docs/ARCHITECTURE.md +4 -0
  6. package/docs/CLI.md +98 -5
  7. package/docs/DIFF.md +8 -0
  8. package/docs/EXPORTS.md +13 -0
  9. package/docs/GETTING-STARTED.md +19 -1
  10. package/docs/KNOWN-ISSUES.md +8 -1
  11. package/docs/LIMITATIONS.md +13 -2
  12. package/docs/LOGS.md +22 -0
  13. package/docs/SCHEMA.md +19 -7
  14. package/docs/SCREENSHOTS.md +190 -9
  15. package/package.json +71 -1
  16. package/packages/cli/dist/index.cjs +7121 -3986
  17. package/packages/cli/dist/index.cjs.map +1 -1
  18. package/packages/cli/dist/index.mjs +7122 -3987
  19. package/packages/cli/dist/index.mjs.map +1 -1
  20. package/packages/core/dist/advanced.cjs +2258 -0
  21. package/packages/core/dist/advanced.cjs.map +1 -0
  22. package/packages/core/dist/advanced.d.cts +254 -0
  23. package/packages/core/dist/advanced.d.ts +254 -0
  24. package/packages/core/dist/advanced.mjs +11 -0
  25. package/packages/core/dist/advanced.mjs.map +1 -0
  26. package/packages/core/dist/chunk-57S5D6HR.mjs +655 -0
  27. package/packages/core/dist/chunk-57S5D6HR.mjs.map +1 -0
  28. package/packages/core/dist/chunk-6QSLZCBJ.mjs +743 -0
  29. package/packages/core/dist/chunk-6QSLZCBJ.mjs.map +1 -0
  30. package/packages/core/dist/chunk-6SZPTECC.mjs +342 -0
  31. package/packages/core/dist/chunk-6SZPTECC.mjs.map +1 -0
  32. package/packages/core/dist/chunk-74XZ6N7Q.mjs +409 -0
  33. package/packages/core/dist/chunk-74XZ6N7Q.mjs.map +1 -0
  34. package/packages/core/dist/chunk-7TGZLWEE.mjs +35 -0
  35. package/packages/core/dist/chunk-7TGZLWEE.mjs.map +1 -0
  36. package/packages/core/dist/chunk-BT7CATSD.mjs +497 -0
  37. package/packages/core/dist/chunk-BT7CATSD.mjs.map +1 -0
  38. package/packages/core/dist/chunk-E5F2LQCX.mjs +83 -0
  39. package/packages/core/dist/chunk-E5F2LQCX.mjs.map +1 -0
  40. package/packages/core/dist/chunk-EDTQHZPM.mjs +88 -0
  41. package/packages/core/dist/chunk-EDTQHZPM.mjs.map +1 -0
  42. package/packages/core/dist/chunk-HR7G62IE.mjs +785 -0
  43. package/packages/core/dist/chunk-HR7G62IE.mjs.map +1 -0
  44. package/packages/core/dist/chunk-HY7H3CQM.mjs +127 -0
  45. package/packages/core/dist/chunk-HY7H3CQM.mjs.map +1 -0
  46. package/packages/core/dist/chunk-S4YWKV4G.mjs +48 -0
  47. package/packages/core/dist/chunk-S4YWKV4G.mjs.map +1 -0
  48. package/packages/core/dist/chunk-TFLPUZ56.mjs +1571 -0
  49. package/packages/core/dist/chunk-TFLPUZ56.mjs.map +1 -0
  50. package/packages/core/dist/chunk-TZISEVLQ.mjs +390 -0
  51. package/packages/core/dist/chunk-TZISEVLQ.mjs.map +1 -0
  52. package/packages/core/dist/chunk-U2BGPESY.mjs +150 -0
  53. package/packages/core/dist/chunk-U2BGPESY.mjs.map +1 -0
  54. package/packages/core/dist/chunk-VTIB5MDK.mjs +304 -0
  55. package/packages/core/dist/chunk-VTIB5MDK.mjs.map +1 -0
  56. package/packages/core/dist/chunk-VU6O5QAH.mjs +99 -0
  57. package/packages/core/dist/chunk-VU6O5QAH.mjs.map +1 -0
  58. package/packages/core/dist/chunk-Y56BPA3B.mjs +990 -0
  59. package/packages/core/dist/chunk-Y56BPA3B.mjs.map +1 -0
  60. package/packages/core/dist/chunk-YWAOOXLR.mjs +475 -0
  61. package/packages/core/dist/chunk-YWAOOXLR.mjs.map +1 -0
  62. package/packages/core/dist/diff.cjs +993 -0
  63. package/packages/core/dist/diff.cjs.map +1 -0
  64. package/packages/core/dist/diff.d.cts +82 -0
  65. package/packages/core/dist/diff.d.ts +82 -0
  66. package/packages/core/dist/diff.mjs +5 -0
  67. package/packages/core/dist/diff.mjs.map +1 -0
  68. package/packages/core/dist/exporters.cjs +1228 -0
  69. package/packages/core/dist/exporters.cjs.map +1 -0
  70. package/packages/core/dist/exporters.d.cts +114 -0
  71. package/packages/core/dist/exporters.d.ts +114 -0
  72. package/packages/core/dist/exporters.mjs +6 -0
  73. package/packages/core/dist/exporters.mjs.map +1 -0
  74. package/packages/core/dist/index.cjs +5542 -2218
  75. package/packages/core/dist/index.cjs.map +1 -1
  76. package/packages/core/dist/index.d.cts +113 -908
  77. package/packages/core/dist/index.d.ts +113 -908
  78. package/packages/core/dist/index.mjs +1048 -5403
  79. package/packages/core/dist/index.mjs.map +1 -1
  80. package/packages/core/dist/inspect-event-Des4JDHo.d.cts +41 -0
  81. package/packages/core/dist/inspect-event-Des4JDHo.d.ts +41 -0
  82. package/packages/core/dist/log-config-BnH8Ykcb.d.cts +33 -0
  83. package/packages/core/dist/log-config-C1GcJPIM.d.ts +33 -0
  84. package/packages/core/dist/logs.cjs +1007 -0
  85. package/packages/core/dist/logs.cjs.map +1 -0
  86. package/packages/core/dist/logs.d.cts +138 -0
  87. package/packages/core/dist/logs.d.ts +138 -0
  88. package/packages/core/dist/logs.mjs +6 -0
  89. package/packages/core/dist/logs.mjs.map +1 -0
  90. package/packages/core/dist/persisted-inspect-event-0kaRADsp.d.cts +56 -0
  91. package/packages/core/dist/persisted-inspect-event-DiFto0K2.d.ts +56 -0
  92. package/packages/core/dist/persisted.cjs +1055 -0
  93. package/packages/core/dist/persisted.cjs.map +1 -0
  94. package/packages/core/dist/persisted.d.cts +111 -0
  95. package/packages/core/dist/persisted.d.ts +111 -0
  96. package/packages/core/dist/persisted.mjs +7 -0
  97. package/packages/core/dist/persisted.mjs.map +1 -0
  98. package/packages/core/dist/readers.cjs +2590 -0
  99. package/packages/core/dist/readers.cjs.map +1 -0
  100. package/packages/core/dist/readers.d.cts +80 -0
  101. package/packages/core/dist/readers.d.ts +80 -0
  102. package/packages/core/dist/readers.mjs +9 -0
  103. package/packages/core/dist/readers.mjs.map +1 -0
  104. package/packages/core/dist/types-DB8jB6Jg.d.cts +232 -0
  105. package/packages/core/dist/types-tSix7tfv.d.ts +232 -0
  106. package/packages/core/dist/writers.cjs +997 -0
  107. package/packages/core/dist/writers.cjs.map +1 -0
  108. package/packages/core/dist/writers.d.cts +62 -0
  109. package/packages/core/dist/writers.d.ts +62 -0
  110. package/packages/core/dist/writers.mjs +9 -0
  111. package/packages/core/dist/writers.mjs.map +1 -0
@@ -0,0 +1,390 @@
1
+ import { extractCorrelationMetadata } from './chunk-S4YWKV4G.mjs';
2
+ import { TreeBuilder } from './chunk-E5F2LQCX.mjs';
3
+ import { isPersistedInspectEvent } from './chunk-74XZ6N7Q.mjs';
4
+
5
+ // packages/core/src/persisted/token-usage.ts
6
+ function isRecord(value) {
7
+ return typeof value === "object" && value !== null && !Array.isArray(value);
8
+ }
9
+ function nonNegativeFinite(value) {
10
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : void 0;
11
+ }
12
+ function normalizeTokenUsage(value) {
13
+ if (!isRecord(value)) return void 0;
14
+ const input = nonNegativeFinite(value.input);
15
+ const output = nonNegativeFinite(value.output);
16
+ const suppliedTotal = nonNegativeFinite(value.total);
17
+ const cached = nonNegativeFinite(value.cached);
18
+ const derivedTotal = input !== void 0 && output !== void 0 && Number.isFinite(input + output) ? input + output : void 0;
19
+ const total = suppliedTotal ?? derivedTotal;
20
+ if (input === void 0 && output === void 0 && total === void 0 && cached === void 0) {
21
+ return void 0;
22
+ }
23
+ return {
24
+ ...input !== void 0 ? { input } : {},
25
+ ...output !== void 0 ? { output } : {},
26
+ ...total !== void 0 ? { total } : {},
27
+ ...cached !== void 0 ? { cached } : {}
28
+ };
29
+ }
30
+
31
+ // packages/core/src/persisted/from-trace-event.ts
32
+ function sanitizeIdPart(value) {
33
+ return value.replace(/[^a-zA-Z0-9_-]/g, "_");
34
+ }
35
+ function nodeIdForEvent(event) {
36
+ switch (event.event) {
37
+ case "run_started":
38
+ case "run_completed":
39
+ return event.runId;
40
+ case "step_started":
41
+ case "step_completed":
42
+ return event.stepId;
43
+ default:
44
+ return "unknown";
45
+ }
46
+ }
47
+ function createPersistedEventId(event, eventIndex) {
48
+ const runId = sanitizeIdPart(event.runId);
49
+ const ev = sanitizeIdPart(event.event);
50
+ const node = sanitizeIdPart(nodeIdForEvent(event));
51
+ return `manual:${runId}:${ev}:${node}:${eventIndex}`;
52
+ }
53
+ function toIsoTimestamp(ms) {
54
+ if (typeof ms !== "number" || !Number.isFinite(ms)) {
55
+ return { iso: (/* @__PURE__ */ new Date(0)).toISOString(), invalidTimestamp: true };
56
+ }
57
+ return { iso: new Date(ms).toISOString(), invalidTimestamp: false };
58
+ }
59
+ function buildSource(options) {
60
+ return {
61
+ type: "manual",
62
+ name: options?.sourceName ?? "trace-event",
63
+ version: options?.sourceVersion ?? "0.1"
64
+ };
65
+ }
66
+ function mapStepTypeToInspectKind(type) {
67
+ switch (type) {
68
+ case "run":
69
+ return "RUN";
70
+ case "llm":
71
+ return "LLM";
72
+ case "tool":
73
+ return "TOOL";
74
+ case "decision":
75
+ return "DECISION";
76
+ case "logic":
77
+ case "state":
78
+ case "custom":
79
+ return "LOGIC";
80
+ default:
81
+ return "LOGIC";
82
+ }
83
+ }
84
+ function mapRunOrStepStatus(status) {
85
+ return status === "success" ? "ok" : "error";
86
+ }
87
+ function mapErrorInfo(error) {
88
+ if (!error?.message) {
89
+ return {};
90
+ }
91
+ const out = {
92
+ persisted: {
93
+ message: error.message,
94
+ name: "Error"
95
+ }
96
+ };
97
+ if (typeof error.stack === "string" && error.stack.length > 0) {
98
+ out.errorStack = error.stack;
99
+ }
100
+ return out;
101
+ }
102
+ function mapTokenUsageFromMetadata(metadata) {
103
+ return normalizeTokenUsage(metadata?.tokens);
104
+ }
105
+ function compactAttributes(entries) {
106
+ const out = {};
107
+ for (const [key, value] of Object.entries(entries)) {
108
+ if (value !== void 0) {
109
+ out[key] = value;
110
+ }
111
+ }
112
+ return Object.keys(out).length > 0 ? out : void 0;
113
+ }
114
+ function traceEventToPersistedInspectEvent(event, options) {
115
+ const eventIndex = options?.eventIndex ?? 0;
116
+ const eventId = createPersistedEventId(event, eventIndex);
117
+ const source = buildSource(options);
118
+ const tsMain = toIsoTimestamp(event.timestamp);
119
+ switch (event.event) {
120
+ case "run_started": {
121
+ const tsStart = toIsoTimestamp(event.startTime);
122
+ const correlation = extractCorrelationMetadata(event.metadata);
123
+ const attributes = compactAttributes({
124
+ legacyEvent: "run_started",
125
+ metadata: event.metadata !== void 0 ? { ...event.metadata } : void 0,
126
+ correlationId: correlation?.correlationId,
127
+ requestId: correlation?.requestId,
128
+ decisionId: correlation?.decisionId,
129
+ groupId: correlation?.groupId,
130
+ invalidTimestamp: tsMain.invalidTimestamp || tsStart.invalidTimestamp ? true : void 0
131
+ });
132
+ return {
133
+ schemaVersion: "0.2",
134
+ eventId,
135
+ runId: event.runId,
136
+ kind: "RUN",
137
+ name: event.name,
138
+ status: "running",
139
+ timestamp: tsMain.iso,
140
+ startedAt: tsStart.iso,
141
+ confidence: "explicit",
142
+ source,
143
+ attributes
144
+ };
145
+ }
146
+ case "run_completed": {
147
+ const tsEnd = toIsoTimestamp(event.endTime);
148
+ const { persisted: error, errorStack } = mapErrorInfo(event.error);
149
+ const attributes = compactAttributes({
150
+ legacyEvent: "run_completed",
151
+ errorStack,
152
+ invalidTimestamp: tsMain.invalidTimestamp || tsEnd.invalidTimestamp ? true : void 0
153
+ });
154
+ return {
155
+ schemaVersion: "0.2",
156
+ eventId,
157
+ runId: event.runId,
158
+ kind: "RUN",
159
+ name: "run",
160
+ status: mapRunOrStepStatus(event.status),
161
+ timestamp: tsMain.iso,
162
+ endedAt: tsEnd.iso,
163
+ durationMs: event.durationMs,
164
+ confidence: "explicit",
165
+ source,
166
+ attributes,
167
+ error
168
+ };
169
+ }
170
+ case "step_started": {
171
+ const tsStart = toIsoTimestamp(event.startTime);
172
+ const tokenUsage = mapTokenUsageFromMetadata(event.metadata);
173
+ const attributes = compactAttributes({
174
+ legacyEvent: "step_started",
175
+ stepId: event.stepId,
176
+ stepType: event.type,
177
+ metadata: event.metadata !== void 0 ? { ...event.metadata } : void 0,
178
+ invalidTimestamp: tsMain.invalidTimestamp || tsStart.invalidTimestamp ? true : void 0
179
+ });
180
+ const out = {
181
+ schemaVersion: "0.2",
182
+ eventId,
183
+ runId: event.runId,
184
+ kind: mapStepTypeToInspectKind(event.type),
185
+ name: event.name,
186
+ status: "running",
187
+ timestamp: tsMain.iso,
188
+ startedAt: tsStart.iso,
189
+ confidence: "explicit",
190
+ source,
191
+ attributes
192
+ };
193
+ if (event.parentId !== void 0) {
194
+ out.parentId = event.parentId;
195
+ }
196
+ if (tokenUsage !== void 0) {
197
+ out.tokenUsage = tokenUsage;
198
+ }
199
+ return out;
200
+ }
201
+ case "step_completed": {
202
+ const tsEnd = toIsoTimestamp(event.endTime);
203
+ const { persisted: error, errorStack } = mapErrorInfo(event.error);
204
+ const attributes = compactAttributes({
205
+ legacyEvent: "step_completed",
206
+ stepId: event.stepId,
207
+ errorStack,
208
+ invalidTimestamp: tsMain.invalidTimestamp || tsEnd.invalidTimestamp ? true : void 0
209
+ });
210
+ return {
211
+ schemaVersion: "0.2",
212
+ eventId,
213
+ runId: event.runId,
214
+ kind: "LOGIC",
215
+ name: event.stepId,
216
+ status: mapRunOrStepStatus(event.status),
217
+ timestamp: tsMain.iso,
218
+ endedAt: tsEnd.iso,
219
+ durationMs: event.durationMs,
220
+ confidence: "explicit",
221
+ source,
222
+ attributes,
223
+ error
224
+ };
225
+ }
226
+ default: {
227
+ const _exhaustive = event;
228
+ throw new Error(`Unsupported trace event: ${_exhaustive.event}`);
229
+ }
230
+ }
231
+ }
232
+ function traceEventsToPersistedInspectEvents(events, options) {
233
+ return events.map(
234
+ (event, index) => traceEventToPersistedInspectEvent(event, { ...options, eventIndex: index })
235
+ );
236
+ }
237
+
238
+ // packages/core/src/persisted/to-inspect-event.ts
239
+ function compactAttributes2(entries) {
240
+ const out = {};
241
+ for (const [key, value] of Object.entries(entries)) {
242
+ if (value !== void 0) {
243
+ out[key] = value;
244
+ }
245
+ }
246
+ return Object.keys(out).length > 0 ? out : void 0;
247
+ }
248
+ function parseIsoToMs(iso) {
249
+ const parsed = Date.parse(iso);
250
+ if (!Number.isFinite(parsed)) {
251
+ return { ms: 0, invalidTimestamp: true };
252
+ }
253
+ return { ms: parsed, invalidTimestamp: false };
254
+ }
255
+ function mapPersistedSourceToInspect(event) {
256
+ const attrs = event.attributes ?? {};
257
+ const sourceName = event.source.name;
258
+ if (sourceName === "pino") {
259
+ return {
260
+ type: "pino",
261
+ file: typeof attrs.sourceFile === "string" ? attrs.sourceFile : void 0,
262
+ line: typeof attrs.sourceLine === "number" ? attrs.sourceLine : void 0
263
+ };
264
+ }
265
+ if (sourceName === "winston") {
266
+ return {
267
+ type: "winston",
268
+ file: typeof attrs.sourceFile === "string" ? attrs.sourceFile : void 0,
269
+ line: typeof attrs.sourceLine === "number" ? attrs.sourceLine : void 0
270
+ };
271
+ }
272
+ const mapType = (t) => {
273
+ switch (t) {
274
+ case "manual":
275
+ return "manual";
276
+ case "json-log":
277
+ return "json-log";
278
+ case "log4js":
279
+ return "log4js";
280
+ case "adapter":
281
+ case "ai-sdk":
282
+ case "otel":
283
+ return "adapter";
284
+ default:
285
+ return "json-log";
286
+ }
287
+ };
288
+ return {
289
+ type: mapType(event.source.type),
290
+ file: typeof attrs.sourceFile === "string" ? attrs.sourceFile : void 0,
291
+ line: typeof attrs.sourceLine === "number" ? attrs.sourceLine : void 0
292
+ };
293
+ }
294
+ function buildInspectAttributes(event) {
295
+ const attrs = event.attributes !== void 0 ? { ...event.attributes } : {};
296
+ if (event.inputSummary !== void 0) {
297
+ attrs.inputSummary = event.inputSummary;
298
+ }
299
+ if (event.outputSummary !== void 0) {
300
+ attrs.outputSummary = event.outputSummary;
301
+ }
302
+ if (event.error) {
303
+ if (event.error.name !== void 0) {
304
+ attrs.errorName = event.error.name;
305
+ }
306
+ attrs.errorMessage = event.error.message;
307
+ if (event.error.code !== void 0) {
308
+ attrs.errorCode = event.error.code;
309
+ }
310
+ }
311
+ if (event.tokenUsage) {
312
+ attrs.tokens = { ...event.tokenUsage };
313
+ }
314
+ if (event.source.type === "ai-sdk" || event.source.type === "otel") {
315
+ attrs.originalSourceType = event.source.type;
316
+ }
317
+ if (event.source.name !== void 0) {
318
+ attrs.sourceName = event.source.name;
319
+ }
320
+ if (event.source.version !== void 0) {
321
+ attrs.sourceVersion = event.source.version;
322
+ }
323
+ return attrs;
324
+ }
325
+ function persistedInspectEventToInspectEvent(event) {
326
+ if (!isPersistedInspectEvent(event)) {
327
+ throw new Error("Invalid PersistedInspectEvent: failed isPersistedInspectEvent");
328
+ }
329
+ const ts = parseIsoToMs(event.timestamp);
330
+ const attrs = buildInspectAttributes(event);
331
+ if (ts.invalidTimestamp) {
332
+ attrs.invalidTimestamp = true;
333
+ }
334
+ let status;
335
+ if (event.status === "running" || event.status === "ok" || event.status === "error") {
336
+ status = event.status;
337
+ } else if (event.status === "unknown") {
338
+ attrs.persistedStatus = "unknown";
339
+ }
340
+ const out = {
341
+ eventId: event.eventId,
342
+ runId: event.runId,
343
+ name: event.name,
344
+ kind: event.kind,
345
+ timestamp: ts.ms,
346
+ confidence: event.confidence,
347
+ source: mapPersistedSourceToInspect(event),
348
+ attributes: compactAttributes2(attrs)
349
+ };
350
+ if (event.parentId !== void 0) {
351
+ out.parentId = event.parentId;
352
+ }
353
+ if (status !== void 0) {
354
+ out.status = status;
355
+ }
356
+ if (event.durationMs !== void 0 && Number.isFinite(event.durationMs) && event.durationMs >= 0) {
357
+ out.durationMs = event.durationMs;
358
+ }
359
+ return out;
360
+ }
361
+ function persistedInspectEventsToInspectEvents(events, options) {
362
+ const skipInvalid = options?.skipInvalid === true;
363
+ const out = [];
364
+ for (const event of events) {
365
+ if (!isPersistedInspectEvent(event)) {
366
+ if (skipInvalid) {
367
+ continue;
368
+ }
369
+ throw new Error("Invalid PersistedInspectEvent: failed isPersistedInspectEvent");
370
+ }
371
+ out.push(persistedInspectEventToInspectEvent(event));
372
+ }
373
+ return out;
374
+ }
375
+
376
+ // packages/core/src/persisted/tree-bridge.ts
377
+ function persistedInspectEventsToRunTrees(events, options) {
378
+ const inspectEvents = persistedInspectEventsToInspectEvents(events, {
379
+ skipInvalid: options?.skipInvalid
380
+ });
381
+ return new TreeBuilder().build(inspectEvents);
382
+ }
383
+ function traceEventsToPersistedRunTrees(events) {
384
+ const persisted = traceEventsToPersistedInspectEvents(events);
385
+ return persistedInspectEventsToRunTrees(persisted);
386
+ }
387
+
388
+ export { normalizeTokenUsage, persistedInspectEventToInspectEvent, persistedInspectEventsToInspectEvents, persistedInspectEventsToRunTrees, traceEventToPersistedInspectEvent, traceEventsToPersistedInspectEvents, traceEventsToPersistedRunTrees };
389
+ //# sourceMappingURL=chunk-TZISEVLQ.mjs.map
390
+ //# sourceMappingURL=chunk-TZISEVLQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persisted/token-usage.ts","../src/persisted/from-trace-event.ts","../src/persisted/to-inspect-event.ts","../src/persisted/tree-bridge.ts"],"names":["compactAttributes"],"mappings":"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","file":"chunk-TZISEVLQ.mjs","sourcesContent":["import type { PersistedTokenUsage } from \"../types/persisted-inspect-event.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction nonNegativeFinite(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\n}\n\n/**\n * Keeps the approved token vocabulary and derives total only when it is absent.\n * Cached tokens are informational and are never added to total.\n */\nexport function normalizeTokenUsage(\n value: unknown,\n): PersistedTokenUsage | undefined {\n if (!isRecord(value)) return undefined;\n\n const input = nonNegativeFinite(value.input);\n const output = nonNegativeFinite(value.output);\n const suppliedTotal = nonNegativeFinite(value.total);\n const cached = nonNegativeFinite(value.cached);\n const derivedTotal =\n input !== undefined && output !== undefined && Number.isFinite(input + output)\n ? input + output\n : undefined;\n const total =\n suppliedTotal ?? derivedTotal;\n\n if (\n input === undefined &&\n output === undefined &&\n total === undefined &&\n cached === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(input !== undefined ? { input } : {}),\n ...(output !== undefined ? { output } : {}),\n ...(total !== undefined ? { total } : {}),\n ...(cached !== undefined ? { cached } : {}),\n };\n}\n","import { extractCorrelationMetadata } from \"../correlation-metadata.js\";\nimport type { InspectKind } from \"../types/inspect-event.js\";\nimport type {\n ErrorInfo,\n StepMetadata,\n StepType,\n TraceEvent,\n} from \"../types.js\";\nimport type {\n PersistedEventSource,\n PersistedEventStatus,\n PersistedInspectError,\n PersistedInspectEvent,\n PersistedTokenUsage,\n} from \"../types/persisted-inspect-event.js\";\nimport { normalizeTokenUsage } from \"./token-usage.js\";\n\nexport interface TraceEventToPersistedOptions {\n /**\n * Stable index within the source event list.\n * Used only to make synthetic eventId deterministic when v0.1 has no eventId.\n */\n eventIndex?: number;\n\n /**\n * Optional source name override.\n * Default: \"trace-event\"\n */\n sourceName?: string;\n\n /**\n * Optional source version override.\n * Default: \"0.1\"\n */\n sourceVersion?: string;\n}\n\nfunction sanitizeIdPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n\nfunction nodeIdForEvent(event: TraceEvent): string {\n switch (event.event) {\n case \"run_started\":\n case \"run_completed\":\n return event.runId;\n case \"step_started\":\n case \"step_completed\":\n return event.stepId;\n default:\n return \"unknown\";\n }\n}\n\nfunction createPersistedEventId(event: TraceEvent, eventIndex: number): string {\n const runId = sanitizeIdPart(event.runId);\n const ev = sanitizeIdPart(event.event);\n const node = sanitizeIdPart(nodeIdForEvent(event));\n return `manual:${runId}:${ev}:${node}:${eventIndex}`;\n}\n\nfunction toIsoTimestamp(\n ms: number,\n): { iso: string; invalidTimestamp: boolean } {\n if (typeof ms !== \"number\" || !Number.isFinite(ms)) {\n return { iso: new Date(0).toISOString(), invalidTimestamp: true };\n }\n return { iso: new Date(ms).toISOString(), invalidTimestamp: false };\n}\n\nfunction buildSource(options?: TraceEventToPersistedOptions): PersistedEventSource {\n return {\n type: \"manual\",\n name: options?.sourceName ?? \"trace-event\",\n version: options?.sourceVersion ?? \"0.1\",\n };\n}\n\nfunction mapStepTypeToInspectKind(type: StepType): InspectKind {\n switch (type) {\n case \"run\":\n return \"RUN\";\n case \"llm\":\n return \"LLM\";\n case \"tool\":\n return \"TOOL\";\n case \"decision\":\n return \"DECISION\";\n case \"logic\":\n case \"state\":\n case \"custom\":\n return \"LOGIC\";\n default:\n return \"LOGIC\";\n }\n}\n\nfunction mapRunOrStepStatus(\n status: \"success\" | \"error\",\n): PersistedEventStatus {\n return status === \"success\" ? \"ok\" : \"error\";\n}\n\nfunction mapErrorInfo(\n error: ErrorInfo | undefined,\n): {\n persisted?: PersistedInspectError;\n errorStack?: string;\n} {\n if (!error?.message) {\n return {};\n }\n const out: {\n persisted: PersistedInspectError;\n errorStack?: string;\n } = {\n persisted: {\n message: error.message,\n name: \"Error\",\n },\n };\n if (typeof error.stack === \"string\" && error.stack.length > 0) {\n out.errorStack = error.stack;\n }\n return out;\n}\n\nfunction mapTokenUsageFromMetadata(\n metadata: StepMetadata | undefined,\n): PersistedTokenUsage | undefined {\n return normalizeTokenUsage(metadata?.tokens);\n}\n\nfunction compactAttributes(\n entries: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(entries)) {\n if (value !== undefined) {\n out[key] = value;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/**\n * Maps one v0.1 {@link TraceEvent} to a v0.2 {@link PersistedInspectEvent}.\n * Does not mutate `event`.\n */\nexport function traceEventToPersistedInspectEvent(\n event: TraceEvent,\n options?: TraceEventToPersistedOptions,\n): PersistedInspectEvent {\n const eventIndex = options?.eventIndex ?? 0;\n const eventId = createPersistedEventId(event, eventIndex);\n const source = buildSource(options);\n const tsMain = toIsoTimestamp(event.timestamp);\n\n switch (event.event) {\n case \"run_started\": {\n const tsStart = toIsoTimestamp(event.startTime);\n const correlation = extractCorrelationMetadata(event.metadata);\n const attributes = compactAttributes({\n legacyEvent: \"run_started\",\n metadata:\n event.metadata !== undefined ? { ...event.metadata } : undefined,\n correlationId: correlation?.correlationId,\n requestId: correlation?.requestId,\n decisionId: correlation?.decisionId,\n groupId: correlation?.groupId,\n invalidTimestamp:\n tsMain.invalidTimestamp || tsStart.invalidTimestamp ? true : undefined,\n });\n\n return {\n schemaVersion: \"0.2\",\n eventId,\n runId: event.runId,\n kind: \"RUN\",\n name: event.name,\n status: \"running\",\n timestamp: tsMain.iso,\n startedAt: tsStart.iso,\n confidence: \"explicit\",\n source,\n attributes,\n };\n }\n\n case \"run_completed\": {\n const tsEnd = toIsoTimestamp(event.endTime);\n const { persisted: error, errorStack } = mapErrorInfo(event.error);\n const attributes = compactAttributes({\n legacyEvent: \"run_completed\",\n errorStack,\n invalidTimestamp:\n tsMain.invalidTimestamp || tsEnd.invalidTimestamp ? true : undefined,\n });\n\n return {\n schemaVersion: \"0.2\",\n eventId,\n runId: event.runId,\n kind: \"RUN\",\n name: \"run\",\n status: mapRunOrStepStatus(event.status),\n timestamp: tsMain.iso,\n endedAt: tsEnd.iso,\n durationMs: event.durationMs,\n confidence: \"explicit\",\n source,\n attributes,\n error,\n };\n }\n\n case \"step_started\": {\n const tsStart = toIsoTimestamp(event.startTime);\n const tokenUsage = mapTokenUsageFromMetadata(event.metadata);\n const attributes = compactAttributes({\n legacyEvent: \"step_started\",\n stepId: event.stepId,\n stepType: event.type,\n metadata:\n event.metadata !== undefined ? { ...event.metadata } : undefined,\n invalidTimestamp:\n tsMain.invalidTimestamp || tsStart.invalidTimestamp ? true : undefined,\n });\n\n const out: PersistedInspectEvent = {\n schemaVersion: \"0.2\",\n eventId,\n runId: event.runId,\n kind: mapStepTypeToInspectKind(event.type),\n name: event.name,\n status: \"running\",\n timestamp: tsMain.iso,\n startedAt: tsStart.iso,\n confidence: \"explicit\",\n source,\n attributes,\n };\n if (event.parentId !== undefined) {\n out.parentId = event.parentId;\n }\n if (tokenUsage !== undefined) {\n out.tokenUsage = tokenUsage;\n }\n return out;\n }\n\n case \"step_completed\": {\n const tsEnd = toIsoTimestamp(event.endTime);\n const { persisted: error, errorStack } = mapErrorInfo(event.error);\n const attributes = compactAttributes({\n legacyEvent: \"step_completed\",\n stepId: event.stepId,\n errorStack,\n invalidTimestamp:\n tsMain.invalidTimestamp || tsEnd.invalidTimestamp ? true : undefined,\n });\n\n return {\n schemaVersion: \"0.2\",\n eventId,\n runId: event.runId,\n kind: \"LOGIC\",\n name: event.stepId,\n status: mapRunOrStepStatus(event.status),\n timestamp: tsMain.iso,\n endedAt: tsEnd.iso,\n durationMs: event.durationMs,\n confidence: \"explicit\",\n source,\n attributes,\n error,\n };\n }\n\n default: {\n const _exhaustive: never = event;\n throw new Error(`Unsupported trace event: ${(_exhaustive as TraceEvent).event}`);\n }\n }\n}\n\n/**\n * Maps a v0.1 trace event list to persisted v0.2 events (one output per input).\n */\nexport function traceEventsToPersistedInspectEvents(\n events: readonly TraceEvent[],\n options?: Omit<TraceEventToPersistedOptions, \"eventIndex\">,\n): PersistedInspectEvent[] {\n return events.map((event, index) =>\n traceEventToPersistedInspectEvent(event, { ...options, eventIndex: index }),\n );\n}\n","import type { EventSource, InspectEvent } from \"../types/inspect-event.js\";\nimport {\n isPersistedInspectEvent,\n type PersistedEventSourceType,\n type PersistedInspectEvent,\n} from \"../types/persisted-inspect-event.js\";\n\nexport interface PersistedToInspectEventOptions {\n /**\n * If true, invalid persisted events are skipped by batch conversion.\n * If false or omitted, invalid events throw.\n */\n skipInvalid?: boolean;\n}\n\nfunction compactAttributes(\n entries: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(entries)) {\n if (value !== undefined) {\n out[key] = value;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction parseIsoToMs(iso: string): { ms: number; invalidTimestamp: boolean } {\n const parsed = Date.parse(iso);\n if (!Number.isFinite(parsed)) {\n return { ms: 0, invalidTimestamp: true };\n }\n return { ms: parsed, invalidTimestamp: false };\n}\n\nfunction mapPersistedSourceToInspect(\n event: PersistedInspectEvent,\n): EventSource {\n const attrs = event.attributes ?? {};\n const sourceName = event.source.name;\n\n if (sourceName === \"pino\") {\n return {\n type: \"pino\",\n file: typeof attrs.sourceFile === \"string\" ? attrs.sourceFile : undefined,\n line: typeof attrs.sourceLine === \"number\" ? attrs.sourceLine : undefined,\n };\n }\n if (sourceName === \"winston\") {\n return {\n type: \"winston\",\n file: typeof attrs.sourceFile === \"string\" ? attrs.sourceFile : undefined,\n line: typeof attrs.sourceLine === \"number\" ? attrs.sourceLine : undefined,\n };\n }\n\n const mapType = (t: PersistedEventSourceType): EventSource[\"type\"] => {\n switch (t) {\n case \"manual\":\n return \"manual\";\n case \"json-log\":\n return \"json-log\";\n case \"log4js\":\n return \"log4js\";\n case \"adapter\":\n case \"ai-sdk\":\n case \"otel\":\n return \"adapter\";\n default:\n return \"json-log\";\n }\n };\n\n return {\n type: mapType(event.source.type),\n file: typeof attrs.sourceFile === \"string\" ? attrs.sourceFile : undefined,\n line: typeof attrs.sourceLine === \"number\" ? attrs.sourceLine : undefined,\n };\n}\n\nfunction buildInspectAttributes(event: PersistedInspectEvent): Record<string, unknown> {\n const attrs =\n event.attributes !== undefined ? { ...event.attributes } : {};\n\n if (event.inputSummary !== undefined) {\n attrs.inputSummary = event.inputSummary;\n }\n if (event.outputSummary !== undefined) {\n attrs.outputSummary = event.outputSummary;\n }\n\n if (event.error) {\n if (event.error.name !== undefined) {\n attrs.errorName = event.error.name;\n }\n attrs.errorMessage = event.error.message;\n if (event.error.code !== undefined) {\n attrs.errorCode = event.error.code;\n }\n }\n\n if (event.tokenUsage) {\n attrs.tokens = { ...event.tokenUsage };\n }\n\n if (event.source.type === \"ai-sdk\" || event.source.type === \"otel\") {\n attrs.originalSourceType = event.source.type;\n }\n\n if (event.source.name !== undefined) {\n attrs.sourceName = event.source.name;\n }\n if (event.source.version !== undefined) {\n attrs.sourceVersion = event.source.version;\n }\n\n return attrs;\n}\n\n/**\n * Maps one v0.2 {@link PersistedInspectEvent} to in-memory {@link InspectEvent}.\n * Throws if `event` fails {@link isPersistedInspectEvent}.\n */\nexport function persistedInspectEventToInspectEvent(\n event: PersistedInspectEvent,\n): InspectEvent {\n if (!isPersistedInspectEvent(event)) {\n throw new Error(\"Invalid PersistedInspectEvent: failed isPersistedInspectEvent\");\n }\n\n const ts = parseIsoToMs(event.timestamp);\n const attrs = buildInspectAttributes(event);\n if (ts.invalidTimestamp) {\n attrs.invalidTimestamp = true;\n }\n\n let status: InspectEvent[\"status\"] | undefined;\n if (\n event.status === \"running\" ||\n event.status === \"ok\" ||\n event.status === \"error\"\n ) {\n status = event.status;\n } else if (event.status === \"unknown\") {\n attrs.persistedStatus = \"unknown\";\n }\n\n const out: InspectEvent = {\n eventId: event.eventId,\n runId: event.runId,\n name: event.name,\n kind: event.kind,\n timestamp: ts.ms,\n confidence: event.confidence,\n source: mapPersistedSourceToInspect(event),\n attributes: compactAttributes(attrs),\n };\n\n if (event.parentId !== undefined) {\n out.parentId = event.parentId;\n }\n if (status !== undefined) {\n out.status = status;\n }\n if (\n event.durationMs !== undefined &&\n Number.isFinite(event.durationMs) &&\n event.durationMs >= 0\n ) {\n out.durationMs = event.durationMs;\n }\n\n return out;\n}\n\n/**\n * Maps persisted v0.2 events to in-memory {@link InspectEvent} rows.\n */\nexport function persistedInspectEventsToInspectEvents(\n events: readonly PersistedInspectEvent[],\n options?: PersistedToInspectEventOptions,\n): InspectEvent[] {\n const skipInvalid = options?.skipInvalid === true;\n const out: InspectEvent[] = [];\n\n for (const event of events) {\n if (!isPersistedInspectEvent(event)) {\n if (skipInvalid) {\n continue;\n }\n throw new Error(\"Invalid PersistedInspectEvent: failed isPersistedInspectEvent\");\n }\n out.push(persistedInspectEventToInspectEvent(event));\n }\n\n return out;\n}\n","import { TreeBuilder } from \"../logs/tree-builder.js\";\nimport type { InspectRunTree } from \"../types/inspect-event.js\";\nimport type { PersistedInspectEvent } from \"../types/persisted-inspect-event.js\";\nimport type { TraceEvent } from \"../types.js\";\n\nimport { traceEventsToPersistedInspectEvents } from \"./from-trace-event.js\";\nimport { persistedInspectEventsToInspectEvents } from \"./to-inspect-event.js\";\n\nexport interface PersistedTreeBridgeOptions {\n /**\n * If true, invalid persisted events are skipped.\n * If false or omitted, invalid persisted events throw.\n */\n skipInvalid?: boolean;\n}\n\n/**\n * Builds {@link InspectRunTree} rows from v0.2 {@link PersistedInspectEvent} input.\n * Uses {@link TreeBuilder} as the canonical tree builder. Does not mutate `events`.\n */\nexport function persistedInspectEventsToRunTrees(\n events: readonly PersistedInspectEvent[],\n options?: PersistedTreeBridgeOptions,\n): InspectRunTree[] {\n const inspectEvents = persistedInspectEventsToInspectEvents(events, {\n skipInvalid: options?.skipInvalid,\n });\n return new TreeBuilder().build(inspectEvents);\n}\n\n/**\n * Builds {@link InspectRunTree} rows from legacy v0.1 {@link TraceEvent} input\n * via the persisted-event model. Does not mutate `events`.\n */\nexport function traceEventsToPersistedRunTrees(\n events: readonly TraceEvent[],\n): InspectRunTree[] {\n const persisted = traceEventsToPersistedInspectEvents(events);\n return persistedInspectEventsToRunTrees(persisted);\n}\n"]}
@@ -0,0 +1,150 @@
1
+ import { normalizeTokenUsage } from './chunk-TZISEVLQ.mjs';
2
+
3
+ // packages/core/src/persisted/from-inspect-event.ts
4
+ function sanitizeIdPart(value) {
5
+ return value.replace(/[^a-zA-Z0-9_-]/g, "_");
6
+ }
7
+ function createFallbackEventId(event, eventIndex) {
8
+ const runId = sanitizeIdPart(event.runId);
9
+ const kind = sanitizeIdPart(event.kind);
10
+ const name = sanitizeIdPart(event.name);
11
+ return `inspect:${runId}:${kind}:${name}:${eventIndex}`;
12
+ }
13
+ function toIsoTimestamp(ms) {
14
+ if (typeof ms !== "number" || !Number.isFinite(ms)) {
15
+ return { iso: (/* @__PURE__ */ new Date(0)).toISOString(), invalidTimestamp: true };
16
+ }
17
+ return { iso: new Date(ms).toISOString(), invalidTimestamp: false };
18
+ }
19
+ function compactAttributes(entries) {
20
+ const out = {};
21
+ for (const [key, value] of Object.entries(entries)) {
22
+ if (value !== void 0) {
23
+ out[key] = value;
24
+ }
25
+ }
26
+ return Object.keys(out).length > 0 ? out : void 0;
27
+ }
28
+ function mapInspectSourceToPersisted(source, options) {
29
+ const name = options?.sourceName;
30
+ const version = options?.sourceVersion;
31
+ switch (source.type) {
32
+ case "pino":
33
+ return {
34
+ persistedSource: {
35
+ type: "json-log",
36
+ name: name ?? "pino",
37
+ version
38
+ },
39
+ originalSourceType: "pino"
40
+ };
41
+ case "winston":
42
+ return {
43
+ persistedSource: {
44
+ type: "json-log",
45
+ name: name ?? "winston",
46
+ version
47
+ },
48
+ originalSourceType: "winston"
49
+ };
50
+ case "manual":
51
+ case "json-log":
52
+ case "log4js":
53
+ case "adapter":
54
+ return {
55
+ persistedSource: {
56
+ type: source.type,
57
+ name,
58
+ version
59
+ }
60
+ };
61
+ default:
62
+ return {
63
+ persistedSource: {
64
+ type: "json-log",
65
+ name,
66
+ version
67
+ }
68
+ };
69
+ }
70
+ }
71
+ function mapTokenUsageFromAttributes(attributes) {
72
+ return normalizeTokenUsage(attributes?.tokens);
73
+ }
74
+ function mapErrorFromAttributes(event) {
75
+ if (event.status !== "error" || !event.attributes) {
76
+ return void 0;
77
+ }
78
+ const message = event.attributes.errorMessage;
79
+ if (typeof message !== "string" || message.length === 0) {
80
+ return void 0;
81
+ }
82
+ const err = { message };
83
+ if (typeof event.attributes.errorName === "string") {
84
+ err.name = event.attributes.errorName;
85
+ }
86
+ return err;
87
+ }
88
+ function inspectEventToPersistedInspectEvent(event, options) {
89
+ const eventIndex = options?.eventIndex ?? 0;
90
+ const eventId = typeof event.eventId === "string" && event.eventId.length > 0 ? event.eventId : createFallbackEventId(event, eventIndex);
91
+ const ts = toIsoTimestamp(event.timestamp);
92
+ const { persistedSource, originalSourceType } = mapInspectSourceToPersisted(
93
+ event.source,
94
+ options
95
+ );
96
+ const attrsBase = event.attributes !== void 0 ? { ...event.attributes } : {};
97
+ const attributes = compactAttributes({
98
+ ...attrsBase,
99
+ sourceFile: event.source.file,
100
+ sourceLine: event.source.line,
101
+ originalSourceType,
102
+ invalidTimestamp: ts.invalidTimestamp ? true : void 0
103
+ });
104
+ const tokenUsage = mapTokenUsageFromAttributes(event.attributes);
105
+ const error = mapErrorFromAttributes(event);
106
+ const inputPreview = event.attributes?.inputPreview;
107
+ const outputPreview = event.attributes?.outputPreview;
108
+ const out = {
109
+ schemaVersion: "0.2",
110
+ eventId,
111
+ runId: event.runId,
112
+ kind: event.kind,
113
+ name: event.name,
114
+ timestamp: ts.iso,
115
+ confidence: event.confidence,
116
+ source: persistedSource,
117
+ attributes
118
+ };
119
+ if (event.parentId !== void 0) {
120
+ out.parentId = event.parentId;
121
+ }
122
+ if (event.status !== void 0) {
123
+ out.status = event.status;
124
+ }
125
+ if (event.durationMs !== void 0 && Number.isFinite(event.durationMs) && event.durationMs >= 0) {
126
+ out.durationMs = event.durationMs;
127
+ }
128
+ if (tokenUsage !== void 0) {
129
+ out.tokenUsage = tokenUsage;
130
+ }
131
+ if (error !== void 0) {
132
+ out.error = error;
133
+ }
134
+ if (inputPreview !== void 0) {
135
+ out.inputSummary = inputPreview;
136
+ }
137
+ if (outputPreview !== void 0) {
138
+ out.outputSummary = outputPreview;
139
+ }
140
+ return out;
141
+ }
142
+ function inspectEventsToPersistedInspectEvents(events, options) {
143
+ return events.map(
144
+ (event, index) => inspectEventToPersistedInspectEvent(event, { ...options, eventIndex: index })
145
+ );
146
+ }
147
+
148
+ export { inspectEventToPersistedInspectEvent, inspectEventsToPersistedInspectEvents };
149
+ //# sourceMappingURL=chunk-U2BGPESY.mjs.map
150
+ //# sourceMappingURL=chunk-U2BGPESY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persisted/from-inspect-event.ts"],"names":[],"mappings":"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","file":"chunk-U2BGPESY.mjs","sourcesContent":["import type { EventSource, InspectEvent } from \"../types/inspect-event.js\";\nimport type {\n PersistedEventSource,\n PersistedEventSourceType,\n PersistedInspectError,\n PersistedInspectEvent,\n PersistedTokenUsage,\n} from \"../types/persisted-inspect-event.js\";\nimport { normalizeTokenUsage } from \"./token-usage.js\";\n\nexport interface InspectEventToPersistedOptions {\n /**\n * Optional source name override.\n * If omitted, derived from event.source.type.\n */\n sourceName?: string;\n\n /**\n * Optional source version override.\n */\n sourceVersion?: string;\n\n /**\n * Stable index for deterministic fallback IDs if needed.\n */\n eventIndex?: number;\n}\n\nfunction sanitizeIdPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n\nfunction createFallbackEventId(event: InspectEvent, eventIndex: number): string {\n const runId = sanitizeIdPart(event.runId);\n const kind = sanitizeIdPart(event.kind);\n const name = sanitizeIdPart(event.name);\n return `inspect:${runId}:${kind}:${name}:${eventIndex}`;\n}\n\nfunction toIsoTimestamp(\n ms: number,\n): { iso: string; invalidTimestamp: boolean } {\n if (typeof ms !== \"number\" || !Number.isFinite(ms)) {\n return { iso: new Date(0).toISOString(), invalidTimestamp: true };\n }\n return { iso: new Date(ms).toISOString(), invalidTimestamp: false };\n}\n\nfunction compactAttributes(\n entries: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(entries)) {\n if (value !== undefined) {\n out[key] = value;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction mapInspectSourceToPersisted(\n source: EventSource,\n options?: InspectEventToPersistedOptions,\n): {\n persistedSource: PersistedEventSource;\n originalSourceType?: EventSource[\"type\"];\n} {\n const name = options?.sourceName;\n const version = options?.sourceVersion;\n\n switch (source.type) {\n case \"pino\":\n return {\n persistedSource: {\n type: \"json-log\",\n name: name ?? \"pino\",\n version,\n },\n originalSourceType: \"pino\",\n };\n case \"winston\":\n return {\n persistedSource: {\n type: \"json-log\",\n name: name ?? \"winston\",\n version,\n },\n originalSourceType: \"winston\",\n };\n case \"manual\":\n case \"json-log\":\n case \"log4js\":\n case \"adapter\":\n return {\n persistedSource: {\n type: source.type as PersistedEventSourceType,\n name,\n version,\n },\n };\n default:\n return {\n persistedSource: {\n type: \"json-log\",\n name,\n version,\n },\n };\n }\n}\n\nfunction mapTokenUsageFromAttributes(\n attributes: Record<string, unknown> | undefined,\n): PersistedTokenUsage | undefined {\n return normalizeTokenUsage(attributes?.tokens);\n}\n\nfunction mapErrorFromAttributes(\n event: InspectEvent,\n): PersistedInspectError | undefined {\n if (event.status !== \"error\" || !event.attributes) {\n return undefined;\n }\n const message = event.attributes.errorMessage;\n if (typeof message !== \"string\" || message.length === 0) {\n return undefined;\n }\n const err: PersistedInspectError = { message };\n if (typeof event.attributes.errorName === \"string\") {\n err.name = event.attributes.errorName;\n }\n return err;\n}\n\n/**\n * Maps one in-memory {@link InspectEvent} to a v0.2 {@link PersistedInspectEvent}.\n * Does not mutate `event`.\n */\nexport function inspectEventToPersistedInspectEvent(\n event: InspectEvent,\n options?: InspectEventToPersistedOptions,\n): PersistedInspectEvent {\n const eventIndex = options?.eventIndex ?? 0;\n const eventId =\n typeof event.eventId === \"string\" && event.eventId.length > 0\n ? event.eventId\n : createFallbackEventId(event, eventIndex);\n\n const ts = toIsoTimestamp(event.timestamp);\n const { persistedSource, originalSourceType } = mapInspectSourceToPersisted(\n event.source,\n options,\n );\n\n const attrsBase =\n event.attributes !== undefined ? { ...event.attributes } : {};\n\n const attributes = compactAttributes({\n ...attrsBase,\n sourceFile: event.source.file,\n sourceLine: event.source.line,\n originalSourceType,\n invalidTimestamp: ts.invalidTimestamp ? true : undefined,\n });\n\n const tokenUsage = mapTokenUsageFromAttributes(event.attributes);\n const error = mapErrorFromAttributes(event);\n\n const inputPreview = event.attributes?.inputPreview;\n const outputPreview = event.attributes?.outputPreview;\n\n const out: PersistedInspectEvent = {\n schemaVersion: \"0.2\",\n eventId,\n runId: event.runId,\n kind: event.kind,\n name: event.name,\n timestamp: ts.iso,\n confidence: event.confidence,\n source: persistedSource,\n attributes,\n };\n\n if (event.parentId !== undefined) {\n out.parentId = event.parentId;\n }\n if (event.status !== undefined) {\n out.status = event.status;\n }\n if (\n event.durationMs !== undefined &&\n Number.isFinite(event.durationMs) &&\n event.durationMs >= 0\n ) {\n out.durationMs = event.durationMs;\n }\n if (tokenUsage !== undefined) {\n out.tokenUsage = tokenUsage;\n }\n if (error !== undefined) {\n out.error = error;\n }\n if (inputPreview !== undefined) {\n out.inputSummary = inputPreview;\n }\n if (outputPreview !== undefined) {\n out.outputSummary = outputPreview;\n }\n\n return out;\n}\n\n/**\n * Maps in-memory {@link InspectEvent} rows to persisted v0.2 events.\n */\nexport function inspectEventsToPersistedInspectEvents(\n events: readonly InspectEvent[],\n options?: Omit<InspectEventToPersistedOptions, \"eventIndex\">,\n): PersistedInspectEvent[] {\n return events.map((event, index) =>\n inspectEventToPersistedInspectEvent(event, { ...options, eventIndex: index }),\n );\n}\n"]}