@sonicbotman/lobster-press 3.2.2 → 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +147 -51
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -464,15 +464,15 @@ detail = lobster_expand(db, "sum_abc123")
|
|
|
464
464
|
| 操作 | 性能 | 备注 |
|
|
465
465
|
|------|------|------|
|
|
466
466
|
| 消息入库 | <5ms | 含 TF-IDF 评分 + 类型分类 |
|
|
467
|
-
| FTS5 搜索 | <10ms |
|
|
467
|
+
| FTS5 搜索 | <10ms | ⚠️ 待修复:当前版本存在问题(Issue #111)|
|
|
468
468
|
| Light 压缩 | 0ms | 余弦相似度去重,无 LLM 调用 |
|
|
469
469
|
| DAG 压缩 | ~2s/1K tokens | Claude 3.5 Sonnet API |
|
|
470
470
|
| 矛盾检测 | <100ms | 规则降级模式(零依赖) |
|
|
471
471
|
|
|
472
472
|
**压缩效果**:
|
|
473
|
-
-
|
|
473
|
+
- 实测压缩比 ~3x(1K 消息测试),理论最大值取决于 LLM 摘要质量
|
|
474
474
|
- 保留 100% 原始消息(无损)
|
|
475
|
-
-
|
|
475
|
+
- 关键信息保留率:待验证
|
|
476
476
|
|
|
477
477
|
---
|
|
478
478
|
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAoO7D,QAAA,MAAM,aAAa;;;;;qBAOF,OAAO;;kBASR,iBAAiB;CAiDhC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,75 +3,171 @@
|
|
|
3
3
|
*
|
|
4
4
|
* DAG-based conversation summarization with Ebbinghaus forgetting curve,
|
|
5
5
|
* semantic notes, contradiction detection.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1 IPC Refactor (Issue #115):
|
|
8
|
+
* - Ready handshake from Python
|
|
9
|
+
* - Request ID routing for concurrent requests
|
|
10
|
+
* - Clean failure on child process exit
|
|
6
11
|
*/
|
|
7
12
|
import { spawn } from "node:child_process";
|
|
8
13
|
import { join } from "node:path";
|
|
9
14
|
import { Type } from "@sinclair/typebox";
|
|
10
|
-
//
|
|
15
|
+
// ─── Global State ────────────────────────────────────────────────────────────
|
|
11
16
|
let mcpProcess = null;
|
|
12
17
|
let mcpReady = false;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
18
|
+
let bootPromise = null;
|
|
19
|
+
let stdoutBuffer = "";
|
|
20
|
+
const pendingRequests = new Map();
|
|
21
|
+
// ─── IPC Helpers ─────────────────────────────────────────────────────────────
|
|
22
|
+
function generateRequestId() {
|
|
23
|
+
return `lobster-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
24
|
+
}
|
|
25
|
+
function handleStdoutLine(line) {
|
|
26
|
+
let msg;
|
|
27
|
+
try {
|
|
28
|
+
msg = JSON.parse(line);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Ready handshake from Python
|
|
34
|
+
if (msg.type === "lobster-press/ready") {
|
|
35
|
+
mcpReady = true;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Route response by requestId
|
|
39
|
+
const requestId = msg.requestId;
|
|
40
|
+
if (!requestId)
|
|
41
|
+
return;
|
|
42
|
+
const pending = pendingRequests.get(requestId);
|
|
43
|
+
if (!pending)
|
|
44
|
+
return;
|
|
45
|
+
clearTimeout(pending.timer);
|
|
46
|
+
pendingRequests.delete(requestId);
|
|
47
|
+
if (msg.status === "error") {
|
|
48
|
+
pending.reject(new Error(typeof msg.error === "string" ? msg.error : JSON.stringify(msg.error)));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
pending.resolve(msg);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function attachStdoutDispatcher(proc) {
|
|
55
|
+
if (!proc.stdout)
|
|
56
|
+
return;
|
|
57
|
+
if (proc.stdout.__lobsterDispatcherAttached)
|
|
58
|
+
return;
|
|
59
|
+
proc.stdout.__lobsterDispatcherAttached = true;
|
|
60
|
+
proc.stdout.on("data", (chunk) => {
|
|
61
|
+
stdoutBuffer += chunk.toString("utf8");
|
|
62
|
+
const lines = stdoutBuffer.split("\n");
|
|
63
|
+
stdoutBuffer = lines.pop() ?? "";
|
|
64
|
+
for (const raw of lines) {
|
|
65
|
+
const line = raw.trim();
|
|
66
|
+
if (!line)
|
|
67
|
+
continue;
|
|
68
|
+
handleStdoutLine(line);
|
|
69
|
+
}
|
|
30
70
|
});
|
|
31
|
-
|
|
32
|
-
mcpProcess.on("exit", () => {
|
|
71
|
+
proc.on("exit", (code) => {
|
|
33
72
|
mcpProcess = null;
|
|
34
73
|
mcpReady = false;
|
|
74
|
+
bootPromise = null;
|
|
75
|
+
// Fail all pending requests
|
|
76
|
+
for (const [, pending] of pendingRequests) {
|
|
77
|
+
clearTimeout(pending.timer);
|
|
78
|
+
pending.reject(new Error(`lobster-press MCP exited: code=${code ?? "unknown"}`));
|
|
79
|
+
}
|
|
80
|
+
pendingRequests.clear();
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async function ensureMcpServer(config) {
|
|
84
|
+
if (mcpProcess && mcpReady)
|
|
85
|
+
return mcpProcess;
|
|
86
|
+
if (bootPromise)
|
|
87
|
+
return bootPromise;
|
|
88
|
+
bootPromise = new Promise((resolve, reject) => {
|
|
89
|
+
const dbPath = config.dbPath ||
|
|
90
|
+
join(process.env.HOME ?? "~", ".openclaw/lobster.db");
|
|
91
|
+
const pythonCmd = process.env.LOBSTER_PYTHON ?? "python3";
|
|
92
|
+
const proc = spawn(pythonCmd, [
|
|
93
|
+
"-m",
|
|
94
|
+
"mcp_server.lobster_mcp_server",
|
|
95
|
+
"--db",
|
|
96
|
+
dbPath,
|
|
97
|
+
"--provider",
|
|
98
|
+
config.llmProvider || "",
|
|
99
|
+
"--model",
|
|
100
|
+
config.llmModel || "",
|
|
101
|
+
], {
|
|
102
|
+
env: {
|
|
103
|
+
...process.env,
|
|
104
|
+
LOBSTER_LLM_API_KEY: config.llmApiKey ||
|
|
105
|
+
process.env.LOBSTER_LLM_API_KEY ||
|
|
106
|
+
"",
|
|
107
|
+
},
|
|
108
|
+
stdio: ["pipe", "pipe", "inherit"],
|
|
109
|
+
});
|
|
110
|
+
mcpProcess = proc;
|
|
111
|
+
mcpReady = false;
|
|
112
|
+
attachStdoutDispatcher(proc);
|
|
113
|
+
const startedAt = Date.now();
|
|
114
|
+
const poll = setInterval(() => {
|
|
115
|
+
if (mcpReady) {
|
|
116
|
+
clearInterval(poll);
|
|
117
|
+
resolve(proc);
|
|
118
|
+
}
|
|
119
|
+
else if (Date.now() - startedAt > 10_000) {
|
|
120
|
+
clearInterval(poll);
|
|
121
|
+
bootPromise = null;
|
|
122
|
+
reject(new Error("lobster-press MCP did not become ready within 10s"));
|
|
123
|
+
}
|
|
124
|
+
}, 50);
|
|
125
|
+
proc.once("error", (err) => {
|
|
126
|
+
clearInterval(poll);
|
|
127
|
+
bootPromise = null;
|
|
128
|
+
reject(err);
|
|
129
|
+
});
|
|
130
|
+
proc.once("exit", (code) => {
|
|
131
|
+
if (!mcpReady) {
|
|
132
|
+
clearInterval(poll);
|
|
133
|
+
bootPromise = null;
|
|
134
|
+
reject(new Error(`lobster-press MCP exited before ready: code=${code ?? "unknown"}`));
|
|
135
|
+
}
|
|
136
|
+
});
|
|
35
137
|
});
|
|
36
|
-
|
|
138
|
+
try {
|
|
139
|
+
return await bootPromise;
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
if (mcpReady)
|
|
143
|
+
bootPromise = null;
|
|
144
|
+
}
|
|
37
145
|
}
|
|
38
|
-
/** 向 Python MCP Server 发送请求 */
|
|
39
146
|
async function callMcp(config, toolName, args) {
|
|
40
|
-
const proc = ensureMcpServer(config);
|
|
41
|
-
|
|
147
|
+
const proc = await ensureMcpServer(config);
|
|
148
|
+
const requestId = generateRequestId();
|
|
149
|
+
const response = await new Promise((resolve, reject) => {
|
|
150
|
+
const timer = setTimeout(() => {
|
|
151
|
+
pendingRequests.delete(requestId);
|
|
152
|
+
reject(new Error(`lobster-press MCP tool call timed out after 30s: ${toolName}`));
|
|
153
|
+
}, 30_000);
|
|
154
|
+
pendingRequests.set(requestId, { resolve, reject, timer });
|
|
42
155
|
const request = JSON.stringify({
|
|
43
156
|
method: "tools/call",
|
|
157
|
+
requestId,
|
|
44
158
|
params: { name: toolName, arguments: args },
|
|
45
159
|
}) + "\n";
|
|
46
|
-
let output = "";
|
|
47
|
-
const onData = (chunk) => {
|
|
48
|
-
output += chunk.toString();
|
|
49
|
-
const lines = output.split("\n");
|
|
50
|
-
for (const line of lines.slice(0, -1)) {
|
|
51
|
-
if (line.trim()) {
|
|
52
|
-
proc.stdout?.off("data", onData);
|
|
53
|
-
try {
|
|
54
|
-
const result = JSON.parse(line);
|
|
55
|
-
resolve({
|
|
56
|
-
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
57
|
-
details: result,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
catch (e) {
|
|
61
|
-
reject(e);
|
|
62
|
-
}
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
output = lines[lines.length - 1] ?? "";
|
|
67
|
-
};
|
|
68
|
-
proc.stdout?.on("data", onData);
|
|
69
160
|
proc.stdin?.write(request);
|
|
70
|
-
setTimeout(() => {
|
|
71
|
-
proc.stdout?.off("data", onData);
|
|
72
|
-
reject(new Error("lobster-press MCP tool call timed out after 30s"));
|
|
73
|
-
}, 30_000);
|
|
74
161
|
});
|
|
162
|
+
return {
|
|
163
|
+
content: [
|
|
164
|
+
{
|
|
165
|
+
type: "text",
|
|
166
|
+
text: JSON.stringify(response.result ?? response, null, 2),
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
details: response,
|
|
170
|
+
};
|
|
75
171
|
}
|
|
76
172
|
// ─── Tool Schemas ─────────────────────────────────────────────────────────────
|
|
77
173
|
const LobsterGrepSchema = Type.Object({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|