botmux 2.82.1 → 2.82.3

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 (59) hide show
  1. package/dist/adapters/cli/codex.d.ts.map +1 -1
  2. package/dist/adapters/cli/codex.js +9 -6
  3. package/dist/adapters/cli/codex.js.map +1 -1
  4. package/dist/adapters/cli/pi.d.ts.map +1 -1
  5. package/dist/adapters/cli/pi.js +1 -0
  6. package/dist/adapters/cli/pi.js.map +1 -1
  7. package/dist/adapters/cli/types.d.ts +9 -0
  8. package/dist/adapters/cli/types.d.ts.map +1 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +7 -23
  11. package/dist/cli.js.map +1 -1
  12. package/dist/core/command-handler.d.ts +2 -9
  13. package/dist/core/command-handler.d.ts.map +1 -1
  14. package/dist/core/command-handler.js +34 -28
  15. package/dist/core/command-handler.js.map +1 -1
  16. package/dist/core/passthrough-commands.d.ts +48 -0
  17. package/dist/core/passthrough-commands.d.ts.map +1 -0
  18. package/dist/core/passthrough-commands.js +76 -0
  19. package/dist/core/passthrough-commands.js.map +1 -0
  20. package/dist/daemon.d.ts.map +1 -1
  21. package/dist/daemon.js +5 -1
  22. package/dist/daemon.js.map +1 -1
  23. package/dist/i18n/en.d.ts.map +1 -1
  24. package/dist/i18n/en.js +2 -0
  25. package/dist/i18n/en.js.map +1 -1
  26. package/dist/i18n/zh.d.ts.map +1 -1
  27. package/dist/i18n/zh.js +2 -0
  28. package/dist/i18n/zh.js.map +1 -1
  29. package/dist/im/lark/card-builder.d.ts.map +1 -1
  30. package/dist/im/lark/card-builder.js +2 -0
  31. package/dist/im/lark/card-builder.js.map +1 -1
  32. package/dist/im/lark/card-handler.d.ts.map +1 -1
  33. package/dist/im/lark/card-handler.js +17 -1
  34. package/dist/im/lark/card-handler.js.map +1 -1
  35. package/dist/im/lark/client.d.ts.map +1 -1
  36. package/dist/im/lark/client.js +63 -53
  37. package/dist/im/lark/client.js.map +1 -1
  38. package/dist/im/lark/md-card.d.ts +18 -0
  39. package/dist/im/lark/md-card.d.ts.map +1 -1
  40. package/dist/im/lark/md-card.js +160 -0
  41. package/dist/im/lark/md-card.js.map +1 -1
  42. package/dist/services/bot-config-store.d.ts +5 -3
  43. package/dist/services/bot-config-store.d.ts.map +1 -1
  44. package/dist/services/bot-config-store.js +16 -7
  45. package/dist/services/bot-config-store.js.map +1 -1
  46. package/dist/services/cursor-resume-policy.d.ts +12 -0
  47. package/dist/services/cursor-resume-policy.d.ts.map +1 -0
  48. package/dist/services/cursor-resume-policy.js +15 -0
  49. package/dist/services/cursor-resume-policy.js.map +1 -0
  50. package/dist/skills/definitions.d.ts.map +1 -1
  51. package/dist/skills/definitions.js +2 -0
  52. package/dist/skills/definitions.js.map +1 -1
  53. package/dist/utils/pending-input-queue.d.ts +6 -0
  54. package/dist/utils/pending-input-queue.d.ts.map +1 -0
  55. package/dist/utils/pending-input-queue.js +9 -0
  56. package/dist/utils/pending-input-queue.js.map +1 -0
  57. package/dist/worker.js +145 -4
  58. package/dist/worker.js.map +1 -1
  59. package/package.json +1 -1
@@ -5,7 +5,8 @@ import { type ZellijAdoptableSession } from './zellij-adopt-discovery.js';
5
5
  import { type CodexAppThreadSummary } from '../services/codex-app-threads.js';
6
6
  import type { LarkMessage } from '../types.js';
7
7
  import type { DaemonSession } from './types.js';
8
- export declare const DAEMON_COMMANDS: Set<string>;
8
+ import { DAEMON_COMMANDS, PASSTHROUGH_COMMANDS } from './passthrough-commands.js';
9
+ export { DAEMON_COMMANDS, PASSTHROUGH_COMMANDS };
9
10
  /**
10
11
  * Daemon commands that act on the chat itself rather than opening a
11
12
  * conversation. `/group` (`/g`) just creates a Lark group and replies once —
@@ -15,14 +16,6 @@ export declare const DAEMON_COMMANDS: Set<string>;
15
16
  * that pollutes the dashboard's session list. Handle them without a session.
16
17
  */
17
18
  export declare const SESSIONLESS_DAEMON_COMMANDS: Set<string>;
18
- /**
19
- * Slash commands that are forwarded verbatim to the underlying CLI (e.g.
20
- * Claude Code's `/compact`, `/model`, `/usage`). The daemon does NOT handle
21
- * these — it just relays them to the worker via a raw_input IPC message,
22
- * bypassing the normal prompt-wrapping and bracketed-paste path so the CLI's
23
- * own slash-command parser sees them.
24
- */
25
- export declare const PASSTHROUGH_COMMANDS: Set<string>;
26
19
  export declare function resolveAdapterDefaultPassthroughCommands(larkAppId?: string): string[];
27
20
  /**
28
21
  * Effective passthrough set for a bot: the fixed {@link PASSTHROUGH_COMMANDS}
@@ -1 +1 @@
1
- {"version":3,"file":"command-handler.d.ts","sourceRoot":"","sources":["../../src/core/command-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-handler.d.ts","sourceRoot":"","sources":["../../src/core/command-handler.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAQxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAoF,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACjJ,OAAO,EAA8D,KAAK,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACtI,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAsBnG,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAUhD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAA4D,MAAM,2BAA2B,CAAC;AAC5I,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,CAAC;AAEjD;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,aAA2E,CAAC;AAEpH,wBAAgB,wCAAwC,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAYrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAe1E;AAID,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA0C9C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKpF;AAED;;;;mCAImC;AACnC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAqB1F;AAoED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1H,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,gCAAgC,EAAE,WAAW,EAAE,CAAC,CAAC;CACnF;AAsbD;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CA6Df;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,kBAAkB,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA2iDf;AAoDD,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,qBAAqB,EAC7B,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,kBAAkB,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,GAAG,sBAAsB,EACjD,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,kBAAkB,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED;;;wBAGwB;AACxB,wBAAsB,+BAA+B,CACnD,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC1C,KAAK,SAAK,GACT,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuB7B;AAED;;kFAEkF;AAClF,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,gBAAgB,EACxB,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,kBAAkB,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -33,7 +33,7 @@ import { resolveDocFile, subscribeDocFile, unsubscribeDocFile } from '../im/lark
33
33
  import { UserTokenMissingError } from '../im/lark/client.js';
34
34
  import { putDocSubscription, removeDocSubscription, listDocSubscriptionsForSession, } from '../services/doc-subs-store.js';
35
35
  import { bindOncall, unbindOncall, getOncallStatus } from '../services/oncall-store.js';
36
- import { CONFIG_FIELDS, findConfigField, settableFieldKeys, parseBooleanValue, applyConfigField, setBotAllowedUsers, getConfigSnapshot, getConfigCardData, } from '../services/bot-config-store.js';
36
+ import { CONFIG_FIELDS, findConfigField, settableFieldKeys, parseBooleanValue, applyConfigField, setBotAllowedUsers, getConfigSnapshot, getConfigCardData, coerceConfigValue, } from '../services/bot-config-store.js';
37
37
  import { resolveCliId, findInvalidAllowedUserEntries } from '../setup/bot-config-editor.js';
38
38
  import { buildClosedSessionCard } from './closed-session-card.js';
39
39
  import { ttadkConfigModelChoices } from '../setup/cli-selection.js';
@@ -46,7 +46,13 @@ import { getBotCapability, setBotCapability, clearBotCapability } from '../servi
46
46
  import { sessionKey, sessionAnchorId } from './types.js';
47
47
  import { t, localeForBot } from '../i18n/index.js';
48
48
  // ─── Exported constants ──────────────────────────────────────────────────────
49
- export const DAEMON_COMMANDS = new Set(['/close', '/restart', '/status', '/help', '/cd', '/repo', '/schedule', '/role', '/botconfig', '/pair', '/login', '/adopt', '/detach', '/disconnect', '/oncall', '/group', '/g', '/relay', '/card', '/term', '/list-slash-command', '/slash', '/land', '/subscribe-lark-doc']);
49
+ // DAEMON_COMMANDS / PASSTHROUGH_COMMANDS / normalizePassthroughCommand now live
50
+ // in the leaf ./passthrough-commands.js so the config store can share the
51
+ // normalization without a circular import; imported for internal use and
52
+ // re-exported to keep callers (daemon.ts, tests) importing from command-handler
53
+ // unchanged.
54
+ import { DAEMON_COMMANDS, PASSTHROUGH_COMMANDS, normalizePassthroughCommand, parseCustomPassthroughInput } from './passthrough-commands.js';
55
+ export { DAEMON_COMMANDS, PASSTHROUGH_COMMANDS };
50
56
  /**
51
57
  * Daemon commands that act on the chat itself rather than opening a
52
58
  * conversation. `/group` (`/g`) just creates a Lark group and replies once —
@@ -56,31 +62,6 @@ export const DAEMON_COMMANDS = new Set(['/close', '/restart', '/status', '/help'
56
62
  * that pollutes the dashboard's session list. Handle them without a session.
57
63
  */
58
64
  export const SESSIONLESS_DAEMON_COMMANDS = new Set(['/group', '/g', '/list-slash-command', '/slash', '/botconfig']);
59
- /**
60
- * Slash commands that are forwarded verbatim to the underlying CLI (e.g.
61
- * Claude Code's `/compact`, `/model`, `/usage`). The daemon does NOT handle
62
- * these — it just relays them to the worker via a raw_input IPC message,
63
- * bypassing the normal prompt-wrapping and bracketed-paste path so the CLI's
64
- * own slash-command parser sees them.
65
- */
66
- export const PASSTHROUGH_COMMANDS = new Set([
67
- '/compact', '/model', '/clear', '/plugin', '/usage',
68
- // 只读 / 低副作用,飞书卡片里能直接吐文本:
69
- '/context', '/cost', '/mcp', '/diff',
70
- '/code-review', '/security-review', '/review',
71
- // Codex:/btw 向当前会话追加一条旁注/引导消息
72
- '/btw',
73
- ]);
74
- function normalizePassthroughCommand(cmd) {
75
- if (typeof cmd !== 'string')
76
- return null;
77
- const normalized = cmd.trim().toLowerCase();
78
- if (!/^\/[a-z0-9][a-z0-9:_-]*$/.test(normalized))
79
- return null;
80
- if (DAEMON_COMMANDS.has(normalized))
81
- return null;
82
- return normalized;
83
- }
84
65
  export function resolveAdapterDefaultPassthroughCommands(larkAppId) {
85
66
  if (!larkAppId)
86
67
  return [];
@@ -696,6 +677,26 @@ async function handleConfigCommand(message, rootId, larkAppId, deps) {
696
677
  }
697
678
  let value;
698
679
  switch (spec.kind) {
680
+ case 'stringList': {
681
+ const arr = parseCustomPassthroughInput(rawValue);
682
+ if (arr.length === 0) {
683
+ await reply(t('cmd.config.value_required', { field: spec.key }, loc));
684
+ return;
685
+ }
686
+ value = arr;
687
+ break;
688
+ }
689
+ case 'number': {
690
+ // 统一走 coerceConfigValue 的 number 校验(正整数),避免文字路径把 '6'
691
+ // 当字符串写进 maxLiveWorkers(与 card/API 路径同口径)。
692
+ const coerced = coerceConfigValue(spec, rawValue);
693
+ if (!coerced.ok) {
694
+ await reply(t('cmd.config.invalid_number', { field: spec.key, value: rawValue }, loc));
695
+ return;
696
+ }
697
+ value = coerced.value;
698
+ break;
699
+ }
699
700
  case 'boolean': {
700
701
  const b = parseBooleanValue(rawValue);
701
702
  if (b === undefined) {
@@ -2327,7 +2328,12 @@ export async function handleCommand(cmd, rootId, message, deps, larkAppId) {
2327
2328
  const workingDir = getSessionWorkingDir(ds);
2328
2329
  const builtin = [...PASSTHROUGH_COMMANDS];
2329
2330
  const adapterDefaults = resolveAdapterDefaultPassthroughCommands(larkAppId);
2330
- const custom = botCfg?.customPassthroughCommands ?? [];
2331
+ // 只展示「实际生效」的 custom 命令:用与 resolvePassthroughCommands 同一套
2332
+ // normalize 过滤掉手写 bots.json 里遮蔽 daemon 命令 / 非法的项(parser 出于
2333
+ // 兼容会保留它们,但路由会丢弃),避免 `/status` 之类被展示成可用却走 daemon。
2334
+ const custom = [...new Set((botCfg?.customPassthroughCommands ?? [])
2335
+ .map(normalizePassthroughCommand)
2336
+ .filter((c) => !!c))];
2331
2337
  let cliAdapter;
2332
2338
  try {
2333
2339
  cliAdapter = createCliAdapterSync(cliId, botCfg?.cliPathOverride);