agents-can-communicate 0.3.1 → 0.4.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/README.md +28 -7
- package/SECURITY.md +1 -1
- package/bin/acc-bootstrap.mjs +5 -54
- package/bin/acc-claude-channel.mjs +8 -175
- package/bin/acc-hook.mjs +4 -133
- package/bin/acc-mcp.mjs +4 -59
- package/bin/acc-update-worker.mjs +8 -0
- package/bin/acc.mjs +5 -39
- package/bin/entrypoints/acc-bootstrap.mjs +47 -0
- package/bin/entrypoints/acc-claude-channel.mjs +149 -0
- package/bin/entrypoints/acc-hook.mjs +58 -0
- package/bin/entrypoints/acc-mcp.mjs +70 -0
- package/bin/entrypoints/acc.mjs +51 -0
- package/bin/entrypoints/claude-channel-stdio.mjs +29 -0
- package/bin/entrypoints/hook-output.mjs +73 -0
- package/docs/ADAPTER_AUTHORING.md +41 -7
- package/docs/ARCHITECTURE.md +62 -11
- package/docs/CAPABILITIES.md +40 -36
- package/docs/CLI.md +143 -25
- package/docs/CONCEPTS.md +13 -6
- package/docs/CONFIGURATION.md +37 -22
- package/docs/DESIGN_DECISIONS.md +16 -11
- package/docs/GETTING_STARTED.md +37 -7
- package/docs/GLOSSARY.md +9 -3
- package/docs/HOW_IT_WORKS.md +32 -11
- package/docs/MCP.md +91 -24
- package/docs/PROTOCOL.md +69 -12
- package/docs/RELEASING.md +28 -10
- package/docs/SECURITY_MODEL.md +45 -13
- package/docs/TROUBLESHOOTING.md +76 -18
- package/docs/UPGRADING.md +119 -0
- package/docs/WHY_ACC.md +5 -4
- package/docs/index.md +8 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/package.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/skills/acc/SKILL.md +106 -5
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/install.mjs +6 -6
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/native-delivery.mjs +2 -1
- package/node_modules/@agents-can-communicate/adapter-codex/certification.json +38 -13
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/certification-provenance.json +220 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-current-binding-product-evidence.json +1549 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-current-binding-product.json +27 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-product-evidence.json +1549 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-product.json +27 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-transport-evidence.json +259 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-local-daemon-transport.json +21 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-current-binding-product-evidence.json +1549 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-current-binding-product.json +27 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-product-evidence.json +1549 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-product.json +27 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-transport-evidence.json +259 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.153.4-local-daemon-transport.json +21 -0
- package/node_modules/@agents-can-communicate/adapter-codex/package.json +14 -2
- package/node_modules/@agents-can-communicate/adapter-codex/plugin/skills/acc/SKILL.md +106 -5
- package/node_modules/@agents-can-communicate/adapter-codex/src/adapter.mjs +26 -44
- package/node_modules/@agents-can-communicate/adapter-codex/src/app-server-client.mjs +70 -17
- package/node_modules/@agents-can-communicate/adapter-codex/src/config-block.mjs +231 -0
- package/node_modules/@agents-can-communicate/adapter-codex/src/hooks.mjs +1 -1
- package/node_modules/@agents-can-communicate/adapter-codex/src/install.mjs +71 -63
- package/node_modules/@agents-can-communicate/adapter-codex/src/native-delivery.mjs +107 -103
- package/node_modules/@agents-can-communicate/adapter-codex/src/native-endpoint.mjs +96 -0
- package/node_modules/@agents-can-communicate/adapter-codex/src/ws-json-rpc.mjs +3 -2
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/gemini-extension.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/skills/acc/SKILL.md +106 -5
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/package.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/src/install.mjs +2 -2
- package/node_modules/@agents-can-communicate/adapter-grok/package.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-grok/plugin/skills/acc/SKILL.md +106 -5
- package/node_modules/@agents-can-communicate/adapter-grok/src/install.mjs +2 -2
- package/node_modules/@agents-can-communicate/adapter-kimi/package.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-kimi/plugin/skills/acc/SKILL.md +106 -5
- package/node_modules/@agents-can-communicate/adapter-kimi/src/hooks.mjs +1 -1
- package/node_modules/@agents-can-communicate/adapter-kimi/src/install.mjs +2 -2
- package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-sdk/src/capabilities.mjs +5 -0
- package/node_modules/@agents-can-communicate/adapter-sdk/src/context-projector.mjs +26 -4
- package/node_modules/@agents-can-communicate/adapter-sdk/src/decision-text.mjs +19 -0
- package/node_modules/@agents-can-communicate/adapter-sdk/src/hook-shim.mjs +5 -3
- package/node_modules/@agents-can-communicate/adapter-sdk/src/index.mjs +1 -0
- package/node_modules/@agents-can-communicate/adapter-sdk/src/native-delivery.mjs +9 -2
- package/node_modules/@agents-can-communicate/adapter-sdk/src/native-vocabulary.mjs +2 -6
- package/node_modules/@agents-can-communicate/adapter-sdk/src/session-binding.mjs +29 -9
- package/node_modules/@agents-can-communicate/adapter-sdk/src/toml-block.mjs +8 -6
- package/node_modules/@agents-can-communicate/cli/package.json +4 -2
- package/node_modules/@agents-can-communicate/cli/src/args.mjs +49 -22
- package/node_modules/@agents-can-communicate/cli/src/doctor-command.mjs +11 -4
- package/node_modules/@agents-can-communicate/cli/src/git-probe.mjs +9 -3
- package/node_modules/@agents-can-communicate/cli/src/help.mjs +109 -14
- package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +22 -4
- package/node_modules/@agents-can-communicate/cli/src/main.mjs +35 -12
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/activation.mjs +110 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/command.mjs +63 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/download.mjs +71 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/entry.mjs +110 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/generation.mjs +167 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/install.mjs +73 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/launchers.mjs +60 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/leases.mjs +60 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/location.mjs +55 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/mutex.mjs +145 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/policy.mjs +4 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/refresh.mjs +40 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/schedule.mjs +21 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/state.mjs +122 -0
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/worker.mjs +65 -0
- package/node_modules/@agents-can-communicate/cli/src/session-owner.mjs +33 -108
- package/node_modules/@agents-can-communicate/cli/src/update-command.mjs +25 -7
- package/node_modules/@agents-can-communicate/core/package.json +1 -1
- package/node_modules/@agents-can-communicate/core/src/attention.mjs +3 -0
- package/node_modules/@agents-can-communicate/core/src/claims.mjs +13 -8
- package/node_modules/@agents-can-communicate/core/src/conversations.mjs +9 -25
- package/node_modules/@agents-can-communicate/core/src/decision-changes.mjs +36 -0
- package/node_modules/@agents-can-communicate/core/src/decision-state.mjs +42 -0
- package/node_modules/@agents-can-communicate/core/src/delivery-bindings.mjs +11 -4
- package/node_modules/@agents-can-communicate/core/src/inbox.mjs +48 -17
- package/node_modules/@agents-can-communicate/core/src/intents.mjs +35 -15
- package/node_modules/@agents-can-communicate/core/src/materialisation.mjs +7 -5
- package/node_modules/@agents-can-communicate/core/src/message-pages.mjs +75 -0
- package/node_modules/@agents-can-communicate/core/src/next-turn-delivery.mjs +31 -0
- package/node_modules/@agents-can-communicate/core/src/session-opening.mjs +128 -0
- package/node_modules/@agents-can-communicate/core/src/sessions.mjs +58 -132
- package/node_modules/@agents-can-communicate/core/src/sync.mjs +31 -2
- package/node_modules/@agents-can-communicate/delivery-router/package.json +1 -1
- package/node_modules/@agents-can-communicate/delivery-router/src/refresh-binding.mjs +38 -0
- package/node_modules/@agents-can-communicate/delivery-router/src/router.mjs +86 -10
- package/node_modules/@agents-can-communicate/hook-runner/package.json +1 -1
- package/node_modules/@agents-can-communicate/hook-runner/src/client-version.mjs +1 -0
- package/node_modules/@agents-can-communicate/hook-runner/src/native-binding.mjs +6 -4
- package/node_modules/@agents-can-communicate/hook-runner/src/native-retirement.mjs +48 -0
- package/node_modules/@agents-can-communicate/hook-runner/src/process-table.mjs +1 -1
- package/node_modules/@agents-can-communicate/hook-runner/src/runner.mjs +175 -67
- package/node_modules/@agents-can-communicate/hook-runner/src/session-lifecycle.mjs +13 -0
- package/node_modules/@agents-can-communicate/installer/package.json +1 -1
- package/node_modules/@agents-can-communicate/installer/src/apply.mjs +17 -2
- package/node_modules/@agents-can-communicate/installer/src/bootstrap-runtime.mjs +11 -5
- package/node_modules/@agents-can-communicate/installer/src/detect.mjs +1 -1
- package/node_modules/@agents-can-communicate/installer/src/index.mjs +1 -0
- package/node_modules/@agents-can-communicate/installer/src/live-policy.mjs +21 -0
- package/node_modules/@agents-can-communicate/installer/src/native-activation.mjs +20 -6
- package/node_modules/@agents-can-communicate/installer/src/ownership.mjs +10 -4
- package/node_modules/@agents-can-communicate/installer/src/plan.mjs +3 -3
- package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
- package/node_modules/@agents-can-communicate/mcp-server/src/protocol.mjs +85 -0
- package/node_modules/@agents-can-communicate/mcp-server/src/resources.mjs +3 -2
- package/node_modules/@agents-can-communicate/mcp-server/src/server.mjs +59 -57
- package/node_modules/@agents-can-communicate/mcp-server/src/tools.mjs +47 -33
- package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
- package/node_modules/@agents-can-communicate/protocol/src/conversations.mjs +3 -0
- package/node_modules/@agents-can-communicate/protocol/src/decision-changes.mjs +15 -0
- package/node_modules/@agents-can-communicate/protocol/src/index.mjs +3 -1
- package/node_modules/@agents-can-communicate/protocol/src/schema.mjs +14 -5
- package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
- package/node_modules/@agents-can-communicate/storage-filesystem/src/atomic-json.mjs +5 -1
- package/node_modules/@agents-can-communicate/storage-filesystem/src/deadline.mjs +7 -0
- package/node_modules/@agents-can-communicate/storage-filesystem/src/index.mjs +2 -0
- package/node_modules/@agents-can-communicate/storage-filesystem/src/session-read.mjs +25 -0
- package/node_modules/@agents-can-communicate/storage-filesystem/src/store.mjs +28 -25
- package/package.json +2 -1
package/docs/CAPABILITIES.md
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
Use this page to set expectations after installation. Integration means ACC can introduce
|
|
4
4
|
peer awareness and coordination instructions; it does not guarantee what a model will do
|
|
5
5
|
with them. Delivery also varies independently from awareness. The durable inbox works for
|
|
6
|
-
every participant, supported exact versions may add next-turn delivery, and
|
|
7
|
-
experimental Claude Code
|
|
6
|
+
every participant, supported exact versions may add next-turn delivery, and the
|
|
7
|
+
experimental Codex LocalDaemon and Claude Code Channel paths can deliver while a session is idle.
|
|
8
8
|
|
|
9
9
|
Capability honesty separates four questions that are easy to collapse:
|
|
10
10
|
|
|
@@ -16,8 +16,8 @@ Capability honesty separates four questions that are easy to collapse:
|
|
|
16
16
|
kind?
|
|
17
17
|
4. **Fallback** — what durable path remains when any earlier answer is no?
|
|
18
18
|
|
|
19
|
-
A source method or vendor documentation is not certification.
|
|
20
|
-
platforms degrade to false. No weaker session inherits a stronger peer's capability.
|
|
19
|
+
A source method or vendor documentation is not certification. Uncaptured hook versions and
|
|
20
|
+
unsupported platforms degrade to false. Native minimum-based eligibility is separate. No weaker session inherits a stronger peer's capability.
|
|
21
21
|
|
|
22
22
|
Run `acc doctor` in the project when observed behavior differs from this page. It reports
|
|
23
23
|
the installed client version, platform, effective capability, and fallback instead of
|
|
@@ -42,24 +42,23 @@ Passing evidence currently ships for these exact versions on `darwin-arm64`:
|
|
|
42
42
|
Every other capability in the closed shape defaults to false, including session resume,
|
|
43
43
|
child sessions, startup or safe-point injection, and before-read guards.
|
|
44
44
|
|
|
45
|
-
The
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
withdrawn; the row below says why.
|
|
45
|
+
The native rows remain `no` for the older exact hook versions in this matrix.
|
|
46
|
+
Separate installed-client captures establish Codex `livePush` on 0.152.1 and
|
|
47
|
+
0.153.4, and Claude Code `livePush` plus `replyRoute` on 2.1.258 and 2.1.260.
|
|
48
|
+
Native eligibility uses the captured platform minimum, a current feature probe,
|
|
49
|
+
and an exact per-session handshake. It is experimental and requires recipient
|
|
50
|
+
opt-in. Codex replies through `acc reply`; its native `replyRoute` remains false.
|
|
52
51
|
|
|
53
52
|
The limitations belong next to the adapters they affect:
|
|
54
53
|
|
|
55
54
|
| Adapter | Exact limitation and evidence |
|
|
56
55
|
|---|---|
|
|
57
|
-
| Codex | 0.147.0 next-turn
|
|
56
|
+
| Codex | Exact 0.147.0 next-turn context 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. |
|
|
58
57
|
| Claude Code | 2.1.233 next-turn delivery waits for the next user prompt. A 2.1.258 Channel capture proved idle offer, busy queue-after-turn, explicit reply, duplicate suppression, and durable fallback, so `delivery.livePush` and `delivery.replyRoute` are live capabilities behind the native contract (experimental, off until opted in; Claude's development-channel warning is vendor-owned and visible). |
|
|
59
58
|
| Gemini CLI | Only 0.57.0 has package-shipped next-turn certification. 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. |
|
|
60
59
|
| Grok | 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. |
|
|
61
60
|
| Kimi Code | 0.36.1 has next-turn and guard evidence, 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. |
|
|
62
|
-
| Generic MCP |
|
|
61
|
+
| Generic MCP | As a receiver, tool polling is not next-turn injection, live push, or a native reply route. It has no write guard or client-lifecycle evidence. Outgoing messages may use an eligible recipient's opted-in native adapter. |
|
|
63
62
|
|
|
64
63
|
`certification.json` beside each adapter is machine-readable. `COMPATIBILITY.md` records the
|
|
65
64
|
captured client behavior, including what could not be observed.
|
|
@@ -71,25 +70,28 @@ would publish a generation-bound binding with `availableModes`, `clientVersion`,
|
|
|
71
70
|
`livePolicy`, and `leaseUntil`. `acc status --json` reports these as `deliveryBindings`
|
|
72
71
|
with a computed `reachable` boolean while keeping the opaque endpoint private.
|
|
73
72
|
|
|
74
|
-
The router requires exactly one current eligible generation. No binding,
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
The router requires exactly one current eligible generation. No binding, several live
|
|
74
|
+
sessions for one participant, and an adapter refusal keep delivery on the durable
|
|
75
|
+
fallback. An expired lease may be revalidated by an adapter's optional refresh method;
|
|
76
|
+
failure leaves the message queued. Busy behavior belongs to the transport: Claude's Channel can accept a
|
|
77
77
|
message while the target is busy and queue it until the current turn finishes; an adapter
|
|
78
78
|
that instead refuses with `recipient_busy` leaves the message on the durable path.
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
channel that has not yet noticed cannot extend something the session already retired.
|
|
80
|
+
An endpoint may renew its lease, or an adapter may revalidate that exact endpoint on
|
|
81
|
+
demand without a client heartbeat. Retirement is final: neither route may revive a
|
|
82
|
+
retired binding, a closed session or an old generation. Delivery lease refresh does
|
|
83
|
+
not renew participant presence.
|
|
85
84
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
next-turn
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
85
|
+
On darwin-arm64, Codex LocalDaemon and Claude Code Channel have captured
|
|
86
|
+
experimental live delivery. Other adapters retain their separately certified
|
|
87
|
+
next-turn paths or inbox polling. Linux and other uncaptured platforms retain
|
|
88
|
+
the durable inbox; these captures establish no new hook capabilities there.
|
|
89
|
+
|
|
90
|
+
Codex's 120-second delivery lease can refresh on demand for the same live endpoint;
|
|
91
|
+
it does not extend the 24-hour participant presence limit. A TUI exit can leave its
|
|
92
|
+
daemon thread loaded and able to execute opted-in messages. Actual thread teardown,
|
|
93
|
+
including explicit archive, runs `SessionEnd` and retires the binding. Turning ACC
|
|
94
|
+
delivery off prevents new offers even while that thread remains loaded.
|
|
93
95
|
|
|
94
96
|
## Recipient policy
|
|
95
97
|
|
|
@@ -102,14 +104,16 @@ policy:
|
|
|
102
104
|
| `actionable` | questions, requests, answers, decisions, and addressed handoffs may use live push; notes wait for the next turn |
|
|
103
105
|
| `all` | every addressed message kind may use live push |
|
|
104
106
|
|
|
105
|
-
The default is `off`. `acc install --delivery actionable|all`
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
107
|
+
The default is `off`. `acc install --delivery actionable|all` records recipient consent.
|
|
108
|
+
Current activation remains off when the platform, captured minimum or feature probe
|
|
109
|
+
does not qualify; that temporary failure does not erase the requested policy. Each
|
|
110
|
+
session must pass its own generation-bound handshake. An adapter using the installation
|
|
111
|
+
record rereads consent at hooks and before offers, so a long-running vendor process
|
|
112
|
+
cannot retain permission through an old environment value or binding snapshot.
|
|
113
|
+
|
|
114
|
+
For an adapter using recorded consent, `--delivery off` and uninstall prevent new
|
|
115
|
+
native offers. They cannot withdraw a submission already accepted by the vendor queue. Ordinary hook capabilities still
|
|
116
|
+
require exact-version certification. Room messages are never live-push candidates.
|
|
113
117
|
|
|
114
118
|
## Fallback
|
|
115
119
|
|
package/docs/CLI.md
CHANGED
|
@@ -12,24 +12,62 @@ acc help
|
|
|
12
12
|
acc version
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
+
Use `acc <command> --help` (or `-h`) and `acc help <command>` for that command's
|
|
16
|
+
required, optional, repeatable and flag options, accepted values, and usage notes.
|
|
17
|
+
For example, `acc work --help` lists intent modes, and `acc finish --help` lists
|
|
18
|
+
handoff statuses. `acc config --help` lists its subcommands;
|
|
19
|
+
`acc config init --help` and `acc help config init` describe initialization.
|
|
20
|
+
|
|
21
|
+
Add `--json` to receive the command description as structured data: `name`,
|
|
22
|
+
`summary`, `required`, `optional`, `repeated`, `flags`, `subcommands`, `choices`,
|
|
23
|
+
and `notes`, plus `subcommand` when selected. General `acc help --json` keeps its
|
|
24
|
+
grouped `commands` result. Help requires no session, workspace discovery, or
|
|
25
|
+
runtime storage, and does not execute the described command. A help-looking
|
|
26
|
+
option value remains data: `--body --help` sends the literal body `--help`.
|
|
27
|
+
|
|
15
28
|
## Coordinate from a session
|
|
16
29
|
|
|
17
30
|
| Command | Required | Optional |
|
|
18
31
|
|---|---|---|
|
|
19
|
-
| `acc status` | — | `--participant`, `--all` |
|
|
20
|
-
| `acc sync` | — | `--session`, `--cursor`, `--limit`, `--scope delta|full` |
|
|
32
|
+
| `acc status` | — | `--session`, `--generation`, `--participant`, `--all` |
|
|
33
|
+
| `acc sync` | — | `--session`, `--generation`, `--cursor`, `--limit`, `--scope delta|full|history`, `--type`, `--message`, `--current` |
|
|
21
34
|
| `acc work` | `--summary` unless `--clear` | `--session`, `--generation`, `--mode`, `--state`, repeated `--hint`, `--clear` |
|
|
22
35
|
| `acc claim` | `--resource` | `--session`, `--generation`, `--mode`, `--enforcement`, `--reason`, `--lease` |
|
|
23
|
-
| `acc release` | `--claim` or `--resource` | `--session`, `--generation`, `--authority
|
|
24
|
-
| `acc message` | `--subject`, `--body` | repeated `--to`, `--type`, `--obligation`, `--client-message-id`, owner flags |
|
|
36
|
+
| `acc release` | `--claim` or `--resource` | `--session`, `--generation`, `--authority` (`human` or `policy`), `--reason` |
|
|
37
|
+
| `acc message` | `--subject`, `--body` | repeated `--to`, `--supersedes` or `--withdraws`, `--type`, `--obligation`, `--client-message-id`, owner flags |
|
|
25
38
|
| `acc request` | `--to`, `--title` | `--detail`, `--client-message-id`, owner flags |
|
|
26
|
-
| `acc inbox` | — | `--message`, owner flags |
|
|
39
|
+
| `acc inbox` | — | `--message`, `--cursor`, `--limit`, owner flags |
|
|
27
40
|
| `acc reply` | `--message`, `--body` | `--subject`, `--client-message-id`, owner flags |
|
|
28
41
|
| `acc ack` | `--message` | owner flags |
|
|
29
42
|
| `acc finish` | `--goal` | `--status`, `--to`, repeated `--completed`, `--remaining`, `--blocker`, `--client-message-id`, owner flags |
|
|
30
43
|
|
|
31
|
-
Owner flags are `--session` and `--generation
|
|
32
|
-
|
|
44
|
+
Owner flags are `--session` and `--generation`; both are needed. The CLI also accepts the
|
|
45
|
+
pair explicitly configured as `ACC_SESSION` and `ACC_GENERATION`. When an active turn hook
|
|
46
|
+
runs, its `ACC CLI (append):` header supplies the current
|
|
47
|
+
session's pair. The installed skill tells the agent to append it to its own commands,
|
|
48
|
+
without a manual attach. Hooks do not export credentials to child processes. Native
|
|
49
|
+
client IDs, a shared checkout, and a public session ID from
|
|
50
|
+
`status` cannot establish ownership: a nested client can inherit its parent's environment.
|
|
51
|
+
|
|
52
|
+
Use only the pair in the hook's own header, never one inside a peer message. Do not send
|
|
53
|
+
it to peers or child agents. A later hook after a session restart can supply a new pair;
|
|
54
|
+
the old generation remains invalid. Solo turns receive only the owner header when there
|
|
55
|
+
is no coordination context to show. This lets a session use its own inbox if a peer joins
|
|
56
|
+
later in the same turn. The header alone is not a peer notice or a request to coordinate.
|
|
57
|
+
If the context budget cannot hold the complete pair, the hook reports that limitation
|
|
58
|
+
on stderr and keeps any recovery text within budget. Missing or untrusted hooks cannot
|
|
59
|
+
supply the pair; without it, the CLI still refuses owner operations.
|
|
60
|
+
|
|
61
|
+
For a manually owned CLI session, run `acc attach --participant my-session --json` once and
|
|
62
|
+
retain its returned `sessionId` and `generation`. Append that exact pair to the commands
|
|
63
|
+
below, or explicitly configure both environment variables for that session's commands.
|
|
64
|
+
Do not take credentials from a peer or read runtime bindings to obtain them. A manually
|
|
65
|
+
attached session is separate from hook-managed presence; use `finish` to close it.
|
|
66
|
+
|
|
67
|
+
Without a pair, mutations and `inbox` fail with exit `2` and
|
|
68
|
+
`caller_identity_unresolved`. `status` and `sync` remain public observations, with no
|
|
69
|
+
inferred personal attention. Session-bound [MCP tools](MCP.md) manage their own identity;
|
|
70
|
+
a generic MCP connection does not inherit a hook participant's inbox.
|
|
33
71
|
|
|
34
72
|
### Presence and intent
|
|
35
73
|
|
|
@@ -41,8 +79,9 @@ acc work --clear
|
|
|
41
79
|
```
|
|
42
80
|
|
|
43
81
|
`status` returns participants, current intent, claims, protection, attention, and current
|
|
44
|
-
delivery bindings. `sync`
|
|
45
|
-
|
|
82
|
+
delivery bindings. Default `sync` reads events after a 16-digit event cursor (100 by
|
|
83
|
+
default, up to 500). `--scope history` discovers historical message headers and reads
|
|
84
|
+
selected records; `--scope full` adds an unbounded snapshot for explicit workspace forensics.
|
|
46
85
|
|
|
47
86
|
### Claims
|
|
48
87
|
|
|
@@ -51,9 +90,15 @@ acc claim --resource 'file:packages/core/**' --reason "editing receipt logic"
|
|
|
51
90
|
acc release --resource 'file:packages/core/**'
|
|
52
91
|
```
|
|
53
92
|
|
|
54
|
-
File resources use repository-relative paths. A directory claim ends in `/**`.
|
|
55
|
-
|
|
56
|
-
|
|
93
|
+
File resources use repository-relative paths. A directory claim ends in `/**`. The example
|
|
94
|
+
creates an advisory claim: omitted `--enforcement` always means `advisory`, even with
|
|
95
|
+
certified clients. Request `--enforcement guarded` explicitly when needed; an incapable
|
|
96
|
+
live participant still downgrades workspace protection. MCP claims are always advisory.
|
|
97
|
+
|
|
98
|
+
Exit code `5` means a conflict. Ordinary sessions release only their own claims. Releasing
|
|
99
|
+
another owner's claim requires `--authority human` or `--authority policy`, identifying the
|
|
100
|
+
actual human decision or approved policy that permits the release; explain it with
|
|
101
|
+
`--reason`. A peer's request alone is not force-release authority.
|
|
57
102
|
|
|
58
103
|
### Messages and requests
|
|
59
104
|
|
|
@@ -69,7 +114,7 @@ acc request --to codex --title "review receipt wording" \
|
|
|
69
114
|
`--to` takes a client name - `codex`, `claude_code`, `gemini_cli` - while exactly one
|
|
70
115
|
session of that client is here, and the exact participant id from `acc status --json`
|
|
71
116
|
otherwise. Two sessions of one client are refused by name rather than guessed between, the
|
|
72
|
-
same way
|
|
117
|
+
same way an ambiguous recipient must be named explicitly. The recorded message always names the participant, never the
|
|
73
118
|
client it was reached through.
|
|
74
119
|
|
|
75
120
|
By default a hooked participant id is derived from that client's session id. It remains
|
|
@@ -81,7 +126,8 @@ Set `ACC_PARTICIPANT` when the recipient must keep one stable address across con
|
|
|
81
126
|
decision may explicitly use `--obligation acknowledge`. `answer` is created only by
|
|
82
127
|
`reply`, and `handoff` only by `finish`.
|
|
83
128
|
|
|
84
|
-
No `--to` creates a room message where the kind allows it
|
|
129
|
+
No `--to` creates a room message where the kind allows it, except decision changes
|
|
130
|
+
that inherit explicit recipients from their targets. Addressed messages create a
|
|
85
131
|
separate receipt for each recipient. `request` is convenience for one addressed `request`
|
|
86
132
|
message with a reply obligation; it creates no execution record.
|
|
87
133
|
|
|
@@ -101,6 +147,10 @@ Human output starts with `recorded message_x`. A transport failure after that co
|
|
|
101
147
|
not change the command exit code. Reuse an explicit `--client-message-id` after an
|
|
102
148
|
uncertain result to recover the same logical message.
|
|
103
149
|
|
|
150
|
+
`reply` additionally returns `receipt`: the original message id, the replying participant,
|
|
151
|
+
and state `acknowledged`. Its `message` and `delivery` describe the outgoing answer.
|
|
152
|
+
Human output distinguishes `recorded <reply-id>` from `acknowledged <original-id>`.
|
|
153
|
+
|
|
104
154
|
### Inbox, reply, and acknowledgement
|
|
105
155
|
|
|
106
156
|
```bash
|
|
@@ -110,10 +160,56 @@ acc reply --message message_x --body "Yes. Use offered."
|
|
|
110
160
|
acc ack --message message_y
|
|
111
161
|
```
|
|
112
162
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
163
|
+
Without `--message`, inbox returns `{items, nextCursor}`. Each item has a `message`
|
|
164
|
+
summary and its `receipt`; listing never returns bodies or changes receipts. Summaries
|
|
165
|
+
include the complete message/thread/sender ids, kind, obligation, timestamp, reply link,
|
|
166
|
+
subject (up to 160 UTF-8 bytes), `bodyBytes`, `artifactCount`, and untrusted attribution.
|
|
167
|
+
Bodies, artifact details, handoff payloads, and recipient lists require an exact read.
|
|
168
|
+
|
|
169
|
+
Pages are newest first (descending message id breaks timestamp ties), default to 20 items,
|
|
170
|
+
and contain at most 12,000 bytes of formatted page JSON, excluding the CLI envelope.
|
|
171
|
+
`--limit` accepts 1..500 but cannot raise the byte ceiling. Continue with
|
|
172
|
+
`acc inbox --cursor <nextCursor>` until it is `null`. The cursor is a complete message id,
|
|
173
|
+
not an offset; reading or acknowledging it does not shift the next page. These are live
|
|
174
|
+
pages: omit the cursor to see new arrivals. An unknown or foreign cursor is an error.
|
|
175
|
+
|
|
176
|
+
`--message <id>` returns the existing one-item array with the complete message/receipt
|
|
177
|
+
pair, advancing that participant's receipt to `retrieved` when needed. It cannot be
|
|
178
|
+
combined with `--cursor` or `--limit`. An exact id also reads an acknowledged message,
|
|
179
|
+
preserving its receipt, timestamp, and event history.
|
|
180
|
+
Use the original message id to inspect acknowledgement; the outgoing reply belongs to
|
|
181
|
+
its recipient's inbox. Resolved messages stay out of the ordinary inbox.
|
|
182
|
+
|
|
183
|
+
Reply creates an `answer` in the same thread and acknowledges the original atomically.
|
|
184
|
+
`ack` acknowledges without writing an answer and has no state override.
|
|
185
|
+
|
|
186
|
+
### Historical recovery
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
acc sync --scope history --type handoff --json
|
|
190
|
+
acc sync --scope history --type handoff --cursor message_x --json
|
|
191
|
+
acc sync --scope history --message message_y --json
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
History returns `{scope: "history", view: "summary", items, nextCursor}` with the same
|
|
195
|
+
summary fields, ordering, page limits, and message-id cursors as inbox. `--type` accepts
|
|
196
|
+
any message kind and filters before pagination; keep the same filter between pages.
|
|
197
|
+
This public workspace observation includes records from before your session joined.
|
|
198
|
+
Exact history reads return `view: "message"` and one complete message in `items`,
|
|
199
|
+
without changing any receipt. Do not combine `--message` with type, cursor, or limit;
|
|
200
|
+
message and type are valid only in history scope. Decision reads also include `decisionStatus`. Use
|
|
201
|
+
`acc sync --scope history --type decision --current --json` for terminal decisions
|
|
202
|
+
and withdrawals; keep these filters when paging. Exact reads cannot use `--current`.
|
|
203
|
+
`current` means no explicit successor, not truth or consensus.
|
|
204
|
+
|
|
205
|
+
To change a decision, send another `acc message --type decision` with repeated
|
|
206
|
+
`--supersedes <message-id>` or `--withdraws <message-id>` (1..16 unique IDs; exclusive).
|
|
207
|
+
Use subject/body for the new position or withdrawal reason. Changes inherit the target
|
|
208
|
+
recipients and authors, including offline participants; `--to` adds recipients.
|
|
209
|
+
Any owned participant can record an attributed change. Multiple successor branches
|
|
210
|
+
remain conflicted until a new change explicitly references all current alternatives.
|
|
211
|
+
Old records leave ordinary inbox/automatic attention without any receipt change;
|
|
212
|
+
exact inbox and history still recover them. See [decision lifecycle](PROTOCOL.md#decision-lifecycle).
|
|
117
213
|
|
|
118
214
|
### Handoff
|
|
119
215
|
|
|
@@ -136,7 +232,7 @@ external AI client. An addressed handoff requires acknowledgement; a room handof
|
|
|
136
232
|
| `acc doctor` | `--home`, `--repair` |
|
|
137
233
|
| `acc config init` | `--yes`, `--force` |
|
|
138
234
|
| `acc config validate` | — |
|
|
139
|
-
| `acc update` | `--apply` |
|
|
235
|
+
| `acc update` | `--check`, `--auto on\|off`, `--pin VERSION\|none`, `--apply` (alias) |
|
|
140
236
|
| `acc help` | — |
|
|
141
237
|
| `acc version` | — |
|
|
142
238
|
|
|
@@ -147,12 +243,34 @@ terminal asks one default-No question per eligible client, and on a non-interact
|
|
|
147
243
|
`--dry-run` it keeps fresh clients off. A recorded opt-in is kept on upgrade. If the detected
|
|
148
244
|
client cannot receive native delivery - unsupported, below the captured minimum, a
|
|
149
245
|
prerelease, known-bad, a wrong platform, or an unsupported shell - installation keeps the
|
|
150
|
-
effective policy off and prints the reason.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
246
|
+
effective policy off and prints the reason. Claude Code shell activation writes an owned
|
|
247
|
+
zsh PATH block and a shim that `exec`s the real client; `ACC_BYPASS=1` bypasses that
|
|
248
|
+
activation. Codex LocalDaemon delivery uses recorded installation consent without changing
|
|
249
|
+
ordinary launch arguments. Its opt-in remains active when shim variables are absent or
|
|
250
|
+
bypassed; `acc install --adapter codex --delivery off` disables new native offers. ACC never
|
|
251
|
+
starts or stops the vendor daemon. See [delivery consent](CONFIGURATION.md#keep-delivery-consent-user-owned).
|
|
252
|
+
|
|
253
|
+
A normal `acc install` enables automatic updates. A background worker checks stable releases
|
|
254
|
+
at most once a day, downloads and verifies a separate runtime, then refreshes installed
|
|
255
|
+
integrations and skills after ACC process leases and native binding holds clear. ACC leases
|
|
256
|
+
require confirmed process exit; a native binding can clear on observed SessionEnd even
|
|
257
|
+
while its vendor daemon remains alive, or on confirmed process death. Unknown PIDs remain
|
|
258
|
+
holds. `finish`, presence TTL, and delivery off are not observed native end. Hooks do not
|
|
259
|
+
wait for network work. `ACC_NO_UPDATE_CHECK=1` disables update networking and background
|
|
260
|
+
scheduling.
|
|
261
|
+
|
|
262
|
+
`acc update` requests the update immediately; it reports a pending update when a running or
|
|
263
|
+
unidentified client prevents activation. `--check` only checks and cannot be combined with
|
|
264
|
+
settings changes. `--auto off` disables background updates, and `--auto on` enables them.
|
|
265
|
+
`--pin 0.4.0` holds an exact stable version; `--pin none` follows stable releases. A pin
|
|
266
|
+
cannot downgrade the active runtime. The old `--apply` flag remains accepted.
|
|
267
|
+
|
|
268
|
+
Failed downloads keep the working runtime. A failed integration refresh exits with code
|
|
269
|
+
`4`, names the failed adapter and configuration error, and keeps workspace admission closed.
|
|
270
|
+
Fix the reported configuration problem, then run `acc update` to finish it. `acc doctor`
|
|
271
|
+
reports the update policy and pending notice. Native clients may still require hook trust
|
|
272
|
+
or activation review. See [Upgrading](UPGRADING.md) for the initial 0.3.1 transition and
|
|
273
|
+
recovery details.
|
|
156
274
|
|
|
157
275
|
## Integrate a client lifecycle
|
|
158
276
|
|
package/docs/CONCEPTS.md
CHANGED
|
@@ -79,6 +79,12 @@ Message kinds describe the conversation:
|
|
|
79
79
|
An **obligation** is the communication response owed by a recipient. A request is not an
|
|
80
80
|
order, and a reply is not proof that work is complete.
|
|
81
81
|
|
|
82
|
+
A decision can explicitly replace or withdraw earlier decisions. The old records stay
|
|
83
|
+
attributed and recoverable, while current reads and reminders follow the recorded links.
|
|
84
|
+
Any peer may record a change; competing branches remain visible until explicitly joined.
|
|
85
|
+
A current decision is a recorded position, not agreement or authority. See
|
|
86
|
+
[decision lifecycle](PROTOCOL.md#decision-lifecycle).
|
|
87
|
+
|
|
82
88
|
## Threads keep the exchange together
|
|
83
89
|
|
|
84
90
|
The first message is a **thread** root. A reply names the original message and stays in that
|
|
@@ -100,19 +106,20 @@ queued -> offered -> retrieved -> acknowledged
|
|
|
100
106
|
|
|
101
107
|
- `queued`: the durable message and receipt committed;
|
|
102
108
|
- `offered`: ACC or a certified client accepted the delivery bytes, not proof of reading;
|
|
103
|
-
- `retrieved`: the participant fetched the
|
|
109
|
+
- `retrieved`: the participant fetched the body through its inbox, not proof of model attention;
|
|
104
110
|
- `acknowledged`: the participant acknowledged it or replied, not proof of task completion.
|
|
105
111
|
|
|
112
|
+
Listing inbox headers and observing workspace history do not change receipts.
|
|
106
113
|
There is no `seen` receipt. A failed delivery attempt leaves the message queued and
|
|
107
114
|
recoverable rather than creating a terminal failure state.
|
|
108
115
|
|
|
109
116
|
## Durable first, faster delivery second
|
|
110
117
|
|
|
111
|
-
The durable inbox is universal. Exact-version certified adapters may also offer
|
|
112
|
-
the next normal turn.
|
|
113
|
-
experimental live
|
|
114
|
-
reachability
|
|
115
|
-
current
|
|
118
|
+
The durable inbox is universal. Exact-version certified adapters may also offer
|
|
119
|
+
messages at the next normal turn. Codex LocalDaemon and Claude Code Channel add
|
|
120
|
+
experimental live delivery, off by default and subject to recipient policy and
|
|
121
|
+
current reachability. Codex can retain an eligible daemon thread after its terminal
|
|
122
|
+
exits. [Capabilities](CAPABILITIES.md) gives the current limits.
|
|
116
123
|
|
|
117
124
|
## Handoffs preserve explicit context
|
|
118
125
|
|
package/docs/CONFIGURATION.md
CHANGED
|
@@ -6,7 +6,7 @@ as the same operating-system user on the same machine and resolve that same loca
|
|
|
6
6
|
workspace.
|
|
7
7
|
|
|
8
8
|
Create `acc.workspace.json` only for stable workspace identity, roots, or shared
|
|
9
|
-
|
|
9
|
+
context budget. It is optional project configuration that `acc config init` may write
|
|
10
10
|
at your request; runtime state remains in platform app data outside the repository. The
|
|
11
11
|
file never defines agents, messages, execution state, or delivery endpoints. Project map:
|
|
12
12
|
[README](index.md). Terms used below: [Glossary](GLOSSARY.md).
|
|
@@ -18,11 +18,8 @@ file never defines agents, messages, execution state, or delivery endpoints. Pro
|
|
|
18
18
|
Matching ids never connect different machines or OS users.
|
|
19
19
|
- **More than one root.** A monorepo whose apps live in separate directories, or a
|
|
20
20
|
workspace that spans sibling checkouts.
|
|
21
|
-
- **Shared
|
|
22
|
-
|
|
23
|
-
- **Stated expectations.** `requiredAdapters` records which harnesses this project expects
|
|
24
|
-
to be installed, so `acc doctor` can say what is missing rather than leaving a session
|
|
25
|
-
silently uncoordinated.
|
|
21
|
+
- **Shared context budget.** Set the ceiling for supported injected turn context once for
|
|
22
|
+
the workspace.
|
|
26
23
|
|
|
27
24
|
### Define the file
|
|
28
25
|
|
|
@@ -39,10 +36,8 @@ link can point anywhere, including at a file the repository does not control.
|
|
|
39
36
|
"displayName": "Example",
|
|
40
37
|
"roots": ["."],
|
|
41
38
|
"policy": {
|
|
42
|
-
"claimMode": "advisory",
|
|
43
39
|
"contextBudgetBytes": 6000
|
|
44
|
-
}
|
|
45
|
-
"requiredAdapters": []
|
|
40
|
+
}
|
|
46
41
|
}
|
|
47
42
|
```
|
|
48
43
|
|
|
@@ -52,11 +47,16 @@ link can point anywhere, including at a file the repository does not control.
|
|
|
52
47
|
| `workspaceId` | Stable identity, portable id | required |
|
|
53
48
|
| `displayName` | What peers see in a roster | the directory name |
|
|
54
49
|
| `roots` | Directories in this workspace, relative to the config | `["."]` |
|
|
55
|
-
| `policy.claimMode` | `advisory` or `guarded` | `advisory` |
|
|
50
|
+
| `policy.claimMode` | Validated compatibility metadata (`advisory` or `guarded`); does not select claim enforcement | `advisory` |
|
|
56
51
|
| `policy.contextBudgetBytes` | Ceiling on injected turn context, 1–64000 | `6000` |
|
|
57
|
-
| `requiredAdapters` |
|
|
52
|
+
| `requiredAdapters` | Validated compatibility metadata; does not affect `acc doctor` diagnostics | `[]` |
|
|
58
53
|
| `extensions` | Anything else, namespaced by whoever wrote it | `{}` |
|
|
59
54
|
|
|
55
|
+
`policy.claimMode` and `requiredAdapters` are stored but have no claim or doctor effect in
|
|
56
|
+
0.4. CLI claims default to advisory; request `--enforcement guarded` on each claim when
|
|
57
|
+
appropriate, subject to every live participant's certified guard. MCP claims remain
|
|
58
|
+
advisory. Do not use these metadata fields to configure protection or missing-client checks.
|
|
59
|
+
|
|
60
60
|
Roots are refused if they are absolute or escape the workspace. An absolute root is one
|
|
61
61
|
machine's layout committed to a shared repository, and `packages/../../elsewhere` reaches
|
|
62
62
|
outside the boundary the workspace is supposed to be. The check counts path segments, so an
|
|
@@ -98,17 +98,25 @@ Close them, or pass `--force` if you mean it — and restart them afterwards.
|
|
|
98
98
|
<!-- test:illustration asks a person to confirm; there is nobody to ask in a test -->
|
|
99
99
|
```bash
|
|
100
100
|
acc config init # preview, then write after you agree
|
|
101
|
-
acc config validate # read-only;
|
|
101
|
+
acc config validate # read-only; checks acc.workspace.json in the selected directory
|
|
102
102
|
```
|
|
103
103
|
|
|
104
|
+
`init` and `validate` operate only on `acc.workspace.json` directly inside the selected
|
|
105
|
+
`--cwd` directory (the current directory when omitted). Unlike ordinary workspace discovery,
|
|
106
|
+
they do not walk upward. Pass `--cwd` with the directory containing the config you intend
|
|
107
|
+
to inspect or create. A nested `init` can create a new config that shadows an ancestor;
|
|
108
|
+
check the ancestor first.
|
|
109
|
+
|
|
104
110
|
`init` shows the exact file it would write and waits. In a non-interactive run — a pipe, a
|
|
105
111
|
CI job, an agent — there is nobody to ask, so it refuses unless you pass `--yes`. It never
|
|
106
112
|
overwrites an existing config: a committed identity is shared by everyone on the project,
|
|
107
113
|
and replacing it on a mistyped command would split one workspace into two.
|
|
108
114
|
|
|
109
|
-
`validate` only reads.
|
|
110
|
-
|
|
111
|
-
|
|
115
|
+
`validate` only reads. If that selected directory has no config, it reports
|
|
116
|
+
`no acc.workspace.json in selected directory; ancestors not checked`.
|
|
117
|
+
The JSON result returns default config metadata for that missing local file. Ordinary
|
|
118
|
+
commands may still discover an ancestor config; this is not an effective-policy report.
|
|
119
|
+
Run validation with `--cwd` set to that ancestor directory to check its file.
|
|
112
120
|
|
|
113
121
|
## Keep delivery consent user-owned
|
|
114
122
|
|
|
@@ -129,6 +137,13 @@ reports next-turn or inbox fallback. Each later session must also pass its own
|
|
|
129
137
|
generation-bound handshake. A failed session handshake clears or refuses that binding and
|
|
130
138
|
reports degraded reachability; it does not rewrite the installed consent.
|
|
131
139
|
|
|
140
|
+
Codex LocalDaemon delivery separately requires macOS arm64, Codex 0.152.1 or newer, a
|
|
141
|
+
current feature probe, and exact thread, canonical cwd, process, version and protocol
|
|
142
|
+
checks. Its daemon must already be running; ACC never starts or stops it. Codex reads
|
|
143
|
+
consent from the installation record, not a shell-shim variable. Unavailable or ineligible
|
|
144
|
+
sessions retain durable inbox fallback. Use `acc install --adapter codex --delivery off`
|
|
145
|
+
to stop new native offers; bypassing a shim does not disable that recorded opt-in.
|
|
146
|
+
|
|
132
147
|
## Override local paths and identity
|
|
133
148
|
|
|
134
149
|
Nothing in `acc.workspace.json` says where state is stored, and nothing there can — that is
|
|
@@ -137,17 +152,17 @@ that resolves inside a workspace.
|
|
|
137
152
|
|
|
138
153
|
| Variable | Purpose |
|
|
139
154
|
|---|---|
|
|
140
|
-
| `ACC_DATA_HOME` |
|
|
141
|
-
| `ACC_CONFIG_HOME` |
|
|
142
|
-
| `ACC_CACHE_HOME` |
|
|
155
|
+
| `ACC_DATA_HOME` | Base directory under which ACC creates `acc/` for runtime and coordination state. Defaults: `~/Library/Application Support` on macOS; `~/.local/share` on Linux, or `XDG_DATA_HOME` |
|
|
156
|
+
| `ACC_CONFIG_HOME` | Parsed and validated path override; no current configuration-storage consumer |
|
|
157
|
+
| `ACC_CACHE_HOME` | Parsed and validated path override; no current cache-storage consumer |
|
|
143
158
|
| `ACC_PARTICIPANT` | Which participant a session belongs to, when the client does not say |
|
|
144
159
|
| `ACC_WORKSPACE_ROOT` | The project to work in, instead of discovering one from the working directory. Absolute, or it is refused |
|
|
145
|
-
| `ACC_SESSION` · `ACC_GENERATION` |
|
|
160
|
+
| `ACC_SESSION` · `ACC_GENERATION` | Explicit CLI owner credentials, supplied together by the operator for this session. Hooks do not set them. A public session ID alone never resolves a generation; see [CLI ownership](CLI.md#coordinate-from-a-session) |
|
|
146
161
|
| `ACC_MCP_PARTICIPANT` | Who `acc-mcp` takes part as. `mcp` by default |
|
|
147
162
|
| `ACC_MCP_WORKSPACE` | The project `acc-mcp` joins. Without it the server takes the directory the client launched it in, which is rarely the project |
|
|
148
|
-
| `ACC_NO_UPDATE_CHECK=1` |
|
|
163
|
+
| `ACC_NO_UPDATE_CHECK=1` | Disables update networking and background scheduling; manual recovery of an already downloaded update remains available |
|
|
149
164
|
| `ACC_PROBE_TIMEOUT_MS` | How long to wait for a client to print its version. Three seconds by default: generous on an idle machine, and not always enough on a busy one, where a client that overruns it is reported as not installed |
|
|
150
|
-
| `ACC_NATIVE_DELIVERY_POLICY` |
|
|
151
|
-
| `ACC_BYPASS=1` |
|
|
165
|
+
| `ACC_NATIVE_DELIVERY_POLICY` | Owned shell-bootstrap consent, currently used by Claude Code. The shim sets `off`, `actionable`, or `all`; missing/invalid values mean off for that route. Codex instead reads recorded installation consent, even when this variable is absent |
|
|
166
|
+
| `ACC_BYPASS=1` | Bypasses owned shell activation, currently Claude Code: no bootstrap check/native flags, and shim policy is unset. It does not disable Codex recorded opt-in; use `acc install --adapter codex --delivery off` for new Codex offers |
|
|
152
167
|
| `ACC_BOOTSTRAP_DEBUG=1` | Lets the internal `acc-bootstrap` check write one safe diagnostic line to stderr. Off, it is silent, and it never writes to stdout |
|
|
153
168
|
| `CODEX_HOME` | Codex's own home, honoured when locating the Codex App Server daemon's control socket for native delivery. Codex sets it; ACC only reads it |
|
package/docs/DESIGN_DECISIONS.md
CHANGED
|
@@ -18,12 +18,15 @@ boundaries exist.
|
|
|
18
18
|
| Runtime state outside the repository | A checkout can be deleted, cloned, or synced; presence and locks must not travel with it. |
|
|
19
19
|
| Project config optional and runtime-free | A committed file is editable by anyone with a PR, so it may carry policy — never sessions or tokens. |
|
|
20
20
|
| Durable state is authoritative | Next-turn or live delivery may accelerate an interaction; neither becomes the source of truth. |
|
|
21
|
+
| Bounded discovery, explicit history recovery | Automatic context stays small; peers select exact messages or historical records when they need full bodies. |
|
|
22
|
+
| Immutable explicit decision links | Replacements and withdrawals preserve prior records and expose competing branches without choosing by timestamp. |
|
|
23
|
+
| Fence managed runtime activation | Refresh all integrations before switching the active generation; partial refresh stays fenced until forward recovery completes. |
|
|
21
24
|
| No heartbeat helper in v1 | An idle session is honestly reported `stale`. A sidecar process to fake liveness is worse than the truth. |
|
|
22
25
|
| Presence reads the process, never writes the record | A pid answers "gone" at once; an age floor covers what a pid cannot, including its own reuse. Nothing is written back — no session has authority to edit another's record. This checks a process already there, not one beating on a session's behalf like the heartbeat helper above. |
|
|
23
|
-
| No
|
|
26
|
+
| No AI client or session launching | ACC attaches to sessions you already own; its separate update worker manages ACC packages, not those sessions. |
|
|
24
27
|
| One publishable package | One version and one release rather than twelve coordinated ones. |
|
|
25
28
|
| MIT | Widest reuse, least friction. |
|
|
26
|
-
| Node 24
|
|
29
|
+
| Node 24 or newer required | Uses `node:test`, modern `fs` promises, and no transpiler. |
|
|
27
30
|
| MCP session from launch config | Never from `initialize` or `clientInfo` — those are attacker-controllable. See the threat scenarios in [SECURITY_MODEL.md](SECURITY_MODEL.md) (scenario 8). |
|
|
28
31
|
|
|
29
32
|
## Avoid these rejected designs
|
|
@@ -32,7 +35,7 @@ boundaries exist.
|
|
|
32
35
|
|---|---|
|
|
33
36
|
| A file in each repo that agents poll | No guard, no identity, no atomicity — and it ends up committed. |
|
|
34
37
|
| A permanent global lead session | Turns peers into workers and makes one crash fatal. |
|
|
35
|
-
| Treating MCP as
|
|
38
|
+
| Treating MCP as an external-client lifecycle guarantee | Tool calls resolve MCP's own participant, but cannot infer the client's lifecycle, intercept writes, or wake its receiver. |
|
|
36
39
|
| Requiring Git, tmux, PostgreSQL, or a service | Every requirement is a reason the tool is not installed. |
|
|
37
40
|
| Collecting or sharing raw transcripts | Raw transcripts are never collected or shared. Explicit peer messages are bounded records the sender chose to address. |
|
|
38
41
|
| Reporting queued messages as delivered | A delivery state that overstates itself is worse than no state. |
|
|
@@ -47,16 +50,18 @@ perturbed the record instead of removing it — a hook whose recorded hash no
|
|
|
47
50
|
longer matched was still observed running, so absence was never actually
|
|
48
51
|
tested.
|
|
49
52
|
|
|
50
|
-
Absence
|
|
51
|
-
|
|
52
|
-
write guard
|
|
53
|
-
both
|
|
53
|
+
Absence was sufficient to disable the hooks in that historical capture. With no
|
|
54
|
+
record, that client ran no hook, printed `hook: SessionStart Completed` while
|
|
55
|
+
executing nothing, and ACC's write guard went silently off — while `acc doctor`
|
|
56
|
+
and `codex plugin list` both reported it enabled. A shell write walked through a
|
|
54
57
|
guarded claim; writing the exact same hashes back (captured before deletion,
|
|
55
58
|
from an ACC three releases older) revived the guard immediately.
|
|
56
59
|
|
|
57
|
-
That is why removal is never ACC's to do:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
That is why removal is never ACC's to do: it preserves the client's trust decision.
|
|
61
|
+
The historical observation above does not establish trust across arbitrary upgrades.
|
|
62
|
+
Codex 0.153.4 compares each current definition's hash and reports changed definitions
|
|
63
|
+
as modified; a trusted hook can also be disabled. ACC preserves the records but leaves
|
|
64
|
+
current readiness unverified, directing the user to `/hooks` in Codex.
|
|
60
65
|
|
|
61
66
|
**The generalisation, since this cost a release:** to learn whether state is
|
|
62
67
|
load-bearing, take it away. Changing it tests something else.
|
|
@@ -81,7 +86,7 @@ where a guard stops behaves better than one that believes it absolute.
|
|
|
81
86
|
1. **Storage backend.** The hardened filesystem store ships first. A transactional backend
|
|
82
87
|
can go behind the same interface later — but not merely to avoid a dependency.
|
|
83
88
|
2. **Remote coordination.** v2, or a separate product.
|
|
84
|
-
3. **
|
|
89
|
+
3. **AI client/session launching.** Possibly never; possibly an external integration.
|
|
85
90
|
4. **Multi-root discovery rules** beyond the current `roots` list.
|
|
86
91
|
5. **Default claim lease length** for hook-only adapters. A hook-only session cannot sustain
|
|
87
92
|
a short renewal cadence, so lease policy must not assume one.
|