chat-recall 0.7.16 → 0.7.18
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/cli.js +573 -331
- package/dist/mcp-relay.js +136 -40
- package/dist/mcp-relay.js.map +1 -1
- package/dist/mcp.js +381 -128
- package/dist/mcp.js.map +1 -1
- package/dist/raw-archive-parts.d.ts +46 -0
- package/dist/raw-archive-parts.d.ts.map +1 -0
- package/dist/raw-archive-parts.js +175 -0
- package/dist/raw-archive-parts.js.map +1 -0
- package/dist/relay-lifecycle.d.ts +23 -0
- package/dist/relay-lifecycle.d.ts.map +1 -1
- package/dist/relay-lifecycle.js +173 -0
- package/dist/relay-lifecycle.js.map +1 -1
- package/dist/repair.d.ts.map +1 -1
- package/dist/repair.js +15 -7
- package/dist/repair.js.map +1 -1
- package/dist/scan-worker.js +2 -0
- package/dist/sync-client.d.ts +8 -0
- package/dist/sync-client.d.ts.map +1 -1
- package/dist/sync-client.js +86 -5
- package/dist/sync-client.js.map +1 -1
- package/dist/sync-ledger.d.ts +31 -1
- package/dist/sync-ledger.d.ts.map +1 -1
- package/dist/sync-ledger.js +47 -1
- package/dist/sync-ledger.js.map +1 -1
- package/dist/watch.js +447 -202
- package/package.json +1 -1
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
|
-
|
|
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
|
|
202
|
+
sock?.destroy();
|
|
172
203
|
} catch {
|
|
173
204
|
}
|
|
174
|
-
exit(
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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.
|
|
302
|
+
var VERSION = true ? "0.7.18" : "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
|
|
237
|
-
|
|
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
|
|
255
|
-
if (
|
|
256
|
-
|
|
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
|
-
|
|
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);
|
package/dist/mcp-relay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-relay.js","sourceRoot":"","sources":["../src/mcp-relay.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,OAAO,EAAe,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mcp-relay.js","sourceRoot":"","sources":["../src/mcp-relay.ts"],"names":[],"mappings":"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"}
|