botmux 2.71.5 → 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 (65) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +7 -83
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  5. package/dist/core/dashboard-ipc-server.js +134 -2
  6. package/dist/core/dashboard-ipc-server.js.map +1 -1
  7. package/dist/core/dashboard-rows.d.ts +4 -0
  8. package/dist/core/dashboard-rows.d.ts.map +1 -1
  9. package/dist/core/dashboard-rows.js +4 -0
  10. package/dist/core/dashboard-rows.js.map +1 -1
  11. package/dist/core/session-board.d.ts +9 -0
  12. package/dist/core/session-board.d.ts.map +1 -0
  13. package/dist/core/session-board.js +24 -0
  14. package/dist/core/session-board.js.map +1 -0
  15. package/dist/dashboard/federated-group-core.d.ts.map +1 -1
  16. package/dist/dashboard/federated-group-core.js +5 -0
  17. package/dist/dashboard/federated-group-core.js.map +1 -1
  18. package/dist/dashboard/federation-api.d.ts.map +1 -1
  19. package/dist/dashboard/federation-api.js +70 -1
  20. package/dist/dashboard/federation-api.js.map +1 -1
  21. package/dist/dashboard/federation-spoke-api.d.ts +16 -2
  22. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  23. package/dist/dashboard/federation-spoke-api.js +96 -3
  24. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  25. package/dist/dashboard/web/app.d.ts.map +1 -1
  26. package/dist/dashboard/web/app.js +52 -0
  27. package/dist/dashboard/web/app.js.map +1 -1
  28. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  29. package/dist/dashboard/web/i18n.js +64 -0
  30. package/dist/dashboard/web/i18n.js.map +1 -1
  31. package/dist/dashboard/web/kanban-model.d.ts +19 -0
  32. package/dist/dashboard/web/kanban-model.d.ts.map +1 -0
  33. package/dist/dashboard/web/kanban-model.js +40 -0
  34. package/dist/dashboard/web/kanban-model.js.map +1 -0
  35. package/dist/dashboard/web/preferences.d.ts +12 -1
  36. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  37. package/dist/dashboard/web/preferences.js +32 -1
  38. package/dist/dashboard/web/preferences.js.map +1 -1
  39. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  40. package/dist/dashboard/web/sessions.js +1059 -10
  41. package/dist/dashboard/web/sessions.js.map +1 -1
  42. package/dist/dashboard-web/app.js +519 -433
  43. package/dist/dashboard-web/index.html +3 -0
  44. package/dist/dashboard-web/style.css +692 -1
  45. package/dist/dashboard.js +72 -3
  46. package/dist/dashboard.js.map +1 -1
  47. package/dist/im/lark/client.d.ts +8 -0
  48. package/dist/im/lark/client.d.ts.map +1 -1
  49. package/dist/im/lark/client.js +32 -0
  50. package/dist/im/lark/client.js.map +1 -1
  51. package/dist/services/team-board-store.d.ts +33 -0
  52. package/dist/services/team-board-store.d.ts.map +1 -0
  53. package/dist/services/team-board-store.js +88 -0
  54. package/dist/services/team-board-store.js.map +1 -0
  55. package/dist/services/team-groups-store.d.ts +8 -0
  56. package/dist/services/team-groups-store.d.ts.map +1 -0
  57. package/dist/services/team-groups-store.js +31 -0
  58. package/dist/services/team-groups-store.js.map +1 -0
  59. package/dist/setup/bot-config-editor.d.ts +3 -2
  60. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  61. package/dist/setup/bot-config-editor.js +1 -2
  62. package/dist/setup/bot-config-editor.js.map +1 -1
  63. package/dist/types.d.ts +5 -0
  64. package/dist/types.d.ts.map +1 -1
  65. 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":";AA01IA;;;;;;;;;;;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"}
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。',