botmux 3.3.0 → 3.4.1

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 (159) hide show
  1. package/dist/adapters/backend/sandbox.d.ts +47 -0
  2. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  3. package/dist/adapters/backend/sandbox.js +137 -0
  4. package/dist/adapters/backend/sandbox.js.map +1 -1
  5. package/dist/adapters/cli/read-isolation.d.ts +72 -3
  6. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  7. package/dist/adapters/cli/read-isolation.js +143 -6
  8. package/dist/adapters/cli/read-isolation.js.map +1 -1
  9. package/dist/adapters/cli/registry.d.ts.map +1 -1
  10. package/dist/adapters/cli/registry.js +8 -2
  11. package/dist/adapters/cli/registry.js.map +1 -1
  12. package/dist/cli/create-group-resolver.d.ts +19 -0
  13. package/dist/cli/create-group-resolver.d.ts.map +1 -1
  14. package/dist/cli/create-group-resolver.js +30 -0
  15. package/dist/cli/create-group-resolver.js.map +1 -1
  16. package/dist/cli/pm2-command.d.ts.map +1 -1
  17. package/dist/cli/pm2-command.js +6 -0
  18. package/dist/cli/pm2-command.js.map +1 -1
  19. package/dist/cli.d.ts.map +1 -1
  20. package/dist/cli.js +36 -1
  21. package/dist/cli.js.map +1 -1
  22. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  23. package/dist/core/dashboard-ipc-server.js +21 -0
  24. package/dist/core/dashboard-ipc-server.js.map +1 -1
  25. package/dist/core/device-isolation-activation.d.ts +56 -0
  26. package/dist/core/device-isolation-activation.d.ts.map +1 -0
  27. package/dist/core/device-isolation-activation.js +110 -0
  28. package/dist/core/device-isolation-activation.js.map +1 -0
  29. package/dist/core/device-isolation-daemon.d.ts +84 -0
  30. package/dist/core/device-isolation-daemon.d.ts.map +1 -0
  31. package/dist/core/device-isolation-daemon.js +591 -0
  32. package/dist/core/device-isolation-daemon.js.map +1 -0
  33. package/dist/core/types.d.ts +9 -0
  34. package/dist/core/types.d.ts.map +1 -1
  35. package/dist/core/types.js.map +1 -1
  36. package/dist/core/worker-pool.d.ts.map +1 -1
  37. package/dist/core/worker-pool.js +35 -0
  38. package/dist/core/worker-pool.js.map +1 -1
  39. package/dist/daemon.d.ts.map +1 -1
  40. package/dist/daemon.js +5 -0
  41. package/dist/daemon.js.map +1 -1
  42. package/dist/desktop/main/auto-start.d.ts +2 -0
  43. package/dist/desktop/main/auto-start.d.ts.map +1 -1
  44. package/dist/desktop/main/auto-start.js +10 -6
  45. package/dist/desktop/main/auto-start.js.map +1 -1
  46. package/dist/desktop/main/bundled-runtime.d.ts +12 -0
  47. package/dist/desktop/main/bundled-runtime.d.ts.map +1 -0
  48. package/dist/desktop/main/bundled-runtime.js +30 -0
  49. package/dist/desktop/main/bundled-runtime.js.map +1 -0
  50. package/dist/desktop/main/device-status.d.ts +15 -0
  51. package/dist/desktop/main/device-status.d.ts.map +1 -0
  52. package/dist/desktop/main/device-status.js +94 -0
  53. package/dist/desktop/main/device-status.js.map +1 -0
  54. package/dist/desktop/main/external-runtime.d.ts +9 -0
  55. package/dist/desktop/main/external-runtime.d.ts.map +1 -1
  56. package/dist/desktop/main/external-runtime.js +88 -18
  57. package/dist/desktop/main/external-runtime.js.map +1 -1
  58. package/dist/desktop/main/ipc.d.ts.map +1 -1
  59. package/dist/desktop/main/ipc.js +1 -0
  60. package/dist/desktop/main/ipc.js.map +1 -1
  61. package/dist/desktop/main/node-command.d.ts +21 -0
  62. package/dist/desktop/main/node-command.d.ts.map +1 -1
  63. package/dist/desktop/main/node-command.js +41 -0
  64. package/dist/desktop/main/node-command.js.map +1 -1
  65. package/dist/desktop/main/pm2-apps.d.ts +4 -2
  66. package/dist/desktop/main/pm2-apps.d.ts.map +1 -1
  67. package/dist/desktop/main/pm2-apps.js +11 -3
  68. package/dist/desktop/main/pm2-apps.js.map +1 -1
  69. package/dist/desktop/main/runtime-service.d.ts +21 -5
  70. package/dist/desktop/main/runtime-service.d.ts.map +1 -1
  71. package/dist/desktop/main/runtime-service.js +94 -10
  72. package/dist/desktop/main/runtime-service.js.map +1 -1
  73. package/dist/desktop/main/runtime-source.d.ts +2 -0
  74. package/dist/desktop/main/runtime-source.d.ts.map +1 -1
  75. package/dist/desktop/main/runtime-source.js +12 -6
  76. package/dist/desktop/main/runtime-source.js.map +1 -1
  77. package/dist/desktop/main/tray.d.ts +1 -0
  78. package/dist/desktop/main/tray.d.ts.map +1 -1
  79. package/dist/desktop/main/tray.js +3 -3
  80. package/dist/desktop/main/tray.js.map +1 -1
  81. package/dist/desktop/main.js +28 -8
  82. package/dist/desktop/main.js.map +1 -1
  83. package/dist/desktop/preload.js +3 -0
  84. package/dist/desktop/preload.js.map +1 -1
  85. package/dist/desktop/renderer/app.d.ts +2 -1
  86. package/dist/desktop/renderer/app.d.ts.map +1 -1
  87. package/dist/desktop/renderer/app.js +6 -1
  88. package/dist/desktop/renderer/app.js.map +1 -1
  89. package/dist/desktop/renderer/runtime-state.d.ts.map +1 -1
  90. package/dist/desktop/renderer/runtime-state.js +2 -0
  91. package/dist/desktop/renderer/runtime-state.js.map +1 -1
  92. package/dist/desktop/shared/shell-path-probes.d.ts +24 -0
  93. package/dist/desktop/shared/shell-path-probes.d.ts.map +1 -0
  94. package/dist/desktop/shared/shell-path-probes.js +38 -0
  95. package/dist/desktop/shared/shell-path-probes.js.map +1 -0
  96. package/dist/desktop/shared/types.d.ts +21 -1
  97. package/dist/desktop/shared/types.d.ts.map +1 -1
  98. package/dist/desktop/smoke.d.ts +1 -0
  99. package/dist/desktop/smoke.d.ts.map +1 -1
  100. package/dist/desktop/smoke.js +20 -5
  101. package/dist/desktop/smoke.js.map +1 -1
  102. package/dist/platform/bind.d.ts +4 -1
  103. package/dist/platform/bind.d.ts.map +1 -1
  104. package/dist/platform/bind.js +10 -1
  105. package/dist/platform/bind.js.map +1 -1
  106. package/dist/platform/binding.d.ts.map +1 -1
  107. package/dist/platform/binding.js +15 -9
  108. package/dist/platform/binding.js.map +1 -1
  109. package/dist/platform/device-command.d.ts +35 -0
  110. package/dist/platform/device-command.d.ts.map +1 -0
  111. package/dist/platform/device-command.js +187 -0
  112. package/dist/platform/device-command.js.map +1 -0
  113. package/dist/platform/device-enroll.d.ts +156 -0
  114. package/dist/platform/device-enroll.d.ts.map +1 -0
  115. package/dist/platform/device-enroll.js +781 -0
  116. package/dist/platform/device-enroll.js.map +1 -0
  117. package/dist/platform/device-isolation-activation-client.d.ts +28 -0
  118. package/dist/platform/device-isolation-activation-client.d.ts.map +1 -0
  119. package/dist/platform/device-isolation-activation-client.js +279 -0
  120. package/dist/platform/device-isolation-activation-client.js.map +1 -0
  121. package/dist/platform/device-isolation.d.ts +35 -0
  122. package/dist/platform/device-isolation.d.ts.map +1 -0
  123. package/dist/platform/device-isolation.js +90 -0
  124. package/dist/platform/device-isolation.js.map +1 -0
  125. package/dist/platform/device-paths.d.ts +9 -0
  126. package/dist/platform/device-paths.d.ts.map +1 -0
  127. package/dist/platform/device-paths.js +14 -0
  128. package/dist/platform/device-paths.js.map +1 -0
  129. package/dist/platform/device.d.ts +77 -0
  130. package/dist/platform/device.d.ts.map +1 -0
  131. package/dist/platform/device.js +212 -0
  132. package/dist/platform/device.js.map +1 -0
  133. package/dist/platform/host-command-context.d.ts +15 -0
  134. package/dist/platform/host-command-context.d.ts.map +1 -0
  135. package/dist/platform/host-command-context.js +26 -0
  136. package/dist/platform/host-command-context.js.map +1 -0
  137. package/dist/platform/secure-host-file.d.ts +12 -0
  138. package/dist/platform/secure-host-file.d.ts.map +1 -0
  139. package/dist/platform/secure-host-file.js +182 -0
  140. package/dist/platform/secure-host-file.js.map +1 -0
  141. package/dist/services/group-creator.d.ts +8 -0
  142. package/dist/services/group-creator.d.ts.map +1 -1
  143. package/dist/services/group-creator.js +42 -0
  144. package/dist/services/group-creator.js.map +1 -1
  145. package/dist/types.d.ts +9 -0
  146. package/dist/types.d.ts.map +1 -1
  147. package/dist/utils/atomic-write.d.ts +13 -0
  148. package/dist/utils/atomic-write.d.ts.map +1 -1
  149. package/dist/utils/atomic-write.js +89 -9
  150. package/dist/utils/atomic-write.js.map +1 -1
  151. package/dist/utils/input-gate.d.ts +41 -0
  152. package/dist/utils/input-gate.d.ts.map +1 -1
  153. package/dist/utils/input-gate.js +41 -0
  154. package/dist/utils/input-gate.js.map +1 -1
  155. package/dist/worker.js +328 -22
  156. package/dist/worker.js.map +1 -1
  157. package/dist/workflows/events/payloads.d.ts +4 -4
  158. package/dist/workflows/events/schema.d.ts +16 -16
  159. package/package.json +6 -3
package/dist/cli.js CHANGED
@@ -12,6 +12,7 @@
12
12
  * botmux logs [--lines] — view daemon logs
13
13
  * botmux status — show daemon status
14
14
  * botmux upgrade|update — upgrade to latest version
15
+ * botmux device enroll|status|logout — manage the host desktop device credential
15
16
  * botmux list — interactive session picker (TUI), attach to tmux
16
17
  * botmux list --plain — plain table output (for piping / scripts)
17
18
  * botmux delete <id> — close a session by ID prefix
@@ -338,6 +339,10 @@ function ecosystemConfig() {
338
339
  const externalHostEnv = resolveDaemonExternalHostEnv(process.env, existsSync(ENV_FILE) ? readFileSync(ENV_FILE, 'utf-8') : undefined);
339
340
  const baseApp = {
340
341
  script: daemonScript,
342
+ // Pin every managed core process to the Node that invoked this CLI. This
343
+ // keeps GUI/launchd starts independent from PATH and lets Desktop replace
344
+ // an external fleet without also killing unrelated plugin services.
345
+ interpreter: process.execPath,
341
346
  cwd: CONFIG_DIR,
342
347
  autorestart: true,
343
348
  max_restarts: 10,
@@ -383,6 +388,7 @@ function ecosystemConfig() {
383
388
  apps.push({
384
389
  name: 'botmux-dashboard',
385
390
  script: join(PKG_ROOT, 'dist', 'dashboard.js'),
391
+ interpreter: process.execPath,
386
392
  cwd: PKG_ROOT,
387
393
  autorestart: true,
388
394
  max_restarts: 10,
@@ -4198,6 +4204,8 @@ botmux v${getVersion()} — IM ↔ AI 编程 CLI 桥接
4198
4204
  status 查看 daemon 状态
4199
4205
  upgrade 升级到最新版本(别名:update)
4200
4206
  dashboard 打印新的 Web Dashboard 一次性登录 URL(旧 token 同时失效)
4207
+ device enroll|status|logout
4208
+ 在宿主终端注册、查看或清除 desktop device 凭证(AI CLI 会话内拒绝)
4201
4209
  list 列出活跃会话(交互式选择并连接 tmux)
4202
4210
  --plain 纯文本表格输出(管道/脚本场景)
4203
4211
  delete <id> 关闭指定会话(支持 ID 前缀匹配)
@@ -7105,6 +7113,7 @@ botmux create-group — 用一组机器人新建飞书群
7105
7113
  用法:
7106
7114
  botmux create-group --bot <name|larkAppId> [--bot ...] [--name "群名"]
7107
7115
  [--working-dir <path>]
7116
+ [--kickoff-bot <open_id> --kickoff-prompt "文本"]
7108
7117
 
7109
7118
  参数:
7110
7119
  --bot <ref> 至少一个,可多次。ref 推荐用 bot 显示名(同 botmux send 的 @<name>)或完整 larkAppId;
@@ -7115,6 +7124,10 @@ botmux create-group — 用一组机器人新建飞书群
7115
7124
  --working-dir <path>
7116
7125
  可选;创建成功后,把新群为所有成功入群的 bot 绑定到该目录(等价于逐个 /oncall bind),
7117
7126
  下次在群里开新话题时直接使用该目录,跳过仓库选择卡片。也可写作 --cwd / --dir。
7127
+ --kickoff-bot <open_id> 可选;建群成功后由 creator @ 该 bot 并发送 --kickoff-prompt,
7128
+ 触发该 bot 自动开始工作(如 PR review)。需配合 --kickoff-prompt 使用。
7129
+ 该 bot 必须已在 --bot 列表中(即已是群成员)。
7130
+ --kickoff-prompt "文本" 可选;与 --kickoff-bot 配合使用,@ bot 后发送的 prompt 文本。
7118
7131
 
7119
7132
  行为:
7120
7133
  - 第一个解析到的 bot 作为 creator(决定建群身份 + 初始群主 + open_id app scope)。
@@ -7122,6 +7135,8 @@ botmux create-group — 用一组机器人新建飞书群
7122
7135
  转不出来或为空则跳过对应步骤,stderr warning)。
7123
7136
  - 不依赖 botmux 会话,任何环境都能跑。
7124
7137
  - --working-dir 会先校验路径存在且是目录;绑定失败不会重复建群,会在 stderr 给出逐 bot 结果。
7138
+ - --kickoff-bot/--kickoff-prompt:creator 建群后 @ 指定 bot 并发 prompt;该 bot 收到 @ 会自动起会话。
7139
+ 注意:creator 不能 @ 自己(自消息被忽略),故 --kickoff-bot 应选 creator 之外的 bot。
7125
7140
 
7126
7141
  输出协议(skill 友好):
7127
7142
  - 成功(即使 transfer/notify 部分失败):stdout 单行 chatId,exit 0;stderr 打人类提示 + applink。
@@ -7133,6 +7148,8 @@ botmux create-group — 用一组机器人新建飞书群
7133
7148
  const botRefs = argValues(rest, '--bot');
7134
7149
  const name = argValue(rest, '--name');
7135
7150
  const workingDirArg = argValue(rest, '--working-dir', '--cwd', '--dir');
7151
+ const kickoffBot = argValue(rest, '--kickoff-bot');
7152
+ const kickoffPrompt = argValue(rest, '--kickoff-prompt');
7136
7153
  let bindWorkingDir;
7137
7154
  let bindWorkingDirResolved;
7138
7155
  if (workingDirArg !== undefined) {
@@ -7174,7 +7191,7 @@ botmux create-group — 用一组机器人新建飞书群
7174
7191
  botInfoEntries = JSON.parse(readFileSync(botInfoPath, 'utf-8'));
7175
7192
  }
7176
7193
  catch { /* */ }
7177
- const { resolveBotRefs } = await import('./cli/create-group-resolver.js');
7194
+ const { resolveBotRefs, resolveKickoff } = await import('./cli/create-group-resolver.js');
7178
7195
  const resolved = resolveBotRefs(botRefs, botConfigs, botInfoEntries.map(b => ({ larkAppId: b.larkAppId, botName: b.botName })));
7179
7196
  for (const w of resolved.ambiguousWarnings)
7180
7197
  console.error(`⚠️ ${w}`);
@@ -7192,6 +7209,11 @@ botmux create-group — 用一组机器人新建飞书群
7192
7209
  process.exit(1);
7193
7210
  }
7194
7211
  const creatorLarkAppId = resolved.larkAppIds[0];
7212
+ const kickoff = resolveKickoff(kickoffBot, kickoffPrompt, resolved.larkAppIds, botInfoEntries.map(b => ({ larkAppId: b.larkAppId, botOpenId: b.botOpenId })));
7213
+ if (!kickoff.ok) {
7214
+ console.error(kickoff.error);
7215
+ process.exit(1);
7216
+ }
7195
7217
  // Register bots so getBotClient works inside service
7196
7218
  const fullConfigs = loadBotConfigs();
7197
7219
  const needed = new Set(resolved.larkAppIds);
@@ -7231,6 +7253,8 @@ botmux create-group — 用一组机器人新建飞书群
7231
7253
  transferOwnerTo: targetOpenId,
7232
7254
  notifyOwnerOpenId: targetOpenId,
7233
7255
  bindWorkingDir,
7256
+ kickoffBotLarkAppId: kickoff.targetLarkAppId,
7257
+ kickoffPrompt: kickoff.prompt,
7234
7258
  });
7235
7259
  }
7236
7260
  catch (err) {
@@ -7261,6 +7285,12 @@ botmux create-group — 用一组机器人新建飞书群
7261
7285
  else if (result.notifyMessageId) {
7262
7286
  console.error(`✅ @通知已发送 (msg ${result.notifyMessageId})`);
7263
7287
  }
7288
+ if (result.kickoffError) {
7289
+ console.error(`⚠️ kickoff 消息发送失败: ${result.kickoffError}`);
7290
+ }
7291
+ else if (result.kickoffMessageId) {
7292
+ console.error(`✅ kickoff 消息已发送 (msg ${result.kickoffMessageId})`);
7293
+ }
7264
7294
  if (bindWorkingDir) {
7265
7295
  const ok = result.oncallBindings.filter(b => b.ok).length;
7266
7296
  const failed = result.oncallBindings.filter(b => !b.ok);
@@ -8741,6 +8771,11 @@ switch (command) {
8741
8771
  await cmdBind(process.argv.slice(3));
8742
8772
  break;
8743
8773
  }
8774
+ case 'device': {
8775
+ const { runDeviceCommand } = await import('./platform/device-command.js');
8776
+ process.exitCode = await runDeviceCommand(process.argv.slice(3));
8777
+ break;
8778
+ }
8744
8779
  case 'list':
8745
8780
  case 'ls':
8746
8781
  await cmdList();