agent-inspect 1.4.0 → 1.5.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 (81) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +26 -6
  3. package/docs/ADAPTERS.md +6 -0
  4. package/docs/API.md +9 -1
  5. package/docs/CLI.md +64 -0
  6. package/docs/DIFF.md +8 -0
  7. package/docs/EXPORTS.md +13 -0
  8. package/docs/GETTING-STARTED.md +19 -1
  9. package/docs/LIMITATIONS.md +3 -1
  10. package/docs/LOGS.md +22 -0
  11. package/docs/SCHEMA.md +3 -1
  12. package/docs/SCREENSHOTS.md +190 -9
  13. package/package.json +51 -1
  14. package/packages/cli/dist/index.cjs +2880 -2037
  15. package/packages/cli/dist/index.cjs.map +1 -1
  16. package/packages/cli/dist/index.mjs +2880 -2037
  17. package/packages/cli/dist/index.mjs.map +1 -1
  18. package/packages/core/dist/advanced.cjs +1437 -0
  19. package/packages/core/dist/advanced.cjs.map +1 -0
  20. package/packages/core/dist/advanced.d.cts +159 -0
  21. package/packages/core/dist/advanced.d.ts +159 -0
  22. package/packages/core/dist/advanced.mjs +8 -0
  23. package/packages/core/dist/advanced.mjs.map +1 -0
  24. package/packages/core/dist/chunk-5EMIZZXD.mjs +907 -0
  25. package/packages/core/dist/chunk-5EMIZZXD.mjs.map +1 -0
  26. package/packages/core/dist/chunk-7TGZLWEE.mjs +35 -0
  27. package/packages/core/dist/chunk-7TGZLWEE.mjs.map +1 -0
  28. package/packages/core/dist/chunk-BT7CATSD.mjs +497 -0
  29. package/packages/core/dist/chunk-BT7CATSD.mjs.map +1 -0
  30. package/packages/core/dist/chunk-E5F2LQCX.mjs +83 -0
  31. package/packages/core/dist/chunk-E5F2LQCX.mjs.map +1 -0
  32. package/packages/core/dist/chunk-EDTQHZPM.mjs +88 -0
  33. package/packages/core/dist/chunk-EDTQHZPM.mjs.map +1 -0
  34. package/packages/core/dist/chunk-HY7H3CQM.mjs +127 -0
  35. package/packages/core/dist/chunk-HY7H3CQM.mjs.map +1 -0
  36. package/packages/core/dist/chunk-Q6EPNB3V.mjs +539 -0
  37. package/packages/core/dist/chunk-Q6EPNB3V.mjs.map +1 -0
  38. package/packages/core/dist/chunk-QPAU2TPA.mjs +785 -0
  39. package/packages/core/dist/chunk-QPAU2TPA.mjs.map +1 -0
  40. package/packages/core/dist/chunk-QX3ZMPUF.mjs +451 -0
  41. package/packages/core/dist/chunk-QX3ZMPUF.mjs.map +1 -0
  42. package/packages/core/dist/chunk-VU6O5QAH.mjs +99 -0
  43. package/packages/core/dist/chunk-VU6O5QAH.mjs.map +1 -0
  44. package/packages/core/dist/chunk-XDBND27A.mjs +975 -0
  45. package/packages/core/dist/chunk-XDBND27A.mjs.map +1 -0
  46. package/packages/core/dist/chunk-YWAOOXLR.mjs +475 -0
  47. package/packages/core/dist/chunk-YWAOOXLR.mjs.map +1 -0
  48. package/packages/core/dist/diff.cjs +993 -0
  49. package/packages/core/dist/diff.cjs.map +1 -0
  50. package/packages/core/dist/diff.d.cts +81 -0
  51. package/packages/core/dist/diff.d.ts +81 -0
  52. package/packages/core/dist/diff.mjs +5 -0
  53. package/packages/core/dist/diff.mjs.map +1 -0
  54. package/packages/core/dist/exporters.cjs +1228 -0
  55. package/packages/core/dist/exporters.cjs.map +1 -0
  56. package/packages/core/dist/exporters.d.cts +113 -0
  57. package/packages/core/dist/exporters.d.ts +113 -0
  58. package/packages/core/dist/exporters.mjs +6 -0
  59. package/packages/core/dist/exporters.mjs.map +1 -0
  60. package/packages/core/dist/index.cjs +2844 -2266
  61. package/packages/core/dist/index.cjs.map +1 -1
  62. package/packages/core/dist/index.d.cts +92 -908
  63. package/packages/core/dist/index.d.ts +92 -908
  64. package/packages/core/dist/index.mjs +997 -5405
  65. package/packages/core/dist/index.mjs.map +1 -1
  66. package/packages/core/dist/log-config-BzGmDYum.d.cts +71 -0
  67. package/packages/core/dist/log-config-BzGmDYum.d.ts +71 -0
  68. package/packages/core/dist/logs.cjs +1007 -0
  69. package/packages/core/dist/logs.cjs.map +1 -0
  70. package/packages/core/dist/logs.d.cts +137 -0
  71. package/packages/core/dist/logs.d.ts +137 -0
  72. package/packages/core/dist/logs.mjs +6 -0
  73. package/packages/core/dist/logs.mjs.map +1 -0
  74. package/packages/core/dist/persisted.cjs +1057 -0
  75. package/packages/core/dist/persisted.cjs.map +1 -0
  76. package/packages/core/dist/persisted.d.cts +160 -0
  77. package/packages/core/dist/persisted.d.ts +160 -0
  78. package/packages/core/dist/persisted.mjs +5 -0
  79. package/packages/core/dist/persisted.mjs.map +1 -0
  80. package/packages/core/dist/types-Bkt7LS01.d.ts +226 -0
  81. package/packages/core/dist/types-CNbheSdk.d.cts +226 -0
@@ -0,0 +1,1057 @@
1
+ 'use strict';
2
+
3
+ // packages/core/src/types/persisted-inspect-event.ts
4
+ var INSPECT_KINDS = [
5
+ "RUN",
6
+ "AGENT",
7
+ "LLM",
8
+ "TOOL",
9
+ "CHAIN",
10
+ "RETRIEVER",
11
+ "DECISION",
12
+ "RESULT",
13
+ "ERROR",
14
+ "LOGIC",
15
+ "LOG"
16
+ ];
17
+ var ATTRIBUTION_CONFIDENCES = [
18
+ "explicit",
19
+ "correlated",
20
+ "heuristic",
21
+ "unknown"
22
+ ];
23
+ var PERSISTED_EVENT_SOURCE_TYPES = [
24
+ "manual",
25
+ "json-log",
26
+ "log4js",
27
+ "adapter",
28
+ "ai-sdk",
29
+ "otel"
30
+ ];
31
+ var PERSISTED_EVENT_STATUSES = [
32
+ "running",
33
+ "ok",
34
+ "error",
35
+ "unknown"
36
+ ];
37
+ function isRecord(value) {
38
+ return typeof value === "object" && value !== null && !Array.isArray(value);
39
+ }
40
+ function isString(value) {
41
+ return typeof value === "string";
42
+ }
43
+ function isNonEmptyString(value) {
44
+ return typeof value === "string" && value.length > 0;
45
+ }
46
+ function isOptionalString(value) {
47
+ return value === void 0 || isString(value);
48
+ }
49
+ function isNonNegativeNumber(value) {
50
+ return typeof value === "number" && Number.isFinite(value) && value >= 0;
51
+ }
52
+ function isOptionalNonNegativeNumber(value) {
53
+ return value === void 0 || isNonNegativeNumber(value);
54
+ }
55
+ function isInspectKind(value) {
56
+ return typeof value === "string" && INSPECT_KINDS.includes(value);
57
+ }
58
+ function isAttributionConfidence(value) {
59
+ return typeof value === "string" && ATTRIBUTION_CONFIDENCES.includes(value);
60
+ }
61
+ function isPersistedEventSourceType(value) {
62
+ return typeof value === "string" && PERSISTED_EVENT_SOURCE_TYPES.includes(value);
63
+ }
64
+ function isPersistedEventStatus(value) {
65
+ return typeof value === "string" && PERSISTED_EVENT_STATUSES.includes(value);
66
+ }
67
+ function isPersistedEventSource(value) {
68
+ if (!isRecord(value)) return false;
69
+ if (!isPersistedEventSourceType(value.type)) return false;
70
+ if (!isOptionalString(value.name)) return false;
71
+ if (!isOptionalString(value.version)) return false;
72
+ return true;
73
+ }
74
+ function isPersistedInspectError(value) {
75
+ if (!isRecord(value)) return false;
76
+ if (!isNonEmptyString(value.message)) return false;
77
+ if (!isOptionalString(value.name)) return false;
78
+ if (!isOptionalString(value.code)) return false;
79
+ return true;
80
+ }
81
+ function isPersistedTokenUsage(value) {
82
+ if (!isRecord(value)) return false;
83
+ if (!isOptionalNonNegativeNumber(value.input)) return false;
84
+ if (!isOptionalNonNegativeNumber(value.output)) return false;
85
+ if (!isOptionalNonNegativeNumber(value.total)) return false;
86
+ return true;
87
+ }
88
+ function isPersistedTraceContext(value) {
89
+ if (!isRecord(value)) return false;
90
+ if (!isOptionalString(value.traceId)) return false;
91
+ if (!isOptionalString(value.spanId)) return false;
92
+ if (!isOptionalString(value.parentSpanId)) return false;
93
+ return true;
94
+ }
95
+ function isPersistedInspectEvent(value) {
96
+ if (!isRecord(value)) return false;
97
+ if (value.schemaVersion !== "0.2") return false;
98
+ if (!isNonEmptyString(value.eventId)) return false;
99
+ if (!isNonEmptyString(value.runId)) return false;
100
+ if (!isInspectKind(value.kind)) return false;
101
+ if (!isNonEmptyString(value.name)) return false;
102
+ if (!isNonEmptyString(value.timestamp)) return false;
103
+ if (!isAttributionConfidence(value.confidence)) return false;
104
+ if (!isPersistedEventSource(value.source)) return false;
105
+ if (value.parentId !== void 0 && !isNonEmptyString(value.parentId)) {
106
+ return false;
107
+ }
108
+ if (value.status !== void 0 && !isPersistedEventStatus(value.status)) {
109
+ return false;
110
+ }
111
+ if (!isOptionalString(value.startedAt)) return false;
112
+ if (!isOptionalString(value.endedAt)) return false;
113
+ if (value.durationMs !== void 0 && !isNonNegativeNumber(value.durationMs)) {
114
+ return false;
115
+ }
116
+ if (value.attributes !== void 0 && !isRecord(value.attributes)) {
117
+ return false;
118
+ }
119
+ if (value.error !== void 0 && !isPersistedInspectError(value.error)) {
120
+ return false;
121
+ }
122
+ if (value.tokenUsage !== void 0 && !isPersistedTokenUsage(value.tokenUsage)) {
123
+ return false;
124
+ }
125
+ if (value.trace !== void 0 && !isPersistedTraceContext(value.trace)) {
126
+ return false;
127
+ }
128
+ return true;
129
+ }
130
+
131
+ // packages/core/src/correlation-metadata.ts
132
+ var TRACE_CORRELATION_KEYS = [
133
+ "correlationId",
134
+ "requestId",
135
+ "decisionId",
136
+ "groupId"
137
+ ];
138
+ function isNonEmptyString2(value) {
139
+ return typeof value === "string" && value.length > 0;
140
+ }
141
+ function extractCorrelationMetadata(record) {
142
+ if (!record) {
143
+ return void 0;
144
+ }
145
+ const out = {};
146
+ let found = false;
147
+ for (const key of TRACE_CORRELATION_KEYS) {
148
+ const value = record[key];
149
+ if (isNonEmptyString2(value)) {
150
+ out[key] = value;
151
+ found = true;
152
+ }
153
+ }
154
+ return found ? out : void 0;
155
+ }
156
+
157
+ // packages/core/src/persisted/from-trace-event.ts
158
+ function sanitizeIdPart(value) {
159
+ return value.replace(/[^a-zA-Z0-9_-]/g, "_");
160
+ }
161
+ function nodeIdForEvent(event) {
162
+ switch (event.event) {
163
+ case "run_started":
164
+ case "run_completed":
165
+ return event.runId;
166
+ case "step_started":
167
+ case "step_completed":
168
+ return event.stepId;
169
+ default:
170
+ return "unknown";
171
+ }
172
+ }
173
+ function createPersistedEventId(event, eventIndex) {
174
+ const runId = sanitizeIdPart(event.runId);
175
+ const ev = sanitizeIdPart(event.event);
176
+ const node = sanitizeIdPart(nodeIdForEvent(event));
177
+ return `manual:${runId}:${ev}:${node}:${eventIndex}`;
178
+ }
179
+ function toIsoTimestamp(ms) {
180
+ if (typeof ms !== "number" || !Number.isFinite(ms)) {
181
+ return { iso: (/* @__PURE__ */ new Date(0)).toISOString(), invalidTimestamp: true };
182
+ }
183
+ return { iso: new Date(ms).toISOString(), invalidTimestamp: false };
184
+ }
185
+ function buildSource(options) {
186
+ return {
187
+ type: "manual",
188
+ name: options?.sourceName ?? "trace-event",
189
+ version: options?.sourceVersion ?? "0.1"
190
+ };
191
+ }
192
+ function mapStepTypeToInspectKind(type) {
193
+ switch (type) {
194
+ case "run":
195
+ return "RUN";
196
+ case "llm":
197
+ return "LLM";
198
+ case "tool":
199
+ return "TOOL";
200
+ case "decision":
201
+ return "DECISION";
202
+ case "logic":
203
+ case "state":
204
+ case "custom":
205
+ return "LOGIC";
206
+ default:
207
+ return "LOGIC";
208
+ }
209
+ }
210
+ function mapRunOrStepStatus(status) {
211
+ return status === "success" ? "ok" : "error";
212
+ }
213
+ function mapErrorInfo(error) {
214
+ if (!error?.message) {
215
+ return {};
216
+ }
217
+ const out = {
218
+ persisted: {
219
+ message: error.message,
220
+ name: "Error"
221
+ }
222
+ };
223
+ if (typeof error.stack === "string" && error.stack.length > 0) {
224
+ out.errorStack = error.stack;
225
+ }
226
+ return out;
227
+ }
228
+ function mapTokenUsageFromMetadata(metadata) {
229
+ const tokens = metadata?.tokens;
230
+ if (!tokens || typeof tokens !== "object") {
231
+ return void 0;
232
+ }
233
+ const input = typeof tokens.input === "number" && Number.isFinite(tokens.input) && tokens.input >= 0 ? tokens.input : void 0;
234
+ const output = typeof tokens.output === "number" && Number.isFinite(tokens.output) && tokens.output >= 0 ? tokens.output : void 0;
235
+ if (input === void 0 && output === void 0) {
236
+ return void 0;
237
+ }
238
+ const usage = {};
239
+ if (input !== void 0) usage.input = input;
240
+ if (output !== void 0) usage.output = output;
241
+ if (input !== void 0 && output !== void 0) {
242
+ usage.total = input + output;
243
+ }
244
+ return usage;
245
+ }
246
+ function compactAttributes(entries) {
247
+ const out = {};
248
+ for (const [key, value] of Object.entries(entries)) {
249
+ if (value !== void 0) {
250
+ out[key] = value;
251
+ }
252
+ }
253
+ return Object.keys(out).length > 0 ? out : void 0;
254
+ }
255
+ function traceEventToPersistedInspectEvent(event, options) {
256
+ const eventIndex = options?.eventIndex ?? 0;
257
+ const eventId = createPersistedEventId(event, eventIndex);
258
+ const source = buildSource(options);
259
+ const tsMain = toIsoTimestamp(event.timestamp);
260
+ switch (event.event) {
261
+ case "run_started": {
262
+ const tsStart = toIsoTimestamp(event.startTime);
263
+ const correlation = extractCorrelationMetadata(event.metadata);
264
+ const attributes = compactAttributes({
265
+ legacyEvent: "run_started",
266
+ metadata: event.metadata !== void 0 ? { ...event.metadata } : void 0,
267
+ correlationId: correlation?.correlationId,
268
+ requestId: correlation?.requestId,
269
+ decisionId: correlation?.decisionId,
270
+ groupId: correlation?.groupId,
271
+ invalidTimestamp: tsMain.invalidTimestamp || tsStart.invalidTimestamp ? true : void 0
272
+ });
273
+ return {
274
+ schemaVersion: "0.2",
275
+ eventId,
276
+ runId: event.runId,
277
+ kind: "RUN",
278
+ name: event.name,
279
+ status: "running",
280
+ timestamp: tsMain.iso,
281
+ startedAt: tsStart.iso,
282
+ confidence: "explicit",
283
+ source,
284
+ attributes
285
+ };
286
+ }
287
+ case "run_completed": {
288
+ const tsEnd = toIsoTimestamp(event.endTime);
289
+ const { persisted: error, errorStack } = mapErrorInfo(event.error);
290
+ const attributes = compactAttributes({
291
+ legacyEvent: "run_completed",
292
+ errorStack,
293
+ invalidTimestamp: tsMain.invalidTimestamp || tsEnd.invalidTimestamp ? true : void 0
294
+ });
295
+ return {
296
+ schemaVersion: "0.2",
297
+ eventId,
298
+ runId: event.runId,
299
+ kind: "RUN",
300
+ name: "run",
301
+ status: mapRunOrStepStatus(event.status),
302
+ timestamp: tsMain.iso,
303
+ endedAt: tsEnd.iso,
304
+ durationMs: event.durationMs,
305
+ confidence: "explicit",
306
+ source,
307
+ attributes,
308
+ error
309
+ };
310
+ }
311
+ case "step_started": {
312
+ const tsStart = toIsoTimestamp(event.startTime);
313
+ const tokenUsage = mapTokenUsageFromMetadata(event.metadata);
314
+ const attributes = compactAttributes({
315
+ legacyEvent: "step_started",
316
+ stepId: event.stepId,
317
+ stepType: event.type,
318
+ metadata: event.metadata !== void 0 ? { ...event.metadata } : void 0,
319
+ invalidTimestamp: tsMain.invalidTimestamp || tsStart.invalidTimestamp ? true : void 0
320
+ });
321
+ const out = {
322
+ schemaVersion: "0.2",
323
+ eventId,
324
+ runId: event.runId,
325
+ kind: mapStepTypeToInspectKind(event.type),
326
+ name: event.name,
327
+ status: "running",
328
+ timestamp: tsMain.iso,
329
+ startedAt: tsStart.iso,
330
+ confidence: "explicit",
331
+ source,
332
+ attributes
333
+ };
334
+ if (event.parentId !== void 0) {
335
+ out.parentId = event.parentId;
336
+ }
337
+ if (tokenUsage !== void 0) {
338
+ out.tokenUsage = tokenUsage;
339
+ }
340
+ return out;
341
+ }
342
+ case "step_completed": {
343
+ const tsEnd = toIsoTimestamp(event.endTime);
344
+ const { persisted: error, errorStack } = mapErrorInfo(event.error);
345
+ const attributes = compactAttributes({
346
+ legacyEvent: "step_completed",
347
+ stepId: event.stepId,
348
+ errorStack,
349
+ invalidTimestamp: tsMain.invalidTimestamp || tsEnd.invalidTimestamp ? true : void 0
350
+ });
351
+ return {
352
+ schemaVersion: "0.2",
353
+ eventId,
354
+ runId: event.runId,
355
+ kind: "LOGIC",
356
+ name: event.stepId,
357
+ status: mapRunOrStepStatus(event.status),
358
+ timestamp: tsMain.iso,
359
+ endedAt: tsEnd.iso,
360
+ durationMs: event.durationMs,
361
+ confidence: "explicit",
362
+ source,
363
+ attributes,
364
+ error
365
+ };
366
+ }
367
+ default: {
368
+ const _exhaustive = event;
369
+ throw new Error(`Unsupported trace event: ${_exhaustive.event}`);
370
+ }
371
+ }
372
+ }
373
+ function traceEventsToPersistedInspectEvents(events, options) {
374
+ return events.map(
375
+ (event, index) => traceEventToPersistedInspectEvent(event, { ...options, eventIndex: index })
376
+ );
377
+ }
378
+
379
+ // packages/core/src/persisted/from-inspect-event.ts
380
+ function sanitizeIdPart2(value) {
381
+ return value.replace(/[^a-zA-Z0-9_-]/g, "_");
382
+ }
383
+ function createFallbackEventId(event, eventIndex) {
384
+ const runId = sanitizeIdPart2(event.runId);
385
+ const kind = sanitizeIdPart2(event.kind);
386
+ const name = sanitizeIdPart2(event.name);
387
+ return `inspect:${runId}:${kind}:${name}:${eventIndex}`;
388
+ }
389
+ function toIsoTimestamp2(ms) {
390
+ if (typeof ms !== "number" || !Number.isFinite(ms)) {
391
+ return { iso: (/* @__PURE__ */ new Date(0)).toISOString(), invalidTimestamp: true };
392
+ }
393
+ return { iso: new Date(ms).toISOString(), invalidTimestamp: false };
394
+ }
395
+ function compactAttributes2(entries) {
396
+ const out = {};
397
+ for (const [key, value] of Object.entries(entries)) {
398
+ if (value !== void 0) {
399
+ out[key] = value;
400
+ }
401
+ }
402
+ return Object.keys(out).length > 0 ? out : void 0;
403
+ }
404
+ function mapInspectSourceToPersisted(source, options) {
405
+ const name = options?.sourceName;
406
+ const version = options?.sourceVersion;
407
+ switch (source.type) {
408
+ case "pino":
409
+ return {
410
+ persistedSource: {
411
+ type: "json-log",
412
+ name: name ?? "pino",
413
+ version
414
+ },
415
+ originalSourceType: "pino"
416
+ };
417
+ case "winston":
418
+ return {
419
+ persistedSource: {
420
+ type: "json-log",
421
+ name: name ?? "winston",
422
+ version
423
+ },
424
+ originalSourceType: "winston"
425
+ };
426
+ case "manual":
427
+ case "json-log":
428
+ case "log4js":
429
+ case "adapter":
430
+ return {
431
+ persistedSource: {
432
+ type: source.type,
433
+ name,
434
+ version
435
+ }
436
+ };
437
+ default:
438
+ return {
439
+ persistedSource: {
440
+ type: "json-log",
441
+ name,
442
+ version
443
+ }
444
+ };
445
+ }
446
+ }
447
+ function mapTokenUsageFromAttributes(attributes) {
448
+ const tokens = attributes?.tokens;
449
+ if (!tokens || typeof tokens !== "object" || Array.isArray(tokens)) {
450
+ return void 0;
451
+ }
452
+ const rec = tokens;
453
+ const input = typeof rec.input === "number" && Number.isFinite(rec.input) && rec.input >= 0 ? rec.input : void 0;
454
+ const output = typeof rec.output === "number" && Number.isFinite(rec.output) && rec.output >= 0 ? rec.output : void 0;
455
+ if (input === void 0 && output === void 0) {
456
+ return void 0;
457
+ }
458
+ const usage = {};
459
+ if (input !== void 0) usage.input = input;
460
+ if (output !== void 0) usage.output = output;
461
+ if (input !== void 0 && output !== void 0) {
462
+ usage.total = input + output;
463
+ }
464
+ return usage;
465
+ }
466
+ function mapErrorFromAttributes(event) {
467
+ if (event.status !== "error" || !event.attributes) {
468
+ return void 0;
469
+ }
470
+ const message = event.attributes.errorMessage;
471
+ if (typeof message !== "string" || message.length === 0) {
472
+ return void 0;
473
+ }
474
+ const err = { message };
475
+ if (typeof event.attributes.errorName === "string") {
476
+ err.name = event.attributes.errorName;
477
+ }
478
+ return err;
479
+ }
480
+ function inspectEventToPersistedInspectEvent(event, options) {
481
+ const eventIndex = options?.eventIndex ?? 0;
482
+ const eventId = typeof event.eventId === "string" && event.eventId.length > 0 ? event.eventId : createFallbackEventId(event, eventIndex);
483
+ const ts = toIsoTimestamp2(event.timestamp);
484
+ const { persistedSource, originalSourceType } = mapInspectSourceToPersisted(
485
+ event.source,
486
+ options
487
+ );
488
+ const attrsBase = event.attributes !== void 0 ? { ...event.attributes } : {};
489
+ const attributes = compactAttributes2({
490
+ ...attrsBase,
491
+ sourceFile: event.source.file,
492
+ sourceLine: event.source.line,
493
+ originalSourceType,
494
+ invalidTimestamp: ts.invalidTimestamp ? true : void 0
495
+ });
496
+ const tokenUsage = mapTokenUsageFromAttributes(event.attributes);
497
+ const error = mapErrorFromAttributes(event);
498
+ const inputPreview = event.attributes?.inputPreview;
499
+ const outputPreview = event.attributes?.outputPreview;
500
+ const out = {
501
+ schemaVersion: "0.2",
502
+ eventId,
503
+ runId: event.runId,
504
+ kind: event.kind,
505
+ name: event.name,
506
+ timestamp: ts.iso,
507
+ confidence: event.confidence,
508
+ source: persistedSource,
509
+ attributes
510
+ };
511
+ if (event.parentId !== void 0) {
512
+ out.parentId = event.parentId;
513
+ }
514
+ if (event.status !== void 0) {
515
+ out.status = event.status;
516
+ }
517
+ if (event.durationMs !== void 0 && Number.isFinite(event.durationMs) && event.durationMs >= 0) {
518
+ out.durationMs = event.durationMs;
519
+ }
520
+ if (tokenUsage !== void 0) {
521
+ out.tokenUsage = tokenUsage;
522
+ }
523
+ if (error !== void 0) {
524
+ out.error = error;
525
+ }
526
+ if (inputPreview !== void 0) {
527
+ out.inputSummary = inputPreview;
528
+ }
529
+ if (outputPreview !== void 0) {
530
+ out.outputSummary = outputPreview;
531
+ }
532
+ return out;
533
+ }
534
+ function inspectEventsToPersistedInspectEvents(events, options) {
535
+ return events.map(
536
+ (event, index) => inspectEventToPersistedInspectEvent(event, { ...options, eventIndex: index })
537
+ );
538
+ }
539
+
540
+ // packages/core/src/persisted/to-inspect-event.ts
541
+ function compactAttributes3(entries) {
542
+ const out = {};
543
+ for (const [key, value] of Object.entries(entries)) {
544
+ if (value !== void 0) {
545
+ out[key] = value;
546
+ }
547
+ }
548
+ return Object.keys(out).length > 0 ? out : void 0;
549
+ }
550
+ function parseIsoToMs(iso) {
551
+ const parsed = Date.parse(iso);
552
+ if (!Number.isFinite(parsed)) {
553
+ return { ms: 0, invalidTimestamp: true };
554
+ }
555
+ return { ms: parsed, invalidTimestamp: false };
556
+ }
557
+ function mapPersistedSourceToInspect(event) {
558
+ const attrs = event.attributes ?? {};
559
+ const sourceName = event.source.name;
560
+ if (sourceName === "pino") {
561
+ return {
562
+ type: "pino",
563
+ file: typeof attrs.sourceFile === "string" ? attrs.sourceFile : void 0,
564
+ line: typeof attrs.sourceLine === "number" ? attrs.sourceLine : void 0
565
+ };
566
+ }
567
+ if (sourceName === "winston") {
568
+ return {
569
+ type: "winston",
570
+ file: typeof attrs.sourceFile === "string" ? attrs.sourceFile : void 0,
571
+ line: typeof attrs.sourceLine === "number" ? attrs.sourceLine : void 0
572
+ };
573
+ }
574
+ const mapType = (t) => {
575
+ switch (t) {
576
+ case "manual":
577
+ return "manual";
578
+ case "json-log":
579
+ return "json-log";
580
+ case "log4js":
581
+ return "log4js";
582
+ case "adapter":
583
+ case "ai-sdk":
584
+ case "otel":
585
+ return "adapter";
586
+ default:
587
+ return "json-log";
588
+ }
589
+ };
590
+ return {
591
+ type: mapType(event.source.type),
592
+ file: typeof attrs.sourceFile === "string" ? attrs.sourceFile : void 0,
593
+ line: typeof attrs.sourceLine === "number" ? attrs.sourceLine : void 0
594
+ };
595
+ }
596
+ function buildInspectAttributes(event) {
597
+ const attrs = event.attributes !== void 0 ? { ...event.attributes } : {};
598
+ if (event.inputSummary !== void 0) {
599
+ attrs.inputSummary = event.inputSummary;
600
+ }
601
+ if (event.outputSummary !== void 0) {
602
+ attrs.outputSummary = event.outputSummary;
603
+ }
604
+ if (event.error) {
605
+ if (event.error.name !== void 0) {
606
+ attrs.errorName = event.error.name;
607
+ }
608
+ attrs.errorMessage = event.error.message;
609
+ if (event.error.code !== void 0) {
610
+ attrs.errorCode = event.error.code;
611
+ }
612
+ }
613
+ if (event.tokenUsage) {
614
+ attrs.tokens = { ...event.tokenUsage };
615
+ }
616
+ if (event.source.type === "ai-sdk" || event.source.type === "otel") {
617
+ attrs.originalSourceType = event.source.type;
618
+ }
619
+ if (event.source.name !== void 0) {
620
+ attrs.sourceName = event.source.name;
621
+ }
622
+ if (event.source.version !== void 0) {
623
+ attrs.sourceVersion = event.source.version;
624
+ }
625
+ return attrs;
626
+ }
627
+ function persistedInspectEventToInspectEvent(event) {
628
+ if (!isPersistedInspectEvent(event)) {
629
+ throw new Error("Invalid PersistedInspectEvent: failed isPersistedInspectEvent");
630
+ }
631
+ const ts = parseIsoToMs(event.timestamp);
632
+ const attrs = buildInspectAttributes(event);
633
+ if (ts.invalidTimestamp) {
634
+ attrs.invalidTimestamp = true;
635
+ }
636
+ let status;
637
+ if (event.status === "running" || event.status === "ok" || event.status === "error") {
638
+ status = event.status;
639
+ } else if (event.status === "unknown") {
640
+ attrs.persistedStatus = "unknown";
641
+ }
642
+ const out = {
643
+ eventId: event.eventId,
644
+ runId: event.runId,
645
+ name: event.name,
646
+ kind: event.kind,
647
+ timestamp: ts.ms,
648
+ confidence: event.confidence,
649
+ source: mapPersistedSourceToInspect(event),
650
+ attributes: compactAttributes3(attrs)
651
+ };
652
+ if (event.parentId !== void 0) {
653
+ out.parentId = event.parentId;
654
+ }
655
+ if (status !== void 0) {
656
+ out.status = status;
657
+ }
658
+ if (event.durationMs !== void 0 && Number.isFinite(event.durationMs) && event.durationMs >= 0) {
659
+ out.durationMs = event.durationMs;
660
+ }
661
+ return out;
662
+ }
663
+ function persistedInspectEventsToInspectEvents(events, options) {
664
+ const skipInvalid = options?.skipInvalid === true;
665
+ const out = [];
666
+ for (const event of events) {
667
+ if (!isPersistedInspectEvent(event)) {
668
+ if (skipInvalid) {
669
+ continue;
670
+ }
671
+ throw new Error("Invalid PersistedInspectEvent: failed isPersistedInspectEvent");
672
+ }
673
+ out.push(persistedInspectEventToInspectEvent(event));
674
+ }
675
+ return out;
676
+ }
677
+
678
+ // packages/core/src/persisted/to-trace-event.ts
679
+ function parseIsoToMs2(iso) {
680
+ const parsed = Date.parse(iso);
681
+ return Number.isFinite(parsed) ? parsed : 0;
682
+ }
683
+ function mapInspectKindToStepType(kind) {
684
+ switch (kind) {
685
+ case "LLM":
686
+ return "llm";
687
+ case "TOOL":
688
+ return "tool";
689
+ case "DECISION":
690
+ return "decision";
691
+ case "RUN":
692
+ return "run";
693
+ default:
694
+ return "logic";
695
+ }
696
+ }
697
+ function mapPersistedStatusToStepStatus(status) {
698
+ switch (status) {
699
+ case "ok":
700
+ return "success";
701
+ case "error":
702
+ return "error";
703
+ case "running":
704
+ return "running";
705
+ default:
706
+ return void 0;
707
+ }
708
+ }
709
+ function mapPersistedStatusToRunStatus(status) {
710
+ switch (status) {
711
+ case "ok":
712
+ return "success";
713
+ case "error":
714
+ return "error";
715
+ case "running":
716
+ return "running";
717
+ default:
718
+ return void 0;
719
+ }
720
+ }
721
+ function mapPersistedError(error) {
722
+ if (!error?.message) return void 0;
723
+ const out = { message: error.message };
724
+ const stack = typeof error.name === "string" && error.name.length > 0 ? error.name : void 0;
725
+ if (stack) {
726
+ out.stack = stack;
727
+ }
728
+ return out;
729
+ }
730
+ function mapTokenUsageToMetadata(tokenUsage, attributes) {
731
+ const metadata = {};
732
+ if (attributes?.metadata && typeof attributes.metadata === "object") {
733
+ Object.assign(metadata, attributes.metadata);
734
+ }
735
+ if (tokenUsage) {
736
+ metadata.tokens = {
737
+ ...tokenUsage.input !== void 0 ? { input: tokenUsage.input } : {},
738
+ ...tokenUsage.output !== void 0 ? { output: tokenUsage.output } : {}
739
+ };
740
+ }
741
+ return Object.keys(metadata).length > 0 ? metadata : void 0;
742
+ }
743
+ function pickRunMetadata(attributes) {
744
+ if (!attributes) return void 0;
745
+ const metadata = attributes.metadata && typeof attributes.metadata === "object" ? { ...attributes.metadata } : {};
746
+ for (const key of [
747
+ "correlationId",
748
+ "requestId",
749
+ "decisionId",
750
+ "groupId"
751
+ ]) {
752
+ const value = attributes[key];
753
+ if (typeof value === "string" && value.trim() !== "") {
754
+ metadata[key] = value;
755
+ }
756
+ }
757
+ return Object.keys(metadata).length > 0 ? metadata : void 0;
758
+ }
759
+ function resolveStepId(event) {
760
+ const attrs = event.attributes;
761
+ if (attrs && typeof attrs.stepId === "string" && attrs.stepId.trim() !== "") {
762
+ return attrs.stepId;
763
+ }
764
+ return event.eventId;
765
+ }
766
+ function resolveStepType(event) {
767
+ const attrs = event.attributes;
768
+ if (attrs && typeof attrs.stepType === "string") {
769
+ const t = attrs.stepType;
770
+ if (t === "run" || t === "llm" || t === "tool" || t === "decision" || t === "logic" || t === "state" || t === "custom") {
771
+ return t;
772
+ }
773
+ }
774
+ return mapInspectKindToStepType(event.kind);
775
+ }
776
+ function resolveTimes(event) {
777
+ const timestamp = parseIsoToMs2(event.timestamp);
778
+ const startTime = event.startedAt !== void 0 ? parseIsoToMs2(event.startedAt) : timestamp;
779
+ let endTime = event.endedAt !== void 0 ? parseIsoToMs2(event.endedAt) : timestamp;
780
+ if (event.durationMs !== void 0 && Number.isFinite(event.durationMs) && event.durationMs >= 0 && event.endedAt === void 0) {
781
+ endTime = startTime + event.durationMs;
782
+ }
783
+ return { timestamp, startTime, endTime };
784
+ }
785
+ function fromLegacyRunStarted(event) {
786
+ const { timestamp, startTime } = resolveTimes(event);
787
+ const out = {
788
+ schemaVersion: "0.1",
789
+ event: "run_started",
790
+ timestamp,
791
+ runId: event.runId,
792
+ name: event.name,
793
+ startTime
794
+ };
795
+ const metadata = pickRunMetadata(event.attributes);
796
+ if (metadata) out.metadata = metadata;
797
+ return out;
798
+ }
799
+ function fromLegacyRunCompleted(event) {
800
+ const { timestamp, endTime } = resolveTimes(event);
801
+ const status = mapPersistedStatusToRunStatus(event.status) ?? "success";
802
+ const out = {
803
+ schemaVersion: "0.1",
804
+ event: "run_completed",
805
+ timestamp,
806
+ runId: event.runId,
807
+ status: status === "running" ? "success" : status,
808
+ endTime,
809
+ durationMs: event.durationMs ?? Math.max(0, endTime - timestamp)
810
+ };
811
+ const error = mapPersistedError(event.error);
812
+ if (error) out.error = error;
813
+ return out;
814
+ }
815
+ function fromLegacyStepStarted(event) {
816
+ const { timestamp, startTime } = resolveTimes(event);
817
+ const out = {
818
+ schemaVersion: "0.1",
819
+ event: "step_started",
820
+ timestamp,
821
+ runId: event.runId,
822
+ stepId: resolveStepId(event),
823
+ name: event.name,
824
+ type: resolveStepType(event),
825
+ startTime
826
+ };
827
+ if (event.parentId !== void 0) out.parentId = event.parentId;
828
+ const metadata = mapTokenUsageToMetadata(event.tokenUsage, event.attributes);
829
+ if (metadata) out.metadata = metadata;
830
+ return out;
831
+ }
832
+ function fromLegacyStepCompleted(event) {
833
+ const { timestamp, endTime } = resolveTimes(event);
834
+ const status = mapPersistedStatusToStepStatus(event.status) ?? "success";
835
+ const out = {
836
+ schemaVersion: "0.1",
837
+ event: "step_completed",
838
+ timestamp,
839
+ runId: event.runId,
840
+ stepId: resolveStepId(event),
841
+ status: status === "running" ? "success" : status,
842
+ endTime,
843
+ durationMs: event.durationMs ?? Math.max(0, endTime - timestamp)
844
+ };
845
+ const error = mapPersistedError(event.error);
846
+ if (error) out.error = error;
847
+ return out;
848
+ }
849
+ function fromNativeRun(event) {
850
+ const { timestamp, startTime, endTime } = resolveTimes(event);
851
+ const runStatus = mapPersistedStatusToRunStatus(event.status);
852
+ const out = [];
853
+ if (runStatus === "running" || event.startedAt !== void 0) {
854
+ const started = {
855
+ schemaVersion: "0.1",
856
+ event: "run_started",
857
+ timestamp,
858
+ runId: event.runId,
859
+ name: event.name,
860
+ startTime
861
+ };
862
+ const metadata = pickRunMetadata(event.attributes);
863
+ if (metadata) started.metadata = metadata;
864
+ out.push(started);
865
+ }
866
+ if (runStatus === "success" || runStatus === "error" || event.endedAt !== void 0) {
867
+ const completed = {
868
+ schemaVersion: "0.1",
869
+ event: "run_completed",
870
+ timestamp,
871
+ runId: event.runId,
872
+ status: runStatus === "error" ? "error" : "success",
873
+ endTime,
874
+ durationMs: event.durationMs ?? Math.max(0, endTime - startTime)
875
+ };
876
+ const error = mapPersistedError(event.error);
877
+ if (error) completed.error = error;
878
+ out.push(completed);
879
+ }
880
+ if (out.length === 0) {
881
+ out.push(fromLegacyRunStarted(event));
882
+ }
883
+ return out;
884
+ }
885
+ function fromNativeStep(event) {
886
+ const { timestamp, startTime, endTime } = resolveTimes(event);
887
+ const stepStatus = mapPersistedStatusToStepStatus(event.status);
888
+ const stepId = resolveStepId(event);
889
+ const out = [];
890
+ const shouldEmitStarted = stepStatus === "running" || event.startedAt !== void 0 || stepStatus === "success" || stepStatus === "error";
891
+ if (shouldEmitStarted) {
892
+ const started = {
893
+ schemaVersion: "0.1",
894
+ event: "step_started",
895
+ timestamp,
896
+ runId: event.runId,
897
+ stepId,
898
+ name: event.name,
899
+ type: resolveStepType(event),
900
+ startTime
901
+ };
902
+ if (event.parentId !== void 0) started.parentId = event.parentId;
903
+ const metadata = mapTokenUsageToMetadata(event.tokenUsage, event.attributes);
904
+ if (metadata) started.metadata = metadata;
905
+ out.push(started);
906
+ }
907
+ if (stepStatus === "success" || stepStatus === "error" || event.endedAt !== void 0 || event.durationMs !== void 0) {
908
+ const completed = {
909
+ schemaVersion: "0.1",
910
+ event: "step_completed",
911
+ timestamp,
912
+ runId: event.runId,
913
+ stepId,
914
+ status: stepStatus === "error" ? "error" : "success",
915
+ endTime,
916
+ durationMs: event.durationMs ?? Math.max(0, endTime - startTime)
917
+ };
918
+ const error = mapPersistedError(event.error);
919
+ if (error) completed.error = error;
920
+ out.push(completed);
921
+ }
922
+ if (out.length === 0) {
923
+ out.push(fromLegacyStepStarted(event));
924
+ }
925
+ return out;
926
+ }
927
+ function persistedInspectEventToTraceEvents(event) {
928
+ if (!isPersistedInspectEvent(event)) {
929
+ throw new Error("Invalid PersistedInspectEvent: failed isPersistedInspectEvent");
930
+ }
931
+ const legacyEvent = event.attributes?.legacyEvent;
932
+ if (legacyEvent === "run_started") return [fromLegacyRunStarted(event)];
933
+ if (legacyEvent === "run_completed") return [fromLegacyRunCompleted(event)];
934
+ if (legacyEvent === "step_started") return [fromLegacyStepStarted(event)];
935
+ if (legacyEvent === "step_completed") return [fromLegacyStepCompleted(event)];
936
+ if (event.kind === "RUN") {
937
+ return fromNativeRun(event);
938
+ }
939
+ return fromNativeStep(event);
940
+ }
941
+ function persistedInspectEventsToTraceEvents(events, options) {
942
+ const out = [];
943
+ events.forEach((event, index) => {
944
+ const rows = persistedInspectEventToTraceEvents(event);
945
+ if (rows.length === 0 && options?.eventIndex !== void 0) {
946
+ void options.eventIndex;
947
+ }
948
+ out.push(...rows);
949
+ });
950
+ return out;
951
+ }
952
+
953
+ // packages/core/src/logs/tree-builder.ts
954
+ function inc(map, key) {
955
+ map[key] = (map[key] ?? 0) + 1;
956
+ }
957
+ function computeRunStatus(events) {
958
+ let hasRunning = false;
959
+ for (const e of events) {
960
+ if (e.status === "error") return "error";
961
+ if (e.status === "running") hasRunning = true;
962
+ }
963
+ if (hasRunning) return "running";
964
+ return "ok";
965
+ }
966
+ var TreeBuilder = class {
967
+ constructor(options) {
968
+ void options?.config;
969
+ }
970
+ build(events) {
971
+ const byRun = /* @__PURE__ */ new Map();
972
+ for (const e of events) {
973
+ if (!byRun.has(e.runId)) byRun.set(e.runId, []);
974
+ byRun.get(e.runId).push(e);
975
+ }
976
+ const out = [];
977
+ for (const [runId, runEvents] of byRun.entries()) {
978
+ const sorted = [...runEvents].sort((a, b) => a.timestamp - b.timestamp);
979
+ const nodes = /* @__PURE__ */ new Map();
980
+ for (const e of sorted) {
981
+ nodes.set(e.eventId, { event: e, children: [], depth: 0 });
982
+ }
983
+ const roots = [];
984
+ for (const node of nodes.values()) {
985
+ const parentId = node.event.parentId;
986
+ if (parentId && nodes.has(parentId)) {
987
+ nodes.get(parentId).children.push(node);
988
+ } else {
989
+ roots.push(node);
990
+ }
991
+ }
992
+ const assignDepth = (n, depth) => {
993
+ n.depth = depth;
994
+ for (const c of n.children) assignDepth(c, depth + 1);
995
+ };
996
+ for (const r of roots) assignDepth(r, 0);
997
+ const confidenceBreakdown = {
998
+ explicit: 0,
999
+ correlated: 0,
1000
+ heuristic: 0,
1001
+ unknown: 0
1002
+ };
1003
+ const kinds = {};
1004
+ for (const e of sorted) {
1005
+ inc(confidenceBreakdown, e.confidence);
1006
+ kinds[e.kind] = (kinds[e.kind] ?? 0) + 1;
1007
+ }
1008
+ const startedAt = sorted.length > 0 ? sorted[0].timestamp : void 0;
1009
+ const endedAt = sorted.length > 0 ? sorted[sorted.length - 1].timestamp : void 0;
1010
+ const status = computeRunStatus(sorted);
1011
+ const durationMs = startedAt !== void 0 && endedAt !== void 0 && Number.isFinite(startedAt) && Number.isFinite(endedAt) && endedAt >= startedAt && status !== "running" ? endedAt - startedAt : void 0;
1012
+ const name = sorted.find((e) => e.kind === "RUN")?.name;
1013
+ out.push({
1014
+ runId,
1015
+ name,
1016
+ status,
1017
+ startedAt,
1018
+ endedAt: status === "running" ? void 0 : endedAt,
1019
+ durationMs,
1020
+ children: roots,
1021
+ metadata: {
1022
+ totalEvents: sorted.length,
1023
+ confidenceBreakdown,
1024
+ kinds
1025
+ }
1026
+ });
1027
+ }
1028
+ out.sort((a, b) => (b.startedAt ?? 0) - (a.startedAt ?? 0));
1029
+ return out;
1030
+ }
1031
+ };
1032
+
1033
+ // packages/core/src/persisted/tree-bridge.ts
1034
+ function persistedInspectEventsToRunTrees(events, options) {
1035
+ const inspectEvents = persistedInspectEventsToInspectEvents(events, {
1036
+ skipInvalid: options?.skipInvalid
1037
+ });
1038
+ return new TreeBuilder().build(inspectEvents);
1039
+ }
1040
+ function traceEventsToPersistedRunTrees(events) {
1041
+ const persisted = traceEventsToPersistedInspectEvents(events);
1042
+ return persistedInspectEventsToRunTrees(persisted);
1043
+ }
1044
+
1045
+ exports.inspectEventToPersistedInspectEvent = inspectEventToPersistedInspectEvent;
1046
+ exports.inspectEventsToPersistedInspectEvents = inspectEventsToPersistedInspectEvents;
1047
+ exports.isPersistedInspectEvent = isPersistedInspectEvent;
1048
+ exports.persistedInspectEventToInspectEvent = persistedInspectEventToInspectEvent;
1049
+ exports.persistedInspectEventToTraceEvents = persistedInspectEventToTraceEvents;
1050
+ exports.persistedInspectEventsToInspectEvents = persistedInspectEventsToInspectEvents;
1051
+ exports.persistedInspectEventsToRunTrees = persistedInspectEventsToRunTrees;
1052
+ exports.persistedInspectEventsToTraceEvents = persistedInspectEventsToTraceEvents;
1053
+ exports.traceEventToPersistedInspectEvent = traceEventToPersistedInspectEvent;
1054
+ exports.traceEventsToPersistedInspectEvents = traceEventsToPersistedInspectEvents;
1055
+ exports.traceEventsToPersistedRunTrees = traceEventsToPersistedRunTrees;
1056
+ //# sourceMappingURL=persisted.cjs.map
1057
+ //# sourceMappingURL=persisted.cjs.map