The line-by-line REPL made long agent runs hard to follow and to steer: no live text, no way to switch model or effort without leaving, and finished runs could not be picked up again.
What
Full-screen session as the interactive CLI.
Layout: the conversation scrolls above an input bar fixed to the bottom. A / menu lists the commands, and pickers set the model, effort and mode.
Live output: agent text and the model's reasoning stream as they come. Tool steps are numbered with folded output (ctrl+o shows everything). A client card appears once the agent has verified the client.
Commands: /history, /messages and /clear work inside the session.
The classic REPL is removed. In a terminal, agent, engineer and collector open the session; --json and --no-interactive keep their plain output.
/resume reopens a past run's SDK session, and the next message continues the conversation. Works on Claude, Cursor, Copilot and OpenCode.
Models: Sonnet 5.5, Opus 5.5 and Haiku 5.5, with configurable effort. Sonnet 4.6 stays the default; the Sonnet 4.6 and Haiku 4.5 ids are still accepted by --model.
SDKs: Copilot SDK 1.0, and Claude Agent SDK 0.2.174 (from #145).
Fixes:
Usage is counted once per turn, with the SDK's own cost.
Agent and tool text is printed literally instead of as markup.
Files under a symlinked output folder sync again.
Stacked on #145: its commits show here until it merges.
Verification
pytest (1132 passed), ruff, mypy.
End to end in a pseudo-terminal, against an isolated rae home:
every command and key;
rendering at 60×20, 80×24, 140×44 and 200×60, plus a live resize;
the plain-terminal hand-offs, every subcommand, and --json.
Real runs on Sonnet 5.5 and Haiku 5.5: capture with a queued follow-up, agent questions, esc/ctrl+c/ctrl+d mid-run with no leftover processes, /resume, and engineer mode. The generated client ran.
A Copilot run in the session, then /resume of it.
Out of scope
/settings, manual capture, collector and OpenCode runs still leave full screen for the plain terminal.
Cursor resume is not tested live. For OpenCode, only checked that sessions survive a server restart.
Confidence Score: 1/5
Not safe to merge as-is: shutdown can abandon pending work, active Claude settings are misleading, session-entered tasks lose command options, and OpenCode resume can fail after a provider change.
### Issue 1
src/reverse_api/repl/app.py:602-609
Ctrl+D or `/exit` requests cancellation and immediately exits the app without waiting for the engine's daemon worker. The process can therefore end before SDK shutdown, final file sync, and history updates finish. Terminal checks reproduced unfinished cleanup with both quit inputs, including when SDK close completed immediately. Track the worker and wait for its cleanup before returning from `run_session()`; this needs fixing before merging.
### Issue 2
src/reverse_api/repl/app.py:215-229
Changing `/model` or `/effort` during an open Claude run changes the screen and saved settings, but not the active SDK client. Follow-ups continue using its original model and effort while the screen reports the new selections. This silently defeats the user's model and cost controls. Before merging, apply accepted changes to the active conversation before its next query, or clearly mark them as pending until a new run.
### Issue 3
src/reverse_api/cli.py:795
Running `agent --headless --output-dir ... --url ...` without `--prompt` discards the callback holding those options. When the user types their task, `Session.start()` constructs a replacement call with only the prompt and model. The capture consequently receives `headless=False`, no URL, and no requested output directory. The same path drops `collector --output-dir`. Preserve the invocation options until the first task is entered; explicit command options must not be silently discarded before this merges.
### Issue 4
src/reverse_api/cli.py:2121-2122
Saved OpenCode sessions keep the model but not its provider. After the user changes providers in settings, `/resume` combines the saved model with the current provider instead of restoring the original pair. Both agent and engineer checks reproduced a saved `opencode/big-pickle` session becoming `ollama/big-pickle` and failing before the saved session reopened. Save and restore the effective OpenCode provider alongside the model in both modes before merging.
### Issue 5
src/reverse_api/repl/bridge.py:250-261
`/output` and Ctrl+O cannot show the complete tool output: `LedgerUI.tool_result()` removes everything after 60 error lines or 400 other lines before saving it, and `receipt()` also shortens lines in the full copy to the receipt width. This is a non-blocking inspection problem: users cannot recover later diagnostics or the remainder of long values, even after widening the terminal. Preserve the original text in `Transcript.full` and limit only the folded preview.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.
Summary
This PR replaces the classic interactive CLI with a full-screen conversation and adds saved-session resume across SDKs.
Interactive agent and engineer runs now use a full-screen session.
People can resume a saved run and send it a new message.
Claude sessions offer newer models and configurable effort.
Agent output stays literal and usage is counted once per turn.
File syncing now finds paths reported through symlinks.
The PR is not ready to merge until the shutdown, active-settings, command-option, and resume problems are fixed.