paseo-agy-acp 2.2.0 → 2.3.0

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/CHANGELOG.md CHANGED
@@ -2,6 +2,53 @@
2
2
 
3
3
  All notable changes to `paseo-agy-acp` are recorded here.
4
4
 
5
+ ## 2.3.0 - 2026-08-30
6
+
7
+ ### Added
8
+
9
+ - Discover user and workspace `SKILL.md` files from Gemini, Agents, Codex, and
10
+ configured skill roots, then expose user-invocable skills through standard
11
+ ACP slash command hints while preserving native commands.
12
+ - Add a tag-triggered npm Trusted Publishing workflow. A matching `vX.Y.Z` tag
13
+ on `main` now validates, packs, records, and publishes the public npm tarball
14
+ automatically with GitHub OIDC provenance and no long-lived npm token.
15
+
16
+ ### Changed
17
+
18
+ - Scope workspace skill discovery to each ACP session cwd, serialize concurrent
19
+ `session/new` setup, and prevent command hints from leaking between
20
+ workspaces.
21
+ - Hide skills marked `user-invocable: false`, preserve workspace-over-global
22
+ precedence, and parse common quoted and multiline frontmatter forms.
23
+
24
+ ### Verification
25
+
26
+ - Complete validation: 37 test files, 216 passed, 1 skipped; architecture and
27
+ secret checks passed.
28
+ - Official-kernel smoke and a live command-update canary preserved native
29
+ commands, exposed the visible workspace skill, and hid the non-invocable
30
+ skill.
31
+
32
+ ### Contributors
33
+
34
+ - Thanks to [@zwmmm](https://github.com/zwmmm) for the initial implementation
35
+ and review follow-up in [#9](https://github.com/tiezbro/paseo-agy-acp/pull/9).
36
+
37
+ ## 2.2.1 - 2026-08-29
38
+
39
+ ### Changed
40
+
41
+ - GitHub tags match npm 3-part semver from this release (`v2.2.1` =
42
+ `paseo-agy-acp@2.2.1`). Historical tag `v2.2.0.0` remains the 2.2.0 line.
43
+ - README (EN/ZH): `npx` launches this proxy only. Paseo, a locally installed
44
+ official kernel, and `PASEO_AGY_ACP_OFFICIAL_BIN` remain required. The npm
45
+ tarball now ships that copy.
46
+
47
+ ### Unchanged
48
+
49
+ - Same official ACP kernel, same local Claude/GPT-OSS opt-in, same Admission
50
+ defaults as 2.2.0.
51
+
5
52
  ## 2.2.0 - 2026-08-29
6
53
 
7
54
  ### Changed
package/README.md CHANGED
@@ -2,10 +2,11 @@
2
2
 
3
3
  # 🔌 paseo-agy-acp
4
4
 
5
- **Paseo × Antigravity official ACP kernel, Paseo-ready product adapter**
5
+ **Paseo adapter in front of 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.2.0-blue?style=flat-square)](./package.json)
8
+ [![Version](https://img.shields.io/badge/version-2.3.0-blue?style=flat-square)](./package.json)
9
+ [![npm](https://img.shields.io/npm/v/paseo-agy-acp?style=flat-square)](https://www.npmjs.com/package/paseo-agy-acp)
9
10
  [![Node](https://img.shields.io/badge/node-%3E%3D22-brightgreen?style=flat-square)](#)
10
11
  [![ACP](https://img.shields.io/badge/ACP-NDJSON%20v1-8A2BE2?style=flat-square)](https://agentclientprotocol.com)
11
12
 
@@ -27,11 +28,16 @@ mode mapping, MCP rewrite, product identity, and an account-wide Admission
27
28
  queue so the Paseo main controller can delegate many Antigravity agents without
28
29
  a startup stampede.
29
30
 
30
- **2.2.0** (GitHub tag `v2.2.0.0`) still uses the same official ACP kernel. It only adds an explicit
31
+ **2.2** still uses the same official ACP kernel. It only adds an explicit
31
32
  **local opt-in** compatibility layer: entitled Claude 4.6 and GPT-OSS 120B can
32
33
  complete turns on this path. If you do not opt in, the official path supports
33
34
  Gemini-family models only by default.
34
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
+
35
41
  > **Not official Paseo support. Not official Google support.**
36
42
  > Community-maintained product. Use at your own risk.
37
43
 
@@ -46,6 +52,7 @@ Generic ACP bridge does not provide:
46
52
  - session mode mapping
47
53
  - MCP `http` to official `sse` rewrite
48
54
  - stable product identity
55
+ - local and workspace skill discovery for ACP slash command hints
49
56
  - burst-safe account-wide Admission queue for multi-agent delegation
50
57
  - local opt-in for Claude 4.6 and GPT-OSS 120B; without it, Gemini-family only
51
58
 
@@ -67,41 +74,47 @@ This is probably not for you if:
67
74
 
68
75
  ## Quickstart
69
76
 
70
- Prerequisites: **Node.js >= 22** and a locally installed official Antigravity
71
- ACP kernel. The `--login` step below completes official OAuth (`authenticate` /
72
- `oauth-personal`). Set `PASEO_AGY_ACP_OFFICIAL_BIN` when your official kernel is
73
- not at the maintainer host's pinned default path.
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).
74
82
 
75
- The npm package is `paseo-agy-acp@2.2.0` (same product as GitHub `v2.2.0.0`;
76
- npm requires 3-part semver). It does **not** ship Google's `.par`.
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.
77
85
 
78
86
  ```bash
79
87
  export PASEO_AGY_ACP_OFFICIAL_BIN="/absolute/path/to/agy_acp_server.par-or-wrapper"
80
- npx -y paseo-agy-acp@2.2.0 --login
88
+ npx -y paseo-agy-acp@2.3.0 --login
81
89
 
82
90
  export AGY_ACP_STATE_DIR="$HOME/.local/state/paseo-agy-acp/default"
83
91
  install -d -m 700 "$AGY_ACP_STATE_DIR"
84
- npx -y --package=paseo-agy-acp@2.2.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
92
+ npx -y --package=paseo-agy-acp@2.3.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
85
93
  export AGY_ACP_ADMISSION_ENABLED=true
94
+ ```
86
95
 
87
- npx -y paseo-agy-acp@2.2.0
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
88
102
  ```
89
103
 
90
- Point Paseo's Generic ACP provider at `npx` (see [Paseo provider config](#paseo-provider-config)).
91
- Claude / GPT-OSS: see [§1](#1-official-agy-acp-kernel-capabilities) and the
104
+ Claude / GPT-OSS: [§1](#1-official-agy-acp-kernel-capabilities) and the
92
105
  [runbook](docs/operations/official-kernel-compat-runbook.md). Source checkout
93
- (`git clone` + `npm ci` + `npm run build`) remains available under
94
- [Install](#install).
106
+ (`git clone` + `npm ci` + `npm run build`) is under [Install](#install).
95
107
 
96
108
  ## About
97
109
 
98
110
  This repository is a **product adapter**, not a second Antigravity. The kernel
99
- does the model work; this repo makes that kernel **safe and complete for Paseo**.
111
+ does the model work; this repo adds the Paseo-side behavior a Generic ACP bridge
112
+ does not provide on its own.
100
113
 
101
114
  | Highlight | Why it matters |
102
115
  |---|---|
103
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. |
104
- | **Paseo-ready out of the box** | Daemon `appendSystemPrompt`, mode ids Paseo already sends, and MCP `http` servers are rewritten so Generic ACP agents can talk to Antigravity without extra glue. |
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. |
105
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. |
106
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. |
107
120
  | **Fail-closed operations** | Bad env, policy splits, and unprovable writes fail closed. Queue timeout, cancel, and kernel errors stay distinguishable. |
@@ -180,7 +193,7 @@ provider processes.
180
193
 
181
194
  ### Local opt-in: Claude 4.6 and GPT-OSS 120B
182
195
 
183
- **2.2.0 still uses the same official ACP kernel.** It only adds this layer.
196
+ **2.2 still uses the same official ACP kernel.** It only adds this layer.
184
197
  If you do not opt in, the official path supports Gemini-family models only.
185
198
 
186
199
  Opt-in is **local** and **explicit**:
@@ -198,6 +211,17 @@ Maintainer-host checks with live entitlement: `claude-sonnet-4-6`,
198
211
  `claude-opus-4-6-thinking`, `gpt-oss-120b-medium` — text, sequential tools,
199
212
  warm resume. Your account must still list those ids in raw CCPA.
200
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
+
201
225
  Please test Claude and GPT-OSS on your machine (one agent and several). If a
202
226
  model is missing, a turn fails, or tools misbehave,
203
227
  [open an Issue](https://github.com/tiezbro/paseo-agy-acp/issues). We will use
@@ -382,17 +406,19 @@ capacity cooldown. Package entrypoints stay inside `ACP Connector/`.
382
406
 
383
407
  ## Install
384
408
 
385
- Preferred (after this version is on npmjs):
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.
386
411
 
387
412
  ```bash
388
- npx -y paseo-agy-acp@2.2.0 --login
413
+ # Official OAuth through the proxy (kernel must already be on this machine)
414
+ npx -y paseo-agy-acp@2.3.0 --login
389
415
  ```
390
416
 
391
417
  Bins: `paseo-agy-acp` / `agy-acp` (ACP proxy), `agy-acp-prepare-state`,
392
418
  `agy-acp-prepare-official-kernel-compat`. First `npx` may compile
393
419
  `better-sqlite3` (needs a local C++ toolchain).
394
420
 
395
- Source checkout:
421
+ Source checkout (development):
396
422
 
397
423
  ```bash
398
424
  git clone https://github.com/tiezbro/paseo-agy-acp.git
@@ -405,13 +431,13 @@ npm test
405
431
  ```bash
406
432
  # ACP initialize smoke (requires the official binary)
407
433
  printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1}}' \
408
- | npx -y paseo-agy-acp@2.2.0
434
+ | npx -y paseo-agy-acp@2.3.0
409
435
  ```
410
436
 
411
437
  Login (official kernel OAuth):
412
438
 
413
439
  ```bash
414
- npx -y paseo-agy-acp@2.2.0 --login
440
+ npx -y paseo-agy-acp@2.3.0 --login
415
441
  ```
416
442
 
417
443
  ## Environment
@@ -452,7 +478,7 @@ One official kernel child per connector process. Admission coordinates
452
478
  "providers": {
453
479
  "antigravity": {
454
480
  "type": "acp",
455
- "command": ["npx", "-y", "paseo-agy-acp@2.2.0"],
481
+ "command": ["npx", "-y", "paseo-agy-acp@2.3.0"],
456
482
  "env": {
457
483
  "PASEO_AGY_ACP_OFFICIAL_BIN": "/home/YOU/.local/opt/agy-acp-server-agy_acp_server_20260818_01_RC01/agy-acp-server-canary",
458
484
  "AGY_ACP_ADMISSION_ENABLED": "true",
@@ -463,8 +489,9 @@ One official kernel child per connector process. Admission coordinates
463
489
  }
464
490
  ```
465
491
 
466
- When `command` is `node`, pass
467
- `["/path/to/paseo-agy-acp/dist/ACP Connector/main.js"]` as `args`.
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`.
468
495
  Paseo supplies `PASEO_AGENT_ID` to the provider process.
469
496
 
470
497
  Restart the Paseo daemon after changing the provider so idle Antigravity
@@ -477,17 +504,18 @@ Paste into any Paseo agent to install or repair the Antigravity provider:
477
504
  ~~~
478
505
  Configure the Paseo daemon to add an ACP provider for Google Antigravity.
479
506
 
480
- 1. Read Paseo config ($PASEO_HOME/config.json or ~/.paseo/config.json).
481
- 2. Add or update providers.antigravity:
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:
482
510
  - type: "acp"
483
- - command: ["npx", "-y", "paseo-agy-acp@2.2.0"]
511
+ - command: ["npx", "-y", "paseo-agy-acp@2.3.0"] (spawns the proxy, not the Google kernel)
484
512
  - env.PASEO_AGY_ACP_OFFICIAL_BIN: local official kernel wrapper (agy-acp-server-canary or agy_acp_server.par)
485
513
  - env.AGY_ACP_ADMISSION_ENABLED: "true"
486
514
  - env.AGY_ACP_STATE_DIR: absolute owner-only directory (mode 0700)
487
- 3. Prepare Admission state: npx -y --package=paseo-agy-acp@2.2.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
488
- 4. Login once: npx -y paseo-agy-acp@2.2.0 --login
489
- 5. Restart the Paseo daemon.
490
- 6. Verify: create a test agent with provider "antigravity", send a simple prompt.
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.
491
519
  ~~~
492
520
 
493
521
  ## Verification
@@ -516,7 +544,7 @@ official kernel + daemon context.
516
544
  - Official RC01 active cancel was not confirmed in our harness; live 503/quota
517
545
  was not induced against real backends.
518
546
  - The official kernel binary must already be installed; this package does not
519
- vendor it.
547
+ vendor it. `npx` only launches the proxy.
520
548
  - Admission is off until `AGY_ACP_ADMISSION_ENABLED`, `AGY_ACP_STATE_DIR`, and
521
549
  `PASEO_AGENT_ID` are all valid. Discovery/`--login` without an agent id does
522
550
  not open the ledger.
@@ -532,6 +560,12 @@ env -u PASEO_AGENT_ID -u PASEO_HOME npm test
532
560
 
533
561
  ## Upgrade / Rollback
534
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:
568
+
535
569
  ```bash
536
570
  # Upgrade
537
571
  git pull && npm ci && npm run build && npm test
@@ -540,10 +574,9 @@ git pull && npm ci && npm run build && npm test
540
574
  git checkout <rev> && npm ci && npm run build && npm test
541
575
  ```
542
576
 
543
- Point the daemon at the desired `agy-acp` binary or
544
- `dist/ACP Connector/main.js` entrypoint and restart. After an Admission policy
545
- change (for example 3+1 8/8), use a **fresh** `AGY_ACP_STATE_DIR` if the
546
- durable fingerprint would fail-close the new policy.
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.
547
580
 
548
581
  ## Authority documents (v2.0.0.0 closeout)
549
582
 
package/README.zh-CN.md CHANGED
@@ -2,10 +2,11 @@
2
2
 
3
3
  # 🔌 paseo-agy-acp
4
4
 
5
- **Paseo × Antigravity 官方 ACP 内核,面向 Paseo 的产品适配器**
5
+ **面向 Paseo 的适配器,跑在 Google 官方 Antigravity ACP 内核前面**
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.2.0-blue?style=flat-square)](./package.json)
8
+ [![Version](https://img.shields.io/badge/version-2.3.0-blue?style=flat-square)](./package.json)
9
+ [![npm](https://img.shields.io/npm/v/paseo-agy-acp?style=flat-square)](https://www.npmjs.com/package/paseo-agy-acp)
9
10
  [![Node](https://img.shields.io/badge/node-%3E%3D22-brightgreen?style=flat-square)](#)
10
11
  [![ACP](https://img.shields.io/badge/ACP-NDJSON%20v1-8A2BE2?style=flat-square)](https://agentclientprotocol.com)
11
12
 
@@ -25,10 +26,14 @@ Registry id `antigravity-acp`),再补上 Generic ACP 本身给不了的 Pase
25
26
  daemon 上下文、session 模式映射、MCP 改写、产品身份,以及账户级 Admission
26
27
  队列——让 Paseo 主控可以一次委派多个 Antigravity agent,而不把启动打成风暴。
27
28
 
28
- **2.2.0**(GitHub tag `v2.2.0.0`)仍使用同一套官方 ACP 内核。它只增加一层明确的 **本机 opt-in**
29
+ **2.2** 仍使用同一套官方 ACP 内核。它只增加一层明确的 **本机 opt-in**
29
30
  兼容:有资格的 Claude 4.6 与 GPT-OSS 120B 可以在这条路径上跑完回合。
30
31
  如果未 opt-in,官方路径默认只支持 Gemini 系模型。
31
32
 
33
+ **2.3.0** 新增可由用户调用的 skill slash command 提示,支持 Gemini、Agents、
34
+ Codex、用户配置和 workspace roots。原生 ACP 命令保持不变,workspace skills
35
+ 按 session cwd 隔离,并发创建 session 时不会跨 workspace 混入命令提示。
36
+
32
37
  > **非 Paseo 官方支持。非 Google 官方支持。** 社区维护产品,使用风险自负。
33
38
 
34
39
  ## 30 秒摘要
@@ -41,6 +46,7 @@ daemon 上下文、session 模式映射、MCP 改写、产品身份,以及账
41
46
  - session 模式映射
42
47
  - MCP `http` 到官方 `sse` 的改写
43
48
  - 稳定产品身份
49
+ - 面向 ACP slash command 提示的本地与 workspace skill discovery
44
50
  - 面向多 agent 委派的账户级 Admission 队列
45
51
  - 本机 opt-in 后可跑 Claude 4.6 与 GPT-OSS 120B;未 opt-in 则只支持 Gemini 系
46
52
 
@@ -62,39 +68,45 @@ daemon 上下文、session 模式映射、MCP 改写、产品身份,以及账
62
68
 
63
69
  ## 快速开始
64
70
 
65
- 前提:**Node.js >= 22**,并且本机已安装官方 Antigravity ACP 内核。下面的
66
- `--login` 步骤会完成官方 OAuth(`authenticate` / `oauth-personal`)。如果官方内核
67
- 不在维护者主机的默认 pin 路径,请设置 `PASEO_AGY_ACP_OFFICIAL_BIN`。
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 路径,否则必填)。
68
75
 
69
- npm 包是 `paseo-agy-acp@2.2.0`(与 GitHub `v2.2.0.0` 同一产品;npm 要求三段
70
- semver)。**不**分发 Google 的 `.par`。
76
+ npm `paseo-agy-acp@2.3.0` **代理**。`npx` 只拉起这个代理,**不能**代替
77
+ Antigravity Paseo。
71
78
 
72
79
  ```bash
73
80
  export PASEO_AGY_ACP_OFFICIAL_BIN="/absolute/path/to/agy_acp_server.par-or-wrapper"
74
- npx -y paseo-agy-acp@2.2.0 --login
81
+ npx -y paseo-agy-acp@2.3.0 --login
75
82
 
76
83
  export AGY_ACP_STATE_DIR="$HOME/.local/state/paseo-agy-acp/default"
77
84
  install -d -m 700 "$AGY_ACP_STATE_DIR"
78
- npx -y --package=paseo-agy-acp@2.2.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
85
+ npx -y --package=paseo-agy-acp@2.3.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
79
86
  export AGY_ACP_ADMISSION_ENABLED=true
87
+ ```
80
88
 
81
- npx -y paseo-agy-acp@2.2.0
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
82
95
  ```
83
96
 
84
- 把 Paseo Generic ACP provider 指到 `npx`(见 [Paseo Provider 配置](#paseo-provider-配置))。
85
97
  Claude / GPT-OSS 见 [§1](#1-官方-agy-acp-内核能力) 和
86
98
  [runbook](docs/operations/official-kernel-compat-runbook.md)。源码 checkout
87
- (`git clone` + `npm ci` + `npm run build`)仍在 [安装](#安装)。
99
+ (`git clone` + `npm ci` + `npm run build`)见 [安装](#安装)。
88
100
 
89
101
  ## 关于
90
102
 
91
103
  本仓库是 **产品适配器**,不是第二个 Antigravity。模型工作由内核完成;本仓库
92
- 让这套内核 **对 Paseo 可用、可并发、可运维**。
104
+ 补上 Generic ACP 桥本身不提供的 Paseo 侧行为。
93
105
 
94
106
  | 亮点 | 为什么重要 |
95
107
  |---|---|
96
108
  | **官方 ACP 内核** | 原生 ACP / NDJSON。未 opt-in 时官方路径只支持 Gemini;本机 opt-in 后,有资格的 Claude 4.6 与 GPT-OSS 120B 可以跑完回合。 |
97
- | **开箱即用的 Paseo 适配** | daemon `appendSystemPrompt`、Paseo 已在用的 mode id、以及 MCP `http` server,都会改写成官方内核认识的形态,Generic ACP agent 不用再贴一层胶水。 |
109
+ | **Paseo 侧胶水** | daemon `appendSystemPrompt`、Paseo 已在用的 mode id、以及 MCP `http` server,都会改写成官方内核认识的形态,Generic ACP agent 不用再写一层适配。仍须安装 Paseo、官方内核,并把 `command` 指到本代理。 |
98
110
  | **突发委派更稳健** | 账户级持久 Admission 队列给 `session/prompt` 限速,Paseo 主控可以一次派出很多 Antigravity agent,不会让每个 turn 同时砸到内核上。 |
99
111
  | **生产实测默认值** | 默认 **8 个共享席位 / 8 路同时启动 / 2 秒间隔**,来自真实 Paseo 派发(含 10 agent 突发)和隔离压测。整数 **≥ 1** 可以继续试更高并发;本仓库 **不编** 一个产品上限。 |
100
112
  | **失败即关闭** | 非法环境变量、policy 分叉、无法证明的写入一律 fail closed。排队超时、取消、内核错误仍然能区分。 |
@@ -169,7 +181,7 @@ provider 进程提供 `PASEO_AGENT_ID`(以及 `PASEO_AGENT_CWD`)。
169
181
 
170
182
  ### 本机 opt-in:Claude 4.6 与 GPT-OSS 120B
171
183
 
172
- **2.2.0 仍使用同一套官方 ACP 内核。** 它只增加这一层。如果未 opt-in,
184
+ **2.2 仍使用同一套官方 ACP 内核。** 它只增加这一层。如果未 opt-in,
173
185
  官方路径默认只支持 Gemini 系模型。
174
186
 
175
187
  opt-in 是 **本机、显式** 的:
@@ -193,6 +205,17 @@ opt-in 是 **本机、显式** 的:
193
205
  `claude-opus-4-6-thinking`、`gpt-oss-120b-medium` —— 文本、顺序工具、warm
194
206
  resume。你的账号仍须在 raw CCPA 目录里拥有这些 id。
195
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
+
196
219
  请在自己的环境测试 Claude 与 GPT-OSS(单个 agent 和一次开多个)。模型缺失、
197
220
  回合失败或工具异常,请 [开 Issue](https://github.com/tiezbro/paseo-agy-acp/issues)。
198
221
  我们会按反馈做优化和修复。
@@ -358,17 +381,19 @@ paseo-agy-acp/
358
381
 
359
382
  ## 安装
360
383
 
361
- 推荐(本版本上架 npmjs 之后):
384
+ `npx` 安装并运行 **本代理**。它不会安装 Paseo,也不会安装 Google 内核。适配器
385
+ 请用 npm,不要默认 `git clone`。
362
386
 
363
387
  ```bash
364
- npx -y paseo-agy-acp@2.2.0 --login
388
+ # 经代理做官方 OAuth(本机必须已有官方内核)
389
+ npx -y paseo-agy-acp@2.3.0 --login
365
390
  ```
366
391
 
367
392
  命令:`paseo-agy-acp` / `agy-acp`(ACP 代理)、`agy-acp-prepare-state`、
368
393
  `agy-acp-prepare-official-kernel-compat`。第一次 `npx` 可能要编译
369
394
  `better-sqlite3`(本机需要 C++ 工具链)。
370
395
 
371
- 源码 checkout
396
+ 源码 checkout(开发用):
372
397
 
373
398
  ```bash
374
399
  git clone https://github.com/tiezbro/paseo-agy-acp.git
@@ -381,13 +406,13 @@ npm test
381
406
  ```bash
382
407
  # ACP initialize 冒烟(需要官方二进制)
383
408
  printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1}}' \
384
- | npx -y paseo-agy-acp@2.2.0
409
+ | npx -y paseo-agy-acp@2.3.0
385
410
  ```
386
411
 
387
412
  登录(官方内核 OAuth):
388
413
 
389
414
  ```bash
390
- npx -y paseo-agy-acp@2.2.0 --login
415
+ npx -y paseo-agy-acp@2.3.0 --login
391
416
  ```
392
417
 
393
418
  ## 环境变量
@@ -428,7 +453,7 @@ Paseo / Generic ACP 客户端
428
453
  "providers": {
429
454
  "antigravity": {
430
455
  "type": "acp",
431
- "command": ["npx", "-y", "paseo-agy-acp@2.2.0"],
456
+ "command": ["npx", "-y", "paseo-agy-acp@2.3.0"],
432
457
  "env": {
433
458
  "PASEO_AGY_ACP_OFFICIAL_BIN": "/home/YOU/.local/opt/agy-acp-server-agy_acp_server_20260818_01_RC01/agy-acp-server-canary",
434
459
  "AGY_ACP_ADMISSION_ENABLED": "true",
@@ -439,7 +464,8 @@ Paseo / Generic ACP 客户端
439
464
  }
440
465
  ```
441
466
 
442
- `command` `node` 时,`args`
467
+ `command` Paseo **拉起本代理** 的方式。`PASEO_AGY_ACP_OFFICIAL_BIN` 必须指向
468
+ 本机已安装的内核。`command` 为 `node` 时,`args` 传
443
469
  `["/path/to/paseo-agy-acp/dist/ACP Connector/main.js"]`。
444
470
  Paseo 会给 provider 进程提供 `PASEO_AGENT_ID`。
445
471
 
@@ -452,17 +478,18 @@ Paseo 会给 provider 进程提供 `PASEO_AGENT_ID`。
452
478
  ~~~
453
479
  Configure the Paseo daemon to add an ACP provider for Google Antigravity.
454
480
 
455
- 1. Read Paseo config ($PASEO_HOME/config.json or ~/.paseo/config.json).
456
- 2. Add or update providers.antigravity:
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:
457
484
  - type: "acp"
458
- - command: ["npx", "-y", "paseo-agy-acp@2.2.0"]
485
+ - command: ["npx", "-y", "paseo-agy-acp@2.3.0"] (spawns the proxy, not the Google kernel)
459
486
  - env.PASEO_AGY_ACP_OFFICIAL_BIN: local official kernel wrapper (agy-acp-server-canary or agy_acp_server.par)
460
487
  - env.AGY_ACP_ADMISSION_ENABLED: "true"
461
488
  - env.AGY_ACP_STATE_DIR: absolute owner-only directory (mode 0700)
462
- 3. Prepare Admission state: npx -y --package=paseo-agy-acp@2.2.0 agy-acp-prepare-state "$AGY_ACP_STATE_DIR"
463
- 4. Login once: npx -y paseo-agy-acp@2.2.0 --login
464
- 5. Restart the Paseo daemon.
465
- 6. Verify: create a test agent with provider "antigravity", send a simple prompt.
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.
466
493
  ~~~
467
494
 
468
495
  ## 验证
@@ -489,7 +516,7 @@ server、模式 `dangerously-skip-permissions` → 官方 `yolo`、小席位下
489
516
  [开 Issue](https://github.com/tiezbro/paseo-agy-acp/issues),我们据此优化和修复。
490
517
  - 官方 RC01 的 active cancel 在我们的 harness 里未确认;真实 503/配额未对
491
518
  线上后端做诱导验证。
492
- - 官方内核二进制必须本机已安装;本包装不会随包分发它。
519
+ - 官方内核二进制必须本机已安装;本包装不会随包分发它。`npx` 只拉起代理。
493
520
  - 在 `AGY_ACP_ADMISSION_ENABLED`、`AGY_ACP_STATE_DIR`、`PASEO_AGENT_ID` 都合法
494
521
  之前,Admission 保持关闭。没有 agent id 的 discovery / `--login` 不会打开账本。
495
522
  - 官方 ACP 没有 plan 模式;Paseo 的 `plan` 映射到 `default`。
@@ -503,6 +530,11 @@ env -u PASEO_AGENT_ID -u PASEO_HOME npm test
503
530
 
504
531
  ## 升级 / 回滚
505
532
 
533
+ 若 Paseo `command` 走 npx,改 npm 版本钉(例如 `paseo-agy-acp@2.3.0`)并重启
534
+ daemon。这是打包安装的升级/回滚路径。
535
+
536
+ 源码 checkout:
537
+
506
538
  ```bash
507
539
  # 升级
508
540
  git pull && npm ci && npm run build && npm test
@@ -511,9 +543,9 @@ git pull && npm ci && npm run build && npm test
511
543
  git checkout <rev> && npm ci && npm run build && npm test
512
544
  ```
513
545
 
514
- daemon 指到目标 `agy-acp` 二进制或 `dist/ACP Connector/main.js` 入口后重启。
515
- Admission policy 变更(例如 3+1 8/8)时,如果持久 fingerprint 会把新 policy
516
- 失败关闭,请换一个 **全新** 的 `AGY_ACP_STATE_DIR`。
546
+ `command` 或内核路径后重启 daemon。Admission policy 变更(例如 3+1 8/8)
547
+ 时,如果持久 fingerprint 会把新 policy 失败关闭,请换一个 **全新**
548
+ `AGY_ACP_STATE_DIR`。
517
549
 
518
550
  ## 权威文档(v2.0.0.0 closeout)
519
551
 
@@ -1,3 +1,4 @@
1
1
  export declare function injectPaseoContext(params: unknown, environment?: NodeJS.ProcessEnv): Promise<unknown>;
2
2
  export declare function extractPromptText(params: unknown): string;
3
3
  export declare function extractSessionId(params: unknown): string | undefined;
4
+ export declare function extractCwd(params: unknown): string | undefined;
@@ -49,4 +49,11 @@ export function extractSessionId(params) {
49
49
  ? params.session_id
50
50
  : undefined;
51
51
  }
52
+ export function extractCwd(params) {
53
+ if (!isRecord(params))
54
+ return undefined;
55
+ return typeof params.cwd === "string" && params.cwd.trim().length > 0
56
+ ? params.cwd.trim()
57
+ : undefined;
58
+ }
52
59
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../ACP Connector/official-kernel/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,iCAAiC,EACjC,2BAA2B,EAC5B,MAAM,iCAAiC,CAAC;AAEzC,SAAS,gBAAgB,CAAC,MAAe,EAAE,IAAY;IACrD,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;IACrD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,IAAI,OAAO,MAAM,EAAE,CAAC;IAC9D,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAe,EACf,WAAW,GAAsB,OAAO,CAAC,GAAG;IAE5C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,iCAAiC,CAAC,WAAW,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,OAAO;QACL,GAAG,MAAM;QACT,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,MAAM,CAAC,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAChC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;QACtD,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACjG,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACzC,CAAC,CAAC,MAAM,CAAC,SAAS;QAClB,CAAC,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YACrC,CAAC,CAAC,MAAM,CAAC,UAAU;YACnB,CAAC,CAAC,SAAS,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../ACP Connector/official-kernel/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,iCAAiC,EACjC,2BAA2B,EAC5B,MAAM,iCAAiC,CAAC;AAEzC,SAAS,gBAAgB,CAAC,MAAe,EAAE,IAAY;IACrD,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;IACrD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,IAAI,OAAO,MAAM,EAAE,CAAC;IAC9D,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAe,EACf,WAAW,GAAsB,OAAO,CAAC,GAAG;IAE5C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,iCAAiC,CAAC,WAAW,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,OAAO;QACL,GAAG,MAAM;QACT,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,MAAM,CAAC,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAChC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;QACtD,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACjG,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACzC,CAAC,CAAC,MAAM,CAAC,SAAS;QAClB,CAAC,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YACrC,CAAC,CAAC,MAAM,CAAC,UAAU;YACnB,CAAC,CAAC,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAe;IACxC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACnE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;QACnB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
@@ -1,14 +1,17 @@
1
1
  import { TurnClaim } from "../acp/session/turn-scheduler.js";
2
2
  import { createOfficialAdmission, issueAdmittedOfficialPromptWrite } from "./admission-fence.js";
3
- import { extractPromptText, extractSessionId, injectPaseoContext } from "./context.js";
3
+ import { extractCwd, extractPromptText, extractSessionId, injectPaseoContext } from "./context.js";
4
4
  import { blankTurnError, sessionUpdateShowsVisibleOutput, shouldRejectBlankTurn } from "./errors.js";
5
5
  import { overlayProductIdentity } from "./identity.js";
6
6
  import { isJsonRpcFailure, isJsonRpcNotification, isJsonRpcRequest, isJsonRpcSuccess, jsonRpcError } from "./json-rpc.js";
7
7
  import { rewriteMcpServers } from "./mcp-rewrite.js";
8
8
  import { rewriteModeFields } from "./mode-map.js";
9
9
  import { createNdjsonParser, encodeNdjson } from "./ndjson.js";
10
+ import { augmentAvailableCommands } from "./skill-commands.js";
10
11
  const INITIALIZE_METHOD = "initialize";
11
12
  const SESSION_NEW_METHOD = "session/new";
13
+ const SESSION_LOAD_METHOD = "session/load";
14
+ const SESSION_RESUME_METHOD = "session/resume";
12
15
  const SESSION_PROMPT_METHOD = "session/prompt";
13
16
  const SESSION_SET_MODE_METHOD = "session/set_mode";
14
17
  const SESSION_SET_CONFIG_METHOD = "session/set_config_option";
@@ -21,8 +24,10 @@ export class OfficialKernelProxy {
21
24
  #version;
22
25
  #pending = new Map();
23
26
  #claims = new Map();
27
+ #sessionCwds = new Map();
24
28
  #env;
25
29
  #admission;
30
+ #sessionNewTail = Promise.resolve();
26
31
  #closed = false;
27
32
  constructor(options) {
28
33
  this.#child = options.child;
@@ -91,6 +96,16 @@ export class OfficialKernelProxy {
91
96
  let params = request.params;
92
97
  if (request.method === SESSION_NEW_METHOD) {
93
98
  params = rewriteMcpServers(rewriteModeFields(params));
99
+ await this.#forwardSessionNew(request, params);
100
+ return;
101
+ }
102
+ else if (request.method === SESSION_LOAD_METHOD ||
103
+ request.method === SESSION_RESUME_METHOD) {
104
+ const sessionId = extractSessionId(params);
105
+ const cwd = extractCwd(params);
106
+ if (sessionId && cwd) {
107
+ this.#sessionCwds.set(sessionId, cwd);
108
+ }
94
109
  }
95
110
  else if (request.method === SESSION_SET_MODE_METHOD || request.method === SESSION_SET_CONFIG_METHOD) {
96
111
  params = rewriteModeFields(params);
@@ -103,6 +118,23 @@ export class OfficialKernelProxy {
103
118
  this.#track(request.id, request.method, params);
104
119
  this.#writeChild({ ...request, jsonrpc: "2.0", params });
105
120
  }
121
+ // Early session updates have no request id, so keep only one unbound cwd in flight.
122
+ async #forwardSessionNew(request, params) {
123
+ const previous = this.#sessionNewTail;
124
+ let release;
125
+ this.#sessionNewTail = new Promise((resolve) => {
126
+ release = resolve;
127
+ });
128
+ await previous;
129
+ try {
130
+ const response = this.#track(request.id, request.method, params);
131
+ this.#writeChild({ ...request, jsonrpc: "2.0", params });
132
+ await response;
133
+ }
134
+ finally {
135
+ release();
136
+ }
137
+ }
106
138
  async #handlePrompt(request, params) {
107
139
  const sessionId = extractSessionId(params);
108
140
  const promptText = extractPromptText(params) || "prompt";
@@ -152,6 +184,7 @@ export class OfficialKernelProxy {
152
184
  this.#pending.set(id, {
153
185
  method,
154
186
  sessionId: extractSessionId(params),
187
+ cwd: extractCwd(params),
155
188
  sawVisibleOutput: false,
156
189
  resolve
157
190
  });
@@ -168,6 +201,30 @@ export class OfficialKernelProxy {
168
201
  }
169
202
  }
170
203
  }
204
+ const params = message.params;
205
+ if (params?.update?.sessionUpdate === "available_commands_update") {
206
+ let cwd = sessionId ? this.#sessionCwds.get(sessionId) : undefined;
207
+ if (!cwd) {
208
+ const pendingSessionNews = Array.from(this.#pending.values()).filter((pending) => pending.method === SESSION_NEW_METHOD && pending.cwd !== undefined);
209
+ if (pendingSessionNews.length === 1) {
210
+ cwd = pendingSessionNews[0].cwd;
211
+ if (sessionId) {
212
+ this.#sessionCwds.set(sessionId, cwd);
213
+ }
214
+ }
215
+ }
216
+ const augmented = augmentAvailableCommands(params.update.availableCommands, cwd);
217
+ message = {
218
+ ...message,
219
+ params: {
220
+ ...params,
221
+ update: {
222
+ ...params.update,
223
+ availableCommands: augmented
224
+ }
225
+ }
226
+ };
227
+ }
171
228
  this.#writeClient(message);
172
229
  return;
173
230
  }
@@ -182,6 +239,15 @@ export class OfficialKernelProxy {
182
239
  if (pending.method === INITIALIZE_METHOD && isJsonRpcSuccess(message)) {
183
240
  outbound = { ...message, result: overlayProductIdentity(message.result, this.#version) };
184
241
  }
242
+ else if ((pending.method === SESSION_NEW_METHOD ||
243
+ pending.method === SESSION_LOAD_METHOD ||
244
+ pending.method === SESSION_RESUME_METHOD) &&
245
+ isJsonRpcSuccess(message)) {
246
+ const sessionId = extractSessionId(message.result) ?? pending.sessionId;
247
+ if (sessionId && pending.cwd) {
248
+ this.#sessionCwds.set(sessionId, pending.cwd);
249
+ }
250
+ }
185
251
  else if (pending.method === SESSION_PROMPT_METHOD &&
186
252
  isJsonRpcSuccess(message) &&
187
253
  shouldRejectBlankTurn(message.result, pending.sawVisibleOutput)) {
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../ACP Connector/official-kernel/proxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../ACP Connector/official-kernel/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface AvailableCommand {
2
+ name: string;
3
+ description: string;
4
+ }
5
+ export declare function parseFrontmatter(content: string): {
6
+ name?: string;
7
+ description?: string;
8
+ userInvocable?: boolean;
9
+ };
10
+ export declare function resolveSkillRoots(cwd?: string): string[];
11
+ export declare function discoverSkillCommands(cwd?: string): AvailableCommand[];
12
+ export declare function augmentAvailableCommands(existingCommands: AvailableCommand[] | undefined, cwd?: string): AvailableCommand[];
@@ -0,0 +1,219 @@
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import path from "node:path";
4
+ function parseYamlScalar(raw) {
5
+ const trimmed = raw.trim();
6
+ if (trimmed.length === 0)
7
+ return "";
8
+ if (trimmed.startsWith('"') && trimmed.endsWith('"') && trimmed.length >= 2) {
9
+ try {
10
+ return JSON.parse(trimmed);
11
+ }
12
+ catch {
13
+ return trimmed
14
+ .slice(1, -1)
15
+ .replace(/\\"/g, '"')
16
+ .replace(/\\\\/g, "\\")
17
+ .replace(/\\n/g, "\n")
18
+ .replace(/\\r/g, "\r")
19
+ .replace(/\\t/g, "\t");
20
+ }
21
+ }
22
+ if (trimmed.startsWith("'") && trimmed.endsWith("'") && trimmed.length >= 2) {
23
+ return trimmed.slice(1, -1).replace(/''/g, "'");
24
+ }
25
+ const commentIdx = trimmed.search(/\s+#/);
26
+ const withoutComment = commentIdx !== -1 ? trimmed.slice(0, commentIdx).trim() : trimmed;
27
+ return withoutComment;
28
+ }
29
+ function parseYamlBoolean(raw, defaultValue = true) {
30
+ if (raw === undefined)
31
+ return defaultValue;
32
+ const scalar = parseYamlScalar(raw).toLowerCase();
33
+ if (scalar === "false" || scalar === "no" || scalar === "off" || scalar === "0") {
34
+ return false;
35
+ }
36
+ if (scalar === "true" || scalar === "yes" || scalar === "on" || scalar === "1") {
37
+ return true;
38
+ }
39
+ return defaultValue;
40
+ }
41
+ export function parseFrontmatter(content) {
42
+ if (!content.startsWith("---"))
43
+ return {};
44
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n(?:---|\.\.\.)(?:\r?\n|$)/);
45
+ if (!match)
46
+ return {};
47
+ const frontmatter = match[1];
48
+ const lines = frontmatter.split(/\r?\n/);
49
+ let name;
50
+ let description;
51
+ let userInvocable;
52
+ for (let i = 0; i < lines.length; i++) {
53
+ const line = lines[i];
54
+ const nameMatch = line.match(/^name:\s*(.*)$/);
55
+ if (nameMatch) {
56
+ name = parseYamlScalar(nameMatch[1]);
57
+ continue;
58
+ }
59
+ const invocableMatch = line.match(/^(?:user-invocable|user_invocable):\s*(.*)$/);
60
+ if (invocableMatch) {
61
+ userInvocable = parseYamlBoolean(invocableMatch[1], true);
62
+ continue;
63
+ }
64
+ const descMatch = line.match(/^description:\s*(.*)$/);
65
+ if (descMatch) {
66
+ const rest = descMatch[1].trim();
67
+ if (rest === ">" || rest === ">-" || rest === "|" || rest === "|-") {
68
+ const isFolded = rest.startsWith(">");
69
+ const blockLines = [];
70
+ for (let j = i + 1; j < lines.length; j++) {
71
+ if (/^\s+/.test(lines[j]) || lines[j].trim().length === 0) {
72
+ blockLines.push(lines[j].trim());
73
+ i = j;
74
+ }
75
+ else {
76
+ break;
77
+ }
78
+ }
79
+ if (isFolded) {
80
+ description = blockLines.filter((l) => l.length > 0).join(" ");
81
+ }
82
+ else {
83
+ description = blockLines.join("\n").trim();
84
+ }
85
+ }
86
+ else {
87
+ description = parseYamlScalar(rest);
88
+ }
89
+ continue;
90
+ }
91
+ }
92
+ return { name, description, userInvocable };
93
+ }
94
+ export function resolveSkillRoots(cwd) {
95
+ const roots = new Set();
96
+ const home = homedir();
97
+ const readSkillsJson = (filePath, baseDir) => {
98
+ if (!existsSync(filePath))
99
+ return;
100
+ try {
101
+ const parsed = JSON.parse(readFileSync(filePath, "utf-8"));
102
+ if (Array.isArray(parsed.entries)) {
103
+ for (const entry of parsed.entries) {
104
+ if (entry && typeof entry.path === "string" && entry.path.trim().length > 0) {
105
+ const trimmed = entry.path.trim();
106
+ let resolved;
107
+ if (trimmed.startsWith("/")) {
108
+ resolved = trimmed;
109
+ }
110
+ else if (trimmed.startsWith("~/")) {
111
+ resolved = path.join(home, trimmed.slice(2));
112
+ }
113
+ else {
114
+ resolved = path.resolve(baseDir, trimmed);
115
+ }
116
+ if (existsSync(resolved)) {
117
+ roots.add(resolved);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ }
123
+ catch {
124
+ // Ignore JSON parse errors
125
+ }
126
+ };
127
+ // 1. Workspace declared configs in skills.json
128
+ if (cwd && existsSync(cwd)) {
129
+ readSkillsJson(path.join(cwd, ".agents/skills.json"), cwd);
130
+ readSkillsJson(path.join(cwd, "skills.json"), cwd);
131
+ readSkillsJson(path.join(cwd, ".codex/skills.json"), cwd);
132
+ readSkillsJson(path.join(cwd, ".gemini/config/skills.json"), cwd);
133
+ }
134
+ // 2. Workspace default skill directories
135
+ if (cwd && existsSync(cwd)) {
136
+ const wsDefaults = [
137
+ path.join(cwd, ".agents/skills"),
138
+ path.join(cwd, ".codex/skills"),
139
+ path.join(cwd, "skills")
140
+ ];
141
+ for (const dir of wsDefaults) {
142
+ if (existsSync(dir))
143
+ roots.add(dir);
144
+ }
145
+ }
146
+ // 3. Global declared configs in skills.json
147
+ readSkillsJson(path.join(home, ".gemini/config/skills.json"), home);
148
+ readSkillsJson(path.join(home, ".agents/skills.json"), home);
149
+ readSkillsJson(path.join(home, ".codex/skills.json"), home);
150
+ // 4. Global default skill directories
151
+ const globalDefaults = [
152
+ path.join(home, ".gemini/config/skills"),
153
+ path.join(home, ".agents/skills"),
154
+ path.join(home, ".codex/skills")
155
+ ];
156
+ for (const dir of globalDefaults) {
157
+ if (existsSync(dir))
158
+ roots.add(dir);
159
+ }
160
+ return Array.from(roots);
161
+ }
162
+ export function discoverSkillCommands(cwd) {
163
+ const roots = resolveSkillRoots(cwd);
164
+ const commands = new Map();
165
+ for (const root of roots) {
166
+ try {
167
+ const entries = readdirSync(root, { withFileTypes: true });
168
+ for (const entry of entries) {
169
+ if (entry.isDirectory() || entry.isSymbolicLink()) {
170
+ const skillDir = path.join(root, entry.name);
171
+ const skillFile = path.join(skillDir, "SKILL.md");
172
+ if (existsSync(skillFile)) {
173
+ try {
174
+ const content = readFileSync(skillFile, "utf-8");
175
+ const { name, description, userInvocable } = parseFrontmatter(content);
176
+ if (userInvocable === false) {
177
+ continue;
178
+ }
179
+ const commandName = name && name.length > 0 ? name : entry.name;
180
+ if (!commands.has(commandName)) {
181
+ commands.set(commandName, {
182
+ name: commandName,
183
+ description: description && description.length > 0
184
+ ? description
185
+ : `Skill: ${commandName}`
186
+ });
187
+ }
188
+ }
189
+ catch {
190
+ // Ignore file read errors
191
+ }
192
+ }
193
+ }
194
+ }
195
+ }
196
+ catch {
197
+ // Ignore readdir errors
198
+ }
199
+ }
200
+ return Array.from(commands.values());
201
+ }
202
+ export function augmentAvailableCommands(existingCommands, cwd) {
203
+ const result = new Map();
204
+ if (Array.isArray(existingCommands)) {
205
+ for (const cmd of existingCommands) {
206
+ if (cmd && typeof cmd.name === "string") {
207
+ result.set(cmd.name, cmd);
208
+ }
209
+ }
210
+ }
211
+ const skills = discoverSkillCommands(cwd);
212
+ for (const skill of skills) {
213
+ if (!result.has(skill.name)) {
214
+ result.set(skill.name, skill);
215
+ }
216
+ }
217
+ return Array.from(result.values());
218
+ }
219
+ //# sourceMappingURL=skill-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-commands.js","sourceRoot":"","sources":["../../../ACP Connector/official-kernel/skill-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO;iBACX,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;iBACZ,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;iBACpB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;iBACtB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;iBACrB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;iBACrB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5E,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACzF,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAuB,EAAE,YAAY,GAAG,IAAI;IACpE,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QAChF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAK9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACjF,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,IAAwB,CAAC;IAC7B,IAAI,WAA+B,CAAC;IACpC,IAAI,aAAkC,CAAC;IAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC/C,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,SAAS;QACX,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjF,IAAI,cAAc,EAAE,CAAC;YACnB,aAAa,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACtD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACtC,MAAM,UAAU,GAAa,EAAE,CAAC;gBAChC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC1D,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;wBACjC,CAAC,GAAG,CAAC,CAAC;oBACR,CAAC;yBAAM,CAAC;wBACN,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,QAAQ,EAAE,CAAC;oBACb,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjE,CAAC;qBAAM,CAAC;oBACN,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC7C,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;YACD,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,OAAe,EAAQ,EAAE;QACjE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAExD,CAAC;YACF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnC,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;wBAClC,IAAI,QAAgB,CAAC;wBACrB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC5B,QAAQ,GAAG,OAAO,CAAC;wBACrB,CAAC;6BAAM,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;4BACpC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/C,CAAC;6BAAM,CAAC;4BACN,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBAC5C,CAAC;wBACD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACzB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBACtB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC,CAAC;IAEF,+CAA+C;IAC/C,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3D,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;QACnD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,4BAA4B,CAAC,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,yCAAyC;IACzC,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,UAAU,CAAC,GAAG,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,4BAA4B,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7D,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,IAAI,CAAC,CAAC;IAE5D,sCAAsC;IACtC,MAAM,cAAc,GAAG;QACrB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,uBAAuB,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;KACjC,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAChD,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAErD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;oBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBAClD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC1B,IAAI,CAAC;4BACH,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;4BACjD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;4BACvE,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;gCAC5B,SAAS;4BACX,CAAC;4BACD,MAAM,WAAW,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;4BAChE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gCAC/B,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE;oCACxB,IAAI,EAAE,WAAW;oCACjB,WAAW,EACT,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;wCACnC,CAAC,CAAC,WAAW;wCACb,CAAC,CAAC,UAAU,WAAW,EAAE;iCAC9B,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,0BAA0B;wBAC5B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,gBAAgD,EAChD,GAAY;IAEZ,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEnD,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AACrC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paseo-agy-acp",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Paseo product ACP adapter that proxies the official Google Antigravity ACP kernel (NDJSON) with Admission and daemon context",
5
5
  "type": "module",
6
6
  "author": {