zcoder's adaptive curses interface keeps the prompt, agent transcript, saved jobs, project details, and command approvals in one terminal view.
The palette uses a dark blue-gray surface, muted borders and coordinated syntax
and status colors. A matching bundled zdraw build adds rounded borders and
styled-row batching with a shared cell budget for transcript clipping. Stock
curses uses the same application layout and an
indexed or basic palette. One RGB palette is resolved once per terminal session;
256-color output uses the nearest cube or grayscale color. Basic mode keeps
explicit ANSI hues so success, warning and error remain distinct. Widget colors
and literal overrides use the same terminal profile as the transcript.
ZCODER_COLOR=basic or mono,
ZCODER_BORDERS=plain, and ZCODER_SPANS=false select the fallback paths.
With automatic color selection, a nonempty NO_COLOR selects monochrome while
preserving bold and reverse emphasis. Explicit ZCODER_COLOR=basic overrides it.
Remote zcoder connections (--connect) use a slightly warmer dark surface and
muted lavender accents. Basic mode uses magenta accents, while success, warning
and error keep their usual colors. The header border and its REMOTE label use
soft green. The label identifies the connection in every color mode, including
monochrome, even when the model and server names are clipped. The palette is
selected automatically.
Truecolor is enabled only when curses reports support through an appropriate
direct-color terminal description. COLORTERM=truecolor alone does not enable
it; zcoder never rewrites TERM. The 256-color palette also provides the new
appearance on ordinary xterm-256color sessions. /terminal reports the chosen
palette, border mode, batching support, row-clipping path, RGB state and
color-pair usage. General row clipping retains combining marks with their base
character. Markdown has an additional whole-grapheme path described below.
With locally built zmdown and compatible zdraw modules, assistant replies render tables, nested lists, task lists, quotations, links, headings and inline styles. Fenced code retains syntax highlighting. Copying a reply or transcript preserves the original Markdown. Streaming and terminal resizing lay it out again at the available width.
Submitted prompts also render Markdown, while keeping the explicit line breaks
entered in the prompt editor. Their stored content and copied transcript remain
unchanged. Older native Markdown modules use the Zsh renderer for prompts until
the native runtime is rebuilt with make.
This optional renderer keeps grapheme units together using the system's summed
character widths. Terminal emoji shaping can still differ from those logical
columns. Text that exceeds native cell storage or fails layout checks falls back
to readable Unicode escapes for that message; the saved content is unchanged.
/terminal shows the Markdown backend and any fallbacks.
Missing or incompatible modules use the existing Zsh renderer automatically.
ZCODER_MARKDOWN=zsh forces that renderer; ZCODER_SPANS=false also disables
native Markdown. See the build instructions.
With a compatible zdraw build and UTF-8 locale, prompt arrows, Backspace and
Delete move across or remove complete grapheme units: combining marks, emoji
modifiers, flags and joined emoji stay together. Vertical movement and Ctrl+W
also respect those boundaries, including after edits that join two units.
Newlines remain separate editing units. /terminal shows the selected editing
mode. Stock curses and unavailable native queries retain character editing.
This changes editing boundaries only; wrapping and cursor columns still follow
the system's cell widths, which can differ from an emulator's emoji shaping.
The interface includes:
- a header with the model, Ollama host or remote server, workspace, and status
- a sidebar with resumable jobs and the active project/tool policy
- a selectable transcript with foldable messages, tool results, and reasoning
- syntax-highlighted file previews and semantic patch colors
- a multiline editor with a cursor-following viewport and prompt history
- a searchable command palette and context inspector
- an exact-command approval dialog
The header shows model@server | zcoder.zsh^main, with the workspace and branch
after the server, a red caret, and a yellow branch name. Without a named branch, it shows only
the workspace name. Project names are not repeated in the sidebar.
At local interactive startup, the status badge reads Warming Up while
zcoder loads the selected Ollama model and submits the stable system/tool
context in the background. You can type immediately. The disposable readiness
exchange is silent and is not part of the saved conversation. The badge changes
to Ready after a successful warm-up.
The header reserves a fixed space for status at each terminal width, so status changes cannot push into the model, server, or project text. Long identity and status text are clipped to fit. At 100 columns or more, idle local sessions add an estimated context percentage and the current goal state when those fields fit. Remote sessions show the server's status without substituting local context or goal counters.
Generation, tool calls, compaction, verification, and external consultations
share a steady Working badge. Individual tool steps remain visible in the
transcript. The header has no spinner or elapsed-time counter; startup states
such as Connecting and Warming Up remain visible without animation.
Errors temporarily take precedence over warnings and ordinary activity for six
seconds. A later Ready event does not immediately hide an error. The full error
message remains in the transcript, while the header shows its first line.
Notices expire back to the current status and clear when switching transcripts.
Warnings and failures use text labels as well as color. Active dialogs retain
exclusive screen ownership; their underlying header updates when they close.
Interactive jobs are stored under ${ZCODER_HOME}/sessions, normally
${XDG_CONFIG_HOME:-$HOME/.config}/zcoder/sessions. Each interactive launch
starts a fresh job. Earlier jobs matching the workspace and profile remain in
the sidebar and can be resumed explicitly. Each launch creates a new session
ID, including when the previous chat was empty. An untouched local chat stays
in memory and is not saved. Empty sessions from earlier versions or headless
protocol bookkeeping do not appear in the conversation list.
Use ./zcoder.zsh --resume SESSION_ID to reopen a specific chat in the current
workspace and profile. Supply --workspace and --profile when needed. An
unknown, unreadable, or out-of-scope session produces an error instead of a new
chat. You can combine --resume with --prompt to continue a saved session
without the full-screen UI.
On interactive exit, after restoring the terminal, zcoder prints:
To continue this session, run:
/path/to/zcoder.zsh --resume 1789545311_12345 --workspace /path/to/project --profile coding --host localhost:11434
The command includes the current session ID and the workspace/profile or remote connection options. Custom local session storage is included when configured. No resume notice is printed for headless or one-shot runs.
A session retains:
- Ollama and tool-call history
- the visible transcript, selected entry, and body/reasoning expansion state
- tool identities, arguments, results, and lifecycle state
- context checkpoints and accounting
- active Skills
- the selected model
Sessions are isolated by canonical workspace and prompt profile. A coding conversation is never offered as a sysadmin session. The session directory is private to the current user.
Session lists use a derived .sessions.index in the sessions directory. Saves
update it atomically; readers check session membership and generation markers
before using it. A missing, malformed, or stale index is rebuilt on listing.
Legacy histories without generation markers use the directory scan. The index
can be deleted safely: committed session generations remain the source of truth.
Press Alt+1 to focus [1] Sessions, use Up or Down to choose a job, and press
Alt+2 or Enter to return to [2] Prompt. The focused panel has a bright border
and a bold title; the Prompt instructions use the normal panel background.
Bare 1 and 2 also jump between these panels when focus
is outside the prompt; inside it, digits remain ordinary text. Tab still cycles
focus through the panels and transcript. Dialogs keep their own keyboard controls.
Sessions cannot receive focus while work is running, but Alt+2 can always return
from the transcript to the draft. Ctrl+N starts a new job without deleting earlier ones.
/sessions reveals and focuses the same list. Ctrl+B hides or shows the sidebar,
giving the transcript its full width when hidden. This choice is saved locally
and restored on your next launch, across projects and remote connections.
Terminals narrower than 88 columns
always hide the sidebar, and Tab skips it while hidden. Ctrl+H remains Backspace.
Automatic hiding on a narrow terminal does not change your saved preference.
Alt+1 reveals a manually hidden sidebar when the terminal is wide enough.
Remote sessions use the same sidebar controls but remain stored on the named server. See Remote-agent server.
Use /open README.md to read a workspace document inside zcoder. A tab strip
above the chat appears when a document is open, with [3 Coding] followed
immediately by up to four document tabs named after their files. Closing the last
document hides the strip. Alt+3 returns to Coding and focuses the prompt;
Alt+4 through Alt+7 select documents.
Alt+2 returns to Coding and focuses your preserved prompt draft.
Paths are relative to the workspace. Absolute paths inside it also work, and paths with spaces can be entered literally or wrapped in a pair of quotes:
/open docs/architecture.md
/open "docs/Design notes.md"
The reader is strictly read-only. Documents use the same zmdown rendering and syntax highlighting as chat, with the existing Zsh fallback when native Markdown is unavailable. Each document keeps its scroll position when switching tabs.
| Reader control | Action |
|---|---|
| Up/Down or k/j | Scroll |
| Page Up/Page Down | Scroll a page |
| Home/End | Go to the beginning/end |
| Mouse wheel with native zdraw | Scroll the document |
| r | Reload the file from disk |
| x | Close the document and focus the prompt in Coding |
| Tab or Alt+2 | Return to the prompt |
| Ctrl+Y (when idle) | Open the document source in the terminal copy view |
Opening an existing document selects its tab. Closing a tab keeps the other numbers unchanged; the next document reuses the vacant slot. When four documents are open, close one before opening another. Tabs last for the current application run and are not saved in chat history. Opening a document does not add its contents to the model's context.
Each submitted request includes the paths of the open documents in the
system prompt. You can say “Read the open docs and explain how they fit together.”
The model can then read those files with read_file; their contents are never
attached automatically. The path list is captured when you submit, including
queued steering and follow-ups. Closing tabs updates the next submitted list.
You can switch tabs, read documents, and use /open while the model is working.
Command approval dialogs still take precedence. Files are snapshots: press r
after a model updates the document. A failed reload keeps the previous contents.
Documents must be regular .md or .markdown files of at most 256 KiB, with
symlinks resolving inside the workspace.
In a remote session, /open and r read the server's workspace. The server
must support document reading; older servers report that an update is needed.
With the optional native runtime (make native), left-click and drag over text
in the chat. The highlight stays inside the chat content area even when you drag
into the sidebar, prompt, or beyond its borders. No Shift modifier is needed.
A gesture that starts outside chat text cannot select the chat.
Press Ctrl+Y to send the selected text to the terminal clipboard using OSC 52. Kitty supports this operation. No external clipboard program is required, and selecting alone never writes the clipboard. Escape clears the selection; press Escape again if you also want to stop a running task.
While text is selected, the chat view stays still. Generation and tools continue in the background. Clearing the selection shows the accumulated output again. Scrolling, resizing, changing sessions, folding entries, and opening a dialog clear the selection. The mouse wheel scrolls when a drag is not active.
Copying selects rendered text: chat borders, role labels, code-language labels, and diff line-number gutters are excluded. Ordinary soft wraps are joined; code indentation and actual line breaks remain. Tabs copy as displayed spaces. Tables retain their displayed layout. For prose blocks too long or complex to map safely to the renderer's logical rows, visible line breaks are preserved. Selection covers the visible viewport; edge autoscrolling, offscreen selection, and double-click word selection are not implemented.
ZCODER_MOUSE_SELECTION=false disables application selection. Stock curses and
incompatible native builds retain terminal selection and /copy. Kitty's
Shift-drag remains terminal-wide selection and can include adjacent panes.
If your terminal or multiplexer does not accept OSC 52 writes, set
ZCODER_CLIPBOARD=view. Ctrl+Y then opens a stable plain-text view containing
only the selection, for copying with the terminal's own controls. Clipboard
writes cannot be acknowledged by this protocol; the status reports that the
selection was sent. Selections over 256 KiB also use the copy view.
Without a selection, Ctrl+Y or /copy temporarily leaves the TUI and
prints the visible transcript as stable plain text. Copy it with the terminal's
normal controls, then press Enter to return. Expanded message bodies, tool
results, and reasoning are included; collapsed details remain hidden. This
whole-transcript export retains original Markdown.
Press Tab until the transcript has focus. Up/Down (or k/j) selects an entry; Home/End selects the first/last entry. Enter or Space expands or collapses its body. Ctrl+R toggles the selected assistant's reasoning independently. For a reasoning-only entry, Enter also toggles its reasoning. Tab returns to the prompt.
New tool calls occupy one entry that changes from pending to running and then completed or failed. Their details start collapsed; expand them to inspect the arguments and retained result, including read-file and MCP output. File writes and patches also retain their styled previews. Status text remains readable without relying on color. Incoming activity preserves a manually scrolled view.
Successful apply_patch and replace_text calls open their change preview
automatically. The native zdraw gutter shows line numbers, red removals and green
additions; plus and minus markers also distinguish changes in monochrome.
Replacement previews derive their line numbers from the edited file; patch
previews use the accepted diff's hunk numbers. Long lines clip horizontally and
large previews show a limit notice. These previews remain available in saved
sessions and through remote connections.
Local sessions retain selection and expansion state. Older saved transcripts remain readable with their original bodies expanded. An unfinished tool restored from disk is marked interrupted. Remote connections request structured tool events and restore saved tool metadata when supported by the server; legacy servers continue to display their ordinary tool text. Remote expansion changes remain local to the current view.
/terminal (also in the command palette) shows synchronized-output detection,
bracketed paste, and current terminal geometry. With a recent zdraw build it also
shows capability evidence and live window, pad and prepared-row counts. These
queries are passive: opening the inspector enables no additional protocols.
On compatible terminals, the window or tab title follows the current session:
<session title> | <project name>. A new session shows only the project name,
taken from the workspace directory. This also follows remote workspace and
session switches. The previous title is restored on exit or suspension where
the terminal supports the xterm title stack.
Set ZCODER_TERMINAL_TITLE=false to leave the terminal title alone.
The default ZCODER_SYNC_OUTPUT=auto queries mode 2026 once on each UI entry.
Recent zdraw builds own the query through the normal curses event queue. A reset
reply enables native synchronized presentation; an already-set mode is left
untouched. Older builds and stock curses retain the Zsh query and frame wrapper.
An unsupported or absent reply keeps
ordinary curses updates. Detection never blocks startup and stops accepting
replies after one second. Late replies are still consumed as protocol input.
Set ZCODER_SYNC_OUTPUT=false to disable the query and synchronization, or
true to force synchronization on a terminal whose support you already know.
Multiplexers use the same query; terminal names alone do not enable support.
Each batch of changed windows, including a modal, gets one synchronized frame
when enabled. The native path stages the batch and calls present once, letting
zdraw own marker cleanup. Native resume performs its own ordinary repaint, with
synchronization continuing at the next presented frame. Forced synchronization
retains the Zsh wrapper because native activation requires negotiated evidence.
The frame ends before waiting for input or network activity. Terminal modes and
the private output descriptor are released on exit and when entering the plain
text copy view. Headless modes do not load this layer. This follows the
mode 2026 protocol.
OSC hyperlinks, clipboard writes, truecolor, and enhanced keyboard negotiation
are not enabled.
Type / at the start of an idle prompt to see slash commands and their
descriptions. Keep typing to filter by command prefix. Up/Down cycles through
the list, wrapping at either end; Tab or Enter fills the selected command into
the prompt. Press Enter again to run it, or add arguments first. An already
complete command still runs with one Enter. Escape closes the suggestions
without changing your text. Suggestions close while you edit arguments, move
the cursor inside the command, or focus another panel. During an active response,
the prompt keeps its ordinary draft and steering controls.
Ctrl+P or /commands opens the command palette. Type a command name or a few
letters, such as ctx for context, then use Up/Down and Enter to choose. Matching
ignores case and accepts letters in sequence. Escape closes the palette and
preserves the prompt and cursor position. Commands needing an argument prepare
an editable prompt, keeping your existing draft after the command prefix.
Slash commands remain available directly.
/help or /? opens a read-only help view without adding help messages to the
conversation. Short entries group shortcuts and commands by task, with indented
continuations for wrapped text. Up/Down or j/k scroll, Page Up/Page Down move
by a page, Home/End jump to the beginning/end, and [/] move between sections. Escape or q
closes the view and preserves the draft. On zdraw, resizing retains the source
position being read; stock curses retains the current source block. When a
terminal is too small to open the view, help appears in the transcript.
The palette omits local-only commands in remote mode and editing workers in the sysadmin profile. Remote goal and harness entries follow the server's advertised capabilities; older servers keep the existing consultation-command fallback.
/context opens a scrollable snapshot of the estimated next prompt, context
window, last reported Ollama usage, component estimates, and effective compaction
threshold. Component bars use the context window as their scale. These are
estimates, not exact additive token counts. An undiscovered model allocation is
labelled as a fallback estimate. Remote clients explain when the server does not
expose accounting rather than displaying local counters.
The palette, context inspector, model pickers, MCP list, and approval dialogs share a modal lifecycle and adapt when the terminal resizes. Up/Down and Page Up/Page Down scroll long context or approval details. Escape closes a view or denies an approval. Shell-command and external-action approval policies continue to apply.
Ollama and OpenCode model discovery keep draft editing, paste, transcript folding, and resizing available before the picker opens. Escape cancels loading and keeps the selected model; the complete catalog must arrive before choices are displayed. Interactive discovery has a 60-second deadline. OpenCode catalogs that exceed the output budget are rejected instead of showing a partial list.
Context-allocation discovery also keeps input responsive. Escape during initial preparation stops before generation; post-response lookups run in the background so an open inspector keeps its normal controls. A stalled lookup ends after 30 seconds and retains the last allocation or the labelled fallback estimate.
Ordinary local interactive responses arrive incrementally in one assistant
entry labelled receiving. Reasoning remains separately foldable. The completed,
validated answer replaces the preview in that same entry. Tool calls wait for
the final stream record before entering the usual validation and approval path.
Escape or a failed connection leaves any displayed fragment labelled as partial text. Partial text is not added to the model's conversation history. A saved in-flight preview restores as interrupted if the session ends unexpectedly.
Set ZCODER_STREAM=false to use buffered responses. Structured routing,
compaction, persistent goals and their verifier, LFM models, remote-server turns,
ACP, and one-shot prompts retain buffered Ollama requests. LFM's
normalization and goal verification must finish before their answers are shown.
While waiting for Ollama, a local shell command, search, patch, MCP connection or tool call, external delegate, or remote events, you can edit and paste into the prompt. During an active conversation turn, Enter queues steering for the next response/tool-batch boundary; Ctrl+G queues a follow-up for after the task finishes. Acceptance clears the editor. Escape stops the active response or local tool process, then continues with messages already queued for that turn. With no queued input it stops the conversation. Your unsent draft is preserved. Standalone activity without a conversation turn retains draft-only input.
Use /queue to inspect pending messages, /queue resume to recover them after
cancellation or restart, and /queue drop ID to discard one. See
Steering and queued follow-ups for delivery rules and APIs.
Tab switches between the draft and transcript during activity. Transcript selection, folding, reasoning inspection, and scrolling work with their usual keys. Session switching, model selection, and the command palette remain idle controls. Native file operations and local processing can still delay input handling until their next polling point.
Local interactive shell commands run only after the existing approval checks. Command cards open automatically and show elapsed time and a bounded live output preview, refreshed at most twice per second. The final result is collected when the command finishes; typing, paste, transcript folding, status notices, and resize handling remain available while they run. Escape stops the owned command process group and skips the rest of that tool batch. Completed side effects remain in place. Cancelling a verifier search pauses the goal instead of continuing verification.
Commands receive EOF on standard input and have a private terminal, so they cannot read your draft or paint over curses. Interactive programs that require terminal input are not supported through this runner. It owns and cleans up the command's process group, including background children still in that group; it is not a persistent-service launcher. Processes that deliberately detach into another session are outside that group. Commands use their requested timeout; search has a 120-second deadline. These changes apply to local interactive execution; server, ACP, and one-shot tool execution keep their existing behavior.
Patch validation and application use the same responsive runner. Each process
has a 120-second deadline. A normal rejected diff can still use the checked
patch fallback. Cancellation, timeout, or worker failure stops further engines
and keeps the patch-retry guard active. A cancelled application may already have
changed files; inspect the working tree before retrying. Patch scratch files are
cleaned on both completion and cancellation.
MCP tool calls keep their persistent stdio broker while the UI polls for a reply.
Escape disconnects the affected server, ends the tool round, and reports an
uncertain outcome. An external action may already have completed or may continue
after disconnection. Calls that time out also disconnect. The next turn or an
explicit MCP reconnect starts a fresh connection; cancelled requests are not
replayed. External-write approval still happens before the request is sent.
MCP broker startup, protocol negotiation, and paginated tool discovery also
allow draft editing, folding, and resizing. Escape stops connection preparation,
closes the affected broker, and skips remaining servers in that connection pass.
If this happens while preparing a prompt or warm-up, no model request is sent.
Tool pages are published only after discovery completes. Cancellation or a
broken transport never triggers legacy protocol fallback. Restarting a server
from /mcp temporarily closes the inspector while the draft accepts input, then
reopens it with the connection result. Headless connection setup keeps its
existing synchronous behavior.
During remote turns, model preparation, prompt submission, event fetching, and approval replies keep input responsive even if an HTTP response stalls. Escape before prompt submission leaves that prompt unsent. Afterwards, it closes the pending HTTP request and asks the server to stop. The UI distinguishes an acknowledged stop from an unconfirmed one; remote work may continue when the server does not answer. Completed side effects are not rolled back. Interrupted prompt and approval requests are never replayed.
Interactive remote requests have a 30-second deadline, configurable from 1–3600 seconds
with ZCODER_REMOTE_REQUEST_TIMEOUT. The stop acknowledgement waits at most two
seconds. These limits cover each exchange, not the total duration of an agent
turn. Headless clients retain their existing synchronous HTTP behavior.
The remote connection screen accepts a draft while startup runs; Escape closes the connection attempt and exits. Session browsing also preserves draft input and keeps the current conversation visible until every replacement page loads. If a switch or new-session request is interrupted, the server may already have changed jobs. The next prompt first reloads the server's selected conversation; cancelling that reload leaves the prompt unsent. Session creation and selection are never automatically replayed after an uncertain result.
Idle remote model polling runs in the background. Enter can submit a prompt while a poll is pending; foreground work supersedes the old poll so its eventual response cannot overwrite newer model state.
Status changes repaint the header, and typing normally repaints only the prompt. Window resizing and changing the prompt's height rebuild the layout as needed.
| Key | Action |
|---|---|
| Enter | Send the prompt; fold the selected entry when transcript has focus |
| Alt+Enter | Insert a newline; Shift+Enter also works with negotiated Kitty keyboard support or a distinct terminal key encoding |
| Escape | Stop the active operation; continue with accepted input queued for that turn, if any |
| Tab | Complete the selected slash command; otherwise move focus between prompt, sidebar, and transcript |
| Alt+1 / Alt+2 | Focus [1] Sessions / [2] Prompt; Alt+1 also reveals a hidden sidebar when space allows |
| 1 / 2 outside the prompt | Focus Sessions / Prompt |
| Ctrl+B | Hide/show the sidebar and resize the transcript |
| Ctrl+P | Open the command palette |
| Ctrl+O | Open the Ollama model picker |
| Ctrl+R | Toggle selected reasoning in the transcript, otherwise latest reasoning |
| Space | Fold the selected entry when transcript has focus |
| Home / End | Select the first/last entry when transcript has focus |
| Ctrl+N | Start a new saved session |
| Ctrl+Y | Copy selected chat text, or open the plain-text transcript view |
| Page Up / Page Down | Scroll the transcript |
| Ctrl+U | Clear the input |
| Ctrl+W | Delete the previous word |
| Up / Down | Cycle slash suggestions; otherwise move inside input/history, or select a transcript entry |
| Ctrl+Q / Ctrl+D | Exit |
| Command | Action |
|---|---|
/commands |
Open the searchable command palette |
/model |
Open the model picker |
/model NAME |
Select a model directly |
/host HOST |
Change the Ollama endpoint |
/instructions |
List active project instruction sources |
/mcp, /mcp reload |
Inspect or reload MCP servers |
/mcp trust, /mcp untrust |
Approve or revoke the project .mcp.json servers |
/skills, /skills reload |
Inspect or rediscover Skills |
/skill NAME |
Activate a Skill |
/compact |
Create a context checkpoint |
/terminal |
Inspect terminal capabilities and synchronized-output policy |
/context |
Inspect context estimates, reported usage, and compaction threshold |
/goal OBJECTIVE |
Run a persisted goal with independent completion verification |
/goal --tokens N OBJECTIVE |
Run a goal with a cumulative model-token limit |
/goal, /goal status |
Show the saved goal state, attempts, and usage |
/goal pause, /goal resume, /goal clear |
Control the saved goal |
/sessions |
Focus saved jobs |
/list-agents |
List other live local zcoder instances |
/agents |
Show this instance's relay state and queue depth |
/agents pause, /agents resume |
Reject or resume new incoming handoffs |
/copy |
Open the plain-text transcript |
/new |
Start a new job |
/help |
Show in-app help |
/quit |
Exit |
Some controls are intentionally unavailable in remote-client mode because the server owns that state.
A goal continues through tool calls until the worker calls finish. Candidate
completion is then checked by a separate read-only model inference. An accepted
candidate ends the goal; a rejected candidate returns its evidence-based
feedback to the worker and the loop continues. The final answer is shown only
after acceptance. A genuine blocker can stop the goal without pretending it
completed.
Goal state follows the saved session. Escape pauses an active local or remote
goal, and an interrupted goal loads as paused after restart. Use /goal resume
to continue the same objective, or /goal clear to discard it. Remote clients
enable these commands only when the server advertises goal support.
Interactive zcoder instances owned by the same user on the same machine
publish themselves through a private Unix-socket registry. /list-agents
shows each live peer's exact instance ID, project, PID, state, canonical
workspace, profile, and model without starting an Ollama turn.
You can ask the current agent to tell one of those peers about a change or hand it a focused task. The model discovers the exact target and sends a concise message only when you explicitly request that communication. An accepted message is queued by the peer; it does not mean the peer has completed the work. The receiving terminal renders a distinct Agent relay event and starts the task in its currently selected session after any active turn finishes.
/agents pause rejects new handoffs while retaining messages already accepted;
/agents resume begins accepting and processing them again. Discovery and
delivery are not bridged through remote-client mode. See
Inter-agent communication for protocol and
safety details.
If their CLIs are installed, zcoder can ask other coding harnesses for a read-only second opinion:
/claude Review the authentication change for edge cases
/codex Find the likely cause of this failing test
/agy Suggest the smallest safe refactor
/opencode Compare these two implementation approaches
Claude uses its read, glob, and grep tools in plan mode. Codex runs in its
read-only sandbox. Antigravity uses plan and sandbox mode. OpenCode uses its plan
agent and a selected provider/model; run /opencode without a request to open
the picker, or use /opencode-model PROVIDER/MODEL.
Add ! to run the same provider as a coding worker that may edit the selected
workspace:
/claude! Implement the reviewed authentication fix and run focused tests
/codex! Fix the failing parser test
/agy! Apply the smallest safe refactor
/opencode! Implement the selected approach
The bang is explicit mutation authority for that invocation. Codex uses its
workspace-write sandbox, Claude uses acceptEdits with focused coding tools,
Antigravity uses accept-edits with terminal sandboxing, and OpenCode uses its
build agent without --auto. Workers are told to stay inside the workspace
and not install, deploy, commit, push, or publish unless the request explicitly
requires that action. Each bang command starts a fresh harness invocation; it
does not resume an earlier consultation.
Default models and limits:
| Setting | Default |
|---|---|
ZCODER_CLAUDE_MODEL |
claude-opus-5 |
ZCODER_CODEX_MODEL |
gpt-5.6-sol |
ZCODER_AGY_MODEL |
gemini-3.8-flash-high |
ZCODER_OPENCODE_MODEL |
unset; choose in the picker |
ZCODER_DELEGATE_TIMEOUT_SECONDS |
1800 |
ZCODER_DELEGATE_MAX_OUTPUT |
32768 characters |
ZCODER_DELEGATE_HISTORY_CHARS |
12000 characters |
ZCODER_DELEGATE_REQUEST_CHARS |
2000 characters |
ZCODER_OPENCODE_VARIANT supplies an optional OpenCode variant. Escape cancels
an active external invocation. Cancelling or timing out a worker does not roll
back edits it already made, so inspect the workspace afterward.
Successful output is decoded from JSON or JSONL and shown in the transcript. Consultations are retained as explicitly untrusted reference material for later Ollama turns. Worker reports are retained separately with a warning that the workspace may have changed and must be inspected before follow-up work.
External harnesses are not invoked through run_command and do not use
zcoder's shell-command approval modal. Their own sandbox, tool permissions,
project instructions, and user configuration govern their internal actions.
Use the plain command when you only want advice; use the bang form only when you
intend to authorize workspace changes. Bang commands are disabled in the
sysadmin profile because external harness commands cannot participate in its
mandatory per-command approval flow.
zcoder checks PATH on the host responsible for the workspace. /help reports
which of the four harness commands are available. Invoking a missing plain or
bang command returns the same host-specific message, names the missing binary,
and suggests the installed alternatives. A remote server publishes its own
snapshot during the authenticated handshake, so a workstation does not mistake
its locally installed CLIs for commands present on the server. Older servers
that do not publish this field are reported as availability unknown.