Skip to content

Commit 5e2be25

Browse files
ShadowCode 0.30.0: Antigravity through Google's official ACP agent server
- Antigravity now runs on agy_acp_server.par (ACP registry `antigravity-acp` 1.2.1) instead of `agy --print`, which auto-denied every tool. It sends session/request_permission, so ShadowCode's approvals apply; it accepts images and resumes with session/load. Models come from the session's `model` config option (session/set_config_option). Questions it sends through the permission method are skipped with a note. - Install from Settings > Accounts: 334 MB from dl.google.com, pinned size and SHA-256, built-in unzip (flate2), managed copy under ~/.local/share/shadowcode/antigravity-acp/1.2.1, removable. - Private GEMINI_HOME profile with file-based token storage. Connect runs the server's `authenticate` (oauth-personal) and relays the Google link; Disconnect deletes the profile. Status checks and tasks set BROWSER=true and treat a printed sign-in link as "Sign in" (tasks stop at once). - Per-launch TMPDIR, removed afterwards; Google API-key and cloud-project variables removed; --enforce_kernel_ipv6_support=false on hosts without ::1. - Accounts UI: install dialog with size, host and folder, progress, retry, remove; picker setup rows open the Antigravity card. - Tests: fake ACP server end to end (sign-in detection, Connect, models, a task, temp cleanup, Disconnect), adapter protocol test, opt-in live install. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 480857d commit 5e2be25

40 files changed

Lines changed: 2704 additions & 621 deletions

‎CHANGELOG.md‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,29 @@
11
# Changelog
22

3+
## 0.30.0: Antigravity that asks first
4+
5+
- **Antigravity runs through Google's official ACP agent server** (the
6+
`antigravity-acp` entry in the ACP registry) instead of `agy`'s print mode.
7+
It now sends permission requests, so ShadowCode's approvals apply to its
8+
commands and edits, it accepts images, and it resumes sessions with
9+
`session/load`. Models come from the session's `model` config option and are
10+
switched with `session/set_config_option`.
11+
- **Install from Accounts.** The server is downloaded only when you choose
12+
**Install** (334 MB from dl.google.com, size and SHA-256 pinned), unpacked
13+
into `~/.local/share/shadowcode/antigravity-acp/1.2.1`, and can be removed
14+
again. A built-in unzip handles the archive.
15+
- **Private sign-in.** The server keeps its Google sign-in in a profile owned
16+
by ShadowCode. **Connect** opens the browser and relays the link;
17+
**Disconnect** deletes the profile. Status checks and tasks can't open a
18+
browser: a printed sign-in link marks the row *Sign in*, and a task stops
19+
with that message at once.
20+
- **Clean launches.** Each launch gets its own temp directory, removed
21+
afterwards, and runs without Google API-key or cloud-project variables. On
22+
hosts without an IPv6 loopback, the server's own
23+
`--enforce_kernel_ipv6_support=false` switch is passed.
24+
- Questions the server asks through the permission channel are skipped with a
25+
note for now.
26+
327
## 0.29.0: OpenRouter, working web search
428

529
- **OpenRouter API keys.** People without a subscription can paste an

‎Cargo.lock‎

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ default-members = ["native/core"]
44
resolver = "2"
55

66
[workspace.package]
7-
version = "0.29.0"
7+
version = "0.30.0"
88
edition = "2021"
99
rust-version = "1.95"
1010
license = "MIT"

‎README.md‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ need Ollama, LM Studio or any other model server.
2626
ShadowCode's own tools can be rewound.
2727

2828
Release history is in [CHANGELOG.md](CHANGELOG.md). What's new in this release:
29-
[0.29.0 release notes](docs/RELEASE_NOTES.md).
29+
[0.30.0 release notes](docs/RELEASE_NOTES.md).
3030

3131
## Install
3232

3333
Releases target x86_64 Linux with glibc 2.39 or newer (Ubuntu 24.04 or later).
3434
Download from [GitHub releases](https://github.com/Shadowfetchapps/ShadowCode/releases/latest):
3535

36-
- `ShadowCode_0.29.0_amd64.AppImage`
37-
- `ShadowCode_0.29.0_amd64.deb`
36+
- `ShadowCode_0.30.0_amd64.AppImage`
37+
- `ShadowCode_0.30.0_amd64.deb`
3838
- `SHA256SUMS`
3939

4040
### AppImage (recommended)
@@ -45,7 +45,7 @@ from a checkout of this repository:
4545
```bash
4646
sha256sum --ignore-missing -c SHA256SUMS
4747
git clone https://github.com/Shadowfetchapps/ShadowCode.git
48-
./ShadowCode/scripts/install-appimage.sh ~/Downloads/ShadowCode_0.29.0_amd64.AppImage
48+
./ShadowCode/scripts/install-appimage.sh ~/Downloads/ShadowCode_0.30.0_amd64.AppImage
4949
```
5050

5151
[`scripts/install-appimage.sh`](scripts/install-appimage.sh):
@@ -65,14 +65,14 @@ git clone https://github.com/Shadowfetchapps/ShadowCode.git
6565
AppImages only after a successful install.
6666

6767
To run the AppImage without installing it:
68-
`./ShadowCode_0.29.0_amd64.AppImage --appimage-extract-and-run`. FUSE is not
68+
`./ShadowCode_0.30.0_amd64.AppImage --appimage-extract-and-run`. FUSE is not
6969
required.
7070

7171
### Debian package
7272

7373
```bash
7474
sha256sum --ignore-missing -c SHA256SUMS
75-
sudo apt install ./ShadowCode_0.29.0_amd64.deb
75+
sudo apt install ./ShadowCode_0.30.0_amd64.deb
7676
```
7777

7878
The deb installs `shadowcode` and the same llama.cpp runtime in
@@ -130,7 +130,7 @@ for that vendor.
130130
| Codex | `codex app-server` (JSON-RPC) | `codex login` | app-server `model/list` | Yes (`localImage`), per model | Yes: command and file-change requests. Codex runs in its own sandbox (`workspace-write`, or `read-only` for Plan/Review) | Rate-limit windows per quota pool (for example 5-hour and weekly), reset times, plan, and credits only when reported |
131131
| Claude Code | `claude -p --output-format stream-json --input-format stream-json --permission-prompts host` | `claude auth login` | *Default* plus the aliases listed in `claude --help` | Yes (image blocks) | Yes, through `--permission-prompts host`. Claude's own settings can pre-approve tools without asking | *Usage unavailable*: Claude Code exposes no plan usage to other apps |
132132
| Cursor | `cursor-agent acp` (Agent Client Protocol) | `cursor-agent login` | ACP session models, with exact IDs | When ACP `initialize` advertises image support | Yes, through ACP permission requests | *Usage unavailable*: Cursor reports its plan tier, not the remaining allowance |
133-
| Antigravity | `agy --output-format stream-json --input-format stream-json --print=` | Not available from ShadowCode: run `agy` once to sign in | `agy models` | No (text-only input) | **No**: Antigravity applies its own permission settings in headless mode | *Usage unavailable*: usage appears only in `agy`'s interactive `/usage` panel |
133+
| Antigravity | Google's ACP agent server `agy_acp_server.par` (installed from Accounts) | Google sign-in through the server's `authenticate` | The `model` config option of the ACP session | Yes (ACP image support) | Yes, through ACP permission requests | *Usage unavailable*: the server reports no plan usage |
134134
| Grok | `grok agent stdio` (ACP) | `grok login` | ACP session models (falls back to `grok models`) | No: ACP reports `image: false` | Yes, through ACP. Grok has no read-only mode, so Plan/Review is not enforced by Grok | *Usage unavailable*: Grok reports per-session tokens only |
135135

136136
- **API keys are never used.** Vendor CLIs start with provider API-key
@@ -146,11 +146,11 @@ for that vendor.
146146

147147
Setup details: [subscriptions](docs/SUBSCRIPTIONS.md).
148148

149-
**Antigravity limitation.** `agy`'s headless mode can't ask ShadowCode for
150-
permission, so it denies any command it would normally ask about. A task that
151-
needs one now fails with that explanation instead of ending with an empty
152-
answer. Use Antigravity for questions and edits it may make on its own, or
153-
pick another model for tasks that run commands.
149+
**Antigravity** runs through Google's official ACP agent server instead of the
150+
`agy` CLI, so it asks ShadowCode before running commands or editing files.
151+
**Install** on its Accounts card downloads the server once (334 MB from
152+
dl.google.com, checksum-verified); **Connect** signs in with Google. Details:
153+
[subscriptions](docs/SUBSCRIPTIONS.md#antigravitys-agent-server).
154154

155155
## API keys (OpenRouter)
156156

‎SECURITY.md‎

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,18 @@ separate account when you need stronger isolation.
2727

2828
- **ShadowCode never reads vendor credentials.** Sign-in state comes from each
2929
vendor's documented status command or protocol: Codex app-server
30-
`account/read`, `claude auth status`, the ACP handshake for Cursor and Grok,
31-
`agy models`. ShadowCode never opens `~/.codex/auth.json`, Claude's
32-
credential files, the Grok or Cursor login files, or Antigravity's keyring
33-
entry.
30+
`account/read`, `claude auth status`, the ACP handshake for Cursor, Grok and
31+
Antigravity. ShadowCode never opens `~/.codex/auth.json`, Claude's
32+
credential files, the Grok or Cursor login files, or the token in
33+
Antigravity's profile.
3434
- **Connect and Disconnect** run the vendor's own login and logout commands
3535
as supervised child processes. The vendor opens the browser or prints a URL
3636
or device code. ShadowCode only relays the printed lines after redaction, and
3737
never shows a URL that carries a code or token parameter as a link.
38-
Antigravity sign-in and sign-out happen only inside `agy`.
38+
Antigravity's Connect asks its agent server to `authenticate`; the server
39+
opens the browser and stores the token in ShadowCode's private Antigravity
40+
profile, which Disconnect deletes. Status checks and tasks run the server
41+
with a no-op `BROWSER`, so it can't open a sign-in page on its own.
3942
- **No API keys reach vendor CLIs.** Every vendor CLI that runs a task, and
4043
every login and logout, starts without `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`,
4144
`OPENAI_API_KEY`, `CODEX_API_KEY`, `CURSOR_API_KEY`, `XAI_API_KEY`,
@@ -98,6 +101,14 @@ network mode is *Online*.
98101
ShadowCode names itself in its user agent and never works around a bot
99102
check.
100103

104+
## Antigravity agent download
105+
106+
The Antigravity agent server is downloaded only when you choose **Install**,
107+
from the URL in the ACP registry (`dl.google.com`). ShadowCode refuses it
108+
unless its size and SHA-256 match the values pinned in the release, unpacks
109+
only plain file names from the archive, and starts it without Google API-key
110+
or cloud-project variables.
111+
101112
## OpenRouter API key
102113

103114
The key is checked with OpenRouter's `GET /api/v1/key`, then stored in the
@@ -135,7 +146,7 @@ What each vendor runtime enforces (from `permissions.rs`, shown in
135146
| Claude Code | Permission prompts come to ShadowCode (`--permission-prompts host`). Plan/Review uses `--permission-mode plan`. Claude's own settings can pre-approve tools that ShadowCode never sees |
136147
| Cursor | ACP permission requests come to ShadowCode. Plan/Review uses Cursor's plan mode when offered |
137148
| Grok | ACP permission requests come to ShadowCode. Grok has no read-only mode, so Plan/Review is not enforced by Grok |
138-
| Antigravity | Never asks ShadowCode. It applies its own settings (`~/.gemini/antigravity-cli/settings.json`) and soft-denies actions it may not run. Plan/Review uses `--mode plan` |
149+
| Antigravity | Asks through ACP `session/request_permission`, like Cursor and Grok. In Plan/Review ShadowCode denies its requests |
139150

140151
In read-only tasks, ShadowCode denies vendor approval requests automatically.
141152
Unanswered vendor requests are denied after `approval_timeout_sec` (600 s by

‎docs/RELEASE_NOTES.md‎

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
1-
ShadowCode 0.29.0 adds OpenRouter for people without a subscription, and
2-
makes web search work from networks where DuckDuckGo refuses automated
3-
requests. The 0.28 notes follow below.
1+
ShadowCode 0.30.0 makes Antigravity a full citizen: it now asks before it
2+
acts, like Codex, Claude Code, Cursor and Grok. The 0.29 notes follow below.
3+
4+
## New in 0.30.0
5+
6+
- **Antigravity asks first.** It now runs through Google's official ACP agent
7+
server instead of the `agy` CLI's print mode, which silently denied any
8+
command. Commands and edits reach ShadowCode's approvals, images work, and
9+
conversations resume.
10+
- **One-time install.** **Settings › Accounts › Antigravity › Install**
11+
downloads the server from Google (334 MB, checksum-verified). **Connect**
12+
then signs in with Google in your browser. This sign-in is ShadowCode's own
13+
and separate from the `agy` CLI.
14+
- **No surprise browser tabs.** Status checks and tasks never open a sign-in
15+
page. If the sign-in expires, the row says *Sign in* and a task stops with
16+
that message.
417

518
## New in 0.29.0
619

@@ -119,9 +132,9 @@ runtime that ships with the app.
119132

120133
## Downloads
121134

122-
- `ShadowCode_0.29.0_amd64.AppImage`
123-
- `ShadowCode_0.29.0_amd64.deb`
124-
- `ShadowCode_0.29.0_appimage-runtime-sources.tar.gz`
135+
- `ShadowCode_0.30.0_amd64.AppImage`
136+
- `ShadowCode_0.30.0_amd64.deb`
137+
- `ShadowCode_0.30.0_appimage-runtime-sources.tar.gz`
125138
- `SHA256SUMS`
126139

127140
Builds are for x86_64 Linux with glibc 2.39 or newer (Ubuntu 24.04 or later).

‎docs/SUBSCRIPTIONS.md‎

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ tools** (`cli_agents.<vendor>_binary`).
1717
| Codex | `codex` | `npm i -g @openai/codex` | **Connect** runs `codex login` |
1818
| Claude Code | `claude` | [Claude Code](https://code.claude.com/docs/en/headless) | **Connect** runs `claude auth login` |
1919
| Cursor | `cursor-agent` | [Cursor CLI](https://cursor.com/docs/cli/acp) | **Connect** runs `cursor-agent login` |
20-
| Antigravity | `agy` | [Antigravity CLI](https://antigravity.google/docs/cli/install/) (the `antigravity` desktop app is not the CLI) | Run `agy` once in a terminal. ShadowCode can't start this sign-in |
20+
| Antigravity | `agy_acp_server.par` (Google's ACP agent server) | **Install** in **Settings › Accounts** downloads Google's official agent server (334 MB from dl.google.com, checked against a pinned SHA-256) | **Connect** signs in with Google in the browser |
2121
| Grok | `grok` | [xAI CLI](https://docs.x.ai/build) | **Connect** runs `grok login` |
2222

2323
- **Connect** runs the login command with your environment, minus provider API
@@ -29,26 +29,51 @@ tools** (`cli_agents.<vendor>_binary`).
2929
`claude auth logout`, `cursor-agent logout` or `grok logout`. Those sign the
3030
CLI out everywhere on this computer, not only in ShadowCode. ShadowCode then
3131
forgets the vendor's cached status, stored usage snapshots and every
32-
conversation's stored vendor session. Antigravity keeps its login in the OS
33-
keyring: type `/logout` inside `agy`.
32+
conversation's stored vendor session. For Antigravity, Disconnect deletes
33+
ShadowCode's private Antigravity profile (its Google sign-in); the `agy` CLI
34+
and the Antigravity app keep their own sign-ins.
3435
- **Refresh** checks one vendor again. Otherwise each vendor is checked at
3536
most once every 5 minutes, and failures back off. In *Offline* mode no vendor
3637
process is started for status, models or usage.
3738

3839
A row is **Ready** only after the vendor's own status check says so. An
3940
installed binary or a login file is not enough.
4041

42+
## Antigravity's agent server
43+
44+
Antigravity runs through Google's official ACP agent server, the one listed in
45+
the [ACP registry](https://github.com/agentclientprotocol/registry) and used by
46+
other editors. It asks ShadowCode before it runs commands or edits files, which
47+
the `agy` CLI's print mode could not do.
48+
49+
- **Install.** **Settings › Accounts › Antigravity › Install** downloads
50+
version 1.2.1 from `dl.google.com` (334 MB), checks its size and SHA-256,
51+
and unpacks it (about 1.1 GB) into
52+
`~/.local/share/shadowcode/antigravity-acp/1.2.1`. **Remove agent** deletes
53+
it. To use a copy you manage yourself, set `cli_agents.antigravity_binary`
54+
to its `agy_acp_server.par` path (with `localharness_external` beside it).
55+
- **Sign-in.** The server keeps its Google sign-in in a private profile,
56+
`~/.local/share/shadowcode/antigravity-acp/profile`, separate from the `agy`
57+
CLI and the Antigravity app. **Connect** lets it open your browser;
58+
ShadowCode also shows the link. Status checks and tasks never open a browser:
59+
if the sign-in is missing or expired, the row says *Sign in* and a task
60+
stops with that message.
61+
- **Temp files.** Each launch gets its own temp directory, removed afterwards.
62+
- **Hosts without IPv6.** The server refuses to start without an IPv6
63+
loopback (`::1`); on such hosts ShadowCode passes the server's own
64+
`--enforce_kernel_ipv6_support=false` switch.
65+
4166
## What each vendor exposes
4267

4368
| | Codex | Claude Code | Cursor | Antigravity | Grok |
4469
| --- | --- | --- | --- | --- | --- |
45-
| Runtime | `codex app-server` (JSON-RPC 2.0) | `claude -p --output-format stream-json --input-format stream-json --verbose --include-partial-messages --permission-prompts host` | `cursor-agent acp` (Agent Client Protocol) | `agy --output-format stream-json --input-format stream-json --print=` | `grok agent stdio` (ACP) |
46-
| Sign-in check | app-server `account/read` (falls back to `codex login status`) | `claude auth status` | ACP `initialize` → `authenticate` → `session/new` | `agy models` | ACP handshake (falls back to `grok models`) |
47-
| Models | app-server `model/list` | *Default* plus the aliases (`fable`, `opus`, `sonnet`, `haiku`) that the installed `claude --help` lists | ACP session models. Exact IDs, including bracketed parameters, set with `session/set_model`. *Auto* is Cursor's own router | `agy models` | ACP session models |
48-
| Image input | Yes (`localImage`), for models that accept images | Yes (base64 image blocks) | When ACP `initialize` reports image support | No: text blocks only, and images are refused before sending | No: ACP reports `image: false` |
49-
| Approvals reach ShadowCode | Yes: command and file-change requests | Yes: `can_use_tool` control requests | Yes: `session/request_permission` | **No**: its own settings decide, and refusals are reported afterwards | Yes: `session/request_permission` |
50-
| Plan/Review (read-only) | `sandbox: read-only` | `--permission-mode plan` | ACP mode `plan`, when offered | `--mode plan` | Not enforced by Grok |
51-
| Resume | `thread/resume` | `--resume <session>` | `session/load` | `--conversation <id>` | `session/load` |
70+
| Runtime | `codex app-server` (JSON-RPC 2.0) | `claude -p --output-format stream-json --input-format stream-json --verbose --include-partial-messages --permission-prompts host` | `cursor-agent acp` (Agent Client Protocol) | `agy_acp_server.par --uid=` (Agent Client Protocol) | `grok agent stdio` (ACP) |
71+
| Sign-in check | app-server `account/read` (falls back to `codex login status`) | `claude auth status` | ACP `initialize` → `authenticate` → `session/new` | ACP `initialize` → `authenticate` (`oauth-personal`) → `session/new`; a printed Google sign-in link means *Sign in* | ACP handshake (falls back to `grok models`) |
72+
| Models | app-server `model/list` | *Default* plus the aliases (`fable`, `opus`, `sonnet`, `haiku`) that the installed `claude --help` lists | ACP session models. Exact IDs, including bracketed parameters, set with `session/set_model`. *Auto* is Cursor's own router | The `model` option of `session/new`'s `configOptions`, set with `session/set_config_option` | ACP session models |
73+
| Image input | Yes (`localImage`), for models that accept images | Yes (base64 image blocks) | When ACP `initialize` reports image support | Yes: ACP `initialize` reports image support | No: ACP reports `image: false` |
74+
| Approvals reach ShadowCode | Yes: command and file-change requests | Yes: `can_use_tool` control requests | Yes: `session/request_permission` | Yes: `session/request_permission` (questions it asks are skipped with a note) | Yes: `session/request_permission` |
75+
| Plan/Review (read-only) | `sandbox: read-only` | `--permission-mode plan` | ACP mode `plan`, when offered | ShadowCode denies its requests | Not enforced by Grok |
76+
| Resume | `thread/resume` | `--resume <session>` | `session/load` | `session/load` | `session/load` |
5277
| Usage shown | Plan rate-limit windows per quota pool | *Usage unavailable* | *Usage unavailable* | *Usage unavailable* | *Usage unavailable* |
5378

5479
Grok isn't one of the featured vendors: its rows are listed after the others.
@@ -67,8 +92,7 @@ ShadowCode shows only what a vendor reports. It never estimates a figure.
6792
*Usage unavailable* and links to `claude.ai/settings/usage`.
6893
- **Cursor** reports its plan tier but no remaining allowance, so the row says
6994
*Usage unavailable*.
70-
- **Antigravity** shows usage only in its interactive `/usage` panel, which
71-
can't be read by another program.
95+
- **Antigravity**'s agent server reports no plan usage to other programs.
7296
- **Grok** reports per-session token counts only.
7397

7498
After a restart, the last Codex snapshot is loaded from the database and marked

0 commit comments

Comments
 (0)