@essentialai/cogent-bridge 1.3.4 → 1.3.6
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/dist/cloud/http-client.d.ts.map +1 -1
- package/dist/cloud/http-client.js +4 -0
- package/dist/cloud/http-client.js.map +1 -1
- package/dist/services/auto-relay.d.ts +36 -12
- package/dist/services/auto-relay.d.ts.map +1 -1
- package/dist/services/auto-relay.js +124 -0
- package/dist/services/auto-relay.js.map +1 -1
- package/dist/tools/send-message.d.ts.map +1 -1
- package/dist/tools/send-message.js +47 -9
- package/dist/tools/send-message.js.map +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/cloud/http-client.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH1B,OAAO,CAAC,KAAK,CAAS;gBAGH,OAAO,EAAE,MAAM,EAChC,KAAK,EAAE,MAAM;IAKf,OAAO,CAAC,OAAO;IAOf;;;OAGG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IActE;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/cloud/http-client.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH1B,OAAO,CAAC,KAAK,CAAS;gBAGH,OAAO,EAAE,MAAM,EAChC,KAAK,EAAE,MAAM;IAKf,OAAO,CAAC,OAAO;IAOf;;;OAGG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IActE;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAiBtD;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAInC;;;;OAIG;YACW,gBAAgB;CAyB/B"}
|
|
@@ -47,6 +47,10 @@ export class HttpClient {
|
|
|
47
47
|
if (!resp.ok) {
|
|
48
48
|
await this.throwMappedError(resp);
|
|
49
49
|
}
|
|
50
|
+
// Handle 204 No Content (e.g., heartbeat endpoint)
|
|
51
|
+
if (resp.status === 204 || resp.headers?.get("content-length") === "0") {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
50
54
|
return resp.json();
|
|
51
55
|
}
|
|
52
56
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/cloud/http-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/cloud/http-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +1,46 @@
|
|
|
1
1
|
import { MessageRecord } from "../types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Auto-relay service that processes incoming cloud messages by calling local
|
|
4
|
-
* execClaude() and sending the response back via the cloud backend.
|
|
5
|
-
*
|
|
6
|
-
* When a WebSocket message arrives for the local peer, this service:
|
|
7
|
-
* 1. Validates it's an incoming message (not our own, not already a response)
|
|
8
|
-
* 2. Injects it into the local Claude Code session via execClaude()
|
|
9
|
-
* 3. Sends the Claude response back to the original sender as a new message
|
|
10
|
-
*
|
|
11
|
-
* This enables automatic back-and-forth dialog between two cloud peers,
|
|
12
|
-
* matching the local-mode behavior where execClaude is called synchronously.
|
|
13
|
-
*/
|
|
14
2
|
export declare class AutoRelayService {
|
|
15
3
|
private localPeerId;
|
|
16
4
|
private localSessionId;
|
|
17
5
|
private localCwd;
|
|
18
6
|
private processing;
|
|
19
7
|
private queue;
|
|
8
|
+
private expectingResponseFrom;
|
|
9
|
+
private responseWaiters;
|
|
20
10
|
/**
|
|
21
11
|
* Set the local peer info. Called from register-peer tool after
|
|
22
12
|
* successful registration so we know which session to inject into.
|
|
23
13
|
*/
|
|
24
14
|
setLocalPeer(peerId: string, sessionId: string, cwd: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Mark that we expect a response from a peer (because we just sent them
|
|
17
|
+
* an explicit message via send_message). When their response arrives,
|
|
18
|
+
* inject it into the local session but do NOT relay our output back.
|
|
19
|
+
* This breaks the infinite auto-relay loop.
|
|
20
|
+
*/
|
|
21
|
+
expectResponse(fromPeerId: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Wait for a response from a peer. Returns a Promise that resolves with
|
|
24
|
+
* the response message content when the target peer responds.
|
|
25
|
+
*
|
|
26
|
+
* This is the key mechanism that makes cloud mode behave like local mode:
|
|
27
|
+
* send-message calls this before sending, then awaits the Promise.
|
|
28
|
+
* When the response arrives via WS, the Promise resolves with the actual
|
|
29
|
+
* response text, which send-message returns as the tool result.
|
|
30
|
+
*
|
|
31
|
+
* On timeout, the Promise rejects but the expectation is kept in
|
|
32
|
+
* expectingResponseFrom so late responses still get inject-only treatment
|
|
33
|
+
* (preventing infinite auto-relay loops).
|
|
34
|
+
*/
|
|
35
|
+
waitForResponse(fromPeerId: string, timeoutMs: number): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Clear the expectation for a peer and cancel any pending waiter.
|
|
38
|
+
*/
|
|
39
|
+
clearExpectation(fromPeerId: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Cancel a pending response waiter for a peer.
|
|
42
|
+
*/
|
|
43
|
+
private _cancelWaiter;
|
|
25
44
|
/**
|
|
26
45
|
* Process an incoming cloud message by invoking local execClaude()
|
|
27
46
|
* and relaying the response back to the sender.
|
|
@@ -38,6 +57,11 @@ export declare class AutoRelayService {
|
|
|
38
57
|
* Internal: process a single message -- call execClaude and relay response.
|
|
39
58
|
*/
|
|
40
59
|
private _processMessage;
|
|
60
|
+
/**
|
|
61
|
+
* Inject a message into the local session without relaying the response.
|
|
62
|
+
* Used for expected responses to our own send_message calls.
|
|
63
|
+
*/
|
|
64
|
+
private _injectOnly;
|
|
41
65
|
/**
|
|
42
66
|
* Stop the auto-relay service: clear queue and reset state.
|
|
43
67
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-relay.d.ts","sourceRoot":"","sources":["../../src/services/auto-relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-relay.d.ts","sourceRoot":"","sources":["../../src/services/auto-relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAqD5C,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,eAAe,CAGR;IAEf;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAOlE;;;;;OAKG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAKxC;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBvE;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAK1C;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;;;;;;;;;OAUG;IACG,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAsEvD;;OAEG;YACW,eAAe;IA2D7B;;;OAGG;YACW,WAAW;IAgCzB;;OAEG;IACH,IAAI,IAAI,IAAI;CAeb;AAED,0DAA0D;AAC1D,eAAO,MAAM,SAAS,kBAAyB,CAAC"}
|
|
@@ -24,12 +24,25 @@ function formatRelayMessage(fromLabel, fromPeerId, message) {
|
|
|
24
24
|
* This enables automatic back-and-forth dialog between two cloud peers,
|
|
25
25
|
* matching the local-mode behavior where execClaude is called synchronously.
|
|
26
26
|
*/
|
|
27
|
+
/**
|
|
28
|
+
* Format an incoming response for inject-only mode (no relay back).
|
|
29
|
+
* Used when the local peer explicitly sent a message and is receiving the reply.
|
|
30
|
+
*/
|
|
31
|
+
function formatInjectOnlyMessage(fromLabel, fromPeerId, message) {
|
|
32
|
+
return (`[Cogent Bridge: Response from ${fromLabel} (${fromPeerId})]\n\n` +
|
|
33
|
+
`${message}\n\n` +
|
|
34
|
+
`---\n` +
|
|
35
|
+
`This is the response to your earlier cogent_send_message. No reply will be relayed.\n` +
|
|
36
|
+
`To continue the conversation, use cogent_send_message again.`);
|
|
37
|
+
}
|
|
27
38
|
export class AutoRelayService {
|
|
28
39
|
localPeerId = null;
|
|
29
40
|
localSessionId = null;
|
|
30
41
|
localCwd = null;
|
|
31
42
|
processing = false;
|
|
32
43
|
queue = [];
|
|
44
|
+
expectingResponseFrom = new Set();
|
|
45
|
+
responseWaiters = new Map();
|
|
33
46
|
/**
|
|
34
47
|
* Set the local peer info. Called from register-peer tool after
|
|
35
48
|
* successful registration so we know which session to inject into.
|
|
@@ -40,6 +53,60 @@ export class AutoRelayService {
|
|
|
40
53
|
this.localCwd = cwd;
|
|
41
54
|
logger.info(`Auto-relay configured for peer ${peerId} (session: ${sessionId})`);
|
|
42
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Mark that we expect a response from a peer (because we just sent them
|
|
58
|
+
* an explicit message via send_message). When their response arrives,
|
|
59
|
+
* inject it into the local session but do NOT relay our output back.
|
|
60
|
+
* This breaks the infinite auto-relay loop.
|
|
61
|
+
*/
|
|
62
|
+
expectResponse(fromPeerId) {
|
|
63
|
+
this.expectingResponseFrom.add(fromPeerId);
|
|
64
|
+
logger.debug(`Auto-relay: expecting response from ${fromPeerId} (will inject-only)`);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Wait for a response from a peer. Returns a Promise that resolves with
|
|
68
|
+
* the response message content when the target peer responds.
|
|
69
|
+
*
|
|
70
|
+
* This is the key mechanism that makes cloud mode behave like local mode:
|
|
71
|
+
* send-message calls this before sending, then awaits the Promise.
|
|
72
|
+
* When the response arrives via WS, the Promise resolves with the actual
|
|
73
|
+
* response text, which send-message returns as the tool result.
|
|
74
|
+
*
|
|
75
|
+
* On timeout, the Promise rejects but the expectation is kept in
|
|
76
|
+
* expectingResponseFrom so late responses still get inject-only treatment
|
|
77
|
+
* (preventing infinite auto-relay loops).
|
|
78
|
+
*/
|
|
79
|
+
waitForResponse(fromPeerId, timeoutMs) {
|
|
80
|
+
return new Promise((resolve, reject) => {
|
|
81
|
+
// Clean up any existing waiter for this peer
|
|
82
|
+
this._cancelWaiter(fromPeerId);
|
|
83
|
+
const timer = setTimeout(() => {
|
|
84
|
+
this.responseWaiters.delete(fromPeerId);
|
|
85
|
+
// Keep expectingResponseFrom so late responses get inject-only treatment
|
|
86
|
+
reject(new Error(`Response timeout from ${fromPeerId} after ${timeoutMs}ms`));
|
|
87
|
+
}, timeoutMs);
|
|
88
|
+
this.responseWaiters.set(fromPeerId, { resolve, timer });
|
|
89
|
+
this.expectingResponseFrom.add(fromPeerId);
|
|
90
|
+
logger.debug(`Auto-relay: waiting for response from ${fromPeerId} (timeout: ${timeoutMs}ms)`);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Clear the expectation for a peer and cancel any pending waiter.
|
|
95
|
+
*/
|
|
96
|
+
clearExpectation(fromPeerId) {
|
|
97
|
+
this.expectingResponseFrom.delete(fromPeerId);
|
|
98
|
+
this._cancelWaiter(fromPeerId);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Cancel a pending response waiter for a peer.
|
|
102
|
+
*/
|
|
103
|
+
_cancelWaiter(fromPeerId) {
|
|
104
|
+
const existing = this.responseWaiters.get(fromPeerId);
|
|
105
|
+
if (existing) {
|
|
106
|
+
clearTimeout(existing.timer);
|
|
107
|
+
this.responseWaiters.delete(fromPeerId);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
43
110
|
/**
|
|
44
111
|
* Process an incoming cloud message by invoking local execClaude()
|
|
45
112
|
* and relaying the response back to the sender.
|
|
@@ -69,6 +136,25 @@ export class AutoRelayService {
|
|
|
69
136
|
if (msg.response !== null) {
|
|
70
137
|
return;
|
|
71
138
|
}
|
|
139
|
+
// Guard: we sent this peer an explicit message and are expecting their response.
|
|
140
|
+
// If there's an active waiter (send-message is blocking), resolve it with
|
|
141
|
+
// the response content. Otherwise fall back to inject-only mode.
|
|
142
|
+
if (this.expectingResponseFrom.has(msg.fromPeerId)) {
|
|
143
|
+
this.expectingResponseFrom.delete(msg.fromPeerId);
|
|
144
|
+
// Check if send-message is actively waiting for this response
|
|
145
|
+
const waiter = this.responseWaiters.get(msg.fromPeerId);
|
|
146
|
+
if (waiter) {
|
|
147
|
+
clearTimeout(waiter.timer);
|
|
148
|
+
this.responseWaiters.delete(msg.fromPeerId);
|
|
149
|
+
waiter.resolve(msg.message);
|
|
150
|
+
logger.info(`Auto-relay: response from ${msg.fromPeerId} delivered to waiting send-message`);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// No active waiter (timed out or used expectResponse directly)
|
|
154
|
+
logger.info(`Auto-relay: inject-only response from ${msg.fromPeerId} (no active waiter)`);
|
|
155
|
+
await this._injectOnly(msg);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
72
158
|
// Serialize processing: queue if already busy
|
|
73
159
|
if (this.processing) {
|
|
74
160
|
logger.debug(`Auto-relay: queuing message from ${msg.fromPeerId} (busy processing)`);
|
|
@@ -147,15 +233,53 @@ export class AutoRelayService {
|
|
|
147
233
|
logger.error(`Auto-relay: execClaude threw after ${durationMs}ms: ${err}`);
|
|
148
234
|
}
|
|
149
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Inject a message into the local session without relaying the response.
|
|
238
|
+
* Used for expected responses to our own send_message calls.
|
|
239
|
+
*/
|
|
240
|
+
async _injectOnly(msg) {
|
|
241
|
+
if (!this.localSessionId || !this.localCwd)
|
|
242
|
+
return;
|
|
243
|
+
let fromLabel = msg.fromPeerId;
|
|
244
|
+
try {
|
|
245
|
+
const backend = getBackend();
|
|
246
|
+
const senderPeer = await backend.getPeer(msg.fromPeerId);
|
|
247
|
+
if (senderPeer) {
|
|
248
|
+
fromLabel = senderPeer.label;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
// Fall back to peerId as label
|
|
253
|
+
}
|
|
254
|
+
const formatted = formatInjectOnlyMessage(fromLabel, msg.fromPeerId, msg.message);
|
|
255
|
+
try {
|
|
256
|
+
const result = await execClaude(this.localSessionId, formatted, this.localCwd);
|
|
257
|
+
if (result.exitCode === 0) {
|
|
258
|
+
logger.info(`Auto-relay: inject-only complete from ${msg.fromPeerId} (response discarded)`);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
logger.warn(`Auto-relay: inject-only execClaude failed (exit=${result.exitCode})`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
logger.error(`Auto-relay: inject-only execClaude threw: ${err}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
150
268
|
/**
|
|
151
269
|
* Stop the auto-relay service: clear queue and reset state.
|
|
152
270
|
*/
|
|
153
271
|
stop() {
|
|
272
|
+
// Cancel all pending response waiters
|
|
273
|
+
for (const [, waiter] of this.responseWaiters) {
|
|
274
|
+
clearTimeout(waiter.timer);
|
|
275
|
+
}
|
|
276
|
+
this.responseWaiters.clear();
|
|
154
277
|
this.queue = [];
|
|
155
278
|
this.localPeerId = null;
|
|
156
279
|
this.localSessionId = null;
|
|
157
280
|
this.localCwd = null;
|
|
158
281
|
this.processing = false;
|
|
282
|
+
this.expectingResponseFrom.clear();
|
|
159
283
|
logger.debug("Auto-relay stopped");
|
|
160
284
|
}
|
|
161
285
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-relay.js","sourceRoot":"","sources":["../../src/services/auto-relay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;;GAGG;AACH,SAAS,kBAAkB,CACzB,SAAiB,EACjB,UAAkB,EAClB,OAAe;IAEf,OAAO,CACL,+BAA+B,SAAS,KAAK,UAAU,QAAQ;QAC/D,GAAG,OAAO,MAAM;QAChB,OAAO;QACP,uFAAuF,SAAS,IAAI;QACpG,4EAA4E,CAC7E,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,gBAAgB;IACnB,WAAW,GAAkB,IAAI,CAAC;IAClC,cAAc,GAAkB,IAAI,CAAC;IACrC,QAAQ,GAAkB,IAAI,CAAC;IAC/B,UAAU,GAAY,KAAK,CAAC;IAC5B,KAAK,GAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-relay.js","sourceRoot":"","sources":["../../src/services/auto-relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-message.d.ts","sourceRoot":"","sources":["../../src/tools/send-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"send-message.d.ts","sourceRoot":"","sources":["../../src/tools/send-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoBpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyL/D"}
|
|
@@ -3,6 +3,7 @@ import { getBackend, isCloudEndpoint } from "../backend/index.js";
|
|
|
3
3
|
import { BridgeError, BridgeErrorCode, successResult, errorResult } from "../errors.js";
|
|
4
4
|
import { getConfig } from "../config.js";
|
|
5
5
|
import { logger } from "../logger.js";
|
|
6
|
+
import { autoRelay } from "../services/auto-relay.js";
|
|
6
7
|
const RETRY_TIMEOUT_MS = 30_000;
|
|
7
8
|
function formatBridgeMessage(fromLabel, fromPeerId, message) {
|
|
8
9
|
return (`[Cogent Bridge message from ${fromLabel} (${fromPeerId})]\n\n` +
|
|
@@ -80,25 +81,62 @@ export function registerSendMessageTool(server) {
|
|
|
80
81
|
logger.error("Failed to update lastSeenAt for target", { error: e });
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
|
-
//
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
84
|
+
// Cloud mode: wait for the actual response from the target peer.
|
|
85
|
+
// This makes cloud mode behave like local mode -- the tool blocks
|
|
86
|
+
// until the response arrives (or times out), then returns it.
|
|
87
|
+
if (isCloud && success) {
|
|
88
|
+
// Set up response waiter BEFORE sending to avoid race condition
|
|
89
|
+
const responsePromise = autoRelay.waitForResponse(toPeerId, config.COGENT_TIMEOUT_MS);
|
|
90
|
+
// Send message via cloud relay
|
|
91
|
+
try {
|
|
92
|
+
await backend.recordMessage({
|
|
93
|
+
fromPeerId,
|
|
94
|
+
toPeerId,
|
|
95
|
+
message,
|
|
96
|
+
response: null,
|
|
97
|
+
durationMs,
|
|
98
|
+
success: true,
|
|
99
|
+
error: null,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (recordErr) {
|
|
103
|
+
autoRelay.clearExpectation(toPeerId);
|
|
104
|
+
throw recordErr;
|
|
105
|
+
}
|
|
106
|
+
// Wait for the response from the target peer's auto-relay
|
|
107
|
+
try {
|
|
108
|
+
const cloudResponse = await responsePromise;
|
|
109
|
+
return successResult({
|
|
110
|
+
success: true,
|
|
111
|
+
response: cloudResponse,
|
|
112
|
+
error: null,
|
|
113
|
+
durationMs: Date.now() - startMs,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return successResult({
|
|
118
|
+
success: true,
|
|
119
|
+
response: `Message delivered to ${to.label} (${toPeerId}) via cloud relay ` +
|
|
120
|
+
`but response timed out after ${Math.round(config.COGENT_TIMEOUT_MS / 1000)}s. ` +
|
|
121
|
+
`Check cogent_get_history for their reply.`,
|
|
122
|
+
error: null,
|
|
123
|
+
durationMs: Date.now() - startMs,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Local mode: record with synchronous response from execClaude
|
|
90
128
|
await backend.recordMessage({
|
|
91
129
|
fromPeerId,
|
|
92
130
|
toPeerId,
|
|
93
131
|
message,
|
|
94
|
-
response:
|
|
132
|
+
response: success ? result.stdout : null,
|
|
95
133
|
durationMs,
|
|
96
134
|
success,
|
|
97
135
|
error: success ? null : result.stderr,
|
|
98
136
|
});
|
|
99
137
|
return successResult({
|
|
100
138
|
success,
|
|
101
|
-
response:
|
|
139
|
+
response: success ? result.stdout : null,
|
|
102
140
|
error: success ? null : result.stderr,
|
|
103
141
|
durationMs,
|
|
104
142
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../src/tools/send-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../src/tools/send-message.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
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": "1.3.
|
|
6
|
+
"version": "1.3.5",
|
|
7
7
|
"repository": {
|
|
8
8
|
"url": "https://github.com/eaisdevelopment/cogent",
|
|
9
9
|
"source": "github"
|
|
@@ -57,4 +57,4 @@
|
|
|
57
57
|
]
|
|
58
58
|
}
|
|
59
59
|
]
|
|
60
|
-
}
|
|
60
|
+
}
|