@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,6 +1,6 @@
1
1
  // 权限闸:白名单工具直通(读工具 + Bash,Bash 另过危险命令黑名单),写操作经 ask 回调
2
2
  // 询问(飞书卡片确认,带 diff 展示),超时自动拒绝 + 会话级记忆;plan mode 的 ExitPlanMode
3
- // 经 planAsk 回调走计划确认卡片
3
+ // 经 planAsk 回调走计划确认卡片;AskUserQuestion 经 askQuestion 回调走问题选项卡片
4
4
  import { randomUUID } from 'node:crypto';
5
5
  import { NOTIFY_TOOL_PREFIX } from './notify-server.js';
6
6
  import { generateFileDiff } from '../util/diff.js';
@@ -8,33 +8,72 @@ import { generateFileDiff } from '../util/diff.js';
8
8
  * 内置默认免确认工具白名单(config.yaml permissions.allow_tools 缺省值;配置即整体替换)。
9
9
  * Bash 默认放行是读场景(ls/cat/grep 等经 Bash 执行)不弹卡的前提,安全性由
10
10
  * DEFAULT_DANGEROUS_COMMANDS 黑名单兜底——命中仍弹确认卡。
11
+ * LIST 源列表供 config-defaults 预置写盘(lcb setup / web bootstrap),Set 由其派生,保单源。
11
12
  */
12
- export const DEFAULT_ALLOW_TOOLS = new Set([
13
+ export const DEFAULT_ALLOW_TOOLS_LIST = [
13
14
  'Read', 'Glob', 'Grep', 'LS', 'TodoRead', 'TodoWrite', 'WebFetch', 'WebSearch', 'Bash',
14
- ]);
15
+ ];
16
+ export const DEFAULT_ALLOW_TOOLS = new Set(DEFAULT_ALLOW_TOOLS_LIST);
15
17
  // 保留旧名导出(含只读子集、不含 Bash):外部引用与测试的语义锚点
16
18
  export const READ_ONLY_TOOLS = new Set([
17
19
  'Read', 'Glob', 'Grep', 'LS', 'TodoRead', 'TodoWrite', 'WebFetch', 'WebSearch',
18
20
  ]);
19
- /** 内置 Bash 危险命令正则(permissions.dangerous_commands 缺省值):对 command 全文匹配,命中弹确认卡 */
20
- export const DEFAULT_DANGEROUS_COMMANDS = [
21
- /\brm\s+-[a-z]*r[a-z]*f/i, // rm -rf / rm -fr / rm -Rf(递归强删)
22
- /\brm\s+-[a-z]*f[a-z]*r/i,
23
- /\bsudo\s/i,
24
- /\bgit\s+push\b[^&|;]*--force/i, // 强推覆盖远端
25
- /\bgit\s+reset\s+--hard/i, // 丢弃本地改动
26
- /\bmkfs\b/i,
27
- /\bdd\s+if=/i,
28
- /\bchmod\s+777\b/i,
29
- /\b(curl|wget)\b[^|;&]*\|\s*(ba|z)?sh\b/i, // 远程脚本管道执行
30
- /\b(shutdown|reboot)\b/i,
21
+ /**
22
+ * 内置 Bash 危险命令正则源串(permissions.dangerous_commands 缺省值;运行期统一 i flag 编译)。
23
+ * 源串形式供 config-defaults 预置写盘——写出的配置回读后与内置行为逐字一致。
24
+ */
25
+ export const DEFAULT_DANGEROUS_COMMAND_SOURCES = [
26
+ '\\brm\\s+-[a-z]*r[a-z]*f', // rm -rf / rm -fr / rm -Rf(递归强删)
27
+ '\\brm\\s+-f[a-z]*r',
28
+ '\\bsudo\\s',
29
+ '\\bgit\\s+push\\b[^&|;]*--force', // 强推覆盖远端
30
+ '\\bgit\\s+reset\\s+--hard', // 丢弃本地改动
31
+ '\\bmkfs\\b',
32
+ '\\bdd\\s+if=',
33
+ '\\bchmod\\s+777\\b',
34
+ '\\b(curl|wget)\\b[^|;&]*\\|\\s*(ba|z)?sh\\b', // 远程脚本管道执行
35
+ '\\b(shutdown|reboot)\\b',
31
36
  ];
37
+ /** 内置 Bash 危险命令正则:对 command 全文匹配(不区分大小写),命中弹确认卡 */
38
+ export const DEFAULT_DANGEROUS_COMMANDS = DEFAULT_DANGEROUS_COMMAND_SOURCES.map((s) => new RegExp(s, 'i'));
32
39
  // 超时默认 10 分钟:飞书端可能长时间无人点击卡片
33
40
  const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
34
41
  // 内部哨兵:区分「超时拒绝」与「用户主动拒绝」,便于给出准确原因
35
42
  const TIMED_OUT = Symbol('timed-out');
43
+ // 提问超时哨兵(与确认卡的 TIMED_OUT 分开,避免类型纠缠)
44
+ const TIMED_OUT_SYM = Symbol('question-timed-out');
36
45
  /** 生成确认 diff 的写工具集合(NotebookEdit 传入 generateFileDiff 后返回空,保持统一入口) */
37
46
  const DIFF_TOOLS = new Set(['Write', 'Edit', 'NotebookEdit']);
47
+ /** 解析并校验 AskUserQuestion 的 input.questions;非法结构返回空数组(由调用方 deny) */
48
+ export function parseQuestions(input) {
49
+ const raw = input.questions;
50
+ if (!Array.isArray(raw))
51
+ return [];
52
+ const items = [];
53
+ for (const q of raw) {
54
+ if (!q || typeof q !== 'object')
55
+ continue;
56
+ const question = typeof q.question === 'string'
57
+ ? q.question : '';
58
+ const options = Array.isArray(q.options)
59
+ ? q.options : [];
60
+ const parsed = options
61
+ .map((o) => ({
62
+ label: typeof o?.label === 'string' ? o.label : '',
63
+ ...(typeof o?.description === 'string' ? { description: o.description } : {}),
64
+ }))
65
+ .filter((o) => o.label);
66
+ if (question && parsed.length >= 2) {
67
+ items.push({
68
+ question,
69
+ ...(typeof q.header === 'string' ? { header: q.header } : {}),
70
+ ...(q.multiSelect === true ? { multiSelect: true } : {}),
71
+ options: parsed,
72
+ });
73
+ }
74
+ }
75
+ return items;
76
+ }
38
77
  export class PermissionGate {
39
78
  opts;
40
79
  remembered = new Set();
@@ -49,7 +88,7 @@ export class PermissionGate {
49
88
  const cmd = typeof input.command === 'string' ? input.command : '';
50
89
  return cmd ? this.dangerousCommands.some((re) => re.test(cmd)) : false;
51
90
  }
52
- async decide(toolName, input, workspaceName) {
91
+ async decide(toolName, input, workspaceName, ctx) {
53
92
  // lcb-notify 通知工具直通:server 实例由 executeTask 闭包构造,chatId 硬绑定,
54
93
  // 模型无法选择接收者(只能发到当前任务发起的聊天),无破坏性,逐张发图不应逐次弹确认卡。
55
94
  // 用前缀匹配:后续往 notify server 新增工具自动直通。
@@ -66,6 +105,23 @@ export class PermissionGate {
66
105
  return { behavior: 'deny', message: `用户未批准当前计划,要求按以下意见修改后重新提交计划:\n${r.feedback}` };
67
106
  return { behavior: 'deny', message: '用户在飞书端放弃了本次计划,请停止执行并等待用户下一步指示' };
68
107
  }
108
+ // AskUserQuestion:headless 下 CLI 把问题经 canUseTool 交给宿主,飞书侧渲染问题选项卡片;
109
+ // 用户提交的答案经 updatedInput.answers 回传(官方 user-input 姿势),模型据此继续任务
110
+ if (toolName === 'AskUserQuestion') {
111
+ if (!this.opts.askQuestion) {
112
+ return { behavior: 'deny', message: '当前环境不支持交互式提问卡片,请直接基于任务上下文自行决策并继续(不要向用户提问)' };
113
+ }
114
+ const questions = parseQuestions(input);
115
+ if (questions.length === 0) {
116
+ return { behavior: 'deny', message: 'AskUserQuestion 携带的问题结构不完整(至少 1 个问题、每问至少 2 个选项),请改用文本说明' };
117
+ }
118
+ const timeoutMs = this.opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
119
+ const answers = await this.withTimeout(this.opts.askQuestion({ questions, workspaceName }), timeoutMs);
120
+ if (answers === TIMED_OUT_SYM) {
121
+ return { behavior: 'deny', message: `提问超时(${Math.round(timeoutMs / 60000)} 分钟未响应),请自行决策并继续` };
122
+ }
123
+ return { behavior: 'allow', updatedInput: { questions: input.questions, answers } };
124
+ }
69
125
  // 白名单直通;Bash 命中危险命令正则时落到确认卡(安全优先于白名单)
70
126
  if (this.allowTools.has(toolName) && !(toolName === 'Bash' && this.isDangerousCommand(input))) {
71
127
  return { behavior: 'allow' };
@@ -107,6 +163,20 @@ export class PermissionGate {
107
163
  return { behavior: 'deny', message: `用户在飞书端拒绝了本次操作(${toolName})` };
108
164
  return { behavior: 'allow' };
109
165
  }
166
+ /** 提问挂起窗(与 ask 同款超时语义):到点自动跳过,不让任务无限等待 */
167
+ async withTimeout(p, timeoutMs) {
168
+ let timer;
169
+ const timeoutPromise = new Promise((resolve) => {
170
+ timer = setTimeout(() => resolve(TIMED_OUT_SYM), timeoutMs);
171
+ timer.unref();
172
+ });
173
+ try {
174
+ return await Promise.race([p, timeoutPromise]);
175
+ }
176
+ finally {
177
+ clearTimeout(timer);
178
+ }
179
+ }
110
180
  rememberSession(toolName) {
111
181
  this.remembered.add(toolName);
112
182
  }
@@ -1 +1 @@
1
- {"version":3,"file":"permission-gate.js","sourceRoot":"","sources":["../../src/executor/permission-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permission-gate.js","sourceRoot":"","sources":["../../src/executor/permission-gate.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,36 @@ export interface DiscoveredPlugin {
15
15
  * settings.json: {enabledPlugins:{"name@marketplace":true}}
16
16
  */
17
17
  export declare function discoverPlugins(claudeConfigDir: string): DiscoveredPlugin[];
18
+ /** 主动清缓存:/plugin install 等操作后调用,消除粗粒度文件系统 mtime 同秒不变化的风险 */
19
+ export declare function invalidatePluginCache(claudeConfigDir: string): void;
20
+ /** 已安装插件全量清单(含未启用项;Web 配置页 /api/plugins 用)。文件缺失返回空 */
21
+ export declare function listInstalledPlugins(claudeConfigDir: string): Array<{
22
+ key: string;
23
+ name: string;
24
+ marketplace?: string;
25
+ enabled: boolean;
26
+ path?: string;
27
+ version?: string;
28
+ }>;
29
+ /** 市场清单(marketplace.json)里的可安装插件条目 */
30
+ export interface MarketplacePluginEntry {
31
+ name: string;
32
+ description?: string;
33
+ version?: string;
34
+ }
35
+ /** 一个市场的可安装插件目录(安装下拉数据源) */
36
+ export interface MarketplaceCatalog {
37
+ /** 市场名(marketplaces/ 下的目录名,即 install key "name@marketplace" 的 @ 后段) */
38
+ name: string;
39
+ description?: string;
40
+ plugins: MarketplacePluginEntry[];
41
+ }
42
+ /**
43
+ * 列出 <claudeConfigDir>/plugins/marketplaces/* 各市场 .claude-plugin/marketplace.json
44
+ * 声明的可安装插件(Web 配置页「安装」下拉数据源;CLI 语义:install 只能装已添加市场里的插件)。
45
+ * 目录缺失(未 marketplace add 过)返回空;单个市场清单损坏按市场粒度跳过,不影响其余。
46
+ */
47
+ export declare function listAvailablePlugins(claudeConfigDir: string): MarketplaceCatalog[];
18
48
  /**
19
49
  * 显式配置(config.yaml apps[].plugins,开发期指源码目录)与自动发现结果合并:
20
50
  * 按插件名去重,显式优先——防「显式指 dev 副本 + 缓存里正式版」双载导致技能重复。
@@ -2,7 +2,7 @@
2
2
  // 从 Claude Code 数据目录读取 installed_plugins.json(安装清单)+ settings.json 的
3
3
  // enabledPlugins(启用状态),把 scope=user 且已启用的插件 installPath 转成 SDK plugins 选项。
4
4
  // 全程容错:文件缺失/格式异常一律 warn-once 后返回空,绝不阻断任务(插件加载失败 ≠ 桥接器不可用)
5
- import { existsSync, readFileSync, statSync } from 'node:fs';
5
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
6
6
  import { join } from 'node:path';
7
7
  // mtime 缓存:用户 CLI 侧 /plugin install/uninstall 后两个文件的 mtime 变化自动失效,
8
8
  // 任务间复用避免每条消息重复解析 JSON(文件很小,stat 开销可忽略)
@@ -52,6 +52,73 @@ export function discoverPlugins(claudeConfigDir) {
52
52
  cache.set(claudeConfigDir, { mtimes, result });
53
53
  return result;
54
54
  }
55
+ /** 主动清缓存:/plugin install 等操作后调用,消除粗粒度文件系统 mtime 同秒不变化的风险 */
56
+ export function invalidatePluginCache(claudeConfigDir) {
57
+ cache.delete(claudeConfigDir);
58
+ }
59
+ /** 已安装插件全量清单(含未启用项;Web 配置页 /api/plugins 用)。文件缺失返回空 */
60
+ export function listInstalledPlugins(claudeConfigDir) {
61
+ const installed = readJson(join(claudeConfigDir, 'plugins', 'installed_plugins.json'));
62
+ if (!installed.ok || installed.doc.version !== 2)
63
+ return [];
64
+ const settings = readJson(join(claudeConfigDir, 'settings.json'));
65
+ const enabledMap = settings.ok ? (settings.doc.enabledPlugins ?? {}) : {};
66
+ const out = [];
67
+ for (const [key, list] of Object.entries(installed.doc.plugins ?? {})) {
68
+ if (!Array.isArray(list))
69
+ continue;
70
+ const item = list.find((it) => it.scope === 'user') ?? list[0];
71
+ const at = key.indexOf('@');
72
+ out.push({
73
+ key,
74
+ name: at > 0 ? key.slice(0, at) : key,
75
+ marketplace: at > 0 ? key.slice(at + 1) : undefined,
76
+ enabled: enabledMap[key] === true,
77
+ ...(typeof item?.installPath === 'string' && item.installPath ? { path: item.installPath } : {}),
78
+ ...(typeof item?.version === 'string' ? { version: item.version } : {}),
79
+ });
80
+ }
81
+ return out;
82
+ }
83
+ /**
84
+ * 列出 <claudeConfigDir>/plugins/marketplaces/* 各市场 .claude-plugin/marketplace.json
85
+ * 声明的可安装插件(Web 配置页「安装」下拉数据源;CLI 语义:install 只能装已添加市场里的插件)。
86
+ * 目录缺失(未 marketplace add 过)返回空;单个市场清单损坏按市场粒度跳过,不影响其余。
87
+ */
88
+ export function listAvailablePlugins(claudeConfigDir) {
89
+ const marketRoot = join(claudeConfigDir, 'plugins', 'marketplaces');
90
+ let entries;
91
+ try {
92
+ entries = readdirSync(marketRoot, { withFileTypes: true });
93
+ }
94
+ catch {
95
+ return []; // 市场根目录不存在 = 尚未添加任何市场,正常态
96
+ }
97
+ const out = [];
98
+ for (const entry of entries) {
99
+ if (!entry.isDirectory())
100
+ continue;
101
+ const manifest = readJson(join(marketRoot, entry.name, '.claude-plugin', 'marketplace.json'));
102
+ if (!manifest.ok)
103
+ continue;
104
+ const plugins = [];
105
+ for (const p of manifest.doc.plugins ?? []) {
106
+ if (typeof p?.name !== 'string' || !p.name)
107
+ continue;
108
+ plugins.push({
109
+ name: p.name,
110
+ ...(typeof p.description === 'string' ? { description: p.description } : {}),
111
+ ...(typeof p.version === 'string' && p.version ? { version: p.version } : {}),
112
+ });
113
+ }
114
+ out.push({
115
+ name: entry.name,
116
+ ...(typeof manifest.doc.description === 'string' ? { description: manifest.doc.description } : {}),
117
+ plugins,
118
+ });
119
+ }
120
+ return out;
121
+ }
55
122
  function parseInstalled(dir, installedPath, settingsPath) {
56
123
  const installed = readJson(installedPath);
57
124
  if (!installed.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-discovery.js","sourceRoot":"","sources":["../../src/executor/plugin-discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-discovery.js","sourceRoot":"","sources":["../../src/executor/plugin-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 定位 SDK bundled CLI 可执行文件。找不到抛可读错误——SDK 平台包是 optionalDependencies,
3
+ * 用户若以 --omit=optional / 忽略平台不匹配安装会缺失,此时指引改用完整安装或本机 claude。
4
+ */
5
+ export declare function resolveBundledCliPath(): string;
6
+ export interface PluginCliResult {
7
+ ok: boolean;
8
+ /** stdout 尾部提炼(成功)或 stderr 尾部(失败),供聊天/页面直接展示 */
9
+ text: string;
10
+ }
11
+ /**
12
+ * 执行 `claude plugin <args…> -y`(-y:非 TTY 环境跳过交互确认)。
13
+ * env 白名单透传:CLI 需要 PATH(git)、Windows 需要 SystemRoot(spawn 系统调用),
14
+ * 其余变量一律不带——杜绝外部 ANTHROPIC_* 凭证把认证带偏到非预期端点。
15
+ */
16
+ export declare function runPluginCli(args: string[], opts: {
17
+ claudeConfigDir: string;
18
+ timeoutMs?: number;
19
+ }): Promise<PluginCliResult>;
20
+ /** 逐插件更新结果(update-all 汇总展示用) */
21
+ export interface PluginUpdateDetail {
22
+ key: string;
23
+ ok: boolean;
24
+ text: string;
25
+ }
26
+ export interface PluginUpdateAllResult extends PluginCliResult {
27
+ details: PluginUpdateDetail[];
28
+ }
29
+ /**
30
+ * 「全部更新」:先刷新市场索引(marketplace update),再逐个更新已装插件
31
+ * (plugin update name@marketplace)。关键语义:marketplace update 只是拉取市场仓库
32
+ * 最新清单,不会升级已装插件——必须逐个 update 才会把新版本写进 installed_plugins.json。
33
+ * 市场刷新失败不中断后续(插件 update 自身会按需拉取),逐项结果聚合进 text/details。
34
+ */
35
+ export declare function updateAllPlugins(claudeConfigDir: string): Promise<PluginUpdateAllResult>;
@@ -0,0 +1,109 @@
1
+ // 插件管理执行器:spawn SDK bundled 的 Claude Code 原生 CLI(claude plugin install/enable/…)。
2
+ // 复刻 @anthropic-ai/claude-agent-sdk 内部的平台包解析(sdk.mjs 未导出该路径),
3
+ // 让「安装插件」与「运行任务」一样不依赖用户预装的 claude CLI。
4
+ // 环境仅白名单透传 + CLAUDE_CONFIG_DIR:插件装到 bridge 解析的配置目录(managed 模式与 ~/.claude 隔离)
5
+ import { spawn } from 'node:child_process';
6
+ import { createRequire } from 'node:module';
7
+ import { listInstalledPlugins } from './plugin-discovery.js';
8
+ /** 平台二进制包候选(与 sdk.mjs 解析序一致:linux 优先 musl 变体;win32 带 .exe) */
9
+ function cliCandidates() {
10
+ const { platform, arch } = process;
11
+ const ext = platform === 'win32' ? '.exe' : '';
12
+ const base = `@anthropic-ai/claude-agent-sdk-${platform}-${arch}`;
13
+ if (platform === 'linux')
14
+ return [`${base}-musl/claude`, `${base}/claude`];
15
+ return [`${base}/claude${ext}`];
16
+ }
17
+ let cachedCliPath = null;
18
+ /**
19
+ * 定位 SDK bundled CLI 可执行文件。找不到抛可读错误——SDK 平台包是 optionalDependencies,
20
+ * 用户若以 --omit=optional / 忽略平台不匹配安装会缺失,此时指引改用完整安装或本机 claude。
21
+ */
22
+ export function resolveBundledCliPath() {
23
+ if (cachedCliPath)
24
+ return cachedCliPath;
25
+ const req = createRequire(import.meta.url);
26
+ for (const candidate of cliCandidates()) {
27
+ try {
28
+ const p = req.resolve(candidate);
29
+ cachedCliPath = p;
30
+ return p;
31
+ }
32
+ catch { /* 试下一个候选 */ }
33
+ }
34
+ throw new Error('未找到 SDK 附带的 claude CLI 可执行文件(@anthropic-ai/claude-agent-sdk 平台二进制包缺失)。'
35
+ + '请完整重装本包(勿用 --omit=optional);或在可访问 claude CLI 的环境执行插件操作。');
36
+ }
37
+ const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 安装含 git clone marketplace,可能较慢
38
+ /** 提炼输出尾部(CLI 帮助/清单可能很长,聊天场景只关心结尾结果) */
39
+ function tail(text, max = 800) {
40
+ const t = text.trim();
41
+ return t.length > max ? `…${t.slice(-max)}` : t;
42
+ }
43
+ /**
44
+ * 执行 `claude plugin <args…> -y`(-y:非 TTY 环境跳过交互确认)。
45
+ * env 白名单透传:CLI 需要 PATH(git)、Windows 需要 SystemRoot(spawn 系统调用),
46
+ * 其余变量一律不带——杜绝外部 ANTHROPIC_* 凭证把认证带偏到非预期端点。
47
+ */
48
+ export function runPluginCli(args, opts) {
49
+ const cli = resolveBundledCliPath();
50
+ const passThrough = {};
51
+ for (const key of ['PATH', 'SystemRoot', 'windir', 'HOME', 'USERPROFILE', 'LOCALAPPDATA', 'APPDATA', 'TMP', 'TEMP', 'LANG']) {
52
+ if (process.env[key] !== undefined)
53
+ passThrough[key] = process.env[key];
54
+ }
55
+ // -y(非 TTY 跳过确认)仅 install 支持(实测其余子命令报 unknown option)
56
+ const fullArgs = ['plugin', ...args, ...(args[0] === 'install' ? ['-y'] : [])];
57
+ return new Promise((resolve) => {
58
+ const child = spawn(cli, fullArgs, {
59
+ env: { ...passThrough, CLAUDE_CONFIG_DIR: opts.claudeConfigDir },
60
+ windowsHide: true,
61
+ stdio: ['ignore', 'pipe', 'pipe'],
62
+ });
63
+ let out = '';
64
+ let err = '';
65
+ const timer = setTimeout(() => {
66
+ child.kill();
67
+ err += `\n[超时 ${Math.round((opts.timeoutMs ?? DEFAULT_TIMEOUT_MS) / 1000)}s,已终止]`;
68
+ }, opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);
69
+ timer.unref();
70
+ child.stdout?.on('data', (c) => { out += c.toString(); });
71
+ child.stderr?.on('data', (c) => { err += c.toString(); });
72
+ child.on('error', (e) => {
73
+ clearTimeout(timer);
74
+ resolve({ ok: false, text: `无法启动 CLI:${e.message}` });
75
+ });
76
+ child.on('close', (code) => {
77
+ clearTimeout(timer);
78
+ if (code === 0)
79
+ resolve({ ok: true, text: tail(out) || '完成' });
80
+ else
81
+ resolve({ ok: false, text: tail(err || out) || `退出码 ${code}` });
82
+ });
83
+ });
84
+ }
85
+ /** 单插件 update 的超时:比 install 略紧(通常只拉一个小仓库,不含完整 marketplace clone) */
86
+ const UPDATE_TIMEOUT_MS = 3 * 60 * 1000;
87
+ /**
88
+ * 「全部更新」:先刷新市场索引(marketplace update),再逐个更新已装插件
89
+ * (plugin update name@marketplace)。关键语义:marketplace update 只是拉取市场仓库
90
+ * 最新清单,不会升级已装插件——必须逐个 update 才会把新版本写进 installed_plugins.json。
91
+ * 市场刷新失败不中断后续(插件 update 自身会按需拉取),逐项结果聚合进 text/details。
92
+ */
93
+ export async function updateAllPlugins(claudeConfigDir) {
94
+ const lines = [];
95
+ const details = [];
96
+ const market = await runPluginCli(['marketplace', 'update'], { claudeConfigDir });
97
+ lines.push(`${market.ok ? '✅' : '❌'} 刷新市场索引${market.ok ? '' : `:${tail(market.text, 300)}`}`);
98
+ const installed = listInstalledPlugins(claudeConfigDir);
99
+ for (const p of installed) {
100
+ const r = await runPluginCli(['update', p.key], { claudeConfigDir, timeoutMs: UPDATE_TIMEOUT_MS });
101
+ details.push({ key: p.key, ok: r.ok, text: r.text });
102
+ lines.push(`${r.ok ? '✅' : '❌'} 更新 ${p.key}${r.ok ? '' : `:${tail(r.text, 300)}`}`);
103
+ }
104
+ if (!installed.length)
105
+ lines.push('(该目录尚未安装任何插件,仅刷新了市场索引)');
106
+ const allOk = market.ok && details.every((d) => d.ok);
107
+ return { ok: allOk, text: lines.join('\n'), details };
108
+ }
109
+ //# sourceMappingURL=plugin-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-manager.js","sourceRoot":"","sources":["../../src/executor/plugin-manager.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,8DAA8D;AAC9D,uCAAuC;AACvC,6EAA6E;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,8DAA8D;AAC9D,SAAS,aAAa;IACpB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,kCAAkC,QAAQ,IAAI,IAAI,EAAE,CAAC;IAClE,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,CAAC,GAAG,IAAI,cAAc,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,IAAI,UAAU,GAAG,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,aAAa,GAAkB,IAAI,CAAC;AAExC;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACjC,aAAa,GAAG,CAAC,CAAC;YAClB,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,KAAK,CACb,wEAAwE;UACtE,yDAAyD,CAC5D,CAAC;AACJ,CAAC;AAQD,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,iCAAiC;AAE3E,wCAAwC;AACxC,SAAS,IAAI,CAAC,IAAY,EAAE,GAAG,GAAG,GAAG;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAc,EACd,IAAqD;IAErD,MAAM,GAAG,GAAG,qBAAqB,EAAE,CAAC;IACpC,MAAM,WAAW,GAAuC,EAAE,CAAC;IAC3D,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC5H,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,WAAW,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1E,CAAC;IACD,sDAAsD;IACtD,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE;YACjC,GAAG,EAAE,EAAE,GAAG,WAAW,EAAE,iBAAiB,EAAE,IAAI,CAAC,eAAe,EAAE;YAChE,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,GAAG,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACpF,CAAC,EAAE,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC;QACzC,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACtB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;;gBAC1D,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAaD,oEAAoE;AACpE,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAExC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,eAAuB;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAClF,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9F,MAAM,SAAS,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACnG,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,77 @@
1
+ import type { BridgeConfig, FeishuAppConfig, SlashCommandDef } from '../types.js';
2
+ /** 远端(飞书侧)已注册的斜杠命令(GET 列表条目) */
3
+ export interface RemoteSlashCommand {
4
+ command_id: string;
5
+ command: string;
6
+ description: {
7
+ default_value?: string;
8
+ i18n?: Record<string, string>;
9
+ icon?: {
10
+ icon_key?: string;
11
+ };
12
+ };
13
+ }
14
+ /** 最小 API 客户端(执行器依赖此接口,测试注入 mock) */
15
+ export interface SlashApiClient {
16
+ list(): Promise<RemoteSlashCommand[]>;
17
+ create(def: SlashCommandDef): Promise<string>;
18
+ update(commandId: string, def: SlashCommandDef): Promise<void>;
19
+ remove(commandId: string): Promise<void>;
20
+ }
21
+ /** 内置命令集(SLASH_COMMAND_META 全量映射为注册定义)——expectedCommands 与 ensureBuiltins 共用 */
22
+ export declare function builtinCommands(): SlashCommandDef[];
23
+ /** 期望集 = 内置命令(SLASH_COMMAND_META 全量)+ config extras;与内置重名的 extra 跳过(内置优先) */
24
+ export declare function expectedCommands(config: BridgeConfig): SlashCommandDef[];
25
+ /** 全量对齐 diff:远端按 command 名匹配期望集;描述/icon 变化进 toUpdate,远端多余进 toDelete */
26
+ export declare function diffSlashCommands(remote: RemoteSlashCommand[], expected: SlashCommandDef[]): {
27
+ toCreate: SlashCommandDef[];
28
+ toUpdate: Array<{
29
+ commandId: string;
30
+ def: SlashCommandDef;
31
+ }>;
32
+ toDelete: Array<{
33
+ commandId: string;
34
+ command: string;
35
+ }>;
36
+ unchanged: string[];
37
+ };
38
+ export interface SyncReport {
39
+ created: string[];
40
+ updated: string[];
41
+ deleted: string[];
42
+ unchanged: string[];
43
+ errors: Array<{
44
+ command: string;
45
+ error: string;
46
+ }>;
47
+ }
48
+ /** 执行全量对齐同步:list → diff → 逐条 create/update/delete,每条独立容错汇总报告 */
49
+ export declare function syncSlashCommands(client: SlashApiClient, expected: SlashCommandDef[]): Promise<SyncReport>;
50
+ /**
51
+ * 只补齐远端缺失的内置命令(0.13 Web 页「补齐内置命令」按钮):
52
+ * list → 内置差集 → 逐条 create,**绝不 delete/update 远端已有命令**(用户手动注册的命令不受影响)。
53
+ * deleted/updated 恒空;already-exists(并发残留)计 unchanged。
54
+ */
55
+ export declare function ensureBuiltins(client: SlashApiClient, builtins: SlashCommandDef[]): Promise<SyncReport>;
56
+ /** node-sdk 通用 request 的最小类型(官方 Client.request 支持 data/params,SDK 类型面未导出) */
57
+ interface SdkClient {
58
+ request(payload: {
59
+ method: string;
60
+ url: string;
61
+ data?: unknown;
62
+ }): Promise<unknown>;
63
+ }
64
+ interface SdkModule {
65
+ Client: new (opts: {
66
+ appId: string;
67
+ appSecret: string;
68
+ domain?: unknown;
69
+ }) => SdkClient;
70
+ Domain: {
71
+ Feishu: unknown;
72
+ Lark: unknown;
73
+ };
74
+ }
75
+ /** 独立 API 客户端:不依赖运行中的 gateway(lcb ui 独立进程同样可用);token 由 SDK 自管 */
76
+ export declare function createSlashApiClient(app: FeishuAppConfig, sdk?: SdkModule): SlashApiClient;
77
+ export {};