@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.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -2
  3. package/dist/args.d.ts +23 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +216 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/cli.d.ts +4 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +145 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/color.d.ts +15 -0
  12. package/dist/color.d.ts.map +1 -0
  13. package/dist/color.js +29 -0
  14. package/dist/color.js.map +1 -0
  15. package/dist/index.d.ts +10 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +9 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/parse/event.d.ts +5 -0
  20. package/dist/parse/event.d.ts.map +1 -0
  21. package/dist/parse/event.js +204 -0
  22. package/dist/parse/event.js.map +1 -0
  23. package/dist/parse/generic.d.ts +4 -0
  24. package/dist/parse/generic.d.ts.map +1 -0
  25. package/dist/parse/generic.js +62 -0
  26. package/dist/parse/generic.js.map +1 -0
  27. package/dist/parse/index.d.ts +8 -0
  28. package/dist/parse/index.d.ts.map +1 -0
  29. package/dist/parse/index.js +71 -0
  30. package/dist/parse/index.js.map +1 -0
  31. package/dist/parse/jsonl.d.ts +8 -0
  32. package/dist/parse/jsonl.d.ts.map +1 -0
  33. package/dist/parse/jsonl.js +85 -0
  34. package/dist/parse/jsonl.js.map +1 -0
  35. package/dist/parse/langchain.d.ts +4 -0
  36. package/dist/parse/langchain.d.ts.map +1 -0
  37. package/dist/parse/langchain.js +348 -0
  38. package/dist/parse/langchain.js.map +1 -0
  39. package/dist/parse/openai.d.ts +4 -0
  40. package/dist/parse/openai.d.ts.map +1 -0
  41. package/dist/parse/openai.js +344 -0
  42. package/dist/parse/openai.js.map +1 -0
  43. package/dist/read-input.d.ts +6 -0
  44. package/dist/read-input.d.ts.map +1 -0
  45. package/dist/read-input.js +36 -0
  46. package/dist/read-input.js.map +1 -0
  47. package/dist/render/spicy.d.ts +4 -0
  48. package/dist/render/spicy.d.ts.map +1 -0
  49. package/dist/render/spicy.js +144 -0
  50. package/dist/render/spicy.js.map +1 -0
  51. package/dist/render/timeline.d.ts +4 -0
  52. package/dist/render/timeline.d.ts.map +1 -0
  53. package/dist/render/timeline.js +179 -0
  54. package/dist/render/timeline.js.map +1 -0
  55. package/dist/stats.d.ts +3 -0
  56. package/dist/stats.d.ts.map +1 -0
  57. package/dist/stats.js +64 -0
  58. package/dist/stats.js.map +1 -0
  59. package/dist/types.d.ts +49 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/util.d.ts +17 -0
  64. package/dist/util.d.ts.map +1 -0
  65. package/dist/util.js +185 -0
  66. package/dist/util.js.map +1 -0
  67. package/examples/README.md +44 -0
  68. package/examples/generic.json +29 -0
  69. package/examples/langchain.json +55 -0
  70. package/examples/openai.json +29 -0
  71. package/examples/run.jsonl +19 -0
  72. package/package.json +59 -4
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 webywz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,153 @@
1
- # Temporary Holding Version
1
+ # agent-trace
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Turn messy agent run logs into a readable timeline.
4
+
5
+ OpenAI tool-call dumps, LangChain / LangSmith trees, JSONL event streams, Cursor-ish traces — all of them are painful to skim. `agent-trace` is an offline CLI that normalizes those shapes into a numbered timeline: thoughts, tools, results, errors, durations, and a one-line autopsy.
6
+
7
+ No API key. No network. Pipe a dump, get a story.
8
+
9
+ ## 30-second demo
10
+
11
+ Copy-paste. `--demo` is bundled with the package, so this works without cloning the repo.
12
+
13
+ ```bash
14
+ npx @webywz/agent-trace --demo --no-color
15
+ ```
16
+
17
+ ```text
18
+ $ npx @webywz/agent-trace --demo --stats --no-color
19
+ 19 steps · 7 tool calls · 1 failure · ~1,840 in / 96 out · 15.3s
20
+
21
+ $ npx @webywz/agent-trace --demo --no-color
22
+ agent-trace · examples/run.jsonl
23
+ jsonl · 19 steps · 7 tool calls · 1 failure · 15.3s
24
+ ────────────────────────────────────────────────────────────────────────
25
+ 1 user +0ms 770ms
26
+ │ The login test is flaky on CI. Fix it. Do not sleep() your way …
27
+ │
28
+ 3 tool +890ms 170ms read_file
29
+ │ {"path":"test/login.spec.ts"}
30
+ │
31
+ 12 tool +2.68s 6.61s run_tests
32
+ │ {"cmd":"npx playwright test test/login.spec.ts --repeat-each=8"}
33
+ │
34
+ 13 error +9.29s 470ms run_tests
35
+ │ 1 failed · login.spec.ts:12: cookie sid missing on first naviga…
36
+ │
37
+ 19 assistant +15.3s
38
+ │ The flake was a cookie/redirect race, not a slow page. Cookie i…
39
+ ────────────────────────────────────────────────────────────────────────
40
+ 19 steps · 7 tool calls · 1 failure · ~1,840 in / 96 out · 15.3s
41
+ ```
42
+
43
+ The sample above is abbreviated; the real command prints all 19 steps. `--demo` is the bundled `examples/run.jsonl` (a coding agent that fails `run_tests` once, then recovers).
44
+
45
+ ```bash
46
+ npx @webywz/agent-trace --demo --spicy --no-color
47
+ # spicy The brief was “The login test is flaky…”. Then `run_tests` blew up: …
48
+ ```
49
+
50
+ ## Install
51
+
52
+ ```bash
53
+ npm i -g @webywz/agent-trace
54
+ agent-trace --demo
55
+ ```
56
+
57
+ Node 18+. No API key required.
58
+
59
+ ```bash
60
+ npx @webywz/agent-trace --demo
61
+ cat run.jsonl | npx @webywz/agent-trace
62
+ ```
63
+
64
+ ## Usage
65
+
66
+ ```bash
67
+ agent-trace --demo
68
+ agent-trace run.jsonl
69
+ agent-trace --format auto|openai|langchain|jsonl|generic run.jsonl
70
+ agent-trace --json run.jsonl | jq .stats
71
+ agent-trace --stats run.jsonl
72
+ agent-trace --fail-on-error --stats traces/ci.jsonl
73
+ agent-trace --spicy run.jsonl
74
+ cat run.jsonl | agent-trace
75
+ ```
76
+
77
+ | Flag | What it does |
78
+ | --- | --- |
79
+ | `-f, --format` | `auto` (default), `openai`, `langchain`, `jsonl`, `generic` |
80
+ | `-j, --json` | Normalized trace as JSON (steps, stats, warnings) |
81
+ | `--stats` | One-line summary only (good for CI logs) |
82
+ | `--spicy` | A short narrative recap. Offline by default; uses `OPENAI_API_KEY` or `ANTHROPIC_API_KEY` when set |
83
+ | `--fail-on-error` | Exit `1` if the run had tool/step failures |
84
+ | `--demo` | Render the bundled sample (`examples/run.jsonl`) |
85
+ | `--ascii` | ASCII-only timeline (no box drawing) |
86
+ | `--color` / `--no-color` | Force or disable ANSI colors (`NO_COLOR` also disables) |
87
+ | `--width <n>` | Wrap width (defaults to the terminal) |
88
+ | `--max-content <n>` | Truncate args / results (default 160) |
89
+
90
+ `--spicy` never blocks the timeline. If the key is missing, the recap is local. If the LLM call fails, you still get the local recap.
91
+
92
+ ### Exit codes
93
+
94
+ | Code | When |
95
+ | --- | --- |
96
+ | `0` | Timeline (or JSON / stats) printed |
97
+ | `1` | I/O or parse error, **or** `--fail-on-error` when the trace has failures |
98
+ | `2` | Usage error (unknown flag, missing file). stderr ends with `try 'agent-trace --help'` |
99
+
100
+ CI one-liner — fail the job if the agent run had failures:
101
+
102
+ ```bash
103
+ agent-trace --fail-on-error --stats traces/last-run.jsonl
104
+ ```
105
+
106
+ ## What it parses
107
+
108
+ **OpenAI** — `chat.completion` objects, `messages[]` with `tool_calls` / `role: tool`, Responses API `output[]`, and streamed JSONL chunks with `delta`.
109
+
110
+ **LangChain** — LangSmith run trees (`run_type` + `child_runs`), callback events (`on_tool_start`, `on_tool_end`, `on_chain_error`, …), `AgentAction` dumps.
111
+
112
+ **JSONL** — one event per line: `role` / `type` / `tool` / `content` / `ts`. Cursor-ish traces included. Bad lines are skipped and reported.
113
+
114
+ **Generic** — a JSON array (or `{ events: [...] }`) of `{ type, name, content, ts }`.
115
+
116
+ Auto-detect sniffs the file; `--format` forces a parser.
117
+
118
+ ## Library
119
+
120
+ ```ts
121
+ import { parseTrace, renderTimeline, spicyNarrative } from "@webywz/agent-trace";
122
+ import { readFile } from "node:fs/promises";
123
+
124
+ const text = await readFile("run.jsonl", "utf8");
125
+ const trace = parseTrace(text, { format: "auto", source: "run.jsonl" });
126
+ process.stdout.write(renderTimeline(trace, { color: false }));
127
+ ```
128
+
129
+ `Trace.stats` always includes step / tool / failure counts, plus duration and token in/out when the log carries timestamps or usage.
130
+
131
+ ## Examples
132
+
133
+ Same repo, ready to paste. Walkthrough: [`examples/README.md`](examples/README.md).
134
+
135
+ ```bash
136
+ agent-trace --demo
137
+ agent-trace examples/run.jsonl
138
+ agent-trace examples/openai.json
139
+ agent-trace examples/langchain.json
140
+ agent-trace --json examples/generic.json
141
+ agent-trace --fail-on-error --stats examples/run.jsonl; echo $?
142
+ ```
143
+
144
+ ## Develop
145
+
146
+ ```bash
147
+ npm install
148
+ npm test
149
+ npm run build
150
+ node dist/cli.js --demo --no-color
151
+ ```
152
+
153
+ MIT © webywz
package/dist/args.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import type { TraceFormat } from "./types.js";
2
+ export interface CliArgs {
3
+ file?: string;
4
+ format: TraceFormat;
5
+ json: boolean;
6
+ spicy: boolean;
7
+ color?: boolean;
8
+ ascii: boolean;
9
+ width?: number;
10
+ maxContent?: number;
11
+ help: boolean;
12
+ version: boolean;
13
+ demo: boolean;
14
+ failOnError: boolean;
15
+ stats: boolean;
16
+ }
17
+ export declare class UsageError extends Error {
18
+ readonly exitCode = 2;
19
+ constructor(message: string);
20
+ }
21
+ export declare function parseArgs(argv: string[]): CliArgs;
22
+ export declare function helpText(version: string): string;
23
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,QAAQ,KAAK;gBACV,OAAO,EAAE,MAAM;CAI5B;AAyBD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAyGjD;AA8CD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA6ChD"}
package/dist/args.js ADDED
@@ -0,0 +1,216 @@
1
+ export class UsageError extends Error {
2
+ exitCode = 2;
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = "UsageError";
6
+ }
7
+ }
8
+ const FORMATS = new Set(["auto", "openai", "langchain", "jsonl", "generic"]);
9
+ const FORMAT_LIST = "auto|openai|langchain|jsonl|generic";
10
+ const FLAGS = [
11
+ "-h",
12
+ "--help",
13
+ "-v",
14
+ "--version",
15
+ "--json",
16
+ "-j",
17
+ "--spicy",
18
+ "--ascii",
19
+ "--no-color",
20
+ "--color",
21
+ "-f",
22
+ "--format",
23
+ "--width",
24
+ "--max-content",
25
+ "--demo",
26
+ "--fail-on-error",
27
+ "--stats",
28
+ ];
29
+ export function parseArgs(argv) {
30
+ const args = {
31
+ format: "auto",
32
+ json: false,
33
+ spicy: false,
34
+ ascii: false,
35
+ help: false,
36
+ version: false,
37
+ demo: false,
38
+ failOnError: false,
39
+ stats: false,
40
+ };
41
+ const rest = argv.slice(2);
42
+ for (let i = 0; i < rest.length; i += 1) {
43
+ const token = rest[i];
44
+ if (!token)
45
+ continue;
46
+ if (token === "--") {
47
+ const file = rest[i + 1];
48
+ if (file)
49
+ args.file = file;
50
+ break;
51
+ }
52
+ if (token === "-") {
53
+ if (args.file)
54
+ throw new UsageError("unexpected extra argument '-'");
55
+ args.file = "-";
56
+ continue;
57
+ }
58
+ if (token === "-h" || token === "--help") {
59
+ args.help = true;
60
+ continue;
61
+ }
62
+ if (token === "-v" || token === "--version") {
63
+ args.version = true;
64
+ continue;
65
+ }
66
+ if (token === "--json" || token === "-j") {
67
+ args.json = true;
68
+ continue;
69
+ }
70
+ if (token === "--spicy") {
71
+ args.spicy = true;
72
+ continue;
73
+ }
74
+ if (token === "--ascii") {
75
+ args.ascii = true;
76
+ continue;
77
+ }
78
+ if (token === "--no-color") {
79
+ args.color = false;
80
+ continue;
81
+ }
82
+ if (token === "--color") {
83
+ args.color = true;
84
+ continue;
85
+ }
86
+ if (token === "--demo") {
87
+ args.demo = true;
88
+ continue;
89
+ }
90
+ if (token === "--fail-on-error") {
91
+ args.failOnError = true;
92
+ continue;
93
+ }
94
+ if (token === "--stats") {
95
+ args.stats = true;
96
+ continue;
97
+ }
98
+ const eq = token.indexOf("=");
99
+ const [flag, inline] = eq === -1 ? [token, undefined] : [token.slice(0, eq), token.slice(eq + 1)];
100
+ if (flag === "-f" || flag === "--format") {
101
+ const value = inline ?? rest[++i];
102
+ if (!value || value.startsWith("-") || !FORMATS.has(value)) {
103
+ throw new UsageError(`unknown format '${value ?? ""}' (expected ${FORMAT_LIST})`);
104
+ }
105
+ args.format = value;
106
+ continue;
107
+ }
108
+ if (flag === "--width") {
109
+ args.width = toInt(inline ?? rest[++i], "--width");
110
+ continue;
111
+ }
112
+ if (flag === "--max-content") {
113
+ args.maxContent = toInt(inline ?? rest[++i], "--max-content");
114
+ continue;
115
+ }
116
+ if (token.startsWith("-")) {
117
+ const hint = suggestFlag(token);
118
+ throw new UsageError(hint ? `unknown option '${token}' (did you mean ${hint}?)` : `unknown option '${token}'`);
119
+ }
120
+ if (args.file) {
121
+ throw new UsageError(`unexpected extra argument '${token}'`);
122
+ }
123
+ args.file = token;
124
+ }
125
+ if (args.demo && args.file) {
126
+ throw new UsageError("do not pass a file with --demo (the bundled sample is used)");
127
+ }
128
+ return args;
129
+ }
130
+ function toInt(value, flag) {
131
+ const n = Number(value);
132
+ if (!value || value.startsWith("-") || !Number.isInteger(n) || n <= 0) {
133
+ throw new UsageError(`${flag} expects a positive integer`);
134
+ }
135
+ return n;
136
+ }
137
+ function suggestFlag(token) {
138
+ if (token.startsWith("--") && token.length >= 4) {
139
+ const prefixes = FLAGS.filter((flag) => flag.startsWith(token));
140
+ if (prefixes.length === 1)
141
+ return prefixes[0];
142
+ }
143
+ let best;
144
+ let bestDist = 3;
145
+ for (const flag of FLAGS) {
146
+ const dist = levenshtein(token, flag);
147
+ if (dist < bestDist) {
148
+ bestDist = dist;
149
+ best = flag;
150
+ }
151
+ }
152
+ return best;
153
+ }
154
+ function levenshtein(a, b) {
155
+ const rows = a.length + 1;
156
+ const cols = b.length + 1;
157
+ const dp = new Array(rows * cols);
158
+ for (let i = 0; i < rows; i += 1)
159
+ dp[i * cols] = i;
160
+ for (let j = 0; j < cols; j += 1)
161
+ dp[j] = j;
162
+ for (let i = 1; i < rows; i += 1) {
163
+ for (let j = 1; j < cols; j += 1) {
164
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
165
+ dp[i * cols + j] = Math.min((dp[(i - 1) * cols + j] ?? 0) + 1, (dp[i * cols + j - 1] ?? 0) + 1, (dp[(i - 1) * cols + j - 1] ?? 0) + cost);
166
+ }
167
+ }
168
+ return dp[a.length * cols + b.length] ?? 0;
169
+ }
170
+ export function helpText(version) {
171
+ return `\
172
+ agent-trace v${version}
173
+ Turn messy agent run logs into a readable timeline.
174
+
175
+ Usage:
176
+ agent-trace [options] <file>
177
+ agent-trace [options] - Read from stdin
178
+ cat run.jsonl | agent-trace
179
+ agent-trace --demo Bundled sample (no file needed)
180
+
181
+ Options:
182
+ -f, --format <fmt> ${FORMAT_LIST} (default: auto)
183
+ -j, --json Normalized trace as JSON
184
+ --stats One-line summary only
185
+ --spicy Narrative recap (offline, or LLM if API key set)
186
+ --fail-on-error Exit 1 if the run had failures
187
+ --demo Render bundled examples/run.jsonl
188
+ --ascii ASCII-only timeline
189
+ --color Force ANSI colors
190
+ --no-color Disable ANSI colors (or set NO_COLOR)
191
+ --width <n> Wrap width (default: terminal)
192
+ --max-content <n> Truncate args/results (default: 160)
193
+ -h, --help Show this help
194
+ -v, --version Print version
195
+
196
+ Formats:
197
+ openai Chat Completions, messages[], Responses API, streaming deltas
198
+ langchain LangSmith run trees, callback events, AgentAction dumps
199
+ jsonl Role/tool/content events, Cursor-ish traces, generic objects
200
+ generic JSON array (or { events: [...] }) of { type, name, content, ts }
201
+ auto Sniff the file, then fall through the parsers above
202
+
203
+ Exit codes:
204
+ 0 ok
205
+ 1 I/O or parse error; or --fail-on-error when the trace has failures
206
+ 2 usage error (bad flag, missing file)
207
+
208
+ Examples:
209
+ agent-trace --demo
210
+ agent-trace run.jsonl
211
+ agent-trace --format openai dump.json
212
+ agent-trace --json run.jsonl | jq .stats
213
+ agent-trace --fail-on-error --stats traces/ci.jsonl
214
+ `;
215
+ }
216
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ declare function main(argv: string[]): Promise<number>;
3
+ export { main };
4
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAcA,iBAAe,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsEnD;AAuED,OAAO,EAAE,IAAI,EAAE,CAAC"}
package/dist/cli.js ADDED
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync, realpathSync } from "node:fs";
3
+ import { readFile } from "node:fs/promises";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { helpText, parseArgs, UsageError } from "./args.js";
7
+ import { createPalette, shouldColor } from "./color.js";
8
+ import { parseTrace } from "./parse/index.js";
9
+ import { readInput, wrapIoError } from "./read-input.js";
10
+ import { spicyNarrative } from "./render/spicy.js";
11
+ import { renderTimeline, summaryLine } from "./render/timeline.js";
12
+ const VERSION = readVersion();
13
+ async function main(argv) {
14
+ let args;
15
+ try {
16
+ args = parseArgs(argv);
17
+ }
18
+ catch (error) {
19
+ printErr(error);
20
+ return exitCodeFor(error);
21
+ }
22
+ if (args.help) {
23
+ process.stdout.write(helpText(VERSION));
24
+ return 0;
25
+ }
26
+ if (args.version) {
27
+ process.stdout.write(`agent-trace ${VERSION}\n`);
28
+ return 0;
29
+ }
30
+ let text;
31
+ let source;
32
+ try {
33
+ ({ text, source } = args.demo ? await readDemo() : await readInput(args.file));
34
+ }
35
+ catch (error) {
36
+ printErr(error);
37
+ return exitCodeFor(error);
38
+ }
39
+ let trace;
40
+ try {
41
+ trace = parseTrace(text, { format: args.format, source });
42
+ }
43
+ catch (error) {
44
+ printErr(error);
45
+ return 1;
46
+ }
47
+ if (args.json) {
48
+ const payload = {
49
+ format: trace.format,
50
+ source: trace.source,
51
+ stats: trace.stats,
52
+ warnings: trace.warnings,
53
+ steps: trace.steps,
54
+ ...(args.spicy ? { spicy: await spicyNarrative(trace) } : {}),
55
+ };
56
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
57
+ return failOnErrorCode(args.failOnError, trace.stats.failures);
58
+ }
59
+ if (args.stats) {
60
+ process.stdout.write(`${summaryLine(trace)}\n`);
61
+ for (const warning of trace.warnings) {
62
+ process.stderr.write(`agent-trace: warn: ${warning}\n`);
63
+ }
64
+ }
65
+ else {
66
+ const timeline = renderTimeline(trace, {
67
+ color: args.color,
68
+ ascii: args.ascii,
69
+ width: args.width,
70
+ maxContent: args.maxContent,
71
+ });
72
+ process.stdout.write(timeline);
73
+ }
74
+ if (args.spicy) {
75
+ const color = createPalette(shouldColor(args.color));
76
+ const narrative = await spicyNarrative(trace);
77
+ process.stdout.write(`\n${color.bold("spicy")} ${narrative}\n`);
78
+ }
79
+ return failOnErrorCode(args.failOnError, trace.stats.failures);
80
+ }
81
+ function failOnErrorCode(enabled, failures) {
82
+ if (!enabled || failures <= 0)
83
+ return 0;
84
+ const noun = failures === 1 ? "failure" : "failures";
85
+ process.stderr.write(`agent-trace: ${failures} ${noun} (--fail-on-error)\n`);
86
+ return 1;
87
+ }
88
+ function printErr(error) {
89
+ const message = error instanceof Error ? error.message : String(error);
90
+ process.stderr.write(`agent-trace: ${message}\n`);
91
+ if (error instanceof UsageError) {
92
+ process.stderr.write("try 'agent-trace --help'\n");
93
+ }
94
+ }
95
+ function exitCodeFor(error) {
96
+ return error instanceof UsageError ? 2 : 1;
97
+ }
98
+ async function readDemo() {
99
+ const file = join(packageRoot(), "examples", "run.jsonl");
100
+ try {
101
+ const text = await readFile(file, "utf8");
102
+ return { text, source: "examples/run.jsonl" };
103
+ }
104
+ catch (error) {
105
+ const wrapped = wrapIoError(error, file);
106
+ if (wrapped.message.startsWith("file not found")) {
107
+ throw new Error("bundled demo missing (expected examples/run.jsonl in the package)");
108
+ }
109
+ throw wrapped;
110
+ }
111
+ }
112
+ function packageRoot() {
113
+ return join(dirname(fileURLToPath(import.meta.url)), "..");
114
+ }
115
+ function isCliEntry(argvPath) {
116
+ if (!argvPath)
117
+ return false;
118
+ const self = fileURLToPath(import.meta.url);
119
+ try {
120
+ return realpathSync(argvPath) === self || realpathSync(argvPath) === realpathSync(self);
121
+ }
122
+ catch {
123
+ return /(cli\.(js|ts)|agent-trace)$/.test(argvPath);
124
+ }
125
+ }
126
+ function readVersion() {
127
+ try {
128
+ const raw = readFileSync(join(packageRoot(), "package.json"), "utf8");
129
+ const parsed = JSON.parse(raw);
130
+ return parsed.version ?? "0.1.1";
131
+ }
132
+ catch {
133
+ return "0.1.1";
134
+ }
135
+ }
136
+ if (isCliEntry(process.argv[1])) {
137
+ main(process.argv).then((code) => {
138
+ process.exitCode = code;
139
+ }, (error) => {
140
+ printErr(error);
141
+ process.exitCode = 1;
142
+ });
143
+ }
144
+ export { main };
145
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface Palette {
2
+ enabled: boolean;
3
+ bold: (s: string) => string;
4
+ dim: (s: string) => string;
5
+ italic: (s: string) => string;
6
+ red: (s: string) => string;
7
+ green: (s: string) => string;
8
+ yellow: (s: string) => string;
9
+ cyan: (s: string) => string;
10
+ magenta: (s: string) => string;
11
+ inverse: (s: string) => string;
12
+ }
13
+ export declare function createPalette(enabled: boolean): Palette;
14
+ export declare function shouldColor(flag?: boolean): boolean;
15
+ //# sourceMappingURL=color.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5B,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9B,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/B,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAChC;AAMD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAavD;AAED,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAMnD"}
package/dist/color.js ADDED
@@ -0,0 +1,29 @@
1
+ function wrap(enabled, open, close) {
2
+ return (s) => (enabled ? `\u001b[${open}m${s}\u001b[${close}m` : s);
3
+ }
4
+ export function createPalette(enabled) {
5
+ return {
6
+ enabled,
7
+ bold: wrap(enabled, "1", "22"),
8
+ dim: wrap(enabled, "2", "22"),
9
+ italic: wrap(enabled, "3", "23"),
10
+ red: wrap(enabled, "91", "39"),
11
+ green: wrap(enabled, "32", "39"),
12
+ yellow: wrap(enabled, "33", "39"),
13
+ cyan: wrap(enabled, "36", "39"),
14
+ magenta: wrap(enabled, "35", "39"),
15
+ inverse: wrap(enabled, "7", "27"),
16
+ };
17
+ }
18
+ export function shouldColor(flag) {
19
+ if (flag === false)
20
+ return false;
21
+ if (process.env.NO_COLOR)
22
+ return false;
23
+ if (process.env.FORCE_COLOR === "0")
24
+ return false;
25
+ if (flag === true)
26
+ return true;
27
+ return Boolean(process.stdout.isTTY);
28
+ }
29
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"AAaA,SAAS,IAAI,CAAC,OAAgB,EAAE,IAAY,EAAE,KAAa;IACzD,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;QACL,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;QAC9B,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;QAC7B,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;QAChC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;QAChC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;QACjC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;QAC/B,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;QAClC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type { ParseOptions, RenderOptions, SpicyOptions, StepKind, Trace, TraceFormat, TraceStats, TraceStep, } from "./types.js";
2
+ export { parseTrace } from "./parse/index.js";
3
+ export { parseOpenAI } from "./parse/openai.js";
4
+ export { parseLangChain } from "./parse/langchain.js";
5
+ export { parseJsonl } from "./parse/jsonl.js";
6
+ export { parseGeneric } from "./parse/generic.js";
7
+ export { renderTimeline, summaryLine } from "./render/timeline.js";
8
+ export { spicyNarrative, localSpicy } from "./render/spicy.js";
9
+ export { computeStats } from "./stats.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,KAAK,EACL,WAAW,EACX,UAAU,EACV,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}