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
1 change: 1 addition & 0 deletions docs/harness-limits.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,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) | **↑** 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) |
| **Escape** (harness focused, Busy) | Cancel the in-progress turn (same as ■ Stop). Queue-row editor: dismisses editor first (does not abort turn). Idle: no-op |
| Tab | DOM nav / Clear (canvas uses pointer + dvui focus) |
| Composer focus | Requested on ready and after each send |

Expand Down
13 changes: 13 additions & 0 deletions native/harness/src/ui.zig
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,19 @@ pub fn frame() !void {
continue;
}

// ── Escape — cancel in-progress turn (plan #705) ─────────────
// Same path as the ■ Stop icon. Only .down fires cancel (single-
// fire). Gated on busy so idle Esc is not marked handled and can
// still close dvui menus (MenuWidget.processEventsAfter). Skip
// when a queue-row editor is open — queue_band owns Esc there.
if (busy and ke.code == .escape and ke.action == .down and
state.queue_editing_index == null)
{
e.handled = true;
bridge.queueCancelFromUi();
continue;
}

// ── Composer arrow-key history (plan #667) ───────────────────
// ↑ enters history when the composer is empty OR while already
// in history. ↓ walks history forward; outside history ↓ passes
Expand Down
Loading