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.zh-CN.md CHANGED
@@ -1,461 +1,144 @@
1
1
  <div align="center">
2
2
 
3
- # 🔌 paseo-agy-acp
3
+ # paseo-agy-acp
4
4
 
5
- **面向 Paseo 的适配器,跑在 Google 官方 Antigravity ACP 内核前面**
5
+ **Google 官方 Antigravity ACP 内核面向 Paseo 的可靠产品适配器**
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` 是面向 Paseo 的 Google Antigravity ACP 产品。从 **2.1.0.0** 起,
24
- 它以薄层 NDJSON 代理运行 Google 官方 Antigravity ACP 内核(`agy_acp_server` /
25
- Registry id `antigravity-acp`),再补上 Generic ACP 本身给不了的 Paseo 行为:
26
- daemon 上下文、session 模式映射、MCP 改写、产品身份,以及账户级 Admission
27
- 队列——让 Paseo 主控可以一次委派多个 Antigravity agent,而不把启动打成风暴。
28
-
29
- **2.2** 仍使用同一套官方 ACP 内核。它只增加一层明确的 **本机 opt-in**
30
- 兼容:有资格的 Claude 4.6 与 GPT-OSS 120B 可以在这条路径上跑完回合。
31
- 如果未 opt-in,官方路径默认只支持 Gemini 系模型。
32
-
33
- **2.3.0** 新增可由用户调用的 skill slash command 提示,支持 Gemini、Agents、
34
- Codex、用户配置和 workspace roots。原生 ACP 命令保持不变,workspace skills
35
- 按 session cwd 隔离,并发创建 session 时不会跨 workspace 混入命令提示。
36
-
37
- > **非 Paseo 官方支持。非 Google 官方支持。** 社区维护产品,使用风险自负。
38
-
39
- ## 30 秒摘要
40
-
41
- 如果你在 Paseo 里使用 Google Antigravity,`paseo-agy-acp` 给 Paseo 提供一条
42
- 接入 Google 官方 Antigravity ACP 内核的产品化路径。模型工作仍然由官方内核完成,
43
- 本仓库补上 Generic ACP 桥本身不提供的 Paseo 侧行为:
44
-
45
- - daemon 上下文注入
46
- - session 模式映射
47
- - MCP `http` 到官方 `sse` 的改写
48
- - 稳定产品身份
49
- - 面向 ACP slash command 提示的本地与 workspace skill discovery
50
- - 面向多 agent 委派的账户级 Admission 队列
51
- - 本机 opt-in 后可跑 Claude 4.6 与 GPT-OSS 120B;未 opt-in 则只支持 Gemini 系
52
-
53
- ## 适合谁
54
-
55
- 适合你,如果:
56
-
57
- - 你运行 Paseo
58
- - 你本机已经安装并登录 Google Antigravity
59
- - 你想通过 Generic ACP 使用 Antigravity
60
- - 你会一次委派多个 agent,希望启动突发被限速而不是同时砸到内核上
61
- - 你想在官方 ACP 内核上通过 Paseo 使用 Claude 4.6 或 GPT-OSS 120B(本机 opt-in)
62
-
63
- 可能不适合你,如果:
64
-
65
- - 你不使用 Paseo
66
- - 你想要一个独立的 Antigravity 替代品
67
- - 你期待这个包重新分发 Google 的专有内核
68
-
69
- ## 快速开始
70
-
71
- 前提:**Paseo**、**Node.js >= 22**,以及本机已安装的官方 Antigravity ACP 内核
72
- (本包装 **不会** 安装 Google 的 `.par`)。`--login` 完成官方 OAuth
73
- (`authenticate` / `oauth-personal`)。把 `PASEO_AGY_ACP_OFFICIAL_BIN` 指到你的
74
- 内核 wrapper 或 `.par`(除非已在维护者主机默认 pin 路径,否则必填)。
17
+ <!-- readme:positioning -->
18
+ ## 这个产品是什么
75
19
 
76
- npm 包 `paseo-agy-acp@2.3.0` 是 **代理**。`npx` 只拉起这个代理,**不能**代替
77
- Antigravity 或 Paseo。
20
+ `paseo-agy-acp` 是 Paseo 与 Google 官方 Antigravity ACP 内核之间的产品适配层。
21
+ 认证、模型、工具、MCP 和推理仍由官方内核负责;本适配器补齐 Paseo 多 agent
22
+ 可靠运行所需要的上下文、协议兼容、并发治理、skill discovery 和失败语义。
78
23
 
79
- ```bash
80
- export PASEO_AGY_ACP_OFFICIAL_BIN="/absolute/path/to/agy_acp_server.par-or-wrapper"
81
- npx -y paseo-agy-acp@2.3.0 --login
24
+ 它不是第二个 Antigravity 实现,也不重新分发 Google 的专有内核。npm 包只包含
25
+ 这个 Apache-2.0 代理;官方内核需要单独在本机安装和认证。
82
26
 
83
- export AGY_ACP_STATE_DIR="$HOME/.local/state/paseo-agy-acp/default"
84
- install -d -m 700 "$AGY_ACP_STATE_DIR"
85
- npx -y --package=paseo-agy-acp@2.3.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
86
- export AGY_ACP_ADMISSION_ENABLED=true
87
- ```
88
-
89
- 再把 Paseo Generic ACP 的 `command` 指到 npx(见
90
- [Paseo Provider 配置](#paseo-provider-配置))。下面这一行 **不是** 独立聊天程序,
91
- 而是 Paseo spawn 的 stdio ACP 服务:
92
-
93
- ```bash
94
- npx -y paseo-agy-acp@2.3.0
95
- ```
27
+ > 社区维护项目。非 Paseo 官方支持,非 Google 官方支持。
96
28
 
97
- Claude / GPT-OSS 见 [§1](#1-官方-agy-acp-内核能力) 和
98
- [runbook](docs/operations/official-kernel-compat-runbook.md)。源码 checkout
99
- (`git clone` + `npm ci` + `npm run build`)见 [安装](#安装)。
29
+ <!-- readme:value -->
30
+ ## 为什么需要 paseo-agy-acp
100
31
 
101
- ## 关于
32
+ ACP 提供协议,但一条可用于生产的 Paseo provider 仍需要协议之外的产品行为:
102
33
 
103
- 本仓库是 **产品适配器**,不是第二个 Antigravity。模型工作由内核完成;本仓库
104
- 补上 Generic ACP 桥本身不提供的 Paseo 侧行为。
105
-
106
- | 亮点 | 为什么重要 |
107
- |---|---|
108
- | **官方 ACP 内核** | 原生 ACP / NDJSON。未 opt-in 时官方路径只支持 Gemini;本机 opt-in 后,有资格的 Claude 4.6 与 GPT-OSS 120B 可以跑完回合。 |
109
- | **Paseo 侧胶水** | daemon `appendSystemPrompt`、Paseo 已在用的 mode id、以及 MCP `http` server,都会改写成官方内核认识的形态,Generic ACP agent 不用再写一层适配。仍须安装 Paseo、官方内核,并把 `command` 指到本代理。 |
110
- | **突发委派更稳健** | 账户级持久 Admission 队列给 `session/prompt` 限速,Paseo 主控可以一次派出很多 Antigravity agent,不会让每个 turn 同时砸到内核上。 |
111
- | **生产实测默认值** | 默认 **8 个共享席位 / 8 路同时启动 / 2 秒间隔**,来自真实 Paseo 派发(含 10 agent 突发)和隔离压测。整数 **≥ 1** 可以继续试更高并发;本仓库 **不编** 一个产品上限。 |
112
- | **失败即关闭** | 非法环境变量、policy 分叉、无法证明的写入一律 fail closed。排队超时、取消、内核错误仍然能区分。 |
113
- | **空白回合守卫** | 官方 `end_turn` 且没有任何可见助手/工具输出时,改成 JSON-RPC 错误,避免 Paseo 记成静默成功。 |
114
- | **许可证分层清楚** | 本仓库保持 **Apache-2.0**。官方内核是专有软件:只 **spawn** 你本机已安装的二进制;npm **不** 附带约 1.5GiB 的 `.par`。 |
115
-
116
- ```text
117
- Paseo Generic ACP (NDJSON)
118
- → paseo-agy-acp 产品代理
119
- 身份 · daemon 上下文 · 模式映射 · MCP 改写 · Admission 围栏
120
- → 官方 agy_acp_server (NDJSON)
121
- ```
122
-
123
- | 层 | 许可证 | 我们怎么做 |
34
+ | 需求 | 直接连接 Generic ACP | 使用 `paseo-agy-acp` |
124
35
  |---|---|---|
125
- | **本仓库**(代理、Admission、Paseo 上下文) | **Apache-2.0** | **保持 Apache-2.0,不改开源协议。** |
126
- | **官方 ACP 内核**(`agy_acp_server.par` / `antigravity-acp`) | **专有软件** | 只 spawn 本机内核,不分发。 |
127
- | **ACP 协议 / `@agentclientprotocol/sdk`** | 独立的 Apache-2.0 生态 | 官方 NDJSON 代理运行时不依赖它。 |
128
-
129
- ---
130
-
131
- ## 1. 官方 `agy-acp` 内核能力
132
-
133
- 本产品 **不重新实现** Antigravity。它拉起 Google 原生 ACP 服务器,转发 Agent
134
- Client Protocol NDJSON。下表是**官方内核**通过该协议提供的能力。
135
-
136
- | 范围 | 官方内核提供什么 |
137
- |---|---|
138
- | 协议 | 原生 **ACP v1 / NDJSON** |
139
- | 鉴权 | `authenticate`,`methodId=oauth-personal`(内核内 OAuth) |
140
- | 会话生命周期 | `initialize`、`session/new`、`session/prompt`、`session/cancel`、`session/set_mode`、`session/set_config_option` |
141
- | 流式输出 | `session/update`:助手文本、思考、工具调用 / 工具更新 |
142
- | 在线 session 模式 | `default`、`auto_edit`、`yolo`(官方 **没有** plan 模式) |
143
- | 工具 | 文件编辑、shell/终端等,以 Google 实现为准 |
144
- | MCP | 官方 MCP 客户端;在 `session/new` 上声明 server |
145
- | 模型 | 未 opt-in:只支持 Gemini 系。本机 opt-in:有资格的 Claude 4.6 与 GPT-OSS 120B([§2](#2-我们为-paseo-做了哪些适配))。 |
146
- | 回合结束 | 官方 `end_turn` / stop reason |
147
-
148
- ### 模型
149
-
150
- 未 opt-in 时,官方 ACP 路径**默认只支持 Gemini 系模型**。Antigravity IDE 里
151
- 有资格的账号已经能看到 Claude 4.6 与 GPT-OSS 120B;在这条 ACP 路径上,请求
152
- 仍按 Gemini 对齐(JSON Schema、工具 ID、GPT generation config),所以它们
153
- 不是默认可工作集合。
154
-
155
- 本机 opt-in(同一套官方内核)见 [§2](#2-我们为-paseo-做了哪些适配)。
156
- 操作步骤:[runbook](docs/operations/official-kernel-compat-runbook.md)。
157
-
158
- 工具质量、生图、供应商 503/配额文案,由官方内核和 Google 后端负责。
159
- 本产品只 **代理** 这层能力。
160
-
161
- ---
162
-
163
- ## 2. 我们为 Paseo 做了哪些适配
164
-
165
- 下面这些才是本仓库存在的理由:**Paseo 侧**加在官方内核之上的适配。
166
-
167
- | # | 适配 | 做什么 |
168
- |---|---|---|
169
- | 1 | 产品身份 | `initialize` 的 `agentInfo` 叠加为 `agy-acp` / `paseo-agy-acp`,Paseo 看到的是稳定产品名。 |
170
- | 2 | Daemon 上下文桥 | 设置了 `PASEO_AGENT_ID` 时,把 Paseo daemon 的 `appendSystemPrompt` 注入官方 `session/prompt`,工作区/agent 上下文才能到达 Antigravity。 |
171
- | 3 | Session 模式映射 | 把 Paseo / 旧 id 映射到官方在线模式:`accept-edits` → `auto_edit`,`dangerously-skip-permissions` → `yolo`,`plan` → `default`。 |
172
- | 4 | MCP `http` → `sse` | Paseo 常给出 `type: "http"` 加 header 对象;官方内核要 `sse` 和 `{name,value}` 数组。代理在 `session/new` 上改写。 |
173
- | 5 | Admission 围栏 | 启用 Admission 时,官方 `session/prompt` **写入前**先占账户级持久席位,回合结束/失败/取消再释放。 |
174
- | 6 | 空白回合守卫 | 官方 `end_turn` 且 **没有任何** 可见助手/工具输出时,改成 JSON-RPC 错误(`-32000`),避免 Paseo 当成空成功回合。 |
175
- | 7 | 隔离 Admission 账本 | 官方内核队列状态在 `$AGY_ACP_STATE_DIR/official-kernel`,不与历史账本混用。 |
176
- | 8 | 单一内核 | `PASEO_AGY_ACP_KERNEL=legacy` 和 `--legacy-kernel` 直接失败。官方内核是唯一 ACP 执行路径。 |
177
- | 9 | 本机模型兼容(opt-in) | 同一套官方内核:本机解开 + 请求转换,让有资格的 Claude 4.6 与 GPT-OSS 120B 跑完回合。未 opt-in 则关闭。 |
178
-
179
- `PASEO_HOME` 可选;未设置或为空时回退到 `~/.paseo`。Paseo 通常会给 ACP
180
- provider 进程提供 `PASEO_AGENT_ID`(以及 `PASEO_AGENT_CWD`)。
181
-
182
- ### 本机 opt-in:Claude 4.6 与 GPT-OSS 120B
183
-
184
- **2.2 仍使用同一套官方 ACP 内核。** 它只增加这一层。如果未 opt-in,
185
- 官方路径默认只支持 Gemini 系模型。
186
-
187
- opt-in 是 **本机、显式** 的:
188
-
189
- 1. 对本机已安装的官方 RC01 构件做 pin(hash 校验;不匹配则 fail closed)。
190
- 2. **只在本机**解开。npm 和 git **不**分发 Google 的 `.par` 或 runfiles。
191
- 3. 加载 `paseo_model_compat.py`:只保留同时出现在 live CCPA 目录 **和** 本地
192
- profile 里的模型;转换工具 JSON Schema(`$schema`、`parameters`)、配对
193
- 工具 ID、处理 GPT-OSS generation config。Gemini 与未知 id 走 identity,
194
- 不加变换。
195
- 4. `prepare` → `verify` → lifecycle `activate`,再把
196
- `PASEO_AGY_ACP_OFFICIAL_BIN` 指到 **stable** wrapper
197
- (`agy-acp-kernel-compat-active` / `status.stableWrapperPath`)。不要把
198
- 生产指到 per-release 冒烟 wrapper。
199
-
200
- 命令:`agy-acp-prepare-official-kernel-compat`(或
201
- `node ./scripts/prepare-official-kernel-compat.mjs`)。完整参数、JSON 字段和
202
- 回滚见 [runbook](docs/operations/official-kernel-compat-runbook.md)。
203
-
204
- 维护者主机在具备 raw CCPA 资格时核验过:`claude-sonnet-4-6`、
205
- `claude-opus-4-6-thinking`、`gpt-oss-120b-medium` —— 文本、顺序工具、warm
206
- resume。你的账号仍须在 raw CCPA 目录里拥有这些 id。
207
-
208
- 本机 opt-in 之后,同一台主机上的 Paseo 活回合(Yolo)。仍是同一套官方内核;
209
- npm **不**分发 Google 的 `.par`。
210
-
211
- **Claude Opus 4.6 (Thinking)** — hello 回合,5s:
212
-
213
- ![Paseo composer:Claude Opus 4.6 Thinking,Yolo,hello 回合完成](docs/evidence/evidence-claude-opus-46-thinking.png)
214
-
215
- **GPT-OSS 120B (Medium)** — hello 回合,4s:
216
-
217
- ![Paseo composer:GPT-OSS 120B Medium,Yolo,回合完成](docs/evidence/evidence-gpt-oss-120b-medium.png)
218
-
219
- 请在自己的环境测试 Claude 与 GPT-OSS(单个 agent 和一次开多个)。模型缺失、
220
- 回合失败或工具异常,请 [开 Issue](https://github.com/tiezbro/paseo-agy-acp/issues)。
221
- 我们会按反馈做优化和修复。
222
-
223
- ---
224
-
225
- ## 3. 为什么需要 Admission 队列
226
-
227
- ### 背景
228
-
229
- Paseo 是 **主控**。它会 **一次委派很多个 Antigravity agent**。这种突发下,
230
- 高并发曾经把回合挂死:助手气泡一直空着、进程卡住,或 ACP **Internal Error
231
- `-32603`**。当时的 **3+1**(3 个共享席位、1 路同时启动、启动间隔 2 秒)是给
232
- 那种故障 **止血**用的,不是测出来的官方 ACP 上限。
233
-
234
- 换成官方内核后,生产环境实测默认 **8 个共享席位 / 8 路同时启动 / 2 秒间隔**,
235
- 包括一次 10 个 Antigravity agent 的派发,没有复现旧的挂死。隔离环境
236
- `127.0.0.1:6768` 上 6 路 yolo 压测同样没有复现。官方 ACP **仍未**被证明无限
237
- 并发。**8 是实测默认值,不是已经公布的产品上限。**
238
-
239
- ### 原理
240
-
241
- ```text
242
- Paseo 主控
243
- 一次委派多个 Antigravity agent
244
- |
245
- v
246
- 账户级持久 Admission 队列
247
- |
248
- 共享 active 席位(默认 8)
249
- 限速同时启动(默认 8,间隔 ≥ 2s)
250
- |
251
- 官方 session/prompt 写入
252
- |
253
- 回合结束 / 失败 / 取消后释放席位
254
- ```
255
-
256
- 多出来的 turn **在队列里等**,而不是一起打到 `agy_acp_server` 上。队列按最早
257
- 可调度者排队,并带 agent fairness,跨 connector 进程持久,非法环境变量失败
258
- 关闭(非整数、`< 1`、启动间隔 `< 2000ms`)。共用同一状态目录的多个 Paseo
259
- agent 共用一份账户席位池,不会各自再乘一倍并发。
260
-
261
- ### 优势
262
-
263
- 队列不是为了把 Paseo 永久锁在 8 个 agent。它是为了让 **Paseo 主控委派
264
- Antigravity 更稳健**:
265
-
266
- - 主控仍然可以一次派出一批;
267
- - 超出席位的工作排队,而不是把官方内核打满;
268
- - 席位是账户级的,跨进程、跨重启仍然一致;
269
- - 排队超时 / 取消 / 内核错误仍然能和崩溃区分开;
270
- - 可以把席位/启动整数调到 **≥ 1** 去试更高并发,测到结果欢迎反馈。
271
-
272
- 所以换成官方内核之后,Admission 仍然留在产品里。
273
-
274
- ---
275
-
276
- ## Admission Controller v2
277
-
278
- Admission 是上面这套队列的落地实现:持久席位、启动限速、故障恢复、typed
279
- terminal。通过环境变量 **显式启用**(`AGY_ACP_ADMISSION_ENABLED=true`,加上
280
- 绝对路径 `AGY_ACP_STATE_DIR` 和合法 `PASEO_AGENT_ID`)。只要 Paseo 会委派
281
- 不止一个 Antigravity agent,就建议打开。
282
-
283
- ### 启用 Admission
284
-
285
- 每个 Antigravity 账号准备一个 owner-only 状态目录,并跑随包发布的预检:
286
-
287
- ```bash
288
- export AGY_ACP_STATE_DIR="$HOME/.local/state/paseo-agy-acp/account-name"
289
- install -d -m 700 "$AGY_ACP_STATE_DIR"
290
- agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
291
- export AGY_ACP_ADMISSION_ENABLED=true
292
- ```
293
-
294
- 预检会以 `0700` 创建缺失目录,并核验类型、owner 和精确权限。已经存在的宽权限
295
- 目录会被 **拒绝**,不会静默改权。确认路径和归属后执行
296
- `chmod 700 -- "$AGY_ACP_STATE_DIR"`,再重新跑预检。Admission key 与 SQLite
297
- 文件以 `0600` 创建。
36
+ | 官方执行链 | 可以启动 ACP server | OAuth、模型、工具、MCP 和推理继续留在 Google 官方内核 |
37
+ | Paseo 上下文 | 没有产品级保证 | 将 Paseo daemon 与 workspace/agent context 注入官方 prompt |
38
+ | Modes 与 MCP | 客户端和内核数据形态可能不同 | 映射 Paseo modes,并把 MCP `http` 声明改写为官方 `sse` 形态 |
39
+ | 多 agent 突发 | 多个 prompt 可能同时打入内核 | 使用跨 connector 共享的账户级持久 Admission 队列 |
40
+ | Slash command discovery | 官方命令更新不包含本地 skills | 加入可由用户调用的 Gemini、Agents、Codex、配置和 workspace skills |
41
+ | 空白回合 | 无输出的 `end_turn` 可能看起来成功 | 返回明确 JSON-RPC 错误,避免记录静默成功 |
42
+ | 额外授权模型 | 官方 ACP 默认走 Gemini 系路径 | 为有资格的 Claude 4.6 与 GPT-OSS 120B 提供显式本机兼容 runbook |
43
+ | 产品身份 | 跟随底层 server | 向 Paseo 暴露稳定的 `agy-acp` / `paseo-agy-acp` 身份 |
298
44
 
299
- 官方内核队列写在 `$AGY_ACP_STATE_DIR/official-kernel` 下,不会和历史账本混用。
45
+ ### 多 agent 稳定性
300
46
 
301
- ### 默认与保守 policy
47
+ Paseo 主控可以一次委派多个 Antigravity agent。Admission 允许主控保留这种批量
48
+ 派发能力,同时让超额 turn 排队,而不是一起写入 `agy_acp_server`。使用同一状态
49
+ 目录的所有 connector 共享账户席位,回合完成、失败或取消后释放。
302
50
 
303
- | 规则 | 默认 | 覆盖 |
304
- |---|---:|---|
305
- | 共享 active 席位 | **8**(实测) | `AGY_ACP_ADMISSION_MAX_ACTIVE_TURNS`,整数 **≥ 1** |
306
- | 同时启动路数 | **8**(实测) | `AGY_ACP_ADMISSION_MAX_CONCURRENT_STARTS`,整数 **≥ 1** |
307
- | 最小启动间隔 | **2000 ms** | `AGY_ACP_ADMISSION_MIN_START_INTERVAL_MS`,整数 **≥ 2000** |
308
- | 最长排队时间 | 30 分钟 | `AGY_ACP_ADMISSION_QUEUE_TIMEOUT_MS`,整数 `1`–`1800000` |
309
- | 容量 cooldown | 30 秒 | `AGY_ACP_ADMISSION_CAPACITY_COOLDOWN_MS`,整数 **≥ 30000** |
51
+ 实测默认策略是 **8 个 active turns / 8 路同时启动 / 最少 2 秒启动间隔**。
52
+ 这些是可调整的运行默认值,不是对 Google 产品上限的声明。启用后的非法配置会
53
+ fail closed。
310
54
 
311
- 使用同一状态目录的所有本地 connector、session 和模型共享这些账号席位。队列按
312
- oldest-eligible 调度并带 agent fairness。可信的 provider 容量故障只暂停受影响
313
- 的 provider/model。排队超时会在同一事务中取消请求并删除加密 prompt。
55
+ ### Skill discovery
314
56
 
315
- 覆盖值失败即关闭:非整数、`< 1`、启动间隔低于 2000 ms 都不会启动。本仓库
316
- **不公布**产品上限;把整数调大去试,测到结果欢迎反馈。
57
+ 适配器将原生 ACP 命令与配置目录及默认 Gemini、Agents、Codex、workspace roots
58
+ 中的 `SKILL.md` 元数据合并。同名时原生命令优先,workspace skills 优先于全局
59
+ skills,`user-invocable: false` 不会出现在 slash command 提示中。Discovery 按
60
+ session cwd 隔离,并发 workspace 不会互相泄漏命令元数据。
317
61
 
318
- 更紧的历史 3+1(可选,**不是**推荐默认):
62
+ ### 模型边界
319
63
 
320
- ```bash
321
- AGY_ACP_ADMISSION_MAX_ACTIVE_TURNS=3
322
- AGY_ACP_ADMISSION_MAX_CONCURRENT_STARTS=1
323
- ```
324
-
325
- soft drain 可以降低席位,而不杀死进行中的工作、不丢弃排队请求。
326
-
327
- ### 持久化、dispatch 与恢复
328
-
329
- 本地实现使用 `shared-admission-queue` **schema v3**。持久 policy
330
- (`policy_state` / `policy_fingerprint`)、queued owner、带 suspect metadata 的
331
- lease(给 runtime reaper 用)以及 `schema_migrations` 都在同一份 SQLite 账本里。
332
- 额外的 delivery-authority 表仍然 fail closed。
333
-
334
- 每个启用 Admission 的 runtime opener 都会在 startup recovery 前 claim 或核验
335
- 这份持久 policy。第二个 connector 对同一目录使用 **不同** policy 时直接失败
336
- 关闭,不会形成只存在于进程内的 policy 分叉。
337
-
338
- 空闲 session 不占席位,也不保留常驻 turn 进程。获得席位的 turn 走一次 fenced
339
- 的 `session/prompt` 写入;无法证明的写入进入 `dispatch_ambiguous` 或
340
- `recovery_required`,绝不静默重放。Heartbeat、owner 身份和 runtime reaper 只
341
- 在 owner 被证实退出时回收容量。关闭 session 会取消尚未开始的排队请求;已经
342
- 运行的 turn 走 connector 取消路径(`session/cancel`)。
343
-
344
- Admission **不会**再做第二套 live 输出、outbox、ACK、terminal replay 或手工
345
- requeue API。官方 session 历史仍由 ACP Connector / 内核负责。
346
-
347
- ### 设计 authority 与实现边界
64
+ 未修改的官方 ACP 路径默认以 Gemini 系模型为工作集合。已获得 Claude 4.6 或
65
+ GPT-OSS 120B 资格的账号,可以按
66
+ [官方内核兼容 runbook](docs/operations/official-kernel-compat-runbook.md)
67
+ 显式启用本机兼容生命周期。推理仍由同一套官方内核和 Google backend 负责;本仓库
68
+ 不打包也不替换它们。
348
69
 
349
- 当前 authority 是 confirmed Scheme 与已接受的 Stage 2 artifacts(见下方
350
- [权威文档](#权威文档v2000-closeout))。旧 Admission design 文件只作为
351
- historical input。
352
-
353
- 仓库严格只有两个源码功能区:
70
+ <!-- readme:architecture -->
71
+ ## 架构与职责
354
72
 
355
73
  ```text
356
- paseo-agy-acp/
357
- |-- ACP Connector/ ACP NDJSON 代理、官方内核 spawn、Paseo 上下文
358
- `-- Admission Controller/ 持久席位、队列、策略、启动间隔、恢复
74
+ Paseo / Generic ACP client
75
+ -> paseo-agy-acp 产品适配器
76
+ 身份 | daemon context | mode map | MCP rewrite
77
+ skill hints | blank-turn guard | 可选 Admission fence
78
+ -> 官方 agy_acp_server(ACP v1 over NDJSON)
79
+ OAuth | 模型 | 工具 | MCP | 推理
359
80
  ```
360
81
 
361
- `ACP Connector/` 负责协议、身份、模式/MCP 改写、内核 spawn,以及围在
362
- `session/prompt` 上的 Admission。`Admission Controller/` 只负责共享席位池、
363
- 持久队列、策略账本、lease、reaper 和 capacity cooldown。package 入口仍在
364
- `ACP Connector/` 内。
82
+ | 层 | 职责 | 许可证边界 |
83
+ |---|---|---|
84
+ | Paseo | Agent 生命周期、workspace、委派和 provider 配置 | Paseo 项目 |
85
+ | `paseo-agy-acp` | Paseo 专用 ACP 适配与 Admission | Apache-2.0;发布到 npm |
86
+ | 官方 `agy_acp_server` | 认证、模型目录、工具、MCP 和推理 | Google 专有软件;只在本机安装 |
365
87
 
366
- ---
88
+ 每个 connector 进程运行一个官方内核子进程。Admission 是可选项,但当一个
89
+ Antigravity 账号服务多个并发 Paseo agent 时建议启用。
367
90
 
91
+ <!-- readme:requirements -->
368
92
  ## 环境要求
369
93
 
370
- - **Node.js >= 22**
371
- - 本机已安装 **官方 Antigravity ACP 内核**。维护者主机默认 pin:
372
-
373
- `~/.local/opt/agy-acp-server-agy_acp_server_20260818_01_RC01/agy-acp-server-canary`
374
-
375
- 用 `PASEO_AGY_ACP_OFFICIAL_BIN` 覆盖。如果路径就是 `.par` 本身,进程会
376
- `cd` 到该目录并以 `--uid=` 启动(没有可用 group 的主机,例如 `nogroup`,
377
- 必须带 `--uid=`)。
94
+ - 支持 Generic ACP provider 的 **Paseo**
95
+ - **Node.js 22 或更新版本**
96
+ - 本机已安装的官方 Antigravity ACP kernel wrapper 或 `.par`
97
+ - 可以完成官方 `oauth-personal` 的 Antigravity 账号
98
+ - 启用 Admission 时,系统需支持 Linux 文件 owner 与 mode
378
99
 
379
- - 已完成官方 `authenticate`(`methodId=oauth-personal`)。令牌留在内核自己的
380
- 状态里,本仓库不会打印。
100
+ 除非官方内核已经位于维护者主机默认 pin 路径,否则必须设置
101
+ `PASEO_AGY_ACP_OFFICIAL_BIN`。若它直接指向 `.par`,适配器会从该文件所在目录
102
+ 启动并提供所需 uid。
381
103
 
382
- ## 安装
104
+ <!-- readme:quickstart -->
105
+ ## 快速开始
383
106
 
384
- `npx` 安装并运行 **本代理**。它不会安装 Paseo,也不会安装 Google 内核。适配器
385
- 请用 npm,不要默认 `git clone`。
107
+ ### 1. 指定官方内核并完成认证
386
108
 
387
109
  ```bash
388
- # 经代理做官方 OAuth(本机必须已有官方内核)
389
- npx -y paseo-agy-acp@2.3.0 --login
110
+ export PASEO_AGY_ACP_OFFICIAL_BIN="/absolute/path/to/agy-acp-server-wrapper-or.par"
111
+ npx -y paseo-agy-acp@2.3.1 --login
390
112
  ```
391
113
 
392
- 命令:`paseo-agy-acp` / `agy-acp`(ACP 代理)、`agy-acp-prepare-state`、
393
- `agy-acp-prepare-official-kernel-compat`。第一次 `npx` 可能要编译
394
- `better-sqlite3`(本机需要 C++ 工具链)。
114
+ OAuth 由官方内核完成。Token 保留在内核自己的状态中,本适配器不会打印。
395
115
 
396
- 源码 checkout(开发用):
116
+ ### 2. 准备 Admission 状态
397
117
 
398
- ```bash
399
- git clone https://github.com/tiezbro/paseo-agy-acp.git
400
- cd paseo-agy-acp
401
- npm ci
402
- npm run build
403
- npm test
404
- ```
118
+ 单 agent 可以不启用 Admission;多 agent 委派建议启用。
405
119
 
406
120
  ```bash
407
- # ACP initialize 冒烟(需要官方二进制)
408
- printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1}}' \
409
- | npx -y paseo-agy-acp@2.3.0
121
+ export AGY_ACP_STATE_DIR="$HOME/.local/state/paseo-agy-acp/account-name"
122
+ install -d -m 700 "$AGY_ACP_STATE_DIR"
123
+ npx -y --package=paseo-agy-acp@2.3.1 \
124
+ agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
410
125
  ```
411
126
 
412
- 登录(官方内核 OAuth):
127
+ 每个 Antigravity 账号使用一个 owner-only 状态目录。预检会创建或验证目录,并拒绝
128
+ 已经存在的宽权限路径。
413
129
 
414
- ```bash
415
- npx -y paseo-agy-acp@2.3.0 --login
416
- ```
417
-
418
- ## 环境变量
130
+ ### 3. 配置 Paseo provider
419
131
 
420
- | 变量 | 作用 |
421
- |---|---|
422
- | `PASEO_AGY_ACP_OFFICIAL_BIN` | 官方内核 wrapper 或 `.par` 路径 |
423
- | `PASEO_AGENT_ID` | 启用 daemon 上下文 + Admission agent 绑定 |
424
- | `PASEO_HOME` | 可选 Paseo home;缺省 `~/.paseo` |
425
- | `AGY_ACP_ADMISSION_ENABLED` | `true` / `1` 时把 prompt 围进 Admission |
426
- | `AGY_ACP_STATE_DIR` | Admission 状态目录(官方运行时用下面的 `official-kernel/`) |
427
- | `AGY_ACP_ADMISSION_MAX_ACTIVE_TURNS` | 共享 active 席位。整数 **≥ 1**。默认 **8**(实测)。 |
428
- | `AGY_ACP_ADMISSION_MAX_CONCURRENT_STARTS` | 同时启动路数。整数 **≥ 1**。默认 **8**(实测)。 |
429
- | `AGY_ACP_ADMISSION_MIN_START_INTERVAL_MS` | 最小启动间隔。默认 **2000**;低于 2000 失败关闭。 |
430
- | `AGY_ACP_ADMISSION_QUEUE_TIMEOUT_MS` | 最长排队。默认 30 分钟;上限 1800000。 |
431
- | `AGY_ACP_ADMISSION_CAPACITY_COOLDOWN_MS` | 可信容量故障后的 provider/model cooldown。默认 30000;最小 30000。 |
432
-
433
- `PASEO_AGY_ACP_KERNEL=legacy` 和 `--legacy-kernel` 失败关闭。
434
-
435
- ## 架构
436
-
437
- ```text
438
- Paseo / Generic ACP 客户端
439
- └─ paseo-agy-acp (agy-acp)
440
- ├─ 产品代理:身份、daemon 上下文、模式映射、MCP 改写
441
- ├─ session/prompt 上的 Admission 围栏(可选,建议打开)
442
- └─ 官方 agy_acp_server (NDJSON)
443
- └─ Antigravity 账号、工具、MCP、模型
444
- ```
445
-
446
- 每个 connector 进程一个官方内核子进程。Admission 通过持久账本协调这些进程之间的
447
- **账户级**席位。
448
-
449
- ## Paseo Provider 配置
132
+ 在 `$PASEO_HOME/config.json` 或 `~/.paseo/config.json` 中增加或更新 provider:
450
133
 
451
134
  ```json
452
135
  {
453
136
  "providers": {
454
137
  "antigravity": {
455
138
  "type": "acp",
456
- "command": ["npx", "-y", "paseo-agy-acp@2.3.0"],
139
+ "command": ["npx", "-y", "paseo-agy-acp@2.3.1"],
457
140
  "env": {
458
- "PASEO_AGY_ACP_OFFICIAL_BIN": "/home/YOU/.local/opt/agy-acp-server-agy_acp_server_20260818_01_RC01/agy-acp-server-canary",
141
+ "PASEO_AGY_ACP_OFFICIAL_BIN": "/absolute/path/to/agy-acp-server-wrapper-or.par",
459
142
  "AGY_ACP_ADMISSION_ENABLED": "true",
460
143
  "AGY_ACP_STATE_DIR": "/home/YOU/.local/state/paseo-agy-acp/account-name"
461
144
  }
@@ -464,109 +147,95 @@ Paseo / Generic ACP 客户端
464
147
  }
465
148
  ```
466
149
 
467
- `command` 是 Paseo **拉起本代理** 的方式。`PASEO_AGY_ACP_OFFICIAL_BIN` 必须指向
468
- 本机已安装的内核。`command` 为 `node` 时,`args` 传
469
- `["/path/to/paseo-agy-acp/dist/ACP Connector/main.js"]`。
470
- Paseo 会给 provider 进程提供 `PASEO_AGENT_ID`。
150
+ Paseo 会向 provider 进程提供 `PASEO_AGENT_ID` 和 `PASEO_AGENT_CWD`。只有在明确
151
+ 需要不受 Admission 约束的单 agent 运行时,才省略两个 Admission 变量。
471
152
 
472
- 改完 provider 后重启 Paseo daemon,空闲的 Antigravity agent 才会换到新二进制。
153
+ ### 4. 重启并验证
473
154
 
474
- ## 初始化 Prompt
155
+ 重启 Paseo daemon,创建 provider 为 `antigravity` 的 agent,选择受支持模式并
156
+ 发送一个简单 prompt。`npx` 启动的是 Paseo 使用的 stdio ACP server,不是独立
157
+ 聊天程序。
475
158
 
476
- 贴到任意 Paseo agent,用来安装或修复 Antigravity provider:
159
+ <!-- readme:configuration -->
160
+ ## 配置
477
161
 
478
- ~~~
479
- Configure the Paseo daemon to add an ACP provider for Google Antigravity.
162
+ ### 必要环境变量
480
163
 
481
- 1. Confirm a local official Antigravity ACP kernel is installed (this package does not vendor it).
482
- 2. Read Paseo config ($PASEO_HOME/config.json or ~/.paseo/config.json).
483
- 3. Add or update providers.antigravity:
484
- - type: "acp"
485
- - command: ["npx", "-y", "paseo-agy-acp@2.3.0"] (spawns the proxy, not the Google kernel)
486
- - env.PASEO_AGY_ACP_OFFICIAL_BIN: local official kernel wrapper (agy-acp-server-canary or agy_acp_server.par)
487
- - env.AGY_ACP_ADMISSION_ENABLED: "true"
488
- - env.AGY_ACP_STATE_DIR: absolute owner-only directory (mode 0700)
489
- 4. Prepare Admission state: npx -y --package=paseo-agy-acp@2.3.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
490
- 5. Login once: npx -y paseo-agy-acp@2.3.0 --login
491
- 6. Restart the Paseo daemon.
492
- 7. Verify: create a test agent with provider "antigravity", send a simple prompt.
493
- ~~~
164
+ | 变量 | 作用 |
165
+ |---|---|
166
+ | `PASEO_AGY_ACP_OFFICIAL_BIN` | 官方 kernel wrapper 或 `.par` 的绝对路径 |
167
+ | `PASEO_HOME` | 可选 Paseo home;默认 `~/.paseo` |
168
+ | `AGY_ACP_ADMISSION_ENABLED` | `true` / `1` 启用 prompt fence |
169
+ | `AGY_ACP_STATE_DIR` | 一个账号共享的 owner-only 绝对状态目录 |
494
170
 
495
- ## 验证
171
+ 高级席位、启动限速、排队超时、cooldown、权限、恢复和 policy 变更流程见
172
+ [Admission 运维](docs/operations/admission.md)。
496
173
 
497
- ```bash
498
- # 冒烟(需要官方二进制)
499
- printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1}}' \
500
- | node 'dist/ACP Connector/main.js'
174
+ ### Mode 映射
501
175
 
502
- # 完整测试
503
- npm test
504
- ```
176
+ | Paseo 或旧 id | 官方在线 mode |
177
+ |---|---|
178
+ | `default` | `default` |
179
+ | `accept-edits` | `auto_edit` |
180
+ | `dangerously-skip-permissions` | `yolo` |
181
+ | `plan` | `default`(官方内核没有 plan mode) |
505
182
 
506
- 金丝雀清单:真实 Paseo agent 上的 daemon 上下文、多回合、以 `http` 声明的 MCP
507
- server、模式 `dangerously-skip-permissions` → 官方 `yolo`、小席位下的 Admission
508
- 排队、空白回合拒绝。
183
+ `PASEO_AGY_ACP_KERNEL=legacy` 和 `--legacy-kernel` 会 fail closed。官方内核是唯一
184
+ 执行路径。
509
185
 
510
- `2.1.0.0` 在隔离环境 `127.0.0.1:6768` 上证明了产品代理 + 官方内核 + daemon
511
- 上下文。
186
+ ### Skill roots
512
187
 
513
- ## 已知问题
188
+ Discovery 从 workspace `.agents/skills.json` 或 `skills.json`,以及全局
189
+ `~/.gemini/config/skills.json` 读取配置目录。默认 roots 覆盖 workspace
190
+ Agents/Codex 目录和全局 Gemini/Agents/Codex 目录。每个 skill 目录需要包含带
191
+ 可用 name 与 description frontmatter 的 `SKILL.md`。
514
192
 
515
- - opt-in 之后请自行测试 Claude 4.6 与 GPT-OSS 120B,不稳定就
516
- [开 Issue](https://github.com/tiezbro/paseo-agy-acp/issues),我们据此优化和修复。
517
- - 官方 RC01 的 active cancel 在我们的 harness 里未确认;真实 503/配额未对
518
- 线上后端做诱导验证。
519
- - 官方内核二进制必须本机已安装;本包装不会随包分发它。`npx` 只拉起代理。
520
- - 在 `AGY_ACP_ADMISSION_ENABLED`、`AGY_ACP_STATE_DIR`、`PASEO_AGENT_ID` 都合法
521
- 之前,Admission 保持关闭。没有 agent id 的 discovery / `--login` 不会打开账本。
522
- - 官方 ACP 没有 plan 模式;Paseo 的 `plan` 映射到 `default`。
523
- - 生图和线上 503 文案由官方内核负责。本适配器 **不声称** 已在此重新验证这些能力。
524
- - 当 `PASEO_AGENT_ID` 指向正在运行的 Paseo agent 时,裸 prompt 测试可能看到
525
- 被前置的 daemon 上下文:
193
+ <!-- readme:operations -->
194
+ ## 运维与故障排查
526
195
 
527
- ```bash
528
- env -u PASEO_AGENT_ID -u PASEO_HOME npm test
529
- ```
196
+ - 官方内核必须已在本机安装;`npx` 只安装代理。
197
+ - npm 首次运行可能编译 `better-sqlite3`,需要本机 C++ 工具链。
198
+ - 修改 provider command、环境变量或内核路径后要重启 Paseo。
199
+ - 已启用 Admission 但 identity 缺失、状态权限不安全或 policy 非法时,系统拒绝启动,
200
+ 不会静默变成 unfenced 运行。
201
+ - 工具质量、生图、backend 配额与 provider 错误文案仍由官方内核和 Google backend
202
+ 负责。
203
+ - 可复现升级或回滚应在 provider command 中固定三段 npm 版本,然后重启 Paseo。
530
204
 
531
- ## 升级 / 回滚
205
+ 当前运维入口:
532
206
 
533
- 若 Paseo `command` 走 npx,改 npm 版本钉(例如 `paseo-agy-acp@2.3.0`)并重启
534
- daemon。这是打包安装的升级/回滚路径。
207
+ - [Admission 运维](docs/operations/admission.md)
208
+ - [Claude / GPT-OSS 本机兼容](docs/operations/official-kernel-compat-runbook.md)
209
+ - [npm Trusted Publishing](docs/operations/npm-publishing.md)
210
+ - [Changelog](CHANGELOG.md)
211
+ - [GitHub Releases](https://github.com/tiezbro/paseo-agy-acp/releases)
212
+ - [Issue tracker](https://github.com/tiezbro/paseo-agy-acp/issues)
535
213
 
536
- 源码 checkout:
214
+ 详细实现与研究记录保留在 `docs/design/`、`docs/evidence/` 和 `docs/research/`;它们
215
+ 不是发布历史或安装说明。
537
216
 
538
- ```bash
539
- # 升级
540
- git pull && npm ci && npm run build && npm test
217
+ <!-- readme:development -->
218
+ ## 开发
541
219
 
542
- # 回滚
543
- git checkout <rev> && npm ci && npm run build && npm test
220
+ ```bash
221
+ git clone https://github.com/tiezbro/paseo-agy-acp.git
222
+ cd paseo-agy-acp
223
+ npm ci
224
+ npm run validate
544
225
  ```
545
226
 
546
- 改 `command` 或内核路径后重启 daemon。Admission policy 变更(例如 3+1 → 8/8)
547
- 时,如果持久 fingerprint 会把新 policy 失败关闭,请换一个 **全新** 的
548
- `AGY_ACP_STATE_DIR`。
549
-
550
- ## 权威文档(v2.0.0.0 closeout)
227
+ 官方内核 smoke 还需要 `PASEO_AGY_ACP_OFFICIAL_BIN`:
551
228
 
552
- - [confirmed Scheme](/home/tiezbro/projects/MAACS/docs/maacs-paseo-agy-acp-confirmed-scheme.md)
553
- - [Stage 2 handoff](docs/design/v2.0.0.0-stage2-handoff.md)
554
- - [503 feasibility](docs/design/v2.0.0.0-stage2-503-feasibility.md)
555
- - [ACP source map](docs/design/v2.0.0.0-stage2-acp-source-map.md)
556
- - [Admission source map](docs/design/v2.0.0.0-stage2-admission-source-map.md)
557
- - [Architecture](docs/design/v2.0.0.0-stage2-architecture.md)
558
- - [Domain model](docs/design/v2.0.0.0-stage2-domain-model.md)
559
- - [Test contracts](docs/design/v2.0.0.0-stage2-test-contracts.md)
560
- - [Specification](docs/design/v2.0.0.0-stage2-spec.md)
561
-
562
- → [本地技术说明](./docs/PASEO_LOCAL_CHANGES.md)
563
-
564
- ## 免责声明
229
+ ```bash
230
+ node scripts/official-kernel-smoke.mjs
231
+ ```
565
232
 
566
- 官方内核受 [Google Antigravity 条款](https://antigravity.google/terms) 约束。
567
- 本产品只 spawn 该内核,不重新实现、不分发该二进制。
233
+ <!-- readme:license -->
234
+ ## 许可证与免责声明
568
235
 
569
- 面向 Antigravity 的第三方工具可能违反上述条款并导致账号风险。优先使用官方 API
570
- 密钥。建议只用测试/备用账号。
236
+ 适配器源码使用 [Apache-2.0](LICENSE)。官方 Antigravity 内核不包含在本项目中,
237
+ 并继续受 [Google Antigravity 条款](https://antigravity.google/terms) 约束。本社区
238
+ 项目只 spawn 你在本机安装的内核,不重新实现、不重新授权、不重新分发该软件。
571
239
 
572
- **按现状提供,无担保。使用风险自负。**
240
+ 第三方使用可能带来账号或服务风险。应使用经过授权的账号与官方凭据。本软件按现状
241
+ 提供,不作任何担保。