@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.
- package/CHANGELOG.md +28 -0
- package/dist/backend/file-backend.d.ts +1 -1
- package/dist/backend/file-backend.d.ts.map +1 -1
- package/dist/backend/file-backend.js +2 -2
- package/dist/backend/file-backend.js.map +1 -1
- package/dist/backend/http-backend.d.ts +1 -1
- package/dist/backend/http-backend.d.ts.map +1 -1
- package/dist/backend/http-backend.js +14 -1
- package/dist/backend/http-backend.js.map +1 -1
- package/dist/backend/storage-backend.d.ts +5 -1
- package/dist/backend/storage-backend.d.ts.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/services/auto-relay.d.ts +50 -0
- package/dist/services/auto-relay.d.ts.map +1 -1
- package/dist/services/auto-relay.js +177 -45
- package/dist/services/auto-relay.js.map +1 -1
- package/dist/services/cc-cli.d.ts +11 -0
- package/dist/services/cc-cli.d.ts.map +1 -1
- package/dist/services/cc-cli.js +69 -0
- package/dist/services/cc-cli.js.map +1 -1
- package/dist/services/claude-preflight.d.ts.map +1 -1
- package/dist/services/claude-preflight.js +1 -0
- package/dist/services/claude-preflight.js.map +1 -1
- package/dist/services/codex-cli.d.ts.map +1 -1
- package/dist/services/codex-cli.js +18 -4
- package/dist/services/codex-cli.js.map +1 -1
- package/dist/services/durable-identity.d.ts +11 -0
- package/dist/services/durable-identity.d.ts.map +1 -0
- package/dist/services/durable-identity.js +14 -0
- package/dist/services/durable-identity.js.map +1 -0
- package/dist/services/peer-registry.d.ts +1 -1
- package/dist/services/peer-registry.d.ts.map +1 -1
- package/dist/services/peer-registry.js +8 -1
- package/dist/services/peer-registry.js.map +1 -1
- package/dist/startup.d.ts.map +1 -1
- package/dist/startup.js +8 -1
- package/dist/startup.js.map +1 -1
- package/dist/tools/register-peer.d.ts.map +1 -1
- package/dist/tools/register-peer.js +29 -3
- package/dist/tools/register-peer.js.map +1 -1
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- 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,
|
|
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;
|
|
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,
|
|
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":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;;GAGG;AACH,MAAM,KAAK,GAAG;IACZ,KAAK,EAAE,gCAAgC;IACvC,IAAI,EAAE,wCAAwC;IAC9C,QAAQ,EAAE,mCAAmC;IAC7C,OAAO,EAAE,8CAA8C;IACvD,SAAS,EAAE,oCAAoC;IAC/C,MAAM,EAAE,aAAa;CACb,CAAC;AAEX;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,WAAW;IAEH;IACA;IAFnB,YACmB,IAAgB,EAChB,SAAiB;QADjB,SAAI,GAAJ,IAAI,CAAY;QAChB,cAAS,GAAT,SAAS,CAAQ;IACjC,CAAC;IAEJ;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,CAChB,MAAc,EACd,UAAkB,EAClB,GAAW,EACX,KAAa,EACb,aAAsB,EACtB,IAA2B;IAC3B,8EAA8E;IAC9E,4EAA4E;IAC5E,iBAA0B,EAC1B,aAAwB;
|
|
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[]
|
|
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,
|
|
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;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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
|
|
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) {
|
package/dist/config.js.map
CHANGED
|
@@ -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":"AACA,OAAO,EAAE,aAAa,
|
|
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.
|
|
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
|
-
//
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
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})`);
|