After compaction, context token count is unknown until the next LLM
response. Instead of showing stale pre-compaction values or heuristic
estimates, the footer now shows ?/200k.
ContextUsage.tokens and ContextUsage.percent are now number | null
(breaking change). Removed usageTokens, trailingTokens, lastUsageIndex
from ContextUsage (internal details).
Also fixed _checkCompaction() using .find() (first compaction) instead
of getLatestCompactionEntry() (latest), which caused incorrect overflow
detection with multiple compactions.
Closes#1382
rg was only downloaded lazily when the grep tool was invoked, but the
LLM often uses rg directly via the bash tool. Ensure both fd and rg
are downloaded at startup so they are available in PATH for all tools.
fixes#1348
Add pasteToEditor(text) method that pastes text into the editor via
bracketed paste sequences, triggering paste handling (including collapse
for large content). Unlike setEditorText which directly replaces content,
pasteToEditor routes through handleInput on the active editor component.
- Add pasteToEditor to ExtensionUIContext interface
- Add handleInput to EditorComponent interface (was missing, all
concrete implementations already had it)
- Implement in interactive mode via bracketed paste sequence
- Add fallback in RPC mode (delegates to setEditorText)
- Document in extensions.md
* fix(coding-agent): update test model from opus-4-5 to opus-4-6
* fix(coding-agent): delegate onEscape/onCtrlD/onPasteImage to defaultEditor
When an extension provides a custom editor via setEditorComponent(),
onEscape, onCtrlD, and onPasteImage were copied by value from
defaultEditor. Later, when retry/compaction/branch-summary temporarily
swapped defaultEditor.onEscape to an abort handler, the custom editor
still held the stale reference, so pressing Escape during retry did
nothing.
Use closures that delegate to defaultEditor at call time, matching the
pattern from f1b1d54 which fixed the same issue for onExtensionShortcut.
setupAutocomplete only sets the provider on defaultEditor. When an
extension customizes the editor via setEditorComponent during
session_start, the custom editor is created before setupAutocomplete
runs, so it never receives the autocomplete provider. This breaks forced
file suggestions, slash commands, and all other completions.
Set the provider on the active editor too when it differs from the
default, covering initial load, reload, and settings changes.
prompt() computed currentImages but never passed them to _queueSteer()
or _queueFollowUp() in the streaming branch. Both methods only accepted
text and built content as [{ type: 'text', text }], dropping images.
- _queueSteer/_queueFollowUp now accept optional ImageContent[]
- streaming branch in prompt() passes currentImages through
- public steer()/followUp() accept and forward optional images
- RPC types, handler, and client updated for steer/follow_up images
- rpc.md: document images on steer/follow_up, fix ImageContent examples
feat(coding-agent): add resume as configurable keybinding action
Allow users to bind a key to open the session resume selector, matching the pattern of newSession, tree, and fork actions.
Adds Terminal.prepareForExit() to disable Kitty protocol and wait for
in-flight release events before fully stopping. This prevents escape
sequences from leaking to the parent shell over slow SSH connections.
Fixes#1204
Added functionality to detect the installation method (bun-binary, npm, pnpm, yarn, bun, unknown) and provide corresponding update instructions for the package. This enhances user experience by guiding them on how to update the package based on their environment.
- Remove height change detection (only width changes trigger full redraw)
- Change clearOnShrink default to false (use PI_CLEAR_ON_SHRINK=1 to enable)
- Fix viewport check to use previousLines.length instead of maxLinesRendered
(prevents false positive redraws when appending lines after content shrunk)
- Add clearOnShrink setting to /settings in coding-agent
- Remove line truncation in custom message component (always show full content)
Do not overwrite editor text with the rewound user message after
navigateTree completes if the user has already typed something during
the summarization wait. Applies to both the /tree selector and the
extension-driven navigateTree handler.
docs: update changelog for PR #1169
Adds Ctrl+N toggle to filter sessions by named-only vs all in the /resume picker.
- Add NameFilter type and filtering logic to session-selector-search.ts
- Add toggleSessionNamedFilter app keybinding (default: ctrl+n)
- Show Name: All/Named state in header
- Empty state mentions toggle keybinding as escape hatch
- Export hasSessionName() to avoid duplication
Co-authored-by: warren <warren.winter@gmail.com>
* fix(coding-agent): tree selector focuses nearest visible ancestor
When the selected entry is not visible (filtered out by mode change or a
metadata entry like model_change), walk up the parent chain to find the
nearest visible ancestor instead of jumping to the last item.
Fixes selection behavior for:
- Initial selection when currentLeafId is a metadata entry
- Filter switching, e.g. Ctrl+U for user-only mode
* fix(coding-agent): tree selector preserves selection through empty filters
When switching to a filter with no results, e.g. labeled-only with no
labels and back, the cursor would reset to the first message instead of
the original selection.
Track lastSelectedId as a class member and only update it when
filteredNodes is non-empty, preserving the selection across empty filter
results.
* test(coding-agent): add tree selector filter and selection tests
- Test metadata entry handling (model_change, thinking_level_change)
- Test filter switching with parent traversal (default ↔ user-only)
- Test empty filter preservation (labeled-only with no labels)
Adds 'Threaded' as a new sort mode (now default) that displays sessions
in a tree structure based on parent-child relationships. Compact one-line
format with message count and age right-aligned for clean title alignment.
Closes#1108
Adds 'Threaded' as a new sort mode (now default) that displays sessions
in a tree structure based on parent-child relationships. Compact one-line
format with message count and age right-aligned for clean title alignment.
Closes#1108
- Add --error-on-warnings to biome check in root and web-ui package.json
- Convert string concatenation to template literals in daxnuts.ts
- Convert string concatenation to template literals in test file
Fixes#1103
- One line per session instead of multi-line (message + metadata + blank)
- Age shown in compact format (now, 5m, 2h, 3d, 2w, 1mo, 1y)
- Message count on the left side
- Current session highlighted in accent color
- Selected row has background highlight
- Increased maxVisible from 5 to 10 sessions
Adds 'Threaded' as a new sort mode (now default) that displays sessions
in a tree structure based on parent-child relationships. The tree is
sorted by root session's modified date. Other sort modes (Recent, Fuzzy)
continue to show flat lists.
Sort mode cycles: Threaded -> Recent -> Fuzzy -> Threaded