@webywz/agent-trace 0.0.0-stage → 0.1.1
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.
- package/LICENSE +21 -0
- package/README.md +152 -2
- package/dist/args.d.ts +23 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +216 -0
- package/dist/args.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +145 -0
- package/dist/cli.js.map +1 -0
- package/dist/color.d.ts +15 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +29 -0
- package/dist/color.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/parse/event.d.ts +5 -0
- package/dist/parse/event.d.ts.map +1 -0
- package/dist/parse/event.js +204 -0
- package/dist/parse/event.js.map +1 -0
- package/dist/parse/generic.d.ts +4 -0
- package/dist/parse/generic.d.ts.map +1 -0
- package/dist/parse/generic.js +62 -0
- package/dist/parse/generic.js.map +1 -0
- package/dist/parse/index.d.ts +8 -0
- package/dist/parse/index.d.ts.map +1 -0
- package/dist/parse/index.js +71 -0
- package/dist/parse/index.js.map +1 -0
- package/dist/parse/jsonl.d.ts +8 -0
- package/dist/parse/jsonl.d.ts.map +1 -0
- package/dist/parse/jsonl.js +85 -0
- package/dist/parse/jsonl.js.map +1 -0
- package/dist/parse/langchain.d.ts +4 -0
- package/dist/parse/langchain.d.ts.map +1 -0
- package/dist/parse/langchain.js +348 -0
- package/dist/parse/langchain.js.map +1 -0
- package/dist/parse/openai.d.ts +4 -0
- package/dist/parse/openai.d.ts.map +1 -0
- package/dist/parse/openai.js +344 -0
- package/dist/parse/openai.js.map +1 -0
- package/dist/read-input.d.ts +6 -0
- package/dist/read-input.d.ts.map +1 -0
- package/dist/read-input.js +36 -0
- package/dist/read-input.js.map +1 -0
- package/dist/render/spicy.d.ts +4 -0
- package/dist/render/spicy.d.ts.map +1 -0
- package/dist/render/spicy.js +144 -0
- package/dist/render/spicy.js.map +1 -0
- package/dist/render/timeline.d.ts +4 -0
- package/dist/render/timeline.d.ts.map +1 -0
- package/dist/render/timeline.js +179 -0
- package/dist/render/timeline.js.map +1 -0
- package/dist/stats.d.ts +3 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +64 -0
- package/dist/stats.js.map +1 -0
- package/dist/types.d.ts +49 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +17 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +185 -0
- package/dist/util.js.map +1 -0
- package/examples/README.md +44 -0
- package/examples/generic.json +29 -0
- package/examples/langchain.json +55 -0
- package/examples/openai.json +29 -0
- package/examples/run.jsonl +19 -0
- package/package.json +59 -4
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { createPalette, shouldColor } from "../color.js";
|
|
2
|
+
import { collapseWs, compactJson, formatDuration, timestampMs, truncate } from "../util.js";
|
|
3
|
+
const KIND_COL = 10;
|
|
4
|
+
export function renderTimeline(trace, options = {}) {
|
|
5
|
+
const color = createPalette(shouldColor(options.color));
|
|
6
|
+
const ascii = Boolean(options.ascii);
|
|
7
|
+
const width = Math.max(48, options.width ?? process.stdout.columns ?? 88);
|
|
8
|
+
const maxContent = options.maxContent ?? Math.min(160, Math.max(64, width - 18));
|
|
9
|
+
const glyphs = ascii
|
|
10
|
+
? { pipe: "|", bar: "-", ellipsis: "...", dot: "*" }
|
|
11
|
+
: { pipe: "│", bar: "─", ellipsis: "…", dot: "·" };
|
|
12
|
+
const lines = [];
|
|
13
|
+
const source = trace.source ?? "stdin";
|
|
14
|
+
const header = `${color.bold("agent-trace")} ${glyphs.dot} ${source}`;
|
|
15
|
+
lines.push(header);
|
|
16
|
+
lines.push(color.dim(metaLine(trace, glyphs.dot)));
|
|
17
|
+
lines.push(color.dim(glyphs.bar.repeat(Math.min(width, 72))));
|
|
18
|
+
if (!trace.steps.length) {
|
|
19
|
+
lines.push(color.dim(" (no steps)"));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const t0 = firstTime(trace.steps);
|
|
23
|
+
const showTimes = t0 != null || trace.steps.some((step) => step.durationMs != null);
|
|
24
|
+
for (let i = 0; i < trace.steps.length; i += 1) {
|
|
25
|
+
const step = trace.steps[i];
|
|
26
|
+
if (!step)
|
|
27
|
+
continue;
|
|
28
|
+
const next = trace.steps[i + 1];
|
|
29
|
+
lines.push(renderStep(step, { color, ascii, glyphs, maxContent, t0, next, showTimes }));
|
|
30
|
+
if (i !== trace.steps.length - 1) {
|
|
31
|
+
lines.push(color.dim(` ${glyphs.pipe}`));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
lines.push(color.dim(glyphs.bar.repeat(Math.min(width, 72))));
|
|
36
|
+
lines.push(` ${color.bold(summaryLine(trace, glyphs.dot))}`);
|
|
37
|
+
if (trace.warnings.length) {
|
|
38
|
+
lines.push("");
|
|
39
|
+
for (const warning of trace.warnings.slice(0, 8)) {
|
|
40
|
+
lines.push(color.dim(` warn ${warning}`));
|
|
41
|
+
}
|
|
42
|
+
if (trace.warnings.length > 8) {
|
|
43
|
+
lines.push(color.dim(` warn +${trace.warnings.length - 8} more`));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return lines.join("\n") + "\n";
|
|
47
|
+
}
|
|
48
|
+
function metaLine(trace, dot) {
|
|
49
|
+
const bits = [
|
|
50
|
+
trace.format,
|
|
51
|
+
plural(trace.stats.steps, "step"),
|
|
52
|
+
plural(trace.stats.toolCalls, "tool call"),
|
|
53
|
+
plural(trace.stats.failures, "failure"),
|
|
54
|
+
];
|
|
55
|
+
if (trace.stats.durationMs != null)
|
|
56
|
+
bits.push(formatDuration(trace.stats.durationMs));
|
|
57
|
+
return bits.join(` ${dot} `);
|
|
58
|
+
}
|
|
59
|
+
export function summaryLine(trace, dot = "·") {
|
|
60
|
+
const { stats } = trace;
|
|
61
|
+
const bits = [
|
|
62
|
+
plural(stats.steps, "step"),
|
|
63
|
+
plural(stats.toolCalls, "tool call"),
|
|
64
|
+
plural(stats.failures, "failure"),
|
|
65
|
+
];
|
|
66
|
+
if (stats.tokensIn != null || stats.tokensOut != null) {
|
|
67
|
+
bits.push(`~${fmtNum(stats.tokensIn ?? 0)} in / ${fmtNum(stats.tokensOut ?? 0)} out`);
|
|
68
|
+
}
|
|
69
|
+
if (stats.durationMs != null)
|
|
70
|
+
bits.push(formatDuration(stats.durationMs));
|
|
71
|
+
return bits.join(` ${dot} `);
|
|
72
|
+
}
|
|
73
|
+
function plural(n, noun) {
|
|
74
|
+
return `${n} ${noun}${n === 1 ? "" : "s"}`;
|
|
75
|
+
}
|
|
76
|
+
function renderStep(step, ctx) {
|
|
77
|
+
const { color, glyphs, maxContent, t0, showTimes } = ctx;
|
|
78
|
+
const num = String(step.index).padStart(2, " ");
|
|
79
|
+
const kind = paintKind(step.kind, padKind(step.kind), color);
|
|
80
|
+
const when = showTimes ? color.dim(relTime(step, t0).padStart(7)) : "";
|
|
81
|
+
const dur = stepDuration(step, ctx.next);
|
|
82
|
+
const durText = showTimes ? color.dim((dur != null ? formatDuration(dur) : "").padStart(6)) : "";
|
|
83
|
+
const showName = Boolean(step.name) &&
|
|
84
|
+
step.kind !== "user" &&
|
|
85
|
+
step.kind !== "assistant" &&
|
|
86
|
+
step.kind !== "thought" &&
|
|
87
|
+
step.kind !== "system";
|
|
88
|
+
const label = showName ? color.bold(step.name) : "";
|
|
89
|
+
const timeCols = showTimes ? `${when} ${durText}` : "";
|
|
90
|
+
const head = ` ${num} ${kind}${timeCols ? ` ${timeCols}` : ""}${label ? ` ${label}` : ""}`.replace(/ +$/g, "");
|
|
91
|
+
const detail = detailLine(step, maxContent, glyphs.ellipsis);
|
|
92
|
+
if (!detail)
|
|
93
|
+
return head;
|
|
94
|
+
const painted = step.kind === "error" || step.error ? color.red(detail) : color.dim(detail);
|
|
95
|
+
return `${head}\n ${color.dim(glyphs.pipe)} ${painted}`;
|
|
96
|
+
}
|
|
97
|
+
function detailLine(step, max, ellipsis) {
|
|
98
|
+
if (step.kind === "tool_call") {
|
|
99
|
+
const args = step.args != null ? compactJson(step.args) : collapseWs(step.content ?? "");
|
|
100
|
+
return clip(args, max, ellipsis);
|
|
101
|
+
}
|
|
102
|
+
if (step.kind === "tool_result") {
|
|
103
|
+
const body = step.content ?? (step.result != null ? compactJson(step.result) : "");
|
|
104
|
+
return clip(body, max, ellipsis);
|
|
105
|
+
}
|
|
106
|
+
if (step.kind === "error") {
|
|
107
|
+
return clip(step.error ?? step.content ?? "", max, ellipsis);
|
|
108
|
+
}
|
|
109
|
+
return clip(collapseWs(step.content ?? step.error ?? ""), max, ellipsis);
|
|
110
|
+
}
|
|
111
|
+
function clip(text, max, ellipsis) {
|
|
112
|
+
if (!text)
|
|
113
|
+
return "";
|
|
114
|
+
if (text.length <= max)
|
|
115
|
+
return text;
|
|
116
|
+
const keep = Math.max(0, max - ellipsis.length);
|
|
117
|
+
return text.slice(0, keep) + ellipsis;
|
|
118
|
+
}
|
|
119
|
+
function padKind(kind) {
|
|
120
|
+
const labels = {
|
|
121
|
+
user: "user",
|
|
122
|
+
system: "system",
|
|
123
|
+
thought: "thought",
|
|
124
|
+
assistant: "assistant",
|
|
125
|
+
tool_call: "tool",
|
|
126
|
+
tool_result: "result",
|
|
127
|
+
error: "error",
|
|
128
|
+
other: "event",
|
|
129
|
+
};
|
|
130
|
+
return labels[kind].padEnd(KIND_COL);
|
|
131
|
+
}
|
|
132
|
+
function paintKind(kind, label, color) {
|
|
133
|
+
switch (kind) {
|
|
134
|
+
case "user":
|
|
135
|
+
return color.cyan(label);
|
|
136
|
+
case "system":
|
|
137
|
+
return color.dim(label);
|
|
138
|
+
case "thought":
|
|
139
|
+
return color.magenta(label);
|
|
140
|
+
case "assistant":
|
|
141
|
+
return color.bold(label);
|
|
142
|
+
case "tool_call":
|
|
143
|
+
return color.yellow(label);
|
|
144
|
+
case "tool_result":
|
|
145
|
+
return color.green(label);
|
|
146
|
+
case "error":
|
|
147
|
+
return color.red(color.bold(label));
|
|
148
|
+
default:
|
|
149
|
+
return color.dim(label);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function firstTime(steps) {
|
|
153
|
+
for (const step of steps) {
|
|
154
|
+
const ms = timestampMs(step.ts);
|
|
155
|
+
if (ms != null)
|
|
156
|
+
return ms;
|
|
157
|
+
}
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
function relTime(step, t0) {
|
|
161
|
+
const ms = timestampMs(step.ts);
|
|
162
|
+
if (ms == null || t0 == null)
|
|
163
|
+
return "";
|
|
164
|
+
return "+" + formatDuration(ms - t0);
|
|
165
|
+
}
|
|
166
|
+
function stepDuration(step, next) {
|
|
167
|
+
if (step.durationMs != null)
|
|
168
|
+
return step.durationMs;
|
|
169
|
+
const a = timestampMs(step.ts);
|
|
170
|
+
const b = timestampMs(next?.ts);
|
|
171
|
+
if (a == null || b == null)
|
|
172
|
+
return undefined;
|
|
173
|
+
const delta = b - a;
|
|
174
|
+
return delta >= 0 ? delta : undefined;
|
|
175
|
+
}
|
|
176
|
+
function fmtNum(n) {
|
|
177
|
+
return Math.round(n).toLocaleString("en-US");
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../src/render/timeline.ts"],"names":[],"mappings":"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"}
|
package/dist/stats.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGxD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,UAAU,CAkD3D"}
|
package/dist/stats.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { estimateTokens, timestampMs } from "./util.js";
|
|
2
|
+
export function computeStats(steps) {
|
|
3
|
+
let toolCalls = 0;
|
|
4
|
+
let failures = 0;
|
|
5
|
+
let tokensIn = 0;
|
|
6
|
+
let tokensOut = 0;
|
|
7
|
+
let hasTokenIn = false;
|
|
8
|
+
let hasTokenOut = false;
|
|
9
|
+
const times = [];
|
|
10
|
+
const explicitIn = steps.some((step) => step.tokensIn != null);
|
|
11
|
+
const explicitOut = steps.some((step) => step.tokensOut != null);
|
|
12
|
+
for (const step of steps) {
|
|
13
|
+
if (step.kind === "tool_call")
|
|
14
|
+
toolCalls += 1;
|
|
15
|
+
if (step.kind === "error" || step.error)
|
|
16
|
+
failures += 1;
|
|
17
|
+
if (step.tokensIn != null) {
|
|
18
|
+
tokensIn += step.tokensIn;
|
|
19
|
+
hasTokenIn = true;
|
|
20
|
+
}
|
|
21
|
+
else if (!explicitIn && (step.kind === "user" || step.kind === "system")) {
|
|
22
|
+
tokensIn += estimateTokens(step.content);
|
|
23
|
+
hasTokenIn = true;
|
|
24
|
+
}
|
|
25
|
+
else if (!explicitIn && step.kind === "tool_result") {
|
|
26
|
+
tokensIn += estimateTokens(step.content ?? stringifyMaybe(step.result));
|
|
27
|
+
hasTokenIn = true;
|
|
28
|
+
}
|
|
29
|
+
if (step.tokensOut != null) {
|
|
30
|
+
tokensOut += step.tokensOut;
|
|
31
|
+
hasTokenOut = true;
|
|
32
|
+
}
|
|
33
|
+
else if (!explicitOut &&
|
|
34
|
+
(step.kind === "assistant" || step.kind === "thought" || step.kind === "tool_call")) {
|
|
35
|
+
tokensOut += estimateTokens(step.content ?? stringifyMaybe(step.args));
|
|
36
|
+
hasTokenOut = true;
|
|
37
|
+
}
|
|
38
|
+
const ms = timestampMs(step.ts);
|
|
39
|
+
if (ms != null)
|
|
40
|
+
times.push(ms);
|
|
41
|
+
}
|
|
42
|
+
const durationMs = times.length >= 2 ? Math.max(0, Math.max(...times) - Math.min(...times)) : undefined;
|
|
43
|
+
return {
|
|
44
|
+
steps: steps.length,
|
|
45
|
+
toolCalls,
|
|
46
|
+
failures,
|
|
47
|
+
tokensIn: hasTokenIn ? tokensIn : undefined,
|
|
48
|
+
tokensOut: hasTokenOut ? tokensOut : undefined,
|
|
49
|
+
durationMs,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function stringifyMaybe(value) {
|
|
53
|
+
if (value == null)
|
|
54
|
+
return undefined;
|
|
55
|
+
if (typeof value === "string")
|
|
56
|
+
return value;
|
|
57
|
+
try {
|
|
58
|
+
return JSON.stringify(value);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return String(value);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type TraceFormat = "auto" | "openai" | "langchain" | "jsonl" | "generic";
|
|
2
|
+
export type StepKind = "user" | "system" | "thought" | "assistant" | "tool_call" | "tool_result" | "error" | "other";
|
|
3
|
+
export interface TraceStep {
|
|
4
|
+
index: number;
|
|
5
|
+
kind: StepKind;
|
|
6
|
+
title: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
content?: string;
|
|
9
|
+
args?: unknown;
|
|
10
|
+
result?: unknown;
|
|
11
|
+
error?: string;
|
|
12
|
+
ts?: string;
|
|
13
|
+
durationMs?: number;
|
|
14
|
+
tokensIn?: number;
|
|
15
|
+
tokensOut?: number;
|
|
16
|
+
toolCallId?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface TraceStats {
|
|
19
|
+
steps: number;
|
|
20
|
+
toolCalls: number;
|
|
21
|
+
failures: number;
|
|
22
|
+
tokensIn?: number;
|
|
23
|
+
tokensOut?: number;
|
|
24
|
+
durationMs?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface Trace {
|
|
27
|
+
format: Exclude<TraceFormat, "auto">;
|
|
28
|
+
source?: string;
|
|
29
|
+
steps: TraceStep[];
|
|
30
|
+
stats: TraceStats;
|
|
31
|
+
warnings: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface ParseOptions {
|
|
34
|
+
format?: TraceFormat;
|
|
35
|
+
source?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface RenderOptions {
|
|
38
|
+
color?: boolean;
|
|
39
|
+
ascii?: boolean;
|
|
40
|
+
width?: number;
|
|
41
|
+
maxContent?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface SpicyOptions {
|
|
44
|
+
/** Skip network even if keys exist. */
|
|
45
|
+
localOnly?: boolean;
|
|
46
|
+
timeoutMs?: number;
|
|
47
|
+
model?: string;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhF,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,QAAQ,GACR,SAAS,GACT,WAAW,GACX,WAAW,GACX,aAAa,GACb,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
2
|
+
export declare function asArray(value: unknown): unknown[];
|
|
3
|
+
export declare function pickString(obj: Record<string, unknown>, keys: string[]): string | undefined;
|
|
4
|
+
export declare function pickUnknown(obj: Record<string, unknown>, keys: string[]): unknown;
|
|
5
|
+
export declare function flattenText(value: unknown): string | undefined;
|
|
6
|
+
export declare function tryJsonParse(text: string): unknown | undefined;
|
|
7
|
+
export declare function coerceJson(value: unknown): unknown;
|
|
8
|
+
export declare function compactJson(value: unknown): string;
|
|
9
|
+
export declare function collapseWs(text: string): string;
|
|
10
|
+
export declare function truncate(text: string, max: number): string;
|
|
11
|
+
export declare function parseTimestamp(value: unknown): string | undefined;
|
|
12
|
+
export declare function timestampMs(value: string | undefined): number | undefined;
|
|
13
|
+
export declare function formatDuration(ms: number): string;
|
|
14
|
+
export declare function estimateTokens(text: string | undefined): number;
|
|
15
|
+
export declare function looksLikeError(value: unknown): string | undefined;
|
|
16
|
+
export declare function pickNumber(obj: Record<string, unknown>, keys: string[]): number | undefined;
|
|
17
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,CAEjD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAO3F;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAKjF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CA+B9D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAM9D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAYlD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQlD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAkBjE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIzE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAWjD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG/D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAejE;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAS3F"}
|
package/dist/util.js
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
export function isRecord(value) {
|
|
2
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3
|
+
}
|
|
4
|
+
export function asArray(value) {
|
|
5
|
+
return Array.isArray(value) ? value : [];
|
|
6
|
+
}
|
|
7
|
+
export function pickString(obj, keys) {
|
|
8
|
+
for (const key of keys) {
|
|
9
|
+
const value = obj[key];
|
|
10
|
+
if (typeof value === "string" && value.trim())
|
|
11
|
+
return value;
|
|
12
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
13
|
+
return String(value);
|
|
14
|
+
}
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
export function pickUnknown(obj, keys) {
|
|
18
|
+
for (const key of keys) {
|
|
19
|
+
if (obj[key] !== undefined && obj[key] !== null)
|
|
20
|
+
return obj[key];
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
export function flattenText(value) {
|
|
25
|
+
if (value == null)
|
|
26
|
+
return undefined;
|
|
27
|
+
if (typeof value === "string")
|
|
28
|
+
return value;
|
|
29
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
30
|
+
return String(value);
|
|
31
|
+
if (Array.isArray(value)) {
|
|
32
|
+
const parts = value
|
|
33
|
+
.map((part) => {
|
|
34
|
+
if (typeof part === "string")
|
|
35
|
+
return part;
|
|
36
|
+
if (!isRecord(part))
|
|
37
|
+
return flattenText(part);
|
|
38
|
+
if (typeof part.text === "string")
|
|
39
|
+
return part.text;
|
|
40
|
+
if (typeof part.content === "string")
|
|
41
|
+
return part.content;
|
|
42
|
+
if (typeof part.output_text === "string")
|
|
43
|
+
return part.output_text;
|
|
44
|
+
if (part.type === "text" && typeof part.text === "string")
|
|
45
|
+
return part.text;
|
|
46
|
+
if (part.type === "output_text" && typeof part.text === "string")
|
|
47
|
+
return part.text;
|
|
48
|
+
return flattenText(part.content ?? part.parts);
|
|
49
|
+
})
|
|
50
|
+
.filter((part) => Boolean(part && String(part).trim()));
|
|
51
|
+
return parts.length ? parts.join("\n") : undefined;
|
|
52
|
+
}
|
|
53
|
+
if (isRecord(value)) {
|
|
54
|
+
return flattenText(value.text ??
|
|
55
|
+
value.content ??
|
|
56
|
+
value.message ??
|
|
57
|
+
value.output_text ??
|
|
58
|
+
value.output ??
|
|
59
|
+
value.result ??
|
|
60
|
+
value.value);
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
export function tryJsonParse(text) {
|
|
65
|
+
try {
|
|
66
|
+
return JSON.parse(text);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function coerceJson(value) {
|
|
73
|
+
if (typeof value !== "string")
|
|
74
|
+
return value;
|
|
75
|
+
const trimmed = value.trim();
|
|
76
|
+
if (!trimmed)
|
|
77
|
+
return value;
|
|
78
|
+
if ((trimmed.startsWith("{") && trimmed.endsWith("}")) ||
|
|
79
|
+
(trimmed.startsWith("[") && trimmed.endsWith("]"))) {
|
|
80
|
+
const parsed = tryJsonParse(trimmed);
|
|
81
|
+
return parsed === undefined ? value : parsed;
|
|
82
|
+
}
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
export function compactJson(value) {
|
|
86
|
+
if (value == null)
|
|
87
|
+
return "";
|
|
88
|
+
if (typeof value === "string")
|
|
89
|
+
return collapseWs(value);
|
|
90
|
+
try {
|
|
91
|
+
return collapseWs(JSON.stringify(value));
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return collapseWs(String(value));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export function collapseWs(text) {
|
|
98
|
+
return text.replace(/\s+/g, " ").trim();
|
|
99
|
+
}
|
|
100
|
+
export function truncate(text, max) {
|
|
101
|
+
if (max <= 0 || text.length <= max)
|
|
102
|
+
return text;
|
|
103
|
+
if (max <= 1)
|
|
104
|
+
return "…";
|
|
105
|
+
return `${text.slice(0, Math.max(0, max - 1))}…`;
|
|
106
|
+
}
|
|
107
|
+
export function parseTimestamp(value) {
|
|
108
|
+
if (value == null)
|
|
109
|
+
return undefined;
|
|
110
|
+
if (value instanceof Date && !Number.isNaN(value.getTime()))
|
|
111
|
+
return value.toISOString();
|
|
112
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
113
|
+
const ms = value > 1e12 ? value : value > 1e9 ? value * 1000 : value;
|
|
114
|
+
const date = new Date(ms);
|
|
115
|
+
return Number.isNaN(date.getTime()) ? undefined : date.toISOString();
|
|
116
|
+
}
|
|
117
|
+
if (typeof value === "string" && value.trim()) {
|
|
118
|
+
const numeric = Number(value);
|
|
119
|
+
if (Number.isFinite(numeric) && /^\d+(\.\d+)?$/.test(value.trim())) {
|
|
120
|
+
return parseTimestamp(numeric);
|
|
121
|
+
}
|
|
122
|
+
const date = new Date(value);
|
|
123
|
+
if (!Number.isNaN(date.getTime()))
|
|
124
|
+
return date.toISOString();
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
export function timestampMs(value) {
|
|
130
|
+
if (!value)
|
|
131
|
+
return undefined;
|
|
132
|
+
const ms = Date.parse(value);
|
|
133
|
+
return Number.isNaN(ms) ? undefined : ms;
|
|
134
|
+
}
|
|
135
|
+
export function formatDuration(ms) {
|
|
136
|
+
const abs = Math.abs(ms);
|
|
137
|
+
if (abs < 1000)
|
|
138
|
+
return `${Math.round(ms)}ms`;
|
|
139
|
+
if (abs < 60_000) {
|
|
140
|
+
const seconds = ms / 1000;
|
|
141
|
+
return `${seconds < 10 ? seconds.toFixed(2) : seconds.toFixed(1)}s`;
|
|
142
|
+
}
|
|
143
|
+
const minutes = Math.floor(abs / 60_000);
|
|
144
|
+
const seconds = Math.round((abs % 60_000) / 1000);
|
|
145
|
+
const sign = ms < 0 ? "-" : "";
|
|
146
|
+
return `${sign}${minutes}m ${String(seconds).padStart(2, "0")}s`;
|
|
147
|
+
}
|
|
148
|
+
export function estimateTokens(text) {
|
|
149
|
+
if (!text)
|
|
150
|
+
return 0;
|
|
151
|
+
return Math.max(1, Math.round(text.length / 4));
|
|
152
|
+
}
|
|
153
|
+
export function looksLikeError(value) {
|
|
154
|
+
if (typeof value === "string") {
|
|
155
|
+
const trimmed = value.trim();
|
|
156
|
+
if (!trimmed)
|
|
157
|
+
return undefined;
|
|
158
|
+
if (/^(error|exception|traceback|failed)\b/i.test(trimmed))
|
|
159
|
+
return trimmed;
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
if (!isRecord(value))
|
|
163
|
+
return undefined;
|
|
164
|
+
if (value.error)
|
|
165
|
+
return flattenText(value.error) ?? compactJson(value.error);
|
|
166
|
+
if (value.exception)
|
|
167
|
+
return flattenText(value.exception) ?? compactJson(value.exception);
|
|
168
|
+
const status = value.status ?? value.status_code ?? value.statusCode;
|
|
169
|
+
if (typeof status === "number" && status >= 400) {
|
|
170
|
+
return flattenText(value.message ?? value.detail) ?? `HTTP ${status}`;
|
|
171
|
+
}
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
export function pickNumber(obj, keys) {
|
|
175
|
+
for (const key of keys) {
|
|
176
|
+
const value = obj[key];
|
|
177
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
178
|
+
return value;
|
|
179
|
+
if (typeof value === "string" && value.trim() && Number.isFinite(Number(value))) {
|
|
180
|
+
return Number(value);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Examples
|
|
2
|
+
|
|
3
|
+
These files ship in the npm package. After a git clone they live in `examples/`; after `npm i -g` use `--demo` or point at the files in the cloned repo.
|
|
4
|
+
|
|
5
|
+
## 30-second walkthrough: `run.jsonl`
|
|
6
|
+
|
|
7
|
+
A coding agent is told the login test is flaky. It reads the spec and auth module, patches both, fails `run_tests` once (cookie set after redirect), then recovers.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
agent-trace examples/run.jsonl
|
|
11
|
+
agent-trace --stats examples/run.jsonl
|
|
12
|
+
agent-trace --fail-on-error examples/run.jsonl; echo $? # 1 — the run had a failure
|
|
13
|
+
agent-trace --spicy examples/run.jsonl
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
What to look for:
|
|
17
|
+
|
|
18
|
+
- Step 13 is `error run_tests` — the flake still reproduced.
|
|
19
|
+
- The footer is the autopsy: 19 steps, 7 tool calls, 1 failure, ~15s.
|
|
20
|
+
- `--spicy` names the failed tool without sending the log anywhere unless an API key is set.
|
|
21
|
+
|
|
22
|
+
This is the fixture `--demo` renders.
|
|
23
|
+
|
|
24
|
+
## Other shapes
|
|
25
|
+
|
|
26
|
+
| File | Shape | Why it's here |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| `run.jsonl` | JSONL events (`role` / `type` / `tool`) | Realistic coding-agent debug loop |
|
|
29
|
+
| `openai.json` | Chat Completions `tool_calls` | Dump a `chat.completion` object as-is |
|
|
30
|
+
| `langchain.json` | LangSmith run tree (`child_runs`) | Flatten a nested executor trace |
|
|
31
|
+
| `generic.json` | `{ type, name, content, ts }[]` | Lowest-common-denominator if you emit your own log |
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
agent-trace examples/openai.json
|
|
35
|
+
agent-trace examples/langchain.json
|
|
36
|
+
agent-trace --json examples/generic.json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Pipe your own dump:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
cat /tmp/agent.jsonl | agent-trace --stats
|
|
43
|
+
agent-trace --fail-on-error --stats traces/ci.jsonl
|
|
44
|
+
```
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"type": "user",
|
|
4
|
+
"content": "What's on fire in prod?",
|
|
5
|
+
"ts": "2026-10-29T08:11:00.000Z"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"type": "thought",
|
|
9
|
+
"content": "Check error budget, then the last deploy.",
|
|
10
|
+
"ts": "2026-10-29T08:11:00.400Z"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"type": "tool",
|
|
14
|
+
"name": "get_error_budget",
|
|
15
|
+
"args": { "slo": "api-availability" },
|
|
16
|
+
"ts": "2026-10-29T08:11:00.510Z"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"type": "tool_result",
|
|
20
|
+
"name": "get_error_budget",
|
|
21
|
+
"content": "burn 14% remaining this window",
|
|
22
|
+
"ts": "2026-10-29T08:11:01.200Z"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"type": "assistant",
|
|
26
|
+
"content": "Nothing's paging. Error budget is 14% — noisy but not a fire.",
|
|
27
|
+
"ts": "2026-10-29T08:11:01.900Z"
|
|
28
|
+
}
|
|
29
|
+
]
|