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.
@@ -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} 个活跃任务,每 ${WATCHDOG_MS / 1000}s 时钟扫描)`);
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, claimNextMessage, pollFileQueueBatch, getQueueLength as getFileQueueLength, getQueueMessages as getFileQueueMessages, cleanupStaleMessages, } from "./file-queue.js";
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, (text, messageId, messageType, rawContent, senderOpenId) => {
110
- if (senderOpenId && !sender.resolvedTarget) {
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 (messageType === "text" && isCommand(text)) {
114
- handleCommand(text, messageId).catch((e) => log("ERROR", `指令处理失败: ${e?.message ?? e}`));
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(text, messageId));
133
+ .then((result) => pushMessage(result, messageId, chatId, chatType))
134
+ .catch(() => pushMessage(cleanText, messageId, chatId, chatType));
121
135
  }
122
136
  else {
123
- pushMessage(text, messageId);
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
- json(res, { message: claimNextMessage(), queueLength: getFileQueueLength() });
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 = claimNextMessage()) !== null)
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 pollFileQueueBatch(timeout);
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
- if (savedProxyKeys.length > 0) {
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", `守护进程就绪 ✓ port=${daemonPort}`);
812
+ log("INFO", `Daemon 就绪 ✓ port=${daemonPort}`);
468
813
  }
469
814
  //# sourceMappingURL=daemon.js.map