Repository navigation
Releases: volt-hq/Volt
Release list
v0.4.0
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 withvolt mcp auth <server>orvolt mcp auth-device <server>. A server configured with a pre-registeredauth.clientIdmust also setauth.issuerto 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-refnow 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-refand install the new one.volt remove,volt update, andvolt store removewith 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 updateinstalls 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 tovolt 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 inkeybindings.json(for examplecursorUptotui.editor.cursorUp,expandToolstoapp.tools.expand) using the ids/hotkeyslists. Insettings.json, replacequeueModewithsteeringMode,websocketswithtransport("websocket"or"sse"), askillsobject with a list of skill directories plusenableSkillCommands, andretry.maxDelayMswithretry.provider.maxRetryDelayMs. Move credentials fromoauth.jsonorsettings.jsonapiKeysintoauth.jsonwith/login, and rename acommands/directory toprompts/. User npm packages are no longer loaded from the global npm or pnpm root; Volt installs them into~/.volt/agent/npmon the next start. Aremote/iroh-host.jsonfrom before the daemon is no longer imported, regenerating a daemonstate.jsonfrom before access grants (volt daemon regenerate-stateor/remote) now starts empty state with a new Iroh identity, and astate.jsonmissing any host-state section or a workspace's generation record is reported as invalid instead of being filled in; pair phones again. SDK:InteractiveModeOptions.migratedProvidersis removed, the daemon runtime factory takestoolPolicyinstead ofallowTools, theIrohRemoteGrantedClient,IrohRemoteGrantedRevokedClient, andIrohRemoteGrantedPendingPairingTickettypes are removed because every record now carriesrpcGrant, and everyIrohRemoteHostStatesection is required. Daemon control protocol:status_resultno longer carriescapabilities, andrevokedClients,remotePolicy, and each client'sallowedTools,usesDefaultTools, andrpcGrantare 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, andAgentSessionEventListener,SubagentEvent, and reviewonSessionEventcallbacks receiveDeepReadonly<AgentSessionEvent>from@hansjm10/volt-ai. Replacesession.subscribeRuntimeEvents(listener)withsession.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, andacknowledgedAtand the live phase's run and compactionstartedAtas 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_startandmessage_endfire 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.sessionManagerno longer changes the session's committed entries. (#855) - **exten...
v0.3.0
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--sessionreattach 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; aftervolt daemon stopit 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 runvolt daemon restart. - The Volt daemon now runs in standalone binaries,
--omit=optionalinstalls, 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 involt daemon status,volt remote pair, and/remote; workspace, worktree, and device revocation commands keep working.volt daemon statusexits 0 when phone transport is unavailable only because the build lacks it (native_binding_missing);volt remote statusstill 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 withvolt.registerWorkKind(name, kind)and starts its work withctx.startWork(name, { title, input }, run): the work is recorded in the conversation asext:<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 theset_extension_enabledintent, and every open conversation follows without/reload. (#585)
extensions.<id>.enabledin 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 withhost.manage.v1may disable extensions but enables only acknowledged ones. Extensions hearactivateanddeactivate(startup,enable,disable,reload),session_startgains reasonenableandsession_shutdownreasondisable. Theextensionsquery lists every extension with its state and permissions, and work records keep the remote capabilities their kind required.
Breaking Changes
-
agent: Removed
AgentHarness, itsSessionstorage, and agent-core's built-in compaction, JSONL and in-memory session storage, skill and prompt-template loading,NodeExecutionEnvand the./nodeentry point, andAgentState; theConversationkernel is agent-core's only stateful runtime. (#585)
Open a conversation over a log withawait Conversation.open({ log, stream, resolveModel, tools, systemPrompt, policy })instead of constructingAgentHarnesswith aSession. UseInMemoryConversationLogor implementConversationLog; the log replacesSessionStorage, and its ordinals replace projection cursors, guards, and mutation receipts. Submit input withprompt,steer, andfollowUpand await the admission'scompletioninstead ofrun(),prompt(), orreserveRun()/runReserved(); delivery owners are gone because the conversation commits each delivery itself. Harness event handlers becomeConversationPolicyhooks (transformContext,beforeProviderPayload,afterProviderResponse,beforeToolCall,afterToolCall,messageEnd,prepareDelivery,nextAction,requestBoundary,retry,compaction), andsubscribedeliversConversationEvents. Resolve credentials in yourstreamfunction. Coding Agent provides its own compaction, storage, skills, and prompt templates.Removed exports:
AgentHarness,AgentHarnessError,AgentHarnessOptions,AgentHarnessEvent,AgentHarnessStreamOptions(useConversationStreamOptions),AgentHarnessNextActionPolicy(useConversationPolicy["nextAction"]), the otherAgentHarness*types, the harness event types (QueueUpdateEvent,ToolCallEvent,ToolResultEvent, and the rest),AgentState,NodeExecutionEnv,Session,SessionStorageand its snapshot, cursor, mutation, and receipt types,SessionError, theSessionTreeEntryentry types,buildSessionContextandSessionContext(usefoldandbuildContext), the delivery-owner types (AgentDeliveryOwner,AgentDelivery, and their contexts and outcomes),AgentRunResult,AgentRunSnapshot, andtoError.AgentHarnessAdmissionGateis nowAdmissionGate, and suspended admission throwsConversationErrorwith codebusy. -
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 thevolt-ailogin command is removed.
To migrate, create a client withcreateAiClient({ providers: builtInProviders(), models: builtInModels(), credentials })and callclient.stream,complete,streamSimple,completeSimple,refreshPromptCache, andgenerateImageswhere you called the global functions; register custom APIs withclient.registerProviderand OAuth implementations withclient.registerOAuthProvider(the built-ins come frombuiltInOAuthProviders()in@hansjm10/volt-ai/oauth). Pass API keys per request or through aCredentialSource, whoseresolve({ model, signal })the client consults before each request; a rejection fails the request with anautherror.registerFauxProvideris nowcreateFauxProvider, which returns a provider to register on a client.In
@hansjm10/volt-agent-core,agentLoopandagentLoopContinuerequire a stream function (for exampleclient.streamSimple), andAgentLoopConfig.getApiKeyis removed.In Volt, extensions'
registerProvidercalls 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 withctx.modelRegistry.client.complete(...)instead of resolving keys themselves.compact,generateSummary, andgenerateBranchSummarytake a required stream function instead ofapiKey,headers, andenv. Use Volt's/logininstead ofnpx @hansjm10/volt-ai login. -
ai:
calculateCostno longer writesusage.costin place; it returns a new cost that records thepriceVersionof the price table it used, and@hansjm10/volt-ainow exports TypeBox schemas for messages, content blocks, usage, and model metadata.
To migrate a custom provider or extension that calledcalculateCost(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 optionallycacheWrite1h).The schemas are also exported from the
@hansjm10/volt-ai/schemassubpath, which loads only TypeBox.The RPC contract artifact now declares the optional
usage.cost.priceVersionon assistant messages and the optionalpromptCachemodel metadata the host already sent withRpcModelandRpcCatalogModel. -
ai: The AI library no longer reads
VOLT_*environment variables, no longer carriesclientMessageIdon user messages, and no longer applies the conversation replay policy inside providers; callers apply the newapplyReplayPolicy(messages)before each request.
Volt itself readsVOLT_CODEX_REQUEST_DIAGNOSTICSandVOLT_OAUTH_CALLBACK_HOSTfrom the process environment as before, and takes prompt cache retention from the `prom...
v0.2.3
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.signalthat aborts when the session loses conversation authority or is disposed, and pending extension dialogs settle when Volt tears down extension UI, withctx.ui.custom()rejecting withExtensionUIDismissedError. (#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
contextWindowmodel 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
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 reportsvalidation_deadlinefor context whose sources could not be revalidated in time, instead ofsource_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
/storecatalog is now fetched from volt-cli.dev after the retired GitHub Pages deployment was shut down. (#485)
v0.2.1
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_compactandsession_compactevents now includereasonandwillRetry, 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)
/reloadnow keeps healthy language servers running when their server settings are unchanged, and/lsp restartalso 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 aslaunchctl setenvvalues,environment.dfiles, 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; runvolt daemon restartafter changing PATH or your shell profile. SetVOLT_DAEMON_INHERIT_ENV=1to keep the inherited environment, and checkvolt daemon statusfor 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
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_fetchto retrieve approved public URLs as bounded readable text afterweb_searchor 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
/fastcontrols, 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 fullscreenor 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.
Usebackground: trueon native Bash or confirmed subagent spawning calls, then usejobsto 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 showscache warm 12mwhile the idle window runs, refresh costs count toward session totals, andpromptCache.keepAlive/promptCache.keepAliveIdleMinutesor/settingscontrol 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. SetVOLT_PROMPT_CACHE_AUDIT=0to turn them off. -
Added an offline, read-only
volt lsp auditcommand 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.
ExhaustiveAgentEventconsumers must handledelivery_start. Low-level loops now always use delivery-aware dispatch: migrateprepareNextTurntoprepareRequest, and replaceshouldStopAfterTurn,getSteeringMessages, andgetFollowUpMessageswithnextActionplus explicit deliveries. Migrate queued-message hooks to anAgentDeliveryOwnerinstalled before admission. -
tui: Changed custom components to return explicit render frames so terminal image placement survives composition.
Migraterender(width): string[]torender(width): RenderFrameand wrap text-only output withcreateRenderFrame(lines). Use the exported frame composition helpers instead of flatteningchild.render(width).lineswhen building another component. -
tui: Replaced the constructible
TUIclass with explicit main-screen and fullscreen renderers.
Migratenew TUI(terminal)tonew TuiMainScreen(terminal)and useTUIonly as a renderer-neutral type. UseTuiAltScreenwhen the application needs an alternate-screen viewport and constrainedVStack/HStack/ScrollViewlayout. -
remote: Changed paired-device defaults to track daemon tool grants and include
host.manage.v1,inspect, andlspcapabilities. (#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.v1enables capability advertisement, host-action responses, and keep-awake without a custom access grant. Theinspectandlsptools make Plan mode inspection available from paired devices;lspis classified as unsafe alongsidebash,edit, andwritebecause its rename and fix actions can edit workspace files. -
remote: Removed ActivityKit Live Activity support from remote sessions.
Clients must stop sendingregister_live_activityandunregister_live_activityRPC commands or ActivityKit token data inregister_push_target. Use ordinary completion notifications throughregister_push_targetinstead. -
agent-session: Removed Agent injection and mutable runtime exposure from AgentSession.
ConstructAgentSessionwith 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 toAgentHarnesswith aSessionand execution environment, or useagentLoop()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 correspondingSubagentManagerOptions.delegationLimitsvalues.Structural admission failures reject only new starts without aborting admitted descendants. Per-call, per-definition, and per-child turn safeguards continu...
v0.1.0
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, orfull. voltddaemon and/remotecontrol center — A background daemon owns workspaces, runtimes, and conversation leases, so sessions survive TUI restarts and move cleanly between desktop and phone. The/remotecommand 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
subagenttool discovers user- and project-defined child agents, ships reservedgeneral,researcher,design-doc, andsecurity-reviewerroles, 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
mcpgateway 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/writeresults by default, and thelsptool 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_searchtool 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, ordefaultProfile, plus/profilefor switching interactively.
Breaking Changes
- Volt now ships as
@hansjm10/volt-coding-agentwith the release line restarted at 0.1.0; npm beta installs use thebetadist-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_stateactive tools), remote model/thinking-level switching, and remote-safe transcript projection for paired clients. - Proactive mid-run compaction, an
agent_settledidle-boundary event, and bounded summarization input for long conversations. - Pi extension compatibility:
volt installreadspimanifests when novoltmanifest 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
/clearreplacing/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.