@essentialai/cogent-bridge 3.5.11 → 3.7.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 +36 -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 +2 -2
- package/dist/backend/http-backend.d.ts.map +1 -1
- package/dist/backend/http-backend.js +18 -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 +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -1
- package/dist/services/auto-relay.d.ts +11 -0
- package/dist/services/auto-relay.d.ts.map +1 -1
- package/dist/services/auto-relay.js +106 -46
- 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 +16 -0
- package/dist/services/codex-cli.d.ts.map +1 -1
- package/dist/services/codex-cli.js +53 -5
- package/dist/services/codex-cli.js.map +1 -1
- package/dist/services/codex-preflight.d.ts +38 -0
- package/dist/services/codex-preflight.d.ts.map +1 -1
- package/dist/services/codex-preflight.js +90 -0
- package/dist/services/codex-preflight.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/health-check.d.ts +4 -0
- package/dist/services/health-check.d.ts.map +1 -1
- package/dist/services/health-check.js +23 -3
- package/dist/services/health-check.js.map +1 -1
- 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 +23 -2
- 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 +37 -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,41 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.7.0 — 2026-07-10
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **Codex sandbox-failure awareness & handling.** On hosts where the Codex OS sandbox can't
|
|
7
|
+
initialize (unprivileged Linux user namespaces blocked — Ubuntu 24.04's
|
|
8
|
+
`kernel.apparmor_restrict_unprivileged_userns=1`, containers, hardened kernels), every
|
|
9
|
+
`codex exec resume` used to fail its file/test commands (`bwrap: setting up uid map: Permission
|
|
10
|
+
denied`) and the agent could only report "not finished" — silently, every task. Cogent now:
|
|
11
|
+
- **Probes the sandbox at startup** (`preflightCodexSandbox`, gated to `COGENT_PLATFORM=codex`,
|
|
12
|
+
non-`bypass`, Linux) via `unshare -Ur` with a sysctl fallback, and logs a **loud, actionable
|
|
13
|
+
warning** when the sandbox is blocked.
|
|
14
|
+
- **`COGENT_CODEX_SANDBOX_FALLBACK`** (opt-in; default OFF) — when set, a blocked sandbox is
|
|
15
|
+
auto-worked-around by running codex with `--dangerously-bypass-approvals-and-sandbox` so tasks
|
|
16
|
+
complete. OFF by default because bypass grants full filesystem/network access.
|
|
17
|
+
- **Surfaces hard failures to Slack** — a `SANDBOX_BLOCKED` exec failure now records an
|
|
18
|
+
actionable message to the sender (with the remedy) instead of being dropped silently.
|
|
19
|
+
- **`cogent_health_check`** reports a new `codexSandbox` diagnostic.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- Auto-relay no longer silently drops a Codex exec failure caused by a blocked OS sandbox — it
|
|
23
|
+
reports it, and skips the futile session-rotation retry (userns is host-wide).
|
|
24
|
+
|
|
25
|
+
## 3.6.0 — 2026-07-07
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
- **Wake Trace Slice 3 — structured reply capture (Story 8.4).** Claude replies captured from
|
|
29
|
+
`--output-format json` `.result` (Codex from the `-o` file); a lower-trust fallback is surfaced as a
|
|
30
|
+
visible `[cogent:needs-manual]` downgrade — never a raw-stdout guess.
|
|
31
|
+
- **Slice 4 — structured A2A anti-noise defaults (Story 8.5).** Agent-origin broadcasts are manual by
|
|
32
|
+
default (no auto multi-agent debate; human-origin slack/gchat/web broadcasts still auto-relay); peers
|
|
33
|
+
advertise a role (implementer/reviewer/auditor/coordinator). Opt-in `COGENT_BROADCAST_AUTORELAY`.
|
|
34
|
+
- **Slice 5 — durable identity on the wire (Story 8.6).** Register advertises `workspaceId`
|
|
35
|
+
(sha256 of cwd) + `threadId`; the relay stores them (coordinated `.strict()` extension, relay-first).
|
|
36
|
+
cwd becomes a hint, not the key. Preserved across auto-reconnect.
|
|
37
|
+
|
|
38
|
+
|
|
3
39
|
## 3.5.11 — 2026-07-06
|
|
4
40
|
|
|
5
41
|
### Added
|
|
@@ -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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { StorageBackend } from "./storage-backend.js";
|
|
2
2
|
import type { PeerInfo, MessageRecord, CliExecResult } from "../types.js";
|
|
3
|
-
import type
|
|
3
|
+
import { type HealthCheckResult } from "../services/health-check.js";
|
|
4
4
|
import type { HttpClient } from "../cloud/http-client.js";
|
|
5
5
|
/**
|
|
6
6
|
* Cloud-mode storage backend.
|
|
@@ -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,
|
|
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,EAAE,KAAK,iBAAiB,EAAqB,MAAM,6BAA6B,CAAC;AACxF,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;IA4C/C;;;;;;;;;OASG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGhD"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { checkCodexSandbox } from "../services/health-check.js";
|
|
1
2
|
import { SERVER_VERSION } from "../constants.js";
|
|
2
3
|
import { getConfig } from "../config.js";
|
|
3
4
|
import { getRelayVersion } from "./relay-version-cache.js";
|
|
@@ -43,7 +44,11 @@ export class HttpBackend {
|
|
|
43
44
|
async registerPeer(peerId, _sessionId, cwd, label, clientVersion, mode,
|
|
44
45
|
// 3.5.9 durable-identity rails are LOCAL-ONLY: intentionally NOT added to the
|
|
45
46
|
// wire body (the relay register schema is .strict() and would reject them).
|
|
46
|
-
_channelSessionId, _capabilities
|
|
47
|
+
_channelSessionId, _capabilities,
|
|
48
|
+
// Slice 5 / Story 8.6: durable identity that DOES go on the wire (unlike the
|
|
49
|
+
// local-only rails above) — the relay's .strict() schema was extended in
|
|
50
|
+
// lockstep (relay-first deploy) to accept these optional fields.
|
|
51
|
+
workspaceId, threadId) {
|
|
47
52
|
const path = PATHS.peers.replace(":sessionId", this.sessionId);
|
|
48
53
|
// Build body conditionally: omit clientVersion entirely for older clients
|
|
49
54
|
// / undefined inputs so the wire payload stays clean (no JSON null) and
|
|
@@ -67,6 +72,15 @@ export class HttpBackend {
|
|
|
67
72
|
if (mode !== undefined) {
|
|
68
73
|
body.mode = mode;
|
|
69
74
|
}
|
|
75
|
+
// Slice 5 / Story 8.6: advertise durable identity on the wire (conditional-set,
|
|
76
|
+
// like the fields above). A relay too old to know these fields would reject
|
|
77
|
+
// via .strict() — so the relay ships the optional fields FIRST, then the client.
|
|
78
|
+
if (workspaceId !== undefined) {
|
|
79
|
+
body.workspaceId = workspaceId;
|
|
80
|
+
}
|
|
81
|
+
if (threadId !== undefined) {
|
|
82
|
+
body.threadId = threadId;
|
|
83
|
+
}
|
|
70
84
|
return this.http.post(path, body);
|
|
71
85
|
}
|
|
72
86
|
/**
|
|
@@ -253,6 +267,9 @@ export class HttpBackend {
|
|
|
253
267
|
ok: true,
|
|
254
268
|
message: "Cloud mode -- no CLI needed",
|
|
255
269
|
},
|
|
270
|
+
// The codex CLI DOES run locally even in cloud mode (auto-relay resumes
|
|
271
|
+
// it to generate the reply), so the sandbox is a real local concern here.
|
|
272
|
+
codexSandbox: await checkCodexSandbox(),
|
|
256
273
|
},
|
|
257
274
|
timestamp: new Date().toISOString(),
|
|
258
275
|
mode: "cloud",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-backend.js","sourceRoot":"","sources":["../../src/backend/http-backend.ts"],"names":[],"mappings":"
|
|
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
|
@@ -17,7 +17,9 @@ export declare const configSchema: z.ZodObject<{
|
|
|
17
17
|
COGENT_PLATFORM: z.ZodDefault<z.ZodEnum<["cc", "codex", "slack", "gchat", "web"]>>;
|
|
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
|
+
COGENT_CODEX_SANDBOX_FALLBACK: z.ZodEffects<z.ZodOptional<z.ZodString>, boolean, string | undefined>;
|
|
20
21
|
COGENT_RESOLVER_AMBIGUOUS_MARGIN_MS: z.ZodDefault<z.ZodNumber>;
|
|
22
|
+
COGENT_BROADCAST_AUTORELAY: z.ZodEffects<z.ZodOptional<z.ZodString>, boolean, string | undefined>;
|
|
21
23
|
}, "strip", z.ZodTypeAny, {
|
|
22
24
|
COGENT_STATE_PATH: string;
|
|
23
25
|
COGENT_TEAM_ENDPOINT: string;
|
|
@@ -33,7 +35,9 @@ export declare const configSchema: z.ZodObject<{
|
|
|
33
35
|
COGENT_PLATFORM: "cc" | "codex" | "slack" | "gchat" | "web";
|
|
34
36
|
COGENT_CODEX_PATH: string;
|
|
35
37
|
COGENT_CODEX_SANDBOX: "full-auto" | "read-only" | "workspace-write" | "danger-full-access" | "bypass";
|
|
38
|
+
COGENT_CODEX_SANDBOX_FALLBACK: boolean;
|
|
36
39
|
COGENT_RESOLVER_AMBIGUOUS_MARGIN_MS: number;
|
|
40
|
+
COGENT_BROADCAST_AUTORELAY: boolean;
|
|
37
41
|
COGENT_ENDPOINT?: string | undefined;
|
|
38
42
|
COGENT_SESSION_ID?: string | undefined;
|
|
39
43
|
COGENT_SECRET?: string | undefined;
|
|
@@ -55,7 +59,9 @@ export declare const configSchema: z.ZodObject<{
|
|
|
55
59
|
COGENT_PLATFORM?: "cc" | "codex" | "slack" | "gchat" | "web" | undefined;
|
|
56
60
|
COGENT_CODEX_PATH?: string | undefined;
|
|
57
61
|
COGENT_CODEX_SANDBOX?: "full-auto" | "read-only" | "workspace-write" | "danger-full-access" | "bypass" | undefined;
|
|
62
|
+
COGENT_CODEX_SANDBOX_FALLBACK?: string | undefined;
|
|
58
63
|
COGENT_RESOLVER_AMBIGUOUS_MARGIN_MS?: number | undefined;
|
|
64
|
+
COGENT_BROADCAST_AUTORELAY?: string | undefined;
|
|
59
65
|
}>;
|
|
60
66
|
export type Config = z.infer<typeof configSchema>;
|
|
61
67
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgEvB,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
|
@@ -35,6 +35,19 @@ export const configSchema = z.object({
|
|
|
35
35
|
COGENT_CODEX_SANDBOX: z
|
|
36
36
|
.enum(["full-auto", "read-only", "workspace-write", "danger-full-access", "bypass"])
|
|
37
37
|
.default("full-auto"),
|
|
38
|
+
// Auto-fallback for a blocked Codex sandbox. On a host where the OS sandbox
|
|
39
|
+
// can't initialize (unprivileged user namespaces blocked — Ubuntu 24.04's
|
|
40
|
+
// apparmor_restrict_unprivileged_userns, containers, hardened kernels),
|
|
41
|
+
// `codex exec resume` fails every file/test command and the agent can only
|
|
42
|
+
// report "not finished". When this is set ("true"/"1"), the startup sandbox
|
|
43
|
+
// probe (codex-preflight) auto-switches the effective sandbox to `bypass` so
|
|
44
|
+
// tasks complete. Default (unset) = OFF: Cogent WARNS loudly + surfaces an
|
|
45
|
+
// actionable message to the sender, but does NOT silently disable the sandbox
|
|
46
|
+
// (bypass grants full filesystem/network access — opt in per trusted box).
|
|
47
|
+
COGENT_CODEX_SANDBOX_FALLBACK: z
|
|
48
|
+
.string()
|
|
49
|
+
.optional()
|
|
50
|
+
.transform((v) => v === "true" || v === "1"),
|
|
38
51
|
// Wake-trace resolver: when >1 candidate session share a cwd and none is the
|
|
39
52
|
// pinned session, the newest must lead the runner-up by at least this many ms
|
|
40
53
|
// to be trusted; otherwise the wake is refused (never guess silently). 60s bias
|
|
@@ -44,6 +57,15 @@ export const configSchema = z.object({
|
|
|
44
57
|
.int()
|
|
45
58
|
.min(0)
|
|
46
59
|
.default(60_000),
|
|
60
|
+
// Slice 4 (Story 8.5): anti-noise A2A default. A BROADCAST (toPeerId "*") must
|
|
61
|
+
// NOT trigger an automatic subprocess wake, so addressing the whole channel
|
|
62
|
+
// never starts an automatic multi-agent debate ("no auto debate unless the
|
|
63
|
+
// human asks"). Directed messages still auto-relay. Opt a peer INTO broadcast
|
|
64
|
+
// auto-relay by setting this to "true"/"1". Default (unset) = manual broadcast.
|
|
65
|
+
COGENT_BROADCAST_AUTORELAY: z
|
|
66
|
+
.string()
|
|
67
|
+
.optional()
|
|
68
|
+
.transform((v) => v === "true" || v === "1"),
|
|
47
69
|
});
|
|
48
70
|
let _config = null;
|
|
49
71
|
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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"}
|
|
@@ -198,6 +198,17 @@ export declare class AutoRelayService {
|
|
|
198
198
|
* Best-effort: a failure here must never break the busy-queue path.
|
|
199
199
|
*/
|
|
200
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;
|
|
201
212
|
/**
|
|
202
213
|
* Internal: process a single message -- calls the local agent CLI via execRemote and relay response.
|
|
203
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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"}
|
|
@@ -40,6 +40,10 @@ export function buildStatusNotice(status, peerId, traceId) {
|
|
|
40
40
|
return (`[cogent:queued] ⏳ "${peerId}" is busy with another request — your message is ` +
|
|
41
41
|
`queued and will be answered when it is free.${tail}`);
|
|
42
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
|
+
}
|
|
43
47
|
return `[cogent:${status}] "${peerId}"${tail}`;
|
|
44
48
|
}
|
|
45
49
|
/**
|
|
@@ -456,6 +460,30 @@ export class AutoRelayService {
|
|
|
456
460
|
logger.info(`Auto-relay: observer mode — skipping subprocess for message ${msg.id} from ${msg.fromPeerId}`);
|
|
457
461
|
return;
|
|
458
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
|
+
}
|
|
459
487
|
// Serialize processing: queue if already busy
|
|
460
488
|
if (this.processing) {
|
|
461
489
|
logger.debug(`Auto-relay: queuing message from ${msg.fromPeerId} (busy processing)`);
|
|
@@ -515,6 +543,55 @@ export class AutoRelayService {
|
|
|
515
543
|
logger.error(`Auto-relay: failed to emit '${status}' status notice: ${err}`);
|
|
516
544
|
}
|
|
517
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
|
+
}
|
|
518
595
|
/**
|
|
519
596
|
* Internal: process a single message -- calls the local agent CLI via execRemote and relay response.
|
|
520
597
|
*/
|
|
@@ -586,34 +663,34 @@ export class AutoRelayService {
|
|
|
586
663
|
const result = await execRemote(getConfig().COGENT_PLATFORM, this.localSessionId, formatted, this.localCwd);
|
|
587
664
|
const durationMs = Date.now() - startMs;
|
|
588
665
|
if (result.exitCode === 0 && result.stdout) {
|
|
589
|
-
this.
|
|
590
|
-
// Send the response back to the original sender as a new cloud message.
|
|
591
|
-
// This will trigger the server to push it via WebSocket to the sender,
|
|
592
|
-
// which will trigger their auto-relay in turn.
|
|
593
|
-
try {
|
|
594
|
-
await backend.recordMessage({
|
|
595
|
-
fromPeerId: this.localPeerId,
|
|
596
|
-
toPeerId: msg.fromPeerId,
|
|
597
|
-
message: result.stdout,
|
|
598
|
-
response: null,
|
|
599
|
-
durationMs,
|
|
600
|
-
success: true,
|
|
601
|
-
error: null,
|
|
602
|
-
// 260511-o3p: tag the auto-relay echo so server 3.1.6+ filters
|
|
603
|
-
// it from cogent_get_history by default. Older servers ignore
|
|
604
|
-
// the field; older clients see it via the optional field.
|
|
605
|
-
isRelayEcho: true,
|
|
606
|
-
traceId,
|
|
607
|
-
});
|
|
608
|
-
logger.info(`Auto-relay: response sent back to ${msg.fromPeerId} (${durationMs}ms)`);
|
|
609
|
-
}
|
|
610
|
-
catch (recordErr) {
|
|
611
|
-
logger.error(`Auto-relay: failed to record response message: ${recordErr}`);
|
|
612
|
-
}
|
|
666
|
+
await this._relayCapturedReply(msg, result, traceId, durationMs, false);
|
|
613
667
|
}
|
|
614
668
|
else {
|
|
615
|
-
this._trace(traceId, "failed", { exitCode: result.exitCode, durationMs });
|
|
669
|
+
this._trace(traceId, "failed", { exitCode: result.exitCode, sandboxBlocked: result.sandboxBlocked, durationMs });
|
|
616
670
|
logger.warn(`Auto-relay: execRemote failed (exit=${result.exitCode}): ${result.stderr}`);
|
|
671
|
+
// Blocked OS sandbox (unprivileged userns) is HOST-WIDE — a rotated-session
|
|
672
|
+
// retry can't fix it, and the failure was previously dropped silently (the
|
|
673
|
+
// sender just saw the task never finish). Surface an actionable message and
|
|
674
|
+
// stop. Text rides in `message` (the only field that crosses the wire).
|
|
675
|
+
if (result.sandboxBlocked) {
|
|
676
|
+
try {
|
|
677
|
+
await backend.recordMessage({
|
|
678
|
+
fromPeerId: this.localPeerId,
|
|
679
|
+
toPeerId: msg.fromPeerId,
|
|
680
|
+
message: `⚠️ Cogent could not run "${this.localPeerId}": the Codex sandbox failed to initialize on the agent host (unprivileged user namespaces blocked), so it can't edit files or run tests. Remedy on the agent host: set COGENT_CODEX_SANDBOX_FALLBACK=1 (auto-bypass) or COGENT_CODEX_SANDBOX=bypass, or enable unprivileged userns (sysctl kernel.apparmor_restrict_unprivileged_userns=0). (trace ${traceId})`,
|
|
681
|
+
response: null,
|
|
682
|
+
durationMs,
|
|
683
|
+
success: false,
|
|
684
|
+
error: "SANDBOX_BLOCKED",
|
|
685
|
+
isRelayEcho: true,
|
|
686
|
+
traceId,
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
catch (recordErr) {
|
|
690
|
+
logger.error(`Auto-relay: failed to record sandbox-blocked message: ${recordErr}`);
|
|
691
|
+
}
|
|
692
|
+
return;
|
|
693
|
+
}
|
|
617
694
|
// Session may have rotated -- retry once with fresh detection
|
|
618
695
|
const freshId = await detectCurrentSessionFor(getConfig().COGENT_PLATFORM, this.localCwd);
|
|
619
696
|
if (freshId && freshId !== this.localSessionId) {
|
|
@@ -621,27 +698,10 @@ export class AutoRelayService {
|
|
|
621
698
|
this.localSessionId = freshId;
|
|
622
699
|
const retry = await execRemote(getConfig().COGENT_PLATFORM, this.localSessionId, formatted, this.localCwd);
|
|
623
700
|
if (retry.exitCode === 0 && retry.stdout) {
|
|
624
|
-
//
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
fromPeerId: this.localPeerId,
|
|
629
|
-
toPeerId: msg.fromPeerId,
|
|
630
|
-
message: retry.stdout,
|
|
631
|
-
response: null,
|
|
632
|
-
durationMs: Date.now() - startMs,
|
|
633
|
-
success: true,
|
|
634
|
-
error: null,
|
|
635
|
-
// 260511-o3p: same tagging as the primary path; both call
|
|
636
|
-
// sites are auto-relay echoes and must be filtered alike.
|
|
637
|
-
isRelayEcho: true,
|
|
638
|
-
traceId,
|
|
639
|
-
});
|
|
640
|
-
logger.info(`Auto-relay: retry response sent to ${msg.fromPeerId}`);
|
|
641
|
-
}
|
|
642
|
-
catch (retryRecordErr) {
|
|
643
|
-
logger.error(`Auto-relay: failed to record retry response: ${retryRecordErr}`);
|
|
644
|
-
}
|
|
701
|
+
// Retry path must apply the SAME capture-contract handling as the
|
|
702
|
+
// primary (Story 8.4 F-B): a downgrade on the retry is otherwise
|
|
703
|
+
// disguised as a clean auto-capture.
|
|
704
|
+
await this._relayCapturedReply(msg, retry, traceId, Date.now() - startMs, true);
|
|
645
705
|
}
|
|
646
706
|
else {
|
|
647
707
|
logger.warn(`Auto-relay: retry also failed (exit=${retry.exitCode})`);
|