@essentialai/cogent-bridge 3.23.4 → 3.23.5
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 +21 -0
- package/dist/tools/join-session.d.ts.map +1 -1
- package/dist/tools/join-session.js +30 -2
- package/dist/tools/join-session.js.map +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
## 3.23.5 — 2026-09-06
|
|
2
|
+
|
|
3
|
+
### Fixed — a re-join destroyed the agent's own identity, permanently (AUD-003)
|
|
4
|
+
|
|
5
|
+
`cogent_join_session` persisted a FRESH credential object, and `saveCredentials` is a whole-file
|
|
6
|
+
replace with no merge — so **every re-join silently dropped `peerSecret` and `peerId`**.
|
|
7
|
+
|
|
8
|
+
`credential-store.ts:30-34` states the consequence: a peer is owned by the token that created it,
|
|
9
|
+
and re-joining issues a NEW token, so without the secret the agent can never re-register its own
|
|
10
|
+
peerId. The relay mints a peer secret **only when the stored peer has none**
|
|
11
|
+
(`server/src/routes/peers.ts:313-317`) — it is never reissued, so the lockout is **permanent**.
|
|
12
|
+
`register-peer.ts:325-345` already had the correct shape.
|
|
13
|
+
|
|
14
|
+
Scoped deliberately: `peerId`/`peerSecret` identify a peer on ONE channel of ONE relay, so they are
|
|
15
|
+
carried forward only when the join lands on the **same endpoint AND sessionId**. Re-attaching them
|
|
16
|
+
to another channel would claim an identity we do not own — guarded by three sibling tests that must
|
|
17
|
+
stay green under the mutation.
|
|
18
|
+
|
|
19
|
+
TDD: the PRESERVES test was written first and watched fail (1 failed / 9 passed), and only that one
|
|
20
|
+
moved. Catalogued in `scripts/audit-fix-mutations.json` and mutation-proven RED.
|
|
21
|
+
|
|
1
22
|
## 3.23.4 — 2026-09-06
|
|
2
23
|
|
|
3
24
|
### Duplicate agent work: two bridge processes in one checkout
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"join-session.d.ts","sourceRoot":"","sources":["../../src/tools/join-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"join-session.d.ts","sourceRoot":"","sources":["../../src/tools/join-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0O/D"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { getConfig } from "../config.js";
|
|
3
3
|
import { successResult, errorResult } from "../errors.js";
|
|
4
|
-
import { saveCredentials, markJoinedInProcess, markCloudAttemptInProcess } from "../cloud/credential-store.js";
|
|
4
|
+
import { saveCredentials, loadCredentials, markJoinedInProcess, markCloudAttemptInProcess } from "../cloud/credential-store.js";
|
|
5
5
|
import { logger } from "../logger.js";
|
|
6
6
|
import { getLastNudge } from "../backend/npm-update-check.js";
|
|
7
7
|
/** UUID v4 regex for distinguishing UUIDs from labels. */
|
|
@@ -122,12 +122,40 @@ export function registerJoinSessionTool(server) {
|
|
|
122
122
|
return errorResult(new Error(`Failed to join session: HTTP ${resp.status}${body ? ` - ${body}` : ""}`));
|
|
123
123
|
}
|
|
124
124
|
const data = (await resp.json());
|
|
125
|
-
// Persist credentials locally (include label for future resolution)
|
|
125
|
+
// Persist credentials locally (include label for future resolution).
|
|
126
|
+
//
|
|
127
|
+
// 🔴 AUD-003: CARRY THE PEER'S OWN IDENTITY FORWARD. This used to write a FRESH object, and
|
|
128
|
+
// saveCredentials is a whole-file replace with no merge — so every re-join silently dropped
|
|
129
|
+
// `peerSecret` and `peerId`. credential-store.ts:30-34 states the consequence: "a peer is
|
|
130
|
+
// owned by the token that created it, and re-joining a channel issues a NEW token. Without
|
|
131
|
+
// this secret an agent that re-joins can never re-register its own peerId again." The relay
|
|
132
|
+
// mints a secret ONLY when the stored peer has none (server/src/routes/peers.ts:313-317),
|
|
133
|
+
// so it is never reissued and the lockout is PERMANENT. register-peer.ts:325-345 already
|
|
134
|
+
// does this correctly with `...creds`; this is the same shape.
|
|
135
|
+
//
|
|
136
|
+
// Scoped deliberately: those two fields identify a peer on ONE channel of ONE relay, so
|
|
137
|
+
// they are carried forward ONLY when this join lands on that same endpoint AND sessionId.
|
|
138
|
+
// Re-attaching them to a different channel would claim an identity we do not own.
|
|
139
|
+
let carried = {};
|
|
140
|
+
try {
|
|
141
|
+
const prior = await loadCredentials();
|
|
142
|
+
if (prior && prior.endpoint === endpoint && prior.sessionId === data.sessionId) {
|
|
143
|
+
carried = {
|
|
144
|
+
...(prior.peerId ? { peerId: prior.peerId } : {}),
|
|
145
|
+
...(prior.peerSecret ? { peerSecret: prior.peerSecret } : {}),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
// A missing/corrupt store is normal on a first join — never block the join for it.
|
|
151
|
+
logger.debug(`join-session: could not read prior credentials: ${err.message}`);
|
|
152
|
+
}
|
|
126
153
|
await saveCredentials({
|
|
127
154
|
endpoint,
|
|
128
155
|
sessionId: data.sessionId,
|
|
129
156
|
token: data.token,
|
|
130
157
|
label: resolvedLabel ?? data.label,
|
|
158
|
+
...carried,
|
|
131
159
|
savedAt: new Date().toISOString(),
|
|
132
160
|
});
|
|
133
161
|
// Gates the persisted-credentials fallback in register-peer / startup for this process.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"join-session.js","sourceRoot":"","sources":["../../src/tools/join-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"join-session.js","sourceRoot":"","sources":["../../src/tools/join-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAChI,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,0DAA0D;AAC1D,MAAM,UAAU,GAAG,wEAAwE,CAAC;AAE5F;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,mGAAmG;YACnG,iFAAiF;YACjF,2FAA2F;QAC7F,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,CACP,gDAAgD;gBAChD,iEAAiE;gBACjE,2CAA2C,CAC5C;YACH,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,8CAA8C,CAAC;YAC3D,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,EAAE;iBACV,QAAQ,CACP,6DAA6D;gBAC7D,uDAAuD,CACxD;SACJ;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,yEAAyE;YACzE,wEAAwE;YACxE,mEAAmE;YACnE,yBAAyB,EAAE,CAAC;YAC5B,sEAAsE;YACtE,0EAA0E;YAC1E,oEAAoE;YACpE,wEAAwE;YACxE,2EAA2E;YAC3E,2DAA2D;YAC3D,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YACzB,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YACvB,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;YACnC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAE3B,8EAA8E;YAC9E,gFAAgF;YAChF,kFAAkF;YAClF,wFAAwF;YACxF,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC;YAE9E,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,WAAW,CAChB,IAAI,KAAK,CACP,KAAK;oBACH,CAAC,CAAC,6EAA6E;oBAC/E,CAAC,CAAC,2DAA2D,CAChE,CACF,CAAC;YACJ,CAAC;YAED,qEAAqE;YACrE,oEAAoE;YACpE,uCAAuC;YACvC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,OAAO,WAAW,CAChB,IAAI,KAAK,CACP,6BAA6B,OAAO,wBAAwB;oBAC5D,oEAAoE;oBACpE,oEAAoE;oBACpE,6CAA6C,CAC9C,CACF,CAAC;YACJ,CAAC;YAED,yDAAyD;YACzD,gFAAgF;YAChF,6EAA6E;YAC7E,IAAI,iBAAyB,CAAC;YAC9B,IAAI,aAAqB,CAAC;YAC1B,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,WAAW,GAAG,MAAM,KAAK,CAC7B,GAAG,QAAQ,uBAAuB,EAClC;oBACE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;iBAChD,CACF,CAAC;gBACF,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;oBACpB,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;oBACtD,OAAO,WAAW,CAAC,IAAI,KAAK,CAC1B,mCAAmC,OAAO,WAAW,WAAW,CAAC,MAAM,EAAE;wBACzE,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,gDAAgD;wBAC3E,mBAAmB,QAAQ,iBAAiB,CAC7C,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,QAAQ,GAAG,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAyC,CAAC;gBACpF,iBAAiB,GAAG,QAAQ,CAAC,SAAS,CAAC;gBACvC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,MAAM,KAAK,CAC7B,GAAG,QAAQ,yBAAyB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAClE,CAAC;gBACF,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;oBACpB,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;oBACtD,OAAO,WAAW,CAAC,IAAI,KAAK,CAAC,mCAAmC,OAAO,WAAW,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACtI,CAAC;gBACD,MAAM,QAAQ,GAAG,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAyC,CAAC;gBACpF,iBAAiB,GAAG,QAAQ,CAAC,SAAS,CAAC;gBACvC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;YACjC,CAAC;YAED,kDAAkD;YAClD,MAAM,QAAQ,GAAG,iBAAiB,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC;YAC/E,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,GAAG,QAAQ,GAAG,QAAQ,EAAE,EACxB;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;aAC7D,CACF,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC/C,OAAO,WAAW,CAChB,IAAI,KAAK,CACP,gCAAgC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACzE,CACF,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAK9B,CAAC;YAEF,qEAAqE;YACrE,EAAE;YACF,4FAA4F;YAC5F,4FAA4F;YAC5F,0FAA0F;YAC1F,2FAA2F;YAC3F,4FAA4F;YAC5F,0FAA0F;YAC1F,yFAAyF;YACzF,+DAA+D;YAC/D,EAAE;YACF,wFAAwF;YACxF,0FAA0F;YAC1F,kFAAkF;YAClF,IAAI,OAAO,GAA6C,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;gBACtC,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC/E,OAAO,GAAG;wBACR,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACjD,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC9D,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,mFAAmF;gBACnF,MAAM,CAAC,KAAK,CAAC,mDAAoD,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5F,CAAC;YAED,MAAM,eAAe,CAAC;gBACpB,QAAQ;gBACR,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,aAAa,IAAI,IAAI,CAAC,KAAK;gBAClC,GAAG,OAAO;gBACV,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC,CAAC;YAEH,wFAAwF;YACxF,mBAAmB,EAAE,CAAC;YAEtB,mDAAmD;YACnD,qEAAqE;YACrE,oEAAoE;YACpE,6CAA6C;YAC7C,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,CAAC,MAAM,MAAM,CACjC,eAAe,CAChB,CAA4B,CAAC;gBAC9B,IAAI,OAAO,aAAa,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;oBAC3D,MACE,aAAa,CAAC,kBAKf,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC3C,MAAM,CAAC,IAAI,CACT,mDAAmD,CACpD,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,0DAA0D;gBAC1D,6DAA6D;gBAC7D,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;YACvD,CAAC;YAED,mFAAmF;YACnF,oFAAoF;YACpF,8EAA8E;YAC9E,MAAM,WAAW,GAAG,YAAY,EAAE,CAAC;YACnC,OAAO,aAAa,CAAC;gBACnB,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,aAAa,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO;gBAC7C,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,IAAI,EAAE,sHAAsH;gBAC5H,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACpD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@essentialai/cogent-bridge",
|
|
3
|
-
"version": "3.23.
|
|
3
|
+
"version": "3.23.5",
|
|
4
4
|
"description": "Cogent Bridge — cross-agent comms for Claude Code, OpenAI Codex and Slack. Codex users: install with `curl -fsSL https://cogent.tools/install.sh | sh`, then start with `cogent-codex` for real-time peer wake.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"workspaces": [
|
package/server.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "io.github.eaisdevelopment/cogent",
|
|
4
4
|
"title": "Cogent Bridge from Essential AI Solutions (essentialai.uk)",
|
|
5
5
|
"description": "MCP bridge for inter-session communication between Claude Code instances",
|
|
6
|
-
"version": "3.23.
|
|
6
|
+
"version": "3.23.5",
|
|
7
7
|
"repository": {
|
|
8
8
|
"url": "https://github.com/eaisdevelopment/cogent",
|
|
9
9
|
"source": "github"
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "@essentialai/cogent-bridge",
|
|
15
|
-
"version": "3.23.
|
|
15
|
+
"version": "3.23.5",
|
|
16
16
|
"runtimeHint": "npx",
|
|
17
17
|
"transport": {
|
|
18
18
|
"type": "stdio"
|