paseo-agy-acp 2.3.0 β†’ 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,486 +1,158 @@
1
1
  <div align="center">
2
2
 
3
- # πŸ”Œ paseo-agy-acp
3
+ # paseo-agy-acp
4
4
 
5
- **Paseo adapter in front of Google's official Antigravity ACP kernel**
5
+ **Reliable Paseo adapter for Google's official Antigravity ACP kernel**
6
6
 
7
7
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square)](./LICENSE)
8
- [![Version](https://img.shields.io/badge/version-2.3.0-blue?style=flat-square)](./package.json)
8
+ [![Version](https://img.shields.io/badge/version-2.3.1-blue?style=flat-square)](./package.json)
9
9
  [![npm](https://img.shields.io/npm/v/paseo-agy-acp?style=flat-square)](https://www.npmjs.com/package/paseo-agy-acp)
10
- [![Node](https://img.shields.io/badge/node-%3E%3D22-brightgreen?style=flat-square)](#)
10
+ [![Node](https://img.shields.io/badge/node-%3E%3D22-brightgreen?style=flat-square)](./package.json)
11
11
  [![ACP](https://img.shields.io/badge/ACP-NDJSON%20v1-8A2BE2?style=flat-square)](https://agentclientprotocol.com)
12
12
 
13
- </div>
14
-
15
- <div align="center">
16
-
17
- [πŸ‡ΊπŸ‡Έ English](./README.md) | [πŸ‡¨πŸ‡³ δΈ­ζ–‡](./README.zh-CN.md)
13
+ [English](./README.md) | [δΈ­ζ–‡](./README.zh-CN.md) | [Changelog](./CHANGELOG.md)
18
14
 
19
15
  </div>
20
16
 
21
- ---
22
-
23
- `paseo-agy-acp` is the Paseo-facing ACP product for Google Antigravity. From
24
- **2.1.0.0** it runs Google's official Antigravity ACP kernel (`agy_acp_server` /
25
- Registry id `antigravity-acp`) as a thin NDJSON proxy, then adds the Paseo
26
- behavior that Generic ACP does not provide on its own: daemon context, session
27
- mode mapping, MCP rewrite, product identity, and an account-wide Admission
28
- queue so the Paseo main controller can delegate many Antigravity agents without
29
- a startup stampede.
30
-
31
- **2.2** still uses the same official ACP kernel. It only adds an explicit
32
- **local opt-in** compatibility layer: entitled Claude 4.6 and GPT-OSS 120B can
33
- complete turns on this path. If you do not opt in, the official path supports
34
- Gemini-family models only by default.
35
-
36
- **2.3.0** adds slash command hints for user-invocable skills discovered from
37
- Gemini, Agents, Codex, configured, and workspace roots. Native ACP commands stay
38
- intact, workspace skills remain scoped to their session cwd, and concurrent
39
- session creation cannot mix command hints between workspaces.
40
-
41
- > **Not official Paseo support. Not official Google support.**
42
- > Community-maintained product. Use at your own risk.
43
-
44
- ## 30-second summary
45
-
46
- If you use Paseo with Google Antigravity, `paseo-agy-acp` gives Paseo a
47
- product-ready path to Google's official Antigravity ACP kernel. It keeps the
48
- model work inside the official kernel and adds the Paseo-side behavior that a
49
- Generic ACP bridge does not provide:
50
-
51
- - daemon context injection
52
- - session mode mapping
53
- - MCP `http` to official `sse` rewrite
54
- - stable product identity
55
- - local and workspace skill discovery for ACP slash command hints
56
- - burst-safe account-wide Admission queue for multi-agent delegation
57
- - local opt-in for Claude 4.6 and GPT-OSS 120B; without it, Gemini-family only
58
-
59
- ## Who this is for
60
-
61
- Use this if:
62
-
63
- - you run Paseo
64
- - you have Google Antigravity installed and authenticated locally
65
- - you want Antigravity available through Generic ACP
66
- - you delegate multiple agents and want startup bursts paced instead of stampeded
67
- - you want Claude 4.6 or GPT-OSS 120B through Paseo on the official ACP kernel (local opt-in)
68
-
69
- This is probably not for you if:
70
-
71
- - you do not use Paseo
72
- - you want a standalone Antigravity replacement
73
- - you expect this package to redistribute Google's proprietary kernel
74
-
75
- ## Quickstart
76
-
77
- Prerequisites: **Paseo**, **Node.js >= 22**, and a **locally installed** official
78
- Antigravity ACP kernel (this package does **not** install Google's `.par`).
79
- `--login` completes official OAuth (`authenticate` / `oauth-personal`). Set
80
- `PASEO_AGY_ACP_OFFICIAL_BIN` to your kernel wrapper or `.par` (required unless
81
- it already sits at the maintainer-host default pin).
82
-
83
- The npm package `paseo-agy-acp@2.3.0` is the **proxy**. `npx` launches that
84
- proxy; it does not replace Antigravity or Paseo.
85
-
86
- ```bash
87
- export PASEO_AGY_ACP_OFFICIAL_BIN="/absolute/path/to/agy_acp_server.par-or-wrapper"
88
- npx -y paseo-agy-acp@2.3.0 --login
89
-
90
- export AGY_ACP_STATE_DIR="$HOME/.local/state/paseo-agy-acp/default"
91
- install -d -m 700 "$AGY_ACP_STATE_DIR"
92
- npx -y --package=paseo-agy-acp@2.3.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
93
- export AGY_ACP_ADMISSION_ENABLED=true
94
- ```
95
-
96
- Then point Paseo's Generic ACP `command` at npx (see
97
- [Paseo provider config](#paseo-provider-config)). Do **not** treat the next
98
- line as a standalone chat app: it is the stdio ACP server Paseo spawns.
99
-
100
- ```bash
101
- npx -y paseo-agy-acp@2.3.0
102
- ```
103
-
104
- Claude / GPT-OSS: [Β§1](#1-official-agy-acp-kernel-capabilities) and the
105
- [runbook](docs/operations/official-kernel-compat-runbook.md). Source checkout
106
- (`git clone` + `npm ci` + `npm run build`) is under [Install](#install).
107
-
108
- ## About
109
-
110
- This repository is a **product adapter**, not a second Antigravity. The kernel
111
- does the model work; this repo adds the Paseo-side behavior a Generic ACP bridge
112
- does not provide on its own.
113
-
114
- | Highlight | Why it matters |
115
- |---|---|
116
- | **Official ACP kernel** | Native ACP over NDJSON. Without opt-in the official path supports Gemini only. Local opt-in adds entitled Claude 4.6 and GPT-OSS 120B. |
117
- | **Paseo-side glue** | Daemon `appendSystemPrompt`, mode ids Paseo already sends, and MCP `http` servers are rewritten so Generic ACP agents can talk to Antigravity without extra adapter code. You still install Paseo, the official kernel, and point `command` at this proxy. |
118
- | **Burst-safe delegation** | An account-wide durable Admission queue paces `session/prompt` so Paseo's main controller can dispatch many Antigravity agents without every turn hitting the kernel at once. |
119
- | **Production-tested defaults** | Default **8 shared seats / 8 concurrent starts / 2s interval**, from live Paseo dispatch (including a 10-agent burst) plus isolated stress. Integers **β‰₯ 1** can probe higher; this repo does **not** invent a product ceiling. |
120
- | **Fail-closed operations** | Bad env, policy splits, and unprovable writes fail closed. Queue timeout, cancel, and kernel errors stay distinguishable. |
121
- | **Empty-turn guard** | An official `end_turn` with no visible assistant/tool output becomes a JSON-RPC error, so Paseo does not record a silent success. |
122
- | **Clean license split** | This repo stays **Apache-2.0**. The official kernel is proprietary: we **spawn** the binary you already installed; npm does **not** ship the ~1.5GiB `.par`. |
123
-
124
- ```text
125
- Paseo Generic ACP (NDJSON)
126
- β†’ paseo-agy-acp product proxy
127
- identity Β· daemon context Β· mode map Β· MCP rewrite Β· Admission fence
128
- β†’ official agy_acp_server (NDJSON)
129
- ```
130
-
131
- | Layer | License | What we do |
132
- |---|---|---|
133
- | **This repository** (proxy, Admission, Paseo context) | **Apache-2.0** | Keep Apache-2.0. We are **not** relicensing. |
134
- | **Official ACP kernel** (`agy_acp_server.par` / `antigravity-acp`) | **Proprietary** | Spawn the kernel on the local machine. Do not redistribute it. |
135
- | **ACP protocol / `@agentclientprotocol/sdk`** | Separate Apache-2.0 ecosystem | Not required at runtime for the official NDJSON proxy. |
136
-
137
- ---
138
-
139
- ## 1. Official `agy-acp` kernel capabilities
140
-
141
- The product **does not reimplement** Antigravity. It starts Google's native ACP
142
- server and forwards Agent Client Protocol NDJSON. The table below is the
143
- **official kernel** surface, as seen through that protocol.
144
-
145
- | Area | What the official kernel provides |
146
- |---|---|
147
- | Protocol | Native **ACP v1 over NDJSON** |
148
- | Auth | `authenticate` with `methodId=oauth-personal` (OAuth inside the kernel) |
149
- | Session lifecycle | `initialize`, `session/new`, `session/prompt`, `session/cancel`, `session/set_mode`, `session/set_config_option` |
150
- | Streaming | `session/update`: assistant text, thoughts, tool calls / tool updates |
151
- | Live session modes | `default`, `auto_edit`, `yolo` (official has **no** plan mode) |
152
- | Tools | File edits, shell/terminal, and other Antigravity tools as Google implements them |
153
- | MCP | Official MCP client; servers are declared on `session/new` |
154
- | Models | Without opt-in: Gemini-family only. With local opt-in: entitled Claude 4.6 and GPT-OSS 120B ([Β§2](#2-paseo-adaptations)). |
155
- | Turn completion | Official `end_turn` / stop reasons |
156
-
157
- ### Models
17
+ <!-- readme:positioning -->
18
+ ## What this product is
158
19
 
159
- Without opt-in, the official ACP path supports **Gemini-family models only**.
160
- The Antigravity IDE can already list Claude 4.6 and GPT-OSS 120B for entitled
161
- accounts; on this ACP path those requests are still shaped for Gemini (JSON
162
- Schema, tool-call ids, GPT generation config), so they are not a default
163
- working set.
20
+ `paseo-agy-acp` is the product adapter between Paseo and Google's official
21
+ Antigravity ACP kernel. Authentication, models, tools, MCP, and inference stay
22
+ inside the official kernel. This adapter adds the context, compatibility,
23
+ concurrency control, skill discovery, and failure semantics required for
24
+ reliable Paseo multi-agent operation.
164
25
 
165
- Local opt-in (same official kernel) is [Β§2](#2-paseo-adaptations). Operator
166
- steps: [runbook](docs/operations/official-kernel-compat-runbook.md).
26
+ It is not a second Antigravity implementation and does not redistribute
27
+ Google's proprietary kernel. The npm package contains only this Apache-2.0
28
+ proxy; you install and authenticate the official kernel separately.
167
29
 
168
- Tool quality, image generation, and provider 503/quota text are owned by the
169
- official kernel and Google's backend. This product **proxies** that surface.
30
+ > Community maintained. Not official Paseo support and not official Google
31
+ > support.
170
32
 
171
- ---
33
+ <!-- readme:value -->
34
+ ## Why paseo-agy-acp
172
35
 
173
- ## 2. Paseo adaptations
36
+ ACP provides the protocol. A production Paseo provider still needs product
37
+ behavior around that protocol:
174
38
 
175
- These are the **Paseo-side** layers on top of the official kernel β€” the reason
176
- this repository exists.
177
-
178
- | # | Adaptation | What it does |
39
+ | Need | Direct generic ACP connection | `paseo-agy-acp` |
179
40
  |---|---|---|
180
- | 1 | Product identity | `initialize` `agentInfo` is overlaid as `agy-acp` / `paseo-agy-acp` so Paseo sees a stable product name. |
181
- | 2 | Daemon context bridge | When `PASEO_AGENT_ID` is set, Paseo daemon `appendSystemPrompt` is injected into official `session/prompt`, so workspace/agent context reaches Antigravity. |
182
- | 3 | Session mode mapping | Paseo / legacy ids map onto official live modes: `accept-edits` β†’ `auto_edit`, `dangerously-skip-permissions` β†’ `yolo`, `plan` β†’ `default`. |
183
- | 4 | MCP `http` β†’ `sse` | Paseo often hands MCP servers as `type: "http"` plus a header map. The official kernel wants `sse` and `{name,value}` header arrays. The proxy rewrites that on `session/new`. |
184
- | 5 | Admission fence | When Admission is enabled, each official `session/prompt` takes a durable account-wide seat **before** the kernel write; the seat is released when the turn finishes, fails, or is cancelled. |
185
- | 6 | Blank-turn guard | Official `end_turn` with **no** visible assistant/tool output is returned as a JSON-RPC error (`-32000`) instead of an empty successful turn. |
186
- | 7 | Isolated Admission ledger | Official-kernel queue state lives under `$AGY_ACP_STATE_DIR/official-kernel`, separate from any historical ledger. |
187
- | 8 | Single kernel | `PASEO_AGY_ACP_KERNEL=legacy` and `--legacy-kernel` fail closed. Official is the only ACP execution path. |
188
- | 9 | Local model compatibility (opt-in) | Same official kernel: local unpack + request transforms so entitled Claude 4.6 and GPT-OSS 120B can complete turns. Off until you opt in. |
189
-
190
- `PASEO_HOME` is optional and falls back to `~/.paseo` when unset or empty.
191
- Paseo typically provides `PASEO_AGENT_ID` (and `PASEO_AGENT_CWD`) to ACP
192
- provider processes.
193
-
194
- ### Local opt-in: Claude 4.6 and GPT-OSS 120B
195
-
196
- **2.2 still uses the same official ACP kernel.** It only adds this layer.
197
- If you do not opt in, the official path supports Gemini-family models only.
198
-
199
- Opt-in is **local** and **explicit**:
200
-
201
- 1. Pin the official RC01 artifacts already on the machine (hash-checked; mismatch fail-closes).
202
- 2. Unpack them **only on this host**. npm and git do **not** ship Google's `.par` or runfiles.
203
- 3. Load `paseo_model_compat.py`: keep models that are both in the live CCPA catalog **and** in the local profile; transform tool JSON Schema (`$schema`, `parameters`), pair tool-call ids, apply GPT-OSS generation config. Gemini and unknown ids stay identity (no extra transform).
204
- 4. `prepare` β†’ `verify` β†’ lifecycle `activate`, then set `PASEO_AGY_ACP_OFFICIAL_BIN` to the **stable** wrapper (`agy-acp-kernel-compat-active` / `status.stableWrapperPath`). Do not point production at the per-release smoke wrapper.
205
-
206
- Commands: `agy-acp-prepare-official-kernel-compat` (or
207
- `node ./scripts/prepare-official-kernel-compat.mjs`). Exact flags, JSON keys,
208
- and rollback: [runbook](docs/operations/official-kernel-compat-runbook.md).
209
-
210
- Maintainer-host checks with live entitlement: `claude-sonnet-4-6`,
211
- `claude-opus-4-6-thinking`, `gpt-oss-120b-medium` β€” text, sequential tools,
212
- warm resume. Your account must still list those ids in raw CCPA.
213
-
214
- Live Paseo turns on that host after local opt-in (Yolo). Same official kernel;
215
- npm still does **not** ship Google's `.par`.
216
-
217
- **Claude Opus 4.6 (Thinking)** β€” hello turn, 5s:
218
-
219
- ![Paseo composer: Claude Opus 4.6 Thinking, Yolo, completed hello turn](docs/evidence/evidence-claude-opus-46-thinking.png)
220
-
221
- **GPT-OSS 120B (Medium)** β€” hello turn, 4s:
222
-
223
- ![Paseo composer: GPT-OSS 120B Medium, Yolo, completed turn](docs/evidence/evidence-gpt-oss-120b-medium.png)
224
-
225
- Please test Claude and GPT-OSS on your machine (one agent and several). If a
226
- model is missing, a turn fails, or tools misbehave,
227
- [open an Issue](https://github.com/tiezbro/paseo-agy-acp/issues). We will use
228
- that to prioritize fixes.
229
-
230
- ---
231
-
232
- ## 3. Why the Admission queue exists
233
-
234
- ### Background
235
-
236
- Paseo is a **main controller**. It routinely **delegates many Antigravity
237
- agents at once**. Under that burst, neighboring high concurrency used to
238
- strand turns: empty assistant bubbles, hangs, or ACP **Internal Error
239
- `-32603`**. The historical **3+1** fence (3 shared active seats, 1 concurrent
240
- start, 2s start interval) was a bleed-stop for that failure mode β€” not a
241
- measured official ACP maximum.
242
-
243
- On the official kernel we production-tested **8 shared seats / 8 concurrent
244
- starts / 2s interval**, including a 10-agent Antigravity dispatch that did not
245
- reproduce the old hang. Isolated stress on `127.0.0.1:6768` (6 concurrent yolo
246
- agents) also did not reproduce it. Official ACP is still **not** proven
247
- unlimited. **8 is a tested default, not a published product ceiling.**
248
-
249
- ### Principle
250
-
251
- ```text
252
- Paseo main controller
253
- delegates many Antigravity agents
254
- |
255
- v
256
- account-wide durable Admission queue
257
- |
258
- shared active seats (default 8)
259
- paced concurrent starts (default 8, β‰₯ 2s apart)
260
- |
261
- official session/prompt write
262
- |
263
- seat released on turn end / failure / cancel
264
- ```
265
-
266
- Extra turns **wait in the queue** instead of all hitting `agy_acp_server` at
267
- once. The queue is oldest-eligible with agent fairness, durable across
268
- connector processes, and fail-closed on bad env (non-integers, values `< 1`,
269
- start interval `< 2000ms`). Independent Paseo agents that share one state
270
- directory share one account pool β€” they cannot multiply concurrency by
271
- accident.
272
-
273
- ### Advantage
274
-
275
- The point is **not** to permanently cap Paseo at 3 agents. The point is to
276
- keep **Paseo β†’ Antigravity delegation steadier**:
277
-
278
- - The main controller can still dispatch a burst.
279
- - Surplus work queues instead of stampeding the official kernel.
280
- - Seats are account-wide across connector processes and restarts.
281
- - Queue timeout, cancel, and kernel errors remain distinguishable from a crash.
282
- - Operators can raise seat/start integers (**β‰₯ 1**) to probe higher
283
- concurrency and report what they find.
284
-
285
- That is why Admission stays in the product after the official-kernel switch.
286
-
287
- ---
288
-
289
- ## Admission Controller v2
290
-
291
- Admission is the operational implementation of the queue above: durable seats,
292
- paced starts, recovery, and typed terminals. It is **opt-in** via env
293
- (`AGY_ACP_ADMISSION_ENABLED=true` plus an absolute `AGY_ACP_STATE_DIR` and a
294
- valid `PASEO_AGENT_ID`). Recommended for any Paseo host that delegates more
295
- than one Antigravity agent.
296
-
297
- ### Enabling Admission
298
-
299
- Create one owner-only state directory per Antigravity account and run the
300
- packaged preflight:
301
-
302
- ```bash
303
- export AGY_ACP_STATE_DIR="$HOME/.local/state/paseo-agy-acp/account-name"
304
- install -d -m 700 "$AGY_ACP_STATE_DIR"
305
- agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
306
- export AGY_ACP_ADMISSION_ENABLED=true
307
- ```
308
-
309
- The preflight creates a missing directory with mode `0700` and verifies type,
310
- owner, and exact mode. It **rejects** an existing permissive directory instead
311
- of silently chmod-ing it. After you confirm path and ownership, run
312
- `chmod 700 -- "$AGY_ACP_STATE_DIR"` and rerun the preflight. Admission key and
313
- SQLite files are created with mode `0600`.
314
-
315
- Official-kernel queue files are written under
316
- `$AGY_ACP_STATE_DIR/official-kernel` so they cannot share a ledger with a
317
- historical install.
318
-
319
- ### Default and conservative policy
320
-
321
- | Rule | Default | Override |
322
- |---|---:|---|
323
- | Shared active seats | **8** (tested) | `AGY_ACP_ADMISSION_MAX_ACTIVE_TURNS` β€” integer **β‰₯ 1** |
324
- | Concurrent starts | **8** (tested) | `AGY_ACP_ADMISSION_MAX_CONCURRENT_STARTS` β€” integer **β‰₯ 1** |
325
- | Minimum start interval | **2000 ms** | `AGY_ACP_ADMISSION_MIN_START_INTERVAL_MS` β€” integer **β‰₯ 2000** |
326
- | Queue timeout | 30 minutes | `AGY_ACP_ADMISSION_QUEUE_TIMEOUT_MS` β€” integer `1`–`1800000` |
327
- | Capacity cooldown | 30 seconds | `AGY_ACP_ADMISSION_CAPACITY_COOLDOWN_MS` β€” integer **β‰₯ 30000** |
328
-
329
- Every local connector using the same state directory shares those account
330
- seats across sessions and models. Requests are selected oldest-eligible with
331
- agent fairness. A trusted provider-capacity failure pauses only the affected
332
- provider/model. Queue timeout cancels the request and deletes its encrypted
333
- prompt in the same transaction.
334
-
335
- Overrides are fail-closed: non-integers, values `< 1`, and start intervals
336
- below 2000 ms refuse to start. This repo does **not** publish a product
337
- maximum; raise the integers to probe, and please report results.
338
-
339
- Optional tighter fence (historical 3+1), **not** the recommended default:
340
-
341
- ```bash
342
- AGY_ACP_ADMISSION_MAX_ACTIVE_TURNS=3
343
- AGY_ACP_ADMISSION_MAX_CONCURRENT_STARTS=1
344
- ```
345
-
346
- Soft drain can reduce seats without killing in-flight work or dropping the
347
- queue.
348
-
349
- ### Durability, dispatch, and recovery
350
-
351
- The local implementation uses `shared-admission-queue` **schema v3**. Durable
352
- policy (`policy_state` / `policy_fingerprint`), queued owner instances, leases
353
- with suspect metadata for the runtime reaper, and `schema_migrations` live in
354
- one SQLite ledger. Unexpected delivery-authority tables still fail closed.
355
-
356
- Each enabled runtime opener claims or verifies that durable policy before
357
- startup recovery. A second connector on the same directory with a **different**
358
- policy fails closed rather than splitting policy per process.
359
-
360
- Idle sessions consume no seat and keep no resident turn process. An admitted
361
- turn uses a fenced one-shot `session/prompt` write; unprovable writes become
362
- `dispatch_ambiguous` or `recovery_required` instead of a silent replay.
363
- Heartbeat, owner identity, and the runtime reaper release capacity only when
364
- an owner is proven dead. Closing a session cancels queued work; an already
365
- running turn follows the connector cancel path (`session/cancel`).
366
-
367
- Admission does **not** add a second live-output path, outbox, ACK protocol,
368
- terminal replay, or manual requeue API. Official session history remains an
369
- ACP Connector / kernel responsibility.
370
-
371
- ### Design authority and implementation boundary
372
-
373
- Current authority is the confirmed Scheme plus accepted Stage 2 artifacts
374
- (see [Authority documents](#authority-documents-v2000-closeout) below). The
375
- legacy admission design file is historical input only.
376
-
377
- The repository has exactly two source areas:
41
+ | Official execution chain | Can start an ACP server | Keeps OAuth, models, tools, MCP, and inference in Google's official kernel |
42
+ | Paseo context | No product-specific guarantee | Injects Paseo daemon and workspace/agent context into official prompts |
43
+ | Modes and MCP | Client and kernel shapes may differ | Maps Paseo modes and rewrites MCP `http` declarations to the official `sse` shape |
44
+ | Multi-agent bursts | Prompts can reach the kernel together | Uses one durable, account-wide Admission queue across connector processes |
45
+ | Slash command discovery | Official command updates omit local skills | Adds user-invocable Gemini, Agents, Codex, configured, and workspace skills |
46
+ | Empty turns | An output-free `end_turn` can look successful | Returns an explicit JSON-RPC error instead of recording silent success |
47
+ | Additional entitled models | Official ACP defaults to the Gemini-family path | Offers an explicit local compatibility runbook for entitled Claude 4.6 and GPT-OSS 120B |
48
+ | Product identity | Follows the underlying server | Exposes stable `agy-acp` / `paseo-agy-acp` identity to Paseo |
49
+
50
+ ### Multi-agent stability
51
+
52
+ Paseo controllers can delegate several Antigravity agents at once. Admission
53
+ lets the controller dispatch that burst while excess turns wait instead of all
54
+ writing to `agy_acp_server` together. Seats are shared by every connector using
55
+ the same state directory and are released on turn completion, failure, or
56
+ cancel.
57
+
58
+ The tested default is **8 active turns / 8 concurrent starts / 2 seconds
59
+ minimum start spacing**. These are adjustable operating defaults, not a claimed
60
+ Google product limit. Invalid enabled configuration fails closed.
61
+
62
+ ### Skill discovery
63
+
64
+ The adapter merges native ACP commands with `SKILL.md` metadata from configured
65
+ and default Gemini, Agents, Codex, and workspace roots. Native commands win on
66
+ name collisions, workspace skills take precedence over global skills, and
67
+ `user-invocable: false` entries stay out of slash command hints. Discovery is
68
+ scoped by session cwd so concurrent workspaces cannot leak command metadata to
69
+ each other.
70
+
71
+ ### Model boundary
72
+
73
+ The unmodified official ACP path uses Gemini-family models as its default
74
+ working set. Accounts entitled to Claude 4.6 or GPT-OSS 120B can opt into the
75
+ local compatibility lifecycle documented in the
76
+ [official-kernel compatibility runbook](docs/operations/official-kernel-compat-runbook.md).
77
+ The same official kernel and Google backend remain responsible for inference;
78
+ this repository does not vendor or replace them.
79
+
80
+ <!-- readme:architecture -->
81
+ ## Architecture and ownership
378
82
 
379
83
  ```text
380
- paseo-agy-acp/
381
- |-- ACP Connector/ ACP NDJSON proxy, official kernel spawn, Paseo context
382
- `-- Admission Controller/ durable seats, queue, policy, paced starts, recovery
84
+ Paseo / Generic ACP client
85
+ -> paseo-agy-acp product adapter
86
+ identity | daemon context | mode map | MCP rewrite
87
+ skill hints | blank-turn guard | optional Admission fence
88
+ -> official agy_acp_server (ACP v1 over NDJSON)
89
+ OAuth | models | tools | MCP | inference
383
90
  ```
384
91
 
385
- `ACP Connector/` owns protocol, identity, mode/MCP rewrites, kernel spawn, and
386
- the Admission fence around `session/prompt`. `Admission Controller/` owns only
387
- the shared seat pool, durable queue, policy ledger, leases, reaper, and
388
- capacity cooldown. Package entrypoints stay inside `ACP Connector/`.
92
+ | Layer | Responsibility | License boundary |
93
+ |---|---|---|
94
+ | Paseo | Agent lifecycle, workspace, delegation, provider configuration | Paseo project |
95
+ | `paseo-agy-acp` | Paseo-specific ACP adaptation and Admission | Apache-2.0; published on npm |
96
+ | Official `agy_acp_server` | Authentication, model catalog, tools, MCP, and inference | Google proprietary software; local install only |
389
97
 
390
- ---
98
+ The adapter runs one official kernel child per connector process. Admission is
99
+ optional but recommended whenever one Antigravity account serves concurrent
100
+ Paseo agents.
391
101
 
102
+ <!-- readme:requirements -->
392
103
  ## Requirements
393
104
 
394
- - **Node.js >= 22**
395
- - **Official Antigravity ACP kernel** installed locally. Maintainer-host
396
- default pin:
105
+ - **Paseo** with Generic ACP provider support
106
+ - **Node.js 22 or newer**
107
+ - A locally installed official Antigravity ACP kernel wrapper or `.par`
108
+ - An Antigravity account able to complete official `oauth-personal`
109
+ - Linux filesystem ownership and mode support when Admission is enabled
397
110
 
398
- `~/.local/opt/agy-acp-server-agy_acp_server_20260818_01_RC01/agy-acp-server-canary`
111
+ Set `PASEO_AGY_ACP_OFFICIAL_BIN` unless the kernel already exists at the
112
+ maintainer-host default pin. If this variable points directly at a `.par`, the
113
+ adapter starts it from its own directory and supplies the required uid.
399
114
 
400
- Override with `PASEO_AGY_ACP_OFFICIAL_BIN`. If the path is the `.par` itself,
401
- the process `cd`s into that directory and execs with `--uid=` (required on
402
- hosts without a usable group, e.g. `nogroup`).
403
-
404
- - Completed official `authenticate` (`methodId=oauth-personal`). Tokens stay in
405
- the kernel's own state; this repo never prints them.
406
-
407
- ## Install
115
+ <!-- readme:quickstart -->
116
+ ## Quickstart
408
117
 
409
- `npx` installs and runs **this proxy**. It does not install Paseo or Google's
410
- kernel. Prefer npm over `git clone` for the adapter only.
118
+ ### 1. Point to the official kernel and authenticate
411
119
 
412
120
  ```bash
413
- # Official OAuth through the proxy (kernel must already be on this machine)
414
- npx -y paseo-agy-acp@2.3.0 --login
121
+ export PASEO_AGY_ACP_OFFICIAL_BIN="/absolute/path/to/agy-acp-server-wrapper-or.par"
122
+ npx -y paseo-agy-acp@2.3.1 --login
415
123
  ```
416
124
 
417
- Bins: `paseo-agy-acp` / `agy-acp` (ACP proxy), `agy-acp-prepare-state`,
418
- `agy-acp-prepare-official-kernel-compat`. First `npx` may compile
419
- `better-sqlite3` (needs a local C++ toolchain).
420
-
421
- Source checkout (development):
125
+ OAuth is completed by the official kernel. Its tokens remain in the kernel's
126
+ own state and are not printed by this adapter.
422
127
 
423
- ```bash
424
- git clone https://github.com/tiezbro/paseo-agy-acp.git
425
- cd paseo-agy-acp
426
- npm ci
427
- npm run build
428
- npm test
429
- ```
128
+ ### 2. Prepare Admission state
430
129
 
431
- ```bash
432
- # ACP initialize smoke (requires the official binary)
433
- printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1}}' \
434
- | npx -y paseo-agy-acp@2.3.0
435
- ```
436
-
437
- Login (official kernel OAuth):
130
+ Admission is optional for a single agent and recommended for multi-agent
131
+ delegation.
438
132
 
439
133
  ```bash
440
- npx -y paseo-agy-acp@2.3.0 --login
134
+ export AGY_ACP_STATE_DIR="$HOME/.local/state/paseo-agy-acp/account-name"
135
+ install -d -m 700 "$AGY_ACP_STATE_DIR"
136
+ npx -y --package=paseo-agy-acp@2.3.1 \
137
+ agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
441
138
  ```
442
139
 
443
- ## Environment
444
-
445
- | Variable | Purpose |
446
- |---|---|
447
- | `PASEO_AGY_ACP_OFFICIAL_BIN` | Official kernel wrapper or `.par` path |
448
- | `PASEO_AGENT_ID` | Enables daemon context + Admission agent binding |
449
- | `PASEO_HOME` | Optional Paseo home; falls back to `~/.paseo` |
450
- | `AGY_ACP_ADMISSION_ENABLED` | `true` / `1` to fence prompts through Admission |
451
- | `AGY_ACP_STATE_DIR` | Admission state directory (official runtime uses `official-kernel/` under it) |
452
- | `AGY_ACP_ADMISSION_MAX_ACTIVE_TURNS` | Shared active seats. Integer **β‰₯ 1**. Default **8** (tested). |
453
- | `AGY_ACP_ADMISSION_MAX_CONCURRENT_STARTS` | Concurrent starts. Integer **β‰₯ 1**. Default **8** (tested). |
454
- | `AGY_ACP_ADMISSION_MIN_START_INTERVAL_MS` | Minimum start spacing. Default **2000**; values below 2000 fail closed. |
455
- | `AGY_ACP_ADMISSION_QUEUE_TIMEOUT_MS` | Queue wait budget. Default 30 minutes; max 1800000. |
456
- | `AGY_ACP_ADMISSION_CAPACITY_COOLDOWN_MS` | Provider/model cooldown after a trusted capacity failure. Default 30000; minimum 30000. |
457
-
458
- `PASEO_AGY_ACP_KERNEL=legacy` and `--legacy-kernel` fail closed.
459
-
460
- ## Architecture
461
-
462
- ```text
463
- Paseo / Generic ACP client
464
- └─ paseo-agy-acp (agy-acp)
465
- β”œβ”€ product proxy: identity, daemon context, mode map, MCP rewrite
466
- β”œβ”€ Admission fence on session/prompt (optional, recommended)
467
- └─ official agy_acp_server (NDJSON)
468
- └─ Antigravity account, tools, MCP, models
469
- ```
140
+ Use one owner-only state directory per Antigravity account. The preflight
141
+ creates or validates the directory and refuses an existing permissive path.
470
142
 
471
- One official kernel child per connector process. Admission coordinates
472
- **account-wide** seats across those processes through the durable ledger.
143
+ ### 3. Configure the Paseo provider
473
144
 
474
- ## Paseo provider config
145
+ Add or update the provider in `$PASEO_HOME/config.json` or
146
+ `~/.paseo/config.json`:
475
147
 
476
148
  ```json
477
149
  {
478
150
  "providers": {
479
151
  "antigravity": {
480
152
  "type": "acp",
481
- "command": ["npx", "-y", "paseo-agy-acp@2.3.0"],
153
+ "command": ["npx", "-y", "paseo-agy-acp@2.3.1"],
482
154
  "env": {
483
- "PASEO_AGY_ACP_OFFICIAL_BIN": "/home/YOU/.local/opt/agy-acp-server-agy_acp_server_20260818_01_RC01/agy-acp-server-canary",
155
+ "PASEO_AGY_ACP_OFFICIAL_BIN": "/absolute/path/to/agy-acp-server-wrapper-or.par",
484
156
  "AGY_ACP_ADMISSION_ENABLED": "true",
485
157
  "AGY_ACP_STATE_DIR": "/home/YOU/.local/state/paseo-agy-acp/account-name"
486
158
  }
@@ -489,116 +161,103 @@ One official kernel child per connector process. Admission coordinates
489
161
  }
490
162
  ```
491
163
 
492
- `command` is how Paseo **spawns this proxy**. `PASEO_AGY_ACP_OFFICIAL_BIN` must
493
- point at a kernel already installed on the machine. When `command` is `node`,
494
- pass `["/path/to/paseo-agy-acp/dist/ACP Connector/main.js"]` as `args`.
495
- Paseo supplies `PASEO_AGENT_ID` to the provider process.
164
+ Paseo supplies `PASEO_AGENT_ID` and `PASEO_AGENT_CWD` to the provider process.
165
+ Omit the two Admission variables only when you intentionally want unfenced
166
+ single-agent operation.
496
167
 
497
- Restart the Paseo daemon after changing the provider so idle Antigravity
498
- agents pick up the new binary.
168
+ ### 4. Restart and verify
499
169
 
500
- ## Setup prompt
170
+ Restart the Paseo daemon, create an agent with provider `antigravity`, select a
171
+ supported mode, and send a simple prompt. `npx` starts a stdio ACP server for
172
+ Paseo; it is not a standalone chat application.
501
173
 
502
- Paste into any Paseo agent to install or repair the Antigravity provider:
174
+ <!-- readme:configuration -->
175
+ ## Configuration
503
176
 
504
- ~~~
505
- Configure the Paseo daemon to add an ACP provider for Google Antigravity.
177
+ ### Essential environment
506
178
 
507
- 1. Confirm a local official Antigravity ACP kernel is installed (this package does not vendor it).
508
- 2. Read Paseo config ($PASEO_HOME/config.json or ~/.paseo/config.json).
509
- 3. Add or update providers.antigravity:
510
- - type: "acp"
511
- - command: ["npx", "-y", "paseo-agy-acp@2.3.0"] (spawns the proxy, not the Google kernel)
512
- - env.PASEO_AGY_ACP_OFFICIAL_BIN: local official kernel wrapper (agy-acp-server-canary or agy_acp_server.par)
513
- - env.AGY_ACP_ADMISSION_ENABLED: "true"
514
- - env.AGY_ACP_STATE_DIR: absolute owner-only directory (mode 0700)
515
- 4. Prepare Admission state: npx -y --package=paseo-agy-acp@2.3.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
516
- 5. Login once: npx -y paseo-agy-acp@2.3.0 --login
517
- 6. Restart the Paseo daemon.
518
- 7. Verify: create a test agent with provider "antigravity", send a simple prompt.
519
- ~~~
179
+ | Variable | Purpose |
180
+ |---|---|
181
+ | `PASEO_AGY_ACP_OFFICIAL_BIN` | Absolute official kernel wrapper or `.par` path |
182
+ | `PASEO_HOME` | Optional Paseo home; defaults to `~/.paseo` |
183
+ | `AGY_ACP_ADMISSION_ENABLED` | `true` / `1` enables the prompt fence |
184
+ | `AGY_ACP_STATE_DIR` | Absolute owner-only state directory shared by one account |
520
185
 
521
- ## Verification
186
+ Advanced seat, start-rate, queue-timeout, cooldown, permission, recovery, and
187
+ policy-change procedures are in [Admission operations](docs/operations/admission.md).
522
188
 
523
- ```bash
524
- # Smoke test (needs the official binary)
525
- printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1}}' \
526
- | node 'dist/ACP Connector/main.js'
189
+ ### Mode mapping
527
190
 
528
- # Full suite
529
- npm test
530
- ```
531
-
532
- Canary checklist: daemon context on a real Paseo agent, multi-turn, MCP server
533
- declared as `http`, mode `dangerously-skip-permissions` β†’ official `yolo`,
534
- Admission queue under a small seat cap, blank-turn rejection.
535
-
536
- `2.1.0.0` isolated canary on `127.0.0.1:6768` proved the product proxy +
537
- official kernel + daemon context.
538
-
539
- ## Known issues
540
-
541
- - Please test Claude 4.6 and GPT-OSS 120B after opt-in and
542
- [file issues](https://github.com/tiezbro/paseo-agy-acp/issues) if anything is
543
- unstable. We will use that to prioritize fixes.
544
- - Official RC01 active cancel was not confirmed in our harness; live 503/quota
545
- was not induced against real backends.
546
- - The official kernel binary must already be installed; this package does not
547
- vendor it. `npx` only launches the proxy.
548
- - Admission is off until `AGY_ACP_ADMISSION_ENABLED`, `AGY_ACP_STATE_DIR`, and
549
- `PASEO_AGENT_ID` are all valid. Discovery/`--login` without an agent id does
550
- not open the ledger.
551
- - Official ACP has no plan mode; Paseo `plan` maps to `default`.
552
- - Image generation and live provider 503 text are owned by the official kernel.
553
- This adapter does not claim those have been re-verified here.
554
- - Raw-prompt tests can see prepended daemon context when `PASEO_AGENT_ID`
555
- points at a live Paseo agent:
191
+ | Paseo or legacy id | Official live mode |
192
+ |---|---|
193
+ | `default` | `default` |
194
+ | `accept-edits` | `auto_edit` |
195
+ | `dangerously-skip-permissions` | `yolo` |
196
+ | `plan` | `default` (the official kernel has no plan mode) |
197
+
198
+ `PASEO_AGY_ACP_KERNEL=legacy` and `--legacy-kernel` fail closed. The official
199
+ kernel is the only execution path.
200
+
201
+ ### Skill roots
202
+
203
+ Discovery reads configured roots from workspace `.agents/skills.json` or
204
+ `skills.json`, and from global `~/.gemini/config/skills.json`. Default roots
205
+ cover workspace Agents/Codex directories and global Gemini/Agents/Codex
206
+ directories. Each skill directory must contain `SKILL.md` frontmatter with a
207
+ usable name and description.
208
+
209
+ <!-- readme:operations -->
210
+ ## Operations and troubleshooting
211
+
212
+ - The official kernel must already be installed. `npx` installs only the proxy.
213
+ - The first npm run may compile `better-sqlite3` and require a local C++
214
+ toolchain.
215
+ - Restart Paseo after changing provider command, environment, or kernel path.
216
+ - Enabled Admission with missing identity, unsafe state permissions, or invalid
217
+ policy refuses to start instead of silently running unfenced.
218
+ - Tool quality, image generation, backend quota, and provider error text remain
219
+ owned by the official kernel and Google backend.
220
+ - For reproducible upgrades or rollback, pin a three-part npm version in the
221
+ provider command and restart Paseo.
222
+
223
+ Current operational references:
224
+
225
+ - [Admission operations](docs/operations/admission.md)
226
+ - [Claude / GPT-OSS local compatibility](docs/operations/official-kernel-compat-runbook.md)
227
+ - [npm Trusted Publishing](docs/operations/npm-publishing.md)
228
+ - [Changelog](CHANGELOG.md)
229
+ - [GitHub Releases](https://github.com/tiezbro/paseo-agy-acp/releases)
230
+ - [Issue tracker](https://github.com/tiezbro/paseo-agy-acp/issues)
231
+
232
+ Detailed implementation and research records remain under `docs/design/`,
233
+ `docs/evidence/`, and `docs/research/`; they are not release history or setup
234
+ instructions.
235
+
236
+ <!-- readme:development -->
237
+ ## Development
556
238
 
557
239
  ```bash
558
- env -u PASEO_AGENT_ID -u PASEO_HOME npm test
240
+ git clone https://github.com/tiezbro/paseo-agy-acp.git
241
+ cd paseo-agy-acp
242
+ npm ci
243
+ npm run validate
559
244
  ```
560
245
 
561
- ## Upgrade / Rollback
562
-
563
- If Paseo `command` uses npx, bump or pin the npm tag (for example
564
- `paseo-agy-acp@2.3.0`) and restart the daemon. That is the upgrade/rollback
565
- path for packaged installs.
566
-
567
- Source checkout:
246
+ An official-kernel smoke additionally requires
247
+ `PASEO_AGY_ACP_OFFICIAL_BIN`:
568
248
 
569
249
  ```bash
570
- # Upgrade
571
- git pull && npm ci && npm run build && npm test
572
-
573
- # Rollback
574
- git checkout <rev> && npm ci && npm run build && npm test
250
+ node scripts/official-kernel-smoke.mjs
575
251
  ```
576
252
 
577
- Restart the daemon after changing `command` or the kernel path. After an
578
- Admission policy change (for example 3+1 β†’ 8/8), use a **fresh**
579
- `AGY_ACP_STATE_DIR` if the durable fingerprint would fail-close the new policy.
580
-
581
- ## Authority documents (v2.0.0.0 closeout)
582
-
583
- - [confirmed Scheme](/home/tiezbro/projects/MAACS/docs/maacs-paseo-agy-acp-confirmed-scheme.md)
584
- - [Stage 2 handoff](docs/design/v2.0.0.0-stage2-handoff.md)
585
- - [503 feasibility](docs/design/v2.0.0.0-stage2-503-feasibility.md)
586
- - [ACP source map](docs/design/v2.0.0.0-stage2-acp-source-map.md)
587
- - [Admission source map](docs/design/v2.0.0.0-stage2-admission-source-map.md)
588
- - [Architecture](docs/design/v2.0.0.0-stage2-architecture.md)
589
- - [Domain model](docs/design/v2.0.0.0-stage2-domain-model.md)
590
- - [Test contracts](docs/design/v2.0.0.0-stage2-test-contracts.md)
591
- - [Specification](docs/design/v2.0.0.0-stage2-spec.md)
592
-
593
- β†’ [Local technical notes](./docs/PASEO_LOCAL_CHANGES.md)
594
-
595
- ## Disclaimer
596
-
597
- The official kernel is governed by
598
- [Google Antigravity Terms](https://antigravity.google/terms). This product
599
- spawns that kernel; it does not reimplement or redistribute it.
253
+ <!-- readme:license -->
254
+ ## License and disclaimer
600
255
 
601
- Third-party tools for Antigravity may violate those terms and risk account
602
- suspension. Prefer official API keys. Test/secondary accounts only.
256
+ The adapter source is [Apache-2.0](LICENSE). The official Antigravity kernel is
257
+ not included and remains governed by
258
+ [Google Antigravity Terms](https://antigravity.google/terms). This community
259
+ project spawns a kernel you installed locally; it does not reimplement,
260
+ relicense, or redistribute that software.
603
261
 
604
- **AS IS, NO WARRANTY. USE AT YOUR OWN RISK.**
262
+ Third-party use may carry account or service risk. Prefer authorized accounts
263
+ and official credentials. The software is provided as-is, without warranty.