@essentialai/cogent-bridge 3.5.10 → 3.6.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.
Files changed (47) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/backend/file-backend.d.ts +1 -1
  3. package/dist/backend/file-backend.d.ts.map +1 -1
  4. package/dist/backend/file-backend.js +2 -2
  5. package/dist/backend/file-backend.js.map +1 -1
  6. package/dist/backend/http-backend.d.ts +1 -1
  7. package/dist/backend/http-backend.d.ts.map +1 -1
  8. package/dist/backend/http-backend.js +14 -1
  9. package/dist/backend/http-backend.js.map +1 -1
  10. package/dist/backend/storage-backend.d.ts +5 -1
  11. package/dist/backend/storage-backend.d.ts.map +1 -1
  12. package/dist/config.d.ts +3 -0
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +9 -0
  15. package/dist/config.js.map +1 -1
  16. package/dist/services/auto-relay.d.ts +50 -0
  17. package/dist/services/auto-relay.d.ts.map +1 -1
  18. package/dist/services/auto-relay.js +177 -45
  19. package/dist/services/auto-relay.js.map +1 -1
  20. package/dist/services/cc-cli.d.ts +11 -0
  21. package/dist/services/cc-cli.d.ts.map +1 -1
  22. package/dist/services/cc-cli.js +69 -0
  23. package/dist/services/cc-cli.js.map +1 -1
  24. package/dist/services/claude-preflight.d.ts.map +1 -1
  25. package/dist/services/claude-preflight.js +1 -0
  26. package/dist/services/claude-preflight.js.map +1 -1
  27. package/dist/services/codex-cli.d.ts.map +1 -1
  28. package/dist/services/codex-cli.js +18 -4
  29. package/dist/services/codex-cli.js.map +1 -1
  30. package/dist/services/durable-identity.d.ts +11 -0
  31. package/dist/services/durable-identity.d.ts.map +1 -0
  32. package/dist/services/durable-identity.js +14 -0
  33. package/dist/services/durable-identity.js.map +1 -0
  34. package/dist/services/peer-registry.d.ts +1 -1
  35. package/dist/services/peer-registry.d.ts.map +1 -1
  36. package/dist/services/peer-registry.js +8 -1
  37. package/dist/services/peer-registry.js.map +1 -1
  38. package/dist/startup.d.ts.map +1 -1
  39. package/dist/startup.js +8 -1
  40. package/dist/startup.js.map +1 -1
  41. package/dist/tools/register-peer.d.ts.map +1 -1
  42. package/dist/tools/register-peer.js +29 -3
  43. package/dist/tools/register-peer.js.map +1 -1
  44. package/dist/types.d.ts +30 -0
  45. package/dist/types.d.ts.map +1 -1
  46. package/package.json +1 -1
  47. package/server.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.6.0 — 2026-07-07
4
+
5
+ ### Added
6
+ - **Wake Trace Slice 3 — structured reply capture (Story 8.4).** Claude replies captured from
7
+ `--output-format json` `.result` (Codex from the `-o` file); a lower-trust fallback is surfaced as a
8
+ visible `[cogent:needs-manual]` downgrade — never a raw-stdout guess.
9
+ - **Slice 4 — structured A2A anti-noise defaults (Story 8.5).** Agent-origin broadcasts are manual by
10
+ default (no auto multi-agent debate; human-origin slack/gchat/web broadcasts still auto-relay); peers
11
+ advertise a role (implementer/reviewer/auditor/coordinator). Opt-in `COGENT_BROADCAST_AUTORELAY`.
12
+ - **Slice 5 — durable identity on the wire (Story 8.6).** Register advertises `workspaceId`
13
+ (sha256 of cwd) + `threadId`; the relay stores them (coordinated `.strict()` extension, relay-first).
14
+ cwd becomes a hint, not the key. Preserved across auto-reconnect.
15
+
16
+
17
+ ## 3.5.11 — 2026-07-06
18
+
19
+ ### Added
20
+ - **Wake Trace Slice 2 — busy-state queue status ("⏳ queued").** When a directed message arrives at
21
+ a peer that is **busy** mid-turn (an agent already processing a `--resume` wake), the message is
22
+ queued (never a corrupting mid-turn resume) **and the sender is now told** — a `⏳ [cogent:queued]`
23
+ status notice is relayed back in the **`message`** field (cloud mode transmits only `message`).
24
+ The notice is **non-terminal**: a blocking `cogent_send_message` on the sender stays pending and
25
+ still resolves on the real answer when the busy peer drains its queue — the "queued" line never
26
+ masquerades as the response. Small shared status vocabulary
27
+ (`queued/processing/delivered/needs-manual/failed`). Client-only, additive — no relay or
28
+ wire-schema change (the marker rides inside the message string). Exactly one notice per deferred
29
+ message; observer peers and the non-busy fast path are unchanged.
30
+
3
31
  ## 3.5.10 — 2026-07-04
4
32
 
5
33
  ### Changed
@@ -8,7 +8,7 @@ import { StorageBackend } from "./storage-backend.js";
8
8
  * cc-cli.ts, and health-check.ts. No added logic, logging, or transformation.
9
9
  */
10
10
  export declare class FileBackend implements StorageBackend {
11
- registerPeer(peerId: string, sessionId: string, cwd: string, label: string, clientVersion?: string, mode?: "observer" | "agent", channelSessionId?: string, capabilities?: string[]): Promise<PeerInfo>;
11
+ registerPeer(peerId: string, sessionId: string, cwd: string, label: string, clientVersion?: string, mode?: "observer" | "agent", channelSessionId?: string, capabilities?: string[], workspaceId?: string, threadId?: string): Promise<PeerInfo>;
12
12
  deregisterPeer(peerId: string): Promise<boolean>;
13
13
  getPeer(peerId: string): Promise<PeerInfo | undefined>;
14
14
  listPeers(): Promise<PeerInfo[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"file-backend.d.ts","sourceRoot":"","sources":["../../src/backend/file-backend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,cAAc;IAGhD,YAAY,CACV,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,EAC3B,gBAAgB,CAAC,EAAE,MAAM,EACzB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,QAAQ,CAAC;IAapB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAItD,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIhC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C,aAAa,CACX,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAC9C,OAAO,CAAC,aAAa,CAAC;IAIzB,UAAU,CACR,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,OAAO,EAC5B,YAAY,CAAC,EAAE,OAAO,EACtB,oBAAoB,CAAC,EAAE,OAAO,GAC7B,OAAO,CAAC,aAAa,EAAE,CAAC;IAQ3B,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjE,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;IAMzB,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAG1C"}
1
+ {"version":3,"file":"file-backend.d.ts","sourceRoot":"","sources":["../../src/backend/file-backend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,cAAc;IAGhD,YAAY,CACV,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,EAC3B,gBAAgB,CAAC,EAAE,MAAM,EACzB,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC;IAepB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAItD,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIhC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C,aAAa,CACX,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAC9C,OAAO,CAAC,aAAa,CAAC;IAIzB,UAAU,CACR,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,OAAO,EAC5B,YAAY,CAAC,EAAE,OAAO,EACtB,oBAAoB,CAAC,EAAE,OAAO,GAC7B,OAAO,CAAC,aAAa,EAAE,CAAC;IAQ3B,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjE,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;IAMzB,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAG1C"}
@@ -9,8 +9,8 @@ import * as health from "../services/health-check.js";
9
9
  */
10
10
  export class FileBackend {
11
11
  // --- Peer management ---
12
- registerPeer(peerId, sessionId, cwd, label, clientVersion, mode, channelSessionId, capabilities) {
13
- return registry.registerPeer(peerId, sessionId, cwd, label, clientVersion, mode, channelSessionId, capabilities);
12
+ registerPeer(peerId, sessionId, cwd, label, clientVersion, mode, channelSessionId, capabilities, workspaceId, threadId) {
13
+ return registry.registerPeer(peerId, sessionId, cwd, label, clientVersion, mode, channelSessionId, capabilities, workspaceId, threadId);
14
14
  }
15
15
  deregisterPeer(peerId) {
16
16
  return registry.deregisterPeer(peerId);
@@ -1 +1 @@
1
- {"version":3,"file":"file-backend.js","sourceRoot":"","sources":["../../src/backend/file-backend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,8BAA8B,CAAC;AACzD,OAAO,KAAK,GAAG,MAAM,uBAAuB,CAAC;AAC7C,OAAO,KAAK,MAAM,MAAM,6BAA6B,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACtB,0BAA0B;IAE1B,YAAY,CACV,MAAc,EACd,SAAiB,EACjB,GAAW,EACX,KAAa,EACb,aAAsB,EACtB,IAA2B,EAC3B,gBAAyB,EACzB,YAAuB;QAEvB,OAAO,QAAQ,CAAC,YAAY,CAC1B,MAAM,EACN,SAAS,EACT,GAAG,EACH,KAAK,EACL,aAAa,EACb,IAAI,EACJ,gBAAgB,EAChB,YAAY,CACb,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,OAAO,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,SAAS;QACP,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC;IAC9B,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,OAAO,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,wBAAwB;IAExB,aAAa,CACX,MAA+C;QAE/C,OAAO,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,UAAU,CACR,MAAe,EACf,KAAc,EACd,kBAA4B,EAC5B,YAAsB,EACtB,oBAA8B;QAE9B,qEAAqE;QACrE,iEAAiE;QACjE,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;IAC9E,CAAC;IAED,wBAAwB;IAExB,eAAe,CAAC,SAAiB,EAAE,GAAW;QAC5C,OAAO,GAAG,CAAC,eAAe,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,UAAU,CACR,SAAiB,EACjB,OAAe,EACf,GAAW,EACX,SAAkB;QAElB,OAAO,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,iBAAiB;IAEjB,WAAW;QACT,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;CACF"}
1
+ {"version":3,"file":"file-backend.js","sourceRoot":"","sources":["../../src/backend/file-backend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,8BAA8B,CAAC;AACzD,OAAO,KAAK,GAAG,MAAM,uBAAuB,CAAC;AAC7C,OAAO,KAAK,MAAM,MAAM,6BAA6B,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACtB,0BAA0B;IAE1B,YAAY,CACV,MAAc,EACd,SAAiB,EACjB,GAAW,EACX,KAAa,EACb,aAAsB,EACtB,IAA2B,EAC3B,gBAAyB,EACzB,YAAuB,EACvB,WAAoB,EACpB,QAAiB;QAEjB,OAAO,QAAQ,CAAC,YAAY,CAC1B,MAAM,EACN,SAAS,EACT,GAAG,EACH,KAAK,EACL,aAAa,EACb,IAAI,EACJ,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,OAAO,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,SAAS;QACP,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC;IAC9B,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,OAAO,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,wBAAwB;IAExB,aAAa,CACX,MAA+C;QAE/C,OAAO,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,UAAU,CACR,MAAe,EACf,KAAc,EACd,kBAA4B,EAC5B,YAAsB,EACtB,oBAA8B;QAE9B,qEAAqE;QACrE,iEAAiE;QACjE,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;IAC9E,CAAC;IAED,wBAAwB;IAExB,eAAe,CAAC,SAAiB,EAAE,GAAW;QAC5C,OAAO,GAAG,CAAC,eAAe,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,UAAU,CACR,SAAiB,EACjB,OAAe,EACf,GAAW,EACX,SAAkB;QAElB,OAAO,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,iBAAiB;IAEjB,WAAW;QACT,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;CACF"}
@@ -26,7 +26,7 @@ export declare class HttpBackend implements StorageBackend {
26
26
  * The sessionId parameter from StorageBackend is the local CC sessionId;
27
27
  * in cloud mode we ignore it and use this.sessionId (the cloud session).
28
28
  */
29
- registerPeer(peerId: string, _sessionId: string, cwd: string, label: string, clientVersion?: string, mode?: "observer" | "agent", _channelSessionId?: string, _capabilities?: string[]): Promise<PeerInfo>;
29
+ registerPeer(peerId: string, _sessionId: string, cwd: string, label: string, clientVersion?: string, mode?: "observer" | "agent", _channelSessionId?: string, _capabilities?: string[], workspaceId?: string, threadId?: string): Promise<PeerInfo>;
30
30
  /**
31
31
  * Deregister a peer from the cloud session.
32
32
  * DELETE /api/sessions/:sessionId/peers/:peerId
@@ -1 +1 @@
1
- {"version":3,"file":"http-backend.d.ts","sourceRoot":"","sources":["../../src/backend/http-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAkB1D;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAY,YAAW,cAAc;IAE9C,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM;IAGpC;;;;;;OAMG;IACG,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,EAG3B,iBAAiB,CAAC,EAAE,MAAM,EAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,QAAQ,CAAC;IA2BpB;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAatD;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAK5D;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAMtC;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD;;;;;;;OAOG;IACG,aAAa,CACjB,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAC9C,OAAO,CAAC,aAAa,CAAC;IA2BzB;;;;;OAKG;IACG,UAAU,CACd,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,OAAO,EAC5B,YAAY,CAAC,EAAE,OAAO,EACtB,mBAAmB,CAAC,EAAE,OAAO,GAC5B,OAAO,CAAC,aAAa,EAAE,CAAC;IAmC3B;;;;;;OAMG;IACG,qBAAqB,CACzB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC;IAchB;;;;OAIG;IACG,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC;IAInB;;;;;;;OAOG;IACG,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC;IAQzB;;;;;;OAMG;IACG,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAyC/C;;;;;;;;;OASG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGhD"}
1
+ {"version":3,"file":"http-backend.d.ts","sourceRoot":"","sources":["../../src/backend/http-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAkB1D;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAY,YAAW,cAAc;IAE9C,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM;IAGpC;;;;;;OAMG;IACG,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,EAG3B,iBAAiB,CAAC,EAAE,MAAM,EAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,EAIxB,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC;IAoCpB;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAatD;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAK5D;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAMtC;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD;;;;;;;OAOG;IACG,aAAa,CACjB,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAC9C,OAAO,CAAC,aAAa,CAAC;IA2BzB;;;;;OAKG;IACG,UAAU,CACd,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,OAAO,EAC5B,YAAY,CAAC,EAAE,OAAO,EACtB,mBAAmB,CAAC,EAAE,OAAO,GAC5B,OAAO,CAAC,aAAa,EAAE,CAAC;IAmC3B;;;;;;OAMG;IACG,qBAAqB,CACzB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC;IAchB;;;;OAIG;IACG,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC;IAInB;;;;;;;OAOG;IACG,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC;IAQzB;;;;;;OAMG;IACG,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAyC/C;;;;;;;;;OASG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGhD"}
@@ -43,7 +43,11 @@ export class HttpBackend {
43
43
  async registerPeer(peerId, _sessionId, cwd, label, clientVersion, mode,
44
44
  // 3.5.9 durable-identity rails are LOCAL-ONLY: intentionally NOT added to the
45
45
  // wire body (the relay register schema is .strict() and would reject them).
46
- _channelSessionId, _capabilities) {
46
+ _channelSessionId, _capabilities,
47
+ // Slice 5 / Story 8.6: durable identity that DOES go on the wire (unlike the
48
+ // local-only rails above) — the relay's .strict() schema was extended in
49
+ // lockstep (relay-first deploy) to accept these optional fields.
50
+ workspaceId, threadId) {
47
51
  const path = PATHS.peers.replace(":sessionId", this.sessionId);
48
52
  // Build body conditionally: omit clientVersion entirely for older clients
49
53
  // / undefined inputs so the wire payload stays clean (no JSON null) and
@@ -67,6 +71,15 @@ export class HttpBackend {
67
71
  if (mode !== undefined) {
68
72
  body.mode = mode;
69
73
  }
74
+ // Slice 5 / Story 8.6: advertise durable identity on the wire (conditional-set,
75
+ // like the fields above). A relay too old to know these fields would reject
76
+ // via .strict() — so the relay ships the optional fields FIRST, then the client.
77
+ if (workspaceId !== undefined) {
78
+ body.workspaceId = workspaceId;
79
+ }
80
+ if (threadId !== undefined) {
81
+ body.threadId = threadId;
82
+ }
70
83
  return this.http.post(path, body);
71
84
  }
72
85
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"http-backend.js","sourceRoot":"","sources":["../../src/backend/http-backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-backend.js","sourceRoot":"","sources":["../../src/backend/http-backend.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,11 @@ export interface StorageBackend {
16
16
  /** Cloud/relay session id, kept distinct from the local sessionId (3.5.9, local-only). */
17
17
  channelSessionId?: string,
18
18
  /** Advertised capabilities, e.g. ["auto-resume"] (3.5.9, local-only rail). */
19
- capabilities?: string[]): Promise<PeerInfo>;
19
+ capabilities?: string[],
20
+ /** Durable workspace id — on the wire in cloud mode (Slice 5 / Story 8.6). */
21
+ workspaceId?: string,
22
+ /** Durable thread/conversation id — on the wire in cloud mode (Slice 5 / Story 8.6). */
23
+ threadId?: string): Promise<PeerInfo>;
20
24
  deregisterPeer(peerId: string): Promise<boolean>;
21
25
  getPeer(peerId: string): Promise<PeerInfo | undefined>;
22
26
  listPeers(): Promise<PeerInfo[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"storage-backend.d.ts","sourceRoot":"","sources":["../../src/backend/storage-backend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAE7B,YAAY,CACV,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM;IACb,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM;IACtB,4FAA4F;IAC5F,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO;IAC3B,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,MAAM;IACzB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAEvD,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEjC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG9C,aAAa,CACX,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAC9C,OAAO,CAAC,aAAa,CAAC,CAAC;IAE1B;;;;;;;;;;;;;OAaG;IACH,UAAU,CACR,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,OAAO,EAC5B,YAAY,CAAC,EAAE,OAAO,EACtB,mBAAmB,CAAC,EAAE,OAAO,GAC5B,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAG5B,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElE,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAAC;IAG1B;;;;;;;;;OASG;IACH,qBAAqB,CAAC,CACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IAGjB,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE1C;;;;;OAKG;IACH,eAAe,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC5C"}
1
+ {"version":3,"file":"storage-backend.d.ts","sourceRoot":"","sources":["../../src/backend/storage-backend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAE7B,YAAY,CACV,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM;IACb,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM;IACtB,4FAA4F;IAC5F,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO;IAC3B,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,MAAM;IACzB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,EAAE;IACvB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM;IACpB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAEvD,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEjC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG9C,aAAa,CACX,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAC9C,OAAO,CAAC,aAAa,CAAC,CAAC;IAE1B;;;;;;;;;;;;;OAaG;IACH,UAAU,CACR,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,OAAO,EAC5B,YAAY,CAAC,EAAE,OAAO,EACtB,mBAAmB,CAAC,EAAE,OAAO,GAC5B,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAG5B,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElE,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAAC;IAG1B;;;;;;;;;OASG;IACH,qBAAqB,CAAC,CACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IAGjB,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE1C;;;;;OAKG;IACH,eAAe,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC5C"}
package/dist/config.d.ts CHANGED
@@ -18,6 +18,7 @@ export declare const configSchema: z.ZodObject<{
18
18
  COGENT_CODEX_PATH: z.ZodDefault<z.ZodString>;
19
19
  COGENT_CODEX_SANDBOX: z.ZodDefault<z.ZodEnum<["full-auto", "read-only", "workspace-write", "danger-full-access", "bypass"]>>;
20
20
  COGENT_RESOLVER_AMBIGUOUS_MARGIN_MS: z.ZodDefault<z.ZodNumber>;
21
+ COGENT_BROADCAST_AUTORELAY: z.ZodEffects<z.ZodOptional<z.ZodString>, boolean, string | undefined>;
21
22
  }, "strip", z.ZodTypeAny, {
22
23
  COGENT_STATE_PATH: string;
23
24
  COGENT_TEAM_ENDPOINT: string;
@@ -34,6 +35,7 @@ export declare const configSchema: z.ZodObject<{
34
35
  COGENT_CODEX_PATH: string;
35
36
  COGENT_CODEX_SANDBOX: "full-auto" | "read-only" | "workspace-write" | "danger-full-access" | "bypass";
36
37
  COGENT_RESOLVER_AMBIGUOUS_MARGIN_MS: number;
38
+ COGENT_BROADCAST_AUTORELAY: boolean;
37
39
  COGENT_ENDPOINT?: string | undefined;
38
40
  COGENT_SESSION_ID?: string | undefined;
39
41
  COGENT_SECRET?: string | undefined;
@@ -56,6 +58,7 @@ export declare const configSchema: z.ZodObject<{
56
58
  COGENT_CODEX_PATH?: string | undefined;
57
59
  COGENT_CODEX_SANDBOX?: "full-auto" | "read-only" | "workspace-write" | "danger-full-access" | "bypass" | undefined;
58
60
  COGENT_RESOLVER_AMBIGUOUS_MARGIN_MS?: number | undefined;
61
+ COGENT_BROADCAST_AUTORELAY?: string | undefined;
59
62
  }>;
60
63
  export type Config = z.infer<typeof configSchema>;
61
64
  export declare function loadConfig(env?: Record<string, string | undefined>): Config;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAIlD,wBAAgB,UAAU,CACxB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,MAAM,CAUR;AAED,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmDvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAIlD,wBAAgB,UAAU,CACxB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,MAAM,CAUR;AAED,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
package/dist/config.js CHANGED
@@ -44,6 +44,15 @@ export const configSchema = z.object({
44
44
  .int()
45
45
  .min(0)
46
46
  .default(60_000),
47
+ // Slice 4 (Story 8.5): anti-noise A2A default. A BROADCAST (toPeerId "*") must
48
+ // NOT trigger an automatic subprocess wake, so addressing the whole channel
49
+ // never starts an automatic multi-agent debate ("no auto debate unless the
50
+ // human asks"). Directed messages still auto-relay. Opt a peer INTO broadcast
51
+ // auto-relay by setting this to "true"/"1". Default (unset) = manual broadcast.
52
+ COGENT_BROADCAST_AUTORELAY: z
53
+ .string()
54
+ .optional()
55
+ .transform((v) => v === "true" || v === "1"),
47
56
  });
48
57
  let _config = null;
49
58
  export function loadConfig(env = process.env) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,35 @@
1
1
  import { MessageRecord } from "../types.js";
2
2
  import { type SessionResolution } from "./session-resolver.js";
3
+ /**
4
+ * Slice 2 — busy-state queue. A deliberately small, human-facing status
5
+ * vocabulary surfaced to the SENDER via the `message` field (cloud mode
6
+ * transmits only `message`, never `response` — the 3.5.10 lesson). The
7
+ * `[cogent:<status>]` marker is both human-readable (a person watching in Slack
8
+ * sees "⏳ … busy … queued") AND machine-recognizable, so the sender's client
9
+ * can treat a status notice as NON-TERMINAL: it must never resolve a pending
10
+ * send_message waiter (the real answer follows when the busy peer drains its
11
+ * queue) and never trigger a local wake.
12
+ */
13
+ export declare const RELAY_STATUS: {
14
+ readonly QUEUED: "queued";
15
+ readonly PROCESSING: "processing";
16
+ readonly DELIVERED: "delivered";
17
+ readonly NEEDS_MANUAL: "needs-manual";
18
+ readonly FAILED: "failed";
19
+ };
20
+ export type RelayStatus = (typeof RELAY_STATUS)[keyof typeof RELAY_STATUS];
21
+ /**
22
+ * Build a sender-facing status notice. The `[cogent:<status>]` marker is ALWAYS
23
+ * first so {@link parseStatusNotice} can anchor on it; the human-readable text
24
+ * (incl. the ⏳ glyph for a Slack reader) follows.
25
+ */
26
+ export declare function buildStatusNotice(status: RelayStatus, peerId: string, traceId?: string): string;
27
+ /**
28
+ * Parse a status notice back to its status, or null for an ordinary message.
29
+ * Anchored: only a message that STARTS with the marker is a notice, so a real
30
+ * answer that merely mentions the token mid-text is (correctly) not one.
31
+ */
32
+ export declare function parseStatusNotice(message: string): RelayStatus | null;
3
33
  export declare class AutoRelayService {
4
34
  private localPeerId;
5
35
  private localSessionId;
@@ -159,6 +189,26 @@ export declare class AutoRelayService {
159
189
  * - Serialized processing with queue to prevent concurrent execRemote calls
160
190
  */
161
191
  handleIncoming(msg: MessageRecord): Promise<void>;
192
+ /**
193
+ * Slice 2: relay a NON-TERMINAL status notice back to the sender as a new
194
+ * cloud message. The notice rides in the `message` field (cloud transmits
195
+ * only `message`) with a `[cogent:<status>]` marker the sender's client
196
+ * recognizes, so it does NOT resolve a pending send_message waiter. Tagged
197
+ * `isRelayEcho` so server 3.1.6+ filters it from history like other echoes.
198
+ * Best-effort: a failure here must never break the busy-queue path.
199
+ */
200
+ private _emitStatusNotice;
201
+ /**
202
+ * Slice 3 (Story 8.4): relay a captured reply back to the sender, recording
203
+ * HOW it was captured so a downgrade (structured `event_stream` → raw
204
+ * `stdout_compat`, or a structured error) is EXPLICIT in the wake trace and
205
+ * never disguised as a clean auto-capture (AC3). On an unstable capture it
206
+ * also emits a visible, non-terminal `[cogent:needs-manual]` notice to the
207
+ * sender — the answer still relays, but the human/agent knows it wasn't a
208
+ * trusted structured capture. Used by BOTH the primary and rotated-session
209
+ * retry paths (F-B) so neither can disguise a downgrade.
210
+ */
211
+ private _relayCapturedReply;
162
212
  /**
163
213
  * Internal: process a single message -- calls the local agent CLI via execRemote and relay response.
164
214
  */
@@ -1 +1 @@
1
- {"version":3,"file":"auto-relay.d.ts","sourceRoot":"","sources":["../../src/services/auto-relay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-relay.d.ts","sourceRoot":"","sources":["../../src/services/auto-relay.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,57 @@ import { resolveSession } from "./session-resolver.js";
4
4
  import { getConfig } from "../config.js";
5
5
  import { getBackend } from "../backend/index.js";
6
6
  import { logger } from "../logger.js";
7
+ /**
8
+ * Slice 2 — busy-state queue. A deliberately small, human-facing status
9
+ * vocabulary surfaced to the SENDER via the `message` field (cloud mode
10
+ * transmits only `message`, never `response` — the 3.5.10 lesson). The
11
+ * `[cogent:<status>]` marker is both human-readable (a person watching in Slack
12
+ * sees "⏳ … busy … queued") AND machine-recognizable, so the sender's client
13
+ * can treat a status notice as NON-TERMINAL: it must never resolve a pending
14
+ * send_message waiter (the real answer follows when the busy peer drains its
15
+ * queue) and never trigger a local wake.
16
+ */
17
+ export const RELAY_STATUS = {
18
+ QUEUED: "queued",
19
+ PROCESSING: "processing",
20
+ DELIVERED: "delivered",
21
+ NEEDS_MANUAL: "needs-manual",
22
+ FAILED: "failed",
23
+ };
24
+ // Anchored at the START of the message: a status notice ALWAYS leads with its
25
+ // `[cogent:<status>]` marker (see buildStatusNotice). Anchoring — rather than a
26
+ // substring scan — is what prevents a genuine reply that merely QUOTES a
27
+ // `[cogent:queued]` token (very plausible when agents coordinate about
28
+ // cogent-bridge itself) from being misclassified as a non-terminal notice and
29
+ // silently dropped. (AUDIT-8.3: an unanchored match hung the sender's
30
+ // send_message for the full timeout.)
31
+ const STATUS_MARKER_RE = /^\[cogent:(queued|processing|delivered|needs-manual|failed)\]/;
32
+ /**
33
+ * Build a sender-facing status notice. The `[cogent:<status>]` marker is ALWAYS
34
+ * first so {@link parseStatusNotice} can anchor on it; the human-readable text
35
+ * (incl. the ⏳ glyph for a Slack reader) follows.
36
+ */
37
+ export function buildStatusNotice(status, peerId, traceId) {
38
+ const tail = traceId ? ` (trace ${traceId})` : "";
39
+ if (status === RELAY_STATUS.QUEUED) {
40
+ return (`[cogent:queued] ⏳ "${peerId}" is busy with another request — your message is ` +
41
+ `queued and will be answered when it is free.${tail}`);
42
+ }
43
+ if (status === RELAY_STATUS.NEEDS_MANUAL) {
44
+ return (`[cogent:needs-manual] ⚠️ "${peerId}" replied but Cogent could not capture it from a trusted ` +
45
+ `structured stream (raw-output fallback) — treat the following reply as unverified.${tail}`);
46
+ }
47
+ return `[cogent:${status}] "${peerId}"${tail}`;
48
+ }
49
+ /**
50
+ * Parse a status notice back to its status, or null for an ordinary message.
51
+ * Anchored: only a message that STARTS with the marker is a notice, so a real
52
+ * answer that merely mentions the token mid-text is (correctly) not one.
53
+ */
54
+ export function parseStatusNotice(message) {
55
+ const m = STATUS_MARKER_RE.exec(message);
56
+ return m ? m[1] : null;
57
+ }
7
58
  /**
8
59
  * Format an incoming message for injection into the local Claude Code session.
9
60
  * Mirrors the pattern used in send-message.ts's formatBridgeMessage().
@@ -361,6 +412,20 @@ export class AutoRelayService {
361
412
  this.sendDeliveryAckFn(msg.id, this.localPeerId, msg.fromPeerId);
362
413
  this._trace(traceId, "delivered", { messageId: msg.id, fromPeerId: msg.fromPeerId });
363
414
  }
415
+ // Slice 2: a busy-state status notice (⏳ queued / processing / …) is
416
+ // INFORMATIONAL and NON-TERMINAL. Recognize it BEFORE the waiter-resolution
417
+ // path so it never resolves a pending send_message (the real answer follows
418
+ // when the busy peer drains) and never triggers a local wake. The delivery
419
+ // ack already fired above, so the sender still learns the notice arrived.
420
+ const statusNotice = parseStatusNotice(msg.message);
421
+ if (statusNotice) {
422
+ this._trace(traceId, "status_recv", {
423
+ status: statusNotice,
424
+ fromPeerId: msg.fromPeerId,
425
+ });
426
+ logger.info(`Auto-relay: non-terminal status '${statusNotice}' from ${msg.fromPeerId} — leaving any waiter pending`);
427
+ return;
428
+ }
364
429
  // Guard: we sent this peer an explicit message and are expecting their response.
365
430
  // If there's an active waiter (send-message is blocking), resolve it with
366
431
  // the response content. Otherwise fall back to inject-only mode.
@@ -395,10 +460,39 @@ export class AutoRelayService {
395
460
  logger.info(`Auto-relay: observer mode — skipping subprocess for message ${msg.id} from ${msg.fromPeerId}`);
396
461
  return;
397
462
  }
463
+ // Slice 4 (Story 8.5): an AGENT-origin BROADCAST is manual by default. When
464
+ // one agent addresses the whole channel (toPeerId "*"), the other agents must
465
+ // NOT all auto-wake and reply — that is the "address one, all reply" storm /
466
+ // automatic multi-agent debate this slice prevents. The delivery ack already
467
+ // fired (the sender knows it arrived); the human drives any broadcast response.
468
+ //
469
+ // CRITICAL: a HUMAN-origin broadcast (originPlatform slack/gchat/web — e.g. a
470
+ // Slack user posting in a mapped channel, which the Slack bridge relays as
471
+ // toPeerId "*") MUST still auto-relay, or agents would stop answering Slack
472
+ // users entirely. Only agent-origin (cc/codex, or an absent/unknown origin)
473
+ // broadcasts are gated. Opt in for agent broadcasts with COGENT_BROADCAST_AUTORELAY.
474
+ const HUMAN_ORIGINS = new Set(["slack", "gchat", "web"]);
475
+ const isHumanOriginBroadcast = msg.originPlatform !== undefined && HUMAN_ORIGINS.has(msg.originPlatform);
476
+ if (msg.toPeerId === "*" &&
477
+ !isHumanOriginBroadcast &&
478
+ !getConfig().COGENT_BROADCAST_AUTORELAY) {
479
+ this._trace(traceId, "broadcast_manual", {
480
+ fromPeerId: msg.fromPeerId,
481
+ originPlatform: msg.originPlatform ?? "unknown",
482
+ });
483
+ logger.info(`Auto-relay: agent-origin broadcast from ${msg.fromPeerId} — manual by default (no auto-wake). ` +
484
+ `Set COGENT_BROADCAST_AUTORELAY=true to auto-respond to agent broadcasts.`);
485
+ return;
486
+ }
398
487
  // Serialize processing: queue if already busy
399
488
  if (this.processing) {
400
489
  logger.debug(`Auto-relay: queuing message from ${msg.fromPeerId} (busy processing)`);
401
490
  this.queue.push(msg);
491
+ // Slice 2: tell the SENDER their message is ⏳ queued — not lost, and NOT
492
+ // resumed mid-turn (which would corrupt an active edit/test). Non-terminal:
493
+ // the real answer follows when we drain. Exactly one notice per deferred
494
+ // message (this branch runs once per message).
495
+ await this._emitStatusNotice(msg.fromPeerId, RELAY_STATUS.QUEUED, msg.traceId);
402
496
  return;
403
497
  }
404
498
  this.processing = true;
@@ -420,6 +514,84 @@ export class AutoRelayService {
420
514
  }
421
515
  }
422
516
  }
517
+ /**
518
+ * Slice 2: relay a NON-TERMINAL status notice back to the sender as a new
519
+ * cloud message. The notice rides in the `message` field (cloud transmits
520
+ * only `message`) with a `[cogent:<status>]` marker the sender's client
521
+ * recognizes, so it does NOT resolve a pending send_message waiter. Tagged
522
+ * `isRelayEcho` so server 3.1.6+ filters it from history like other echoes.
523
+ * Best-effort: a failure here must never break the busy-queue path.
524
+ */
525
+ async _emitStatusNotice(toPeerId, status, traceId) {
526
+ if (!this.localPeerId)
527
+ return;
528
+ try {
529
+ await getBackend().recordMessage({
530
+ fromPeerId: this.localPeerId,
531
+ toPeerId,
532
+ message: buildStatusNotice(status, this.localPeerId, traceId),
533
+ response: null,
534
+ durationMs: null,
535
+ success: true,
536
+ error: null,
537
+ isRelayEcho: true,
538
+ traceId,
539
+ });
540
+ this._trace(traceId ?? "", "status_sent", { status, toPeerId });
541
+ }
542
+ catch (err) {
543
+ logger.error(`Auto-relay: failed to emit '${status}' status notice: ${err}`);
544
+ }
545
+ }
546
+ /**
547
+ * Slice 3 (Story 8.4): relay a captured reply back to the sender, recording
548
+ * HOW it was captured so a downgrade (structured `event_stream` → raw
549
+ * `stdout_compat`, or a structured error) is EXPLICIT in the wake trace and
550
+ * never disguised as a clean auto-capture (AC3). On an unstable capture it
551
+ * also emits a visible, non-terminal `[cogent:needs-manual]` notice to the
552
+ * sender — the answer still relays, but the human/agent knows it wasn't a
553
+ * trusted structured capture. Used by BOTH the primary and rotated-session
554
+ * retry paths (F-B) so neither can disguise a downgrade.
555
+ */
556
+ async _relayCapturedReply(msg, result, traceId, durationMs, retried) {
557
+ this._trace(traceId, "captured", {
558
+ durationMs,
559
+ retried,
560
+ captureContract: result.captureContract ?? "unknown",
561
+ stable: result.stable ?? null,
562
+ });
563
+ // A downgrade is only when the contract is EXPLICITLY known to be lower-trust
564
+ // (stdout_compat fallback, or a structured capture whose run errored). An
565
+ // ABSENT contract (legacy/unknown result) is NOT a downgrade — don't emit a
566
+ // spurious needs-manual notice; preserve the pre-Slice-3 relay behavior.
567
+ const isDowngrade = result.captureContract !== undefined && result.stable !== true;
568
+ if (isDowngrade) {
569
+ this._trace(traceId, "capture_downgrade", {
570
+ to: result.captureContract,
571
+ retried,
572
+ });
573
+ await this._emitStatusNotice(msg.fromPeerId, RELAY_STATUS.NEEDS_MANUAL, traceId);
574
+ }
575
+ try {
576
+ await getBackend().recordMessage({
577
+ fromPeerId: this.localPeerId,
578
+ toPeerId: msg.fromPeerId,
579
+ message: result.stdout,
580
+ response: null,
581
+ durationMs,
582
+ success: true,
583
+ error: null,
584
+ // 260511-o3p: tag the auto-relay echo so server 3.1.6+ filters it from
585
+ // cogent_get_history by default.
586
+ isRelayEcho: true,
587
+ traceId,
588
+ });
589
+ logger.info(`Auto-relay: response sent back to ${msg.fromPeerId} (${durationMs}ms${retried ? ", retried" : ""})`);
590
+ }
591
+ catch (recordErr) {
592
+ logger.error(`Auto-relay: failed to record response message: ${recordErr}`);
593
+ }
594
+ }
423
595
  /**
424
596
  * Internal: process a single message -- calls the local agent CLI via execRemote and relay response.
425
597
  */
@@ -491,30 +663,7 @@ export class AutoRelayService {
491
663
  const result = await execRemote(getConfig().COGENT_PLATFORM, this.localSessionId, formatted, this.localCwd);
492
664
  const durationMs = Date.now() - startMs;
493
665
  if (result.exitCode === 0 && result.stdout) {
494
- this._trace(traceId, "captured", { durationMs, exitCode: result.exitCode });
495
- // Send the response back to the original sender as a new cloud message.
496
- // This will trigger the server to push it via WebSocket to the sender,
497
- // which will trigger their auto-relay in turn.
498
- try {
499
- await backend.recordMessage({
500
- fromPeerId: this.localPeerId,
501
- toPeerId: msg.fromPeerId,
502
- message: result.stdout,
503
- response: null,
504
- durationMs,
505
- success: true,
506
- error: null,
507
- // 260511-o3p: tag the auto-relay echo so server 3.1.6+ filters
508
- // it from cogent_get_history by default. Older servers ignore
509
- // the field; older clients see it via the optional field.
510
- isRelayEcho: true,
511
- traceId,
512
- });
513
- logger.info(`Auto-relay: response sent back to ${msg.fromPeerId} (${durationMs}ms)`);
514
- }
515
- catch (recordErr) {
516
- logger.error(`Auto-relay: failed to record response message: ${recordErr}`);
517
- }
666
+ await this._relayCapturedReply(msg, result, traceId, durationMs, false);
518
667
  }
519
668
  else {
520
669
  this._trace(traceId, "failed", { exitCode: result.exitCode, durationMs });
@@ -526,27 +675,10 @@ export class AutoRelayService {
526
675
  this.localSessionId = freshId;
527
676
  const retry = await execRemote(getConfig().COGENT_PLATFORM, this.localSessionId, formatted, this.localCwd);
528
677
  if (retry.exitCode === 0 && retry.stdout) {
529
- // Send retry response back
530
- try {
531
- this._trace(traceId, "captured", { durationMs: Date.now() - startMs, retried: true });
532
- await backend.recordMessage({
533
- fromPeerId: this.localPeerId,
534
- toPeerId: msg.fromPeerId,
535
- message: retry.stdout,
536
- response: null,
537
- durationMs: Date.now() - startMs,
538
- success: true,
539
- error: null,
540
- // 260511-o3p: same tagging as the primary path; both call
541
- // sites are auto-relay echoes and must be filtered alike.
542
- isRelayEcho: true,
543
- traceId,
544
- });
545
- logger.info(`Auto-relay: retry response sent to ${msg.fromPeerId}`);
546
- }
547
- catch (retryRecordErr) {
548
- logger.error(`Auto-relay: failed to record retry response: ${retryRecordErr}`);
549
- }
678
+ // Retry path must apply the SAME capture-contract handling as the
679
+ // primary (Story 8.4 F-B): a downgrade on the retry is otherwise
680
+ // disguised as a clean auto-capture.
681
+ await this._relayCapturedReply(msg, retry, traceId, Date.now() - startMs, true);
550
682
  }
551
683
  else {
552
684
  logger.warn(`Auto-relay: retry also failed (exit=${retry.exitCode})`);