@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.
@@ -26,35 +26,28 @@ const resolveGatewayWsUrl = ({ openclawDir, gatewayPort }) => {
26
26
  return `${scheme}://127.0.0.1:${gatewayPort}`;
27
27
  };
28
28
 
29
- const sessions = new Map();
29
+ let activeSessionId = null;
30
30
  let activeTransport = null;
31
- const kSessionGraceMs = 15_000;
32
31
  const kSseKeepAliveMs = 15_000;
33
32
 
34
- const closeSession = (sessionId) => {
35
- const t = sessions.get(sessionId);
36
- if (!t) return;
37
- sessions.delete(sessionId);
38
- if (activeTransport === t) activeTransport = null;
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 retireStaleSessions = (keepId) => {
48
- const staleIds = [...sessions.keys()].filter((id) => id !== keepId);
49
- if (staleIds.length === 0) return;
50
- setTimeout(() => {
51
- for (const id of staleIds) {
52
- if (sessions.has(id) && sessions.get(id) !== activeTransport) {
53
- console.log(`[mcp] Cleaning up stale session: ${id}`);
54
- closeSession(id);
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
- closeAllSessions();
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
- const transport = sessions.get(sessionId);
157
- if (transport) {
149
+ if (sessionId === activeSessionId && activeTransport) {
158
150
  console.log(
159
- `[mcp] ${req.method} sessionId=${sessionId} → routed to transport (sessions=${sessions.size})`,
151
+ `[mcp] ${req.method} sessionId=${sessionId} → active session`,
160
152
  );
161
153
  try {
162
- await transport.handleRequest(req, res, req.body);
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 (known=[${[...sessions.keys()].join(", ")}])`,
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
- sessions.set(newSessionId, transport);
195
- activeTransport = transport;
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
- for (const [id, t] of sessions) {
209
- if (t === transport) {
210
- sessions.delete(id);
211
- break;
212
- }
196
+ if (activeTransport === transport) {
197
+ activeSessionId = null;
198
+ activeTransport = null;
213
199
  }
214
- if (activeTransport === transport) activeTransport = null;
215
- console.log(`[mcp] Transport closed (sessions=${sessions.size})`);
200
+ console.log(`[mcp] Transport closed`);
216
201
  };
217
202
 
218
203
  transport.onerror = (err) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrysb/alphaclaw",
3
- "version": "0.9.0-beta.5",
3
+ "version": "0.9.0-beta.6",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },