wechat-claude-sessions 1.2.0 → 1.3.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.
package/README.en.md CHANGED
@@ -214,6 +214,7 @@ with `SendMessage`, tells you on WeChat which session it went to and how to
214
214
  ├── daemon.log # daemon output
215
215
  ├── cursor.txt # message polling cursor
216
216
  ├── expired.flag # present when the WeChat login has expired
217
+ ├── login-verified # timestamp of the last WeChat call that succeeded
217
218
  ├── usage-limit.json # known Claude usage-limit state (incl. notified users)
218
219
  ├── update-check.json # last `latest` version seen on npm (for the /ls upgrade notice)
219
220
  ├── replies/ # last time each session replied to each WeChat user
@@ -236,7 +237,9 @@ with `SendMessage`, tells you on WeChat which session it went to and how to
236
237
  wechat-claude setup # Register MCP server + /wechat command, then log in
237
238
  wechat-claude login # (Re)authenticate by scanning a QR code
238
239
  wechat-claude status # Show login / daemon / service state
239
- wechat-claude daemon # Run the daemon in the foreground
240
+ wechat-claude daemon # Run the daemon in the foreground (dies with the terminal)
241
+ wechat-claude daemon start # Start it in the background
242
+ wechat-claude daemon stop # Stop it (unloads the launchd job when one owns it)
240
243
  wechat-claude daemon restart # Restart it (use after upgrading)
241
244
  wechat-claude daemon install # Install as a launchd service (macOS)
242
245
  wechat-claude daemon uninstall # Remove the launchd service
@@ -322,9 +325,24 @@ wechat-claude executes code on your machine in response to chat messages. Read
322
325
  exits on expiry and can no longer send messages. Back at the Mac, run
323
326
  `wechat-claude status`; if logged out, `wechat-claude login` (or
324
327
  `/wechat` in a session) to re-scan. Restart the daemon if needed.
328
+ - **`status` says logged in, but sending fails.** The token is only cached
329
+ locally, and it can be revoked elsewhere (e.g. `wechat-claude uninstall` on
330
+ another machine). That is why the `Logged in:` line carries a qualifier:
331
+ `(verified …)` means a WeChat call actually succeeded recently, while
332
+ `(UNVERIFIED …)` means nothing has confirmed the token — don't count on it.
333
+ Re-run `wechat-claude login` (or `/wechat`) to re-scan.
334
+ - **The watcher stopped.** It prints one `WECHAT: watcher stopping — …` line
335
+ saying why and exits non-zero (a silent exit 0 is indistinguishable from a
336
+ clean shutdown). If it was superseded — an MCP reconnect gave the session a
337
+ new id — run `wechat_status` and start a watcher with the new command.
325
338
  - **`/run` says "找不到目录".** The name didn't resolve to a project; add its
326
339
  parent to `repoDirs` in `~/.claude/wechat/config.json`, pass an absolute
327
340
  path, or use `/run . <task>` to run in the default directory.
341
+ - **Logged in, still receiving nothing.** `wechat-claude login` and `setup` now
342
+ start the daemon themselves, restarting one that is already running — it
343
+ holds the credential it read at startup, so after a re-login it would keep
344
+ polling with the old token and then delete the session file the new login
345
+ just wrote. `wechat-claude daemon start` / `stop` control it by hand.
328
346
  - **A message got no response.** Check `wechat-claude daemon status` and
329
347
  `wechat-claude daemon log`. If the target session isn't `👀 monitoring`, run
330
348
  `/wechat` in it or bind with `/use <n>`.
package/README.md CHANGED
@@ -183,6 +183,7 @@ session 用 `SendMessage` 找它时要用的(见 `ListAgents`)。`wechat_sta
183
183
  ├── daemon.log # daemon 输出
184
184
  ├── cursor.txt # 消息轮询游标
185
185
  ├── expired.flag # 微信登录过期时存在
186
+ ├── login-verified # 最后一次成功微信调用的时间戳("已登录"的唯一实证)
186
187
  ├── usage-limit.json # 已知的 Claude 用量上限状态(含已通知的用户)
187
188
  ├── update-check.json # 上次从 npm 查到的最新版本(/ls 的升级提示用)
188
189
  ├── replies/ # 各 session 最近一次回复各微信用户的时间戳
@@ -205,7 +206,9 @@ session 用 `SendMessage` 找它时要用的(见 `ListAgents`)。`wechat_sta
205
206
  wechat-claude setup # 注册 MCP server + /wechat 命令,然后登录
206
207
  wechat-claude login # (重新)扫码认证
207
208
  wechat-claude status # 查看登录 / daemon / 服务状态
208
- wechat-claude daemon # 前台运行 daemon
209
+ wechat-claude daemon # 前台运行 daemon(跟着终端一起退出)
210
+ wechat-claude daemon start # 后台启动 daemon
211
+ wechat-claude daemon stop # 停止 daemon(装了 launchd 就卸载那个 job)
209
212
  wechat-claude daemon restart # 重启 daemon(升级后用)
210
213
  wechat-claude daemon install # 装成 launchd 服务(macOS)
211
214
  wechat-claude daemon uninstall # 移除 launchd 服务
@@ -284,9 +287,20 @@ wechat-claude 会响应聊天消息、在你的机器上执行代码。完整威
284
287
  - **机器人不回消息了。** 多半是微信登录过期 —— daemon 在过期时会退出,也就再也发不出消息。
285
288
  回到 Mac 上运行 `wechat-claude status`;如果显示未登录,用 `wechat-claude login`
286
289
  (或在某个 session 里 `/wechat`)重新扫码。需要的话重启 daemon。
290
+ - **`status` 说已登录,发消息却失败。** 本地只有一个缓存的 token,凭证可能在别处被吊销了
291
+ (比如在另一台机器上跑了 `wechat-claude uninstall`)。所以 `Logged in:` 后面会跟一个
292
+ 说明:`(verified …)` 表示最近确实有一次微信调用成功;`(UNVERIFIED …)` 表示没有任何调用
293
+ 证实过它,别拿它当准。重新 `wechat-claude login`(或 `/wechat`)扫码即可。
294
+ - **watcher 停了。** 它会先打印一行 `WECHAT: watcher stopping — …` 说明原因,再以非 0
295
+ 退出(静默退出 0 和正常结束没法区分)。如果是被顶替(`/mcp` 重连后 MCP server 换了新
296
+ 的 session id),跑 `wechat_status` 拿新命令重开一个 watcher。
287
297
  - **`/run` 提示"找不到目录"。** 那个名字没解析到项目;把它的父目录加到
288
298
  `~/.claude/wechat/config.json` 的 `repoDirs` 里,或者传绝对路径,或者用
289
299
  `/run . <任务>` 在默认目录里跑。
300
+ - **登录之后还是收不到消息。** `wechat-claude login` 和 `setup` 现在会自己把 daemon 起来
301
+ (已经在跑的会重启 —— 老 daemon 手里攥的是旧 token,不换掉它会拿旧 token 去轮询,
302
+ 然后把你刚写好的 session.json 当过期凭证删掉)。想手动控制就用
303
+ `wechat-claude daemon start` / `stop`。
290
304
  - **消息发出去没反应。** 检查 `wechat-claude daemon status` 和
291
305
  `wechat-claude daemon log`。如果目标 session 不在 `👀 监控中`,在它里面跑 `/wechat`,
292
306
  或者用 `/use <编号>` 绑定。
package/dist/cli.js CHANGED
@@ -5,19 +5,19 @@
5
5
  // wechat-claude login (re)authenticate by scanning a QR code
6
6
  // wechat-claude status show daemon / login state
7
7
  // wechat-claude daemon [cmd] run or manage the background daemon
8
- import { spawn, spawnSync } from "node:child_process";
8
+ import { spawnSync } from "node:child_process";
9
9
  import fs from "node:fs";
10
10
  import os from "node:os";
11
11
  import path from "node:path";
12
12
  import { fileURLToPath } from "node:url";
13
13
  import { ILinkClient } from "./ilink.js";
14
+ import { loginVerification, verificationNote } from "./login-state.js";
14
15
  import { pkgFile } from "./pkg-root.js";
15
- import { DAEMON_PID_FILE, ensureDirs, WECHAT_DIR } from "./paths.js";
16
+ import { DAEMON_LOG_FILE, WECHAT_DIR } from "./paths.js";
17
+ import { DAEMON_PATH, ensureDaemonRunning, isDaemonRunning, restartDaemonForNewLogin, spawnDaemonDetached, stopDaemon, } from "./daemon-control.js";
16
18
  import { classifyMcpRegistration } from "./utils.js";
17
19
  import * as launchd from "./launchd.js";
18
- const DAEMON_JS = fileURLToPath(new URL("./daemon.js", import.meta.url));
19
20
  const SERVER_JS = fileURLToPath(new URL("./server.js", import.meta.url));
20
- const DAEMON_LOG = path.join(WECHAT_DIR, "daemon.log");
21
21
  function out(s) {
22
22
  process.stdout.write(s + "\n");
23
23
  }
@@ -115,148 +115,49 @@ async function login() {
115
115
  return false;
116
116
  }
117
117
  }
118
- function identifyProcess(pid) {
119
- if (process.platform === "win32")
120
- return "unknown"; // no ps
121
- const r = spawnSync("ps", ["-o", "command=", "-p", String(pid)], {
122
- stdio: ["ignore", "pipe", "ignore"],
123
- });
124
- // A missing/broken ps is "unknown"; ps running and finding nothing is a real
125
- // answer, but the caller only asks about pids it has already seen alive.
126
- if (r.error)
127
- return "unknown";
128
- if (r.status !== 0)
129
- return "other";
130
- const cmd = (r.stdout ?? "").toString().trim();
131
- if (cmd === "")
132
- return "unknown";
133
- // Match any install's daemon.js, not just this one: after an upgrade the
134
- // running daemon legitimately comes from the previous install path.
135
- return /\bnode\b/.test(cmd) && /daemon\.js(\s|$)/.test(cmd) ? "daemon" : "other";
136
- }
137
- // The daemon's pid, or undefined when the pid file is absent or stale. Removes
138
- // a stale file so the next reader is not misled by it.
139
- function readDaemonPid() {
140
- let pid;
141
- try {
142
- pid = parseInt(fs.readFileSync(DAEMON_PID_FILE, "utf-8").trim(), 10);
143
- }
144
- catch {
145
- return undefined;
146
- }
147
- if (!Number.isFinite(pid) || pid <= 0)
148
- return undefined;
149
- try {
150
- process.kill(pid, 0);
151
- }
152
- catch {
153
- try {
154
- fs.unlinkSync(DAEMON_PID_FILE);
155
- }
156
- catch { }
157
- return undefined;
158
- }
159
- if (identifyProcess(pid) === "other") {
160
- out(` ! pid file points at pid ${pid}, which is not a wechat-claude daemon — ignoring it`);
161
- try {
162
- fs.unlinkSync(DAEMON_PID_FILE);
163
- }
164
- catch { }
165
- return undefined;
166
- }
167
- // "unknown" (Windows, or no usable ps) falls through: an unverifiable pid is
168
- // still the best information we have, and treating it as stale would delete
169
- // a live daemon's pid file and let a second poller start.
170
- return pid;
171
- }
172
- function daemonRunning() {
173
- return readDaemonPid() !== undefined;
174
- }
175
118
  function status() {
176
119
  const client = new ILinkClient();
177
120
  const loggedIn = client.tryRestoreSession();
178
- out(`Logged in: ${loggedIn ? "yes" : "no"}`);
179
- out(`Daemon running: ${daemonRunning() ? "yes" : "no"}`);
121
+ out(`Logged in: ${loggedIn ? "yes" : "no"}${loggedIn ? ` ${verificationNote(loginVerification())}` : ""}`);
122
+ out(`Daemon running: ${isDaemonRunning() ? "yes" : "no"}`);
180
123
  if (launchd.isMac())
181
124
  out(`launchd service: ${launchd.isLoaded() ? "installed" : "not installed"}`);
182
125
  out(`Data dir: ${WECHAT_DIR}`);
183
126
  if (!loggedIn)
184
127
  out("\nRun `wechat-claude login` to authenticate.");
185
- else if (!daemonRunning())
128
+ else if (!isDaemonRunning())
186
129
  out("\nStart the daemon with `wechat-claude daemon` (or it auto-starts via /wechat).");
187
130
  }
188
- // Stop the running daemon and wait for the pid to actually go away, so the
189
- // replacement does not lose its own singleton race against the old process.
190
- function stopDaemon() {
191
- const pid = readDaemonPid();
192
- if (pid === undefined)
193
- return false;
194
- try {
195
- process.kill(pid, "SIGTERM");
196
- }
197
- catch {
198
- return false;
199
- }
200
- for (let i = 0; i < 50; i++) {
201
- try {
202
- process.kill(pid, 0);
203
- }
204
- catch {
205
- return true;
206
- }
207
- spawnSync("sleep", ["0.1"]);
208
- }
209
- // Re-check identity before escalating: over five seconds the daemon could
210
- // have exited and its pid been handed to something else. Only a confirmed
211
- // daemon gets SIGKILL — "unknown" is not good enough to kill on.
212
- if (identifyProcess(pid) === "daemon") {
213
- try {
214
- process.kill(pid, "SIGKILL");
215
- }
216
- catch { }
217
- }
218
- else {
219
- out(` ! pid ${pid} did not exit and can no longer be confirmed as the daemon — not forcing it`);
220
- }
221
- return true;
222
- }
223
- // Spawning only proves node launched. The daemon exits non-zero when there is
224
- // no saved session, so wait for it to claim the pid file before reporting it up.
225
- function startDaemonDetached() {
226
- let child;
227
- try {
228
- ensureDirs();
229
- const logFd = fs.openSync(DAEMON_LOG, "a");
230
- child = spawn(process.execPath, [DAEMON_JS], {
231
- detached: true,
232
- stdio: ["ignore", logFd, logFd],
233
- });
234
- child.unref();
235
- fs.closeSync(logFd);
236
- }
237
- catch (err) {
238
- out(` ! could not start the daemon: ${err instanceof Error ? err.message : String(err)}`);
239
- return false;
240
- }
241
- for (let i = 0; i < 50; i++) {
242
- if (readDaemonPid() === child.pid) {
243
- out(` ✓ daemon started (pid ${child.pid}), logging to ${DAEMON_LOG}`);
244
- return true;
245
- }
246
- spawnSync("sleep", ["0.1"]);
247
- }
248
- out(` ! the daemon exited during startup — check ${DAEMON_LOG}`);
249
- out(" (a missing WeChat login is the usual cause: run `wechat-claude login`)");
250
- return false;
251
- }
252
- function daemon(sub) {
131
+ async function daemon(sub) {
253
132
  switch (sub) {
254
133
  case undefined:
255
134
  case "run": {
256
135
  // Foreground: replace this process's stdio with the daemon's.
257
- const r = spawnSync(process.execPath, [DAEMON_JS], { stdio: "inherit" });
136
+ const r = spawnSync(process.execPath, [DAEMON_PATH], { stdio: "inherit" });
258
137
  return r.status ?? 1;
259
138
  }
139
+ case "start":
140
+ // `wechat-claude daemon` runs in the foreground and dies with the
141
+ // terminal; "start" is the one people reach for when they mean "run it
142
+ // as a service", and it used to be an unknown command.
143
+ return (await ensureDaemonRunning(out)) ? 0 : 1;
144
+ case "stop": {
145
+ // Under launchd, killing the process achieves nothing: KeepAlive
146
+ // restarts it. Unload the job instead — the plist stays on disk, so it
147
+ // comes back at the next login, or right away with `daemon start`.
148
+ if (launchd.isMac() && launchd.isLoaded()) {
149
+ const ok = launchd.unload();
150
+ out(ok
151
+ ? " ✓ launchd service stopped (returns at next login, or `wechat-claude daemon start`)"
152
+ : " ! launchctl unload failed");
153
+ return ok ? 0 : 1;
154
+ }
155
+ if (await stopDaemon(out))
156
+ out(" ✓ daemon stopped");
157
+ else
158
+ out(" • no daemon was running");
159
+ return 0;
160
+ }
260
161
  case "install": {
261
162
  if (!launchd.isMac()) {
262
163
  out("launchd is macOS-only. On Linux/Windows, supervise the daemon");
@@ -269,7 +170,7 @@ function daemon(sub) {
269
170
  // daemon's pid-file guard and exits 0 — and KeepAlive.SuccessfulExit
270
171
  // false means launchd never retries, so the job supervises nothing while
271
172
  // still reporting success.
272
- if (stopDaemon())
173
+ if (await stopDaemon(out))
273
174
  out(" ✓ stopped the existing daemon so launchd can own it");
274
175
  const ok = launchd.load();
275
176
  out(ok ? " ✓ service loaded (starts at login, restarts on crash)" : " ! launchctl load failed");
@@ -284,11 +185,11 @@ function daemon(sub) {
284
185
  out(ok ? " ✓ launchd service restarted" : " ! launchctl reload failed");
285
186
  return ok ? 0 : 1;
286
187
  }
287
- if (stopDaemon())
188
+ if (await stopDaemon(out))
288
189
  out(" ✓ stopped the running daemon");
289
190
  else
290
191
  out(" • no daemon was running");
291
- return startDaemonDetached() ? 0 : 1;
192
+ return (await spawnDaemonDetached(out)) ? 0 : 1;
292
193
  }
293
194
  case "uninstall": {
294
195
  if (!launchd.isMac()) {
@@ -306,18 +207,18 @@ function daemon(sub) {
306
207
  return 0;
307
208
  }
308
209
  case "status": {
309
- out(`Daemon running: ${daemonRunning() ? "yes" : "no"}`);
210
+ out(`Daemon running: ${isDaemonRunning() ? "yes" : "no"}`);
310
211
  if (launchd.isMac())
311
212
  out(`launchd service: ${launchd.isLoaded() ? "loaded" : "not loaded"}`);
312
213
  return 0;
313
214
  }
314
215
  case "log": {
315
- const r = spawnSync("tail", ["-f", DAEMON_LOG], { stdio: "inherit" });
216
+ const r = spawnSync("tail", ["-f", DAEMON_LOG_FILE], { stdio: "inherit" });
316
217
  return r.status ?? 1;
317
218
  }
318
219
  default:
319
220
  out(`Unknown daemon command: ${sub}`);
320
- out("Usage: wechat-claude daemon [run|restart|install|uninstall|status|log]");
221
+ out("Usage: wechat-claude daemon [run|start|stop|restart|install|uninstall|status|log]");
321
222
  return 1;
322
223
  }
323
224
  }
@@ -328,6 +229,8 @@ function usage() {
328
229
  out(" wechat-claude login (re)authenticate by scanning a QR code");
329
230
  out(" wechat-claude status show daemon / login state");
330
231
  out(" wechat-claude daemon run the daemon in the foreground");
232
+ out(" wechat-claude daemon start start it in the background");
233
+ out(" wechat-claude daemon stop stop it (launchd job included)");
331
234
  out(" wechat-claude daemon restart restart it (use after an upgrade)");
332
235
  out(" wechat-claude daemon install install it as a launchd service (macOS)");
333
236
  out(" wechat-claude daemon uninstall remove the launchd service");
@@ -346,10 +249,15 @@ async function main() {
346
249
  const ok = await login();
347
250
  out("");
348
251
  if (ok) {
349
- out("Setup complete. Next steps:");
350
- out(" 1. Start the daemon: wechat-claude daemon install (auto-start, macOS)");
351
- out(" wechat-claude daemon (foreground)");
352
- out(" 2. In a Claude Code session, type: /wechat");
252
+ const started = await restartDaemonForNewLogin(out);
253
+ out("");
254
+ out("Setup complete. Next step:");
255
+ out(" In a Claude Code session, type: /wechat");
256
+ if (started && !launchd.isInstalled()) {
257
+ out("");
258
+ out("The daemon is running, but only until this machine restarts.");
259
+ out("To keep it running: wechat-claude daemon install (macOS)");
260
+ }
353
261
  }
354
262
  else {
355
263
  out("Setup finished with login pending — run `wechat-claude login` to retry.");
@@ -357,13 +265,17 @@ async function main() {
357
265
  break;
358
266
  }
359
267
  case "login":
360
- await login();
268
+ // The daemon is the half of the system that receives messages, and it
269
+ // exits when there is no login — so the one moment it is worth starting
270
+ // is right after a login succeeds.
271
+ if (await login())
272
+ await restartDaemonForNewLogin(out);
361
273
  break;
362
274
  case "status":
363
275
  status();
364
276
  break;
365
277
  case "daemon":
366
- process.exitCode = daemon(process.argv[3]);
278
+ process.exitCode = await daemon(process.argv[3]);
367
279
  break;
368
280
  default:
369
281
  usage();
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const DAEMON_PATH: string;
2
+ export type Notice = (line: string) => void;
3
+ export declare function daemonPid(note?: Notice): number | undefined;
4
+ export declare function isDaemonRunning(): boolean;
5
+ export declare function stopDaemon(note?: Notice): Promise<boolean>;
6
+ export declare function spawnDaemonDetached(note?: Notice): Promise<boolean>;
7
+ export declare function ensureDaemonRunning(note?: Notice): Promise<boolean>;
8
+ export declare function restartDaemonForNewLogin(note?: Notice): Promise<boolean>;
@@ -0,0 +1,173 @@
1
+ // Starting, stopping and replacing the poller — shared by the CLI and the MCP
2
+ // server, which both have to do it and must agree on the rules. The one that
3
+ // matters most: after a login, whatever is already polling holds the *old*
4
+ // credential (the daemon reads session.json once, at startup), so a login has
5
+ // to replace it rather than leave it running.
6
+ import { spawn, spawnSync } from "node:child_process";
7
+ import fs from "node:fs";
8
+ import { fileURLToPath } from "node:url";
9
+ import * as launchd from "./launchd.js";
10
+ import { DAEMON_LOG_FILE, DAEMON_PID_FILE, ensureDirs } from "./paths.js";
11
+ export const DAEMON_PATH = fileURLToPath(new URL("./daemon.js", import.meta.url));
12
+ const silent = () => { };
13
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
14
+ function identifyProcess(pid) {
15
+ if (process.platform === "win32")
16
+ return "unknown"; // no ps
17
+ const r = spawnSync("ps", ["-o", "command=", "-p", String(pid)], {
18
+ stdio: ["ignore", "pipe", "ignore"],
19
+ });
20
+ // A missing/broken ps is "unknown"; ps running and finding nothing is a real
21
+ // answer, but the caller only asks about pids it has already seen alive.
22
+ if (r.error)
23
+ return "unknown";
24
+ if (r.status !== 0)
25
+ return "other";
26
+ const cmd = (r.stdout ?? "").toString().trim();
27
+ if (cmd === "")
28
+ return "unknown";
29
+ // Match any install's daemon.js, not just this one: after an upgrade the
30
+ // running daemon legitimately comes from the previous install path.
31
+ return /\bnode\b/.test(cmd) && /daemon\.js(\s|$)/.test(cmd) ? "daemon" : "other";
32
+ }
33
+ // The daemon's pid, or undefined when the pid file is absent or stale. Removes
34
+ // a stale file so the next reader is not misled by it.
35
+ export function daemonPid(note = silent) {
36
+ let pid;
37
+ try {
38
+ pid = parseInt(fs.readFileSync(DAEMON_PID_FILE, "utf-8").trim(), 10);
39
+ }
40
+ catch {
41
+ return undefined;
42
+ }
43
+ if (!Number.isFinite(pid) || pid <= 0)
44
+ return undefined;
45
+ try {
46
+ process.kill(pid, 0);
47
+ }
48
+ catch {
49
+ try {
50
+ fs.unlinkSync(DAEMON_PID_FILE);
51
+ }
52
+ catch { }
53
+ return undefined;
54
+ }
55
+ if (identifyProcess(pid) === "other") {
56
+ note(` ! pid file points at pid ${pid}, which is not a wechat-claude daemon — ignoring it`);
57
+ try {
58
+ fs.unlinkSync(DAEMON_PID_FILE);
59
+ }
60
+ catch { }
61
+ return undefined;
62
+ }
63
+ // "unknown" (Windows, or no usable ps) falls through: an unverifiable pid is
64
+ // still the best information we have, and treating it as stale would delete
65
+ // a live daemon's pid file and let a second poller start.
66
+ return pid;
67
+ }
68
+ export function isDaemonRunning() {
69
+ return daemonPid() !== undefined;
70
+ }
71
+ export async function stopDaemon(note = silent) {
72
+ const pid = daemonPid(note);
73
+ if (pid === undefined)
74
+ return false;
75
+ try {
76
+ process.kill(pid, "SIGTERM");
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ for (let i = 0; i < 50; i++) {
82
+ try {
83
+ process.kill(pid, 0);
84
+ }
85
+ catch {
86
+ return true;
87
+ }
88
+ await sleep(100);
89
+ }
90
+ // Re-check identity before escalating: over five seconds the daemon could
91
+ // have exited and its pid been handed to something else. Only a confirmed
92
+ // daemon gets SIGKILL — "unknown" is not good enough to kill on.
93
+ if (identifyProcess(pid) === "daemon") {
94
+ try {
95
+ process.kill(pid, "SIGKILL");
96
+ }
97
+ catch { }
98
+ }
99
+ else {
100
+ note(` ! pid ${pid} did not exit and can no longer be confirmed as the daemon — not forcing it`);
101
+ }
102
+ return true;
103
+ }
104
+ // Spawning only proves node launched. The daemon exits non-zero when there is
105
+ // no saved session, so wait for it to claim the pid file before reporting it up.
106
+ export async function spawnDaemonDetached(note = silent) {
107
+ let child;
108
+ try {
109
+ ensureDirs();
110
+ const logFd = fs.openSync(DAEMON_LOG_FILE, "a");
111
+ child = spawn(process.execPath, [DAEMON_PATH], {
112
+ detached: true,
113
+ stdio: ["ignore", logFd, logFd],
114
+ });
115
+ child.unref();
116
+ fs.closeSync(logFd);
117
+ }
118
+ catch (err) {
119
+ note(` ! could not start the daemon: ${err instanceof Error ? err.message : String(err)}`);
120
+ return false;
121
+ }
122
+ for (let i = 0; i < 50; i++) {
123
+ if (daemonPid() === child.pid) {
124
+ note(` ✓ daemon started (pid ${child.pid}), logging to ${DAEMON_LOG_FILE}`);
125
+ return true;
126
+ }
127
+ await sleep(100);
128
+ }
129
+ note(` ! the daemon exited during startup — check ${DAEMON_LOG_FILE}`);
130
+ note(" (a missing WeChat login is the usual cause: run `wechat-claude login`)");
131
+ return false;
132
+ }
133
+ // Whether launchd should be the one doing the starting. Keyed on the plist
134
+ // being installed, not on the job being loaded: after `daemon stop` the job is
135
+ // unloaded but still installed, and starting an unsupervised process then
136
+ // would quietly cost the user auto-start and crash-restart. load() handles a
137
+ // job that is already loaded as well as one that is not.
138
+ function launchdOwnsIt() {
139
+ return launchd.isMac() && launchd.isInstalled();
140
+ }
141
+ // Make sure something is polling, without disturbing a daemon that already is.
142
+ export async function ensureDaemonRunning(note = silent) {
143
+ if (isDaemonRunning()) {
144
+ note(" • daemon already running");
145
+ return true;
146
+ }
147
+ if (launchdOwnsIt()) {
148
+ const ok = launchd.load();
149
+ note(ok ? " ✓ launchd service started" : " ! launchctl load failed");
150
+ return ok;
151
+ }
152
+ return spawnDaemonDetached(note);
153
+ }
154
+ // Replace whatever is polling, because the credential just changed.
155
+ //
156
+ // A running daemon read session.json once, at startup, and never re-reads it:
157
+ // after a re-login it would keep polling with the old token, and when that is
158
+ // rejected it exits — leaving the fresh login with no poller at all.
159
+ export async function restartDaemonForNewLogin(note = silent) {
160
+ if (launchdOwnsIt()) {
161
+ // load() unloads first, so this replaces the running job.
162
+ const ok = launchd.load();
163
+ note(ok
164
+ ? " ✓ launchd service restarted with the new login"
165
+ : " ! launchctl load failed");
166
+ return ok;
167
+ }
168
+ if (await stopDaemon(note)) {
169
+ note(" • stopped the daemon still holding the old login");
170
+ }
171
+ return spawnDaemonDetached(note);
172
+ }
173
+ //# sourceMappingURL=daemon-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-control.js","sourceRoot":"","sources":["../src/daemon-control.ts"],"names":[],"mappings":"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"}