Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,6 @@ dist/
/tools/db-v3.ts
/tools/db-v3.spec.ts
/tools/README.md

# ZCode writes its own ignore file into the folders it opens.
.zcodeignore
46 changes: 37 additions & 9 deletions GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ through a `zcode` executable on PATH. A custom `providers.zcode.dir` or

Then run `bitfrost setup zcode` once. Without it, GLM can't ask you for permission and is refused instead.

### opencode, Oh My Pi, Gemini CLI, Crush
### OpenCode, Oh My Pi, Gemini CLI, Crush

Sign in to the app first (`opencode auth login`, `omp`, `gemini`, or `crush login` and Crush's own provider setup). Then open the config screen (`bitfrost config`), turn the app on and pick its models. Or do the same by hand in `~/.config/bitfrost/config.json`:

Expand All @@ -48,9 +48,37 @@ Sign in to the app first (`opencode auth login`, `omp`, `gemini`, or `crush logi
}
```

opencode, Oh My Pi and Crush need `models`: only the models listed there are offered. `*` works as a wildcard. Gemini CLI offers all its models unless you name ones to skip.
OpenCode, Oh My Pi and Crush need `models`: only the models listed there are offered. `*` works as a wildcard. Gemini CLI offers all its models unless you name ones to skip.

Anthropic models are never offered through these apps. Any other model they list can be, GPT, GLM and Gemini included. If Codex, ZCode or Gemini CLI also offers that model, theirs keeps the short name, like glm, and the copy is named after its model id, like opencode-go-glm-5-3.
Any model they list can be offered, Claude, GPT, GLM and Gemini included. A Claude model needs a pattern that names it, like anthropic/* or its full id. A bare * doesn't turn Claude models on. Claude models get no short names, so names like sonnet keep meaning Claude Code's own models. If Codex, ZCode or Gemini CLI also offers that model, theirs keeps the short name, like glm, and the copy is named after its model id, like opencode-go-glm-5-3.

### Grok Build

Sign in to the Grok CLI (`grok login`). Then open the config screen (`bitfrost config`) and turn Grok Build on. Or do the same by hand in `~/.config/bitfrost/config.json`:

```json
{ "providers": { "grok": { "enabled": true } } }
```

It offers all its Grok models without a `models` list. No setup step. BitFrost runs it in always-approve mode and gates every action itself, so reads and edits inside the task folder run without asking; other commands and actions ask you. Its own subagents and scheduled runs are refused.

### Antigravity

Sign Antigravity in with an API key or a business account (an enterprise, Workspace or Google Cloud account). A personal Google account, or any sign-in BitFrost doesn't recognize as an API key or business account, won't work with BitFrost, because Antigravity's terms don't allow using it through another tool while it is signed in to a personal account. Then open the config screen (`bitfrost config`) and turn Antigravity on. Or do the same by hand in `~/.config/bitfrost/config.json`:

```json
{ "providers": { "agy": { "enabled": true } } }
```

Turning it on installs a small BitFrost bridge plugin into `~/.gemini/config/plugins/bitfrost-bridge`, so there is no setup step. If BitFrost ever says the bridge is missing, run `bitfrost setup agy`. The plugin does nothing in your own `agy` sessions and is removed by `bitfrost uninstall`. Reads and edits inside the task folder run without asking; commands and other actions ask you. Its subagents, agent messaging, workflows and schedules are refused.

It offers Gemini models, for example Gemini 3.8 Flash with effort low, medium and high, and gpt-oss. Antigravity's separate per-effort model ids show as one model with efforts, and its Claude models stay off until you turn them on in the config screen, or name them in `"anthropic": [...]` under `providers.agy`. Without a current bridge, BitFrost keeps Antigravity's permission prompts on, so actions that need permission are refused.

### Why did my Antigravity models disappear?

BitFrost checks how each Antigravity run signed in, before the first prompt and again before each model request. If that run used a personal Google account, a sign-in BitFrost doesn't recognize, or BitFrost can't tell how it signed in, BitFrost stops it and the task fails with a message saying why. The model listing does the same check, so with a personal sign-in the Antigravity models drop out of Claude's list of subagents and the Models page shows the reason. There is no setting to override this.

Switch Antigravity to an API key or a business account and it works again from the next run. The models come back within about 10 minutes, or right away after a refresh on the BitFrost Models page. Note that an API key set only in a shell rc file may not reach the BitFrost helper if it was started from the desktop app; the key must be in the environment the helper runs in.

### Custom Claude profiles

Expand Down Expand Up @@ -90,7 +118,7 @@ On the Models page, pick an app, then pick a model. Apps serving their own compa
{ "providers": { "codex": { "disabled": ["gpt-5-mini"] } } }
```

Apps serving many companies' models, like opencode, Oh My Pi and Crush, only offer the models you list, so turning one on adds it:
Apps serving many companies' models, like OpenCode, Oh My Pi and Crush, only offer the models you list, so turning one on adds it:

```json
{ "providers": { "opencode": { "models": ["deepseek/*"] } } }
Expand Down Expand Up @@ -124,7 +152,7 @@ curl -fsSL https://github.com/SavaSoftworks/BitFrost/releases/download/v0.8.1/in

Run `bitfrost uninstall`. It lists what it will remove and asks whether to remove BitFrost, your configuration, and your subagent history and usage stats. Keeping history preserves it for a reinstall.

`--yes` removes everything without prompting; add `--keep-config` or `--keep-history` to preserve either. If a subagent is running, uninstall changes nothing and asks you to wait.
`--yes` removes everything without prompting; add `--keep-config` or `--keep-history` to preserve either. It also removes the Antigravity bridge plugin, if installed. If a subagent is running, uninstall changes nothing and asks you to wait.

## Troubleshooting

Expand Down Expand Up @@ -167,7 +195,7 @@ BitFrost reloads configuration and detects app updates automatically. Changes th

### How do I turn an app off?

On the config screen, pick the app on the Settings page and turn it off. Or set `"enabled": false` under its name in `providers` in `~/.config/bitfrost/config.json`.
On the config screen, pick the app on the Settings page and turn it off. Or set `"enabled": false` under its name in `providers` in `~/.config/bitfrost/config.json`. Grok Build and Antigravity start off, so turn them on this way first.

## Using it

Expand All @@ -181,11 +209,11 @@ Yes. Ask "what is glm doing?". Claude checks BitFrost for the current step, rece

### Can I message a subagent while it works?

Yes, through Claude. Codex models take the message inside their current turn. GLM and opencode models get it when their turn ends. If it can't wait, ask Claude to interrupt: the subagent stops its current step and carries on in the same conversation with your message. Claude is told which of these happened.
Yes, through Claude. Codex models take the message inside their current turn. Antigravity steers the running turn, like Codex. Grok Build has no steering, so a message waits for its next turn. GLM and OpenCode models get it when their turn ends. If it can't wait, ask Claude to interrupt: the subagent stops its current step and carries on in the same conversation with your message. Claude is told which of these happened.

### Can I resume a subagent after restarting Claude?

Yes. Reopen the conversation and ask Claude to continue it. It picks up in the same conversation inside its app. For opencode this only works if your opencode version can reopen sessions.
Yes. Reopen the conversation and ask Claude to continue it. It picks up in the same conversation inside its app. For OpenCode this only works if your OpenCode version can reopen sessions.

### Where does BitFrost keep subagent history?

Expand All @@ -205,7 +233,7 @@ From the subagent runs BitFrost has recorded. The Models page shows usage for To

### Who answers a subagent's permission requests?

In normal mode, you decide; no answer means Deny. In auto mode, a safety review decides instead.
In normal mode, you decide; no answer means Deny. In auto mode, a safety review decides instead. Grok Build and Antigravity run in approve mode, so BitFrost gates their actions itself: reads and edits inside the task folder don't ask, other commands and actions ask you, and their own subagents and schedules are refused.

### What is official handback?

Expand Down
41 changes: 23 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,29 +51,29 @@ Node.js 23.6+, Claude Code, and at least one [supported coding app](#supported-h

### Installation

1. Add this to the `env` block of `~/.claude/settings.json`. This step is required:
Add this to the `env` block of `~/.claude/settings.json`. This step is required:

```json
"CLAUDE_CODE_ENABLE_FUNCTION_HOOKS": "1"
```

2. Run the installer:
Run the installer:

```sh
curl -fsSL https://github.com/SavaSoftworks/BitFrost/releases/latest/download/install.sh | sh
```

It installs the plugin into Claude Code and adds a `bitfrost` command to `~/.local/bin`. Existing databases are backed up and migrated during installation, including any required history processing.

3. For GLM, sign in to ZCode's command-line tool ([command in the guide](GUIDE.md#zcode-glm)), then run once:
For GLM, sign in to ZCode's command-line tool ([command in the guide](GUIDE.md#zcode-glm)), then run once:

```sh
bitfrost setup zcode
```

Without it, GLM can't ask you for permission and is refused instead.

4. Start a new Claude session. New models also only show up in a new session.
Start a new Claude session. New models also only show up in a new session.

If you use a Claude profile other than `~/.claude` (`CLAUDE_CONFIG_DIR`), see [Custom Claude profiles](GUIDE.md#custom-claude-profiles).

Expand All @@ -95,7 +95,7 @@ If the new release has settings you haven't chosen, the CLI asks about them at t
bitfrost uninstall
```

This removes the Claude plugin, daemon, ZCode plugin (if installed) and BitFrost's installed files. It asks separately whether to delete your configuration and history, including usage stats, so you can keep them for a reinstall.
This removes the Claude plugin, daemon, ZCode plugin (if installed), Antigravity bridge plugin (if installed) and BitFrost's installed files. It asks separately whether to delete your configuration and history, including usage stats, so you can keep them for a reinstall.

`--yes` removes everything without prompting; use `--keep-config` or `--keep-history` to preserve either.

Expand All @@ -112,7 +112,7 @@ bitfrost

<p align="center" float="left">
<img src="assets/screen3.png" alt="BitFrost terminal interface with Models, Settings and Status menu options">
<img src="assets/screen4.png" alt="BitFrost Models page showing opencode models and usage statistics">
<img src="assets/screen4.png" alt="BitFrost Models page showing OpenCode models and usage statistics">
</p>

Models manages providers, models and usage statistics. Settings configures Claude profiles, official handback, history retention and app locations. Status shows sessions and daemon activity.
Expand All @@ -128,16 +128,18 @@ If the interface can't open on your platform, BitFrost prints help and tells you

Use any mix of these.

| Harness | Models | Turned on |
|-----------------------------------------|---------|---|
| Codex (CLI, or the ChatGPT desktop app) | GPT | automatically, when installed and signed in |
| ZCode | GLM | automatically, when installed and signed in, plus one setup step |
| opencode, Oh My Pi, Crush | Various | only once you turn them on in the config screen or `~/.config/bitfrost/config.json` |
| Gemini CLI | Gemini | only once you turn it on, the same way |
| Harness | Models | Turned on |
|-----------------------------------------|-----------------|---|
| Codex (CLI, or the ChatGPT desktop app) | GPT | automatically, when installed and signed in |
| ZCode | GLM | automatically, when installed and signed in, plus one setup step |
| OpenCode, Oh My Pi, Crush | Various | only once you turn them on in the config screen or `~/.config/bitfrost/config.json` |
| Gemini CLI | Gemini | only once you turn it on, the same way |
| Grok Build | Grok | only once you turn it on |
| Antigravity | Gemini, gpt-oss | only once you turn it on, with an API key or a business account |

Codex and ZCode are fully supported. The others are experimental.

opencode, Oh My Pi and Crush also need a `models` list naming the models you want. Setup for each app is in [the guide](GUIDE.md#setup). The config screen sets this up too, so you don't need to edit the file by hand.
OpenCode, Oh My Pi and Crush also need a `models` list naming the models you want. Setup for each app is in [the guide](GUIDE.md#setup). The config screen sets this up too, so you don't need to edit the file by hand.

<br />

Expand Down Expand Up @@ -180,19 +182,20 @@ Once Claude understands the assignment, ask it to save that as a rule in your CL

- GLM needs a Z.ai individual coding plan. ZCode only offers Teams, Start plans, free usage, bigmodel and its other providers inside its desktop app, not to outside tools, so BitFrost can't use them.
- Windows is not a supported platform. It may work via WSL, but it also may not.
- Gemini CLI requires Gemini Code Assist Standard/Enterprise, Google Cloud access or a paid API key. [Google ended free and Google AI Pro/Ultra access in June 2026](https://github.com/google-gemini/gemini-cli/discussions/27274). Antigravity CLI (`agy`) isn't supported yet.
- Gemini CLI requires Gemini Code Assist Standard/Enterprise, Google Cloud access or a paid API key. [Google ended free and Google AI Pro/Ultra access in June 2026](https://github.com/google-gemini/gemini-cli/discussions/27274).
- ZCode's own auto mode doesn't work. When Claude Code is in auto mode, BitFrost reviews GLM's permission requests with a short Claude (Sonnet) check instead, which counts toward your Claude usage.
- Oh My Pi may only ask permission for commands, deletes and moves, not ordinary file edits.
- In opencode, denying a permission request ends that subagent's turn.
- BitFrost disables opencode's subagents and Oh My Pi's advisor, subagents and prewalk. Crush uses your selected model for helper work such as titles and summaries too.
- Claude Code is the only app that can hand out work. Codex, ZCode and the rest can take tasks but can't start BitFrost subagents of their own.
- Grok Build has no mid-turn steering. A message you send while it works waits for its next turn.
- Antigravity keeps BitFrost conversations in its own history (`~/.gemini/antigravity-cli/conversations`).
- In OpenCode, denying a permission request ends that subagent's turn.
- BitFrost disables OpenCode's subagents and Oh My Pi's advisor, subagents and prewalk. Crush uses your selected model for helper work such as titles and summaries too.
- BitFrost relies on Claude Code's function hooks, which are still experimental. A Claude Code update, or Anthropic switching the feature off remotely, can turn BitFrost off until it's fixed.

<br />

## More

---


- [Guide](GUIDE.md): Configuration, troubleshooting, etc.
- [Contributing](CONTRIBUTING.md)
Expand All @@ -205,6 +208,8 @@ Once Claude understands the assignment, ask it to save that as a rule in your CL

BitFrost runs supported coding apps on your machine. Those apps handle authentication and model requests using your accounts. You need valid access to each provider you use; usage counts toward that provider's limits and charges.

BitFrost refuses to run Antigravity when it is signed in to a personal Google account, because Antigravity's terms don't allow using it through another tool that way. The [guide's Antigravity section](GUIDE.md#antigravity) explains how to sign in, and [why the models may disappear](GUIDE.md#why-did-my-antigravity-models-disappear).

BitFrost does not resell or pool account access, or bypass quotas or access restrictions. You are responsible for following the applicable provider and app terms, including any plan or workplace restrictions.

BitFrost is an independent open-source project, not affiliated with, endorsed by or sponsored by the providers or app developers named here. Product names and trademarks belong to their respective owners and identify supported integrations.
Expand Down
4 changes: 2 additions & 2 deletions plugins/bitfrost/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "bitfrost",
"version": "0.9.2",
"description": "Use Codex, ZCode and ACP apps (opencode, Oh My Pi, Gemini CLI) as Claude Code subagents",
"version": "0.9.3",
"description": "Use Codex, ZCode, ACP apps (opencode, Oh My Pi, Gemini CLI), Crush, Grok Build and Antigravity as Claude Code subagents",
"author": {
"name": "Nick Germaine"
},
Expand Down
10 changes: 10 additions & 0 deletions plugins/bitfrost/agy-plugin/hook
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/bin/sh
# Copyright (C) 2026 Nick Germaine
# SPDX-License-Identifier: GPL-3.0-only
#
# BitFrost is free software: you can share and change it under the GNU General
# Public License, version 3 only. It comes with no warranty. See LICENSE.

# Acts only in runs BitFrost started, which carry BITFROST_AGY_TOKEN. No output means no opinion.
[ -n "$BITFROST_AGY_TOKEN" ] || exit 0
exec "$BITFROST_NODE" "$(dirname "$0")/hook.mjs" "$@"
48 changes: 48 additions & 0 deletions plugins/bitfrost/agy-plugin/hook.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright (C) 2026 Nick Germaine
// SPDX-License-Identifier: GPL-3.0-only
//
// BitFrost is free software: you can share and change it under the GNU General
// Public License, version 3 only. It comes with no warranty. See LICENSE.

// Sends one Antigravity hook call to the BitFrost helper and prints its answer.
// A tool call the helper doesn't explicitly allow or deny is blocked (exit 2), never
// allowed; other hooks fall back to no opinion.
import http from 'node:http'

const hook = process.argv[2] ?? ''
let input = ''
process.stdin.on('data', (c) => (input += c))
process.stdin.on('end', () => {
let payload
try { payload = JSON.parse(input || '{}') } catch { return fail('Antigravity sent a hook call BitFrost could not read') }
const req = http.request(
{
socketPath: process.env.BITFROST_SOCKET,
path: '/providers/agy/bridge',
method: 'POST',
headers: { 'content-type': 'application/json', 'x-bitfrost-token': process.env.BITFROST_AGY_TOKEN },
},
(res) => {
let body = ''
res.on('data', (c) => (body += c))
res.on('end', () => {
if (res.statusCode !== 200) return fail(`BitFrost refused the call (${res.statusCode})`)
if (hook === 'PreToolUse') {
let reply
try { reply = JSON.parse(body) } catch { return fail('BitFrost did not answer the tool call') }
if (!['allow', 'deny'].includes(reply?.decision)) return fail('BitFrost did not authorize the tool call')
}
if (body.trim()) process.stdout.write(body)
process.exit(0)
})
},
)
req.on('error', () => fail('BitFrost is not reachable'))
req.end(JSON.stringify({ hook, input: payload }))
})

function fail(reason) {
if (hook !== 'PreToolUse') process.exit(0)
process.stderr.write(reason)
process.exit(2)
}
6 changes: 6 additions & 0 deletions plugins/bitfrost/agy-plugin/hooks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"bitfrost-bridge": {
"PreToolUse": [{ "matcher": "*", "hooks": [{ "type": "command", "command": "./hook PreToolUse", "timeout": 604800 }] }],
"PreInvocation": [{ "type": "command", "command": "./hook PreInvocation", "timeout": 60 }]
}
}
1 change: 1 addition & 0 deletions plugins/bitfrost/agy-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ "name": "bitfrost-bridge", "version": "1.0.0", "description": "Passes Antigravity's tool calls and questions to BitFrost, in runs BitFrost starts. Does nothing otherwise." }
Loading
Loading