@chrysb/alphaclaw 0.9.0-beta.5 → 0.9.0-beta.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/lib/server/routes/mcp.js +27 -42
- package/package.json +1 -1
package/lib/server/routes/mcp.js
CHANGED
|
@@ -26,35 +26,28 @@ const resolveGatewayWsUrl = ({ openclawDir, gatewayPort }) => {
|
|
|
26
26
|
return `${scheme}://127.0.0.1:${gatewayPort}`;
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
let activeSessionId = null;
|
|
30
30
|
let activeTransport = null;
|
|
31
|
-
const kSessionGraceMs = 15_000;
|
|
32
31
|
const kSseKeepAliveMs = 15_000;
|
|
33
32
|
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
t.close().catch(() => {});
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const closeAllSessions = () => {
|
|
43
|
-
for (const [id] of sessions) closeSession(id);
|
|
33
|
+
const closeActiveSession = () => {
|
|
34
|
+
if (!activeTransport) return;
|
|
35
|
+
const id = activeSessionId;
|
|
36
|
+
const t = activeTransport;
|
|
37
|
+
activeSessionId = null;
|
|
44
38
|
activeTransport = null;
|
|
39
|
+
t.close().catch(() => {});
|
|
40
|
+
if (id) console.log(`[mcp] Closed session: ${id}`);
|
|
45
41
|
};
|
|
46
42
|
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}, kSessionGraceMs);
|
|
43
|
+
const adoptSession = (sessionId, transport) => {
|
|
44
|
+
if (activeTransport && activeTransport !== transport) {
|
|
45
|
+
const prevId = activeSessionId;
|
|
46
|
+
activeTransport.close().catch(() => {});
|
|
47
|
+
console.log(`[mcp] Replaced session ${prevId} → ${sessionId}`);
|
|
48
|
+
}
|
|
49
|
+
activeSessionId = sessionId;
|
|
50
|
+
activeTransport = transport;
|
|
58
51
|
};
|
|
59
52
|
|
|
60
53
|
const registerMcpRoutes = ({
|
|
@@ -103,7 +96,7 @@ const registerMcpRoutes = ({
|
|
|
103
96
|
});
|
|
104
97
|
|
|
105
98
|
app.post("/api/mcp/stop", requireAuth, async (_req, res) => {
|
|
106
|
-
|
|
99
|
+
closeActiveSession();
|
|
107
100
|
const result = stopMcpBridge();
|
|
108
101
|
res.json(result);
|
|
109
102
|
});
|
|
@@ -153,13 +146,12 @@ const registerMcpRoutes = ({
|
|
|
153
146
|
|
|
154
147
|
// ── Existing session ───────────────────────────────────────
|
|
155
148
|
if (sessionId) {
|
|
156
|
-
|
|
157
|
-
if (transport) {
|
|
149
|
+
if (sessionId === activeSessionId && activeTransport) {
|
|
158
150
|
console.log(
|
|
159
|
-
`[mcp] ${req.method} sessionId=${sessionId} →
|
|
151
|
+
`[mcp] ${req.method} sessionId=${sessionId} → active session`,
|
|
160
152
|
);
|
|
161
153
|
try {
|
|
162
|
-
await
|
|
154
|
+
await activeTransport.handleRequest(req, res, req.body);
|
|
163
155
|
} catch (err) {
|
|
164
156
|
console.error(
|
|
165
157
|
"[mcp] handleRequest error (existing session):",
|
|
@@ -171,7 +163,7 @@ const registerMcpRoutes = ({
|
|
|
171
163
|
}
|
|
172
164
|
} else {
|
|
173
165
|
console.log(
|
|
174
|
-
`[mcp] ${req.method} sessionId=${sessionId} → NOT FOUND (
|
|
166
|
+
`[mcp] ${req.method} sessionId=${sessionId} → NOT FOUND (active=${activeSessionId || "none"})`,
|
|
175
167
|
);
|
|
176
168
|
res.status(404).json({
|
|
177
169
|
jsonrpc: "2.0",
|
|
@@ -191,12 +183,8 @@ const registerMcpRoutes = ({
|
|
|
191
183
|
sessionIdGenerator: () => randomUUID(),
|
|
192
184
|
enableJsonResponse: true,
|
|
193
185
|
onsessioninitialized: (newSessionId) => {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
retireStaleSessions(newSessionId);
|
|
197
|
-
console.log(
|
|
198
|
-
`[mcp] Session registered: ${newSessionId} (sessions=${sessions.size})`,
|
|
199
|
-
);
|
|
186
|
+
adoptSession(newSessionId, transport);
|
|
187
|
+
console.log(`[mcp] Session adopted: ${newSessionId}`);
|
|
200
188
|
},
|
|
201
189
|
});
|
|
202
190
|
|
|
@@ -205,14 +193,11 @@ const registerMcpRoutes = ({
|
|
|
205
193
|
};
|
|
206
194
|
|
|
207
195
|
transport.onclose = () => {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
break;
|
|
212
|
-
}
|
|
196
|
+
if (activeTransport === transport) {
|
|
197
|
+
activeSessionId = null;
|
|
198
|
+
activeTransport = null;
|
|
213
199
|
}
|
|
214
|
-
|
|
215
|
-
console.log(`[mcp] Transport closed (sessions=${sessions.size})`);
|
|
200
|
+
console.log(`[mcp] Transport closed`);
|
|
216
201
|
};
|
|
217
202
|
|
|
218
203
|
transport.onerror = (err) => {
|