Commit graph

118 commits

Author SHA1 Message Date
AgentSeal
79e67f0bc9
Add OMP provider support and model alias mapping
- Add OMP provider reading from ~/.omp/agent/sessions (same JSONL
  format as Pi, shared parser)
- Parameterize discoverSessionsInDir with provider name so sessions
  carry correct provider field
- Add BUILTIN_ALIASES for proxy model name variants (anthropic--claude-*
  double-dash format) that don't match LiteLLM keys
- Add model-alias CLI command for user-defined name mappings
- Wire setModelAliases into preAction after config load
- Add modelAliases field to CodeburnConfig
- Update README: OMP in provider table, model-alias section
2026-04-16 23:35:46 +02:00
AgentSeal
b0d7a8b678
Merge pull request #57 from Galeas/main
fix: respect SwiftBar settings when installing the menu bar
2026-04-16 22:10:21 +02:00
AgentSeal
bd90d9c412
Merge pull request #58 from mallek/fix/claude-opus-4-7-model-mapping
fix: add claude-opus-4-7 model mapping and pricing
2026-04-16 22:04:49 +02:00
Travis Haley
634a8f11ab fix: add claude-opus-4-7 model mapping and pricing 2026-04-16 13:48:58 -06:00
akki
9b6a9e8fc3 fix: respect SwiftBar settings when installing the menu bar 2026-04-16 22:39:51 +03:00
AgentSeal
b1818263cc
Merge pull request #54 from AgentSeal/chore/0.6.0-release
chore: release 0.6.0
2026-04-16 19:30:43 +02:00
AgentSeal
6258d01b2f chore: release 0.6.0 -- Copilot provider, All Time, avg/s, Top Sessions
Release notes cover the two merged PRs:

- #44: GitHub Copilot provider parsing ~/.copilot/session-state/ with
  model tracking via session.model_change events. Adds fallback pricing
  for six gpt/o3/o4 models. Copilot logs only output tokens, so cost
  rows sit below actual API cost; documented in README and CHANGELOG.
- #51: All Time period (key 5, -p all), avg/s column in By Project,
  and a new Top Sessions panel showing the five most expensive sessions
  across all projects.

README: provider list updated (Copilot added, output-tokens-only caveat
alongside Cursor's Auto-mode estimation note), usage examples include
`-p all` and key `5`, provider filter list includes `copilot`.

CHANGELOG: 0.6.0 entry lists both features with contributor credits,
plus two fixes (longest-key-first model display sort and empty
firstTimestamp placeholder).

114 tests pass. Build succeeds at 132KB.
2026-04-16 10:18:14 -07:00
AgentSeal
1e01020ee9
Merge pull request #44 from theodorosD/feat/copilot-provider
feat: add GitHub Copilot provider
2026-04-16 19:02:57 +02:00
AgentSeal
e228903d68
Merge pull request #51 from lfl1337/feat/power-user-stats
feat: All Time period, avg/s per project, Top Sessions panel
2026-04-16 18:54:30 +02:00
Teo Delis
e7633d932b fix: address PR review feedback on Copilot provider
- init currentModel to '' and skip assistant messages before first
  session.model_change to avoid silent misattribution
- add comment documenting why inputTokens is always 0
- fix delete_file tool mapping ('Edit' -> 'Delete')
- add schema doc comment to ToolRequest optional fields
- remove catch-all from CopilotEvent union for proper TS narrowing
- add tests: pre-model-change skip, workspace.yaml quote/comment strip,
  longest-prefix model display name match
2026-04-16 19:30:08 +03:00
Ninym
0461193819 fix: handle empty firstTimestamp in TopSessions, add dashboard tests
- TopSessions: show '----------' placeholder when session.firstTimestamp
  is empty (Copilot provider yields '' when timestamp is missing)
- DashboardContent: add comment explaining undefined days tri-state
- tests/dashboard.test.ts: cover top-5 selection (fewer than 5 sessions,
  tied costs, descending sort) and avg/s returning '-' for zero sessions

Authored-by: AgentSeal <hello@agentseal.org>
2026-04-16 15:48:24 +02:00
Teo Delis
a8517d3235 feat: add GitHub Copilot provider
- Parse ~/.copilot/session-state/*/events.jsonl
- Track model via session.model_change events
- Extract tools from assistant.message toolRequests
- Add fallback pricing for gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, gpt-5-mini, o3, o4-mini
- Factory function createCopilotProvider(sessionStateDir?) for testability
- Typed event variants (ModelChangeData, UserMessageData, AssistantMessageData)
- bashCommands: [] in yield (Copilot does not log bash commands)
- 13 tests covering parsing, model tracking, tool extraction, dedup, discoverSessions
- Note: only outputTokens available (Copilot does not log input tokens)
2026-04-16 15:40:22 +03:00
Ninym
cfd046a95c feat: add All Time period, avg/s per project, and Top Sessions panel
- Add 'all' period (key 5) to dashboard showing data from all time
- Daily Activity panel shows all available days when All Time is active
- Add avg cost per session column to Project breakdown
- Add Top Sessions panel highlighting the 5 most expensive sessions
2026-04-16 13:14:34 +02:00
AgentSeal
9794b5450a 0.5.7 2026-04-16 02:21:48 -07:00
AgentSeal
22b096a841 docs: add reading-the-dashboard guide to README
Lists common signals in the dashboard (cache hit, retry rate,
model mix, tool patterns) and what each typically means.
Points readers toward interpreting their own data without
overpromising automatic diagnosis.
2026-04-16 02:15:19 -07:00
AgentSeal
55d82a4526 Merge branch 'feat/pi-provider' 2026-04-16 02:14:53 -07:00
AgentSeal
5e095bf86e chore: polish Pi provider integration
- Add Pi entry to PROVIDER_COLORS (pink) and PROVIDER_DISPLAY_NAMES.
- Update README with Pi in supported providers, requirements,
  command examples, and the data-format section.
2026-04-16 02:11:48 -07:00
AgentSeal
1a101b586c chore: map Pi dispatch_agent to Agent for activity classification
dispatch_agent is Pi's delegation tool. Mapping it to Agent makes
the classifier route those turns into the Delegation category
instead of Conversation, matching the existing semantics for the
task tool.
2026-04-16 02:08:07 -07:00
AgentSeal
97c0869763 chore: hoist Pi model sort + cover bash-utils edge cases
- Move modelDisplayEntries sort to module scope so it runs once
  instead of on every modelDisplayName call.
- Add bash-utils tests for the env var prefix and true/false
  skip behaviors that came in with the Pi commit.

Verified Pi token semantics against real session data:
input + cacheRead + cacheWrite + output equals totalTokens
exactly, confirming Anthropic-style accounting (cached tokens
disjoint from input). No double-counting.
2026-04-16 02:02:32 -07:00
AgentSeal
d92d5b3f26 chore: normalize Pi tool names via toolNameMap
Maps Pi's lowercase tool names (bash, read, edit, write...) to
the capitalized form used by every other provider, so the
dashboard shows consistent tool names across providers and the
activity classifier works without extra lowercase entries.

Reverts the lowercase additions to classifier.ts since the
provider now normalizes tool names at the source.
2026-04-16 01:57:39 -07:00
Damian Jackson
7ac512a7e4 feat: add Pi provider for tracking Pi agent sessions
- Adds support for Pi (pi.ai) as a new session provider.
- Pi sessions are stored as JSONL files under `~/.pi/agent/sessions/<project-dir>/` and use OpenAI-compatible model IDs (gpt-5, gpt-5.4, gpt-4o, etc.).

- `src/providers/pi.ts` (new): Pi provider - discovers JSONL session files, parses assistant turns, extracts token counts, tool calls, and bash commands, deduplicates via response ID with line-index fallback
- `src/providers/types.ts`: added bashCommands field to `ParsedProviderCall` so all providers carry extracted bash command lists
- `src/providers/index.ts`: registered Pi as a core provider alongside Claude and Codex
- `src/providers/codex.ts`, `cursor.ts`: added `bashCommands: []` to satisfy the new required field on `ParsedProviderCall`
- `src/parser.ts`: fixed bug where `providerCallToTurn` always emitted an empty bashCommands array instead of passing through the parsed commands
- `src/classifier.ts`: added lowercase tool name variants (bash, edit, read, write) to match Pi's tool naming convention in JSONL output
- `src/bash-utils.ts`: exclude `true`, `false`, and shell variable assignments from extracted commands; scan past leading `NAME=val` tokens so `FOO=bar ls` correctly records `ls` rather than being dropped
- `package.json`: added pi to keywords
- `tests/providers/pi.test.ts` (new): 16 unit tests covering session discovery, multi-turn parsing, tool/bash extraction, deduplication, zero-token filtering, and display name mapping
- `tests/provider-registry.test.ts`: updated core provider list to include pi

- [X] Unit tests pass (`npx vitest run`, 56 tests across 6 files);
- [X] Manually verified via `npx tsx src/cli.ts` report and showing Pi sessions alongside Claude and Codex in the dashboard.
2026-04-16 01:54:42 -07:00
AgentSeal
e2b8632d2c 0.5.6 2026-04-16 01:51:04 -07:00
AgentSeal
45572e43f2 feat: cache hit % per model + correct calculation
Adds a cache hit percentage column to the By Model panel and
fixes the cache hit math in the Overview panel. Both were
treating cache_creation tokens as cache hits, when they are
actually cache misses being written to cache for future use.

The corrected formula counts both fresh input and cache writes
in the denominator, so a heavy Claude Code session now shows
~97% cache hit instead of the misleading 100%.

Also extracts column widths into named constants per CLAUDE.md
no-magic-numbers rule, and tightens the model name column to a
fixed 14 chars so columns hug the name like the Activity panel.
2026-04-16 01:50:19 -07:00
AgentSeal
4bbad76d06 0.5.5 2026-04-16 01:25:51 -07:00
AgentSeal
9a45470674 0.5.4 2026-04-16 01:25:32 -07:00
AgentSeal
e12b8e31d7 fix: load all 2,659 LiteLLM models, not just 192
The pricing fetcher was filtering out every model name containing
'/' or '.', which discarded provider-prefixed entries like
'anthropic/claude-opus-4-6' and version-suffixed ones like
'gemini-2.0-flash-001'. That dropped 93% of LiteLLM's catalog
(2,467 of 2,659 models), leaving most non-Anthropic models
priced at $0.

Now we load every entry and additionally index each one under its
stripped name so 'claude-opus-4-6' resolves whether or not the
caller includes the provider prefix.
2026-04-16 01:25:15 -07:00
AgentSeal
897005dac8 0.5.3 2026-04-16 01:04:01 -07:00
AgentSeal
fc99087e3a
Merge pull request #28 from chmsant/feat/menubar-30day-window
feat: add rolling 30-day window to menubar status
2026-04-16 09:53:57 +02:00
Christopher Sant
5cdcd2c2ee feat: add rolling 30-day window to menubar status
Add a '30 Days' section to the menubar format output, positioned between
'7 Days' and 'Month' to match the tab order in the interactive report.

The rolling 30-day date range logic already existed (used by report and
export commands) - this wires it into the status menubar renderer.

Both 30 Days (rolling window) and Month (calendar month) are shown,
giving useful context early in the month when the calendar month total
is nearly empty.
2026-04-15 21:48:20 -07:00
AgentSeal
475ab0da61 fix: case-insensitive Codex originator check
Codex Desktop on Windows uses "Codex Desktop" as the originator
string instead of "codex_cli" or "codex_vscode". The startsWith
check was case-sensitive, rejecting these sessions silently.

Fixes #1 (comment by @JiglioNero).
2026-04-15 16:06:28 -07:00
AgentSeal
7c7ab32865 0.5.2 2026-04-15 14:29:59 -07:00
AgentSeal
13acaa6d45 0.5.1 2026-04-15 14:29:41 -07:00
AgentSeal
e7e8273bb4 docs: add OpenCode to README 2026-04-15 14:28:49 -07:00
AgentSeal
2d114d9393 feat: add OpenCode provider
Reads session data from OpenCode's SQLite databases at
~/.local/share/opencode/. Reuses the existing better-sqlite3
adapter (same as Cursor), lazy-loaded so users without OpenCode
see no difference. Adds bashCommands to the provider interface
so shell command breakdowns work across all providers.

31 tests, schema validation, diagnostic stderr on failures.
Also fixes a pre-existing tsc error in currency.ts.
2026-04-15 14:24:37 -07:00
AgentSeal
3612c5a994 v0.5.0: Cursor IDE support, SQLite adapter, result caching
Major release adding Cursor as the third supported provider.
Lazy-loaded SQLite, file-based result cache, provider-specific
dashboard layouts, debounced period switching, broader classifier.
2026-04-15 05:48:22 -07:00
AgentSeal
0d1a51ed3c docs: add Cursor to README, repo description, and topics
- Cursor listed as supported provider with data location and caveats
- Auto mode pricing estimation explained
- Languages panel and cache behavior documented
- Project structure updated with new files
- Repo description and topics updated on GitHub
2026-04-15 05:46:25 -07:00
AgentSeal
2afab5f71a fix: final review cleanup
- Remove unused vi import from cursor test
- Move LANG_DISPLAY_NAMES to module scope (was re-created per render)
- Remove redundant 'script' regex (scrip?t already covers it)
- Unexport getDbFingerprint (internal to cache module)
- Move beforeEach inside describe block (only cursor tests need it)
2026-04-15 05:35:11 -07:00
AgentSeal
94762ca1f4 fix: address review findings before merge
- getProvider() now async, eliminates race condition with cursor loading
- cursor:edit pseudo-tool prevents inflating Claude's Edit count in --provider all
- Tightened SCRIPT_PATTERNS to avoid false positives (run requires file context)
- Removed duplicated LANG_NAMES from cursor.ts (dashboard handles display)
- Test no longer assumes cursor always loads (CI-safe)
- Removed unnecessary type assertion and setTimeout yield
2026-04-15 05:31:51 -07:00
AgentSeal
91edd6f14a chore: remove 120-day period, shrink Cursor lookback to 35 days
120 days was for testing. Max dashboard period is 30 days, so
Cursor SQL lookback is now 35 days (30 + margin for This Month).
Smaller scan window = faster cold starts, smaller cache file.
2026-04-15 05:24:34 -07:00
AgentSeal
3fabc105d8 perf: file-based result cache for Cursor DB
First run parses the 21GB DB (slow, ~40-80s). Writes parsed
results to ~/.cache/codeburn/cursor-results.json. Subsequent
runs check DB mtime+size -- if unchanged, load from cache
(instant). Cache auto-invalidates when Cursor modifies the DB.
2026-04-15 05:11:30 -07:00
AgentSeal
6ba3691d24 fix: broader activity classification for informal messages
- File extension patterns (.py, .json, .ts, etc.) trigger Coding
- Script/API keywords (run, script, api, query, etc.) trigger Coding
- URL patterns trigger Exploration
- HTTP status codes (404, 500) trigger Debugging
- "make a/me/the" and "write a/me/the" trigger Feature Dev
- Catches informal Cursor messages that missed strict patterns
2026-04-15 05:03:15 -07:00
AgentSeal
4597cbbd16 fix: combine user + assistant text for better activity classification 2026-04-15 05:00:39 -07:00
AgentSeal
effe5b2438 fix: map language IDs to readable names in Languages panel 2026-04-15 04:56:25 -07:00
AgentSeal
caa0464832 fix: strip lang: prefix in Languages panel display 2026-04-15 04:55:01 -07:00
AgentSeal
5c6c266c85 fix: improve Cursor activity classification and language panel
- Fetch actual user messages (type 1 bubbles) for keyword classification
  instead of using assistant response text
- Synthetic Edit tool when codeBlocks present so classifier detects coding
- Languages use lang: prefix to separate from tool classification
- Dashboard filters lang: entries for Languages panel, hides from Core Tools
2026-04-15 04:53:07 -07:00
AgentSeal
d6c6e827ea fix: clean language names, remove diagnostic scripts 2026-04-15 04:49:09 -07:00
AgentSeal
7b23fbb57b fix: pass provider to static dashboard for correct panel titles 2026-04-15 04:48:03 -07:00
AgentSeal
11cdcaa89d feat: activity classification + language breakdown for Cursor
- Extract user text from bubbles for activity classifier
- Extract codeBlocks languageId for programming language breakdown
- Show Languages panel instead of Core Tools/Shell/MCP for Cursor
- Adaptive dashboard layout based on active provider
- 120-day daily activity range for longer periods
2026-04-15 04:46:12 -07:00
AgentSeal
ea5fd90a68 fix: remove incremental cache, always read full lookback window
The incremental cache saved a timestamp watermark but not the parsed
data, so subsequent runs found no new entries and returned empty.
Removed the cache layer entirely -- the 120-day SQL time filter
already limits the scan sufficiently.
2026-04-15 04:34:06 -07:00
AgentSeal
8120f1937f chore: add debug query script 2026-04-15 04:31:06 -07:00