agents-can-communicate 0.8.0 → 0.8.2

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.
Files changed (78) hide show
  1. package/bin/entrypoints/acc-mcp.mjs +0 -1
  2. package/bin/entrypoints/acc.mjs +0 -1
  3. package/docs/ADAPTER_AUTHORING.md +50 -17
  4. package/docs/ARCHITECTURE.md +9 -6
  5. package/docs/CAPABILITIES.md +24 -14
  6. package/docs/CLI.md +22 -3
  7. package/docs/CONFIGURATION.md +73 -8
  8. package/docs/GETTING_STARTED.md +6 -3
  9. package/docs/HOW_IT_WORKS.md +3 -1
  10. package/docs/PROTOCOL.md +2 -2
  11. package/docs/RELEASING.md +6 -4
  12. package/docs/SECURITY_MODEL.md +12 -1
  13. package/docs/TROUBLESHOOTING.md +34 -7
  14. package/docs/UPGRADING.md +29 -1
  15. package/node_modules/@agents-can-communicate/adapter-antigravity/package.json +1 -1
  16. package/node_modules/@agents-can-communicate/adapter-antigravity/plugin/plugin.json +1 -1
  17. package/node_modules/@agents-can-communicate/adapter-antigravity/plugin/skills/acc/SKILL.md +7 -0
  18. package/node_modules/@agents-can-communicate/adapter-antigravity/src/adapter.mjs +5 -4
  19. package/node_modules/@agents-can-communicate/adapter-antigravity/src/allow-rule.mjs +204 -0
  20. package/node_modules/@agents-can-communicate/adapter-antigravity/src/install.mjs +45 -10
  21. package/node_modules/@agents-can-communicate/adapter-claude-code/package.json +1 -1
  22. package/node_modules/@agents-can-communicate/adapter-claude-code/src/adapter.mjs +14 -4
  23. package/node_modules/@agents-can-communicate/adapter-claude-code/src/inbox-delivery.mjs +12 -17
  24. package/node_modules/@agents-can-communicate/adapter-claude-code/src/inbox-endpoint.mjs +5 -3
  25. package/node_modules/@agents-can-communicate/adapter-claude-code/src/inbox-observed-directories.mjs +62 -0
  26. package/node_modules/@agents-can-communicate/adapter-claude-code/src/inbox-socket-directories.mjs +41 -0
  27. package/node_modules/@agents-can-communicate/adapter-codex/package.json +1 -1
  28. package/node_modules/@agents-can-communicate/adapter-codex/src/adapter.mjs +6 -4
  29. package/node_modules/@agents-can-communicate/adapter-codex/src/app-server-client.mjs +10 -13
  30. package/node_modules/@agents-can-communicate/adapter-codex/src/install.mjs +5 -4
  31. package/node_modules/@agents-can-communicate/adapter-codex/src/live-permissions.mjs +69 -17
  32. package/node_modules/@agents-can-communicate/adapter-codex/src/maintenance-host.mjs +46 -10
  33. package/node_modules/@agents-can-communicate/adapter-codex/src/maintenance.mjs +5 -7
  34. package/node_modules/@agents-can-communicate/adapter-codex/src/native-delivery.mjs +16 -12
  35. package/node_modules/@agents-can-communicate/adapter-codex/src/native-endpoint.mjs +12 -2
  36. package/node_modules/@agents-can-communicate/adapter-codex/src/service-setup.mjs +26 -9
  37. package/node_modules/@agents-can-communicate/adapter-codex/src/ws-json-rpc.mjs +12 -0
  38. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/gemini-extension.json +1 -1
  39. package/node_modules/@agents-can-communicate/adapter-gemini-cli/package.json +1 -1
  40. package/node_modules/@agents-can-communicate/adapter-grok/package.json +1 -1
  41. package/node_modules/@agents-can-communicate/adapter-kimi/package.json +1 -1
  42. package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
  43. package/node_modules/@agents-can-communicate/adapter-sdk/src/capabilities.mjs +7 -0
  44. package/node_modules/@agents-can-communicate/adapter-sdk/src/certification.mjs +2 -2
  45. package/node_modules/@agents-can-communicate/adapter-sdk/src/hook-shim.mjs +16 -2
  46. package/node_modules/@agents-can-communicate/adapter-sdk/src/index.mjs +4 -3
  47. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-delivery.mjs +85 -77
  48. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-vocabulary.mjs +4 -4
  49. package/node_modules/@agents-can-communicate/cli/package.json +1 -1
  50. package/node_modules/@agents-can-communicate/cli/src/doctor-command.mjs +9 -4
  51. package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +11 -4
  52. package/node_modules/@agents-can-communicate/cli/src/main.mjs +49 -12
  53. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/maintenance.mjs +9 -15
  54. package/node_modules/@agents-can-communicate/cli/src/managed-runtime/pins.mjs +13 -4
  55. package/node_modules/@agents-can-communicate/cli/src/native-session-diagnostics.mjs +20 -10
  56. package/node_modules/@agents-can-communicate/core/package.json +1 -1
  57. package/node_modules/@agents-can-communicate/core/src/receipts.mjs +17 -2
  58. package/node_modules/@agents-can-communicate/core/src/status.mjs +26 -2
  59. package/node_modules/@agents-can-communicate/delivery-router/package.json +1 -1
  60. package/node_modules/@agents-can-communicate/delivery-router/src/refresh-binding.mjs +2 -2
  61. package/node_modules/@agents-can-communicate/delivery-router/src/router.mjs +9 -41
  62. package/node_modules/@agents-can-communicate/hook-runner/package.json +1 -1
  63. package/node_modules/@agents-can-communicate/hook-runner/src/client-pid.mjs +30 -1
  64. package/node_modules/@agents-can-communicate/hook-runner/src/native-binding.mjs +3 -4
  65. package/node_modules/@agents-can-communicate/hook-runner/src/process-table.mjs +30 -14
  66. package/node_modules/@agents-can-communicate/hook-runner/src/runner.mjs +12 -1
  67. package/node_modules/@agents-can-communicate/installer/package.json +1 -1
  68. package/node_modules/@agents-can-communicate/installer/src/delivery-diagnostics.mjs +0 -2
  69. package/node_modules/@agents-can-communicate/installer/src/detect.mjs +13 -7
  70. package/node_modules/@agents-can-communicate/installer/src/index.mjs +1 -0
  71. package/node_modules/@agents-can-communicate/installer/src/receiver-sockets.mjs +19 -0
  72. package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
  73. package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
  74. package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
  75. package/node_modules/@agents-can-communicate/storage-filesystem/src/atomic-json.mjs +30 -4
  76. package/node_modules/@agents-can-communicate/storage-filesystem/src/safe-directory.mjs +56 -25
  77. package/node_modules/@agents-can-communicate/storage-filesystem/src/store.mjs +6 -2
  78. package/package.json +1 -1
@@ -54,7 +54,6 @@ await serve({
54
54
  context: {
55
55
  service,
56
56
  deliveryRouter: createDeliveryRouter({ service, adapters, clock,
57
- platform: `${process.platform}-${process.arch}`,
58
57
  readLivePolicy: ({ adapter }) => readInstalledLivePolicy({ dataHome,
59
58
  adapterId: adapter.id }) }),
60
59
  workspaceId: descriptor.id,
@@ -25,7 +25,6 @@ const runtime = {
25
25
  ids: { next: kind => createId(kind, randomBytes) },
26
26
  createDeliveryRouter: ({ service, clock, dataHome }) =>
27
27
  createDeliveryRouter({ service, adapters, clock,
28
- platform: `${process.platform}-${process.arch}`,
29
28
  readLivePolicy: ({ adapter }) => readInstalledLivePolicy({ dataHome,
30
29
  adapterId: adapter.id }) }),
31
30
  // Asked only by `acc config init`, and only when stdout is a terminal. There
@@ -29,6 +29,7 @@ export function createExampleAdapter() {
29
29
  detect, install, uninstall, doctor,
30
30
  planInstall, // what install would write
31
31
  preflightUninstall, // optional read-only removal validation
32
+ inboundSockets, // optional: socket paths a live sender connects to
32
33
  normalizeHook, // client payload -> normalised event
33
34
  renderContext, // SyncResult -> text
34
35
  renderContextResult, // text + ids of complete rendered groups
@@ -81,10 +82,15 @@ is not evidence for compaction. Counts add no ids to `offeredMessageIds` or
81
82
 
82
83
  `client.command` does double duty. `detect.mjs` uses it as the version-probe binary, and
83
84
  presence liveness separately walks the hook's process ancestry for the first ancestor whose
84
- executable basename matches it, to learn the client's own pid. Declare the binary the client
85
- actually runs as — `command: "claude"` for a client that really runs as `node` resolves
86
- nothing, and the failure is silent: the session gets `pid: null` and falls back to reading
87
- presence by age alone, with nothing telling you why.
85
+ executable basename matches it, to learn the client's own pid. A client shipped as a node
86
+ script, such as Gemini CLI, runs as `node`; for a `node` ancestor the walk also matches the
87
+ script it runs: the first argument after any interpreter options, by basename, with a
88
+ `.js`, `.mjs` or `.cjs` extension ignored. A word right after an option written without `=`
89
+ may be that option's value (`--require ./preload.cjs`), so it is also tried and the script
90
+ after it still counts. Declare the name the client actually runs as. A
91
+ command that matches neither resolves nothing, and the failure is silent: the session gets
92
+ `pid: null`, falls back to reading presence by age alone, and is not pinned to its
93
+ generation, with nothing telling you why.
88
94
 
89
95
  ## Declare only proven capabilities
90
96
 
@@ -148,9 +154,8 @@ to its capabilities:
148
154
 
149
155
  ```js
150
156
  nativeDelivery: {
151
- minimumByPlatform: { "darwin-arm64": "2.1.282" },
152
- anchors: [{ platform: "darwin-arm64", version: "2.1.282",
153
- protocolContract: "claude-code-inbox-socket-v1" }],
157
+ minimum: "2.1.282",
158
+ anchors: [{ version: "2.1.282", protocolContract: "claude-code-inbox-socket-v1" }],
154
159
  knownBad: [],
155
160
  activationKinds: ["native-service"],
156
161
  offerKind: "wake",
@@ -159,17 +164,32 @@ nativeDelivery: {
159
164
 
160
165
  The rules `defineAdapter` enforces, and the ones the runtime applies:
161
166
 
162
- - A minimum is the **first passing capture** on that platform, never a guessed first vendor
163
- release. Every anchor must have passing `delivery.livePush` evidence for the same client,
164
- version, and platform, and each minimum must itself be an anchor.
165
- - There is intentionally **no maximum version**. A newer stable release is admitted only
166
- when a current read-only feature probe (`probeNativeDelivery()`) and a per-session
167
- handshake (`bindNativeSession()`) both report the anchored `protocolContract`;
168
- `evaluateNativeEligibility()` and `validateNativeHandshake()` are those two checks.
169
- - Prereleases require their own passing capture; they are `prerelease_not_captured` even
170
- when numerically newer. `knownBad` names exact versions or inclusive intervals.
171
- - Exact-version certification still governs every non-native capability;
167
+ - The minimum is the **first passing capture**, never a guessed first vendor release. Every
168
+ anchor must have passing `delivery.livePush` evidence for the same client and version, and
169
+ the minimum must itself be an anchor. The platform an evidence row names is where the
170
+ capture was taken; it is provenance, and the anchor names no platform.
171
+ - There is intentionally **no maximum version** and **no platform**. A newer release is
172
+ admitted, on every platform, only when a current read-only feature probe
173
+ (`probeNativeDelivery()`) and a per-session handshake (`bindNativeSession()`) both report
174
+ the anchored `protocolContract`; `evaluateNativeEligibility()` and
175
+ `validateNativeHandshake()` are those two checks.
176
+ - A prerelease is judged by its release triple, as hook capabilities are: `2.2.0-beta.1` is
177
+ `2.2.0` against the minimum and `knownBad`. `knownBad` names exact versions or inclusive
178
+ intervals. A version that cannot be read at all is `version_unavailable`.
179
+ - Certification evidence still governs every non-native capability;
172
180
  `effectiveCapabilities()` is unchanged. The native rule is used for live delivery alone.
181
+
182
+ What may refuse live delivery is exactly three things:
183
+
184
+ - the machine's own probe or per-session handshake failing;
185
+ - a client older than the first passing capture;
186
+ - a regression recorded in `knownBad`.
187
+
188
+ Nothing else: not the platform, not a prerelease suffix, not where the evidence was taken. A
189
+ transport that is technically different on some platform is the probe's fact to report, as
190
+ `native_delivery_unsupported`, never a gap in the captures. The 0.8.0 shape,
191
+ `minimumByPlatform` with a platform on each anchor, is refused by name; the design record is
192
+ `docs/design/2026-09-26-native-delivery-across-platforms.md` in the repository.
173
193
  - Native methods return closed facts (`validateNativeActivationPlan()` closes the
174
194
  activation plan) and never put vendor data - endpoints, sockets, raw errors - into core.
175
195
 
@@ -208,6 +228,19 @@ the refreshed lease. Refresh is not a heartbeat and cannot extend presence beyon
208
228
  its own expiry. Optional `retireNativeSession()` cleans adapter-owned endpoint state
209
229
  after confirmed core retirement; it must remain bounded and fail open for hooks.
210
230
 
231
+ An adapter whose `offerMessage()` connects to a Unix socket in the recipient's session
232
+ declares where those sockets live with the optional `inboundSockets(context)`. It returns
233
+ absolute paths, directories or sockets, derived from `context.env`, `context.platform` and
234
+ the client homes in the context. It runs synchronously, once per install, doctor or refresh
235
+ command, and must never throw. It may read the adapter's own records under
236
+ `context.stateRoot` when a session can bind outside what the environment implies. Claude Code
237
+ reads its endpoint records there, and keeps each read bounded. The installer
238
+ composes every known adapter's declaration into `context.receiverSockets`. An adapter whose
239
+ client sandboxes the sender's shell allows exactly that list, and reports its outgoing
240
+ permissions configured only while every entry is allowed. It never names another vendor's
241
+ paths itself. Codex does this in its permission profile. Declare a new receiving transport
242
+ here, or every Codex sender gets `transport_permission_denied` against it.
243
+
211
244
  A package-shipped passing Codex installed-hook capture additionally references its
212
245
  complete real product matrix through the selected provenance record's
213
246
  `productEvidence: { fixture, sha256 }`. Package verification checks the actual file,
@@ -107,8 +107,9 @@ turn.
107
107
 
108
108
  The Claude Code inbox wake has installed-client evidence on 2.1.282. Codex LocalDaemon
109
109
  has it on 0.152.1 and 0.153.4. Antigravity CLI has it on 1.2.7 and later through a relay
110
- the agent starts in its own shell. All three use a captured platform minimum,
111
- current probe and exact session handshake. Claude Code and Codex preserve the ordinary
110
+ the agent starts in its own shell. All three use a captured minimum that applies on every
111
+ platform, a current probe and an exact session handshake; a prerelease is judged by its
112
+ release triple. Claude Code and Codex preserve the ordinary
112
113
  client launch. Claude Code verifies its session registry, and Codex verifies its registered
113
114
  thread and workspace. Native delivery owns no vendor daemon lifecycle. Gemini CLI and Kimi
114
115
  Code have exact-version next-turn evidence only. Grok and generic MCP use inbox polling.
@@ -226,10 +227,12 @@ modes. It preserves explicit declarations and does not rewrite live leases. Miss
226
227
  changed generation files and unknown native bindings remain unverified holds.
227
228
  A session is also pinned to the generation
228
229
  it started with: its hooks delegate to that generation while the pin declares the same
229
- store contract this one does, and run the active generation otherwise. A generation
230
- directory is reclaimed once no control pointer, live lease, live pin or staging hold names
231
- it. Parsed help, version, and update recovery remain available when workspace admission is
232
- unavailable.
230
+ store contract this one does, and run the active generation otherwise. Apart from
231
+ `SessionEnd`, only the client's confirmed death releases a pin, so a session whose client
232
+ process cannot be found is not pinned, and a pin that names no client is reaped. A
233
+ generation directory is reclaimed once no control pointer, live lease, live pin or staging
234
+ hold names it. Parsed help, version, and update recovery remain available when workspace
235
+ admission is unavailable.
233
236
 
234
237
  An independent worker downloads npm packages with lifecycle scripts disabled, checks exact
235
238
  stable package identity and the discovered integrity, and health-checks the staged runtime.
@@ -20,9 +20,9 @@ Capability honesty separates four questions that are easy to collapse:
20
20
  A source method or vendor documentation is not certification. A capture applies forward: from
21
21
  the version that recorded it until a later capture changes that capability, and to every
22
22
  platform until one of them records something of its own. A client older than every capture
23
- degrades to false, and so does a capability a capture recorded as failing. Native
24
- minimum-based eligibility is separate, and stays per-platform. No weaker session inherits a
25
- stronger peer's capability.
23
+ degrades to false, and so does a capability a capture recorded as failing. Native live
24
+ delivery reads its captured minimum the same way: on every platform, with a prerelease judged
25
+ by its release triple. No weaker session inherits a stronger peer's capability.
26
26
 
27
27
  Run `acc doctor` in the project when observed behavior differs from this page. It reports
28
28
  the installed client version, platform, effective capability, and fallback instead of
@@ -53,18 +53,27 @@ The native rows are `no` at the hook versions this matrix names.
53
53
  Separate installed-client captures establish Codex `livePush` on 0.152.1 and
54
54
  0.153.4, Claude Code `livePush` on 2.1.282 through the session inbox, and
55
55
  Antigravity CLI `livePush` on 1.2.7 and later through a relay the agent starts in its own shell.
56
- Native eligibility uses the captured platform minimum, a current feature probe,
57
- and an exact per-session handshake. It is experimental and requires recipient
58
- opt-in. Codex, Claude Code and Antigravity CLI reply through `acc reply`. Their native
56
+ Native eligibility uses the captured minimum, a current feature probe, and an exact
57
+ per-session handshake. It is experimental and requires recipient opt-in.
58
+
59
+ What may refuse live delivery is exactly three things:
60
+
61
+ - the machine's own probe or per-session handshake failing;
62
+ - a client older than the first passing capture;
63
+ - a regression recorded in `knownBad`.
64
+
65
+ Nothing else: not the platform, not a prerelease suffix, not where the evidence was taken.
66
+ A platform whose transport is technically different is refused by the probe as a fact about
67
+ that transport, which is what Claude Code's named pipe on native Windows is. Codex, Claude Code and Antigravity CLI reply through `acc reply`. Their native
59
68
  `replyRoute` remains false.
60
69
 
61
70
  The limitations belong next to the adapters they affect:
62
71
 
63
72
  | Adapter | Exact limitation and evidence |
64
73
  |---|---|
65
- | Antigravity CLI | 1.2.7 on darwin-arm64, captured in print mode, and every later release by the forward rule. Only `SessionStart`, `PreInvocation`, `PostInvocation` and `Stop` load; `SessionEnd`, `PreToolUse` and `PostToolUse` are accepted into the config file and silently dropped, so there is no tool guard and no session-end deregistration - a session goes offline by presence age or an explicit `acc finish`. Payloads carry no `hook_event_name`, so each registered command passes its own event name. The end-of-turn `Stop` continuation reaches the model and is a bounded nudge, not a gate: ACC continues a turn at most once and fails open, and the client caps consecutive continuations itself (vendor 1.1.9). `agy agentapi send-message` can wake an idle session - captured - but only with that session's language-server address and CSRF token, which exist in the agent's own shell and in no hook. ACC does not take that token, so live push and reply routing are false. A peer message that arrives while the model writes its last answer is carried by the `Stop` continuation instead. A write that parses can register nothing, so install and doctor read `agy -p "/hooks"` back instead of trusting the file. Live push (1.2.7, darwin-arm64, TUI only, experimental, recorded opt-in) runs through a relay the agent starts once per conversation from its own shell - the only process holding the session endpoint - after ACC's context asks it to, up to three times while none is serving; the operator approves that command at the client's permission prompt. An idle session wakes; a busy one sees the message after its running answer, or at the next model invocation when the turn waits on a tool. Print mode and the first session in a folder trusted at that launch get no relay. |
74
+ | Antigravity CLI | 1.2.7 on darwin-arm64, captured in print mode, and every later release by the forward rule. Only `SessionStart`, `PreInvocation`, `PostInvocation` and `Stop` load; `SessionEnd`, `PreToolUse` and `PostToolUse` are accepted into the config file and silently dropped, so there is no tool guard and no session-end deregistration - a session goes offline by presence age or an explicit `acc finish`. Payloads carry no `hook_event_name`, so each registered command passes its own event name. The end-of-turn `Stop` continuation reaches the model and is a bounded nudge, not a gate: ACC continues a turn at most once and fails open, and the client caps consecutive continuations itself (vendor 1.1.9). `agy agentapi send-message` can wake an idle session - captured - but only with that session's language-server address and CSRF token, which exist in the agent's own shell and in no hook. ACC does not take that token, so live push and reply routing are false. A peer message that arrives while the model writes its last answer is carried by the `Stop` continuation instead. A write that parses can register nothing, so install and doctor read `agy -p "/hooks"` back instead of trusting the file. Live push (1.2.7, darwin-arm64, TUI only, experimental, recorded opt-in) runs through a relay the agent starts once per conversation from its own shell - the only process holding the session endpoint - after ACC's context asks it to, up to three times while none is serving; the operator approves that command at the client's permission prompt. An idle session wakes; a busy one sees the message after its running answer, or at the next model invocation when the turn waits on a tool. Print mode and the first session in a folder trusted at that launch get no relay. The client asks before every shell command (1.2.12), so install always adds the prefix rule `command(<wrapper>)` to the client's settings to let the woken agent's ACC commands run without that prompt. A woken session answered with no prompt under that rule on 1.2.12 (2026-09-28); print mode with it has not been captured. |
66
75
  | Codex | Next-turn context, captured on 0.147.0, requires plugin trust. The observed stock 0.153.4 upgrade from ACC 0.3.1 to 0.4 required fresh review of five modified hook definitions; a subsequent restart retained all five active (activation evidence, not new event certification). LocalDaemon native delivery was captured through the installed package on 0.152.1 and 0.153.4, darwin-arm64; minimum 0.152.1, recorded opt-in, current feature probe and exact thread/cwd/process/version/protocol checks are required. Ordinary launch preserves the receiver workspace without ACC arguments or daemon ownership. Embedded or unreachable sessions keep their inbox. Native `replyRoute` remains false. |
67
- | Claude Code | 2.1.233 next-turn delivery waits for the next user prompt. From 2.1.282 on darwin-arm64, `delivery.livePush` is a live capability behind the native contract (experimental, off until opted in). ACC wakes the session through the inbox socket that Claude Code opens for every session, with one line of fixed ACC text and the message id. An idle session starts a turn. A busy session takes the wake between two tool calls. Each delivered wake fires `UserPromptSubmit`, so the next-turn hook shows the body and records the receipt `offered` via `next-turn`. The model answers with `acc reply`, so `delivery.replyRoute` stays false. A session in `bypassPermissions` mode holds each wake for approval unless `crossSessionInbound` is `accept`, and `refuse` drops wakes. Native Windows keeps next-turn delivery: its inbox is a named pipe that requires an auth line, and it is uncaptured. Linux is uncaptured. |
76
+ | Claude Code | 2.1.233 next-turn delivery waits for the next user prompt. From 2.1.282, captured on darwin-arm64 and applied on every platform whose inbox is a Unix socket, `delivery.livePush` is a live capability behind the native contract (experimental, off until opted in). ACC wakes the session through the inbox socket that Claude Code opens for every session, with one line of fixed ACC text and the message id. An idle session starts a turn. A busy session takes the wake between two tool calls. Each delivered wake fires `UserPromptSubmit`, so the next-turn hook shows the body and records the receipt `offered` via `next-turn`. The model answers with `acc reply`, so `delivery.replyRoute` stays false. A session in `bypassPermissions` mode holds each wake for approval unless `crossSessionInbound` is `accept`, and `refuse` drops wakes. Native Windows keeps next-turn delivery: its inbox is a named pipe that requires an auth line, and it is uncaptured. Linux is uncaptured. |
68
77
  | Gemini CLI | Package-shipped next-turn certification starts at 0.57.0. Its TUI has no captured external wake or queue interface and `--acp` changes launch ownership, so native delivery is fallback-only; live push and reply routing remain false. |
69
78
  | Grok | The Grok 1.0.24 installed-client check observed own CLI arguments after a terminal result, followed by owned work, message, and finish calls. This identity-only path does not certify peer-context injection. Documentation-shaped payloads do not count as real captures. The public leader surface exposed no proven addressed injection into an ordinary TUI session, so native delivery is `awaiting_compatibility_capture`; all capabilities remain false. |
70
79
  | Kimi Code | Next-turn and guard evidence was captured on 0.36.1, plus a 60-second heartbeat. Its server/queue APIs do not prove a transparent binding to an independently opened session, so native delivery is fallback-only. |
@@ -93,10 +102,11 @@ demand without a client heartbeat. Retirement is final: neither route may revive
93
102
  retired binding, a closed session or an old generation. Delivery lease refresh does
94
103
  not renew participant presence.
95
104
 
96
- On darwin-arm64, Codex LocalDaemon, the Claude Code inbox wake and the Antigravity CLI
97
- relay have captured experimental live delivery. Other adapters retain their separately
98
- certified next-turn paths or inbox polling. Linux and other uncaptured platforms retain
99
- the durable inbox; these captures establish no new hook capabilities there.
105
+ Codex LocalDaemon, the Claude Code inbox wake and the Antigravity CLI relay have captured
106
+ experimental live delivery, on darwin-arm64. Those captures set the minimum that applies on
107
+ every platform; on a host they never named, the probe and the per-session handshake decide,
108
+ and a transport that does not answer keeps the durable inbox. Other adapters retain their
109
+ separately certified next-turn paths or inbox polling.
100
110
 
101
111
  Codex's 120-second delivery lease can refresh on demand for the same live endpoint;
102
112
  it does not extend the 24-hour participant presence limit. A TUI exit can leave its
@@ -116,8 +126,8 @@ policy:
116
126
  | `all` | every addressed message kind may use live push |
117
127
 
118
128
  The default is `off`. `acc install --delivery actionable|all` records recipient consent.
119
- Current activation remains off when the platform, captured minimum or feature probe
120
- does not qualify; that temporary failure does not erase the requested policy. Each
129
+ Current activation remains off when the captured minimum or the feature probe does not
130
+ qualify; that temporary failure does not erase the requested policy. Each
121
131
  session must pass its own generation-bound handshake. Every adapter reads consent from the
122
132
  installation record and rereads it at hooks and before offers, so a long-running vendor
123
133
  process cannot retain permission through an old binding snapshot.
package/docs/CLI.md CHANGED
@@ -104,9 +104,23 @@ got. Two sessions of one participant show the same numbers, so read the workspac
104
104
  `<n> offered, not retrieved` when that number is above zero. Offered is not read: a
105
105
  transport took the bytes, and the model may or may not have looked.
106
106
 
107
- A participant with no open session is left out, unless messages still wait for it. Then its
108
- latest session stays listed as `offline`, with `endReason` when the client said why the
109
- session ended, such as `"clear"` for Claude Code's `/clear`. The text line names each one:
107
+ A session is `stale` when no turn has sent a heartbeat for three heartbeat cadences. Each
108
+ session row says what a message to such a session meets. `processTracked` is true when ACC
109
+ knows the client process. A dead process makes the session `offline`, so a stale session with
110
+ a tracked process is idle. `liveDelivery` is true when the session has a live delivery
111
+ binding, and `liveLeaseCurrent` says whether the binding's lease is still valid. A stale
112
+ session wakes on send when the lease is valid, or when its adapter can verify the receiver
113
+ again: the router does that for a lapsed lease before it offers. The text line counts stale
114
+ sessions by that result:
115
+ `5 live (2 idle, wake on send; 1 idle until next turn; 1 idle, inbox only)`. `not answering`
116
+ is kept for a stale session whose process ACC does not know.
117
+
118
+ A participant with no open session is left out, unless messages still wait for it: queued,
119
+ or offered by a live transport and not yet shown again, so that its next turn would show
120
+ them. A message the next-turn hook already showed does not wait, since nothing will reach the
121
+ participant for it again. A waiting participant's latest session stays listed as `offline`,
122
+ with that number as `waiting`, and with `endReason` when the client said why the session
123
+ ended, such as `"clear"` for Claude Code's `/clear`. The text line names each one:
110
124
  `waiting for a closed session: claude_code-b (cleared, 2)`. `acc status --all` lists every
111
125
  session. Default `sync` reads
112
126
  events after a 16-digit event cursor (100 by
@@ -370,6 +384,11 @@ Your existing npm or Homebrew command and shell profiles remain unchanged.
370
384
  An older consent that covered service start receives one expanded choice for the download.
371
385
  An accepted or declined answer persists. To change a declined answer, use
372
386
  `acc install --adapter codex --delivery actionable` (or `all` for that policy).
387
+ Installing the Antigravity adapter always adds one prefix rule for ACC's wrapper to
388
+ `~/.gemini/antigravity-cli/settings.json`, so ACC's commands run there without an approval
389
+ prompt; nothing asks about it and the delivery policy does not change it. Uninstall removes
390
+ exactly that rule. See
391
+ [Antigravity CLI command approval](CONFIGURATION.md#antigravity-cli-command-approval).
373
392
  Explicit `--delivery actionable|all` also approves a required download on supported clients.
374
393
  Dry runs, delivery off, doctor, automatic refresh, and message delivery do not download
375
394
  Codex or start its service. Uninstall does not remove Codex or stop the shared vendor daemon.
@@ -131,8 +131,9 @@ The allowed values are `off`, `actionable`, and `all`; the default is `off`. Thi
131
131
  does not belong in `acc.workspace.json`, where a pull request could opt someone else into
132
132
  spending a turn. It also cannot create a capability. Every adapter reads live-delivery
133
133
  consent from this installation record, and only from it. Exact-version evidence governs
134
- ordinary hook features. Claude Code live delivery separately requires macOS arm64, version
135
- 2.1.282 or newer, and a current feature probe before installation applies the requested
134
+ ordinary hook features. Claude Code live delivery separately requires version 2.1.282 or
135
+ newer on macOS or Linux (on native Windows its inbox is a named pipe, so delivery stays
136
+ next-turn), and a current feature probe before installation applies the requested
136
137
  policy. If those install-time checks fail, effective policy remains `off` and the installer
137
138
  reports next-turn or inbox fallback. Each later session must also pass its own
138
139
  generation-bound handshake. A failed session handshake clears or refuses that binding and
@@ -146,7 +147,7 @@ each wake for your approval unless its `crossSessionInbound` setting is `accept`
146
147
  never overrides them. See
147
148
  [held or dropped wakes](TROUBLESHOOTING.md#a-claude-code-session-holds-or-drops-acc-wakes).
148
149
 
149
- Codex LocalDaemon delivery separately requires macOS arm64, Codex 0.152.1 or newer, a
150
+ Codex LocalDaemon delivery separately requires Codex 0.152.1 or newer, a
150
151
  current feature probe, and exact thread, canonical cwd, process, version and protocol
151
152
  checks. On Codex 0.154.0 or newer, explicit complete setup can download a missing matching
152
153
  standalone package and prepare a definitely absent service. The setup choice names the
@@ -160,15 +161,47 @@ Unavailable or ineligible sessions retain durable inbox fallback. Use
160
161
  ### Codex outgoing permissions
161
162
 
162
163
  Receiving a native message and sending from the agent's sandbox are separate operations.
163
- On Codex 0.153.4 or newer on macOS arm64, live opt-in also configures outgoing access
164
+ On Codex 0.153.4 or newer, live opt-in also configures outgoing access
164
165
  for default workspace permissions. This happens even when the daemon is not yet available.
165
166
  Installation, its preview, and the interactive consent question disclose this change.
166
167
 
167
168
  ACC selects a permission profile named `acc-workspace`, extending `:workspace`. It grants
168
- write access to the ACC state directory and allows only the local ACC channel directory
169
- (`/tmp/acc-ch-<uid>`) and the Codex home control socket. The profile enables networking
170
- through `features.network_proxy = true`, with no external domains allowed. The proxy and
171
- socket grants must stay together: enabling networking without the proxy changes its scope.
169
+ write access to the ACC state directory and allows only the Unix sockets ACC delivers to.
170
+ Each receiving adapter declares its own, and the profile lists all of them even when an
171
+ install names Codex alone:
172
+
173
+ | Receiver | Allowed path |
174
+ |---|---|
175
+ | Codex | the control socket, `<CODEX_HOME>/app-server-control/app-server-control.sock` |
176
+ | Antigravity CLI relay | the ACC channel directory, `/tmp/acc-ch-<uid>` on macOS |
177
+ | Claude Code inbox | `/tmp/cc-socks`, `/tmp/cc-socks-<uid>`, `$XDG_RUNTIME_DIR/cc-socks` or else `$CLAUDE_CODE_TMPDIR/cc-socks` when set, `/run/user/<uid>/cc-socks` on Linux, and the directory of every Claude Code inbox ACC has bound on this machine |
178
+
179
+ ACC writes each path with its existing parent resolved, so on macOS the entries read
180
+ `/private/tmp/...`. Codex resolves a granted path only if it exists when Codex builds the
181
+ sandbox policy, and the sandbox compares resolved paths: a `/tmp/cc-socks-<uid>` entry
182
+ written before that directory existed never matched. A socket that is a link, such as the
183
+ Codex control socket, keeps its own name.
184
+
185
+ A command in the Codex sandbox can therefore connect to any of your Claude Code sessions'
186
+ inbox sockets. Claude Code's own inbound settings still decide what a received frame may do,
187
+ and ACC checks Claude Code's session registry before each wake it sends.
188
+
189
+ The profile enables networking through `features.network_proxy = true`, with no external
190
+ domains allowed. The proxy and socket grants must stay together: enabling networking
191
+ without the proxy changes its scope.
192
+
193
+ Doctor reports outgoing delivery as configured only while the profile allows every socket
194
+ above. A profile that ACC 0.8.0 or 0.8.1 wrote lacks the Claude Code inbox directories;
195
+ doctor names the missing paths and `acc install --adapter codex`. That command and
196
+ `acc update` rewrite ACC's own profile under the recorded delivery policy, `off` included.
197
+ Start a new Codex session afterwards.
198
+
199
+ The environment variables above are read from the process that runs `acc install` or
200
+ `acc doctor`. A Claude Code session started with its own `CLAUDE_CODE_TMPDIR` or
201
+ `XDG_RUNTIME_DIR` binds its inbox elsewhere. ACC learns that directory when its hooks first
202
+ bind the session, from its own endpoint record. From then on doctor names the directory
203
+ until `acc install --adapter codex` or `acc update` adds it. Only a directory named as Claude
204
+ Code names its inboxes, `cc-socks` or `cc-socks-<uid>`, is taken from a record.
172
205
 
173
206
  An existing legacy workspace-write configuration is migrated only when its sole writable
174
207
  root is ACC's state directory. Custom permission/configuration profiles, additional roots,
@@ -184,6 +217,38 @@ generated permission component is unchanged.
184
217
  If any component was edited or another setting depends on it, ACC preserves the entire
185
218
  bundle and reports it for review. Plugin registration can still be removed independently.
186
219
 
220
+ ### Antigravity CLI command approval
221
+
222
+ Antigravity CLI asks for approval before each shell command, ACC's included. A session that
223
+ live delivery wakes while you are away would therefore stop at the agent's first ACC command,
224
+ and the peer would get no answer until someone approved it. So when `acc install` installs
225
+ the Antigravity adapter, it always adds one rule to the client's own settings:
226
+
227
+ ```text
228
+ ~/.gemini/antigravity-cli/settings.json
229
+ permissions.allow: command(<home>/.gemini/config/acc/acc-cli.sh)
230
+ ```
231
+
232
+ A one-word rule is a prefix: every command that starts with that path runs without asking.
233
+ The agent then runs every ACC command without asking you, including one a peer's message
234
+ prompts; every other command still asks. Install does not ask about the rule, and the
235
+ delivery policy does not change it: it is part of ACC's Antigravity integration, as its hooks
236
+ are.
237
+
238
+ ACC keeps every other key and rule in the file, leaves a rule you already had as yours, and
239
+ records what it added in its own data home. `acc uninstall` removes every copy of that rule (one
240
+ in the same words cannot be told from ACC's), and a
241
+ container or file ACC created only if nothing else is in it. A rule removed by hand comes back
242
+ at the next `acc install` or automatic refresh; uninstall is what keeps it out. A file that is
243
+ not valid JSON, or whose `permissions.allow` is not a list, is left as it is and reported. The
244
+ client reads the file when it starts, so restart `agy` after install.
245
+
246
+ The rule matches only a command whose first word is the path without quotes, so ACC's skill
247
+ for this client writes the path without quotes. When your home path contains a space or a
248
+ shell metacharacter, the path needs quotes, no rule can match it, and ACC adds none.
249
+ `acc doctor` reports the rule as present, absent, or unable to apply, and asks for
250
+ `acc install --adapter antigravity` when ACC's rule is missing.
251
+
187
252
  ## Override local paths and identity
188
253
 
189
254
  Nothing in `acc.workspace.json` says where state is stored, and nothing there can — that is
@@ -43,7 +43,7 @@ session after that review; changed hook definitions may require trust again.
43
43
 
44
44
  For Codex live delivery, follow the outgoing-permission and local-service instructions
45
45
  from install/doctor, then start a new session. Default workspace permissions can be
46
- configured automatically on Codex 0.153.4 or newer on macOS arm64. Custom settings are
46
+ configured automatically on Codex 0.153.4 or newer. Custom settings are
47
47
  preserved; see [outgoing permissions](CONFIGURATION.md#codex-outgoing-permissions).
48
48
  With legacy sandbox settings, the named ACC state directory must also be in
49
49
  `sandbox_workspace_write.writable_roots` in the config the installer identifies.
@@ -58,7 +58,7 @@ hooks wherever the client is at or after a captured version.
58
58
  An interactive install asks one default-No question for all selected clients that need a
59
59
  choice. Use `--delivery actionable|all` for explicit noninteractive consent. Use
60
60
  `--delivery off` to disable incoming automatic requests. A dry run does not ask, write
61
- configuration, download Codex, or start a service. On macOS arm64 with Codex 0.154.0 or newer,
61
+ configuration, download Codex, or start a service. On macOS or Linux with Codex 0.154.0 or newer,
62
62
  the choice includes downloading a missing standalone package from OpenAI. ACC selects the
63
63
  matching version and keeps your existing npm or Homebrew command and shell profiles.
64
64
  When supported Codex service preparation succeeds, it
@@ -150,7 +150,10 @@ infrastructure, recorded opt-in, and a verified session. Supported explicit setu
150
150
  prepare a missing service. Start the client with your normal command. A loaded daemon thread can receive
151
151
  messages after its terminal exits. Antigravity CLI 1.2.7 and later has one too: with delivery enabled,
152
152
  ACC's context asks the agent to start a relay from its own shell, up to three times while
153
- none is running, and you approve that command at the client's prompt.
153
+ none is running, and you approve that command at the client's prompt. Antigravity also asks
154
+ before each shell command, so install adds a rule that lets ACC's own commands run without
155
+ that prompt, and a woken session can answer while you are away; see
156
+ [Antigravity CLI command approval](CONFIGURATION.md#antigravity-cli-command-approval).
154
157
  [Capabilities](CAPABILITIES.md) explains policy, versions and fallback.
155
158
 
156
159
  Delivery evidence is deliberately narrow: `queued -> offered -> retrieved -> acknowledged`.
@@ -123,7 +123,9 @@ All recipients have the same durable record, but adapters expose different accel
123
123
  endpoint exists only in the agent's own shell, so ACC's context asks the agent once per
124
124
  conversation to start a relay; the user approves that command. The relay keeps the endpoint
125
125
  in memory, wakes an idle session with a fenced peer message, holds one for a busy session,
126
- and ends with the client. It is experimental, off by default, and can spend tokens.
126
+ and ends with the client. It is experimental, off by default, and can spend tokens. The
127
+ woken agent's ACC commands run without the client's approval prompt because install adds
128
+ one allow rule for ACC's wrapper.
127
129
 
128
130
  Grok, generic MCP, unsupported versions and uncaptured platforms use inbox polling.
129
131
  [Capabilities](CAPABILITIES.md) lists evidence and fallback.
package/docs/PROTOCOL.md CHANGED
@@ -316,8 +316,8 @@ The recipient owns `livePolicy` because native push may start a model turn:
316
316
 
317
317
  Default is `off`. Policy never creates a capability. The router requires one
318
318
  current eligible recipient generation, supported client evidence, a verified
319
- binding and adapter acceptance. The Claude Code inbox wake uses a captured 2.1.282
320
- minimum on darwin-arm64. Its binding requires the same pid and socket in Claude Code's
319
+ binding and adapter acceptance. The Claude Code inbox wake uses a 2.1.282 minimum,
320
+ captured on darwin-arm64 and applied on every platform. Its binding requires the same pid and socket in Claude Code's
321
321
  session registry, and every refresh and wake also requires the same session id. Codex LocalDaemon uses a 0.152.1 minimum, confirmed
322
322
  through installed-product captures on 0.152.1 and 0.153.4. Recorded consent and
323
323
  exact thread, cwd, process, version and protocol verification govern every Codex session.
package/docs/RELEASING.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Releasing
2
2
 
3
3
  Use this procedure to build one auditable npm artifact, verify that exact tarball, and keep
4
- its evidence tied to the commit that supplied its bytes. The package is currently `0.5.0`;
5
- the commands derive the version from `package.json` so the filename cannot drift.
4
+ its evidence tied to the commit that supplied its bytes. The commands derive the version
5
+ from `package.json` so the filename cannot drift.
6
6
 
7
7
  ```mermaid
8
8
  graph LR
@@ -118,8 +118,10 @@ work belongs under `Unreleased` and gets a new candidate record.
118
118
  ## Capture only capabilities you observed
119
119
 
120
120
  Run native real-client checks on the exact versions and platforms recorded in
121
- retained fixtures. Exact-version evidence governs normal-turn and guard behavior.
122
- The Claude Code inbox wake uses its captured macOS arm64 minimum plus a current probe and
121
+ retained fixtures. A capture records evidence, and it never gates beyond that floor: what it
122
+ proves applies from its version onward and on every platform, and what refuses a client is
123
+ the machine's own probe or handshake, an older client, or a recorded regression.
124
+ The Claude Code inbox wake uses its captured minimum plus a current probe and
123
125
  per-session handshake. Its passing capture is a real-client product run of the packed
124
126
  candidate, launched with the ordinary command and installed hooks. Codex LocalDaemon
125
127
  uses a separate 0.152.1 minimum with installed-product captures on 0.152.1 and
@@ -94,12 +94,22 @@ user's: a session in `bypassPermissions` mode holds each wake for approval unles
94
94
  `crossSessionInbound` is `accept`, and `refuse` drops wakes.
95
95
 
96
96
  On captured Codex/macOS configurations, live opt-in also grants outgoing access to ACC's
97
- state and local Unix sockets through a deny-by-default network proxy. Custom permission
97
+ state and local Unix sockets through a deny-by-default network proxy. The sockets are the
98
+ ones ACC delivers to, which include the directories where Claude Code binds each session's
99
+ inbox: a command in the Codex sandbox can connect to those sockets, and Claude Code's own
100
+ inbound settings decide what a received frame may do. Custom permission
98
101
  policies remain user-owned. Selection, proxy and grants are restored together only while
99
102
  unchanged; edited or newly referenced settings remain intact. See
100
103
  [Codex outgoing permissions](CONFIGURATION.md#codex-outgoing-permissions). Configuration
101
104
  readiness does not prove that an active session's overrides permit a live offer.
102
105
 
106
+ Antigravity CLI asks before each shell command. Installing its adapter adds one prefix rule
107
+ to that client's `permissions.allow`, for ACC's own wrapper path only. The agent then runs
108
+ every ACC command without a prompt, including one that a peer's message prompts. Every other
109
+ command still asks. ACC records the one rule it added and uninstall removes only that rule.
110
+ It never writes a settings file that it cannot parse. See
111
+ [Antigravity CLI command approval](CONFIGURATION.md#antigravity-cli-command-approval).
112
+
103
113
  ## Claims
104
114
 
105
115
  CLI claims default to advisory. Guarded enforcement must be requested explicitly and
@@ -175,6 +185,7 @@ caller chooses to send. The sender remains responsible for that content.
175
185
  | Symlink or traversal escapes a managed root | Per-segment containment, no-follow reads, closed config schema | Host filesystem compromise is out of scope |
176
186
  | Claim denial of service | Leases, visible owner, explicit authority release | Deliberate abuse by a trusted local peer is social |
177
187
  | Installer removes user configuration | Content-hashed ownership and byte comparison | User must remove modified leftovers manually |
188
+ | Peer message leads an Antigravity agent to run ACC commands unasked | Allow rule scoped to ACC's wrapper; every other command still asks; uninstall removes it | A peer can still prompt ACC actions, such as a reply or a claim, that nobody approves one by one |
178
189
  | False delivery claim | Record-first order, transport-owned `offered`, recipient-owned retrieval/ack, mutation tests | Crash after offer before commit can cause duplicate display |
179
190
  | Native endpoint leaks | Ephemeral opaque reference, user-only local endpoint, status redaction | Same-user local processes are outside the trust boundary |
180
191
  | MCP client impersonates another session | Identity fixed by launch env, closed tool schemas | A compromised launch config already controls that client |
@@ -138,8 +138,16 @@ client-owned hook and trust review.
138
138
  If a reply stays queued with `transport_permission_denied`, the sender's permissions
139
139
  blocked local transport. This is distinct from an unavailable recipient. The message was
140
140
  recorded successfully; the error does not mean it was read or acknowledged.
141
- On Codex 0.153.4 or newer on macOS arm64, rerun `acc install --adapter codex` with existing
141
+ On Codex 0.153.4 or newer, rerun `acc install --adapter codex` with existing
142
142
  live consent. Add `--delivery actionable` when new consent is required, then start a new session.
143
+ With ACC 0.8.0 or 0.8.1, every live offer from a Codex session to Claude Code failed this way:
144
+ the Codex profile did not allow Claude Code's inbox directories, and doctor still reported it
145
+ configured. Doctor now names the missing paths. `acc install --adapter codex` or `acc update`
146
+ rewrites the profile; start a new Codex session so it runs under the new one.
147
+ A Claude Code session started with its own `CLAUDE_CODE_TMPDIR` or `XDG_RUNTIME_DIR` binds its
148
+ inbox outside the directories your shell's environment implies. After ACC first binds that
149
+ session, doctor names its directory. Run `acc install --adapter codex` again, then start a new
150
+ Codex session.
143
151
  Doctor's `outgoingDelivery` reports the installed permission configuration separately
144
152
  from `nativeDelivery.runtime`: an active receiving channel does not establish outgoing
145
153
  access. Custom policies and active-session overrides remain unverified; inspect the config
@@ -240,8 +248,8 @@ local socket permissions as well; a writable state directory alone is insufficie
240
248
  ## Gemini does not guard a write
241
249
 
242
250
  Default and `plan` modes expose no write tool to the model. `auto_edit` exposes edit tools;
243
- shell availability depends on approval mode. Only Gemini CLI 0.57.0 on `darwin-arm64` has
244
- package-shipped delivery certification; other versions still use inbox.
251
+ shell availability depends on approval mode. Gemini CLI next-turn delivery is certified from
252
+ 0.57.0 onward, on every platform; an older client still uses inbox.
245
253
 
246
254
  From 0.55 onwards there is a quieter cause with the same symptom: an untrusted folder. The
247
255
  client prints `Approval mode overridden to "default" because the current folder is not
@@ -301,10 +309,11 @@ agy -p "/skills" --output-format json
301
309
 
302
310
  An agent that receives a peer message in print mode (`agy -p`) cannot answer it on its own.
303
311
  It forms the right `acc reply` command from the skill, and print mode denies every command
304
- because it cannot ask for approval; the client says so on stderr. The TUI asks instead.
305
- ACC does not grant itself that permission. To let headless agents answer, allow the ACC
306
- command yourself under `permissions.allow` in the client's settings, in the `command(...)`
307
- form its message names.
312
+ because it cannot ask for approval; the client says so on stderr and names
313
+ `permissions.allow` in its settings. The TUI asks instead. The one rule ACC's install adds
314
+ there is described in
315
+ [Antigravity CLI command approval](CONFIGURATION.md#antigravity-cli-command-approval); it was
316
+ captured in the TUI, and print mode with it has not been captured.
308
317
 
309
318
  ## Antigravity never wakes while idle
310
319
 
@@ -322,6 +331,24 @@ Live delivery needs four things, and `acc doctor` shows each:
322
331
  active. A relay ends with its client; nothing is left running after the TUI exits or after
323
332
  `acc uninstall`.
324
333
 
334
+ ## Antigravity wakes and never answers
335
+
336
+ A woken session that stops at an approval prompt answers only once someone approves its
337
+ first ACC command. `acc doctor` prints an `Antigravity CLI inbound:` line with what it found in
338
+ `~/.gemini/antigravity-cli/settings.json`:
339
+
340
+ - **No rule.** Each ACC command waits for approval. ACC's install writes the rule, so it was
341
+ removed since or the install did not reach this file: run `acc install --adapter antigravity`,
342
+ then restart `agy`. Doctor lists this under what to run next.
343
+ - **The rule is present.** The client reads it at startup, so a session started before it was
344
+ added still asks; restart `agy`. If a prompt still appears, check the command the agent
345
+ ran: a path in quotes, or a command wrapped in `sh -c`, matches no rule.
346
+ - **The rule cannot apply.** The path to ACC's wrapper contains a space or a shell
347
+ metacharacter, so it needs quotes, and a quoted first word matches no rule. ACC adds no
348
+ rule and approvals stay manual.
349
+ - **The file cannot be read.** ACC leaves an invalid `settings.json` as it is. Repair it, then
350
+ run `acc install --adapter antigravity` again.
351
+
325
352
  ## Grok shows no injected message
326
353
 
327
354
  Grok discards UserPromptSubmit context. On the observed 1.0.24 client, run public