@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
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
|
-
#
|
|
1
|
+
# agent-trace
|
|
2
2
|
|
|
3
|
-
|
|
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
|
package/dist/args.js.map
ADDED
|
@@ -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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;AAE9B,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,OAAO,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAY,CAAC;IACjB,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9D,OAAO,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,IAAI,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE;YACrC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,eAAe,CAAC,OAAgB,EAAE,QAAgB;IACzD,IAAI,CAAC,OAAO,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,QAAQ,IAAI,IAAI,sBAAsB,CAAC,CAAC;IAC7E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,OAAO,IAAI,CAAC,CAAC;IAClD,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,OAAO,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,UAAU,CAAC,QAA4B;IAC9C,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACvD,OAAO,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CACrB,CAAC,IAAI,EAAE,EAAE;QACP,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;QACR,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,IAAI,EAAE,CAAC"}
|
package/dist/color.d.ts
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|