CodeNomad/scripts
Pascal André 9cd0b4b901
feat(stats): display service-wide activity statistics (#968)
## Behavior
Preferences gains a **Stats** section covering the **entire connected
OpenCode service**: all projects, independent clones and subsessions.
Every locale states this scope explicitly, because native project IDs
span independent clones and cannot be presented as folder-scoped.

- **Periods:** rolling 7, 30, 90 or 365 days.
- **Figures:** input, output, reasoning and cache tokens; recorded USD
cost; session, subsession, prompt and step counts; a per-model table;
daily activity.
- **Not shown:** transcripts, polling, and provider billing or quota
precision. The Usage label stays reserved for provider subscriptions.

## Boundary
- **Endpoint:** authenticated `GET /api/workspaces/:id/service-usage`
returns native `session.stats` with explicit `scope: "service"`.
  - `tools` is always `none`.
  - Periods are bounded to 366 days.
  - Project, directory and tool selectors are rejected (400).
  - A connection or workspace change during the read fails closed.
- **UI:** an in-memory display snapshot per period. It revalidates on
mount, on settled session events (`session.idle`, `session.deleted`,
prune) and on reconnect.
- **Preferences windows:** the `usage` section is added to the Electron,
Tauri and UI native allowlists.

## Validation
- Server, UI and Electron typechecks pass.
- Backend: `service-usage.test.ts` 3/3.
- Browser: dashboard, Preferences reachability, Preferences window and
startup scenarios, 5/5.
- Unit: `preferences-window.test.ts` 2/2.
- Native: `scripts/test-service-usage-native.mjs` passes on an isolated
copy of OpenCode 2.0.29. It covers a worktree, an unrelated repository
and an independent clone, with synthetic generation and a private
home/database only.

## History
This was originally #796 (8/8). Because the series was stacked, #796 was
squash-merged into the MCP Code Mode branch (#795) rather than `dev`. It
is split out here so it can land on its own. Review fixes are included:
an in-memory cache instead of `localStorage` keyed by non-persistent
workspace IDs, the status-card surface role and spacing tokens.
2026-10-15 15:04:58 +02:00
..
fixtures fix(tauri): prevent macOS startup window event feedback (#821) 2026-10-01 14:58:32 +02:00
missions-child-environment feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
recurring-simple-native feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
winget build: ship the Linux deb from Electron and the Windows installer without a ZIP (#955) 2026-10-14 16:45:49 +02:00
benchmark-session-history.mjs fix(history): fill search pages and remove redundant counting (#839) 2026-10-03 11:36:04 +02:00
build-help.mjs docs(help): multilingual help site with in-app Help menu and palette entry (#859) 2026-10-14 22:44:56 +02:00
bump-version.js Fix bumpVersion script for both npm and tauri 2026-03-31 20:15:16 +01:00
compare-user-html-rendering.mjs fix(chat): display user HTML as literal source (#777) 2026-09-25 09:52:18 +02:00
desktop-server-resources.cjs feat(tauri): signed cross-platform updates with stable and preview feeds (#786) 2026-10-14 12:18:36 +02:00
desktop-server-resources.test.cjs feat(tauri): signed cross-platform updates with stable and preview feeds (#786) 2026-10-14 12:18:36 +02:00
native-fixture-diagnostics.mjs fix(ci): stabilize Windows native tests and artifact comments (#828) 2026-10-02 11:24:27 +02:00
native-fixture-diagnostics.test.mjs fix(ci): stabilize Windows native tests and artifact comments (#828) 2026-10-02 11:24:27 +02:00
native-fixture-guards.mjs feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
native-fixture-guards.test.mjs feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
native-product-fixture.mjs feat(plugins): native package check and update (6/8) (#794) 2026-10-15 02:54:19 +02:00
prepare-node-runtime.cjs feat(opencode): enforce stable runtime support and add managed setup 2026-09-20 16:09:36 +02:00
prepare-node-runtime.test.cjs feat(opencode): enforce stable runtime support and add managed setup 2026-09-20 16:09:36 +02:00
preview-git-history.mjs feat(files): unify Workspace, Changes and Commits with central previews (#797) 2026-10-01 11:10:50 +02:00
profile-outline-projection.mjs perf(ui): skip redundant outline and superseded Markdown work (#852) 2026-10-05 22:32:03 +02:00
profile-outline-responsiveness.mts fix: reduce compaction and cross-session responsiveness stalls 2026-10-02 00:40:45 +02:00
profile-streaming-responsiveness.mjs perf(ui): skip redundant outline and superseded Markdown work (#852) 2026-10-05 22:32:03 +02:00
profile-ui-motion.mjs fix(status): keep connected MCP indicators static at rest (#806) 2026-09-30 14:03:19 +02:00
run-session-pruning-native.mjs fix(ci): stabilize Windows native tests and artifact comments (#828) 2026-10-02 11:24:27 +02:00
smoke-packaged-resources.cjs feat(remote-control): add Remote Control over OpenTunnel alongside direct access (#668) 2026-10-09 12:43:25 +02:00
test-attachment-picker-desktop.mjs feat(composer): unify native device attachments and project references (#729) 2026-09-24 23:12:44 +02:00
test-automation-native.mjs fix(startup): restore saved sessions promptly and stop plugin heartbeat reloads (#712) 2026-09-19 12:39:23 +02:00
test-blank-session-cleanup-native.mjs fix(sessions): preserve populated sessions during automatic cleanup (#755) 2026-09-23 11:53:01 +02:00
test-compaction-isolation-native.mjs fix(pending): stop cold-worktree recovery fallback; qualify OpenCode 2.0.24 (#865) 2026-10-06 23:06:50 +02:00
test-electron-owner-close.mjs fix(electron): avoid destroyed window access on close (#785) 2026-09-28 13:12:07 +02:00
test-git-degraded-native.mjs feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
test-git-init-native.mjs feat(files): initialize Git from the Files panel for plain folders (#933) 2026-10-13 03:11:00 +02:00
test-help-browser.mjs docs(help): multilingual help site with in-app Help menu and palette entry (#859) 2026-10-14 22:44:56 +02:00
test-help.mjs docs(help): multilingual help site with in-app Help menu and palette entry (#859) 2026-10-14 22:44:56 +02:00
test-missions-native-contract.mjs feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
test-missions-native-family-control.mjs feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
test-missions-native-trajectory.mjs feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
test-missions-native.mjs feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
test-native-event-relay.mjs fix: reduce compaction and cross-session responsiveness stalls 2026-10-02 00:40:45 +02:00
test-native-worktree-management.mjs fix(events): prevent relay timeout on worktree discovery waits (#837) 2026-10-03 04:04:03 +02:00
test-opencode-history-migration.mjs fix(opencode): qualify 2.0.15 and preserve generated proxy URLs (#752) 2026-09-23 12:56:03 +02:00
test-opencode-install-native.mjs fix(opencode): share host plugin runtime and require 2.0.27 (#920) 2026-10-12 16:42:07 +02:00
test-opencode-location-native.mjs feat(chat): preserve permission decisions and richer question receipts (#838) 2026-10-03 07:06:03 +02:00
test-opencode-proxy-native.mjs fix(opencode): qualify 2.0.22 and fence parent session creation (#830) 2026-10-02 15:47:14 +02:00
test-opencode-setup-desktop.mjs fix(opencode): retire private runtime fallback and restore first-run setup (#760) 2026-09-24 00:25:40 +02:00
test-opencode-setup-wsl.mjs test(opencode): certify bounded WSL setup and reload effects 2026-09-20 17:21:31 +02:00
test-opencode-upgrade-native.mjs fix(opencode): share host plugin runtime and require 2.0.27 (#920) 2026-10-12 16:42:07 +02:00
test-output-limit-native.mjs chore(opencode): qualify runtime 2.0.29 and align client/plugin pins (#948) 2026-10-14 15:06:35 +02:00
test-panel-extension-native.mjs feat(extensions): add bounded current-session assets for API 2 panels (#874) 2026-10-07 22:54:06 +02:00
test-pending-snapshot-native.mjs fix(pending): stop cold-worktree recovery fallback; qualify OpenCode 2.0.24 (#865) 2026-10-06 23:06:50 +02:00
test-permission-receipts-native.mjs feat(chat): preserve permission decisions and richer question receipts (#838) 2026-10-03 07:06:03 +02:00
test-plugin-packages-native.mjs feat(plugins): native package check and update (6/8) (#794) 2026-10-15 02:54:19 +02:00
test-plugin-runtime-native.mjs fix(opencode): share host plugin runtime and require 2.0.27 (#920) 2026-10-12 16:42:07 +02:00
test-promise-tool-failure-native.mjs chore(opencode): qualify runtime 2.0.29 and align client/plugin pins (#948) 2026-10-14 15:06:35 +02:00
test-prompt-skills-native.mjs feat(composer): native skill attachments (3/8) (#791) 2026-10-02 13:23:42 +02:00
test-provider-account-selection-native.mjs feat(accounts): native account controls and opt-in Codex quota selection (#793) 2026-10-02 17:36:23 +02:00
test-provider-accounts-native.mjs feat(accounts): native account controls and opt-in Codex quota selection (#793) 2026-10-02 17:36:23 +02:00
test-provider-usage-native.mjs fix(usage): use selected native V2 Codex credentials (#811) 2026-09-30 17:29:13 +02:00
test-recurring-simple-native.mjs feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
test-release-workspace-version.mjs fix(release): retain local remote-tunnel dependency after version bumps (#907) 2026-10-10 16:48:17 +02:00
test-render-cost-audit.mjs fix: reduce compaction and cross-session responsiveness stalls 2026-10-02 00:40:45 +02:00
test-service-usage-native.mjs feat(stats): display service-wide activity statistics (#968) 2026-10-15 15:04:58 +02:00
test-session-aside-native.mjs feat(chat): add native /btw side questions 2026-09-21 17:23:11 +02:00
test-session-environment-native.mjs feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
test-session-fork-native.mjs feat(sessions): fork after user and assistant messages (#718) 2026-09-19 21:50:59 +02:00
test-session-history-native.mjs feat(extensions): add bounded current-session assets for API 2 panels (#874) 2026-10-07 22:54:06 +02:00
test-session-interrupt-native.mjs fix(sessions): keep Stop and double Escape from restarting the parent (#770) 2026-09-24 21:54:09 +02:00
test-session-navigation-native.mjs fix(ui): preserve semantic icons for historical timeline tools (#738) 2026-09-21 23:46:51 +02:00
test-session-pruning-native.mjs fix(ci): stabilize Windows native tests and artifact comments (#828) 2026-10-02 11:24:27 +02:00
test-session-pruning-ui.mjs test: stabilize three intermittent CI failures on dev (#941) 2026-10-14 10:58:24 +02:00
test-subagent-depth-settings-native.mjs feat(missions): native project coordination, briefings and tracking (#866) 2026-10-11 14:55:49 +02:00
test-tauri-f6.ps1 test(tauri): fence F6 fixture profiles and post-input liveness 2026-10-08 00:24:06 +02:00
test-tauri-input-deadlock.mjs fix(tauri): prevent Windows input reentrancy deadlocks (#773) 2026-09-24 21:02:20 +02:00
test-tauri-macos-window-result.test.mjs fix(tauri): prevent macOS startup window event feedback (#821) 2026-10-01 14:58:32 +02:00
test-tauri-macos-window.mjs fix(tauri): prevent macOS startup window event feedback (#821) 2026-10-01 14:58:32 +02:00
test-tauri-view-menu.mjs fix(tauri): keep View menus responsive through native focus changes (#748) 2026-09-22 18:18:47 +02:00
test-temporary-workspaces-native.mjs feat: temporary instances that are kept or discarded when closed (#899) 2026-10-09 20:59:13 +02:00
test-websearch-settings-native.mjs feat(settings): scoped web search configuration (4/8) (#792) 2026-10-02 14:49:18 +02:00
test-worktree-families-native.mjs feat(v2): manage session families across worktrees (#649) 2026-09-17 22:57:37 +02:00
verify-bundled-node.cjs build: bundle node runtime for desktop packages 2026-05-04 20:08:04 +01:00