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.
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +9 -6
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/pi.d.ts.map +1 -1
- package/dist/adapters/cli/pi.js +1 -0
- package/dist/adapters/cli/pi.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +9 -0
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -23
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts +2 -9
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +34 -28
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts +48 -0
- package/dist/core/passthrough-commands.d.ts.map +1 -0
- package/dist/core/passthrough-commands.js +76 -0
- package/dist/core/passthrough-commands.js.map +1 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +5 -1
- package/dist/daemon.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +2 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +2 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +2 -0
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +17 -1
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +63 -53
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/md-card.d.ts +18 -0
- package/dist/im/lark/md-card.d.ts.map +1 -1
- package/dist/im/lark/md-card.js +160 -0
- package/dist/im/lark/md-card.js.map +1 -1
- package/dist/services/bot-config-store.d.ts +5 -3
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +16 -7
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/cursor-resume-policy.d.ts +12 -0
- package/dist/services/cursor-resume-policy.d.ts.map +1 -0
- package/dist/services/cursor-resume-policy.js +15 -0
- package/dist/services/cursor-resume-policy.js.map +1 -0
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +2 -0
- package/dist/skills/definitions.js.map +1 -1
- package/dist/utils/pending-input-queue.d.ts +6 -0
- package/dist/utils/pending-input-queue.d.ts.map +1 -0
- package/dist/utils/pending-input-queue.js +9 -0
- package/dist/utils/pending-input-queue.js.map +1 -0
- package/dist/worker.js +145 -4
- package/dist/worker.js.map +1 -1
- 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
|
-
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"command-handler.d.ts","sourceRoot":"","sources":["../../src/core/command-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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);
|