| 2026-07-11 |

tui: activity indicator in a bottom status bar + 1-line input
...
Add an animated "agent is working" indicator so a silent gap (long-running
tool, the pause before the first token, sub-agent reasoning) reads as
"alive" rather than "hung": a braille spinner + phase label that runs on
its own timer, independent of the WebSocket event flow.
- New ActivityIndicator widget (rotating spinner + phase label, colored
status_online), started/stopped from tui_app WS phase transitions
(thinking / responding / planning / running <tool>) and stopped on
stream_end/stopped/error and on connection drop.
- New StatusBar bottom line replaces Textual's Footer: indicator on the
left, dim key-combo summary on the right. One line instead of the menu;
the key bindings themselves stay on the App so the keys still work.
- Input box: TextArea min-height 3 -> 1, so the prompt is one line by
default (auto-resize + max-height 12 unchanged).
Co-Authored-By: Claude <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
13 hours ago
|
| 2026-07-09 |
Navi Code TUI: drop forced line break, keep soft-wrap + Enter to send
...
The forced line break (Ctrl+Enter) never worked: the target terminal does not
distinguish any modifier+Enter from plain Enter — all of Ctrl/Alt/Shift+Enter
arrive as key='enter' character='\r' (verified via a one-off key probe). With
Enter bound to submit, any modifier+Enter newline binding would collide with
submit and is impossible to distinguish in software.
Remove the Ctrl+Enter branch from _PromptInput._on_key. The input stays
multi-line via soft-wrap (TextArea soft_wrap=True) and height: auto growth;
Enter still submits. Placeholder and module docstring updated to drop the
Ctrl+Enter mention and note why a newline key is not wired (revisit later).
Tests: removed test_ctrl_enter_inserts_newline_without_submitting; kept the
multiline-submit and input-grows tests. 576 passed, 1 skipped.
Co-Authored-By: Claude <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|

Navi Code TUI: make the message input multi-line
...
InputBox used textual.widgets.Input, a single-line widget. Swap to TextArea so
the prompt is genuinely multi-line: soft-wrap is on, the field grows with content
(height auto, min 3, max 12, then internal scroll), and Enter no longer collides
with newline insertion.
_PromptInput(TextArea) intercepts keys in _on_key before TextArea's own handler
(which maps enter -> "\n"):
- Enter -> submit: post UserSubmitted(text), then clear the field.
- Ctrl+Enter -> insert a hard line break.
Dropped dead set_prompt_char (referenced a non-existent self._prompt) and the
on_input_* handlers (submit now lives in the subclass). CSS selectors updated
from Input to TextArea. Placeholder notes the keybindings.
Tests: _input.value -> _input.text across the TUI suites; added Ctrl+Enter
inserts a newline without submitting, Enter submits the full multi-line buffer
(newlines preserved) and clears the field, and the input height grows with
content. 577 passed, 1 skipped.
Co-Authored-By: Claude <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
| 2026-06-26 |
Navi Code: stop via Esc + project cwd propagation
...
- TUI: Esc stops active stream cooperatively via POST /sessions/{id}/stop
- TUI: render stream_stopped as status message
- CLI/WebSocket: send shell cwd in client->server message field
- Orchestrator stores cwd in session.session_metadata
- ContextBuilder injects [Working directory] into LLM context
- Agent sets current_working_directory ContextVar per turn
- tools/base: ToolContext gains cwd field
- filesystem/terminal/code_exec resolve relative paths against session cwd
- Add bin/navi-code wrapper for PATH symlink; document in README.md
- Update docs/websocket.md and tests
Full pytest: 544 passed, 1 skipped.
Co-Authored-By: Claude <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
15 days ago
|
Navi Code TUI: fix input box layout, command palette duplicate IDs, status renderer, and WS input loop
...
- clients/terminal/tui/widgets/input_box.py: switch Horizontal to Vertical with width: 100% for Input so it renders and accepts input in real terminals; add refresh on Input.Changed.
- clients/terminal/tui/screens/command_palette.py: remove fixed ListItem IDs to avoid DuplicateIds on fast filter.
- clients/terminal/tui/chat_model.py + renderers/status.py + widgets/chat_panel.py: render backend status events as dim system messages instead of raw dicts.
- clients/terminal/tui/ws_bridge.py: start NaviWebSocketClient.input_loop so enqueued user messages are actually sent to the backend.
- clients/terminal/tui/tui_app.py: focus InputBox synchronously in on_mount so typing works immediately.
- tests/clients/test_tui_app.py: regression test for visible input text.
Co-Authored-By: Claude <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
15 days ago
|
| 2026-06-23 |
Navi Code TUI: apply gnexus theme to widgets and renderers
...
- Register Navi themes as Textual themes so $tui-* CSS variables resolve.
- Update ChatPanel, StatusPanel, InputBox to use palette colors.
- Update all content renderers to draw from the active theme.
- Add set_active_theme/get_active_theme helpers for runtime color access.
Co-Authored-By: Claude <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
18 days ago
|
Navi Code: Phase 3 — Textual TUI skeleton (OpenCode-style)
...
- Add clients/terminal/tui package with micro-architecture:
- events, context, chat_model, ws_bridge, permissions engine.
- widgets: ChatPanel, StatusPanel, InputBox.
- renderers: user/assistant messages, thinking, tool calls, errors,
markdown, plain — registry-based and extensible.
- slash commands: /help, /new, /sessions, /switch, /profile, /thinking,
/compact, /quit — registry-based and extensible.
- Wire navi-code to launch TUI by default; keep click-CLI via --raw.
- Add textual>=0.70 dependency.
- Add TUI smoke tests via Textual Pilot.
- Add docs/plan_navi_code_tui.md with full Phase 4/5 roadmap.
Tests: 463 passed, 1 skipped (excluded unrelated websocket test).
Co-Authored-By: Claude <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
18 days ago
|