@jesonliu/lark-claudecode-bridge 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/assets/web/index.html +375 -22
- package/dist/claude-config.d.ts +10 -5
- package/dist/claude-config.js +73 -6
- package/dist/claude-config.js.map +1 -1
- package/dist/config.js +18 -1
- package/dist/config.js.map +1 -1
- package/dist/executor/claude-executor.d.ts +16 -3
- package/dist/executor/claude-executor.js +137 -61
- package/dist/executor/claude-executor.js.map +1 -1
- package/dist/executor/output-collector.d.ts +2 -0
- package/dist/executor/output-collector.js +15 -3
- package/dist/executor/output-collector.js.map +1 -1
- package/dist/executor/permission-gate.d.ts +29 -2
- package/dist/executor/permission-gate.js +71 -3
- package/dist/executor/permission-gate.js.map +1 -1
- package/dist/executor/plugin-discovery.d.ts +19 -0
- package/dist/executor/plugin-discovery.js +40 -1
- package/dist/executor/plugin-discovery.js.map +1 -1
- package/dist/executor/plugin-manager.d.ts +16 -0
- package/dist/executor/plugin-manager.js +25 -0
- package/dist/executor/plugin-manager.js.map +1 -1
- package/dist/gateway/card-builder.d.ts +18 -0
- package/dist/gateway/card-builder.js +61 -1
- package/dist/gateway/card-builder.js.map +1 -1
- package/dist/gateway/feishu-gateway.d.ts +10 -0
- package/dist/gateway/feishu-gateway.js +4 -0
- package/dist/gateway/feishu-gateway.js.map +1 -1
- package/dist/gateway/progress-card.d.ts +10 -0
- package/dist/gateway/progress-card.js +29 -0
- package/dist/gateway/progress-card.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +233 -20
- package/dist/index.js.map +1 -1
- package/dist/session/commands.d.ts +6 -3
- package/dist/session/commands.js +94 -34
- package/dist/session/commands.js.map +1 -1
- package/dist/session/session-store.d.ts +20 -1
- package/dist/session/session-store.js +14 -0
- package/dist/session/session-store.js.map +1 -1
- package/dist/types.d.ts +17 -1
- package/dist/web/config-api.d.ts +2 -0
- package/dist/web/config-api.js +2 -0
- package/dist/web/config-api.js.map +1 -1
- package/dist/web/server.js +80 -5
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -18,11 +18,12 @@ export declare const DEFAULT_DANGEROUS_COMMANDS: readonly RegExp[];
|
|
|
18
18
|
export type GateDecision = {
|
|
19
19
|
behavior: 'allow';
|
|
20
20
|
message?: string;
|
|
21
|
+
updatedInput?: Record<string, unknown>;
|
|
21
22
|
} | {
|
|
22
23
|
behavior: 'deny';
|
|
23
24
|
message: string;
|
|
24
25
|
};
|
|
25
|
-
/** plan 确认请求/结果:approve
|
|
26
|
+
/** plan 确认请求/结果:approve 放行继续执行(executor 随即切 acceptEdits,写操作免确认);revise 带意见让模型修订计划;reject 终止 */
|
|
26
27
|
export interface PlanAskRequest {
|
|
27
28
|
plan: string;
|
|
28
29
|
workspaceName: string;
|
|
@@ -35,6 +36,26 @@ export type PlanAskResult = {
|
|
|
35
36
|
} | {
|
|
36
37
|
action: 'reject';
|
|
37
38
|
};
|
|
39
|
+
/** AskUserQuestion 的问题载荷(SDK input.questions 子集) */
|
|
40
|
+
export interface QuestionOption {
|
|
41
|
+
label: string;
|
|
42
|
+
description?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface QuestionItem {
|
|
45
|
+
question: string;
|
|
46
|
+
header?: string;
|
|
47
|
+
multiSelect?: boolean;
|
|
48
|
+
options: QuestionOption[];
|
|
49
|
+
}
|
|
50
|
+
/** 提问确认请求:questions 已解析校验(至少 1 问、每问至少 2 选项) */
|
|
51
|
+
export interface AskQuestionRequest {
|
|
52
|
+
questions: QuestionItem[];
|
|
53
|
+
workspaceName: string;
|
|
54
|
+
}
|
|
55
|
+
/** 提问结果:question → 选中的 option label(multiSelect 为数组);所有问题必须有答案 */
|
|
56
|
+
export type AskQuestionResult = Record<string, string | string[]>;
|
|
57
|
+
/** 解析并校验 AskUserQuestion 的 input.questions;非法结构返回空数组(由调用方 deny) */
|
|
58
|
+
export declare function parseQuestions(input: Record<string, unknown>): QuestionItem[];
|
|
38
59
|
export declare class PermissionGate {
|
|
39
60
|
private opts;
|
|
40
61
|
private remembered;
|
|
@@ -44,6 +65,8 @@ export declare class PermissionGate {
|
|
|
44
65
|
ask: (req: ConfirmationRequest) => Promise<PermissionDecision>;
|
|
45
66
|
/** plan 确认回调:ExitPlanMode 工具调用时触发;未配置时 ExitPlanMode 一律拒绝(不支持 plan 工作流) */
|
|
46
67
|
planAsk?: (req: PlanAskRequest) => Promise<PlanAskResult>;
|
|
68
|
+
/** 提问回调:AskUserQuestion 工具调用时触发(飞书问题选项卡片);未配置时一律拒绝并让模型改用文本 */
|
|
69
|
+
askQuestion?: (req: AskQuestionRequest) => Promise<AskQuestionResult>;
|
|
47
70
|
timeoutMs?: number;
|
|
48
71
|
/** 免确认白名单;缺省 DEFAULT_ALLOW_TOOLS */
|
|
49
72
|
allowTools?: ReadonlySet<string>;
|
|
@@ -51,7 +74,11 @@ export declare class PermissionGate {
|
|
|
51
74
|
dangerousCommands?: readonly RegExp[];
|
|
52
75
|
});
|
|
53
76
|
private isDangerousCommand;
|
|
54
|
-
decide(toolName: string, input: Record<string, unknown>, workspaceName: string
|
|
77
|
+
decide(toolName: string, input: Record<string, unknown>, workspaceName: string, ctx?: {
|
|
78
|
+
suggestions?: unknown[];
|
|
79
|
+
}): Promise<GateDecision>;
|
|
80
|
+
/** 提问挂起窗(与 ask 同款超时语义):到点自动跳过,不让任务无限等待 */
|
|
81
|
+
private withTimeout;
|
|
55
82
|
rememberSession(toolName: string): void;
|
|
56
83
|
reset(): void;
|
|
57
84
|
}
|
|
@@ -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';
|
|
@@ -24,7 +24,7 @@ export const READ_ONLY_TOOLS = new Set([
|
|
|
24
24
|
*/
|
|
25
25
|
export const DEFAULT_DANGEROUS_COMMAND_SOURCES = [
|
|
26
26
|
'\\brm\\s+-[a-z]*r[a-z]*f', // rm -rf / rm -fr / rm -Rf(递归强删)
|
|
27
|
-
'\\brm\\s+-
|
|
27
|
+
'\\brm\\s+-f[a-z]*r',
|
|
28
28
|
'\\bsudo\\s',
|
|
29
29
|
'\\bgit\\s+push\\b[^&|;]*--force', // 强推覆盖远端
|
|
30
30
|
'\\bgit\\s+reset\\s+--hard', // 丢弃本地改动
|
|
@@ -40,8 +40,40 @@ export const DEFAULT_DANGEROUS_COMMANDS = DEFAULT_DANGEROUS_COMMAND_SOURCES.map(
|
|
|
40
40
|
const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
|
|
41
41
|
// 内部哨兵:区分「超时拒绝」与「用户主动拒绝」,便于给出准确原因
|
|
42
42
|
const TIMED_OUT = Symbol('timed-out');
|
|
43
|
+
// 提问超时哨兵(与确认卡的 TIMED_OUT 分开,避免类型纠缠)
|
|
44
|
+
const TIMED_OUT_SYM = Symbol('question-timed-out');
|
|
43
45
|
/** 生成确认 diff 的写工具集合(NotebookEdit 传入 generateFileDiff 后返回空,保持统一入口) */
|
|
44
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
|
+
}
|
|
45
77
|
export class PermissionGate {
|
|
46
78
|
opts;
|
|
47
79
|
remembered = new Set();
|
|
@@ -56,7 +88,7 @@ export class PermissionGate {
|
|
|
56
88
|
const cmd = typeof input.command === 'string' ? input.command : '';
|
|
57
89
|
return cmd ? this.dangerousCommands.some((re) => re.test(cmd)) : false;
|
|
58
90
|
}
|
|
59
|
-
async decide(toolName, input, workspaceName) {
|
|
91
|
+
async decide(toolName, input, workspaceName, ctx) {
|
|
60
92
|
// lcb-notify 通知工具直通:server 实例由 executeTask 闭包构造,chatId 硬绑定,
|
|
61
93
|
// 模型无法选择接收者(只能发到当前任务发起的聊天),无破坏性,逐张发图不应逐次弹确认卡。
|
|
62
94
|
// 用前缀匹配:后续往 notify server 新增工具自动直通。
|
|
@@ -73,6 +105,28 @@ export class PermissionGate {
|
|
|
73
105
|
return { behavior: 'deny', message: `用户未批准当前计划,要求按以下意见修改后重新提交计划:\n${r.feedback}` };
|
|
74
106
|
return { behavior: 'deny', message: '用户在飞书端放弃了本次计划,请停止执行并等待用户下一步指示' };
|
|
75
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
|
+
// 空答案对象与超时同义:wiring 层超时(或发卡失败降级)resolve({}) 时不再误当"用户提交了空表单"
|
|
121
|
+
// 放行——统一走 deny,由模型根据任务性质决定继续还是停下等待
|
|
122
|
+
if (answers === TIMED_OUT_SYM || Object.keys(answers).length === 0) {
|
|
123
|
+
return {
|
|
124
|
+
behavior: 'deny',
|
|
125
|
+
message: `用户未在飞书端作答(超时 ${Math.round(timeoutMs / 60000)} 分钟或提问卡片发送失败),请自行决策;若当前步骤强依赖用户确认,请停止并等待用户指示`,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return { behavior: 'allow', updatedInput: { questions: input.questions, answers } };
|
|
129
|
+
}
|
|
76
130
|
// 白名单直通;Bash 命中危险命令正则时落到确认卡(安全优先于白名单)
|
|
77
131
|
if (this.allowTools.has(toolName) && !(toolName === 'Bash' && this.isDangerousCommand(input))) {
|
|
78
132
|
return { behavior: 'allow' };
|
|
@@ -114,6 +168,20 @@ export class PermissionGate {
|
|
|
114
168
|
return { behavior: 'deny', message: `用户在飞书端拒绝了本次操作(${toolName})` };
|
|
115
169
|
return { behavior: 'allow' };
|
|
116
170
|
}
|
|
171
|
+
/** 提问挂起窗(与 ask 同款超时语义):到点自动跳过,不让任务无限等待 */
|
|
172
|
+
async withTimeout(p, timeoutMs) {
|
|
173
|
+
let timer;
|
|
174
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
175
|
+
timer = setTimeout(() => resolve(TIMED_OUT_SYM), timeoutMs);
|
|
176
|
+
timer.unref();
|
|
177
|
+
});
|
|
178
|
+
try {
|
|
179
|
+
return await Promise.race([p, timeoutPromise]);
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
clearTimeout(timer);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
117
185
|
rememberSession(toolName) {
|
|
118
186
|
this.remembered.add(toolName);
|
|
119
187
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission-gate.js","sourceRoot":"","sources":["../../src/executor/permission-gate.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,+DAA+D;AAC/D,
|
|
1
|
+
{"version":3,"file":"permission-gate.js","sourceRoot":"","sources":["../../src/executor/permission-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,25 @@ export declare function listInstalledPlugins(claudeConfigDir: string): Array<{
|
|
|
26
26
|
path?: string;
|
|
27
27
|
version?: string;
|
|
28
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[];
|
|
29
48
|
/**
|
|
30
49
|
* 显式配置(config.yaml apps[].plugins,开发期指源码目录)与自动发现结果合并:
|
|
31
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 开销可忽略)
|
|
@@ -80,6 +80,45 @@ export function listInstalledPlugins(claudeConfigDir) {
|
|
|
80
80
|
}
|
|
81
81
|
return out;
|
|
82
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
|
+
}
|
|
83
122
|
function parseInstalled(dir, installedPath, settingsPath) {
|
|
84
123
|
const installed = readJson(installedPath);
|
|
85
124
|
if (!installed.ok) {
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"plugin-discovery.js","sourceRoot":"","sources":["../../src/executor/plugin-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,3 +17,19 @@ export declare function runPluginCli(args: string[], opts: {
|
|
|
17
17
|
claudeConfigDir: string;
|
|
18
18
|
timeoutMs?: number;
|
|
19
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>;
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// 环境仅白名单透传 + CLAUDE_CONFIG_DIR:插件装到 bridge 解析的配置目录(managed 模式与 ~/.claude 隔离)
|
|
5
5
|
import { spawn } from 'node:child_process';
|
|
6
6
|
import { createRequire } from 'node:module';
|
|
7
|
+
import { listInstalledPlugins } from './plugin-discovery.js';
|
|
7
8
|
/** 平台二进制包候选(与 sdk.mjs 解析序一致:linux 优先 musl 变体;win32 带 .exe) */
|
|
8
9
|
function cliCandidates() {
|
|
9
10
|
const { platform, arch } = process;
|
|
@@ -81,4 +82,28 @@ export function runPluginCli(args, opts) {
|
|
|
81
82
|
});
|
|
82
83
|
});
|
|
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
|
+
}
|
|
84
109
|
//# sourceMappingURL=plugin-manager.js.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"plugin-manager.js","sourceRoot":"","sources":["../../src/executor/plugin-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { CardDecision, ConfirmationRequest, PermissionDecision } from '../types.js';
|
|
2
|
+
import type { AskQuestionRequest } from '../executor/permission-gate.js';
|
|
2
3
|
export interface ProgressState {
|
|
3
4
|
title: string;
|
|
4
5
|
status: string;
|
|
5
6
|
textTail: string;
|
|
6
7
|
toolLine: string;
|
|
7
8
|
startedAt: number;
|
|
9
|
+
done?: boolean;
|
|
8
10
|
}
|
|
9
11
|
export declare function buildTextCard(markdown: string): unknown;
|
|
10
12
|
/** 进度卡正文尾部的字符上限(防爆卡片);任务收尾据此判断短回复是否需要独立结果消息 */
|
|
@@ -30,3 +32,19 @@ export declare function buildPlanCards(req: PlanCardRequest): unknown[];
|
|
|
30
32
|
export declare function buildPlanResultCard(req: PlanCardRequest, decision: PlanCardDecision, byName: string, feedback?: string): unknown;
|
|
31
33
|
/** 计划确认超时卡(此后迟到点击不再改写此卡片) */
|
|
32
34
|
export declare function buildExpiredPlanCard(req: PlanCardRequest, timeoutMs: number): unknown;
|
|
35
|
+
export interface QuestionCardRequest {
|
|
36
|
+
requestId: string;
|
|
37
|
+
questions: AskQuestionRequest['questions'];
|
|
38
|
+
workspaceName: string;
|
|
39
|
+
}
|
|
40
|
+
/** 已选答案的中间态(wiring 侧维护):问题下标 → 选中的 option label(multiSelect 为数组) */
|
|
41
|
+
export type QuestionCardAnswers = Record<number, string | string[]>;
|
|
42
|
+
/**
|
|
43
|
+
* 提问卡片:每个问题一节(问题文本 + 选项按钮行,选中态打 ✓),底部「提交答案」按钮。
|
|
44
|
+
* 选项点击仅更新选中态(PATCH 重渲染),全部问题有答案后提交才有效。
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildQuestionCard(req: QuestionCardRequest, answers: QuestionCardAnswers): unknown;
|
|
47
|
+
/** 提交后的结果卡(展示每问的最终答案) */
|
|
48
|
+
export declare function buildQuestionResultCard(req: QuestionCardRequest, answers: QuestionCardAnswers, byName: string): unknown;
|
|
49
|
+
/** 提问超时卡(此后迟到点击不再改写此卡片) */
|
|
50
|
+
export declare function buildExpiredQuestionCard(req: QuestionCardRequest, timeoutMs: number): unknown;
|
|
@@ -20,12 +20,17 @@ export function buildImageCard(caption, imgKey) {
|
|
|
20
20
|
}
|
|
21
21
|
export function buildProgressCard(state) {
|
|
22
22
|
const elapsed = Math.max(0, Math.floor((Date.now() - state.startedAt) / 1000));
|
|
23
|
+
const duration = `${Math.floor(elapsed / 60)} 分 ${elapsed % 60} 秒`;
|
|
23
24
|
const lines = [`**${state.title}**`, ``, state.status, ``];
|
|
24
25
|
if (state.toolLine)
|
|
25
26
|
lines.push(`🔧 ${state.toolLine}`, ``);
|
|
26
27
|
if (state.textTail)
|
|
27
28
|
lines.push('---', state.textTail.slice(-PROGRESS_TAIL_CHARS)); // 只保留尾部,防爆卡片
|
|
28
|
-
|
|
29
|
+
// 终态改为「总耗时」+ 完成时刻:运行中的「已运行」在停止刷新后读起来仍像在计时,任务
|
|
30
|
+
// 是否结束必须一眼可辨(用户分不清计时停了是完成还是卡死)
|
|
31
|
+
lines.push(``, state.done
|
|
32
|
+
? `<font color='grey'>⏱ 总耗时 ${duration} · 已结束于 ${new Date().toLocaleTimeString('zh-CN', { hour12: false })}</font>`
|
|
33
|
+
: `<font color='grey'>⏱ 已运行 ${duration}</font>`);
|
|
29
34
|
return card([md(lines.join('\n'))]);
|
|
30
35
|
}
|
|
31
36
|
export function buildConfirmCard(req) {
|
|
@@ -117,4 +122,59 @@ export function buildPlanResultCard(req, decision, byName, feedback) {
|
|
|
117
122
|
export function buildExpiredPlanCard(req, timeoutMs) {
|
|
118
123
|
return card([md(`**📋 Claude 提交执行计划**\n\n工作区: \`${req.workspaceName}\`\n\n⏰ 已超时自动放弃(${Math.round(timeoutMs / 60000)} 分钟未确认)`)]);
|
|
119
124
|
}
|
|
125
|
+
function qaOptionButton(reqId, qIndex, label, selected) {
|
|
126
|
+
return {
|
|
127
|
+
tag: 'button',
|
|
128
|
+
text: { tag: 'plain_text', content: selected ? `✓ ${label}` : label },
|
|
129
|
+
type: selected ? 'primary' : 'default',
|
|
130
|
+
behaviors: [{ type: 'callback', value: { requestId: reqId, decision: 'qa-pick', qIndex, option: label } }],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 提问卡片:每个问题一节(问题文本 + 选项按钮行,选中态打 ✓),底部「提交答案」按钮。
|
|
135
|
+
* 选项点击仅更新选中态(PATCH 重渲染),全部问题有答案后提交才有效。
|
|
136
|
+
*/
|
|
137
|
+
export function buildQuestionCard(req, answers) {
|
|
138
|
+
const elements = [md(`**❓ Claude 需要你确认**\n\n工作区: \`${req.workspaceName}\``)];
|
|
139
|
+
req.questions.forEach((q, qIndex) => {
|
|
140
|
+
const sel = answers[qIndex];
|
|
141
|
+
const picked = Array.isArray(sel) ? sel : sel !== undefined ? [sel] : [];
|
|
142
|
+
elements.push(md(`**${qIndex + 1}. ${q.question}**${q.multiSelect ? '(可多选)' : ''}`));
|
|
143
|
+
elements.push({
|
|
144
|
+
tag: 'column_set',
|
|
145
|
+
flex_mode: 'flow',
|
|
146
|
+
columns: q.options.map((o) => ({
|
|
147
|
+
tag: 'column', width: 'auto', weight: 1, vertical_align: 'top',
|
|
148
|
+
elements: [qaOptionButton(req.requestId, qIndex, o.label, picked.includes(o.label))],
|
|
149
|
+
})),
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
elements.push({
|
|
153
|
+
tag: 'column_set',
|
|
154
|
+
flex_mode: 'flow',
|
|
155
|
+
columns: [{
|
|
156
|
+
tag: 'column', width: 'auto', weight: 1, vertical_align: 'top',
|
|
157
|
+
elements: [{
|
|
158
|
+
tag: 'button',
|
|
159
|
+
text: { tag: 'plain_text', content: '✅ 提交答案' },
|
|
160
|
+
type: 'primary',
|
|
161
|
+
behaviors: [{ type: 'callback', value: { requestId: req.requestId, decision: 'qa-submit' } }],
|
|
162
|
+
}],
|
|
163
|
+
}],
|
|
164
|
+
});
|
|
165
|
+
return card(elements);
|
|
166
|
+
}
|
|
167
|
+
/** 提交后的结果卡(展示每问的最终答案) */
|
|
168
|
+
export function buildQuestionResultCard(req, answers, byName) {
|
|
169
|
+
const lines = req.questions.map((q, i) => {
|
|
170
|
+
const a = answers[i];
|
|
171
|
+
const ans = a === undefined ? '(未作答)' : Array.isArray(a) ? a.join('、') : a;
|
|
172
|
+
return `- ${q.question} → **${ans}**`;
|
|
173
|
+
});
|
|
174
|
+
return card([md(`**❓ Claude 需要你确认**\n\n工作区: \`${req.workspaceName}\`\n\n${lines.join('\n')}\n\n✅ 答案已提交(由 ${byName} 操作)`)]);
|
|
175
|
+
}
|
|
176
|
+
/** 提问超时卡(此后迟到点击不再改写此卡片) */
|
|
177
|
+
export function buildExpiredQuestionCard(req, timeoutMs) {
|
|
178
|
+
return card([md(`**❓ Claude 需要你确认**\n\n工作区: \`${req.workspaceName}\`\n\n⏰ 已超时自动跳过(${Math.round(timeoutMs / 60000)} 分钟未响应),Claude 将自行决策继续`)]);
|
|
179
|
+
}
|
|
120
180
|
//# sourceMappingURL=card-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../../src/gateway/card-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../../src/gateway/card-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,14 @@ export interface FeishuSdk {
|
|
|
53
53
|
code?: number;
|
|
54
54
|
msg?: string;
|
|
55
55
|
}>;
|
|
56
|
+
delete(payload: {
|
|
57
|
+
path: {
|
|
58
|
+
message_id: string;
|
|
59
|
+
};
|
|
60
|
+
}): Promise<{
|
|
61
|
+
code?: number;
|
|
62
|
+
msg?: string;
|
|
63
|
+
}>;
|
|
56
64
|
};
|
|
57
65
|
image: {
|
|
58
66
|
create(payload: {
|
|
@@ -181,6 +189,8 @@ export declare class FeishuGateway {
|
|
|
181
189
|
sendText(chatId: string, markdown: string): Promise<string>;
|
|
182
190
|
/** 更新已发送卡片(流式进度刷新) */
|
|
183
191
|
updateCard(messageId: string, card: unknown): Promise<void>;
|
|
192
|
+
/** 撤回消息(进度卡沉底用:删旧卡后重发,保持进度卡始终在会话最底部) */
|
|
193
|
+
deleteCard(messageId: string): Promise<void>;
|
|
184
194
|
/**
|
|
185
195
|
* 上传图片并发送带 caption 的卡片(caption 显示在图片上方,逐张发图带编号说明用)。
|
|
186
196
|
* 卡片形态发送失败时降级为「caption 文本卡 + 纯图片消息」两条,保证图片必达
|
|
@@ -330,6 +330,10 @@ export class FeishuGateway {
|
|
|
330
330
|
async updateCard(messageId, card) {
|
|
331
331
|
await this.client.im.message.patch({ path: { message_id: messageId }, data: { content: JSON.stringify(card) } });
|
|
332
332
|
}
|
|
333
|
+
/** 撤回消息(进度卡沉底用:删旧卡后重发,保持进度卡始终在会话最底部) */
|
|
334
|
+
async deleteCard(messageId) {
|
|
335
|
+
await this.client.im.message.delete({ path: { message_id: messageId } });
|
|
336
|
+
}
|
|
333
337
|
/**
|
|
334
338
|
* 上传图片并发送带 caption 的卡片(caption 显示在图片上方,逐张发图带编号说明用)。
|
|
335
339
|
* 卡片形态发送失败时降级为「caption 文本卡 + 纯图片消息」两条,保证图片必达
|