@webywz/agent-trace 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +116 -2
- package/dist/args.d.ts +16 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +120 -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 +107 -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 +5 -0
- package/dist/read-input.d.ts.map +1 -0
- package/dist/read-input.js +20 -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/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,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
|
+
]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "run-agent-executor",
|
|
3
|
+
"name": "AgentExecutor",
|
|
4
|
+
"run_type": "chain",
|
|
5
|
+
"start_time": "2026-10-29T15:00:00.000Z",
|
|
6
|
+
"end_time": "2026-10-29T15:00:04.200Z",
|
|
7
|
+
"inputs": {
|
|
8
|
+
"messages": [{ "role": "human", "content": "Summarize yesterday's deploys." }]
|
|
9
|
+
},
|
|
10
|
+
"outputs": { "output": "Two deploys, one rollback on payments-api." },
|
|
11
|
+
"child_runs": [
|
|
12
|
+
{
|
|
13
|
+
"name": "ChatOpenAI",
|
|
14
|
+
"run_type": "llm",
|
|
15
|
+
"start_time": "2026-10-29T15:00:00.050Z",
|
|
16
|
+
"end_time": "2026-10-29T15:00:00.800Z",
|
|
17
|
+
"inputs": {
|
|
18
|
+
"messages": [{ "role": "human", "content": "Summarize yesterday's deploys." }]
|
|
19
|
+
},
|
|
20
|
+
"outputs": {
|
|
21
|
+
"generations": [[{ "text": "Action: list_deploys\nAction Input: since=yesterday" }]]
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "list_deploys",
|
|
26
|
+
"run_type": "tool",
|
|
27
|
+
"start_time": "2026-10-29T15:00:00.820Z",
|
|
28
|
+
"end_time": "2026-10-29T15:00:01.400Z",
|
|
29
|
+
"inputs": { "since": "yesterday" },
|
|
30
|
+
"outputs": {
|
|
31
|
+
"deploys": [
|
|
32
|
+
{ "service": "web", "sha": "a1b2c3d", "status": "success" },
|
|
33
|
+
{ "service": "payments-api", "sha": "deadbee", "status": "rolled_back" }
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "page_status",
|
|
39
|
+
"run_type": "tool",
|
|
40
|
+
"start_time": "2026-10-29T15:00:01.420Z",
|
|
41
|
+
"end_time": "2026-10-29T15:00:01.500Z",
|
|
42
|
+
"inputs": { "service": "payments-api" },
|
|
43
|
+
"error": "404 incident not found"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "ChatOpenAI",
|
|
47
|
+
"run_type": "llm",
|
|
48
|
+
"start_time": "2026-10-29T15:00:01.620Z",
|
|
49
|
+
"end_time": "2026-10-29T15:00:04.100Z",
|
|
50
|
+
"outputs": {
|
|
51
|
+
"generations": [[{ "text": "Two deploys, one rollback on payments-api." }]]
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|