Introducing Terminal UI for agent developing and testing

Testing agents means leaving your dev environment. You write code, then switch to a frontend, an app, or a messaging client to see if it works. If you use a basic terminal instead, you get a synchronous readline loop — type, wait, read — which doesn't match how real conversations work.
Spectrum v0.9.0 replaces the old readline-based terminal provider with tuichat, a standalone TUI binary. It runs a fully async chat interface in your terminal — input and output are decoupled, so you can type while the agent is responding, and the agent can push messages at any time.
Because Spectrum's provider interface is unified, you don't change your agent code to use this. Your existing agent already works — terminal is just another provider alongside imessage and whatsapp. Add it to your providers array and your agent runs in the terminal with full async I/O, replies, reactions, and everything else.

What's new
Async I/O — input and output are independent. No blocking. The agent can send messages, react, and show typing indicators without waiting for your input.
Multi-chat — sidebar with multiple conversations.
Ctrl+Nto create,Ctrl+J/Ctrl+Kto switch. Each chat has its own space ID.Replies and reactions — select a message to reply; react with emoji. Both arrive as first-class events in your agent code.
Typing indicators —
startTyping/stopTypingwork like they do on iMessage and WhatsApp.File attachments — drag and drop. Arrives as
attachmentcontent with name, MIME type, and a buffer.Inline images — Kitty graphics protocol on supported terminals, half-block fallback elsewhere.
Console capture —
console.logis forwarded to a pinned system chat so it doesn't corrupt the TUI.
All of these map 1:1 to Spectrum's production providers (iMessage, WhatsApp). If it works here, it works there.
Example
This is examples/basic — it handles messages, replies, and reactions in one loop:
This is the same code you'd ship on iMessage or WhatsApp. Nothing here is terminal-specific — reaction, replyTo, space.send, message.reply are all standard Spectrum APIs. The only thing that changes between providers is the import and the config line.

How it works
tuichat is a compiled Go binary (Bubble Tea + Lip Gloss). The Spectrum adapter spawns it as a subprocess and communicates over JSON-RPC 2.0 on a local TCP socket.
The binary auto-downloads from GitHub Releases on first run, verified against SHA256 checksums, and cached locally. No new runtime dependencies.
Why a separate binary: Spectrum supports multiple languages (TypeScript today, Python/Go/Rust planned). A shared UI binary means every SDK gets the same terminal experience without reimplementing rendering, input handling, and image support in each language. The adapter just speaks the protocol.
Known issues
Message editing not yet supported.
macOS Gatekeeper may flag the binary on first run.
xattr -d com.apple.quarantine /path/to/tuichatclears it. Notarization is coming.replyTois surfaced via a type cast. A future release will promote it to the core message type.
