chat-recall 0.7.17 → 0.7.19

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/mcp-relay.js CHANGED
@@ -159,40 +159,147 @@ function onInputFinished(input, onEnd) {
159
159
  input.once("close", fire);
160
160
  input.once("error", fire);
161
161
  }
162
- function bridge(input, output, sock, exit, opts = {}) {
162
+ var idKey = (id) => JSON.stringify(id);
163
+ function peek(line) {
164
+ try {
165
+ const m = JSON.parse(line);
166
+ return m && typeof m === "object" ? m : null;
167
+ } catch {
168
+ return null;
169
+ }
170
+ }
171
+ function lineSplitter(onLine) {
172
+ const decoder = new TextDecoder("utf-8");
173
+ let rest = "";
174
+ return (chunk) => {
175
+ rest += typeof chunk === "string" ? chunk : decoder.decode(chunk, { stream: true });
176
+ let nl = rest.indexOf("\n");
177
+ while (nl >= 0) {
178
+ const line = rest.slice(0, nl);
179
+ rest = rest.slice(nl + 1);
180
+ if (line.trim()) onLine(line);
181
+ nl = rest.indexOf("\n");
182
+ }
183
+ };
184
+ }
185
+ var DAEMON_RESTART_ERROR = "chat-recall restarted while this call ran. Call the tool again.";
186
+ function resilientBridge(input, output, first, reconnect, exit, opts = {}) {
163
187
  let done = false;
188
+ let inputEnded = false;
189
+ let sock = null;
190
+ let queue = [];
191
+ let replayId = null;
192
+ let initLine = null;
193
+ let initializedLine = null;
194
+ const pending = /* @__PURE__ */ new Set();
164
195
  let stopParentWatch = () => {
165
196
  };
166
- const finish = () => {
197
+ const finish = (code = 0) => {
167
198
  if (done) return;
168
199
  done = true;
169
200
  stopParentWatch();
170
201
  try {
171
- sock.destroy();
202
+ sock?.destroy();
172
203
  } catch {
173
204
  }
174
- exit(0);
205
+ exit(code);
206
+ };
207
+ const toClient = (line) => {
208
+ try {
209
+ output.write(line + "\n");
210
+ } catch {
211
+ finish();
212
+ }
213
+ };
214
+ const fromClient = (line) => {
215
+ const m = peek(line);
216
+ if (m?.method === "initialize") initLine = line;
217
+ else if (m?.method === "notifications/initialized") initializedLine = line;
218
+ if (m && m.id !== void 0 && typeof m.method === "string") pending.add(idKey(m.id));
219
+ if (sock && replayId === null) sock.write(line + "\n");
220
+ else queue.push(line);
175
221
  };
176
- input.pipe(sock);
177
- sock.pipe(output);
178
- sock.on("close", finish);
179
- sock.on("error", finish);
180
- output.on("error", finish);
222
+ const attach = (s) => {
223
+ sock = s;
224
+ const onLine = lineSplitter((line) => {
225
+ if (s !== sock) return;
226
+ const m = peek(line);
227
+ const isReply = m && m.id !== void 0 && m.method === void 0;
228
+ if (isReply && replayId !== null && idKey(m.id) === replayId) {
229
+ replayId = null;
230
+ if (initializedLine) s.write(initializedLine + "\n");
231
+ const held = queue;
232
+ queue = [];
233
+ for (const l of held) s.write(l + "\n");
234
+ return;
235
+ }
236
+ if (isReply) pending.delete(idKey(m.id));
237
+ toClient(line);
238
+ });
239
+ s.on("data", onLine);
240
+ s.on("error", () => {
241
+ });
242
+ s.on("close", () => {
243
+ if (s === sock) void lost();
244
+ });
245
+ };
246
+ const lost = async () => {
247
+ sock = null;
248
+ if (done) return;
249
+ if (inputEnded) {
250
+ finish();
251
+ return;
252
+ }
253
+ for (const key of pending) {
254
+ toClient(JSON.stringify({ jsonrpc: "2.0", id: JSON.parse(key), error: { code: -32e3, message: DAEMON_RESTART_ERROR } }));
255
+ }
256
+ pending.clear();
257
+ const next = await reconnect().catch(() => null);
258
+ if (done) {
259
+ try {
260
+ next?.destroy();
261
+ } catch {
262
+ }
263
+ return;
264
+ }
265
+ if (!next) {
266
+ finish(1);
267
+ return;
268
+ }
269
+ if (initLine) {
270
+ replayId = idKey(peek(initLine)?.id);
271
+ attach(next);
272
+ next.write(initLine + "\n");
273
+ } else {
274
+ attach(next);
275
+ const held = queue;
276
+ queue = [];
277
+ for (const l of held) next.write(l + "\n");
278
+ }
279
+ };
280
+ attach(first);
281
+ input.on("data", lineSplitter(fromClient));
282
+ output.on("error", () => finish());
181
283
  onInputFinished(input, () => {
284
+ inputEnded = true;
285
+ if (!sock) {
286
+ finish();
287
+ return;
288
+ }
182
289
  try {
183
290
  sock.end();
184
291
  } catch {
185
292
  finish();
186
293
  return;
187
294
  }
188
- const t = setTimeout(finish, opts.drainMs ?? 2e3);
295
+ const t = setTimeout(() => finish(), opts.drainMs ?? 2e3);
189
296
  t.unref?.();
190
297
  });
191
- stopParentWatch = watchParent(finish, { probe: opts.probe, intervalMs: opts.parentPollMs });
298
+ stopParentWatch = watchParent(() => finish(), { probe: opts.probe, intervalMs: opts.parentPollMs });
192
299
  }
193
300
 
194
301
  // src/mcp-relay.ts
195
- var VERSION = true ? "0.7.17" : "0.0.0";
302
+ var VERSION = true ? "0.7.19" : "0.0.0";
196
303
  var SERVER_URL = new URL("./mcp.js", import.meta.url);
197
304
  var SERVER_PATH = fileURLToPath(SERVER_URL);
198
305
  var START_TIMEOUT_MS = 15e3;
@@ -233,8 +340,19 @@ function startDaemon(dir, sock) {
233
340
  return null;
234
341
  }
235
342
  }
236
- function relay(sock) {
237
- bridge(process.stdin, process.stdout, sock, (code) => process.exit(code));
343
+ async function connectOrStart(dir, path) {
344
+ const existing = await tryConnect(path);
345
+ if (existing) return existing;
346
+ const child = startDaemon(dir, path);
347
+ if (!child) return null;
348
+ const deadline = Date.now() + START_TIMEOUT_MS;
349
+ while (Date.now() < deadline) {
350
+ await sleep(RETRY_MS);
351
+ const sock = await tryConnect(path);
352
+ if (sock) return sock;
353
+ if (child.exitCode !== null || child.signalCode !== null) return tryConnect(path);
354
+ }
355
+ return null;
238
356
  }
239
357
  var sleep = (ms) => new Promise((r) => setTimeout(r, ms));
240
358
  async function main() {
@@ -251,35 +369,13 @@ async function main() {
251
369
  await serveInProcess();
252
370
  return;
253
371
  }
254
- const existing = await tryConnect(path);
255
- if (existing) {
256
- relay(existing);
257
- return;
258
- }
259
- const child = startDaemon(dir, path);
260
- if (!child) {
372
+ const sock = await connectOrStart(dir, path);
373
+ if (!sock) {
374
+ console.error("[mcp] no daemon answered; serving this session in-process");
261
375
  await serveInProcess();
262
376
  return;
263
377
  }
264
- const deadline = Date.now() + START_TIMEOUT_MS;
265
- while (Date.now() < deadline) {
266
- await sleep(RETRY_MS);
267
- const sock = await tryConnect(path);
268
- if (sock) {
269
- relay(sock);
270
- return;
271
- }
272
- if (child.exitCode !== null || child.signalCode !== null) {
273
- const sibling = await tryConnect(path);
274
- if (sibling) {
275
- relay(sibling);
276
- return;
277
- }
278
- break;
279
- }
280
- }
281
- console.error("[mcp] no daemon answered; serving this session in-process");
282
- await serveInProcess();
378
+ resilientBridge(process.stdin, process.stdout, sock, () => connectOrStart(dir, path), (code) => process.exit(code));
283
379
  }
284
380
  main().catch(async (err) => {
285
381
  console.error("[mcp] relay failed, serving in-process:", err?.message ?? err);
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-relay.js","sourceRoot":"","sources":["../src/mcp-relay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-relay.js","sourceRoot":"","sources":["../src/mcp-relay.ts"],"names":[],"mappings":"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"}