kiri-mcp-server 0.24.3 → 0.24.4
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.24.4**: Auto reindex on corrupt/incompatible DB (PR #171)
|
|
142
143
|
- **v0.24.2**: Zombie daemon auto-detection and cleanup (PR #169)
|
|
143
144
|
- **v0.24.1**: DaemonLifecycle stale lock detection (PR #168)
|
|
144
145
|
- **v0.24.0**: MCP connection auto-reconnect (PR #167)
|
|
145
|
-
- **v0.23.0**: `--full` option for kiri command (PR #166)
|
|
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.24.
|
|
224
|
+
**Status**: v0.24.4 (Beta) - Production-ready for MCP clients
|
package/dist/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexBootstrap.d.ts","sourceRoot":"","sources":["../../../src/server/indexBootstrap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"indexBootstrap.d.ts","sourceRoot":"","sources":["../../../src/server/indexBootstrap.ts"],"names":[],"mappings":"AAgHA;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,OAAO,EACrB,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,OAAO,CAAC,CAuJlB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, unlinkSync } from "node:fs";
|
|
1
|
+
import { existsSync, renameSync, unlinkSync } from "node:fs";
|
|
2
2
|
import { access, constants, mkdir } from "node:fs/promises";
|
|
3
3
|
import { dirname, resolve } from "node:path";
|
|
4
4
|
import { runIndexer } from "../indexer/cli.js";
|
|
@@ -15,6 +15,50 @@ import { ensureDbParentDir, normalizeDbPath } from "../shared/utils/path.js";
|
|
|
15
15
|
* @param databasePath - Absolute path to database
|
|
16
16
|
* @returns true if reindex is needed, false if not needed or error occurred
|
|
17
17
|
*/
|
|
18
|
+
const AUTO_REINDEX_ON_CORRUPTION_ENV = "KIRI_AUTO_REINDEX_ON_CORRUPTION";
|
|
19
|
+
function envFlagEnabled(value, defaultValue) {
|
|
20
|
+
if (value == null) {
|
|
21
|
+
return defaultValue;
|
|
22
|
+
}
|
|
23
|
+
const normalized = value.trim().toLowerCase();
|
|
24
|
+
if (!normalized) {
|
|
25
|
+
return defaultValue;
|
|
26
|
+
}
|
|
27
|
+
return ["1", "true", "yes", "on"].includes(normalized);
|
|
28
|
+
}
|
|
29
|
+
function isCorruptDatabaseError(error) {
|
|
30
|
+
if (!(error instanceof Error)) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
const message = error.message ?? "";
|
|
34
|
+
const normalized = message.toLowerCase();
|
|
35
|
+
return (normalized.includes("serialization error") ||
|
|
36
|
+
normalized.includes("failed to deserialize") ||
|
|
37
|
+
normalized.includes("field id mismatch") ||
|
|
38
|
+
normalized.includes("database file is not compatible") ||
|
|
39
|
+
normalized.includes("file is not a database") ||
|
|
40
|
+
(normalized.includes("catalog error") && normalized.includes("type")));
|
|
41
|
+
}
|
|
42
|
+
function backupDatabaseFiles(databasePath) {
|
|
43
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
44
|
+
const candidates = [databasePath, `${databasePath}.wal`, `${databasePath}.tmp`];
|
|
45
|
+
const backedUp = [];
|
|
46
|
+
for (const file of candidates) {
|
|
47
|
+
if (!existsSync(file)) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const backupPath = `${file}.bak-${timestamp}`;
|
|
51
|
+
try {
|
|
52
|
+
renameSync(file, backupPath);
|
|
53
|
+
backedUp.push(backupPath);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const err = error;
|
|
57
|
+
throw new Error(`Failed to backup ${file}: ${err.message}. Stop other daemon processes and retry.`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return backedUp;
|
|
61
|
+
}
|
|
18
62
|
async function needsMigrationReindex(databasePath) {
|
|
19
63
|
let db = null;
|
|
20
64
|
try {
|
|
@@ -24,18 +68,21 @@ async function needsMigrationReindex(databasePath) {
|
|
|
24
68
|
// Defensive: check array element exists and has valid count
|
|
25
69
|
const firstRow = filesExist[0];
|
|
26
70
|
if (!firstRow || typeof firstRow.count !== "number") {
|
|
27
|
-
return false;
|
|
71
|
+
return { migrationNeeded: false, corruptionDetected: false };
|
|
28
72
|
}
|
|
29
73
|
const hasFiles = firstRow.count > 0;
|
|
30
74
|
// Check if document_metadata table is empty
|
|
31
75
|
const metadataEmpty = await isDocumentMetadataEmpty(db);
|
|
32
76
|
// Migration needed if files exist but metadata is empty
|
|
33
|
-
return hasFiles && metadataEmpty;
|
|
77
|
+
return { migrationNeeded: hasFiles && metadataEmpty, corruptionDetected: false };
|
|
34
78
|
}
|
|
35
|
-
catch {
|
|
36
|
-
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (isCorruptDatabaseError(error)) {
|
|
81
|
+
return { migrationNeeded: false, corruptionDetected: true };
|
|
82
|
+
}
|
|
83
|
+
// On any other error (missing table, etc.), assume no migration needed
|
|
37
84
|
// The subsequent indexing attempt will surface the real error
|
|
38
|
-
return false;
|
|
85
|
+
return { migrationNeeded: false, corruptionDetected: false };
|
|
39
86
|
}
|
|
40
87
|
finally {
|
|
41
88
|
if (db) {
|
|
@@ -59,11 +106,22 @@ export async function ensureDatabaseIndexed(repoRoot, databasePath, allowDegrade
|
|
|
59
106
|
const absoluteDatabasePath = normalizeDbPath(databasePath);
|
|
60
107
|
const absoluteRepoRoot = resolve(repoRoot);
|
|
61
108
|
const lockfilePath = `${absoluteDatabasePath}.lock`;
|
|
62
|
-
|
|
63
|
-
|
|
109
|
+
const autoReindexOnCorruption = envFlagEnabled(process.env[AUTO_REINDEX_ON_CORRUPTION_ENV], true);
|
|
110
|
+
let backupAttempted = false;
|
|
111
|
+
let backupSucceeded = false;
|
|
112
|
+
const dbExists = existsSync(absoluteDatabasePath);
|
|
113
|
+
// Check if migration or corruption requires reindex
|
|
114
|
+
const { migrationNeeded, corruptionDetected } = dbExists
|
|
64
115
|
? await needsMigrationReindex(absoluteDatabasePath)
|
|
65
|
-
: false;
|
|
66
|
-
|
|
116
|
+
: { migrationNeeded: false, corruptionDetected: false };
|
|
117
|
+
if (corruptionDetected && !autoReindexOnCorruption) {
|
|
118
|
+
const message = "Corrupt or incompatible database detected. " +
|
|
119
|
+
`Set ${AUTO_REINDEX_ON_CORRUPTION_ENV}=1 or run a full reindex.`;
|
|
120
|
+
process.stderr.write(`❌ ${message}\n`);
|
|
121
|
+
throw new Error(message);
|
|
122
|
+
}
|
|
123
|
+
const corruptionReindex = dbExists && corruptionDetected && autoReindexOnCorruption;
|
|
124
|
+
const shouldIndex = !dbExists || forceReindex || migrationNeeded || corruptionReindex;
|
|
67
125
|
if (!shouldIndex) {
|
|
68
126
|
// Database exists and no reindex requested
|
|
69
127
|
return true;
|
|
@@ -98,12 +156,25 @@ export async function ensureDatabaseIndexed(repoRoot, databasePath, allowDegrade
|
|
|
98
156
|
process.stderr.write(` • Ensure write access to: ${dbDir}\n`);
|
|
99
157
|
throw error;
|
|
100
158
|
}
|
|
159
|
+
if (corruptionReindex) {
|
|
160
|
+
backupAttempted = true;
|
|
161
|
+
const backups = backupDatabaseFiles(absoluteDatabasePath);
|
|
162
|
+
backupSucceeded = true;
|
|
163
|
+
if (backups.length > 0) {
|
|
164
|
+
process.stderr.write(`ℹ️ Backed up corrupted database files:\n`);
|
|
165
|
+
for (const backup of backups) {
|
|
166
|
+
process.stderr.write(` • ${backup}\n`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
101
170
|
// Run indexer
|
|
102
|
-
const reason =
|
|
103
|
-
?
|
|
104
|
-
:
|
|
105
|
-
? "
|
|
106
|
-
:
|
|
171
|
+
const reason = corruptionReindex
|
|
172
|
+
? `Corrupt or incompatible database detected (${AUTO_REINDEX_ON_CORRUPTION_ENV}=1)`
|
|
173
|
+
: migrationNeeded
|
|
174
|
+
? "Document metadata migration detected"
|
|
175
|
+
: forceReindex
|
|
176
|
+
? "Manual reindex requested"
|
|
177
|
+
: "Database not found";
|
|
107
178
|
process.stderr.write(`⚠️ ${reason}. Running indexer for ${absoluteRepoRoot}...\n`);
|
|
108
179
|
await runIndexer({
|
|
109
180
|
repoRoot: absoluteRepoRoot,
|
|
@@ -117,9 +188,13 @@ export async function ensureDatabaseIndexed(repoRoot, databasePath, allowDegrade
|
|
|
117
188
|
catch (error) {
|
|
118
189
|
// Log the error
|
|
119
190
|
process.stderr.write(`❌ Indexing failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
191
|
+
const skipCleanup = corruptionReindex && backupAttempted && !backupSucceeded;
|
|
192
|
+
if (skipCleanup) {
|
|
193
|
+
process.stderr.write(`⚠️ Skipping cleanup because database backup did not complete.\n`);
|
|
194
|
+
}
|
|
120
195
|
// Clean up partial database to prevent corrupt DB usage on next startup
|
|
121
196
|
// DuckDB creates multiple files (.duckdb, .duckdb.wal, .duckdb.tmp)
|
|
122
|
-
if (existsSync(absoluteDatabasePath)) {
|
|
197
|
+
if (!skipCleanup && existsSync(absoluteDatabasePath)) {
|
|
123
198
|
process.stderr.write(`ℹ️ Cleaning up partially created database...\n`);
|
|
124
199
|
const dbFiles = [
|
|
125
200
|
absoluteDatabasePath,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexBootstrap.js","sourceRoot":"","sources":["../../../src/server/indexBootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"indexBootstrap.js","sourceRoot":"","sources":["../../../src/server/indexBootstrap.ts"],"names":[],"mappings":"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"}
|