lark-bridge-mcp 2.5.2 → 2.5.8
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/dist/daemon-scheduled-tasks.js +1 -2
- package/dist/daemon-scheduled-tasks.js.map +1 -1
- package/dist/daemon.js +368 -23
- package/dist/daemon.js.map +1 -1
- package/dist/file-queue.d.ts +15 -4
- package/dist/file-queue.js +61 -15
- package/dist/file-queue.js.map +1 -1
- package/dist/server-admin.d.ts +2 -0
- package/dist/server-admin.js +221 -0
- package/dist/server-admin.js.map +1 -0
- package/dist/server.js +38 -11
- package/dist/server.js.map +1 -1
- package/dist/shared/lark-core.d.ts +21 -4
- package/dist/shared/lark-core.js +66 -23
- package/dist/shared/lark-core.js.map +1 -1
- package/package.json +1 -1
|
@@ -149,7 +149,6 @@ function reloadTasks(cb) {
|
|
|
149
149
|
log(`无活跃定时任务 (共 ${tasks.length} 个)`);
|
|
150
150
|
return;
|
|
151
151
|
}
|
|
152
|
-
log(`加载 ${enabled.length} 个定时任务`);
|
|
153
152
|
for (const task of enabled) {
|
|
154
153
|
if (!isValidCron(task.cron)) {
|
|
155
154
|
log(`无效的 cron 表达式: "${task.cron}" (任务: ${task.name})`);
|
|
@@ -206,7 +205,7 @@ export function startDaemonScheduledTasks(enqueue, launchIndependent) {
|
|
|
206
205
|
const cb = { enqueue, launchIndependent };
|
|
207
206
|
reloadTasks(cb);
|
|
208
207
|
startFileWatcher(cb);
|
|
209
|
-
log(`调度器已启动 (${scheduledTasksSnapshot.length}
|
|
208
|
+
log(`调度器已启动 (${scheduledTasksSnapshot.length} 个活跃任务)`);
|
|
210
209
|
}
|
|
211
210
|
export function stopDaemonScheduledTasks() {
|
|
212
211
|
const count = scheduledTasksSnapshot.length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-scheduled-tasks.js","sourceRoot":"","sources":["../src/daemon-scheduled-tasks.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"daemon-scheduled-tasks.js","sourceRoot":"","sources":["../src/daemon-scheduled-tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as http from "node:http";
|
|
2
2
|
import * as fs from "node:fs";
|
|
3
3
|
import * as path from "node:path";
|
|
4
|
+
import * as os from "node:os";
|
|
4
5
|
import { createRequire } from "node:module";
|
|
5
6
|
import { startDaemonScheduledTasks, stopDaemonScheduledTasks, setDaemonSchedulerLogger, } from "./daemon-scheduled-tasks.js";
|
|
6
7
|
import { stripProxyEnv, localTimestamp, createLarkClient, LarkSender } from "./shared/lark-core.js";
|
|
7
|
-
import { initFileQueue as _initFileQueue, getQueueDir, pushToFileQueue,
|
|
8
|
+
import { initFileQueue as _initFileQueue, getQueueDir, pushToFileQueue, claimNextMessageText, pollFileQueueBatchText, getQueueLength as getFileQueueLength, getQueueMessages as getFileQueueMessages, getDistinctChatIds, cleanupStaleMessages, } from "./file-queue.js";
|
|
8
9
|
const _require = createRequire(import.meta.url);
|
|
9
10
|
const PKG_VERSION = _require("../package.json").version;
|
|
10
11
|
// ── 环境变量 ──────────────────────────────────────────────
|
|
@@ -68,14 +69,14 @@ function initFileQueue() {
|
|
|
68
69
|
log("INFO", `共享文件队列: ${dir}`);
|
|
69
70
|
cleanupStaleMessages();
|
|
70
71
|
}
|
|
71
|
-
function pushMessage(content, messageId) {
|
|
72
|
+
function pushMessage(content, messageId, chatId, chatType) {
|
|
72
73
|
if (!content?.trim()) {
|
|
73
74
|
log("WARN", `丢弃空消息 (messageId=${messageId})`);
|
|
74
75
|
return;
|
|
75
76
|
}
|
|
76
|
-
const written = pushToFileQueue(content, messageId, `daemon-${process.pid}
|
|
77
|
+
const written = pushToFileQueue(content, messageId, `daemon-${process.pid}`, chatId, chatType);
|
|
77
78
|
if (written) {
|
|
78
|
-
log("INFO", `消息已写入共享队列: ${JSON.stringify(content)} (id=${messageId ?? "none"})`);
|
|
79
|
+
log("INFO", `消息已写入共享队列: ${JSON.stringify(content)} (id=${messageId ?? "none"}, chat=${chatId ?? "none"})`);
|
|
79
80
|
}
|
|
80
81
|
else {
|
|
81
82
|
log("INFO", `消息已跳过(重复或写入失败): id=${messageId ?? "none"}`);
|
|
@@ -101,26 +102,39 @@ function clearFileQueue() {
|
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
104
|
// ── 飞书 WebSocket 长连接 ────────────────────────────────
|
|
105
|
+
function isBotMentioned(ev) {
|
|
106
|
+
return ev.mentions.some((m) => m.name === "" || m.key === "@_all" || m.id === "");
|
|
107
|
+
}
|
|
108
|
+
function stripMentionTags(text) {
|
|
109
|
+
return text.replace(/@_user_\d+/g, "").replace(/\s{2,}/g, " ").trim();
|
|
110
|
+
}
|
|
104
111
|
function startLarkConnection() {
|
|
105
112
|
if (!APP_ID || !APP_SECRET) {
|
|
106
113
|
log("ERROR", "LARK_APP_ID / LARK_APP_SECRET 未配置");
|
|
107
114
|
return;
|
|
108
115
|
}
|
|
109
|
-
sender.startConnection(APP_ID, APP_SECRET, ENCRYPT_KEY, (
|
|
110
|
-
|
|
116
|
+
sender.startConnection(APP_ID, APP_SECRET, ENCRYPT_KEY, (ev) => {
|
|
117
|
+
const { text, messageId, chatId, chatType, messageType, rawContent, senderOpenId, mentions } = ev;
|
|
118
|
+
if (chatType === "p2p" && senderOpenId && !sender.resolvedTarget) {
|
|
111
119
|
sender.autoOpenId = senderOpenId;
|
|
120
|
+
log("INFO", `自动识别用户 open_id: ${senderOpenId}`);
|
|
112
121
|
}
|
|
113
|
-
if (
|
|
114
|
-
|
|
122
|
+
if (chatType === "group" && mentions.length === 0) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const cleanText = chatType === "group" ? stripMentionTags(text) : text;
|
|
126
|
+
log("INFO", `收到消息 [${chatType}] chat=${chatId} sender=${senderOpenId ?? "?"}: ${cleanText.slice(0, 100)}`);
|
|
127
|
+
if (messageType === "text" && isCommand(cleanText)) {
|
|
128
|
+
handleCommand(cleanText, messageId).catch((e) => log("ERROR", `指令处理失败: ${e?.message ?? e}`));
|
|
115
129
|
return;
|
|
116
130
|
}
|
|
117
131
|
if (messageType === "image" || messageType === "post") {
|
|
118
132
|
sender.processIncomingMessage(messageId, messageType, rawContent)
|
|
119
|
-
.then((result) => pushMessage(result, messageId))
|
|
120
|
-
.catch(() => pushMessage(
|
|
133
|
+
.then((result) => pushMessage(result, messageId, chatId, chatType))
|
|
134
|
+
.catch(() => pushMessage(cleanText, messageId, chatId, chatType));
|
|
121
135
|
}
|
|
122
136
|
else {
|
|
123
|
-
pushMessage(
|
|
137
|
+
pushMessage(cleanText, messageId, chatId, chatType);
|
|
124
138
|
}
|
|
125
139
|
});
|
|
126
140
|
}
|
|
@@ -132,6 +146,7 @@ const COMMANDS = {
|
|
|
132
146
|
"/task": "定时任务(/task 查看子命令说明;如 /task ls)",
|
|
133
147
|
"/model": "Cursor CLI 模型(/model ls | info | set <序号>)",
|
|
134
148
|
"/mcp": "MCP 服务器管理(/mcp ls | info | enable | disable | delete | add)",
|
|
149
|
+
"/workspace": "切换工作目录(/workspace 查看当前 | /workspace set <路径>)",
|
|
135
150
|
"/clean": "清空消息队列",
|
|
136
151
|
"/reset": "下次拉起 Agent 时不使用 --continue(新 CLI 会话),不删除本地文件",
|
|
137
152
|
"/restart": "停止 Agent + 清空队列 + 重启 Daemon",
|
|
@@ -288,6 +303,8 @@ function startHttpServer() {
|
|
|
288
303
|
const pathname = reqUrl.pathname;
|
|
289
304
|
const method = req.method;
|
|
290
305
|
try {
|
|
306
|
+
if (await handleAdminApi(pathname, method, req, res))
|
|
307
|
+
return;
|
|
291
308
|
if (method === "GET" && (pathname === "/health" || pathname === "/status")) {
|
|
292
309
|
cleanExpiredCommands();
|
|
293
310
|
json(res, {
|
|
@@ -349,17 +366,24 @@ function startHttpServer() {
|
|
|
349
366
|
return;
|
|
350
367
|
}
|
|
351
368
|
if (method === "GET" && pathname === "/dequeue") {
|
|
352
|
-
|
|
369
|
+
const chatIdFilter = reqUrl.searchParams.get("chatId") || undefined;
|
|
370
|
+
json(res, { message: claimNextMessageText(chatIdFilter), queueLength: getFileQueueLength() });
|
|
353
371
|
return;
|
|
354
372
|
}
|
|
355
373
|
if (method === "POST" && pathname === "/dequeue-all") {
|
|
374
|
+
const body = await readBody(req).catch(() => "{}");
|
|
375
|
+
const { chatId: filterChat } = JSON.parse(body || "{}");
|
|
356
376
|
const messages = [];
|
|
357
377
|
let m;
|
|
358
|
-
while ((m =
|
|
378
|
+
while ((m = claimNextMessageText(filterChat)) !== null)
|
|
359
379
|
messages.push(m);
|
|
360
380
|
json(res, { ok: true, messages, queueLength: getFileQueueLength() });
|
|
361
381
|
return;
|
|
362
382
|
}
|
|
383
|
+
if (method === "GET" && pathname === "/queue-chat-ids") {
|
|
384
|
+
json(res, { chatIds: getDistinctChatIds() });
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
363
387
|
if (method === "GET" && pathname === "/commands") {
|
|
364
388
|
json(res, { commands: getPendingCommands() });
|
|
365
389
|
return;
|
|
@@ -380,9 +404,10 @@ function startHttpServer() {
|
|
|
380
404
|
}
|
|
381
405
|
if (method === "GET" && pathname === "/poll") {
|
|
382
406
|
const timeout = Number(reqUrl.searchParams.get("timeout") ?? "20000");
|
|
407
|
+
const chatIdFilter = reqUrl.searchParams.get("chatId") || undefined;
|
|
383
408
|
let disconnected = false;
|
|
384
409
|
req.on("close", () => { disconnected = true; });
|
|
385
|
-
const reply = await
|
|
410
|
+
const reply = await pollFileQueueBatchText(timeout, undefined, chatIdFilter);
|
|
386
411
|
if (disconnected && reply !== null) {
|
|
387
412
|
pushToFileQueue(reply);
|
|
388
413
|
log("WARN", `/poll 连接断开,消息放回队列`);
|
|
@@ -407,6 +432,333 @@ function startHttpServer() {
|
|
|
407
432
|
});
|
|
408
433
|
});
|
|
409
434
|
}
|
|
435
|
+
// ── 管理 API 辅助函数 ────────────────────────────────────
|
|
436
|
+
const HOME_DIR = os.homedir();
|
|
437
|
+
const GLOBAL_MCP_PATH = path.join(HOME_DIR, ".cursor", "mcp.json");
|
|
438
|
+
const PROJECT_MCP_PATH = path.join(WORKSPACE_DIR, ".cursor", "mcp.json");
|
|
439
|
+
const RULES_DIR = path.join(WORKSPACE_DIR, ".cursor", "rules");
|
|
440
|
+
const SKILLS_DIR = path.join(HOME_DIR, ".cursor", "skills");
|
|
441
|
+
const TASKS_FILE = path.join(HOME_DIR, ".lark-bridge-mcp", "scheduled-tasks.json");
|
|
442
|
+
function readJsonSafe(filePath) {
|
|
443
|
+
try {
|
|
444
|
+
if (fs.existsSync(filePath))
|
|
445
|
+
return JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
446
|
+
}
|
|
447
|
+
catch { /* ignore */ }
|
|
448
|
+
return null;
|
|
449
|
+
}
|
|
450
|
+
function writeJsonSafe(filePath, data) {
|
|
451
|
+
const dir = path.dirname(filePath);
|
|
452
|
+
if (!fs.existsSync(dir))
|
|
453
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
454
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8");
|
|
455
|
+
}
|
|
456
|
+
function readTasks() {
|
|
457
|
+
const data = readJsonSafe(TASKS_FILE);
|
|
458
|
+
return Array.isArray(data) ? data : [];
|
|
459
|
+
}
|
|
460
|
+
function writeTasks(tasks) {
|
|
461
|
+
writeJsonSafe(TASKS_FILE, tasks);
|
|
462
|
+
}
|
|
463
|
+
// ── 管理 API 路由处理 ────────────────────────────────────
|
|
464
|
+
async function handleAdminApi(pathname, method, req, res) {
|
|
465
|
+
if (!pathname.startsWith("/api/"))
|
|
466
|
+
return false;
|
|
467
|
+
if (method === "GET" && pathname === "/api/status") {
|
|
468
|
+
const tasks = readTasks();
|
|
469
|
+
json(res, {
|
|
470
|
+
daemon: { running: true, version: PKG_VERSION, uptime: Math.floor(process.uptime()), port: daemonPort },
|
|
471
|
+
queue: { length: getFileQueueLength() },
|
|
472
|
+
tasks: { total: tasks.length, enabled: tasks.filter((t) => t.enabled).length },
|
|
473
|
+
feishu: { connected: true, hasTarget: !!sender.getTarget() },
|
|
474
|
+
});
|
|
475
|
+
return true;
|
|
476
|
+
}
|
|
477
|
+
// ── MCP 管理 ──
|
|
478
|
+
if (pathname === "/api/mcp") {
|
|
479
|
+
if (method === "GET") {
|
|
480
|
+
const globalCfg = readJsonSafe(GLOBAL_MCP_PATH);
|
|
481
|
+
const projectCfg = readJsonSafe(PROJECT_MCP_PATH);
|
|
482
|
+
const servers = {};
|
|
483
|
+
if (globalCfg?.mcpServers) {
|
|
484
|
+
for (const [k, v] of Object.entries(globalCfg.mcpServers))
|
|
485
|
+
servers[k] = { config: v, scope: "global" };
|
|
486
|
+
}
|
|
487
|
+
if (projectCfg?.mcpServers) {
|
|
488
|
+
for (const [k, v] of Object.entries(projectCfg.mcpServers))
|
|
489
|
+
servers[k] = { config: v, scope: "project" };
|
|
490
|
+
}
|
|
491
|
+
json(res, { ok: true, servers });
|
|
492
|
+
return true;
|
|
493
|
+
}
|
|
494
|
+
if (method === "POST") {
|
|
495
|
+
const body = JSON.parse(await readBody(req));
|
|
496
|
+
const { action, name, config, scope } = body;
|
|
497
|
+
const targetPath = (scope ?? "global") === "project" ? PROJECT_MCP_PATH : GLOBAL_MCP_PATH;
|
|
498
|
+
if (action === "add") {
|
|
499
|
+
if (!name || !config) {
|
|
500
|
+
json(res, { ok: false, error: "name and config required" }, 400);
|
|
501
|
+
return true;
|
|
502
|
+
}
|
|
503
|
+
let parsed;
|
|
504
|
+
try {
|
|
505
|
+
parsed = JSON.parse(config);
|
|
506
|
+
}
|
|
507
|
+
catch {
|
|
508
|
+
json(res, { ok: false, error: "invalid config JSON" }, 400);
|
|
509
|
+
return true;
|
|
510
|
+
}
|
|
511
|
+
const mcpJson = readJsonSafe(targetPath) ?? {};
|
|
512
|
+
if (!mcpJson.mcpServers)
|
|
513
|
+
mcpJson.mcpServers = {};
|
|
514
|
+
mcpJson.mcpServers[name] = parsed;
|
|
515
|
+
writeJsonSafe(targetPath, mcpJson);
|
|
516
|
+
json(res, { ok: true, message: `${name} saved` });
|
|
517
|
+
return true;
|
|
518
|
+
}
|
|
519
|
+
if (action === "delete") {
|
|
520
|
+
if (!name) {
|
|
521
|
+
json(res, { ok: false, error: "name required" }, 400);
|
|
522
|
+
return true;
|
|
523
|
+
}
|
|
524
|
+
for (const p of [GLOBAL_MCP_PATH, PROJECT_MCP_PATH]) {
|
|
525
|
+
const mcpJson = readJsonSafe(p);
|
|
526
|
+
if (mcpJson?.mcpServers?.[name]) {
|
|
527
|
+
delete mcpJson.mcpServers[name];
|
|
528
|
+
writeJsonSafe(p, mcpJson);
|
|
529
|
+
json(res, { ok: true, message: `${name} deleted` });
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
json(res, { ok: false, error: "not found" }, 404);
|
|
534
|
+
return true;
|
|
535
|
+
}
|
|
536
|
+
json(res, { ok: false, error: "unknown action" }, 400);
|
|
537
|
+
return true;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
// ── Rules 管理 ──
|
|
541
|
+
if (pathname === "/api/rules") {
|
|
542
|
+
if (method === "GET") {
|
|
543
|
+
if (!fs.existsSync(RULES_DIR)) {
|
|
544
|
+
json(res, { ok: true, rules: [] });
|
|
545
|
+
return true;
|
|
546
|
+
}
|
|
547
|
+
const files = fs.readdirSync(RULES_DIR).filter((f) => f.endsWith(".mdc") || f.endsWith(".md"));
|
|
548
|
+
json(res, { ok: true, rules: files });
|
|
549
|
+
return true;
|
|
550
|
+
}
|
|
551
|
+
if (method === "POST") {
|
|
552
|
+
const body = JSON.parse(await readBody(req));
|
|
553
|
+
const { action, name, content } = body;
|
|
554
|
+
if (action === "read") {
|
|
555
|
+
if (!name) {
|
|
556
|
+
json(res, { ok: false, error: "name required" }, 400);
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
const fp = path.join(RULES_DIR, name);
|
|
560
|
+
if (!fs.existsSync(fp)) {
|
|
561
|
+
json(res, { ok: false, error: "not found" }, 404);
|
|
562
|
+
return true;
|
|
563
|
+
}
|
|
564
|
+
json(res, { ok: true, content: fs.readFileSync(fp, "utf-8") });
|
|
565
|
+
return true;
|
|
566
|
+
}
|
|
567
|
+
if (action === "save") {
|
|
568
|
+
if (!name || content === undefined) {
|
|
569
|
+
json(res, { ok: false, error: "name and content required" }, 400);
|
|
570
|
+
return true;
|
|
571
|
+
}
|
|
572
|
+
let fileName = name.trim();
|
|
573
|
+
if (!fileName.endsWith(".mdc") && !fileName.endsWith(".md"))
|
|
574
|
+
fileName += ".mdc";
|
|
575
|
+
if (!fs.existsSync(RULES_DIR))
|
|
576
|
+
fs.mkdirSync(RULES_DIR, { recursive: true });
|
|
577
|
+
fs.writeFileSync(path.join(RULES_DIR, fileName), content, "utf-8");
|
|
578
|
+
json(res, { ok: true, message: `${fileName} saved` });
|
|
579
|
+
return true;
|
|
580
|
+
}
|
|
581
|
+
if (action === "delete") {
|
|
582
|
+
if (!name) {
|
|
583
|
+
json(res, { ok: false, error: "name required" }, 400);
|
|
584
|
+
return true;
|
|
585
|
+
}
|
|
586
|
+
const fp = path.join(RULES_DIR, name);
|
|
587
|
+
if (!fs.existsSync(fp)) {
|
|
588
|
+
json(res, { ok: false, error: "not found" }, 404);
|
|
589
|
+
return true;
|
|
590
|
+
}
|
|
591
|
+
fs.unlinkSync(fp);
|
|
592
|
+
json(res, { ok: true, message: `${name} deleted` });
|
|
593
|
+
return true;
|
|
594
|
+
}
|
|
595
|
+
json(res, { ok: false, error: "unknown action" }, 400);
|
|
596
|
+
return true;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
// ── Skills 管理 ──
|
|
600
|
+
if (pathname === "/api/skills") {
|
|
601
|
+
if (method === "GET") {
|
|
602
|
+
if (!fs.existsSync(SKILLS_DIR)) {
|
|
603
|
+
json(res, { ok: true, skills: [] });
|
|
604
|
+
return true;
|
|
605
|
+
}
|
|
606
|
+
const dirs = fs.readdirSync(SKILLS_DIR, { withFileTypes: true }).filter((d) => d.isDirectory());
|
|
607
|
+
const skills = dirs.map((d) => {
|
|
608
|
+
const skillFile = path.join(SKILLS_DIR, d.name, "SKILL.md");
|
|
609
|
+
const preview = fs.existsSync(skillFile) ? fs.readFileSync(skillFile, "utf-8").split("\n")[0].slice(0, 80) : "";
|
|
610
|
+
return { name: d.name, preview };
|
|
611
|
+
});
|
|
612
|
+
json(res, { ok: true, skills });
|
|
613
|
+
return true;
|
|
614
|
+
}
|
|
615
|
+
if (method === "POST") {
|
|
616
|
+
const body = JSON.parse(await readBody(req));
|
|
617
|
+
const { action, name, content } = body;
|
|
618
|
+
if (action === "read") {
|
|
619
|
+
if (!name) {
|
|
620
|
+
json(res, { ok: false, error: "name required" }, 400);
|
|
621
|
+
return true;
|
|
622
|
+
}
|
|
623
|
+
const fp = path.join(SKILLS_DIR, name, "SKILL.md");
|
|
624
|
+
if (!fs.existsSync(fp)) {
|
|
625
|
+
json(res, { ok: false, error: "not found" }, 404);
|
|
626
|
+
return true;
|
|
627
|
+
}
|
|
628
|
+
json(res, { ok: true, content: fs.readFileSync(fp, "utf-8") });
|
|
629
|
+
return true;
|
|
630
|
+
}
|
|
631
|
+
if (action === "save") {
|
|
632
|
+
if (!name || content === undefined) {
|
|
633
|
+
json(res, { ok: false, error: "name and content required" }, 400);
|
|
634
|
+
return true;
|
|
635
|
+
}
|
|
636
|
+
const dir = path.join(SKILLS_DIR, name.trim());
|
|
637
|
+
if (!fs.existsSync(dir))
|
|
638
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
639
|
+
fs.writeFileSync(path.join(dir, "SKILL.md"), content, "utf-8");
|
|
640
|
+
json(res, { ok: true, message: `${name} saved` });
|
|
641
|
+
return true;
|
|
642
|
+
}
|
|
643
|
+
if (action === "delete") {
|
|
644
|
+
if (!name) {
|
|
645
|
+
json(res, { ok: false, error: "name required" }, 400);
|
|
646
|
+
return true;
|
|
647
|
+
}
|
|
648
|
+
const dir = path.join(SKILLS_DIR, name);
|
|
649
|
+
if (!fs.existsSync(dir)) {
|
|
650
|
+
json(res, { ok: false, error: "not found" }, 404);
|
|
651
|
+
return true;
|
|
652
|
+
}
|
|
653
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
654
|
+
json(res, { ok: true, message: `${name} deleted` });
|
|
655
|
+
return true;
|
|
656
|
+
}
|
|
657
|
+
json(res, { ok: false, error: "unknown action" }, 400);
|
|
658
|
+
return true;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
// ── Tasks 管理 ──
|
|
662
|
+
if (pathname === "/api/tasks") {
|
|
663
|
+
if (method === "GET") {
|
|
664
|
+
json(res, { ok: true, tasks: readTasks() });
|
|
665
|
+
return true;
|
|
666
|
+
}
|
|
667
|
+
if (method === "POST") {
|
|
668
|
+
const body = JSON.parse(await readBody(req));
|
|
669
|
+
const { action, id, name, cron, content, enabled, independent } = body;
|
|
670
|
+
const tasks = readTasks();
|
|
671
|
+
if (action === "add") {
|
|
672
|
+
if (!name || !cron || !content) {
|
|
673
|
+
json(res, { ok: false, error: "name, cron, content required" }, 400);
|
|
674
|
+
return true;
|
|
675
|
+
}
|
|
676
|
+
const newTask = { id: crypto.randomUUID(), name: name.trim(), cron: cron.trim(), content, enabled: enabled ?? true, independent: independent ?? true };
|
|
677
|
+
tasks.push(newTask);
|
|
678
|
+
writeTasks(tasks);
|
|
679
|
+
json(res, { ok: true, task: newTask });
|
|
680
|
+
return true;
|
|
681
|
+
}
|
|
682
|
+
if (!id) {
|
|
683
|
+
json(res, { ok: false, error: "id required" }, 400);
|
|
684
|
+
return true;
|
|
685
|
+
}
|
|
686
|
+
const idx = tasks.findIndex((t) => t.id === id);
|
|
687
|
+
if (idx === -1) {
|
|
688
|
+
json(res, { ok: false, error: "task not found" }, 404);
|
|
689
|
+
return true;
|
|
690
|
+
}
|
|
691
|
+
if (action === "update") {
|
|
692
|
+
if (name !== undefined)
|
|
693
|
+
tasks[idx].name = name.trim();
|
|
694
|
+
if (cron !== undefined)
|
|
695
|
+
tasks[idx].cron = cron.trim();
|
|
696
|
+
if (content !== undefined)
|
|
697
|
+
tasks[idx].content = content;
|
|
698
|
+
if (enabled !== undefined)
|
|
699
|
+
tasks[idx].enabled = enabled;
|
|
700
|
+
if (independent !== undefined)
|
|
701
|
+
tasks[idx].independent = independent;
|
|
702
|
+
writeTasks(tasks);
|
|
703
|
+
json(res, { ok: true, task: tasks[idx] });
|
|
704
|
+
return true;
|
|
705
|
+
}
|
|
706
|
+
if (action === "delete") {
|
|
707
|
+
const removed = tasks.splice(idx, 1)[0];
|
|
708
|
+
writeTasks(tasks);
|
|
709
|
+
json(res, { ok: true, removed });
|
|
710
|
+
return true;
|
|
711
|
+
}
|
|
712
|
+
if (action === "toggle") {
|
|
713
|
+
tasks[idx].enabled = !tasks[idx].enabled;
|
|
714
|
+
writeTasks(tasks);
|
|
715
|
+
json(res, { ok: true, task: tasks[idx] });
|
|
716
|
+
return true;
|
|
717
|
+
}
|
|
718
|
+
json(res, { ok: false, error: "unknown action" }, 400);
|
|
719
|
+
return true;
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
// ── Workspace 管理 ──
|
|
723
|
+
if (pathname === "/api/workspace") {
|
|
724
|
+
if (method === "GET") {
|
|
725
|
+
json(res, { ok: true, workspaceDir: WORKSPACE_DIR });
|
|
726
|
+
return true;
|
|
727
|
+
}
|
|
728
|
+
if (method === "POST") {
|
|
729
|
+
const body = JSON.parse(await readBody(req));
|
|
730
|
+
const { dir } = body;
|
|
731
|
+
if (!dir?.trim()) {
|
|
732
|
+
json(res, { ok: false, error: "dir is required" }, 400);
|
|
733
|
+
return true;
|
|
734
|
+
}
|
|
735
|
+
const msgId = `api-ws-${Date.now()}`;
|
|
736
|
+
pushCommandToQueue(`/workspace set ${dir.trim()}`, msgId, "mcp-api");
|
|
737
|
+
json(res, { ok: true, message: "workspace change accepted, restarting...", dir: dir.trim() });
|
|
738
|
+
return true;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
// ── Agent 控制 ──
|
|
742
|
+
if (pathname === "/api/agent" && method === "POST") {
|
|
743
|
+
const body = JSON.parse(await readBody(req));
|
|
744
|
+
const { action } = body;
|
|
745
|
+
const supportedActions = ["stop", "restart", "reset", "clean"];
|
|
746
|
+
if (action === "clean") {
|
|
747
|
+
const cleared = clearFileQueue();
|
|
748
|
+
json(res, { ok: true, cleared });
|
|
749
|
+
return true;
|
|
750
|
+
}
|
|
751
|
+
if (supportedActions.includes(action)) {
|
|
752
|
+
const msgId = `api-${Date.now()}`;
|
|
753
|
+
pushCommandToQueue(`/${action}`, msgId, `mcp-api`);
|
|
754
|
+
json(res, { ok: true, message: `/${action} command queued` });
|
|
755
|
+
return true;
|
|
756
|
+
}
|
|
757
|
+
json(res, { ok: false, error: `unknown action, supported: ${supportedActions.join(", ")}` }, 400);
|
|
758
|
+
return true;
|
|
759
|
+
}
|
|
760
|
+
return false;
|
|
761
|
+
}
|
|
410
762
|
// ── Lock 文件 ────────────────────────────────────────────
|
|
411
763
|
function getLockFilePath() {
|
|
412
764
|
return path.join(WORKSPACE_DIR, ".cursor", ".lark-daemon.json");
|
|
@@ -420,14 +772,12 @@ function writeLockFile(port) {
|
|
|
420
772
|
pid: process.pid, port, version: PKG_VERSION,
|
|
421
773
|
startedAt: localTimestamp(), workspaceDir: WORKSPACE_DIR,
|
|
422
774
|
}));
|
|
423
|
-
log("INFO", `Lock 文件已写入: ${lockPath}`);
|
|
424
775
|
}
|
|
425
776
|
function removeLockFile() {
|
|
426
777
|
try {
|
|
427
778
|
const lockPath = getLockFilePath();
|
|
428
779
|
if (fs.existsSync(lockPath)) {
|
|
429
780
|
fs.unlinkSync(lockPath);
|
|
430
|
-
log("INFO", "Lock 文件已清理");
|
|
431
781
|
}
|
|
432
782
|
}
|
|
433
783
|
catch { /* ignore */ }
|
|
@@ -438,14 +788,9 @@ export async function daemonMain() {
|
|
|
438
788
|
log("ERROR", "LARK_APP_ID / LARK_APP_SECRET 未配置");
|
|
439
789
|
process.exit(1);
|
|
440
790
|
}
|
|
441
|
-
|
|
442
|
-
log("INFO", `已剥离代理环境变量 (${savedProxyKeys.join(", ")}),飞书连接将直连`);
|
|
443
|
-
}
|
|
444
|
-
log("INFO", "════════════════════════════════════════════════");
|
|
445
|
-
log("INFO", `lark-bridge-daemon v${PKG_VERSION} 启动`);
|
|
791
|
+
log("INFO", `Daemon v${PKG_VERSION} 启动`);
|
|
446
792
|
log("INFO", `workspace: ${WORKSPACE_DIR}`);
|
|
447
793
|
log("INFO", `日志文件: ${LOG_FILE_PATH}`);
|
|
448
|
-
log("INFO", "════════════════════════════════════════════════");
|
|
449
794
|
const cleanup = () => {
|
|
450
795
|
stopDaemonScheduledTasks();
|
|
451
796
|
removeLockFile();
|
|
@@ -464,6 +809,6 @@ export async function daemonMain() {
|
|
|
464
809
|
const payload = JSON.stringify({ taskId, taskName, content });
|
|
465
810
|
process.stdout.write(`__IND_LAUNCH__:${payload}\n`);
|
|
466
811
|
});
|
|
467
|
-
log("INFO",
|
|
812
|
+
log("INFO", `Daemon 就绪 ✓ port=${daemonPort}`);
|
|
468
813
|
}
|
|
469
814
|
//# sourceMappingURL=daemon.js.map
|