Fx v0.0.14
libfx is now durable out of the box. Same API on local, Vercel and DIY. Use your ChatGPT or Grok subscription, or a custom provider, to power cloud agents with libfx. fx moves to Zig 0.17. New Features Durable libfx sessions can continue after crashes,…
Read full notes
libfx is now durable out of the box. Same API on local, Vercel and DIY. Use your ChatGPT or Grok subscription, or a custom provider, to power cloud agents with libfx. fx moves to Zig 0.17.
New Features
- Durable libfx sessions can continue after crashes, redeploys, and function timeouts. Interrupted tools run again only when marked
idempotent: true. - You can run multiple named libfx agents in one app, each with its own model, instructions, and tools. Sessions stay with the agent that created them.
wakeHandler()provides an HTTP handler for queued prompts and recovery, so one Vercel route serves all your libfx agents.- Each libfx session can override its agent's model, reasoning effort, and instructions.
- libfx now supports ChatGPT and Grok subscriptions for server-side agents, with sign-in helpers included.
- libfx agents can connect to custom OpenAI-compatible endpoints, including local model servers.
- Clients can reconnect to a libfx reply stream from the last event they received, even through a different server.
- Another server process can steer or cancel a running libfx session, or resume an interrupted turn.
- Prompts sent to a busy libfx session queue behind its running turn and start when it finishes.
- Reusing a libfx
messageIdfollows the original turn instead of starting it again. - libfx now includes TypeScript types for its public APIs.
- Pass
hookstocreateFxAgent()orcreateFxEngine()to observe model calls, tools, approvals, subagents, and saved-session activity on native and WebAssembly backends. Content capture is opt-in, and callback failures do not interrupt or retry agent work. - With
--sessions-v2, opening a session saved in the previous format converts it together with its subagent sessions. The previous-format files are removed only after the converted sessions are saved. - Use
fx --sessions-v2 sessions convertto convert all sessions saved in the previous format at once. - On Vercel, libfx can use deployment OIDC credentials instead of an API key.
createFxEngine()adds queued follow-ups withfollowUp()and lets you withdraw pending steering withturn.withdraw()./usageandfx usagenow show your provider's usage reports instead of locally recorded usage.- AI Gateway usage shows your spending and budget, or the selected API key's spending, with per-model totals.
/usagenow shows ChatGPT plan limits and activity, plus Grok allowances, credits, and pay-as-you-go spending.- In
@file suggestions, Enter mentions the selected folder; Tab opens it. - ACP clients can toggle Fast mode on supported models and keep the setting when resuming.
fx models --jsonnow lists Gateway model names, reasoning levels, and Fast and Ultrafast support.fx status --jsonnow reports the starting permission mode, available modes, and reasoning effort.- Compatible terminals can show when fx is working, finished, or waiting for your input.
- Commands launched by fx receive
AI_AGENT=fx, so development tools can detect the agent environment.
Improvements
- Prompts now appear immediately after Enter, even in long conversations.
- On Vercel, libfx starts idle sessions in the request that submits the prompt instead of waiting for a queue delivery.
- libfx waits to read a reply stream until its events or result are requested.
- Native libfx reuses HTTP connections between turns without delaying streamed output.
- libfx shares token refreshes across sessions and supports
refreshLockfor multi-server apps. @suggestions reuse a saved workspace index, and file-content searches run in parallel.@suggestions rank exact file names, name prefixes, and whole-word matches above scattered letters. Searches can span a file's containing folder and its name, and highlighted letters show the match used to rank it.- Short
@searches and searches with many exact matches return faster. The file picker shows up to 10 rows when the terminal has room. - Repeated file searches use less memory during long turns.
grep_filesnow searches files larger than 200 KiB and reports when results are incomplete.ctrl+onow wraps long commands and tool details instead of cutting them off./usageopens with cached numbers and refreshes in the background. Pressrto refresh manually.- Shell tracing now includes startup-step timings for diagnosing slow launches.
- Embedded browser terminals can load your workspace's
AGENTS.mdthrough the host adapter. - ACP sessions start in your saved permission mode and remember changes for future CLI and ACP sessions.
- Image-heavy requests keep the newest images and omit older ones when needed, without changing saved history.
- Request-size errors trigger a retry with fewer images before compaction.
Bug Fixes
- Long submitted prompts and steering messages no longer overwrite earlier scrollback.
ctrl+okeeps your reading position when running commands change the transcript above it.- File searches pick up newly created files and respect parent and global ignore rules.
grep_filesno longer hangs when it encounters a named pipe.- An empty or relative
HOMEno longer crashes fx or puts profile files in the current folder. - Shell commands no longer fail when a child process exits in gVisor sandboxes, including Modal.
- Switching models or providers in ACP turns off Fast or Ultrafast when the new model does not support it.
- Embedded terminals apply Fast and Ultrafast to their first request without opening the model picker.
- libfx tool failures include an error message even when the tool throws an empty error.
- libfx saves each tool result as it finishes, so recovery can reuse completed work.
- Interrupted libfx tools no longer appear to run forever after recovery. Their events report that the call may have partly run.
- libfx rejects checkpoints created by a newer version instead of attempting to restore them.
- A steer that starts a durable libfx turn is no longer applied twice or dropped when it contains images.
- Cancelling a durable libfx session no longer stops a queued prompt that starts after the cancellation. Steering already assigned to another queued prompt no longer reaches the running turn.
- Usage totals stay visible when a refresh fails or the local cache becomes unreadable.
- Gateway requests no longer fail intermittently at startup.
- libfx rejects invalid host HTTP statuses instead of crashing the process.
- Markdown rendering no longer crashes on incomplete UTF-8.
Security
- Workspace indexing and fx's built-in read-only Git checks no longer run repository-configured programs.
- Auto mode no longer reruns a refused built-in Git check without its protections.
- Local usage data is saved with owner-only permissions.
- Vercel and local libfx storage reject writes from a worker that has lost ownership of the session.
- libfx keeps credentials out of saved conversations and adds them only to the selected service's HTTP calls.
- libfx masks keys and tokens echoed in failed provider responses.
- Grok token refresh rejects credentials belonging to a different account.
- libfx sign-in helpers reject pasted callbacks from a different sign-in.
- Custom libfx endpoints require HTTPS outside localhost.
- libfx routes queued work to the named agent on the intended store, rather than another store with the same agent name. Use a separate
world()store for each customer whose sessions must stay separate. - libfx ignores queue deliveries that do not refer to an input already saved by the app. A delivery cannot replace that input or its caller context and session settings; apps must still authorize session access and authenticate their queue routes.
Breaking Changes
macOS release binaries now require macOS 15 or later.
Building fx from source now requires Zig 0.17.
…