Skip to content

v0.94.0

Choose a tag to compare

@github-actions github-actions released this 12 Sep 01:03
· 30 commits to main since this release
4e712bf

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+t or ctrl+space to toggle, ctrl+down to hide and restore without losing state, Escape retains 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+s and persisted per project as tui.delivery_mode (default queue). 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+b detaches 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 NAME opens 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-capabilities before submitting a private runtime proposal. Both peers must support runtime protocol version 1 and compiler identity crux-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 setup uses a separate temporary enrollment listener (--enrollment-ttl, default ten minutes) with bounded admission and failure budgets. Authorization requires local y/yes approval 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, and connections forget-pending OPERATION_ID --confirm-key-loss inspect, 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 NAME records 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, and audit-prune expose 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-runtime generates 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, plus accounts history, accounts repair-local, accounts pending-oauth, and accounts 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, and web_fetch accept mode: 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.
  • fetch now returns compact Markdown by default (5 MB input, bounded output) using an upgraded HTML-to-Markdown pipeline shared with agentic_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_caching can disable it, ttl accepts 5m or 1h, and model options prompt_caching and cache_ttl preserve explicit choices. Unsupported caching or invalid TTLs fail rather than silently falling back.
  • Summarization settings dialog (/summarization, aliases compaction and context_cap) and new options summarization_context_cap, summarization_max_tokens, summarization_fast_mode, and experimental codex_compaction_v2, also settable in cruxrc via option summarization-context-cap N and 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_notes gains list and read actions 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+tab or 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 new provider-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 /help Markdown 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-info skill instructs agents to reuse a running preview server and fetch its /help endpoint.
  • The tools/tui-mock workspace 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 completion for Bash, Zsh, Fish, and PowerShell, generated from the live command tree so suggestions cannot go stale. Load them with eval "$(crux completion zsh)", eval "$(crux completion bash)", or crux 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; login and logout provider 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-v23 on 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, add option network-tracing true to 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_caching if 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; set tui.delivery_mode or press alt+s to 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 the charm.land/bubbletea/v2, charm.land/bubbles/v2, and github.com/charmbracelet/ultraviolet module dependencies. Rendering behavior is unchanged apart from the width fixes above.
  • github.com/JohannesKaufmann/html-to-markdown updated to v2.5.2; goldmark to v1.8.2; sergi/go-diff to v1.4.0.
  • Adds github.com/dop251/goja and github.com/kanrichan/resvg-go for the headless preview renderer and screenshot pipeline.
  • New schemas: provider-branding.schema.json and remote-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.