diff --git a/docs/harness-limits.md b/docs/harness-limits.md index 6758277d..19d27478 100644 --- a/docs/harness-limits.md +++ b/docs/harness-limits.md @@ -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 | diff --git a/native/harness/src/ui.zig b/native/harness/src/ui.zig index b2281892..51ec86a2 100644 --- a/native/harness/src/ui.zig +++ b/native/harness/src/ui.zig @@ -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;