kiri-mcp-server 0.25.4 → 0.25.6
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
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> Intelligent code context extraction for LLMs via Model Context Protocol
|
|
4
4
|
|
|
5
|
-
[](package.json)
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](https://www.typescriptlang.org/)
|
|
8
8
|
[](https://modelcontextprotocol.io/)
|
|
@@ -139,10 +139,10 @@ See [CHANGELOG.md](CHANGELOG.md) for release notes.
|
|
|
139
139
|
|
|
140
140
|
**Recent highlights:**
|
|
141
141
|
|
|
142
|
+
- **v0.25.6**: Fix daemon startup deadlock from v0.25.5
|
|
142
143
|
- **v0.25.4**: snippets_get content size handling improvements
|
|
143
144
|
- **v0.25.3**: Query language guidance in MCP tool descriptions (PR #182)
|
|
144
145
|
- **v0.25.2**: Auto reindex on DeserializeDeletes IO corruption (PR #181)
|
|
145
|
-
- **v0.24.4**: Auto reindex on corrupt/incompatible DB (PR #171)
|
|
146
146
|
|
|
147
147
|
---
|
|
148
148
|
|
|
@@ -221,4 +221,4 @@ Built with [Model Context Protocol](https://modelcontextprotocol.io/), [DuckDB](
|
|
|
221
221
|
|
|
222
222
|
---
|
|
223
223
|
|
|
224
|
-
**Status**: v0.25.
|
|
224
|
+
**Status**: v0.25.6 (Beta) - Production-ready for MCP clients
|
package/dist/package.json
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* Daemon Starter Utility
|
|
3
3
|
*
|
|
4
4
|
* Responsible for spawning daemon process in detached mode and waiting for readiness.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: スタートアップロックは daemon 側 (src/daemon/lifecycle.ts) のみが管理する。
|
|
7
|
+
* proxy 側でロックを取得すると、spawnされた daemon がロック取得に失敗して終了する。
|
|
5
8
|
*/
|
|
6
9
|
/**
|
|
7
10
|
* デーモン起動オプション
|
|
@@ -35,7 +38,15 @@ export declare function stopDaemon(databasePath: string): Promise<void>;
|
|
|
35
38
|
/**
|
|
36
39
|
* デーモンプロセスを起動
|
|
37
40
|
*
|
|
38
|
-
*
|
|
41
|
+
* デタッチモードで起動し、ソケットが準備完了するまで待つ。
|
|
42
|
+
* スタートアップロックにより、同時に複数のプロセスがデーモンを起動することを防ぐ。
|
|
43
|
+
*
|
|
44
|
+
* LAW-001: Single Daemon Invariant
|
|
45
|
+
* - 同一データベースパスに対して、常に最大1つのデーモンのみが存在する
|
|
46
|
+
*
|
|
47
|
+
* LAW-002: Exclusive Startup (daemon側で強制)
|
|
48
|
+
* - daemon側がスタートアップロックを管理する (src/daemon/lifecycle.ts)
|
|
49
|
+
* - 複数のproxyが同時にdaemonをspawnしても、1つだけが正常起動する
|
|
39
50
|
*/
|
|
40
51
|
export declare function startDaemon(options: StartDaemonOptions): Promise<void>;
|
|
41
52
|
//# sourceMappingURL=start-daemon.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-daemon.d.ts","sourceRoot":"","sources":["../../../src/client/start-daemon.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"start-daemon.d.ts","sourceRoot":"","sources":["../../../src/client/start-daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAyEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,OAAO,CAAC,CAsFlB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE5E"}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* Daemon Starter Utility
|
|
3
3
|
*
|
|
4
4
|
* Responsible for spawning daemon process in detached mode and waiting for readiness.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: スタートアップロックは daemon 側 (src/daemon/lifecycle.ts) のみが管理する。
|
|
7
|
+
* proxy 側でロックを取得すると、spawnされた daemon がロック取得に失敗して終了する。
|
|
5
8
|
*/
|
|
6
9
|
import { spawn } from "child_process";
|
|
7
10
|
import * as fs from "fs/promises";
|
|
@@ -9,6 +12,57 @@ import * as net from "net";
|
|
|
9
12
|
import * as path from "path";
|
|
10
13
|
import { fileURLToPath } from "url";
|
|
11
14
|
import { getSocketPath } from "../shared/utils/socket.js";
|
|
15
|
+
/**
|
|
16
|
+
* ソケットが準備完了するまでポーリング
|
|
17
|
+
*
|
|
18
|
+
* startDaemonとwaitForDaemonReadyで共通のポーリングロジック
|
|
19
|
+
*
|
|
20
|
+
* @param socketPath - ソケットパス
|
|
21
|
+
* @param readyTimeoutMs - タイムアウト(ミリ秒、未指定時は環境変数または240秒)
|
|
22
|
+
* @param successMessage - 成功時に出力するメッセージ
|
|
23
|
+
*/
|
|
24
|
+
async function pollSocketReady(socketPath, readyTimeoutMs, successMessage) {
|
|
25
|
+
const envTimeoutSeconds = process.env.KIRI_DAEMON_READY_TIMEOUT
|
|
26
|
+
? Number.parseFloat(process.env.KIRI_DAEMON_READY_TIMEOUT)
|
|
27
|
+
: undefined;
|
|
28
|
+
const effectiveTimeoutMs = readyTimeoutMs ??
|
|
29
|
+
(Number.isFinite(envTimeoutSeconds) && envTimeoutSeconds > 0
|
|
30
|
+
? envTimeoutSeconds * 1000
|
|
31
|
+
: 240_000);
|
|
32
|
+
const pollIntervalMs = 500;
|
|
33
|
+
const maxAttempts = Math.max(1, Math.ceil(effectiveTimeoutMs / pollIntervalMs));
|
|
34
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
35
|
+
try {
|
|
36
|
+
// ソケット接続を試みる
|
|
37
|
+
const socket = net.connect(socketPath);
|
|
38
|
+
await new Promise((resolve, reject) => {
|
|
39
|
+
const timeout = setTimeout(() => {
|
|
40
|
+
socket.destroy();
|
|
41
|
+
reject(new Error("Socket connection timeout"));
|
|
42
|
+
}, pollIntervalMs);
|
|
43
|
+
socket.on("connect", () => {
|
|
44
|
+
clearTimeout(timeout);
|
|
45
|
+
socket.end();
|
|
46
|
+
resolve();
|
|
47
|
+
});
|
|
48
|
+
socket.on("error", (err) => {
|
|
49
|
+
clearTimeout(timeout);
|
|
50
|
+
reject(err);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
// 接続成功
|
|
54
|
+
console.error(successMessage);
|
|
55
|
+
return;
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
57
|
+
}
|
|
58
|
+
catch (_err) {
|
|
59
|
+
// まだ準備できていない、再試行
|
|
60
|
+
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// タイムアウト
|
|
64
|
+
throw new Error(`Daemon did not become ready within ${Math.round(effectiveTimeoutMs / 1000)} seconds.`);
|
|
65
|
+
}
|
|
12
66
|
/**
|
|
13
67
|
* デーモンが実行中かチェック
|
|
14
68
|
*
|
|
@@ -158,10 +212,21 @@ export async function stopDaemon(databasePath) {
|
|
|
158
212
|
/**
|
|
159
213
|
* デーモンプロセスを起動
|
|
160
214
|
*
|
|
161
|
-
*
|
|
215
|
+
* デタッチモードで起動し、ソケットが準備完了するまで待つ。
|
|
216
|
+
* スタートアップロックにより、同時に複数のプロセスがデーモンを起動することを防ぐ。
|
|
217
|
+
*
|
|
218
|
+
* LAW-001: Single Daemon Invariant
|
|
219
|
+
* - 同一データベースパスに対して、常に最大1つのデーモンのみが存在する
|
|
220
|
+
*
|
|
221
|
+
* LAW-002: Exclusive Startup (daemon側で強制)
|
|
222
|
+
* - daemon側がスタートアップロックを管理する (src/daemon/lifecycle.ts)
|
|
223
|
+
* - 複数のproxyが同時にdaemonをspawnしても、1つだけが正常起動する
|
|
162
224
|
*/
|
|
163
225
|
export async function startDaemon(options) {
|
|
164
226
|
const { repoRoot, databasePath, socketPath, watchMode, debounceMs, allowDegrade, securityConfigPath, securityLockPath, readyTimeoutMs, } = options;
|
|
227
|
+
// データベースの親ディレクトリを自動作成
|
|
228
|
+
const dbDir = path.dirname(databasePath);
|
|
229
|
+
await fs.mkdir(dbDir, { recursive: true });
|
|
165
230
|
// デーモン実行ファイルのパスを解決
|
|
166
231
|
// 開発時: src/daemon/daemon.ts, ビルド後: dist/src/daemon/daemon.js
|
|
167
232
|
const __filename = fileURLToPath(import.meta.url);
|
|
@@ -184,62 +249,27 @@ export async function startDaemon(options) {
|
|
|
184
249
|
if (securityLockPath) {
|
|
185
250
|
args.push("--security-lock", securityLockPath);
|
|
186
251
|
}
|
|
187
|
-
// データベースの親ディレクトリを自動作成(.kiri/ などが存在しない場合)
|
|
188
|
-
const dbDir = path.dirname(databasePath);
|
|
189
|
-
await fs.mkdir(dbDir, { recursive: true });
|
|
190
252
|
// デーモンログファイル
|
|
191
253
|
const logFilePath = `${databasePath}.daemon.log`;
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const maxAttempts = Math.max(1, Math.ceil(effectiveTimeoutMs / pollIntervalMs));
|
|
211
|
-
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
212
|
-
try {
|
|
213
|
-
// ソケット接続を試みる
|
|
214
|
-
const socket = net.connect(socketPath);
|
|
215
|
-
await new Promise((resolve, reject) => {
|
|
216
|
-
const timeout = setTimeout(() => {
|
|
217
|
-
socket.destroy();
|
|
218
|
-
reject(new Error("Socket connection timeout"));
|
|
219
|
-
}, pollIntervalMs);
|
|
220
|
-
socket.on("connect", () => {
|
|
221
|
-
clearTimeout(timeout);
|
|
222
|
-
socket.end();
|
|
223
|
-
resolve();
|
|
224
|
-
});
|
|
225
|
-
socket.on("error", (err) => {
|
|
226
|
-
clearTimeout(timeout);
|
|
227
|
-
reject(err);
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
// 接続成功
|
|
231
|
-
console.error("[StartDaemon] Daemon is ready");
|
|
232
|
-
await logFile.close();
|
|
233
|
-
return;
|
|
234
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
235
|
-
}
|
|
236
|
-
catch (_err) {
|
|
237
|
-
// まだ準備できていない、再試行
|
|
238
|
-
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
254
|
+
let logFile;
|
|
255
|
+
try {
|
|
256
|
+
logFile = await fs.open(logFilePath, "a");
|
|
257
|
+
// デタッチモードでデーモンを起動
|
|
258
|
+
const daemon = spawn(process.execPath, [daemonScriptPath, ...args], {
|
|
259
|
+
detached: true,
|
|
260
|
+
stdio: ["ignore", logFile.fd, logFile.fd],
|
|
261
|
+
});
|
|
262
|
+
daemon.unref(); // 親プロセスがデーモンの終了を待たない
|
|
263
|
+
console.error(`[StartDaemon] Spawned daemon process (PID: ${daemon.pid})`);
|
|
264
|
+
console.error(`[StartDaemon] Daemon log: ${logFilePath}`);
|
|
265
|
+
// ソケットが準備完了するまで待つ
|
|
266
|
+
await pollSocketReady(socketPath, readyTimeoutMs, "[StartDaemon] Daemon is ready");
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
// logFileハンドルを必ず閉じる
|
|
270
|
+
if (logFile) {
|
|
271
|
+
await logFile.close().catch(() => { });
|
|
239
272
|
}
|
|
240
273
|
}
|
|
241
|
-
// タイムアウト
|
|
242
|
-
await logFile.close();
|
|
243
|
-
throw new Error(`Daemon did not become ready within ${Math.round(effectiveTimeoutMs / 1000)} seconds. Check log: ${logFilePath}`);
|
|
244
274
|
}
|
|
245
275
|
//# sourceMappingURL=start-daemon.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-daemon.js","sourceRoot":"","sources":["../../../src/client/start-daemon.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"start-daemon.js","sourceRoot":"","sources":["../../../src/client/start-daemon.ts"],"names":[],"mappings":"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"}
|