Agent session usage from local Claude, Codex, OpenCode, Kilo, Devin CLI and Cursor records: sortable stats, provider charts, cost estimates, and CSV export.
From the plugin's README
Exact install target unavailable. Refresh after the next successful scan.
Git security status and fallback installation are pinned to commit 004c6a80c6aa.
From the plugin's README
paseo plugin add panrafal/paseo-plugins:session-usage
From a checkout on the daemon host (Node 22.13+ for the test runner and node:sqlite):
npm install
npm run typecheck
paseo plugin install /absolute/path/to/paseo-plugins/session-usage
paseo plugin ls
After editing, typecheck and run paseo plugin reload session-usage. Use --host <target> for
another daemon.
README
Adds Session usage to Paseo's sidebar and Command Center. It reads Claude Code and Codex transcripts and the OpenCode, Kilo, Devin CLI, and Cursor session stores on the selected daemon, including archived sessions, subagents, and sessions started outside Paseo, then joins them with Paseo's project, workspace, and agent records. Agents of other providers are listed from Paseo's records with unknown usage. Subscription allowance cards show how much of each provider's limits is used, where the tokens went, and how long the allowance lasts at the current pace.
The sortable table is grouped by workspace by default; choose Sessions under Table grouping for one row per provider session. Choose Columns to show any measurement, press a heading to sort in either direction, and press a session name for all measurements, its tool-call breakdown, and a link to its agent or workspace. Missing values sort last in both directions. The session column stays fixed while the other columns scroll horizontally, on desktop and mobile. The table pages through 40 rows at a time.
Table grouping independently switches between Sessions, provider, project, workspace, label, model, effort, day, week, and month. It preserves the selected metric columns and does not change Compare providers or the calendar. Group rows show metric totals, weighted percentages, session counts, and coverage for partially known measurements. Click a group for all metrics and its member sessions; session details show that member's activity in the group. Sessions with multiple labels appear once in each label group, so label totals can overlap. Unlabeled sessions get their own group. Date/model/effort groups split recorded activity; session span and transcript size remain unknown there because they cannot be divided across those groups. Other groupings sum those lifetime values once per member within each group. Numeric cell backgrounds scale independently per metric across all filtered table rows, including other pages. Zero and unknown values have no tint.
Effort, beside Models, shows the recorded levels for the selected activity (for example,
low or xhigh). A session that changed effort lists each level; sorting uses its highest
recorded level. Details and CSV include effort too. An em dash means effort was not recorded;
provider defaults and current agent settings are not inferred for historical usage.
Subscription allowances, at the top of the page, has a card for each provider that Paseo reports allowance limits for and that has sessions on this host. The cards stay on one line and scroll horizontally when they do not fit. Each limit (for example Claude's session, weekly, and weekly Fable limits) is a narrow column with:
Choosing a bar focuses the whole report on that hour or day and on the provider; for a model-scoped limit such as Fable, it also selects that limit's models. Choosing it again clears the period. The cards always cover every session on the host and ignore the report filters.
Paseo reports reset times but not window lengths, so the length is inferred:
Limits that local records cannot be attributed to (surface-scoped limits, code review, Cursor's model pools) and providers without local token records show a short note instead of a chart. Allowances refresh every five minutes and with Refresh. Provider balances are not shown.
YYYY-MM-DD HH:00; allowance charts set these. The model
filter opens automatically when a chart sets it.
Search matches session metadata, titles, directories, branches, labels, models, and effort.
The provider filter lists only providers with sessions on this host, using the labels from
Paseo's provider settings.
Filter, column, table grouping, and sort choices survive navigation per host until the app restarts.| Category | Measurements |
|---|---|
| Tokens | Total input, uncached input, cache reads, cache writes, Claude 1-hour cache writes, output, reported reasoning/thinking, total input + output, weighted cache hit percentage |
| Calls and messages | Model responses, user messages, assistant messages, model tool calls, explicit tool errors, tool error percentage, named tool-call counts |
| Executions | Codex completed command, MCP, file-change and search events, and their explicit failures, including operations inside an exec call |
| Length and time | User/assistant/tool input/tool output character counts, first/last timestamps, lifetime session span, recorded completed/aborted turn time, transcript bytes, compactions |
| Cost | Explicitly reported USD where present; standard short-context API token cost estimate for known models |
Token categories are normalized. Claude's base input excludes cache reads/writes, so those categories are added to produce total input. Codex's input already includes them, so they are subtracted to obtain uncached input. OpenCode, Kilo, and Devin CLI record uncached input and cache reads/writes separately, like Claude; OpenCode and Kilo record reasoning outside output, so it is added to output. Cache writes include the 1-hour subset. Reasoning is a subset of output and is never added a second time to total tokens. Character counts use Unicode code points, exclude images, and are not estimates of token counts.
Dates filter activity, not session creation. Activity is recorded per UTC hour, model, and effort. A session spanning several days contributes only the buckets selected. Date presets include today and the preceding 6, 29, or 89 UTC calendar days. Unknown-date buckets appear only without date bounds; activity without a recorded hour is included by an hour filter only when the filter covers its whole day. Recorded turn duration is attributed to the completion day. Session span and transcript size always cover the entire file; those two metrics can be charted only by provider or project. Model filters omit activity that cannot be attributed to the selected model, such as initial prompts before a model is recorded.
Unknown is different from zero. An em dash means a measurement is absent. Cards and bars show the number of sessions with that measurement. Aggregates are known subtotals, and averages divide by known sessions. Cache/error percentages use the ratio of sums for sessions with both values. A partially readable session can contribute known values; its badge and details explain the missing coverage. Token totals cannot recover deleted requests or unrecorded usage.
The Base API estimate uses a fixed price table checked on 2026-09-23 against
OpenAI pricing and
Claude pricing.
Each usage record is priced using its recorded model, including separate read/write rates and
Claude's reported 1-hour cache-write rate. Without a recorded cache TTL, writes use the 5-minute
rate. Supported families are listed explicitly in shared/pricing.ts; unknown/private models
(including codex-auto-review and Kilo's kilo-auto/*) remain unpriced. Dated model IDs, router
IDs such as anthropic/claude-sonnet-4.5, and Devin model names with an effort suffix use the
corresponding base model rate. Historical usage is valued at this price snapshot, not historical prices.
This is a standard, short-context API equivalent, not a bill or subscription allowance meter.
It excludes priority/fast processing, long-context and regional premiums, tool fees, negotiated
discounts, tax, and plan charges. It does not infer what you paid for Claude Pro/Max or ChatGPT.
Reported cost is separate. OpenCode and Kilo record a USD cost per message; Claude transcripts
rarely contain the SDK's result.total_cost_usd events, and Codex, Devin CLI, and Cursor record none. The plugin contacts
no pricing or provider account API. Subscription allowances come from Paseo, whose daemon queries
the provider accounts.
| Source | Location |
|---|---|
| Claude | <config dir>/projects/**/*.jsonl, including nested subagents files, for every Claude configuration directory (see below); default $CLAUDE_CONFIG_DIR or ~/.claude |
| Codex | <home>/sessions/**/rollout-*.jsonl and <home>/archived_sessions/**/rollout-*.jsonl for every Codex home (see below); default $CODEX_HOME or ~/.codex |
| OpenCode, Kilo | $XDG_DATA_HOME/opencode/opencode.db and $XDG_DATA_HOME/kilo/kilo.db, default ~/.local/share; only the session, message, and part tables |
| Devin CLI | $XDG_DATA_HOME/devin/cli/sessions.db, default ~/.local/share; only the sessions and message_nodes tables |
| Cursor | $CURSOR_CONFIG_DIR/{acp-sessions/*,chats/*/*}/store.db; without it, both $XDG_CONFIG_HOME/cursor (default ~/.config/cursor) and ~/.cursor; only the meta and blobs tables |
| Paseo | $PASEO_HOME/projects/{projects,workspaces}.json, $PASEO_HOME/agents/*/*.json, and provider labels from $PASEO_HOME/config.json, default ~/.paseo |
| Allowances | Paseo's provider usage report (paseo.providers.listUsage), which the daemon caches for five minutes; only window names, percentages, reset times, and plan labels are kept |
| Index | Written by this plugin: $PASEO_HOME/plugin-data/session-usage/index.sqlite, or $PASEO_SESSION_USAGE_DB |
CLAUDE_CONFIG_DIR or CODEX_HOME in their env (for example claude-work and claude-personal)
each contribute their directory to the scan. Sessions found there are attributed to that provider
ID and label, so the Provider filter and charts separate the accounts. A profile that points at
the daemon's default directory claims it; only those two variables are read from a provider's
environment. Without profiles the daemon's own CLAUDE_CONFIG_DIR / CODEX_HOME defaults apply.node:sqlite; otherwise the scan shows a warning.kilo
ACP provider, comes from the matching agent records; unlinked sessions in the same store use the
ID most linked sessions use, or the store's name.error status, and
compaction parts count as compactions. Child sessions are subagents of their parent session;
archived state follows the store's archive time.gpt-6-astra-medium is gpt-6-astra at medium).
Cache keepalive pings are not user messages. Tool errors use the recorded tool result status.
Turn time, reasoning, and compactions are unknown.cursor-grok-4.6-high-fast is cursor-grok-4.6-fast at high). Tool errors use the recorded
tool result's error or failure output. Stores without a root or messages are skipped unless a
Paseo agent owns them.token_usage_record entries are deduplicated by response ID and are authoritative
once present. Their lifetime counters differ from legacy token_count counters after compaction;
the two counter streams are never summed. Earlier legacy-only sections use positive cumulative
differences, with repeated totals ignored and resets counted as separate segments and flagged.
Legacy response counts mean observed nonzero increments, not necessarily individual API calls.
Explicit token records belonging to another thread are excluded.response_item messages take precedence over mirrored event_msg messages.
Model tool calls and completed execution events are separate metrics: one model exec call
can run several commands. Error detection uses explicit flags/status/exit codes, not a search
for the word “error”. Calls with unstructured or missing outcomes may have unobserved errors.node:sqlite, the cache stays in memory only.paseo plugin add panrafal/paseo-plugins:session-usage
From a checkout on the daemon host (Node 22.13+ for the test runner and node:sqlite):
npm install
npm run typecheck
paseo plugin install /absolute/path/to/paseo-plugins/session-usage
paseo plugin ls
After editing, typecheck and run paseo plugin reload session-usage. Use --host <target> for
another daemon.
npm test --workspace=session-usage
The plugin registers a sidebar surface and a global Command Center action; both registrations are removed on plugin cleanup, and the server index is closed. The UI uses React Native primitives and theme colors. Filters use anchored popovers on desktop and Paseo sheets on compact clients; the statistics table and the allowance cards remain horizontally scrollable.
Regression tests cover provider accounting, SQLite store accounting, custom provider IDs and labels, duplicate events, compaction counters, child metadata, malformed/oversized records, active/archive copies, missing files, metadata joins, changed-file refresh, credential/content exclusion, date/model filters, weighted aggregation, chart totals, effort changes and missing levels, calendar date selection and normalization, leap-year/month boundaries, calendar deselection, table group accounting, overlapping labels, sorting, CSV escaping, hourly buckets and hour filters, index persistence across restarts, version rebuilds, snapshot revisions, allowance window lengths and scopes, token series, pace projection, and chart filters.
Scanned 15 Oct 2026, 12:34 UTC from panrafal/paseo-plugins/session-usage.