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.
- package/dist/adapters/backend/zellij-observe-backend.d.ts +15 -0
- package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zellij-observe-backend.js +37 -0
- package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts +3 -3
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +44 -28
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/seed.d.ts +1 -1
- package/dist/adapters/cli/seed.js +2 -2
- package/dist/adapters/cli/seed.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +5 -1
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +8 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +31 -5
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +250 -101
- package/dist/cli.js.map +1 -1
- package/dist/core/dispatch.d.ts +23 -0
- package/dist/core/dispatch.d.ts.map +1 -1
- package/dist/core/dispatch.js +17 -0
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/pending-response.d.ts +0 -6
- package/dist/core/pending-response.d.ts.map +1 -1
- package/dist/core/pending-response.js +0 -5
- package/dist/core/pending-response.js.map +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +5 -0
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/worker-pool.d.ts +26 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +68 -1
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts +46 -3
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +86 -7
- package/dist/dashboard/bot-onboarding.js.map +1 -1
- package/dist/dashboard/federated-group-core.js +8 -4
- package/dist/dashboard/federated-group-core.js.map +1 -1
- package/dist/dashboard/federation-api.d.ts.map +1 -1
- package/dist/dashboard/federation-api.js +22 -2
- package/dist/dashboard/federation-api.js.map +1 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js +139 -20
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +36 -6
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard-web/app.js +171 -143
- package/dist/dashboard-web/style.css +58 -0
- package/dist/dashboard.js +37 -1
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +5 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +17 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +4 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +4 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +1 -1
- package/dist/im/lark/card-builder.js +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +59 -10
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +3 -1
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +7 -2
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +8 -6
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/services/codex-paths.d.ts +7 -0
- package/dist/services/codex-paths.d.ts.map +1 -0
- package/dist/services/codex-paths.js +19 -0
- package/dist/services/codex-paths.js.map +1 -0
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js +5 -4
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/voice/audio.d.ts +32 -0
- package/dist/services/voice/audio.d.ts.map +1 -0
- package/dist/services/voice/audio.js +114 -0
- package/dist/services/voice/audio.js.map +1 -0
- package/dist/services/voice/index.d.ts +32 -0
- package/dist/services/voice/index.d.ts.map +1 -0
- package/dist/services/voice/index.js +98 -0
- package/dist/services/voice/index.js.map +1 -0
- package/dist/services/voice/openai.d.ts +24 -0
- package/dist/services/voice/openai.d.ts.map +1 -0
- package/dist/services/voice/openai.js +47 -0
- package/dist/services/voice/openai.js.map +1 -0
- package/dist/services/voice/sami.d.ts +22 -0
- package/dist/services/voice/sami.d.ts.map +1 -0
- package/dist/services/voice/sami.js +128 -0
- package/dist/services/voice/sami.js.map +1 -0
- package/dist/services/voice/types.d.ts +32 -0
- package/dist/services/voice/types.d.ts.map +1 -0
- package/dist/services/voice/types.js +2 -0
- package/dist/services/voice/types.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts +9 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +26 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/verify-permissions.js +3 -3
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +0 -1
- package/dist/skills/definitions.js.map +1 -1
- package/dist/worker.js +33 -2
- package/dist/worker.js.map +1 -1
- package/dist/workflows/events/schema.d.ts +140 -140
- package/package.json +1 -1
package/dist/bot-registry.js
CHANGED
|
@@ -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
|
|
84
|
+
// Cross-bot oncall chat discovery — cached by config-file mtime.
|
|
85
85
|
//
|
|
86
|
-
// /oncall bind is per-bot
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
//
|
|
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;
|
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,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAiLtE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;AAEzC,8EAA8E;AAC9E,yDAAyD;AACzD,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAEnC,sFAAsF;AACtF,IAAI,gBAAoC,CAAC;AACzC,MAAM,UAAU,mBAAmB;IACjC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,wEAAwE;AACxE,uEAAuE;AACvE,yEAAyE;AACzE,4CAA4C;AAC5C,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,yEAAyE;AACzE,qCAAqC;AACrC,SAAS,aAAa,CAAC,CAAU;IAC/B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AAC/D,CAAC;AACD,MAAM,OAAO,GAAG,CAAC,GAAU,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjE,MAAM,UAAU,GAAG;IACjB,KAAK,EAAE,CAAC,GAAG,GAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAChE,IAAI,EAAG,CAAC,GAAG,GAAU,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/D,IAAI,EAAG,CAAC,GAAG,GAAU,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/D,KAAK,EAAE,CAAC,GAAG,GAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAChE,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,GAAuE,CAAC;CACnG,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,GAAc;IACxC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;QAC7B,KAAK,EAAE,GAAG,CAAC,SAAS;QACpB,SAAS,EAAE,GAAG,CAAC,aAAa;QAC5B,MAAM,EAAE,UAAU;KACnB,CAAC,CAAC;IACH,MAAM,KAAK,GAAa;QACtB,MAAM,EAAE,GAAG;QACX,MAAM;QACN,oBAAoB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QACnD,wBAAwB,EAAE,IAAI,GAAG,EAAE;KACpC,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,SAAiB;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;AAClC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,MAAc;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,GAAG,EAAE,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;AACjE,CAAC;AAED,6DAA6D;AAC7D,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,4EAA4E;AAC5E,oEAAoE;AACpE,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,6DAA6D;AAC7D,IAAI,eAAe,GAA+D,IAAI,CAAC;AAEvF,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,2EAA2E;IAC3E,gDAAgD;IAChD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACrE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,mEAAmE;IACnE,MAAM,IAAI,GAAG,gBAAgB,CAAC;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;YAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;oBACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC;wBAAE,SAAS;oBACjD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;wBAClC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;4BAC1E,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;wBACtE,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,eAAe,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAc;IACvD,OAAO,CAAC,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,gFAAgF;AAChF,uEAAuE;AACvE,IAAI,eAAe,GAAqE,IAAI,CAAC;AAE7F;;oEAEoE;AACpE,SAAS,kBAAkB;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACpC,IAAI,GAAG,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAAC,CAAC;IACrE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACrD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC;IAC1C,MAAM,IAAI,GAAG,gBAAgB,IAAI,kBAAkB,EAAE,CAAC;IACtD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA8B,CAAC;YAClD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;oBACpB,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;wBACzC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBACpF,CAAC;gBACH,CAAC;YACH,CAAC;YACD,eAAe,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;QACnD,CAAC;QACD,OAAO,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc;IAC5B,yBAAyB;IACzB,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC/C,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,gBAAgB,GAAG,QAAQ,CAAC;QAC5B,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,yBAAyB;IACzB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC/D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,gBAAgB,GAAG,WAAW,CAAC;QAC/B,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,IAAI,KAAK,CACb,2GAA2G,CAC5G,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,4EAA4E;QAC5E,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,OAAO,IAAI,GAAG,WAAW,QAAQ,GAAG,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,+CAA+C,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,mDAAmD,CAAC,CAAC;QACvF,CAAC;QAED,sFAAsF;QACtF,IAAI,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjG,CAAC;QAED,IAAI,WAAqC,CAAC;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,WAAW,GAAG,KAAK,CAAC,WAAW;iBAC5B,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC;iBACzF,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBAChB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,UAAU,EAAE,CAAC,CAAC,UAAU;aACzB,CAAC,CAAC,CAAC;QACR,CAAC;QAED,IAAI,iBAAuC,CAAC;QAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC3C,iBAAiB,GAAG,KAAK,CAAC,iBAAiB;iBACxC,MAAM,CAAC,CAAC,CAAM,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC7E,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,mEAAmE;QACnE,0EAA0E;QAC1E,yEAAyE;QACzE,uEAAuE;QACvE,IAAI,aAA2C,CAAC;QAChD,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC;QACvC,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,KAAK,IAAI,CAAC;YAC5C,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1F,MAAM,KAAK,GAAG,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;gBACrF,CAAC,CAAC,UAAU,CAAC,KAAK;gBAClB,CAAC,CAAC,CAAC,CAAC;YACN,aAAa,GAAG,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QAC1E,CAAC;QAED,IAAI,2BAAiD,CAAC;QACtD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,CAAC;YACrD,2BAA2B,GAAG,KAAK,CAAC,2BAA2B;iBAC5D,MAAM,CAAC,CAAC,CAAM,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC5D,CAAC;QAED,yEAAyE;QACzE,8BAA8B;QAC9B,IAAI,UAAsD,CAAC;QAC3D,IAAI,KAAK,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACjG,MAAM,GAAG,GAAmC,EAAE,CAAC;YAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAClC,MAAM,GAAG,GAAI,GAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;gBAC7E,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;oBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YACrC,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,UAAU,GAAG,GAAG,CAAC;QACpD,CAAC;QAED,oEAAoE;QACpE,wBAAwB;QACxB,IAAI,YAAkC,CAAC;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,MAAM,GAAG,GAAI,KAAK,CAAC,YAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnH,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAAE,YAAY,GAAG,GAAG,CAAC;QACzC,CAAC;QAED,gEAAgE;QAChE,IAAI,YAAmD,CAAC;QACxD,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;QACjC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;YAC7B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,YAAY,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QAChG,CAAC;QAED,iEAAiE;QACjE,+DAA+D;QAC/D,IAAI,UAAwE,CAAC;QAC7E,IAAI,KAAK,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACjG,MAAM,GAAG,GAAqD,EAAE,CAAC;YACjE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtD,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;oBAAE,SAAS;gBAClD,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,SAAS;gBAC1C,MAAM,KAAK,GAAI,CAAS,CAAC,KAAK,EAAE,IAAI,GAAI,CAAS,CAAC,IAAI,CAAC;gBACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;oBAAE,SAAS;gBAClF,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;oBAAE,SAAS;gBAC9E,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,UAAU,GAAG,GAAG,CAAC;QACpD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,IAAI,EAAE,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;YACzF,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,aAAa;YACnC,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,KAAK,EAAE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;gBAC1D,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;gBACpB,CAAC,CAAC,SAAS;YACb,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,KAAK,IAAI;YACjD,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,UAAU;YAChD,WAAW;YACX,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,iBAAiB;YACjB,WAAW;YACX,aAAa;YACb,2BAA2B;YAC3B,iBAAiB,EAAE,OAAO,KAAK,CAAC,iBAAiB,KAAK,QAAQ,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE;gBAC9F,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE;gBAChC,CAAC,CAAC,SAAS;YACb,UAAU;YACV,YAAY;YACZ,YAAY;YACZ,UAAU;YACV,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,KAAK,IAAI,IAAI,SAAS;YACxE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACnD,yEAAyE;YACzE,kEAAkE;YAClE,UAAU,EAAE,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YAC/E,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,KAAK,IAAI,IAAI,SAAS;YACtE,0BAA0B,EAAE,KAAK,CAAC,0BAA0B,KAAK,IAAI,IAAI,SAAS;YAClF,WAAW,EAAE,KAAK,CAAC,WAAW,KAAK,IAAI,IAAI,SAAS;YACpD,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,KAAK,IAAI,IAAI,SAAS;YACtE,wEAAwE;YACxE,kDAAkD;YAClD,0BAA0B,EAAE,OAAO,KAAK,CAAC,0BAA0B,KAAK,QAAQ,IAAI,KAAK,CAAC,0BAA0B,CAAC,IAAI,EAAE;gBACzH,CAAC,CAAC,KAAK,CAAC,0BAA0B;gBAClC,CAAC,CAAC,SAAS;YACb,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,KAAK,IAAI,IAAI,SAAS;SACrE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
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":";
|
|
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
|
-
--
|
|
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,
|
|
2644
|
-
import { claimPendingResponseCard,
|
|
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
|
-
|
|
2669
|
-
|
|
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
|
-
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
|
|
2811
|
-
|
|
2812
|
-
|
|
2813
|
-
|
|
2814
|
-
|
|
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
|
|
2829
|
-
|
|
2830
|
-
|
|
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
|
-
//
|
|
2983
|
-
//
|
|
2984
|
-
//
|
|
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
|
-
|
|
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
|
-
//
|
|
3101
|
-
|
|
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
|
-
|
|
3104
|
-
|
|
3105
|
-
|
|
3106
|
-
|
|
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".
|