agents-can-communicate 0.2.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.
Files changed (96) hide show
  1. package/README.md +91 -81
  2. package/SECURITY.md +7 -4
  3. package/bin/acc-bootstrap.mjs +56 -0
  4. package/bin/acc-claude-channel.mjs +177 -0
  5. package/bin/acc.mjs +7 -2
  6. package/docs/ADAPTER_AUTHORING.md +57 -21
  7. package/docs/ARCHITECTURE.md +23 -15
  8. package/docs/CAPABILITIES.md +51 -18
  9. package/docs/CLI.md +31 -13
  10. package/docs/CONCEPTS.md +91 -94
  11. package/docs/CONFIGURATION.md +33 -23
  12. package/docs/DESIGN_DECISIONS.md +8 -4
  13. package/docs/GETTING_STARTED.md +76 -100
  14. package/docs/GLOSSARY.md +4 -4
  15. package/docs/HOW_IT_WORKS.md +163 -0
  16. package/docs/MCP.md +8 -8
  17. package/docs/PROTOCOL.md +13 -8
  18. package/docs/RELEASING.md +112 -82
  19. package/docs/SECURITY_MODEL.md +13 -8
  20. package/docs/TROUBLESHOOTING.md +30 -12
  21. package/docs/WHY_ACC.md +18 -16
  22. package/docs/index.md +26 -16
  23. package/node_modules/@agents-can-communicate/adapter-claude-code/certification.json +196 -46
  24. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/certification-provenance.json +237 -45
  25. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.252.json +3 -1
  26. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.258.json +23 -0
  27. package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.260.json +23 -0
  28. package/node_modules/@agents-can-communicate/adapter-claude-code/package.json +5 -2
  29. package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/.mcp.json +8 -0
  30. package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/skills/acc/SKILL.md +10 -6
  31. package/node_modules/@agents-can-communicate/adapter-claude-code/src/adapter.mjs +34 -2
  32. package/node_modules/@agents-can-communicate/adapter-claude-code/src/channel.mjs +377 -0
  33. package/node_modules/@agents-can-communicate/adapter-claude-code/src/install.mjs +27 -7
  34. package/node_modules/@agents-can-communicate/adapter-claude-code/src/native-delivery.mjs +229 -0
  35. package/node_modules/@agents-can-communicate/adapter-codex/certification.json +38 -5
  36. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/certification-provenance.json +171 -38
  37. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.0.json +3 -1
  38. package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.1-remote-workspace.json +25 -0
  39. package/node_modules/@agents-can-communicate/adapter-codex/package.json +4 -2
  40. package/node_modules/@agents-can-communicate/adapter-codex/plugin/skills/acc/SKILL.md +9 -5
  41. package/node_modules/@agents-can-communicate/adapter-codex/src/adapter.mjs +42 -7
  42. package/node_modules/@agents-can-communicate/adapter-codex/src/app-server-client.mjs +121 -0
  43. package/node_modules/@agents-can-communicate/adapter-codex/src/native-delivery.mjs +151 -0
  44. package/node_modules/@agents-can-communicate/adapter-codex/src/ws-json-rpc.mjs +192 -0
  45. package/node_modules/@agents-can-communicate/adapter-gemini-cli/certification.json +44 -28
  46. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/gemini-extension.json +1 -1
  47. package/node_modules/@agents-can-communicate/adapter-gemini-cli/extension/skills/acc/SKILL.md +9 -5
  48. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/{BeforeAgent.json → BeforeAgent-0.57.0.json} +2 -2
  49. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/{BeforeTool.json → BeforeTool-0.57.0.json} +2 -2
  50. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/{BeforeTool-shell.json → BeforeTool-shell-0.57.0.json} +2 -2
  51. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/{SessionEnd.json → SessionEnd-0.57.0.json} +2 -2
  52. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/{SessionStart.json → SessionStart-0.57.0.json} +2 -2
  53. package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/certification-provenance.json +266 -39
  54. package/node_modules/@agents-can-communicate/adapter-gemini-cli/package.json +6 -6
  55. package/node_modules/@agents-can-communicate/adapter-gemini-cli/src/adapter.mjs +25 -11
  56. package/node_modules/@agents-can-communicate/adapter-grok/package.json +1 -1
  57. package/node_modules/@agents-can-communicate/adapter-grok/plugin/skills/acc/SKILL.md +9 -5
  58. package/node_modules/@agents-can-communicate/adapter-grok/src/adapter.mjs +3 -1
  59. package/node_modules/@agents-can-communicate/adapter-kimi/package.json +1 -1
  60. package/node_modules/@agents-can-communicate/adapter-kimi/plugin/skills/acc/SKILL.md +9 -5
  61. package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
  62. package/node_modules/@agents-can-communicate/adapter-sdk/src/capabilities.mjs +18 -0
  63. package/node_modules/@agents-can-communicate/adapter-sdk/src/hook-shim.mjs +2 -0
  64. package/node_modules/@agents-can-communicate/adapter-sdk/src/index.mjs +6 -2
  65. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-activation.mjs +76 -0
  66. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-delivery.mjs +202 -0
  67. package/node_modules/@agents-can-communicate/adapter-sdk/src/native-vocabulary.mjs +101 -0
  68. package/node_modules/@agents-can-communicate/adapter-sdk/src/session-binding.mjs +17 -2
  69. package/node_modules/@agents-can-communicate/cli/package.json +1 -1
  70. package/node_modules/@agents-can-communicate/cli/src/args.mjs +2 -2
  71. package/node_modules/@agents-can-communicate/cli/src/doctor-command.mjs +67 -5
  72. package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +133 -11
  73. package/node_modules/@agents-can-communicate/core/package.json +1 -1
  74. package/node_modules/@agents-can-communicate/core/src/conversations.mjs +41 -1
  75. package/node_modules/@agents-can-communicate/core/src/delivery-bindings.mjs +52 -2
  76. package/node_modules/@agents-can-communicate/core/src/service.mjs +10 -0
  77. package/node_modules/@agents-can-communicate/delivery-router/package.json +1 -1
  78. package/node_modules/@agents-can-communicate/delivery-router/src/router.mjs +26 -12
  79. package/node_modules/@agents-can-communicate/hook-runner/package.json +4 -2
  80. package/node_modules/@agents-can-communicate/hook-runner/src/native-binding.mjs +90 -0
  81. package/node_modules/@agents-can-communicate/hook-runner/src/runner.mjs +123 -90
  82. package/node_modules/@agents-can-communicate/installer/package.json +4 -2
  83. package/node_modules/@agents-can-communicate/installer/src/apply.mjs +48 -4
  84. package/node_modules/@agents-can-communicate/installer/src/bootstrap-runtime.mjs +144 -0
  85. package/node_modules/@agents-can-communicate/installer/src/detect.mjs +72 -3
  86. package/node_modules/@agents-can-communicate/installer/src/index.mjs +7 -0
  87. package/node_modules/@agents-can-communicate/installer/src/native-activation.mjs +161 -0
  88. package/node_modules/@agents-can-communicate/installer/src/ownership.mjs +6 -2
  89. package/node_modules/@agents-can-communicate/installer/src/plan.mjs +41 -6
  90. package/node_modules/@agents-can-communicate/installer/src/shell-bootstrap.mjs +210 -0
  91. package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
  92. package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
  93. package/node_modules/@agents-can-communicate/protocol/src/fields.mjs +17 -0
  94. package/node_modules/@agents-can-communicate/protocol/src/schema.mjs +18 -3
  95. package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
  96. package/package.json +2 -1
@@ -47,14 +47,14 @@ diffs. Prefer a conclusion, stable ids or paths, and the next action.
47
47
  For information that needs no response:
48
48
 
49
49
  ```bash
50
- {{ACC}} message --to models --type note --subject "schema verified" \
50
+ {{ACC}} message --to codex --type note --subject "schema verified" \
51
51
  --body "Record v2 accepts nullable pid; no migration is planned."
52
52
  ```
53
53
 
54
54
  For a question, use the kind whose default obligation is a reply:
55
55
 
56
56
  ```bash
57
- {{ACC}} message --to models --type question \
57
+ {{ACC}} message --to codex --type question \
58
58
  --subject "claim boundary" --body "Can I take file:src/parser/** after your commit?"
59
59
  ```
60
60
 
@@ -65,13 +65,17 @@ When the peer should own a concrete piece of work, send one reply-required reque
65
65
  --detail "Check queued -> retrieved and reply -> acknowledged; return only defects."
66
66
  ```
67
67
 
68
- Participant names come from `{{ACC}} status --json`. A request is not an order.
68
+ Address a peer by its client - `codex`, `claude_code`, `gemini_cli` - when one session of
69
+ it is here; `{{ACC}} status --json` names them all, and two sessions of one client have to be
70
+ named exactly. A request is not an order.
69
71
 
70
72
  ## Treat delivery as evidence
71
73
 
72
74
  Every send records durably before delivery is attempted. A queued diagnostic means
73
- the message is safe in the recipient's inbox. Exact-certified clients may offer it
74
- at the next normal turn; no shipped adapter currently has certified live push.
75
+ the message is safe in the recipient's inbox. It may then be offered at the next
76
+ normal turn, or, on a client with native delivery enabled, pushed into the running
77
+ session. Delivery is behaviour, not a promise: a queued message is safe; an offered
78
+ message reached a transport but is not proof the model read it.
75
79
 
76
80
  `offered` is not read, `retrieved` is not model attention, and a reply resolves
77
81
  the communication obligation rather than proving the requested action is complete.
@@ -1,8 +1,8 @@
1
1
  {
2
- "session_id": "4fe4a52a-ad70-451d-a5d1-3a58a309f291",
2
+ "session_id": "d3effafd-204b-4b94-8b01-ad3efed7bf18",
3
3
  "transcript_path": "<redacted: conversation transcript>",
4
4
  "cwd": "/tmp/example-workspace",
5
5
  "hook_event_name": "BeforeAgent",
6
- "timestamp": "2026-08-16T07:26:52.819Z",
6
+ "timestamp": "2026-09-03T16:29:35.391Z",
7
7
  "prompt": "<redacted: conversation content>"
8
8
  }
@@ -1,9 +1,9 @@
1
1
  {
2
- "session_id": "4fe4a52a-ad70-451d-a5d1-3a58a309f291",
2
+ "session_id": "d3effafd-204b-4b94-8b01-ad3efed7bf18",
3
3
  "transcript_path": "<redacted: conversation transcript>",
4
4
  "cwd": "/tmp/example-workspace",
5
5
  "hook_event_name": "BeforeTool",
6
- "timestamp": "2026-08-16T07:28:20.405Z",
6
+ "timestamp": "2026-09-03T16:29:35.450Z",
7
7
  "tool_name": "write_file",
8
8
  "tool_input": {
9
9
  "file_path": "/tmp/example-workspace/notes.txt",
@@ -1,9 +1,9 @@
1
1
  {
2
- "session_id": "4fe4a52a-ad70-451d-a5d1-3a58a309f291",
2
+ "session_id": "d3effafd-204b-4b94-8b01-ad3efed7bf18",
3
3
  "transcript_path": "<redacted: conversation transcript>",
4
4
  "cwd": "/tmp/example-workspace",
5
5
  "hook_event_name": "BeforeTool",
6
- "timestamp": "2026-08-16T07:26:39.295Z",
6
+ "timestamp": "2026-09-03T16:29:35.868Z",
7
7
  "tool_name": "run_shell_command",
8
8
  "tool_input": {
9
9
  "command": "<redacted: conversation content>",
@@ -1,8 +1,8 @@
1
1
  {
2
- "session_id": "4fe4a52a-ad70-451d-a5d1-3a58a309f291",
2
+ "session_id": "d3effafd-204b-4b94-8b01-ad3efed7bf18",
3
3
  "transcript_path": "<redacted: conversation transcript>",
4
4
  "cwd": "/tmp/example-workspace",
5
5
  "hook_event_name": "SessionEnd",
6
- "timestamp": "2026-08-16T07:28:20.484Z",
6
+ "timestamp": "2026-09-03T16:29:35.927Z",
7
7
  "reason": "exit"
8
8
  }
@@ -1,8 +1,8 @@
1
1
  {
2
- "session_id": "4fe4a52a-ad70-451d-a5d1-3a58a309f291",
2
+ "session_id": "d3effafd-204b-4b94-8b01-ad3efed7bf18",
3
3
  "transcript_path": "<redacted: conversation transcript>",
4
4
  "cwd": "/tmp/example-workspace",
5
5
  "hook_event_name": "SessionStart",
6
- "timestamp": "2026-08-16T07:26:52.802Z",
6
+ "timestamp": "2026-09-03T16:29:35.381Z",
7
7
  "source": "startup"
8
8
  }
@@ -2,65 +2,292 @@
2
2
  "schemaVersion": 1,
3
3
  "captures": [
4
4
  {
5
- "id": "session-start", "client": "gemini-cli", "version": "0.37.0",
6
- "platform": "darwin-arm64", "observedAt": "2026-08-16",
5
+ "id": "session-start",
6
+ "client": "gemini-cli",
7
+ "version": "0.37.0",
8
+ "platform": "darwin-arm64",
9
+ "observedAt": "2026-08-16",
7
10
  "fixture": "fixtures/SessionStart.json",
8
11
  "sha256": "30ee33373127ebedea181f743dc606a193911f6a259d58ef4cdedffc09512ad3",
9
- "event": "SessionStart", "tool": null,
10
- "claims": [{ "capability": "lifecycle.sessionStart", "result": "pass",
11
- "outcome": { "kind": "event-observed", "idle": "fires when a session starts",
12
- "busy": "fires before the first model turn", "authority": "advisory",
13
- "limitations": ["capture used temporary project settings"] } }]
12
+ "event": "SessionStart",
13
+ "tool": null,
14
+ "claims": [
15
+ {
16
+ "capability": "lifecycle.sessionStart",
17
+ "result": "pass",
18
+ "outcome": {
19
+ "kind": "event-observed",
20
+ "idle": "fires when a session starts",
21
+ "busy": "fires before the first model turn",
22
+ "authority": "advisory",
23
+ "limitations": [
24
+ "capture used temporary project settings"
25
+ ]
26
+ }
27
+ }
28
+ ]
14
29
  },
15
30
  {
16
- "id": "session-end", "client": "gemini-cli", "version": "0.37.0",
17
- "platform": "darwin-arm64", "observedAt": "2026-08-16",
31
+ "id": "session-end",
32
+ "client": "gemini-cli",
33
+ "version": "0.37.0",
34
+ "platform": "darwin-arm64",
35
+ "observedAt": "2026-08-16",
18
36
  "fixture": "fixtures/SessionEnd.json",
19
37
  "sha256": "e4a61680c96b4d1a921a142e29b34b667cd843cfb27f361c05efb07dfea75796",
20
- "event": "SessionEnd", "tool": null,
21
- "claims": [{ "capability": "lifecycle.sessionEnd", "result": "pass",
22
- "outcome": { "kind": "event-observed", "idle": "fires when a session exits",
23
- "busy": "does not run until the session exits", "authority": "advisory",
24
- "limitations": ["handoff must be written before session end"] } }]
38
+ "event": "SessionEnd",
39
+ "tool": null,
40
+ "claims": [
41
+ {
42
+ "capability": "lifecycle.sessionEnd",
43
+ "result": "pass",
44
+ "outcome": {
45
+ "kind": "event-observed",
46
+ "idle": "fires when a session exits",
47
+ "busy": "does not run until the session exits",
48
+ "authority": "advisory",
49
+ "limitations": [
50
+ "handoff must be written before session end"
51
+ ]
52
+ }
53
+ }
54
+ ]
25
55
  },
26
56
  {
27
- "id": "before-agent", "client": "gemini-cli", "version": "0.37.0",
28
- "platform": "darwin-arm64", "observedAt": "2026-08-16",
57
+ "id": "before-agent",
58
+ "client": "gemini-cli",
59
+ "version": "0.37.0",
60
+ "platform": "darwin-arm64",
61
+ "observedAt": "2026-08-16",
29
62
  "fixture": "fixtures/BeforeAgent.json",
30
63
  "sha256": "87e1baebbf94ecd7d6a56d92a594a095f20d893bcde7e46ad053f164855528d5",
31
- "event": "BeforeAgent", "tool": null,
64
+ "event": "BeforeAgent",
65
+ "tool": null,
32
66
  "claims": [
33
- { "capability": "context.beforeTurnInjection", "result": "pass",
34
- "outcome": { "kind": "model-context-observed", "idle": "waits for the next user prompt",
35
- "busy": "does not interrupt an in-progress turn", "authority": "context",
36
- "limitations": ["requires the hookSpecificOutput additionalContext envelope"] } },
37
- { "capability": "delivery.nextTurn", "result": "pass",
38
- "outcome": { "kind": "model-context-observed", "idle": "offers complete peer messages at the next prompt",
39
- "busy": "does not interrupt an in-progress turn", "authority": "context",
40
- "limitations": ["delivery requires the next normal user turn"] } }
67
+ {
68
+ "capability": "context.beforeTurnInjection",
69
+ "result": "pass",
70
+ "outcome": {
71
+ "kind": "model-context-observed",
72
+ "idle": "waits for the next user prompt",
73
+ "busy": "does not interrupt an in-progress turn",
74
+ "authority": "context",
75
+ "limitations": [
76
+ "requires the hookSpecificOutput additionalContext envelope"
77
+ ]
78
+ }
79
+ },
80
+ {
81
+ "capability": "delivery.nextTurn",
82
+ "result": "pass",
83
+ "outcome": {
84
+ "kind": "model-context-observed",
85
+ "idle": "offers complete peer messages at the next prompt",
86
+ "busy": "does not interrupt an in-progress turn",
87
+ "authority": "context",
88
+ "limitations": [
89
+ "delivery requires the next normal user turn"
90
+ ]
91
+ }
92
+ }
41
93
  ]
42
94
  },
43
95
  {
44
- "id": "before-tool-write", "client": "gemini-cli", "version": "0.37.0",
45
- "platform": "darwin-arm64", "observedAt": "2026-08-16",
96
+ "id": "before-tool-write",
97
+ "client": "gemini-cli",
98
+ "version": "0.37.0",
99
+ "platform": "darwin-arm64",
100
+ "observedAt": "2026-08-16",
46
101
  "fixture": "fixtures/BeforeTool.json",
47
102
  "sha256": "23c08aaf65f4b3bc060e99fdb7fab0c2db7242a0fc0e86b6dea02e85e8b1383c",
48
- "event": "BeforeTool", "tool": "write_file",
49
- "claims": [{ "capability": "guards.beforeWrite", "result": "pass",
50
- "outcome": { "kind": "tool-denied-before-mutation", "idle": "no write exists to guard",
51
- "busy": "blocks write_file before mutation", "authority": "blocking",
52
- "limitations": ["write tools are unavailable in plan mode"] } }]
103
+ "event": "BeforeTool",
104
+ "tool": "write_file",
105
+ "claims": [
106
+ {
107
+ "capability": "guards.beforeWrite",
108
+ "result": "pass",
109
+ "outcome": {
110
+ "kind": "tool-denied-before-mutation",
111
+ "idle": "no write exists to guard",
112
+ "busy": "blocks write_file before mutation",
113
+ "authority": "blocking",
114
+ "limitations": [
115
+ "write tools are unavailable in plan mode"
116
+ ]
117
+ }
118
+ }
119
+ ]
53
120
  },
54
121
  {
55
- "id": "before-tool-shell", "client": "gemini-cli", "version": "0.37.0",
56
- "platform": "darwin-arm64", "observedAt": "2026-08-16",
122
+ "id": "before-tool-shell",
123
+ "client": "gemini-cli",
124
+ "version": "0.37.0",
125
+ "platform": "darwin-arm64",
126
+ "observedAt": "2026-08-16",
57
127
  "fixture": "fixtures/BeforeTool-shell.json",
58
128
  "sha256": "05dc4f6fb0aa6fa59a195fbbb4faf0c05db8cb12ce6098c6a1bba3b62065a285",
59
- "event": "BeforeTool", "tool": "run_shell_command",
60
- "claims": [{ "capability": "guards.beforeShell", "result": "pass",
61
- "outcome": { "kind": "tool-denied-before-execution", "idle": "no shell call exists to guard",
62
- "busy": "blocks run_shell_command before execution", "authority": "blocking",
63
- "limitations": ["shell tools depend on approval mode"] } }]
129
+ "event": "BeforeTool",
130
+ "tool": "run_shell_command",
131
+ "claims": [
132
+ {
133
+ "capability": "guards.beforeShell",
134
+ "result": "pass",
135
+ "outcome": {
136
+ "kind": "tool-denied-before-execution",
137
+ "idle": "no shell call exists to guard",
138
+ "busy": "blocks run_shell_command before execution",
139
+ "authority": "blocking",
140
+ "limitations": [
141
+ "shell tools depend on approval mode"
142
+ ]
143
+ }
144
+ }
145
+ ]
146
+ },
147
+ {
148
+ "id": "session-start-0-57-0",
149
+ "client": "gemini-cli",
150
+ "version": "0.57.0",
151
+ "platform": "darwin-arm64",
152
+ "observedAt": "2026-09-03",
153
+ "fixture": "fixtures/SessionStart-0.57.0.json",
154
+ "sha256": "00f008ea112e8be1c49dfad2cf03a319cdd7b07e1fc436615539864e3f30fe00",
155
+ "event": "SessionStart",
156
+ "tool": null,
157
+ "claims": [
158
+ {
159
+ "capability": "lifecycle.sessionStart",
160
+ "result": "pass",
161
+ "outcome": {
162
+ "kind": "event-observed",
163
+ "idle": "fires when a session starts",
164
+ "busy": "fires before the first model turn",
165
+ "authority": "advisory",
166
+ "limitations": [
167
+ "capture used an isolated HOME and a locally stubbed model endpoint"
168
+ ]
169
+ }
170
+ }
171
+ ]
172
+ },
173
+ {
174
+ "id": "session-end-0-57-0",
175
+ "client": "gemini-cli",
176
+ "version": "0.57.0",
177
+ "platform": "darwin-arm64",
178
+ "observedAt": "2026-09-03",
179
+ "fixture": "fixtures/SessionEnd-0.57.0.json",
180
+ "sha256": "5f1400f3ae607b16e2318325f33f7a32abe9ff71ace78facfb0ea8c799c3a0f4",
181
+ "event": "SessionEnd",
182
+ "tool": null,
183
+ "claims": [
184
+ {
185
+ "capability": "lifecycle.sessionEnd",
186
+ "result": "pass",
187
+ "outcome": {
188
+ "kind": "event-observed",
189
+ "idle": "fires when a session exits",
190
+ "busy": "does not run until the session exits",
191
+ "authority": "advisory",
192
+ "limitations": [
193
+ "handoff must be written before session end"
194
+ ]
195
+ }
196
+ }
197
+ ]
198
+ },
199
+ {
200
+ "id": "before-agent-0-57-0",
201
+ "client": "gemini-cli",
202
+ "version": "0.57.0",
203
+ "platform": "darwin-arm64",
204
+ "observedAt": "2026-09-03",
205
+ "fixture": "fixtures/BeforeAgent-0.57.0.json",
206
+ "sha256": "ce955c2067f95ee4fd451955d0e154e056d2399d52301afa0ac90a300cbcee3e",
207
+ "event": "BeforeAgent",
208
+ "tool": null,
209
+ "claims": [
210
+ {
211
+ "capability": "context.beforeTurnInjection",
212
+ "result": "pass",
213
+ "outcome": {
214
+ "kind": "model-context-observed",
215
+ "idle": "waits for the next user prompt",
216
+ "busy": "does not interrupt an in-progress turn",
217
+ "authority": "context",
218
+ "limitations": [
219
+ "requires the hookSpecificOutput additionalContext envelope; the client forwards it to the model as a <hook_context> part"
220
+ ]
221
+ }
222
+ },
223
+ {
224
+ "capability": "delivery.nextTurn",
225
+ "result": "pass",
226
+ "outcome": {
227
+ "kind": "model-context-observed",
228
+ "idle": "offers complete peer messages at the next prompt",
229
+ "busy": "does not interrupt an in-progress turn",
230
+ "authority": "context",
231
+ "limitations": [
232
+ "delivery requires the next normal user turn"
233
+ ]
234
+ }
235
+ }
236
+ ]
237
+ },
238
+ {
239
+ "id": "before-tool-write-0-57-0",
240
+ "client": "gemini-cli",
241
+ "version": "0.57.0",
242
+ "platform": "darwin-arm64",
243
+ "observedAt": "2026-09-03",
244
+ "fixture": "fixtures/BeforeTool-0.57.0.json",
245
+ "sha256": "19c27c915c33b3f6c8f3c9d23dd0d42674d82d47cda54565fd84fd3cf1a4a09c",
246
+ "event": "BeforeTool",
247
+ "tool": "write_file",
248
+ "claims": [
249
+ {
250
+ "capability": "guards.beforeWrite",
251
+ "result": "pass",
252
+ "outcome": {
253
+ "kind": "tool-denied-before-mutation",
254
+ "idle": "no write exists to guard",
255
+ "busy": "blocks write_file before mutation",
256
+ "authority": "blocking",
257
+ "limitations": [
258
+ "write tools are absent in the default and plan approval modes; the capture used yolo",
259
+ "an untrusted folder silently downgrades the approval mode, so the capture disabled security.folderTrust"
260
+ ]
261
+ }
262
+ }
263
+ ]
264
+ },
265
+ {
266
+ "id": "before-tool-shell-0-57-0",
267
+ "client": "gemini-cli",
268
+ "version": "0.57.0",
269
+ "platform": "darwin-arm64",
270
+ "observedAt": "2026-09-03",
271
+ "fixture": "fixtures/BeforeTool-shell-0.57.0.json",
272
+ "sha256": "fb82c02b935d2ffcf414fc3487342f002d413ad90e21f7e2c7c67b63dbaf97e8",
273
+ "event": "BeforeTool",
274
+ "tool": "run_shell_command",
275
+ "claims": [
276
+ {
277
+ "capability": "guards.beforeShell",
278
+ "result": "pass",
279
+ "outcome": {
280
+ "kind": "tool-denied-before-execution",
281
+ "idle": "no shell call exists to guard",
282
+ "busy": "blocks run_shell_command before execution",
283
+ "authority": "blocking",
284
+ "limitations": [
285
+ "run_shell_command is absent below the yolo approval mode",
286
+ "a deny must be {\"decision\":\"block\"}; the hookSpecificOutput permissionDecision shape still does not deny on this client"
287
+ ]
288
+ }
289
+ }
290
+ ]
64
291
  }
65
292
  ]
66
293
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents-can-communicate/adapter-gemini-cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "exports": {
@@ -9,11 +9,11 @@
9
9
  "files": [
10
10
  "certification.json",
11
11
  "fixtures/certification-provenance.json",
12
- "fixtures/SessionStart.json",
13
- "fixtures/SessionEnd.json",
14
- "fixtures/BeforeAgent.json",
15
- "fixtures/BeforeTool.json",
16
- "fixtures/BeforeTool-shell.json",
12
+ "fixtures/SessionStart-0.57.0.json",
13
+ "fixtures/SessionEnd-0.57.0.json",
14
+ "fixtures/BeforeAgent-0.57.0.json",
15
+ "fixtures/BeforeTool-0.57.0.json",
16
+ "fixtures/BeforeTool-shell-0.57.0.json",
17
17
  "src/",
18
18
  "extension/"
19
19
  ]
@@ -5,11 +5,13 @@ import certification from "../certification.json" with { type: "json" };
5
5
  import { denyOutcome, injectOutcome, normalizeGeminiHook } from "./hooks.mjs";
6
6
  import { planGeminiInstall, detectGemini, installGeminiExtension, uninstallGeminiExtension } from "./install.mjs";
7
7
 
8
- // Verified on both. The version jump changed how a session is authenticated and
9
- // how a turn is routed, and changed neither the hook events nor either of the
10
- // two response contracts.
11
- export const GEMINI_CLI_VERSIONS = Object.freeze(["0.37.0", "0.55.1"]);
12
- export const GEMINI_CLI_VERSION = "0.55.1";
8
+ // Verified on all three. Two version jumps changed how a session is
9
+ // authenticated, how a turn is routed, and whether a folder is trusted at all,
10
+ // and changed neither the hook events nor either of the two response contracts.
11
+ // The certified tier is the last of them, because that is the one this client
12
+ // is shipped as; the earlier captures stay in provenance as history.
13
+ export const GEMINI_CLI_VERSIONS = Object.freeze(["0.37.0", "0.55.1", "0.57.0"]);
14
+ export const GEMINI_CLI_VERSION = "0.57.0";
13
15
 
14
16
  /**
15
17
  * The gap this adapter used to carry is closed.
@@ -25,6 +27,14 @@ export const GEMINI_CLI_VERSION = "0.55.1";
25
27
  * measured rather than assumed: a deny must be `{"decision":"block"}`, while an
26
28
  * injection must be the `hookSpecificOutput` envelope. Swapping them silently
27
29
  * does nothing at all.
30
+ *
31
+ * Re-measured the same way on 0.57.0, the version this client now ships as, and
32
+ * both contracts still hold: a `{"decision":"block"}` deny left the workspace
33
+ * empty with no AfterTool event, while the `permissionDecision` shape other
34
+ * clients accept let the write through. Injection was checked at the far end
35
+ * rather than at the hook: a marker returned as `additionalContext` arrived in
36
+ * the request the client sent to the model, as its own `<hook_context>` part.
37
+ * Printing an envelope is not evidence that anything consumed it.
28
38
  */
29
39
  export function createGeminiCliAdapter() {
30
40
  return defineAdapter({
@@ -32,7 +42,7 @@ export function createGeminiCliAdapter() {
32
42
  displayName: "Gemini CLI",
33
43
  // The binary this client actually installs. Probed for a version to
34
44
  // decide whether the client is on this machine, so it has to be the
35
- // real command rather than the adapter id: `0.55.1`.
45
+ // real command rather than the adapter id: `0.57.0`.
36
46
  client: { command: "gemini", certificationName: "gemini-cli", versionArgs: ["--version"] },
37
47
  certification,
38
48
  capabilities: {
@@ -42,7 +52,7 @@ export function createGeminiCliAdapter() {
42
52
  delivery: { nextTurn: true },
43
53
  },
44
54
  deliveryFallback: { diagnostic:
45
- "Gemini CLI next-turn delivery is certified only for 0.37.0 on darwin-arm64; "
55
+ "Gemini CLI next-turn delivery is certified only for 0.57.0 on darwin-arm64; "
46
56
  + "other or unknown versions keep durable acc inbox access, and live push is unavailable" },
47
57
 
48
58
  startSession: async () => ({ ok: true, changes: [], diagnostics: [] }),
@@ -64,10 +74,14 @@ export function createGeminiCliAdapter() {
64
74
  + "that Claude Code and Kimi Code accept does not deny on this client",
65
75
  "write guards need an approval mode that offers the edit tools; in plan "
66
76
  + "mode the client declares no write tool at all",
67
- // Both appeared with 0.55.1 and stop a headless session before any hook
68
- // beyond SessionStart can matter.
69
- "0.55.x needs an explicit security.auth.selectedType and a trusted "
70
- + "workspace; without either, a headless run stops before the first turn",
77
+ // Both appeared with 0.55.1, persist through 0.57.0, and stop a headless
78
+ // session before any hook beyond SessionStart can matter. The trust
79
+ // check is the quieter of the two: it does not fail the run, it
80
+ // downgrades the approval mode, and with it the toolset a guard exists
81
+ // to protect.
82
+ "0.55.x and later need an explicit security.auth.selectedType and a "
83
+ + "trusted workspace; without either, a headless run stops before the "
84
+ + "first turn or silently loses its write and shell tools",
71
85
  ] };
72
86
  },
73
87
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents-can-communicate/adapter-grok",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "exports": {
@@ -51,14 +51,14 @@ diffs. Prefer a conclusion, stable ids or paths, and the next action.
51
51
  For information that needs no response:
52
52
 
53
53
  ```bash
54
- {{ACC}} message --to models --type note --subject "schema verified" \
54
+ {{ACC}} message --to codex --type note --subject "schema verified" \
55
55
  --body "Record v2 accepts nullable pid; no migration is planned."
56
56
  ```
57
57
 
58
58
  For a question, use the kind whose default obligation is a reply:
59
59
 
60
60
  ```bash
61
- {{ACC}} message --to models --type question \
61
+ {{ACC}} message --to codex --type question \
62
62
  --subject "claim boundary" --body "Can I take file:src/parser/** after your commit?"
63
63
  ```
64
64
 
@@ -69,13 +69,17 @@ When the peer should own a concrete piece of work, send one reply-required reque
69
69
  --detail "Check queued -> retrieved and reply -> acknowledged; return only defects."
70
70
  ```
71
71
 
72
- Participant names come from `{{ACC}} status --json`. A request is not an order.
72
+ Address a peer by its client - `codex`, `claude_code`, `gemini_cli` - when one session of
73
+ it is here; `{{ACC}} status --json` names them all, and two sessions of one client have to be
74
+ named exactly. A request is not an order.
73
75
 
74
76
  ## Treat delivery as evidence
75
77
 
76
78
  Every send records durably before delivery is attempted. A queued diagnostic means
77
- the message is safe in the recipient's inbox. Exact-certified clients may offer it
78
- at the next normal turn; no shipped adapter currently has certified live push.
79
+ the message is safe in the recipient's inbox. It may then be offered at the next
80
+ normal turn, or, on a client with native delivery enabled, pushed into the running
81
+ session. Delivery is behaviour, not a promise: a queued message is safe; an offered
82
+ message reached a transport but is not proof the model read it.
79
83
 
80
84
  `offered` is not read, `retrieved` is not model attention, and a reply resolves
81
85
  the communication obligation rather than proving the requested action is complete.
@@ -31,7 +31,9 @@ export function createGrokAdapter() {
31
31
  // so no effective capability is certified from them.
32
32
  capabilities: {},
33
33
  deliveryFallback: { diagnostic:
34
- "Grok has no certified next-turn or live delivery; polling through acc inbox remains active" },
34
+ "Grok native delivery is awaiting_compatibility_capture: the public leader surface exposes "
35
+ + "no proven addressed injection into an independently opened ordinary TUI session; polling "
36
+ + "through acc inbox remains active" },
35
37
 
36
38
  startSession: async () => ({ ok: true, changes: [], diagnostics: [] }),
37
39
  endSession: async () => ({ ok: true, changes: [], diagnostics: [] }),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents-can-communicate/adapter-kimi",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "exports": {
@@ -47,14 +47,14 @@ diffs. Prefer a conclusion, stable ids or paths, and the next action.
47
47
  For information that needs no response:
48
48
 
49
49
  ```bash
50
- {{ACC}} message --to models --type note --subject "schema verified" \
50
+ {{ACC}} message --to codex --type note --subject "schema verified" \
51
51
  --body "Record v2 accepts nullable pid; no migration is planned."
52
52
  ```
53
53
 
54
54
  For a question, use the kind whose default obligation is a reply:
55
55
 
56
56
  ```bash
57
- {{ACC}} message --to models --type question \
57
+ {{ACC}} message --to codex --type question \
58
58
  --subject "claim boundary" --body "Can I take file:src/parser/** after your commit?"
59
59
  ```
60
60
 
@@ -65,13 +65,17 @@ When the peer should own a concrete piece of work, send one reply-required reque
65
65
  --detail "Check queued -> retrieved and reply -> acknowledged; return only defects."
66
66
  ```
67
67
 
68
- Participant names come from `{{ACC}} status --json`. A request is not an order.
68
+ Address a peer by its client - `codex`, `claude_code`, `gemini_cli` - when one session of
69
+ it is here; `{{ACC}} status --json` names them all, and two sessions of one client have to be
70
+ named exactly. A request is not an order.
69
71
 
70
72
  ## Treat delivery as evidence
71
73
 
72
74
  Every send records durably before delivery is attempted. A queued diagnostic means
73
- the message is safe in the recipient's inbox. Exact-certified clients may offer it
74
- at the next normal turn; no shipped adapter currently has certified live push.
75
+ the message is safe in the recipient's inbox. It may then be offered at the next
76
+ normal turn, or, on a client with native delivery enabled, pushed into the running
77
+ session. Delivery is behaviour, not a promise: a queued message is safe; an offered
78
+ message reached a transport but is not proof the model read it.
75
79
 
76
80
  `offered` is not read, `retrieved` is not model attention, and a reply resolves
77
81
  the communication obligation rather than proving the requested action is complete.