botmux 2.71.4 → 2.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +8 -93
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/ask-api.d.ts +2 -20
  5. package/dist/core/ask-api.d.ts.map +1 -1
  6. package/dist/core/ask-api.js +2 -25
  7. package/dist/core/ask-api.js.map +1 -1
  8. package/dist/core/ask-args.d.ts +3 -3
  9. package/dist/core/ask-args.js +3 -3
  10. package/dist/core/ask-broker.d.ts +3 -1
  11. package/dist/core/ask-broker.d.ts.map +1 -1
  12. package/dist/core/ask-broker.js +20 -5
  13. package/dist/core/ask-broker.js.map +1 -1
  14. package/dist/core/ask-types.d.ts +3 -8
  15. package/dist/core/ask-types.d.ts.map +1 -1
  16. package/dist/core/ask-types.js.map +1 -1
  17. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  18. package/dist/core/dashboard-ipc-server.js +134 -2
  19. package/dist/core/dashboard-ipc-server.js.map +1 -1
  20. package/dist/core/dashboard-rows.d.ts +4 -0
  21. package/dist/core/dashboard-rows.d.ts.map +1 -1
  22. package/dist/core/dashboard-rows.js +4 -0
  23. package/dist/core/dashboard-rows.js.map +1 -1
  24. package/dist/core/session-board.d.ts +9 -0
  25. package/dist/core/session-board.d.ts.map +1 -0
  26. package/dist/core/session-board.js +24 -0
  27. package/dist/core/session-board.js.map +1 -0
  28. package/dist/daemon.d.ts.map +1 -1
  29. package/dist/daemon.js +14 -35
  30. package/dist/daemon.js.map +1 -1
  31. package/dist/dashboard/federated-group-core.d.ts.map +1 -1
  32. package/dist/dashboard/federated-group-core.js +5 -0
  33. package/dist/dashboard/federated-group-core.js.map +1 -1
  34. package/dist/dashboard/federation-api.d.ts.map +1 -1
  35. package/dist/dashboard/federation-api.js +70 -1
  36. package/dist/dashboard/federation-api.js.map +1 -1
  37. package/dist/dashboard/federation-spoke-api.d.ts +16 -2
  38. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  39. package/dist/dashboard/federation-spoke-api.js +96 -3
  40. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  41. package/dist/dashboard/web/app.d.ts.map +1 -1
  42. package/dist/dashboard/web/app.js +52 -0
  43. package/dist/dashboard/web/app.js.map +1 -1
  44. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  45. package/dist/dashboard/web/i18n.js +64 -0
  46. package/dist/dashboard/web/i18n.js.map +1 -1
  47. package/dist/dashboard/web/kanban-model.d.ts +19 -0
  48. package/dist/dashboard/web/kanban-model.d.ts.map +1 -0
  49. package/dist/dashboard/web/kanban-model.js +40 -0
  50. package/dist/dashboard/web/kanban-model.js.map +1 -0
  51. package/dist/dashboard/web/preferences.d.ts +12 -1
  52. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  53. package/dist/dashboard/web/preferences.js +32 -1
  54. package/dist/dashboard/web/preferences.js.map +1 -1
  55. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  56. package/dist/dashboard/web/sessions.js +1059 -10
  57. package/dist/dashboard/web/sessions.js.map +1 -1
  58. package/dist/dashboard-web/app.js +519 -433
  59. package/dist/dashboard-web/index.html +3 -0
  60. package/dist/dashboard-web/style.css +692 -1
  61. package/dist/dashboard.js +72 -3
  62. package/dist/dashboard.js.map +1 -1
  63. package/dist/i18n/en.d.ts.map +1 -1
  64. package/dist/i18n/en.js +1 -0
  65. package/dist/i18n/en.js.map +1 -1
  66. package/dist/i18n/zh.d.ts.map +1 -1
  67. package/dist/i18n/zh.js +1 -0
  68. package/dist/i18n/zh.js.map +1 -1
  69. package/dist/im/lark/ask-card.js +4 -7
  70. package/dist/im/lark/ask-card.js.map +1 -1
  71. package/dist/im/lark/client.d.ts +8 -0
  72. package/dist/im/lark/client.d.ts.map +1 -1
  73. package/dist/im/lark/client.js +32 -0
  74. package/dist/im/lark/client.js.map +1 -1
  75. package/dist/services/team-board-store.d.ts +33 -0
  76. package/dist/services/team-board-store.d.ts.map +1 -0
  77. package/dist/services/team-board-store.js +88 -0
  78. package/dist/services/team-board-store.js.map +1 -0
  79. package/dist/services/team-groups-store.d.ts +8 -0
  80. package/dist/services/team-groups-store.d.ts.map +1 -0
  81. package/dist/services/team-groups-store.js +31 -0
  82. package/dist/services/team-groups-store.js.map +1 -0
  83. package/dist/setup/bot-config-editor.d.ts +3 -2
  84. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  85. package/dist/setup/bot-config-editor.js +1 -2
  86. package/dist/setup/bot-config-editor.js.map +1 -1
  87. package/dist/types.d.ts +5 -0
  88. package/dist/types.d.ts.map +1 -1
  89. package/package.json +1 -1
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAo2IA;;;;;;;;;;;GAWG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,qBAAqB,EAAE,SAAS,CAAC,EAC9F,KAAK,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,2BAA2B,EAAE,UAAU,GAAG,IAAI,CAAC,GACzF,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA+F7B"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA4wIA;;;;;;;;;;;GAWG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,qBAAqB,EAAE,SAAS,CAAC,EAC9F,KAAK,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,2BAA2B,EAAE,UAAU,GAAG,IAAI,CAAC,GACzF,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA8F7B"}
package/dist/cli.js CHANGED
@@ -35,7 +35,6 @@ import { tmuxEnv } from './setup/ensure-tmux.js';
35
35
  import { writeBotsJsonAtomic as writeBotsAtomic } from './setup/bots-store.js';
36
36
  import { applyBotConfigEdits, assertUniqueBotProcessNames, botProcessName, normalizeBotConfig, parseBotConfigsJson, parseBotSelection, removeBotConfig, resolveCliId, assertOwnerWhenChatGroups, findInvalidAllowedUserEntries, hasOwnerEntry, } from './setup/bot-config-editor.js';
37
37
  import { buildPreset, serializePreset, presetFilename } from './setup/agent-preset.js';
38
- import { createCliAdapterSync } from './adapters/cli/registry.js';
39
38
  import { logger } from './utils/logger.js';
40
39
  import { invalidWorkingDirs } from './utils/working-dir.js';
41
40
  import { firstPositional } from './cli/arg-utils.js';
@@ -297,63 +296,6 @@ function printInputHelp(title, lines) {
297
296
  console.log(` ${line}`);
298
297
  }
299
298
  }
300
- /**
301
- * 读取指定 CLI 适配器声明的候选 model 列表 —— 不支持 model 配置的 CLI(aiden/
302
- * antigravity/mtr 等没声明 modelChoices)返回 null,promptModel 据此整段
303
- * 跳过提问。适配器解析失败也按"不支持"处理,避免在 setup 中冒出陌生堆栈。
304
- */
305
- function cliModelChoices(cliId) {
306
- try {
307
- const adapter = createCliAdapterSync(cliId);
308
- return adapter.modelChoices && adapter.modelChoices.length > 0
309
- ? adapter.modelChoices
310
- : null;
311
- }
312
- catch {
313
- return null;
314
- }
315
- }
316
- /**
317
- * 询问"指定 CLI 用哪个 model"。
318
- * - cliId 对应的 adapter 没声明 modelChoices → return undefined(跳过提问)
319
- * - 用户输入序号 → 取候选列表对应项
320
- * - 输入空 + 提供 current → 保留当前值(current 透传出去)
321
- * - 输入空 + 无 current → return undefined(用 CLI 默认)
322
- * - 输入 `-` → return null(语义:清空,调用方据此 delete model 字段)
323
- * - 输入自由文本 → 原样返回
324
- */
325
- async function promptModel(rl, cliId, current) {
326
- const choices = cliModelChoices(cliId);
327
- if (!choices)
328
- return undefined;
329
- const numbered = choices.map((m, i) => `${i + 1}) ${m}`).join(' ');
330
- printInputHelp(`CLI Model(${cliId})`, [
331
- '可选。在 spawn CLI 时注入 model 参数;同一 CLI 配多个 bot 可以跑不同 model。',
332
- `候选: ${numbered} ${choices.length + 1}) Other(自定义输入)`,
333
- current
334
- ? '留空保留当前值;输入 - 清空(回到 CLI 默认)。'
335
- : '留空 = 不设置(用 CLI 默认)。',
336
- ]);
337
- const label = current ? formatOptionalValue(current) : '未设置';
338
- const raw = (await ask(rl, `CLI Model [${label}]: `)).trim();
339
- if (!raw)
340
- return current ?? undefined;
341
- if (raw === '-')
342
- return null;
343
- const numIdx = Number(raw);
344
- if (Number.isInteger(numIdx) && numIdx >= 1 && numIdx <= choices.length) {
345
- return choices[numIdx - 1];
346
- }
347
- if (Number.isInteger(numIdx) && numIdx === choices.length + 1) {
348
- // 选了 Other,进一步要 free-form
349
- const customRaw = (await ask(rl, '请输入 model 名: ')).trim();
350
- if (!customRaw)
351
- return current ?? undefined;
352
- return customRaw;
353
- }
354
- // 直接当成自由输入
355
- return raw;
356
- }
357
299
  // Thin wrapper around setup/bots-store.writeBotsJsonAtomic so call-sites keep
358
300
  // the same name without passing BOTS_JSON_FILE explicitly each time.
359
301
  function writeBotsJsonAtomic(bots) {
@@ -630,7 +572,6 @@ async function promptBotConfig(rl) {
630
572
  return null;
631
573
  }
632
574
  const workingDir = await ask(rl, '默认工作目录 [~]: ');
633
- const modelChoice = await promptModel(rl, cliId);
634
575
  const bot = {
635
576
  larkAppId: creds.appId,
636
577
  larkAppSecret: creds.appSecret,
@@ -645,10 +586,8 @@ async function promptBotConfig(rl) {
645
586
  if (creds.brand === 'lark') {
646
587
  bot.brand = 'lark';
647
588
  }
648
- // modelChoice === undefined CLI 没声明候选 / 用户跳过;不写 model 字段
649
- if (typeof modelChoice === 'string' && modelChoice) {
650
- bot.model = modelChoice;
651
- }
589
+ // setup 不再询问 model(用户常选到无权限的 model,setup 完一发消息就 spawn
590
+ // 报错,排查成本高)。需要指定 model /config 卡片或手动编辑 bots.json。
652
591
  // 扫码场景默认填扫码人自己 (registerApp 返回里有 open_id), 天然就是 owner.
653
592
  // 优先解析成 union_id (on_,跨应用稳定);失败则 fallback 到 open_id (ou_)。
654
593
  // 手动 fallback 场景没 open_id —— 必须显式指定 owner, 否则配置无 owner:
@@ -723,29 +662,14 @@ async function promptEditBotConfig(rl, bot) {
723
662
  '留空保留当前值;输入 - 清空覆盖,回到 PATH 查 cliId 对应的默认二进制。',
724
663
  ]);
725
664
  input.cliPathOverride = await ask(rl, `CLI 可执行文件路径覆盖 [${formatOptionalValue(bot.cliPathOverride)}]: `);
726
- // promptModel 返回 string | null | undefined,直接灌进 BotConfigEditInput.model:
727
- // undefined = 用户跳过 / adapter 不支持 applyBotConfigEdits 不改 model
728
- // null = 用户输 `-` 清空 delete model
729
- // string = 设值
730
- // 用本轮编辑后的 cliId 而非 bot.cliId —— 用户可能刚换了 CLI。
731
- const effectiveCliIdForModel = (resolveCliId(input.cliChoice) ?? bot.cliId ?? 'claude-code');
665
+ // setup 不再询问 model(同 promptBotConfig 的理由)。但切换 CLI 时旧 model
666
+ // 是上一个 CLI 的值,套到新 CLI 上没意义甚至直接 spawn 报错,必须强制清空;
667
+ // 未换 CLI input.model undefined,applyBotConfigEdits 保持原值不动。
732
668
  const cliChanged = !!resolveCliId(input.cliChoice) && resolveCliId(input.cliChoice) !== bot.cliId;
733
- if (cliChanged && !cliModelChoices(effectiveCliIdForModel)) {
734
- // 切到一个不支持 model adapter(例如 aiden / mtr / antigravity):
735
- // 即使原本配了 model 也要主动清空,避免 bots.json 里残留陈旧字段——
736
- // 否则用户后面再换回支持 model 的 adapter 一路回车时,旧 model
737
- // 会被当作"当前值"保留下来误套到新 CLI 上。
738
- console.log('\n⚠️ 新 CLI 不支持 --model 参数,已清空原 model 字段。');
669
+ if (cliChanged && bot.model) {
670
+ console.log('\n⚠️ 已切换 CLI,原 model 字段已清空(如需指定 model 请用 /config 卡片或编辑 bots.json)。');
739
671
  input.model = null;
740
672
  }
741
- else {
742
- const promptCurrent = cliChanged ? undefined : (typeof bot.model === 'string' ? bot.model : undefined);
743
- const result = await promptModel(rl, effectiveCliIdForModel, promptCurrent);
744
- // 切换 CLI 时哪怕用户留空也要清掉旧 model —— 旧值是上一个 CLI 的 model,
745
- // 套到新 CLI 上没意义。result === undefined 在"未变 CLI"分支等价于"保留旧值",
746
- // 但在 cliChanged 分支等价于"用户没指定,回到新 CLI 默认",必须 force null。
747
- input.model = cliChanged && result === undefined ? null : result;
748
- }
749
673
  printInputHelp('会话后端 backendType', [
750
674
  '可选。pty 更轻量;tmux 支持 adopt 和 Web Terminal 附着;herdr 支持托管持久会话;zellij 为实验后端(需 zellij >= 0.44)。',
751
675
  '留空保留当前值;输入 - 回到自动检测;接受 pty / tmux / herdr / zellij。',
@@ -4188,8 +4112,7 @@ botmux create-group — 用一组机器人新建飞书群
4188
4112
  /**
4189
4113
  * postAsk: 找到 daemon → POST /api/asks → 返回 AskResult。
4190
4114
  * 连接失败 / HTTP 错误时抛出带 exitCode 属性的 Error:
4191
- * - exitCode=3:daemon 不可达或 HTTP 非 400
4192
- * - exitCode=2:400 + no_approvers
4115
+ * - exitCode=3:daemon 不可达或 HTTP 错误
4193
4116
  */
4194
4117
  async function postAsk(body) {
4195
4118
  const larkAppId = body.larkAppId;
@@ -4221,11 +4144,6 @@ async function postAsk(body) {
4221
4144
  errBody = (await res.text()).slice(0, 200);
4222
4145
  }
4223
4146
  catch { /* */ }
4224
- if (res.status === 400 && /no_approvers/.test(errBody)) {
4225
- const err = new Error('botmux ask: 当前会话没有可批准者(session.owner 不在 bot.allowedUsers 里,且 --approver 未指定)');
4226
- err.exitCode = 2;
4227
- throw err;
4228
- }
4229
4147
  const err = new Error(`botmux ask: daemon HTTP ${res.status}: ${errBody}`);
4230
4148
  err.exitCode = 3;
4231
4149
  throw err;
@@ -4271,7 +4189,6 @@ async function cmdAsk(sub, rest) {
4271
4189
  const optionsRaw = argValue(rest, '--options');
4272
4190
  const timeoutRaw = argValue(rest, '--timeout');
4273
4191
  const useJson = rest.includes('--json');
4274
- const approverArgs = argValues(rest, '--approver');
4275
4192
  const positionalArgs = positionals(rest, ['--json']);
4276
4193
  let options;
4277
4194
  let timeoutMs;
@@ -4300,7 +4217,6 @@ async function cmdAsk(sub, rest) {
4300
4217
  options,
4301
4218
  prompt,
4302
4219
  timeoutMs,
4303
- approvers: approverArgs,
4304
4220
  };
4305
4221
  let result;
4306
4222
  try {
@@ -4425,7 +4341,6 @@ export async function runHook(payload, env, postAskFn, cliId, resolveAdoptRouteF
4425
4341
  rootMessageId: routeRoot,
4426
4342
  questions: parsed.questions,
4427
4343
  timeoutMs,
4428
- approvers: [],
4429
4344
  };
4430
4345
  let result;
4431
4346
  try {