agents-can-communicate 0.1.18 → 0.2.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 +78 -70
- package/SECURITY.md +31 -0
- package/bin/acc-hook.mjs +94 -12
- package/bin/acc-mcp.mjs +6 -2
- package/bin/acc.mjs +6 -1
- package/docs/ADAPTER_AUTHORING.md +172 -0
- package/docs/ARCHITECTURE.md +131 -0
- package/docs/CAPABILITIES.md +102 -214
- package/docs/CLI.md +157 -0
- package/docs/CONCEPTS.md +134 -0
- package/docs/CONFIGURATION.md +143 -0
- package/docs/DESIGN_DECISIONS.md +89 -0
- package/docs/GETTING_STARTED.md +145 -0
- package/docs/GLOSSARY.md +26 -0
- package/docs/MCP.md +94 -0
- package/docs/PROTOCOL.md +200 -0
- package/docs/RELEASING.md +109 -0
- package/docs/SECURITY_MODEL.md +131 -0
- package/docs/TROUBLESHOOTING.md +102 -0
- package/docs/WHY_ACC.md +61 -0
- package/docs/index.md +42 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/certification.json +78 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/PreToolUse-Edit.json +19 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/PreToolUse.json +17 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/SessionEnd.json +8 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/SessionStart.json +7 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/UserPromptSubmit.json +9 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/certification-provenance.json +77 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/fixtures/delivery/claude-code-2.1.252.json +19 -0
- package/node_modules/@agents-can-communicate/adapter-claude-code/package.json +9 -1
- package/node_modules/@agents-can-communicate/adapter-claude-code/plugin/skills/acc/SKILL.md +20 -22
- package/node_modules/@agents-can-communicate/adapter-claude-code/src/adapter.mjs +12 -4
- package/node_modules/@agents-can-communicate/adapter-codex/certification.json +117 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/PreToolUse.json +14 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/SessionEnd.json +7 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/SessionStart.json +9 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/UserPromptSubmit.json +10 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/certification-provenance.json +66 -0
- package/node_modules/@agents-can-communicate/adapter-codex/fixtures/delivery/codex-cli-0.152.0.json +19 -0
- package/node_modules/@agents-can-communicate/adapter-codex/package.json +8 -1
- package/node_modules/@agents-can-communicate/adapter-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-codex/plugin/skills/acc/SKILL.md +20 -22
- package/node_modules/@agents-can-communicate/adapter-codex/src/adapter.mjs +18 -11
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/certification.json +52 -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 +20 -22
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/BeforeAgent.json +8 -0
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/BeforeTool-shell.json +12 -0
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/BeforeTool.json +12 -0
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/SessionEnd.json +8 -0
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/SessionStart.json +8 -0
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/fixtures/certification-provenance.json +66 -0
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/package.json +8 -1
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/src/adapter.mjs +7 -3
- package/node_modules/@agents-can-communicate/adapter-gemini-cli/src/install.mjs +4 -2
- package/node_modules/@agents-can-communicate/adapter-grok/certification.json +3 -0
- package/node_modules/@agents-can-communicate/adapter-grok/package.json +2 -1
- package/node_modules/@agents-can-communicate/adapter-grok/plugin/skills/acc/SKILL.md +20 -22
- package/node_modules/@agents-can-communicate/adapter-grok/src/adapter.mjs +9 -9
- package/node_modules/@agents-can-communicate/adapter-kimi/certification.json +52 -0
- package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/PreToolUse-Bash.json +12 -0
- package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/PreToolUse-Write.json +12 -0
- package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/SessionHeartbeat.json +7 -0
- package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/SessionStart.json +9 -0
- package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/UserPromptSubmit.json +8 -0
- package/node_modules/@agents-can-communicate/adapter-kimi/fixtures/certification-provenance.json +66 -0
- package/node_modules/@agents-can-communicate/adapter-kimi/package.json +8 -1
- package/node_modules/@agents-can-communicate/adapter-kimi/plugin/skills/acc/SKILL.md +20 -22
- package/node_modules/@agents-can-communicate/adapter-kimi/src/adapter.mjs +7 -3
- package/node_modules/@agents-can-communicate/adapter-sdk/package.json +1 -1
- package/node_modules/@agents-can-communicate/adapter-sdk/src/capabilities.mjs +34 -18
- package/node_modules/@agents-can-communicate/adapter-sdk/src/certification.mjs +158 -0
- package/node_modules/@agents-can-communicate/adapter-sdk/src/context-projector.mjs +36 -17
- package/node_modules/@agents-can-communicate/adapter-sdk/src/hook-shim.mjs +7 -1
- package/node_modules/@agents-can-communicate/adapter-sdk/src/index.mjs +1 -0
- package/node_modules/@agents-can-communicate/adapter-sdk/src/session-binding.mjs +13 -4
- package/node_modules/@agents-can-communicate/cli/package.json +1 -1
- package/node_modules/@agents-can-communicate/cli/src/args.mjs +11 -30
- package/node_modules/@agents-can-communicate/cli/src/doctor-command.mjs +3 -0
- package/node_modules/@agents-can-communicate/cli/src/help.mjs +2 -5
- package/node_modules/@agents-can-communicate/cli/src/install-command.mjs +9 -2
- package/node_modules/@agents-can-communicate/cli/src/main.mjs +100 -121
- package/node_modules/@agents-can-communicate/core/package.json +1 -1
- package/node_modules/@agents-can-communicate/core/src/attention.mjs +106 -0
- package/node_modules/@agents-can-communicate/core/src/conversations.mjs +276 -0
- package/node_modules/@agents-can-communicate/core/src/delivery-bindings.mjs +81 -0
- package/node_modules/@agents-can-communicate/core/src/finish-retries.mjs +97 -0
- package/node_modules/@agents-can-communicate/core/src/inbox.mjs +91 -107
- package/node_modules/@agents-can-communicate/core/src/index.mjs +3 -3
- package/node_modules/@agents-can-communicate/core/src/intents.mjs +0 -1
- package/node_modules/@agents-can-communicate/core/src/ports.mjs +2 -1
- package/node_modules/@agents-can-communicate/core/src/receipts.mjs +109 -0
- package/node_modules/@agents-can-communicate/core/src/service.mjs +11 -10
- package/node_modules/@agents-can-communicate/core/src/sessions.mjs +22 -20
- package/node_modules/@agents-can-communicate/core/src/status.mjs +11 -9
- package/node_modules/@agents-can-communicate/core/src/sync.mjs +3 -294
- package/node_modules/@agents-can-communicate/delivery-router/package.json +12 -0
- package/node_modules/@agents-can-communicate/delivery-router/src/index.mjs +1 -0
- package/node_modules/@agents-can-communicate/delivery-router/src/router.mjs +117 -0
- package/node_modules/@agents-can-communicate/hook-runner/package.json +1 -1
- package/node_modules/@agents-can-communicate/hook-runner/src/client-version.mjs +20 -0
- package/node_modules/@agents-can-communicate/hook-runner/src/runner.mjs +115 -63
- package/node_modules/@agents-can-communicate/installer/package.json +1 -1
- package/node_modules/@agents-can-communicate/installer/src/apply.mjs +23 -7
- package/node_modules/@agents-can-communicate/installer/src/detect.mjs +20 -5
- package/node_modules/@agents-can-communicate/installer/src/index.mjs +3 -2
- package/node_modules/@agents-can-communicate/installer/src/ownership.mjs +108 -12
- package/node_modules/@agents-can-communicate/installer/src/plan.mjs +19 -2
- package/node_modules/@agents-can-communicate/mcp-server/package.json +1 -1
- package/node_modules/@agents-can-communicate/mcp-server/src/input-validator.mjs +79 -0
- package/node_modules/@agents-can-communicate/mcp-server/src/resources.mjs +23 -28
- package/node_modules/@agents-can-communicate/mcp-server/src/server.mjs +102 -72
- package/node_modules/@agents-can-communicate/mcp-server/src/tools.mjs +54 -97
- package/node_modules/@agents-can-communicate/protocol/package.json +1 -1
- package/node_modules/@agents-can-communicate/protocol/src/config.mjs +1 -1
- package/node_modules/@agents-can-communicate/protocol/src/conversations.mjs +64 -0
- package/node_modules/@agents-can-communicate/protocol/src/index.mjs +4 -1
- package/node_modules/@agents-can-communicate/protocol/src/schema.mjs +49 -90
- package/node_modules/@agents-can-communicate/protocol/src/states.mjs +13 -40
- package/node_modules/@agents-can-communicate/storage-filesystem/package.json +1 -1
- package/node_modules/@agents-can-communicate/storage-filesystem/src/active-journal.mjs +230 -0
- package/node_modules/@agents-can-communicate/storage-filesystem/src/atomic-json.mjs +77 -28
- package/node_modules/@agents-can-communicate/storage-filesystem/src/identity.mjs +1 -1
- package/node_modules/@agents-can-communicate/storage-filesystem/src/journal.mjs +83 -35
- package/node_modules/@agents-can-communicate/storage-filesystem/src/retention.mjs +112 -0
- package/node_modules/@agents-can-communicate/storage-filesystem/src/safe-file.mjs +18 -8
- package/node_modules/@agents-can-communicate/storage-filesystem/src/store.mjs +68 -26
- package/node_modules/@agents-can-communicate/storage-filesystem/src/writer-mutex.mjs +113 -35
- package/package.json +19 -1
- package/node_modules/@agents-can-communicate/core/src/communication.mjs +0 -334
- package/node_modules/@agents-can-communicate/core/src/message-signals.mjs +0 -41
- package/node_modules/@agents-can-communicate/core/src/notify.mjs +0 -95
- package/node_modules/@agents-can-communicate/core/src/tasks.mjs +0 -244
- package/node_modules/@agents-can-communicate/core/src/workstreams.mjs +0 -109
package/docs/PROTOCOL.md
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# Protocol
|
|
2
|
+
|
|
3
|
+
The protocol is the vendor-neutral contract shared by core, CLI, MCP, storage, and every
|
|
4
|
+
adapter. Version 0.2 uses store schema version `3` and deliberately rejects v0.1 state.
|
|
5
|
+
There is no compatibility reader, conversion, archive path, or automatic deletion.
|
|
6
|
+
|
|
7
|
+
## Durable records
|
|
8
|
+
|
|
9
|
+
The store accepts only these durable kinds:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
workspace · participant · session · intent · claim · message · receipt · event
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
`deliveryBinding` is validated but ephemeral. It is tied to one open session generation
|
|
16
|
+
and never written inside a repository.
|
|
17
|
+
|
|
18
|
+
## Identity
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
Workspace
|
|
22
|
+
└── Participant
|
|
23
|
+
└── Session generation
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
- A workspace is one local coordination room.
|
|
27
|
+
- A participant is the stable recipient of a message.
|
|
28
|
+
- A session is one client conversation. Its unguessable generation token proves that a
|
|
29
|
+
later mutation still belongs to the current opening.
|
|
30
|
+
|
|
31
|
+
Sessions carry harness, checkout, branch, optional pid, enforcement, and lifecycle facts.
|
|
32
|
+
The `managed` lifecycle value means ACC hooks can report presence changes; it does not mean
|
|
33
|
+
ACC owns or controls the external client.
|
|
34
|
+
|
|
35
|
+
## Intent and claims
|
|
36
|
+
|
|
37
|
+
Intent contains `summary`, `mode`, `resourceHints`, `state`, and `updatedAt`. It is
|
|
38
|
+
awareness only.
|
|
39
|
+
|
|
40
|
+
Claims contain the owner session and generation, canonical resource URI, shared or
|
|
41
|
+
exclusive mode, advisory or guarded enforcement, reason, and lease timestamps. Claim
|
|
42
|
+
acquisition and conflict detection are atomic. Presence becoming stale never releases a
|
|
43
|
+
claim; expiry or an explicit release does.
|
|
44
|
+
|
|
45
|
+
## Message envelope
|
|
46
|
+
|
|
47
|
+
Every message contains:
|
|
48
|
+
|
|
49
|
+
```text
|
|
50
|
+
messageId
|
|
51
|
+
threadId
|
|
52
|
+
clientMessageId
|
|
53
|
+
workspaceId
|
|
54
|
+
fromParticipantId
|
|
55
|
+
fromSessionId
|
|
56
|
+
toParticipantIds
|
|
57
|
+
kind
|
|
58
|
+
obligation
|
|
59
|
+
subject
|
|
60
|
+
body
|
|
61
|
+
inReplyTo
|
|
62
|
+
artifacts
|
|
63
|
+
handoff
|
|
64
|
+
sentAt
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`clientMessageId` is an idempotency key scoped to workspace plus sender participant. A
|
|
68
|
+
retry with the same logical content returns the original message. Reusing the key with
|
|
69
|
+
different content is a data error. CLI and MCP generate a key when omitted and return it
|
|
70
|
+
inside the message so an uncertain caller can retry explicitly.
|
|
71
|
+
|
|
72
|
+
An empty `toParticipantIds` creates a room record. At commit time, core resolves every
|
|
73
|
+
known peer participant with an open session and creates a receipt for each. Participants
|
|
74
|
+
that arrive later can inspect room history through a full sync but do not receive
|
|
75
|
+
retroactive receipts. Those already-present recipients get the normal inbox and certified
|
|
76
|
+
next-turn path; a successful next-turn write advances their room receipt to `offered`.
|
|
77
|
+
Room records are never eligible for native live push.
|
|
78
|
+
|
|
79
|
+
## Kinds and obligations
|
|
80
|
+
|
|
81
|
+
| Kind | Valid obligation | Addressing |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| `note` | `none` | addressed or room |
|
|
84
|
+
| `question` | `reply` | addressed only |
|
|
85
|
+
| `request` | `reply` | addressed only |
|
|
86
|
+
| `answer` | `none` | addressed reply only |
|
|
87
|
+
| `decision` | `none`, or `acknowledge` | addressed or room; room must use `none` |
|
|
88
|
+
| `handoff` | `acknowledge`, or `none` | addressed must acknowledge; room must use `none` |
|
|
89
|
+
|
|
90
|
+
The generic `message` boundary accepts only `note`, `question`, `request`, and `decision`.
|
|
91
|
+
An `answer` must be made through `reply`, which supplies the thread link. A `handoff` must
|
|
92
|
+
be made through `finish`, which supplies the structured payload.
|
|
93
|
+
|
|
94
|
+
A request has no accepted, running, or done state. The reply resolves its communication
|
|
95
|
+
obligation; execution evidence belongs in the answer or handoff.
|
|
96
|
+
|
|
97
|
+
## Threads
|
|
98
|
+
|
|
99
|
+
The root message uses its own id as the thread id:
|
|
100
|
+
|
|
101
|
+
```text
|
|
102
|
+
threadId = messageId
|
|
103
|
+
inReplyTo = null
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
An answer carries the same `threadId` and the original message id in `inReplyTo`. There is
|
|
107
|
+
no mutable thread record or hidden thread status.
|
|
108
|
+
|
|
109
|
+
## Receipt lifecycle
|
|
110
|
+
|
|
111
|
+
Every resolved recipient gets an independent receipt:
|
|
112
|
+
|
|
113
|
+
```text
|
|
114
|
+
queued -> offered -> retrieved -> acknowledged
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
`recorded` is the send boundary's success result: the message is durable. It is not a
|
|
118
|
+
receipt state. `queued` is the distinct per-recipient fact created in the same transaction,
|
|
119
|
+
so one recorded room or multi-recipient message can have zero or several queued receipts.
|
|
120
|
+
|
|
121
|
+
- `queued` proves the durable message and receipt committed.
|
|
122
|
+
- `offered` proves bytes crossed ACC's transport boundary or the target client accepted a
|
|
123
|
+
certified native call.
|
|
124
|
+
- `retrieved` proves the participant explicitly received the body through inbox or an
|
|
125
|
+
equally strong certified adapter signal.
|
|
126
|
+
- `acknowledged` proves that participant acknowledged or replied.
|
|
127
|
+
|
|
128
|
+
Offered is not read. Retrieved is not model attention. Reply is not task completion.
|
|
129
|
+
|
|
130
|
+
Forward skips are allowed when the stronger observation implies the weaker ones. Repeating
|
|
131
|
+
a state is idempotent; moving backward is rejected. There is no `seen` state because ACC
|
|
132
|
+
cannot inspect model attention, and no terminal delivery `failed` state because the
|
|
133
|
+
durable path remains available.
|
|
134
|
+
|
|
135
|
+
## Offer attempts
|
|
136
|
+
|
|
137
|
+
Delivery attempts are immutable events, not receipt states:
|
|
138
|
+
|
|
139
|
+
```text
|
|
140
|
+
message.offer_succeeded
|
|
141
|
+
message.offer_failed
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Every attempt identifies `messageId`, `recipientParticipantId`, `targetSessionId`, and
|
|
145
|
+
`targetGeneration`, followed by the transport name, adapter, client version, and timestamp.
|
|
146
|
+
A failed attempt additionally carries a safe closed error code. Core validates the target
|
|
147
|
+
as that recipient's recorded session generation and derives event attribution from it; the
|
|
148
|
+
router cannot substitute the sender or omit the selected binding. Attempts never copy the
|
|
149
|
+
peer body into diagnostics.
|
|
150
|
+
Receipt `offered` is committed only after the transport accepts bytes. A failed attempt
|
|
151
|
+
leaves the receipt queued.
|
|
152
|
+
|
|
153
|
+
## Inbox, reply, and acknowledgement
|
|
154
|
+
|
|
155
|
+
`inbox` returns unresolved messages owned by the calling participant and advances only
|
|
156
|
+
that participant's receipt to `retrieved`. An exact message id is the recovery path after
|
|
157
|
+
compaction or an over-budget projection.
|
|
158
|
+
|
|
159
|
+
`reply` verifies that ownership, records an `answer` in the original thread, and advances
|
|
160
|
+
the original receipt to `acknowledged` in one transaction. Only after that durable commit
|
|
161
|
+
may the answer be offered to the original author. A transport error cannot roll back it.
|
|
162
|
+
|
|
163
|
+
`ack` advances the caller's receipt without creating a reply. It exposes no state override;
|
|
164
|
+
callers cannot claim that a transport offered or a participant retrieved a message.
|
|
165
|
+
|
|
166
|
+
## Handoff
|
|
167
|
+
|
|
168
|
+
`finish` creates a `handoff` with structured `status`, `completed`, `remaining`,
|
|
169
|
+
`blockers`, and `verification`, releases the sender session's claims, and ends its ACC
|
|
170
|
+
presence. An addressed handoff requires acknowledgement. A room handoff does not. Neither
|
|
171
|
+
form closes or otherwise controls the external AI client.
|
|
172
|
+
|
|
173
|
+
## Delivery binding and recipient policy
|
|
174
|
+
|
|
175
|
+
A live-capable adapter may publish one ephemeral binding for its exact session generation:
|
|
176
|
+
|
|
177
|
+
```text
|
|
178
|
+
sessionId · generation · adapterId · clientVersion · availableModes
|
|
179
|
+
livePolicy · opaqueEndpointRef · leaseUntil
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
The recipient owns `livePolicy` because native push may start a model turn:
|
|
183
|
+
|
|
184
|
+
- `off`: inbox and normal next-turn paths only;
|
|
185
|
+
- `actionable`: questions, requests, and addressed handoffs may use live push;
|
|
186
|
+
- `all`: every addressed kind may use live push.
|
|
187
|
+
|
|
188
|
+
Default is `off`. Policy never creates a capability. The router still requires a current
|
|
189
|
+
reachable binding, one unambiguous recipient generation, a passing exact-version
|
|
190
|
+
certification, and adapter acceptance. The current Codex and Claude captures do not meet
|
|
191
|
+
those requirements; all shipped native live routes therefore fall back durably.
|
|
192
|
+
|
|
193
|
+
## Attention and sync
|
|
194
|
+
|
|
195
|
+
Bounded sync returns events after a cursor plus explicit attention. Full sync is a
|
|
196
|
+
forensic workspace snapshot, not the normal way to recover one message. Attention is
|
|
197
|
+
limited to six explicit rules: `reply_required`, `acknowledgement_required`,
|
|
198
|
+
`recipient_unavailable`, `claim_conflict`, `claim_contended`, and `claim_expired`.
|
|
199
|
+
|
|
200
|
+
Next: [CLI](CLI.md) · [MCP](MCP.md) · [Architecture](ARCHITECTURE.md)
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Releasing
|
|
2
|
+
|
|
3
|
+
```mermaid
|
|
4
|
+
graph LR
|
|
5
|
+
A[npm ci] --> B[npm run check] --> C[npm test] --> D[clean candidate commit] --> E[npm pack] --> F[verify-package] --> G{approved?}
|
|
6
|
+
G -->|yes| H[tag · publish · release]
|
|
7
|
+
G -->|no| I[stop]
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Build the candidate
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm ci
|
|
14
|
+
npm run check
|
|
15
|
+
env npm_config_cache=/private/tmp/acc-npm-cache-v02 npm test
|
|
16
|
+
git status --short
|
|
17
|
+
git commit -m "release: prepare ACC v0.2.0"
|
|
18
|
+
candidate_dir="$(mktemp -d /private/tmp/acc-v0.2.XXXXXX)"
|
|
19
|
+
env npm_config_cache=/private/tmp/acc-npm-cache-v02 npm pack --pack-destination "$candidate_dir"
|
|
20
|
+
env npm_config_cache=/private/tmp/acc-npm-cache-v02 node scripts/verify-package.mjs \
|
|
21
|
+
"$candidate_dir/agents-can-communicate-0.2.0.tgz"
|
|
22
|
+
git diff --check
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`verify-package.mjs` is the gate that matters. It installs the tarball into a
|
|
26
|
+
clean directory with **no workspace anywhere** and then drives the product. The
|
|
27
|
+
acceptance suite additionally opens independent Claude/Codex hook sessions from
|
|
28
|
+
the installed artifact, completes both message directions, proves downgrade and
|
|
29
|
+
restart behavior, exercises the installed MCP binary, and removes client wiring twice.
|
|
30
|
+
|
|
31
|
+
Development cannot catch what this catches. Workspace symlinks are always
|
|
32
|
+
present there, so an unbundled package imports fine right up until somebody
|
|
33
|
+
else installs it.
|
|
34
|
+
|
|
35
|
+
## What it refuses
|
|
36
|
+
|
|
37
|
+
| Refused | Why |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `tests/`, `test/` | test suite |
|
|
40
|
+
| unreferenced `fixtures/` | material that is not exact redacted certification evidence |
|
|
41
|
+
| `scripts/spikes/`, `*.sock` | development probes and local endpoints |
|
|
42
|
+
| runtime, transcript, or secret directories | machine state and private material |
|
|
43
|
+
| `.github/`, `.githooks/`, `.agents/` | local configuration |
|
|
44
|
+
| `*.jsonl` | looks like a transcript |
|
|
45
|
+
| Workspaces missing from `node_modules/` | every internal import would fail |
|
|
46
|
+
|
|
47
|
+
## Record the evidence
|
|
48
|
+
|
|
49
|
+
Put the tarball name, sha256, **the commit it was built from**, exact platform/client
|
|
50
|
+
facts, fallback result, and known limitations in `docs/release-evidence/v0.2.0.md` and
|
|
51
|
+
the current `CHANGELOG.md` release table. A release without them is a release nobody can
|
|
52
|
+
audit later. Test count is deliberately left out: nothing verifies it, so it only
|
|
53
|
+
decorates or, when it drifts, misleads.
|
|
54
|
+
|
|
55
|
+
The commit matters because every workspace travels inside the tarball, so any
|
|
56
|
+
change to shipped code changes the digest. A digest recorded alone goes stale
|
|
57
|
+
on the next merge and then reads as a false claim about the current tree
|
|
58
|
+
rather than a true one about an older commit. `verify-package.mjs` prints
|
|
59
|
+
both on one line for exactly this reason, and refuses to imply
|
|
60
|
+
reproducibility when the working tree is dirty:
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
PASS agents-can-communicate-0.0.0.tgz sha256 a5c8bb1d… built from 39d0dcf
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
It went stale four times in a row anyway, each caught by hand and only
|
|
67
|
+
because someone happened to run the script. So `npm test` now checks it:
|
|
68
|
+
`tests/acceptance/recorded-candidate.test.mjs` fails when shipped code has
|
|
69
|
+
changed since the recorded commit, and names the files. A shallow clone that
|
|
70
|
+
does not have the commit reports that instead of failing — the check is of
|
|
71
|
+
the record, not of the checkout depth.
|
|
72
|
+
|
|
73
|
+
The candidate therefore uses two commits. Commit A contains every packed file and every
|
|
74
|
+
release gate. Pack and verify clean commit A, then commit B records its digest and evidence
|
|
75
|
+
only in files that are not packed. Never record a dirty-tree digest: changing a packed file
|
|
76
|
+
after commit A means making a new candidate commit and packing again.
|
|
77
|
+
|
|
78
|
+
Native real-client tests run only where the retained capture proved that native boundary.
|
|
79
|
+
For v0.2.0 neither Codex 0.152.0 nor Claude Code 2.1.252 did: the Codex control socket was
|
|
80
|
+
absent and Claude stopped at the development-channel warning. Record those exact failed
|
|
81
|
+
captures and run the packed inbox/next-turn fallback instead of promoting an unobserved
|
|
82
|
+
native path. Windows is an explicit unsupported-platform skip, not a passing capture.
|
|
83
|
+
|
|
84
|
+
A published version's record is history and is not rewritten; later changes
|
|
85
|
+
get a new `## Unreleased` entry at the top, checked the same way against the
|
|
86
|
+
current tree.
|
|
87
|
+
|
|
88
|
+
## Then stop
|
|
89
|
+
|
|
90
|
+
Publishing, tagging, and cutting a GitHub release are **external mutations**.
|
|
91
|
+
They need explicit approval from the maintainer, every time.
|
|
92
|
+
|
|
93
|
+
With two-factor authentication set to `auth-and-writes` — which is what `npm
|
|
94
|
+
profile get` reports for this account — every publish needs a code, and npm
|
|
95
|
+
does not prompt for one:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
npm publish --otp=123456
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
An npm *Automation* token, or a granular token with write access, publishes
|
|
102
|
+
without a code. A granular token scoped to selected packages cannot create a
|
|
103
|
+
package that does not exist yet, which is the case exactly once per package.
|
|
104
|
+
The `Release` workflow builds and verifies a candidate and uploads it as an
|
|
105
|
+
artifact; it does not publish.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
See also: [README](index.md) for navigation and [Glossary](GLOSSARY.md) for terms.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Security model
|
|
2
|
+
|
|
3
|
+
ACC connects independently controlled sessions without merging their authority. A peer can
|
|
4
|
+
send useful context, a question, or a request; its text never becomes system policy or a
|
|
5
|
+
human instruction merely because ACC transported it.
|
|
6
|
+
|
|
7
|
+
The first release coordinates processes under one local OS user. Same-user access protects
|
|
8
|
+
local transport from the network; it does not make model output trustworthy.
|
|
9
|
+
|
|
10
|
+
## Trust boundaries
|
|
11
|
+
|
|
12
|
+
1. Human instructions and approved local policy.
|
|
13
|
+
2. ACC protocol and core invariants.
|
|
14
|
+
3. Adapter facts backed by exact real-client evidence.
|
|
15
|
+
4. Peer messages and artifact references, always untrusted input.
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
graph LR
|
|
19
|
+
P["peer session — untrusted text"] --> ACC["ACC runtime"]
|
|
20
|
+
ACC --> S[("state outside repositories")]
|
|
21
|
+
ACC --> C["recipient client — own permissions"]
|
|
22
|
+
H["human authority"] --> C
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
ACC does not read raw transcripts, relay permission approvals, or start target clients. A
|
|
26
|
+
native delivery path may only offer an attributed peer envelope to an already-running,
|
|
27
|
+
user-owned session.
|
|
28
|
+
|
|
29
|
+
## Peer-content boundary
|
|
30
|
+
|
|
31
|
+
Inbound messages are rendered as structured, attributed peer data. The frame includes the
|
|
32
|
+
sender, message id, kind, obligation, and an explicit untrusted marker. The renderer
|
|
33
|
+
escapes fences, nested strings, terminal control sequences, and human output. If a body
|
|
34
|
+
cannot fit the context budget, the projection keeps the id and directs the participant to
|
|
35
|
+
`acc inbox --message <id>` instead of cutting the frame in half.
|
|
36
|
+
|
|
37
|
+
A model may still choose to follow persuasive peer text. Attribution and the recipient's
|
|
38
|
+
own instruction hierarchy are the mitigation; ACC is not a model sandbox.
|
|
39
|
+
|
|
40
|
+
## Identity and ownership
|
|
41
|
+
|
|
42
|
+
- Participant identity is the address; session identity is one current client opening.
|
|
43
|
+
- Mutating calls prove their owner with the session generation.
|
|
44
|
+
- A stale process cannot renew or release records owned by a newer generation.
|
|
45
|
+
- Inbox, reply, and acknowledgement validate the recipient's participant id.
|
|
46
|
+
- One participant cannot advance another participant's receipt.
|
|
47
|
+
- MCP identity derives from user-owned server launch configuration, never from untrusted
|
|
48
|
+
`initialize` or `clientInfo` fields.
|
|
49
|
+
|
|
50
|
+
The `managed` lifecycle label means hooks can report ACC presence transitions. It never
|
|
51
|
+
grants ACC process-control authority.
|
|
52
|
+
|
|
53
|
+
## Durable and delivery integrity
|
|
54
|
+
|
|
55
|
+
Messages and queued receipts commit before delivery is attempted. Receipt words correspond
|
|
56
|
+
to observations:
|
|
57
|
+
|
|
58
|
+
- `offered` only after bytes cross ACC's boundary or a certified client accepts the call;
|
|
59
|
+
- `retrieved` only after the participant receives the body through inbox or equally strong
|
|
60
|
+
evidence;
|
|
61
|
+
- `acknowledged` only after that participant acknowledges or replies.
|
|
62
|
+
|
|
63
|
+
There is no model-attention claim and no public state override. Failed acceleration leaves
|
|
64
|
+
the message queued and records only a closed safe error code. Diagnostics and offer events
|
|
65
|
+
never copy the peer body.
|
|
66
|
+
|
|
67
|
+
A future live adapter must match exact passing evidence, one unexpired generation-bound
|
|
68
|
+
binding, and the recipient's opt-in policy. Opaque endpoint references remain inside the
|
|
69
|
+
adapter and outside repositories. Current Codex and Claude native captures failed, so no
|
|
70
|
+
live transport is enabled.
|
|
71
|
+
|
|
72
|
+
## Claims
|
|
73
|
+
|
|
74
|
+
Claims are advisory unless every live participant exposes a certified guard for the
|
|
75
|
+
relevant mutation path. Even guarded claims do not stop unrelated processes, runtime-built
|
|
76
|
+
paths, or tool calls the client never presents to the hook. Force release requires explicit
|
|
77
|
+
authority and records actor and reason.
|
|
78
|
+
|
|
79
|
+
File resources are canonicalized and kept inside workspace roots. Misleading glob forms
|
|
80
|
+
are refused. Hooks fail open on timeout or coordination failure so ACC cannot stop a client
|
|
81
|
+
from operating merely because its own state is unavailable.
|
|
82
|
+
|
|
83
|
+
## Filesystem and installation
|
|
84
|
+
|
|
85
|
+
- Runtime state, bindings, sockets, and install ownership records stay outside repositories.
|
|
86
|
+
- Managed paths are checked for containment and symlink escape.
|
|
87
|
+
- Store publication uses atomic no-replace behavior, journaling, and writer locks.
|
|
88
|
+
- Corrupt or incompatible store versions fail closed before mutation.
|
|
89
|
+
- Client installers preserve unrelated settings and record content hashes.
|
|
90
|
+
- Uninstall removes only bytes still matching what ACC wrote.
|
|
91
|
+
- Tokens, credentials, and environment contents are never copied into ACC or project config.
|
|
92
|
+
|
|
93
|
+
## Data collected
|
|
94
|
+
|
|
95
|
+
ACC stores participant/session identity, presence, one-line intent, explicit claims,
|
|
96
|
+
explicit messages and structured handoffs, per-recipient receipts, artifact references,
|
|
97
|
+
and coordination events. It excludes complete prompts, assistant responses, raw
|
|
98
|
+
transcripts, secrets, environment variables, and unrelated files.
|
|
99
|
+
|
|
100
|
+
## Threat scenarios
|
|
101
|
+
|
|
102
|
+
| Threat | Prevention and detection | Residual |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| Peer message impersonates system authority | Attributed untrusted frame; fence and terminal escaping; injection tests | A model can still make a poor judgment about untrusted data |
|
|
105
|
+
| Large body buries a claim conflict | Fixed attention priority and bounded whole-frame projection | Very small budgets omit lower-priority roster detail |
|
|
106
|
+
| Stale session mutates new ownership | Exact generation on mutations; conflict error on mismatch | A same-user attacker with runtime access is out of scope |
|
|
107
|
+
| Symlink or traversal escapes a managed root | Per-segment containment, no-follow reads, closed config schema | Host filesystem compromise is out of scope |
|
|
108
|
+
| Claim denial of service | Leases, visible owner, explicit authority release | Deliberate abuse by a trusted local peer is social |
|
|
109
|
+
| Installer removes user configuration | Content-hashed ownership and byte comparison | User must remove modified leftovers manually |
|
|
110
|
+
| False delivery claim | Record-first order, transport-owned `offered`, recipient-owned retrieval/ack, mutation tests | Crash after offer before commit can cause duplicate display |
|
|
111
|
+
| Native endpoint leaks | Ephemeral opaque reference, user-only local endpoint, status redaction | Same-user local processes are outside the trust boundary |
|
|
112
|
+
| MCP client impersonates another session | Identity fixed by launch env, closed tool schemas | A compromised launch config already controls that client |
|
|
113
|
+
| Corrupt or v0.1 store is reinterpreted | Schema version rejection and doctor diagnostics | The maintainer must reset incompatible local state deliberately |
|
|
114
|
+
|
|
115
|
+
## Verification
|
|
116
|
+
|
|
117
|
+
The release gate executes attacks rather than trusting this page:
|
|
118
|
+
|
|
119
|
+
| Boundary | Covering tests |
|
|
120
|
+
|---|---|
|
|
121
|
+
| peer text and budget framing | `tests/security/peer-injection.test.mjs`, `packages/adapter-sdk/test/context-projector.test.mjs` |
|
|
122
|
+
| receipt ownership and truthful transitions | `packages/core/test/inbox-and-reply.test.mjs`, `receipt-offer-idempotency.test.mjs` |
|
|
123
|
+
| path, symlink, and config containment | `tests/security/storage-boundary.test.mjs`, `symlinked-workspace.test.mjs`, `claim-spelling.test.mjs` |
|
|
124
|
+
| installer ownership and restoration | `tests/security/installer.test.mjs`, `restore-every-client.test.mjs` |
|
|
125
|
+
| no hook-path network access | `tests/security/no-network-on-the-hook-path.test.mjs` |
|
|
126
|
+
| capability evidence and version downgrade | `packages/adapter-sdk/test/certification.test.mjs` |
|
|
127
|
+
|
|
128
|
+
An attacker who can rewrite the user's ACC data home or client configuration already has
|
|
129
|
+
the local rights ACC relies on. Report vulnerabilities through [SECURITY.md](../SECURITY.md).
|
|
130
|
+
|
|
131
|
+
Next: [Architecture](ARCHITECTURE.md) · [Capabilities](CAPABILITIES.md)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Troubleshooting
|
|
2
|
+
|
|
3
|
+
Start with:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
acc doctor
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
It reports detected clients, exact versions, installation ownership, capability downgrade,
|
|
10
|
+
and the next action. Restart a client after installation because hooks load at startup.
|
|
11
|
+
|
|
12
|
+
## The second session does not appear
|
|
13
|
+
|
|
14
|
+
Run `acc status --json` in both windows and compare `workspaceId`. Common causes are an
|
|
15
|
+
already-running client that never loaded the hook, a generic MCP server launched without
|
|
16
|
+
`ACC_MCP_WORKSPACE`, or two plain directories that are not the same workspace. Codex also
|
|
17
|
+
requires plugin trust.
|
|
18
|
+
|
|
19
|
+
ACC does not launch a missing session. Open it normally after fixing the installation or
|
|
20
|
+
workspace path.
|
|
21
|
+
|
|
22
|
+
## A message stays queued
|
|
23
|
+
|
|
24
|
+
Queued means the durable message is safe; it does not mean the recipient model saw it.
|
|
25
|
+
Have the recipient run:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
acc inbox
|
|
29
|
+
acc inbox --message message_x
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Certified next-turn delivery waits for that client's next normal prompt. Grok, generic MCP,
|
|
33
|
+
unknown client versions, and other platforms poll inbox. A reply acknowledges the original
|
|
34
|
+
automatically; `acc ack` is for acknowledgement-only messages.
|
|
35
|
+
|
|
36
|
+
## I enabled live delivery but got fallback
|
|
37
|
+
|
|
38
|
+
`--delivery actionable|all` is recipient policy, not a capability switch. No current
|
|
39
|
+
adapter has passing native live-push certification:
|
|
40
|
+
|
|
41
|
+
- Codex 0.152.0: the existing app-server control socket was absent; ACC did not start one.
|
|
42
|
+
- Claude Code 2.1.252: the capture stopped at the development-channel warning before the
|
|
43
|
+
ACC child process started.
|
|
44
|
+
|
|
45
|
+
The installer therefore keeps effective policy off and reports exact-certified next-turn
|
|
46
|
+
or inbox fallback. This is expected, not a partially working live route.
|
|
47
|
+
|
|
48
|
+
## Codex plugin is listed but inactive
|
|
49
|
+
|
|
50
|
+
Trust the plugin in Codex, then restart it. Until the client accepts that trust step, hooks
|
|
51
|
+
do not run. `acc doctor` reports the installed cache copy and missing activation separately.
|
|
52
|
+
|
|
53
|
+
## Gemini does not guard a write
|
|
54
|
+
|
|
55
|
+
Default and `plan` modes expose no write tool to the model. `auto_edit` exposes edit tools;
|
|
56
|
+
shell availability depends on approval mode. Only Gemini CLI 0.37.0 on `darwin-arm64` has
|
|
57
|
+
package-shipped delivery certification; other versions still use inbox.
|
|
58
|
+
|
|
59
|
+
## Grok shows no injected message
|
|
60
|
+
|
|
61
|
+
Grok 1.0.13 discarded UserPromptSubmit context in the real capture. Its next-turn and guard
|
|
62
|
+
capabilities remain false. Use `acc status` and `acc inbox`; do not wait for a banner.
|
|
63
|
+
|
|
64
|
+
## Kimi sessions remain in history
|
|
65
|
+
|
|
66
|
+
Kimi 0.36.1 emits a heartbeat but prompt-mode `SessionEnd` was not observed. An exited
|
|
67
|
+
session becomes offline by presence rules rather than a clean end signal. The default
|
|
68
|
+
status hides offline sessions; `acc status --all` intentionally retains attribution and
|
|
69
|
+
checkout history.
|
|
70
|
+
|
|
71
|
+
## A write was blocked
|
|
72
|
+
|
|
73
|
+
Exit code `5` names the overlapping claim and owner. Ask the owner or wait for release. If
|
|
74
|
+
an explicit authority has decided to replace it:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
acc release --claim claim_x --authority "agreed with models" \
|
|
78
|
+
--reason "handing over the file"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Protection says advisory
|
|
82
|
+
|
|
83
|
+
At least one live participant cannot be stopped through a certified hook, or at least one
|
|
84
|
+
claim asked only for advisory enforcement. This includes generic MCP and Grok. Respect the
|
|
85
|
+
claim manually; `guarded` would be a false room-wide promise.
|
|
86
|
+
|
|
87
|
+
## Store version is incompatible
|
|
88
|
+
|
|
89
|
+
v0.2 rejects v0.1 state and provides no migration or automatic deletion. `acc doctor`
|
|
90
|
+
identifies the incompatible data path. Back it up or remove it deliberately only after
|
|
91
|
+
confirming no needed coordination state remains.
|
|
92
|
+
|
|
93
|
+
## Uninstall left files
|
|
94
|
+
|
|
95
|
+
ACC removes only bytes that still match its install record. Anything edited by the user is
|
|
96
|
+
reported and retained. Remove those leftovers manually if desired.
|
|
97
|
+
|
|
98
|
+
Runtime state is outside the repository by design. `ACC_DATA_HOME` can relocate it, but ACC
|
|
99
|
+
refuses a path inside any workspace root.
|
|
100
|
+
|
|
101
|
+
Next: [Getting started](GETTING_STARTED.md) · [Capabilities](CAPABILITIES.md) ·
|
|
102
|
+
[Configuration](CONFIGURATION.md)
|
package/docs/WHY_ACC.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Why ACC
|
|
2
|
+
|
|
3
|
+
ACC exists for a narrow situation: you already have several AI sessions open, each with
|
|
4
|
+
its own client, context, permissions, checkout, and human direction, and they need to
|
|
5
|
+
communicate without becoming workers owned by one controller.
|
|
6
|
+
|
|
7
|
+
That boundary matters. Systems that create an agent team can schedule work because they
|
|
8
|
+
own the workers. ACC deliberately does not. It gives independent sessions a local durable
|
|
9
|
+
place to discover peers, ask questions, answer in threads, acknowledge messages, reserve
|
|
10
|
+
resources, and hand off context. If every session closes, the durable records still tell
|
|
11
|
+
the truth.
|
|
12
|
+
|
|
13
|
+
## Does it fit?
|
|
14
|
+
|
|
15
|
+
```mermaid
|
|
16
|
+
flowchart TD
|
|
17
|
+
A["Do you independently open several sessions?"] -->|no| N["ACC adds little and stays quiet"]
|
|
18
|
+
A -->|yes| B["Must they keep separate ownership and permissions?"]
|
|
19
|
+
B -->|no| M["A managed agent runtime may fit better"]
|
|
20
|
+
B -->|yes| C["Do they need direct questions, durable replies, or claim awareness?"]
|
|
21
|
+
C -->|yes| Y["ACC fits this workflow"]
|
|
22
|
+
C -->|no| N
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The strongest adoption signal is not installation or a large roster. It is a second
|
|
26
|
+
independently opened session completing a useful acknowledged interaction without the
|
|
27
|
+
human copying peer message content.
|
|
28
|
+
|
|
29
|
+
## What is different
|
|
30
|
+
|
|
31
|
+
| Need | ACC's boundary |
|
|
32
|
+
|---|---|
|
|
33
|
+
| Keep sessions you already opened | Hooks or MCP add participation; ACC never starts replacement workers. |
|
|
34
|
+
| Mix clients and worktrees | One repository maps to one local workspace while each session keeps its checkout identity. Git is optional. |
|
|
35
|
+
| Ask without granting authority | Messages are attributed untrusted data. A request expects a reply but is not an order. |
|
|
36
|
+
| Recover after compaction or restart | Messages and receipts commit before delivery; participant addressing survives when the participant id is stable. |
|
|
37
|
+
| Avoid overlapping edits | Intent warns; narrow claims may advise or guard, depending on every live client's measured capability. |
|
|
38
|
+
| Trust delivery language | Recorded, queued, offered, retrieved, and acknowledged are separate observable facts. |
|
|
39
|
+
| Keep it private and removable | State is local and outside repositories; transcripts are excluded; uninstall preserves user edits. |
|
|
40
|
+
|
|
41
|
+
Claims support communication; they are not the product's center. The useful loop is ask,
|
|
42
|
+
retrieve, reply, acknowledge, and hand off. A claim merely makes “I am changing this”
|
|
43
|
+
actionable before two sessions collide.
|
|
44
|
+
|
|
45
|
+
## Choose another layer when
|
|
46
|
+
|
|
47
|
+
Choose a managed runtime if you want the system to create agents, assign execution state,
|
|
48
|
+
select models, spend token budgets, or control process lifecycle. Choose a tracker when
|
|
49
|
+
you need organizational planning. Choose a hosted service when participants must
|
|
50
|
+
coordinate across machines.
|
|
51
|
+
|
|
52
|
+
ACC also does not merge model memory, read raw conversations, approve tools, operate CI,
|
|
53
|
+
or make guarded claims immune to unrelated local processes. Current native live push is
|
|
54
|
+
uncertified, so workflows that require immediate interruption of an already-running model
|
|
55
|
+
should not depend on ACC today.
|
|
56
|
+
|
|
57
|
+
If the sessions should remain yours and simply stop working in isolation, that is the
|
|
58
|
+
product ACC is designed to be.
|
|
59
|
+
|
|
60
|
+
Next: [Getting started](GETTING_STARTED.md) · [Concepts](CONCEPTS.md) ·
|
|
61
|
+
[Capabilities](CAPABILITIES.md)
|
package/docs/index.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# ACC documentation
|
|
2
|
+
|
|
3
|
+
ACC connects independently opened AI sessions so they can discover peers and communicate
|
|
4
|
+
without becoming one managed agent team. This map starts with the useful interaction, then
|
|
5
|
+
separates protocol truth from adapter reach.
|
|
6
|
+
|
|
7
|
+
## Evaluate
|
|
8
|
+
|
|
9
|
+
1. [Why ACC](WHY_ACC.md) — the product boundary and when a managed runtime fits better.
|
|
10
|
+
2. [Concepts](CONCEPTS.md) — peers, durable threads, receipts, intent, and claims.
|
|
11
|
+
3. [Capabilities](CAPABILITIES.md) — certified support, current reachability, recipient
|
|
12
|
+
policy, fallback, and limitations beside each adapter.
|
|
13
|
+
|
|
14
|
+
## Use it
|
|
15
|
+
|
|
16
|
+
1. [Getting started](GETTING_STARTED.md) — two user-opened sessions complete one useful
|
|
17
|
+
acknowledged question-and-answer interaction.
|
|
18
|
+
2. [CLI](CLI.md) — exact commands, flags, result shapes, and exit codes.
|
|
19
|
+
3. [MCP](MCP.md) — durable polling for clients without a native adapter.
|
|
20
|
+
4. [Configuration](CONFIGURATION.md) — optional workspace identity and policy.
|
|
21
|
+
5. [Troubleshooting](TROUBLESHOOTING.md) — symptoms, exact downgrades, and fixes.
|
|
22
|
+
|
|
23
|
+
## Understand and extend it
|
|
24
|
+
|
|
25
|
+
- [Protocol](PROTOCOL.md) — message envelope, thread rules, receipt lifecycle, handoffs,
|
|
26
|
+
bindings, and the clean v0.2 store break.
|
|
27
|
+
- [Architecture](ARCHITECTURE.md) — record-first flow, package boundaries, router, storage,
|
|
28
|
+
and hooks.
|
|
29
|
+
- [Security model](SECURITY_MODEL.md) — untrusted peer content, delivery integrity,
|
|
30
|
+
filesystem boundaries, and executable attack tests.
|
|
31
|
+
- [Adapter authoring](ADAPTER_AUTHORING.md) — capability evidence, hook contracts, and
|
|
32
|
+
installation ownership.
|
|
33
|
+
- [Glossary](GLOSSARY.md) — each public term in one line.
|
|
34
|
+
|
|
35
|
+
## Project work
|
|
36
|
+
|
|
37
|
+
- [Contributing](https://github.com/automatis-tools/agents-can-communicate/blob/main/AGENTS.md) — invariants and the mutation-proof gate.
|
|
38
|
+
- [Design decisions](DESIGN_DECISIONS.md) — architectural decisions and reversals.
|
|
39
|
+
- [Releasing](RELEASING.md) — packed-artifact verification.
|
|
40
|
+
|
|
41
|
+
Runtime state and raw transcripts are not documentation artifacts and never belong in the
|
|
42
|
+
repository.
|