@jesonliu/lark-claudecode-bridge 0.11.0 → 0.13.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 +81 -46
- package/assets/web/index.html +1416 -0
- package/config.example.yaml +22 -2
- package/dist/auth-precheck.d.ts +5 -2
- package/dist/auth-precheck.js +8 -2
- package/dist/auth-precheck.js.map +1 -1
- package/dist/bin/lcb.js +32 -3
- package/dist/bin/lcb.js.map +1 -1
- package/dist/claude-config.d.ts +19 -0
- package/dist/claude-config.js +76 -0
- package/dist/claude-config.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +1 -0
- package/dist/cli/setup-wizard.js +4 -0
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/config-defaults.d.ts +4 -0
- package/dist/config-defaults.js +15 -0
- package/dist/config-defaults.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.js +190 -6
- package/dist/config.js.map +1 -1
- package/dist/executor/permission-gate.d.ts +8 -1
- package/dist/executor/permission-gate.js +21 -14
- package/dist/executor/permission-gate.js.map +1 -1
- package/dist/executor/plugin-discovery.d.ts +11 -0
- package/dist/executor/plugin-discovery.js +28 -0
- package/dist/executor/plugin-discovery.js.map +1 -1
- package/dist/executor/plugin-manager.d.ts +19 -0
- package/dist/executor/plugin-manager.js +84 -0
- package/dist/executor/plugin-manager.js.map +1 -0
- package/dist/feishu/slash-commands.d.ts +77 -0
- package/dist/feishu/slash-commands.js +188 -0
- package/dist/feishu/slash-commands.js.map +1 -0
- package/dist/index.js +80 -17
- package/dist/index.js.map +1 -1
- package/dist/session/commands.d.ts +16 -1
- package/dist/session/commands.js +33 -1
- package/dist/session/commands.js.map +1 -1
- package/dist/session/plugin-command.d.ts +14 -0
- package/dist/session/plugin-command.js +110 -0
- package/dist/session/plugin-command.js.map +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/util/open-browser.d.ts +1 -0
- package/dist/util/open-browser.js +20 -0
- package/dist/util/open-browser.js.map +1 -0
- package/dist/util/server-url.d.ts +3 -0
- package/dist/util/server-url.js +10 -0
- package/dist/util/server-url.js.map +1 -0
- package/dist/web/config-api.d.ts +50 -0
- package/dist/web/config-api.js +184 -0
- package/dist/web/config-api.js.map +1 -0
- package/dist/web/lifecycle.d.ts +52 -0
- package/dist/web/lifecycle.js +167 -0
- package/dist/web/lifecycle.js.map +1 -0
- package/dist/web/model-list.d.ts +36 -0
- package/dist/web/model-list.js +101 -0
- package/dist/web/model-list.js.map +1 -0
- package/dist/web/server.d.ts +22 -0
- package/dist/web/server.js +543 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/update.d.ts +26 -0
- package/dist/web/update.js +64 -0
- package/dist/web/update.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
// Web 配置页 server:node:http 零新依赖,随 lcb start 常驻 / lcb ui 独立启动。
|
|
2
|
+
// 安全基线:默认只绑 127.0.0.1;Host/Origin 校验防 DNS rebinding;body ≤1MB;
|
|
3
|
+
// secret 永不出进程(GET 脱敏回显,PUT 空值=不修改)。改动写盘后由现有热重载器/重启消费
|
|
4
|
+
import { createServer } from 'node:http';
|
|
5
|
+
import { existsSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { parseDocument, stringify } from 'yaml';
|
|
9
|
+
import { CONFIG_PATH, SLASH_COMMAND_RE, loadConfig, parseConfigText } from '../config.js';
|
|
10
|
+
import { DEFAULT_CLAUDE_DIR, initManagedClaudeDir, resolveClaudeDir } from '../claude-config.js';
|
|
11
|
+
import { hasClaudeAuth } from '../auth-precheck.js';
|
|
12
|
+
import { defaultPermissionsDoc, defaultServerDoc } from '../config-defaults.js';
|
|
13
|
+
import { VERSION } from '../version.js';
|
|
14
|
+
import { appStatusSummary, applyPermissionDisplayDefaults, applySecrets, claudeSettingsSummary, computeRestartRequired, docForClient, isAllowedHost, isAllowedOrigin } from './config-api.js';
|
|
15
|
+
import { fetchModelList, resolveModelFetchParams } from './model-list.js';
|
|
16
|
+
import { SLASH_COMMAND_META } from '../session/commands.js';
|
|
17
|
+
import { DEFAULT_ALLOW_TOOLS_LIST, DEFAULT_DANGEROUS_COMMAND_SOURCES } from '../executor/permission-gate.js';
|
|
18
|
+
import { openBrowser } from '../util/open-browser.js';
|
|
19
|
+
import { builtinCommands, createSlashApiClient, ensureBuiltins, expectedCommands, syncSlashCommands } from '../feishu/slash-commands.js';
|
|
20
|
+
import { runPluginCli } from '../executor/plugin-manager.js';
|
|
21
|
+
import { invalidatePluginCache, listInstalledPlugins } from '../executor/plugin-discovery.js';
|
|
22
|
+
import { bridgeStatus, resolveLcbEntry, restartBridgeWithHelper, spawnBridgeDetached, stopBridgeByPid } from './lifecycle.js';
|
|
23
|
+
import { checkUpdate, installMode, runUpdate } from './update.js';
|
|
24
|
+
/** PUT /api/config 参与整段替换的顶级键;body 未携带的键保持磁盘原文(含注释) */
|
|
25
|
+
const PUT_SECTIONS = ['apps', 'workspaces', 'defaults', 'concurrency', 'permissions', 'server', 'claude', 'slash_commands', 'transcripts'];
|
|
26
|
+
const INDEX_HTML_PATH = fileURLToPath(new URL('../../assets/web/index.html', import.meta.url));
|
|
27
|
+
const BODY_LIMIT = 1024 * 1024;
|
|
28
|
+
const startedAt = Date.now();
|
|
29
|
+
function json(res, status, body) {
|
|
30
|
+
const text = JSON.stringify(body);
|
|
31
|
+
res.writeHead(status, { 'Content-Type': 'application/json; charset=utf-8', 'Cache-Control': 'no-store' });
|
|
32
|
+
res.end(text);
|
|
33
|
+
}
|
|
34
|
+
function readBody(req) {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
let size = 0;
|
|
37
|
+
const chunks = [];
|
|
38
|
+
req.on('data', (c) => {
|
|
39
|
+
size += c.length;
|
|
40
|
+
if (size > BODY_LIMIT) {
|
|
41
|
+
reject(new Error('请求体超过 1MB 上限'));
|
|
42
|
+
req.destroy();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
chunks.push(c);
|
|
46
|
+
});
|
|
47
|
+
req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
|
|
48
|
+
req.on('error', reject);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function readJsonBody(req) {
|
|
52
|
+
return readBody(req).then((text) => {
|
|
53
|
+
if (!text.trim())
|
|
54
|
+
return {};
|
|
55
|
+
const v = JSON.parse(text);
|
|
56
|
+
if (v === null || typeof v !== 'object' || Array.isArray(v))
|
|
57
|
+
throw new Error('请求体必须为 JSON 对象');
|
|
58
|
+
return v;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/** 原子写盘(tmp + rename),与 claude-config 同款防半截文件 */
|
|
62
|
+
function writeAtomic(path, text) {
|
|
63
|
+
const tmp = `${path}.tmp`;
|
|
64
|
+
writeFileSync(tmp, text, 'utf8');
|
|
65
|
+
renameSync(tmp, path);
|
|
66
|
+
}
|
|
67
|
+
/** 读 Claude 配置目录下 settings.json(不存在/损坏 → undefined;内容仅供脱敏摘要) */
|
|
68
|
+
function readSettingsJson(dir) {
|
|
69
|
+
try {
|
|
70
|
+
const p = join(dir, 'settings.json');
|
|
71
|
+
if (!existsSync(p))
|
|
72
|
+
return undefined;
|
|
73
|
+
return JSON.parse(readFileSync(p, 'utf8'));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** managed 模式时把 claude 段最新认证立即同步进自管目录 settings.json(后续任务即生效,无需等重启) */
|
|
80
|
+
function syncManagedClaude(config) {
|
|
81
|
+
if (config.claude?.mode === 'managed')
|
|
82
|
+
initManagedClaudeDir(config);
|
|
83
|
+
}
|
|
84
|
+
/** 从磁盘原文读 snake_case doc(PUT 的 secret 回填基准) */
|
|
85
|
+
function readRawDoc(configPath) {
|
|
86
|
+
if (!existsSync(configPath))
|
|
87
|
+
return null;
|
|
88
|
+
try {
|
|
89
|
+
return parseDocument(readFileSync(configPath, 'utf8')).toJS();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null; // 磁盘文件损坏:PUT 走全量重建路径(parseDocument 抛错由调用方处理)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export async function startWebServer(opts = {}) {
|
|
96
|
+
const serverCfg = opts.server ?? defaultServerDoc();
|
|
97
|
+
if (serverCfg.enabled === false)
|
|
98
|
+
return null;
|
|
99
|
+
const configPath = opts.configPath ?? CONFIG_PATH;
|
|
100
|
+
const host = serverCfg.host ?? '127.0.0.1';
|
|
101
|
+
const port = serverCfg.port ?? 17317;
|
|
102
|
+
const server = createServer((req, res) => {
|
|
103
|
+
void handle(req, res, { configPath, host, port, embedded: opts.embedded ?? false, appsStarted: opts.appsStarted, selfStop: opts.selfStop }).catch((e) => {
|
|
104
|
+
console.error('[配置页] 请求处理异常:', e);
|
|
105
|
+
if (!res.headersSent)
|
|
106
|
+
json(res, 500, { error: e instanceof Error ? e.message : String(e) });
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
await new Promise((resolve, reject) => {
|
|
110
|
+
server.once('error', reject);
|
|
111
|
+
server.listen(port, host, () => resolve());
|
|
112
|
+
});
|
|
113
|
+
const actualPort = server.address().port;
|
|
114
|
+
const url = `http://${host === '::1' ? '[::1]' : host}:${actualPort}`;
|
|
115
|
+
console.log(`🧭 配置页已就绪:${url}${opts.embedded ? '' : '(lcb ui 独立模式,桥接器未启动)'}`);
|
|
116
|
+
if (opts.autoOpen)
|
|
117
|
+
openBrowser(url);
|
|
118
|
+
return {
|
|
119
|
+
url,
|
|
120
|
+
port: actualPort,
|
|
121
|
+
close: () => server.close(),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
async function handle(req, res, ctx) {
|
|
125
|
+
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
126
|
+
const path = url.pathname;
|
|
127
|
+
// 每请求现查(不能用启动快照):bootstrap 写盘成功后,后续请求立即按「已有配置」处理
|
|
128
|
+
const firstRun = !existsSync(ctx.configPath);
|
|
129
|
+
// 安全闸:Host / Origin 校验(防 DNS rebinding 拿本机页面读写配置)
|
|
130
|
+
if (!isAllowedHost(req.headers.host, ctx.host) || !isAllowedOrigin(req.headers.origin, ctx.host, ctx.port)) {
|
|
131
|
+
res.writeHead(403, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
132
|
+
res.end('Forbidden');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// 静态页(单文件,无目录遍历面)
|
|
136
|
+
if (req.method === 'GET' && (path === '/' || path === '/index.html')) {
|
|
137
|
+
try {
|
|
138
|
+
const html = readFileSync(INDEX_HTML_PATH, 'utf8');
|
|
139
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' });
|
|
140
|
+
res.end(html);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
144
|
+
res.end('配置页资源缺失(assets/web/index.html)');
|
|
145
|
+
}
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (path === '/api/status' && req.method === 'GET') {
|
|
149
|
+
let claude = { mode: 'inherit', hasAuth: null };
|
|
150
|
+
let apps = [];
|
|
151
|
+
if (!firstRun) {
|
|
152
|
+
try {
|
|
153
|
+
const config = loadConfig(ctx.configPath);
|
|
154
|
+
const dir = resolveClaudeDir(config);
|
|
155
|
+
claude = {
|
|
156
|
+
mode: config.claude?.mode ?? 'inherit',
|
|
157
|
+
hasAuth: hasClaudeAuth(process.env, dir),
|
|
158
|
+
// 当前实际生效配置(inherit=~/.claude 状态 / managed=自管目录),凭证脱敏不出进程
|
|
159
|
+
current: claudeSettingsSummary(readSettingsJson(dir)),
|
|
160
|
+
settingsPath: join(dir, 'settings.json'),
|
|
161
|
+
};
|
|
162
|
+
apps = appStatusSummary(config.apps, ctx.appsStarted);
|
|
163
|
+
}
|
|
164
|
+
catch { /* 磁盘配置损坏:status 仍可用(页面提示重配) */ }
|
|
165
|
+
}
|
|
166
|
+
return json(res, 200, {
|
|
167
|
+
version: VERSION, uptimeMs: Date.now() - startedAt, configPath: ctx.configPath,
|
|
168
|
+
firstRun, embedded: ctx.embedded,
|
|
169
|
+
bridge: { ...bridgeStatus(), spawnable: resolveLcbEntry().ok },
|
|
170
|
+
server: { host: ctx.host, port: ctx.port },
|
|
171
|
+
claude, apps,
|
|
172
|
+
// 内置命令清单(概览「常用命令」卡)与权限运行时默认(权限页「恢复默认」)——均与配置无关的静态单源
|
|
173
|
+
commands: Object.entries(SLASH_COMMAND_META).map(([command, meta]) => ({ command, description: meta.description })),
|
|
174
|
+
permissionDefaults: {
|
|
175
|
+
allowTools: [...DEFAULT_ALLOW_TOOLS_LIST],
|
|
176
|
+
dangerousCommands: [...DEFAULT_DANGEROUS_COMMAND_SOURCES],
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
if (path === '/api/config' && req.method === 'GET') {
|
|
181
|
+
if (firstRun)
|
|
182
|
+
return json(res, 404, { error: '尚无配置文件(首次安装),请提交 bootstrap 向导' });
|
|
183
|
+
const rawDoc = readRawDoc(ctx.configPath);
|
|
184
|
+
if (rawDoc === null)
|
|
185
|
+
return json(res, 500, { error: 'config.yaml 读取失败(语法错误?),lcb setup 或手工修复后重试' });
|
|
186
|
+
return json(res, 200, applyPermissionDisplayDefaults(docForClient(rawDoc)));
|
|
187
|
+
}
|
|
188
|
+
if (path === '/api/config' && req.method === 'PUT') {
|
|
189
|
+
if (firstRun)
|
|
190
|
+
return json(res, 404, { error: '尚无配置文件,请先提交 bootstrap 向导' });
|
|
191
|
+
const body = await readJsonBody(req);
|
|
192
|
+
// secret 回填:以磁盘原文为基准,客户端未改的 secret 字段(空/缺省/仍是脱敏对象)回填现值
|
|
193
|
+
const rawText = readFileSync(ctx.configPath, 'utf8');
|
|
194
|
+
const oldJs = parseDocument(rawText).toJS();
|
|
195
|
+
const merged = applySecrets(body, oldJs);
|
|
196
|
+
const doc = parseDocument(rawText);
|
|
197
|
+
for (const key of PUT_SECTIONS) {
|
|
198
|
+
if (merged[key] === undefined)
|
|
199
|
+
continue;
|
|
200
|
+
// 值未变的段落跳过重写:整段 set 会丢掉段内手写注释(ws-manager 同款折损),「打开页面直接保存」应无损
|
|
201
|
+
if (JSON.stringify(merged[key]) === JSON.stringify(oldJs[key] ?? null))
|
|
202
|
+
continue;
|
|
203
|
+
doc.set(key, merged[key]);
|
|
204
|
+
}
|
|
205
|
+
const text = doc.toString();
|
|
206
|
+
let after;
|
|
207
|
+
try {
|
|
208
|
+
after = parseConfigText(text, ctx.configPath); // 写盘前内存校验:拒绝坏配置落盘
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
return json(res, 400, { error: e instanceof Error ? e.message : String(e) });
|
|
212
|
+
}
|
|
213
|
+
let restartRequired = [];
|
|
214
|
+
try {
|
|
215
|
+
restartRequired = computeRestartRequired(loadConfig(ctx.configPath), after);
|
|
216
|
+
}
|
|
217
|
+
catch { /* 磁盘原配置损坏:全部视为需重启 */
|
|
218
|
+
restartRequired = ['apps', 'concurrency', 'claude', 'server'];
|
|
219
|
+
}
|
|
220
|
+
writeAtomic(ctx.configPath, text);
|
|
221
|
+
syncManagedClaude(after);
|
|
222
|
+
return json(res, 200, { ok: true, restartRequired });
|
|
223
|
+
}
|
|
224
|
+
// ---- 模型列表拉取(厂商无关;凭证用磁盘现值或本次表单输入,响应只含模型 id,绝不回传凭证) ----
|
|
225
|
+
if (path === '/api/models/fetch' && req.method === 'POST') {
|
|
226
|
+
if (firstRun)
|
|
227
|
+
return json(res, 404, { error: '尚无配置文件,请先完成 bootstrap' });
|
|
228
|
+
const body = await readJsonBody(req);
|
|
229
|
+
let config;
|
|
230
|
+
try {
|
|
231
|
+
config = loadConfig(ctx.configPath);
|
|
232
|
+
}
|
|
233
|
+
catch (e) {
|
|
234
|
+
return json(res, 500, { error: `配置加载失败:${e instanceof Error ? e.message : String(e)}` });
|
|
235
|
+
}
|
|
236
|
+
const resolved = resolveModelFetchParams(body, config.claude);
|
|
237
|
+
if ('error' in resolved)
|
|
238
|
+
return json(res, 400, { error: resolved.error });
|
|
239
|
+
try {
|
|
240
|
+
const models = await fetchModelList(resolved);
|
|
241
|
+
return json(res, 200, { models });
|
|
242
|
+
}
|
|
243
|
+
catch (e) {
|
|
244
|
+
return json(res, 502, { error: e instanceof Error ? e.message : String(e) });
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// ---- 切换当前生效厂商档案:前端拿不到档案凭证明文(脱敏模型),切换必须由后端完成并即时落盘 ----
|
|
248
|
+
if (path === '/api/claude/use-profile' && req.method === 'POST') {
|
|
249
|
+
if (firstRun)
|
|
250
|
+
return json(res, 404, { error: '尚无配置文件,请先完成 bootstrap' });
|
|
251
|
+
const body = await readJsonBody(req);
|
|
252
|
+
const name = String(body.name ?? '').trim();
|
|
253
|
+
if (!name)
|
|
254
|
+
return json(res, 400, { error: '缺少档案名 name' });
|
|
255
|
+
let config;
|
|
256
|
+
try {
|
|
257
|
+
config = loadConfig(ctx.configPath);
|
|
258
|
+
}
|
|
259
|
+
catch (e) {
|
|
260
|
+
return json(res, 500, { error: `配置加载失败:${e instanceof Error ? e.message : String(e)}` });
|
|
261
|
+
}
|
|
262
|
+
const prof = config.claude?.profiles?.find((p) => p.name === name);
|
|
263
|
+
if (!prof)
|
|
264
|
+
return json(res, 404, { error: `档案 "${name}" 不存在(新增/修改档案后须先保存再切换)` });
|
|
265
|
+
// 可选 model 覆盖(档案候选模型点选切换):须属于该档案 models 候选集或其默认模型,防手滑串档案
|
|
266
|
+
const modelOverride = String(body.model ?? '').trim();
|
|
267
|
+
if (modelOverride) {
|
|
268
|
+
const candidates = new Set([...(prof.models ?? []), ...(prof.model ? [prof.model] : [])]);
|
|
269
|
+
if (!candidates.has(modelOverride)) {
|
|
270
|
+
return json(res, 400, { error: `模型 "${modelOverride}" 不在档案 "${name}" 的候选模型中(${[...candidates].join('、') || '空'})` });
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// 顶层四字段整体替换为档案值(档案未配置的字段清除,保证切换干净;mode 与 profiles 原样保留)
|
|
274
|
+
const rawText = readFileSync(ctx.configPath, 'utf8');
|
|
275
|
+
const doc = parseDocument(rawText);
|
|
276
|
+
const oldJs = doc.toJS();
|
|
277
|
+
const oldClaude = (oldJs.claude && typeof oldJs.claude === 'object' && !Array.isArray(oldJs.claude) ? oldJs.claude : {});
|
|
278
|
+
const newClaude = { ...oldClaude };
|
|
279
|
+
if (prof.authToken) {
|
|
280
|
+
newClaude.auth_token = prof.authToken;
|
|
281
|
+
delete newClaude.api_key;
|
|
282
|
+
}
|
|
283
|
+
else if (prof.apiKey) {
|
|
284
|
+
newClaude.api_key = prof.apiKey;
|
|
285
|
+
delete newClaude.auth_token;
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
delete newClaude.auth_token;
|
|
289
|
+
delete newClaude.api_key;
|
|
290
|
+
}
|
|
291
|
+
if (prof.baseUrl)
|
|
292
|
+
newClaude.base_url = prof.baseUrl;
|
|
293
|
+
else
|
|
294
|
+
delete newClaude.base_url;
|
|
295
|
+
const effModel = modelOverride || prof.model;
|
|
296
|
+
if (effModel)
|
|
297
|
+
newClaude.model = effModel;
|
|
298
|
+
else
|
|
299
|
+
delete newClaude.model;
|
|
300
|
+
doc.set('claude', newClaude);
|
|
301
|
+
const text = doc.toString();
|
|
302
|
+
let after;
|
|
303
|
+
try {
|
|
304
|
+
after = parseConfigText(text, ctx.configPath);
|
|
305
|
+
}
|
|
306
|
+
catch (e) {
|
|
307
|
+
return json(res, 400, { error: e instanceof Error ? e.message : String(e) });
|
|
308
|
+
}
|
|
309
|
+
writeAtomic(ctx.configPath, text);
|
|
310
|
+
syncManagedClaude(after);
|
|
311
|
+
return json(res, 200, { ok: true, message: `已切换到档案「${name}」${effModel ? `(模型 ${effModel})` : ''}${after.claude?.mode === 'managed' ? ',managed 模式下对后续任务即生效' : ',当前 inherit 模式:顶层值已更新,切到 managed 后生效'}` });
|
|
312
|
+
}
|
|
313
|
+
if (path === '/api/bootstrap' && req.method === 'POST') {
|
|
314
|
+
if (!firstRun)
|
|
315
|
+
return json(res, 409, { error: '配置文件已存在(bootstrap 仅用于首次安装),请改用配置页编辑' });
|
|
316
|
+
const body = await readJsonBody(req);
|
|
317
|
+
const apps = Array.isArray(body.apps) ? body.apps : [];
|
|
318
|
+
const ws = body.workspace && typeof body.workspace === 'object' ? body.workspace : null;
|
|
319
|
+
if (apps.length === 0 || !ws?.name || !ws?.path) {
|
|
320
|
+
return json(res, 400, { error: 'bootstrap 需要 apps(≥1 个应用凭证)与 workspace(name/path)' });
|
|
321
|
+
}
|
|
322
|
+
const doc = {
|
|
323
|
+
apps,
|
|
324
|
+
workspaces: [{ name: String(ws.name), path: String(ws.path) }],
|
|
325
|
+
defaults: { workspace: String(ws.name) },
|
|
326
|
+
concurrency: 3,
|
|
327
|
+
permissions: defaultPermissionsDoc(),
|
|
328
|
+
server: defaultServerDoc(),
|
|
329
|
+
...(body.claude && typeof body.claude === 'object' ? { claude: body.claude } : {}),
|
|
330
|
+
};
|
|
331
|
+
const text = stringify(doc);
|
|
332
|
+
let config;
|
|
333
|
+
try {
|
|
334
|
+
config = parseConfigText(text, ctx.configPath);
|
|
335
|
+
}
|
|
336
|
+
catch (e) {
|
|
337
|
+
return json(res, 400, { error: e instanceof Error ? e.message : String(e) });
|
|
338
|
+
}
|
|
339
|
+
writeAtomic(ctx.configPath, text);
|
|
340
|
+
syncManagedClaude(config);
|
|
341
|
+
return json(res, 200, { ok: true, message: '配置已写入。请启动/重启 lcb start 开始使用' });
|
|
342
|
+
}
|
|
343
|
+
// ---- 斜杠命令(需已配置 app 凭证;lcb ui 独立进程同样可用) ----
|
|
344
|
+
if (path.startsWith('/api/slash-commands')) {
|
|
345
|
+
if (firstRun)
|
|
346
|
+
return json(res, 404, { error: '尚无配置文件,请先完成 bootstrap' });
|
|
347
|
+
let config;
|
|
348
|
+
try {
|
|
349
|
+
config = loadConfig(ctx.configPath);
|
|
350
|
+
}
|
|
351
|
+
catch (e) {
|
|
352
|
+
return json(res, 500, { error: `配置加载失败:${e instanceof Error ? e.message : String(e)}` });
|
|
353
|
+
}
|
|
354
|
+
if (path === '/api/slash-commands/expected' && req.method === 'GET') {
|
|
355
|
+
return json(res, 200, { expected: expectedCommands(config) });
|
|
356
|
+
}
|
|
357
|
+
const body = path === '/api/slash-commands/remote' && req.method === 'GET'
|
|
358
|
+
? {}
|
|
359
|
+
: await readJsonBody(req).catch(() => ({}));
|
|
360
|
+
const appName = path === '/api/slash-commands/remote'
|
|
361
|
+
? url.searchParams.get('app')
|
|
362
|
+
: String(body.app ?? '');
|
|
363
|
+
const app = config.apps.find((a) => a.name === appName || a.appId === appName);
|
|
364
|
+
if (!app)
|
|
365
|
+
return json(res, 400, { error: `应用 "${String(appName)}" 不存在,可用:${config.apps.map((a) => a.name).join('、')}` });
|
|
366
|
+
const client = createSlashApiClient(app);
|
|
367
|
+
try {
|
|
368
|
+
if (path === '/api/slash-commands/remote' && req.method === 'GET') {
|
|
369
|
+
return json(res, 200, { remote: await client.list() });
|
|
370
|
+
}
|
|
371
|
+
if (path === '/api/slash-commands/sync' && req.method === 'POST') {
|
|
372
|
+
// mode=builtins-only 只补齐缺失的内置命令(绝不删除远端已有命令);缺省全量对齐(兼容既有 API/脚本)
|
|
373
|
+
const report = body.mode === 'builtins-only'
|
|
374
|
+
? await ensureBuiltins(client, builtinCommands())
|
|
375
|
+
: await syncSlashCommands(client, expectedCommands(config));
|
|
376
|
+
return json(res, 200, report);
|
|
377
|
+
}
|
|
378
|
+
if (path === '/api/slash-commands/action' && req.method === 'POST') {
|
|
379
|
+
// 远端单条 CRUD(0.13 页面直操作飞书 API;与 config.yaml 的 slash_commands.extra 无关)
|
|
380
|
+
const op = String(body.op ?? '');
|
|
381
|
+
const command = String(body.command ?? '').trim();
|
|
382
|
+
const commandId = String(body.commandId ?? '').trim();
|
|
383
|
+
const description = String(body.description ?? '').trim();
|
|
384
|
+
const icon = String(body.icon ?? '').trim();
|
|
385
|
+
if (op === 'create') {
|
|
386
|
+
if (!command)
|
|
387
|
+
return json(res, 400, { error: '缺少 command(命令名,不带 /)' });
|
|
388
|
+
if (!SLASH_COMMAND_RE.test(command))
|
|
389
|
+
return json(res, 400, { error: `command "${command}" 须为 1-32 位字母/数字/下划线/连字符` });
|
|
390
|
+
if (!description)
|
|
391
|
+
return json(res, 400, { error: '缺少 description(飞书指令面板展示用)' });
|
|
392
|
+
const id = await client.create({ command, description, ...(icon ? { icon } : {}) });
|
|
393
|
+
return json(res, 200, { ok: true, commandId: id });
|
|
394
|
+
}
|
|
395
|
+
if (op === 'update') {
|
|
396
|
+
if (!commandId)
|
|
397
|
+
return json(res, 400, { error: 'update 需要 commandId(列表行的飞书侧命令 ID)' });
|
|
398
|
+
if (!description)
|
|
399
|
+
return json(res, 400, { error: '缺少 description(飞书 PATCH 仅支持描述与图标,命令名不可改)' });
|
|
400
|
+
await client.update(commandId, { command: command || '(unchanged)', description, ...(icon ? { icon } : {}) });
|
|
401
|
+
return json(res, 200, { ok: true });
|
|
402
|
+
}
|
|
403
|
+
if (op === 'delete') {
|
|
404
|
+
if (!commandId)
|
|
405
|
+
return json(res, 400, { error: 'delete 需要 commandId(列表行的飞书侧命令 ID)' });
|
|
406
|
+
await client.remove(commandId);
|
|
407
|
+
return json(res, 200, { ok: true });
|
|
408
|
+
}
|
|
409
|
+
return json(res, 400, { error: `未知 op "${op}"(支持 create / update / delete)` });
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch (e) {
|
|
413
|
+
// API 原文透传(缺 scope 等场景页面直接展示开放平台错误)
|
|
414
|
+
return json(res, 502, { error: `飞书 API 调用失败:${e instanceof Error ? e.message : String(e)}(请确认已开通 application:app_slash_command 读写权限并发布版本)` });
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
// ---- 插件管理(本机页面即可操作;与飞书端 /plugin 命令同一执行器) ----
|
|
418
|
+
// managed 模式双目录:自管目录(bridge)+ 本机 ~/.claude(user)。会话加载合并两处
|
|
419
|
+
//(index.ts discoverPlugins 合并);安装默认装 ~/.claude(与本机 claude CLI 共用一份)
|
|
420
|
+
if (path.startsWith('/api/plugins')) {
|
|
421
|
+
if (firstRun)
|
|
422
|
+
return json(res, 404, { error: '尚无配置文件,请先完成 bootstrap' });
|
|
423
|
+
let config;
|
|
424
|
+
try {
|
|
425
|
+
config = loadConfig(ctx.configPath);
|
|
426
|
+
}
|
|
427
|
+
catch (e) {
|
|
428
|
+
return json(res, 500, { error: `配置加载失败:${e instanceof Error ? e.message : String(e)}` });
|
|
429
|
+
}
|
|
430
|
+
const bridgeDir = resolveClaudeDir(config);
|
|
431
|
+
const userDir = DEFAULT_CLAUDE_DIR;
|
|
432
|
+
const sameDir = bridgeDir === userDir;
|
|
433
|
+
if (path === '/api/plugins' && req.method === 'GET') {
|
|
434
|
+
const from = (dir, source) => listInstalledPlugins(dir).map((p) => ({ ...p, source }));
|
|
435
|
+
return json(res, 200, {
|
|
436
|
+
configDir: bridgeDir,
|
|
437
|
+
userDir,
|
|
438
|
+
// inherit 模式两目录相同 → 单份(source=user);managed 合并两处各自可启停
|
|
439
|
+
plugins: sameDir ? from(bridgeDir, 'user') : [...from(bridgeDir, 'bridge'), ...from(userDir, 'user')],
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
if (path === '/api/plugins/action' && req.method === 'POST') {
|
|
443
|
+
const body = await readJsonBody(req);
|
|
444
|
+
const arg = String(body.arg ?? '').trim();
|
|
445
|
+
const op = String(body.op ?? '');
|
|
446
|
+
// 目标目录:enable/disable/uninstall 前端按插件来源传 dir;install/marketplace 缺省装本机 ~/.claude
|
|
447
|
+
const dir = body.dir === 'bridge' ? bridgeDir : userDir;
|
|
448
|
+
const argsTable = {
|
|
449
|
+
install: arg ? ['install', arg] : [],
|
|
450
|
+
uninstall: arg ? ['uninstall', arg] : [],
|
|
451
|
+
enable: arg ? ['enable', arg] : [],
|
|
452
|
+
disable: arg ? ['disable', arg] : [],
|
|
453
|
+
'marketplace-add': arg ? ['marketplace', 'add', arg] : [],
|
|
454
|
+
'marketplace-remove': arg ? ['marketplace', 'remove', arg] : [],
|
|
455
|
+
'marketplace-update': ['marketplace', 'update', ...(arg ? [arg] : [])],
|
|
456
|
+
};
|
|
457
|
+
const args = argsTable[op];
|
|
458
|
+
if (!args || args.length === 0)
|
|
459
|
+
return json(res, 400, { error: `操作 ${op || '(空)'} 需要参数或未知` });
|
|
460
|
+
const r = await runPluginCli(args, { claudeConfigDir: dir });
|
|
461
|
+
invalidatePluginCache(bridgeDir);
|
|
462
|
+
if (!sameDir)
|
|
463
|
+
invalidatePluginCache(userDir);
|
|
464
|
+
return json(res, 200, r);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
// ---- 桥接器进程启停(页面托管)。embedded 与 lcb ui 独立模式语义不同:embedded 停止/重启
|
|
468
|
+
// 会连带本页所在进程,先回响应再走 selfStop 优雅关闭;独立模式经 PID 文件跨进程操作 ----
|
|
469
|
+
if (path === '/api/bridge/action' && req.method === 'POST') {
|
|
470
|
+
if (firstRun)
|
|
471
|
+
return json(res, 400, { error: '尚无配置文件(首次安装),请先完成 bootstrap 向导' });
|
|
472
|
+
const body = await readJsonBody(req);
|
|
473
|
+
const op = String(body.op ?? '');
|
|
474
|
+
const st = bridgeStatus();
|
|
475
|
+
if (op === 'start') {
|
|
476
|
+
if (ctx.embedded)
|
|
477
|
+
return json(res, 409, { error: '桥接器已随本页运行,无需启动' });
|
|
478
|
+
if (st.running)
|
|
479
|
+
return json(res, 409, { error: `桥接器已在运行(PID ${st.pid})` });
|
|
480
|
+
const r = spawnBridgeDetached();
|
|
481
|
+
if (!r.ok)
|
|
482
|
+
return json(res, 400, { error: r.error });
|
|
483
|
+
return json(res, 200, { ok: true, pid: r.pid, message: '桥接器已在后台启动(运行日志见 ~/.lark-claudecode-bridge/bridge.log)' });
|
|
484
|
+
}
|
|
485
|
+
if (op === 'stop' || op === 'restart') {
|
|
486
|
+
if (ctx.embedded && !ctx.selfStop)
|
|
487
|
+
return json(res, 500, { error: '内部错误:embedded 模式未注入 selfStop' });
|
|
488
|
+
if (ctx.embedded && ctx.selfStop) {
|
|
489
|
+
if (op === 'restart') {
|
|
490
|
+
// 旧进程退出后由 detached helper 拉起新进程(含等待端口释放),页面轮询 /api/status 自动恢复
|
|
491
|
+
const r = restartBridgeWithHelper(process.pid);
|
|
492
|
+
if (!r.ok)
|
|
493
|
+
return json(res, 400, { error: r.error });
|
|
494
|
+
json(res, 200, { ok: true, message: '正在重启,页面将短暂失联后自动恢复' });
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
json(res, 200, { ok: true, message: '正在停止,本配置页将随桥接器进程一同关闭' });
|
|
498
|
+
}
|
|
499
|
+
setTimeout(ctx.selfStop, 300); // 先让响应 flush 出去再退出进程
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
if (op === 'stop') {
|
|
503
|
+
if (!st.running)
|
|
504
|
+
return json(res, 409, { error: '桥接器未在运行' });
|
|
505
|
+
return json(res, 200, { ok: stopBridgeByPid(st.pid), message: '已发送停止信号' });
|
|
506
|
+
}
|
|
507
|
+
if (st.running) {
|
|
508
|
+
const r = restartBridgeWithHelper(st.pid);
|
|
509
|
+
if (!r.ok)
|
|
510
|
+
return json(res, 400, { error: r.error });
|
|
511
|
+
return json(res, 200, { ok: true, message: '正在重启桥接器(本页不受影响,稍后状态自动更新)' });
|
|
512
|
+
}
|
|
513
|
+
const r = spawnBridgeDetached();
|
|
514
|
+
if (!r.ok)
|
|
515
|
+
return json(res, 400, { error: r.error });
|
|
516
|
+
return json(res, 200, { ok: true, pid: r.pid, message: '桥接器未在运行,已在后台启动' });
|
|
517
|
+
}
|
|
518
|
+
return json(res, 400, { error: `未知 op "${op}"(支持 start / stop / restart)` });
|
|
519
|
+
}
|
|
520
|
+
// ---- 版本检查与一键更新(npm view / npm install -g,registry 镜像跟随用户 .npmrc) ----
|
|
521
|
+
if (path === '/api/update/check' && req.method === 'GET') {
|
|
522
|
+
try {
|
|
523
|
+
return json(res, 200, { ...await checkUpdate(), mode: installMode() });
|
|
524
|
+
}
|
|
525
|
+
catch (e) {
|
|
526
|
+
return json(res, 502, { error: `检查更新失败:${e instanceof Error ? e.message : String(e)}(网络离线或 registry 不可达?可稍后重试)` });
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
if (path === '/api/update/run' && req.method === 'POST') {
|
|
530
|
+
if (installMode() !== 'global') {
|
|
531
|
+
return json(res, 400, { error: '检测到当前非 npm 安装目录运行(如源码运行),一键更新会装出另一份全局副本而非更新当前实例,请手动更新' });
|
|
532
|
+
}
|
|
533
|
+
try {
|
|
534
|
+
const output = await runUpdate();
|
|
535
|
+
return json(res, 200, { ok: true, output });
|
|
536
|
+
}
|
|
537
|
+
catch (e) {
|
|
538
|
+
return json(res, 502, { error: `更新失败:${e instanceof Error ? e.message : String(e)}` });
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
return json(res, 404, { error: `未知端点 ${req.method} ${path}` });
|
|
542
|
+
}
|
|
543
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const PKG_NAME = "@jesonliu/lark-claudecode-bridge";
|
|
2
|
+
/** win32 下 npm 是 npm.cmd(execFile 无 PATHEXT 处理),走 cmd /c——open-browser.ts 同款先例 */
|
|
3
|
+
export declare function npmCommand(): {
|
|
4
|
+
file: string;
|
|
5
|
+
prefixArgs: string[];
|
|
6
|
+
};
|
|
7
|
+
export interface UpdateCheck {
|
|
8
|
+
current: string;
|
|
9
|
+
latest: string;
|
|
10
|
+
hasUpdate: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** 纯函数(可测):从 `npm view <pkg> version` 输出解析版本号——取最后一行非空并去 json 引号(旧 npm 习惯) */
|
|
13
|
+
export declare function parseLatestVersion(out: string): string;
|
|
14
|
+
/** 纯函数(可测):三段语义化版本比较,latest 严格大于 current 才算有更新(镜像落后于本地时不算) */
|
|
15
|
+
export declare function hasNewerVersion(latest: string, current: string): boolean;
|
|
16
|
+
export declare function checkUpdate(): Promise<UpdateCheck>;
|
|
17
|
+
/** 执行全局更新(npm install -g pkg@latest);返回 npm 输出供页面展示。耗时 1-2 分钟属正常 */
|
|
18
|
+
export declare function runUpdate(): Promise<string>;
|
|
19
|
+
export type InstallMode = 'global' | 'other';
|
|
20
|
+
/** 纯函数(可测):模块目录是否位于 npm 安装的包目录内 */
|
|
21
|
+
export declare function detectInstallMode(moduleDir: string): InstallMode;
|
|
22
|
+
/**
|
|
23
|
+
* 安装方式探测:非 npm 安装(源码运行等)时 npm i -g 会装出另一份全局副本,
|
|
24
|
+
* 并非更新当前运行实例——页面据此提示手动更新而非一键更新
|
|
25
|
+
*/
|
|
26
|
+
export declare function installMode(): InstallMode;
|