botmux 2.28.0 → 2.29.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/README.en.md +6 -3
- package/README.md +6 -3
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +26 -28
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +3 -4
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +14 -13
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +2 -0
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +5 -1
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +6 -1
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.js +317 -27
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +0 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -1
- package/dist/config.js.map +1 -1
- package/dist/core/command-handler.d.ts +2 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +139 -161
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/session-manager.d.ts +6 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +52 -32
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +40 -17
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +17 -16
- package/dist/daemon.js.map +1 -1
- package/dist/global-config.d.ts +15 -0
- package/dist/global-config.d.ts.map +1 -0
- package/dist/global-config.js +73 -0
- package/dist/global-config.js.map +1 -0
- package/dist/i18n/en.d.ts +3 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +251 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +33 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +74 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/types.d.ts +4 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +5 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/i18n/zh.d.ts +6 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +254 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/im/lark/card-builder.d.ts +10 -9
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +58 -53
- 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 +44 -51
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +4 -2
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +1 -7
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +11 -3
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/index-daemon.js +10 -0
- package/dist/index-daemon.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts +44 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -0
- package/dist/setup/bot-config-editor.js +170 -0
- package/dist/setup/bot-config-editor.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/worker.js +20 -1
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type Locale } from './types.js';
|
|
2
|
+
export type { Locale } from './types.js';
|
|
3
|
+
export { isLocale, SUPPORTED_LOCALES } from './types.js';
|
|
4
|
+
export declare function getDefaultLocale(): Locale;
|
|
5
|
+
export declare function setDefaultLocale(loc: Locale): void;
|
|
6
|
+
/** Resolve the locale for a given bot's config (used by per-bot code paths). */
|
|
7
|
+
export declare function botLocale(botCfg: {
|
|
8
|
+
lang?: string;
|
|
9
|
+
} | undefined | null): Locale;
|
|
10
|
+
type BotConfigLike = {
|
|
11
|
+
lang?: string;
|
|
12
|
+
};
|
|
13
|
+
type BotLookup = (larkAppId: string) => {
|
|
14
|
+
config: BotConfigLike;
|
|
15
|
+
} | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Register a bot-config lookup so `localeForBot()` can resolve a per-bot
|
|
18
|
+
* locale without creating an import cycle between `i18n` and `bot-registry`.
|
|
19
|
+
* Called once by `bot-registry.ts` at module load.
|
|
20
|
+
*/
|
|
21
|
+
export declare function setBotLookup(lookup: BotLookup): void;
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the locale for a bot by its larkAppId. Falls back to the process
|
|
24
|
+
* default when the bot is not registered (e.g. CLI tools without a daemon).
|
|
25
|
+
*/
|
|
26
|
+
export declare function localeForBot(larkAppId: string | undefined | null): Locale;
|
|
27
|
+
/**
|
|
28
|
+
* Translate a key. Falls back to the Chinese dictionary, then to the key
|
|
29
|
+
* itself if neither dictionary has the entry (so missing keys are loud
|
|
30
|
+
* rather than silently producing empty strings).
|
|
31
|
+
*/
|
|
32
|
+
export declare function t(key: string, params?: Record<string, string | number>, locale?: Locale): string;
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,MAAM,EAAY,MAAM,YAAY,CAAC;AAEnD,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASzD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAG9E;AAED,KAAK,aAAa,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACvC,KAAK,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG,SAAS,CAAC;AAI9E;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEpD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAOzE;AASD;;;;GAIG;AACH,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhG"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight i18n: flat key → translated string with `{name}` interpolation.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order for the active locale at a given call site:
|
|
5
|
+
* 1. explicit `locale` argument to `t()`
|
|
6
|
+
* 2. per-bot `lang` config (resolved via `botLocale()`)
|
|
7
|
+
* 3. process default — set by the entrypoint from `~/.botmux/config.json`
|
|
8
|
+
* (`setDefaultLocale(...)`), falling back to `'zh'` for backward compat.
|
|
9
|
+
*
|
|
10
|
+
* The i18n module itself stays pure — it does not read the filesystem. The
|
|
11
|
+
* CLI and daemon entrypoints load the global config and call
|
|
12
|
+
* `setDefaultLocale(...)` before any user-facing string is emitted.
|
|
13
|
+
*/
|
|
14
|
+
import { messages as zhMessages } from './zh.js';
|
|
15
|
+
import { messages as enMessages } from './en.js';
|
|
16
|
+
import { isLocale } from './types.js';
|
|
17
|
+
export { isLocale, SUPPORTED_LOCALES } from './types.js';
|
|
18
|
+
const dictionaries = {
|
|
19
|
+
zh: zhMessages,
|
|
20
|
+
en: enMessages,
|
|
21
|
+
};
|
|
22
|
+
let defaultLocale = 'zh';
|
|
23
|
+
export function getDefaultLocale() {
|
|
24
|
+
return defaultLocale;
|
|
25
|
+
}
|
|
26
|
+
export function setDefaultLocale(loc) {
|
|
27
|
+
defaultLocale = loc;
|
|
28
|
+
}
|
|
29
|
+
/** Resolve the locale for a given bot's config (used by per-bot code paths). */
|
|
30
|
+
export function botLocale(botCfg) {
|
|
31
|
+
if (botCfg && isLocale(botCfg.lang))
|
|
32
|
+
return botCfg.lang;
|
|
33
|
+
return defaultLocale;
|
|
34
|
+
}
|
|
35
|
+
let botLookup;
|
|
36
|
+
/**
|
|
37
|
+
* Register a bot-config lookup so `localeForBot()` can resolve a per-bot
|
|
38
|
+
* locale without creating an import cycle between `i18n` and `bot-registry`.
|
|
39
|
+
* Called once by `bot-registry.ts` at module load.
|
|
40
|
+
*/
|
|
41
|
+
export function setBotLookup(lookup) {
|
|
42
|
+
botLookup = lookup;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the locale for a bot by its larkAppId. Falls back to the process
|
|
46
|
+
* default when the bot is not registered (e.g. CLI tools without a daemon).
|
|
47
|
+
*/
|
|
48
|
+
export function localeForBot(larkAppId) {
|
|
49
|
+
if (!larkAppId || !botLookup)
|
|
50
|
+
return defaultLocale;
|
|
51
|
+
try {
|
|
52
|
+
return botLocale(botLookup(larkAppId)?.config);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return defaultLocale;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function interpolate(template, params) {
|
|
59
|
+
return template.replace(/\{(\w+)\}/g, (_, k) => {
|
|
60
|
+
const v = params[k];
|
|
61
|
+
return v === undefined || v === null ? `{${k}}` : String(v);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Translate a key. Falls back to the Chinese dictionary, then to the key
|
|
66
|
+
* itself if neither dictionary has the entry (so missing keys are loud
|
|
67
|
+
* rather than silently producing empty strings).
|
|
68
|
+
*/
|
|
69
|
+
export function t(key, params, locale) {
|
|
70
|
+
const loc = locale ?? defaultLocale;
|
|
71
|
+
const tpl = dictionaries[loc]?.[key] ?? dictionaries.zh[key] ?? key;
|
|
72
|
+
return params ? interpolate(tpl, params) : tpl;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,YAAY,GAA2C;IAC3D,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;CACf,CAAC;AAEF,IAAI,aAAa,GAAW,IAAI,CAAC;AAEjC,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,aAAa,GAAG,GAAG,CAAC;AACtB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,SAAS,CAAC,MAA4C;IACpE,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACxD,OAAO,aAAa,CAAC;AACvB,CAAC;AAKD,IAAI,SAAgC,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,SAAS,GAAG,MAAM,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,SAAoC;IAC/D,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;QAAE,OAAO,aAAa,CAAC;IACnD,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,MAAuC;IAC5E,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,CAAC,CAAC,GAAW,EAAE,MAAwC,EAAE,MAAe;IACtF,MAAM,GAAG,GAAG,MAAM,IAAI,aAAa,CAAC;IACpC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;IACpE,OAAO,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/i18n/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjC,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAA0B,CAAC;AAE1E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAEhD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/i18n/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,IAAI,EAAE,IAAI,CAAU,CAAC;AAE1E,MAAM,UAAU,QAAQ,CAAC,CAAU;IACjC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zh.d.ts","sourceRoot":"","sources":["../../src/i18n/zh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyQ3C,CAAC"}
|
package/dist/i18n/zh.js
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chinese translations — the original strings as authored. This is the
|
|
3
|
+
* "source of truth" dictionary; `en.ts` mirrors the same keys.
|
|
4
|
+
*/
|
|
5
|
+
export const messages = {
|
|
6
|
+
// ─── Card buttons ────────────────────────────────────────────────────────
|
|
7
|
+
'card.btn.open_terminal': '🖥️ 打开终端',
|
|
8
|
+
'card.btn.open_writable_terminal': '🖥️ 打开可操作终端',
|
|
9
|
+
'card.btn.get_write_link': '🔑 获取操作链接',
|
|
10
|
+
'card.btn.restart_cli': '🔄 重启 {cliName}',
|
|
11
|
+
'card.btn.disconnect': '⏏ 断开',
|
|
12
|
+
'card.btn.close_session': '❌ 关闭会话',
|
|
13
|
+
'card.btn.resume_session': '▶️ 恢复会话',
|
|
14
|
+
'card.btn.show_output': '📖 显示输出',
|
|
15
|
+
'card.btn.hide_output': '📕 隐藏输出',
|
|
16
|
+
'card.btn.export_text': '📝 导出文字',
|
|
17
|
+
'card.btn.refresh': '🔃 刷新',
|
|
18
|
+
'card.btn.takeover': '🔄 接管',
|
|
19
|
+
'card.btn.skip_repo': '▶️ 直接开启会话',
|
|
20
|
+
'card.btn.half_page_up': '⇞ 上半屏',
|
|
21
|
+
'card.btn.half_page_down': '⇟ 下半屏',
|
|
22
|
+
'card.btn.send_custom': '📝 发送自定义回复',
|
|
23
|
+
// ─── Card status ─────────────────────────────────────────────────────────
|
|
24
|
+
'card.status.starting': '启动中…',
|
|
25
|
+
'card.status.working': '工作中',
|
|
26
|
+
'card.status.idle': '等待输入',
|
|
27
|
+
'card.status.analyzing': '正在分析…',
|
|
28
|
+
'card.status.executing': '正在执行…',
|
|
29
|
+
'card.status.session_closed': '🛑 会话已关闭',
|
|
30
|
+
'card.status.selected': '已选择',
|
|
31
|
+
'card.status.waiting_screenshot': '_(等待第一张截图…)_',
|
|
32
|
+
'card.status.truncated_prefix': '… (已截断)',
|
|
33
|
+
// ─── Card body text ──────────────────────────────────────────────────────
|
|
34
|
+
'card.body.cli_terminated': '{cliName} 进程已终止。',
|
|
35
|
+
'card.body.click_resume_or_run': '点击「恢复会话」继续,或在终端执行:',
|
|
36
|
+
'card.body.click_resume_only': '点击「恢复会话」继续。',
|
|
37
|
+
'card.body.cli_no_cli_resume': '{cliName} 不支持从命令行精确恢复指定会话,可在飞书内 resume。',
|
|
38
|
+
'card.body.working_dir': '📁 工作目录:',
|
|
39
|
+
'card.body.choose_label': '选择:',
|
|
40
|
+
// ─── Repo select card ────────────────────────────────────────────────────
|
|
41
|
+
'card.repo.title': '📁 项目仓库管理',
|
|
42
|
+
'card.repo.placeholder_switch': '选择仓库并切换',
|
|
43
|
+
'card.repo.current_active': '当前活跃项目:',
|
|
44
|
+
'card.repo.current_marker': ' ← 当前',
|
|
45
|
+
'card.repo.note': '也可以回复 `/repo <编号>` 切换,例如:`/repo 1`',
|
|
46
|
+
// ─── Adopt card ──────────────────────────────────────────────────────────
|
|
47
|
+
'card.adopt.title': '📡 选择要接入的 CLI 会话',
|
|
48
|
+
'card.adopt.placeholder_select': '选择 CLI 会话',
|
|
49
|
+
'card.adopt.uptime_unknown': '未知',
|
|
50
|
+
// ─── TUI prompt card ─────────────────────────────────────────────────────
|
|
51
|
+
'card.tui.input_placeholder': '输入自定义回复…',
|
|
52
|
+
// ─── Command responses ───────────────────────────────────────────────────
|
|
53
|
+
'cmd.no_active_session': '当前话题没有活跃的会话。',
|
|
54
|
+
'cmd.restart.in_progress': '🔄 正在重启 {cliName}...',
|
|
55
|
+
'cmd.restart.terminated': '{cliName} 进程已终止,下次发消息时将自动恢复。',
|
|
56
|
+
'cmd.cd.usage': '用法:/cd <path>\n例如:/cd ~/projects/my-app',
|
|
57
|
+
'cmd.cd.switched': '工作目录已切换到 {path},下次发消息时将在新目录下恢复。',
|
|
58
|
+
'cmd.cd.dir_not_exist': '目录不存在:{path}',
|
|
59
|
+
'cmd.cd.cannot_read': '无法读取路径:{path}({msg})',
|
|
60
|
+
'cmd.cd.not_a_directory': '路径不是目录:{path}',
|
|
61
|
+
'cmd.repo.no_prior_scan': '请先执行 /repo 查看项目列表。',
|
|
62
|
+
'cmd.repo.index_out_of_range': '序号超出范围,有效范围:1-{max}',
|
|
63
|
+
'cmd.repo.selected_in_pending': '✅ 已选择 {name}',
|
|
64
|
+
'cmd.repo.switched_to': '🔄 已切换到 {name}',
|
|
65
|
+
'cmd.repo.warning_running': '⚠️ 当前会话已在运行中,切换仓库将关闭当前会话并创建新会话。\n如需切换,请在下方卡片中选择新仓库。',
|
|
66
|
+
'cmd.repo.scan_dir_not_exist': '扫描目录不存在:{dirs}\n请检查 bots.json 中的 workingDir 是否指向有效目录。',
|
|
67
|
+
'cmd.repo.no_git_repos': '在 {dirs} 下未找到 git 仓库。',
|
|
68
|
+
'cmd.skip.opened': '▶️ 已直接开启会话(工作目录:{cwd})',
|
|
69
|
+
'cmd.skip.no_pending': '当前没有待选择的仓库。',
|
|
70
|
+
'cmd.status.running': '运行中',
|
|
71
|
+
'cmd.status.waiting': '等待中',
|
|
72
|
+
'cmd.status.fallback_no_session': '当前话题没有活跃的会话。\nDaemon active sessions: {count}\n{cliName}: v{version}',
|
|
73
|
+
'cmd.login.no_credentials': '❌ 无法获取应用凭证',
|
|
74
|
+
'cmd.login.title': '🔐 飞书用户授权',
|
|
75
|
+
'cmd.login.step1': '1. 点击下方链接完成授权:',
|
|
76
|
+
'cmd.login.step2': '2. 授权后浏览器会跳转到一个打不开的页面(正常)',
|
|
77
|
+
'cmd.login.step3': '3. 复制浏览器地址栏的完整 URL,发送到本话题',
|
|
78
|
+
'cmd.login.footer': '授权后可下载第三方卡片中的图片等资源。',
|
|
79
|
+
'cmd.login.status_hint': '查看状态:/login status',
|
|
80
|
+
'cmd.adopt.already_adopted': '本话题已接入 {label} ({pane})。\n请先点击卡片上的「断开」按钮,再 /adopt 切换 CLI 会话(原 CLI 不受影响)。',
|
|
81
|
+
'cmd.adopt.no_sessions': '未发现可接入的 CLI 会话',
|
|
82
|
+
'cmd.adopt.pane_not_found': '未找到 tmux pane {pane}',
|
|
83
|
+
'cmd.adopt.target_exited': '⚠️ 目标 CLI 会话已退出',
|
|
84
|
+
'cmd.adopt.success': '📡 已接入 {cliName} · {project} ({pane})',
|
|
85
|
+
'cmd.oncall.need_group': '/oncall 需要在群聊中、以新话题方式使用。',
|
|
86
|
+
'cmd.oncall.not_bound': '当前群尚未绑定 oncall 项目。\n\n用法:\n/oncall bind <path> — 绑定当前群到某个项目目录,跳过仓库选择卡片\n/oncall unbind — 解除当前群的 oncall 绑定\n/oncall status — 查看当前绑定状态\n\n绑定后:群内任何成员都可以 @ 机器人提问;仅 allowedUsers 能点卡片按钮、执行 /cd /restart /close 等命令。',
|
|
87
|
+
'cmd.oncall.bound': '🟢 已绑定 oncall\n工作目录:{dir}\n\n/oncall unbind 可解除绑定;/cd <path> 切换工作目录(仍保留 oncall 模式)。',
|
|
88
|
+
'cmd.oncall.bind_usage': '用法:/oncall bind <path>\n例如:/oncall bind ~/projects/payments-service',
|
|
89
|
+
'cmd.oncall.bind_failed_no_bot': '⚠️ 无法在配置文件中找到当前机器人条目,绑定失败。',
|
|
90
|
+
'cmd.oncall.bind_failed': '⚠️ 绑定失败:{reason}',
|
|
91
|
+
'cmd.oncall.bind_success': '✅ {verb} oncall\n群:{chatId}\n工作目录:{target} → {resolved}\n\n下次在本群开新话题时会直接用此目录启动 CLI,不再弹仓库选择卡片。',
|
|
92
|
+
'cmd.oncall.verb_bound': '已绑定',
|
|
93
|
+
'cmd.oncall.verb_updated': '已更新',
|
|
94
|
+
'cmd.oncall.unbind_failed': '⚠️ 解绑失败:{reason}',
|
|
95
|
+
'cmd.oncall.unbind_not_bound': '当前群未绑定 oncall。(已记录解绑意图,default-oncall 不会再自动绑此群)',
|
|
96
|
+
'cmd.oncall.unbind_success': '✅ 已解除 oncall 绑定。下次开新话题将恢复默认仓库选择卡片流程。',
|
|
97
|
+
'cmd.oncall.unknown_sub': '未知子命令:{sub}\n支持:/oncall bind <path> | /oncall unbind | /oncall status',
|
|
98
|
+
// ─── /schedule ───────────────────────────────────────────────────────────
|
|
99
|
+
'schedule.empty_with_examples': '暂无定时任务。\n\n用法示例:\n/schedule 每日17:50 帮我看看今天AI圈有什么新闻\n/schedule 工作日每天9:00 检查服务状态\n/schedule 每周一10:00 生成周报',
|
|
100
|
+
'schedule.list_header': '定时任务列表 ({count}):',
|
|
101
|
+
'schedule.next_label': ' → 下次: {time}',
|
|
102
|
+
'schedule.last_label': ' | 上次: {time}',
|
|
103
|
+
'schedule.removed': '已删除定时任务 {id}',
|
|
104
|
+
'schedule.not_found': '未找到任务 {id}',
|
|
105
|
+
'schedule.enabled': '已启用定时任务 {id}',
|
|
106
|
+
'schedule.disabled': '已禁用定时任务 {id}',
|
|
107
|
+
'schedule.triggered_now': '已触发定时任务 {id} 立即执行',
|
|
108
|
+
'schedule.created': '✅ 定时任务已创建!\n\nID: {id}\n名称: {name}\n规则: {rule}\nPrompt: {prompt}\n工作目录: {dir}\n下次执行: {next}',
|
|
109
|
+
'schedule.parse_failed': '无法解析定时任务,请使用自然语言格式:\n\n/schedule 每日17:50 帮我看看今天AI圈有什么新闻\n/schedule 工作日每天9:00 检查服务状态\n/schedule 每周一10:00 生成周报\n/schedule 每小时 检查服务健康状态\n/schedule 每30分钟 ping一下服务\n/schedule 每月1号9:00 生成月报\n\n管理命令:\n/schedule list — 查看所有任务\n/schedule remove <id> — 删除任务\n/schedule enable <id> — 启用任务\n/schedule disable <id> — 禁用任务\n/schedule run <id> — 立即执行一次',
|
|
110
|
+
// ─── /help ───────────────────────────────────────────────────────────────
|
|
111
|
+
'help.heading_session': '📌 会话管理:',
|
|
112
|
+
'help.close': '/close - 关闭当前会话,终止 {cliName} 进程',
|
|
113
|
+
'help.restart': '/restart - 重启 {cliName} 进程(保留 session)',
|
|
114
|
+
'help.cd': '/cd <path> - 切换工作目录并重启 {cliName} 进程',
|
|
115
|
+
'help.repo_list': '/repo - 查看项目列表(交互式下拉 + 文本列表)',
|
|
116
|
+
'help.repo_n': '/repo <N> - 切换到第 N 个项目',
|
|
117
|
+
'help.status': '/status - 查看当前会话状态(含终端链接)',
|
|
118
|
+
'help.heading_passthrough': '🔀 透传给 {cliName}(字面送达,供其内置 slash 命令处理):',
|
|
119
|
+
'help.heading_schedule': '⏰ 定时任务:',
|
|
120
|
+
'help.schedule_create': '/schedule 每日17:50 帮我看AI新闻 - 创建定时任务(自然语言)',
|
|
121
|
+
'help.schedule_list': '/schedule list - 查看所有定时任务',
|
|
122
|
+
'help.schedule_remove': '/schedule remove <id> - 删除任务',
|
|
123
|
+
'help.schedule_toggle': '/schedule enable/disable <id> - 启用/禁用任务',
|
|
124
|
+
'help.schedule_run': '/schedule run <id> - 立即执行一次',
|
|
125
|
+
'help.schedule_formats': '支持的时间格式:每日/每天、每周X、每月X号、工作日每天、每N小时、每N分钟',
|
|
126
|
+
'help.heading_adopt': '📡 会话接入:',
|
|
127
|
+
'help.adopt': '/adopt - 接入本机正在运行的 CLI 会话',
|
|
128
|
+
'help.adopt_pane': '/adopt <tmux_pane> - 直接接入指定 tmux pane',
|
|
129
|
+
'help.heading_login': '🔐 用户授权:',
|
|
130
|
+
'help.login': '/login - 飞书用户授权(可下载第三方卡片图片等)',
|
|
131
|
+
'help.login_status': '/login status - 查看授权状态',
|
|
132
|
+
'help.heading_oncall': '🛎️ Oncall 模式(群聊):',
|
|
133
|
+
'help.oncall_bind': '/oncall bind <path> - 把当前群绑到某个项目,跳过仓库选择卡片',
|
|
134
|
+
'help.oncall_unbind': '/oncall unbind - 解绑当前群',
|
|
135
|
+
'help.oncall_status': '/oncall status - 查看当前群的 oncall 绑定',
|
|
136
|
+
'help.help': '/help - 显示此帮助',
|
|
137
|
+
// ─── AI system prompt (Claude Code: --append-system-prompt) ──────────────
|
|
138
|
+
'ai.routing.intro': '你连接到了飞书(Lark)话题群。用户在飞书上阅读,看不到你的终端输出。',
|
|
139
|
+
'ai.routing.must_use_botmux': '想让用户看到的内容必须通过 `botmux send` 命令发送,终端输出不会到达聊天。',
|
|
140
|
+
'ai.routing.usage_heading': '使用指南:',
|
|
141
|
+
'ai.routing.usage_send_when': '- 用 `botmux send` 发送:关键结论、方案(等用户确认再执行)、最终结果、进度更新。',
|
|
142
|
+
'ai.routing.usage_send_text': '- 发送纯文本即可:`botmux send "消息"`。格式自动处理。',
|
|
143
|
+
'ai.routing.usage_heredoc': '- 多行消息必须用 heredoc,禁止写成 `botmux send "第一行\\n第二行"`;否则 `\\n` 可能按字面量显示在飞书里。',
|
|
144
|
+
'ai.routing.heredoc_example': " 正确多行示例:\n```bash\nbotmux send <<'EOF'\n第一行\n第二行\nEOF\n```",
|
|
145
|
+
'ai.routing.usage_images': '- 附带图片:`botmux send --images /path/to/img.png "说明文字"`',
|
|
146
|
+
'ai.routing.usage_files': '- 附带文件:`botmux send --files /path/to/file.pdf "请查收"`',
|
|
147
|
+
'ai.routing.usage_history': '- 需要上下文时用 `botmux history` 读取之前的对话。',
|
|
148
|
+
'ai.routing.usage_bots_list': '- 查看可协作的机器人:`botmux bots list`',
|
|
149
|
+
// ─── AI identity (multi-bot routing rules) ───────────────────────────────
|
|
150
|
+
'ai.identity.unknown': '(未知)',
|
|
151
|
+
'ai.identity.routing_intro': '群里可能有多个机器人,消息里用 `@名字` 和 `open_id` 区分接收方。对照上面的 name/open_id 判断本条消息归属:',
|
|
152
|
+
'ai.identity.rule_own_part': '- 只执行明确分给自己的那部分,别抢别的机器人的活',
|
|
153
|
+
'ai.identity.rule_silent_when_other': '- 整条消息都指派给别的机器人时,保持沉默不要回复',
|
|
154
|
+
'ai.identity.rule_no_proactive_pull': '- **默认不主动拉别的 bot 进来**。除非用户明确要求、或某段任务只能由对方做,否则一个人做完自己的部分就行。',
|
|
155
|
+
'ai.identity.mention_intro': '**和别的机器人协作的硬性物理事实**:飞书话题群里其他 bot **默认收不到** 你 `botmux send` 出去的消息——',
|
|
156
|
+
'ai.identity.mention_must': '要让某个 bot 接力干活,**必须** 显式 `--mention <对方 bot 的 open_id>`,不 --mention 对方 bot 完全不会被触发。',
|
|
157
|
+
'ai.identity.mention_partners': '- 协作伙伴的 open_id 会列在每条用户消息附带的 `<available_bots>` 块里,也可以 `botmux bots list` 查',
|
|
158
|
+
'ai.identity.mention_usage': '- 用法:`botmux send --mention ou_xxx "消息内容"`(多个 bot 重复 `--mention`);正文里写 `@对方名字` 时 botmux 也会自动补上 --mention,但显式传更稳',
|
|
159
|
+
'ai.identity.mention_when_to': '- 该 --mention 的场景:用户明确要求让对方接力、把任务的某段交给对方、需要对方给最终结论或做独立操作',
|
|
160
|
+
'ai.identity.mention_when_not': '- 不必 --mention 的场景:纯状态更新/确认/感谢——尽量合并到下一次有内容的消息里再带上,避免互相 ping 触发空转',
|
|
161
|
+
// ─── AI hints (non-Claude CLIs: BOTMUX_SHELL_HINTS) ──────────────────────
|
|
162
|
+
'ai.shell.intro': '你运行在飞书(Lark)话题群中。用户在飞书阅读回复,看不到你的终端输出。',
|
|
163
|
+
'ai.shell.commands_are_shell': '重要:botmux send / botmux history / botmux quoted / botmux bots 都是 shell 命令(CLI 程序,已安装在 $PATH),不是 MCP 工具。必须通过 Bash 工具执行,不要到 MCP 工具列表里找。',
|
|
164
|
+
'ai.shell.how_to_send': '把消息发给用户(唯一方式):用 Bash 执行 `botmux send "消息内容"`;附带图片用 `--images /path`,附带文件用 `--files /path`。',
|
|
165
|
+
'ai.shell.multiline_heredoc': '多行消息必须用 heredoc,禁止写成 `botmux send "第一行\\n第二行"`;否则 `\\n` 可能按字面量显示在飞书里。',
|
|
166
|
+
'ai.shell.heredoc_example': "正确多行示例:\n```bash\nbotmux send <<'EOF'\n第一行\n第二行\nEOF\n```",
|
|
167
|
+
'ai.shell.helpers': '辅助命令:`botmux history`(读此会话历史,话题群拉话题内、普通群拉整群)、`botmux quoted <message_id>`(按需读取被引用的消息,仅在 prompt 头部出现 `[用户引用了消息 ...]` 提示时使用)、`botmux bots list`(查群内其他机器人)。',
|
|
168
|
+
'ai.shell.when_to_send': '发送时机:关键结论、方案(等用户确认再动手)、最终结果、进度更新。只 print/echo 不算回复。',
|
|
169
|
+
// ─── AI prompt blocks (session-manager) ──────────────────────────────────
|
|
170
|
+
'ai.attach.hint': '使用 Read 工具查看,序号与正文中的 [图片 N] / [文件 N] 占位符对应',
|
|
171
|
+
'ai.identity.short_routing': '提醒:让别的 bot 接力干活必须 `botmux send --mention <对方 open_id>`,否则对方 bot 不会被触发。',
|
|
172
|
+
'ai.available_bots.hint': '让这里的某个 bot 接力干活必须 --mention 它的 open_id(botmux send --mention ou_xxx ...),不 --mention 对方 bot 完全收不到消息',
|
|
173
|
+
'ai.followup.reminder': '回复必须 botmux send,终端输出用户看不到',
|
|
174
|
+
'ai.bridge.attachments_label': '[附件]',
|
|
175
|
+
'ai.bridge.mentions_label': '[@提及]',
|
|
176
|
+
'schedule.title_prefix': '[定时]',
|
|
177
|
+
// ─── Card handler responses ──────────────────────────────────────────────
|
|
178
|
+
'card.action.adopt_no_restart': '⚠️ adopt 模式不支持重启(不会触动你自己的 tmux pane / CLI 进程)',
|
|
179
|
+
'card.action.restarted': '🔄 已重启 {cliName}',
|
|
180
|
+
'card.action.restarted_fresh': '🔄 已重新启动 {cliName}',
|
|
181
|
+
'card.action.resume_missing_session_id': '⚠️ 缺少 session_id,无法恢复。',
|
|
182
|
+
'card.action.resume_success': '✅ 会话已恢复,发条消息继续与 {cliName} 对话。',
|
|
183
|
+
'card.action.resume_not_found': '⚠️ 找不到会话 {short},可能已被清理。',
|
|
184
|
+
'card.action.resume_not_closed': '会话已是活跃状态,无需恢复。',
|
|
185
|
+
'card.action.resume_anchor_occupied': '⚠️ 当前话题已有新会话{detail},无法恢复旧会话。',
|
|
186
|
+
'card.action.resume_anchor_holder': '(占用者:{short})',
|
|
187
|
+
'card.action.resume_adopt_unsupported': '⚠️ adopt 接管会话不支持 resume。',
|
|
188
|
+
'card.action.disconnected': '⏏ 已断开,原 CLI 会话不受影响',
|
|
189
|
+
'card.action.takeover_retired': '⚠️ 旧版"接管"按钮已停用。bridge 模式下原 CLI 由 botmux 桥接,无需接管即可在飞书中收到回答。如需 /resume 完整接管能力,请等待 /adopt --takeover 命令上线。',
|
|
190
|
+
'card.action.terminal_not_ready': '⚠️ 终端尚未就绪,请稍后再试。',
|
|
191
|
+
'card.action.no_output': '(当前无输出内容)',
|
|
192
|
+
'card.action.tui_select_title': 'Select options',
|
|
193
|
+
'card.action.tui_custom_input': 'Custom input',
|
|
194
|
+
'card.action.tui_done': 'Done',
|
|
195
|
+
'card.action.continue_using_current_repo': '继续使用当前仓库:{cwd}',
|
|
196
|
+
// ─── Worker → daemon notices ─────────────────────────────────────────────
|
|
197
|
+
'worker.adopted_session_exited': '⏏ 已采纳的 CLI 会话已退出',
|
|
198
|
+
'worker.crash_loop_stopped': '⚠️ {cliName} 在 1 分钟内崩溃 {count} 次,已停止自动重启。发消息可触发重新启动。',
|
|
199
|
+
// ─── CLI setup wizard / pm2 lifecycle (no per-bot context) ───────────────
|
|
200
|
+
'setup.lark_create_app': '请先在飞书开放平台创建应用: https://open.feishu.cn/app',
|
|
201
|
+
'setup.lark_permissions_required': '需要的权限:',
|
|
202
|
+
'setup.lark_perm_im_message': ' - im:message (发送/接收消息)',
|
|
203
|
+
'setup.lark_perm_group_at_msg': ' - im:message.group_at_msg (群消息)',
|
|
204
|
+
'setup.lark_perm_resource': ' - im:resource (文件下载)',
|
|
205
|
+
'setup.lark_perm_chat': ' - im:chat (群信息)',
|
|
206
|
+
'setup.lark_perm_user_base': ' - contact:user.base:readonly (用户信息)',
|
|
207
|
+
'setup.lark_enable_events': '启用事件订阅 (WebSocket 模式):',
|
|
208
|
+
'setup.supported_clis': '支持的 CLI: 1) claude-code 2) aiden 3) coco 4) codex 5) gemini 6) opencode',
|
|
209
|
+
'setup.prompt_cli_choice': 'CLI 适配器 [1]: ',
|
|
210
|
+
'setup.prompt_working_dir': '默认工作目录 [~]: ',
|
|
211
|
+
'setup.prompt_allowed_users': '允许的用户 (邮箱或 open_id,逗号分隔,留空=不限制): ',
|
|
212
|
+
'setup.prompt_lang': 'UI 语言 / UI language [zh/en, 默认 zh]: ',
|
|
213
|
+
'setup.section_lark_app_config': '── 飞书应用配置 ──',
|
|
214
|
+
'setup.section_reconfigure': '── 重新配置 ──',
|
|
215
|
+
'setup.section_add_new_bot': '── 添加新机器人 ──',
|
|
216
|
+
'setup.config_written': '✅ 配置已写入: {path}',
|
|
217
|
+
'setup.next_step': '下一步:',
|
|
218
|
+
'setup.next_step_short': '下一步: botmux restart',
|
|
219
|
+
'setup.next_start_daemon': ' 1. botmux start 启动 daemon(飞书后台配长连接前必须先启动)',
|
|
220
|
+
'setup.next_autostart': ' 2. botmux autostart enable 注册开机自启(推荐:{platformName},无需 sudo)',
|
|
221
|
+
'setup.platform_mac': 'mac launchd',
|
|
222
|
+
'setup.platform_linux': 'linux user systemd',
|
|
223
|
+
'setup.platform_other': '当前平台暂不支持',
|
|
224
|
+
'setup.wizard_title': '🤖 botmux 配置向导',
|
|
225
|
+
'setup.config_dir': '配置目录: {path}',
|
|
226
|
+
'setup.data_dir': '数据目录: {path}',
|
|
227
|
+
'setup.bots_already_configured': '已配置 {count} 个机器人:',
|
|
228
|
+
'setup.prompt_action_existing_bots': '操作: 1) 添加新机器人 2) 重新配置 (1/2) [1]: ',
|
|
229
|
+
'setup.old_config_backed_up': '旧配置已备份: {path}',
|
|
230
|
+
'setup.added_bot': '✅ 已添加机器人 {appId},共 {count} 个',
|
|
231
|
+
'setup.config_file': ' 配置文件: {path}',
|
|
232
|
+
'setup.using_single_bot_config': '当前使用单机器人配置: {path}',
|
|
233
|
+
'setup.prompt_action_env_exists': '操作: 1) 添加新机器人 2) 覆盖当前配置 (1/2): ',
|
|
234
|
+
'setup.old_env_backed_up': ' 旧 .env 已备份: {path}',
|
|
235
|
+
'setup.env_missing_keys': '⚠️ 当前 .env 缺少 LARK_APP_ID 或 LARK_APP_SECRET,请先完成基础配置',
|
|
236
|
+
'setup.current_bot': '当前机器人: {appId} ({cliId})',
|
|
237
|
+
'setup.migrated_to_multibot': '✅ 已迁移到多机器人配置',
|
|
238
|
+
'start.no_config': '❌ 未找到配置文件',
|
|
239
|
+
'start.run_setup': ' 请先运行: botmux setup',
|
|
240
|
+
'start.daemon_started': '✅ daemon 已启动{suffix}',
|
|
241
|
+
'start.daemon_started_suffix': ' ({count} 个机器人, 每个独立进程)',
|
|
242
|
+
'start.logs_hint': ' 日志: botmux logs',
|
|
243
|
+
'start.status_hint': ' 状态: botmux status',
|
|
244
|
+
'start.autostart_synced': ' autostart unit 已同步到当前 Node/cli.js 路径',
|
|
245
|
+
// ─── Daemon runtime notices ──────────────────────────────────────────────
|
|
246
|
+
'daemon.cmd_requires_session': '{cmd} 需要在已有会话内使用(先发一条普通消息启动 CLI)。',
|
|
247
|
+
'daemon.cmd_allowed_users_only': '⚠️ {cmd} 仅 allowedUsers 可执行。',
|
|
248
|
+
'daemon.download_failed_need_login': '⚠️ 部分图片/文件下载失败(缺少 User Token)。请在话题中发送 /login 授权后重新发送。',
|
|
249
|
+
'daemon.foreign_bot_mention_prefix': '[来自 {botName} 的 @mention]',
|
|
250
|
+
'daemon.cmd_needs_active_cli': '{cmd} 需要活跃的 CLI 进程,当前话题无运行中的会话。',
|
|
251
|
+
'daemon.enriched_mentions_label': '消息中的 @mention:',
|
|
252
|
+
'daemon.choose_repo_first': '请先在上方卡片中选择仓库,您的消息已暂存,选择后会自动发送。',
|
|
253
|
+
};
|
|
254
|
+
//# sourceMappingURL=zh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zh.js","sourceRoot":"","sources":["../../src/i18n/zh.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,14 @@ import type { ProjectInfo } from '../../services/project-scanner.js';
|
|
|
2
2
|
import type { CliId } from '../../adapters/cli/types.js';
|
|
3
3
|
import type { AdoptableSession } from '../../core/session-discovery.js';
|
|
4
4
|
import type { DisplayMode } from '../../types.js';
|
|
5
|
+
import { type Locale } from '../../i18n/index.js';
|
|
5
6
|
export declare function getCliDisplayName(cliId: CliId): string;
|
|
6
7
|
/**
|
|
7
8
|
* Build a Feishu interactive card with terminal button + action buttons.
|
|
8
9
|
* @param showManageButtons - When true, include restart & close buttons (used in DM cards with write token).
|
|
9
10
|
* @param adoptMode - When true, the danger button reads "⏏ 断开" with action `disconnect` (only tears down botmux's bridge worker, leaves the user's tmux pane / Claude process alone). Mutually exclusive with `showManageButtons` (DM management isn't surfaced for adopt sessions). Without this flag the card uses the original "❌ 关闭会话" button which closes the underlying CLI — wrong for adopt where we never owned the CLI in the first place.
|
|
10
11
|
*/
|
|
11
|
-
export declare function buildSessionCard(sessionId: string, rootId: string, terminalUrl: string, title: string, cliId?: CliId, showManageButtons?: boolean, adoptMode?: boolean): string;
|
|
12
|
+
export declare function buildSessionCard(sessionId: string, rootId: string, terminalUrl: string, title: string, cliId?: CliId, showManageButtons?: boolean, adoptMode?: boolean, locale?: Locale): string;
|
|
12
13
|
/**
|
|
13
14
|
* Build the "session closed" card shown after `/close` (or the close button).
|
|
14
15
|
* Surfaces a Resume button + a copyable terminal command so the user has an
|
|
@@ -24,9 +25,9 @@ export declare function buildSessionCard(sessionId: string, rootId: string, term
|
|
|
24
25
|
* The "▶️ 恢复会话" button still goes through botmux — it re-enables the
|
|
25
26
|
* Lark bridge so future replies route back into this topic.
|
|
26
27
|
*/
|
|
27
|
-
export declare function buildSessionClosedCard(sessionId: string, rootId: string, title: string, cliId?: CliId, workingDir?: string, cliResumeCommand?: string | null): string;
|
|
28
|
+
export declare function buildSessionClosedCard(sessionId: string, rootId: string, title: string, cliId?: CliId, workingDir?: string, cliResumeCommand?: string | null, locale?: Locale): string;
|
|
28
29
|
/** Truncate content to fit within MAX_CONTENT_BYTES, keeping the tail (most recent output). */
|
|
29
|
-
export declare function truncateContent(content: string): string;
|
|
30
|
+
export declare function truncateContent(content: string, locale?: Locale): string;
|
|
30
31
|
/**
|
|
31
32
|
* Build a Feishu streaming card that shows live terminal output + controls.
|
|
32
33
|
* This card is PATCHed in-place as the CLI works.
|
|
@@ -38,12 +39,12 @@ export declare function truncateContent(content: string): string;
|
|
|
38
39
|
* Quick-action buttons (Esc, ^C, Tab, Space, Enter, ←↑↓→, ½屏 ↑/↓) appear
|
|
39
40
|
* whenever displayMode !== 'hidden'.
|
|
40
41
|
*/
|
|
41
|
-
export declare function buildStreamingCard(sessionId: string, rootId: string, terminalUrl: string, title: string, screenContent: string, status: 'starting' | 'working' | 'idle' | 'analyzing', cliId?: CliId, displayMode?: DisplayMode, cardNonce?: string, imageKey?: string, adoptMode?: boolean, showTakeover?: boolean): string;
|
|
42
|
+
export declare function buildStreamingCard(sessionId: string, rootId: string, terminalUrl: string, title: string, screenContent: string, status: 'starting' | 'working' | 'idle' | 'analyzing', cliId?: CliId, displayMode?: DisplayMode, cardNonce?: string, imageKey?: string, adoptMode?: boolean, showTakeover?: boolean, locale?: Locale): string;
|
|
42
43
|
/**
|
|
43
44
|
* Build a Feishu interactive card with a dropdown selector for projects.
|
|
44
45
|
* Returns a JSON string suitable for msg_type: 'interactive'.
|
|
45
46
|
*/
|
|
46
|
-
export declare function buildRepoSelectCard(projects: ProjectInfo[], currentPath?: string, rootMessageId?: string): string;
|
|
47
|
+
export declare function buildRepoSelectCard(projects: ProjectInfo[], currentPath?: string, rootMessageId?: string, locale?: Locale): string;
|
|
47
48
|
/**
|
|
48
49
|
* Build a Feishu interactive card for a TUI prompt detected by ScreenAnalyzer.
|
|
49
50
|
* Select-type options get buttons; input-type options shown in list with a note.
|
|
@@ -54,14 +55,14 @@ export declare function buildTuiPromptCard(rootId: string, sessionId: string, de
|
|
|
54
55
|
selected: boolean;
|
|
55
56
|
type?: string;
|
|
56
57
|
keys?: string[];
|
|
57
|
-
}>, multiSelect?: boolean, toggledIndices?: number[]): string;
|
|
58
|
+
}>, multiSelect?: boolean, toggledIndices?: number[], locale?: Locale): string;
|
|
58
59
|
/**
|
|
59
60
|
* Build a "processing" TUI prompt card — shown immediately when user clicks a button.
|
|
60
61
|
*/
|
|
61
|
-
export declare function buildTuiPromptProcessingCard(selectedText: string): string;
|
|
62
|
+
export declare function buildTuiPromptProcessingCard(selectedText: string, locale?: Locale): string;
|
|
62
63
|
/**
|
|
63
64
|
* Build a resolved TUI prompt card — shows which option was selected.
|
|
64
65
|
*/
|
|
65
|
-
export declare function buildTuiPromptResolvedCard(selectedText: string): string;
|
|
66
|
-
export declare function buildAdoptSelectCard(sessions: AdoptableSession[], rootMessageId?: string): string;
|
|
66
|
+
export declare function buildTuiPromptResolvedCard(selectedText: string, locale?: Locale): string;
|
|
67
|
+
export declare function buildAdoptSelectCard(sessions: AdoptableSession[], rootMessageId?: string, locale?: Locale): string;
|
|
67
68
|
//# sourceMappingURL=card-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../../../src/im/lark/card-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../../../src/im/lark/card-builder.ts"],"names":[],"mappings":"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"}
|