@jesonliu/lark-claudecode-bridge 0.11.0 → 0.14.2

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 (82) hide show
  1. package/README.md +89 -49
  2. package/assets/web/index.html +1769 -0
  3. package/config.example.yaml +22 -2
  4. package/dist/auth-precheck.d.ts +5 -2
  5. package/dist/auth-precheck.js +8 -2
  6. package/dist/auth-precheck.js.map +1 -1
  7. package/dist/bin/lcb.js +32 -3
  8. package/dist/bin/lcb.js.map +1 -1
  9. package/dist/claude-config.d.ts +24 -0
  10. package/dist/claude-config.js +143 -0
  11. package/dist/claude-config.js.map +1 -0
  12. package/dist/cli/setup-wizard.d.ts +1 -0
  13. package/dist/cli/setup-wizard.js +4 -0
  14. package/dist/cli/setup-wizard.js.map +1 -1
  15. package/dist/config-defaults.d.ts +4 -0
  16. package/dist/config-defaults.js +15 -0
  17. package/dist/config-defaults.js.map +1 -0
  18. package/dist/config.d.ts +7 -0
  19. package/dist/config.js +207 -6
  20. package/dist/config.js.map +1 -1
  21. package/dist/executor/claude-executor.d.ts +7 -2
  22. package/dist/executor/claude-executor.js +62 -17
  23. package/dist/executor/claude-executor.js.map +1 -1
  24. package/dist/executor/output-collector.d.ts +2 -0
  25. package/dist/executor/output-collector.js +15 -3
  26. package/dist/executor/output-collector.js.map +1 -1
  27. package/dist/executor/permission-gate.d.ts +37 -3
  28. package/dist/executor/permission-gate.js +86 -16
  29. package/dist/executor/permission-gate.js.map +1 -1
  30. package/dist/executor/plugin-discovery.d.ts +30 -0
  31. package/dist/executor/plugin-discovery.js +68 -1
  32. package/dist/executor/plugin-discovery.js.map +1 -1
  33. package/dist/executor/plugin-manager.d.ts +35 -0
  34. package/dist/executor/plugin-manager.js +109 -0
  35. package/dist/executor/plugin-manager.js.map +1 -0
  36. package/dist/feishu/slash-commands.d.ts +77 -0
  37. package/dist/feishu/slash-commands.js +188 -0
  38. package/dist/feishu/slash-commands.js.map +1 -0
  39. package/dist/gateway/card-builder.d.ts +18 -0
  40. package/dist/gateway/card-builder.js +61 -1
  41. package/dist/gateway/card-builder.js.map +1 -1
  42. package/dist/gateway/feishu-gateway.d.ts +10 -0
  43. package/dist/gateway/feishu-gateway.js +4 -0
  44. package/dist/gateway/feishu-gateway.js.map +1 -1
  45. package/dist/gateway/progress-card.d.ts +8 -0
  46. package/dist/gateway/progress-card.js +16 -0
  47. package/dist/gateway/progress-card.js.map +1 -1
  48. package/dist/index.d.ts +2 -0
  49. package/dist/index.js +210 -28
  50. package/dist/index.js.map +1 -1
  51. package/dist/session/commands.d.ts +16 -1
  52. package/dist/session/commands.js +77 -17
  53. package/dist/session/commands.js.map +1 -1
  54. package/dist/session/plugin-command.d.ts +14 -0
  55. package/dist/session/plugin-command.js +110 -0
  56. package/dist/session/plugin-command.js.map +1 -0
  57. package/dist/session/session-store.d.ts +14 -1
  58. package/dist/session/session-store.js +15 -0
  59. package/dist/session/session-store.js.map +1 -1
  60. package/dist/types.d.ts +69 -1
  61. package/dist/util/open-browser.d.ts +1 -0
  62. package/dist/util/open-browser.js +20 -0
  63. package/dist/util/open-browser.js.map +1 -0
  64. package/dist/util/server-url.d.ts +3 -0
  65. package/dist/util/server-url.js +10 -0
  66. package/dist/util/server-url.js.map +1 -0
  67. package/dist/web/config-api.d.ts +52 -0
  68. package/dist/web/config-api.js +186 -0
  69. package/dist/web/config-api.js.map +1 -0
  70. package/dist/web/lifecycle.d.ts +52 -0
  71. package/dist/web/lifecycle.js +167 -0
  72. package/dist/web/lifecycle.js.map +1 -0
  73. package/dist/web/model-list.d.ts +36 -0
  74. package/dist/web/model-list.js +101 -0
  75. package/dist/web/model-list.js.map +1 -0
  76. package/dist/web/server.d.ts +22 -0
  77. package/dist/web/server.js +618 -0
  78. package/dist/web/server.js.map +1 -0
  79. package/dist/web/update.d.ts +26 -0
  80. package/dist/web/update.js +64 -0
  81. package/dist/web/update.js.map +1 -0
  82. package/package.json +2 -1
@@ -1,10 +1,31 @@
1
1
  import { formatBeijingTime } from '../util/beijing-time.js';
2
+ import { handlePluginCommand } from './plugin-command.js';
3
+ import { invalidatePluginCache } from '../executor/plugin-discovery.js';
2
4
  /**
3
5
  * bridge 本地命令首 token 清单(去 / 后比对)。单一来源:commands.ts 的 switch、
4
6
  * triggers.ts 的 RESERVED、index.ts 的透传说明均以此为准——本地命令永远优先,
5
7
  * 不被触发词劫持、不透传给 Claude Code。新增本地命令务必同步此清单
6
8
  */
7
- export const BRIDGE_LOCAL_COMMANDS = ['help', 'new', 'resume', 'stop', 'status', 'ws', 'model', 'skills', 'plugins', 'mcp'];
9
+ export const BRIDGE_LOCAL_COMMANDS = ['help', 'new', 'resume', 'stop', 'status', 'ws', 'model', 'skills', 'plugins', 'mcp', 'plugin', 'reload-plugins'];
10
+ /**
11
+ * 内置命令的飞书 Slash Command 注册元信息(icon 为飞书 icon_key,见开放平台文档可选列表)。
12
+ * 斜杠命令同步(feishu/slash-commands)的默认期望集 = 本表的全部键 + config.slash_commands.extra。
13
+ * 新增本地命令须同步:BRIDGE_LOCAL_COMMANDS、handleCommand case、HELP 文案、本表(测试断言清单⊆本表)。
14
+ */
15
+ export const SLASH_COMMAND_META = {
16
+ help: { description: '查看全部命令', icon: 'slash-ai_outlined' },
17
+ new: { description: '开启新会话', icon: 'add-chat-ai_outlined' },
18
+ resume: { description: '列出/恢复历史会话', icon: 'update-ai_outlined' },
19
+ stop: { description: '停止当前任务', icon: 'clear_outlined' },
20
+ status: { description: '查看当前状态', icon: 'diagnosis-ai_outlined' },
21
+ ws: { description: '切换工作区(/ws list 列出)', icon: 'folder_outlined' },
22
+ model: { description: '查看/切换模型', icon: 'ai-style_outlined' },
23
+ skills: { description: '查看已加载技能', icon: 'skill_outlined' },
24
+ plugins: { description: '查看已加载插件', icon: 'plugin_outlined' },
25
+ mcp: { description: '查看已加载 MCP 服务', icon: 'ai-functions_outlined' },
26
+ plugin: { description: '插件管理:安装/启停/市场(管理员)', icon: 'plugin_outlined' },
27
+ 'reload-plugins': { description: '重载插件(清缓存,下条消息生效)', icon: 'restart_outlined' },
28
+ };
8
29
  const HELP = `**可用命令**
9
30
  /new — 开启新会话
10
31
  /resume — 列出历史会话
@@ -17,6 +38,8 @@ const HELP = `**可用命令**
17
38
  /skills — 查看已加载技能
18
39
  /plugins — 查看已加载插件
19
40
  /mcp — 查看已加载 MCP 服务
41
+ /plugin — 插件管理(安装/启停/市场,管理员)
42
+ /reload-plugins — 重载插件(清缓存,下一条消息重新加载)
20
43
  /help — 帮助
21
44
 
22
45
  💡 其它 / 开头的消息将原文透传给 Claude Code(可触发其技能与插件命令,如 /superpowers:brainstorming)`;
@@ -49,34 +72,33 @@ export async function handleCommand(text, ctx) {
49
72
  case 'new': {
50
73
  const ws = ctx.currentWorkspace();
51
74
  const st = store.getChannelState(key);
52
- // 显式清空历史(保留工作区归属与通道级模型偏好),会话指针重置为空
53
- store.setChannelState(key, { workspaceName: st?.workspaceName ?? ws, sessions: [], ...(st?.model ? { model: st.model } : {}) });
54
- return { handled: true, reply: `✅ 已开启新会话(工作区:${ws})` };
75
+ // 仅清除「当前续接指针」,历史会话列表保留(/resume 仍可切回)——
76
+ // 旧版清空整个 sessions 导致开新会话后历史「消失」,列表永远积累不起来
77
+ store.setCurrentSession(key, null, st?.workspaceName ?? ws);
78
+ return { handled: true, reply: `✅ 已开启新会话(工作区:${ws})。历史会话未清空,/resume 可随时切回` };
55
79
  }
56
80
  case 'resume': {
57
81
  const sessions = store.listSessions(key);
58
82
  if (args.length === 0) {
59
83
  if (sessions.length === 0)
60
84
  return { handled: true, reply: '暂无历史会话' };
61
- // 按时间正序展示:最早的排最前
85
+ // 按时间正序展示:最早的排最前;当前续接的会话打标(一眼看出下条消息会接到哪)
86
+ const current = store.getChannelState(key)?.currentSessionId;
62
87
  const chrono = [...sessions].reverse();
63
88
  const list = chrono
64
- .map((s, i) => `${i + 1}. ${s.summary || '(无摘要)'} <font color='grey'>${formatBeijingTime(s.updatedAt)}</font>`)
89
+ .map((s, i) => `${i + 1}. ${s.summary || '(无摘要)'} <font color='grey'>${formatBeijingTime(s.updatedAt)}</font>${s.sessionId === current ? ' ← 当前' : ''}`)
65
90
  .join('\n');
66
- return { handled: true, reply: `**历史会话**(回复 /resume 编号 恢复)\n${list}` };
91
+ return { handled: true, reply: `**历史会话**(回复 /resume 编号 恢复;/new 另起一支,历史保留)\n${list}` };
67
92
  }
68
93
  const n = Number(args[0]);
69
94
  if (!Number.isInteger(n) || n < 1 || n > sessions.length) {
70
95
  return { handled: true, reply: `编号无效,范围 1-${sessions.length}` };
71
96
  }
72
97
  const target = sessions[sessions.length - n]; // 编号 n → 时间正序第 n 个
73
- const st = store.getChannelState(key);
74
- if (st) {
75
- // 恢复 = 将选中会话移到头部(当前)
76
- st.sessions = [target, ...st.sessions.filter((s) => s.sessionId !== target.sessionId)];
77
- store.setChannelState(key, st);
78
- }
79
- return { handled: true, reply: `↩️ 已恢复会话:${target.summary || target.sessionId}` };
98
+ // 恢复 = 当前续接指针指向选中会话(列表顺序不动,历史保持时间序)
99
+ store.setCurrentSession(key, target.sessionId);
100
+ // 标注当前指针,方便 /resume 列表辨认正在续接哪条
101
+ return { handled: true, reply: `↩️ 已恢复会话:${target.summary || target.sessionId}\n下一条任务将从该会话继续` };
80
102
  }
81
103
  case 'stop':
82
104
  return { handled: true, reply: ctx.stopCurrentTask() ? '🛑 已发送停止信号' : '当前没有运行中的任务' };
@@ -100,13 +122,15 @@ export async function handleCommand(text, ctx) {
100
122
  if (!target)
101
123
  return { handled: true, reply: `工作区 "${args[1] ?? ''}" 不存在,/ws list 查看` };
102
124
  const st = store.getChannelState(key);
103
- // 切换工作区保留历史会话记录与通道级模型偏好
125
+ // 切换工作区保留历史会话记录与通道级模型偏好,但清除续接指针——
126
+ // 旧会话的上下文绑定原工作区目录,跨工作区自动续接容易答非所问
104
127
  store.setChannelState(key, {
105
128
  workspaceName: target.name,
106
129
  sessions: st?.sessions ?? [],
107
130
  ...(st?.model ? { model: st.model } : {}),
108
131
  });
109
- return { handled: true, reply: `✅ 已切换工作区:**${target.name}**(${target.path})` };
132
+ store.setCurrentSession(key, null, target.name);
133
+ return { handled: true, reply: `✅ 已切换工作区:**${target.name}**(${target.path})。已自动开启新会话(/resume 可切回历史)` };
110
134
  }
111
135
  return { handled: true, reply: '用法:/ws list | /ws use <名字>' };
112
136
  }
@@ -167,9 +191,45 @@ export async function handleCommand(text, ctx) {
167
191
  }).join('\n');
168
192
  return { handled: true, reply: `**MCP 服务** ${inv.mcpServers.length} 个 · ${inventoryHeader(inv)}\n${list}` };
169
193
  }
170
- default:
194
+ case 'plugin': {
195
+ // 飞书端插件管理(安装/启停/市场):本地接管,不再透传给 Claude Code 会话
196
+ if (!ctx.claudeConfigDir || !ctx.send) {
197
+ return { handled: true, reply: '⛔ 插件管理在当前部署下不可用(缺少运行环境注入)' };
198
+ }
199
+ return { handled: true, reply: await handlePluginCommand(args, {
200
+ isAdmin: ctx.isAdmin,
201
+ claudeConfigDir: ctx.claudeConfigDir,
202
+ userClaudeDir: ctx.userClaudeDir,
203
+ send: ctx.send,
204
+ }) };
205
+ }
206
+ case 'reload-plugins': {
207
+ // 终端 /reload-plugins 的 bridge 等价物:插件由每任务启动时现扫描加载(mtime 缓存),
208
+ // 清缓存即「重载」——下一条消息重新发现并传入 SDK(managed 模式双目录都清)
209
+ const dirs = ctx.claudeConfigDir ? [ctx.claudeConfigDir, ...(ctx.userClaudeDir && ctx.userClaudeDir !== ctx.claudeConfigDir ? [ctx.userClaudeDir] : [])] : [];
210
+ if (dirs.length === 0)
211
+ return { handled: true, reply: '⛔ 当前部署未注入 Claude 配置目录,无法重载' };
212
+ for (const d of dirs)
213
+ invalidatePluginCache(d);
214
+ return { handled: true, reply: '🔄 插件缓存已清,下一条消息起重新加载插件清单(等效终端 /reload-plugins;可用 /plugins 查看结果)' };
215
+ }
216
+ default: {
217
+ // Claude Code 终端 REPL 专属命令:headless 会话里透传只会得到 CLI 的
218
+ // "isn't available in this environment" 报错,不如本地直接给可操作的指引。
219
+ // (/reload-plugins 已实现为本地命令:清插件缓存,见上方 case)
220
+ const TERMINAL_ONLY = {
221
+ 'plugin-dev': '插件开发向导是 Claude Code 终端交互命令,机器人侧不可用。请在本地终端运行。',
222
+ 'vim': 'vim 模式是 Claude Code 终端按键绑定,机器人侧无意义。',
223
+ 'terminal-setup': '终端按键绑定安装是 Claude Code 终端命令,机器人侧无意义。',
224
+ 'bashes': '查看后台 shell 是 Claude Code 终端命令,机器人侧不可用。任务中的命令执行状态会实时显示在进度卡上。',
225
+ 'usage': '用量统计是 Claude Code 终端命令,机器人侧不可用。',
226
+ 'bug': '问题反馈是 Claude Code 终端命令,机器人侧不可用。',
227
+ };
228
+ if (name in TERMINAL_ONLY)
229
+ return { handled: true, reply: `⛔ /${name}:${TERMINAL_ONLY[name]}` };
171
230
  // 非本地命令的斜杠消息原文透传给 Claude Code(SDK 直接派发斜杠命令)
172
231
  return { handled: false, taskText: text };
232
+ }
173
233
  }
174
234
  }
175
235
  //# sourceMappingURL=commands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/session/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/session/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface PluginCommandDeps {
2
+ isAdmin: boolean;
3
+ /** bridge 解析的当前生效配置目录(managed=自管目录;inherit=~/.claude) */
4
+ claudeConfigDir: string;
5
+ /** 本机 ~/.claude(managed 模式下作为第二来源与默认安装目标;缺省 = 与 claudeConfigDir 相同) */
6
+ userClaudeDir?: string;
7
+ /** 异步结果推送通道(wiring 注入 gateway.sendTextTo) */
8
+ send: (markdown: string) => Promise<void>;
9
+ }
10
+ /**
11
+ * 处理 /plugin 子命令,返回立即回复文本。install/uninstall/marketplace 为长操作:
12
+ * 先回 ack,后台执行完毕(成功/失败/超时)经 deps.send 推送结果。
13
+ */
14
+ export declare function handlePluginCommand(args: string[], deps: PluginCommandDeps): Promise<string>;
@@ -0,0 +1,110 @@
1
+ // /plugin 飞书端插件管理命令:spawn SDK bundled CLI(plugin-manager)执行安装/启停/市场操作。
2
+ // 权限分级:list 对所有成员开放;变更类(install/uninstall/enable/disable/marketplace)仅 admin。
3
+ // 长操作(安装含 git clone)立即 ack、完成后经 deps.send 异步推送结果——不阻塞 gateway 事件链。
4
+ // managed 模式双目录:list 合并自管目录 + 本机 ~/.claude;变更操作按插件所在目录定向执行,
5
+ // install 默认装 ~/.claude(与本机 claude CLI 共用一份),--dir=managed 装 bridge 自管目录
6
+ import { runPluginCli } from '../executor/plugin-manager.js';
7
+ import { invalidatePluginCache, listInstalledPlugins } from '../executor/plugin-discovery.js';
8
+ const USAGE = [
9
+ '**插件管理**(仅管理员可变更)',
10
+ '/plugin list — 已安装插件清单(managed 模式含本机 ~/.claude)',
11
+ '/plugin install <name[@marketplace]> [--dir=managed] — 安装插件(默认装本机 ~/.claude)',
12
+ '/plugin uninstall <name> — 卸载插件',
13
+ '/plugin enable|disable <name> — 启用/停用插件',
14
+ '/plugin marketplace add <git地址|路径> — 添加插件市场',
15
+ '/plugin marketplace list — 查看插件市场',
16
+ '/plugin marketplace update [name] — 更新插件市场',
17
+ '/plugin marketplace remove <name> — 移除插件市场',
18
+ '',
19
+ '💡 插件装好后下一条消息自动加载(无须重启,两处目录的插件都会加载);/plugins 查看当前会话实际加载的插件',
20
+ ].join('\n');
21
+ /** 变更类子命令(admin only);list 与用法提示对全部成员开放 */
22
+ const ADMIN_SUBS = new Set(['install', 'uninstall', 'enable', 'disable', 'marketplace']);
23
+ /**
24
+ * 处理 /plugin 子命令,返回立即回复文本。install/uninstall/marketplace 为长操作:
25
+ * 先回 ack,后台执行完毕(成功/失败/超时)经 deps.send 推送结果。
26
+ */
27
+ export async function handlePluginCommand(args, deps) {
28
+ const [sub, ...rest] = args;
29
+ if (!sub)
30
+ return USAGE;
31
+ if (sub === 'help')
32
+ return USAGE;
33
+ if (ADMIN_SUBS.has(sub) && !deps.isAdmin) {
34
+ return '⛔ 插件变更操作仅管理员可用(查看清单可用 /plugin list)';
35
+ }
36
+ const bridgeDir = deps.claudeConfigDir;
37
+ const userDir = deps.userClaudeDir && deps.userClaudeDir !== deps.claudeConfigDir
38
+ ? deps.userClaudeDir
39
+ : deps.claudeConfigDir;
40
+ const dual = bridgeDir !== userDir; // managed 模式:变更类需按插件所在目录定向
41
+ const invalidateAll = () => { invalidatePluginCache(bridgeDir); if (dual)
42
+ invalidatePluginCache(userDir); };
43
+ // --dir=managed:install/marketplace 的目标目录选择(装自管目录;缺省装 ~/.claude)
44
+ const wantManagedDir = rest.some((s) => s === '--dir=managed' || s === '--dir=bridge');
45
+ const target = rest.filter((s) => s && !s.startsWith('-') && !s.startsWith('--dir='));
46
+ const installDir = wantManagedDir ? bridgeDir : userDir;
47
+ if (sub === 'list') {
48
+ const rows = pluginListRows(bridgeDir, dual ? userDir : null);
49
+ return rows
50
+ ? `**已安装插件**${dual ? '([bridge]=托管目录 [user]=本机 ~/.claude)' : ''}\n\`\`\`\n${rows}\n\`\`\``
51
+ : '尚无已安装插件(/plugin install <name[@marketplace]> 安装)';
52
+ }
53
+ if (sub === 'marketplace' && target[0] === 'list') {
54
+ // 市场清单仍走 CLI(repo 缓存目录结构复杂,本地解析收益低);dual 时提示两处各自的市场
55
+ const r = await runPluginCli(['marketplace', 'list'], { claudeConfigDir: installDir });
56
+ if (!r.ok)
57
+ return `查询失败:${r.text}`;
58
+ const head = dual ? `(目标目录:${installDir === bridgeDir ? 'bridge 托管' : '本机 ~/.claude'},--dir=managed 可切换)\n` : '';
59
+ return `**插件市场**${head ? `\n${head}` : ''}\n\`\`\`\n${r.text}\n\`\`\``;
60
+ }
61
+ const requiresTarget = sub !== 'marketplace' || target[0] !== 'list';
62
+ const name = target.join(' ');
63
+ if (requiresTarget && !name)
64
+ return `参数缺失:/plugin ${args.join(' ')} <…>。\n\n${USAGE}`;
65
+ // 目标目录解析:enable/disable/uninstall 按插件实际所在目录执行(两处都有则都执行);
66
+ // install/marketplace 用 installDir(--dir=managed 或缺省 ~/.claude)
67
+ const cliArgs = [sub, ...target]; // target 已剔除 --dir* 标志;runPluginCli 自行补 plugin 前缀与 -y
68
+ const dirs = (sub === 'install' || sub === 'marketplace')
69
+ ? [installDir]
70
+ : locatePluginDirs(name, bridgeDir, dual ? userDir : null);
71
+ const label = args.join(' ');
72
+ void (async () => {
73
+ const results = [];
74
+ for (const dir of dirs) {
75
+ const r = await runPluginCli(cliArgs, { claudeConfigDir: dir });
76
+ results.push(r.ok
77
+ ? `✅ ${dual ? `[${dir === bridgeDir ? 'bridge' : 'user'}] ` : ''}完成:\`\`\`\n${r.text}\n\`\`\``
78
+ : `❌ ${dual ? `[${dir === bridgeDir ? 'bridge' : 'user'}] ` : ''}失败:${r.text}`);
79
+ }
80
+ invalidateAll();
81
+ await deps.send((results.length ? results.join('\n') : '❌ 未找到该插件(两处目录均无安装记录)')
82
+ + '\n下一条消息起自动加载;/plugins 可查看实际加载清单');
83
+ })().catch((e) => deps.send(`❌ 插件操作异常(\`/plugin ${label}\`):${e instanceof Error ? e.message : String(e)}`));
84
+ return `⏳ 正在执行 \`/plugin ${label}\`(可能需要拉取仓库,稍候推送结果)`;
85
+ }
86
+ /** 合并渲染两处目录的已装插件清单;无任何插件返回 null。sourceTag 仅 dual 模式使用 */
87
+ function pluginListRows(bridgeDir, userDir) {
88
+ const fmt = (list) => list.map((p) => `${p.enabled ? '✅' : '⬜'} ${p.key}${p.version ? ` v${p.version}` : ''}${p.enabled ? '' : ' (未启用)'}`);
89
+ const bridgeList = listInstalledPlugins(bridgeDir);
90
+ if (!userDir) {
91
+ const rows = fmt(bridgeList);
92
+ return rows.length ? rows.join('\n') : null;
93
+ }
94
+ const rows = [
95
+ ...bridgeList.map((p) => `[bridge] ${fmt([p])[0]}`),
96
+ ...listInstalledPlugins(userDir).map((p) => `[user] ${fmt([p])[0]}`),
97
+ ];
98
+ return rows.length ? rows.join('\n') : null;
99
+ }
100
+ /** 按插件名(name 或 name@marketplace)定位所在目录;两处都装了则返回两处(都执行) */
101
+ function locatePluginDirs(name, bridgeDir, userDir) {
102
+ const inDir = (dir) => listInstalledPlugins(dir).some((p) => p.key === name || p.name === name);
103
+ const dirs = [];
104
+ if (inDir(bridgeDir))
105
+ dirs.push(bridgeDir);
106
+ if (userDir && inDir(userDir))
107
+ dirs.push(userDir);
108
+ return dirs;
109
+ }
110
+ //# sourceMappingURL=plugin-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-command.js","sourceRoot":"","sources":["../../src/session/plugin-command.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,17 @@ export interface SessionMeta {
3
3
  summary: string;
4
4
  updatedAt: string;
5
5
  }
6
- /** 通道状态:sessions[0] 为当前会话,其余按新→旧排列 */
6
+ /** 通道状态:sessions 为历史会话列表(新→旧);currentSessionId 为当前续接指针 */
7
7
  export interface ChannelState {
8
8
  workspaceName: string;
9
9
  sessions: SessionMeta[];
10
+ /**
11
+ * 当前续接的会话指针:executeTask 每任务 resume 它;/new 置空(下个任务新开会话),
12
+ * /resume <n> 指向选中会话。缺省时回退 sessions[0](兼容旧数据:旧版 sessions[0] 即当前)。
13
+ * 与历史列表分离是 /new 语义的关键:开新会话 ≠ 清空历史(0.13.x 前清空导致
14
+ * /resume 列表永远只剩一条、重启后看似「丢了」全部历史)。
15
+ */
16
+ currentSessionId?: string;
10
17
  /** 通道级模型覆盖(/model 命令设置,跨重启持久;/new 不清除——它是通道偏好而非会话状态)。
11
18
  * 缺省/undefined = 跟随 ~/.claude/settings.json 的 model */
12
19
  model?: string;
@@ -26,6 +33,12 @@ export declare class SessionStore {
26
33
  setChannelState(key: string, state: ChannelState): void;
27
34
  /** 归档会话并置为当前(头插,去重;summary 截断到 60 字) */
28
35
  archiveSession(key: string, sessionId: string, summary: string): void;
36
+ /**
37
+ * 设置/清除当前续接指针(不动历史列表):
38
+ * /new 传 null(下个任务新开会话,历史保留);/resume <n> 传选中 sessionId。
39
+ * channel 不存在时以 defaultWorkspace 初始化后设置。
40
+ */
41
+ setCurrentSession(key: string, sessionId: string | null, defaultWorkspace?: string): void;
29
42
  /**
30
43
  * 开启新会话:channel 不存在时以 defaultWorkspace 初始化;
31
44
  * 已存在时保持工作区与历史不变(历史由 /new 命令显式清空)。
@@ -38,6 +38,21 @@ export class SessionStore {
38
38
  const st = this.data[key] ?? { workspaceName: '', sessions: [] };
39
39
  const rest = st.sessions.filter((s) => s.sessionId !== sessionId);
40
40
  st.sessions = [{ sessionId, summary: summary.slice(0, 60), updatedAt: new Date().toISOString() }, ...rest];
41
+ st.currentSessionId = sessionId;
42
+ this.data[key] = st;
43
+ this.save();
44
+ }
45
+ /**
46
+ * 设置/清除当前续接指针(不动历史列表):
47
+ * /new 传 null(下个任务新开会话,历史保留);/resume <n> 传选中 sessionId。
48
+ * channel 不存在时以 defaultWorkspace 初始化后设置。
49
+ */
50
+ setCurrentSession(key, sessionId, defaultWorkspace = '') {
51
+ const st = this.data[key] ?? { workspaceName: defaultWorkspace, sessions: [] };
52
+ if (sessionId === null)
53
+ delete st.currentSessionId;
54
+ else
55
+ st.currentSessionId = sessionId;
41
56
  this.data[key] = st;
42
57
  this.save();
43
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/session/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAiB1C;;;;GAIG;AACH,MAAM,OAAO,YAAY;IAGK,IAAI;IAFxB,IAAI,GAAiC,EAAE,CAAC;IAEhD,YAA4B,IAAY;oBAAZ,IAAI;QAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAiC,CAAC;YACrF,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,IAAY;QACtB,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAEO,IAAI;QACV,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC;IAED,eAAe,CAAC,GAAW;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,eAAe,CAAC,GAAW,EAAE,KAAmB;QAC9C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,wCAAwC;IACxC,cAAc,CAAC,GAAW,EAAE,SAAiB,EAAE,OAAe;QAC5D,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAClE,EAAE,CAAC,QAAQ,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC3G,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,GAAW,EAAE,gBAAwB;QAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC;IACxC,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB,EAAE,UAAkB;IACzE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,UAAU,OAAO,CAAC,CAAC;IACnE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,UAAU,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACpC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,iCAAiC,UAAU,6CAA6C,CAAC,CAAC;IACzG,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/session/session-store.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -44,6 +44,65 @@ export interface PermissionsConfig {
44
44
  allowTools?: string[];
45
45
  dangerousCommands?: RegExp[];
46
46
  }
47
+ /** Web 配置页服务器(lcb start / lcb ui 内嵌,node:http 零依赖):enabled/host/port 均为启动时读取,改动需重启 */
48
+ export interface ServerConfig {
49
+ enabled?: boolean;
50
+ host?: string;
51
+ port?: number;
52
+ }
53
+ export type ClaudeAuthMode = 'inherit' | 'managed';
54
+ /**
55
+ * 多厂商认证档案(Web 配置页「Claude 认证」管理,0.13 起)。档案仅是配置库:
56
+ * 当前生效配置始终是 ClaudeConfig 顶层四字段(写入 settings.json 的就是它),
57
+ * 「设为当前」= 把档案字段拷贝到顶层(互斥凭证同步清理),与 cc-switch 同款切换语义。
58
+ */
59
+ export interface ClaudeProfile {
60
+ /** 档案名(显示用,如「官方」「中转站A」「GLM」) */
61
+ name: string;
62
+ /** 与 apiKey 二选一 */
63
+ authToken?: string;
64
+ /** 与 authToken 二选一 */
65
+ apiKey?: string;
66
+ baseUrl?: string;
67
+ model?: string;
68
+ /** 候选模型集(fable/opus/sonnet/haiku 等各存一条,页面点选即切换当前模型);model 仍为「设为当前」时的默认模型 */
69
+ models?: string[];
70
+ }
71
+ /**
72
+ * Claude 认证与模型配置。inherit = 共享本机 ~/.claude(0.4 起默认行为,登录态/settings 全继承);
73
+ * managed = bridge 自管目录(~/.lark-claudecode-bridge/claude/),authToken/apiKey/baseUrl/model
74
+ * 写入该目录 settings.json 的 env 块——完全摆脱对本机 claude login 的依赖
75
+ */
76
+ export interface ClaudeConfig {
77
+ mode?: ClaudeAuthMode;
78
+ /** ANTHROPIC_AUTH_TOKEN(Bearer,中转站常用);与 apiKey 二选一 */
79
+ authToken?: string;
80
+ /** ANTHROPIC_API_KEY(x-api-key);与 authToken 二选一 */
81
+ apiKey?: string;
82
+ /** ANTHROPIC_BASE_URL(第三方中转端点;官方 API 留空) */
83
+ baseUrl?: string;
84
+ /** 写 settings.json 顶层 model + env.ANTHROPIC_MODEL */
85
+ model?: string;
86
+ /**
87
+ * managed 模式显式环境变量(写入托管 settings.json 的 env 块,MCP 工具依赖的
88
+ * IMAGE_GEN_* / API_HOST 等自定义变量在此配置)。优先级:本键 > 本机 ~/.claude
89
+ * settings env 自动继承 > 托管目录既有值。认证 4 键(ANTHROPIC_AUTH_TOKEN/API_KEY/
90
+ * BASE_URL/MODEL)不在此生效——永远以认证表单为准(入口过滤,防绕过)。
91
+ */
92
+ env?: Record<string, string>;
93
+ /** 多厂商档案库(不直接生效;Web 页「设为当前」拷贝到顶层) */
94
+ profiles?: ClaudeProfile[];
95
+ }
96
+ /** 飞书斜杠命令注册定义(同步到开放平台 app_slash_commands;command 不含 / 前缀) */
97
+ export interface SlashCommandDef {
98
+ command: string;
99
+ description: string;
100
+ icon?: string;
101
+ }
102
+ /** 斜杠命令同步配置:extra 为用户自定义透传命令(内置命令集见 commands.SLASH_COMMAND_META,始终参与同步) */
103
+ export interface SlashCommandsConfig {
104
+ extra?: SlashCommandDef[];
105
+ }
47
106
  export interface BridgeConfig {
48
107
  /** 多飞书应用(多机器人):每 app 一条独立 WS 长连接 + 独立会话池(sessions.<appId>.json)。
49
108
  * 全部 app 共享本机 ~/.claude:模型设置/登录态/user MCP/skills/插件统一继承,仅会话池隔离 */
@@ -59,6 +118,12 @@ export interface BridgeConfig {
59
118
  };
60
119
  /** 权限白名单;缺省用 permission-gate 的内置默认(读工具 + Bash + 危险命令表) */
61
120
  permissions?: PermissionsConfig;
121
+ /** Web 配置页服务器;缺省 enabled=true / 127.0.0.1:17317(随 lcb start 常驻) */
122
+ server?: ServerConfig;
123
+ /** Claude 认证模式;缺省 inherit(共享 ~/.claude) */
124
+ claude?: ClaudeConfig;
125
+ /** 飞书斜杠命令同步;缺省仅内置命令集 */
126
+ slashCommands?: SlashCommandsConfig;
62
127
  }
63
128
  export interface IncomingMessage {
64
129
  chatId: string;
@@ -79,11 +144,14 @@ export interface RejectedMessage {
79
144
  };
80
145
  }
81
146
  /** 卡片回调决策:allow/deny/allow-session 为写工具确认卡;plan-* 为计划确认卡(feedback = 按意见修改时的用户输入) */
82
- export type CardDecision = 'allow' | 'deny' | 'allow-session' | 'plan-approve' | 'plan-revise' | 'plan-reject';
147
+ export type CardDecision = 'allow' | 'deny' | 'allow-session' | 'plan-approve' | 'plan-revise' | 'plan-reject' | 'qa-pick' | 'qa-submit';
83
148
  export interface CardActionValue {
84
149
  requestId: string;
85
150
  decision: CardDecision;
86
151
  feedback?: string;
152
+ /** qa-pick:问题下标与选项 label */
153
+ qIndex?: number;
154
+ option?: string;
87
155
  }
88
156
  export interface CardActionEvent {
89
157
  value: CardActionValue;
@@ -0,0 +1 @@
1
+ export declare function openBrowser(url: string): void;
@@ -0,0 +1,20 @@
1
+ // 跨平台开浏览器(best-effort:失败静默,用户可手动复制 URL)
2
+ import { spawn } from 'node:child_process';
3
+ export function openBrowser(url) {
4
+ try {
5
+ if (process.platform === 'win32') {
6
+ // cmd /c start:Windows 默认浏览器;空标题占位防 URL 被当成标题
7
+ spawn('cmd', ['/c', 'start', '', url], { detached: true, stdio: 'ignore', windowsHide: true }).unref();
8
+ }
9
+ else if (process.platform === 'darwin') {
10
+ spawn('open', [url], { detached: true, stdio: 'ignore' }).unref();
11
+ }
12
+ else {
13
+ spawn('xdg-open', [url], { detached: true, stdio: 'ignore' }).unref();
14
+ }
15
+ }
16
+ catch {
17
+ // 开不了浏览器不影响功能:URL 已打印在终端
18
+ }
19
+ }
20
+ //# sourceMappingURL=open-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-browser.js","sourceRoot":"","sources":["../../src/util/open-browser.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,8CAA8C;YAC9C,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACzG,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACzC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { BridgeConfig } from '../types.js';
2
+ /** 配置页 URL(host/port 回退默认值);server.enabled=false 时返回 null(无页面可指) */
3
+ export declare function serverUrl(config: BridgeConfig): string | null;
@@ -0,0 +1,10 @@
1
+ /** 配置页 URL(host/port 回退默认值);server.enabled=false 时返回 null(无页面可指) */
2
+ export function serverUrl(config) {
3
+ const s = config.server;
4
+ if (s?.enabled === false)
5
+ return null;
6
+ const host = s?.host ?? '127.0.0.1';
7
+ const port = s?.port ?? 17317;
8
+ return `http://${host}:${port}`;
9
+ }
10
+ //# sourceMappingURL=server-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-url.js","sourceRoot":"","sources":["../../src/util/server-url.ts"],"names":[],"mappings":"AAGA,oEAAoE;AACpE,MAAM,UAAU,SAAS,CAAC,MAAoB;IAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,WAAW,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC;IAC9B,OAAO,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { BridgeConfig, FeishuAppConfig } from '../types.js';
2
+ /** secret 字段的脱敏回显形状(真实值永不离开本机进程) */
3
+ export interface SecretHint {
4
+ secretSet: boolean;
5
+ secretHint?: string;
6
+ }
7
+ export declare function maskSecret(value: string | undefined): SecretHint;
8
+ /** 客户端提交的 secret 字段是否应视为「未修改」(空串/缺省/仍是脱敏对象都算) */
9
+ export declare function isUnchangedSecret(v: unknown): boolean;
10
+ /**
11
+ * secret 回填:客户端 doc 中的 secret 字段(apps[].app_secret、claude.auth_token/api_key)
12
+ * 未修改时回填磁盘现值。非 secret 字段不动;其余 secret 位置(未来新增)按同模式扩展。
13
+ */
14
+ export declare function applySecrets(newDoc: Record<string, unknown>, oldDoc: Record<string, unknown>): Record<string, unknown>;
15
+ /** GET /api/config 响应构建:深拷贝 doc 并把 secret 字段替换为脱敏提示 */
16
+ export declare function docForClient(doc: Record<string, unknown>): Record<string, unknown>;
17
+ /**
18
+ * Host header 校验(防 DNS rebinding):host 部分(去端口)必须是回环名或配置的 host。
19
+ * 端口不校验(localhost:port 与 127.0.0.1:port 等价放行,用户从哪个名字进来无从假设)。
20
+ */
21
+ export declare function isAllowedHost(hostHeader: string | undefined, cfgHost: string): boolean;
22
+ /** Origin header 校验(存在才查;同源 fetch 一定带且 host 合法,跨站请求携带外域 Origin) */
23
+ export declare function isAllowedOrigin(originHeader: string | undefined, cfgHost: string, cfgPort: number): boolean;
24
+ /** PUT 前后比较,列出需重启的段落(其余段落经热重载器下一条消息生效) */
25
+ export declare function computeRestartRequired(before: BridgeConfig, after: BridgeConfig): string[];
26
+ /** apps 启动态摘要(GET /api/status 用;lcb ui 独立进程无法得知,标 unknown) */
27
+ export declare function appStatusSummary(apps: FeishuAppConfig[], started?: Array<{
28
+ name: string;
29
+ started: boolean;
30
+ }>): Array<{
31
+ name: string;
32
+ appId: string;
33
+ started: boolean | 'unknown';
34
+ }>;
35
+ /**
36
+ * GET /api/config 显示层权限默认回填:permissions 键缺失(undefined/null,多见于老版本升级配置)时
37
+ * 回显运行时默认,让用户「打开页面就能看到/编辑默认值」;键存在但为空数组 = 用户有意清空,原样返回。
38
+ * PUT 整段替换语义下「回显 → 保存 → 固化写盘」为预期行为(老配置保存会把该段固化为默认并重写,
39
+ * 丢段内手写注释;bootstrap 出身的配置磁盘已有相同默认,走「值未变跳过重写」不受影响)。
40
+ */
41
+ export declare function applyPermissionDisplayDefaults(doc: Record<string, unknown>): Record<string, unknown>;
42
+ /** 当前生效 Claude 配置摘要(GET /api/status 展示用):settings.json 内容 → 凭证脱敏。inherit/managed 均适用 */
43
+ export interface ClaudeCurrentSummary {
44
+ baseUrl?: string;
45
+ model?: string;
46
+ authToken: SecretHint;
47
+ apiKey: SecretHint;
48
+ /** env 块中非 ANTHROPIC_* 键数量(managed 模式自定义环境变量生效情况的可观测口径) */
49
+ envCount?: number;
50
+ }
51
+ /** 纯函数:解析 settings.json(顶层 model + env 块 ANTHROPIC_*),凭证过 maskSecret,明文永不离开本机 */
52
+ export declare function claudeSettingsSummary(settings: unknown): ClaudeCurrentSummary;