Changelog
All notable user-facing changes to cast, newest first.
0.9.13
Internal
- Zero biome lint warnings/errors project-wide.
0.9.12
Changed
todo_writeis now guidance-based — the hard gate that blocked non-todo tool calls after 4 work actions is removed. The model decides when to usetodo_writebased on task complexity, same as opencode'stodowrite.
0.9.11
Fixed
- Web UI: the Inputs tab loading state now uses the same "Loading…" style as every other panel instead of an inconsistent title-sized label.
0.9.10
Fixed
- Web UI: the Inputs sidebar no longer shows a stale "No files attached" flash when re-fetching after a document upload or during agent-response re-renders.
- Web UI: attached documents in a draft session (before the first message was sent) now work — the upload is deferred to
submitMessageaftercommitSessioncreates the real session, instead of blocking with "send a message first". - Web UI: a double
commitSessioncall when drafting a session with pending documents created two separate sessions — files landed in the first, the message in the second, so the Inputs tab was empty while the chat showed the files. A singleidvariable now flows through both blocks. - Web UI: the sidebar's "No sessions match" empty state no longer flashes during initial load before the session list arrives.
Changed
- Web UI: tightened chat vertical spacing — smaller gap, leaner padding, and reduced line-height for denser messages.
0.9.9
Added
- Session search (TUI and web) now runs on a SQLite FTS5 index over full message history instead of a JS fuzzy scorer — same relevance ranking in both interfaces, and a multi-word query now matches across different messages in the same conversation instead of only within one.
web_fetchgets a second backend: "local" fetches the URL directly (no third party sees it) and converts HTML itself, with a Cloudflare-challenge retry, a 5MB response cap, and content-type checks that reject binaries. Switch with/web-fetch-provider jina|local(default staysjina).- Web UI: an "Inputs" tab (right sidebar, ordered Inputs/Files/Changes) for a session's attached documents.
- Web UI: the composer's attach button now accepts documents, not just images — non-image files upload to a session-scoped directory and the model gets told their path via an invisible reminder on send. Executable/binary formats are rejected; archives and ordinary documents are allowed.
cast web's MCP servers now connect in the background after the HTTP server starts listening, instead of blocking startup on every configured server (npx spawns, browser launches, remote handshakes) — the server accepts requests immediately, and connected tools become available in any open session automatically once the connect finishes.
Changed
- Web UI: the "Tools" settings tab split into three — Bash, Web, Quick Mode — each loading only the data it needs instead of five settings commands on every open.
web_fetch: one retry on a transient network failure or 5xx (never on an intentional abort or a 4xx), and truncation now prefers the nearest paragraph break over a mid-sentence cut.
Fixed
web_fetchnow rejects non-http(s) URL schemes (file://,data:, ...) before ever making a network call.cast web status/"already running" could report a server as up before it was actually accepting connections — the daemon state file is now written only once the HTTP server is truly listening, matching its own documented contract.
0.9.8
Fixed
- Web UI: tooltips display as a single horizontal line instead of wrapping into a narrow column due to
max-widthandword-breakconstraints. - Web UI:
assistant_messagehandler now uses event payload (content/thinking/toolCalls) as fallback when streaming blocks are empty, preventing silently dropped messages on SSE interruptions.
0.9.7
Added
- Web UI: custom tooltip system — themed bubbles with fast appearance, viewport-aware positioning, no truncation.
- Web UI: keyboard shortcuts icon (heroicons-compatible outline style).
- Web UI: all settings tabs now have collapsible help sections (Model, Tools, MCP, Skills, SSH, Plugins).
- Web UI: SSH settings now support password authentication (requires
sshpass).
Changed
- Web UI: Settings modal widened from 620px to 820px for better readability.
- Web UI: help sections in Tools and Model tabs now use inline hints after each section title instead of a single collapsible block.
- Web UI: theme swatches redesigned with grid layout — dot left-aligned, label centered.
- Web UI: every theme now carries its own background palette (bg, bgSurface, bgRaised, bgHover, border, borderActive) with improved contrast between UI layers.
- Web UI: 6 themes (Nord, Solarized, Catppuccin, GitHub, Dracula, Gruvbox) use official background colors from their design specifications.
- Web UI: reasoning blocks and turn-meta footer now use
--text-dimfor better readability. - Web UI: chevron icon in collapsible sections replaced from CSS triangle to genuine Heroicon.
Fixed
- Web UI: loading spinners now centered in settings pane, diff panel, and file previews.
- Web UI: Tavily and Brave Search input fields aligned to equal widths.
- Web UI: SSH hosts form reordered — password field before key field.
0.9.6
Internal
- Removed unused
formatActiveRulesPrompt— the per-turn rules path has usedformatRulesForTurn(single combined<rules>block) since it was introduced; the legacy two-part formatter had no callers outside its own tests.
0.9.5
Added
- Two new built-in personas:
researcher(web-search-driven investigation, cites sources) andassistant(general-purpose everyday help — advice, quick lookups, drafts — that reaches for tools only when a task actually needs them). - Web UI: the Files panel's
.mdpreview now renders through a real markdown engine (headings, lists, tables, links) and code files get real per-language syntax highlighting, both vendored for fully offline use. The Settings → Skills "read full content" view got the same treatment, in the same size modal as the file preview. - Web UI: every finished agent reply now shows its own "provider · model · Ns" footer, persisted per-turn — a thread with several exchanges shows a footer under each one, not just whichever was most recent, and it survives a full page reload.
Fixed
- Web UI: a disabled plugin's skill still worked as a native slash command and stayed listed in the composer palette — both now correctly disappear.
- TUI:
/pluginsilently cloned three GitHub-hosted default marketplaces on first use with no way to tell where they came from. They're back as permanent, always-present catalogs (labeled "built-in" in the web UI), but non-removable and no longer a surprise —/plugin marketplace addis the documented way to add your own. - Web UI: Chinese trigger phrases removed from three built-in skill descriptions; the command palette now truncates a long description with an ellipsis instead of letting it overflow the row.
- Web UI: clicking a file's icon or the empty space in its row (not just the filename text) now opens its preview, matching the whole row's hover/click-target styling.
- Web UI: fixed the Files preview's markdown spacing (was inheriting the chat's pre-wrap styling, doubling up as huge line gaps), added Escape-to-close, and removed a raw-then-rendered flash on a slow connection.
- Web UI: the stale "provider · model · Ns" footer and elapsed-time counter from a just-finished session no longer bleed into a brand-new session.
- Web UI: centered "Loading…" states that were pinned top-left instead of filling their container (Settings tabs, Status popover, Files panel's initial load).
- Web UI: a hand-approximated
chevronUpicon path was fixed to match its actual Heroicons source.
0.9.4
Added
- A loaded skill can now be invoked as a native
/<skill-id>slash command in both the terminal and web composer — it shows up in autocomplete with its own description, no/skill:nameprefix needed./reload(and enabling/disabling a skill in the web Settings modal) refreshes the list immediately.
Fixed
- Web UI: Settings could only be opened once a session existed — the gear icon did nothing on a brand-new draft thread. It now always opens; tabs that need a session (Model, MCP, Provider, etc.) show a hint instead of hanging on "Loading…" until one exists.
- Web UI: removed the redundant close button on the Changes/Files panel — the topbar toggle already closes it.
- Web UI, mobile: opening the sidebar while the Changes/Files panel was open (or vice versa) used to leave the one you just opened hidden behind the other, forcing a manual close-then-open. Opening either drawer now closes the other automatically.
0.9.3
Added
- Web UI: the Files panel now shows a live preview when you click a file — text/code renders as-is, images render inline, PDFs open in the browser's own viewer, and CSV/TSV render as a real table (auto-detecting the delimiter — semicolon, tab, or pipe, not just comma).
- Web UI: files and folders in the Files panel can be renamed in place, the same inline-edit as renaming a session in the sidebar.
- Web UI: the Files panel now refreshes on its own — a write/edit that lands while it's open shows up without collapsing and reopening the folder, and the diff/Files panel's open state and active tab now survive a page reload instead of resetting.
Fixed
- Web UI: the Changes/Files panel used to only mount once a session actually existed, so opening it on a brand-new draft thread reserved its column and left the space empty instead of showing anything — it now always renders, with a "No session yet" state instead of a gap.
- Web UI: the Settings tab strip on narrow/mobile screens scrolls but gave no hint that SSH/Theme/Tools were reachable further right — added a fade at both edges.
- Web UI:
.modal-status,.modal-confirm, and.modal-sharewere silently stuck at the same 480px width as every other modal — a stylesheet ordering bug meant their intended (smaller) widths never actually applied.
0.9.2
Added
- Web UI: threads can now be shared as a public, read-only link (
/shared/<token>) — no login required to open it, and it can be revoked at any time. The shared view never includes the persona's system prompt, only the conversation itself. - Web UI: a "Quick session" button next to "New session" starts a fresh thread on a configurable default persona and a clean sandbox directory in one click, instead of going through the persona picker every time. The default persona is set in Settings → Tools.
- The favicon and browser tab title now match the app's actual identity — the tab reads "Cast" instead of "cast web", and the icon is the same pixel-block mark used in the app's own logo instead of a plain letter.
Fixed
- Web UI: the sidebar's session menu (rename/share/delete) no longer opens off-screen for a thread near the bottom of a short or scrolled sidebar — it now opens upward when there isn't room below.
- Web UI: markdown links (
[text](url)and bare URLs) in replies are now rendered as real clickable links instead of plain text. - Web UI: the persona picker under "New session" is no longer clipped with no way to scroll to the rest of the list at high page zoom or with many personas — it now shares one scroll region with the session list instead of a second, cut-off one of its own.
- Web UI: the "Apply" checkmark next to a model/provider picker in Settings no longer stays active when nothing was actually changed, matching how every other picker in Settings already behaved.
- Web UI: a stopwatch tick during every running turn was re-rendering the entire app ten times a second, visible as flicker across the whole page; it's now isolated to just the composer's own elapsed-time display. Settings' model pickers also no longer flash between a cached and a freshly-fetched list on open.
- Web UI: the "not a git repository" message in the Changes panel no longer renders as one lopsided centered line — it's a proper two-line message now.
0.9.1
Added
- Web UI: the final reply now shows a small, muted line with the provider, model, and response time — so a model switch is easy to confirm, and it's clear which model actually answered before deciding whether to switch again.
- The "Coder with subagents + forced review" persona was renamed to "Coder with mandatory review" for a more natural label.
Fixed
- Web UI and TUI: providers that interleave content/reasoning deltas out of order mid-turn (observed on MiniMax-M2) no longer render as broken alternating "agent"/"reasoning" blocks with a word split across the seam — same-kind text now merges back together across the interruption.
- Web UI: switching the model (
/model) now updates the sidebar immediately and becomes the default for every session created afterward — previously a new session always reopened on whichever model was active when the server started, no matter how many times you'd switched since. bash,ssh, and background bash now cap output at true UTF-8 bytes instead of JS string length, matching howreadalready worked — for non-ASCII text (e.g. Cyrillic) the old comparison let through roughly double the configured byte limit. The default cap was also raised from 64KB to 128KB.
0.9.0
Added
- Build mode: a
todo_writetool for tracking multi-step work as a checklist — persisted separately from the message history (survives compaction and process restarts), re-injected into the system prompt every turn, and enforced by the harness: after several tool calls with no list started, every further tool call is refused untiltodo_writeruns. Not available in plan mode, which already has the plan checklist for the same job. - Every persona's tool list now describes
todo_writein its own voice — from qa's "one item per check in your verification pass" to architect's "rarely central here", matching how each persona already describes the rest of its tools. - Web UI: code blocks in the chat now have a copy button (top-right of the block) that swaps to a checkmark on successful copy.
0.8.32
Added
- Web UI: an MCP server row in Settings now has a Reconnect button (next to the pause/resume toggle), so a server that was fixed on disk (new URL/token) doesn't need a full server restart to pick it up.
- Web UI: the sidebar's message-count badges now update live for every thread, including ones you don't currently have open, instead of only refreshing on a full page reload.
- Web UI: the status popover ("i") now shows the active provider and how many tokens were served from cache.
Fixed
- Web UI: numbered/bulleted lists with a blank line between items (common in model output) no longer render every item as "1." — each used to become its own single-item list.
- Web UI: runs of 3+ blank lines in a reply no longer render as an oversized gap between paragraphs.
- Web UI: opening a long thread no longer occasionally leaves the view short of the very bottom — the scroll-to-bottom jump is instant instead of an animated scroll that could lose a race with content still loading in.
- Web UI: streaming replies re-render at most once per animation frame instead of once per token, cutting the worst-case main-thread stall during a long, tool-heavy reply roughly 4x.
- Web UI: the status popover ("i") could fail to open entirely while the agent was running (reading the active provider was wrongly gated behind the same "must be idle" check as switching it).
- A turn cut short by the backend restarting no longer tells the model the user interrupted it — the reminder now says the server restarted instead of misattributing it.
0.8.31
Added
- Web UI: sessions can now actually be deleted — the sidebar row's rename/close icons were replaced with a single ⋮ menu (also opens on right-click) offering Rename and a real, permanent Delete. Previously the × only unloaded a session from memory; it stayed on disk regardless.
- Web UI: a themed confirmation dialog now appears before closing/deleting a thread, matching the rest of the app instead of nothing at all.
- Web UI: new sessions default to a fresh sandbox directory instead of the project root — using the actual project root is now the deliberate choice.
- Web UI: the empty-thread "cast" banner is now a crisp SVG logo (larger than before) that recolors with the active theme, replacing the old ASCII-art text render.
Fixed
- Web UI: closing a thread no longer leaves it as the fallback session when reopening the app with no
?session=in the URL. - Web UI: the Tavily/Brave Search API key fields are now masked, the "Save & use ..." button label no longer renders literally as
&, and a low-contrast hint line was removed. - Web UI: the tool-call result expand/collapse arrow is now a proper icon instead of a tiny text glyph.
- Web UI: the streaming response no longer shows a blinking cursor (the composer's input caret is the only one now).
0.8.30
Added
web_searchsupports Brave Search as a third optional backend alongside DuckDuckGo (default) and Tavily. Unlike Tavily's AI-search aggregation, Brave is an actual general web index — a more direct drop-in replacement for DDG. Configure with/web-search-provider(TUI) or the Tools settings tab (cast web).
0.8.29
Added
web_searchsupports Tavily as an optional backend for anyone hitting DuckDuckGo's scrape rate limit (~4 requests per IP before a CAPTCHA blocks further searches) — Tavily's free tier is a recurring 1000 requests/month instead. Configure with/web-search-provider(TUI) or the Tools settings tab (cast web); DuckDuckGo stays the zero-config default.- Web UI: tool call results are now expandable — click a tool card to see its full output (previously request-only), lazily rendered and capped at 64KB.
- Docs: a new research-grounded page on why persona/role framing changes agent behavior, linked from the personas doc and the landing page.
Fixed
web_search: an empty query or one over Tavily's undocumented 400-character limit no longer fails with an opaque HTTP 400 — empty queries are rejected with a clear message, over-length ones are truncated so the search still runs.web_search: the tool's advertised parameters now match the active backend —region/time(DuckDuckGo-only) are no longer offered to the model when Tavily is active, where they silently did nothing.- GitHub Pages landing page and README: the ASCII banner no longer overflows or visibly snaps to size on narrow mobile viewports — replaced with a static SVG that scales like any other image.
- Docs: corrected two fabricated author citations in the persona-research motivation section.
0.8.28
Fixed
- Web UI: reasoning text no longer mixes into the answer (with stray leading blank lines) when a provider streams
<think>...</think>tags that split across chunk boundaries (MiniMax-M3 and similar) — the tag parser now buffers across chunks instead of scanning each one in isolation. - Web UI: the composer's elapsed-time counter is now legible (accent color, larger) — it's the only signal that a still-running request is alive.
glob:**now recurses into subdirectories instead of matching only the top level.grep: the no-rgfallback now matches--globdirectory components correctly instead of only comparing basenames.edit: no longer corrupts CRLF files into mixed line endings; multipleinsert_after/insert_beforeops sharing one anchor now apply in the model's listed order instead of reversed.write: byte count in the tool result now reflects real UTF-8 byte length instead of JS string length.read:limit: 0is no longer silently treated as "no limit"; output is now also capped by byte size, not just line count.ls: symlinked directories are now classified as directories; missing/non-directory paths return a friendly message instead of a raw error.web_search: a cached query no longer permanently capsmaxResultsfor later, larger requests against the same query.web_fetch: a request whose abort signal was already aborted before the fetch started is now aborted immediately instead of running to completion.ssh: a failure to spawnssh/sshpassno longer crashes the whole process.- Background bash tasks: a spawn failure no longer gets silently overwritten with a bogus "exited" status.
- The
tasktool no longer discards a subagent's usage/cost accounting when the subagent's loop throws. - Ink TUI: the tool-call summary line now counts
insert_beforeedits (previously always showed "+0 -0" for them). - Plan mode:
plan_checkreliably matches real, markdown-formatted plan steps, including a step's own nested sub-bullets, regardless of exact wording. - Plan mode: the "write a plan first" error from
plan_doneno longer references the removedplan_writetool.
Changed
- Plan mode: writing, editing, and reading a plan file now goes through the normal
write/edit/readtools (gated to the plan file's path) instead of dedicatedplan_write/plan_edit/plan_readtools — one less parallel implementation to keep in sync.
0.8.27
Fixed
- The
super-researchskill's description exceeded the 1024-character limit, logging a warning on every startup — it is now trimmed to a concise summary. Added a test that guards every builtin SKILL.md description against the limit so it can't regress.
0.8.26
Added
- Web UI: Settings > Provider — a "Verify credentials" button probes the entered URL + key on demand, and credentials are now always verified before a provider is saved; invalid ones are rejected with the reason (auth / unreachable) shown inline. Backed by a new
POST /api/provider/verifyendpoint, matching the CLI add wizard's probe.
Fixed
- Web UI: switching the active provider no longer leaves stale state — the model list refreshes immediately (no page reload needed), and the subagent/plan pickers no longer show a misleading "(inherits …)" hint for a model that isn't on the new provider. Selected models (main / subagent / plan) are reset on a provider switch since those ids belonged to the old endpoint.
- Web UI: the Model tab pickers now show a consistent "Pick a model…" placeholder for every slot, and the model name is no longer duplicated in the section titles.
Changed
- Web UI: the Provider tab is now a clean list (add / edit / delete). The provider a model slot uses is chosen in the Model tab next to each slot, and subagent / plan now clearly inherit the main model's provider ("same as main") rather than referencing a vague "active (default)" concept.
/provider addmakes the first-added provider the active default so the main model works without a manual switch.
0.8.25
Fixed
- Web UI: chat no longer flickers/remounts when toggling the diff panel, reconnecting, or reloading — an SSE reconnect effect was tearing down and rebuilding every message's DOM node on every diff-panel toggle and on every page load.
- Web UI: the saved theme now applies before first paint instead of flashing the hardcoded default accent while
/api/themesis in flight. - Web UI: personas/commands/themes/config are fetched once per tab instead of being re-fetched (and visibly re-flashed) on every SSE reconnect.
- Web UI: trimmed the cold-load waterfall — dropped an unused Inter font import that was blocking the whole JS bootstrap behind an external round trip, added
preconnecthints, and a reload landing on?session=<id>now fetches that thread in parallel with the session list instead of after it.
Added
- Web UI: Settings > Font — pick from 10 monospace and 10 sans-serif fonts (sans only affects interface text; code/tool output/tables stay monospace) plus a text-scale control (85%–150%), both applying instantly with no server round trip.
Fixed
- Web UI: picking a persona for "+ New session" no longer creates a session on the backend right away — it stages a local draft and only creates the real thread on your first message, like ChatGPT's new chat. Abandoned drafts no longer leave permanent "0 msg" entries in the sidebar.
0.8.22
Fixed
- Sandbox ("new") sessions now create their scratch directory under
~/.cast/sandbox/cast-<id>instead of/tmp/cast-<id>, avoiding tmpfs permission and quota issues. The sidebar button is renamed from "tmp" to "new".
0.8.21
Fixed
- Opening the directory picker after choosing "tmp" in the web UI sidebar no longer shows an ENOENT error — the picker is now only reachable for real, existing paths. The scratch directory for tmp sessions is created server-side at session-creation time and named after the session id (
/tmp/cast-<session id>).
0.8.20
Fixed
- New-session directory picker in the web UI sidebar now shows the current directory and the "tmp" option as a single segmented control, with the active choice highlighted — clearer than the previous cramped label+path+button row.
0.8.19
Added
- "tmp" button next to the directory picker in the web UI sidebar — creates a
/tmp/cast-<id>directory for throwaway sessions.
0.8.18
Fixed
- Web server now defaults to
~as the session working directory instead of the directory wherecast webwas launched. Use the directory picker in the UI to choose a project directory per session. TUI mode still uses the current working directory as before.
0.8.17
Fixed
- Web UI Changes panel now shows all file types including untracked files (previously only tracked-file diffs were visible).
git diff --no-indexexit code 1 no longer silently drops untracked files from the diff response.
Added
- Web UI Changes panel groups files by status: New files, Staged, Modified, Deleted, Renamed — each with a colored dot indicator and section count badge.
0.8.16
Fixed
- Reasoning models that consumed the full
max_tokensbudget on thinking alone would silently fail. Now retries with doubled budget. - Model validation incorrectly rejected reasoning models that return
reasoning_contentinstead of<think>blocks.
Added
- SQLite-backed session persistence — sessions survive restarts.
- Web UI scroll-up pagination for long conversations.
- Turn-accurate message counts in session metadata.
- Full session history preserved across context compaction instead of being pruned.
0.8.15
Fixed
- Large tool results (big file reads, web fetches) could push a session past the context-compaction threshold mid-turn and only get caught reactively once the next model call overflowed. A new guard now compacts right after such a tool result lands, before the next call is made.
Internal
- Unified the three compaction call sites (turn-start check, mid-turn guard, overflow retry) behind one shared helper to keep their message-splicing and event-emitting behavior in sync.
0.8.14
Added
- Shared prompts adapted from MiMoCode: Doing tasks, Executing with care, Tone and style.
- Cast context prompt — all personas now know about cast-specific commands, rules, skills, and plan mode.
Fixed
- Removed duplicate Action safety section from harness-discipline (now covered by Executing with care).
- Renamed cast from "coding agent" to "agent harness" to reflect all persona types.
0.8.13
Added
- New builtin skills from MiMo Code:
arxiv— search, read, cite academic papers from arXivdeep-research— parallel sub-agent research with cited reportsfrontend-design— UI/UX design guidancelearn-everything— interactive learning from documents/PDFssuper-research— autonomous research experiments
- Updated
castskill with nested rules, apply modes table, and full commands reference.
0.8.12
Fixed
- Web UI:
<system-reminder>blocks (compaction, date-rollover, interrupt reminders) now render as styled warning messages instead of raw XML tags after session reload. - Web UI: SSE reconnect — full state sync from server, stale streaming blocks cleared, auto-scroll to latest messages, visibility change detection for mobile tab switching.
- Web UI: message count in sidebar now shows only user and assistant messages (was inflated by hidden tool/system messages).
- Web UI: header "cast" text replaced with themed status dot indicator (green=connected, yellow=reconnecting, red=offline).
- Web UI: ASCII banner no longer overflows on vertical mobile screens — added
white-space: preandmax-width: 100%.
0.8.11
Fixed
- Mobile: ASCII banner no longer overflows on vertical phone screens — font-size reduced to 0.6rem on viewports ≤768px.
0.8.10
Added
- Multi-provider per-model-slot selection: each model slot (main, subagent, plan) can now use a different saved provider. New commands
/subagent-model-providerand/plan-model-provider. Web UI Settings shows cascading provider → model dropdowns for all three slots. - Web UI: skill/plugin full content reader — book icon loads SKILL.md from disk and displays in a centered popover with scroll. Info icon shows short description.
- Web UI: skills grouped by source (Built-in, Global, Project, Plugin) with plugin ID shown for plugin-sourced skills. MCP servers grouped by source (Global, Project).
- Web UI: markdown table rendering in chat messages.
- Web UI: SSH key paste support — paste private key content directly in the SSH form, saved to
~/.cast/keys/with 600 permissions. - Web UI: provider edit support — edit button pre-fills URL/API key for modification.
- Web UI:
user_messageSSE broadcast — user messages from one tab appear in all other tabs viewing the same session. - Web UI: new block-char ASCII banner (
░▒▓█) for both TUI and web.
Fixed
/reloadskips MCP reconnect when config unchanged — 2.7s → 27ms (100x faster)./queue-reset//qrnow clears pending queue badges in the web UI.- ESC key closes info popovers before settings modal (proper layered close via
stopPropagation). - Markdown tables now render as
<table>elements in web UI chat. - Provider tab no longer crashes with
i.push is not a function(htm&&→ ternary fix). - Models load instantly in Settings via
/api/models/cached(no network call on open). - All icon buttons use unified cyan hover accent; focus outlines removed.
- Pending steer (cyan) and queue (amber) items color-differentiated above the composer.
Changed
- Web UI Settings modal: fixed height with scroll (no size jumping between tabs).
- Web UI: all text buttons replaced with verified Heroicons v2.1.5 icons with title tooltips.
- Web UI:
GET /api/models/cachedreturns cached models instantly;GET /api/models?provider=<name>fetches from a specific provider. - Web UI: SSH form fields stacked vertically with key paste textarea.
- Web UI: plugins show
pluginname +marketplaceas meta; skills showname+source/pluginIdas meta.
0.8.9
Added
- Web UI: real-time sidebar updates — status, title, and message count changes are now broadcast to all connected browser tabs via SSE
session_updateevents, eliminating the need for manual refresh. - Session summary index expanded with persona, model, title, pinned, and createdAt fields — cold session sidebar rows no longer require parsing full session JSON.
- JSONL session persistence — messages are now appended incrementally to
.jsonlfiles instead of rewriting the entire session JSON on every mutation. Legacy.jsonsessions are auto-migrated to JSONL on startup.
Fixed
- DECXCPR cursor-position queries (
\x1b[6n]) no longer leak as visible escape sequences when stdin is not in raw mode (e.g. duringsuspendTerminal, tmux focus-out). <Static>items now use stable WeakMap-based keys instead of index-based keys — messages no longer disappear after compaction, steering injection, or session switch.- TUI: StatusBar extracted into its own component with local 200ms tick — elapsed-time updates no longer re-render the Composer area.
- TUI: ChatLog wraps useWindowSize in its own component — resize events no longer cascade re-renders through the Composer.
Changed
- Web UI:
session_endSSE event carries usage and message count — the frontend only refetches the full session when message counts diverge (reconnect recovery), skipping the fullGET /api/sessions/:idon normal uninterrupted runs. - TUI:
/model,/plan-model,/subagent-model,/provideruserefreshMeta()instead ofrefresh()— no unnecessary message rebuild when only config metadata changes. toDisplayMessagesuses O(M) Map lookups instead of O(N×M)messages.find()for tool result matching.- TUI:
maxFpsreverted from 60 to 30 — double write frequency increased desync/flicker odds on slow terminals (SSH, tmux, mobile emulators).
0.8.8
Fixed
- Web UI: page refresh during a running agent turn no longer loses the final assistant message — the
endevent now merges server-persisted messages into the client state. - Web UI: pre-run save ensures the user's message survives a mid-run process kill (SIGTERM timeout, OOM, crash).
- Web UI: elapsed timer pauses when the SSE connection drops instead of counting up with a stale connection.
- Web UI:
statusevent on SSE reconnect now refetches messages if the run completed while the client was disconnected. - Web UI:
fetch()andEventSourceURLs now usewindow.location.originexplicitly to avoid cross-origin issues behind reverse proxies.
0.8.7
Fixed
- Web UI static files (HTML, CSS, JS) now ship in release installs —
cast webwas returning 404 becausedist/public/wasn't included in the archive. cast web --foregroundcorrectly uses the specified--portinstead of always defaulting to 1337.
0.8.6
Fixed
cast webdaemon spawn now works in release installs (no longer requirestsxor TypeScript sources).cast web --foregroundruns inline instead of spawning a child process.
0.8.5
Added
cast webnow detects already-running instances and refuses to start a duplicate (instead of silently spawning a second server on the same port).cast web --public/--host 0.0.0.0— bind to all interfaces for network access (prints a security warning).cast web stopgracefully shuts down open sessions (SIGTERM), escalating to SIGKILL after 3s. Detects and cleans up stale state when the process is already gone (crash, OOM,kill -9).cast web statusauto-heals stale PID files — reports honestly instead of claiming a dead process is running.- Built-in
skill-creatorskill (user-invoked): reference for writing predictable skills, based on Matt Pocock's methodology (invocation modes, information hierarchy, leading words, pruning, failure modes).
0.8.4
Added
- New shared prompt section (
verification-discipline.md) instructs the agent to verify changes against the real running interface rather than trusting tests alone — appended to every persona and subagent prompt.
Fixed
- Search tool (
grep,glob) no longer blocks the Node event loop whilefd/rgrun — switched from sync to async subprocess execution, which matters under concurrent tool calls.
Internal
- Eval harness restructured into
benches/(basic, hashline, mutation) +lib/(runner, fixtures, results, trace-view). - Eval runner now supports model comparison (
--compare,--compare-x3) and trace replay (--trace). - Added mutation bench for measuring tool robustness against prompt perturbations.
- Added eval methodology doc (
docs/eval-methodology.md).
0.8.3
Changed
- All persona prompts now consistently mention conditional tools (ssh, background bash) via the "go by your actual tool list" note —
coding.mdandsre.mdwere missing it.
0.8.2
Changed
- Persona prompt tool lists no longer hardcode
ssh— they now point the model at its actual tool list, so tools that are only conditionally available (ssh, background bash) aren't advertised when absent.
0.8.1
Added
- Background bash tasks: the
bashtool gains arun_in_backgroundparameter (web and TUI only). Setting it totruespawns the command without blocking and returns a task id immediately. Completion arrives automatically as a<system-reminder>— no polling needed. Two companion tools (bash_output,bash_kill) let the agent check progress or terminate a task early. Background tasks survive across turns and are session-scoped; they're reaped on session close.
0.8.0
Added
- Web UI (
cast web): browser-based control room for managing background agents. Creates sessions with different personas, streams responses token-by-token, shows tool calls as terminal-style cards, and includes a resizable git diff viewer. Settings modal covers model/reasoning, theme, web tools, bash confirmation mode, and MCP/skills/plugins/provider/SSH management. Non-blocking slash commands (/help,/current,/usage) work while the agent runs. Keyboard shortcuts reference (Ctrl+//⌘/) for sidebar, diff, new session, and clear-context. Auth with auto-generated password. Same sessions persisted to~/.cast/sessions/as the TUI.cast web— start in background (daemon)cast web stop/cast web status— manage the servercast web --foreground— run inline for dev/debug- Default port 1337, configurable via
--portorCAST_WEB_PORT
0.7.12
Fixed
- Ink incremental rendering enabled (
incrementalRendering: true) — only repaints lines that actually changed, reducing terminal traffic and eliminating flicker on frequent redraws. Frame rate cap raised from 30 to 60 FPS for a more responsive composer.
0.7.11
Fixed
- Removed focus-reporting mechanism (
\x1b[?1004h) that triggered a terminal resync on alt-tab: some terminals send focus-in reports unprompted, causing spurious screen clears that wiped the banner and broke the viewport. Focus in/out sequences are still silently dropped by the input parser so they never surface as stray characters.
0.7.10
Fixed
- Autoscroll breaks after Alt+Tab: switching away from the terminal and back no longer leaves the viewport stuck — resync respects the current scroll position instead of force-resetting it.
Changed
- Shift+Tab keybinding removed from Composer — simplified input handling, removed dead code from input-parser and keybindings.
0.7.8
Fixed
- Terminal rendering corruption on Termius (mobile) and similar terminals: Ink's per-line erase sequence (
\x1b[2K\x1b[1Arepeated) is now coalesced into a single combined cursor-up + erase-to-end-of-screen before writing, preventing orphaned top-border fragments from stacking on every keystroke.
0.7.7
Added
/continueslash command — resumes the most recent session without leaving the current one. In-session equivalent ofcast -c.
Fixed
- Streaming output no longer overflows the viewport when the composer grows taller than the static budget estimate: ChatLog now shrinks its live-region budget reactively based on the actual last-frame overflow, so one bad frame self-corrects instead of repeating every frame.
- Composer ghost rows (streaks, duplicated borders) after deleting multi-line input: the frame now uses a sticky max height and pads back on shrink instead of letting Ink leave stale rows on screen.
- Synchronized-output flash on terminal resync (clear + replay): both writes are now wrapped in CSI ?2026h/l so the terminal buffers and swaps atomically.
- Resync no longer fires immediately after an aborted turn (Esc): the disruptive full clear + scrollback wipe lands on the next turn that actually completes instead.
- Reasoning and content block labels (
[reasoning],[agent]) no longer repeat on every split-off line of the same streaming run. - Edit tool results no longer shown inline in ChatLog (same treatment as
read). - Composer re-renders on every stdin chunk even when nothing changed (DECXCPR responses, focus reports, partial escapes): now skipped unless the buffer value or cursor position actually moved.
- DECXCPR poll rate adapts: 200ms during streaming or when a resync is pending, 1s at idle to reduce unnecessary terminal traffic.
- Spinner render cycles reduced ~35% (120ms interval vs 80ms) with no visible quality loss.
Internal
splitCompleteLinesdrains completed lines from the trailing streaming block incrementally, giving the final answer the same steady commit cadence reasoning already gets.useTerminalResyncscroll flags (scrollUp,scrollUpStale) reset after a resync clear, so the next Ink frame isn't swallowed by the scroll guard.- Vitest
NODE_OPTIONS=--no-deprecationsuppresses the punycode warning fromopenai -> node-fetch -> whatwg-url.
0.7.5
Added
- Personas travel with the thread: each session remembers the persona that drove it, and resuming (
-c,--resume,/sessions) restores it — same rule as plan/build mode. The global setting remains the default for new sessions; a deleted persona falls back to the current one with a notice. - Switching to a different persona (
/persona) in a non-empty thread now offers to start a new session, so the previous persona's context doesn't bleed into the new role; "Continue here" / Esc keeps the current thread. - Four new built-in personas rounding out the IT-company role set:
architect(trade-off analysis, ADRs, module boundaries),analyst(requirements from vague asks, contradictions, API contracts),sre(incident response, blameless postmortems, SLOs), andproduct(hypotheses, success metrics, prioritization — distinct from the ticket-writing Project Manager). - Built-in persona
coder-with-subagents-force-review(Coder · forced review): same delegation ascoder-with-subagents, plus a mandatory review gate — every code change goes through an independentreviewsub-agent (fresh context, diff-based input, execution-confirmed findings, exactly one round) before being reported done. No "too trivial to review" exception for code.
0.7.4
Fixed
- Provider requests fail on Node 24 with "Cannot connect … (invalid content-length header)": the OpenAI SDK sets an explicit
content-lengthheader, which is a forbidden fetch request header — Node 24's undici rejects the request outright (Node 26 silently ignores it). cast now strips it and lets the runtime compute the value; model selection/chat work on Node 24 again.
0.7.3
Fixed
- Windows:
cast upgradeno longer crashes on exit withAssertion failed: !(handle->flags & UV_HANDLE_CLOSING)— the hardprocess.exit()right after the release-check fetch raced libuv's handle teardown; the command now returns and lets the process exit naturally.
0.7.2
Fixed
- "Cannot connect to
" errors now include the underlying network detail ( ECONNREFUSED/ENOTFOUND/ certificate errors, including ones buried in undici AggregateErrors) — DNS, dead-endpoint, and TLS-interception failures need different fixes and were indistinguishable. - Windows: the Git Bash registry probe no longer leaks
reg.exe's localized stderr into the TUI as mojibake when the GitForWindows key is absent.
0.7.1
Added
- Fuzzy search in the session picker (
--resume,/sessions): type to filter by project path, session id, or any user/assistant message text in the thread; substring matches rank above subsequence (typo-tolerant) matches.Escis the only cancel key while searching —qgoes into the query. writereplies with a line diff vs the previous content (plus trailing-newline notes) instead of a byte count; new-file and identical-content cases are reported explicitly.writeandeditwarn when the resulting file contains consecutive identical lines — the classic symptom of a duplicated-line botch.editauto-recovers a stale anchor that matches a run of contiguous byte-identical duplicate lines (they're interchangeable), instead of dead-ending with "multiple lines match".- Windows: the
bashtool locates a native Git Bash (CAST_BASH env override → GitForWindows registry key → known install paths incl. no-admin and scoop → derivation fromgiton PATH) instead of picking up the WSL shim from PATH, which loses output. Falling back to PATH bash warns at startup and in the first tool result. - Session summary index (
~/.cast/sessions/index.json): the picker lists hundreds of sessions from an mtime-validated cache (~5ms warm) instead of parsing every session file; the full session is parsed only for the one you pick. Self-healing — safe to delete. cast -cfinds the most recent session by file mtime and parses only that file (was: parse everything).
Fixed
- Prompt-cache markers (
cache_control) no longer leak into saved sessions:applyCacheControlworks on request-only copies, and loading normalizes sessions damaged by older builds — fixes opaque 400s ("Can only get item pairs from a mapping") when resuming after a provider switch. - Resuming a session created on a different provider falls back to the currently configured model (with a notice) instead of sending requests to a model the new provider doesn't serve.
- Tool-call arguments that are valid JSON but not an object (e.g. a bare array) are wrapped before sending, so providers whose chat template iterates arguments as a mapping don't reject the whole history.
- Stdio MCP servers inherit cast's full environment (config
envwins) — shell-exported API keys now reach servers; the SDK's whitelist default silently stripped them. - Remote MCP servers that only speak the legacy HTTP+SSE transport now connect: Streamable HTTP is tried first, then one SSE retry on rejection. SSE JSON-RPC POSTs run on a dedicated connection pool — the long-lived
/ssestream otherwise serializes them behind itself in Node's fetch and the handshake hangs forever. - SKILL.md / persona / rules frontmatter survives a UTF-8 BOM (Windows Notepad,
Out-File); previously the whole frontmatter was silently discarded. - Plugin marketplace commands report "git is not installed or not in PATH" instead of a raw
spawn git ENOENT; staging directory names derived from Windows local paths no longer contain\or:; marketplace install retriesrm/rename against transient Windows EPERM/EBUSY locks. getMostRecentSessionskips a corrupt (half-written) newest session file and falls back to the next one.bashtool reports a clean error when the bash executable itself can't be spawned (e.g. a wrongCAST_BASH), instead of hanging.
Changed
- Docs: provider credentials are configured only via
~/.cast/settings.json//provider— thePROVIDER_BASE_URL/PROVIDER_API_KEYenvironment variables were documented but never read; the docs no longer claim otherwise. - Minimum Node.js version raised from 18 to 22 (required by undici 8.x used for MCP SSE transport).
0.7.0
Added
- After compaction (auto or
/compact), cast injects a separate trailing<system-reminder>user message with edited files and a TODO list of open plan steps. Steps come from- [ ]checkboxes when present, otherwise from###headings under## Steps(common in real plans). Omitted when there is nothing actionable; summary text stays reminder-free. - Turn-end open-work gate in build mode with an active plan: if the model stops without tool calls while plan steps remain open, cast injects a
<system-reminder>and continues sampling (up to 2 times per user prompt, then falls through with an exhausted notice). - After a mid-stream
/abort(Esc) with no tool-result abort signal, cast appends a<system-reminder>([Request interrupted by user]) so the next turn’s model sees that the prior turn was cut off. - Overnight sessions get a one-shot
<system-reminder>when the local calendar date advances past the last announced day (persisted per session). - Built-in
exploreandreviewsubagents fortask(read-oriented tool allowlists).coder-with-subagentssteers mapping toexploreand validation toreview;workerremains the default catch-all for everything else. - Marketplace plugins (Grok/Claude-shaped):
/plugin marketplace add,/plugin install name@marketplace— installs contribute skills from~/.cast/plugins/. /skillsand bare/pluginopen multi-select toggles (same UX as/mcp); disabled skill names persist indisabledSkills.- Default marketplaces auto-seeded once: Codex (
openai/plugins), Claude (anthropics/claude-plugins-official), Grok (xai-org/plugin-marketplace). /pluginslash palette lists install / marketplace / toggle subcommands; builtincastskill documents plugins + toggles.- Bare
/plugin uninstallopens a picker + confirm (typedname@marketplacestill works). /skills uninstalland/mcp uninstall— interactive picker + confirm (or typed name); removes global/project skills and mcp.json entries, clears matching disable flags, hot-reloads.- Uniform
/skills//mcp//pluginsurface:list,enable/disable,help; toggle cancel shows[Cancelled]; no-op toggle skips reload; typed uninstall confirms;/plugin marketplace removecleans settings + reloads skills. - Skill discovery loads skills.sh universal paths:
.agents/skills/(project, trust-gated) and~/.config/agents/skills//~/.agents/skills/(global), sonpx skills add … -a universalworks without copying into.cast/skills/. /skills,/mcp, and/pluginpickers/lists sort entries alphabetically by name (skills were previously discovery-order, so plugin skills clustered at the bottom)./skillslabels plugin skills with their pack id (plugin · name@marketplace). Skills from a disabled pack stay visible but locked (muted) until/pluginre-enables the pack./skills uninstalllists plugin skills as muted/locked (remove the pack via/plugin uninstall); Enter on those rows is ignored.
Fixed
readtool rows show the correct 1-indexed line range (was off-by-one whenoffsetwas set).- Live-region
taskrows stay one-line (truncate) while streaming so parallel tasks remain visible; full wrapped assignment still shows once promoted to history. - Committed
tasktool rows show the full subagent report (wrapped), not a 500-char truncated line. - Session rebuild/resume restores tool
[error]via persistedcastIsErroron tool results (was always[ok]). - Trackpad scroll during an active agent turn no longer fights Ink redraws: while the live region fits the screen, cursor-position polling stays on (and short CUU frames cannot clear the scroll-up guard); tall streaming frames skip that poll so a false scroll latch cannot swallow redraws and scramble scrollback.
- Sync
tasksubagents honor parent--no-skills/--skill(they previously always loaded global/builtin/plugin skills and ignored CLI skill paths).
Changed
- Docs spell out hot-reload vs
/reload:/skills//mcp//plugintoggle and install/uninstall apply in-session;/reloadis only for on-disk file drops/edits (same chat, no restart). /skills//mcp//pluginpickers put the full description on the focused second line (wrap), not truncated into the label.taskUI shows the delegated assignment text (not raw JSONkey=valueargs). Non-default subagent names are prefixed (explore · …).- Subagent final-answer extraction ignores empty placeholder turns (
(no response)); the worker prompt requires a standalone closing report. - Sync
tasksubagents now receive the same environment grounding as the parent: Current System State (cwd/date/platform/model), always-apply + lazy rules, skills catalog, MCP server list, and SSH hosts. --no-skillshelp/docs clarify that plugin skill discovery is skipped too (behavior unchanged).coder-with-subagents(and thetasktool description) steers harder on user cues like “parallel” / “independently”: split into same-turn multi-taskcalls instead of solo exploration.- Shared prompt append adds Agent discipline (action safety, parallel tool calls, preamble-with-tools, prompt secrecy) for all personas and subagents.
0.6.12
Changed
- Renamed the file-search builtin from
findtoglob(same glob-pattern behavior). Legacyfindcalls andtools: [find, …]allowlists still work. - Shared file-tool guidance steers named-file tasks to
readfirst; shortglobresults remind the model toreada hit instead of another search/ls. editinsert_afteraccepts anchorEOFto append at the end of a file (alongside existing0:for the top).
Fixed
editrecovers unique hash-only anchors when the model omits the line number (local:chunkinstead of22:local:chunk), and accepts ASCII->gutters the same way as→.- Shared file-tool guidance (all personas and subagents) now spells out the read→edit workflow: known path skips
glob, oneeditper file, copy the full three-part anchor, retry from tool-returned anchors instead of re-searching. - When
read/editmiss a path, cast runs a basenameglobunder the hood and lists real matches so the model can retry the correct path without starting its own search loop.
0.6.11
Added
- Persona and subagent frontmatter support
tools(builtin allowlist; exact names or*-globs likeplan_*/web_*) andagentsMd(defaulttrue). Omittoolsfor all builtins; MCP tools are never filtered by the allowlist. Session gates (plan/build mode, web toggle) still apply on top.
0.6.10
Fixed
editreturns edited regions with fresh anchors on success, so a follow-up edit on the same file no longer needs a re-read after lines shift under prior anchors.readoutput was switched from the two-part<LINE>:<HASH>→anchor format to the three-part<LINE>:<LOCAL>:<CHUNK>→format (introduced during the 0.6.9 cycle). The three-part form gives finer-grained movement detection when lines shift around, and the stale-anchor error path now returns a fresh anchor instead of failing blind.
0.6.9
Added
editnow acceptsinsert_beforeto add new lines above a target anchor (in addition to the existinginsert_after). Useful when the natural reference is a heading you want content to sit above rather than below.- Successful
editoperations now return the edited regions with fresh anchors, so a follow-up edit doesn't need a re-readeven when prior anchors shifted.
0.6.8
Changed
- Hashline anchor format switched from
<LINE>:<HASH>to<LINE>:<LOCAL>:<CHUNK>forread/edit/grepoutput. The three-part form gives finer-grained movement detection when lines shift around, and the stale-anchor error path now returns a fresh anchor instead of failing blind. Anchors emitted under 0.6.7 are no longer valid; re-read the file to get anchors in the new format.
Fixed
parseAnchornow ignores any content past the→separator, so pasting areadgutter line (with its arrow and trailing content) intoeditproduces the correct anchor instead of a malformed one.
0.6.7
Changed
readoutput now carries hashline anchors in the form<LINE>:<HASH>→contentso a line reference made in one assistant turn still points at the same line after a re-read;editacceptsreplace/insert_after/writeoperations keyed by those anchors and validates the whole batch atomically against the current file (stale anchors return fresh anchors instead of failing blind).
Internal
- Per-line hash computation for
read/edit/grepis now backed by an in-memory LRU (default 20 entries, ~4 MB worst case). Entries are re-validated against filemtimeon every access, so cache hits silently invalidate after external edits. Lruexposes asizegetter so the test-onlyhashlineCacheSizeno longer reaches into a private field.
Internal
read/editnow emit and accept hashline anchors (<LINE>:<HASH>→…) so line references in the conversation survive re-reads; edits are validated atomically against the file as it stands at edit time- In-memory LRU (default 20 entries, ~4 MB worst case) caches per-line hashes for
read/edit/grep; entries are re-validated against filemtime, so cache hits silently invalidate on external edits - Added a public
sizegetter on the LRU sohashlineCacheSizeno longer reaches into a private field
Changed
/currentmodel line shows the configured model and the live plan model together when plan mode swaps in a separate one, so the discrepancy from the status bar becomes visible instead of silently different.
Internal
/currentrendering moved intoformatValueon each registered status bar segment — adding a new segment now needs one place instead of two.applyProviderSelectionextracted from/provider activate— the post-save flow (selectModel→selectReasoningLevel→refresh) lives in one helper./provider addkeeps its own notice wording and stays inline./currentand/usagereuseabbreviateTokensandformatContextPctfromApp.tsx— localfmtK(no M-branch) and a duplicated context-percent formatter are gone.- Hermes XML strip is a single function (
stripHermesToolCalls) shared bycore/llm.tsand the streaming path — the previously duplicated private copy was deleted. ensureConnectionAlivenow writes the full providers array (not just legacyproviderUrl/apiKey); the regression test was tightened to assert exactly what gets persisted, including that existing providers survive a reconnect prompt.- New
test/statusbar.test.tscoversdefaultStatusBarConfig, theSEGMENT_MAX_WIDTHoverflow map, and the empty-data paths of the registered renderers; newformatValuetests cover the plan-mode model divergence.
0.6.5
Added
- Multi-provider support —
/providernow opens a picker to switch between saved providers;/provider addadds a new provider (name → URL → key wizard);/provider deleteremoves one. Providers persist insettings.jsonand the active one is remembered across sessions.
0.6.4
Fixed
- Hermes tool-call recovery — XML
<function=…>blocks in assistant prose (e.g. the model describing the feature itself) are no longer mis-parsed as live tool calls, preventing400 Param Incorrectloops on the next request. Recovery and dedup-strip now gate on actual tool names from the current session.
0.6.3
Fixed
- Streaming dedup — Hermes models that emit both XML
<tool_call>blocks and native function-calling in the same response no longer produce duplicate tool invocations
0.6.2
Added
/statusbarcommand — toggle, reorder, and reassign status bar segments between left/right sides via an interactive picker. Config persists across sessions. Useful on narrow/mobile terminals where the full bar overflows. Default: persona, mode, model (left) and elapsed (right); toggle others via/statusbar./currentcommand — show all status bar data in a list, including disabled segments
0.6.1
Fixed
- Terminal resync — resize and focus-regain now use a light clear that preserves scroll position; theme changes and streaming desyncs still do a full scrollback wipe
- lineChurn — O(m·n) fallback for large edits uses Set-based comparison instead of raw block count; identical large texts no longer report false positive changes
- Input parser — DECXCPR cursor-position responses (
\x1b[row;colR) explicitly dropped to prevent accidental keybinding matches
Internal
displayWidthextracted tosrc/ui/display-width.tswith per-session cache- Test directories isolated to prevent parallel test collisions
0.6.0
Added
- SSH tool — run commands on remote hosts via SSH; hosts configured in
~/.cast/ssh.json(global) or.cast/ssh.json(project) /queue-resetalias — shortcut for clearing the command queue
0.5.8
Added
- MCP server toggle —
/mcpnow opens an interactive multi-select picker to enable/disable individual servers mid-session. Disabled servers are hidden from the model and persisted in settings. <available_mcp>block in the system prompt — the model sees only enabled MCP servers and their tools, and will not attempt to call disabled ones.- Hermes XML tool-call parsing and recovery
- Terminal desync tracking with automatic resync on focus return
0.5.7
Added
- Enhanced search functionality with permission handling and output notes
- Improved tool name sanitization to prevent doom loops
0.5.6
Fixed
- Terminal tools (
plan_done,plan_enter) now force-end the turn — prevents the model from keeping runs alive by rewording summaries to dodge the doom-loop detector plan_doneno longer echoes full plan content into model context, which invited endless "refinement" loops
0.5.5
Added
- Changelog page with version history from 0.1.0 to 0.5.4
- Sequential prev/next navigation on all documentation pages (reading loop: Getting Started → ... → Changelog → Getting Started)
/usagecommand documented in README and interactive commands reference- Plan mode refine option uses the regular composer (multi-line and image paste supported)
Fixed
- Improved provider error classification — OpenAI SDK
APIConnectionErrorcause chain is now fully traversed for accurate error reporting
0.5.4
Fix: ensure non-negative token counts in usage tracking and streaming.
0.5.3
Fix: /usage now correctly shows sub-agent token breakdown.
0.5.2
Added
/usagecommand — show cumulative session token/cost usage/exitcommand — alias for/quit
0.5.1
Changed
- Repositioned cast as a "role-based agent harness" — 13 built-in personas, same tools, different judgment
0.5.0
Added
- Plan mode —
/planenters a read-only exploration phase; the agent studies the codebase and writes a structured execution plan with a checklist - Plan tools:
plan_write,plan_edit,plan_read,plan_done,plan_discard,plan_enter,plan_check - Per-phase model support —
/plan-modelsets a separate model for planning vs building - Plan files persist as markdown in
~/.cast/plans/; survive compaction and session restarts - Approval dialog: implement now, clear context + implement, approve for later, or refine
- E2E smoke test for plan mode
Changed
- Comprehensive documentation overhaul — all features now documented in
docs/
0.4.7
Added
- Improved picker viewport handling with scrolling and index clamping
- 8 new dangerous bash patterns (fork bombs,
shutdown,npm publish,killall, etc.)
0.4.6
Changed
- Enhanced dangerous command detection in permissions
0.4.5
Changed
- Removed interactive command checks from permissions (simplified)
0.4.4
Added
- Web tools —
web_search(DuckDuckGo) andweb_fetch(Jina Reader) for internet access - Web tools are off by default; toggle with
/web(persists to settings)
0.4.3
Added
- Doom loop detection — blocks a tool after 3 identical consecutive calls with the same arguments
Fixed
- Streaming viewport clamping and scroll position issues
0.4.2
Added
/copycommand — copy last assistant response to clipboard
Fixed
- Scroll position not resetting on resync while user is scrolled up
0.4.1
Fixed
- Atomic writes for session and settings files (prevents corruption on crash)
- Session listing and MCP connect timeout hardening
- Clear error on missing required prompt files
- Persona sorting uses label instead of name
Changed
- Split
tools.tsinto per-tool modules (bash.ts,files.ts,search.ts,web.ts,task.ts) - Centralized prompts directory resolution
0.4.0
Added
- Multi-source personas — project-local, global, and builtin with priority ordering
- Sub-agent support via the
tasktool — delegate work to isolated sub-agents coder-with-subagentspersona
0.3.17
Added
- Brace expansion in glob patterns
- Enhanced gitignore handling
Changed
- Agent loop and UI performance tracking improvements
0.3.16
Added
- Non-interactive mode —
cast runsends a single prompt, streams to stdout, exits --format jsonfor structured JSONL output
0.3.15
Added
/repocommand — show cwd, git branch, dirty state, remote, and HEAD- Multiple color themes (16 total)
0.3.13
Added
- Theme support —
/themepicker, persisted to settings
0.3.12
Fixed
- Made node-pty optional with pipe fallback for release bundles
0.3.11
Added
- PTY for bash commands — captures interactive prompts (e.g.
npm init)
0.3.10
Fixed
- Live bash command reveal only when waiting for input
0.3.9
Added
- Re-pick model when provider token changes at startup
- Custom model id entry in picker
- Surface actionable turn errors (revoked key, quota exceeded, no access)
- Recover from dead provider connection at startup
- Esc stops the running turn; Ctrl+C exits with confirmation
Fixed
- Provider key persistence on re-entry
- Distinguish aborted, disconnected, and completed turns at stream end
0.3.8
Changed
- Streaming and rendering logic overhaul for chat messages
0.3.7
Added
- StdinManager for handling interactive input in child processes
Changed
- Streamlined session handling
0.3.6
Fixed
- Inline model context windows map (removed external JSON file dependency)
0.3.5
Changed
- Documentation updates
0.3.4
Fixed
- Message sanitization and tool call handling
0.3.3
Fixed
/steerbehavior when idle (now submits as normal prompt)
0.3.2
Added
- Paste chip functionality in Composer
- Command aliases:
/sfor/steer,/qfor/queue - Nested context file resolution (AGENTS.md in subdirectories)
0.3.0
Added
- Rules system — Cursor-compatible
.cast/rules/*.mdwith always/auto/lazy/manual modes @rule-namementions in messages- Chat log display improvements (clampTailToRows)
0.2.3
Added
- System state block in system prompt (model, reasoning, cwd, git branch)
0.2.1
Added
/keyscommand — list all keybindings
0.2.0
Added
- Multi-source personas (project > global > builtin)
- Built-in skills
- Cast meta-skill for self-configuration
0.1.4
Fixed
- Token count abbreviation in status line (8.7k, 1.2M)
0.1.3
Added
/modelhighlights current selection in picker- Honest reasoning display
0.1.2
Fixed
reasoning_contentfield support- Resize reflow
- Tool call summaries
/steerand/queuevalidation
0.1.1
Fixed
- ThinkBlockParser off-by-one
- Added QA personas and vendors tests
0.1.0
Initial release. Ink TUI, 13 built-in personas, OpenAI-compatible provider, session persistence, context compaction, MCP servers, skills, parallel tool execution, sub-agents.