kiri-mcp-server 0.9.6 → 0.10.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/README.md +144 -13
- package/dist/client/cli.js +68 -0
- package/dist/client/cli.js.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/eval/metrics.js +47 -0
- package/dist/eval/metrics.js.map +1 -0
- package/dist/indexer/cli.js +362 -0
- package/dist/indexer/cli.js.map +1 -0
- package/dist/indexer/codeintel.js +182 -0
- package/dist/indexer/codeintel.js.map +1 -0
- package/dist/indexer/git.js +30 -0
- package/dist/indexer/git.js.map +1 -0
- package/dist/indexer/language.js +34 -0
- package/dist/indexer/language.js.map +1 -0
- package/dist/indexer/pipeline/filters/denylist.js +71 -0
- package/dist/indexer/pipeline/filters/denylist.js.map +1 -0
- package/dist/indexer/schema.js +101 -0
- package/dist/indexer/schema.js.map +1 -0
- package/dist/package.json +14 -1
- package/dist/server/bootstrap.js +19 -0
- package/dist/server/bootstrap.js.map +1 -0
- package/dist/server/context.js +1 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fallbacks/degradeController.js +69 -0
- package/dist/server/fallbacks/degradeController.js.map +1 -0
- package/dist/server/handlers.js +1268 -0
- package/dist/server/handlers.js.map +1 -0
- package/dist/server/main.js +151 -0
- package/dist/server/main.js.map +1 -0
- package/dist/server/observability/metrics.js +56 -0
- package/dist/server/observability/metrics.js.map +1 -0
- package/dist/server/observability/tracing.js +58 -0
- package/dist/server/observability/tracing.js.map +1 -0
- package/dist/server/rpc.js +477 -0
- package/dist/server/rpc.js.map +1 -0
- package/dist/server/runtime.js +47 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/scoring.js +116 -0
- package/dist/server/scoring.js.map +1 -0
- package/dist/server/stdio.js +76 -0
- package/dist/server/stdio.js.map +1 -0
- package/dist/shared/duckdb.js +119 -0
- package/dist/shared/duckdb.js.map +1 -0
- package/dist/shared/embedding.js +98 -0
- package/dist/shared/embedding.js.map +1 -0
- package/dist/shared/index.js +9 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/security/config.js +64 -0
- package/dist/shared/security/config.js.map +1 -0
- package/dist/shared/security/masker.js +56 -0
- package/dist/shared/security/masker.js.map +1 -0
- package/dist/shared/tokenizer.js +4 -0
- package/dist/shared/tokenizer.js.map +1 -0
- package/dist/shared/utils/simpleYaml.js +89 -0
- package/dist/shared/utils/simpleYaml.js.map +1 -0
- package/dist/src/client/proxy.js +83 -13
- package/dist/src/client/proxy.js.map +1 -1
- package/dist/src/client/start-daemon.d.ts.map +1 -1
- package/dist/src/client/start-daemon.js +2 -1
- package/dist/src/client/start-daemon.js.map +1 -1
- package/dist/src/daemon/daemon.js +97 -18
- package/dist/src/daemon/daemon.js.map +1 -1
- package/dist/src/daemon/socket.d.ts +6 -4
- package/dist/src/daemon/socket.d.ts.map +1 -1
- package/dist/src/daemon/socket.js +62 -18
- package/dist/src/daemon/socket.js.map +1 -1
- package/dist/src/indexer/cli.d.ts +1 -0
- package/dist/src/indexer/cli.d.ts.map +1 -1
- package/dist/src/indexer/cli.js +503 -257
- package/dist/src/indexer/cli.js.map +1 -1
- package/dist/src/indexer/codeintel.d.ts +1 -1
- package/dist/src/indexer/codeintel.d.ts.map +1 -1
- package/dist/src/indexer/codeintel.js +296 -3
- package/dist/src/indexer/codeintel.js.map +1 -1
- package/dist/src/indexer/dart/analyze.d.ts +29 -0
- package/dist/src/indexer/dart/analyze.d.ts.map +1 -0
- package/dist/src/indexer/dart/analyze.js +452 -0
- package/dist/src/indexer/dart/analyze.js.map +1 -0
- package/dist/src/indexer/dart/client.d.ts +113 -0
- package/dist/src/indexer/dart/client.d.ts.map +1 -0
- package/dist/src/indexer/dart/client.js +444 -0
- package/dist/src/indexer/dart/client.js.map +1 -0
- package/dist/src/indexer/dart/config.d.ts +36 -0
- package/dist/src/indexer/dart/config.d.ts.map +1 -0
- package/dist/src/indexer/dart/config.js +62 -0
- package/dist/src/indexer/dart/config.js.map +1 -0
- package/dist/src/indexer/dart/dependencies.d.ts +17 -0
- package/dist/src/indexer/dart/dependencies.d.ts.map +1 -0
- package/dist/src/indexer/dart/dependencies.js +102 -0
- package/dist/src/indexer/dart/dependencies.js.map +1 -0
- package/dist/src/indexer/dart/pathKey.d.ts +40 -0
- package/dist/src/indexer/dart/pathKey.d.ts.map +1 -0
- package/dist/src/indexer/dart/pathKey.js +72 -0
- package/dist/src/indexer/dart/pathKey.js.map +1 -0
- package/dist/src/indexer/dart/poolGate.d.ts +57 -0
- package/dist/src/indexer/dart/poolGate.d.ts.map +1 -0
- package/dist/src/indexer/dart/poolGate.js +87 -0
- package/dist/src/indexer/dart/poolGate.js.map +1 -0
- package/dist/src/indexer/dart/sdk.d.ts +40 -0
- package/dist/src/indexer/dart/sdk.d.ts.map +1 -0
- package/dist/src/indexer/dart/sdk.js +167 -0
- package/dist/src/indexer/dart/sdk.js.map +1 -0
- package/dist/src/indexer/dart/transform.d.ts +17 -0
- package/dist/src/indexer/dart/transform.d.ts.map +1 -0
- package/dist/src/indexer/dart/transform.js +157 -0
- package/dist/src/indexer/dart/transform.js.map +1 -0
- package/dist/src/indexer/dart/types.d.ts +137 -0
- package/dist/src/indexer/dart/types.d.ts.map +1 -0
- package/dist/src/indexer/dart/types.js +5 -0
- package/dist/src/indexer/dart/types.js.map +1 -0
- package/dist/src/indexer/git.d.ts +1 -0
- package/dist/src/indexer/git.d.ts.map +1 -1
- package/dist/src/indexer/git.js +8 -0
- package/dist/src/indexer/git.js.map +1 -1
- package/dist/src/indexer/language.d.ts.map +1 -1
- package/dist/src/indexer/language.js +1 -0
- package/dist/src/indexer/language.js.map +1 -1
- package/dist/src/indexer/queue.d.ts +19 -0
- package/dist/src/indexer/queue.d.ts.map +1 -0
- package/dist/src/indexer/queue.js +50 -0
- package/dist/src/indexer/queue.js.map +1 -0
- package/dist/src/indexer/schema.d.ts +61 -1
- package/dist/src/indexer/schema.d.ts.map +1 -1
- package/dist/src/indexer/schema.js +253 -2
- package/dist/src/indexer/schema.js.map +1 -1
- package/dist/src/indexer/watch.d.ts +21 -0
- package/dist/src/indexer/watch.d.ts.map +1 -1
- package/dist/src/indexer/watch.js +189 -28
- package/dist/src/indexer/watch.js.map +1 -1
- package/dist/src/server/abbreviations.d.ts +47 -0
- package/dist/src/server/abbreviations.d.ts.map +1 -0
- package/dist/src/server/abbreviations.js +71 -0
- package/dist/src/server/abbreviations.js.map +1 -0
- package/dist/src/server/boost-profiles.d.ts +63 -0
- package/dist/src/server/boost-profiles.d.ts.map +1 -0
- package/dist/src/server/boost-profiles.js +86 -0
- package/dist/src/server/boost-profiles.js.map +1 -0
- package/dist/src/server/context.d.ts +7 -0
- package/dist/src/server/context.d.ts.map +1 -1
- package/dist/src/server/handlers.d.ts +3 -2
- package/dist/src/server/handlers.d.ts.map +1 -1
- package/dist/src/server/handlers.js +542 -96
- package/dist/src/server/handlers.js.map +1 -1
- package/dist/src/server/indexBootstrap.d.ts.map +1 -1
- package/dist/src/server/indexBootstrap.js +4 -1
- package/dist/src/server/indexBootstrap.js.map +1 -1
- package/dist/src/server/main.d.ts.map +1 -1
- package/dist/src/server/main.js +112 -30
- package/dist/src/server/main.js.map +1 -1
- package/dist/src/server/rpc.d.ts.map +1 -1
- package/dist/src/server/rpc.js +28 -9
- package/dist/src/server/rpc.js.map +1 -1
- package/dist/src/server/rrf.d.ts +86 -0
- package/dist/src/server/rrf.d.ts.map +1 -0
- package/dist/src/server/rrf.js +108 -0
- package/dist/src/server/rrf.js.map +1 -0
- package/dist/src/server/runtime.d.ts.map +1 -1
- package/dist/src/server/runtime.js +45 -6
- package/dist/src/server/runtime.js.map +1 -1
- package/dist/src/server/scoring.d.ts.map +1 -1
- package/dist/src/server/scoring.js +19 -0
- package/dist/src/server/scoring.js.map +1 -1
- package/dist/src/shared/cli/args.d.ts +70 -0
- package/dist/src/shared/cli/args.d.ts.map +1 -0
- package/dist/src/shared/cli/args.js +84 -0
- package/dist/src/shared/cli/args.js.map +1 -0
- package/dist/src/shared/duckdb.d.ts.map +1 -1
- package/dist/src/shared/duckdb.js +9 -0
- package/dist/src/shared/duckdb.js.map +1 -1
- package/dist/src/shared/embedding/engine.d.ts +38 -0
- package/dist/src/shared/embedding/engine.d.ts.map +1 -0
- package/dist/src/shared/embedding/engine.js +6 -0
- package/dist/src/shared/embedding/engine.js.map +1 -0
- package/dist/src/shared/embedding/lsh-engine.d.ts +11 -0
- package/dist/src/shared/embedding/lsh-engine.d.ts.map +1 -0
- package/dist/src/shared/embedding/lsh-engine.js +14 -0
- package/dist/src/shared/embedding/lsh-engine.js.map +1 -0
- package/dist/src/shared/embedding/registry.d.ts +25 -0
- package/dist/src/shared/embedding/registry.d.ts.map +1 -0
- package/dist/src/shared/embedding/registry.js +50 -0
- package/dist/src/shared/embedding/registry.js.map +1 -0
- package/dist/src/shared/embedding/semantic-engine.d.ts +14 -0
- package/dist/src/shared/embedding/semantic-engine.d.ts.map +1 -0
- package/dist/src/shared/embedding/semantic-engine.js +50 -0
- package/dist/src/shared/embedding/semantic-engine.js.map +1 -0
- package/dist/src/shared/models/model-manager.d.ts +38 -0
- package/dist/src/shared/models/model-manager.d.ts.map +1 -0
- package/dist/src/shared/models/model-manager.js +116 -0
- package/dist/src/shared/models/model-manager.js.map +1 -0
- package/dist/src/shared/models/model-manifest.d.ts +22 -0
- package/dist/src/shared/models/model-manifest.d.ts.map +1 -0
- package/dist/src/shared/models/model-manifest.js +24 -0
- package/dist/src/shared/models/model-manifest.js.map +1 -0
- package/dist/src/shared/utils/path.d.ts +46 -0
- package/dist/src/shared/utils/path.d.ts.map +1 -0
- package/dist/src/shared/utils/path.js +94 -0
- package/dist/src/shared/utils/path.js.map +1 -0
- package/dist/src/shared/utils/socket.d.ts +61 -0
- package/dist/src/shared/utils/socket.d.ts.map +1 -0
- package/dist/src/shared/utils/socket.js +156 -0
- package/dist/src/shared/utils/socket.js.map +1 -0
- package/dist/src/shared/utils/validation.d.ts +14 -0
- package/dist/src/shared/utils/validation.d.ts.map +1 -0
- package/dist/src/shared/utils/validation.js +22 -0
- package/dist/src/shared/utils/validation.js.map +1 -0
- package/package.json +14 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalizes a database path by resolving to its canonical form.
|
|
3
|
+
*
|
|
4
|
+
* This prevents lock file and queue key bypass issues caused by symlinks or OS path aliases.
|
|
5
|
+
* The normalization strategy is:
|
|
6
|
+
* 1. Resolve to absolute path
|
|
7
|
+
* 2. If file exists, normalize the full path using realpathSync (follows symlinks)
|
|
8
|
+
* 3. If file doesn't exist, normalize parent directory and append filename
|
|
9
|
+
*
|
|
10
|
+
* Why this two-stage approach?
|
|
11
|
+
* - Database file may not exist yet (first indexer run)
|
|
12
|
+
* - realpathSync throws ENOENT on non-existent files
|
|
13
|
+
* - Must call ensureDbParentDir BEFORE this function to ensure parent exists
|
|
14
|
+
* - Once file exists, we normalize the full path to prevent symlink bypass
|
|
15
|
+
*
|
|
16
|
+
* @param input - Path to database file (may be relative or absolute)
|
|
17
|
+
* @returns Normalized absolute path (full path if exists, parent+filename if not)
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // First run (DB doesn't exist, symlink parent):
|
|
21
|
+
* ensureDbParentDir("/link/to/db.duckdb"); // Creates /real/path/
|
|
22
|
+
* normalizeDbPath("/link/to/db.duckdb") // "/real/path/db.duckdb"
|
|
23
|
+
*
|
|
24
|
+
* // Second run (DB exists, accessed via symlink):
|
|
25
|
+
* normalizeDbPath("/link/db.duckdb") // "/real/path/db.duckdb"
|
|
26
|
+
*
|
|
27
|
+
* // Result: Same normalized path → same lock file, same queue key
|
|
28
|
+
*/
|
|
29
|
+
export declare function normalizeDbPath(input: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Ensures the parent directory of a database path exists.
|
|
32
|
+
* This should be called before normalizeDbPath to guarantee successful normalization.
|
|
33
|
+
*
|
|
34
|
+
* @param dbPath - Path to database file
|
|
35
|
+
*/
|
|
36
|
+
export declare function ensureDbParentDir(dbPath: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* リポジトリパスを正規化して返す。realpath に失敗した場合は resolve 結果を使用する。
|
|
39
|
+
*/
|
|
40
|
+
export declare function normalizeRepoPath(input: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* 旧バージョンのパス表現(resolve ベース)との互換性を保つための候補一覧を返す。
|
|
43
|
+
* 配列の先頭は正規化済みパス。
|
|
44
|
+
*/
|
|
45
|
+
export declare function getRepoPathCandidates(input: string): string[];
|
|
46
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/path.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA2BrD;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ7D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { existsSync, realpathSync } from "node:fs";
|
|
2
|
+
import { mkdir } from "node:fs/promises";
|
|
3
|
+
import { dirname, basename, join, resolve } from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Normalizes a database path by resolving to its canonical form.
|
|
6
|
+
*
|
|
7
|
+
* This prevents lock file and queue key bypass issues caused by symlinks or OS path aliases.
|
|
8
|
+
* The normalization strategy is:
|
|
9
|
+
* 1. Resolve to absolute path
|
|
10
|
+
* 2. If file exists, normalize the full path using realpathSync (follows symlinks)
|
|
11
|
+
* 3. If file doesn't exist, normalize parent directory and append filename
|
|
12
|
+
*
|
|
13
|
+
* Why this two-stage approach?
|
|
14
|
+
* - Database file may not exist yet (first indexer run)
|
|
15
|
+
* - realpathSync throws ENOENT on non-existent files
|
|
16
|
+
* - Must call ensureDbParentDir BEFORE this function to ensure parent exists
|
|
17
|
+
* - Once file exists, we normalize the full path to prevent symlink bypass
|
|
18
|
+
*
|
|
19
|
+
* @param input - Path to database file (may be relative or absolute)
|
|
20
|
+
* @returns Normalized absolute path (full path if exists, parent+filename if not)
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* // First run (DB doesn't exist, symlink parent):
|
|
24
|
+
* ensureDbParentDir("/link/to/db.duckdb"); // Creates /real/path/
|
|
25
|
+
* normalizeDbPath("/link/to/db.duckdb") // "/real/path/db.duckdb"
|
|
26
|
+
*
|
|
27
|
+
* // Second run (DB exists, accessed via symlink):
|
|
28
|
+
* normalizeDbPath("/link/db.duckdb") // "/real/path/db.duckdb"
|
|
29
|
+
*
|
|
30
|
+
* // Result: Same normalized path → same lock file, same queue key
|
|
31
|
+
*/
|
|
32
|
+
export function normalizeDbPath(input) {
|
|
33
|
+
const abs = resolve(input);
|
|
34
|
+
// Fix #1: If file exists, normalize the full path including the file itself
|
|
35
|
+
// This prevents symlink bypass: /tmp/db.duckdb -> /var/index.duckdb
|
|
36
|
+
if (existsSync(abs)) {
|
|
37
|
+
try {
|
|
38
|
+
return realpathSync.native(abs);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Fallback to parent normalization if full path fails
|
|
42
|
+
// (e.g., permissions issue)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// File doesn't exist yet - normalize parent and append filename
|
|
46
|
+
const parentDir = dirname(abs);
|
|
47
|
+
const filename = basename(abs);
|
|
48
|
+
try {
|
|
49
|
+
// Normalize parent directory to canonical form
|
|
50
|
+
const canonicalParent = realpathSync.native(parentDir);
|
|
51
|
+
return join(canonicalParent, filename);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Parent directory doesn't exist yet - caller should have called ensureDbParentDir
|
|
55
|
+
// Return unnormalized path as fallback (will cause issues!)
|
|
56
|
+
return abs;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Ensures the parent directory of a database path exists.
|
|
61
|
+
* This should be called before normalizeDbPath to guarantee successful normalization.
|
|
62
|
+
*
|
|
63
|
+
* @param dbPath - Path to database file
|
|
64
|
+
*/
|
|
65
|
+
export async function ensureDbParentDir(dbPath) {
|
|
66
|
+
const parentDir = dirname(resolve(dbPath));
|
|
67
|
+
await mkdir(parentDir, { recursive: true });
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* リポジトリパスを正規化して返す。realpath に失敗した場合は resolve 結果を使用する。
|
|
71
|
+
*/
|
|
72
|
+
export function normalizeRepoPath(input) {
|
|
73
|
+
const abs = resolve(input);
|
|
74
|
+
try {
|
|
75
|
+
return realpathSync.native(abs);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return abs;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 旧バージョンのパス表現(resolve ベース)との互換性を保つための候補一覧を返す。
|
|
83
|
+
* 配列の先頭は正規化済みパス。
|
|
84
|
+
*/
|
|
85
|
+
export function getRepoPathCandidates(input) {
|
|
86
|
+
const normalized = normalizeRepoPath(input);
|
|
87
|
+
const legacy = resolve(input);
|
|
88
|
+
const candidates = [normalized];
|
|
89
|
+
if (legacy !== normalized) {
|
|
90
|
+
candidates.push(legacy);
|
|
91
|
+
}
|
|
92
|
+
return candidates;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../../../src/shared/utils/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAE3B,4EAA4E;IAC5E,oEAAoE;IACpE,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;YACtD,4BAA4B;QAC9B,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE/B,IAAI,CAAC;QACH,+CAA+C;QAC/C,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,mFAAmF;QACnF,4DAA4D;QAC5D,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,CAAC,UAAU,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Socket Path Utility for Cross-Platform IPC
|
|
3
|
+
*
|
|
4
|
+
* Generates platform-appropriate IPC paths:
|
|
5
|
+
* - Unix/Linux/macOS: Unix domain socket files (e.g., /path/to/database.duckdb.sock)
|
|
6
|
+
* - Windows: Named pipes (e.g., \\.\pipe\kiri-<hash>)
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* プラットフォームに応じた適切なソケットパスを生成
|
|
10
|
+
*
|
|
11
|
+
* Windows環境では名前付きパイプ形式(\\.\pipe\kiri-<hash>)を使用し、
|
|
12
|
+
* Unix系環境ではファイルシステムパス(<databasePath>.sock)を使用し、
|
|
13
|
+
* パス長が上限を超える場合は /tmp などの短いディレクトリに自動フォールバックする。
|
|
14
|
+
*
|
|
15
|
+
* **セキュリティ注意事項**:
|
|
16
|
+
* - Unix: ソケットファイルは0600パーミッション(所有者のみアクセス可能)で保護
|
|
17
|
+
* しつつ、KIRI_SOCKET_DIR でフォールバック先ディレクトリを明示できます。
|
|
18
|
+
* - Windows: 名前付きパイプはデフォルトACLを使用(同一システムの他ユーザーが
|
|
19
|
+
* アクセス可能な場合がある)。ハッシュベースのパイプ名で曖昧性を提供するが、
|
|
20
|
+
* マルチユーザー環境では信頼できる環境でのみ使用することを推奨。
|
|
21
|
+
* - Windows環境では KIRI_PIPE_PREFIX 環境変数でパイプ名プレフィックスを
|
|
22
|
+
* カスタマイズ可能(追加のセキュリティ層として利用可能)
|
|
23
|
+
*
|
|
24
|
+
* @param databasePath - データベースファイルの絶対パス
|
|
25
|
+
* @returns プラットフォーム固有のソケットパス
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* // Unix/macOS/Linux
|
|
29
|
+
* getSocketPath("/path/to/database.duckdb")
|
|
30
|
+
* // => "/path/to/database.duckdb.sock"
|
|
31
|
+
*
|
|
32
|
+
* // Windows (デフォルト)
|
|
33
|
+
* getSocketPath("C:\\Users\\user\\database.duckdb")
|
|
34
|
+
* // => "\\\\.\\pipe\\kiri-a1b2c3d4..."
|
|
35
|
+
*
|
|
36
|
+
* // Windows (カスタムプレフィックス)
|
|
37
|
+
* process.env.KIRI_PIPE_PREFIX = "myapp"
|
|
38
|
+
* getSocketPath("C:\\Users\\user\\database.duckdb")
|
|
39
|
+
* // => "\\\\.\\pipe\\myapp-a1b2c3d4..."
|
|
40
|
+
*/
|
|
41
|
+
export declare function getSocketPath(databasePath: string, options?: {
|
|
42
|
+
ensureDir?: boolean;
|
|
43
|
+
}): string;
|
|
44
|
+
/**
|
|
45
|
+
* ソケットパスからデータベースパスを推測(Unix系のみ)
|
|
46
|
+
*
|
|
47
|
+
* Windows環境ではハッシュベースのパイプ名を使用するため、
|
|
48
|
+
* この関数は情報損失があり、デバッグ用途にのみ使用すべき。
|
|
49
|
+
*
|
|
50
|
+
* @param socketPath - ソケットパス
|
|
51
|
+
* @returns データベースパス(Unix系の場合)またはnull(Windows/不明な形式)
|
|
52
|
+
*/
|
|
53
|
+
export declare function getDatabasePathFromSocket(socketPath: string): string | null;
|
|
54
|
+
/**
|
|
55
|
+
* デバッグ用のソケットパス情報を生成
|
|
56
|
+
*
|
|
57
|
+
* @param databasePath - データベースファイルの絶対パス
|
|
58
|
+
* @returns デバッグ情報文字列
|
|
59
|
+
*/
|
|
60
|
+
export declare function getSocketPathDebugInfo(databasePath: string): string;
|
|
61
|
+
//# sourceMappingURL=socket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/socket.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsDH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAsB7F;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY3E;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CA+BnE"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Socket Path Utility for Cross-Platform IPC
|
|
3
|
+
*
|
|
4
|
+
* Generates platform-appropriate IPC paths:
|
|
5
|
+
* - Unix/Linux/macOS: Unix domain socket files (e.g., /path/to/database.duckdb.sock)
|
|
6
|
+
* - Windows: Named pipes (e.g., \\.\pipe\kiri-<hash>)
|
|
7
|
+
*/
|
|
8
|
+
import * as crypto from "crypto";
|
|
9
|
+
import { mkdirSync } from "node:fs";
|
|
10
|
+
import * as os from "os";
|
|
11
|
+
import * as path from "path";
|
|
12
|
+
const UNIX_SOCKET_PATH_MAX = 96; // macOS 104-byte limitに安全マージンを残す
|
|
13
|
+
const SOCKET_PREFIX = "kiri";
|
|
14
|
+
const SOCKET_DIR_ENV = "KIRI_SOCKET_DIR";
|
|
15
|
+
function sanitizeBaseName(fileName) {
|
|
16
|
+
const sanitized = fileName.replace(/[^a-zA-Z0-9]/g, "-");
|
|
17
|
+
return sanitized.length > 0 ? sanitized.toLowerCase() : "db";
|
|
18
|
+
}
|
|
19
|
+
function ensureSocketDir(dirPath) {
|
|
20
|
+
try {
|
|
21
|
+
mkdirSync(dirPath, { recursive: true, mode: 0o700 });
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
const err = error;
|
|
25
|
+
throw new Error(`Failed to prepare socket directory ${dirPath}: ${err.message}. ` +
|
|
26
|
+
`Set ${SOCKET_DIR_ENV} to a writable directory.`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function buildFallbackUnixSocketPath(databasePath, ensureDir) {
|
|
30
|
+
const fallbackDir = process.env[SOCKET_DIR_ENV] || os.tmpdir();
|
|
31
|
+
const hash = crypto.createHash("sha256").update(databasePath).digest("hex");
|
|
32
|
+
const baseName = sanitizeBaseName(path.basename(databasePath));
|
|
33
|
+
const candidates = [
|
|
34
|
+
path.join(fallbackDir, `${SOCKET_PREFIX}-${baseName}-${hash.slice(0, 12)}.sock`),
|
|
35
|
+
path.join(fallbackDir, `${SOCKET_PREFIX}-${hash.slice(0, 12)}.sock`),
|
|
36
|
+
path.join(fallbackDir, `${SOCKET_PREFIX}-${hash.slice(0, 8)}.sock`),
|
|
37
|
+
];
|
|
38
|
+
for (const candidate of candidates) {
|
|
39
|
+
if (Buffer.byteLength(candidate, "utf8") <= UNIX_SOCKET_PATH_MAX) {
|
|
40
|
+
if (ensureDir) {
|
|
41
|
+
ensureSocketDir(path.dirname(candidate));
|
|
42
|
+
}
|
|
43
|
+
return candidate;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
throw new Error(`Unable to construct Unix socket path under ${UNIX_SOCKET_PATH_MAX} characters. ` +
|
|
47
|
+
`Set ${SOCKET_DIR_ENV} to a shorter directory.`);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* プラットフォームに応じた適切なソケットパスを生成
|
|
51
|
+
*
|
|
52
|
+
* Windows環境では名前付きパイプ形式(\\.\pipe\kiri-<hash>)を使用し、
|
|
53
|
+
* Unix系環境ではファイルシステムパス(<databasePath>.sock)を使用し、
|
|
54
|
+
* パス長が上限を超える場合は /tmp などの短いディレクトリに自動フォールバックする。
|
|
55
|
+
*
|
|
56
|
+
* **セキュリティ注意事項**:
|
|
57
|
+
* - Unix: ソケットファイルは0600パーミッション(所有者のみアクセス可能)で保護
|
|
58
|
+
* しつつ、KIRI_SOCKET_DIR でフォールバック先ディレクトリを明示できます。
|
|
59
|
+
* - Windows: 名前付きパイプはデフォルトACLを使用(同一システムの他ユーザーが
|
|
60
|
+
* アクセス可能な場合がある)。ハッシュベースのパイプ名で曖昧性を提供するが、
|
|
61
|
+
* マルチユーザー環境では信頼できる環境でのみ使用することを推奨。
|
|
62
|
+
* - Windows環境では KIRI_PIPE_PREFIX 環境変数でパイプ名プレフィックスを
|
|
63
|
+
* カスタマイズ可能(追加のセキュリティ層として利用可能)
|
|
64
|
+
*
|
|
65
|
+
* @param databasePath - データベースファイルの絶対パス
|
|
66
|
+
* @returns プラットフォーム固有のソケットパス
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* // Unix/macOS/Linux
|
|
70
|
+
* getSocketPath("/path/to/database.duckdb")
|
|
71
|
+
* // => "/path/to/database.duckdb.sock"
|
|
72
|
+
*
|
|
73
|
+
* // Windows (デフォルト)
|
|
74
|
+
* getSocketPath("C:\\Users\\user\\database.duckdb")
|
|
75
|
+
* // => "\\\\.\\pipe\\kiri-a1b2c3d4..."
|
|
76
|
+
*
|
|
77
|
+
* // Windows (カスタムプレフィックス)
|
|
78
|
+
* process.env.KIRI_PIPE_PREFIX = "myapp"
|
|
79
|
+
* getSocketPath("C:\\Users\\user\\database.duckdb")
|
|
80
|
+
* // => "\\\\.\\pipe\\myapp-a1b2c3d4..."
|
|
81
|
+
*/
|
|
82
|
+
export function getSocketPath(databasePath, options) {
|
|
83
|
+
const ensureDir = options?.ensureDir ?? false;
|
|
84
|
+
if (os.platform() === "win32") {
|
|
85
|
+
// Windows: 名前付きパイプを使用
|
|
86
|
+
// データベースパスのハッシュを使ってユニークなパイプ名を生成
|
|
87
|
+
const hash = crypto.createHash("sha256").update(databasePath).digest("hex");
|
|
88
|
+
// 環境変数でプレフィックスをカスタマイズ可能(追加のセキュリティ層)
|
|
89
|
+
const prefix = process.env.KIRI_PIPE_PREFIX || SOCKET_PREFIX;
|
|
90
|
+
// 最初の16文字を使用(衝突リスクは極めて低い)
|
|
91
|
+
const pipeName = `${prefix}-${hash.substring(0, 16)}`;
|
|
92
|
+
return `\\\\.\\pipe\\${pipeName}`;
|
|
93
|
+
}
|
|
94
|
+
const defaultSocketPath = `${databasePath}.sock`;
|
|
95
|
+
if (Buffer.byteLength(defaultSocketPath, "utf8") <= UNIX_SOCKET_PATH_MAX) {
|
|
96
|
+
if (ensureDir) {
|
|
97
|
+
ensureSocketDir(path.dirname(defaultSocketPath));
|
|
98
|
+
}
|
|
99
|
+
return defaultSocketPath;
|
|
100
|
+
}
|
|
101
|
+
return buildFallbackUnixSocketPath(databasePath, ensureDir);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* ソケットパスからデータベースパスを推測(Unix系のみ)
|
|
105
|
+
*
|
|
106
|
+
* Windows環境ではハッシュベースのパイプ名を使用するため、
|
|
107
|
+
* この関数は情報損失があり、デバッグ用途にのみ使用すべき。
|
|
108
|
+
*
|
|
109
|
+
* @param socketPath - ソケットパス
|
|
110
|
+
* @returns データベースパス(Unix系の場合)またはnull(Windows/不明な形式)
|
|
111
|
+
*/
|
|
112
|
+
export function getDatabasePathFromSocket(socketPath) {
|
|
113
|
+
if (os.platform() === "win32") {
|
|
114
|
+
// Windowsではパイプ名からデータベースパスを復元できない
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
// Unix系: .sock拡張子を削除
|
|
118
|
+
if (socketPath.endsWith(".sock")) {
|
|
119
|
+
return socketPath.slice(0, -5); // ".sock" の長さは5
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* デバッグ用のソケットパス情報を生成
|
|
125
|
+
*
|
|
126
|
+
* @param databasePath - データベースファイルの絶対パス
|
|
127
|
+
* @returns デバッグ情報文字列
|
|
128
|
+
*/
|
|
129
|
+
export function getSocketPathDebugInfo(databasePath) {
|
|
130
|
+
const socketPath = getSocketPath(databasePath);
|
|
131
|
+
const platform = os.platform();
|
|
132
|
+
const defaultUnixSocket = `${databasePath}.sock`;
|
|
133
|
+
// プラットフォーム固有のpathモジュールを使用して正しくパースする
|
|
134
|
+
const pathModule = platform === "win32" ? path.win32 : path.posix;
|
|
135
|
+
const dbDir = pathModule.dirname(databasePath);
|
|
136
|
+
const dbBase = pathModule.basename(databasePath);
|
|
137
|
+
if (platform === "win32") {
|
|
138
|
+
return [
|
|
139
|
+
`Database: ${dbBase} (${dbDir})`,
|
|
140
|
+
`Socket: ${socketPath} (Windows named pipe)`,
|
|
141
|
+
`Note: Pipe name is derived from database path hash for uniqueness`,
|
|
142
|
+
].join("\n");
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const lines = [
|
|
146
|
+
`Database: ${dbBase} (${dbDir})`,
|
|
147
|
+
`Socket: ${socketPath} (Unix domain socket)`,
|
|
148
|
+
`Permissions: Owner-only (0600)`,
|
|
149
|
+
];
|
|
150
|
+
if (socketPath !== defaultUnixSocket) {
|
|
151
|
+
lines.push(`Fallback: Socket path shortened (set ${SOCKET_DIR_ENV} to override base directory)`);
|
|
152
|
+
}
|
|
153
|
+
return lines.join("\n");
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../src/shared/utils/socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utilities for CLI arguments and user input
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Parse a string to a positive integer with validation
|
|
6
|
+
*
|
|
7
|
+
* @param value - String value to parse
|
|
8
|
+
* @param defaultValue - Default value if input is undefined
|
|
9
|
+
* @param name - Parameter name for error messages
|
|
10
|
+
* @returns Parsed integer
|
|
11
|
+
* @throws Error if value is not a valid positive integer
|
|
12
|
+
*/
|
|
13
|
+
export declare function parsePositiveInt(value: string | undefined, defaultValue: number, name: string): number;
|
|
14
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,MAAM,CAUR"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utilities for CLI arguments and user input
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Parse a string to a positive integer with validation
|
|
6
|
+
*
|
|
7
|
+
* @param value - String value to parse
|
|
8
|
+
* @param defaultValue - Default value if input is undefined
|
|
9
|
+
* @param name - Parameter name for error messages
|
|
10
|
+
* @returns Parsed integer
|
|
11
|
+
* @throws Error if value is not a valid positive integer
|
|
12
|
+
*/
|
|
13
|
+
export function parsePositiveInt(value, defaultValue, name) {
|
|
14
|
+
if (!value)
|
|
15
|
+
return defaultValue;
|
|
16
|
+
const parsed = parseInt(value, 10);
|
|
17
|
+
if (Number.isNaN(parsed) || parsed < 0) {
|
|
18
|
+
throw new Error(`Invalid ${name}: "${value}". Expected a positive integer. Use default ${defaultValue} or specify a valid number.`);
|
|
19
|
+
}
|
|
20
|
+
return parsed;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/shared/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAyB,EACzB,YAAoB,EACpB,IAAY;IAEZ,IAAI,CAAC,KAAK;QAAE,OAAO,YAAY,CAAC;IAEhC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,MAAM,KAAK,+CAA+C,YAAY,6BAA6B,CACnH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kiri-mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "KIRI context extraction platform",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@9.0.0",
|
|
@@ -56,6 +56,15 @@
|
|
|
56
56
|
"dev": "tsx src/server/main.ts --port 8765",
|
|
57
57
|
"lint": "eslint \"{src,tests,scripts}/**/*.{ts,tsx}\" && prettier --check \"**/*.{ts,tsx,json,md,yml}\"",
|
|
58
58
|
"test": "vitest run --coverage --pool=forks --poolOptions.forks.singleFork --poolOptions.forks.maxForks=1 --poolOptions.forks.minForks=1",
|
|
59
|
+
"verify": "tsx scripts/test/verify-all.ts",
|
|
60
|
+
"verify:unit": "tsx scripts/test/verify-all.ts --category unit",
|
|
61
|
+
"verify:dart": "tsx scripts/test/verify-all.ts --category dart",
|
|
62
|
+
"verify:integration": "tsx scripts/test/verify-all.ts --category integration",
|
|
63
|
+
"verify:tools": "tsx scripts/test/verify-all.ts --category tools",
|
|
64
|
+
"verify:watch": "tsx scripts/test/verify-all.ts --category watch",
|
|
65
|
+
"verify:eval": "tsx scripts/test/verify-all.ts --category eval",
|
|
66
|
+
"eval:golden": "tsx scripts/eval/run-golden.ts",
|
|
67
|
+
"eval:golden:verbose": "tsx scripts/eval/run-golden.ts --verbose",
|
|
59
68
|
"check": "pnpm run lint && pnpm run test",
|
|
60
69
|
"prepublishOnly": "pnpm run build"
|
|
61
70
|
},
|
|
@@ -63,7 +72,9 @@
|
|
|
63
72
|
"chokidar": "^4.0.3",
|
|
64
73
|
"duckdb": "^1.1.0",
|
|
65
74
|
"gpt-tokenizer": "^3.2.0",
|
|
75
|
+
"p-queue": "^9.0.0",
|
|
66
76
|
"tree-sitter": "^0.22.0",
|
|
77
|
+
"tree-sitter-java": "^0.23.2",
|
|
67
78
|
"tree-sitter-php": "^0.22.8",
|
|
68
79
|
"tree-sitter-swift": "0.7.1",
|
|
69
80
|
"typescript": "^5.6.3",
|
|
@@ -78,6 +89,8 @@
|
|
|
78
89
|
"eslint": "^9.9.0",
|
|
79
90
|
"eslint-config-prettier": "^9.1.0",
|
|
80
91
|
"eslint-plugin-import": "^2.29.1",
|
|
92
|
+
"execa": "^9.6.0",
|
|
93
|
+
"fast-check": "^4.3.0",
|
|
81
94
|
"lint-staged": "^15.2.10",
|
|
82
95
|
"prettier": "^3.3.3",
|
|
83
96
|
"simple-git-hooks": "^2.10.0",
|