@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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +116 -2
  3. package/dist/args.d.ts +16 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +120 -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 +107 -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 +5 -0
  44. package/dist/read-input.d.ts.map +1 -0
  45. package/dist/read-input.js +20 -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/generic.json +29 -0
  68. package/examples/langchain.json +55 -0
  69. package/examples/openai.json +29 -0
  70. package/examples/run.jsonl +19 -0
  71. 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,117 @@
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
+ ```text
8
+ $ agent-trace examples/run.jsonl
9
+ ```
10
+
11
+ ```text
12
+ agent-trace · examples/run.jsonl
13
+ jsonl · 19 steps · 7 tool calls · 1 failure · 15.3s
14
+ ────────────────────────────────────────────────────────────────────────
15
+ 1 user +0ms 770ms
16
+ │ The login test is flaky on CI. Fix it. Do not sleep() your way out.
17
+ │
18
+ 2 thought +770ms 120ms
19
+ │ I'll read the spec and the auth module, then look for a race — not a …
20
+ │
21
+ 3 tool +890ms 170ms read_file
22
+ │ {"path":"test/login.spec.ts"}
23
+ │
24
+ 12 tool +2.68s 6.61s run_tests
25
+ │ {"cmd":"npx playwright test test/login.spec.ts --repeat-each=8"}
26
+ │
27
+ 13 error +9.29s 470ms run_tests
28
+ │ 1 failed · login.spec.ts:12: cookie sid missing on first navigation (…
29
+ │
30
+ 19 assistant +15.3s
31
+ │ The flake was a cookie/redirect race, not a slow page. Cookie is now …
32
+ ────────────────────────────────────────────────────────────────────────
33
+ 19 steps · 7 tool calls · 1 failure · ~1,840 in / 96 out · 15.3s
34
+ ```
35
+
36
+ ## Install
37
+
38
+ ```bash
39
+ npm i -g @webywz/agent-trace
40
+ agent-trace examples/run.jsonl
41
+ ```
42
+
43
+ Node 18+. No API key required.
44
+
45
+ ```bash
46
+ npx @webywz/agent-trace examples/run.jsonl
47
+ ```
48
+
49
+ ## Usage
50
+
51
+ ```bash
52
+ agent-trace run.jsonl
53
+ agent-trace --format auto|openai|langchain|jsonl run.jsonl
54
+ agent-trace --json run.jsonl
55
+ agent-trace --spicy run.jsonl
56
+ cat run.jsonl | agent-trace
57
+ ```
58
+
59
+ | Flag | What it does |
60
+ | --- | --- |
61
+ | `-f, --format` | `auto` (default), `openai`, `langchain`, `jsonl` |
62
+ | `--json` | Normalized trace as JSON (steps, stats, warnings) |
63
+ | `--spicy` | A short narrative recap. Offline by default; uses `OPENAI_API_KEY` or `ANTHROPIC_API_KEY` when set |
64
+ | `--ascii` | ASCII-only timeline (no box drawing) |
65
+ | `--no-color` | Disable ANSI colors (`NO_COLOR` also works) |
66
+ | `--width <n>` | Wrap width (defaults to the terminal) |
67
+ | `--max-content <n>` | Truncate args / results (default 160) |
68
+
69
+ `--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.
70
+
71
+ ## What it parses
72
+
73
+ **OpenAI** — `chat.completion` objects, `messages[]` with `tool_calls` / `role: tool`, Responses API `output[]`, and streamed JSONL chunks with `delta`.
74
+
75
+ **LangChain** — LangSmith run trees (`run_type` + `child_runs`), callback events (`on_tool_start`, `on_tool_end`, `on_chain_error`, …), `AgentAction` dumps.
76
+
77
+ **JSONL** — one event per line: `role` / `type` / `tool` / `content` / `ts`. Cursor-ish traces included. Bad lines are skipped and reported.
78
+
79
+ **Generic** — a JSON array (or `{ events: [...] }`) of `{ type, name, content, ts }`.
80
+
81
+ Auto-detect sniffs the file; `--format` forces a parser.
82
+
83
+ ## Library
84
+
85
+ ```ts
86
+ import { parseTrace, renderTimeline, spicyNarrative } from "@webywz/agent-trace";
87
+ import { readFile } from "node:fs/promises";
88
+
89
+ const text = await readFile("run.jsonl", "utf8");
90
+ const trace = parseTrace(text, { format: "auto", source: "run.jsonl" });
91
+ process.stdout.write(renderTimeline(trace, { color: false }));
92
+ ```
93
+
94
+ `Trace.stats` always includes step / tool / failure counts, plus duration and token in/out when the log carries timestamps or usage.
95
+
96
+ ## Examples
97
+
98
+ Same repo, ready to paste into a terminal:
99
+
100
+ ```bash
101
+ agent-trace examples/run.jsonl
102
+ agent-trace examples/openai.json
103
+ agent-trace examples/langchain.json
104
+ agent-trace --json examples/generic.json
105
+ agent-trace --spicy examples/run.jsonl
106
+ ```
107
+
108
+ ## Develop
109
+
110
+ ```bash
111
+ npm install
112
+ npm test
113
+ npm run build
114
+ node dist/cli.js examples/run.jsonl
115
+ ```
116
+
117
+ MIT © webywz
package/dist/args.d.ts ADDED
@@ -0,0 +1,16 @@
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
+ }
14
+ export declare function parseArgs(argv: string[]): CliArgs;
15
+ export declare function helpText(version: string): string;
16
+ //# 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;CAClB;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAmFjD;AAUD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA4BhD"}
package/dist/args.js ADDED
@@ -0,0 +1,120 @@
1
+ const FORMATS = new Set(["auto", "openai", "langchain", "jsonl", "generic"]);
2
+ export function parseArgs(argv) {
3
+ const args = {
4
+ format: "auto",
5
+ json: false,
6
+ spicy: false,
7
+ ascii: false,
8
+ help: false,
9
+ version: false,
10
+ };
11
+ const rest = argv.slice(2);
12
+ for (let i = 0; i < rest.length; i += 1) {
13
+ const token = rest[i];
14
+ if (!token)
15
+ continue;
16
+ if (token === "--") {
17
+ const file = rest[i + 1];
18
+ if (file)
19
+ args.file = file;
20
+ break;
21
+ }
22
+ if (token === "-") {
23
+ if (args.file)
24
+ throw new Error("unexpected extra argument '-'");
25
+ args.file = "-";
26
+ continue;
27
+ }
28
+ if (token === "-h" || token === "--help") {
29
+ args.help = true;
30
+ continue;
31
+ }
32
+ if (token === "-v" || token === "--version") {
33
+ args.version = true;
34
+ continue;
35
+ }
36
+ if (token === "--json" || token === "-j") {
37
+ args.json = true;
38
+ continue;
39
+ }
40
+ if (token === "--spicy") {
41
+ args.spicy = true;
42
+ continue;
43
+ }
44
+ if (token === "--ascii") {
45
+ args.ascii = true;
46
+ continue;
47
+ }
48
+ if (token === "--no-color") {
49
+ args.color = false;
50
+ continue;
51
+ }
52
+ if (token === "--color") {
53
+ args.color = true;
54
+ continue;
55
+ }
56
+ const eq = token.indexOf("=");
57
+ const [flag, inline] = eq === -1 ? [token, undefined] : [token.slice(0, eq), token.slice(eq + 1)];
58
+ if (flag === "-f" || flag === "--format") {
59
+ const value = inline ?? rest[++i];
60
+ if (!value || !FORMATS.has(value)) {
61
+ throw new Error(`unknown format '${value ?? ""}' (expected auto|openai|langchain|jsonl)`);
62
+ }
63
+ args.format = value;
64
+ continue;
65
+ }
66
+ if (flag === "--width") {
67
+ args.width = toInt(inline ?? rest[++i], "--width");
68
+ continue;
69
+ }
70
+ if (flag === "--max-content") {
71
+ args.maxContent = toInt(inline ?? rest[++i], "--max-content");
72
+ continue;
73
+ }
74
+ if (token.startsWith("-")) {
75
+ throw new Error(`unknown option '${token}'`);
76
+ }
77
+ if (args.file) {
78
+ throw new Error(`unexpected extra argument '${token}'`);
79
+ }
80
+ args.file = token;
81
+ }
82
+ return args;
83
+ }
84
+ function toInt(value, flag) {
85
+ const n = Number(value);
86
+ if (!value || !Number.isInteger(n) || n <= 0) {
87
+ throw new Error(`${flag} expects a positive integer`);
88
+ }
89
+ return n;
90
+ }
91
+ export function helpText(version) {
92
+ return `\
93
+ agent-trace v${version}
94
+ Turn messy agent run logs into a readable timeline.
95
+
96
+ Usage:
97
+ agent-trace <file>
98
+ agent-trace - Read from stdin
99
+ cat run.jsonl | agent-trace
100
+
101
+ Options:
102
+ -f, --format auto|openai|langchain|jsonl Parser (default: auto)
103
+ --json Machine-readable normalized trace
104
+ --spicy Add a narrative recap (offline, or
105
+ LLM if OPENAI_API_KEY / ANTHROPIC_API_KEY)
106
+ --ascii ASCII-only timeline
107
+ --no-color Disable ANSI colors
108
+ --width <n> Wrap width (default: terminal)
109
+ --max-content <n> Truncate args/results (default: 160)
110
+ -h, --help Show this help
111
+ -v, --version Print version
112
+
113
+ Formats:
114
+ openai Chat Completions, messages[], Responses API, streaming deltas
115
+ langchain LangSmith run trees, callback events, AgentAction dumps
116
+ jsonl Role/tool/content events, Cursor-ish traces, generic objects
117
+ auto Sniff the file, then fall through the parsers above
118
+ `;
119
+ }
120
+ //# 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":";AAaA,iBAAe,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA+DnD;AAwCD,OAAO,EAAE,IAAI,EAAE,CAAC"}
package/dist/cli.js ADDED
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync, realpathSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { helpText, parseArgs } from "./args.js";
6
+ import { createPalette, shouldColor } from "./color.js";
7
+ import { parseTrace } from "./parse/index.js";
8
+ import { readInput } from "./read-input.js";
9
+ import { spicyNarrative } from "./render/spicy.js";
10
+ import { renderTimeline } from "./render/timeline.js";
11
+ const VERSION = readVersion();
12
+ async function main(argv) {
13
+ let args;
14
+ try {
15
+ args = parseArgs(argv);
16
+ }
17
+ catch (error) {
18
+ printErr(error);
19
+ return 1;
20
+ }
21
+ if (args.help) {
22
+ process.stdout.write(helpText(VERSION));
23
+ return 0;
24
+ }
25
+ if (args.version) {
26
+ process.stdout.write(`agent-trace ${VERSION}\n`);
27
+ return 0;
28
+ }
29
+ let text;
30
+ let source;
31
+ try {
32
+ ({ text, source } = await readInput(args.file));
33
+ }
34
+ catch (error) {
35
+ printErr(error);
36
+ return 1;
37
+ }
38
+ let trace;
39
+ try {
40
+ trace = parseTrace(text, { format: args.format, source });
41
+ }
42
+ catch (error) {
43
+ printErr(error);
44
+ return 1;
45
+ }
46
+ if (args.json) {
47
+ const payload = {
48
+ format: trace.format,
49
+ source: trace.source,
50
+ stats: trace.stats,
51
+ warnings: trace.warnings,
52
+ steps: trace.steps,
53
+ ...(args.spicy ? { spicy: await spicyNarrative(trace) } : {}),
54
+ };
55
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
56
+ return 0;
57
+ }
58
+ const timeline = renderTimeline(trace, {
59
+ color: args.color,
60
+ ascii: args.ascii,
61
+ width: args.width,
62
+ maxContent: args.maxContent,
63
+ });
64
+ process.stdout.write(timeline);
65
+ if (args.spicy) {
66
+ const color = createPalette(shouldColor(args.color));
67
+ const narrative = await spicyNarrative(trace);
68
+ process.stdout.write(`\n${color.bold("spicy")} ${narrative}\n`);
69
+ }
70
+ return 0;
71
+ }
72
+ function printErr(error) {
73
+ const message = error instanceof Error ? error.message : String(error);
74
+ process.stderr.write(`agent-trace: ${message}\n`);
75
+ }
76
+ function isCliEntry(argvPath) {
77
+ if (!argvPath)
78
+ return false;
79
+ const self = fileURLToPath(import.meta.url);
80
+ try {
81
+ return realpathSync(argvPath) === self || realpathSync(argvPath) === realpathSync(self);
82
+ }
83
+ catch {
84
+ return /(cli\.(js|ts)|agent-trace)$/.test(argvPath);
85
+ }
86
+ }
87
+ function readVersion() {
88
+ try {
89
+ const here = dirname(fileURLToPath(import.meta.url));
90
+ const raw = readFileSync(join(here, "..", "package.json"), "utf8");
91
+ const parsed = JSON.parse(raw);
92
+ return parsed.version ?? "0.1.0";
93
+ }
94
+ catch {
95
+ return "0.1.0";
96
+ }
97
+ }
98
+ if (isCliEntry(process.argv[1])) {
99
+ main(process.argv).then((code) => {
100
+ process.exitCode = code;
101
+ }, (error) => {
102
+ printErr(error);
103
+ process.exitCode = 1;
104
+ });
105
+ }
106
+ export { main };
107
+ //# 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"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { parseTrace } from "./parse/index.js";
2
+ export { parseOpenAI } from "./parse/openai.js";
3
+ export { parseLangChain } from "./parse/langchain.js";
4
+ export { parseJsonl } from "./parse/jsonl.js";
5
+ export { parseGeneric } from "./parse/generic.js";
6
+ export { renderTimeline, summaryLine } from "./render/timeline.js";
7
+ export { spicyNarrative, localSpicy } from "./render/spicy.js";
8
+ export { computeStats } from "./stats.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,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"}
@@ -0,0 +1,5 @@
1
+ import type { StepKind, TraceStep } from "../types.js";
2
+ export declare function normalizeEvent(value: unknown, index: number): TraceStep | null;
3
+ export declare function titleFor(kind: StepKind, name?: string): string;
4
+ export declare function reindex(steps: TraceStep[]): TraceStep[];
5
+ //# sourceMappingURL=event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/parse/event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA2DvD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAqG9E;AAwBD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAmB9D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAEvD"}