The terminal UI layer of ECAssistant. Streaming chat, session tabs, tool-call rendering, and setup wizards — a reusable library for building assist-first AI experiences in a plain terminal. macOS, Linux, Windows.
ECAssistant exists to assist people — and the TUI is how that assistance looks and feels: every token streamed live, every tool call rendered inline with its approval and result, nothing hidden behind a spinner. If you're building your own host on ECAssistantCore, this library gives you that experience for free.
Part of ECAssistant — your models, your keys, your machine. MIT.
- Streaming chat rendering — token-by-token output with thinking/reasoning blocks
- Session tabs — multiple concurrent conversations, independent scrollback
- Tool-call visualization — tool invocations, approvals, and results rendered inline
- Setup wizards — first-run model install and provider configuration flows
- Cross-platform — raw ANSI/VT handling; no mouse sequences, terminal-native scrolling
- Async-safe — all rendering marshaled to the UI thread; no deadlocks on streaming
- Interactive decision checkpoints — the agent surfaces genuine ambiguity as a real numbered choice in your terminal (Enter = autonomous fallback); permission prompts and approvals render the same way — you're never guessing what it wants
- Everything visible, inline — streamed tokens, thinking blocks, tool invocations, approvals, and results all render in place; nothing hides behind a spinner
- Cross-thread-safe by construction — all rendering marshaled to the UI thread (the freeze-bug class common to terminal UIs is designed out)
- A library, not a framework — bring your own host around ECAssistantCore; no hidden coupling to any specific wiring
Public on nuget.org — no token, no auth:
dotnet add package ECAssistant.TUI| Capability | What it means for your host |
|---|---|
| Streaming chat rendering | Token-by-token output with thinking/reasoning blocks — never a frozen spinner |
| Session tabs | Multiple concurrent conversations, independent scrollback, dirty indicators, scrollable tab strip |
| Tool-call visualization | Invocations, approval prompts (approve / always / never), and results rendered inline in place |
| Decision checkpoints | Genuine ambiguity becomes a numbered choice in the terminal (Enter = autonomous fallback) |
| Setup wizards | First-run model install + provider configuration flows, ready to reuse |
| Undo/redo | Editor integration via AvaloniaEdit-style Document.UndoStack patterns (Ctrl+Z / Ctrl+Y) |
| Cross-platform ANSI | Raw ANSI/VT handling; no mouse sequences; terminal-native scrolling; macOS, Linux, Windows |
- All rendering marshaled to the UI thread — the cross-thread freeze bug class is designed out, not tested away.
- A library, not a framework — bring your own host around ECAssistantCore; no hidden coupling to any wiring.
ECAssistantConsole is the reference host built on this library — run it and you're looking at the TUI doing its thing.
| Repo | What it is |
|---|---|
| ECAssistant | Start here — overview & docs |
| ECAssistantCore | The embeddable agent library |
| ECAssistantLLM | OpenAI-compatible local LLM server |
| ECAssistantConsole | Reference host / end-user CLI |
MIT — © 2026 SideDevEC