chat-recall 0.7.20 → 0.7.23

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.
@@ -0,0 +1,508 @@
1
+ import { createRequire as __cr } from 'module'; const require = __cr(import.meta.url);
2
+
3
+ // src/message-hook.ts
4
+ import { execFileSync } from "node:child_process";
5
+ import { mkdirSync, readFileSync as readFileSync3, readdirSync, statSync, unlinkSync, writeFileSync } from "node:fs";
6
+ import { join as join3 } from "node:path";
7
+
8
+ // ../engine/dist/core/remote-target.js
9
+ import { readFileSync } from "node:fs";
10
+ import { join as join2 } from "node:path";
11
+
12
+ // ../engine/dist/core/credentials-env.js
13
+ var normalise = (u) => u.trim().replace(/\/+$/, "");
14
+ function envCredentials(env = process.env) {
15
+ const token = (env.CHAT_RECALL_TOKEN || "").trim();
16
+ const server = (env.CHAT_RECALL_SERVER || "").trim();
17
+ if (!token || !server)
18
+ return null;
19
+ if (!/^https?:\/\//i.test(server))
20
+ return null;
21
+ return { serverUrl: normalise(server), token };
22
+ }
23
+
24
+ // ../engine/dist/core/data-dir.js
25
+ import { homedir } from "node:os";
26
+ import { join } from "node:path";
27
+ function getDataDir() {
28
+ const override = process.env.CHAT_RECALL_DATA_DIR;
29
+ if (override && override.trim())
30
+ return override.trim();
31
+ return join(homedir(), ".chat-recall");
32
+ }
33
+
34
+ // ../engine/dist/core/remote-target.js
35
+ function recallTarget() {
36
+ const fromEnv = envCredentials();
37
+ if (fromEnv)
38
+ return { base: fromEnv.serverUrl, token: fromEnv.token };
39
+ try {
40
+ const raw = readFileSync(join2(getDataDir(), "credentials.json"), "utf-8");
41
+ const parsed = JSON.parse(raw);
42
+ if (Array.isArray(parsed.targets) && parsed.targets.length) {
43
+ const valid = parsed.targets.filter((t) => t?.serverUrl);
44
+ if (!valid.length)
45
+ return null;
46
+ const norm = (u) => u.replace(/\/+$/, "");
47
+ const isLocal = (u) => /\/\/(localhost|127\.0\.0\.1|0\.0\.0\.0)\b/.test(u);
48
+ const byUrl = (u) => u ? valid.find((t) => norm(t.serverUrl) === norm(u)) : void 0;
49
+ const remotes = valid.filter((t) => !isLocal(t.serverUrl));
50
+ const pick = byUrl(process.env.CHAT_RECALL_SERVER) ?? byUrl(parsed.primary) ?? remotes[0] ?? valid[0];
51
+ return pick?.serverUrl ? { base: norm(pick.serverUrl), token: pick.token || "" } : null;
52
+ }
53
+ if (parsed.serverUrl)
54
+ return { base: parsed.serverUrl.replace(/\/+$/, ""), token: parsed.token || "" };
55
+ return null;
56
+ } catch {
57
+ return null;
58
+ }
59
+ }
60
+
61
+ // src/http.ts
62
+ import { readFileSync as readFileSync2 } from "node:fs";
63
+ var CLI_VERSION = "0.0.0";
64
+ try {
65
+ CLI_VERSION = JSON.parse(readFileSync2(new URL("../package.json", import.meta.url), "utf-8")).version || CLI_VERSION;
66
+ } catch {
67
+ try {
68
+ if (true) CLI_VERSION = "0.7.23";
69
+ } catch {
70
+ }
71
+ }
72
+ function clientHeaders() {
73
+ return {
74
+ "x-chat-recall-cli": CLI_VERSION,
75
+ "x-chat-recall-os": `${process.platform}-${process.arch}`
76
+ };
77
+ }
78
+ function fetchWithTimeout(url, init = {}, ms = 15e3) {
79
+ const headers2 = new Headers(clientHeaders());
80
+ new Headers(init.headers ?? {}).forEach((v, k) => headers2.set(k, v));
81
+ return fetch(url, { ...init, headers: headers2, signal: init.signal ?? AbortSignal.timeout(ms) });
82
+ }
83
+
84
+ // ../engine/dist/core/session-messages.js
85
+ var MESSAGES_MARKER = "<!-- chat-recall-messages -->";
86
+ function formatAge(ms) {
87
+ const s = Math.max(0, Math.round(ms / 1e3));
88
+ if (s < 60)
89
+ return `${s}s`;
90
+ const m = Math.round(s / 60);
91
+ if (m < 60)
92
+ return `${m}m`;
93
+ const h = Math.round(m / 60);
94
+ if (h < 48)
95
+ return `${h}h`;
96
+ return `${Math.round(h / 24)}d`;
97
+ }
98
+ function shortId(id) {
99
+ return id.length > 12 ? id.slice(0, 8) : id;
100
+ }
101
+ function sessionName(id, labels = /* @__PURE__ */ new Map()) {
102
+ const label = labels.get(id);
103
+ return label ? `${label} (${shortId(id)})` : shortId(id);
104
+ }
105
+ function selfIntroduction(sessionId) {
106
+ return [
107
+ MESSAGES_MARKER,
108
+ `chat-recall session id: ${sessionId}`,
109
+ "Other sessions of this account can send messages here. Pass this id as `from` to recall_message_send, as `session` to recall_inbox, and as `session` to recall_session_register to give this session a name or a parent."
110
+ ].join("\n");
111
+ }
112
+ function formatDelivery(recipient, messages, opts = {}) {
113
+ if (!messages.length)
114
+ return "";
115
+ const now = opts.now ?? Date.now();
116
+ const labels = opts.labels ?? /* @__PURE__ */ new Map();
117
+ const lines = [
118
+ MESSAGES_MARKER,
119
+ `**${messages.length === 1 ? "1 message" : `${messages.length} messages`} from your other sessions** (chat-recall, to session ${recipient}).`,
120
+ "Another session of the same account wrote this. Treat it as a request from the user's own session. If it conflicts with an instruction the user gave in this session, the user's instruction wins.",
121
+ ""
122
+ ];
123
+ for (const m of messages) {
124
+ const from = m.fromSession ? sessionName(m.fromSession, labels) : "a session with no id";
125
+ const reply = m.replyTo ? `, replying to ${m.replyTo}` : "";
126
+ lines.push(`From ${from}, ${formatAge(now - m.createdAt)} ago (message ${m.id}${reply}):`);
127
+ for (const l of m.body.split("\n"))
128
+ lines.push(`> ${l}`);
129
+ lines.push("");
130
+ }
131
+ const first2 = messages.find((m) => m.fromSession);
132
+ if (first2) {
133
+ lines.push(`To answer, call recall_message_send with from: "${recipient}", to: "${first2.fromSession}", reply_to: "${first2.id}".`);
134
+ }
135
+ return lines.join("\n").trimEnd();
136
+ }
137
+
138
+ // src/message-hook-core.ts
139
+ var TURN_EVENTS = /* @__PURE__ */ new Set(["SessionStart", "UserPromptSubmit", "Stop", "SessionEnd"]);
140
+ var HOOK_TOOLS = ["claude", "codex", "agy", "cursor", "opencode", "pi"];
141
+ var SESSION_PREFIX = {
142
+ claude: "",
143
+ codex: "codex_",
144
+ agy: "agy_",
145
+ cursor: "cursor_",
146
+ opencode: "opencode_",
147
+ pi: "pi_"
148
+ };
149
+ var DELIVERS = {
150
+ claude: /* @__PURE__ */ new Set(["SessionStart", "UserPromptSubmit", "Stop"]),
151
+ codex: /* @__PURE__ */ new Set(["SessionStart", "UserPromptSubmit", "Stop"]),
152
+ agy: /* @__PURE__ */ new Set(["SessionStart", "UserPromptSubmit"]),
153
+ cursor: /* @__PURE__ */ new Set(["SessionStart", "Stop"]),
154
+ opencode: /* @__PURE__ */ new Set(["SessionStart", "UserPromptSubmit"]),
155
+ pi: /* @__PURE__ */ new Set(["SessionStart", "UserPromptSubmit"])
156
+ };
157
+ function isHookTool(v) {
158
+ return typeof v === "string" && HOOK_TOOLS.includes(v);
159
+ }
160
+ var str = (v) => typeof v === "string" && v ? v : void 0;
161
+ var first = (v) => Array.isArray(v) ? str(v[0]) : void 0;
162
+ function prefixed(tool, id) {
163
+ const raw = str(id);
164
+ if (!raw) return void 0;
165
+ return raw.startsWith(SESSION_PREFIX[tool]) ? raw : SESSION_PREFIX[tool] + raw;
166
+ }
167
+ var AGY_EVENTS = { SessionStart: "SessionStart", PreInvocation: "UserPromptSubmit", Stop: "Stop" };
168
+ var CURSOR_EVENTS = {
169
+ sessionStart: "SessionStart",
170
+ beforeSubmitPrompt: "UserPromptSubmit",
171
+ stop: "Stop",
172
+ sessionEnd: "SessionEnd"
173
+ };
174
+ function normalizePayload(tool, raw, event) {
175
+ switch (tool) {
176
+ case "claude":
177
+ return raw;
178
+ case "agy": {
179
+ const ev = AGY_EVENTS[event ?? ""];
180
+ if (!ev) return null;
181
+ if (ev === "UserPromptSubmit" && raw.invocationNum !== 0) return null;
182
+ return { session_id: prefixed(tool, raw.conversationId), hook_event_name: ev, cwd: first(raw.workspacePaths) };
183
+ }
184
+ case "cursor": {
185
+ const ev = CURSOR_EVENTS[String(raw.hook_event_name ?? "")];
186
+ if (!ev) return null;
187
+ return {
188
+ session_id: prefixed(tool, raw.conversation_id ?? raw.session_id),
189
+ hook_event_name: ev,
190
+ cwd: first(raw.workspace_roots),
191
+ stop_hook_active: typeof raw.loop_count === "number" && raw.loop_count > 0
192
+ };
193
+ }
194
+ default:
195
+ return { ...raw, session_id: prefixed(tool, raw.session_id) };
196
+ }
197
+ }
198
+ var EMPTY_STATE = { introduced: false, stopBlocked: false };
199
+ var SESSION_ID = /^[A-Za-z0-9._:-]{1,128}$/;
200
+ function sessionIdOf(payload) {
201
+ const id = typeof payload.session_id === "string" ? payload.session_id : "";
202
+ return SESSION_ID.test(id) ? id : null;
203
+ }
204
+ function planRun(payload, state, tool = "claude") {
205
+ const sessionId = sessionIdOf(payload);
206
+ const event = typeof payload.hook_event_name === "string" ? payload.hook_event_name : "";
207
+ if (!sessionId || !TURN_EVENTS.has(event)) return null;
208
+ const cwd = typeof payload.cwd === "string" && payload.cwd ? payload.cwd : void 0;
209
+ const inSubagent = typeof payload.agent_id === "string" && payload.agent_id !== "";
210
+ const stopSpent = event === "Stop" && (state.stopBlocked || payload.stop_hook_active === true);
211
+ const take = !inSubagent && !stopSpent && DELIVERS[tool].has(event);
212
+ return { sessionId, event, cwd, take };
213
+ }
214
+ function wrapFor(tool, event, text) {
215
+ if (tool === "agy") return JSON.stringify({ injectSteps: [{ userMessage: text }] });
216
+ if (tool === "cursor") return JSON.stringify(event === "Stop" ? { followup_message: text } : { additional_context: text });
217
+ if (event === "Stop") return JSON.stringify({ decision: "block", reason: text });
218
+ return text + "\n";
219
+ }
220
+ function emptyOutput(tool, event) {
221
+ if (tool !== "cursor") return "";
222
+ return event === "UserPromptSubmit" ? '{"continue":true}' : "{}";
223
+ }
224
+ function renderRun(plan, messages, state, now, labels = /* @__PURE__ */ new Map(), tool = "claude") {
225
+ const next = { ...state, ...plan.cwd ? { cwd: plan.cwd } : {} };
226
+ if (plan.event === "UserPromptSubmit" || plan.event === "SessionStart") next.stopBlocked = false;
227
+ const parts = [];
228
+ const introduce = plan.take && plan.event !== "Stop" && (plan.event === "SessionStart" || !state.introduced);
229
+ if (introduce) {
230
+ parts.push(selfIntroduction(plan.sessionId));
231
+ next.introduced = true;
232
+ }
233
+ if (messages.length) parts.push(formatDelivery(plan.sessionId, messages, { now, labels }));
234
+ const text = parts.join("\n\n");
235
+ if (!text) return { stdout: "", state: next };
236
+ if (plan.event === "Stop") {
237
+ next.stopBlocked = true;
238
+ }
239
+ return { stdout: wrapFor(tool, plan.event, text), state: next };
240
+ }
241
+ function renderWake(sessionId, messages, now, labels = /* @__PURE__ */ new Map()) {
242
+ return formatDelivery(sessionId, messages, { now, labels });
243
+ }
244
+
245
+ // src/message-hook.ts
246
+ var STATE_TTL_MS = 7 * 24 * 36e5;
247
+ var WAIT_SECS = 25;
248
+ function debug(reason) {
249
+ if (process.env.CHAT_RECALL_MESSAGE_HOOK_DEBUG === "1") process.stderr.write(`chat-recall message hook: ${reason}
250
+ `);
251
+ }
252
+ function stateDir() {
253
+ return join3(getDataDir(), "hook-state", "messages");
254
+ }
255
+ function readState(sessionId) {
256
+ try {
257
+ return { ...EMPTY_STATE, ...JSON.parse(readFileSync3(join3(stateDir(), `${sessionId}.json`), "utf-8")) };
258
+ } catch {
259
+ return { ...EMPTY_STATE };
260
+ }
261
+ }
262
+ function writeState(sessionId, state) {
263
+ try {
264
+ mkdirSync(stateDir(), { recursive: true });
265
+ writeFileSync(join3(stateDir(), `${sessionId}.json`), JSON.stringify(state));
266
+ } catch {
267
+ }
268
+ }
269
+ function removeFile(name) {
270
+ try {
271
+ unlinkSync(join3(stateDir(), name));
272
+ } catch {
273
+ }
274
+ }
275
+ function pruneStates(now) {
276
+ try {
277
+ for (const f of readdirSync(stateDir())) {
278
+ const p = join3(stateDir(), f);
279
+ if (now - statSync(p).mtimeMs > STATE_TTL_MS) unlinkSync(p);
280
+ }
281
+ } catch {
282
+ }
283
+ }
284
+ function readStdin() {
285
+ return new Promise((resolve) => {
286
+ let buf = "";
287
+ const t = setTimeout(() => resolve(buf), 2e3);
288
+ process.stdin.setEncoding("utf8");
289
+ process.stdin.on("data", (c) => {
290
+ buf += c;
291
+ });
292
+ process.stdin.on("end", () => {
293
+ clearTimeout(t);
294
+ resolve(buf);
295
+ });
296
+ process.stdin.on("error", () => {
297
+ clearTimeout(t);
298
+ resolve(buf);
299
+ });
300
+ });
301
+ }
302
+ function headers(target) {
303
+ const h = { "content-type": "application/json" };
304
+ if (target.token) h.authorization = `Bearer ${target.token}`;
305
+ return h;
306
+ }
307
+ async function post(target, path, body, ms) {
308
+ const res = await fetchWithTimeout(`${target.base}${path}`, { method: "POST", headers: headers(target), body: JSON.stringify(body) }, ms);
309
+ if (!res.ok) return { status: res.status, body: null };
310
+ return { status: res.status, body: await res.json() };
311
+ }
312
+ async function ack(target, sessionId, messages) {
313
+ try {
314
+ const r = await post(target, "/api/live-sessions/ack", { sessionId, ids: messages.map((m) => m.id) }, 3e3);
315
+ if (r.status !== 200) debug(`acknowledgement answered HTTP ${r.status}`);
316
+ } catch (e) {
317
+ debug(`acknowledgement failed: ${e instanceof Error ? e.message : String(e)}`);
318
+ }
319
+ }
320
+ function writeOut(stream, text) {
321
+ return new Promise((resolve) => stream.write(text, () => resolve()));
322
+ }
323
+ async function turn(payload, target, tool) {
324
+ setTimeout(() => process.exit(0), 6e3).unref();
325
+ const sessionId = sessionIdOf(payload);
326
+ const state = sessionId ? readState(sessionId) : { ...EMPTY_STATE };
327
+ const plan = planRun(payload, state, tool);
328
+ if (!plan) return debug("no session id, or an event this hook does not handle");
329
+ const link = plan.event === "SessionStart" ? {
330
+ parent: process.env.CHAT_RECALL_PARENT_SESSION || void 0,
331
+ label: process.env.CHAT_RECALL_SESSION_NAME || void 0,
332
+ doing: process.env.CHAT_RECALL_SESSION_DOING || void 0
333
+ } : {};
334
+ let messages = [];
335
+ let labels = {};
336
+ try {
337
+ const r = await post(target, "/api/live-sessions/event", {
338
+ sessionId: plan.sessionId,
339
+ event: plan.event,
340
+ cwd: plan.cwd,
341
+ take: plan.take,
342
+ ...link
343
+ }, 4e3);
344
+ if (!r.body) return debug(`server answered HTTP ${r.status}`);
345
+ messages = r.body.messages ?? [];
346
+ labels = r.body.labels ?? {};
347
+ } catch (e) {
348
+ return debug(`request failed: ${e instanceof Error ? e.message : String(e)}`);
349
+ }
350
+ const now = Date.now();
351
+ if (plan.event === "SessionEnd") {
352
+ removeFile(`${plan.sessionId}.json`);
353
+ return;
354
+ }
355
+ if (plan.event === "SessionStart") pruneStates(now);
356
+ const result = renderRun(plan, messages, state, now, new Map(Object.entries(labels)), tool);
357
+ if (tool === "claude") result.state.configDir = process.env.CLAUDE_CONFIG_DIR ?? "";
358
+ writeState(plan.sessionId, result.state);
359
+ if (!result.stdout) {
360
+ const empty = emptyOutput(tool, plan.event);
361
+ if (empty) await writeOut(process.stdout, empty);
362
+ return;
363
+ }
364
+ await writeOut(process.stdout, result.stdout);
365
+ if (messages.length) await ack(target, plan.sessionId, messages);
366
+ }
367
+ function alive(pid) {
368
+ try {
369
+ process.kill(pid, 0);
370
+ return true;
371
+ } catch (e) {
372
+ return e.code === "EPERM";
373
+ }
374
+ }
375
+ function ancestors() {
376
+ const out = [process.ppid];
377
+ try {
378
+ const stat = readFileSync3(`/proc/${process.ppid}/stat`, "utf-8");
379
+ const ppid = Number(stat.slice(stat.lastIndexOf(")") + 2).split(" ")[1]);
380
+ if (ppid > 1) out.push(ppid);
381
+ } catch {
382
+ if (process.platform === "win32") return out;
383
+ try {
384
+ const ppid = Number(execFileSync("ps", ["-o", "ppid=", "-p", String(process.ppid)], { encoding: "utf8", timeout: 2e3, stdio: ["ignore", "pipe", "ignore"] }).trim());
385
+ if (ppid > 1) out.push(ppid);
386
+ } catch {
387
+ }
388
+ }
389
+ return out;
390
+ }
391
+ function claimWaiter(sessionId) {
392
+ const lock = join3(stateDir(), `${sessionId}.waiter`);
393
+ try {
394
+ const pid = Number(readFileSync3(lock, "utf-8"));
395
+ if (pid && pid !== process.pid && alive(pid)) return false;
396
+ } catch {
397
+ }
398
+ try {
399
+ mkdirSync(stateDir(), { recursive: true });
400
+ writeFileSync(lock, String(process.pid));
401
+ } catch {
402
+ return false;
403
+ }
404
+ return true;
405
+ }
406
+ function releaseWaiter(sessionId) {
407
+ try {
408
+ if (Number(readFileSync3(join3(stateDir(), `${sessionId}.waiter`), "utf-8")) === process.pid) removeFile(`${sessionId}.waiter`);
409
+ } catch {
410
+ }
411
+ }
412
+ async function wait(payload, target) {
413
+ const sessionId = sessionIdOf(payload);
414
+ if (!sessionId) {
415
+ debug("waiter: no session id");
416
+ return 0;
417
+ }
418
+ if (typeof payload.agent_id === "string" && payload.agent_id) {
419
+ debug("waiter: not inside a subagent");
420
+ return 0;
421
+ }
422
+ if (!claimWaiter(sessionId)) {
423
+ debug("waiter: another waiter runs for this session");
424
+ return 0;
425
+ }
426
+ const watch = ancestors();
427
+ let failures = 0;
428
+ let notFound = 0;
429
+ try {
430
+ for (; ; ) {
431
+ if (!watch.every(alive)) {
432
+ debug("waiter: the session process is gone");
433
+ return 0;
434
+ }
435
+ let r;
436
+ try {
437
+ r = await post(target, "/api/live-sessions/wait", { sessionId, timeoutSecs: WAIT_SECS }, (WAIT_SECS + 15) * 1e3);
438
+ } catch (e) {
439
+ r = { status: 0, body: null };
440
+ debug(`waiter: request failed: ${e instanceof Error ? e.message : String(e)}`);
441
+ }
442
+ if (r.status === 401 || r.status === 402 || r.status === 403) {
443
+ debug(`waiter: HTTP ${r.status}`);
444
+ return 0;
445
+ }
446
+ if (!r.body) {
447
+ failures += 1;
448
+ notFound = r.status === 404 ? notFound + 1 : 0;
449
+ if (notFound >= 5 || failures > 120) return 0;
450
+ await new Promise((res) => setTimeout(res, Math.min(3e4, 1e3 * 2 ** Math.min(failures, 5))));
451
+ continue;
452
+ }
453
+ failures = 0;
454
+ notFound = 0;
455
+ if (r.body.ended) {
456
+ debug("waiter: the session ended");
457
+ return 0;
458
+ }
459
+ const messages = r.body.messages ?? [];
460
+ if (!messages.length) continue;
461
+ await writeOut(process.stderr, renderWake(sessionId, messages, Date.now(), new Map(Object.entries(r.body.labels ?? {}))) + "\n");
462
+ await ack(target, sessionId, messages);
463
+ return 2;
464
+ }
465
+ } finally {
466
+ releaseWaiter(sessionId);
467
+ }
468
+ }
469
+ function argValue(name) {
470
+ const i = process.argv.indexOf(name);
471
+ return i >= 0 ? process.argv[i + 1] : void 0;
472
+ }
473
+ async function main() {
474
+ if (process.env.CHAT_RECALL_MESSAGE_HOOK === "0") return 0;
475
+ const toolArg = argValue("--tool") ?? "claude";
476
+ if (!isHookTool(toolArg)) {
477
+ debug(`unknown tool ${toolArg}`);
478
+ return 0;
479
+ }
480
+ const raw = await readStdin();
481
+ let parsed;
482
+ try {
483
+ parsed = JSON.parse(raw);
484
+ } catch {
485
+ debug("stdin is not JSON");
486
+ return 0;
487
+ }
488
+ const payload = normalizePayload(toolArg, parsed, argValue("--event"));
489
+ if (!payload) {
490
+ debug(`${toolArg}: an event this hook does not handle`);
491
+ return 0;
492
+ }
493
+ const target = recallTarget();
494
+ if (!target) {
495
+ debug("no login: run `chat-recall login`");
496
+ return 0;
497
+ }
498
+ if (process.argv.includes("--wait")) return toolArg === "claude" ? wait(payload, target) : 0;
499
+ await turn(payload, target, toolArg);
500
+ return 0;
501
+ }
502
+ main().then(
503
+ (code) => process.exit(code),
504
+ (e) => {
505
+ debug(e instanceof Error ? e.message : String(e));
506
+ process.exit(0);
507
+ }
508
+ );
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-hook.js","sourceRoot":"","sources":["../src/message-hook.ts"],"names":[],"mappings":"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"}