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 +19 -1
- package/README.md +15 -1
- package/dist/cli.js +54 -142
- package/dist/cli.js.map +1 -1
- package/dist/daemon-control.d.ts +8 -0
- package/dist/daemon-control.js +173 -0
- package/dist/daemon-control.js.map +1 -0
- package/dist/daemon.js +19 -4
- package/dist/daemon.js.map +1 -1
- package/dist/health.d.ts +9 -0
- package/dist/health.js +42 -0
- package/dist/health.js.map +1 -0
- package/dist/ilink.d.ts +6 -0
- package/dist/ilink.js +124 -18
- package/dist/ilink.js.map +1 -1
- package/dist/launchd.d.ts +1 -0
- package/dist/launchd.js +6 -0
- package/dist/launchd.js.map +1 -1
- package/dist/login-state.d.ts +17 -0
- package/dist/login-state.js +66 -0
- package/dist/login-state.js.map +1 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.js +4 -0
- package/dist/paths.js.map +1 -1
- package/dist/server.js +126 -82
- package/dist/server.js.map +1 -1
- package/dist/sessions.d.ts +12 -0
- package/dist/sessions.js +86 -2
- package/dist/sessions.js.map +1 -1
- package/dist/watch-inbox.js +41 -15
- package/dist/watch-inbox.js.map +1 -1
- package/package.json +1 -1
- package/templates/wechat.md +8 -1
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 {
|
|
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 {
|
|
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: ${
|
|
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 (!
|
|
128
|
+
else if (!isDaemonRunning())
|
|
186
129
|
out("\nStart the daemon with `wechat-claude daemon` (or it auto-starts via /wechat).");
|
|
187
130
|
}
|
|
188
|
-
|
|
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, [
|
|
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
|
|
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: ${
|
|
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",
|
|
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
|
-
|
|
350
|
-
out("
|
|
351
|
-
out("
|
|
352
|
-
out("
|
|
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
|
-
|
|
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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"}
|