agents-can-communicate 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -92
- package/SECURITY.md +7 -4
- package/docs/ADAPTER_AUTHORING.md +26 -22
- package/docs/ARCHITECTURE.md +23 -15
- package/docs/CAPABILITIES.md +30 -12
- package/docs/CLI.md +21 -10
- package/docs/CONCEPTS.md +91 -94
- package/docs/CONFIGURATION.md +30 -24
- package/docs/DESIGN_DECISIONS.md +8 -4
- package/docs/GETTING_STARTED.md +76 -100
- package/docs/GLOSSARY.md +4 -4
- package/docs/HOW_IT_WORKS.md +119 -233
- package/docs/MCP.md +8 -8
- package/docs/PROTOCOL.md +12 -7
- package/docs/RELEASING.md +111 -87
- package/docs/SECURITY_MODEL.md +13 -8
- package/docs/TROUBLESHOOTING.md +24 -12
- package/docs/WHY_ACC.md +18 -16
- package/docs/index.md +26 -18
- 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 +6 -4
- package/node_modules/@agents-can-communicate/adapter-codex/package.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-codex/plugin/skills/acc/SKILL.md +5 -3
- 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 +5 -3
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/package.json +1 -1
- 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 +5 -3
- 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 +5 -3
- package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
- package/node_modules/@agents-can-communicate/cli/package.json +1 -1
- package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +44 -14
- package/node_modules/@agents-can-communicate/core/package.json +1 -1
- package/node_modules/@agents-can-communicate/core/src/conversations.mjs +41 -1
- package/node_modules/@agents-can-communicate/delivery-router/package.json +1 -1
- package/node_modules/@agents-can-communicate/hook-runner/package.json +1 -1
- package/node_modules/@agents-can-communicate/installer/package.json +4 -2
- package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
- package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
- package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,122 +1,122 @@
|
|
|
1
1
|
# agents-can-communicate
|
|
2
2
|
|
|
3
|
+
**Open your agents. Let them coordinate.**
|
|
4
|
+
|
|
5
|
+
Give Codex the backend. Ask Claude Code to build the interface. Keep working as usual.
|
|
6
|
+
|
|
7
|
+
ACC makes supported sessions in the same project aware of each other and gives them
|
|
8
|
+
instructions for coordinating. Agents discover their peers, share what they're working
|
|
9
|
+
on, and decide when to ask questions, agree on changes, or avoid overlapping edits.
|
|
10
|
+
|
|
11
|
+
Think of the coordination you expect from subagents, extended across the independent
|
|
12
|
+
sessions you open yourself — with different clients and models. You keep giving them
|
|
13
|
+
ordinary tasks; they handle the conversations around their work.
|
|
14
|
+
|
|
15
|
+
[Try it](#try-it) · [Supported clients](#when-messages-arrive) · [Documentation](docs/index.md)
|
|
16
|
+
|
|
3
17
|
[](https://github.com/automatis-tools/agents-can-communicate/actions/workflows/ci.yml)
|
|
4
18
|
[](LICENSE)
|
|
5
19
|
[](https://nodejs.org)
|
|
6
20
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
It is a local-first communication layer for sessions you already run. Each session keeps
|
|
10
|
-
its own client, model, checkout, permissions, context, and human direction. ACC supplies a
|
|
11
|
-
shared room with presence, intent, narrow file claims, durable conversation threads, and
|
|
12
|
-
truthful per-recipient receipts. It does not launch, steer, supervise, or terminate agents.
|
|
21
|
+
## You describe the work. They work out the details.
|
|
13
22
|
|
|
14
|
-
|
|
15
|
-
state stays in platform app data outside the repository, and ACC never collects raw
|
|
16
|
-
transcripts.
|
|
23
|
+
Open two sessions in your project and give each its task:
|
|
17
24
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
you: copy it to the other window, copy the answer back, and repeat for every question.
|
|
25
|
+
| Session | Your prompt |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Codex | Build the backend for account registration. |
|
|
28
|
+
| Claude Code | Build the registration screen. |
|
|
23
29
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
ACC's integration tells the agents that peers are present and teaches them how to find
|
|
31
|
+
out what those peers are doing. As they work, they can notice the dependency and coordinate
|
|
32
|
+
on their own. An illustrative exchange:
|
|
27
33
|
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
U["You — direction and authority"] --> A
|
|
33
|
-
U --> B
|
|
34
|
+
```text
|
|
35
|
+
Claude → Codex I'm building the registration screen. What will your endpoint accept?
|
|
36
|
+
Codex → Claude Email and password. I'll return the new user and handle validation.
|
|
37
|
+
Claude → Codex I'll use that shape and keep my changes in the UI files.
|
|
34
38
|
```
|
|
35
39
|
|
|
36
|
-
The
|
|
37
|
-
|
|
40
|
+
The agents identify who to talk to and what to agree on. Your prompts stay focused on
|
|
41
|
+
the feature you want to build.
|
|
42
|
+
|
|
43
|
+
Each session keeps its own conversation and instructions. Response timing depends on the
|
|
44
|
+
receiving client: see [when messages arrive](#when-messages-arrive).
|
|
38
45
|
|
|
39
|
-
##
|
|
46
|
+
## Try it
|
|
40
47
|
|
|
41
|
-
|
|
48
|
+
You'll need **macOS or Linux, Node.js 24 or newer**, and two AI sessions in the same
|
|
49
|
+
project. They can use different clients or the same one.
|
|
42
50
|
|
|
43
51
|
```bash
|
|
44
52
|
npm install -g agents-can-communicate
|
|
45
53
|
acc install
|
|
46
54
|
```
|
|
47
55
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
independent and join the same ACC workspace. Use `acc doctor` to see exact versions,
|
|
51
|
-
installation health, and delivery downgrades.
|
|
56
|
+
The installer connects the clients it finds. Open a new terminal and restart your AI
|
|
57
|
+
clients to load the integration. If you use Codex, accept its plugin trust prompt.
|
|
52
58
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
59
|
+
Open two sessions in your project and give them ordinary tasks, as in the example above.
|
|
60
|
+
On supported clients, ACC introduces peer awareness through the client's own integration;
|
|
61
|
+
its installed instructions guide the agents to coordinate when their work overlaps.
|
|
56
62
|
|
|
57
|
-
|
|
63
|
+
Look for coordination in the agents' own activity: discovering a peer, checking who is
|
|
64
|
+
changing a file, or asking about a shared dependency. Each agent decides what is relevant
|
|
65
|
+
to its task; the integration provides awareness, not a guarantee that a model will
|
|
66
|
+
coordinate on every task. [Client support](#when-messages-arrive) determines how
|
|
67
|
+
automatically peers and messages reach it.
|
|
58
68
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
69
|
+
If the other session doesn't appear, run `acc doctor` from your project directory.
|
|
70
|
+
[Get help with setup](docs/TROUBLESHOOTING.md).
|
|
71
|
+
|
|
72
|
+
## When messages arrive
|
|
63
73
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
--body "Can your code stop reading item.drive before I remove it?"
|
|
74
|
+
ACC connects sessions **on the same machine** and saves messages locally, so a waiting
|
|
75
|
+
session can pick them up later. Delivery depends on the client:
|
|
67
76
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
77
|
+
| Client | How the agent receives a message |
|
|
78
|
+
|---|---|
|
|
79
|
+
| Codex CLI, Claude Code, Gemini CLI, Kimi Code | At the next normal turn on verified versions and platforms; otherwise by checking its ACC inbox. |
|
|
80
|
+
| Grok or another client connected through [MCP](docs/MCP.md) | By checking its ACC inbox. |
|
|
71
81
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
82
|
+
**Claude Code can also reply while idle.** This optional mode is experimental and off by
|
|
83
|
+
default. It supports Apple Silicon Macs with zsh and Claude Code 2.1.258 or newer, subject
|
|
84
|
+
to compatibility checks. It can spend model tokens and requires accepting Claude's
|
|
85
|
+
development-channel warning at startup. Messages arriving mid-turn wait for it to finish.
|
|
86
|
+
|
|
87
|
+
Each direction follows the receiving client's rules: Claude's reply won't start a new
|
|
88
|
+
Codex turn. Codex can pick it up on a supported next turn or by checking its inbox.
|
|
89
|
+
|
|
90
|
+
[Full compatibility details](docs/CAPABILITIES.md).
|
|
91
|
+
|
|
92
|
+
## Keep the workflow you like
|
|
93
|
+
|
|
94
|
+
- **Your usual tools.** Start clients with their normal commands. You choose each
|
|
95
|
+
agent's task, model, and permissions.
|
|
96
|
+
- **Separate checkouts, one project.** Git worktrees share an ACC workspace.
|
|
97
|
+
Plain project folders work too; Git is optional.
|
|
98
|
+
- **Agree before editing.** Agents can reserve files and identify overlapping work.
|
|
99
|
+
Reservations are advisory unless the clients support enforcement.
|
|
100
|
+
[How reservations work](docs/CONCEPTS.md#intent-is-awareness-a-claim-commits).
|
|
101
|
+
- **Local coordination.** Messages live in app data outside your project. ACC doesn't
|
|
102
|
+
collect or share raw transcripts. Your clients use their usual model providers.
|
|
103
|
+
|
|
104
|
+
One npm package. No account or separate coordination service to set up.
|
|
105
|
+
|
|
106
|
+
To remove the integrations:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
acc uninstall
|
|
75
110
|
```
|
|
76
111
|
|
|
77
|
-
|
|
78
|
-
`acknowledged` describe different observable facts: an offer is not a read, retrieval is
|
|
79
|
-
not proof of model attention, and a reply resolves communication rather than proving a
|
|
80
|
-
requested task finished.
|
|
81
|
-
|
|
82
|
-
Durable inbox recovery is the baseline for every client. Certified next-turn injection
|
|
83
|
-
reduces the polling for the exact captured client version and platform. Native live push is
|
|
84
|
-
opt-in, experimental, and off until you choose it: **Claude Code 2.1.258 and Codex 0.152.1
|
|
85
|
-
on macOS arm64 have passing live-push captures** and deliver an addressed message into a
|
|
86
|
-
running session through the vendor's own transport, falling back to the durable inbox on any
|
|
87
|
-
failure. Every other client, and any client below the captured minimum, stays next-turn or
|
|
88
|
-
inbox only. The retained failed captures are shipped beside the passing ones as honest
|
|
89
|
-
evidence.
|
|
90
|
-
|
|
91
|
-
| Client | Native delivery |
|
|
92
|
-
|---|---|
|
|
93
|
-
| Claude Code 2.1.258 (darwin-arm64) | experimental Channel: idle offer, queue-after-turn, native reply, off until opt-in |
|
|
94
|
-
| Codex 0.152.1 (darwin-arm64) | experimental App Server queue: idle/after-turn, reply via `acc reply`, off until opt-in |
|
|
95
|
-
| Gemini CLI, Kimi Code | next-turn or inbox only; no captured transparent transport |
|
|
96
|
-
| Grok | awaiting a compatibility capture; inbox only |
|
|
112
|
+
ACC preserves configuration changes you've made since installation.
|
|
97
113
|
|
|
98
|
-
##
|
|
114
|
+
## Go further
|
|
99
115
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
A peer message is untrusted input, never system authority. A guarded claim can stop only
|
|
108
|
-
the write paths a client actually exposes; `acc status` reports `advisory` when that cannot
|
|
109
|
-
be guaranteed.
|
|
110
|
-
|
|
111
|
-
## Documentation
|
|
112
|
-
|
|
113
|
-
Start with [Getting started](docs/GETTING_STARTED.md), then read
|
|
114
|
-
[How ACC works](docs/HOW_IT_WORKS.md) for the end-to-end engineering tour or use the
|
|
115
|
-
[documentation map](docs/index.md). The exact surfaces are in the [CLI](docs/CLI.md),
|
|
116
|
-
[MCP](docs/MCP.md), [Protocol](docs/PROTOCOL.md), and
|
|
117
|
-
[Capabilities](docs/CAPABILITIES.md) references. Adapter evidence lives beside each
|
|
118
|
-
adapter in its `COMPATIBILITY.md` and `certification.json`.
|
|
119
|
-
|
|
120
|
-
Contributing starts with the repository's
|
|
121
|
-
[AGENTS.md](https://github.com/automatis-tools/agents-can-communicate/blob/main/AGENTS.md).
|
|
122
|
-
Node 24+, Git optional, MIT licensed.
|
|
116
|
+
[Getting started](docs/GETTING_STARTED.md) · [CLI reference](docs/CLI.md) ·
|
|
117
|
+
[Connect an MCP client](docs/MCP.md) · [How ACC works](docs/HOW_IT_WORKS.md) ·
|
|
118
|
+
[Security](docs/SECURITY_MODEL.md)
|
|
119
|
+
|
|
120
|
+
Want to contribute or add a client?
|
|
121
|
+
Start with [AGENTS.md](https://github.com/automatis-tools/agents-can-communicate/blob/main/AGENTS.md)
|
|
122
|
+
and the [adapter guide](docs/ADAPTER_AUTHORING.md).
|
package/SECURITY.md
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# Security policy
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This page is for reporting a vulnerability. For system boundaries and threat reasoning,
|
|
4
|
+
read the [security model](docs/SECURITY_MODEL.md).
|
|
5
|
+
|
|
6
|
+
## Report privately
|
|
4
7
|
|
|
5
8
|
Report privately via [GitHub security advisories](https://github.com/automatis-tools/agents-can-communicate/security/advisories/new).
|
|
6
9
|
|
|
@@ -9,7 +12,7 @@ Please do not open a public issue first.
|
|
|
9
12
|
Include: what you ran, what happened, what you expected, and the client and
|
|
10
13
|
version. A reproduction against a throwaway `ACC_DATA_HOME` is ideal.
|
|
11
14
|
|
|
12
|
-
##
|
|
15
|
+
## Check the scope
|
|
13
16
|
|
|
14
17
|
| In scope | Out of scope |
|
|
15
18
|
|---|---|
|
|
@@ -21,11 +24,11 @@ version. A reproduction against a throwaway `ACC_DATA_HOME` is ideal.
|
|
|
21
24
|
|
|
22
25
|
Reasoning behind each: [docs/SECURITY_MODEL.md](docs/SECURITY_MODEL.md).
|
|
23
26
|
|
|
24
|
-
##
|
|
27
|
+
## Target a supported version
|
|
25
28
|
|
|
26
29
|
Pre-1.0: the latest release only.
|
|
27
30
|
|
|
28
|
-
##
|
|
31
|
+
## Expect this response
|
|
29
32
|
|
|
30
33
|
Acknowledge, reproduce, and tell you whether it is in scope. If it is, the fix
|
|
31
34
|
ships with a test in `tests/security/` so it cannot come back quietly.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Writing an adapter
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Use this page to add one client without leaking vendor behavior into core. Start with the
|
|
4
|
+
[identity contract](PROTOCOL.md#identity), then compare the shipped evidence under
|
|
5
|
+
[certified support](CAPABILITIES.md#certified-support). The [documentation map](index.md)
|
|
6
|
+
links the surrounding concepts and runtime architecture.
|
|
7
7
|
|
|
8
8
|
```mermaid
|
|
9
9
|
graph LR
|
|
@@ -14,7 +14,7 @@ graph LR
|
|
|
14
14
|
R --> H
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
##
|
|
17
|
+
## Define the manifest
|
|
18
18
|
|
|
19
19
|
```js
|
|
20
20
|
export function createExampleAdapter() {
|
|
@@ -37,8 +37,8 @@ export function createExampleAdapter() {
|
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
`renderContextResult` is required wherever an adapter renders peer messages. It returns
|
|
40
|
-
`{ text,
|
|
41
|
-
lifecycle](PROTOCOL.md#
|
|
40
|
+
`{ text, offeredMessageIds, includedAttentionIds }`, and the [receipt
|
|
41
|
+
lifecycle](PROTOCOL.md#receipt-lifecycle) advances only from those ids — never by searching
|
|
42
42
|
`text` for one, because peer text is untrusted and can imitate another message's header.
|
|
43
43
|
`projectContextResult()` implements this contract; `projectContext()` remains the text-only
|
|
44
44
|
convenience API for adapters that don't need it. An adapter with only the older
|
|
@@ -53,7 +53,7 @@ actually runs as — `command: "claude"` for a client that really runs as `node`
|
|
|
53
53
|
nothing, and the failure is silent: the session gets `pid: null` and falls back to reading
|
|
54
54
|
presence by age alone, with nothing telling you why.
|
|
55
55
|
|
|
56
|
-
##
|
|
56
|
+
## Declare only proven capabilities
|
|
57
57
|
|
|
58
58
|
Fourteen booleans in four groups, declared in the manifest's `capabilities` object:
|
|
59
59
|
|
|
@@ -68,7 +68,8 @@ Fourteen booleans in four groups, declared in the manifest's `capabilities` obje
|
|
|
68
68
|
`defineAdapter` enforces the method — declaring `guards.beforeWrite: true` without
|
|
69
69
|
`guardWrite()` is a usage error at construction. It also requires a passing entry in the
|
|
70
70
|
validated `certification.json`; method existence is never evidence. What each shipped
|
|
71
|
-
client was actually observed doing against this list is
|
|
71
|
+
client was actually observed doing against this list is under
|
|
72
|
+
[certified support](CAPABILITIES.md#certified-support).
|
|
72
73
|
|
|
73
74
|
`lifecycle.heartbeat` is deliberately not a flavour of `delivery.nextTurn`. Next-turn
|
|
74
75
|
delivery happens only when the client reaches a normal turn boundary; heartbeat fires on a
|
|
@@ -121,21 +122,23 @@ The rules `defineAdapter` enforces, and the ones the runtime applies:
|
|
|
121
122
|
- The three native methods return closed facts (`validateNativeActivationPlan()` closes the
|
|
122
123
|
activation plan) and never put vendor data - endpoints, sockets, raw errors - into core.
|
|
123
124
|
|
|
124
|
-
##
|
|
125
|
+
## Choose the integration depth
|
|
125
126
|
|
|
126
127
|
| Tier | You register | You get | You do not get |
|
|
127
128
|
|---|---|---|---|
|
|
128
129
|
| 0 | nothing — humans run `acc` | durable messages, status, claims | anything automatic |
|
|
129
130
|
| 1 | the MCP server | attach on first call, read, claim, message | guards, session end |
|
|
130
|
-
| 2 | hooks + skill |
|
|
131
|
-
| 3 | +
|
|
131
|
+
| 2 | hooks + skill | only the lifecycle, context, guard, and next-turn behaviors separately captured for this client | uncaptured hook behaviors |
|
|
132
|
+
| 3 | + native delivery surface | only captured live-push and reply-route modes | safe-point injection or child sessions unless separately captured |
|
|
132
133
|
|
|
133
134
|
Installed hook wiring may reach tier 2, but the effective capability is still limited to
|
|
134
|
-
an exact certified client/version/platform.
|
|
135
|
-
2.1.258
|
|
136
|
-
|
|
135
|
+
an exact certified client/version/platform. Tier 3 ships for one client: Claude Code, from
|
|
136
|
+
2.1.258 on macOS arm64, behind the native delivery contract above. Codex reached a passing
|
|
137
|
+
queue capture and was withdrawn anyway - the mode its transport needs reports the daemon's
|
|
138
|
+
workspace as the session's - which is the standard: a capture that works is not the same
|
|
139
|
+
claim as a capability that is safe to ship.
|
|
137
140
|
|
|
138
|
-
##
|
|
141
|
+
## Normalize hook input
|
|
139
142
|
|
|
140
143
|
Whitelist, never a filter. Every client hands hooks the prompt, the transcript path, or the
|
|
141
144
|
tool output; none of it may survive.
|
|
@@ -151,7 +154,7 @@ return normalizedEvent({
|
|
|
151
154
|
Refuse an unrecognised payload. Inventing a session attaches the wrong one, or a new one
|
|
152
155
|
every hook, and looks like it is working.
|
|
153
156
|
|
|
154
|
-
##
|
|
157
|
+
## Measure response contracts
|
|
155
158
|
|
|
156
159
|
Measure them. Every client differs, and a wrong shape fails **silently**:
|
|
157
160
|
|
|
@@ -166,10 +169,11 @@ Measure them. Every client differs, and a wrong shape fails **silently**:
|
|
|
166
169
|
`denyOutcome(reason)` returns `{ stdout, stderr, exitCode }`, so the runtime never has to
|
|
167
170
|
know which client it is talking to. This table is only the shape each shipped adapter
|
|
168
171
|
actually uses; the full experimental grid — every candidate shape tried against every
|
|
169
|
-
client, including which ones are silently ignored — is
|
|
170
|
-
|
|
172
|
+
client, including which ones are silently ignored — is recorded in each adapter's
|
|
173
|
+
`COMPATIBILITY.md` and certification fixtures. The cross-client summary is under
|
|
174
|
+
[guard limitations](CAPABILITIES.md#guard-limitations).
|
|
171
175
|
|
|
172
|
-
##
|
|
176
|
+
## Preserve install ownership
|
|
173
177
|
|
|
174
178
|
```mermaid
|
|
175
179
|
graph TB
|
|
@@ -188,7 +192,7 @@ Rules that are not negotiable:
|
|
|
188
192
|
`planInstall` must use the same path helpers as `install`. A conformance test compares
|
|
189
193
|
them, because a plan that drifts makes `--dry-run` a decoration.
|
|
190
194
|
|
|
191
|
-
##
|
|
195
|
+
## Run conformance
|
|
192
196
|
|
|
193
197
|
```bash
|
|
194
198
|
node --test tests/conformance/*.test.mjs
|
|
@@ -198,7 +202,7 @@ node --test tests/process/hook-wiring.test.mjs
|
|
|
198
202
|
The second one *executes* what your install wrote. Three adapters once shipped a hook
|
|
199
203
|
command that did not exist anywhere; every test was green.
|
|
200
204
|
|
|
201
|
-
## Record
|
|
205
|
+
## Record the evidence
|
|
202
206
|
|
|
203
207
|
One `COMPATIBILITY.md` per adapter: client version, event names, payload fields, the deny
|
|
204
208
|
matrix, and what you could **not** observe. The next person's alternative is guessing.
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Architecture
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
Use this page to trace a communication fact from an independently opened client through
|
|
4
|
+
core, storage, and an optional delivery adapter. ACC is the local control plane; the AI
|
|
5
|
+
clients remain independent execution planes. Core records the truth before an adapter is
|
|
6
|
+
asked to make it arrive sooner.
|
|
6
7
|
|
|
7
8
|
```mermaid
|
|
8
9
|
flowchart LR
|
|
@@ -41,7 +42,7 @@ The order is part of the public guarantee:
|
|
|
41
42
|
|
|
42
43
|
1. validate and commit the message plus one `queued` receipt per resolved recipient;
|
|
43
44
|
2. resolve the recipient's current delivery bindings;
|
|
44
|
-
3. check recipient policy
|
|
45
|
+
3. check recipient policy and the current binding's reachability and offered native mode;
|
|
45
46
|
4. ask one adapter to cross its transport boundary;
|
|
46
47
|
5. only after acceptance, commit `offered` and an immutable success event.
|
|
47
48
|
|
|
@@ -71,16 +72,21 @@ lease without exposing the endpoint.
|
|
|
71
72
|
|
|
72
73
|
## Certified capability versus current reachability
|
|
73
74
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
proved
|
|
75
|
+
Ordinary hook capabilities say an exact client version on an exact platform passed a
|
|
76
|
+
captured behavior. Native live delivery uses a separate contract: installation checks the
|
|
77
|
+
captured minimum, platform, and current feature probe, then each session publishes a binding
|
|
78
|
+
only after a generation-bound handshake. The router trusts that admission and verifies the
|
|
79
|
+
binding, recipient policy, declared adapter capability, and adapter response; it does not add
|
|
80
|
+
a third exact-version certification check. A binding says what that current generation
|
|
81
|
+
exposes and whether its lease is current, while recipient policy says whether it may spend a
|
|
82
|
+
turn.
|
|
83
|
+
|
|
84
|
+
Claude Code is the one client that proved the live seam: a Channel capture on 2.1.258,
|
|
85
|
+
confirmed on 2.1.260 through the installed package, admitted by minimum-plus-probe rather
|
|
86
|
+
than an exact version. Codex's queue transport passed its capture and the capability was
|
|
87
|
+
withdrawn, because the mode it needs hides the session's workspace. Gemini CLI and Kimi
|
|
88
|
+
Code have exact-version next-turn evidence only; Grok and generic MCP use inbox polling.
|
|
89
|
+
The seam exists for every adapter; only one has earned it.
|
|
84
90
|
|
|
85
91
|
## Storage and workspace identity
|
|
86
92
|
|
|
@@ -90,7 +96,9 @@ lexically, so a cursor is simply the last sequence returned.
|
|
|
90
96
|
|
|
91
97
|
Workspace discovery checks an explicit config first, then the Git common directory, then
|
|
92
98
|
the plain directory. Multiple worktrees share a workspace id while each session records
|
|
93
|
-
its checkout and branch.
|
|
99
|
+
its checkout and branch. Runtime state never lands inside those roots; the only project
|
|
100
|
+
file ACC writes is an optional `acc.workspace.json` explicitly requested through
|
|
101
|
+
`acc config init`.
|
|
94
102
|
|
|
95
103
|
A lone session can remain ephemeral. Durable state materialises when a second live session
|
|
96
104
|
appears or the first claim, message, or handoff is committed. This makes “silent when
|
package/docs/CAPABILITIES.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Capabilities
|
|
2
2
|
|
|
3
|
+
Use this page to set expectations after installation. Integration means ACC can introduce
|
|
4
|
+
peer awareness and coordination instructions; it does not guarantee what a model will do
|
|
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 only the
|
|
7
|
+
experimental Claude Code channel can deliver while a session is idle.
|
|
8
|
+
|
|
3
9
|
Capability honesty separates four questions that are easy to collapse:
|
|
4
10
|
|
|
5
11
|
1. **Certified support** — did this exact client version and platform pass a shipped
|
|
@@ -13,6 +19,10 @@ Capability honesty separates four questions that are easy to collapse:
|
|
|
13
19
|
A source method or vendor documentation is not certification. Unknown versions and
|
|
14
20
|
platforms degrade to false. No weaker session inherits a stronger peer's capability.
|
|
15
21
|
|
|
22
|
+
Run `acc doctor` in the project when observed behavior differs from this page. It reports
|
|
23
|
+
the installed client version, platform, effective capability, and fallback instead of
|
|
24
|
+
assuming that a newer or differently packaged client behaves like a captured one.
|
|
25
|
+
|
|
16
26
|
## Certified support
|
|
17
27
|
|
|
18
28
|
Passing evidence currently ships for these exact versions on `darwin-arm64`:
|
|
@@ -33,10 +43,12 @@ Every other capability in the closed shape defaults to false, including session
|
|
|
33
43
|
child sessions, startup or safe-point injection, and before-read guards.
|
|
34
44
|
|
|
35
45
|
The `delivery.livePush` and `delivery.replyRoute` row is `no` for the exact hook versions
|
|
36
|
-
this matrix is keyed to. Native live delivery
|
|
37
|
-
2.1.258
|
|
38
|
-
native delivery contract rather than exact-version
|
|
39
|
-
opt-in, experimental, and never turns on for a
|
|
46
|
+
this matrix is keyed to. Native live delivery is captured on a newer client - Claude Code
|
|
47
|
+
2.1.258, livePush and replyRoute, confirmed again on 2.1.260 through the installed package -
|
|
48
|
+
and is admitted through the native delivery contract rather than exact-version
|
|
49
|
+
certification: it is off until a per-client opt-in, experimental, and never turns on for a
|
|
50
|
+
client below the captured minimum. Codex's queue capture passed and the capability was
|
|
51
|
+
withdrawn; the row below says why.
|
|
40
52
|
|
|
41
53
|
The limitations belong next to the adapters they affect:
|
|
42
54
|
|
|
@@ -60,8 +72,10 @@ would publish a generation-bound binding with `availableModes`, `clientVersion`,
|
|
|
60
72
|
with a computed `reachable` boolean while keeping the opaque endpoint private.
|
|
61
73
|
|
|
62
74
|
The router requires exactly one current eligible generation. No binding, an expired lease,
|
|
63
|
-
several live sessions for one participant,
|
|
64
|
-
|
|
75
|
+
several live sessions for one participant, and an adapter refusal each keep delivery on the
|
|
76
|
+
durable fallback. Busy behavior belongs to the transport: Claude's Channel can accept a
|
|
77
|
+
message while the target is busy and queue it until the current turn finishes; an adapter
|
|
78
|
+
that instead refuses with `recipient_busy` leaves the message on the durable path.
|
|
65
79
|
|
|
66
80
|
The lease is extended by whoever serves the endpoint, because only that process knows it is
|
|
67
81
|
still alive. A client that publishes no heartbeat - Claude Code among them - would otherwise
|
|
@@ -73,9 +87,9 @@ Current shipped reality: Claude Code on darwin-arm64 has a passing experimental
|
|
|
73
87
|
capture behind the native delivery contract, off until a per-client opt-in. Codex is
|
|
74
88
|
next-turn and inbox only: its queue transport works, but the mode that makes a session
|
|
75
89
|
reachable is the mode that hides which workspace it is in. Every other client is next-turn or
|
|
76
|
-
inbox only;
|
|
77
|
-
|
|
78
|
-
|
|
90
|
+
inbox only. Gemini CLI and Kimi Code are next-turn only at their exact captured versions;
|
|
91
|
+
Grok and MCP poll inbox. On Linux, the shipped captures above do not establish next-turn or
|
|
92
|
+
live delivery, so the honest expectation is the durable inbox.
|
|
79
93
|
|
|
80
94
|
## Recipient policy
|
|
81
95
|
|
|
@@ -89,9 +103,13 @@ policy:
|
|
|
89
103
|
| `all` | every addressed message kind may use live push |
|
|
90
104
|
|
|
91
105
|
The default is `off`. `acc install --delivery actionable|all` is an explicit request, not
|
|
92
|
-
a force switch.
|
|
93
|
-
|
|
94
|
-
|
|
106
|
+
a force switch. Exact-version certification governs ordinary hook capabilities. Native live
|
|
107
|
+
delivery is separate: the installer applies the requested policy only when the client meets
|
|
108
|
+
the captured minimum version, runs on a captured platform, and passes the current feature
|
|
109
|
+
probe; otherwise effective policy remains off and the fallback diagnostic is printed. Each
|
|
110
|
+
enabled session must then pass its generation-bound handshake. A failed handshake clears or
|
|
111
|
+
refuses that session's binding and reports degraded reachability without rewriting the
|
|
112
|
+
installed consent. Room messages are never live-push candidates.
|
|
95
113
|
|
|
96
114
|
## Fallback
|
|
97
115
|
|
package/docs/CLI.md
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# CLI
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
workspace config
|
|
3
|
+
Use `acc` to install and diagnose integrations, or to inspect the same communication
|
|
4
|
+
operations that installed skills use on an agent's behalf. Setup commands are for a
|
|
5
|
+
person; communication commands are the smaller agent-facing vocabulary. Every command
|
|
6
|
+
accepts `--json` and `--cwd <path>`. `--workspace <config>` selects an explicit workspace
|
|
7
|
+
config where supported by the common boundary.
|
|
7
8
|
|
|
8
9
|
<!-- test:command -->
|
|
9
10
|
```bash
|
|
@@ -11,7 +12,7 @@ acc help
|
|
|
11
12
|
acc version
|
|
12
13
|
```
|
|
13
14
|
|
|
14
|
-
##
|
|
15
|
+
## Coordinate from a session
|
|
15
16
|
|
|
16
17
|
| Command | Required | Optional |
|
|
17
18
|
|---|---|---|
|
|
@@ -57,14 +58,24 @@ reason; ordinary sessions release only their own claims.
|
|
|
57
58
|
### Messages and requests
|
|
58
59
|
|
|
59
60
|
```bash
|
|
60
|
-
acc message --to
|
|
61
|
+
acc message --to codex --type question --subject "receipt wording" \
|
|
61
62
|
--body "Should transport acceptance be called offered?" \
|
|
62
63
|
--client-message-id client_stable_1
|
|
63
64
|
|
|
64
|
-
acc request --to
|
|
65
|
+
acc request --to codex --title "review receipt wording" \
|
|
65
66
|
--detail "Check CLI and MCP results; reply with defects only."
|
|
66
67
|
```
|
|
67
68
|
|
|
69
|
+
`--to` takes a client name - `codex`, `claude_code`, `gemini_cli` - while exactly one
|
|
70
|
+
session of that client is here, and the exact participant id from `acc status --json`
|
|
71
|
+
otherwise. Two sessions of one client are refused by name rather than guessed between, the
|
|
72
|
+
same way `--session` refuses. The recorded message always names the participant, never the
|
|
73
|
+
client it was reached through.
|
|
74
|
+
|
|
75
|
+
By default a hooked participant id is derived from that client's session id. It remains
|
|
76
|
+
usable for the current conversation but a new unrelated conversation gets a new address.
|
|
77
|
+
Set `ACC_PARTICIPANT` when the recipient must keep one stable address across conversations.
|
|
78
|
+
|
|
68
79
|
`message` accepts generic kinds `note`, `question`, `request`, and `decision`. Defaults are
|
|
69
80
|
`note` plus obligation `none`; questions and requests require `reply`; an addressed
|
|
70
81
|
decision may explicitly use `--obligation acknowledge`. `answer` is created only by
|
|
@@ -109,14 +120,14 @@ no state override.
|
|
|
109
120
|
```bash
|
|
110
121
|
acc finish --goal "document receipt semantics" --status partial \
|
|
111
122
|
--completed "protocol updated" --remaining "acceptance proof" \
|
|
112
|
-
--blocker "packed test not run" --to
|
|
123
|
+
--blocker "packed test not run" --to codex
|
|
113
124
|
```
|
|
114
125
|
|
|
115
126
|
Status is `complete`, `partial`, or `blocked`. `finish` records a structured handoff,
|
|
116
127
|
releases the caller's claims, and ends ACC presence for that session. It never closes the
|
|
117
128
|
external AI client. An addressed handoff requires acknowledgement; a room handoff does not.
|
|
118
129
|
|
|
119
|
-
##
|
|
130
|
+
## Install, diagnose, and update
|
|
120
131
|
|
|
121
132
|
| Command | Flags |
|
|
122
133
|
|---|---|
|
|
@@ -143,7 +154,7 @@ runs the unmodified client, and ACC is never the parent of the session after tha
|
|
|
143
154
|
Only `update` touches the network. `ACC_NO_UPDATE_CHECK=1` disables update checks. Hooks
|
|
144
155
|
never perform them.
|
|
145
156
|
|
|
146
|
-
##
|
|
157
|
+
## Integrate a client lifecycle
|
|
147
158
|
|
|
148
159
|
`acc attach --participant <id>`, `acc heartbeat --session <id> --generation <token>`, and
|
|
149
160
|
`acc detach --session <id> --generation <token>` are public executable boundaries used by
|