Skip to content

feat(fx): add Vercel fx as an agent provider - #22

Merged
LeulAria merged 4 commits into
mainfrom
feat/vercel-fx
Oct 28, 2026
Merged

LeulAria merged 4 commits into
mainfrom
feat/vercel-fx

Conversation

@LeulAria

Copy link
Copy Markdown
Owner

Summary

Adds Vercel's fx as an agent provider with its own tab in the model picker. fx speaks ACP natively (fx acp). The idea comes from pingdotgg/t3code#18277, but the wiring follows Volt's provider model:

  • Models come from fx models --json. The model fx status --json reports as the default is listed first. Volt doesn't open a throwaway ACP session to list them, because fx saves every session under ~/.fx/sessions. Each model has fx's Effort ladder (default Medium), which is written to fx's effort config option.
  • Permissions: Volt stays in charge. fx always runs in its ask mode and Volt's access rules answer every request. The first mode write after a session starts is always sent, because fx reports ask while it is still running its saved mode.
  • Setup: install script (macOS/Linux), fx login, and sign-in state read from fx status --json. Marked Early Access.
  • Picker and sandbox: fx brand glyph and rail tab, a sandbox footprint (~/.fx, AI Gateway, and the Codex/Grok backends fx can sign in to), an ACP exec route, and a seed-version bump so existing installs get the fx profile.

Validation

  • Passed: 13 unit tests across fxModels, execRouter and voltSetupPure. The fx parser fixtures are copied from T3's tests, not captured from a real fx.
  • Passed: src/ type-check, and the dev watcher compile on main.
  • Passed: pre-commit hygiene hook.
  • Not run: a live fx session. fx isn't installed on the test machine yet (curl -fsSL https://fx.sh/setup.sh | bash, then fx login).

Known gaps

  • Picking an fx model for Tab or chat titles still leaves a saved fx session per request.
  • Not ported from T3: fx skills in the composer's skill menu, fx subagents in their own threads, and steering.

🤖 Generated with Claude Code

LeulAria and others added 4 commits October 29, 2026 00:29
Pure parsers for `fx models --json` and `fx status --json`: the default
model first, fx's effort ladder on every row (default Medium).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
fx always runs in `ask` mode and Volt's access rules answer. The first
mode write after a session starts is always sent, because fx reports
`ask` while still running its saved mode. Models are listed from the CLI,
never a throwaway session (fx saves every one under ~/.fx/sessions).
The seed version bump gives existing installs the fx profile.

Inspired by pingdotgg/t3code#18277.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…its backends

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@vercel

vercel Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
volt Ready Ready Preview Oct 28, 2026 8:30pm UTC

Request Review

@LeulAria
LeulAria merged commit 43535b5 into main Oct 28, 2026
17 checks passed
LeulAria added a commit that referenced this pull request Nov 8, 2026
… moves the tier to ask, and the exports edges a sandboxed host breaks (P2, P8, H.5)

volt.extensions.sandboxMode: optIn (the default, N.1 #22) or required, which sandboxes every
third-party extension with code on macOS and Linux; Windows reads it as optIn until C7 is required
and green. volt.extensions.sandboxKillSwitch (and a confirmed command) moves every extension in scope
to ask: it keeps its own location, stays off with code kill-switch, and runs unsandboxed only when
the user says so. Opting an extension in first lists the exports edges (extensionDependencies) that
break when it runs alone. Webview and openExternal ownership follow the same tier.
P8-TIER-1, P8-KILL-2..4, P8-MODE-1, P8-ROUTE-1, T3-EXPORTS-1, T3-GIT-1.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
LeulAria added a commit that referenced this pull request Nov 13, 2026
…ts and side chats (05-limitations #22)

thread_wait (its answer carries the waited-on chat's last reply), queue_list (another chat's
queued prompts) and worktree_status (another chat's checkout) were `safe`, so a sandboxed chat
read other chats through them; thread_list listed every chat's title and status. A parent also
could not read its own subagents (any other id was agents.read:other).

- The three are `reads-other` with their targets (thread_wait: every id it names).
- The gate treats chats in the caller's subtree (subagents and side chats at any depth, by the
  parent the history records; the bridge resolves session aliases) as its own:
  agents.read:current. Anything else stays agents.read:other, refused for a sandboxed chat.
- thread_list for a sandboxed chat lists only its subtree. thread_search stays refused.
- Unsandboxed chats: unchanged. GATE-XCHAT-4.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant