@jesonliu/lark-claudecode-bridge 0.3.1 → 0.7.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.
Files changed (59) hide show
  1. package/README.md +90 -12
  2. package/config.example.yaml +42 -17
  3. package/dist/auth-precheck.d.ts +3 -3
  4. package/dist/auth-precheck.js +6 -7
  5. package/dist/auth-precheck.js.map +1 -1
  6. package/dist/cli/app-manager.d.ts +2 -3
  7. package/dist/cli/app-manager.js +2 -7
  8. package/dist/cli/app-manager.js.map +1 -1
  9. package/dist/cli/setup-wizard.d.ts +1 -0
  10. package/dist/cli/setup-wizard.js +5 -6
  11. package/dist/cli/setup-wizard.js.map +1 -1
  12. package/dist/config.js +73 -10
  13. package/dist/config.js.map +1 -1
  14. package/dist/executor/claude-executor.d.ts +8 -2
  15. package/dist/executor/claude-executor.js +20 -2
  16. package/dist/executor/claude-executor.js.map +1 -1
  17. package/dist/executor/notify-server.d.ts +2 -5
  18. package/dist/executor/notify-server.js +3 -48
  19. package/dist/executor/notify-server.js.map +1 -1
  20. package/dist/executor/permission-gate.d.ts +30 -0
  21. package/dist/executor/permission-gate.js +56 -5
  22. package/dist/executor/permission-gate.js.map +1 -1
  23. package/dist/executor/plugin-discovery.d.ts +26 -0
  24. package/dist/executor/plugin-discovery.js +131 -0
  25. package/dist/executor/plugin-discovery.js.map +1 -0
  26. package/dist/gateway/card-builder.d.ts +16 -1
  27. package/dist/gateway/card-builder.js +58 -0
  28. package/dist/gateway/card-builder.js.map +1 -1
  29. package/dist/gateway/diff-card.d.ts +16 -0
  30. package/dist/gateway/diff-card.js +39 -0
  31. package/dist/gateway/diff-card.js.map +1 -0
  32. package/dist/gateway/feishu-gateway.js +9 -2
  33. package/dist/gateway/feishu-gateway.js.map +1 -1
  34. package/dist/index.js +163 -32
  35. package/dist/index.js.map +1 -1
  36. package/dist/session/commands.d.ts +13 -2
  37. package/dist/session/commands.js +97 -9
  38. package/dist/session/commands.js.map +1 -1
  39. package/dist/session/session-store.d.ts +3 -0
  40. package/dist/session/session-store.js.map +1 -1
  41. package/dist/session/triggers.d.ts +1 -1
  42. package/dist/session/triggers.js +3 -2
  43. package/dist/session/triggers.js.map +1 -1
  44. package/dist/types.d.ts +49 -9
  45. package/dist/util/beijing-time.d.ts +5 -0
  46. package/dist/util/beijing-time.js +33 -0
  47. package/dist/util/beijing-time.js.map +1 -0
  48. package/dist/util/chunk-text.d.ts +2 -0
  49. package/dist/util/chunk-text.js +48 -0
  50. package/dist/util/chunk-text.js.map +1 -0
  51. package/dist/util/diff.d.ts +2 -0
  52. package/dist/util/diff.js +70 -0
  53. package/dist/util/diff.js.map +1 -0
  54. package/dist/util/workspace-diff.d.ts +9 -0
  55. package/dist/util/workspace-diff.js +56 -0
  56. package/dist/util/workspace-diff.js.map +1 -0
  57. package/dist/version.d.ts +1 -1
  58. package/dist/version.js +1 -1
  59. package/package.json +3 -1
@@ -1,16 +1,22 @@
1
1
  import { type McpServerConfig } from '@anthropic-ai/claude-agent-sdk';
2
- import type { ProgressEvent, TaskOutcome } from '../types.js';
2
+ import type { ProgressEvent, SessionInventory, TaskOutcome } from '../types.js';
3
3
  export interface ExecutorCallbacks {
4
4
  onProgress(event: ProgressEvent): Promise<void> | void;
5
+ /** SDK init(system/init) 消息到达时回调(每 query 仅一次);提取本会话实际加载的模型/技能/插件/MCP 清单 */
6
+ onInit?(inventory: Omit<SessionInventory, 'workspace' | 'loadedAt'>): void;
5
7
  }
6
8
  export interface RunTaskOptions {
7
9
  cwd: string;
8
10
  resumeSessionId?: string;
9
11
  signal?: AbortSignal;
10
- /** per-app 环境变量:至少含 CLAUDE_CONFIG_DIR(每个机器人独立的 Claude Code 数据目录);可覆盖模型凭证等 */
12
+ /** per-app 环境变量:至少含 CLAUDE_CONFIG_DIR(~/.claude,全部机器人共享);可追加 settings.json 里没有的键 */
11
13
  env?: Record<string, string | undefined>;
12
14
  /** per-app 人格补充,直通 SDK appendSystemPrompt */
13
15
  appendSystemPrompt?: string;
16
+ /** 通道级模型覆盖(/model 命令设置),直通 Options.model;未设 = 跟随 ~/.claude/settings.json 的 model */
17
+ model?: string;
18
+ /** SDK 权限模式:code-dev 工作区传 'plan'(先出计划 → 飞书卡片批准后自动切可编辑),缺省 'default' */
19
+ permissionMode?: 'default' | 'plan';
14
20
  canUseTool?: (toolName: string, input: Record<string, unknown>) => Promise<{
15
21
  behavior: 'allow';
16
22
  message?: string;
@@ -26,13 +26,14 @@ export async function runTask(prompt, opts, cb) {
26
26
  const options = {
27
27
  cwd: opts.cwd,
28
28
  settingSources: ['user', 'project'],
29
- permissionMode: 'default',
29
+ permissionMode: opts.permissionMode ?? 'default',
30
30
  includePartialMessages: false,
31
31
  ...(opts.resumeSessionId ? { resume: opts.resumeSessionId } : {}),
32
32
  ...(opts.canUseTool ? { canUseTool: opts.canUseTool } : {}),
33
33
  ...(opts.signal ? { abortController: bridgeSignal(opts.signal) } : {}),
34
34
  ...(opts.env ? { env: opts.env } : {}),
35
35
  ...(opts.appendSystemPrompt ? { appendSystemPrompt: opts.appendSystemPrompt } : {}),
36
+ ...(opts.model ? { model: opts.model } : {}),
36
37
  ...(opts.mcpServers ? { mcpServers: opts.mcpServers } : {}),
37
38
  ...(opts.plugins ? { plugins: opts.plugins.map((p) => ({ type: 'local', path: p.path })) } : {}),
38
39
  };
@@ -40,9 +41,26 @@ export async function runTask(prompt, opts, cb) {
40
41
  let finalText = '';
41
42
  let sessionId = opts.resumeSessionId ?? '';
42
43
  let turns = 0;
44
+ // init 消息提取的会话清单(每 query 一次);数组字段全部 ?? [] 兜底——SDK 升级字段改名时清单为空但不崩
45
+ let inventory;
43
46
  const toolNames = new Map(); // tool_use_id → 工具名(tool_result 块本身不带 name)
44
47
  for await (const message of q) {
45
48
  switch (message.type) {
49
+ case 'system': {
50
+ if (message.subtype === 'init') {
51
+ inventory = {
52
+ model: message.model,
53
+ claudeCodeVersion: message.claude_code_version,
54
+ skills: message.skills ?? [],
55
+ slashCommands: message.slash_commands ?? [],
56
+ plugins: (message.plugins ?? []).map((p) => ({ name: p.name, path: p.path, version: p.version })),
57
+ mcpServers: message.mcp_servers ?? [],
58
+ agents: message.agents ?? [],
59
+ };
60
+ cb.onInit?.(inventory);
61
+ }
62
+ break;
63
+ }
46
64
  case 'assistant': {
47
65
  turns++;
48
66
  for (const block of message.message.content) {
@@ -79,6 +97,6 @@ export async function runTask(prompt, opts, cb) {
79
97
  }
80
98
  }
81
99
  }
82
- return { sessionId, finalText, producedFiles: collector.files(), turns };
100
+ return { sessionId, finalText, producedFiles: collector.files(), turns, ...(inventory ? { inventory } : {}) };
83
101
  }
84
102
  //# sourceMappingURL=claude-executor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-executor.js","sourceRoot":"","sources":["../../src/executor/claude-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-executor.js","sourceRoot":"","sources":["../../src/executor/claude-executor.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import { type McpSdkServerConfigWithInstance, type SdkMcpToolDefinition } from '@anthropic-ai/claude-agent-sdk';
2
+ import { chunkText } from '../util/chunk-text.js';
3
+ export { chunkText };
2
4
  export declare const NOTIFY_SERVER_NAME = "lcb-notify";
3
5
  /** canUseTool 收到的工具全名形态:mcp__lcb-notify__send_text */
4
6
  export declare const NOTIFY_TOOL_PREFIX = "mcp__lcb-notify__";
@@ -8,11 +10,6 @@ export interface NotifySender {
8
10
  sendImage(path: string, caption?: string): Promise<void>;
9
11
  sendFile(path: string, note?: string): Promise<void>;
10
12
  }
11
- /**
12
- * 超长文本分块:按段落(\n\n+)贪心聚合,单段超长退化为按行聚合,行本身仍超长硬切兜底。
13
- * 空白文本返回 [](调用方据此跳过发送)。块边界只可能落在段落/行/字符处,不打断 markdown 结构的概率最高。
14
- */
15
- export declare function chunkText(text: string, maxChars?: number): string[];
16
13
  /**
17
14
  * 构建工具定义数组。handler 全部捕获异常返回 isError 中文原因,绝不抛出——
18
15
  * 模型可感知失败并决定重试,不会炸掉整条 query 流。
@@ -6,61 +6,16 @@ import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';
6
6
  import { stat } from 'node:fs/promises';
7
7
  import { basename, extname, resolve } from 'node:path';
8
8
  import { z } from 'zod';
9
+ import { chunkText } from '../util/chunk-text.js';
10
+ // 分块算法已抽到 util/chunk-text(gateway 卡片层复用);此处 re-export 保持既有引用兼容
11
+ export { chunkText };
9
12
  export const NOTIFY_SERVER_NAME = 'lcb-notify';
10
13
  /** canUseTool 收到的工具全名形态:mcp__lcb-notify__send_text */
11
14
  export const NOTIFY_TOOL_PREFIX = `mcp__${NOTIFY_SERVER_NAME}__`;
12
- // 飞书 interactive 卡片 JSON 上限约 30KB,3000 个 CJK 字符 UTF-8 约 9KB,留足卡片包壳余量
13
- const CHUNK_MAX_CHARS = 3000;
14
15
  // 单块/单条失败重试一次的退避间隔(飞书偶发限流 / 网络抖动)
15
16
  const RETRY_DELAY_MS = 800;
16
17
  // 与 feishu-gateway 的 IMAGE_EXT 保持同一口径(此处独立声明,避免 executor 反向依赖 gateway)
17
18
  const IMAGE_EXT = new Set(['.png', '.jpg', '.jpeg', '.webp', '.gif']);
18
- /**
19
- * 超长文本分块:按段落(\n\n+)贪心聚合,单段超长退化为按行聚合,行本身仍超长硬切兜底。
20
- * 空白文本返回 [](调用方据此跳过发送)。块边界只可能落在段落/行/字符处,不打断 markdown 结构的概率最高。
21
- */
22
- export function chunkText(text, maxChars = CHUNK_MAX_CHARS) {
23
- const src = text.trim();
24
- if (!src)
25
- return [];
26
- const chunks = [];
27
- let cur = '';
28
- const flush = () => {
29
- const t = cur.trim();
30
- if (t)
31
- chunks.push(t);
32
- cur = '';
33
- };
34
- for (const para of src.split(/\n\n+/)) {
35
- if (para.length > maxChars) {
36
- // 超长段落:按行继续聚合(代码块/长表行常见此形态)
37
- for (const line of para.split('\n')) {
38
- if (line.length > maxChars) {
39
- // 行本身超长(无换行的超长串):收尾当前块后按 maxChars 硬切
40
- flush();
41
- for (let i = 0; i < line.length; i += maxChars)
42
- chunks.push(line.slice(i, i + maxChars));
43
- }
44
- else if (cur.length + line.length + 1 > maxChars) {
45
- flush();
46
- cur = line;
47
- }
48
- else {
49
- cur = cur ? `${cur}\n${line}` : line;
50
- }
51
- }
52
- }
53
- else if (cur.length + para.length + 2 > maxChars) {
54
- flush();
55
- cur = para;
56
- }
57
- else {
58
- cur = cur ? `${cur}\n\n${para}` : para;
59
- }
60
- }
61
- flush();
62
- return chunks;
63
- }
64
19
  function sleep(ms) {
65
20
  return new Promise((r) => setTimeout(r, ms));
66
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"notify-server.js","sourceRoot":"","sources":["../../src/executor/notify-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notify-server.js","sourceRoot":"","sources":["../../src/executor/notify-server.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,13 @@
1
1
  import type { ConfirmationRequest, PermissionDecision } from '../types.js';
2
+ /**
3
+ * 内置默认免确认工具白名单(config.yaml permissions.allow_tools 缺省值;配置即整体替换)。
4
+ * Bash 默认放行是读场景(ls/cat/grep 等经 Bash 执行)不弹卡的前提,安全性由
5
+ * DEFAULT_DANGEROUS_COMMANDS 黑名单兜底——命中仍弹确认卡。
6
+ */
7
+ export declare const DEFAULT_ALLOW_TOOLS: ReadonlySet<string>;
2
8
  export declare const READ_ONLY_TOOLS: ReadonlySet<string>;
9
+ /** 内置 Bash 危险命令正则(permissions.dangerous_commands 缺省值):对 command 全文匹配,命中弹确认卡 */
10
+ export declare const DEFAULT_DANGEROUS_COMMANDS: readonly RegExp[];
3
11
  export type GateDecision = {
4
12
  behavior: 'allow';
5
13
  message?: string;
@@ -7,13 +15,35 @@ export type GateDecision = {
7
15
  behavior: 'deny';
8
16
  message: string;
9
17
  };
18
+ /** plan 确认请求/结果:approve 放行继续执行;revise 带意见让模型修订计划;reject 终止 */
19
+ export interface PlanAskRequest {
20
+ plan: string;
21
+ workspaceName: string;
22
+ }
23
+ export type PlanAskResult = {
24
+ action: 'approve';
25
+ } | {
26
+ action: 'revise';
27
+ feedback: string;
28
+ } | {
29
+ action: 'reject';
30
+ };
10
31
  export declare class PermissionGate {
11
32
  private opts;
12
33
  private remembered;
34
+ private allowTools;
35
+ private dangerousCommands;
13
36
  constructor(opts: {
14
37
  ask: (req: ConfirmationRequest) => Promise<PermissionDecision>;
38
+ /** plan 确认回调:ExitPlanMode 工具调用时触发;未配置时 ExitPlanMode 一律拒绝(不支持 plan 工作流) */
39
+ planAsk?: (req: PlanAskRequest) => Promise<PlanAskResult>;
15
40
  timeoutMs?: number;
41
+ /** 免确认白名单;缺省 DEFAULT_ALLOW_TOOLS */
42
+ allowTools?: ReadonlySet<string>;
43
+ /** Bash 危险命令正则;缺省 DEFAULT_DANGEROUS_COMMANDS */
44
+ dangerousCommands?: readonly RegExp[];
16
45
  });
46
+ private isDangerousCommand;
17
47
  decide(toolName: string, input: Record<string, unknown>, workspaceName: string): Promise<GateDecision>;
18
48
  rememberSession(toolName: string): void;
19
49
  reset(): void;
@@ -1,30 +1,79 @@
1
- // 权限闸:只读工具直通,写操作经 ask 回调询问(飞书卡片确认),带超时自动拒绝与会话级记忆
1
+ // 权限闸:白名单工具直通(读工具 + Bash,Bash 另过危险命令黑名单),写操作经 ask 回调
2
+ // 询问(飞书卡片确认,带 diff 展示),超时自动拒绝 + 会话级记忆;plan mode 的 ExitPlanMode
3
+ // 经 planAsk 回调走计划确认卡片
2
4
  import { randomUUID } from 'node:crypto';
3
5
  import { NOTIFY_TOOL_PREFIX } from './notify-server.js';
4
- // 会话内免询问的只读工具白名单(不含任何写文件/执行类工具)
6
+ import { generateFileDiff } from '../util/diff.js';
7
+ /**
8
+ * 内置默认免确认工具白名单(config.yaml permissions.allow_tools 缺省值;配置即整体替换)。
9
+ * Bash 默认放行是读场景(ls/cat/grep 等经 Bash 执行)不弹卡的前提,安全性由
10
+ * DEFAULT_DANGEROUS_COMMANDS 黑名单兜底——命中仍弹确认卡。
11
+ */
12
+ export const DEFAULT_ALLOW_TOOLS = new Set([
13
+ 'Read', 'Glob', 'Grep', 'LS', 'TodoRead', 'TodoWrite', 'WebFetch', 'WebSearch', 'Bash',
14
+ ]);
15
+ // 保留旧名导出(含只读子集、不含 Bash):外部引用与测试的语义锚点
5
16
  export const READ_ONLY_TOOLS = new Set([
6
17
  'Read', 'Glob', 'Grep', 'LS', 'TodoRead', 'TodoWrite', 'WebFetch', 'WebSearch',
7
18
  ]);
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,
31
+ ];
8
32
  // 超时默认 10 分钟:飞书端可能长时间无人点击卡片
9
33
  const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
10
34
  // 内部哨兵:区分「超时拒绝」与「用户主动拒绝」,便于给出准确原因
11
35
  const TIMED_OUT = Symbol('timed-out');
36
+ /** 生成确认 diff 的写工具集合(NotebookEdit 传入 generateFileDiff 后返回空,保持统一入口) */
37
+ const DIFF_TOOLS = new Set(['Write', 'Edit', 'NotebookEdit']);
12
38
  export class PermissionGate {
13
39
  opts;
14
40
  remembered = new Set();
41
+ allowTools;
42
+ dangerousCommands;
15
43
  constructor(opts) {
16
44
  this.opts = opts;
45
+ this.allowTools = opts.allowTools ?? DEFAULT_ALLOW_TOOLS;
46
+ this.dangerousCommands = opts.dangerousCommands ?? DEFAULT_DANGEROUS_COMMANDS;
47
+ }
48
+ isDangerousCommand(input) {
49
+ const cmd = typeof input.command === 'string' ? input.command : '';
50
+ return cmd ? this.dangerousCommands.some((re) => re.test(cmd)) : false;
17
51
  }
18
52
  async decide(toolName, input, workspaceName) {
19
- if (READ_ONLY_TOOLS.has(toolName))
20
- return { behavior: 'allow' };
21
53
  // lcb-notify 通知工具直通:server 实例由 executeTask 闭包构造,chatId 硬绑定,
22
54
  // 模型无法选择接收者(只能发到当前任务发起的聊天),无破坏性,逐张发图不应逐次弹确认卡。
23
55
  // 用前缀匹配:后续往 notify server 新增工具自动直通。
24
56
  if (toolName.startsWith(NOTIFY_TOOL_PREFIX))
25
57
  return { behavior: 'allow' };
26
- if (this.remembered.has(toolName))
58
+ // ExitPlanMode:plan mode 的计划确认,永不走白名单/会话记忆(每次计划都必须过用户)
59
+ if (toolName === 'ExitPlanMode') {
60
+ if (!this.opts.planAsk)
61
+ return { behavior: 'deny', message: '当前环境未配置计划确认流程,无法退出 plan mode' };
62
+ const r = await this.opts.planAsk({ plan: typeof input.plan === 'string' ? input.plan : '', workspaceName });
63
+ if (r.action === 'approve')
64
+ return { behavior: 'allow' };
65
+ if (r.action === 'revise')
66
+ return { behavior: 'deny', message: `用户未批准当前计划,要求按以下意见修改后重新提交计划:\n${r.feedback}` };
67
+ return { behavior: 'deny', message: '用户在飞书端放弃了本次计划,请停止执行并等待用户下一步指示' };
68
+ }
69
+ // 白名单直通;Bash 命中危险命令正则时落到确认卡(安全优先于白名单)
70
+ if (this.allowTools.has(toolName) && !(toolName === 'Bash' && this.isDangerousCommand(input))) {
27
71
  return { behavior: 'allow' };
72
+ }
73
+ // 会话记忆同样不能绕过危险命令黑名单(用户对 Bash 点过「不再询问」≠ 授权 rm -rf)
74
+ if (this.remembered.has(toolName) && !(toolName === 'Bash' && this.isDangerousCommand(input))) {
75
+ return { behavior: 'allow' };
76
+ }
28
77
  const req = {
29
78
  requestId: randomUUID(),
30
79
  toolName,
@@ -32,6 +81,8 @@ export class PermissionGate {
32
81
  : typeof input.file_path === 'string' ? input.file_path
33
82
  : JSON.stringify(input).slice(0, 800),
34
83
  workspaceName,
84
+ // 写工具带 diff:确认卡直接展示改前/改后(generateFileDiff 失败或无差异返回空,回退 summary)
85
+ ...(DIFF_TOOLS.has(toolName) ? { diff: generateFileDiff(toolName, input) || undefined } : {}),
35
86
  };
36
87
  const timeoutMs = this.opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
37
88
  // 持 timer handle:ask 及时答复后主动清理,避免常驻进程中每个已答复 decide 留一个最长 10 分钟的存活 timer
@@ -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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"}
@@ -0,0 +1,26 @@
1
+ import type { PluginRef } from '../types.js';
2
+ export interface DiscoveredPlugin {
3
+ /** 插件名(installed_plugins.json 键 "name@marketplace" 的 @ 前段) */
4
+ name: string;
5
+ marketplace?: string;
6
+ /** 安装目录(含 .claude-plugin/plugin.json) */
7
+ path: string;
8
+ version?: string;
9
+ }
10
+ /**
11
+ * 发现 <claudeConfigDir>/plugins/installed_plugins.json 中 scope=user 且
12
+ * settings.json enabledPlugins 显式启用(=== true)的插件。
13
+ * 典型数据(本机 ~/.claude 实测):
14
+ * installed_plugins.json: {version:2, plugins:{"name@marketplace":[{scope:"user",installPath,version}]}}
15
+ * settings.json: {enabledPlugins:{"name@marketplace":true}}
16
+ */
17
+ export declare function discoverPlugins(claudeConfigDir: string): DiscoveredPlugin[];
18
+ /**
19
+ * 显式配置(config.yaml apps[].plugins,开发期指源码目录)与自动发现结果合并:
20
+ * 按插件名去重,显式优先——防「显式指 dev 副本 + 缓存里正式版」双载导致技能重复。
21
+ */
22
+ export declare function resolvePluginPaths(explicit: PluginRef[] | undefined, discovered: DiscoveredPlugin[]): Array<{
23
+ name: string;
24
+ path: string;
25
+ source: 'explicit' | 'discovered';
26
+ }>;
@@ -0,0 +1,131 @@
1
+ // 插件自动发现:SDK 不会自动加载 CLI 经 marketplace 安装的插件,须显式传安装路径。
2
+ // 从 Claude Code 数据目录读取 installed_plugins.json(安装清单)+ settings.json 的
3
+ // enabledPlugins(启用状态),把 scope=user 且已启用的插件 installPath 转成 SDK plugins 选项。
4
+ // 全程容错:文件缺失/格式异常一律 warn-once 后返回空,绝不阻断任务(插件加载失败 ≠ 桥接器不可用)
5
+ import { existsSync, readFileSync, statSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ // mtime 缓存:用户 CLI 侧 /plugin install/uninstall 后两个文件的 mtime 变化自动失效,
8
+ // 任务间复用避免每条消息重复解析 JSON(文件很小,stat 开销可忽略)
9
+ const cache = new Map();
10
+ // warn-once:同一目录同一原因只提示一次,避免长驻进程每次任务刷屏
11
+ const warned = new Set();
12
+ function warnOnce(dir, reason, detail) {
13
+ const k = `${dir}::${reason}`;
14
+ if (warned.has(k))
15
+ return;
16
+ warned.add(k);
17
+ console.warn(`[插件发现] ${detail}`);
18
+ }
19
+ function readJson(path) {
20
+ if (!existsSync(path))
21
+ return { ok: false, error: 'missing' };
22
+ try {
23
+ return { ok: true, doc: JSON.parse(readFileSync(path, 'utf8')) };
24
+ }
25
+ catch (e) {
26
+ return { ok: false, error: e instanceof Error ? e.message : String(e) };
27
+ }
28
+ }
29
+ /**
30
+ * 发现 <claudeConfigDir>/plugins/installed_plugins.json 中 scope=user 且
31
+ * settings.json enabledPlugins 显式启用(=== true)的插件。
32
+ * 典型数据(本机 ~/.claude 实测):
33
+ * installed_plugins.json: {version:2, plugins:{"name@marketplace":[{scope:"user",installPath,version}]}}
34
+ * settings.json: {enabledPlugins:{"name@marketplace":true}}
35
+ */
36
+ export function discoverPlugins(claudeConfigDir) {
37
+ const installedPath = join(claudeConfigDir, 'plugins', 'installed_plugins.json');
38
+ const settingsPath = join(claudeConfigDir, 'settings.json');
39
+ // installed_plugins.json 不存在 = 没装过任何 marketplace 插件,静默返回空(无插件属正常态)
40
+ if (!existsSync(installedPath))
41
+ return [];
42
+ // mtime 缓存命中:两文件任一变化才重新解析
43
+ let mtimes = '';
44
+ try {
45
+ mtimes = `${statSync(installedPath).mtimeMs},${existsSync(settingsPath) ? statSync(settingsPath).mtimeMs : 0}`;
46
+ }
47
+ catch { /* stat 失败(并发写盘等)不缓存,直接重新解析 */ }
48
+ const hit = cache.get(claudeConfigDir);
49
+ if (hit && mtimes && hit.mtimes === mtimes)
50
+ return hit.result;
51
+ const result = parseInstalled(claudeConfigDir, installedPath, settingsPath);
52
+ cache.set(claudeConfigDir, { mtimes, result });
53
+ return result;
54
+ }
55
+ function parseInstalled(dir, installedPath, settingsPath) {
56
+ const installed = readJson(installedPath);
57
+ if (!installed.ok) {
58
+ warnOnce(dir, 'installed-parse', `installed_plugins.json 无法解析(${installed.error}),跳过插件自动发现`);
59
+ return [];
60
+ }
61
+ const doc = installed.doc;
62
+ if (doc.version !== 2) {
63
+ warnOnce(dir, 'installed-version', `installed_plugins.json 版本为 ${String(doc.version)}(预期 2),格式可能已变化,跳过插件自动发现`);
64
+ return [];
65
+ }
66
+ const entries = Object.entries(doc.plugins ?? {});
67
+ if (entries.length === 0)
68
+ return [];
69
+ // 启用状态以 settings.json 为准:读不到 enabledPlugins 时视为全部未启用(宁缺勿错,
70
+ // 自动加载用户未启用的插件可能带入意外 MCP/hooks)
71
+ const settings = readJson(settingsPath);
72
+ if (!settings.ok) {
73
+ warnOnce(dir, 'settings-parse', `settings.json 无法解析(${settings.error}),无法确认插件启用状态,跳过插件自动发现`);
74
+ return [];
75
+ }
76
+ const enabled = settings.doc.enabledPlugins ?? {};
77
+ const enabledKeys = Object.entries(enabled).filter(([, v]) => v === true).map(([k]) => k);
78
+ if (enabledKeys.length === 0) {
79
+ warnOnce(dir, 'none-enabled', `已安装 ${entries.length} 个插件但 settings.json 未启用任何插件(enabledPlugins),跳过插件自动发现`);
80
+ return [];
81
+ }
82
+ const out = [];
83
+ for (const key of enabledKeys) {
84
+ const list = doc.plugins?.[key];
85
+ if (!Array.isArray(list))
86
+ continue; // 安装清单与启用状态不一致:该键无安装记录,静默跳过
87
+ // 同键可能有多条(不同 scope),取 scope=user 的第一条
88
+ const item = list.find((it) => it.scope === 'user');
89
+ if (!item)
90
+ continue;
91
+ const installPath = typeof item.installPath === 'string' ? item.installPath : '';
92
+ if (!installPath) {
93
+ warnOnce(dir, `no-path:${key}`, `插件 ${key} 的安装记录缺少 installPath,已跳过`);
94
+ continue;
95
+ }
96
+ if (!existsSync(installPath)) {
97
+ warnOnce(dir, `missing:${key}`, `插件 ${key} 的安装目录不存在:${installPath}(可能已卸载未清理),已跳过`);
98
+ continue;
99
+ }
100
+ const at = key.indexOf('@');
101
+ out.push({
102
+ name: at > 0 ? key.slice(0, at) : key,
103
+ marketplace: at > 0 ? key.slice(at + 1) : undefined,
104
+ path: installPath,
105
+ version: typeof item.version === 'string' ? item.version : undefined,
106
+ });
107
+ }
108
+ return out;
109
+ }
110
+ /**
111
+ * 显式配置(config.yaml apps[].plugins,开发期指源码目录)与自动发现结果合并:
112
+ * 按插件名去重,显式优先——防「显式指 dev 副本 + 缓存里正式版」双载导致技能重复。
113
+ */
114
+ export function resolvePluginPaths(explicit, discovered) {
115
+ const out = [];
116
+ const seen = new Set();
117
+ for (const p of explicit ?? []) {
118
+ if (seen.has(p.name))
119
+ continue;
120
+ seen.add(p.name);
121
+ out.push({ name: p.name, path: p.path, source: 'explicit' });
122
+ }
123
+ for (const p of discovered) {
124
+ if (seen.has(p.name))
125
+ continue;
126
+ seen.add(p.name);
127
+ out.push({ name: p.name, path: p.path, source: 'discovered' });
128
+ }
129
+ return out;
130
+ }
131
+ //# sourceMappingURL=plugin-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-discovery.js","sourceRoot":"","sources":["../../src/executor/plugin-discovery.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,qEAAqE;AACrE,2EAA2E;AAC3E,0DAA0D;AAC1D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAuBjC,mEAAmE;AACnE,wCAAwC;AACxC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0D,CAAC;AAChF,uCAAuC;AACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;AAEjC,SAAS,QAAQ,CAAC,GAAW,EAAE,MAAc,EAAE,MAAc;IAC3D,MAAM,CAAC,GAAG,GAAG,GAAG,KAAK,MAAM,EAAE,CAAC;IAC9B,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO;IAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,QAAQ,CAAI,IAAY;IAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9D,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,EAAE,CAAC;IACxE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,eAAuB;IACrD,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,wBAAwB,CAAC,CAAC;IACjF,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAC5D,mEAAmE;IACnE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1C,0BAA0B;IAC1B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjH,CAAC;IAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACvC,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IAE9D,MAAM,MAAM,GAAG,cAAc,CAAC,eAAe,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5E,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,GAAW,EAAE,aAAqB,EAAE,YAAoB;IAC9E,MAAM,SAAS,GAAG,QAAQ,CAAsB,aAAa,CAAC,CAAC;IAC/D,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,EAAE,+BAA+B,SAAS,CAAC,KAAK,YAAY,CAAC,CAAC;QAC7F,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;IAC1B,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACtB,QAAQ,CAAC,GAAG,EAAE,mBAAmB,EAAE,8BAA8B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC/G,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,2DAA2D;IAC3D,gCAAgC;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAc,YAAY,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,QAAQ,CAAC,GAAG,EAAE,gBAAgB,EAAE,sBAAsB,QAAQ,CAAC,KAAK,uBAAuB,CAAC,CAAC;QAC7F,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;IAClD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,OAAO,CAAC,MAAM,sDAAsD,CAAC,CAAC;QAC3G,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,SAAS,CAAC,4BAA4B;QAChE,sCAAsC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,EAAE,EAAE,MAAM,GAAG,0BAA0B,CAAC,CAAC;YACrE,SAAS;QACX,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,EAAE,EAAE,MAAM,GAAG,aAAa,WAAW,gBAAgB,CAAC,CAAC;YACnF,SAAS;QACX,CAAC;QACD,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG;YACrC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;YACnD,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SACrE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAiC,EACjC,UAA8B;IAE9B,MAAM,GAAG,GAA6E,EAAE,CAAC;IACzF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { ConfirmationRequest, PermissionDecision } from '../types.js';
1
+ import type { CardDecision, ConfirmationRequest, PermissionDecision } from '../types.js';
2
2
  export interface ProgressState {
3
3
  title: string;
4
4
  status: string;
@@ -13,3 +13,18 @@ export declare function buildProgressCard(state: ProgressState): unknown;
13
13
  export declare function buildConfirmCard(req: ConfirmationRequest): unknown;
14
14
  export declare const DECISION_TEXT: Record<PermissionDecision, string>;
15
15
  export declare function buildConfirmResultCard(req: ConfirmationRequest, decision: PermissionDecision, byName: string): unknown;
16
+ export interface PlanCardRequest {
17
+ requestId: string;
18
+ plan: string;
19
+ workspaceName: string;
20
+ }
21
+ export type PlanCardDecision = Extract<CardDecision, `plan-${string}`>;
22
+ /**
23
+ * 计划确认卡片组:plan 超长时按 ~2800 字拆多张(首卡含输入框与按钮,其余为纯正文续篇)。
24
+ * 空白 plan 退化为单卡占位(模型未提交实质计划时用户只能放弃)。
25
+ */
26
+ export declare function buildPlanCards(req: PlanCardRequest): unknown[];
27
+ /** 计划决策结果卡(决策后由回调响应内联 + 兜底 PATCH 首卡) */
28
+ export declare function buildPlanResultCard(req: PlanCardRequest, decision: PlanCardDecision, byName: string, feedback?: string): unknown;
29
+ /** 计划确认超时卡(此后迟到点击不再改写此卡片) */
30
+ export declare function buildExpiredPlanCard(req: PlanCardRequest, timeoutMs: number): unknown;