Add per-session claude token/cost usage panel (WSL, v1)
Reads ~/.claude/projects/*.jsonl transcripts from the open WSL panes'
distros and shows per-session token counts + estimated USD cost, with a
running total in the titlebar.
Backend (src-tauri/src/usage.rs): new get_claude_usage command. For each
distro it probes $HOME once via wsl.exe, reaches the transcripts over the
\\wsl.localhost UNC share, and tallies message.usage per model per
session (summed by each line's model, since a session can switch models).
Results cached by (path,size,mtime) so polling only re-parses the file
that grew; recency-capped (30d / 50 sessions) to bound scan cost.
Windows-only; returns [] elsewhere. quiet_command made pub(crate).
Frontend: src/lib/usage.ts holds the pricing table (per-MTok rates,
matched by model-family substring) + cost/format helpers, so rates are
editable without recompiling Rust. UsagePanel.tsx mirrors the MCP panel
modal; rows whose transcript cwd matches an open pane are highlighted
with a [pane: label] tag. App polls every 20s (visible windows) for the
titlebar 💰 total and every 5s while the panel is open. Ctrl+Shift+U
opens it; added to shortcuts.ts + regenerated README.
tsc clean. Rust builds on the Windows host; needs runtime verification.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
a6d3f8a9f9
commit
1df8c3181b
10 changed files with 813 additions and 2 deletions
28
src/ipc.ts
28
src/ipc.ts
|
|
@ -39,6 +39,34 @@ export interface SshHost {
|
|||
|
||||
export const listDistros = (): Promise<string[]> => invoke("list_distros");
|
||||
|
||||
// ---- claude usage tracking ------------------------------------------------
|
||||
|
||||
/** Per-model token tally within one claude session. Mirrors Rust ModelUsage. */
|
||||
export interface ModelUsage {
|
||||
model: string;
|
||||
inputTokens: number;
|
||||
outputTokens: number;
|
||||
cacheCreationTokens: number;
|
||||
cacheReadTokens: number;
|
||||
}
|
||||
|
||||
/** One claude session's usage, read from its transcript. Mirrors Rust
|
||||
* SessionUsage. Cost is computed frontend-side (see src/lib/usage.ts). */
|
||||
export interface SessionUsage {
|
||||
sessionId: string;
|
||||
cwd: string;
|
||||
projectDir: string;
|
||||
distro: string;
|
||||
lastActiveMs: number;
|
||||
models: ModelUsage[];
|
||||
}
|
||||
|
||||
/** Scan ~/.claude/projects in the given WSL distros (distinct distros of
|
||||
* open WSL panes) and return recent sessions' token tallies. WSL/Windows
|
||||
* only — returns [] otherwise. */
|
||||
export const getClaudeUsage = (distros: string[]): Promise<SessionUsage[]> =>
|
||||
invoke("get_claude_usage", { distros });
|
||||
|
||||
export const spawnPane = (args: {
|
||||
spec: SpawnSpec;
|
||||
cols: number;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue