claude_stream_viewer 1.0.15 → 1.0.18
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/README.md +54 -17
- package/data/claude_events/basic.claude_events.jsonl +99 -0
- package/data/claude_events/video_build_in_public.claude_events.jsonl +4224 -0
- package/data/claude_events/video_generation.claude_events.jsonl +196 -0
- package/demo_vhs/claude_stream_viewer.compressed.gif +0 -0
- package/demo_vhs/claude_stream_viewer.gif +0 -0
- package/demo_vhs/demo.tape +29 -0
- package/demo_vhs/fixture_demo.jsonl +6 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +94 -0
- package/dist/cli.js.map +1 -0
- package/dist/libs/colors.d.ts +15 -0
- package/dist/libs/colors.d.ts.map +1 -0
- package/dist/libs/colors.js +16 -0
- package/dist/libs/colors.js.map +1 -0
- package/dist/libs/terminal_output.d.ts +8 -0
- package/dist/libs/terminal_output.d.ts.map +1 -0
- package/dist/libs/terminal_output.js +13 -0
- package/dist/libs/terminal_output.js.map +1 -0
- package/dist/log_viewer/log_renderer.d.ts +28 -0
- package/dist/log_viewer/log_renderer.d.ts.map +1 -0
- package/dist/log_viewer/log_renderer.js +163 -0
- package/dist/log_viewer/log_renderer.js.map +1 -0
- package/dist/log_viewer/tool_input_formatter.d.ts +31 -0
- package/dist/log_viewer/tool_input_formatter.d.ts.map +1 -0
- package/dist/log_viewer/tool_input_formatter.js +190 -0
- package/dist/log_viewer/tool_input_formatter.js.map +1 -0
- package/dist/stats/stats_collector.d.ts +28 -0
- package/dist/stats/stats_collector.d.ts.map +1 -0
- package/dist/stats/stats_collector.js +165 -0
- package/dist/stats/stats_collector.js.map +1 -0
- package/dist/stats/stats_renderer.d.ts +13 -0
- package/dist/stats/stats_renderer.d.ts.map +1 -0
- package/dist/stats/stats_renderer.js +193 -0
- package/dist/stats/stats_renderer.js.map +1 -0
- package/dist/types/claude_event.d.ts +75 -0
- package/dist/types/claude_event.d.ts.map +1 -0
- package/dist/types/claude_event.js +2 -0
- package/dist/types/claude_event.js.map +1 -0
- package/dist/types/stats_report.d.ts +68 -0
- package/dist/types/stats_report.d.ts.map +1 -0
- package/dist/types/stats_report.js +2 -0
- package/dist/types/stats_report.js.map +1 -0
- package/package.json +13 -9
- package/src/cli.ts +112 -0
- package/src/libs/colors.ts +16 -0
- package/src/libs/terminal_output.ts +14 -0
- package/src/log_viewer/log_renderer.ts +160 -0
- package/src/log_viewer/tool_input_formatter.ts +183 -0
- package/src/stats/stats_collector.ts +175 -0
- package/src/stats/stats_renderer.ts +185 -0
- package/src/types/claude_event.ts +74 -0
- package/src/types/stats_report.ts +66 -0
- package/dist/claude-stream-viewer.d.ts +0 -3
- package/dist/claude-stream-viewer.d.ts.map +0 -1
- package/dist/claude-stream-viewer.js +0 -100
- package/dist/claude-stream-viewer.js.map +0 -1
- package/dist/claude_stream_viewer.d.ts +0 -3
- package/dist/claude_stream_viewer.d.ts.map +0 -1
- package/dist/claude_stream_viewer.js +0 -155
- package/dist/claude_stream_viewer.js.map +0 -1
- package/src/claude_stream_viewer.ts +0 -208
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accumulates per-stream statistics — tool-call counts, tool-result errors, and
|
|
3
|
+
* peak prompt size — and captures the `result` event, then assembles a
|
|
4
|
+
* {@link StatsReport}. A fresh instance should be created per stream.
|
|
5
|
+
*/
|
|
6
|
+
export class StatsCollector {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.toolUseCounts = new Map();
|
|
9
|
+
this.toolResultCount = 0;
|
|
10
|
+
this.toolResultErrorCount = 0;
|
|
11
|
+
this.peakPromptTokens = 0;
|
|
12
|
+
}
|
|
13
|
+
/** Feeds one event into the accumulators; call for every event in the stream. */
|
|
14
|
+
track(event) {
|
|
15
|
+
const type = event.type;
|
|
16
|
+
if (type === 'assistant') {
|
|
17
|
+
this.trackPromptSize(event);
|
|
18
|
+
this.trackToolUses(event);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (type === 'user') {
|
|
22
|
+
this.trackToolResults(event);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (type === 'result') {
|
|
26
|
+
this.resultEvent = event;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
trackPromptSize(event) {
|
|
30
|
+
const usage = event.message?.usage;
|
|
31
|
+
if (usage === undefined)
|
|
32
|
+
return;
|
|
33
|
+
const prompt = (usage.input_tokens ?? 0) + (usage.cache_read_input_tokens ?? 0) + (usage.cache_creation_input_tokens ?? 0);
|
|
34
|
+
if (prompt > this.peakPromptTokens) {
|
|
35
|
+
this.peakPromptTokens = prompt;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
trackToolUses(event) {
|
|
39
|
+
const content = event.message?.content;
|
|
40
|
+
if (content === undefined)
|
|
41
|
+
return;
|
|
42
|
+
for (const block of content) {
|
|
43
|
+
if (block.type !== 'tool_use') {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const name = block.name ?? 'tool';
|
|
47
|
+
this.toolUseCounts.set(name, (this.toolUseCounts.get(name) ?? 0) + 1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
trackToolResults(event) {
|
|
51
|
+
const content = event.message?.content;
|
|
52
|
+
if (content === undefined)
|
|
53
|
+
return;
|
|
54
|
+
for (const block of content) {
|
|
55
|
+
if (block.type !== 'tool_result') {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
this.toolResultCount += 1;
|
|
59
|
+
if (block.is_error === true) {
|
|
60
|
+
this.toolResultErrorCount += 1;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Builds the final {@link StatsReport} from the captured `result` event and
|
|
66
|
+
* the tracked accumulators. Call once, after the stream closes.
|
|
67
|
+
*/
|
|
68
|
+
buildReport() {
|
|
69
|
+
const event = this.resultEvent;
|
|
70
|
+
const usage = event?.usage;
|
|
71
|
+
const result = {
|
|
72
|
+
terminalReason: event?.terminal_reason,
|
|
73
|
+
stopReason: event?.stop_reason,
|
|
74
|
+
isError: event?.is_error === true,
|
|
75
|
+
numTurns: event?.num_turns,
|
|
76
|
+
permissionDenials: event?.permission_denials?.length ?? 0,
|
|
77
|
+
durationMs: event?.duration_ms,
|
|
78
|
+
totalCostUsd: event?.total_cost_usd,
|
|
79
|
+
};
|
|
80
|
+
let latency;
|
|
81
|
+
if (event?.duration_ms !== undefined) {
|
|
82
|
+
const wallMs = event.duration_ms;
|
|
83
|
+
const apiMs = event.duration_api_ms;
|
|
84
|
+
const localMs = apiMs !== undefined ? Math.max(0, wallMs - apiMs) : undefined;
|
|
85
|
+
const output = usage?.output_tokens;
|
|
86
|
+
const throughputTokPerS = (apiMs !== undefined && apiMs > 0 && output !== undefined && output > 0)
|
|
87
|
+
? Math.round(output / (apiMs / 1000))
|
|
88
|
+
: undefined;
|
|
89
|
+
latency = { wallMs, apiMs, localMs, throughputTokPerS };
|
|
90
|
+
}
|
|
91
|
+
let tokens;
|
|
92
|
+
if (usage !== undefined) {
|
|
93
|
+
const input = usage.input_tokens ?? 0;
|
|
94
|
+
const output = usage.output_tokens ?? 0;
|
|
95
|
+
const cacheRead = usage.cache_read_input_tokens ?? 0;
|
|
96
|
+
const cacheCreate = usage.cache_creation_input_tokens ?? 0;
|
|
97
|
+
const total = input + output + cacheRead + cacheCreate;
|
|
98
|
+
const promptTotal = input + cacheRead + cacheCreate;
|
|
99
|
+
const cacheHitPct = promptTotal > 0 ? StatsCollector.round1((cacheRead / promptTotal) * 100) : 0;
|
|
100
|
+
tokens = {
|
|
101
|
+
input,
|
|
102
|
+
output,
|
|
103
|
+
cacheRead,
|
|
104
|
+
cacheCreate,
|
|
105
|
+
total,
|
|
106
|
+
cacheHitPct,
|
|
107
|
+
byModel: StatsCollector.buildByModel(event?.modelUsage),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const contextWindow = StatsCollector.maxContextWindow(event?.modelUsage);
|
|
111
|
+
const context = {
|
|
112
|
+
peakPromptTokens: this.peakPromptTokens,
|
|
113
|
+
contextWindow: contextWindow > 0 ? contextWindow : undefined,
|
|
114
|
+
peakPct: contextWindow > 0 ? StatsCollector.round1((this.peakPromptTokens / contextWindow) * 100) : undefined,
|
|
115
|
+
};
|
|
116
|
+
const byTool = [...this.toolUseCounts.entries()]
|
|
117
|
+
.sort((a, b) => b[1] - a[1])
|
|
118
|
+
.map(([name, count]) => ({ name, count }));
|
|
119
|
+
const totalCalls = byTool.reduce((sum, entry) => sum + entry.count, 0);
|
|
120
|
+
const errorPct = this.toolResultCount > 0 ? StatsCollector.round1((this.toolResultErrorCount / this.toolResultCount) * 100) : 0;
|
|
121
|
+
const tools = {
|
|
122
|
+
totalCalls,
|
|
123
|
+
byTool,
|
|
124
|
+
resultCount: this.toolResultCount,
|
|
125
|
+
errorCount: this.toolResultErrorCount,
|
|
126
|
+
errorPct,
|
|
127
|
+
};
|
|
128
|
+
return {
|
|
129
|
+
truncated: this.resultEvent === undefined,
|
|
130
|
+
result,
|
|
131
|
+
latency,
|
|
132
|
+
tokens,
|
|
133
|
+
context,
|
|
134
|
+
tools,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
static buildByModel(modelUsage) {
|
|
138
|
+
if (modelUsage === undefined)
|
|
139
|
+
return [];
|
|
140
|
+
return Object.entries(modelUsage).map(([model, usage]) => ({
|
|
141
|
+
model,
|
|
142
|
+
input: usage.inputTokens ?? 0,
|
|
143
|
+
output: usage.outputTokens ?? 0,
|
|
144
|
+
cacheRead: usage.cacheReadInputTokens ?? 0,
|
|
145
|
+
cacheCreate: usage.cacheCreationInputTokens ?? 0,
|
|
146
|
+
costUsd: usage.costUSD,
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
static maxContextWindow(modelUsage) {
|
|
150
|
+
if (modelUsage === undefined)
|
|
151
|
+
return 0;
|
|
152
|
+
let max = 0;
|
|
153
|
+
for (const usage of Object.values(modelUsage)) {
|
|
154
|
+
const contextWindow = usage.contextWindow ?? 0;
|
|
155
|
+
if (contextWindow > max) {
|
|
156
|
+
max = contextWindow;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return max;
|
|
160
|
+
}
|
|
161
|
+
static round1(value) {
|
|
162
|
+
return Math.round(value * 10) / 10;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=stats_collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats_collector.js","sourceRoot":"","sources":["../../src/stats/stats_collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { StatsFormat, StatsReport } from '../types/stats_report.js';
|
|
2
|
+
/** Renders a {@link StatsReport} as colorized text, JSON, or Markdown. */
|
|
3
|
+
export declare class StatsRenderer {
|
|
4
|
+
/**
|
|
5
|
+
* Renders the report in the requested format and returns it as a single
|
|
6
|
+
* string ready to print. Text output is colorized; JSON and Markdown are not.
|
|
7
|
+
*/
|
|
8
|
+
static render(report: StatsReport, format: StatsFormat): string;
|
|
9
|
+
private static formatText;
|
|
10
|
+
private static formatMarkdown;
|
|
11
|
+
private static formatCount;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=stats_renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats_renderer.d.ts","sourceRoot":"","sources":["../../src/stats/stats_renderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEzE,0EAA0E;AAC1E,qBAAa,aAAa;IACzB;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM;IAM/D,OAAO,CAAC,MAAM,CAAC,UAAU;IAiEzB,OAAO,CAAC,MAAM,CAAC,cAAc;IAoG7B,OAAO,CAAC,MAAM,CAAC,WAAW;CAG1B"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { colors } from '../libs/colors.js';
|
|
2
|
+
import { TerminalOutput } from '../libs/terminal_output.js';
|
|
3
|
+
/** Renders a {@link StatsReport} as colorized text, JSON, or Markdown. */
|
|
4
|
+
export class StatsRenderer {
|
|
5
|
+
/**
|
|
6
|
+
* Renders the report in the requested format and returns it as a single
|
|
7
|
+
* string ready to print. Text output is colorized; JSON and Markdown are not.
|
|
8
|
+
*/
|
|
9
|
+
static render(report, format) {
|
|
10
|
+
if (format === 'json')
|
|
11
|
+
return JSON.stringify(report, null, 2);
|
|
12
|
+
if (format === 'markdown')
|
|
13
|
+
return StatsRenderer.formatMarkdown(report);
|
|
14
|
+
return StatsRenderer.formatText(report);
|
|
15
|
+
}
|
|
16
|
+
static formatText(report) {
|
|
17
|
+
const lines = [];
|
|
18
|
+
const r = report.result;
|
|
19
|
+
lines.push(TerminalOutput.header('RESULT'));
|
|
20
|
+
if (report.truncated === true)
|
|
21
|
+
lines.push(colors.system('(no result event — stream truncated)'));
|
|
22
|
+
if (r.terminalReason !== undefined)
|
|
23
|
+
lines.push(colors.system(`terminal_reason: ${r.terminalReason}`));
|
|
24
|
+
if (r.stopReason !== undefined)
|
|
25
|
+
lines.push(colors.system(`stop_reason: ${r.stopReason}`));
|
|
26
|
+
if (r.isError === true)
|
|
27
|
+
lines.push(colors.error('is_error: true'));
|
|
28
|
+
if (r.permissionDenials > 0)
|
|
29
|
+
lines.push(colors.system(`permission_denials: ${r.permissionDenials}`));
|
|
30
|
+
if (r.numTurns !== undefined)
|
|
31
|
+
lines.push(colors.system(`turns: ${r.numTurns}`));
|
|
32
|
+
if (r.durationMs !== undefined)
|
|
33
|
+
lines.push(colors.system(`duration: ${(r.durationMs / 1000).toFixed(2)}s`));
|
|
34
|
+
if (r.totalCostUsd !== undefined)
|
|
35
|
+
lines.push(colors.system(`cost: $${r.totalCostUsd.toFixed(4)}`));
|
|
36
|
+
const latency = report.latency;
|
|
37
|
+
if (latency !== undefined) {
|
|
38
|
+
lines.push(TerminalOutput.header('LATENCY'));
|
|
39
|
+
lines.push(colors.system(`wall: ${(latency.wallMs / 1000).toFixed(2)}s`));
|
|
40
|
+
if (latency.apiMs !== undefined)
|
|
41
|
+
lines.push(colors.system(`api: ${(latency.apiMs / 1000).toFixed(2)}s`));
|
|
42
|
+
if (latency.localMs !== undefined)
|
|
43
|
+
lines.push(colors.system(`local: ${(latency.localMs / 1000).toFixed(2)}s (tools + overhead)`));
|
|
44
|
+
if (latency.throughputTokPerS !== undefined)
|
|
45
|
+
lines.push(colors.system(`throughput: ${latency.throughputTokPerS} output tok/s (api time)`));
|
|
46
|
+
}
|
|
47
|
+
const tokens = report.tokens;
|
|
48
|
+
if (tokens !== undefined) {
|
|
49
|
+
lines.push(TerminalOutput.header('TOKENS'));
|
|
50
|
+
lines.push(colors.system(`input: ${StatsRenderer.formatCount(tokens.input)}`));
|
|
51
|
+
lines.push(colors.system(`output: ${StatsRenderer.formatCount(tokens.output)}`));
|
|
52
|
+
lines.push(colors.system(`cache read: ${StatsRenderer.formatCount(tokens.cacheRead)}`));
|
|
53
|
+
lines.push(colors.system(`cache create: ${StatsRenderer.formatCount(tokens.cacheCreate)}`));
|
|
54
|
+
lines.push(colors.system(`total: ${StatsRenderer.formatCount(tokens.total)}`));
|
|
55
|
+
lines.push(colors.system(`cache hit: ${tokens.cacheHitPct.toFixed(1)}% of prompt tokens`));
|
|
56
|
+
if (tokens.byModel.length > 0) {
|
|
57
|
+
lines.push(colors.system('\nby model:'));
|
|
58
|
+
for (const model of tokens.byModel) {
|
|
59
|
+
const costSuffix = model.costUsd !== undefined ? ` $${model.costUsd.toFixed(4)}` : '';
|
|
60
|
+
lines.push(colors.system(` ${model.model}: in=${StatsRenderer.formatCount(model.input)} out=${StatsRenderer.formatCount(model.output)} cache_read=${StatsRenderer.formatCount(model.cacheRead)} cache_create=${StatsRenderer.formatCount(model.cacheCreate)}${costSuffix}`));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const context = report.context;
|
|
65
|
+
if (context.peakPromptTokens > 0) {
|
|
66
|
+
lines.push(TerminalOutput.header('CONTEXT'));
|
|
67
|
+
lines.push(colors.system(`peak prompt: ${StatsRenderer.formatCount(context.peakPromptTokens)} tokens`));
|
|
68
|
+
if (context.contextWindow !== undefined && context.peakPct !== undefined) {
|
|
69
|
+
lines.push(colors.system(`window: ${StatsRenderer.formatCount(context.contextWindow)} (${context.peakPct.toFixed(1)}% used at peak)`));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const tools = report.tools;
|
|
73
|
+
if (tools.byTool.length > 0) {
|
|
74
|
+
lines.push(TerminalOutput.header('TOOLS'));
|
|
75
|
+
lines.push(colors.system(`calls: ${tools.totalCalls}`));
|
|
76
|
+
for (const entry of tools.byTool) {
|
|
77
|
+
lines.push(colors.system(` ${entry.name}: ${entry.count}`));
|
|
78
|
+
}
|
|
79
|
+
if (tools.resultCount > 0) {
|
|
80
|
+
const line = `errors: ${tools.errorCount}/${tools.resultCount} (${tools.errorPct.toFixed(1)}%)`;
|
|
81
|
+
lines.push(tools.errorCount > 0 ? colors.error(line) : colors.system(line));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return lines.join('\n');
|
|
85
|
+
}
|
|
86
|
+
static formatMarkdown(report) {
|
|
87
|
+
const lines = [];
|
|
88
|
+
const r = report.result;
|
|
89
|
+
lines.push('## Stream stats');
|
|
90
|
+
lines.push('');
|
|
91
|
+
const summary = [];
|
|
92
|
+
if (r.terminalReason !== undefined)
|
|
93
|
+
summary.push(r.terminalReason);
|
|
94
|
+
if (r.stopReason !== undefined)
|
|
95
|
+
summary.push(r.stopReason);
|
|
96
|
+
if (r.numTurns !== undefined)
|
|
97
|
+
summary.push(`${r.numTurns} turns`);
|
|
98
|
+
if (r.durationMs !== undefined)
|
|
99
|
+
summary.push(`${(r.durationMs / 1000).toFixed(2)}s`);
|
|
100
|
+
if (r.totalCostUsd !== undefined)
|
|
101
|
+
summary.push(`$${r.totalCostUsd.toFixed(4)}`);
|
|
102
|
+
if (summary.length > 0) {
|
|
103
|
+
lines.push(`**Result:** ${summary.join(' · ')}`);
|
|
104
|
+
lines.push('');
|
|
105
|
+
}
|
|
106
|
+
if (report.truncated === true) {
|
|
107
|
+
lines.push('_No result event — stream truncated._');
|
|
108
|
+
lines.push('');
|
|
109
|
+
}
|
|
110
|
+
if (r.isError === true) {
|
|
111
|
+
lines.push('> ⚠️ **is_error: true**');
|
|
112
|
+
lines.push('');
|
|
113
|
+
}
|
|
114
|
+
if (r.permissionDenials > 0) {
|
|
115
|
+
lines.push(`> permission denials: ${r.permissionDenials}`);
|
|
116
|
+
lines.push('');
|
|
117
|
+
}
|
|
118
|
+
const latency = report.latency;
|
|
119
|
+
if (latency !== undefined) {
|
|
120
|
+
lines.push('### Latency');
|
|
121
|
+
lines.push('');
|
|
122
|
+
lines.push('| metric | value |');
|
|
123
|
+
lines.push('|---|---|');
|
|
124
|
+
lines.push(`| wall | ${(latency.wallMs / 1000).toFixed(2)}s |`);
|
|
125
|
+
if (latency.apiMs !== undefined)
|
|
126
|
+
lines.push(`| api | ${(latency.apiMs / 1000).toFixed(2)}s |`);
|
|
127
|
+
if (latency.localMs !== undefined)
|
|
128
|
+
lines.push(`| local (tools + overhead) | ${(latency.localMs / 1000).toFixed(2)}s |`);
|
|
129
|
+
if (latency.throughputTokPerS !== undefined)
|
|
130
|
+
lines.push(`| throughput | ${latency.throughputTokPerS} output tok/s |`);
|
|
131
|
+
lines.push('');
|
|
132
|
+
}
|
|
133
|
+
const tokens = report.tokens;
|
|
134
|
+
if (tokens !== undefined) {
|
|
135
|
+
lines.push('### Tokens');
|
|
136
|
+
lines.push('');
|
|
137
|
+
lines.push('| type | count |');
|
|
138
|
+
lines.push('|---|--:|');
|
|
139
|
+
lines.push(`| input | ${StatsRenderer.formatCount(tokens.input)} |`);
|
|
140
|
+
lines.push(`| output | ${StatsRenderer.formatCount(tokens.output)} |`);
|
|
141
|
+
lines.push(`| cache read | ${StatsRenderer.formatCount(tokens.cacheRead)} |`);
|
|
142
|
+
lines.push(`| cache create | ${StatsRenderer.formatCount(tokens.cacheCreate)} |`);
|
|
143
|
+
lines.push(`| **total** | **${StatsRenderer.formatCount(tokens.total)}** |`);
|
|
144
|
+
lines.push(`| cache hit | ${tokens.cacheHitPct.toFixed(1)}% |`);
|
|
145
|
+
lines.push('');
|
|
146
|
+
if (tokens.byModel.length > 0) {
|
|
147
|
+
lines.push('**By model:**');
|
|
148
|
+
lines.push('');
|
|
149
|
+
lines.push('| model | in | out | cache read | cache create | cost |');
|
|
150
|
+
lines.push('|---|--:|--:|--:|--:|--:|');
|
|
151
|
+
for (const model of tokens.byModel) {
|
|
152
|
+
const cost = model.costUsd !== undefined ? `$${model.costUsd.toFixed(4)}` : '';
|
|
153
|
+
lines.push(`| ${model.model} | ${StatsRenderer.formatCount(model.input)} | ${StatsRenderer.formatCount(model.output)} | ${StatsRenderer.formatCount(model.cacheRead)} | ${StatsRenderer.formatCount(model.cacheCreate)} | ${cost} |`);
|
|
154
|
+
}
|
|
155
|
+
lines.push('');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const context = report.context;
|
|
159
|
+
if (context.peakPromptTokens > 0) {
|
|
160
|
+
lines.push('### Context');
|
|
161
|
+
lines.push('');
|
|
162
|
+
if (context.contextWindow !== undefined && context.peakPct !== undefined) {
|
|
163
|
+
lines.push(`Peak prompt **${StatsRenderer.formatCount(context.peakPromptTokens)}** tokens — ${context.peakPct.toFixed(1)}% of ${StatsRenderer.formatCount(context.contextWindow)} window.`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
lines.push(`Peak prompt **${StatsRenderer.formatCount(context.peakPromptTokens)}** tokens.`);
|
|
167
|
+
}
|
|
168
|
+
lines.push('');
|
|
169
|
+
}
|
|
170
|
+
const tools = report.tools;
|
|
171
|
+
if (tools.byTool.length > 0) {
|
|
172
|
+
lines.push('### Tools');
|
|
173
|
+
lines.push('');
|
|
174
|
+
lines.push(`Total calls: **${tools.totalCalls}**`);
|
|
175
|
+
lines.push('');
|
|
176
|
+
lines.push('| tool | calls |');
|
|
177
|
+
lines.push('|---|--:|');
|
|
178
|
+
for (const entry of tools.byTool) {
|
|
179
|
+
lines.push(`| ${entry.name} | ${entry.count} |`);
|
|
180
|
+
}
|
|
181
|
+
lines.push('');
|
|
182
|
+
if (tools.resultCount > 0) {
|
|
183
|
+
lines.push(`Errors: ${tools.errorCount}/${tools.resultCount} (${tools.errorPct.toFixed(1)}%)`);
|
|
184
|
+
lines.push('');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return lines.join('\n').trimEnd();
|
|
188
|
+
}
|
|
189
|
+
static formatCount(value) {
|
|
190
|
+
return value.toLocaleString('en-US');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=stats_renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats_renderer.js","sourceRoot":"","sources":["../../src/stats/stats_renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A single content block inside an `assistant` or `user` message.
|
|
3
|
+
*
|
|
4
|
+
* The same shape covers every block kind (`text`, `thinking`, `tool_use`,
|
|
5
|
+
* `tool_result`); only the fields relevant to a given `type` are populated.
|
|
6
|
+
*/
|
|
7
|
+
export type ContentBlock = {
|
|
8
|
+
type?: string;
|
|
9
|
+
text?: string;
|
|
10
|
+
thinking?: string;
|
|
11
|
+
id?: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
input?: unknown;
|
|
14
|
+
tool_use_id?: string;
|
|
15
|
+
content?: string | Array<{
|
|
16
|
+
type?: string;
|
|
17
|
+
text?: string;
|
|
18
|
+
}>;
|
|
19
|
+
is_error?: boolean;
|
|
20
|
+
};
|
|
21
|
+
/** Raw, untyped input object of a `tool_use` block, keyed by parameter name. */
|
|
22
|
+
export type ToolInput = Record<string, unknown>;
|
|
23
|
+
/** Per-model usage aggregate, as found in the result event's `modelUsage` map. */
|
|
24
|
+
export type ModelUsage = {
|
|
25
|
+
inputTokens?: number;
|
|
26
|
+
outputTokens?: number;
|
|
27
|
+
cacheReadInputTokens?: number;
|
|
28
|
+
cacheCreationInputTokens?: number;
|
|
29
|
+
costUSD?: number;
|
|
30
|
+
contextWindow?: number;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* A consolidated Claude Code stream-json event (`system`, `assistant`, `user`,
|
|
34
|
+
* `rate_limit_event`, `result`, …).
|
|
35
|
+
*
|
|
36
|
+
* Partial typing on purpose: only the fields the viewer reads are listed.
|
|
37
|
+
* Anything unrecognized falls through to the unknown-event branch.
|
|
38
|
+
*/
|
|
39
|
+
export type ClaudeEvent = {
|
|
40
|
+
type?: string;
|
|
41
|
+
subtype?: string;
|
|
42
|
+
cwd?: string;
|
|
43
|
+
model?: string;
|
|
44
|
+
tools?: string[];
|
|
45
|
+
session_id?: string;
|
|
46
|
+
claude_code_version?: string;
|
|
47
|
+
message?: {
|
|
48
|
+
content?: ContentBlock[];
|
|
49
|
+
usage?: {
|
|
50
|
+
input_tokens?: number;
|
|
51
|
+
cache_read_input_tokens?: number;
|
|
52
|
+
cache_creation_input_tokens?: number;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
rate_limit_info?: {
|
|
56
|
+
status?: string;
|
|
57
|
+
};
|
|
58
|
+
result?: string;
|
|
59
|
+
total_cost_usd?: number;
|
|
60
|
+
duration_ms?: number;
|
|
61
|
+
duration_api_ms?: number;
|
|
62
|
+
num_turns?: number;
|
|
63
|
+
is_error?: boolean;
|
|
64
|
+
stop_reason?: string;
|
|
65
|
+
permission_denials?: unknown[];
|
|
66
|
+
terminal_reason?: string;
|
|
67
|
+
usage?: {
|
|
68
|
+
input_tokens?: number;
|
|
69
|
+
output_tokens?: number;
|
|
70
|
+
cache_read_input_tokens?: number;
|
|
71
|
+
cache_creation_input_tokens?: number;
|
|
72
|
+
};
|
|
73
|
+
modelUsage?: Record<string, ModelUsage>;
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=claude_event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude_event.d.ts","sourceRoot":"","sources":["../../src/types/claude_event.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,kFAAkF;AAClF,MAAM,MAAM,UAAU,GAAG;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;QACzB,KAAK,CAAC,EAAE;YACP,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;YACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;SACrC,CAAC;KACF,CAAC;IACF,eAAe,CAAC,EAAE;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE;QACP,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;KACrC,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude_event.js","sourceRoot":"","sources":["../../src/types/claude_event.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** Output format selected on the command line for the stats summary. */
|
|
2
|
+
export type StatsFormat = 'text' | 'json' | 'markdown';
|
|
3
|
+
/** Token counts and cost attributed to a single model within a session. */
|
|
4
|
+
export type ModelTokens = {
|
|
5
|
+
model: string;
|
|
6
|
+
input: number;
|
|
7
|
+
output: number;
|
|
8
|
+
cacheRead: number;
|
|
9
|
+
cacheCreate: number;
|
|
10
|
+
costUsd?: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Structured end-of-stream statistics assembled by {@link StatsCollector} from
|
|
14
|
+
* the `result` event and the accumulators tracked across the stream.
|
|
15
|
+
*
|
|
16
|
+
* `latency` and `tokens` are absent when the stream had no `result` event
|
|
17
|
+
* (see `truncated`); `context` and `tools` are always present because they are
|
|
18
|
+
* derived from per-event accumulators.
|
|
19
|
+
*/
|
|
20
|
+
export type StatsReport = {
|
|
21
|
+
/** True when no `result` event was seen (the stream was cut short). */
|
|
22
|
+
truncated: boolean;
|
|
23
|
+
result: {
|
|
24
|
+
terminalReason?: string;
|
|
25
|
+
stopReason?: string;
|
|
26
|
+
isError: boolean;
|
|
27
|
+
numTurns?: number;
|
|
28
|
+
permissionDenials: number;
|
|
29
|
+
durationMs?: number;
|
|
30
|
+
totalCostUsd?: number;
|
|
31
|
+
};
|
|
32
|
+
/** Present only when the result event carried timing. */
|
|
33
|
+
latency?: {
|
|
34
|
+
wallMs: number;
|
|
35
|
+
apiMs?: number;
|
|
36
|
+
/** Wall time minus API time — local tool execution and overhead. */
|
|
37
|
+
localMs?: number;
|
|
38
|
+
throughputTokPerS?: number;
|
|
39
|
+
};
|
|
40
|
+
/** Present only when the result event carried usage. */
|
|
41
|
+
tokens?: {
|
|
42
|
+
input: number;
|
|
43
|
+
output: number;
|
|
44
|
+
cacheRead: number;
|
|
45
|
+
cacheCreate: number;
|
|
46
|
+
total: number;
|
|
47
|
+
/** Cache reads as a percentage of all prompt tokens. */
|
|
48
|
+
cacheHitPct: number;
|
|
49
|
+
byModel: ModelTokens[];
|
|
50
|
+
};
|
|
51
|
+
context: {
|
|
52
|
+
/** Largest single-message prompt (input + cache) seen in the stream. */
|
|
53
|
+
peakPromptTokens: number;
|
|
54
|
+
contextWindow?: number;
|
|
55
|
+
peakPct?: number;
|
|
56
|
+
};
|
|
57
|
+
tools: {
|
|
58
|
+
totalCalls: number;
|
|
59
|
+
byTool: Array<{
|
|
60
|
+
name: string;
|
|
61
|
+
count: number;
|
|
62
|
+
}>;
|
|
63
|
+
resultCount: number;
|
|
64
|
+
errorCount: number;
|
|
65
|
+
errorPct: number;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=stats_report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats_report.d.ts","sourceRoot":"","sources":["../../src/types/stats_report.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvD,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG;IACzB,uEAAuE;IACvE,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,yDAAyD;IACzD,OAAO,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,oEAAoE;QACpE,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,wDAAwD;IACxD,MAAM,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,wDAAwD;QACxD,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,WAAW,EAAE,CAAC;KACvB,CAAC;IACF,OAAO,EAAE;QACR,wEAAwE;QACxE,gBAAgB,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,EAAE;QACN,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC/C,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KACjB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats_report.js","sourceRoot":"","sources":["../../src/types/stats_report.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude_stream_viewer",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.18",
|
|
4
4
|
"description": "Claude Stream Viewer - Pretty-prints Claude API stream-json events from stdin with colorized output.",
|
|
5
|
-
"main": "dist/
|
|
5
|
+
"main": "dist/cli.js",
|
|
6
6
|
"bin": {
|
|
7
|
-
"claude_stream_viewer": "dist/
|
|
7
|
+
"claude_stream_viewer": "dist/cli.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"dev": "tsx ./src/
|
|
10
|
+
"dev": "tsx ./src/cli.ts",
|
|
11
|
+
"sample:basic": "cat ./data/claude_events/basic.claude_events.jsonl | npm run dev",
|
|
12
|
+
"sample:video_generation": "cat ./data/claude_events/video_generation.claude_events.jsonl | npm run dev",
|
|
13
|
+
"sample:video_build_in_public": "cat ./data/claude_events/video_build_in_public.claude_events.jsonl | npm run dev",
|
|
11
14
|
"build": "tsc -p tsconfig.build.json",
|
|
12
|
-
"postbuild": "chmod +x ./dist/
|
|
15
|
+
"postbuild": "chmod +x ./dist/cli.js",
|
|
13
16
|
"version:bump": "npm version patch --no-git-tag-version && git commit -a -m \"feat: bump version in claude_stream_viewer package.json\"",
|
|
14
17
|
"publish:all": "npm run version:bump && npm run build && npm publish --access public",
|
|
15
18
|
"typecheck": "tsc --noEmit",
|
|
19
|
+
"demo_vhs:gif": "cd demo_vhs && vhs demo.tape",
|
|
20
|
+
"demo_vhs:gif:compress": "cd demo_vhs && gifsicle --lossy=80 --colors 64 -O3 claude_stream_viewer.gif -o claude_stream_viewer.compressed.gif",
|
|
16
21
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
17
22
|
},
|
|
18
23
|
"keywords": [
|
|
@@ -30,12 +35,11 @@
|
|
|
30
35
|
"type": "module",
|
|
31
36
|
"repository": {
|
|
32
37
|
"type": "git",
|
|
33
|
-
"url": "git+https://github.com/jeromeetienne/
|
|
34
|
-
"directory": "packages/claude_stream_viewer"
|
|
38
|
+
"url": "git+https://github.com/jeromeetienne/claude_stream_viewer.git"
|
|
35
39
|
},
|
|
36
|
-
"homepage": "https://github.com/jeromeetienne/
|
|
40
|
+
"homepage": "https://github.com/jeromeetienne/claude_stream_viewer#readme",
|
|
37
41
|
"bugs": {
|
|
38
|
-
"url": "https://github.com/jeromeetienne/
|
|
42
|
+
"url": "https://github.com/jeromeetienne/claude_stream_viewer/issues"
|
|
39
43
|
},
|
|
40
44
|
"dependencies": {
|
|
41
45
|
"chalk": "^5.6.2",
|