kiri-mcp-server 0.23.0 → 0.24.1
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 +6 -6
- package/dist/package.json +1 -1
- package/dist/src/client/connection-manager.d.ts +151 -0
- package/dist/src/client/connection-manager.d.ts.map +1 -0
- package/dist/src/client/connection-manager.js +375 -0
- package/dist/src/client/connection-manager.js.map +1 -0
- package/dist/src/client/proxy.d.ts +3 -0
- package/dist/src/client/proxy.d.ts.map +1 -1
- package/dist/src/client/proxy.js +149 -25
- package/dist/src/client/proxy.js.map +1 -1
- package/dist/src/client/request-queue.d.ts +103 -0
- package/dist/src/client/request-queue.d.ts.map +1 -0
- package/dist/src/client/request-queue.js +203 -0
- package/dist/src/client/request-queue.js.map +1 -0
- package/dist/src/daemon/lifecycle.d.ts +3 -0
- package/dist/src/daemon/lifecycle.d.ts.map +1 -1
- package/dist/src/daemon/lifecycle.js +97 -1
- package/dist/src/daemon/lifecycle.js.map +1 -1
- package/dist/src/shared/utils/retry.d.ts +16 -1
- package/dist/src/shared/utils/retry.d.ts.map +1 -1
- package/dist/src/shared/utils/retry.js +23 -3
- package/dist/src/shared/utils/retry.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,6 +4,26 @@
|
|
|
4
4
|
* Handles PID file creation, idle timeout, health checks, and graceful shutdown.
|
|
5
5
|
*/
|
|
6
6
|
import * as fs from "fs/promises";
|
|
7
|
+
/**
|
|
8
|
+
* 指定したPIDのプロセスが存在するかチェック
|
|
9
|
+
*
|
|
10
|
+
* @param pid - チェックするプロセスID
|
|
11
|
+
* @returns プロセスが存在する場合はtrue
|
|
12
|
+
*/
|
|
13
|
+
function isProcessRunning(pid) {
|
|
14
|
+
if (!Number.isInteger(pid) || pid <= 0) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
// シグナル0はプロセスを停止せず、存在チェックのみ
|
|
19
|
+
process.kill(pid, 0);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// ESRCHはプロセスが存在しないことを意味
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
7
27
|
/**
|
|
8
28
|
* PIDファイルとスタートアップロックを管理する
|
|
9
29
|
*/
|
|
@@ -47,6 +67,9 @@ export class DaemonLifecycle {
|
|
|
47
67
|
/**
|
|
48
68
|
* スタートアップロックを取得(排他的作成)
|
|
49
69
|
*
|
|
70
|
+
* ロックファイルが存在しても、所有プロセスが死んでいればstale lockとして
|
|
71
|
+
* 自動的にクリーンアップして再取得を試みる。
|
|
72
|
+
*
|
|
50
73
|
* @returns ロック取得に成功した場合はtrue、他のプロセスが既にロック中の場合はfalse
|
|
51
74
|
*/
|
|
52
75
|
async acquireStartupLock() {
|
|
@@ -58,7 +81,80 @@ export class DaemonLifecycle {
|
|
|
58
81
|
}
|
|
59
82
|
catch (err) {
|
|
60
83
|
if (err.code === "EEXIST") {
|
|
61
|
-
|
|
84
|
+
// ロックが stale(所有プロセスが死んでいる)かチェック
|
|
85
|
+
try {
|
|
86
|
+
const existingPidStr = await fs.readFile(this.startupLockPath, "utf-8");
|
|
87
|
+
const existingPid = parseInt(existingPidStr.trim(), 10);
|
|
88
|
+
if (!isNaN(existingPid) && !isProcessRunning(existingPid)) {
|
|
89
|
+
// Stale lock 検出 - 削除前に再検証(TOCTOU対策)
|
|
90
|
+
console.error(`[Daemon] Removing stale startup lock (PID ${existingPid} not running)`);
|
|
91
|
+
// PIDが再利用されていないか再確認
|
|
92
|
+
try {
|
|
93
|
+
const recheckPidStr = await fs.readFile(this.startupLockPath, "utf-8");
|
|
94
|
+
const recheckPid = parseInt(recheckPidStr.trim(), 10);
|
|
95
|
+
// PIDが一致し、まだプロセスが死んでいる場合のみ削除
|
|
96
|
+
if (!isNaN(recheckPid) &&
|
|
97
|
+
recheckPid === existingPid &&
|
|
98
|
+
!isProcessRunning(recheckPid)) {
|
|
99
|
+
await fs.unlink(this.startupLockPath);
|
|
100
|
+
// 再取得を試みる
|
|
101
|
+
try {
|
|
102
|
+
await fs.writeFile(this.startupLockPath, String(process.pid), {
|
|
103
|
+
flag: "wx",
|
|
104
|
+
});
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
catch (retryErr) {
|
|
108
|
+
// 再取得に失敗(他のプロセスが先に取得した)
|
|
109
|
+
if (retryErr.code === "EEXIST") {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
throw retryErr;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (recheckErr) {
|
|
117
|
+
// 再検証中にファイルが消えた(他のプロセスが処理した)
|
|
118
|
+
if (recheckErr.code === "ENOENT") {
|
|
119
|
+
// 消えたので再取得を試みる
|
|
120
|
+
try {
|
|
121
|
+
await fs.writeFile(this.startupLockPath, String(process.pid), {
|
|
122
|
+
flag: "wx",
|
|
123
|
+
});
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
catch (retryErr) {
|
|
127
|
+
if (retryErr.code === "EEXIST") {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
throw retryErr;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
throw recheckErr;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// 生きているプロセスがロックを保持している
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
catch (readErr) {
|
|
140
|
+
// ロックファイルを読めない場合は安全のため取得失敗とする
|
|
141
|
+
if (readErr.code !== "ENOENT") {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
// ENOENTの場合、ファイルが消えたので再取得を試みる
|
|
145
|
+
try {
|
|
146
|
+
await fs.writeFile(this.startupLockPath, String(process.pid), {
|
|
147
|
+
flag: "wx",
|
|
148
|
+
});
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
catch (retryErr) {
|
|
152
|
+
if (retryErr.code === "EEXIST") {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
throw retryErr;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
62
158
|
}
|
|
63
159
|
throw err;
|
|
64
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/daemon/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAElC;;GAEG;AACH,MAAM,OAAO,eAAe;IAYP;IACA;IAZF,WAAW,CAAS;IACpB,eAAe,CAAS;IACxB,WAAW,CAAS;IAC7B,SAAS,GAA0B,IAAI,CAAC;IACxC,iBAAiB,GAAG,CAAC,CAAC;IACtB,eAAe,GAAG,KAAK,CAAC;IACxB,gBAAgB,CAAuB;IAC9B,eAAe,GAAW,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;IACnD,aAAa,GAAW,CAAC,CAAC;IAE3C,YACmB,YAAoB,EACpB,qBAA6B,CAAC;QAD9B,iBAAY,GAAZ,YAAY,CAAQ;QACpB,uBAAkB,GAAlB,kBAAkB,CAAY;QAE/C,IAAI,CAAC,WAAW,GAAG,GAAG,YAAY,aAAa,CAAC;QAChD,IAAI,CAAC,eAAe,GAAG,GAAG,YAAY,kBAAkB,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,GAAG,YAAY,aAAa,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/daemon/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,22 @@ export interface RetryOptions {
|
|
|
2
2
|
maxAttempts: number;
|
|
3
3
|
delayMs: number;
|
|
4
4
|
jitterMs?: number;
|
|
5
|
+
/** 最大遅延時間(ミリ秒)。指数バックオフの上限を設定 */
|
|
6
|
+
maxDelayMs?: number;
|
|
7
|
+
/** バックオフ倍率。指定時は指数バックオフを使用(デフォルト: 1 = 線形) */
|
|
8
|
+
backoffMultiplier?: number;
|
|
5
9
|
isRetriable?: (error: unknown) => boolean;
|
|
6
10
|
}
|
|
7
|
-
|
|
11
|
+
/**
|
|
12
|
+
* 指数バックオフ付きの遅延時間を計算
|
|
13
|
+
*
|
|
14
|
+
* @param baseDelayMs - 基本遅延時間
|
|
15
|
+
* @param attempt - 現在の試行回数(1から始まる)
|
|
16
|
+
* @param backoffMultiplier - バックオフ倍率(デフォルト: 1 = 線形)
|
|
17
|
+
* @param maxDelayMs - 最大遅延時間(上限)
|
|
18
|
+
* @param jitterMs - ジッター(ランダムな追加遅延)
|
|
19
|
+
* @returns 計算された遅延時間(ミリ秒)
|
|
20
|
+
*/
|
|
21
|
+
export declare function calculateBackoffDelay(baseDelayMs: number, attempt: number, backoffMultiplier?: number, maxDelayMs?: number, jitterMs?: number): number;
|
|
22
|
+
export declare function withRetry<T>(operation: () => Promise<T>, { maxAttempts, delayMs, jitterMs, maxDelayMs, backoffMultiplier, isRetriable, }: RetryOptions): Promise<T>;
|
|
8
23
|
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,iBAAiB,GAAE,MAAU,EAC7B,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAU,GACnB,MAAM,CAaR;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,EACE,WAAW,EACX,OAAO,EACP,QAAY,EACZ,UAAU,EACV,iBAAqB,EACrB,WAAW,GACZ,EAAE,YAAY,GACd,OAAO,CAAC,CAAC,CAAC,CAyBZ"}
|
|
@@ -1,4 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 指数バックオフ付きの遅延時間を計算
|
|
3
|
+
*
|
|
4
|
+
* @param baseDelayMs - 基本遅延時間
|
|
5
|
+
* @param attempt - 現在の試行回数(1から始まる)
|
|
6
|
+
* @param backoffMultiplier - バックオフ倍率(デフォルト: 1 = 線形)
|
|
7
|
+
* @param maxDelayMs - 最大遅延時間(上限)
|
|
8
|
+
* @param jitterMs - ジッター(ランダムな追加遅延)
|
|
9
|
+
* @returns 計算された遅延時間(ミリ秒)
|
|
10
|
+
*/
|
|
11
|
+
export function calculateBackoffDelay(baseDelayMs, attempt, backoffMultiplier = 1, maxDelayMs, jitterMs = 0) {
|
|
12
|
+
// 指数バックオフ: baseDelay * (multiplier ^ (attempt - 1))
|
|
13
|
+
// attempt=1 では baseDelay、attempt=2 では baseDelay * multiplier、...
|
|
14
|
+
const exponentialDelay = baseDelayMs * Math.pow(backoffMultiplier, attempt - 1);
|
|
15
|
+
// 最大遅延を適用
|
|
16
|
+
const cappedDelay = maxDelayMs !== undefined ? Math.min(exponentialDelay, maxDelayMs) : exponentialDelay;
|
|
17
|
+
// ジッターを追加
|
|
18
|
+
const jitter = jitterMs > 0 ? Math.random() * jitterMs : 0;
|
|
19
|
+
return cappedDelay + jitter;
|
|
20
|
+
}
|
|
21
|
+
export async function withRetry(operation, { maxAttempts, delayMs, jitterMs = 0, maxDelayMs, backoffMultiplier = 1, isRetriable, }) {
|
|
2
22
|
if (maxAttempts < 1) {
|
|
3
23
|
throw new Error("maxAttempts must be >= 1");
|
|
4
24
|
}
|
|
@@ -11,8 +31,8 @@ export async function withRetry(operation, { maxAttempts, delayMs, jitterMs = 0,
|
|
|
11
31
|
if (!shouldRetry) {
|
|
12
32
|
throw error;
|
|
13
33
|
}
|
|
14
|
-
const
|
|
15
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
34
|
+
const delay = calculateBackoffDelay(delayMs, attempt, backoffMultiplier, maxDelayMs, jitterMs);
|
|
35
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
16
36
|
}
|
|
17
37
|
}
|
|
18
38
|
throw new Error("Retry attempts exhausted");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../../src/shared/utils/retry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../../src/shared/utils/retry.ts"],"names":[],"mappings":"AAWA;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAAmB,EACnB,OAAe,EACf,oBAA4B,CAAC,EAC7B,UAAmB,EACnB,WAAmB,CAAC;IAEpB,oDAAoD;IACpD,iEAAiE;IACjE,MAAM,gBAAgB,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAEhF,UAAU;IACV,MAAM,WAAW,GACf,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAEvF,UAAU;IACV,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,OAAO,WAAW,GAAG,MAAM,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAA2B,EAC3B,EACE,WAAW,EACX,OAAO,EACP,QAAQ,GAAG,CAAC,EACZ,UAAU,EACV,iBAAiB,GAAG,CAAC,EACrB,WAAW,GACE;IAEf,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,OAAO,GAAG,WAAW,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvF,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG,qBAAqB,CACjC,OAAO,EACP,OAAO,EACP,iBAAiB,EACjB,UAAU,EACV,QAAQ,CACT,CAAC;YACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC9C,CAAC"}
|