lark-bridge-mcp 2.2.8 → 2.3.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/dist/file-queue.d.ts +12 -0
- package/dist/file-queue.js +164 -0
- package/dist/file-queue.js.map +1 -0
- package/dist/server.js +26 -228
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
- package/src/file-queue.ts +149 -0
- package/src/server.ts +29 -217
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function initFileQueue(appId: string): string;
|
|
2
|
+
export declare function getQueueDir(): string;
|
|
3
|
+
export declare function pushToFileQueue(text: string, messageId?: string, source?: string): boolean;
|
|
4
|
+
export declare function claimNextMessage(): string | null;
|
|
5
|
+
export declare function pollFileQueue(timeoutMs: number, intervalMs?: number): Promise<string | null>;
|
|
6
|
+
export declare function pollFileQueueBatch(timeoutMs: number, intervalMs?: number): Promise<string | null>;
|
|
7
|
+
export declare function getQueueLength(): number;
|
|
8
|
+
export declare function getQueueMessages(): {
|
|
9
|
+
index: number;
|
|
10
|
+
preview: string;
|
|
11
|
+
}[];
|
|
12
|
+
export declare function cleanupStaleMessages(): void;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
const POLL_INTERVAL_MS = 400;
|
|
5
|
+
const STALE_MESSAGE_MS = 5 * 60 * 1000;
|
|
6
|
+
let queueDir = "";
|
|
7
|
+
export function initFileQueue(appId) {
|
|
8
|
+
const suffix = appId ? appId.slice(-8) : "default";
|
|
9
|
+
queueDir = path.join(os.homedir(), ".lark-bridge-mcp", `queue-${suffix}`);
|
|
10
|
+
if (!fs.existsSync(queueDir))
|
|
11
|
+
fs.mkdirSync(queueDir, { recursive: true });
|
|
12
|
+
return queueDir;
|
|
13
|
+
}
|
|
14
|
+
export function getQueueDir() {
|
|
15
|
+
return queueDir;
|
|
16
|
+
}
|
|
17
|
+
export function pushToFileQueue(text, messageId, source) {
|
|
18
|
+
if (!queueDir || !text?.trim())
|
|
19
|
+
return false;
|
|
20
|
+
const ts = Date.now();
|
|
21
|
+
const id = messageId || `${ts}-${Math.random().toString(36).slice(2, 8)}`;
|
|
22
|
+
const safeId = id.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
23
|
+
const filename = `${ts}_${safeId}.msg`;
|
|
24
|
+
if (messageId) {
|
|
25
|
+
try {
|
|
26
|
+
const existing = fs.readdirSync(queueDir);
|
|
27
|
+
if (existing.some((f) => f.endsWith(`_${safeId}.msg`) || f.endsWith(`_${safeId}.claimed`))) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch { /* ignore */ }
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const data = JSON.stringify({ text, messageId: id, timestamp: ts, source: source || `pid-${process.pid}` });
|
|
35
|
+
const tmpPath = path.join(queueDir, filename + ".tmp");
|
|
36
|
+
const finalPath = path.join(queueDir, filename);
|
|
37
|
+
fs.writeFileSync(tmpPath, data, "utf-8");
|
|
38
|
+
fs.renameSync(tmpPath, finalPath);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function claimNextMessage() {
|
|
46
|
+
if (!queueDir)
|
|
47
|
+
return null;
|
|
48
|
+
let files;
|
|
49
|
+
try {
|
|
50
|
+
files = fs.readdirSync(queueDir).filter((f) => f.endsWith(".msg")).sort();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
for (const file of files) {
|
|
56
|
+
const srcPath = path.join(queueDir, file);
|
|
57
|
+
const claimedPath = srcPath.replace(/\.msg$/, ".claimed");
|
|
58
|
+
try {
|
|
59
|
+
fs.renameSync(srcPath, claimedPath);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const raw = fs.readFileSync(claimedPath, "utf-8");
|
|
66
|
+
fs.unlinkSync(claimedPath);
|
|
67
|
+
const parsed = JSON.parse(raw);
|
|
68
|
+
return typeof parsed.text === "string" ? parsed.text : raw;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
try {
|
|
72
|
+
fs.unlinkSync(claimedPath);
|
|
73
|
+
}
|
|
74
|
+
catch { /* ignore */ }
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
export function pollFileQueue(timeoutMs, intervalMs = POLL_INTERVAL_MS) {
|
|
81
|
+
return new Promise((resolve) => {
|
|
82
|
+
const immediate = claimNextMessage();
|
|
83
|
+
if (immediate !== null) {
|
|
84
|
+
resolve(immediate);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const deadline = Date.now() + timeoutMs;
|
|
88
|
+
const timer = setInterval(() => {
|
|
89
|
+
const msg = claimNextMessage();
|
|
90
|
+
if (msg !== null) {
|
|
91
|
+
clearInterval(timer);
|
|
92
|
+
resolve(msg);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (Date.now() >= deadline) {
|
|
96
|
+
clearInterval(timer);
|
|
97
|
+
resolve(null);
|
|
98
|
+
}
|
|
99
|
+
}, intervalMs);
|
|
100
|
+
timer.unref();
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
export async function pollFileQueueBatch(timeoutMs, intervalMs = POLL_INTERVAL_MS) {
|
|
104
|
+
const first = await pollFileQueue(timeoutMs, intervalMs);
|
|
105
|
+
if (first === null)
|
|
106
|
+
return null;
|
|
107
|
+
const messages = [first];
|
|
108
|
+
let extra = claimNextMessage();
|
|
109
|
+
while (extra !== null) {
|
|
110
|
+
messages.push(extra);
|
|
111
|
+
extra = claimNextMessage();
|
|
112
|
+
}
|
|
113
|
+
return messages.join("\n");
|
|
114
|
+
}
|
|
115
|
+
export function getQueueLength() {
|
|
116
|
+
if (!queueDir)
|
|
117
|
+
return 0;
|
|
118
|
+
try {
|
|
119
|
+
return fs.readdirSync(queueDir).filter((f) => f.endsWith(".msg")).length;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export function getQueueMessages() {
|
|
126
|
+
if (!queueDir)
|
|
127
|
+
return [];
|
|
128
|
+
try {
|
|
129
|
+
const files = fs.readdirSync(queueDir).filter((f) => f.endsWith(".msg")).sort();
|
|
130
|
+
return files.map((f, i) => {
|
|
131
|
+
try {
|
|
132
|
+
const raw = fs.readFileSync(path.join(queueDir, f), "utf-8");
|
|
133
|
+
const parsed = JSON.parse(raw);
|
|
134
|
+
return { index: i, preview: (parsed.text ?? "").slice(0, 200) };
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return { index: i, preview: "(unreadable)" };
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return [];
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export function cleanupStaleMessages() {
|
|
146
|
+
if (!queueDir)
|
|
147
|
+
return;
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
try {
|
|
150
|
+
for (const f of fs.readdirSync(queueDir)) {
|
|
151
|
+
if (!f.endsWith(".claimed") && !f.endsWith(".tmp"))
|
|
152
|
+
continue;
|
|
153
|
+
const filePath = path.join(queueDir, f);
|
|
154
|
+
try {
|
|
155
|
+
const stat = fs.statSync(filePath);
|
|
156
|
+
if (now - stat.mtimeMs > STALE_MESSAGE_MS)
|
|
157
|
+
fs.unlinkSync(filePath);
|
|
158
|
+
}
|
|
159
|
+
catch { /* ignore */ }
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch { /* ignore */ }
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=file-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-queue.js","sourceRoot":"","sources":["../src/file-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC,IAAI,QAAQ,GAAG,EAAE,CAAC;AAElB,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,SAAkB,EAAE,MAAe;IAC/E,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAE7C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,EAAE,GAAG,SAAS,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,GAAG,EAAE,IAAI,MAAM,MAAM,CAAC;IAEvC,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,MAAM,UAAU,CAAC,CAAC,EAAE,CAAC;gBAC3F,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,OAAO,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5G,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAClD,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,UAAU,GAAG,gBAAgB;IAC5E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACrC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAEvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;YAC/B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACjE,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;QACtE,CAAC,EAAE,UAAU,CAAC,CAAC;QACf,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,UAAU,GAAG,gBAAgB;IACvF,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,KAAK,GAAG,gBAAgB,EAAE,CAAC;IAC/B,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,GAAG,gBAAgB,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAClE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,gBAAgB;oBAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACrE,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import * as http from "node:http";
|
|
5
4
|
import * as net from "node:net";
|
|
6
5
|
import * as fs from "node:fs";
|
|
7
6
|
import * as path from "node:path";
|
|
8
7
|
import * as os from "node:os";
|
|
9
8
|
import * as cp from "node:child_process";
|
|
10
9
|
import * as Lark from "@larksuiteoapi/node-sdk";
|
|
10
|
+
import { initFileQueue, pushToFileQueue, pollFileQueueBatch, cleanupStaleMessages } from "./file-queue.js";
|
|
11
11
|
// ── stdout 保护:MCP 用 stdio 通信,任何非协议输出都会破坏 JSON-RPC 帧 ──
|
|
12
12
|
const _origStdoutWrite = process.stdout.write.bind(process.stdout);
|
|
13
13
|
process.stdout.write = ((chunk, encodingOrCb, cb) => {
|
|
@@ -51,14 +51,6 @@ function log(level, ...args) {
|
|
|
51
51
|
process.stderr.write(`[${localTimestamp()}][${level}] ${msg}\n`);
|
|
52
52
|
}
|
|
53
53
|
// ── 单实例保护(PID 锁 + TCP 端口互斥)─────────────────
|
|
54
|
-
const workspaceDirs = [
|
|
55
|
-
process.env.LARK_WORKSPACE_DIR,
|
|
56
|
-
process.cwd(),
|
|
57
|
-
].filter(Boolean);
|
|
58
|
-
/**
|
|
59
|
-
* PID 文件始终放在用户主目录下,避免因 CWD 不同导致多实例互相看不到。
|
|
60
|
-
* 文件名含 APP_ID 哈希,保证不同应用不冲突。
|
|
61
|
-
*/
|
|
62
54
|
function resolvePidFilePath() {
|
|
63
55
|
const suffix = APP_ID ? `-${APP_ID.slice(-8)}` : "";
|
|
64
56
|
const homeDir = os.homedir();
|
|
@@ -72,7 +64,6 @@ function resolvePidFilePath() {
|
|
|
72
64
|
return path.join(dir, `mcp${suffix}.pid`);
|
|
73
65
|
}
|
|
74
66
|
const MCP_PID_FILE = resolvePidFilePath();
|
|
75
|
-
/** 计算互斥端口号:基于 APP_ID 的确定性端口,范围 49152-65535 */
|
|
76
67
|
function getSingletonPort() {
|
|
77
68
|
const base = APP_ID || "lark-bridge-default";
|
|
78
69
|
let hash = 0;
|
|
@@ -115,7 +106,7 @@ function killPreviousInstance() {
|
|
|
115
106
|
forceKillPid(oldPid);
|
|
116
107
|
setTimeout(() => {
|
|
117
108
|
if (isProcessAlive(oldPid)) {
|
|
118
|
-
log("WARN", `PID=${oldPid}
|
|
109
|
+
log("WARN", `PID=${oldPid} 仍存活,重试...`);
|
|
119
110
|
forceKillPid(oldPid);
|
|
120
111
|
}
|
|
121
112
|
}, 1000);
|
|
@@ -125,7 +116,6 @@ function killPreviousInstance() {
|
|
|
125
116
|
log("WARN", `清理旧进程失败: ${e?.message ?? e}`);
|
|
126
117
|
}
|
|
127
118
|
}
|
|
128
|
-
/** 通过 TCP 端口通知旧实例退出 */
|
|
129
119
|
async function requestOldInstanceShutdown() {
|
|
130
120
|
return new Promise((resolve) => {
|
|
131
121
|
const client = net.createConnection({ port: SINGLETON_PORT, host: "127.0.0.1" }, () => {
|
|
@@ -139,7 +129,6 @@ async function requestOldInstanceShutdown() {
|
|
|
139
129
|
});
|
|
140
130
|
}
|
|
141
131
|
let singletonServer = null;
|
|
142
|
-
/** 启动 TCP 互斥锁服务器 —— 收到 shutdown 立即退出 */
|
|
143
132
|
function startSingletonGuard() {
|
|
144
133
|
singletonServer = net.createServer((socket) => {
|
|
145
134
|
socket.on("data", (data) => {
|
|
@@ -198,70 +187,8 @@ function gracefulShutdown(reason) {
|
|
|
198
187
|
catch { /* ignore */ }
|
|
199
188
|
setTimeout(() => process.exit(0), 300);
|
|
200
189
|
}
|
|
201
|
-
// ── Daemon HTTP 客户端 ──────────────────────────────────
|
|
202
|
-
let daemonBaseUrl = "";
|
|
203
|
-
function findDaemonPort() {
|
|
204
|
-
const envPort = process.env.LARK_DAEMON_PORT;
|
|
205
|
-
if (envPort) {
|
|
206
|
-
const p = Number(envPort);
|
|
207
|
-
if (p > 0) {
|
|
208
|
-
log("INFO", `从 LARK_DAEMON_PORT 环境变量获取端口: ${p}`);
|
|
209
|
-
return p;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
for (const ws of workspaceDirs) {
|
|
213
|
-
const lockPath = path.join(ws, ".cursor", ".lark-daemon.json");
|
|
214
|
-
try {
|
|
215
|
-
const raw = fs.readFileSync(lockPath, "utf-8");
|
|
216
|
-
const data = JSON.parse(raw);
|
|
217
|
-
if (data.port)
|
|
218
|
-
return Number(data.port);
|
|
219
|
-
}
|
|
220
|
-
catch { /* lock not found */ }
|
|
221
|
-
}
|
|
222
|
-
return null;
|
|
223
|
-
}
|
|
224
|
-
function httpRequest(method, urlPath, body, timeoutMs = 30_000) {
|
|
225
|
-
return new Promise((resolve, reject) => {
|
|
226
|
-
const url = new URL(urlPath, daemonBaseUrl);
|
|
227
|
-
const payload = body ? JSON.stringify(body) : undefined;
|
|
228
|
-
const req = http.request(url, {
|
|
229
|
-
method,
|
|
230
|
-
headers: payload
|
|
231
|
-
? { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(payload) }
|
|
232
|
-
: undefined,
|
|
233
|
-
timeout: timeoutMs,
|
|
234
|
-
}, (res) => {
|
|
235
|
-
let data = "";
|
|
236
|
-
res.on("data", (c) => (data += c));
|
|
237
|
-
res.on("end", () => {
|
|
238
|
-
try {
|
|
239
|
-
resolve(JSON.parse(data));
|
|
240
|
-
}
|
|
241
|
-
catch {
|
|
242
|
-
resolve(data);
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
});
|
|
246
|
-
req.on("error", reject);
|
|
247
|
-
req.on("timeout", () => { req.destroy(); reject(new Error("timeout")); });
|
|
248
|
-
if (payload)
|
|
249
|
-
req.write(payload);
|
|
250
|
-
req.end();
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
async function pingDaemon(port) {
|
|
254
|
-
try {
|
|
255
|
-
const resp = await httpRequest("GET", `/health`);
|
|
256
|
-
return resp?.status === "ok";
|
|
257
|
-
}
|
|
258
|
-
catch {
|
|
259
|
-
return false;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
190
|
let resolvedTarget = null;
|
|
263
191
|
let autoOpenId = "";
|
|
264
|
-
let embeddedMode = false;
|
|
265
192
|
const larkClient = new Lark.Client({
|
|
266
193
|
appId: APP_ID, appSecret: APP_SECRET,
|
|
267
194
|
appType: Lark.AppType.SelfBuild,
|
|
@@ -329,7 +256,8 @@ function getSendTarget() {
|
|
|
329
256
|
return { receiveIdType: "open_id", receiveId: autoOpenId };
|
|
330
257
|
return null;
|
|
331
258
|
}
|
|
332
|
-
|
|
259
|
+
// ── 发送(始终直接调用 Lark API)──────────────────────────
|
|
260
|
+
async function sendMessage(text) {
|
|
333
261
|
const target = getSendTarget();
|
|
334
262
|
if (!target) {
|
|
335
263
|
log("WARN", "无发送目标");
|
|
@@ -346,7 +274,7 @@ async function embeddedSendMessage(text) {
|
|
|
346
274
|
log("ERROR", `飞书发送异常: ${e?.message ?? e}`);
|
|
347
275
|
}
|
|
348
276
|
}
|
|
349
|
-
async function
|
|
277
|
+
async function sendImage(imagePath) {
|
|
350
278
|
const target = getSendTarget();
|
|
351
279
|
if (!target) {
|
|
352
280
|
log("WARN", "无发送目标");
|
|
@@ -374,7 +302,7 @@ async function embeddedSendImage(imagePath) {
|
|
|
374
302
|
log("ERROR", `发送图片异常: ${e?.message ?? e}`);
|
|
375
303
|
}
|
|
376
304
|
}
|
|
377
|
-
async function
|
|
305
|
+
async function sendFile(filePath) {
|
|
378
306
|
const target = getSendTarget();
|
|
379
307
|
if (!target) {
|
|
380
308
|
log("WARN", "无发送目标");
|
|
@@ -403,6 +331,7 @@ async function embeddedSendFile(filePath) {
|
|
|
403
331
|
log("ERROR", `发送文件异常: ${e?.message ?? e}`);
|
|
404
332
|
}
|
|
405
333
|
}
|
|
334
|
+
// ── 接收(WebSocket → 共享文件队列 → poll 读取)──────────
|
|
406
335
|
const IMAGE_DOWNLOAD_DIR = path.join(os.tmpdir(), "lark-bridge-images");
|
|
407
336
|
async function downloadLarkImage(messageId, imageKey) {
|
|
408
337
|
try {
|
|
@@ -481,75 +410,18 @@ async function processIncomingMessage(messageId, messageType, content) {
|
|
|
481
410
|
}
|
|
482
411
|
return parts.join("\n");
|
|
483
412
|
}
|
|
484
|
-
const messageQueue = [];
|
|
485
|
-
const pollWaiters = [];
|
|
486
|
-
const processedMessageIds = new Set();
|
|
487
413
|
function pushMessage(content, messageId) {
|
|
488
|
-
if (!content
|
|
414
|
+
if (!content?.trim()) {
|
|
489
415
|
log("WARN", `丢弃空消息 (messageId=${messageId})`);
|
|
490
416
|
return;
|
|
491
417
|
}
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
processedMessageIds.add(messageId);
|
|
496
|
-
if (processedMessageIds.size > 200) {
|
|
497
|
-
const first = processedMessageIds.values().next().value;
|
|
498
|
-
if (first !== undefined)
|
|
499
|
-
processedMessageIds.delete(first);
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
log("INFO", `pushMessage: "${content.slice(0, 60)}", waiters=${pollWaiters.length}, queue=${messageQueue.length}`);
|
|
503
|
-
while (pollWaiters.length > 0) {
|
|
504
|
-
const waiter = pollWaiters.shift();
|
|
505
|
-
clearTimeout(waiter.timer);
|
|
506
|
-
waiter.resolve(content);
|
|
507
|
-
return;
|
|
508
|
-
}
|
|
509
|
-
messageQueue.push(content);
|
|
510
|
-
}
|
|
511
|
-
function drainEmptyMessages() {
|
|
512
|
-
while (messageQueue.length > 0 && !messageQueue[0]?.trim()) {
|
|
513
|
-
messageQueue.shift();
|
|
418
|
+
const written = pushToFileQueue(content, messageId, `mcp-${process.pid}`);
|
|
419
|
+
if (written) {
|
|
420
|
+
log("INFO", `消息已写入共享队列: "${content.slice(0, 60)}" (id=${messageId ?? "none"})`);
|
|
514
421
|
}
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
drainEmptyMessages();
|
|
518
|
-
if (messageQueue.length > 0) {
|
|
519
|
-
const msg = messageQueue.shift();
|
|
520
|
-
log("INFO", `pullMessage: 从队列取出 "${msg.slice(0, 40)}", 剩余=${messageQueue.length}`);
|
|
521
|
-
return Promise.resolve(msg);
|
|
522
|
-
}
|
|
523
|
-
log("INFO", `pullMessage: 队列为空, 创建 waiter (timeout=${timeoutMs}ms)`);
|
|
524
|
-
return new Promise((resolve) => {
|
|
525
|
-
const entry = {
|
|
526
|
-
resolve,
|
|
527
|
-
timer: setTimeout(() => {
|
|
528
|
-
const idx = pollWaiters.indexOf(entry);
|
|
529
|
-
if (idx >= 0)
|
|
530
|
-
pollWaiters.splice(idx, 1);
|
|
531
|
-
log("INFO", `pullMessage: waiter 超时 (${timeoutMs}ms), queue=${messageQueue.length}`);
|
|
532
|
-
resolve(null);
|
|
533
|
-
}, timeoutMs),
|
|
534
|
-
};
|
|
535
|
-
pollWaiters.push(entry);
|
|
536
|
-
});
|
|
537
|
-
}
|
|
538
|
-
async function waitForReply(timeoutMs) {
|
|
539
|
-
const first = await pullMessage(timeoutMs);
|
|
540
|
-
if (first === null)
|
|
541
|
-
return null;
|
|
542
|
-
const messages = [first];
|
|
543
|
-
while (messageQueue.length > 0) {
|
|
544
|
-
const next = messageQueue[0];
|
|
545
|
-
if (!next?.trim()) {
|
|
546
|
-
messageQueue.shift();
|
|
547
|
-
continue;
|
|
548
|
-
}
|
|
549
|
-
messages.push(messageQueue.shift());
|
|
422
|
+
else {
|
|
423
|
+
log("INFO", `消息已跳过(重复或写入失败): id=${messageId ?? "none"}`);
|
|
550
424
|
}
|
|
551
|
-
log("INFO", `waitForReply: 返回 ${messages.length} 条消息, 剩余队列=${messageQueue.length}`);
|
|
552
|
-
return messages.join("\n");
|
|
553
425
|
}
|
|
554
426
|
function startLarkConnection() {
|
|
555
427
|
const eventDispatcher = new Lark.EventDispatcher(ENCRYPT_KEY ? { encryptKey: ENCRYPT_KEY } : {}).register({
|
|
@@ -589,41 +461,8 @@ function startLarkConnection() {
|
|
|
589
461
|
const wsClient = new Lark.WSClient({ appId: APP_ID, appSecret: APP_SECRET, loggerLevel: Lark.LoggerLevel.error });
|
|
590
462
|
wsClient.start({ eventDispatcher }).then(() => log("INFO", "飞书 WebSocket 连接建立成功")).catch((e) => log("ERROR", `飞书 WebSocket 连接失败: ${e?.message ?? e}`));
|
|
591
463
|
}
|
|
592
|
-
// ── 统一 API(daemon 代理 / 内嵌)─────────────────────────
|
|
593
|
-
async function sendMessage(text) {
|
|
594
|
-
if (!embeddedMode) {
|
|
595
|
-
await httpRequest("POST", "/send", { text });
|
|
596
|
-
}
|
|
597
|
-
else {
|
|
598
|
-
await embeddedSendMessage(text);
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
async function sendImage(imagePath) {
|
|
602
|
-
if (!embeddedMode) {
|
|
603
|
-
await httpRequest("POST", "/send-image", { image_path: imagePath });
|
|
604
|
-
}
|
|
605
|
-
else {
|
|
606
|
-
await embeddedSendImage(imagePath);
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
async function sendFile(filePath) {
|
|
610
|
-
if (!embeddedMode) {
|
|
611
|
-
await httpRequest("POST", "/send-file", { file_path: filePath });
|
|
612
|
-
}
|
|
613
|
-
else {
|
|
614
|
-
await embeddedSendFile(filePath);
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
async function pollReply(timeoutMs) {
|
|
618
|
-
if (!embeddedMode) {
|
|
619
|
-
const httpTimeout = timeoutMs + 10_000;
|
|
620
|
-
const resp = await httpRequest("GET", `/poll?timeout=${timeoutMs}`, undefined, httpTimeout);
|
|
621
|
-
return resp?.message ?? null;
|
|
622
|
-
}
|
|
623
|
-
return await waitForReply(timeoutMs);
|
|
624
|
-
}
|
|
625
464
|
// ── MCP Server ──────────────────────────────────────────
|
|
626
|
-
const mcpServer = new McpServer({ name: "feishu-cursor-bridge", version: "2.
|
|
465
|
+
const mcpServer = new McpServer({ name: "feishu-cursor-bridge", version: "2.3.0", description: "飞书消息桥接 – 通过飞书与用户沟通" });
|
|
627
466
|
mcpServer.tool("sync_message", "飞书消息同步工具。传 message 则发送消息;传 timeout_seconds 则等待用户回复;两者同时传则先发送再等待。均不传时仅检查待处理消息。", {
|
|
628
467
|
message: z.string().optional().describe("要发送给用户的消息内容。不传则不发送"),
|
|
629
468
|
timeout_seconds: z.number().optional().describe("等待用户回复的超时秒数。不传则不等待,立即返回"),
|
|
@@ -633,7 +472,7 @@ mcpServer.tool("sync_message", "飞书消息同步工具。传 message 则发送
|
|
|
633
472
|
await sendMessage(message);
|
|
634
473
|
const timeoutMs = (timeout_seconds && timeout_seconds > 0) ? timeout_seconds * 1000 : 0;
|
|
635
474
|
if (timeoutMs > 0) {
|
|
636
|
-
const reply = await
|
|
475
|
+
const reply = await pollFileQueueBatch(timeoutMs);
|
|
637
476
|
if (reply === null)
|
|
638
477
|
return { content: [{ type: "text", text: "[waiting]" }] };
|
|
639
478
|
return { content: [{ type: "text", text: reply }] };
|
|
@@ -648,68 +487,28 @@ mcpServer.tool("sync_message", "飞书消息同步工具。传 message 则发送
|
|
|
648
487
|
mcpServer.tool("send_image", "发送本地图片到飞书。image_path 为本地文件绝对路径。", { image_path: z.string().describe("图片绝对路径") }, async ({ image_path }) => { await sendImage(image_path); return { content: [{ type: "text", text: "图片已发送" }] }; });
|
|
649
488
|
mcpServer.tool("send_file", "发送本地文件到飞书。file_path 为本地文件绝对路径。", { file_path: z.string().describe("文件绝对路径") }, async ({ file_path }) => { await sendFile(file_path); return { content: [{ type: "text", text: "文件已发送" }] }; });
|
|
650
489
|
// ── 主函数 ───────────────────────────────────────────────
|
|
651
|
-
async function tryConnectDaemon(maxRetries = 3, retryDelayMs = 2000) {
|
|
652
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
653
|
-
const port = findDaemonPort();
|
|
654
|
-
if (port) {
|
|
655
|
-
daemonBaseUrl = `http://127.0.0.1:${port}`;
|
|
656
|
-
const alive = await pingDaemon(port);
|
|
657
|
-
if (alive) {
|
|
658
|
-
embeddedMode = false;
|
|
659
|
-
log("INFO", `已连接 daemon (port=${port}),代理模式${attempt > 1 ? ` (第${attempt}次尝试)` : ""}`);
|
|
660
|
-
return true;
|
|
661
|
-
}
|
|
662
|
-
log("WARN", `daemon lock 存在但无响应 (port=${port})${attempt < maxRetries ? ",稍后重试..." : ""}`);
|
|
663
|
-
}
|
|
664
|
-
else {
|
|
665
|
-
log("INFO", `未检测到 daemon${attempt < maxRetries ? ",稍后重试..." : ""}`);
|
|
666
|
-
}
|
|
667
|
-
if (attempt < maxRetries)
|
|
668
|
-
await new Promise((r) => setTimeout(r, retryDelayMs));
|
|
669
|
-
}
|
|
670
|
-
return false;
|
|
671
|
-
}
|
|
672
490
|
export async function main() {
|
|
491
|
+
if (!APP_ID || !APP_SECRET) {
|
|
492
|
+
log("ERROR", "LARK_APP_ID / LARK_APP_SECRET 未配置");
|
|
493
|
+
process.exit(1);
|
|
494
|
+
}
|
|
673
495
|
log("INFO", "════════════════════════════════════════════════");
|
|
674
|
-
log("INFO", `feishu-cursor-bridge MCP v2.
|
|
675
|
-
log("INFO", `workspaceDirs: ${JSON.stringify(workspaceDirs)}`);
|
|
496
|
+
log("INFO", `feishu-cursor-bridge MCP v2.3.0 启动 (PID=${process.pid})`);
|
|
676
497
|
log("INFO", `PID 文件: ${MCP_PID_FILE}`);
|
|
677
498
|
log("INFO", `互斥端口: ${SINGLETON_PORT}`);
|
|
678
499
|
log("INFO", "════════════════════════════════════════════════");
|
|
679
|
-
// 第一步:通过 TCP 端口通知旧实例退出
|
|
680
500
|
await requestOldInstanceShutdown();
|
|
681
|
-
// 第二步:通过 PID 文件兜底杀死旧进程
|
|
682
501
|
killPreviousInstance();
|
|
683
|
-
// 第三步:写入新 PID 并启动互斥守卫
|
|
684
502
|
writePidFile();
|
|
685
503
|
startSingletonGuard();
|
|
686
|
-
const
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
embeddedMode = false;
|
|
692
|
-
daemonBaseUrl = `http://127.0.0.1:${process.env.LARK_DAEMON_PORT}`;
|
|
693
|
-
}
|
|
694
|
-
else {
|
|
695
|
-
log("INFO", "降级为内嵌模式");
|
|
696
|
-
embeddedMode = true;
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
if (embeddedMode) {
|
|
700
|
-
if (!APP_ID || !APP_SECRET) {
|
|
701
|
-
log("ERROR", "LARK_APP_ID / LARK_APP_SECRET 未配置");
|
|
702
|
-
process.exit(1);
|
|
703
|
-
}
|
|
704
|
-
await initSendTarget();
|
|
705
|
-
startLarkConnection();
|
|
706
|
-
}
|
|
504
|
+
const queueDir = initFileQueue(APP_ID);
|
|
505
|
+
log("INFO", `共享文件队列: ${queueDir}`);
|
|
506
|
+
cleanupStaleMessages();
|
|
507
|
+
await initSendTarget();
|
|
508
|
+
startLarkConnection();
|
|
707
509
|
const transport = new StdioServerTransport();
|
|
708
510
|
await mcpServer.connect(transport);
|
|
709
|
-
log("INFO",
|
|
710
|
-
// ── 关键:检测 stdio 断开后强制退出 ──
|
|
711
|
-
// 当 Cursor 关闭会话时 stdin 会关闭,但 Lark WebSocket 保持事件循环存活,
|
|
712
|
-
// 导致进程成为"僵尸"继续抢占飞书消息。
|
|
511
|
+
log("INFO", "MCP Server 已连接 stdio ✓");
|
|
713
512
|
transport.onclose = () => {
|
|
714
513
|
gracefulShutdown("transport-closed");
|
|
715
514
|
};
|
|
@@ -719,7 +518,6 @@ export async function main() {
|
|
|
719
518
|
process.stdin.on("close", () => {
|
|
720
519
|
gracefulShutdown("stdin-close");
|
|
721
520
|
});
|
|
722
|
-
// Windows 下 stdin 可能不触发 end/close,通过 readable 状态轮询兜底
|
|
723
521
|
if (process.platform === "win32") {
|
|
724
522
|
const stdinWatchdog = setInterval(() => {
|
|
725
523
|
if (process.stdin.destroyed || !process.stdin.readable) {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
|
|
5
|
+
const POLL_INTERVAL_MS = 400;
|
|
6
|
+
const STALE_MESSAGE_MS = 5 * 60 * 1000;
|
|
7
|
+
|
|
8
|
+
let queueDir = "";
|
|
9
|
+
|
|
10
|
+
export function initFileQueue(appId: string): string {
|
|
11
|
+
const suffix = appId ? appId.slice(-8) : "default";
|
|
12
|
+
queueDir = path.join(os.homedir(), ".lark-bridge-mcp", `queue-${suffix}`);
|
|
13
|
+
if (!fs.existsSync(queueDir)) fs.mkdirSync(queueDir, { recursive: true });
|
|
14
|
+
return queueDir;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function getQueueDir(): string {
|
|
18
|
+
return queueDir;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function pushToFileQueue(text: string, messageId?: string, source?: string): boolean {
|
|
22
|
+
if (!queueDir || !text?.trim()) return false;
|
|
23
|
+
|
|
24
|
+
const ts = Date.now();
|
|
25
|
+
const id = messageId || `${ts}-${Math.random().toString(36).slice(2, 8)}`;
|
|
26
|
+
const safeId = id.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
27
|
+
const filename = `${ts}_${safeId}.msg`;
|
|
28
|
+
|
|
29
|
+
if (messageId) {
|
|
30
|
+
try {
|
|
31
|
+
const existing = fs.readdirSync(queueDir);
|
|
32
|
+
if (existing.some((f) => f.endsWith(`_${safeId}.msg`) || f.endsWith(`_${safeId}.claimed`))) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
} catch { /* ignore */ }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
const data = JSON.stringify({ text, messageId: id, timestamp: ts, source: source || `pid-${process.pid}` });
|
|
40
|
+
const tmpPath = path.join(queueDir, filename + ".tmp");
|
|
41
|
+
const finalPath = path.join(queueDir, filename);
|
|
42
|
+
fs.writeFileSync(tmpPath, data, "utf-8");
|
|
43
|
+
fs.renameSync(tmpPath, finalPath);
|
|
44
|
+
return true;
|
|
45
|
+
} catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function claimNextMessage(): string | null {
|
|
51
|
+
if (!queueDir) return null;
|
|
52
|
+
|
|
53
|
+
let files: string[];
|
|
54
|
+
try {
|
|
55
|
+
files = fs.readdirSync(queueDir).filter((f) => f.endsWith(".msg")).sort();
|
|
56
|
+
} catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
for (const file of files) {
|
|
61
|
+
const srcPath = path.join(queueDir, file);
|
|
62
|
+
const claimedPath = srcPath.replace(/\.msg$/, ".claimed");
|
|
63
|
+
try {
|
|
64
|
+
fs.renameSync(srcPath, claimedPath);
|
|
65
|
+
} catch {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const raw = fs.readFileSync(claimedPath, "utf-8");
|
|
70
|
+
fs.unlinkSync(claimedPath);
|
|
71
|
+
const parsed = JSON.parse(raw);
|
|
72
|
+
return typeof parsed.text === "string" ? parsed.text : raw;
|
|
73
|
+
} catch {
|
|
74
|
+
try { fs.unlinkSync(claimedPath); } catch { /* ignore */ }
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function pollFileQueue(timeoutMs: number, intervalMs = POLL_INTERVAL_MS): Promise<string | null> {
|
|
82
|
+
return new Promise((resolve) => {
|
|
83
|
+
const immediate = claimNextMessage();
|
|
84
|
+
if (immediate !== null) { resolve(immediate); return; }
|
|
85
|
+
|
|
86
|
+
const deadline = Date.now() + timeoutMs;
|
|
87
|
+
const timer = setInterval(() => {
|
|
88
|
+
const msg = claimNextMessage();
|
|
89
|
+
if (msg !== null) { clearInterval(timer); resolve(msg); return; }
|
|
90
|
+
if (Date.now() >= deadline) { clearInterval(timer); resolve(null); }
|
|
91
|
+
}, intervalMs);
|
|
92
|
+
timer.unref();
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export async function pollFileQueueBatch(timeoutMs: number, intervalMs = POLL_INTERVAL_MS): Promise<string | null> {
|
|
97
|
+
const first = await pollFileQueue(timeoutMs, intervalMs);
|
|
98
|
+
if (first === null) return null;
|
|
99
|
+
|
|
100
|
+
const messages = [first];
|
|
101
|
+
let extra = claimNextMessage();
|
|
102
|
+
while (extra !== null) {
|
|
103
|
+
messages.push(extra);
|
|
104
|
+
extra = claimNextMessage();
|
|
105
|
+
}
|
|
106
|
+
return messages.join("\n");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function getQueueLength(): number {
|
|
110
|
+
if (!queueDir) return 0;
|
|
111
|
+
try {
|
|
112
|
+
return fs.readdirSync(queueDir).filter((f) => f.endsWith(".msg")).length;
|
|
113
|
+
} catch {
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function getQueueMessages(): { index: number; preview: string }[] {
|
|
119
|
+
if (!queueDir) return [];
|
|
120
|
+
try {
|
|
121
|
+
const files = fs.readdirSync(queueDir).filter((f) => f.endsWith(".msg")).sort();
|
|
122
|
+
return files.map((f, i) => {
|
|
123
|
+
try {
|
|
124
|
+
const raw = fs.readFileSync(path.join(queueDir, f), "utf-8");
|
|
125
|
+
const parsed = JSON.parse(raw);
|
|
126
|
+
return { index: i, preview: (parsed.text ?? "").slice(0, 200) };
|
|
127
|
+
} catch {
|
|
128
|
+
return { index: i, preview: "(unreadable)" };
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
} catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function cleanupStaleMessages(): void {
|
|
137
|
+
if (!queueDir) return;
|
|
138
|
+
const now = Date.now();
|
|
139
|
+
try {
|
|
140
|
+
for (const f of fs.readdirSync(queueDir)) {
|
|
141
|
+
if (!f.endsWith(".claimed") && !f.endsWith(".tmp")) continue;
|
|
142
|
+
const filePath = path.join(queueDir, f);
|
|
143
|
+
try {
|
|
144
|
+
const stat = fs.statSync(filePath);
|
|
145
|
+
if (now - stat.mtimeMs > STALE_MESSAGE_MS) fs.unlinkSync(filePath);
|
|
146
|
+
} catch { /* ignore */ }
|
|
147
|
+
}
|
|
148
|
+
} catch { /* ignore */ }
|
|
149
|
+
}
|
package/src/server.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import * as http from "node:http";
|
|
5
4
|
import * as net from "node:net";
|
|
6
5
|
import * as fs from "node:fs";
|
|
7
6
|
import * as path from "node:path";
|
|
8
7
|
import * as os from "node:os";
|
|
9
8
|
import * as cp from "node:child_process";
|
|
10
9
|
import * as Lark from "@larksuiteoapi/node-sdk";
|
|
10
|
+
import { initFileQueue, pushToFileQueue, pollFileQueueBatch, cleanupStaleMessages } from "./file-queue.js";
|
|
11
11
|
|
|
12
12
|
// ── stdout 保护:MCP 用 stdio 通信,任何非协议输出都会破坏 JSON-RPC 帧 ──
|
|
13
13
|
const _origStdoutWrite = process.stdout.write.bind(process.stdout);
|
|
@@ -57,15 +57,6 @@ function log(level: string, ...args: unknown[]): void {
|
|
|
57
57
|
|
|
58
58
|
// ── 单实例保护(PID 锁 + TCP 端口互斥)─────────────────
|
|
59
59
|
|
|
60
|
-
const workspaceDirs = [
|
|
61
|
-
process.env.LARK_WORKSPACE_DIR,
|
|
62
|
-
process.cwd(),
|
|
63
|
-
].filter(Boolean) as string[];
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* PID 文件始终放在用户主目录下,避免因 CWD 不同导致多实例互相看不到。
|
|
67
|
-
* 文件名含 APP_ID 哈希,保证不同应用不冲突。
|
|
68
|
-
*/
|
|
69
60
|
function resolvePidFilePath(): string {
|
|
70
61
|
const suffix = APP_ID ? `-${APP_ID.slice(-8)}` : "";
|
|
71
62
|
const homeDir = os.homedir();
|
|
@@ -78,7 +69,6 @@ function resolvePidFilePath(): string {
|
|
|
78
69
|
|
|
79
70
|
const MCP_PID_FILE = resolvePidFilePath();
|
|
80
71
|
|
|
81
|
-
/** 计算互斥端口号:基于 APP_ID 的确定性端口,范围 49152-65535 */
|
|
82
72
|
function getSingletonPort(): number {
|
|
83
73
|
const base = APP_ID || "lark-bridge-default";
|
|
84
74
|
let hash = 0;
|
|
@@ -115,7 +105,7 @@ function killPreviousInstance(): void {
|
|
|
115
105
|
forceKillPid(oldPid);
|
|
116
106
|
setTimeout(() => {
|
|
117
107
|
if (isProcessAlive(oldPid)) {
|
|
118
|
-
log("WARN", `PID=${oldPid}
|
|
108
|
+
log("WARN", `PID=${oldPid} 仍存活,重试...`);
|
|
119
109
|
forceKillPid(oldPid);
|
|
120
110
|
}
|
|
121
111
|
}, 1000);
|
|
@@ -125,7 +115,6 @@ function killPreviousInstance(): void {
|
|
|
125
115
|
}
|
|
126
116
|
}
|
|
127
117
|
|
|
128
|
-
/** 通过 TCP 端口通知旧实例退出 */
|
|
129
118
|
async function requestOldInstanceShutdown(): Promise<void> {
|
|
130
119
|
return new Promise((resolve) => {
|
|
131
120
|
const client = net.createConnection({ port: SINGLETON_PORT, host: "127.0.0.1" }, () => {
|
|
@@ -141,7 +130,6 @@ async function requestOldInstanceShutdown(): Promise<void> {
|
|
|
141
130
|
|
|
142
131
|
let singletonServer: net.Server | null = null;
|
|
143
132
|
|
|
144
|
-
/** 启动 TCP 互斥锁服务器 —— 收到 shutdown 立即退出 */
|
|
145
133
|
function startSingletonGuard(): void {
|
|
146
134
|
singletonServer = net.createServer((socket) => {
|
|
147
135
|
socket.on("data", (data) => {
|
|
@@ -193,66 +181,12 @@ function gracefulShutdown(reason: string): void {
|
|
|
193
181
|
setTimeout(() => process.exit(0), 300);
|
|
194
182
|
}
|
|
195
183
|
|
|
196
|
-
// ──
|
|
197
|
-
|
|
198
|
-
let daemonBaseUrl = "";
|
|
199
|
-
|
|
200
|
-
function findDaemonPort(): number | null {
|
|
201
|
-
const envPort = process.env.LARK_DAEMON_PORT;
|
|
202
|
-
if (envPort) {
|
|
203
|
-
const p = Number(envPort);
|
|
204
|
-
if (p > 0) { log("INFO", `从 LARK_DAEMON_PORT 环境变量获取端口: ${p}`); return p; }
|
|
205
|
-
}
|
|
206
|
-
for (const ws of workspaceDirs) {
|
|
207
|
-
const lockPath = path.join(ws, ".cursor", ".lark-daemon.json");
|
|
208
|
-
try {
|
|
209
|
-
const raw = fs.readFileSync(lockPath, "utf-8");
|
|
210
|
-
const data = JSON.parse(raw);
|
|
211
|
-
if (data.port) return Number(data.port);
|
|
212
|
-
} catch { /* lock not found */ }
|
|
213
|
-
}
|
|
214
|
-
return null;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
function httpRequest(method: string, urlPath: string, body?: unknown, timeoutMs = 30_000): Promise<any> {
|
|
218
|
-
return new Promise((resolve, reject) => {
|
|
219
|
-
const url = new URL(urlPath, daemonBaseUrl);
|
|
220
|
-
const payload = body ? JSON.stringify(body) : undefined;
|
|
221
|
-
const req = http.request(url, {
|
|
222
|
-
method,
|
|
223
|
-
headers: payload
|
|
224
|
-
? { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(payload) }
|
|
225
|
-
: undefined,
|
|
226
|
-
timeout: timeoutMs,
|
|
227
|
-
}, (res) => {
|
|
228
|
-
let data = "";
|
|
229
|
-
res.on("data", (c) => (data += c));
|
|
230
|
-
res.on("end", () => {
|
|
231
|
-
try { resolve(JSON.parse(data)); }
|
|
232
|
-
catch { resolve(data); }
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
|
-
req.on("error", reject);
|
|
236
|
-
req.on("timeout", () => { req.destroy(); reject(new Error("timeout")); });
|
|
237
|
-
if (payload) req.write(payload);
|
|
238
|
-
req.end();
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
async function pingDaemon(port: number): Promise<boolean> {
|
|
243
|
-
try {
|
|
244
|
-
const resp = await httpRequest("GET", `/health`);
|
|
245
|
-
return resp?.status === "ok";
|
|
246
|
-
} catch { return false; }
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// ── 内嵌模式(无 Daemon 时降级使用)─────────────────────
|
|
184
|
+
// ── Lark Client ─────────────────────────────────────────
|
|
250
185
|
|
|
251
186
|
type ReceiveIdType = "open_id" | "union_id" | "user_id" | "chat_id" | "email";
|
|
252
187
|
interface SendTarget { receiveIdType: ReceiveIdType; receiveId: string }
|
|
253
188
|
let resolvedTarget: SendTarget | null = null;
|
|
254
189
|
let autoOpenId = "";
|
|
255
|
-
let embeddedMode = false;
|
|
256
190
|
|
|
257
191
|
const larkClient = new Lark.Client({
|
|
258
192
|
appId: APP_ID, appSecret: APP_SECRET,
|
|
@@ -307,7 +241,9 @@ function getSendTarget(): SendTarget | null {
|
|
|
307
241
|
return null;
|
|
308
242
|
}
|
|
309
243
|
|
|
310
|
-
|
|
244
|
+
// ── 发送(始终直接调用 Lark API)──────────────────────────
|
|
245
|
+
|
|
246
|
+
async function sendMessage(text: string): Promise<void> {
|
|
311
247
|
const target = getSendTarget();
|
|
312
248
|
if (!target) { log("WARN", "无发送目标"); return; }
|
|
313
249
|
try {
|
|
@@ -319,7 +255,7 @@ async function embeddedSendMessage(text: string): Promise<void> {
|
|
|
319
255
|
} catch (e: any) { log("ERROR", `飞书发送异常: ${e?.message ?? e}`); }
|
|
320
256
|
}
|
|
321
257
|
|
|
322
|
-
async function
|
|
258
|
+
async function sendImage(imagePath: string): Promise<void> {
|
|
323
259
|
const target = getSendTarget();
|
|
324
260
|
if (!target) { log("WARN", "无发送目标"); return; }
|
|
325
261
|
const absPath = path.resolve(imagePath);
|
|
@@ -336,7 +272,7 @@ async function embeddedSendImage(imagePath: string): Promise<void> {
|
|
|
336
272
|
} catch (e: any) { log("ERROR", `发送图片异常: ${e?.message ?? e}`); }
|
|
337
273
|
}
|
|
338
274
|
|
|
339
|
-
async function
|
|
275
|
+
async function sendFile(filePath: string): Promise<void> {
|
|
340
276
|
const target = getSendTarget();
|
|
341
277
|
if (!target) { log("WARN", "无发送目标"); return; }
|
|
342
278
|
const absPath = path.resolve(filePath);
|
|
@@ -354,6 +290,8 @@ async function embeddedSendFile(filePath: string): Promise<void> {
|
|
|
354
290
|
} catch (e: any) { log("ERROR", `发送文件异常: ${e?.message ?? e}`); }
|
|
355
291
|
}
|
|
356
292
|
|
|
293
|
+
// ── 接收(WebSocket → 共享文件队列 → poll 读取)──────────
|
|
294
|
+
|
|
357
295
|
const IMAGE_DOWNLOAD_DIR = path.join(os.tmpdir(), "lark-bridge-images");
|
|
358
296
|
|
|
359
297
|
async function downloadLarkImage(messageId: string, imageKey: string): Promise<string | null> {
|
|
@@ -413,69 +351,17 @@ async function processIncomingMessage(messageId: string, messageType: string, co
|
|
|
413
351
|
return parts.join("\n");
|
|
414
352
|
}
|
|
415
353
|
|
|
416
|
-
const messageQueue: string[] = [];
|
|
417
|
-
const pollWaiters: { resolve: (v: string | null) => void; timer: ReturnType<typeof setTimeout> }[] = [];
|
|
418
|
-
const processedMessageIds = new Set<string>();
|
|
419
|
-
|
|
420
354
|
function pushMessage(content: string, messageId?: string): void {
|
|
421
|
-
if (!content
|
|
355
|
+
if (!content?.trim()) {
|
|
422
356
|
log("WARN", `丢弃空消息 (messageId=${messageId})`);
|
|
423
357
|
return;
|
|
424
358
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
log("INFO", `pushMessage: "${content.slice(0, 60)}", waiters=${pollWaiters.length}, queue=${messageQueue.length}`);
|
|
431
|
-
while (pollWaiters.length > 0) {
|
|
432
|
-
const waiter = pollWaiters.shift()!;
|
|
433
|
-
clearTimeout(waiter.timer);
|
|
434
|
-
waiter.resolve(content);
|
|
435
|
-
return;
|
|
436
|
-
}
|
|
437
|
-
messageQueue.push(content);
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
function drainEmptyMessages(): void {
|
|
441
|
-
while (messageQueue.length > 0 && !messageQueue[0]?.trim()) {
|
|
442
|
-
messageQueue.shift();
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
function pullMessage(timeoutMs: number): Promise<string | null> {
|
|
447
|
-
drainEmptyMessages();
|
|
448
|
-
if (messageQueue.length > 0) {
|
|
449
|
-
const msg = messageQueue.shift()!;
|
|
450
|
-
log("INFO", `pullMessage: 从队列取出 "${msg.slice(0, 40)}", 剩余=${messageQueue.length}`);
|
|
451
|
-
return Promise.resolve(msg);
|
|
452
|
-
}
|
|
453
|
-
log("INFO", `pullMessage: 队列为空, 创建 waiter (timeout=${timeoutMs}ms)`);
|
|
454
|
-
return new Promise((resolve) => {
|
|
455
|
-
const entry = {
|
|
456
|
-
resolve,
|
|
457
|
-
timer: setTimeout(() => {
|
|
458
|
-
const idx = pollWaiters.indexOf(entry);
|
|
459
|
-
if (idx >= 0) pollWaiters.splice(idx, 1);
|
|
460
|
-
log("INFO", `pullMessage: waiter 超时 (${timeoutMs}ms), queue=${messageQueue.length}`);
|
|
461
|
-
resolve(null);
|
|
462
|
-
}, timeoutMs),
|
|
463
|
-
};
|
|
464
|
-
pollWaiters.push(entry);
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
async function waitForReply(timeoutMs: number): Promise<string | null> {
|
|
469
|
-
const first = await pullMessage(timeoutMs);
|
|
470
|
-
if (first === null) return null;
|
|
471
|
-
const messages = [first];
|
|
472
|
-
while (messageQueue.length > 0) {
|
|
473
|
-
const next = messageQueue[0];
|
|
474
|
-
if (!next?.trim()) { messageQueue.shift(); continue; }
|
|
475
|
-
messages.push(messageQueue.shift()!);
|
|
359
|
+
const written = pushToFileQueue(content, messageId, `mcp-${process.pid}`);
|
|
360
|
+
if (written) {
|
|
361
|
+
log("INFO", `消息已写入共享队列: "${content.slice(0, 60)}" (id=${messageId ?? "none"})`);
|
|
362
|
+
} else {
|
|
363
|
+
log("INFO", `消息已跳过(重复或写入失败): id=${messageId ?? "none"}`);
|
|
476
364
|
}
|
|
477
|
-
log("INFO", `waitForReply: 返回 ${messages.length} 条消息, 剩余队列=${messageQueue.length}`);
|
|
478
|
-
return messages.join("\n");
|
|
479
365
|
}
|
|
480
366
|
|
|
481
367
|
function startLarkConnection(): void {
|
|
@@ -516,44 +402,9 @@ function startLarkConnection(): void {
|
|
|
516
402
|
wsClient.start({ eventDispatcher }).then(() => log("INFO", "飞书 WebSocket 连接建立成功")).catch((e: any) => log("ERROR", `飞书 WebSocket 连接失败: ${e?.message ?? e}`));
|
|
517
403
|
}
|
|
518
404
|
|
|
519
|
-
// ── 统一 API(daemon 代理 / 内嵌)─────────────────────────
|
|
520
|
-
|
|
521
|
-
async function sendMessage(text: string): Promise<void> {
|
|
522
|
-
if (!embeddedMode) {
|
|
523
|
-
await httpRequest("POST", "/send", { text });
|
|
524
|
-
} else {
|
|
525
|
-
await embeddedSendMessage(text);
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
async function sendImage(imagePath: string): Promise<void> {
|
|
530
|
-
if (!embeddedMode) {
|
|
531
|
-
await httpRequest("POST", "/send-image", { image_path: imagePath });
|
|
532
|
-
} else {
|
|
533
|
-
await embeddedSendImage(imagePath);
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
async function sendFile(filePath: string): Promise<void> {
|
|
538
|
-
if (!embeddedMode) {
|
|
539
|
-
await httpRequest("POST", "/send-file", { file_path: filePath });
|
|
540
|
-
} else {
|
|
541
|
-
await embeddedSendFile(filePath);
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
async function pollReply(timeoutMs: number): Promise<string | null> {
|
|
546
|
-
if (!embeddedMode) {
|
|
547
|
-
const httpTimeout = timeoutMs + 10_000;
|
|
548
|
-
const resp = await httpRequest("GET", `/poll?timeout=${timeoutMs}`, undefined, httpTimeout);
|
|
549
|
-
return resp?.message ?? null;
|
|
550
|
-
}
|
|
551
|
-
return await waitForReply(timeoutMs);
|
|
552
|
-
}
|
|
553
|
-
|
|
554
405
|
// ── MCP Server ──────────────────────────────────────────
|
|
555
406
|
|
|
556
|
-
const mcpServer = new McpServer({ name: "feishu-cursor-bridge", version: "2.
|
|
407
|
+
const mcpServer = new McpServer({ name: "feishu-cursor-bridge", version: "2.3.0", description: "飞书消息桥接 – 通过飞书与用户沟通" });
|
|
557
408
|
|
|
558
409
|
mcpServer.tool(
|
|
559
410
|
"sync_message",
|
|
@@ -567,7 +418,7 @@ mcpServer.tool(
|
|
|
567
418
|
if (message) await sendMessage(message);
|
|
568
419
|
const timeoutMs = (timeout_seconds && timeout_seconds > 0) ? timeout_seconds * 1000 : 0;
|
|
569
420
|
if (timeoutMs > 0) {
|
|
570
|
-
const reply = await
|
|
421
|
+
const reply = await pollFileQueueBatch(timeoutMs);
|
|
571
422
|
if (reply === null) return { content: [{ type: "text", text: "[waiting]" }] };
|
|
572
423
|
return { content: [{ type: "text", text: reply }] };
|
|
573
424
|
}
|
|
@@ -595,72 +446,34 @@ mcpServer.tool(
|
|
|
595
446
|
|
|
596
447
|
// ── 主函数 ───────────────────────────────────────────────
|
|
597
448
|
|
|
598
|
-
async function
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
daemonBaseUrl = `http://127.0.0.1:${port}`;
|
|
603
|
-
const alive = await pingDaemon(port);
|
|
604
|
-
if (alive) {
|
|
605
|
-
embeddedMode = false;
|
|
606
|
-
log("INFO", `已连接 daemon (port=${port}),代理模式${attempt > 1 ? ` (第${attempt}次尝试)` : ""}`);
|
|
607
|
-
return true;
|
|
608
|
-
}
|
|
609
|
-
log("WARN", `daemon lock 存在但无响应 (port=${port})${attempt < maxRetries ? ",稍后重试..." : ""}`);
|
|
610
|
-
} else {
|
|
611
|
-
log("INFO", `未检测到 daemon${attempt < maxRetries ? ",稍后重试..." : ""}`);
|
|
612
|
-
}
|
|
613
|
-
if (attempt < maxRetries) await new Promise((r) => setTimeout(r, retryDelayMs));
|
|
449
|
+
export async function main(): Promise<void> {
|
|
450
|
+
if (!APP_ID || !APP_SECRET) {
|
|
451
|
+
log("ERROR", "LARK_APP_ID / LARK_APP_SECRET 未配置");
|
|
452
|
+
process.exit(1);
|
|
614
453
|
}
|
|
615
|
-
return false;
|
|
616
|
-
}
|
|
617
454
|
|
|
618
|
-
export async function main(): Promise<void> {
|
|
619
455
|
log("INFO", "════════════════════════════════════════════════");
|
|
620
|
-
log("INFO", `feishu-cursor-bridge MCP v2.
|
|
621
|
-
log("INFO", `workspaceDirs: ${JSON.stringify(workspaceDirs)}`);
|
|
456
|
+
log("INFO", `feishu-cursor-bridge MCP v2.3.0 启动 (PID=${process.pid})`);
|
|
622
457
|
log("INFO", `PID 文件: ${MCP_PID_FILE}`);
|
|
623
458
|
log("INFO", `互斥端口: ${SINGLETON_PORT}`);
|
|
624
459
|
log("INFO", "════════════════════════════════════════════════");
|
|
625
460
|
|
|
626
|
-
// 第一步:通过 TCP 端口通知旧实例退出
|
|
627
461
|
await requestOldInstanceShutdown();
|
|
628
|
-
// 第二步:通过 PID 文件兜底杀死旧进程
|
|
629
462
|
killPreviousInstance();
|
|
630
|
-
// 第三步:写入新 PID 并启动互斥守卫
|
|
631
463
|
writePidFile();
|
|
632
464
|
startSingletonGuard();
|
|
633
465
|
|
|
634
|
-
const
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
if (!connected) {
|
|
638
|
-
if (hasDaemonPortHint) {
|
|
639
|
-
log("ERROR", "应用版模式下 daemon 不可达,MCP 将以纯代理模式运行(无内嵌 WebSocket,避免连接冲突)");
|
|
640
|
-
embeddedMode = false;
|
|
641
|
-
daemonBaseUrl = `http://127.0.0.1:${process.env.LARK_DAEMON_PORT}`;
|
|
642
|
-
} else {
|
|
643
|
-
log("INFO", "降级为内嵌模式");
|
|
644
|
-
embeddedMode = true;
|
|
645
|
-
}
|
|
646
|
-
}
|
|
466
|
+
const queueDir = initFileQueue(APP_ID);
|
|
467
|
+
log("INFO", `共享文件队列: ${queueDir}`);
|
|
468
|
+
cleanupStaleMessages();
|
|
647
469
|
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
log("ERROR", "LARK_APP_ID / LARK_APP_SECRET 未配置");
|
|
651
|
-
process.exit(1);
|
|
652
|
-
}
|
|
653
|
-
await initSendTarget();
|
|
654
|
-
startLarkConnection();
|
|
655
|
-
}
|
|
470
|
+
await initSendTarget();
|
|
471
|
+
startLarkConnection();
|
|
656
472
|
|
|
657
473
|
const transport = new StdioServerTransport();
|
|
658
474
|
await mcpServer.connect(transport);
|
|
659
|
-
log("INFO",
|
|
475
|
+
log("INFO", "MCP Server 已连接 stdio ✓");
|
|
660
476
|
|
|
661
|
-
// ── 关键:检测 stdio 断开后强制退出 ──
|
|
662
|
-
// 当 Cursor 关闭会话时 stdin 会关闭,但 Lark WebSocket 保持事件循环存活,
|
|
663
|
-
// 导致进程成为"僵尸"继续抢占飞书消息。
|
|
664
477
|
transport.onclose = () => {
|
|
665
478
|
gracefulShutdown("transport-closed");
|
|
666
479
|
};
|
|
@@ -670,7 +483,6 @@ export async function main(): Promise<void> {
|
|
|
670
483
|
process.stdin.on("close", () => {
|
|
671
484
|
gracefulShutdown("stdin-close");
|
|
672
485
|
});
|
|
673
|
-
// Windows 下 stdin 可能不触发 end/close,通过 readable 状态轮询兜底
|
|
674
486
|
if (process.platform === "win32") {
|
|
675
487
|
const stdinWatchdog = setInterval(() => {
|
|
676
488
|
if (process.stdin.destroyed || !process.stdin.readable) {
|