v0.94.0
Crux v0.94.0
A large update to Crux's terminal interface, remote execution model, and agent runtime. This release refreshes the TUI layout and panels, lets a paired client run its own providers and accounts on a remote Crux server, adds a Queue/Steer delivery toggle, browser-authenticated fetching with explicit consent, Anthropic prompt caching, provider branding, a TUI preview server, and a durable authentication and pairing recovery model.
This release brings together the changes since v0.93.0. The remote workspace work is described in depth in the remote workspaces and pairing integration notes; this document summarizes it alongside everything else.
Terminal interface
- The chat, sidebar, input, dialogs, and notifications share a unified panel surface: the input and expandable panels use the chat background, code blocks use a distinct background, neutral panels share a palette, and secondary/selected text contrast is enforced by tests. Dark provider heading colors are raised in luminance for readability without changing stored brand colors.
- The sidebar is enabled by default, adapts its sections to the terminal height, and prioritizes Model/Context and files. Session now sits below Model/Context and shows the remote endpoint, a bold title, and a selectable short session ID that can be copied to the clipboard; unassigned sessions show no ID. The directory line has a padded light background, truncates at rest, and animates only while hovered. The sidebar opens adaptively after the first message in a new session and when continuing or resuming a session.
- Context occupancy in the sidebar and session protocol now includes unseen local tokens and compaction occupancy, so the displayed usage matches what the next request will carry.
- A new task panel (
ctrl+torctrl+spaceto toggle,ctrl+downto hide and restore without losing state,Escaperetains its existing behavior) lists background shells, agents, and image jobs with live output following, cached-output scrolling, restart, layered detail, and a terminal-style detail frame. Task notifications expand with Space or left click and copy their result and diagnostics together. - Expanded tool results reveal long lines, keep source line numbers on the first visual row of code, fill wrapped diff rows, and preserve multiline error details. Search results are grouped and highlighted with expandable matches; skill loads separate metadata from instructions; directory summaries prioritize the tree and disclose the remainder.
- Summaries render as collapsible cards that preserve Unicode and tool errors. Blank thinking rows are skipped while a single non-blank thinking line remains visible.
- Long yes/no questions get a bounded editor layout, the instructions preview supports compact section navigation, the status bar uses extra terminal width for help, and the todo box fits its goals and floats above the input.
- Fixes terminal-width handling for initial and incremental frames, including wide and combined-character updates.
- Custom provider logos: labels of one to five characters use large block letters, six or seven use compact two-row lettering, and anything else renders as centered text.
Keyboard changes
| Key | Action |
|---|---|
alt+s |
Toggle Queue/Steer delivery mode |
ctrl+i |
Open the codebase index dialog |
ctrl+t / ctrl+space |
Toggle the task panel |
ctrl+down |
Hide or restore the task panel |
ctrl+b |
Send a foreground-waited shell command to the background |
shift+tab |
Cancel plan mode at any stage |
Queue and Steer
- Adds Queue/Steer message delivery, toggled with
alt+sand persisted per project astui.delivery_mode(defaultqueue). Steer interrupts generation and running tools, keeps completed results, and waits only for in-progress summarization. - Model changes made while a tool is running apply to the next model response.
ctrl+bdetaches a foreground-waited shell command to the background; background shells can be restarted under the same ID after they finish.
Remote workspaces: client-owned providers and pairing
New workspaces opened through a saved connection now execute with the client's selected providers, accounts, models, configuration, and plugin bundles. The server does not need those bundles installed, and a server-installed provider with the same ID cannot replace the accepted client definition. Server-owned workspaces remain available on request.
crux --connection NAMEopens the authenticated workspace menu and a bounded remote directory browser. Remote client runtimes load from the global client configuration, excluding the launch project's model settings, and honor explicit command-line model overrides.- Clients call
GET /v1/runtime-capabilitiesbefore submitting a private runtime proposal. Both peers must support runtime protocol version 1 and compiler identitycrux-declarative-runtime-v23; older receivers are rejected explicitly with no fallback to server providers. Negotiation failures are reported by their actual HTTP cause. - Provider, model, account, instruction, and runtime-control changes publish complete atomic revisions. Invalid or stale updates preserve the previously accepted runtime. The accepted runtime reaches main inference, title and memory requests, suggestions, summaries and compaction, image jobs, provider usage, and diagnostics.
- Client-owned codebase-index settings and credentials are forwarded through the runtime protocol, scoped by connection and remote project, with index paths resolved on the server and indexing workers bound to runtime ownership and lifetime.
crux server setupuses a separate temporary enrollment listener (--enrollment-ttl, default ten minutes) with bounded admission and failure budgets. Authorization requires localy/yesapproval on the server after reviewing the candidate's exact identity; possession of the setup code alone is insufficient.- Interrupted pairing is recoverable: the client durably stages its pending identity before submitting, and
connections pending,connections recover OPERATION_ID, andconnections forget-pending OPERATION_ID --confirm-key-lossinspect, prove, and abandon retained identities. - A verified client certificate owns each workspace; databases, saved sessions, and memory are certificate-scoped. The final-disconnect grace defaults to ten seconds, after which credential-bearing work is cancelled and joined.
connections revoke NAMErecords the grant operation and asks running daemons to cancel and drain affected requests, workspaces, agents, and image jobs without restarting.connections authorized,connections revocations,abandon-revocation --confirm-unacknowledged, andaudit-pruneexpose grant history and unresolved outcomes.- The chat header and sidebar show accepted provider source, runtime revision, client fingerprint, and account identity. The Workspace Authority section is hidden unless debug is enabled.
crux schema remote-runtimegenerates the private runtime schema; the regenerated OpenAPI is served under the authenticated/v1/docs/route.
Authentication, accounts, and recovery
- API-key Check retains the exact checked input and Save reuses it without re-resolving or repeating the probe. Declared configuration credentials are separate selectable fields alongside a primary key or OAuth; saving one preserves the others and the model selection. Check reports the evidence it obtained rather than implying validation it did not perform.
- OAuth code, paste, callback, and device flows use owner-bound sessions. Completing browser authorization is followed by a durable save and publication transaction; retained results can be recovered without a second token exchange.
- Account listing, switching, removal, logout, and import act through the selected workspace's authority with explicit acknowledgements. Removing the active account selects the next stored account; removing the last clears the credential.
- New Review Saved Authentication (
saved_auth,reload_auth) and Authentication History (auth_history) dialogs, plusaccounts history,accounts repair-local,accounts pending-oauth, andaccounts retire-oauth, expose redacted operation progress and explicit recovery or retirement for interrupted logins. Retirement never claims to undo earlier writes or revoke tokens at the provider. - Automatic token refresh runs on the owning client, is bound to the exact principal, provider, account, and credential generation, and cannot revive removed or replaced accounts.
- Provider and MCP destination policies are enforced at dispatch as well as admission. Credential-bearing redirects stay bound to their selected origin, MCP traffic stays bound to the configured MCP origin, and a destination refusal cannot trigger another authentication attempt or clear a saved token.
- Private authentication journals are bounded to 128 records and 256 MiB per workspace; secrets are redacted with process-keyed fingerprints instead of retained plaintext, and redaction preserves embedded JSON structure without truncating IDs or hashes.
Agent tools and runtime
- Browser-authenticated fetch.
fetch,agentic_fetch, andweb_fetchacceptmode: user, which copies cookies from a user-selected browser profile into memory and uses that browser's user agent. Every use requires explicit request or current-session consent even under automatic tool approval; denial never falls back to anonymous fetching, cookies are never written back, and cookie values are redacted from output. Image-generation providers can use the same consented browser identity. fetchnow returns compact Markdown by default (5 MB input, bounded output) using an upgraded HTML-to-Markdown pipeline shared withagentic_fetch; text and HTML remain explicit formats and invalid options fail before any network access.- Anthropic prompt caching is enabled by default for Anthropic Messages providers, with one rolling conversation breakpoint and a compaction reserve.
capabilities.anthropic.efficiency.prompt_cachingcan disable it,ttlaccepts5mor1h, and model optionsprompt_cachingandcache_ttlpreserve explicit choices. Unsupported caching or invalid TTLs fail rather than silently falling back. - Summarization settings dialog (
/summarization, aliasescompactionandcontext_cap) and new optionssummarization_context_cap,summarization_max_tokens,summarization_fast_mode, and experimentalcodex_compaction_v2, also settable incruxrcviaoption summarization-context-cap Nand friends. Codex summarization uses one request; remote compaction failure preserves history. - Memory now has a hard limit of 50 topic slots per project, enforced under concurrent writers; over-limit collections stay readable and editable. Memory maintenance rotates whole files, rejects stale writes, and paces itself by pressure. Relevant memory is loaded from the accepted workspace scope, so remote principals never read the daemon user's global topics.
- Project notes behave as a project-scoped index:
project_notesgainslistandreadactions with pagination and stable project-qualified IDs, and only the compact index is injected into instructions. - Plan mode can be cancelled at every lifecycle stage with
shift+tabor Cancel Plan Mode. Background agents no longer start after shutdown, and task notifications recover a missing event and release delivery when a session load or provider call fails. - Questions serialize concurrent requests and can be cancelled while queued.
Provider branding and presets
- Full provider and provider-preset bundles may include a root
branding.json(label,short_name, accent color, two-color gradient), validated against the newprovider-branding.schema.json(crux schema provider-branding). The file is bounded to 16 KiB, participates in the bundle digest, replaces inline brand declarations when present, and never silently falls back to inline branding when invalid. - All 26 bundled Catwalk migration presets now ship branding files; regional and product variants share palettes. These are Crux presentation palettes, not official brand specifications. Reinstall a preset to pick up its branding.
- Plugin installation accepts hard-linked sources and backups, and startup and rescan no longer wait on the writer lock.
TUI preview server and demo
crux demo [--port 8767] [--project DIR] [--session ID]serves an embedded TUI fixture playground on loopback with a/helpMarkdown index, screenshot and control API, generated schemas, and optional replay of a stored session. Preview overlays and controls drive the production components with dummy models.- A new builtin
crux-ui-infoskill instructs agents to reuse a running preview server and fetch its/helpendpoint. - The
tools/tui-mockworkspace hosts the headless xterm renderer and fonts used by the demo. The README demo GIF uses privately configured Codex, Claude.ai, and Gemini provider plugins that are not included with Crux and are not provided by the repository owner.
Shell completions
- Adds
crux completionfor Bash, Zsh, Fish, and PowerShell, generated from the live command tree so suggestions cannot go stale. Load them witheval "$(crux completion zsh)",eval "$(crux completion bash)", orcrux completion fish | source. crux completion --install <shell>appends the loading line to~/.zshrc,~/.bashrc, or the Fish config once, preserving existing contents, and prints the command to load completions in the current shell. An unknown shell fails instead of picking a default.- A renamed executable or symlink uses its invoked name throughout. Completion requests skip normal startup, including dotenv loading, profiling, and workspace initialization;
loginandlogoutprovider suggestions come from the process environment only.
Network tracing is now opt-in
HTTP and WebSocket traffic recording is off by default. Enable it per project with option network-tracing true in cruxrc or "options": {"network_tracing": true} in crux.json, then reopen the workspace; a project value of false overrides a global opt-in. Each enabled workspace instance writes to its own <data-directory>/traffic/crux-<pid>-*.db instead of a shared global database. A full recording queue drops events rather than stalling response delivery, and traffic_logs reports queue drops and failed writes.
Upgrading
- Remote servers and clients must be upgraded together. Client-owned remote workspaces require runtime protocol version 1 and compiler identity
crux-declarative-runtime-v23on both sides. Existing server-owned workspaces retain their mode; new workspaces from a saved connection default to client authority. - Traffic recording stops unless you opt in. If you relied on the previous always-on
~/.ai-cli/traffic/crux.db, addoption network-tracing trueto the projects that need it. - Memory capacity is now a hard limit of 50 topics per project. Projects already above the limit remain usable but cannot add topics until consolidated.
- Anthropic prompt caching is on by default. Disable it in the provider manifest's
capabilities.anthropic.efficiency.prompt_cachingif required. - Reinstall provider presets to receive their branding files; existing installations continue to work with the default CRUX wordmark.
- Delivery mode defaults to
queue, matching prior behavior; settui.delivery_modeor pressalt+sto steer. - Pairing performed with older setup codes (enrollment protocol version 1) is rejected; generate a new setup code with the upgraded server.
Reliability fixes
- Failed image replacement preserves the existing output instead of leaving it truncated or missing.
- Superseded codebase-index workers cannot publish over the current index catalog.
- Background-task persistence failures remain visible, retain task output, and can be retried.
- Reconnecting workspaces refresh their accepted state before announcing recovery, while retaining workspace recreation when the previous workspace is gone.
- Resource cleanup and cancellation coverage were strengthened across HTTP, database, subprocess, and callback tests; authentication safeguards remain intact.
Dependencies and packaging
- The Bubble Tea, Bubbles, and Ultraviolet code Crux depends on is now vendored under
foundation/with licenses retained, replacing thecharm.land/bubbletea/v2,charm.land/bubbles/v2, andgithub.com/charmbracelet/ultravioletmodule dependencies. Rendering behavior is unchanged apart from the width fixes above. github.com/JohannesKaufmann/html-to-markdownupdated to v2.5.2;goldmarkto v1.8.2;sergi/go-diffto v1.4.0.- Adds
github.com/dop251/gojaandgithub.com/kanrichan/resvg-gofor the headless preview renderer and screenshot pipeline. - New schemas:
provider-branding.schema.jsonandremote-workspace-runtime.schema.json;schema.json,provider-plugin.schema.json,provider-preset-plugin.schema.json, and the OpenAPI artifacts are regenerated.
Crux remains independently maintained and unaffiliated with the vendors whose provider protocols or command contracts it supports. Required upstream and third-party license notices remain included.