Skip to content

Releases: volt-hq/Volt

v0.4.0

Choose a tag to compare

@volt-release-tagger-hansjm10 volt-release-tagger-hansjm10 released this 17 Oct 04:44
Immutable release. Only release title and notes can be modified.
051a195

Standalone Windows executables in this release are not code-signed. Windows may show a SmartScreen warning when you first run them.

Highlights

  • Extensions can run agents as conversation work with ctx.subagents: start one in a directory of the conversation or a managed worktree, under turn, token, cost, and time limits, and get its result.
  • Extensions can start reviews on any review engine with ctx.reviews, read their results, record finding outcomes, and post a complete pull request review as a chosen GitHub CLI account with a trailer.
  • Extensions in daemon-hosted conversations can list and create the managed worktrees of the conversation's repository with ctx.worktrees, and run subagents in them.

Breaking Changes

  • mcp: OAuth credentials for HTTP MCP servers are now bound to the authorization server that issued them and are never sent to a different one named by the MCP server, fixing GHSA-6qxp-vccf-f47h. (#843)
    Migration: stored MCP OAuth tokens and client registrations saved by earlier versions carry no authorization server binding and are discarded, so authenticate each affected server again with volt mcp auth <server> or volt mcp auth-device <server>. A server configured with a pre-registered auth.clientId must also set auth.issuer to the authorization server URL that client is registered with; without it, authentication fails. If a Volt client may have connected to an untrusted MCP server while holding OAuth credentials, rotate the affected client secrets and revoke their tokens.

  • packages: Each pinned git ref is now its own package with its own checkout, so store packages from the same repository install side by side instead of replacing each other. (#659)
    Migration: volt install git:host/user/repo@new-ref now installs the new ref beside the installed one instead of moving it. To move a package to a new ref, volt remove git:host/user/repo@old-ref and install the new one. volt remove, volt update, and volt store remove with a repository source without a ref still act on the repository's pinned ref when it is the only one configured in the scope, and fail when there are several; name the ref then. A user-scope and a project-scope entry of one repository at different refs are now two packages that both load: when they declare the same extension id, the user-scope one runs and the project one is reported as not loaded, so remove the entry you do not want. Existing pinned packages are cloned again into <path>@<ref> on the next start; their previous checkout at <path> is no longer used and can be deleted.

    volt store update installs a catalog package's new pin beside the installed one and replaces it once its permissions are acknowledged; declining keeps the installed pin. Installing a catalog package that is already installed at another pin points to volt store update.

  • config: Volt no longer migrates or reads configuration, credential, package, daemon, and remote-host files in pre-release formats.
    Migration: rename pre-namespaced ids in keybindings.json (for example cursorUp to tui.editor.cursorUp, expandTools to app.tools.expand) using the ids /hotkeys lists. In settings.json, replace queueMode with steeringMode, websockets with transport ("websocket" or "sse"), a skills object with a list of skill directories plus enableSkillCommands, and retry.maxDelayMs with retry.provider.maxRetryDelayMs. Move credentials from oauth.json or settings.json apiKeys into auth.json with /login, and rename a commands/ directory to prompts/. User npm packages are no longer loaded from the global npm or pnpm root; Volt installs them into ~/.volt/agent/npm on the next start. A remote/iroh-host.json from before the daemon is no longer imported, regenerating a daemon state.json from before access grants (volt daemon regenerate-state or /remote) now starts empty state with a new Iroh identity, and a state.json missing any host-state section or a workspace's generation record is reported as invalid instead of being filled in; pair phones again. SDK: InteractiveModeOptions.migratedProviders is removed, the daemon runtime factory takes toolPolicy instead of allowTools, the IrohRemoteGrantedClient, IrohRemoteGrantedRevokedClient, and IrohRemoteGrantedPendingPairingTicket types are removed because every record now carries rpcGrant, and every IrohRemoteHostState section is required. Daemon control protocol: status_result no longer carries capabilities, and revokedClients, remotePolicy, and each client's allowedTools, usesDefaultTools, and rpcGrant are always present.

  • sdk: Session event listeners now share one deeply frozen event typed DeepReadonly<AgentSessionEvent>, so streaming costs less CPU when several observers watch a conversation. (#772)
    Migration: a listener that changed the event it received must build its own values from it instead; writing to an event now throws, and AgentSessionEventListener, SubagentEvent, and review onSessionEvent callbacks receive DeepReadonly<AgentSessionEvent> from @hansjm10/volt-ai. Replace session.subscribeRuntimeEvents(listener) with session.paceRuntimeEvents(pace): the pace is awaited after each loop event and receives no event. Live items for the streaming assistant message are read-only types.

Improvements

  • daemon: Reduced CPU use while a large tool call streams: the live state no longer re-parses the call's whole argument text on every delta. (#775)
  • daemon: Reduced per-token streaming overhead when no extension handles message or tool execution events. (#750)
  • jobs: A background bash or subagent call no longer shows a "Background job" card that kept saying "Started"; the job's live state under the call is the only status shown.
  • remote: Paired devices can list a workspace's extensions and review engines before a conversation is open.
  • remote: Paired devices now time tool calls by the host's clock, and calls in a conversation's history keep how long they took. (#923)
  • remote: Paired phones now see this computer's name (for example "Jordan's MacBook Pro") instead of only its node ID, including before an agent is open.
  • remote: Reduced the host CPU each paired device costs while a long answer or tool call streams: path redaction now processes only the newly streamed text instead of the whole message on every token. (#820)
    Arguments that stream on one long line, such as a file a tool call writes, now reach the device in larger steps.
  • review: Review runs record the label of the engine that produced them, so clients, posted pull request reviews, and a refused rerun name a past run's engine (such as Swarm) instead of its id.
  • review: Reviews on every engine can run the project's checks and tests: the reviewTools setting and the tools of ctx.reviews.start now apply to extension engines, and the reviewSetup setting or the setup of ctx.reviews.start first runs a command, such as installing dependencies, in each review checkout.
    A review an extension starts can also follow the previous round of a review loop: it reviews everything again, keeps the id of each finding still open, and closes the ones it finds fixed where they were found. It can also collect follow-ups: verified defects it notices outside the change, kept apart from the findings with a fingerprint that identifies the same defect across reviews.
  • rpc: The RPC contract declares review run startedAt, endedAt, usageUpdatedAt, and acknowledgedAt and the live phase's run and compaction startedAt as safe non-negative integer epoch milliseconds (RpcEpochMilliseconds) instead of unrestricted numbers. (#316)
  • rpc: The RPC contract declares the retry start time, prompt-cache times, worktree creation times, finding-outcome creation time, and daemon status times (paired, last seen, revoked, re-pair approved, and daemon start) as safe non-negative integer epoch milliseconds (RpcEpochMilliseconds) instead of unrestricted numbers. (#842)
  • A collapsed failed command now shows its last lines and how it ended, and a collapsed edit shows the first 16 lines of its diff. (#921)

Fixes

  • docs: Fixed the keybindings action tables to list the actual defaults for thinking-level cycling, new line, line start and end, and editor page up and down. (#797)
  • docs: Fixed the keybindings Custom Configuration and Emacs examples so ctrl+p moves the cursor up instead of cycling models. (#796)
  • docs: Fixed the keybindings Vim example so alt+j moves the cursor down instead of opening the work inspector. (#792)
  • docs: Listed the custom messages that message_start and message_end fire for in the extensions guide. (#869)
  • docs: Listed the prompt history, selection left/right/toggle, focus traversal, and review tools toggle actions in the keybindings action tables. (#804)
  • extensions: Changing an entry or header read through ctx.sessionManager no longer changes the session's committed entries. (#855)
  • **exten...
Read more

v0.3.0

Choose a tag to compare

@volt-release-tagger-hansjm10 volt-release-tagger-hansjm10 released this 11 Oct 02:23
Immutable release. Only release title and notes can be modified.
598b520

Standalone Windows executables in this release are not code-signed. Windows may show a SmartScreen warning when you first run them.

Highlights

  • Interactive Volt runs its conversations in the Volt daemon's conversation workers, so closing the terminal leaves a conversation running and several terminals can attach to the same one. (#585)
    Volt starts the daemon when none runs and shows the terminal while the conversation starts; what you type meanwhile is sent once it is ready. volt -c, -r, and --session reattach to a conversation that is still running, including a turn in progress. Quitting while a turn runs asks whether to stop it or leave it running in the background. When a conversation's worker exits or the daemon restarts, the terminal keeps its transcript, shows "Reconnecting..." or "Host restarting...", and resumes where it was; after volt daemon stop it starts the daemon again after 10 seconds. A daemon started this way exits after five minutes without conversations, terminals, or paired devices. A daemon of another Volt version is restarted when it runs nothing; otherwise Volt asks you to run volt daemon restart.
  • The Volt daemon now runs in standalone binaries, --omit=optional installs, and on Intel Macs, serving the TUI and conversation workers with phone transport unavailable, and the TUI connects to it on Windows and in standalone binaries.
    A daemon without phone transport refuses pairing with guidance in volt daemon status, volt remote pair, and /remote; workspace, worktree, and device revocation commands keep working. volt daemon status exits 0 when phone transport is unavailable only because the build lacks it (native_binding_missing); volt remote status still exits nonzero. A standalone binary starts its daemon and workers by re-running its own executable, and its daemon, including one the login service starts, resolves PATH and the rest of the environment from the user's login shell like an npm install does. Local clients, conversation workers, and relays now prove their token instead of sending it, bound to a fresh daemon challenge and the socket they dialed, and only trust a daemon that proves it back, so a stale Windows pipe name taken over by another account is never trusted and a hello it captures works nowhere else.
  • Extensions can run background work that every client sees, follows, and cancels. (#585)
    An extension registers a kind with volt.registerWorkKind(name, kind) and starts its work with ctx.startWork(name, { title, input }, run): the work is recorded in the conversation as ext:<extension>/<name>, reports progress, checkpoints, and output, and ends with a result that can ride the model's next turn (delivery: "message") or wake it ("wake"). Only the registering extension starts its kinds, and reloading the extensions interrupts their running work. A paired device cannot read the output of work whose extension kind the host no longer knows. A stop that delivers queued input no longer starts an empty turn when only such a quiet notice is queued.
  • Extensions can be enabled and disabled while a session runs, from /extensions, /extensions enable|disable <id>, or the set_extension_enabled intent, and every open conversation follows without /reload. (#585)
    extensions.<id>.enabled in global or trusted project settings decides whether an extension runs; a disabled extension's factory never runs. Disabling one removes everything it contributed (hooks, commands, intents, shortcuts, completion providers, providers, status items, panels, its title, and pending dialogs), cancels its running work, and removes its tools at the next turn boundary once its running tool calls finish. Enabling one whose permissions are not acknowledged asks the client that enables it to acknowledge them; a paired device with host.manage.v1 may disable extensions but enables only acknowledged ones. Extensions hear activate and deactivate (startup, enable, disable, reload), session_start gains reason enable and session_shutdown reason disable. The extensions query lists every extension with its state and permissions, and work records keep the remote capabilities their kind required.

Breaking Changes

  • agent: Removed AgentHarness, its Session storage, and agent-core's built-in compaction, JSONL and in-memory session storage, skill and prompt-template loading, NodeExecutionEnv and the ./node entry point, and AgentState; the Conversation kernel is agent-core's only stateful runtime. (#585)
    Open a conversation over a log with await Conversation.open({ log, stream, resolveModel, tools, systemPrompt, policy }) instead of constructing AgentHarness with a Session. Use InMemoryConversationLog or implement ConversationLog; the log replaces SessionStorage, and its ordinals replace projection cursors, guards, and mutation receipts. Submit input with prompt, steer, and followUp and await the admission's completion instead of run(), prompt(), or reserveRun()/runReserved(); delivery owners are gone because the conversation commits each delivery itself. Harness event handlers become ConversationPolicy hooks (transformContext, beforeProviderPayload, afterProviderResponse, beforeToolCall, afterToolCall, messageEnd, prepareDelivery, nextAction, requestBoundary, retry, compaction), and subscribe delivers ConversationEvents. Resolve credentials in your stream function. Coding Agent provides its own compaction, storage, skills, and prompt templates.

    Removed exports: AgentHarness, AgentHarnessError, AgentHarnessOptions, AgentHarnessEvent, AgentHarnessStreamOptions (use ConversationStreamOptions), AgentHarnessNextActionPolicy (use ConversationPolicy["nextAction"]), the other AgentHarness* types, the harness event types (QueueUpdateEvent, ToolCallEvent, ToolResultEvent, and the rest), AgentState, NodeExecutionEnv, Session, SessionStorage and its snapshot, cursor, mutation, and receipt types, SessionError, the SessionTreeEntry entry types, buildSessionContext and SessionContext (use fold and buildContext), the delivery-owner types (AgentDeliveryOwner, AgentDelivery, and their contexts and outcomes), AgentRunResult, AgentRunSnapshot, and toError. AgentHarnessAdmissionGate is now AdmissionGate, and suspended admission throws ConversationError with code busy.

  • ai: The AI library now streams through clients created with createAiClient, each with its own providers, models, OAuth providers, and credential source, instead of process-wide registries; it no longer reads API keys from environment variables, and the volt-ai login command is removed.
    To migrate, create a client with createAiClient({ providers: builtInProviders(), models: builtInModels(), credentials }) and call client.stream, complete, streamSimple, completeSimple, refreshPromptCache, and generateImages where you called the global functions; register custom APIs with client.registerProvider and OAuth implementations with client.registerOAuthProvider (the built-ins come from builtInOAuthProviders() in @hansjm10/volt-ai/oauth). Pass API keys per request or through a CredentialSource, whose resolve({ model, signal }) the client consults before each request; a rejection fails the request with an auth error. registerFauxProvider is now createFauxProvider, which returns a provider to register on a client.

    In @hansjm10/volt-agent-core, agentLoop and agentLoopContinue require a stream function (for example client.streamSimple), and AgentLoopConfig.getApiKey is removed.

    In Volt, extensions' registerProvider calls are unchanged. Each model registry owns a client (ctx.modelRegistry.client) that resolves credentials from auth.json, OAuth refresh, environment variables, and models.json, so extensions make model calls with ctx.modelRegistry.client.complete(...) instead of resolving keys themselves. compact, generateSummary, and generateBranchSummary take a required stream function instead of apiKey, headers, and env. Use Volt's /login instead of npx @hansjm10/volt-ai login.

  • ai: calculateCost no longer writes usage.cost in place; it returns a new cost that records the priceVersion of the price table it used, and @hansjm10/volt-ai now exports TypeBox schemas for messages, content blocks, usage, and model metadata.
    To migrate a custom provider or extension that called calculateCost(model, usage) for its side effect, assign the result instead: usage = { ...usage, cost: calculateCost(model, usage) }. The second argument only needs the token counts (input, output, cacheRead, cacheWrite, and optionally cacheWrite1h).

    The schemas are also exported from the @hansjm10/volt-ai/schemas subpath, which loads only TypeBox.

    The RPC contract artifact now declares the optional usage.cost.priceVersion on assistant messages and the optional promptCache model metadata the host already sent with RpcModel and RpcCatalogModel.

  • ai: The AI library no longer reads VOLT_* environment variables, no longer carries clientMessageId on user messages, and no longer applies the conversation replay policy inside providers; callers apply the new applyReplayPolicy(messages) before each request.
    Volt itself reads VOLT_CODEX_REQUEST_DIAGNOSTICS and VOLT_OAUTH_CALLBACK_HOST from the process environment as before, and takes prompt cache retention from the `prom...

Read more

v0.2.3

Choose a tag to compare

@volt-release-tagger-hansjm10 volt-release-tagger-hansjm10 released this 29 Sep 22:54
Immutable release. Only release title and notes can be modified.
3efcee6

Standalone Windows executables in this release are not code-signed. Windows may show a SmartScreen warning when you first run them.

Improvements

  • extensions: Extension command handlers now get a ctx.signal that aborts when the session loses conversation authority or is disposed, and pending extension dialogs settle when Volt tears down extension UI, with ctx.ui.custom() rejecting with ExtensionUIDismissedError. (#525)

  • models: Updated the model catalog with GPT-6.1 Sol, Grok 4.7 on Bedrock, and current provider pricing and limits.
    GPT-6.1 Sol is available through OpenAI, Azure OpenAI, OpenAI Codex, GitHub Copilot, OpenCode, OpenRouter, and Vercel AI Gateway. It supports low through max reasoning and Fast mode, but not disabled reasoning. OpenAI Codex now defaults to GPT-6.1 Sol instead of GPT-5.5.

    All OpenAI Codex models now use Codex's default 272K-token context window, including GPT-5.6 Sol (previously 1M) and GPT-6 Astra (previously 1.05M). GPT-6 and GPT-5.6 models accept up to 872K tokens through a contextWindow model override.

    Removed GPT-5.3 Codex Spark, GPT-5.4, and GPT-5.4 mini from OpenAI Codex, where they are retired for ChatGPT sign-in. Removed retired Together Kimi K2.6 and Kimi K2.7 Code and Mistral Magistral Small entries; Together now defaults to Kimi K3 instead of Kimi K2.6.

Fixes

  • tui: Fixed volt exiting when a session's saved state could not be confirmed; it now reloads the session from the store and keeps unsent input in the editor. (#525)

v0.2.2

Choose a tag to compare

@volt-release-tagger-hansjm10 volt-release-tagger-hansjm10 released this 28 Sep 23:55
Immutable release. Only release title and notes can be modified.
a49924d

Standalone Windows executables in this release are not code-signed. Windows may show a SmartScreen warning when you first run them.

Improvements

  • docs: Added current Volt screenshots to the README and guides, including the terminal UI, the session tree, and one conversation shared between the iOS app and the terminal, replacing the inherited Pi images. (#484)

  • models: Anthropic, Amazon Bedrock, and Cloudflare AI Gateway now default to Claude Opus 5.5. (#511)

  • models: Updated the model catalog with Claude Sonnet 5.5, DeepSeek V4.1 Flash, OpenAI Daybreak aliases, and current provider pricing and limits. (#528)
    Removed retired OpenCode Go and OpenRouter entries; OpenCode Go now defaults to Kimi K3 instead of Kimi K2.6.

    Claude Sonnet 5.5 offers adaptive reasoning from low through max. Daybreak aliases require separate OpenAI approval. Direct DeepSeek cost estimates use published off-peak prices; peak-hour rates are twice those estimates.

  • plan: Ready plans now wait at an explicit approval checkpoint with a persistent PLAN READY cue and next-step key hints. (#330)
    The plan chooser opens once the planning run settles, and the approval cue stays in the plan status line, plan pane, and composer border until you decide. Turn-done notifications say the plan is ready for approval.

    Text typed or pasted while the chooser is focused goes to the composer instead of being dropped, so Enter sends feedback rather than executing the plan. The chooser no longer takes focus mid-run or from a composer holding a draft, and Change Plan keeps any draft already in the composer.

  • site: Reorganized the volt-cli.dev homepage around a new showcase video, with phone setup requirements and a closing call to action.

Fixes

  • daemon: Fixed volt -r keeping an outdated transcript after taking a session over from the daemon, which made the first message fail with a revision conflict. (#524)
    When a turn or review is still running on the desktop, the transcript reloads after it finishes; typed input stays in the editor until then.
  • extensions: Extension source context is no longer dropped on a busy machine when revalidation misses a 25 ms deadline; the deadline is now 100 ms. (#509)
    volt.getWorkStatus() now reports validation_deadline for context whose sources could not be revalidated in time, instead of source_unverified.
  • models: Z.ai, Z.ai Coding CN, and Cerebras now default to models that exist in the catalog. (#511)
  • sessions: Fixed forking or re-syncing a session resumed with "continue in current cwd" switching it back to its original, possibly missing, working directory. (#524)
  • site: Fixed missing spaces around installation commands and attribution links on the homepage, blog, and legal pages.
  • standalone: Windows standalone executables no longer carry a broken signature entry inherited from Node.js, so Windows treats them as unsigned instead of as having an invalid signature. (#510)
  • store: The default /store catalog is now fetched from volt-cli.dev after the retired GitHub Pages deployment was shut down. (#485)

v0.2.1

Choose a tag to compare

@volt-release-tagger-hansjm10 volt-release-tagger-hansjm10 released this 27 Sep 05:21
Immutable release. Only release title and notes can be modified.
cbe7e75

Standalone Windows executables in this release are not code-signed. Windows may show a SmartScreen warning when you first run them.

Improvements

  • docs: Updated Volt's project overview and onboarding to explain built-in features, iPhone pairing, and installation requirements.
  • extensions: Extension session_before_compact and session_compact events now include reason and willRetry, so extensions can tell manual, threshold, and overflow compaction apart. (#239)
  • lsp: Subagents now share language servers with their parent session instead of starting their own. (#47)
    /reload now keeps healthy language servers running when their server settings are unchanged, and /lsp restart also restarts the servers shared with subagents. If subagents fail to start a missing language server, the interactive session still offers once to install it.
  • subagents: Subagents no longer start their own copy of every eager and keep-alive MCP server; they connect to a server the first time they use it. (#498)
  • tui: Completed and handed-off plans can now be closed from the plan pane or with /plan-close, and Volt notes when a plan finishes.

Fixes

  • ai: The volt-ai CLI help now shows stable npm commands instead of the retired beta tag.
  • auth: The local Anthropic and OpenAI Codex sign-in result pages now show the current Volt icon. (#486)
  • compaction: Split-turn compaction now works with providers that permit only one active request, and compacting a split turn with no new history keeps the previous summary instead of replacing it with "No prior history." (#239)
  • daemon: Daemon-hosted sessions now resolve tools from your login shell environment instead of the environment of whatever started the daemon. (#464)
    The login shell starts from your session's environment: the launchd or systemd user environment when the login service starts the daemon, or the systemd user manager's environment when a terminal starts it on Linux. Service-manager and desktop-session variables such as launchctl setenv values, environment.d files, display, and proxy settings are kept. Variables exported only in the terminal that started the daemon no longer reach its sessions. The environment is resolved once per daemon start; run volt daemon restart after changing PATH or your shell profile. Set VOLT_DAEMON_INHERIT_ENV=1 to keep the inherited environment, and check volt daemon status for the environment source.
  • daemon: Fixed relay-disabled phone pairings failing to reconnect after a daemon restart. (#487)
    Existing relay-disabled pairings need to pair once more after upgrading; later restarts keep them working. A change of the host's LAN IP address still requires pairing again.
  • lsp: Fixed language servers keeping outdated file contents when a file changed on disk while Volt was syncing it.
  • models: Fireworks now defaults to DeepSeek V4.1 Flash because Fireworks retired Kimi K2.6.
    The Fireworks model list also drops the other models Fireworks retired. Choose another Fireworks model with /model or --model if you prefer a different default.
  • remote: Fixed remote sessions rejecting every new message after a prompt failed before reaching the model and the session was later reopened. (#474)
  • remote: Relay access now shows when Volt next checks a lapsed Volt Pro subscription, /remote can check immediately after renewal, and daemon status exits nonzero while relay access is unavailable. (#375)

v0.2.0

Choose a tag to compare

@volt-release-tagger-hansjm10 volt-release-tagger-hansjm10 released this 25 Sep 18:17
Immutable release. Only release title and notes can be modified.
46e009c

Standalone Windows executables in this release are not code-signed. Windows may show a SmartScreen warning when you first run them.

Highlights

  • Added a Simplified Technical English personality for user-facing responses without changing code or repository artifacts.

  • Agents can now use web_fetch to retrieve approved public URLs as bounded readable text after web_search or a user-provided link.
    Only links supplied by the user or returned by approved tools are eligible. Non-public destinations are rejected before and after redirects, and response size, parsing work, metadata, and DNS cancellation remain bounded.

    Readable HTML extraction removes navigation and footer chrome while preserving code formatting.

  • Added bounded first-request preparation waits, structured LSP discovery, and exact loaded-skill reads for managed extensions. (#435)

  • Added GPT-6 Astra support for OpenAI API, Azure OpenAI, and ChatGPT OAuth.

  • Added managed extension tasks, policy-aware repository reads, and ready-only context contributions. (#431)

  • Added subscription-backed managed relay access that moves securely between paired computers. (#309)

  • Added native read-only Plan mode with structured checklists and an explicit, context-clearing handoff into execution.

  • After a response sits idle for a minute, the transcript records how long the work took and when it finished.

  • Answer focused agent questions with keyboard choices, free-form input, notes, and a review step without leaving the conversation.

  • Configure host auto-compaction and exact-model token thresholds from a paired phone with scope-aware, stale-target-safe controls.

  • Added session-scoped Fast mode with /fast controls, a TUI status indicator, and OpenAI Priority processing for eligible OpenAI and OpenAI Codex models. (#110, #111, #112)
    Fast mode persists per branch independently from thinking, synchronizes across attached clients, carries into review inference and findings sessions, and is advertised only for models that support it.

  • Added GPT Image 2 generation and editing for local, attached, and conversation images when using an OpenAI Codex model.

  • Added an optional fullscreen interactive mode with fixed input controls and application-owned transcript scrolling.
    Start it with --tui-mode fullscreen or select it in /settings; regular terminal-owned native scrollback remains the default.

  • Review runs retain their current General destination across context replacements and host restarts.

  • Remote clients can now run detached reviews of uncommitted changes, branches, commits, and pull requests while the conversation remains available. (#66, #80)
    Accepted invocations return a workflow ID immediately and stream sanitized progress events. Clients can fetch findings, list or cancel workflows, and open completed findings in a fresh session on demand.

  • Run Bash commands and subagent tasks in the background while Volt continues independent work.
    Use background: true on native Bash or confirmed subagent spawning calls, then use jobs to list, read, wait for, or cancel the work. Jobs retain bounded output and respect session cancellation, tool grants, and branch ownership. Running jobs do not survive runtime shutdown or restart.

  • Subagents can now discover, follow, and resume runs across the session tree, with bounded pagination and confirmation before duplicate work starts. (#129, #136, #146)
    Spawn preflights show the live registry and require exact one-time confirmation before new work starts, helping agents reuse equivalent runs instead of duplicating them.

    Interrupted children can resume from their transcripts after restarts or disconnects. Registry listing and follow remain available when spawning is disabled, and followed output remains explicitly marked as untrusted data.

  • The footer now counts down to prompt-cache expiry and warns when the next message will resend the conversation uncached, and RPC clients receive the same status through get_state and prompt_cache_changed.

  • Volt keeps supported prompt caches warm while work runs and for 15 minutes after it finishes, so long tool calls and short breaks no longer resend the whole conversation uncached.
    Keepalive replays the previous request without output about a minute before the cache expires (Claude models on the Anthropic Messages API today, with adaptive thinking or thinking off; requests with a Claude 4.5 thinking budget are not refreshed or shown as warm). Extension commands count as work, including while they wait for your input. The footer shows cache warm 12m while the idle window runs, refresh costs count toward session totals, and promptCache.keepAlive / promptCache.keepAliveIdleMinutes or /settings control it. After each real request, refreshing stops once it would cost more than the cache miss it avoids (24 refreshes on Opus 5.5's 5-minute cache), and a late timer skips its refresh instead of risking a full-price cache write.

  • Volt writes metadata-only prompt-cache audit logs to ~/.volt/agent/prompt-cache-audit/ so cache hit rates and keepalive costs can be compared over time.
    Records cover request token counts and gaps, refresh outcomes and costs, and keepalive stops, never prompt or response content. Set VOLT_PROMPT_CACHE_AUDIT=0 to turn them off.

  • Added an offline, read-only volt lsp audit command with content-free usage, outcome, freshness, and latency reports across saved sessions.

  • Added per-model auto-compaction token thresholds, configurable with Compact at in /settings or settings.json.

Breaking Changes

  • agent: Changed low-level agent dispatch to use delivery-aware next actions and explicit event-stream failure propagation.
    Exhaustive AgentEvent consumers must handle delivery_start. Low-level loops now always use delivery-aware dispatch: migrate prepareNextTurn to prepareRequest, and replace shouldStopAfterTurn, getSteeringMessages, and getFollowUpMessages with nextAction plus explicit deliveries. Migrate queued-message hooks to an AgentDeliveryOwner installed before admission.

  • tui: Changed custom components to return explicit render frames so terminal image placement survives composition.
    Migrate render(width): string[] to render(width): RenderFrame and wrap text-only output with createRenderFrame(lines). Use the exported frame composition helpers instead of flattening child.render(width).lines when building another component.

  • tui: Replaced the constructible TUI class with explicit main-screen and fullscreen renderers.
    Migrate new TUI(terminal) to new TuiMainScreen(terminal) and use TUI only as a renderer-neutral type. Use TuiAltScreen when the application needs an alternate-screen viewport and constrained VStack/HStack/ScrollView layout.

  • remote: Changed paired-device defaults to track daemon tool grants and include host.manage.v1, inspect, and lsp capabilities. (#153, #154)
    Devices paired before this release retain their frozen pair-time tool grant and no longer receive extension-registered tools through the default grant. Re-pair the device or reset its access to the coding preset to adopt the tracking grant. Explicitly customized grants remain pinned.

    host.manage.v1 enables capability advertisement, host-action responses, and keep-awake without a custom access grant. The inspect and lsp tools make Plan mode inspection available from paired devices; lsp is classified as unsafe alongside bash, edit, and write because its rename and fix actions can edit workspace files.

  • remote: Removed ActivityKit Live Activity support from remote sessions.
    Clients must stop sending register_live_activity and unregister_live_activity RPC commands or ActivityKit token data in register_push_target. Use ordinary completion notifications through register_push_target instead.

  • agent-session: Removed Agent injection and mutable runtime exposure from AgentSession.
    Construct AgentSession with model, stream, conversion, and queue configuration. Use the explicit session capabilities for abort, runtime events, transport, active tool projections, and scoped turn policy.

  • agent: Removed the legacy Agent wrapper in favor of AgentHarness.
    Migrate stateful integrations to AgentHarness with a Session and execution environment, or use agentLoop() only when the host owns persistence and lifecycle orchestration.

  • subagents: Replaced implicit delegation-tree consumption budgets with explicit structural safeguards and host-configured token, cost, and deadline limits.
    Hosts that rely on finite tree-wide token, cost, or deadline budgets must configure them explicitly. Hosts that need more than depth 5, 100 total starts, or 16 concurrently active descendants must raise the corresponding SubagentManagerOptions.delegationLimits values.

    Structural admission failures reject only new starts without aborting admitted descendants. Per-call, per-definition, and per-child turn safeguards continu...

Read more

v0.1.0

v0.1.0 Pre-release
Pre-release

Choose a tag to compare

@hansjm10 hansjm10 released this 13 Jul 04:45
Immutable release. Only release title and notes can be modified.

Volt's first release: a terminal coding agent with a companion daemon that can hand a running session to your phone and back. Volt is a fork of Pi; this release restarts the version line under the @hansjm10/volt-coding-agent package identity.

Highlights

  • Remote sessions on your phone — Pair the Volt iOS app with your machine over an end-to-end encrypted Iroh connection (QR-code pairing, no port forwarding or accounts), attach to live conversations, steer runs from anywhere, and get push notifications and Live Activities as turns complete. Every device pairs with an explicit access preset: coding, review, chat, or full.
  • voltd daemon and /remote control center — A background daemon owns workspaces, runtimes, and conversation leases, so sessions survive TUI restarts and move cleanly between desktop and phone. The /remote command manages daemon health, workspace registration, pairing, paired devices, active leases, and runtime tool policy from inside the TUI. See Daemon.
  • Subagent delegation — A built-in subagent tool discovers user- and project-defined child agents, ships reserved general, researcher, design-doc, and security-reviewer roles, enforces bounded recursive delegation budgets, and renders live nested delegation trees in the TUI and on remote clients.
  • Native MCP support — Trusted config loading, a built-in mcp gateway tool, stdio/Streamable HTTP/SSE transports, and OAuth (browser PKCE and device-code) with host-side token storage. See MCP.
  • LSP-backed editing — Language servers spawn lazily per project and append diagnostics to edit/write results by default, and the lsp tool adds navigation, references, call hierarchy, project-wide rename, and quick fixes. See LSP Diagnostics.
  • /review — Review uncommitted changes, branch diffs, GitHub PRs, or single commits in an isolated session, then continue from the numbered findings with clean context.
  • Built-in web search — A web_search tool enabled by default across SDK, CLI/RPC, and remote sessions, with OpenAI/Codex, custom-endpoint, and Brave Search backends.
  • Settings profiles — Workflow-specific settings and resource overlays selectable with --profile, VOLT_PROFILE, or defaultProfile, plus /profile for switching interactively.

Breaking Changes

  • Volt now ships as @hansjm10/volt-coding-agent with the release line restarted at 0.1.0; npm beta installs use the beta dist-tag.
  • Paired remote devices and pending pairing tickets require a versioned per-device access grant; pairings created before this release fail closed and must re-pair with volt remote pair --access coding|review|chat|full.

Also in this release

  • Standalone releases are Node.js Single Executable Applications for six OS/architecture targets, with checksum-verified installers, pinned license manifests, and a reviewed exact-commit release pipeline.
  • Live model catalog updates, mid-turn reconnect state (get_state active tools), remote model/thinking-level switching, and remote-safe transcript projection for paired clients.
  • Proactive mid-run compaction, an agent_settled idle-boundary event, and bounded summarization input for long conversations.
  • Pi extension compatibility: volt install reads pi manifests when no volt manifest is present and aliases Pi core imports to Volt modules at load time.
  • A redesigned interactive shell: responsive startup lockup, electric purple themes, Bash syntax highlighting, tool duration suffixes, focus-aware turn-done alerts, and /clear replacing /new.
  • Extensive hardening across daemon lifecycle and Windows support, Iroh pairing and connection admission, push delivery, MCP and OAuth handling, local persistence, and release integrity. The full engineering log for this release (~180 entries) is preserved in this file's git history.