botmux 2.54.0 → 2.55.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 (117) hide show
  1. package/dist/adapters/backend/zellij-observe-backend.d.ts +15 -0
  2. package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
  3. package/dist/adapters/backend/zellij-observe-backend.js +37 -0
  4. package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
  5. package/dist/adapters/cli/claude-code.d.ts +3 -3
  6. package/dist/adapters/cli/claude-code.js.map +1 -1
  7. package/dist/adapters/cli/codex.d.ts.map +1 -1
  8. package/dist/adapters/cli/codex.js +44 -28
  9. package/dist/adapters/cli/codex.js.map +1 -1
  10. package/dist/adapters/cli/seed.d.ts +1 -1
  11. package/dist/adapters/cli/seed.js +2 -2
  12. package/dist/adapters/cli/seed.js.map +1 -1
  13. package/dist/adapters/cli/types.d.ts +5 -1
  14. package/dist/adapters/cli/types.d.ts.map +1 -1
  15. package/dist/bot-registry.d.ts +8 -0
  16. package/dist/bot-registry.d.ts.map +1 -1
  17. package/dist/bot-registry.js +31 -5
  18. package/dist/bot-registry.js.map +1 -1
  19. package/dist/cli.d.ts.map +1 -1
  20. package/dist/cli.js +250 -101
  21. package/dist/cli.js.map +1 -1
  22. package/dist/core/dispatch.d.ts +23 -0
  23. package/dist/core/dispatch.d.ts.map +1 -1
  24. package/dist/core/dispatch.js +17 -0
  25. package/dist/core/dispatch.js.map +1 -1
  26. package/dist/core/pending-response.d.ts +0 -6
  27. package/dist/core/pending-response.d.ts.map +1 -1
  28. package/dist/core/pending-response.js +0 -5
  29. package/dist/core/pending-response.js.map +1 -1
  30. package/dist/core/session-discovery.d.ts.map +1 -1
  31. package/dist/core/session-discovery.js +5 -0
  32. package/dist/core/session-discovery.js.map +1 -1
  33. package/dist/core/worker-pool.d.ts +26 -0
  34. package/dist/core/worker-pool.d.ts.map +1 -1
  35. package/dist/core/worker-pool.js +68 -1
  36. package/dist/core/worker-pool.js.map +1 -1
  37. package/dist/dashboard/bot-onboarding.d.ts +46 -3
  38. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  39. package/dist/dashboard/bot-onboarding.js +86 -7
  40. package/dist/dashboard/bot-onboarding.js.map +1 -1
  41. package/dist/dashboard/federated-group-core.js +8 -4
  42. package/dist/dashboard/federated-group-core.js.map +1 -1
  43. package/dist/dashboard/federation-api.d.ts.map +1 -1
  44. package/dist/dashboard/federation-api.js +22 -2
  45. package/dist/dashboard/federation-api.js.map +1 -1
  46. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  47. package/dist/dashboard/web/bot-onboarding.js +139 -20
  48. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  49. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  50. package/dist/dashboard/web/i18n.js +36 -6
  51. package/dist/dashboard/web/i18n.js.map +1 -1
  52. package/dist/dashboard-web/app.js +171 -143
  53. package/dist/dashboard-web/style.css +58 -0
  54. package/dist/dashboard.js +37 -1
  55. package/dist/dashboard.js.map +1 -1
  56. package/dist/global-config.d.ts +5 -0
  57. package/dist/global-config.d.ts.map +1 -1
  58. package/dist/global-config.js +17 -0
  59. package/dist/global-config.js.map +1 -1
  60. package/dist/i18n/en.d.ts.map +1 -1
  61. package/dist/i18n/en.js +4 -0
  62. package/dist/i18n/en.js.map +1 -1
  63. package/dist/i18n/zh.d.ts.map +1 -1
  64. package/dist/i18n/zh.js +4 -0
  65. package/dist/i18n/zh.js.map +1 -1
  66. package/dist/im/lark/card-builder.d.ts +1 -1
  67. package/dist/im/lark/card-builder.js +1 -1
  68. package/dist/im/lark/card-handler.d.ts.map +1 -1
  69. package/dist/im/lark/card-handler.js +59 -10
  70. package/dist/im/lark/card-handler.js.map +1 -1
  71. package/dist/im/lark/client.d.ts +3 -1
  72. package/dist/im/lark/client.d.ts.map +1 -1
  73. package/dist/im/lark/client.js +7 -2
  74. package/dist/im/lark/client.js.map +1 -1
  75. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  76. package/dist/im/lark/event-dispatcher.js +8 -6
  77. package/dist/im/lark/event-dispatcher.js.map +1 -1
  78. package/dist/services/codex-paths.d.ts +7 -0
  79. package/dist/services/codex-paths.d.ts.map +1 -0
  80. package/dist/services/codex-paths.js +19 -0
  81. package/dist/services/codex-paths.js.map +1 -0
  82. package/dist/services/codex-transcript.d.ts.map +1 -1
  83. package/dist/services/codex-transcript.js +5 -4
  84. package/dist/services/codex-transcript.js.map +1 -1
  85. package/dist/services/voice/audio.d.ts +32 -0
  86. package/dist/services/voice/audio.d.ts.map +1 -0
  87. package/dist/services/voice/audio.js +114 -0
  88. package/dist/services/voice/audio.js.map +1 -0
  89. package/dist/services/voice/index.d.ts +32 -0
  90. package/dist/services/voice/index.d.ts.map +1 -0
  91. package/dist/services/voice/index.js +98 -0
  92. package/dist/services/voice/index.js.map +1 -0
  93. package/dist/services/voice/openai.d.ts +24 -0
  94. package/dist/services/voice/openai.d.ts.map +1 -0
  95. package/dist/services/voice/openai.js +47 -0
  96. package/dist/services/voice/openai.js.map +1 -0
  97. package/dist/services/voice/sami.d.ts +22 -0
  98. package/dist/services/voice/sami.d.ts.map +1 -0
  99. package/dist/services/voice/sami.js +128 -0
  100. package/dist/services/voice/sami.js.map +1 -0
  101. package/dist/services/voice/types.d.ts +32 -0
  102. package/dist/services/voice/types.d.ts.map +1 -0
  103. package/dist/services/voice/types.js +2 -0
  104. package/dist/services/voice/types.js.map +1 -0
  105. package/dist/setup/bot-config-editor.d.ts +9 -0
  106. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  107. package/dist/setup/bot-config-editor.js +26 -0
  108. package/dist/setup/bot-config-editor.js.map +1 -1
  109. package/dist/setup/verify-permissions.js +3 -3
  110. package/dist/setup/verify-permissions.js.map +1 -1
  111. package/dist/skills/definitions.d.ts.map +1 -1
  112. package/dist/skills/definitions.js +0 -1
  113. package/dist/skills/definitions.js.map +1 -1
  114. package/dist/worker.js +33 -2
  115. package/dist/worker.js.map +1 -1
  116. package/dist/workflows/events/schema.d.ts +140 -140
  117. package/package.json +1 -1
@@ -81,12 +81,12 @@ export function findOncallChat(larkAppId, chatId) {
81
81
  const bot = bots.get(larkAppId);
82
82
  return bot?.config.oncallChats?.find(c => c.chatId === chatId);
83
83
  }
84
- // Cross-bot oncall chat check — cached by config-file mtime.
84
+ // Cross-bot oncall chat discovery — cached by config-file mtime.
85
85
  //
86
- // /oncall bind is per-bot, but oncall is meant to be a chat-level property:
87
- // once any bot in a multi-bot deployment binds the chat, every sibling bot
88
- // should treat that chat as an oncall workspace too (otherwise unbound bots
89
- // fall back to allowedUsers and reply "⚠️ 无操作权限" when @-mentioned).
86
+ // /oncall bind is per-bot for talk authorization: receiving-bot gates must use
87
+ // findOncallChat(larkAppId, chatId). This cross-bot lookup remains for paths
88
+ // that need deployment-wide discovery/inheritance, such as pinned working-dir
89
+ // resolution and default-oncall checks.
90
90
  //
91
91
  // Multi-daemon deployments run one bot per process, so the in-memory `bots`
92
92
  // map only sees this daemon's own bot — sibling bots' bindings live only on
@@ -326,6 +326,31 @@ export function parseBotConfigsFromText(jsonText) {
326
326
  if (Object.keys(out).length > 0)
327
327
  quotaState = out;
328
328
  }
329
+ // voice:per-bot 语音引擎覆盖。结构化保留(engine ∈ sami|openai,sami/openai
330
+ // 为对象,speaker/rate 透传);非对象或 engine 非法 → undefined。深度校验
331
+ // (凭证是否可用)在 resolveVoiceConfig 做,这里只挡明显垃圾。
332
+ let voice;
333
+ const rawVoice = entry.voice;
334
+ if (rawVoice && typeof rawVoice === 'object' && !Array.isArray(rawVoice)) {
335
+ const eng = rawVoice.engine;
336
+ if (eng === undefined || eng === 'sami' || eng === 'openai') {
337
+ const v = {};
338
+ if (eng)
339
+ v.engine = eng;
340
+ if (typeof rawVoice.speaker === 'string')
341
+ v.speaker = rawVoice.speaker;
342
+ if (typeof rawVoice.rate === 'number')
343
+ v.rate = rawVoice.rate;
344
+ const s = rawVoice.sami;
345
+ if (s && typeof s === 'object')
346
+ v.sami = { accessKey: s.accessKey, secretKey: s.secretKey, appkey: s.appkey, tokenUrl: s.tokenUrl, wsUrl: s.wsUrl };
347
+ const o = rawVoice.openai;
348
+ if (o && typeof o === 'object')
349
+ v.openai = { baseUrl: o.baseUrl, apiKey: o.apiKey, model: o.model };
350
+ if (v.engine || v.sami || v.openai || v.speaker)
351
+ voice = v;
352
+ }
353
+ }
329
354
  configs.push({
330
355
  larkAppId: entry.larkAppId,
331
356
  larkAppSecret: entry.larkAppSecret,
@@ -366,6 +391,7 @@ export function parseBotConfigsFromText(jsonText) {
366
391
  ? entry.autoStartOnGroupJoinPrompt
367
392
  : undefined,
368
393
  autoStartOnNewTopic: entry.autoStartOnNewTopic === true || undefined,
394
+ voice,
369
395
  });
370
396
  }
371
397
  return configs;
@@ -1 +1 @@
1
- {"version":3,"file":"bot-registry.js","sourceRoot":"","sources":["../src/bot-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bot-registry.js","sourceRoot":"","sources":["../src/bot-registry.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA64HA;;;;;;;;;;;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":";AAs7HA;;;;;;;;;;;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"}
package/dist/cli.js CHANGED
@@ -26,7 +26,7 @@ import { createInterface } from 'node:readline';
26
26
  import { createRequire } from 'node:module';
27
27
  import { createHmac, randomBytes } from 'node:crypto';
28
28
  import { validateWorkingDir } from './core/working-dir.js';
29
- import { parseDispatchBotSpec, buildDispatchMessages, buildRepoPrimeText, buildReportContent, eligibleAutoMentionAliases, offTopicSubBotTopic, resolveReportTarget } from './core/dispatch.js';
29
+ import { parseDispatchBotSpec, buildDispatchMessages, buildRepoPrimeText, buildReportContent, eligibleAutoMentionAliases, offTopicSubBotTopic, resolveReportTarget, resolveSendTarget } from './core/dispatch.js';
30
30
  import { enableAutostart, disableAutostart, autostartStatus, refreshAutostart } from './autostart.js';
31
31
  import { tmuxEnv } from './setup/ensure-tmux.js';
32
32
  import { writeBotsJsonAtomic as writeBotsAtomic } from './setup/bots-store.js';
@@ -621,7 +621,7 @@ async function promptBotConfig(rl) {
621
621
  return null;
622
622
  }
623
623
  console.log('✅ 凭证有效(tenant_access_token 已成功获取)\n');
624
- console.log('支持的 CLI: 1) claude-code 2) aiden 3) coco 4) codex 5) cursor 6) gemini 7) opencode 8) antigravity 9) mtr 10) hermes 11) codex-app 12) mira 13) seed');
624
+ console.log('支持的 CLI: 1) claude-code 2) aiden 3) coco(别名 traecli) 4) codex 5) cursor 6) gemini 7) opencode 8) antigravity 9) mtr 10) hermes 11) codex-app 12) mira 13) seed');
625
625
  const cliChoice = await ask(rl, 'CLI 适配器 [1]: ');
626
626
  let cliId;
627
627
  try {
@@ -711,9 +711,10 @@ async function promptEditBotConfig(rl, bot) {
711
711
  '留空保留当前值。',
712
712
  ]);
713
713
  input.larkAppSecret = await ask(rl, `LARK_APP_SECRET [保留当前值]: `);
714
- console.log('\n支持的 CLI: 1) claude-code 2) aiden 3) coco 4) codex 5) cursor 6) gemini 7) opencode 8) antigravity 9) mtr 10) hermes 11) codex-app 12) mira 13) seed');
714
+ console.log('\n支持的 CLI: 1) claude-code 2) aiden 3) coco(别名 traecli) 4) codex 5) cursor 6) gemini 7) opencode 8) antigravity 9) mtr 10) hermes 11) codex-app 12) mira 13) seed');
715
715
  printInputHelp('CLI 适配器', [
716
716
  '选择 botmux 需要套用哪一种 CLI 参数协议和会话恢复方式。',
717
+ 'coco 的别名 traecli 走同一适配器;二进制名是 traecli 也选 coco 即可。',
717
718
  '留空保留当前值;可以输入序号,也可以直接输入适配器 ID。',
718
719
  ]);
719
720
  input.cliChoice = await ask(rl, `CLI 适配器 [${bot.cliId ?? 'claude-code'}]: `);
@@ -2171,6 +2172,9 @@ botmux v${getVersion()} — IM ↔ AI 编程 CLI 桥接
2171
2172
  lang [zh|en] 切换 UI 语言(无参 = 查看当前设置)
2172
2173
  --bot N 仅改 bots.json 中第 N 个 bot 的 lang
2173
2174
  --unset 清除(global 或 --bot N 配合)
2175
+ voice 配置语音总结(高级功能,独立于 setup)— 交互式填 TTS 引擎+凭证
2176
+ voice status 查看当前语音配置(凭证打码)
2177
+ voice disable 关闭语音功能(移除配置)
2174
2178
 
2175
2179
  定时任务(可在 CLI 会话内自动推断 chat):
2176
2180
  schedule list 列出所有任务
@@ -2188,7 +2192,7 @@ botmux v${getVersion()} — IM ↔ AI 编程 CLI 桥接
2188
2192
  --no-mention 明确声明本条不@任何人
2189
2193
  --quote <message_id> 指定引用某条消息(普通群,默认引用本轮触发消息)
2190
2194
  --no-quote 不引用,发独立消息(普通群)
2191
- --card | --text 强制卡片 / 纯文本(默认按 md 语法自动判断)
2195
+ --voice "<口语文字>" 合成语音气泡发出(需先 botmux voice 配置 TTS)
2192
2196
  --top-level 发顶层消息(不回复进当前话题)
2193
2197
  --chat-id <oc_xxx> 指定目标群(默认当前话题所在群)
2194
2198
  --anyway 跳过「@ 到活跃子 bot」护栏强发(见下)
@@ -2640,8 +2644,8 @@ function argValues(args, ...flags) {
2640
2644
  // Card v2 body builder helpers — extracted to im/lark/md-card.ts so the
2641
2645
  // daemon's bridge fallback path can produce identical cards. cmdSend
2642
2646
  // keeps using `buildCardBodyElements` and `hasMarkdown` from there.
2643
- import { buildCardBodyElements, hasMarkdown, brandFooterSegment } from './im/lark/md-card.js';
2644
- import { claimPendingResponseCard, isPendingResponseCardOpen, markPendingResponseCardPatchedIfCurrent, mergePendingResponseState, shouldUseCardForSend } from './core/pending-response.js';
2647
+ import { buildCardBodyElements, brandFooterSegment } from './im/lark/md-card.js';
2648
+ import { claimPendingResponseCard, markPendingResponseCardPatchedIfCurrent, mergePendingResponseState } from './core/pending-response.js';
2645
2649
  import { resolveBrandLabel } from './bot-registry.js';
2646
2650
  import { config } from './config.js';
2647
2651
  import { resolveQuoteTarget, validateMentionDecision } from './services/send-policy.js';
@@ -2665,14 +2669,22 @@ async function cmdSend(rest) {
2665
2669
  const files = argValues(rest, '--file', '--files');
2666
2670
  const mentionArgs = argValues(rest, '--mention'); // "open_id:Display Name"
2667
2671
  const contentFile = argValue(rest, '--content-file');
2668
- const forceCard = rest.includes('--card');
2669
- const forceText = rest.includes('--text');
2672
+ // 回复一律走交互卡片。`--card` / `--text` 仅为向后兼容被容忍并忽略:纯文本 post
2673
+ // 路径已删除——只有卡片能承载「🔊 语音总结」按钮,且守护进程兜底也一直只发卡片。
2670
2674
  // Publish-mode flags: post a fresh top-level message in a chat instead of
2671
2675
  // replying into the bound thread. Lets a session "publish" to a different
2672
2676
  // chat (e.g. a public release-notes group) while keeping its own thread
2673
2677
  // for streaming-card / progress UI.
2674
2678
  const sendTopLevel = rest.includes('--top-level');
2675
2679
  const overrideChatId = argValue(rest, '--chat-id');
2680
+ // --into <话题根id>: reply this send into a specific topic (a sub-bot's topic,
2681
+ // another thread, etc.) instead of the session's own location. Wins over the
2682
+ // auto/scope default; `dispatch` opens topics, `send --into` posts into them.
2683
+ const sendInto = argValue(rest, '--into');
2684
+ // --voice: synthesize the content into a Feishu voice bubble instead of a
2685
+ // text/card message. The content should be spoken-style prose (the 🔊 button
2686
+ // injects a condense-first instruction before the model calls this).
2687
+ const asVoice = rest.includes('--voice');
2676
2688
  // Quote chain (chat scope): --quote <message_id> overrides the auto target,
2677
2689
  // --no-quote forces a plain (un-quoted) send.
2678
2690
  const explicitQuote = argValue(rest, '--quote');
@@ -2705,7 +2717,7 @@ async function cmdSend(rest) {
2705
2717
  content = readFileSync(contentFile, 'utf-8');
2706
2718
  }
2707
2719
  else {
2708
- const pos = positionals(rest, ['--card', '--text', '--top-level', '--no-quote', '--mention-back', '--no-mention', '--anyway']);
2720
+ const pos = positionals(rest, ['--card', '--text', '--top-level', '--no-quote', '--mention-back', '--no-mention', '--anyway', '--voice']);
2709
2721
  if (pos.length > 0) {
2710
2722
  content = pos.join(' ');
2711
2723
  }
@@ -2717,6 +2729,70 @@ async function cmdSend(rest) {
2717
2729
  console.error('没有内容可发送。用法:\n echo "消息" | botmux send\n botmux send "消息"\n botmux send --content-file /tmp/msg.md --images /tmp/chart.png');
2718
2730
  process.exit(1);
2719
2731
  }
2732
+ // ── Voice mode ──────────────────────────────────────────────────────────
2733
+ // Synthesize the (already-condensed, colloquial) content into a Feishu voice
2734
+ // bubble and return. Deliberately bypasses the text/card path's mentions,
2735
+ // footer, and @-hard-gate — a voice bubble addresses nobody. Lands in the
2736
+ // same thread/chat the session would normally reply to.
2737
+ if (asVoice) {
2738
+ if (!content.trim()) {
2739
+ console.error('--voice 需要要朗读的文字');
2740
+ process.exit(1);
2741
+ }
2742
+ const { registerBot, loadBotConfigs } = await import('./bot-registry.js');
2743
+ try {
2744
+ for (const cfg of loadBotConfigs())
2745
+ registerBot(cfg);
2746
+ }
2747
+ catch { /* */ }
2748
+ const { uploadFile, sendMessage, replyMessage } = await import('./im/lark/client.js');
2749
+ const { synthesizeVoiceOpus } = await import('./services/voice/index.js');
2750
+ const { rmSync } = await import('node:fs');
2751
+ const appId = s.larkAppId;
2752
+ const targetChatId = overrideChatId ?? s.chatId;
2753
+ const target = resolveSendTarget({ into: sendInto, topLevel: sendTopLevel, chatScope: s.scope === 'chat', chatId: targetChatId, rootMessageId: s.rootMessageId });
2754
+ const sendAudio = (fileKey) => target.mode === 'plain'
2755
+ ? sendMessage(appId, target.chatId, JSON.stringify({ file_key: fileKey }), 'audio')
2756
+ : replyMessage(appId, target.root, JSON.stringify({ file_key: fileKey }), 'audio', true);
2757
+ let dir;
2758
+ try {
2759
+ const out = await synthesizeVoiceOpus(appId, content);
2760
+ dir = out.dir;
2761
+ const fileKey = await uploadFile(appId, out.path, { duration: out.durationMs });
2762
+ const sentAtMs = Date.now();
2763
+ const messageId = await sendAudio(fileKey);
2764
+ // 语音也是一次回复:写 bridge fallback marker,否则本轮会被判为"没发 botmux send"
2765
+ // 而触发兜底,多补一张文本卡。与文本/卡片路径同口径:仅同话题回复才记。
2766
+ if (!sendTopLevel && !overrideChatId && !sendInto) {
2767
+ try {
2768
+ const markerDir = join(resolveDataDir(), 'turn-sends');
2769
+ if (!existsSync(markerDir))
2770
+ mkdirSync(markerDir, { recursive: true });
2771
+ appendFileSync(join(markerDir, `${sid}.jsonl`), JSON.stringify({ sentAtMs, messageId }) + '\n');
2772
+ }
2773
+ catch { /* best-effort:漏记只多一条兜底,不致命 */ }
2774
+ }
2775
+ console.error(`✓ 已发送语音 ${messageId} | ${Math.round(out.durationMs / 1000)}s`);
2776
+ console.log(JSON.stringify({ success: true, messageId, sessionId: sid, kind: 'voice', durationMs: out.durationMs }));
2777
+ }
2778
+ catch (e) {
2779
+ console.error(`语音发送失败:${e?.message ?? e}`);
2780
+ if (dir) {
2781
+ try {
2782
+ rmSync(dir, { recursive: true, force: true });
2783
+ }
2784
+ catch { /* */ }
2785
+ }
2786
+ process.exit(1);
2787
+ }
2788
+ if (dir) {
2789
+ try {
2790
+ rmSync(dir, { recursive: true, force: true });
2791
+ }
2792
+ catch { /* */ }
2793
+ }
2794
+ return;
2795
+ }
2720
2796
  // Parse mentions: "open_id:Display Name" or bare "open_id"
2721
2797
  // Bare form appends a trailing <at id=...> to the message and still writes
2722
2798
  // a bot-mention signal — useful when the sender doesn't know the target's
@@ -2803,17 +2879,15 @@ async function cmdSend(rest) {
2803
2879
  // Explicit --mention / --mention-back of an off-topic sub-bot → block + point to
2804
2880
  // the right command (--anyway overrides). Prose @Name injection is filtered
2805
2881
  // (dropped, not blocked) at its own site below.
2806
- if (!rest.includes('--anyway')) {
2807
- for (const m of mentions) {
2808
- const seed = offTopicSubBotSeed(m.open_id);
2809
- if (seed) {
2810
- console.error(`⚠️ ${m.open_id}${m.name ? `(${m.name})` : ''} 是 botmux dispatch 派进子话题 ${seed} 的子 bot——\n` +
2811
- `它的会话在那条子话题里:在主群 @ 它收不到,反而会另起一个无上下文的新会话。\n` +
2812
- `要跟它说,把消息发进它的子话题:\n` +
2813
- ` botmux dispatch --into ${seed} --bot ${m.open_id} --brief "..."\n` +
2814
- `(确属新会话/有意为之,加 --anyway 强发。)`);
2815
- process.exit(2);
2816
- }
2882
+ // Inform, don't block: if @-ing a bot whose session lives in a sub-topic, this
2883
+ // send lands a NEW conversation at the current location. To reply into that
2884
+ // topic instead, use `--into <seed>`. The model picks the destination — no hard
2885
+ // block (that was too aggressive; @-ing a bot in the group to start a fresh
2886
+ // conversation is a legitimate, common intent).
2887
+ for (const m of mentions) {
2888
+ const seed = offTopicSubBotSeed(m.open_id);
2889
+ if (seed) {
2890
+ console.error(`ℹ️ ${m.open_id}${m.name ? `(${m.name})` : ''} 在子话题 ${seed} 里也有会话;本条发到当前位置(新对话)。要发进那个话题改用 --into ${seed}。`);
2817
2891
  }
2818
2892
  }
2819
2893
  // Oncall addressing only meaningful for replies inside the session's own
@@ -2821,13 +2895,14 @@ async function cmdSend(rest) {
2821
2895
  // oncall as chat-level: in multi-daemon setups this session's bot may not
2822
2896
  // be the one that persisted the binding, but users still expect footer
2823
2897
  // addressing to go to the last caller in the shared oncall workspace.
2824
- const oncallEntry = !sendTopLevel && !overrideChatId && s.chatId
2898
+ const oncallEntry = !sendTopLevel && !overrideChatId && !sendInto && s.chatId
2825
2899
  ? findOncallChatForAnyBot(s.chatId) : undefined;
2826
2900
  // Dispatch helper: top-level / chat-scope send vs reply-in-thread, single
2827
2901
  // decision point. Used for file attachments (always plain in chat scope).
2828
- const dispatch = (content, msgType) => (sendTopLevel || isChatScope)
2829
- ? sendMessage(appId, targetChatId, content, msgType)
2830
- : replyMessage(appId, s.rootMessageId, content, msgType, true);
2902
+ const sendTarget = resolveSendTarget({ into: sendInto, topLevel: sendTopLevel, chatScope: isChatScope, chatId: targetChatId, rootMessageId: s.rootMessageId });
2903
+ const dispatch = (content, msgType) => sendTarget.mode === 'plain'
2904
+ ? sendMessage(appId, sendTarget.chatId, content, msgType)
2905
+ : replyMessage(appId, sendTarget.root, content, msgType, true);
2831
2906
  const recordBridgeSendMarker = (sentAtMs, messageId) => {
2832
2907
  try {
2833
2908
  const markerDir = join(resolveDataDir(), 'turn-sends');
@@ -2838,7 +2913,7 @@ async function cmdSend(rest) {
2838
2913
  }
2839
2914
  catch { /* best-effort: marker miss only causes a redundant fallback message */ }
2840
2915
  };
2841
- const shouldRecordBridgeMarker = !sendTopLevel && !overrideChatId;
2916
+ const shouldRecordBridgeMarker = !sendTopLevel && !overrideChatId && !sendInto;
2842
2917
  const dispatchOrPatchPending = async (content, msgType) => {
2843
2918
  const pendingCardId = msgType === 'interactive' ? claimPendingResponseCard(s) : undefined;
2844
2919
  const sentId = await dispatchPrimary(content, msgType);
@@ -2853,7 +2928,7 @@ async function cmdSend(rest) {
2853
2928
  // Quote chain (普通群): the primary message replies to the turn's target so
2854
2929
  // Lark renders a 引用 chain. --quote overrides, --no-quote opts out. Thread
2855
2930
  // scope and --top-level never quote. Withdrawn target → fall back to plain.
2856
- const quoteTargetId = resolveQuoteTarget({
2931
+ const quoteTargetId = sendInto ? undefined : resolveQuoteTarget({
2857
2932
  isChatScope, sendTopLevel, noQuote, explicitQuote,
2858
2933
  sessionQuoteTargetId: s.quoteTargetId,
2859
2934
  });
@@ -2979,16 +3054,9 @@ async function cmdSend(rest) {
2979
3054
  }
2980
3055
  if (alreadyMentioned.has(senderScopedId))
2981
3056
  break;
2982
- // Footgun guard at the auto-injection source: don't turn a prose
2983
- // `@OtherSubBot` into a real @ for a dispatched sub-bot that's off-topic
2984
- // here that would spawn a context-less session in the main chat (the
2985
- // explicit guard above only saw --mention/--mention-back). Drop the
2986
- // injection (don't block the whole send); --anyway forces it through.
2987
- const injOffSeed = rest.includes('--anyway') ? null : offTopicSubBotSeed(senderScopedId);
2988
- if (injOffSeed) {
2989
- console.error(`[botmux send] 跳过正文 @${entry.botName} 自动注入:它是 dispatch 派进子话题 ${injOffSeed} 的子 bot、不在本会话——避免在主群另起无上下文会话(要强发加 --anyway)。`);
2990
- break;
2991
- }
3057
+ // Prose `@OtherBot` auto-injection: inject normally. (The off-topic
3058
+ // sub-bot guard used to DROP this; we now let the model @ freely and
3059
+ // pick the destination with --into instead of being silently dropped.)
2992
3060
  mentions.push({ open_id: senderScopedId, name: entry.botName });
2993
3061
  alreadyMentioned.add(senderScopedId);
2994
3062
  break;
@@ -3009,15 +3077,6 @@ async function cmdSend(rest) {
3009
3077
  hasExplicitBotMention: explicitKnownBotMention,
3010
3078
  knownBotOpenIds,
3011
3079
  });
3012
- // Decide: interactive card (renders markdown) vs. post (plain text).
3013
- // An open pending response card takes precedence over --text so the
3014
- // placeholder can close cleanly; otherwise explicit --card / --text wins.
3015
- const useCard = shouldUseCardForSend({
3016
- forceCard,
3017
- forceText,
3018
- hasMarkdown: hasMarkdown(text),
3019
- hasOpenPendingResponseCard: isPendingResponseCardOpen(s),
3020
- });
3021
3080
  const mentionMap = new Map();
3022
3081
  for (const m of mentions)
3023
3082
  if (m.name)
@@ -3034,7 +3093,8 @@ async function cmdSend(rest) {
3034
3093
  // we committed to sending — that's the boundary the gate cares about.
3035
3094
  const sentAtMs = Date.now();
3036
3095
  let messageId;
3037
- if (useCard) {
3096
+ {
3097
+ // 回复一律卡片(纯文本 post 路径已删)。
3038
3098
  // Inline @mention → <at id=open_id></at>; explicit --mention args that
3039
3099
  // weren't inlined are appended to the body. The session owner is
3040
3100
  // rendered in the footer note instead of the body.
@@ -3097,14 +3157,58 @@ async function cmdSend(rest) {
3097
3157
  if (footerRecipients.length > 0) {
3098
3158
  footerParts.push(`发送给:${footerRecipients.map(id => `<at id=${id}></at>`).join(' ')}`);
3099
3159
  }
3100
- // Empty brand + no recipients no footer at all (skip the orphan HR).
3101
- if (footerParts.length > 0) {
3160
+ // Footer line (brand 个性签名 + 发送给) and the optional 🔊 语音总结 button
3161
+ // share ONE row: footer text on the left (weighted, fills), button pinned
3162
+ // to the far right (auto width). When voice isn't configured the footer
3163
+ // renders alone, as before. Button only on a reply (not --top-level).
3164
+ // v2 cards put buttons inside column_set/column — never the 1.x
3165
+ // `tag:'action'` container (Feishu rejects it, error 200861).
3166
+ let voiceOn = false;
3167
+ if (!sendTopLevel) {
3168
+ try {
3169
+ const { isVoiceConfigured } = await import('./services/voice/index.js');
3170
+ voiceOn = isVoiceConfigured(appId);
3171
+ }
3172
+ catch { /* voice module/config unavailable → no button */ }
3173
+ }
3174
+ const footerContent = footerParts.length > 0
3175
+ ? `<font color='grey'>${footerParts.join(' · ')}</font>`
3176
+ : '';
3177
+ if (footerContent || voiceOn) {
3102
3178
  elements.push({ tag: 'hr' });
3103
- elements.push({
3104
- tag: 'markdown',
3105
- text_size: 'notation_small_v2',
3106
- content: `<font color='grey'>${footerParts.join(' · ')}</font>`,
3107
- });
3179
+ if (voiceOn) {
3180
+ const anchorId = (isChatScope ? s.chatId : s.rootMessageId) ?? s.chatId;
3181
+ elements.push({
3182
+ tag: 'column_set',
3183
+ flex_mode: 'none',
3184
+ horizontal_spacing: 'default',
3185
+ columns: [
3186
+ {
3187
+ tag: 'column', width: 'weighted', weight: 1, vertical_align: 'center',
3188
+ elements: [{ tag: 'markdown', text_size: 'notation_small_v2', content: footerContent || ' ' }],
3189
+ },
3190
+ {
3191
+ tag: 'column', width: 'auto', vertical_align: 'center',
3192
+ elements: [{
3193
+ tag: 'button',
3194
+ text: { tag: 'plain_text', content: '🔊 语音总结' },
3195
+ type: 'default',
3196
+ behaviors: [{
3197
+ type: 'callback',
3198
+ value: { action: 'voice_summary', session_id: sid, root_id: anchorId, lark_app_id: appId, chat_id: targetChatId },
3199
+ }],
3200
+ }],
3201
+ },
3202
+ ],
3203
+ });
3204
+ }
3205
+ else {
3206
+ elements.push({
3207
+ tag: 'markdown',
3208
+ text_size: 'notation_small_v2',
3209
+ content: footerContent,
3210
+ });
3211
+ }
3108
3212
  }
3109
3213
  const cardJson = JSON.stringify({
3110
3214
  schema: '2.0',
@@ -3113,54 +3217,6 @@ async function cmdSend(rest) {
3113
3217
  });
3114
3218
  messageId = await dispatchOrPatchPending(cardJson, 'interactive');
3115
3219
  }
3116
- else {
3117
- // Plain-text path: build post content, paragraph per line.
3118
- const postContent = text ? text.split('\n').map((line) => {
3119
- if (!mentionPattern)
3120
- return [{ tag: 'text', text: line }];
3121
- const nodes = [];
3122
- let lastIndex = 0;
3123
- for (const match of line.matchAll(mentionPattern)) {
3124
- const openId = mentionMap.get(match[1].toLowerCase());
3125
- if (!openId)
3126
- continue;
3127
- if (match.index > lastIndex)
3128
- nodes.push({ tag: 'text', text: line.slice(lastIndex, match.index) });
3129
- nodes.push({ tag: 'at', user_id: openId });
3130
- lastIndex = match.index + match[0].length;
3131
- }
3132
- if (lastIndex < line.length)
3133
- nodes.push({ tag: 'text', text: line.slice(lastIndex) });
3134
- return nodes.length > 0 ? nodes : [{ tag: 'text', text: line }];
3135
- }) : [];
3136
- for (const key of imageKeys)
3137
- postContent.push([{ tag: 'img', image_key: key }]);
3138
- // Footer: mirror the card layout — all real mentions go on one
3139
- // `发送给:` line (human addressee first, then explicit targets, then cc),
3140
- // separated from the body by a blank paragraph. Ids already inlined in the
3141
- // body prose are skipped. Top-level publish keeps sendTo empty.
3142
- const inlinedIds = new Set();
3143
- for (const para of postContent)
3144
- for (const n of para)
3145
- if (n.tag === 'at')
3146
- inlinedIds.add(n.user_id);
3147
- const footerRecipients = orderedFooterRecipients({
3148
- sendTo: footerAddressing.sendTo,
3149
- mentionIds: mentions.map(m => m.open_id),
3150
- cc: footerAddressing.cc,
3151
- inlinedIds,
3152
- });
3153
- if (footerRecipients.length > 0) {
3154
- if (postContent.length > 0)
3155
- postContent.push([{ tag: 'text', text: '' }]);
3156
- postContent.push([
3157
- { tag: 'text', text: '发送给:' },
3158
- ...footerRecipients.map(id => ({ tag: 'at', user_id: id })),
3159
- ]);
3160
- }
3161
- const postJson = JSON.stringify({ zh_cn: { title: '', content: postContent } });
3162
- messageId = await dispatchPrimary(postJson, 'post');
3163
- }
3164
3220
  // Bridge fallback marker — append-only jsonl per session. Same-thread
3165
3221
  // sends always suppress transcript fallback; detoured sends suppress only
3166
3222
  // when they closed a pending response card for this turn.
@@ -4177,6 +4233,96 @@ if (process.env.BOTMUX_WORKFLOW === '1') {
4177
4233
  process.exit(2);
4178
4234
  }
4179
4235
  }
4236
+ /**
4237
+ * `botmux voice` — standalone voice-summary configuration (advanced feature,
4238
+ * intentionally NOT folded into `botmux setup`). Writes the global `voice`
4239
+ * block to ~/.botmux/config.json. Subcommands: (none)=interactive setup,
4240
+ * `status`=show masked config, `disable`=remove.
4241
+ */
4242
+ async function cmdVoiceSetup(args) {
4243
+ const sub = (args[0] ?? '').toLowerCase();
4244
+ const { readGlobalConfig, mergeGlobalConfig } = await import('./global-config.js');
4245
+ const { DEFAULT_SAMI_SPEAKER, DEFAULT_OPENAI_SPEAKER } = await import('./services/voice/index.js');
4246
+ const mask = (s) => (s ? `${s.slice(0, 4)}***` : '(未设)');
4247
+ if (sub === 'status') {
4248
+ const v = readGlobalConfig().voice;
4249
+ if (!v) {
4250
+ console.log('语音功能未配置。运行 `botmux voice` 配置。');
4251
+ return;
4252
+ }
4253
+ console.log('当前语音配置(全局 ~/.botmux/config.json):');
4254
+ console.log(` 引擎: ${v.engine ?? '(自动)'}`);
4255
+ console.log(` 音色: ${v.speaker ?? '(默认)'}`);
4256
+ if (typeof v.rate === 'number')
4257
+ console.log(` 语速: ${v.rate}`);
4258
+ if (v.sami)
4259
+ console.log(` SAMI: accessKey=${mask(v.sami.accessKey)} secretKey=${mask(v.sami.secretKey)} appkey=${v.sami.appkey ?? '(未设)'}${v.sami.tokenUrl ? ` tokenUrl=${v.sami.tokenUrl}` : ''}`);
4260
+ if (v.openai)
4261
+ console.log(` OpenAI: baseUrl=${v.openai.baseUrl ?? '(未设)'} model=${v.openai.model ?? '(未设)'} apiKey=${mask(v.openai.apiKey)}`);
4262
+ return;
4263
+ }
4264
+ if (sub === 'disable' || sub === 'off') {
4265
+ mergeGlobalConfig({ voice: null });
4266
+ console.log('✅ 已移除全局语音配置(回复卡片不再显示「🔊 语音总结」按钮)。重启 daemon 生效。');
4267
+ return;
4268
+ }
4269
+ if (sub && sub !== 'setup') {
4270
+ console.error('用法: botmux voice [status|disable](无参 = 交互式配置)');
4271
+ process.exit(1);
4272
+ }
4273
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
4274
+ try {
4275
+ console.log('🔊 配置语音总结(高级功能)。写入全局 ~/.botmux/config.json,重启后生效。\n');
4276
+ const eng = (await ask(rl, '选择 TTS 引擎 [1] SAMI(需 AK/SK/appkey) [2] OpenAI 兼容(自带 baseUrl/key): ')).trim();
4277
+ const voice = {};
4278
+ if (eng === '2' || /openai/i.test(eng)) {
4279
+ voice.engine = 'openai';
4280
+ const baseUrl = (await ask(rl, 'baseUrl(如 https://api.openai.com/v1,自托管如 http://127.0.0.1:8880/v1): ')).trim();
4281
+ const apiKey = (await ask(rl, 'apiKey(无则留空): ')).trim();
4282
+ const model = (await ask(rl, 'model(如 tts-1 / kokoro): ')).trim();
4283
+ if (!baseUrl || !model) {
4284
+ console.error('❌ baseUrl 和 model 必填,未写入。');
4285
+ return;
4286
+ }
4287
+ voice.openai = { baseUrl, apiKey, model };
4288
+ const sp = (await ask(rl, `音色 voice(留空=默认 ${DEFAULT_OPENAI_SPEAKER}): `)).trim();
4289
+ if (sp)
4290
+ voice.speaker = sp;
4291
+ }
4292
+ else {
4293
+ voice.engine = 'sami';
4294
+ const accessKey = (await ask(rl, 'SAMI accessKey: ')).trim();
4295
+ const secretKey = (await ask(rl, 'SAMI secretKey: ')).trim();
4296
+ const appkey = (await ask(rl, 'SAMI appkey: ')).trim();
4297
+ if (!accessKey || !secretKey || !appkey) {
4298
+ console.error('❌ accessKey/secretKey/appkey 都必填,未写入。');
4299
+ return;
4300
+ }
4301
+ voice.sami = { accessKey, secretKey, appkey };
4302
+ const sp = (await ask(rl, `音色 speaker(留空=默认灿灿 ${DEFAULT_SAMI_SPEAKER}): `)).trim();
4303
+ if (sp)
4304
+ voice.speaker = sp;
4305
+ const adv = (await ask(rl, '自定义 SAMI 端点?一般不用,回车跳过 (y/N): ')).trim().toLowerCase();
4306
+ if (adv === 'y') {
4307
+ const tokenUrl = (await ask(rl, 'tokenUrl(留空用默认): ')).trim();
4308
+ const wsUrl = (await ask(rl, 'wsUrl(留空用默认): ')).trim();
4309
+ if (tokenUrl)
4310
+ voice.sami.tokenUrl = tokenUrl;
4311
+ if (wsUrl)
4312
+ voice.sami.wsUrl = wsUrl;
4313
+ }
4314
+ }
4315
+ const rate = (await ask(rl, '语速倍率(留空=1.1): ')).trim();
4316
+ if (rate && !Number.isNaN(Number(rate)))
4317
+ voice.rate = Number(rate);
4318
+ mergeGlobalConfig({ voice: voice });
4319
+ console.log('\n✅ 已写入 voice 配置。`botmux restart` 后,配了语音的机器人回复卡片底部会出现「🔊 语音总结」按钮。');
4320
+ console.log(' 查看:`botmux voice status` 关闭:`botmux voice disable`');
4321
+ }
4322
+ finally {
4323
+ rl.close();
4324
+ }
4325
+ }
4180
4326
  switch (command) {
4181
4327
  case '--version':
4182
4328
  case '-v':
@@ -4264,6 +4410,9 @@ switch (command) {
4264
4410
  case 'lang':
4265
4411
  cmdLang(process.argv.slice(3));
4266
4412
  break;
4413
+ case 'voice':
4414
+ await cmdVoiceSetup(process.argv.slice(3));
4415
+ break;
4267
4416
  case 'thread': {
4268
4417
  // Removed in favor of `botmux history` (普通群也兼容). Friendly stderr so
4269
4418
  // pre-rename scripts/skills surface the rename instead of "unknown command".