agents-can-communicate 0.7.0 → 0.8.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 +3 -1
- package/bin/entrypoints/acc-bootstrap.mjs +6 -48
- package/bin/entrypoints/acc-claude-channel.mjs +47 -157
- package/docs/ADAPTER_AUTHORING.md +41 -10
- package/docs/ARCHITECTURE.md +28 -13
- package/docs/CAPABILITIES.md +19 -16
- package/docs/CLI.md +60 -14
- package/docs/CONCEPTS.md +12 -4
- package/docs/CONFIGURATION.md +18 -11
- package/docs/GETTING_STARTED.md +15 -12
- package/docs/GLOSSARY.md +2 -1
- package/docs/HOW_IT_WORKS.md +8 -4
- package/docs/PROTOCOL.md +56 -6
- package/docs/RELEASING.md +3 -2
- package/docs/SECURITY_MODEL.md +14 -1
- package/docs/TROUBLESHOOTING.md +64 -27
- package/docs/UPGRADING.md +49 -8
- package/docs/WHY_ACC.md +5 -3
- package/node_modules/@agents-can-communicate/adapter-antigravity/package.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-antigravity/plugin/plugin.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-antigravity/plugin/skills/acc/SKILL.md +8 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/certification.json +14 -73
- package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/certification-provenance.json +29 -71
- package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.282-product-evidence.json +161 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.282.json +28 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/inbox-wake-2.1.282.json +44 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/package.json +5 -2
- package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/skills/acc/SKILL.md +8 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/adapter.mjs +25 -30
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/hooks.mjs +6 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/inbox-contract.mjs +10 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/inbox-delivery.mjs +254 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/inbox-endpoint.mjs +166 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/inbox-registry.mjs +71 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/inbox-settings.mjs +109 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/install.mjs +25 -31
- 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 +8 -0
- 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 +8 -0
- 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 +8 -0
- 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 +8 -0
- package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-sdk/src/context-projector.mjs +15 -2
- package/node_modules/@agents-can-communicate/adapter-sdk/src/events.mjs +16 -3
- package/node_modules/@agents-can-communicate/adapter-sdk/src/hook-shim.mjs +4 -3
- package/node_modules/@agents-can-communicate/adapter-sdk/src/index.mjs +1 -1
- package/node_modules/@agents-can-communicate/adapter-sdk/src/native-activation.mjs +4 -14
- package/node_modules/@agents-can-communicate/adapter-sdk/src/native-delivery.mjs +23 -11
- package/node_modules/@agents-can-communicate/adapter-sdk/src/native-vocabulary.mjs +5 -1
- package/node_modules/@agents-can-communicate/cli/package.json +1 -1
- package/node_modules/@agents-can-communicate/cli/src/doctor-command.mjs +8 -6
- package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +8 -23
- package/node_modules/@agents-can-communicate/cli/src/install-delivery-consent.mjs +3 -4
- package/node_modules/@agents-can-communicate/cli/src/main.mjs +39 -10
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/entry.mjs +7 -43
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/launchers.mjs +5 -3
- package/node_modules/@agents-can-communicate/cli/src/managed-runtime/refresh.mjs +3 -4
- package/node_modules/@agents-can-communicate/cli/src/native-delivery-status.mjs +2 -2
- package/node_modules/@agents-can-communicate/core/package.json +1 -1
- package/node_modules/@agents-can-communicate/core/src/conversations.mjs +2 -2
- package/node_modules/@agents-can-communicate/core/src/next-turn-delivery.mjs +21 -4
- package/node_modules/@agents-can-communicate/core/src/receipts.mjs +66 -10
- package/node_modules/@agents-can-communicate/core/src/sessions.mjs +25 -2
- package/node_modules/@agents-can-communicate/core/src/status.mjs +38 -1
- package/node_modules/@agents-can-communicate/core/src/sync.mjs +11 -2
- package/node_modules/@agents-can-communicate/delivery-router/package.json +1 -1
- package/node_modules/@agents-can-communicate/delivery-router/src/router.mjs +24 -7
- package/node_modules/@agents-can-communicate/hook-runner/package.json +1 -1
- package/node_modules/@agents-can-communicate/hook-runner/src/native-attempt.mjs +6 -8
- package/node_modules/@agents-can-communicate/hook-runner/src/native-binding.mjs +24 -11
- package/node_modules/@agents-can-communicate/hook-runner/src/runner.mjs +21 -12
- package/node_modules/@agents-can-communicate/installer/package.json +1 -1
- package/node_modules/@agents-can-communicate/installer/src/apply.mjs +19 -5
- package/node_modules/@agents-can-communicate/installer/src/detect.mjs +3 -7
- package/node_modules/@agents-can-communicate/installer/src/index.mjs +4 -7
- package/node_modules/@agents-can-communicate/installer/src/native-activation.mjs +23 -61
- package/node_modules/@agents-can-communicate/installer/src/ownership.mjs +7 -1
- package/node_modules/@agents-can-communicate/installer/src/plan.mjs +15 -5
- package/node_modules/@agents-can-communicate/installer/src/shell-bootstrap.mjs +10 -133
- package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
- package/node_modules/@agents-can-communicate/mcp-server/src/tools.mjs +5 -3
- package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
- package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
- package/node_modules/@agents-can-communicate/storage-filesystem/src/atomic-json.mjs +6 -1
- package/package.json +1 -1
- package/bin/acc-bootstrap.mjs +0 -7
- package/bin/acc-claude-channel.mjs +0 -10
- package/bin/entrypoints/claude-channel-binding.mjs +0 -46
- package/bin/entrypoints/claude-channel-stdio.mjs +0 -29
- package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/.mcp.json +0 -8
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/channel.mjs +0 -381
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/native-delivery.mjs +0 -232
- package/node_modules/@agents-can-communicate/installer/src/bootstrap-runtime.mjs +0 -150
package/docs/WHY_ACC.md
CHANGED
|
@@ -53,9 +53,11 @@ coordinate across machines.
|
|
|
53
53
|
ACC also does not merge model memory, read raw conversations, guarantee agent choices,
|
|
54
54
|
approve tools, operate CI,
|
|
55
55
|
or make guarded claims immune to unrelated local processes. Experimental live delivery is
|
|
56
|
-
available through Claude Code
|
|
57
|
-
platforms, behind recipient opt-in and with possible token spend.
|
|
58
|
-
|
|
56
|
+
available through the Claude Code inbox wake and Codex LocalDaemon on supported versions and
|
|
57
|
+
platforms, behind recipient opt-in and with possible token spend. Both work inside the
|
|
58
|
+
session you opened with your ordinary command, and Claude Code needs no launcher shim.
|
|
59
|
+
Neither interrupts a turn in progress. A busy Claude Code session takes the message between
|
|
60
|
+
two tool calls, and Codex waits for the turn to finish. See [Capabilities](CAPABILITIES.md).
|
|
59
61
|
|
|
60
62
|
If the sessions should remain yours and simply stop working in isolation, that is the
|
|
61
63
|
product ACC is designed to be.
|
|
@@ -111,6 +111,10 @@ the communication obligation rather than proving the requested action is complet
|
|
|
111
111
|
An acknowledgement confirms receipt, not acceptance of work. Read the peer's
|
|
112
112
|
answer for the scope it accepted or the result it actually checked.
|
|
113
113
|
|
|
114
|
+
To see where a message you sent got to, read it exactly:
|
|
115
|
+
`{{ACC}} sync --scope history --message <id> --json` lists each recipient's
|
|
116
|
+
receipt state, when it last changed, and the transport that offered it.
|
|
117
|
+
|
|
114
118
|
### Stay reachable while idle
|
|
115
119
|
|
|
116
120
|
ACC can wake this conversation when a peer writes while you are idle, once its
|
|
@@ -137,6 +141,10 @@ Pages default to 20 items and stay within 12,000 bytes of formatted page JSON.
|
|
|
137
141
|
Use `inbox --cursor <nextCursor>` for older headers when needed. Omit the cursor
|
|
138
142
|
on a new poll to see arrivals; a cursor is the complete last message id, not an offset.
|
|
139
143
|
|
|
144
|
+
A peer block with a `repeat:` line was pushed live earlier and nothing has
|
|
145
|
+
retrieved it since. A note you already acted on needs nothing more; for a
|
|
146
|
+
message that asks for one, a reply or acknowledgement is still owed.
|
|
147
|
+
|
|
140
148
|
An injected peer block is already the message body. If context was compacted,
|
|
141
149
|
or a body did not fit, retrieve exactly the named message:
|
|
142
150
|
|
|
@@ -142,85 +142,26 @@
|
|
|
142
142
|
},
|
|
143
143
|
{
|
|
144
144
|
"client": "claude-code",
|
|
145
|
-
"version": "2.1.
|
|
145
|
+
"version": "2.1.282",
|
|
146
146
|
"platform": "darwin-arm64",
|
|
147
|
-
"observedAt": "2026-09-
|
|
147
|
+
"observedAt": "2026-09-25T21:35:56.792Z",
|
|
148
148
|
"capability": "delivery.livePush",
|
|
149
|
-
"fixture": "fixtures/delivery/claude-code-2.1.
|
|
149
|
+
"fixture": "fixtures/delivery/claude-code-2.1.282.json",
|
|
150
150
|
"idleBehavior": "offered",
|
|
151
151
|
"provenance": "fixtures/certification-provenance.json",
|
|
152
|
-
"provenanceId": "native-delivery-2-1-
|
|
153
|
-
"busyBehavior": "
|
|
152
|
+
"provenanceId": "native-delivery-2-1-282-inbox",
|
|
153
|
+
"busyBehavior": "presented_between_tool_calls",
|
|
154
154
|
"authorityLevel": "experimental",
|
|
155
155
|
"limitations": [
|
|
156
|
-
"
|
|
157
|
-
"the
|
|
158
|
-
"
|
|
159
|
-
"
|
|
160
|
-
"
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
"client": "claude-code",
|
|
166
|
-
"version": "2.1.258",
|
|
167
|
-
"platform": "darwin-arm64",
|
|
168
|
-
"observedAt": "2026-09-02T21:20:11.676Z",
|
|
169
|
-
"capability": "delivery.replyRoute",
|
|
170
|
-
"fixture": "fixtures/delivery/claude-code-2.1.258.json",
|
|
171
|
-
"idleBehavior": "offered",
|
|
172
|
-
"provenance": "fixtures/certification-provenance.json",
|
|
173
|
-
"provenanceId": "native-delivery-2-1-258",
|
|
174
|
-
"busyBehavior": "queued_after_turn",
|
|
175
|
-
"authorityLevel": "experimental",
|
|
176
|
-
"limitations": [
|
|
177
|
-
"captured on darwin-arm64 only; Linux and Windows remain uncaptured",
|
|
178
|
-
"the vendor development-channel warning stayed visible and was accepted by the operator by hand",
|
|
179
|
-
"the plugin .mcp.json must live in the marketplace source copy; the plugin cache copy alone is not read",
|
|
180
|
-
"acc_reply routed through the spike's explicit tool call; the spike created no durable ACC answer record",
|
|
181
|
-
"presentation after the busy turn was observed by the operator; the channel log records the write at 21:18:45Z and the explicit reply at 21:19:21Z"
|
|
182
|
-
],
|
|
183
|
-
"result": "pass"
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
"client": "claude-code",
|
|
187
|
-
"version": "2.1.260",
|
|
188
|
-
"platform": "darwin-arm64",
|
|
189
|
-
"observedAt": "2026-09-04T03:41:29.688Z",
|
|
190
|
-
"capability": "delivery.livePush",
|
|
191
|
-
"fixture": "fixtures/delivery/claude-code-2.1.260.json",
|
|
192
|
-
"idleBehavior": "offered",
|
|
193
|
-
"provenance": "fixtures/certification-provenance.json",
|
|
194
|
-
"provenanceId": "native-delivery-2-1-260",
|
|
195
|
-
"busyBehavior": "queued_after_turn",
|
|
196
|
-
"authorityLevel": "experimental",
|
|
197
|
-
"limitations": [
|
|
198
|
-
"captured on darwin-arm64 only; Linux and Windows remain uncaptured",
|
|
199
|
-
"the vendor development-channel warning stayed visible and was accepted by the operator by hand",
|
|
200
|
-
"two ordinary sessions in one workspace, each bound to its own client process; the earlier 2.1.259 attempt is what exposed the channel binding another session identity, and this run is the verification of that fix",
|
|
201
|
-
"duplicate was observed as one logical message id and one native offer: the repeated send took the durable path, so the channel was never asked to notify twice, and exactly one answer was recorded",
|
|
202
|
-
"busy was observed by the operator: the running turn completed before the channel presented the message, and the session named that order in its own answer"
|
|
203
|
-
],
|
|
204
|
-
"result": "pass"
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
"client": "claude-code",
|
|
208
|
-
"version": "2.1.260",
|
|
209
|
-
"platform": "darwin-arm64",
|
|
210
|
-
"observedAt": "2026-09-04T03:41:29.688Z",
|
|
211
|
-
"capability": "delivery.replyRoute",
|
|
212
|
-
"fixture": "fixtures/delivery/claude-code-2.1.260.json",
|
|
213
|
-
"idleBehavior": "offered",
|
|
214
|
-
"provenance": "fixtures/certification-provenance.json",
|
|
215
|
-
"provenanceId": "native-delivery-2-1-260",
|
|
216
|
-
"busyBehavior": "queued_after_turn",
|
|
217
|
-
"authorityLevel": "experimental",
|
|
218
|
-
"limitations": [
|
|
219
|
-
"captured on darwin-arm64 only; Linux and Windows remain uncaptured",
|
|
220
|
-
"the vendor development-channel warning stayed visible and was accepted by the operator by hand",
|
|
221
|
-
"two ordinary sessions in one workspace, each bound to its own client process; the earlier 2.1.259 attempt is what exposed the channel binding another session identity, and this run is the verification of that fix",
|
|
222
|
-
"duplicate was observed as one logical message id and one native offer: the repeated send took the durable path, so the channel was never asked to notify twice, and exactly one answer was recorded",
|
|
223
|
-
"busy was observed by the operator: the running turn completed before the channel presented the message, and the session named that order in its own answer"
|
|
156
|
+
"Observed on darwin-arm64 with Claude Code 2.1.282 in the TUI, model Sonnet 5, auto permission mode, through a private candidate built from this branch and installed with an isolated ACC data home; the plugin registration in the real Claude config directory was restored byte for byte afterwards.",
|
|
157
|
+
"Every wake carried ACC wording and the message id only. The body reached the model through the UserPromptSubmit projection that each delivered wake fired, inside the untrusted acc-peer-message block.",
|
|
158
|
+
"An idle session started a turn with no user input. A wake sent while a Bash tool call ran was taken after that call returned and before the next one, and the turn continued.",
|
|
159
|
+
"The observed reply loop uses the installed acc reply CLI; native delivery.replyRoute remains false. The router reports a wake as outcome woken via claude-inbox and leaves the receipt queued until the hook's output carried the body, which records it offered via next-turn.",
|
|
160
|
+
"A repeated logical send kept its message id, took the durable path because the receipt was already acknowledged, and produced exactly one wake.",
|
|
161
|
+
"Two sessions in one workspace each bound their own inbox; a message addressed to one never woke the other.",
|
|
162
|
+
"An exited session left no registry entry; the next message stayed queued as recipient_unavailable.",
|
|
163
|
+
"A receiving session in bypassPermissions mode was not captured; Claude Code documents that such a session holds each wake whose sender does not attest bypass, and ACC never attests a mode.",
|
|
164
|
+
"Linux and native Windows remain uncaptured."
|
|
224
165
|
],
|
|
225
166
|
"result": "pass"
|
|
226
167
|
}
|
|
@@ -172,13 +172,13 @@
|
|
|
172
172
|
]
|
|
173
173
|
},
|
|
174
174
|
{
|
|
175
|
-
"id": "native-delivery-2-1-
|
|
175
|
+
"id": "native-delivery-2-1-282-inbox",
|
|
176
176
|
"client": "claude-code",
|
|
177
|
-
"version": "2.1.
|
|
177
|
+
"version": "2.1.282",
|
|
178
178
|
"platform": "darwin-arm64",
|
|
179
|
-
"observedAt": "2026-09-
|
|
180
|
-
"fixture": "fixtures/delivery/claude-code-2.1.
|
|
181
|
-
"sha256": "
|
|
179
|
+
"observedAt": "2026-09-25T21:35:56.792Z",
|
|
180
|
+
"fixture": "fixtures/delivery/claude-code-2.1.282.json",
|
|
181
|
+
"sha256": "7e335f61df97edbd08304227be7335931dae3bc71e3dc639804b656ea2dae66a",
|
|
182
182
|
"event": null,
|
|
183
183
|
"tool": null,
|
|
184
184
|
"claims": [
|
|
@@ -188,80 +188,38 @@
|
|
|
188
188
|
"outcome": {
|
|
189
189
|
"kind": "native-delivery-observed",
|
|
190
190
|
"idle": "offered",
|
|
191
|
-
"busy": "
|
|
191
|
+
"busy": "presented_between_tool_calls",
|
|
192
192
|
"authority": "experimental",
|
|
193
193
|
"limitations": [
|
|
194
|
-
"
|
|
195
|
-
"the
|
|
196
|
-
"
|
|
197
|
-
"
|
|
198
|
-
"
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
"capability": "delivery.replyRoute",
|
|
204
|
-
"result": "pass",
|
|
205
|
-
"outcome": {
|
|
206
|
-
"kind": "native-delivery-observed",
|
|
207
|
-
"idle": "offered",
|
|
208
|
-
"busy": "queued_after_turn",
|
|
209
|
-
"authority": "experimental",
|
|
210
|
-
"limitations": [
|
|
211
|
-
"captured on darwin-arm64 only; Linux and Windows remain uncaptured",
|
|
212
|
-
"the vendor development-channel warning stayed visible and was accepted by the operator by hand",
|
|
213
|
-
"the plugin .mcp.json must live in the marketplace source copy; the plugin cache copy alone is not read",
|
|
214
|
-
"acc_reply routed through the spike's explicit tool call; the spike created no durable ACC answer record",
|
|
215
|
-
"presentation after the busy turn was observed by the operator; the channel log records the write at 21:18:45Z and the explicit reply at 21:19:21Z"
|
|
194
|
+
"Observed on darwin-arm64 with Claude Code 2.1.282 in the TUI, model Sonnet 5, auto permission mode, through a private candidate built from this branch and installed with an isolated ACC data home; the plugin registration in the real Claude config directory was restored byte for byte afterwards.",
|
|
195
|
+
"Every wake carried ACC wording and the message id only. The body reached the model through the UserPromptSubmit projection that each delivered wake fired, inside the untrusted acc-peer-message block.",
|
|
196
|
+
"An idle session started a turn with no user input. A wake sent while a Bash tool call ran was taken after that call returned and before the next one, and the turn continued.",
|
|
197
|
+
"The observed reply loop uses the installed acc reply CLI; native delivery.replyRoute remains false. The router reports a wake as outcome woken via claude-inbox and leaves the receipt queued until the hook's output carried the body, which records it offered via next-turn.",
|
|
198
|
+
"A repeated logical send kept its message id, took the durable path because the receipt was already acknowledged, and produced exactly one wake.",
|
|
199
|
+
"Two sessions in one workspace each bound their own inbox; a message addressed to one never woke the other.",
|
|
200
|
+
"An exited session left no registry entry; the next message stayed queued as recipient_unavailable.",
|
|
201
|
+
"A receiving session in bypassPermissions mode was not captured; Claude Code documents that such a session holds each wake whose sender does not attest bypass, and ACC never attests a mode.",
|
|
202
|
+
"Linux and native Windows remain uncaptured."
|
|
216
203
|
]
|
|
217
204
|
}
|
|
218
205
|
}
|
|
219
|
-
]
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
"
|
|
225
|
-
"platform": "darwin-arm64",
|
|
226
|
-
"observedAt": "2026-09-04T03:41:29.688Z",
|
|
227
|
-
"fixture": "fixtures/delivery/claude-code-2.1.260.json",
|
|
228
|
-
"sha256": "7513d13b6dc1c6b485d899550f43ae3577cd99fca108f06691f7ad07daf06f03",
|
|
229
|
-
"event": null,
|
|
230
|
-
"tool": null,
|
|
231
|
-
"claims": [
|
|
206
|
+
],
|
|
207
|
+
"productEvidence": {
|
|
208
|
+
"fixture": "fixtures/delivery/claude-code-2.1.282-product-evidence.json",
|
|
209
|
+
"sha256": "1ac87ee547c6fdb38e0bdd62830f1fbd23bca51219a7ba906c7a0a1b2efd1346"
|
|
210
|
+
},
|
|
211
|
+
"historicalFixtures": [
|
|
232
212
|
{
|
|
233
|
-
"
|
|
234
|
-
"
|
|
235
|
-
"outcome": {
|
|
236
|
-
"kind": "native-delivery-observed",
|
|
237
|
-
"idle": "offered",
|
|
238
|
-
"busy": "queued_after_turn",
|
|
239
|
-
"authority": "experimental",
|
|
240
|
-
"limitations": [
|
|
241
|
-
"captured on darwin-arm64 only; Linux and Windows remain uncaptured",
|
|
242
|
-
"the vendor development-channel warning stayed visible and was accepted by the operator by hand",
|
|
243
|
-
"two ordinary sessions in one workspace, each bound to its own client process; the earlier 2.1.259 attempt is what exposed the channel binding another session identity, and this run is the verification of that fix",
|
|
244
|
-
"duplicate was observed as one logical message id and one native offer: the repeated send took the durable path, so the channel was never asked to notify twice, and exactly one answer was recorded",
|
|
245
|
-
"busy was observed by the operator: the running turn completed before the channel presented the message, and the session named that order in its own answer"
|
|
246
|
-
]
|
|
247
|
-
}
|
|
213
|
+
"fixture": "fixtures/inbox-wake-2.1.282.json",
|
|
214
|
+
"sha256": "247836aefd6e446670f53e63ed3a29483a9124bfc7b38fc69ba7cd5e866fa2e1"
|
|
248
215
|
},
|
|
249
216
|
{
|
|
250
|
-
"
|
|
251
|
-
"
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
"authority": "experimental",
|
|
257
|
-
"limitations": [
|
|
258
|
-
"captured on darwin-arm64 only; Linux and Windows remain uncaptured",
|
|
259
|
-
"the vendor development-channel warning stayed visible and was accepted by the operator by hand",
|
|
260
|
-
"two ordinary sessions in one workspace, each bound to its own client process; the earlier 2.1.259 attempt is what exposed the channel binding another session identity, and this run is the verification of that fix",
|
|
261
|
-
"duplicate was observed as one logical message id and one native offer: the repeated send took the durable path, so the channel was never asked to notify twice, and exactly one answer was recorded",
|
|
262
|
-
"busy was observed by the operator: the running turn completed before the channel presented the message, and the session named that order in its own answer"
|
|
263
|
-
]
|
|
264
|
-
}
|
|
217
|
+
"fixture": "fixtures/delivery/claude-code-2.1.258.json",
|
|
218
|
+
"sha256": "c68e84989c02fa0657d0a8669a774ab1e301088d8c7856346cc9739d0fbad228"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"fixture": "fixtures/delivery/claude-code-2.1.260.json",
|
|
222
|
+
"sha256": "7513d13b6dc1c6b485d899550f43ae3577cd99fca108f06691f7ad07daf06f03"
|
|
265
223
|
}
|
|
266
224
|
]
|
|
267
225
|
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"source": "real-client-capture",
|
|
4
|
+
"client": "claude-code",
|
|
5
|
+
"phase": "product",
|
|
6
|
+
"clientVersion": "2.1.282",
|
|
7
|
+
"platform": "darwin-arm64",
|
|
8
|
+
"packageSha256": "fa81c55588988ed7274636c564a0adb5c442110f014f82e7a3f94da26fdd8891",
|
|
9
|
+
"startedAt": "2026-09-25T21:31:56.000Z",
|
|
10
|
+
"finishedAt": "2026-09-25T21:35:56.792Z",
|
|
11
|
+
"scenarioCount": 6,
|
|
12
|
+
"passedCount": 6,
|
|
13
|
+
"failedCount": 0,
|
|
14
|
+
"cleanup": {
|
|
15
|
+
"attempted": true,
|
|
16
|
+
"outcome": "passed",
|
|
17
|
+
"ownedProcesses": "stopped",
|
|
18
|
+
"temporaryState": "removed"
|
|
19
|
+
},
|
|
20
|
+
"scenarios": [
|
|
21
|
+
{
|
|
22
|
+
"caseId": "C01",
|
|
23
|
+
"outcome": "passed",
|
|
24
|
+
"startedAt": "2026-09-25T21:31:56.000Z",
|
|
25
|
+
"finishedAt": "2026-09-25T21:32:44.339Z",
|
|
26
|
+
"messageId": "message_EaLKeCerBFIR_o0gQpT4vQ",
|
|
27
|
+
"observations": [
|
|
28
|
+
{
|
|
29
|
+
"kind": "delivery",
|
|
30
|
+
"at": "2026-09-25T21:32:44.339Z",
|
|
31
|
+
"outcome": "woken"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"kind": "wake",
|
|
35
|
+
"at": "2026-09-25T21:31:56.373Z",
|
|
36
|
+
"outcome": "started-turn"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"kind": "projection",
|
|
40
|
+
"at": "2026-09-25T21:31:56.808Z",
|
|
41
|
+
"outcome": "body-shown"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"kind": "offer",
|
|
45
|
+
"at": "2026-09-25T21:31:56.724Z",
|
|
46
|
+
"outcome": "next-turn"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"caseId": "C02",
|
|
52
|
+
"outcome": "passed",
|
|
53
|
+
"startedAt": "2026-09-25T21:33:05.000Z",
|
|
54
|
+
"finishedAt": "2026-09-25T21:34:19.560Z",
|
|
55
|
+
"messageId": "message_YFDLjj4jtNLDsC67GV9Y1g",
|
|
56
|
+
"observations": [
|
|
57
|
+
{
|
|
58
|
+
"kind": "delivery",
|
|
59
|
+
"at": "2026-09-25T21:34:19.560Z",
|
|
60
|
+
"outcome": "woken"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"kind": "wake",
|
|
64
|
+
"at": "2026-09-25T21:33:05.316Z",
|
|
65
|
+
"outcome": "between-tool-calls"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"kind": "projection",
|
|
69
|
+
"at": "2026-09-25T21:33:17.285Z",
|
|
70
|
+
"outcome": "body-shown"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"kind": "offer",
|
|
74
|
+
"at": "2026-09-25T21:33:17.207Z",
|
|
75
|
+
"outcome": "next-turn"
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"caseId": "C03",
|
|
81
|
+
"outcome": "passed",
|
|
82
|
+
"startedAt": "2026-09-25T21:31:56.000Z",
|
|
83
|
+
"finishedAt": "2026-09-25T21:32:44.370Z",
|
|
84
|
+
"messageId": "message_EaLKeCerBFIR_o0gQpT4vQ",
|
|
85
|
+
"observations": [
|
|
86
|
+
{
|
|
87
|
+
"kind": "answer",
|
|
88
|
+
"at": "2026-09-25T21:32:16.968Z",
|
|
89
|
+
"outcome": "recorded"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"kind": "receipt",
|
|
93
|
+
"at": "2026-09-25T21:32:16.968Z",
|
|
94
|
+
"outcome": "acknowledged"
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"caseId": "C04",
|
|
100
|
+
"outcome": "passed",
|
|
101
|
+
"startedAt": "2026-09-25T21:34:28.000Z",
|
|
102
|
+
"finishedAt": "2026-09-25T21:34:56.510Z",
|
|
103
|
+
"messageId": "message_zzo8wi26wFyq8hfGvAsWIw",
|
|
104
|
+
"observations": [
|
|
105
|
+
{
|
|
106
|
+
"kind": "logical-message",
|
|
107
|
+
"at": "2026-09-25T21:34:56.510Z",
|
|
108
|
+
"outcome": "same-message-id"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"kind": "wake",
|
|
112
|
+
"at": "2026-09-25T21:34:28.385Z",
|
|
113
|
+
"outcome": "delivered-once"
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"caseId": "C05",
|
|
119
|
+
"outcome": "passed",
|
|
120
|
+
"startedAt": "2026-09-25T21:35:44.000Z",
|
|
121
|
+
"finishedAt": "2026-09-25T21:35:56.792Z",
|
|
122
|
+
"messageId": "message_owEZDIuuC0KygynZk-b0Hg",
|
|
123
|
+
"observations": [
|
|
124
|
+
{
|
|
125
|
+
"kind": "delivery",
|
|
126
|
+
"at": "2026-09-25T21:35:56.792Z",
|
|
127
|
+
"outcome": "queued"
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"kind": "client",
|
|
131
|
+
"outcome": "exited",
|
|
132
|
+
"at": "2026-09-25T21:35:47.000Z"
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"caseId": "C06",
|
|
138
|
+
"outcome": "passed",
|
|
139
|
+
"startedAt": "2026-09-25T21:35:05.000Z",
|
|
140
|
+
"finishedAt": "2026-09-25T21:35:34.783Z",
|
|
141
|
+
"messageId": "message_tDm0K7jQWFVKmVhs_t_29Q",
|
|
142
|
+
"observations": [
|
|
143
|
+
{
|
|
144
|
+
"kind": "delivery",
|
|
145
|
+
"at": "2026-09-25T21:35:34.783Z",
|
|
146
|
+
"outcome": "woken"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"kind": "wake",
|
|
150
|
+
"at": "2026-09-25T21:35:05.754Z",
|
|
151
|
+
"outcome": "started-turn"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"kind": "other-session",
|
|
155
|
+
"at": "2026-09-25T21:35:34.783Z",
|
|
156
|
+
"outcome": "not-woken"
|
|
157
|
+
}
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "claude-code",
|
|
3
|
+
"version": "2.1.282",
|
|
4
|
+
"platform": "darwin-arm64",
|
|
5
|
+
"observedAt": "2026-09-25T21:35:56.792Z",
|
|
6
|
+
"capability": "native_delivery",
|
|
7
|
+
"result": "pass",
|
|
8
|
+
"fixture": "claude-code-2.1.282",
|
|
9
|
+
"launchMode": "ordinary-command-with-installed-hooks",
|
|
10
|
+
"protocolContract": "claude-code-inbox-socket-v1",
|
|
11
|
+
"idle": "offered",
|
|
12
|
+
"busy": "presented_between_tool_calls",
|
|
13
|
+
"reply": "routed",
|
|
14
|
+
"duplicate": "same_message_id",
|
|
15
|
+
"fallback": "queued",
|
|
16
|
+
"limitations": [
|
|
17
|
+
"Observed on darwin-arm64 with Claude Code 2.1.282 in the TUI, model Sonnet 5, auto permission mode, through a private candidate built from this branch and installed with an isolated ACC data home; the plugin registration in the real Claude config directory was restored byte for byte afterwards.",
|
|
18
|
+
"Every wake carried ACC wording and the message id only. The body reached the model through the UserPromptSubmit projection that each delivered wake fired, inside the untrusted acc-peer-message block.",
|
|
19
|
+
"An idle session started a turn with no user input. A wake sent while a Bash tool call ran was taken after that call returned and before the next one, and the turn continued.",
|
|
20
|
+
"The observed reply loop uses the installed acc reply CLI; native delivery.replyRoute remains false. The router reports a wake as outcome woken via claude-inbox and leaves the receipt queued until the hook's output carried the body, which records it offered via next-turn.",
|
|
21
|
+
"A repeated logical send kept its message id, took the durable path because the receipt was already acknowledged, and produced exactly one wake.",
|
|
22
|
+
"Two sessions in one workspace each bound their own inbox; a message addressed to one never woke the other.",
|
|
23
|
+
"An exited session left no registry entry; the next message stayed queued as recipient_unavailable.",
|
|
24
|
+
"A receiving session in bypassPermissions mode was not captured; Claude Code documents that such a session holds each wake whose sender does not attest bypass, and ACC never attests a mode.",
|
|
25
|
+
"Linux and native Windows remain uncaptured."
|
|
26
|
+
],
|
|
27
|
+
"packageSha256": "fa81c55588988ed7274636c564a0adb5c442110f014f82e7a3f94da26fdd8891"
|
|
28
|
+
}
|
package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/inbox-wake-2.1.282.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"note": "Transport capture of the Claude Code session inbox, run on Claude Code 2.1.282, macOS arm64, 2026-09-25, before any ACC code used it. A receiving interactive TUI session ran from the real executable in auto mode with ACC 0.7.0 hooks installed and no Channel. A separate process, not a child of the receiver, wrote one JSON line per connection to the socket the session registry named, with no auth line and no token. Session ids, paths, pids and message text are redacted; outcomes are read from the receiver's own transcript records and ACC's store events.",
|
|
3
|
+
"clientVersion": "2.1.282",
|
|
4
|
+
"platform": "darwin-arm64",
|
|
5
|
+
"observedAt": "2026-09-25T19:40:41.000Z",
|
|
6
|
+
"registry": {
|
|
7
|
+
"file": "<config>/sessions/<pid>.json",
|
|
8
|
+
"fieldsRead": ["pid", "sessionId", "messagingSocketPath"],
|
|
9
|
+
"sessionIdEqualsHookSessionId": true,
|
|
10
|
+
"statusValuesSeen": ["idle", "busy", "waiting"]
|
|
11
|
+
},
|
|
12
|
+
"frame": {
|
|
13
|
+
"shape": { "type": "user", "message": { "role": "user", "content": "<text>" }, "msg_id": "<id>" },
|
|
14
|
+
"authLine": "absent",
|
|
15
|
+
"socketAnswer": "none"
|
|
16
|
+
},
|
|
17
|
+
"idle": {
|
|
18
|
+
"result": "new turn started without user input",
|
|
19
|
+
"transcriptRecord": "user, isMeta, origin.kind peer, verifiedPeerPid set",
|
|
20
|
+
"userPromptSubmitFired": true
|
|
21
|
+
},
|
|
22
|
+
"busy": {
|
|
23
|
+
"result": "queued while a Bash tool call ran; delivered after its tool_result, before the next tool call; the turn continued",
|
|
24
|
+
"transcriptRecord": "attachment queued_command, origin.kind peer",
|
|
25
|
+
"userPromptSubmitFired": true
|
|
26
|
+
},
|
|
27
|
+
"accWake": {
|
|
28
|
+
"frameCarried": "ACC wording and the message id only",
|
|
29
|
+
"idle": "the beforeTurn projection showed the queued ACC question in its untrusted block; the model answered with acc reply; the store recorded the answer and acknowledged",
|
|
30
|
+
"midTurn": "the same projection arrived with the UserPromptSubmit that the mid-turn frame fired; the model answered after its running commands",
|
|
31
|
+
"offerRecordedAs": "next-turn"
|
|
32
|
+
},
|
|
33
|
+
"inbound": {
|
|
34
|
+
"promptingReceiverUnattestedSender": "delivered",
|
|
35
|
+
"promptingReceiverSenderAttestsBypass": "held with an approval dialog; registry status waiting; deny dropped it",
|
|
36
|
+
"bypassReceiver": "unobserved"
|
|
37
|
+
},
|
|
38
|
+
"burst": {
|
|
39
|
+
"framesFromSeparateProcesses": 6,
|
|
40
|
+
"delivered": 6,
|
|
41
|
+
"queuedFramesDeliveredInOneTurn": 5,
|
|
42
|
+
"userPromptSubmitPerFrame": true
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agents-can-communicate/adapter-claude-code",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./src/adapter.mjs",
|
|
8
|
-
"./
|
|
8
|
+
"./inbox-delivery": "./src/inbox-delivery.mjs"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"certification.json",
|
|
@@ -18,6 +18,9 @@
|
|
|
18
18
|
"fixtures/delivery/claude-code-2.1.252.json",
|
|
19
19
|
"fixtures/delivery/claude-code-2.1.258.json",
|
|
20
20
|
"fixtures/delivery/claude-code-2.1.260.json",
|
|
21
|
+
"fixtures/delivery/claude-code-2.1.282.json",
|
|
22
|
+
"fixtures/delivery/claude-code-2.1.282-product-evidence.json",
|
|
23
|
+
"fixtures/inbox-wake-2.1.282.json",
|
|
21
24
|
"src/",
|
|
22
25
|
"plugin/"
|
|
23
26
|
]
|
|
@@ -111,6 +111,10 @@ the communication obligation rather than proving the requested action is complet
|
|
|
111
111
|
An acknowledgement confirms receipt, not acceptance of work. Read the peer's
|
|
112
112
|
answer for the scope it accepted or the result it actually checked.
|
|
113
113
|
|
|
114
|
+
To see where a message you sent got to, read it exactly:
|
|
115
|
+
`{{ACC}} sync --scope history --message <id> --json` lists each recipient's
|
|
116
|
+
receipt state, when it last changed, and the transport that offered it.
|
|
117
|
+
|
|
114
118
|
## Read and answer only your inbox
|
|
115
119
|
|
|
116
120
|
Plain `{{ACC}} inbox` returns `{items, nextCursor}`: pending message headers,
|
|
@@ -125,6 +129,10 @@ Pages default to 20 items and stay within 12,000 bytes of formatted page JSON.
|
|
|
125
129
|
Use `inbox --cursor <nextCursor>` for older headers when needed. Omit the cursor
|
|
126
130
|
on a new poll to see arrivals; a cursor is the complete last message id, not an offset.
|
|
127
131
|
|
|
132
|
+
A peer block with a `repeat:` line was pushed live earlier and nothing has
|
|
133
|
+
retrieved it since. A note you already acted on needs nothing more; for a
|
|
134
|
+
message that asks for one, a reply or acknowledgement is still owed.
|
|
135
|
+
|
|
128
136
|
An injected peer block is already the message body. If context was compacted,
|
|
129
137
|
or a body did not fit, retrieve exactly the named message:
|
|
130
138
|
|