Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/harness-limits.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ click/tap scrolls the transcript so the message is back in view near the top.
|-------|--------|
| **Enter** (composer focused) | Insert a newline (composer is multi-line) |
| **Ctrl+Enter** / **Cmd+Enter** (composer focused) | Send prompt when idle; **enqueue** a follow-up when Busy |
| **↑** / **↓** (composer focused, idle) | **↑** on an empty composer loads the newest user message; further ↑ walk older user rows. **↓** walks forward; ↓ past the newest restores the in-progress draft. Only user messages appear (assistant/thinking/tool/system/error/skill rows never load). Not active while Busy — arrows pass through to the text caret. Ring window only (Load earlier for prompts that have aged out) |
| **↑** / **↓** (composer focused) | **↑** on an empty composer loads the newest user message; further ↑ walk older user rows. **↓** walks forward; ↓ past the newest restores the in-progress draft. Only user messages appear (assistant/thinking/tool/system/error/skill rows never load). Works while Busy. Ring window only (Load earlier for prompts that have aged out) |
| Tab | DOM nav / Clear (canvas uses pointer + dvui focus) |
| Composer focus | Requested on ready and after each send |

Expand Down
9 changes: 5 additions & 4 deletions native/harness/src/ui.zig
Original file line number Diff line number Diff line change
Expand Up @@ -641,10 +641,11 @@ pub fn frame() !void {
// are handled so a held arrow walks instead of also moving the
// caret (matching shell readline).
//
// Skip history when busy (model is running — arrows pass through
// to textEntry) or when editing a queued item (queue-row editor
// owns the caret).
if (!busy and state.queue_editing_index == null) {
// When editing a queued item the queue-row editor owns the caret,
// so arrows pass through. History works during inference because
// historyApply is a pure in-memory read (no bridge write, no
// alloc, no I/O).
if (state.queue_editing_index == null) {
if (ke.action == .down or ke.action == .repeat) {
if (ke.code == .up) {
const in_hist = state.history_index != null;
Expand Down
Loading