zozul-cli 0.3.7 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +7 -1
- package/DEVELOPMENT.md +16 -9
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +4 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/dashboard/index.html +164 -42
- package/dist/hooks/server.js +6 -0
- package/dist/hooks/server.js.map +1 -1
- package/dist/parser/ingest.d.ts +2 -0
- package/dist/parser/ingest.d.ts.map +1 -1
- package/dist/parser/ingest.js +8 -3
- package/dist/parser/ingest.js.map +1 -1
- package/dist/parser/jsonl.d.ts +9 -3
- package/dist/parser/jsonl.d.ts.map +1 -1
- package/dist/parser/jsonl.js +35 -11
- package/dist/parser/jsonl.js.map +1 -1
- package/dist/parser/types.d.ts +2 -0
- package/dist/parser/types.d.ts.map +1 -1
- package/dist/parser/watcher.d.ts.map +1 -1
- package/dist/parser/watcher.js +37 -10
- package/dist/parser/watcher.js.map +1 -1
- package/dist/storage/db.d.ts +2 -0
- package/dist/storage/db.d.ts.map +1 -1
- package/dist/storage/db.js +24 -0
- package/dist/storage/db.js.map +1 -1
- package/dist/storage/repo.d.ts +8 -2
- package/dist/storage/repo.d.ts.map +1 -1
- package/dist/storage/repo.js +64 -42
- package/dist/storage/repo.js.map +1 -1
- package/dist/sync/sync.test.js +12 -0
- package/dist/sync/sync.test.js.map +1 -1
- package/dist/sync/transform.d.ts +2 -0
- package/dist/sync/transform.d.ts.map +1 -1
- package/dist/sync/transform.js +2 -0
- package/dist/sync/transform.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands.ts +5 -0
- package/src/dashboard/index.html +164 -42
- package/src/hooks/server.ts +7 -0
- package/src/parser/ingest.ts +10 -5
- package/src/parser/jsonl.ts +43 -7
- package/src/parser/types.ts +2 -0
- package/src/parser/watcher.ts +34 -9
- package/src/storage/db.ts +24 -0
- package/src/storage/repo.ts +72 -48
- package/src/sync/sync.test.ts +12 -0
- package/src/sync/transform.ts +4 -0
|
@@ -103,7 +103,13 @@
|
|
|
103
103
|
"Bash(python3 -c \"import json,sys; d=json.load\\(sys.stdin\\); print\\(type\\(d\\).__name__, d if isinstance\\(d,dict\\) else f''''len={len\\(d\\)}, first={d[0] if d else None}''''\\)\")",
|
|
104
104
|
"Bash(KEY=\"d6mPOWoV12NfT-6bg_ZYy5vv7ar-InBkkzDDz7H8ATM\" curl -s -H \"X-API-Key: $KEY\" \"http://zozul-dev-alb-1396702185.us-east-1.elb.amazonaws.com/api/v1/stats\")",
|
|
105
105
|
"Bash(KEY=\"d6mPOWoV12NfT-6bg_ZYy5vv7ar-InBkkzDDz7H8ATM\" echo \"=== Local ===\")",
|
|
106
|
-
"Bash(npm whoami:*)"
|
|
106
|
+
"Bash(npm whoami:*)",
|
|
107
|
+
"WebFetch(domain:docs.anthropic.com)",
|
|
108
|
+
"Bash(python3 -c \"import sys, json; d = json.load\\(sys.stdin\\); print\\('sessionId:', d.get\\('sessionId'\\)\\); print\\('agentId:', d.get\\('agentId'\\)\\); print\\('isSidechain:', d.get\\('isSidechain'\\)\\)\")",
|
|
109
|
+
"Bash(find ~/.claude/projects -name \"*.meta.json\" -exec grep -l \"claude-code-guide\" {} \\\\;)",
|
|
110
|
+
"Bash(python3 -c \"import json,sys; d=json.load\\(sys.stdin\\); print\\(f'{len\\(d\\)} subagents found'\\)\")",
|
|
111
|
+
"Read(//Users/ryanchun/.zozul/**)",
|
|
112
|
+
"Bash(python3 -c ':*)"
|
|
107
113
|
]
|
|
108
114
|
}
|
|
109
115
|
}
|
package/DEVELOPMENT.md
CHANGED
|
@@ -109,21 +109,25 @@ Eight tables, all in `~/.zozul/zozul.db` (WAL mode, foreign keys ON).
|
|
|
109
109
|
One row per Claude Code session. Updated from both JSONL and OTEL.
|
|
110
110
|
|
|
111
111
|
```sql
|
|
112
|
-
id TEXT PRIMARY KEY -- session UUID (from JSONL filename)
|
|
112
|
+
id TEXT PRIMARY KEY -- session UUID (from JSONL filename) or agent-* for sub-sessions
|
|
113
113
|
project_path TEXT -- decoded from transcript path
|
|
114
|
+
parent_session_id TEXT -- parent session ID for agent sub-sessions, NULL for top-level
|
|
115
|
+
agent_type TEXT -- e.g. 'Explore', 'Plan', 'general-purpose' (from .meta.json)
|
|
114
116
|
started_at TEXT NOT NULL -- ISO timestamp, from JSONL
|
|
115
117
|
ended_at TEXT -- kept current by OTEL batches
|
|
116
|
-
total_input_tokens INTEGER -- OTEL-
|
|
118
|
+
total_input_tokens INTEGER -- OTEL-authoritative (recomputed from otel_metrics)
|
|
117
119
|
total_output_tokens INTEGER
|
|
118
120
|
total_cache_read_tokens INTEGER
|
|
119
121
|
total_cache_creation_tokens INTEGER
|
|
120
|
-
total_cost_usd REAL -- OTEL
|
|
122
|
+
total_cost_usd REAL -- OTEL-authoritative; fallback: SUM(turns.cost_usd)
|
|
121
123
|
total_turns INTEGER -- from JSONL (count of parsed turns)
|
|
122
|
-
total_duration_ms INTEGER --
|
|
124
|
+
total_duration_ms INTEGER -- SUM(turns.duration_ms)
|
|
123
125
|
model TEXT -- last model seen
|
|
124
126
|
```
|
|
125
127
|
|
|
126
|
-
Upsert semantics: `MIN(started_at)`,
|
|
128
|
+
Upsert semantics: `MIN(started_at)`, simple replacement for metric fields, `COALESCE` for nullable strings. After ingest, `recomputeSessionCostsFromOtel` overwrites metrics with authoritative OTEL data. Sessions without OTEL fall back to `SUM(turns.cost_usd)`.
|
|
129
|
+
|
|
130
|
+
Agent sub-sessions are discovered from `<session-uuid>/subagents/` directories. They share the parent's `project_path` and have `parent_session_id` set. Display queries filter `WHERE parent_session_id IS NULL` to show only top-level sessions. OTEL reports all cost/tokens under the parent session ID — agent sub-sessions have no OTEL data.
|
|
127
131
|
|
|
128
132
|
### `turns`
|
|
129
133
|
One row per message turn. Unique on `(session_id, turn_index)`.
|
|
@@ -171,7 +175,7 @@ payload TEXT -- full JSON body
|
|
|
171
175
|
```
|
|
172
176
|
|
|
173
177
|
### `otel_metrics`
|
|
174
|
-
Raw OTEL metric data points, append-only.
|
|
178
|
+
Raw OTEL metric data points, append-only. Deduplicated via unique index on `(session_id, name, timestamp, type)`.
|
|
175
179
|
|
|
176
180
|
```sql
|
|
177
181
|
id INTEGER PRIMARY KEY AUTOINCREMENT
|
|
@@ -181,9 +185,10 @@ attributes TEXT -- full JSON of flattened OTLP attributes
|
|
|
181
185
|
session_id TEXT -- extracted from attributes
|
|
182
186
|
model TEXT -- extracted from attributes
|
|
183
187
|
timestamp TEXT
|
|
188
|
+
UNIQUE(session_id, name, timestamp, json_extract(attributes, '$.type'))
|
|
184
189
|
```
|
|
185
190
|
|
|
186
|
-
Dashboard charts query this table directly (not `sessions`) for time-series data.
|
|
191
|
+
Inserts use `INSERT OR IGNORE` to skip duplicates. Dashboard charts query this table directly (not `sessions`) for time-series data.
|
|
187
192
|
|
|
188
193
|
### `otel_events`
|
|
189
194
|
Raw OTEL log records, append-only.
|
|
@@ -225,9 +230,11 @@ updated_at TEXT
|
|
|
225
230
|
|
|
226
231
|
**JSONL is the only source for full conversation text.** OTEL events can include prompt text when `OTEL_LOG_USER_PROMPTS=1`, but the assistant's full response is only in the JSONL transcript.
|
|
227
232
|
|
|
228
|
-
**Sessions table uses
|
|
233
|
+
**Sessions table uses simple replacement on upsert for metric fields.** JSONL values act as initial estimates. `recomputeSessionCostsFromOtel` runs after ingest and on server startup to overwrite with authoritative OTEL data. For sessions without OTEL, cost falls back to `SUM(turns.cost_usd)`. Duration is always `SUM(turns.duration_ms)`.
|
|
234
|
+
|
|
235
|
+
**OTEL deltas are accumulated, not replaced.** `updateSessionFromOtel` does `total_cost_usd = total_cost_usd + @cost`. This is correct because OTEL sends deltas per window. Do not change this to an assignment. The accumulated values are periodically reconciled by `recomputeSessionCostsFromOtel` which recomputes from raw `otel_metrics` rows.
|
|
229
236
|
|
|
230
|
-
**OTEL
|
|
237
|
+
**OTEL metrics are deduplicated locally.** The `otel_metrics` table has a unique index on `(session_id, name, timestamp, type)` matching the backend's constraint. Without this, `SUM(value)` double-counts duplicates, inflating costs. Inserts use `INSERT OR IGNORE`.
|
|
231
238
|
|
|
232
239
|
**Tool uses are replaced, not appended, on re-ingest.** `replaceToolUsesForTurn` deletes then re-inserts. This prevents duplication when the watcher re-ingests a live session file on every new turn.
|
|
233
240
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4HpC,wBAAgB,QAAQ,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4HpC,wBAAgB,QAAQ,IAAI,OAAO,CA+QlC"}
|
package/dist/cli/commands.js
CHANGED
|
@@ -307,6 +307,10 @@ export function buildCli() {
|
|
|
307
307
|
console.log("Scanning for Claude Code session files...");
|
|
308
308
|
const result = await ingestAllSessions(repo, { force: opts.force, noTag: opts.tag === false });
|
|
309
309
|
console.log(`Ingested: ${result.ingested} Skipped: ${result.skipped}`);
|
|
310
|
+
// Recompute costs from OTEL to overwrite JSONL estimates with authoritative data
|
|
311
|
+
const fixed = repo.recomputeSessionCostsFromOtel();
|
|
312
|
+
if (fixed > 0)
|
|
313
|
+
console.log(`Recomputed costs for ${fixed} sessions from OTEL data`);
|
|
310
314
|
db.close();
|
|
311
315
|
});
|
|
312
316
|
program
|
package/dist/cli/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -58,6 +58,21 @@
|
|
|
58
58
|
.source-badge.local { border-color: var(--blue); color: var(--blue); }
|
|
59
59
|
.source-badge.clickable { cursor: pointer; }
|
|
60
60
|
.source-badge.clickable:hover { opacity: 0.7; }
|
|
61
|
+
.view-toggle {
|
|
62
|
+
background: none;
|
|
63
|
+
border: 1px solid var(--border);
|
|
64
|
+
color: var(--text-dim);
|
|
65
|
+
padding: 4px 10px;
|
|
66
|
+
border-radius: 6px;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
font-family: var(--mono);
|
|
69
|
+
font-size: 13px;
|
|
70
|
+
font-weight: 600;
|
|
71
|
+
min-width: 32px;
|
|
72
|
+
transition: border-color 0.15s, color 0.15s;
|
|
73
|
+
}
|
|
74
|
+
.view-toggle:hover { border-color: var(--accent); color: var(--text); }
|
|
75
|
+
.view-toggle.tokens { color: var(--blue, #64b5f6); border-color: var(--blue, #64b5f6); }
|
|
61
76
|
.auto-btn {
|
|
62
77
|
background: none;
|
|
63
78
|
border: 1px solid var(--border);
|
|
@@ -437,6 +452,7 @@
|
|
|
437
452
|
<span class="subtitle">Agent Observability</span>
|
|
438
453
|
<div class="header-right">
|
|
439
454
|
<span class="source-badge" id="source-badge" style="display:none" onclick="toggleDataSource()">Local</span>
|
|
455
|
+
<button class="view-toggle" id="view-mode-toggle" onclick="toggleViewMode()" title="Switch between cost and token view">$</button>
|
|
440
456
|
<button class="auto-btn" onclick="manualRefresh()" title="Auto-refresh every 10s">
|
|
441
457
|
<span class="live-dot"></span>
|
|
442
458
|
Auto
|
|
@@ -458,9 +474,9 @@
|
|
|
458
474
|
<div id="view-summary" class="view active">
|
|
459
475
|
<div class="time-selector"></div>
|
|
460
476
|
<div class="stats-grid" id="summary-stats"></div>
|
|
461
|
-
<div class="chart-card"><h3>Daily Cost (30d)</h3><canvas id="chart-daily-cost"></canvas></div>
|
|
477
|
+
<div class="chart-card"><h3 id="chart-title">Daily Cost (30d)</h3><canvas id="chart-daily-cost"></canvas></div>
|
|
462
478
|
<div class="panel">
|
|
463
|
-
<div class="panel-header"><span>Cost by Project</span></div>
|
|
479
|
+
<div class="panel-header"><span id="project-panel-title">Cost by Project</span></div>
|
|
464
480
|
<ul class="project-list" id="project-breakdown"></ul>
|
|
465
481
|
</div>
|
|
466
482
|
</div>
|
|
@@ -512,7 +528,7 @@
|
|
|
512
528
|
<th class="sortable" data-sort="sessions:project_path">Project</th>
|
|
513
529
|
<th class="sortable" data-sort="sessions:started_at">Started</th>
|
|
514
530
|
<th class="sortable" data-sort="sessions:total_duration_ms">Duration</th>
|
|
515
|
-
<th class="sortable" data-sort="sessions:
|
|
531
|
+
<th class="sortable" data-sort="sessions:user_turns">Prompts</th>
|
|
516
532
|
<th class="sortable desc" data-sort="sessions:total_cost_usd">Cost</th>
|
|
517
533
|
<th class="sortable" data-sort="sessions:model">Model</th>
|
|
518
534
|
</tr></thead>
|
|
@@ -640,6 +656,7 @@ let remoteAvailable = false;
|
|
|
640
656
|
let autoRefreshTimer = null;
|
|
641
657
|
let currentView = 'summary';
|
|
642
658
|
let currentTimeWindow = '7d';
|
|
659
|
+
let viewMode = 'cost'; // 'cost' or 'tokens'
|
|
643
660
|
let previousView = 'tasks';
|
|
644
661
|
let allTaskGroups = [];
|
|
645
662
|
let allTagStats = [];
|
|
@@ -712,7 +729,16 @@ function toggleDataSource() {
|
|
|
712
729
|
async function fetchJson(path) {
|
|
713
730
|
if (dataSource === 'remote' && typeof ZOZUL_CONFIG !== 'undefined') {
|
|
714
731
|
try {
|
|
715
|
-
|
|
732
|
+
let remotePath = path.replace('/api/', '/');
|
|
733
|
+
// Ensure trailing slash before query params to avoid 307 redirects (which drop headers)
|
|
734
|
+
const qIdx = remotePath.indexOf('?');
|
|
735
|
+
if (qIdx === -1) {
|
|
736
|
+
if (!remotePath.endsWith('/')) remotePath += '/';
|
|
737
|
+
} else {
|
|
738
|
+
const base = remotePath.slice(0, qIdx);
|
|
739
|
+
if (!base.endsWith('/')) remotePath = base + '/' + remotePath.slice(qIdx);
|
|
740
|
+
}
|
|
741
|
+
const url = ZOZUL_CONFIG.remote.baseUrl + remotePath;
|
|
716
742
|
const res = await fetch(url, { headers: { 'X-API-Key': ZOZUL_CONFIG.remote.apiKey } });
|
|
717
743
|
if (res.ok) return res.json();
|
|
718
744
|
} catch {}
|
|
@@ -771,6 +797,24 @@ function fmtCost(n) {
|
|
|
771
797
|
const v = n ?? 0;
|
|
772
798
|
return v >= 1 ? '$' + v.toFixed(2) : '$' + v.toFixed(4);
|
|
773
799
|
}
|
|
800
|
+
function fmtTokens(n) {
|
|
801
|
+
const v = n ?? 0;
|
|
802
|
+
if (v >= 1_000_000) return (v / 1_000_000).toFixed(1) + 'M';
|
|
803
|
+
if (v >= 1_000) return (v / 1_000).toFixed(1) + 'K';
|
|
804
|
+
return v.toLocaleString();
|
|
805
|
+
}
|
|
806
|
+
function fmtMetric(cost, tokens) {
|
|
807
|
+
if (viewMode === 'tokens') return tokens != null ? fmtTokens(tokens) : '\u2014';
|
|
808
|
+
return fmtCost(cost);
|
|
809
|
+
}
|
|
810
|
+
function toggleViewMode() {
|
|
811
|
+
viewMode = viewMode === 'cost' ? 'tokens' : 'cost';
|
|
812
|
+
const btn = document.getElementById('view-mode-toggle');
|
|
813
|
+
btn.textContent = viewMode === 'cost' ? '$' : 'T';
|
|
814
|
+
btn.classList.toggle('tokens', viewMode === 'tokens');
|
|
815
|
+
btn.title = viewMode === 'cost' ? 'Switch to token view' : 'Switch to cost view';
|
|
816
|
+
loadViewData(currentView);
|
|
817
|
+
}
|
|
774
818
|
function fmtDuration(ms) {
|
|
775
819
|
if (!ms || ms <= 0) return '\u2014';
|
|
776
820
|
const s = Math.floor(ms / 1000);
|
|
@@ -836,9 +880,13 @@ function timeQueryString() {
|
|
|
836
880
|
return 'from=' + encodeURIComponent(from) + '&to=' + encodeURIComponent(now.toISOString());
|
|
837
881
|
}
|
|
838
882
|
|
|
883
|
+
function chartStepForWindow() {
|
|
884
|
+
return currentTimeWindow === '24h' ? '1h' : '1d';
|
|
885
|
+
}
|
|
886
|
+
|
|
839
887
|
function renderTimeSelectors() {
|
|
840
888
|
document.querySelectorAll('.time-selector').forEach(el => {
|
|
841
|
-
el.innerHTML = ['7d', '30d', 'all'].map(w =>
|
|
889
|
+
el.innerHTML = ['24h', '7d', '30d', 'all'].map(w =>
|
|
842
890
|
'<button class="time-btn' + (w === currentTimeWindow ? ' active' : '') + '" data-window="' + w + '">' +
|
|
843
891
|
(w === 'all' ? 'All' : w) + '</button>'
|
|
844
892
|
).join('');
|
|
@@ -934,18 +982,23 @@ async function loadSummary() {
|
|
|
934
982
|
const timeQs = timeQueryString();
|
|
935
983
|
const timeParam = timeQs ? '?' + timeQs : '';
|
|
936
984
|
const timeSep = timeQs ? '&' + timeQs : '';
|
|
937
|
-
const
|
|
985
|
+
const chartRange = currentTimeWindow === 'all' ? '90d' : currentTimeWindow;
|
|
986
|
+
const chartStep = currentTimeWindow === '24h' ? '1h' : '1d';
|
|
987
|
+
const [stats, tasks, costSeries, tokenSeries, sessionsResp] = await Promise.all([
|
|
938
988
|
fetchJson('/api/stats' + timeParam),
|
|
939
989
|
fetchJson('/api/tasks'),
|
|
940
|
-
fetchJson('/api/metrics/cost?range=' +
|
|
990
|
+
fetchJson('/api/metrics/cost?range=' + chartRange + '&step=' + chartStep),
|
|
991
|
+
fetchJson('/api/metrics/tokens?range=' + chartRange + '&step=' + chartStep),
|
|
941
992
|
fetchJson('/api/sessions?limit=500&offset=0' + timeSep),
|
|
942
993
|
]);
|
|
994
|
+
const totalTokens = (stats.total_input_tokens ?? 0) + (stats.total_output_tokens ?? 0) + (stats.total_cache_read_tokens ?? 0);
|
|
943
995
|
renderSummaryStats({
|
|
944
996
|
totalCost: stats.total_cost_usd ?? 0,
|
|
997
|
+
totalTokens,
|
|
945
998
|
totalSessions: stats.total_sessions ?? 0,
|
|
946
999
|
totalTasks: tasks.length ?? 0,
|
|
947
1000
|
});
|
|
948
|
-
|
|
1001
|
+
renderUsageChart(costSeries, tokenSeries);
|
|
949
1002
|
const sessions = Array.isArray(sessionsResp) ? sessionsResp : sessionsResp.sessions;
|
|
950
1003
|
renderProjectBreakdown(sessions);
|
|
951
1004
|
} catch (e) {
|
|
@@ -953,18 +1006,52 @@ async function loadSummary() {
|
|
|
953
1006
|
}
|
|
954
1007
|
}
|
|
955
1008
|
|
|
956
|
-
function
|
|
957
|
-
|
|
958
|
-
const
|
|
1009
|
+
function renderUsageChart(costData, tokenData) {
|
|
1010
|
+
const isTokens = viewMode === 'tokens';
|
|
1011
|
+
const isHourly = currentTimeWindow === '24h';
|
|
1012
|
+
const sourceData = isTokens ? tokenData : costData;
|
|
1013
|
+
|
|
1014
|
+
const titleEl = document.getElementById('chart-title');
|
|
1015
|
+
if (titleEl) {
|
|
1016
|
+
const period = isHourly ? 'Hourly' : 'Daily';
|
|
1017
|
+
titleEl.textContent = isTokens ? period + ' Tokens' : period + ' Cost';
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
if (!sourceData || !sourceData.length) return;
|
|
1021
|
+
|
|
1022
|
+
const labels = sourceData.map(d => {
|
|
959
1023
|
const dt = new Date(d.timestamp);
|
|
960
|
-
return
|
|
1024
|
+
return isHourly
|
|
1025
|
+
? dt.toLocaleTimeString(undefined, { hour: 'numeric', hour12: true })
|
|
1026
|
+
: dt.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });
|
|
961
1027
|
});
|
|
962
|
-
|
|
1028
|
+
|
|
1029
|
+
let data, label, bgColor, borderColor, tooltipFmt, yFmt;
|
|
1030
|
+
if (isTokens) {
|
|
1031
|
+
data = sourceData.map(d => (d.input ?? 0) + (d.output ?? 0) + (d.cache_read ?? 0));
|
|
1032
|
+
label = 'Tokens';
|
|
1033
|
+
bgColor = 'rgba(100,181,246,0.3)';
|
|
1034
|
+
borderColor = '#64b5f6';
|
|
1035
|
+
tooltipFmt = ctx => fmtTokens(ctx.parsed.y);
|
|
1036
|
+
yFmt = v => fmtTokens(v);
|
|
1037
|
+
} else {
|
|
1038
|
+
data = sourceData.map(d => d.cost);
|
|
1039
|
+
label = 'Cost (USD)';
|
|
1040
|
+
bgColor = 'rgba(255,152,0,0.3)';
|
|
1041
|
+
borderColor = '#ff9800';
|
|
1042
|
+
tooltipFmt = ctx => '$' + ctx.parsed.y.toFixed(4);
|
|
1043
|
+
yFmt = v => '$' + v.toFixed(2);
|
|
1044
|
+
}
|
|
963
1045
|
|
|
964
1046
|
const existing = chartInstances['chart-daily-cost'];
|
|
965
1047
|
if (existing) {
|
|
966
1048
|
existing.data.labels = labels;
|
|
967
1049
|
existing.data.datasets[0].data = data;
|
|
1050
|
+
existing.data.datasets[0].label = label;
|
|
1051
|
+
existing.data.datasets[0].backgroundColor = bgColor;
|
|
1052
|
+
existing.data.datasets[0].borderColor = borderColor;
|
|
1053
|
+
existing.options.plugins.tooltip.callbacks.label = tooltipFmt;
|
|
1054
|
+
existing.options.scales.y.ticks.callback = yFmt;
|
|
968
1055
|
existing.update('none');
|
|
969
1056
|
return;
|
|
970
1057
|
}
|
|
@@ -976,10 +1063,10 @@ function renderDailyCostChart(costData) {
|
|
|
976
1063
|
data: {
|
|
977
1064
|
labels,
|
|
978
1065
|
datasets: [{
|
|
979
|
-
label
|
|
1066
|
+
label,
|
|
980
1067
|
data,
|
|
981
|
-
backgroundColor:
|
|
982
|
-
borderColor
|
|
1068
|
+
backgroundColor: bgColor,
|
|
1069
|
+
borderColor,
|
|
983
1070
|
borderWidth: 1,
|
|
984
1071
|
borderRadius: 3,
|
|
985
1072
|
}]
|
|
@@ -988,11 +1075,11 @@ function renderDailyCostChart(costData) {
|
|
|
988
1075
|
responsive: true,
|
|
989
1076
|
plugins: {
|
|
990
1077
|
legend: { display: false },
|
|
991
|
-
tooltip: { callbacks: { label:
|
|
1078
|
+
tooltip: { callbacks: { label: tooltipFmt } },
|
|
992
1079
|
},
|
|
993
1080
|
scales: {
|
|
994
1081
|
x: { ticks: { color: '#8b8fa3', font: { family: '"JetBrains Mono", monospace', size: 10 } } },
|
|
995
|
-
y: { ticks: { color: '#8b8fa3', font: { family: '"JetBrains Mono", monospace', size: 10 }, callback:
|
|
1082
|
+
y: { ticks: { color: '#8b8fa3', font: { family: '"JetBrains Mono", monospace', size: 10 }, callback: yFmt } },
|
|
996
1083
|
}
|
|
997
1084
|
}
|
|
998
1085
|
});
|
|
@@ -1009,26 +1096,34 @@ function renderProjectBreakdown(sessions) {
|
|
|
1009
1096
|
const byProject = {};
|
|
1010
1097
|
for (const s of sessions) {
|
|
1011
1098
|
const proj = s.project_path || 'Unknown';
|
|
1012
|
-
if (!byProject[proj]) byProject[proj] = 0;
|
|
1013
|
-
byProject[proj] += s.total_cost_usd || 0;
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
const
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1099
|
+
if (!byProject[proj]) byProject[proj] = { cost: 0, tokens: 0 };
|
|
1100
|
+
byProject[proj].cost += s.total_cost_usd || 0;
|
|
1101
|
+
byProject[proj].tokens += (s.total_input_tokens || 0) + (s.total_output_tokens || 0) + (s.total_cache_read_tokens || 0);
|
|
1102
|
+
}
|
|
1103
|
+
const isTokens = viewMode === 'tokens';
|
|
1104
|
+
const panelTitle = document.getElementById('project-panel-title');
|
|
1105
|
+
if (panelTitle) panelTitle.textContent = isTokens ? 'Tokens by Project' : 'Cost by Project';
|
|
1106
|
+
const sorted = Object.entries(byProject).sort((a, b) => (isTokens ? b[1].tokens - a[1].tokens : b[1].cost - a[1].cost));
|
|
1107
|
+
const maxVal = (isTokens ? sorted[0]?.[1].tokens : sorted[0]?.[1].cost) || 1;
|
|
1108
|
+
|
|
1109
|
+
el.innerHTML = sorted.slice(0, 10).map(([proj, vals]) => {
|
|
1110
|
+
const val = isTokens ? vals.tokens : vals.cost;
|
|
1111
|
+
const pct = Math.round(val / maxVal * 100);
|
|
1020
1112
|
return '<li class="project-item">' +
|
|
1021
1113
|
'<span class="project-name" title="' + escHtml(proj) + '">' + escHtml(basename(proj)) + '</span>' +
|
|
1022
1114
|
'<div class="project-bar-wrap"><div class="project-bar" style="width:' + pct + '%"></div></div>' +
|
|
1023
|
-
'<span class="project-cost">' + fmtCost(
|
|
1115
|
+
'<span class="project-cost">' + (isTokens ? fmtTokens(val) : fmtCost(val)) + '</span>' +
|
|
1024
1116
|
'</li>';
|
|
1025
1117
|
}).join('');
|
|
1026
1118
|
}
|
|
1027
1119
|
|
|
1028
1120
|
function renderSummaryStats(s) {
|
|
1029
1121
|
const grid = document.getElementById('summary-stats');
|
|
1122
|
+
const primary = viewMode === 'tokens'
|
|
1123
|
+
? { label: 'Total Tokens', value: fmtTokens(s.totalTokens) }
|
|
1124
|
+
: { label: 'Total Cost', value: fmtCost(s.totalCost) };
|
|
1030
1125
|
grid.innerHTML = [
|
|
1031
|
-
{ label:
|
|
1126
|
+
{ label: primary.label, value: primary.value, hero: true },
|
|
1032
1127
|
{ label: 'Total Sessions', value: fmtNum(s.totalSessions), hero: true },
|
|
1033
1128
|
{ label: 'Total Tasks', value: fmtNum(s.totalTasks), hero: true },
|
|
1034
1129
|
].map(c =>
|
|
@@ -1066,7 +1161,7 @@ function renderTaskTable(groups) {
|
|
|
1066
1161
|
return '<tr class="clickable" onclick="showTaskDetail(\'' + escHtml(g.tags).replace(/'/g, "\\'") + '\')">' +
|
|
1067
1162
|
'<td>' + pills + '</td>' +
|
|
1068
1163
|
'<td>' + fmtDuration(g.total_duration_ms) + '</td>' +
|
|
1069
|
-
'<td><span class="badge badge-cost">' +
|
|
1164
|
+
'<td><span class="badge badge-cost">' + fmtMetric(g.total_cost_usd, g.total_tokens) + '</span></td>' +
|
|
1070
1165
|
'<td>' + fmtNum(g.human_interventions) + '</td>' +
|
|
1071
1166
|
'<td title="' + fmtAbsolute(g.last_seen) + '">' + fmtRelative(g.last_seen) + '</td>' +
|
|
1072
1167
|
'</tr>';
|
|
@@ -1110,7 +1205,7 @@ async function showTaskDetail(tagSet) {
|
|
|
1110
1205
|
} else {
|
|
1111
1206
|
stats = await fetchJson('/api/tasks/stats?' + qs);
|
|
1112
1207
|
}
|
|
1113
|
-
const turns = await fetchJson('/api/tasks/turns?' + qs + '&limit=' + PAGE_SIZE + '&offset=0');
|
|
1208
|
+
const turns = await enrichTurnsWithCost(await fetchJson('/api/tasks/turns?' + qs + '&limit=' + PAGE_SIZE + '&offset=0'));
|
|
1114
1209
|
|
|
1115
1210
|
statsEl.innerHTML = [
|
|
1116
1211
|
{ label: 'Task', value: '<span style="font-size:14px">' + pills + '</span>' },
|
|
@@ -1170,13 +1265,13 @@ function taskDetailQs() {
|
|
|
1170
1265
|
|
|
1171
1266
|
async function taskDetailNext() {
|
|
1172
1267
|
taskDetailOffset += PAGE_SIZE;
|
|
1173
|
-
const turns = await fetchJson('/api/tasks/turns?' + taskDetailQs() + '&limit=' + PAGE_SIZE + '&offset=' + taskDetailOffset);
|
|
1268
|
+
const turns = await enrichTurnsWithCost(await fetchJson('/api/tasks/turns?' + taskDetailQs() + '&limit=' + PAGE_SIZE + '&offset=' + taskDetailOffset));
|
|
1174
1269
|
renderTaskDetailTurns(turns);
|
|
1175
1270
|
}
|
|
1176
1271
|
|
|
1177
1272
|
async function taskDetailPrev() {
|
|
1178
1273
|
taskDetailOffset = Math.max(0, taskDetailOffset - PAGE_SIZE);
|
|
1179
|
-
const turns = await fetchJson('/api/tasks/turns?' + taskDetailQs() + '&limit=' + PAGE_SIZE + '&offset=' + taskDetailOffset);
|
|
1274
|
+
const turns = await enrichTurnsWithCost(await fetchJson('/api/tasks/turns?' + taskDetailQs() + '&limit=' + PAGE_SIZE + '&offset=' + taskDetailOffset));
|
|
1180
1275
|
renderTaskDetailTurns(turns);
|
|
1181
1276
|
}
|
|
1182
1277
|
|
|
@@ -1186,8 +1281,10 @@ async function loadTags() {
|
|
|
1186
1281
|
try {
|
|
1187
1282
|
const tasks = await fetchJson('/api/tasks');
|
|
1188
1283
|
if (!tasks.length) { allTagStats = []; renderTagTable([]); return; }
|
|
1284
|
+
const timeQs = timeQueryString();
|
|
1285
|
+
const timeSep = timeQs ? '&' + timeQs : '';
|
|
1189
1286
|
const statsList = await Promise.all(
|
|
1190
|
-
tasks.map(t => fetchJson('/api/tasks/stats?tags=' + encodeURIComponent(t.task) + '&mode=any')
|
|
1287
|
+
tasks.map(t => fetchJson('/api/tasks/stats?tags=' + encodeURIComponent(t.task) + '&mode=any' + timeSep)
|
|
1191
1288
|
.then(s => ({ ...s, tag: t.task, last_seen: t.last_tagged }))
|
|
1192
1289
|
.catch(() => ({ tag: t.task, turn_count: t.turn_count, human_interventions: 0, total_duration_ms: 0, total_cost_usd: 0, last_seen: t.last_tagged }))
|
|
1193
1290
|
)
|
|
@@ -1198,6 +1295,7 @@ async function loadTags() {
|
|
|
1198
1295
|
human_interventions: s.user_turns ?? s.human_interventions ?? 0,
|
|
1199
1296
|
total_duration_ms: s.total_duration_ms ?? 0,
|
|
1200
1297
|
total_cost_usd: s.total_cost_usd ?? 0,
|
|
1298
|
+
total_tokens: (s.total_input_tokens ?? 0) + (s.total_output_tokens ?? 0) + (s.total_cache_read_tokens ?? 0),
|
|
1201
1299
|
last_seen: s.last_seen,
|
|
1202
1300
|
}));
|
|
1203
1301
|
renderTagTable(sortData(allTagStats, sortState.tags));
|
|
@@ -1216,7 +1314,7 @@ function renderTagTable(stats) {
|
|
|
1216
1314
|
'<tr class="clickable" onclick="showTagDetail(\'' + escHtml(t.tag).replace(/'/g, "\\'") + '\')">' +
|
|
1217
1315
|
'<td><span class="tag-pill">' + escHtml(t.tag) + '</span></td>' +
|
|
1218
1316
|
'<td>' + fmtDuration(t.total_duration_ms) + '</td>' +
|
|
1219
|
-
'<td><span class="badge badge-cost">' +
|
|
1317
|
+
'<td><span class="badge badge-cost">' + fmtMetric(t.total_cost_usd, t.total_tokens) + '</span></td>' +
|
|
1220
1318
|
'<td>' + fmtNum(t.human_interventions) + '</td>' +
|
|
1221
1319
|
'<td title="' + fmtAbsolute(t.last_seen) + '">' + fmtRelative(t.last_seen) + '</td>' +
|
|
1222
1320
|
'</tr>'
|
|
@@ -1357,30 +1455,54 @@ async function showSession(id, returnTo) {
|
|
|
1357
1455
|
document.getElementById('session-detail-stats').innerHTML = '<div class="stat-card" style="grid-column:1/-1"><div class="label">Loading...</div></div>';
|
|
1358
1456
|
document.getElementById('session-detail-turns').innerHTML = '';
|
|
1359
1457
|
|
|
1360
|
-
const [session, turns] = await Promise.all([
|
|
1458
|
+
const [session, turns, subagents] = await Promise.all([
|
|
1361
1459
|
fetchJson('/api/sessions/' + id),
|
|
1362
1460
|
fetchJson('/api/sessions/' + id + '/turns'),
|
|
1461
|
+
fetchJson('/api/sessions/' + id + '/subagents').catch(() => []),
|
|
1363
1462
|
]);
|
|
1364
1463
|
|
|
1365
|
-
|
|
1464
|
+
const stats = [
|
|
1366
1465
|
{ label: 'Session ID', value: '<span class="session-id" onclick="copyText(\'' + session.id + '\')" title="Click to copy">' + shortId(session.id) + ' <span class="copy-icon">⎘</span></span>' },
|
|
1367
1466
|
{ label: 'Project', value: '<span title="' + escHtml(session.project_path ?? '') + '">' + escHtml(basename(session.project_path)) + '</span>' },
|
|
1368
1467
|
{ label: 'Model', value: '<span style="font-family:var(--mono);font-size:13px">' + escHtml(session.model ?? '\u2014') + '</span>' },
|
|
1369
1468
|
{ label: 'Duration', value: fmtDuration(session.total_duration_ms) },
|
|
1370
|
-
{ label: '
|
|
1469
|
+
{ label: 'Prompts', value: session.user_turns ?? session.total_turns },
|
|
1371
1470
|
{ label: 'Input Tokens', value: fmtNum(session.total_input_tokens) },
|
|
1372
1471
|
{ label: 'Output Tokens', value: fmtNum(session.total_output_tokens) },
|
|
1373
1472
|
{ label: 'Cost', value: fmtCost(session.total_cost_usd) },
|
|
1374
|
-
]
|
|
1473
|
+
];
|
|
1474
|
+
if (subagents.length > 0) {
|
|
1475
|
+
stats.push({ label: 'Agents', value: String(subagents.length) });
|
|
1476
|
+
}
|
|
1477
|
+
document.getElementById('session-detail-stats').innerHTML = stats.map(c =>
|
|
1375
1478
|
'<div class="stat-card"><div class="label">' + c.label + '</div><div class="value" style="font-size:14px">' + c.value + '</div></div>'
|
|
1376
1479
|
).join('');
|
|
1377
1480
|
|
|
1378
1481
|
const turnsDiv = document.getElementById('session-detail-turns');
|
|
1379
|
-
|
|
1482
|
+
let html = '';
|
|
1483
|
+
|
|
1484
|
+
if (subagents.length > 0) {
|
|
1485
|
+
html += '<div style="margin-bottom:16px"><h3 style="font-size:13px;color:var(--text-dim);margin:0 0 8px">Agent Sub-Sessions</h3>' +
|
|
1486
|
+
'<table class="data-table" style="width:100%"><thead><tr>' +
|
|
1487
|
+
'<th>Agent Type</th><th>Duration</th><th>Turns</th><th>Started</th>' +
|
|
1488
|
+
'</tr></thead><tbody>' +
|
|
1489
|
+
subagents.map(s =>
|
|
1490
|
+
'<tr class="clickable" onclick="showSession(\'' + s.id + '\', \'sessions\')">' +
|
|
1491
|
+
'<td><span class="tag-pill">' + escHtml(s.agent_type ?? 'unknown') + '</span></td>' +
|
|
1492
|
+
'<td>' + fmtDuration(s.total_duration_ms) + '</td>' +
|
|
1493
|
+
'<td>' + (s.total_turns ?? 0) + '</td>' +
|
|
1494
|
+
'<td title="' + fmtAbsolute(s.started_at) + '">' + fmtRelative(s.started_at) + '</td>' +
|
|
1495
|
+
'</tr>'
|
|
1496
|
+
).join('') +
|
|
1497
|
+
'</tbody></table></div>';
|
|
1498
|
+
}
|
|
1499
|
+
|
|
1500
|
+
if (!turns.length && !subagents.length) {
|
|
1380
1501
|
turnsDiv.innerHTML = '<div class="empty">No turns recorded.</div>';
|
|
1381
1502
|
return;
|
|
1382
1503
|
}
|
|
1383
|
-
|
|
1504
|
+
html += turns.map((t, i) => renderTurnHtml(t, 'tc-' + i)).join('');
|
|
1505
|
+
turnsDiv.innerHTML = html;
|
|
1384
1506
|
}
|
|
1385
1507
|
|
|
1386
1508
|
// ── Shared turn rendering ──
|
|
@@ -1511,8 +1633,8 @@ function renderSessionsTable(sessions) {
|
|
|
1511
1633
|
'<td' + projAttr + '>' + escHtml(proj) + '</td>' +
|
|
1512
1634
|
'<td title="' + fmtAbsolute(s.started_at) + '">' + fmtRelative(s.started_at) + '</td>' +
|
|
1513
1635
|
'<td>' + fmtDuration(s.total_duration_ms) + '</td>' +
|
|
1514
|
-
'<td>' + (s.total_turns ?? 0) + '</td>' +
|
|
1515
|
-
'<td><span class="badge badge-cost">' +
|
|
1636
|
+
'<td>' + (s.user_turns ?? s.total_turns ?? 0) + '</td>' +
|
|
1637
|
+
'<td><span class="badge badge-cost">' + fmtMetric(s.total_cost_usd, (s.total_input_tokens || 0) + (s.total_output_tokens || 0) + (s.total_cache_read_tokens || 0)) + '</span></td>' +
|
|
1516
1638
|
'<td style="font-family:var(--mono);font-size:11px;color:var(--text-dim)">' + escHtml(s.model ?? '\u2014') + '</td>' +
|
|
1517
1639
|
'</tr>';
|
|
1518
1640
|
}).join('');
|
package/dist/hooks/server.js
CHANGED
|
@@ -185,6 +185,12 @@ function handleApiRoute(url, repo, res) {
|
|
|
185
185
|
sendJson(res, 200, turns);
|
|
186
186
|
return;
|
|
187
187
|
}
|
|
188
|
+
const subagentsMatch = path.match(/^\/api\/sessions\/([^/]+)\/subagents$/);
|
|
189
|
+
if (subagentsMatch) {
|
|
190
|
+
const subs = repo.getSubSessions(subagentsMatch[1]);
|
|
191
|
+
sendJson(res, 200, subs);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
188
194
|
if (path === "/api/metrics/tokens") {
|
|
189
195
|
const { from, to, stepSeconds } = parseTimeRange(url);
|
|
190
196
|
sendJson(res, 200, repo.getTokenTimeSeries(from, to, stepSeconds));
|