botmux 2.9.1 → 2.11.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 +39 -3
- package/README.md +34 -2
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +46 -15
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +2 -2
- package/dist/adapters/cli/shared-hints.js +2 -2
- package/dist/autostart.d.ts +14 -0
- package/dist/autostart.d.ts.map +1 -0
- package/dist/autostart.js +357 -0
- package/dist/autostart.js.map +1 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +2 -3
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.js +32 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +69 -62
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/worker-pool.js +1 -1
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +69 -38
- package/dist/daemon.js.map +1 -1
- package/dist/im/lark/card-handler.js +1 -1
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +1 -1
- package/dist/im/lark/event-dispatcher.js +1 -1
- package/dist/im/lark/forwarded-renderer.d.ts +23 -0
- package/dist/im/lark/forwarded-renderer.d.ts.map +1 -0
- package/dist/im/lark/forwarded-renderer.js +105 -0
- package/dist/im/lark/forwarded-renderer.js.map +1 -0
- package/dist/services/session-store.js +4 -4
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +22 -6
- package/dist/skills/definitions.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +2 -3
- package/dist/utils/logger.js.map +1 -1
- package/dist/worker.js +8 -6
- package/dist/worker.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boot-time autostart integration for the botmux daemon.
|
|
3
|
+
*
|
|
4
|
+
* macOS — installs a LaunchAgent at ~/Library/LaunchAgents/com.botmux.daemon.plist
|
|
5
|
+
* and bootstraps it into the GUI domain (no sudo).
|
|
6
|
+
* Linux — installs a user systemd unit at ~/.config/systemd/user/botmux.service
|
|
7
|
+
* and enables it (no sudo). Reminds the user to run
|
|
8
|
+
* `loginctl enable-linger` if the unit needs to survive logout.
|
|
9
|
+
*
|
|
10
|
+
* The unit invokes `node <PKG_ROOT>/dist/cli.js start`, which goes through
|
|
11
|
+
* the same pm2 path as `botmux start`. PATH from the install-time shell is
|
|
12
|
+
* captured into the unit so node-pty / claude / codex resolve correctly when
|
|
13
|
+
* launchd or systemd starts us with a minimal environment.
|
|
14
|
+
*/
|
|
15
|
+
import { spawnSync } from 'node:child_process';
|
|
16
|
+
import { existsSync, mkdirSync, writeFileSync, unlinkSync, readFileSync } from 'node:fs';
|
|
17
|
+
import { homedir, userInfo } from 'node:os';
|
|
18
|
+
import { join, dirname } from 'node:path';
|
|
19
|
+
const LABEL = 'com.botmux.daemon';
|
|
20
|
+
const SERVICE_NAME = 'botmux.service';
|
|
21
|
+
function platform() {
|
|
22
|
+
if (process.platform === 'darwin')
|
|
23
|
+
return 'macos';
|
|
24
|
+
if (process.platform === 'linux')
|
|
25
|
+
return 'linux';
|
|
26
|
+
return 'unsupported';
|
|
27
|
+
}
|
|
28
|
+
function escapeXml(s) {
|
|
29
|
+
return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
30
|
+
}
|
|
31
|
+
function plistPath() {
|
|
32
|
+
return join(homedir(), 'Library', 'LaunchAgents', `${LABEL}.plist`);
|
|
33
|
+
}
|
|
34
|
+
function unitPath() {
|
|
35
|
+
return join(homedir(), '.config', 'systemd', 'user', SERVICE_NAME);
|
|
36
|
+
}
|
|
37
|
+
function nodeBin() {
|
|
38
|
+
// process.execPath is the Node binary that's currently running cli.js.
|
|
39
|
+
// Using its absolute path means launchd/systemd doesn't have to resolve
|
|
40
|
+
// `node` from a stripped PATH (and we keep the same Node version the
|
|
41
|
+
// user installed botmux under, which matters for native modules like
|
|
42
|
+
// node-pty).
|
|
43
|
+
return process.execPath;
|
|
44
|
+
}
|
|
45
|
+
function cliJs(opts) {
|
|
46
|
+
return join(opts.pkgRoot, 'dist', 'cli.js');
|
|
47
|
+
}
|
|
48
|
+
function currentPath() {
|
|
49
|
+
// Capture PATH from the install-time shell so the unit can find any
|
|
50
|
+
// binaries the user expects (node-pty's `node`, the AI CLI binaries,
|
|
51
|
+
// tmux, etc.). Falls back to a sane default if PATH is empty.
|
|
52
|
+
const p = process.env.PATH || '';
|
|
53
|
+
if (p)
|
|
54
|
+
return p;
|
|
55
|
+
return process.platform === 'darwin'
|
|
56
|
+
? '/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin'
|
|
57
|
+
: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin';
|
|
58
|
+
}
|
|
59
|
+
// ─── macOS (launchd) ─────────────────────────────────────────────────────────
|
|
60
|
+
function plistContent(opts) {
|
|
61
|
+
const node = escapeXml(nodeBin());
|
|
62
|
+
const cli = escapeXml(cliJs(opts));
|
|
63
|
+
const cwd = escapeXml(opts.configDir);
|
|
64
|
+
const path = escapeXml(currentPath());
|
|
65
|
+
const outLog = escapeXml(join(opts.logDir, 'autostart-out.log'));
|
|
66
|
+
const errLog = escapeXml(join(opts.logDir, 'autostart-err.log'));
|
|
67
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
68
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
69
|
+
<plist version="1.0">
|
|
70
|
+
<dict>
|
|
71
|
+
<key>Label</key>
|
|
72
|
+
<string>${LABEL}</string>
|
|
73
|
+
<key>ProgramArguments</key>
|
|
74
|
+
<array>
|
|
75
|
+
<string>${node}</string>
|
|
76
|
+
<string>${cli}</string>
|
|
77
|
+
<string>start</string>
|
|
78
|
+
</array>
|
|
79
|
+
<key>RunAtLoad</key>
|
|
80
|
+
<true/>
|
|
81
|
+
<key>KeepAlive</key>
|
|
82
|
+
<false/>
|
|
83
|
+
<key>WorkingDirectory</key>
|
|
84
|
+
<string>${cwd}</string>
|
|
85
|
+
<key>EnvironmentVariables</key>
|
|
86
|
+
<dict>
|
|
87
|
+
<key>PATH</key>
|
|
88
|
+
<string>${path}</string>
|
|
89
|
+
</dict>
|
|
90
|
+
<key>StandardOutPath</key>
|
|
91
|
+
<string>${outLog}</string>
|
|
92
|
+
<key>StandardErrorPath</key>
|
|
93
|
+
<string>${errLog}</string>
|
|
94
|
+
</dict>
|
|
95
|
+
</plist>
|
|
96
|
+
`;
|
|
97
|
+
}
|
|
98
|
+
function launchctlBootstrap(plist) {
|
|
99
|
+
// `launchctl bootstrap` is the modern replacement for `launchctl load -w`.
|
|
100
|
+
// Falls back to the legacy form on older macOS where bootstrap is missing.
|
|
101
|
+
const uid = userInfo().uid;
|
|
102
|
+
const r = spawnSync('launchctl', ['bootstrap', `gui/${uid}`, plist], { stdio: 'pipe' });
|
|
103
|
+
if (r.status === 0)
|
|
104
|
+
return true;
|
|
105
|
+
const r2 = spawnSync('launchctl', ['load', '-w', plist], { stdio: 'pipe' });
|
|
106
|
+
return r2.status === 0;
|
|
107
|
+
}
|
|
108
|
+
function launchctlBootout() {
|
|
109
|
+
const uid = userInfo().uid;
|
|
110
|
+
const r = spawnSync('launchctl', ['bootout', `gui/${uid}/${LABEL}`], { stdio: 'pipe' });
|
|
111
|
+
if (r.status === 0)
|
|
112
|
+
return true;
|
|
113
|
+
const r2 = spawnSync('launchctl', ['unload', '-w', plistPath()], { stdio: 'pipe' });
|
|
114
|
+
return r2.status === 0;
|
|
115
|
+
}
|
|
116
|
+
function launchctlIsLoaded() {
|
|
117
|
+
const uid = userInfo().uid;
|
|
118
|
+
const r = spawnSync('launchctl', ['print', `gui/${uid}/${LABEL}`], { stdio: 'pipe' });
|
|
119
|
+
return r.status === 0;
|
|
120
|
+
}
|
|
121
|
+
function enableMac(opts) {
|
|
122
|
+
const path = plistPath();
|
|
123
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
124
|
+
mkdirSync(opts.logDir, { recursive: true });
|
|
125
|
+
writeFileSync(path, plistContent(opts));
|
|
126
|
+
console.log(`✅ 已写入 LaunchAgent: ${path}`);
|
|
127
|
+
// We deliberately do NOT bootstrap here — bootstrap on a RunAtLoad=true plist
|
|
128
|
+
// would immediately fire `botmux start`, which surprises users who just
|
|
129
|
+
// wanted to register autostart. launchd reads ~/Library/LaunchAgents/*.plist
|
|
130
|
+
// at the next login and starts the agent then.
|
|
131
|
+
if (launchctlIsLoaded()) {
|
|
132
|
+
// If a previous version was already loaded, reload it so the freshly
|
|
133
|
+
// written plist (with possibly updated paths) takes effect immediately.
|
|
134
|
+
launchctlBootout();
|
|
135
|
+
if (launchctlBootstrap(path)) {
|
|
136
|
+
console.log(`✅ 已重新加载到 launchd (路径已更新)`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.log(` 下次登录时自动启动。立即启动: botmux start`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function disableMac() {
|
|
144
|
+
const path = plistPath();
|
|
145
|
+
// bootout removes the agent from launchd's registry. Because the LaunchAgent's
|
|
146
|
+
// ExecStart (`botmux start`) is fire-and-forget — pm2 forks away and the
|
|
147
|
+
// launched process exits immediately — there is no live process for bootout
|
|
148
|
+
// to kill. The pm2 daemon keeps running. To stop the daemon, the user runs
|
|
149
|
+
// `botmux stop` explicitly.
|
|
150
|
+
if (launchctlIsLoaded()) {
|
|
151
|
+
if (launchctlBootout())
|
|
152
|
+
console.log(`✅ 已从 launchd 卸载 ${LABEL}`);
|
|
153
|
+
else
|
|
154
|
+
console.warn(`⚠️ launchctl 卸载失败,继续删除 plist`);
|
|
155
|
+
}
|
|
156
|
+
if (existsSync(path)) {
|
|
157
|
+
unlinkSync(path);
|
|
158
|
+
console.log(`✅ 已删除 ${path}`);
|
|
159
|
+
console.log(` pm2 daemon 仍在运行;要停止请跑 botmux stop`);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
console.log(`ℹ️ ${path} 不存在,无需删除`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function statusMac() {
|
|
166
|
+
const path = plistPath();
|
|
167
|
+
const loaded = launchctlIsLoaded();
|
|
168
|
+
console.log(`平台: macOS (launchd)`);
|
|
169
|
+
console.log(`Plist 路径: ${path}`);
|
|
170
|
+
console.log(`Plist 存在: ${existsSync(path) ? 'yes' : 'no'}`);
|
|
171
|
+
console.log(`launchd 已加载: ${loaded ? 'yes' : 'no'}`);
|
|
172
|
+
if (existsSync(path) && !loaded) {
|
|
173
|
+
console.log(`提示: plist 存在但未加载,运行 botmux autostart enable 重新激活`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// ─── Linux (user systemd) ────────────────────────────────────────────────────
|
|
177
|
+
function unitContent(opts) {
|
|
178
|
+
// Type=oneshot + RemainAfterExit=yes because `botmux start` calls pm2
|
|
179
|
+
// start which forks and returns immediately; without RemainAfterExit
|
|
180
|
+
// systemd would consider the unit "inactive (dead)" right after launch.
|
|
181
|
+
return `[Unit]
|
|
182
|
+
Description=botmux daemon (IM <-> AI coding CLI bridge)
|
|
183
|
+
After=network-online.target
|
|
184
|
+
Wants=network-online.target
|
|
185
|
+
|
|
186
|
+
[Service]
|
|
187
|
+
Type=oneshot
|
|
188
|
+
RemainAfterExit=yes
|
|
189
|
+
WorkingDirectory=${opts.configDir}
|
|
190
|
+
Environment=PATH=${currentPath()}
|
|
191
|
+
ExecStart=${nodeBin()} ${cliJs(opts)} start
|
|
192
|
+
ExecStop=${nodeBin()} ${cliJs(opts)} stop
|
|
193
|
+
|
|
194
|
+
[Install]
|
|
195
|
+
WantedBy=default.target
|
|
196
|
+
`;
|
|
197
|
+
}
|
|
198
|
+
function userSystemdAvailable() {
|
|
199
|
+
// Check the user manager is reachable. In containers / sshd-without-DBus
|
|
200
|
+
// sessions `systemctl --user` will fail with "Failed to connect to bus".
|
|
201
|
+
const r = spawnSync('systemctl', ['--user', 'show-environment'], { stdio: 'pipe' });
|
|
202
|
+
return r.status === 0;
|
|
203
|
+
}
|
|
204
|
+
function lingerEnabled() {
|
|
205
|
+
const username = userInfo().username;
|
|
206
|
+
const r = spawnSync('loginctl', ['show-user', username, '--property=Linger'], { stdio: 'pipe' });
|
|
207
|
+
if (r.status !== 0)
|
|
208
|
+
return false;
|
|
209
|
+
return r.stdout.toString().trim().endsWith('=yes');
|
|
210
|
+
}
|
|
211
|
+
function enableLinux(opts) {
|
|
212
|
+
if (!userSystemdAvailable()) {
|
|
213
|
+
console.error(`❌ 当前会话连不上 user systemd(缺少 DBus / 容器环境)。`);
|
|
214
|
+
console.error(``);
|
|
215
|
+
console.error(` 回退方案:把下面这条写入系统级 cron / rc.local / 你常用的 init:`);
|
|
216
|
+
console.error(` ${nodeBin()} ${cliJs(opts)} start`);
|
|
217
|
+
console.error(``);
|
|
218
|
+
console.error(` 或在有 systemd --user 的桌面环境里再次运行 botmux autostart enable。`);
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
const path = unitPath();
|
|
222
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
223
|
+
writeFileSync(path, unitContent(opts));
|
|
224
|
+
console.log(`✅ 已写入 systemd unit: ${path}`);
|
|
225
|
+
const reload = spawnSync('systemctl', ['--user', 'daemon-reload'], { stdio: 'pipe' });
|
|
226
|
+
if (reload.status !== 0) {
|
|
227
|
+
console.error(`❌ systemctl --user daemon-reload 失败:`);
|
|
228
|
+
console.error(reload.stderr.toString());
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
// No `--now` here on purpose: enable should only register the autostart hook,
|
|
232
|
+
// not interfere with whatever daemon state the user already has. Daemon
|
|
233
|
+
// lifecycle stays under `botmux start`/`stop`. The unit will trigger on next
|
|
234
|
+
// boot via WantedBy=default.target.
|
|
235
|
+
const en = spawnSync('systemctl', ['--user', 'enable', SERVICE_NAME], { stdio: 'pipe' });
|
|
236
|
+
if (en.status !== 0) {
|
|
237
|
+
console.error(`❌ systemctl --user enable 失败:`);
|
|
238
|
+
console.error(en.stderr.toString());
|
|
239
|
+
process.exit(1);
|
|
240
|
+
}
|
|
241
|
+
console.log(`✅ 已启用 ${SERVICE_NAME}`);
|
|
242
|
+
console.log(` 下次开机自动启动。立即启动: botmux start`);
|
|
243
|
+
if (!lingerEnabled()) {
|
|
244
|
+
const username = userInfo().username;
|
|
245
|
+
console.log(``);
|
|
246
|
+
console.log(`⚠️ Linger 未启用:登出当前会话后服务会停止。`);
|
|
247
|
+
console.log(` 要让服务跨登出/重启常驻,运行(需要 sudo):`);
|
|
248
|
+
console.log(` sudo loginctl enable-linger ${username}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function disableLinux() {
|
|
252
|
+
if (!userSystemdAvailable()) {
|
|
253
|
+
console.error(`❌ 当前会话连不上 user systemd。`);
|
|
254
|
+
console.error(` 如曾手工创建过 unit,请手动 rm: ${unitPath()}`);
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
const path = unitPath();
|
|
258
|
+
// No `--now`: only undo the boot hook. Without --now systemd skips ExecStop,
|
|
259
|
+
// so the running pm2 daemon is left untouched. To stop it, the user runs
|
|
260
|
+
// `botmux stop` (or `systemctl --user stop botmux.service` for a clean
|
|
261
|
+
// ExecStop-mediated shutdown) explicitly.
|
|
262
|
+
const dis = spawnSync('systemctl', ['--user', 'disable', SERVICE_NAME], { stdio: 'pipe' });
|
|
263
|
+
if (dis.status === 0)
|
|
264
|
+
console.log(`✅ 已禁用 ${SERVICE_NAME}`);
|
|
265
|
+
else
|
|
266
|
+
console.warn(`⚠️ disable 返回非零(可能本来就未启用)`);
|
|
267
|
+
if (existsSync(path)) {
|
|
268
|
+
unlinkSync(path);
|
|
269
|
+
console.log(`✅ 已删除 ${path}`);
|
|
270
|
+
spawnSync('systemctl', ['--user', 'daemon-reload'], { stdio: 'pipe' });
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
console.log(`ℹ️ ${path} 不存在`);
|
|
274
|
+
}
|
|
275
|
+
console.log(` pm2 daemon 仍在运行;要停止请跑 botmux stop`);
|
|
276
|
+
}
|
|
277
|
+
function statusLinux() {
|
|
278
|
+
const path = unitPath();
|
|
279
|
+
console.log(`平台: Linux (user systemd)`);
|
|
280
|
+
console.log(`Unit 路径: ${path}`);
|
|
281
|
+
console.log(`Unit 存在: ${existsSync(path) ? 'yes' : 'no'}`);
|
|
282
|
+
if (!userSystemdAvailable()) {
|
|
283
|
+
console.log(`user systemd: 不可用(缺少 DBus / 容器环境)`);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
const isEnabled = spawnSync('systemctl', ['--user', 'is-enabled', SERVICE_NAME], { stdio: 'pipe' });
|
|
287
|
+
const isActive = spawnSync('systemctl', ['--user', 'is-active', SERVICE_NAME], { stdio: 'pipe' });
|
|
288
|
+
console.log(`enabled: ${isEnabled.stdout.toString().trim() || isEnabled.stderr.toString().trim()}`);
|
|
289
|
+
console.log(`active: ${isActive.stdout.toString().trim() || isActive.stderr.toString().trim()}`);
|
|
290
|
+
console.log(`Linger: ${lingerEnabled() ? 'yes' : 'no(登出后服务会停)'}`);
|
|
291
|
+
}
|
|
292
|
+
// ─── Public dispatch ─────────────────────────────────────────────────────────
|
|
293
|
+
export function enableAutostart(opts) {
|
|
294
|
+
switch (platform()) {
|
|
295
|
+
case 'macos': return enableMac(opts);
|
|
296
|
+
case 'linux': return enableLinux(opts);
|
|
297
|
+
default:
|
|
298
|
+
console.error(`❌ 当前平台 ${process.platform} 暂不支持 botmux autostart。`);
|
|
299
|
+
console.error(` Windows 用户可用任务计划程序 (Task Scheduler) 调用:`);
|
|
300
|
+
console.error(` ${nodeBin()} ${cliJs(opts)} start`);
|
|
301
|
+
process.exit(1);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
export function disableAutostart(_opts) {
|
|
305
|
+
switch (platform()) {
|
|
306
|
+
case 'macos': return disableMac();
|
|
307
|
+
case 'linux': return disableLinux();
|
|
308
|
+
default:
|
|
309
|
+
console.error(`❌ 当前平台 ${process.platform} 暂不支持 botmux autostart。`);
|
|
310
|
+
process.exit(1);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
export function autostartStatus(_opts) {
|
|
314
|
+
switch (platform()) {
|
|
315
|
+
case 'macos': return statusMac();
|
|
316
|
+
case 'linux': return statusLinux();
|
|
317
|
+
default:
|
|
318
|
+
console.log(`平台: ${process.platform} (不支持)`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/** Re-render the unit/plist file from the current paths without touching enable/disable state. */
|
|
322
|
+
export function refreshAutostart(opts) {
|
|
323
|
+
switch (platform()) {
|
|
324
|
+
case 'macos': {
|
|
325
|
+
const path = plistPath();
|
|
326
|
+
if (!existsSync(path))
|
|
327
|
+
return false;
|
|
328
|
+
// Only rewrite if content changed, to avoid unnecessary launchctl reload.
|
|
329
|
+
const next = plistContent(opts);
|
|
330
|
+
const prev = readFileSync(path, 'utf-8');
|
|
331
|
+
if (prev === next)
|
|
332
|
+
return false;
|
|
333
|
+
writeFileSync(path, next);
|
|
334
|
+
if (launchctlIsLoaded()) {
|
|
335
|
+
launchctlBootout();
|
|
336
|
+
launchctlBootstrap(path);
|
|
337
|
+
}
|
|
338
|
+
return true;
|
|
339
|
+
}
|
|
340
|
+
case 'linux': {
|
|
341
|
+
const path = unitPath();
|
|
342
|
+
if (!existsSync(path))
|
|
343
|
+
return false;
|
|
344
|
+
const next = unitContent(opts);
|
|
345
|
+
const prev = readFileSync(path, 'utf-8');
|
|
346
|
+
if (prev === next)
|
|
347
|
+
return false;
|
|
348
|
+
writeFileSync(path, next);
|
|
349
|
+
if (userSystemdAvailable()) {
|
|
350
|
+
spawnSync('systemctl', ['--user', 'daemon-reload'], { stdio: 'pipe' });
|
|
351
|
+
}
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
default: return false;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=autostart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autostart.js","sourceRoot":"","sources":["../src/autostart.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-registry.d.ts","sourceRoot":"","sources":["../src/bot-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAIhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,sHAAsH;IACtH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6IAA6I;IAC7I,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAMD,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAExD;
|
|
1
|
+
{"version":3,"file":"bot-registry.d.ts","sourceRoot":"","sources":["../src/bot-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAIhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,sHAAsH;IACtH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6IAA6I;IAC7I,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAMD,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAExD;AAgBD,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,QAAQ,CAapD;AAED,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAMlD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAE3D;AAED,wBAAgB,UAAU,IAAI,QAAQ,EAAE,CAEvC;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAGxF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,SAAS,EAAE,CAsB5C"}
|
package/dist/bot-registry.js
CHANGED
|
@@ -8,9 +8,8 @@ let loadedConfigPath;
|
|
|
8
8
|
export function getLoadedConfigPath() {
|
|
9
9
|
return loadedConfigPath;
|
|
10
10
|
}
|
|
11
|
-
// Provide a custom logger that writes to stderr
|
|
12
|
-
//
|
|
13
|
-
// MCP stdio protocol when the server is spawned as an MCP child process.
|
|
11
|
+
// Provide a custom logger that writes to stderr — the default Lark SDK
|
|
12
|
+
// logger uses console.log, which would mix into stdout consumers.
|
|
14
13
|
function safeStringify(v) {
|
|
15
14
|
if (typeof v === 'string')
|
|
16
15
|
return v;
|
package/dist/bot-registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-registry.js","sourceRoot":"","sources":["../src/bot-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAkClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;AAEzC,sFAAsF;AACtF,IAAI,gBAAoC,CAAC;AACzC,MAAM,UAAU,mBAAmB;IACjC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"bot-registry.js","sourceRoot":"","sources":["../src/bot-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* botmux list --plain — plain table output (for piping / scripts)
|
|
15
15
|
* botmux delete <id> — close a session by ID prefix
|
|
16
16
|
* botmux delete all — close all active sessions
|
|
17
|
+
* botmux autostart enable|disable|status — manage boot-time autostart (launchd / user systemd)
|
|
17
18
|
*/
|
|
18
19
|
import { execSync, spawnSync, spawn } from 'node:child_process';
|
|
19
20
|
import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, readdirSync, readlinkSync } from 'node:fs';
|
|
@@ -22,6 +23,7 @@ import { homedir } from 'node:os';
|
|
|
22
23
|
import { fileURLToPath } from 'node:url';
|
|
23
24
|
import { createInterface } from 'node:readline';
|
|
24
25
|
import { createRequire } from 'node:module';
|
|
26
|
+
import { enableAutostart, disableAutostart, autostartStatus, refreshAutostart } from './autostart.js';
|
|
25
27
|
const __filename = fileURLToPath(import.meta.url);
|
|
26
28
|
const __dirname = dirname(__filename);
|
|
27
29
|
const require = createRequire(import.meta.url);
|
|
@@ -186,7 +188,9 @@ async function writeSingleBotConfig() {
|
|
|
186
188
|
rl.close();
|
|
187
189
|
writeFileSync(BOTS_JSON_FILE, JSON.stringify([bot], null, 2) + '\n');
|
|
188
190
|
console.log(`\n✅ 配置已写入: ${BOTS_JSON_FILE}`);
|
|
189
|
-
console.log(`\n
|
|
191
|
+
console.log(`\n下一步:`);
|
|
192
|
+
console.log(` 1. botmux start 启动 daemon(飞书后台配长连接前必须先启动)`);
|
|
193
|
+
console.log(` 2. botmux autostart enable 注册开机自启(推荐:${process.platform === 'darwin' ? 'mac launchd' : process.platform === 'linux' ? 'linux user systemd' : '当前平台暂不支持'},无需 sudo)`);
|
|
190
194
|
}
|
|
191
195
|
// ─── Commands ────────────────────────────────────────────────────────────────
|
|
192
196
|
async function cmdSetup() {
|
|
@@ -358,6 +362,11 @@ function cmdStart() {
|
|
|
358
362
|
console.log(`\n✅ daemon 已启动${count > 1 ? ` (${count} 个机器人, 每个独立进程)` : ''}`);
|
|
359
363
|
console.log(` 日志: botmux logs`);
|
|
360
364
|
console.log(` 状态: botmux status`);
|
|
365
|
+
// If the user previously enabled autostart, sync the unit file in case
|
|
366
|
+
// node/cli.js paths changed since (nvm switch, npm upgrade, etc.).
|
|
367
|
+
if (refreshAutostart({ pkgRoot: PKG_ROOT, configDir: CONFIG_DIR, logDir: LOG_DIR })) {
|
|
368
|
+
console.log(` autostart unit 已同步到当前 Node/cli.js 路径`);
|
|
369
|
+
}
|
|
361
370
|
}
|
|
362
371
|
/** Delete all pm2 processes matching botmux / botmux-* under the given PM2_HOME. */
|
|
363
372
|
function deleteAllBotmuxProcesses(home = PM2_HOME) {
|
|
@@ -455,6 +464,9 @@ function cmdRestart() {
|
|
|
455
464
|
deleteAllBotmuxProcesses();
|
|
456
465
|
const cfg = ecosystemConfig();
|
|
457
466
|
runPm2(['start', cfg]);
|
|
467
|
+
if (refreshAutostart({ pkgRoot: PKG_ROOT, configDir: CONFIG_DIR, logDir: LOG_DIR })) {
|
|
468
|
+
console.log(`autostart unit 已同步到当前 Node/cli.js 路径`);
|
|
469
|
+
}
|
|
458
470
|
}
|
|
459
471
|
/**
|
|
460
472
|
* If a legacy ~/.pm2 daemon with botmux processes still exists alongside our
|
|
@@ -1153,6 +1165,9 @@ botmux v${getVersion()} — IM ↔ AI 编程 CLI 桥接
|
|
|
1153
1165
|
delete <id> 关闭指定会话(支持 ID 前缀匹配)
|
|
1154
1166
|
delete all 关闭所有活跃会话
|
|
1155
1167
|
delete stopped 清理所有进程已退出的僵尸会话
|
|
1168
|
+
autostart enable 注册开机自启(macOS launchd / Linux user systemd,无需 sudo)
|
|
1169
|
+
autostart disable 注销开机自启
|
|
1170
|
+
autostart status 查看自启状态
|
|
1156
1171
|
|
|
1157
1172
|
定时任务(可在 CLI 会话内自动推断 chat):
|
|
1158
1173
|
schedule list 列出所有任务
|
|
@@ -2064,6 +2079,22 @@ switch (command) {
|
|
|
2064
2079
|
}
|
|
2065
2080
|
break;
|
|
2066
2081
|
}
|
|
2082
|
+
case 'autostart': {
|
|
2083
|
+
ensureConfigDir();
|
|
2084
|
+
const sub = process.argv[3] ?? 'status';
|
|
2085
|
+
const opts = { pkgRoot: PKG_ROOT, configDir: CONFIG_DIR, logDir: LOG_DIR };
|
|
2086
|
+
if (sub === 'enable' || sub === 'install')
|
|
2087
|
+
enableAutostart(opts);
|
|
2088
|
+
else if (sub === 'disable' || sub === 'uninstall')
|
|
2089
|
+
disableAutostart(opts);
|
|
2090
|
+
else if (sub === 'status')
|
|
2091
|
+
autostartStatus(opts);
|
|
2092
|
+
else {
|
|
2093
|
+
console.error(`用法: botmux autostart <enable|disable|status>`);
|
|
2094
|
+
process.exit(1);
|
|
2095
|
+
}
|
|
2096
|
+
break;
|
|
2097
|
+
}
|
|
2067
2098
|
default:
|
|
2068
2099
|
showHelp();
|
|
2069
2100
|
break;
|