Skip to content

Conversation

@arsham
Copy link

@arsham arsham commented Nov 24, 2025

Token counts only showed up after messages finished, so you had no idea how many tokens were being used until it was done.

Now token usage shows live while streaming:

  • IN↓/OUT↑ format shows what you're sending vs receiving

  • ~X tok estimates appear immediately and update in real-time

  • ~X think shows reasoning token usage separately

  • Tool results are now properly counted when sent back to the API

  • Added sentEstimate and contextEstimate fields to track what's actually being sent

Makes it way easier to keep an eye on token budget instead of being surprised at the end.

Showcase

user-tokens-showcase

Enable token visibility to help users understand API costs and
context window utilization. Display estimated tokens for user
messages and actual output tokens plus cumulative context
percentage for assistant messages. Include context panel toggle.
Display estimated output tokens (~X tok) during assistant
message streaming using character-based estimation
(4 chars = 1 token). Replace estimate with actual count
on completion, with change detection to minimise
message broadcasts.
Add real-time token estimation during streaming with separate
tracking for output (~tok) and reasoning (~think) tokens.
Accumulates estimates across multiple text/reasoning blocks
within a step and across multiple steps (tool calls). Includes
change detection to minimise message broadcasts and clean
transition from estimates to actual counts on completion.
- Add sentEstimate/contextEstimate fields to message schema for
  tracking tokens sent to API
- Extract tool result token calculation to shared helper
- Replace magic number 4 with CHARS_PER_TOKEN semantic constant
- Fix accumulation logic to always include user message tokens
  (not just as fallback)
- Ensure tool result tokens are counted when sent back to API
- Update TUI display to show accurate IN↓/OUT↑ token counts
shuv1337 added a commit to Latitudes-Dev/shuvcode that referenced this pull request Nov 24, 2025
Fix token counting logic to properly account for synthetic and noReply
messages in session totals:

- Account for synthetic content (e.g. skill documentation) in token
  counts by checking ignored flag instead of synthetic flag
- Fix sentEstimate formula to prevent double-counting tool result tokens
- Maintain cumulative session totals for accurate usage tracking
- noReply messages now included in session token calculations

This ensures users see accurate cumulative token usage per session
without exponential growth from double-counting.
@Sewer56
Copy link
Contributor

Sewer56 commented Nov 26, 2025

I like this 👍

@iamhenry
Copy link

looking forward to it!

@modelnova-ai
Copy link

@rekram1-node any plans to include this feature in upcoming releases?

shuv1337 added a commit to Latitudes-Dev/shuvcode that referenced this pull request Nov 30, 2025
…omalyco#4709)

Cherry-pick fix from upstream PR anomalyco#4709 by arsham:
- Use 'ignored' flag instead of 'synthetic' for accurate token counts
- Fix sentEstimate formula to prevent double-counting tool result tokens
- Add null checks in calculateToolResultTokens for safety
- Prevents exponential growth from double-counting in session totals
shuv1337 added a commit to Latitudes-Dev/shuvcode that referenced this pull request Nov 30, 2025
…#4900, anomalyco#4709 fixes

Merged upstream PRs:
- anomalyco#4898: Search in messages (Ctrl+F)
- anomalyco#4791: Bash output viewer with ANSI color support
- anomalyco#4900: Double Ctrl+C to exit
- anomalyco#4709: Token counting fixes for synthetic/noReply messages

Updated README for shuvcode fork project.
shuv1337 added a commit to Latitudes-Dev/shuvcode that referenced this pull request Nov 30, 2025
#65)

* feat(tui): implement search functionality in session view

- Added a search input component to allow users to search through messages.
- Implemented logic to highlight search matches and navigate between them.
- Updated the theme syntax rules to include strikethrough styling.
- Enhanced message rendering to support search highlighting for text and markdown parts.


* feat(tui): add bash output viewer with ANSI color support

Adds an bash output viewer with full ANSI color support. When bash commands
produce more than 20 lines of output, users can click to expand into a
full-screen viewer with syntax highlighting and keyboard navigation.

Key features:
- Full ANSI/VT color rendering using opentui-ansi-vt terminal emulation
- Truncated preview (20 lines) with 'Click to view full output' expansion
- Prompt text preservation when entering/exiting viewer
- Force color output in bash commands (FORCE_COLOR, CLICOLOR, TERM env vars)

Technical changes:
- Added opentui-ansi-vt dependency for terminal buffer rendering
- Added initialValue prop to Prompt component to restore draft text
- Strip ANSI codes for search to match actual text content

* limit to MAX_OUTPUT_LENGTH

* remove ANSI from model output with ptyToText

* use 120 rows for terminal output

* chore: update opentui-ansi-vt to 1.2.7

* feat(tui): add page up/down support to bash output viewer

* fix(tui): improve match navigation and search highlighting

- Refactored match navigation logic to prevent scrolling to the same message when navigating through matches.
- Enhanced search highlighting to correctly identify and highlight query text within code blocks.
- Updated rendering of Assistant messages to include IDs for better scrolling functionality during searches.

* chore(tui-search): Removed active match differenciation, since we cant get it working in Assistant Messages (markdown)

* feat: implement double Ctrl+C to exit functionality with warning toast

* fix: improve token counting for synthetic and noReply messages (PR anomalyco#4709)

Cherry-pick fix from upstream PR anomalyco#4709 by arsham:
- Use 'ignored' flag instead of 'synthetic' for accurate token counts
- Fix sentEstimate formula to prevent double-counting tool result tokens
- Add null checks in calculateToolResultTokens for safety
- Prevents exponential growth from double-counting in session totals

* docs: update README for shuvcode fork

- Add header explaining this is a fork for PR integration testing
- Include table of merged PRs with upstream status
- Preserve original opencode documentation below

* changing sidebar version display to shuvcode
@shuv1337
Copy link
Contributor

shuv1337 commented Dec 6, 2025

@arsham - found a bug in this one while using it in my fork:

the upstream code has:

assistantMessage.finish = "tool-calls"
assistantMessage.time.completed = Date.now()
await Session.updateMessage(assistantMessage)
if (result && part.state.status === "running") {
await Session.updatePart({
...part,
state: {
status: "completed",
// ... rest of completed state
},
} satisfies MessageV2.ToolPart)
}

But your commit 7faa5e2 ("feat: real-time token tracking in TUI") accidentally removed completion handling code when refactoring the subtask execution.

@shuv1337
Copy link
Contributor

shuv1337 commented Dec 6, 2025

The implication of the bug is that custom /commands that have subtask: true set will complete it's task and then spawn another task trying to do the same thing, over and over until manual intervention

shuv1337 added a commit to Latitudes-Dev/shuvcode that referenced this pull request Dec 11, 2025
This merge brings upstream changes while preserving fork-specific features:

Preserved fork features:
- PR anomalyco#4898: Search in messages (Ctrl+F)
- PR anomalyco#4791: Bash output with ANSI colors
- PR anomalyco#4900: Double Ctrl+C to exit
- PR anomalyco#4709: Live token usage during streaming
- PR anomalyco#4865: Subagents sidebar with clickable navigation
- PR anomalyco#4515: Show plugins in /status
- Fork-only: Toggle session header visibility

Resolved conflicts:
- Package versions updated to upstream v1.0.149
- Keybind type changes (cmd -> super)
- Desktop context files updated with defensive API checks
- UI components updated for new items prop signature
- input.css/tsx renamed to text-field.css/tsx

Validation:
- All typechecks pass (12/12 packages)
- All tests pass (281 passed, 1 skipped)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
opencode-agent bot added a commit to Latitudes-Dev/shuvcode that referenced this pull request Dec 18, 2025
Resolved conflicts:
- bun.lock: Regenerated from scratch
- packages/*/package.json: Accept upstream version (1.0.167)
- packages/extensions/zed/extension.toml: Accept upstream version

Upstream changes include:
- Version bump to 1.0.167
- Terminal title toggle feature added to config
- MCP authentication improvements
- Legal pages (privacy policy, terms of service)
- Tauri package updates

Fork features preserved:
- PR anomalyco#4898: Search in messages (Ctrl+F)
- PR anomalyco#4791: ANSI bash output support
- PR anomalyco#4900: Double Ctrl+C to exit
- PR anomalyco#4709: Live token usage during streaming
- PR anomalyco#4865: Subagents sidebar navigation
- PR anomalyco#4515: Show plugins in /status
- PR anomalyco#5508: Cache management commands
- PR #ariane-emory: Granular file permissions
- PR #fork-140: Toggle transparent background
- Desktop features: slash commands, shell mode, themes, branding
opencode-agent bot added a commit to Latitudes-Dev/shuvcode that referenced this pull request Dec 19, 2025
Resolved conflicts:
- script/publish.ts: kept fork version (fork-specific publishing to Latitudes-Dev/shuvcode)

Auto-merged files with upstream improvements:
- packages/opencode/src/cli/cmd/tui/routes/session/index.tsx: new dialog-subagent component
- packages/opencode/src/session/message-v2.ts: improved error handling
- packages/desktop/src/context/global-sync.tsx: added null directory guards

Preserved fork features:
- PR anomalyco#4898: Search in messages (Ctrl+F)
- PR anomalyco#4791: Bash output with ANSI
- PR anomalyco#4900: Double Ctrl+C to exit
- PR anomalyco#4709: Live token usage during streaming
- PR anomalyco#4865: Subagents sidebar with clickable navigation
- PR anomalyco#5508: Cache management command
- Glob permissions feature
- Toggle transparent background
- Desktop slash commands and share functionality
opencode-agent bot added a commit to Latitudes-Dev/shuvcode that referenced this pull request Dec 19, 2025
Resolved conflicts:
- packages/opencode/src/cli/cmd/tui/routes/session/index.tsx: Merged fork search highlighting with upstream user message markdown toggle
- packages/opencode/package.json: Accept upstream v1.0.170, preserved ghostty-opentui dependency
- .github/workflows/generate.yml: Keep fork-specific workflow (better error messaging)
- script/publish.ts: Keep fork-specific publish script (shuvcode registry, contributors)
- packages/extensions/zed/extension.toml: Accept upstream v1.0.170
- All other package.json files: Accept upstream v1.0.170 versions
- bun.lock: Regenerated

Preserved fork features:
- PR anomalyco#4898: Search in messages (Ctrl+F with highlighting)
- PR anomalyco#4791: Bash output with ANSI (ghostty-opentui)
- PR anomalyco#4900: Double Ctrl+C to exit
- PR anomalyco#4709: Live token usage during streaming
- PR anomalyco#4865: Subagents sidebar with clickable navigation
- PR #fork-140: Toggle transparent background
- Fork: Toggle session header visibility
- Fork: Desktop slash commands and shell input mode
- Fork: Desktop Night Owl theme
- Fork: Desktop theme/font pickers and branding
- Fork: Share functionality for shuv.ai
- Fork: Desktop mobile responsiveness
- Fork: Desktop review pane resizing

New upstream feature integrated:
- User message markdown toggle (enable/disable markdown rendering in user messages)
opencode-agent bot added a commit to Latitudes-Dev/shuvcode that referenced this pull request Dec 20, 2025
Resolved conflicts:
- packages/opencode/script/publish.ts: Keep fork-specific publishing (skip Docker), adopt upstream's .cwd() syntax

Added missing dependency:
- ghostty-opentui: Required for PR anomalyco#4791 (Bash output with ANSI) feature

Preserved fork features:
- All fork features from fork-features.json preserved
- PR anomalyco#4791 bash ANSI output
- PR anomalyco#4898 search in messages
- PR anomalyco#4900 double Ctrl+C
- PR anomalyco#4709 live token usage
- PR anomalyco#4865 subagents sidebar
- All desktop/TUI customizations
opencode-agent bot added a commit to Latitudes-Dev/shuvcode that referenced this pull request Dec 20, 2025
Resolved conflicts:
- packages/opencode/script/publish.ts: Keep ours (fork-specific publishing)

Preserved fork features:
- All features from PRs anomalyco#4898, anomalyco#4791, anomalyco#4900, anomalyco#4709, anomalyco#4865, anomalyco#4515, anomalyco#5508
- Glob permissions (#ariane-emory/glob-permissions)
- Toggle transparent background (#fork-140)
- Session header visibility toggle
- Desktop slash commands and shell input mode
- Desktop Night Owl theme
- Desktop theme/font pickers, branding, inline header
- Share functionality for shuv.ai
- All other fork-specific features listed in fork-features.json
opencode-agent bot added a commit to Latitudes-Dev/shuvcode that referenced this pull request Dec 20, 2025
Resolved conflicts:
- bun.lock: regenerated
- packages/opencode/package.json: version 1.0.176-1 (fork suffix)
- packages/desktop/src/context/global-sync.tsx: merged retry() with defensive array check
- packages/desktop/src/context/global-sdk.tsx: merged commented signal with fetch/throwOnError
- packages/desktop/src/pages/layout.tsx: preserved onCleanup import
- Simple version bumps: accepted upstream for all other package.json files

Preserved fork features:
- PR anomalyco#4898: Search in messages
- PR anomalyco#4791: Bash output with ANSI
- PR anomalyco#4900: Double Ctrl+C to exit
- PR anomalyco#4709: Live token usage during streaming
- PR anomalyco#4865: Subagents sidebar with clickable navigation
- PR anomalyco#4515: Show plugins in /status
- PR anomalyco#5508: Cache management command
- PR glob-permissions: Granular file permissions
- PR fork-140: Toggle transparent background
- Desktop slash commands and shell input mode
- Desktop Night Owl theme
- Desktop theme/font pickers, branding, and inline header
- Share functionality for shuv.ai infrastructure
- TUI configurable spinner styles
- TUI layout density for small terminals
opencode-agent bot added a commit to Latitudes-Dev/shuvcode that referenced this pull request Dec 20, 2025
Resolved conflicts:
- Package versions: Accept upstream 1.0.179 versions for all packages
- packages/opencode/package.json: Updated version, preserved fork dependencies
- packages/desktop/src/context/global-sync.tsx: Preserved fork's defensive array check
- packages/desktop/src/pages/layout.tsx: Preserved fork's mobile responsiveness imports
- .github/workflows/publish.yml: Keep fork-specific workflow config
- packages/extensions/zed/extension.toml: Accept upstream version URLs
- bun.lock: Regenerated from clean install

Preserved fork features:
- PR anomalyco#4898: Search in messages
- PR anomalyco#4791: Bash output with ANSI
- PR anomalyco#4900: Double Ctrl+C to exit
- PR anomalyco#4709: Live token usage during streaming
- PR anomalyco#4865: Subagents sidebar with clickable navigation
- PR anomalyco#4515: Show plugins in /status
- PR anomalyco#5508: Cache management command
- PR #ariane-emory/glob-permissions: Granular File Permissions
- PR #fork-140: Toggle transparent background
- Fork-only: Desktop theme/font pickers, branding, mobile responsiveness
- Fork-only: Share functionality for shuv.ai infrastructure
- Fork-only: TUI configurable spinners and layout density
opencode-agent bot added a commit to Latitudes-Dev/shuvcode that referenced this pull request Dec 21, 2025
Resolved conflicts:
- bun.lock: accepted upstream version
- packages/console/*/package.json: accepted upstream versions
- packages/desktop/package.json: accepted upstream version
- packages/enterprise/package.json: accepted upstream version
- packages/extensions/zed/extension.toml: accepted upstream version
- packages/function/package.json: accepted upstream version
- packages/plugin/package.json: accepted upstream version
- packages/sdk/js/package.json: accepted upstream version
- packages/slack/package.json: accepted upstream version
- packages/tauri/package.json: accepted upstream version
- packages/ui/package.json: accepted upstream version
- packages/util/package.json: accepted upstream version
- packages/web/package.json: accepted upstream version
- sdks/vscode/package.json: accepted upstream version
- packages/opencode/package.json: merged (version 1.0.181-1)
- packages/opencode/src/agent/agent.ts: merged fork features (minimatch, resolveFilePermission) with upstream (Log)
- packages/opencode/src/session/prompt.ts: merged fork features (plugin commands) with upstream (Agent.defaultAgent)
- packages/desktop/src/context/layout.tsx: merged fork features (review pane) with upstream (session pane)
- packages/desktop/src/pages/session.tsx: kept fork version (mobile responsiveness, image preview, share commands)

Preserved fork features:
- PR anomalyco#4898: Search in messages
- PR anomalyco#4791: Bash output with ANSI
- PR anomalyco#4900: Double Ctrl+C to exit
- PR anomalyco#4709: Live token usage during streaming
- PR anomalyco#4865: Subagents sidebar
- PR anomalyco#4515: Show plugins in /status
- PR anomalyco#5508: Cache management command
- PR ariane-emory/glob-permissions: Granular file permissions
- PR fork-140: Toggle transparent background
- Desktop theme/font pickers and shuvcode branding
- Desktop review pane resizing and share commands
- Desktop mobile viewport fixes
- Desktop image preview in file viewer
- Shell command cwd fix for new projects
- TUI configurable spinners and layout density
opencode-agent bot added a commit to Latitudes-Dev/shuvcode that referenced this pull request Dec 21, 2025
Resolved conflicts:
- packages/opencode/package.json: Updated to 1.0.182
- packages/opencode/src/agent/agent.ts: Merged upstream logging with fork's resolveFilePermission
- packages/opencode/src/session/prompt.ts: Used upstream's Agent.defaultAgent() with fork's plugin command handling
- packages/desktop/src/context/layout.tsx: Added both session.width (upstream) and review pane (fork)
- packages/desktop/src/pages/session.tsx: Accepted upstream layout, re-added fork's share commands and image preview
- bun.lock: Accepted upstream version
- 16 package.json files: Accepted upstream versions

Preserved fork features:
- PR #ariane-emory/glob-permissions: Granular file permissions with resolveFilePermission()
- PR anomalyco#4709: Live token usage (fork's plugin command handling preserved)
- Desktop review pane resizing
- Desktop share/unshare slash commands
- Desktop image preview in file viewer
- Desktop Night Owl theme integration
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants