wechat-claude-sessions 1.0.0

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.
Files changed (62) hide show
  1. package/CONTRIBUTING.md +52 -0
  2. package/LICENSE +21 -0
  3. package/README.en.md +264 -0
  4. package/README.md +245 -0
  5. package/SECURITY.md +45 -0
  6. package/dist/bindings.d.ts +4 -0
  7. package/dist/bindings.js +50 -0
  8. package/dist/bindings.js.map +1 -0
  9. package/dist/claude-config.d.ts +4 -0
  10. package/dist/claude-config.js +49 -0
  11. package/dist/claude-config.js.map +1 -0
  12. package/dist/cli.d.ts +2 -0
  13. package/dist/cli.js +345 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/daemon.d.ts +2 -0
  16. package/dist/daemon.js +771 -0
  17. package/dist/daemon.js.map +1 -0
  18. package/dist/i18n.d.ts +67 -0
  19. package/dist/i18n.js +249 -0
  20. package/dist/i18n.js.map +1 -0
  21. package/dist/ilink.d.ts +49 -0
  22. package/dist/ilink.js +533 -0
  23. package/dist/ilink.js.map +1 -0
  24. package/dist/inbox.d.ts +4 -0
  25. package/dist/inbox.js +75 -0
  26. package/dist/inbox.js.map +1 -0
  27. package/dist/launchd.d.ts +7 -0
  28. package/dist/launchd.js +71 -0
  29. package/dist/launchd.js.map +1 -0
  30. package/dist/monitoring.d.ts +4 -0
  31. package/dist/monitoring.js +33 -0
  32. package/dist/monitoring.js.map +1 -0
  33. package/dist/paths.d.ts +11 -0
  34. package/dist/paths.js +35 -0
  35. package/dist/paths.js.map +1 -0
  36. package/dist/pkg-root.d.ts +2 -0
  37. package/dist/pkg-root.js +11 -0
  38. package/dist/pkg-root.js.map +1 -0
  39. package/dist/server.d.ts +2 -0
  40. package/dist/server.js +364 -0
  41. package/dist/server.js.map +1 -0
  42. package/dist/session-numbers.d.ts +1 -0
  43. package/dist/session-numbers.js +44 -0
  44. package/dist/session-numbers.js.map +1 -0
  45. package/dist/sessions.d.ts +15 -0
  46. package/dist/sessions.js +135 -0
  47. package/dist/sessions.js.map +1 -0
  48. package/dist/tmux.d.ts +7 -0
  49. package/dist/tmux.js +47 -0
  50. package/dist/tmux.js.map +1 -0
  51. package/dist/types.d.ts +150 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/utils.d.ts +12 -0
  55. package/dist/utils.js +88 -0
  56. package/dist/utils.js.map +1 -0
  57. package/dist/watch-inbox.d.ts +2 -0
  58. package/dist/watch-inbox.js +102 -0
  59. package/dist/watch-inbox.js.map +1 -0
  60. package/package.json +50 -0
  61. package/templates/com.wechat-claude.daemon.plist.template +31 -0
  62. package/templates/wechat.md +20 -0
package/dist/ilink.js ADDED
@@ -0,0 +1,533 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ import { decryptCdnMedia, extractText, imageExtension } from "./utils.js";
6
+ export const DEFAULT_BASE_URL = "https://ilinkai.weixin.qq.com";
7
+ export const CDN_BASE_URL = "https://novac2c.cdn.weixin.qq.com/c2c";
8
+ const BASE_INFO = { channel_version: "1.0.0" };
9
+ const TEXT_LIMIT = 2000;
10
+ const WECHAT_DIR = path.join(os.homedir(), ".claude", "wechat");
11
+ const SESSION_FILE = path.join(WECHAT_DIR, "session.json");
12
+ const OLD_SESSION_FILE = path.join(os.homedir(), ".claude", "wechat-session.json");
13
+ const CONTEXT_TOKENS_FILE = path.join(WECHAT_DIR, "context_tokens.json");
14
+ function generateUin() {
15
+ const n = crypto.randomBytes(4).readUInt32BE();
16
+ return Buffer.from(String(n)).toString("base64");
17
+ }
18
+ function generateClientId() {
19
+ return `wechat-claude-${crypto.randomBytes(8).toString("hex")}`;
20
+ }
21
+ export class ILinkClient {
22
+ session = null;
23
+ setSession(session) {
24
+ this.session = session;
25
+ this.saveSession();
26
+ }
27
+ saveSession() {
28
+ try {
29
+ if (!fs.existsSync(WECHAT_DIR))
30
+ fs.mkdirSync(WECHAT_DIR, { recursive: true });
31
+ fs.writeFileSync(SESSION_FILE, JSON.stringify(this.session), { mode: 0o600 });
32
+ process.stderr.write(`[wechat-claude] Session saved to ${SESSION_FILE}\n`);
33
+ }
34
+ catch (err) {
35
+ process.stderr.write(`[wechat-claude] Failed to save session: ${err}\n`);
36
+ }
37
+ }
38
+ tryRestoreSession(quiet = false) {
39
+ for (const file of [SESSION_FILE, OLD_SESSION_FILE]) {
40
+ try {
41
+ if (!fs.existsSync(file)) {
42
+ if (!quiet)
43
+ process.stderr.write(`[wechat-claude] Session file not found: ${file}\n`);
44
+ continue;
45
+ }
46
+ const data = JSON.parse(fs.readFileSync(file, "utf-8"));
47
+ if (data.botToken && data.ilinkBotId && data.ilinkUserId) {
48
+ this.session = data;
49
+ process.stderr.write(`[wechat-claude] Session restored from ${file}\n`);
50
+ if (file === OLD_SESSION_FILE) {
51
+ this.saveSession();
52
+ try {
53
+ fs.unlinkSync(OLD_SESSION_FILE);
54
+ }
55
+ catch { }
56
+ }
57
+ return true;
58
+ }
59
+ }
60
+ catch (err) {
61
+ process.stderr.write(`[wechat-claude] Error reading ${file}: ${err}\n`);
62
+ }
63
+ }
64
+ return false;
65
+ }
66
+ // Clear both files: isLoggedIn re-reads from disk when it has no token, so
67
+ // leaving the legacy file behind would silently undo a logout.
68
+ clearSessionFile() {
69
+ for (const file of [SESSION_FILE, OLD_SESSION_FILE]) {
70
+ try {
71
+ if (fs.existsSync(file))
72
+ fs.unlinkSync(file);
73
+ }
74
+ catch {
75
+ // non-fatal
76
+ }
77
+ }
78
+ }
79
+ updatesCursor = "";
80
+ pendingMessages = [];
81
+ contextTokens = new Map();
82
+ typingTickets = new Map();
83
+ polling = false;
84
+ pollAbort = null;
85
+ typingIntervals = new Map();
86
+ startTypingKeepAlive(userId, shouldContinue) {
87
+ this.stopTypingKeepAlive(userId);
88
+ this.sendTyping(userId, true);
89
+ const interval = setInterval(() => {
90
+ if (shouldContinue && !shouldContinue()) {
91
+ this.stopTypingKeepAlive(userId);
92
+ this.sendTyping(userId, false);
93
+ return;
94
+ }
95
+ this.sendTyping(userId, true);
96
+ }, 4000);
97
+ this.typingIntervals.set(userId, interval);
98
+ }
99
+ stopTypingKeepAlive(userId) {
100
+ const interval = this.typingIntervals.get(userId);
101
+ if (interval) {
102
+ clearInterval(interval);
103
+ this.typingIntervals.delete(userId);
104
+ }
105
+ }
106
+ // Re-read the session file when we have no token in memory: a long-lived MCP
107
+ // server started before `wechat-claude login` ran would otherwise report
108
+ // "not logged in" for the rest of its life. Quiet, since this is polled.
109
+ get isLoggedIn() {
110
+ if (this.session === null)
111
+ this.tryRestoreSession(true);
112
+ return this.session !== null;
113
+ }
114
+ getUpdatesCursor() {
115
+ return this.updatesCursor;
116
+ }
117
+ setUpdatesCursor(cursor) {
118
+ this.updatesCursor = cursor;
119
+ }
120
+ trackContextToken(userId, token) {
121
+ this.contextTokens.set(userId, token);
122
+ this.saveContextTokens();
123
+ }
124
+ saveContextTokens() {
125
+ try {
126
+ const data = {};
127
+ for (const [k, v] of this.contextTokens)
128
+ data[k] = v;
129
+ fs.writeFileSync(CONTEXT_TOKENS_FILE, JSON.stringify(data));
130
+ }
131
+ catch { }
132
+ }
133
+ loadContextTokens() {
134
+ try {
135
+ if (!fs.existsSync(CONTEXT_TOKENS_FILE)) {
136
+ process.stderr.write(`[wechat-claude] context_tokens.json not found at ${CONTEXT_TOKENS_FILE}\n`);
137
+ return;
138
+ }
139
+ const data = JSON.parse(fs.readFileSync(CONTEXT_TOKENS_FILE, "utf-8"));
140
+ for (const [k, v] of Object.entries(data)) {
141
+ if (!this.contextTokens.has(k))
142
+ this.contextTokens.set(k, v);
143
+ }
144
+ }
145
+ catch (err) {
146
+ process.stderr.write(`[wechat-claude] loadContextTokens failed: ${err}\n`);
147
+ }
148
+ }
149
+ get baseUrl() {
150
+ return this.session?.baseUrl ?? DEFAULT_BASE_URL;
151
+ }
152
+ authHeaders() {
153
+ if (!this.session)
154
+ throw new Error("Not logged in");
155
+ return {
156
+ "Content-Type": "application/json",
157
+ AuthorizationType: "ilink_bot_token",
158
+ Authorization: `Bearer ${this.session.botToken}`,
159
+ "X-WECHAT-UIN": generateUin(),
160
+ };
161
+ }
162
+ async getQRCode() {
163
+ const res = await fetch(`${DEFAULT_BASE_URL}/ilink/bot/get_bot_qrcode?bot_type=3`);
164
+ if (!res.ok)
165
+ throw new Error(`QR code request failed: ${res.status}`);
166
+ return res.json();
167
+ }
168
+ async pollQRCodeStatus(qrcode) {
169
+ const res = await fetch(`${DEFAULT_BASE_URL}/ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(qrcode)}`, {
170
+ headers: { "iLink-App-ClientVersion": "1" },
171
+ });
172
+ if (!res.ok)
173
+ throw new Error(`QR status request failed: ${res.status}`);
174
+ return res.json();
175
+ }
176
+ async login(onQRCode, onStatus) {
177
+ const qr = await this.getQRCode();
178
+ onQRCode(qr.qrcode_img_content);
179
+ const maxAttempts = 120;
180
+ for (let i = 0; i < maxAttempts; i++) {
181
+ await new Promise((r) => setTimeout(r, 2000));
182
+ const status = await this.pollQRCodeStatus(qr.qrcode);
183
+ if (status.status === "expired") {
184
+ throw new Error("QR code expired, please try again");
185
+ }
186
+ onStatus(status.status);
187
+ if (status.status === "confirmed" &&
188
+ status.bot_token &&
189
+ status.ilink_bot_id &&
190
+ status.ilink_user_id) {
191
+ this.session = {
192
+ botToken: status.bot_token,
193
+ ilinkBotId: status.ilink_bot_id,
194
+ ilinkUserId: status.ilink_user_id,
195
+ baseUrl: status.baseurl || DEFAULT_BASE_URL,
196
+ };
197
+ return;
198
+ }
199
+ }
200
+ throw new Error("Login timed out");
201
+ }
202
+ async getUpdates() {
203
+ if (!this.session)
204
+ throw new Error("Not logged in");
205
+ const res = await fetch(`${this.baseUrl}/ilink/bot/getupdates`, {
206
+ method: "POST",
207
+ headers: this.authHeaders(),
208
+ body: JSON.stringify({
209
+ get_updates_buf: this.updatesCursor,
210
+ base_info: BASE_INFO,
211
+ }),
212
+ signal: AbortSignal.timeout(40_000),
213
+ });
214
+ if (!res.ok)
215
+ throw new Error(`getupdates failed: ${res.status}`);
216
+ const data = (await res.json());
217
+ if (data.ret === -14) {
218
+ this.session = null;
219
+ this.clearSessionFile();
220
+ throw new Error("Session expired, please login again");
221
+ }
222
+ if (data.get_updates_buf) {
223
+ this.updatesCursor = data.get_updates_buf;
224
+ }
225
+ return data.msgs ?? [];
226
+ }
227
+ async sendText(toUserId, text) {
228
+ if (!this.session)
229
+ throw new Error("Not logged in");
230
+ let contextToken = this.contextTokens.get(toUserId);
231
+ if (!contextToken) {
232
+ this.loadContextTokens();
233
+ contextToken = this.contextTokens.get(toUserId);
234
+ }
235
+ if (!contextToken) {
236
+ throw new Error(`No context_token for user ${toUserId}. They must send a message first.`);
237
+ }
238
+ const chunks = [];
239
+ for (let i = 0; i < text.length; i += TEXT_LIMIT) {
240
+ chunks.push(text.slice(i, i + TEXT_LIMIT));
241
+ }
242
+ for (const chunk of chunks) {
243
+ const textItem = { type: 1, text_item: { text: chunk } };
244
+ const res = await fetch(`${this.baseUrl}/ilink/bot/sendmessage`, {
245
+ method: "POST",
246
+ headers: this.authHeaders(),
247
+ body: JSON.stringify({
248
+ msg: {
249
+ from_user_id: "",
250
+ to_user_id: toUserId,
251
+ client_id: generateClientId(),
252
+ message_type: 2,
253
+ message_state: 2,
254
+ context_token: contextToken,
255
+ item_list: [textItem],
256
+ },
257
+ base_info: BASE_INFO,
258
+ }),
259
+ });
260
+ if (!res.ok)
261
+ throw new Error(`sendmessage failed: ${res.status}`);
262
+ }
263
+ }
264
+ async uploadMedia(filePath, toUserId, mediaType) {
265
+ if (!this.session)
266
+ throw new Error("Not logged in");
267
+ const plaintext = fs.readFileSync(filePath);
268
+ const rawsize = plaintext.length;
269
+ const rawfilemd5 = crypto.createHash("md5").update(plaintext).digest("hex");
270
+ const aeskey = crypto.randomBytes(16);
271
+ const filekey = crypto.randomBytes(16).toString("hex");
272
+ const filesize = Math.ceil((rawsize + 1) / 16) * 16;
273
+ const uploadRes = await fetch(`${this.baseUrl}/ilink/bot/getuploadurl`, {
274
+ method: "POST",
275
+ headers: this.authHeaders(),
276
+ body: JSON.stringify({
277
+ filekey,
278
+ media_type: mediaType,
279
+ to_user_id: toUserId,
280
+ rawsize,
281
+ rawfilemd5,
282
+ filesize,
283
+ no_need_thumb: true,
284
+ aeskey: aeskey.toString("hex"),
285
+ base_info: BASE_INFO,
286
+ }),
287
+ });
288
+ if (!uploadRes.ok)
289
+ throw new Error(`getuploadurl failed: ${uploadRes.status}`);
290
+ const uploadData = (await uploadRes.json());
291
+ const fullUrl = uploadData.upload_full_url?.trim();
292
+ let cdnUrl;
293
+ if (fullUrl) {
294
+ cdnUrl = fullUrl;
295
+ }
296
+ else if (uploadData.upload_param) {
297
+ cdnUrl = `${CDN_BASE_URL}/upload?encrypted_query_param=${encodeURIComponent(uploadData.upload_param)}&filekey=${encodeURIComponent(filekey)}`;
298
+ }
299
+ else {
300
+ throw new Error("getuploadurl returned no upload URL");
301
+ }
302
+ const cipher = crypto.createCipheriv("aes-128-ecb", aeskey, null);
303
+ const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
304
+ const cdnRes = await fetch(cdnUrl, {
305
+ method: "POST",
306
+ headers: { "Content-Type": "application/octet-stream" },
307
+ body: new Uint8Array(ciphertext),
308
+ });
309
+ if (!cdnRes.ok)
310
+ throw new Error(`CDN upload failed: ${cdnRes.status}`);
311
+ const downloadParam = cdnRes.headers.get("x-encrypted-param");
312
+ if (!downloadParam)
313
+ throw new Error("CDN response missing x-encrypted-param header");
314
+ return {
315
+ downloadParam,
316
+ aesKeyHex: aeskey.toString("hex"),
317
+ fileSize: rawsize,
318
+ ciphertextSize: ciphertext.length,
319
+ };
320
+ }
321
+ async sendImage(toUserId, filePath, caption) {
322
+ if (!this.session)
323
+ throw new Error("Not logged in");
324
+ let contextToken = this.contextTokens.get(toUserId);
325
+ if (!contextToken) {
326
+ this.loadContextTokens();
327
+ contextToken = this.contextTokens.get(toUserId);
328
+ }
329
+ if (!contextToken) {
330
+ throw new Error(`No context_token for user ${toUserId}. They must send a message first.`);
331
+ }
332
+ const uploaded = await this.uploadMedia(filePath, toUserId, 1);
333
+ if (caption) {
334
+ const textItem = { type: 1, text_item: { text: caption } };
335
+ const textRes = await fetch(`${this.baseUrl}/ilink/bot/sendmessage`, {
336
+ method: "POST",
337
+ headers: this.authHeaders(),
338
+ body: JSON.stringify({
339
+ msg: {
340
+ from_user_id: "",
341
+ to_user_id: toUserId,
342
+ client_id: generateClientId(),
343
+ message_type: 2,
344
+ message_state: 2,
345
+ context_token: contextToken,
346
+ item_list: [textItem],
347
+ },
348
+ base_info: BASE_INFO,
349
+ }),
350
+ });
351
+ if (!textRes.ok)
352
+ throw new Error(`sendmessage (caption) failed: ${textRes.status}`);
353
+ }
354
+ const imageItem = {
355
+ type: 2,
356
+ image_item: {
357
+ media: {
358
+ encrypt_query_param: uploaded.downloadParam,
359
+ aes_key: Buffer.from(uploaded.aesKeyHex).toString("base64"),
360
+ encrypt_type: 1,
361
+ },
362
+ mid_size: uploaded.ciphertextSize,
363
+ },
364
+ };
365
+ const res = await fetch(`${this.baseUrl}/ilink/bot/sendmessage`, {
366
+ method: "POST",
367
+ headers: this.authHeaders(),
368
+ body: JSON.stringify({
369
+ msg: {
370
+ from_user_id: "",
371
+ to_user_id: toUserId,
372
+ client_id: generateClientId(),
373
+ message_type: 2,
374
+ message_state: 2,
375
+ context_token: contextToken,
376
+ item_list: [imageItem],
377
+ },
378
+ base_info: BASE_INFO,
379
+ }),
380
+ });
381
+ if (!res.ok)
382
+ throw new Error(`sendmessage (image) failed: ${res.status}`);
383
+ }
384
+ // Download and decrypt an incoming CDN media item (e.g. an image the user
385
+ // sent). Writes the plaintext to outPathBase + sniffed extension and returns
386
+ // the final path.
387
+ async downloadMedia(media, outPathBase) {
388
+ const url = `${CDN_BASE_URL}/download?encrypted_query_param=${encodeURIComponent(media.encrypt_query_param)}`;
389
+ const res = await fetch(url, { signal: AbortSignal.timeout(30_000) });
390
+ if (!res.ok)
391
+ throw new Error(`CDN download failed: ${res.status}`);
392
+ const ciphertext = Buffer.from(await res.arrayBuffer());
393
+ const plaintext = decryptCdnMedia(ciphertext, media.aes_key, media.encrypt_type);
394
+ const outPath = `${outPathBase}.${imageExtension(plaintext)}`;
395
+ fs.writeFileSync(outPath, plaintext);
396
+ return outPath;
397
+ }
398
+ async sendTyping(userId, typing) {
399
+ if (!this.session)
400
+ throw new Error("Not logged in");
401
+ const ticket = await this.getTypingTicket(userId);
402
+ if (!ticket)
403
+ return;
404
+ await fetch(`${this.baseUrl}/ilink/bot/sendtyping`, {
405
+ method: "POST",
406
+ headers: this.authHeaders(),
407
+ body: JSON.stringify({
408
+ ilink_user_id: userId,
409
+ typing_ticket: ticket,
410
+ status: typing ? 1 : 2,
411
+ base_info: BASE_INFO,
412
+ }),
413
+ }).catch(() => { });
414
+ }
415
+ async getTypingTicket(userId) {
416
+ const cached = this.typingTickets.get(userId);
417
+ if (cached && cached.expiry > Date.now())
418
+ return cached.ticket;
419
+ let contextToken = this.contextTokens.get(userId);
420
+ if (!contextToken) {
421
+ this.loadContextTokens();
422
+ contextToken = this.contextTokens.get(userId);
423
+ }
424
+ if (!contextToken)
425
+ return null;
426
+ try {
427
+ const res = await fetch(`${this.baseUrl}/ilink/bot/getconfig`, {
428
+ method: "POST",
429
+ headers: this.authHeaders(),
430
+ body: JSON.stringify({
431
+ ilink_user_id: userId,
432
+ context_token: contextToken,
433
+ base_info: BASE_INFO,
434
+ }),
435
+ });
436
+ if (!res.ok)
437
+ return null;
438
+ const data = (await res.json());
439
+ if (data.ret !== 0)
440
+ return null;
441
+ this.typingTickets.set(userId, {
442
+ ticket: data.typing_ticket,
443
+ expiry: Date.now() + 20 * 3600 * 1000,
444
+ });
445
+ return data.typing_ticket;
446
+ }
447
+ catch {
448
+ return null;
449
+ }
450
+ }
451
+ processMessages(msgs) {
452
+ const newMessages = [];
453
+ for (const msg of msgs) {
454
+ if (msg.message_type !== 1)
455
+ continue;
456
+ if (msg.message_state !== 2)
457
+ continue;
458
+ this.contextTokens.set(msg.from_user_id, msg.context_token);
459
+ const text = extractText(msg);
460
+ if (!text)
461
+ continue;
462
+ const pending = {
463
+ id: msg.message_id,
464
+ fromUserId: msg.from_user_id,
465
+ text,
466
+ contextToken: msg.context_token,
467
+ timestamp: msg.create_time_ms,
468
+ rawItems: msg.item_list,
469
+ };
470
+ newMessages.push(pending);
471
+ this.pendingMessages.push(pending);
472
+ }
473
+ return newMessages;
474
+ }
475
+ consumePending() {
476
+ const msgs = [...this.pendingMessages];
477
+ this.pendingMessages = [];
478
+ return msgs;
479
+ }
480
+ peekPending() {
481
+ return [...this.pendingMessages];
482
+ }
483
+ startPolling(onMessages) {
484
+ if (this.polling)
485
+ return;
486
+ this.polling = true;
487
+ this.pollAbort = new AbortController();
488
+ const poll = async () => {
489
+ while (this.polling && this.session) {
490
+ try {
491
+ const msgs = await this.getUpdates();
492
+ const pending = this.processMessages(msgs);
493
+ if (pending.length > 0)
494
+ onMessages(pending);
495
+ }
496
+ catch (err) {
497
+ if (!this.polling)
498
+ break;
499
+ const msg = err instanceof Error ? err.message : String(err);
500
+ if (msg.includes("Session expired")) {
501
+ this.polling = false;
502
+ break;
503
+ }
504
+ await new Promise((r) => setTimeout(r, 5000));
505
+ }
506
+ }
507
+ };
508
+ poll();
509
+ }
510
+ stopPolling() {
511
+ this.polling = false;
512
+ this.pollAbort?.abort();
513
+ this.pollAbort = null;
514
+ }
515
+ logout() {
516
+ this.stopPolling();
517
+ this.session = null;
518
+ this.updatesCursor = "";
519
+ this.pendingMessages = [];
520
+ this.contextTokens.clear();
521
+ this.typingTickets.clear();
522
+ this.clearSessionFile();
523
+ }
524
+ getStatus() {
525
+ return {
526
+ loggedIn: this.isLoggedIn,
527
+ polling: this.polling,
528
+ pendingCount: this.pendingMessages.length,
529
+ trackedUsers: this.contextTokens.size,
530
+ };
531
+ }
532
+ }
533
+ //# sourceMappingURL=ilink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ilink.js","sourceRoot":"","sources":["../src/ilink.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PendingMessage } from "./types.js";
2
+ export declare function writeToInbox(sessionId: string, msg: PendingMessage): void;
3
+ export declare function readInbox(sessionId: string): PendingMessage[];
4
+ export declare function peekInbox(sessionId: string): number;
package/dist/inbox.js ADDED
@@ -0,0 +1,75 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { INBOX_DIR } from "./paths.js";
4
+ function inboxFile(sessionId) {
5
+ return path.join(INBOX_DIR, `${sessionId}.json`);
6
+ }
7
+ const LOCK_TIMEOUT_MS = 5000;
8
+ const LOCK_SPINS = 100;
9
+ // Serialize inbox access with an atomic mkdir lock so the daemon's append and
10
+ // the MCP server's drain can't interleave (which would otherwise lose or
11
+ // duplicate messages). Critical sections are tiny (one file read + write).
12
+ function withInboxLock(sessionId, fn) {
13
+ const lock = `${inboxFile(sessionId)}.lock`;
14
+ for (let i = 0; i < LOCK_SPINS; i++) {
15
+ try {
16
+ fs.mkdirSync(lock);
17
+ }
18
+ catch {
19
+ // Lock held — steal it if it's stale, otherwise wait a beat and retry.
20
+ try {
21
+ if (Date.now() - fs.statSync(lock).mtimeMs > LOCK_TIMEOUT_MS) {
22
+ fs.rmdirSync(lock);
23
+ }
24
+ }
25
+ catch { }
26
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 20);
27
+ continue;
28
+ }
29
+ try {
30
+ return fn();
31
+ }
32
+ finally {
33
+ try {
34
+ fs.rmdirSync(lock);
35
+ }
36
+ catch { }
37
+ }
38
+ }
39
+ // Couldn't acquire within the budget — proceed unlocked rather than drop.
40
+ return fn();
41
+ }
42
+ function loadArray(file) {
43
+ try {
44
+ const parsed = JSON.parse(fs.readFileSync(file, "utf-8"));
45
+ return Array.isArray(parsed) ? parsed : [];
46
+ }
47
+ catch {
48
+ return [];
49
+ }
50
+ }
51
+ // Append a message to a session's inbox (daemon side, the sole producer).
52
+ export function writeToInbox(sessionId, msg) {
53
+ const file = inboxFile(sessionId);
54
+ withInboxLock(sessionId, () => {
55
+ const inbox = loadArray(file);
56
+ inbox.push(msg);
57
+ fs.writeFileSync(file, JSON.stringify(inbox));
58
+ });
59
+ }
60
+ // Read and clear a session's inbox (MCP server side, the sole consumer). The
61
+ // read-and-empty happens under the same lock as writeToInbox, so a message the
62
+ // daemon appends can never be lost by, or duplicated across, a concurrent drain.
63
+ export function readInbox(sessionId) {
64
+ const file = inboxFile(sessionId);
65
+ return withInboxLock(sessionId, () => {
66
+ const msgs = loadArray(file);
67
+ if (msgs.length > 0)
68
+ fs.writeFileSync(file, "[]");
69
+ return msgs;
70
+ });
71
+ }
72
+ export function peekInbox(sessionId) {
73
+ return loadArray(inboxFile(sessionId)).length;
74
+ }
75
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const LABEL = "com.wechat-claude.daemon";
2
+ export declare const PLIST_PATH: string;
3
+ export declare function writePlist(): string;
4
+ export declare function isMac(): boolean;
5
+ export declare function load(): boolean;
6
+ export declare function unload(): boolean;
7
+ export declare function isLoaded(): boolean;