kiri-mcp-server 0.10.0 → 0.11.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 +10 -1
- package/config/scoring-profiles.yml +82 -35
- package/dist/config/scoring-profiles.yml +82 -35
- package/dist/package.json +9 -1
- package/dist/src/indexer/cli.d.ts.map +1 -1
- package/dist/src/indexer/cli.js +712 -98
- package/dist/src/indexer/cli.js.map +1 -1
- package/dist/src/indexer/git.d.ts.map +1 -1
- package/dist/src/indexer/git.js +41 -3
- package/dist/src/indexer/git.js.map +1 -1
- package/dist/src/indexer/migrations/repo-merger.d.ts +33 -0
- package/dist/src/indexer/migrations/repo-merger.d.ts.map +1 -0
- package/dist/src/indexer/migrations/repo-merger.js +67 -0
- package/dist/src/indexer/migrations/repo-merger.js.map +1 -0
- package/dist/src/indexer/schema.d.ts +66 -0
- package/dist/src/indexer/schema.d.ts.map +1 -1
- package/dist/src/indexer/schema.js +337 -0
- package/dist/src/indexer/schema.js.map +1 -1
- package/dist/src/server/boost-profiles.d.ts +1 -1
- package/dist/src/server/boost-profiles.d.ts.map +1 -1
- package/dist/src/server/boost-profiles.js +116 -0
- package/dist/src/server/boost-profiles.js.map +1 -1
- package/dist/src/server/config.d.ts +45 -0
- package/dist/src/server/config.d.ts.map +1 -0
- package/dist/src/server/config.js +146 -0
- package/dist/src/server/config.js.map +1 -0
- package/dist/src/server/context.d.ts +29 -0
- package/dist/src/server/context.d.ts.map +1 -1
- package/dist/src/server/context.js +26 -1
- package/dist/src/server/context.js.map +1 -1
- package/dist/src/server/handlers/snippets-get.d.ts +36 -0
- package/dist/src/server/handlers/snippets-get.d.ts.map +1 -0
- package/dist/src/server/handlers/snippets-get.js +120 -0
- package/dist/src/server/handlers/snippets-get.js.map +1 -0
- package/dist/src/server/handlers.d.ts +32 -20
- package/dist/src/server/handlers.d.ts.map +1 -1
- package/dist/src/server/handlers.js +1554 -338
- 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 +49 -2
- 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 +7 -0
- package/dist/src/server/main.js.map +1 -1
- package/dist/src/server/profile-selector.d.ts +33 -0
- package/dist/src/server/profile-selector.d.ts.map +1 -0
- package/dist/src/server/profile-selector.js +291 -0
- package/dist/src/server/profile-selector.js.map +1 -0
- package/dist/src/server/rpc.d.ts.map +1 -1
- package/dist/src/server/rpc.js +36 -6
- package/dist/src/server/rpc.js.map +1 -1
- package/dist/src/server/runtime.d.ts.map +1 -1
- package/dist/src/server/runtime.js +14 -4
- package/dist/src/server/runtime.js.map +1 -1
- package/dist/src/server/scoring.d.ts +7 -1
- package/dist/src/server/scoring.d.ts.map +1 -1
- package/dist/src/server/scoring.js +121 -21
- package/dist/src/server/scoring.js.map +1 -1
- package/dist/src/server/services/index.d.ts +24 -0
- package/dist/src/server/services/index.d.ts.map +1 -0
- package/dist/src/server/services/index.js +20 -0
- package/dist/src/server/services/index.js.map +1 -0
- package/dist/src/server/services/repo-repository.d.ts +61 -0
- package/dist/src/server/services/repo-repository.d.ts.map +1 -0
- package/dist/src/server/services/repo-repository.js +93 -0
- package/dist/src/server/services/repo-repository.js.map +1 -0
- package/dist/src/server/services/repo-resolver.d.ts +28 -0
- package/dist/src/server/services/repo-resolver.d.ts.map +1 -0
- package/dist/src/server/services/repo-resolver.js +62 -0
- package/dist/src/server/services/repo-resolver.js.map +1 -0
- package/dist/src/shared/duckdb.d.ts.map +1 -1
- package/dist/src/shared/duckdb.js +21 -1
- package/dist/src/shared/duckdb.js.map +1 -1
- package/dist/src/shared/fs/safePath.d.ts +7 -0
- package/dist/src/shared/fs/safePath.d.ts.map +1 -0
- package/dist/src/shared/fs/safePath.js +23 -0
- package/dist/src/shared/fs/safePath.js.map +1 -0
- package/dist/src/shared/utils/glob.d.ts +5 -0
- package/dist/src/shared/utils/glob.d.ts.map +1 -0
- package/dist/src/shared/utils/glob.js +22 -0
- package/dist/src/shared/utils/glob.js.map +1 -0
- package/dist/src/shared/utils/retry.d.ts +8 -0
- package/dist/src/shared/utils/retry.d.ts.map +1 -0
- package/dist/src/shared/utils/retry.js +20 -0
- package/dist/src/shared/utils/retry.js.map +1 -0
- package/package.json +28 -22
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
let cachedConfig = null;
|
|
3
|
+
function envFlagEnabled(value, defaultEnabled) {
|
|
4
|
+
if (value === undefined) {
|
|
5
|
+
return defaultEnabled;
|
|
6
|
+
}
|
|
7
|
+
const normalized = value.trim().toLowerCase();
|
|
8
|
+
return normalized !== "0" && normalized !== "false" && normalized !== "off";
|
|
9
|
+
}
|
|
10
|
+
function parseEnvNumber(value, fallback) {
|
|
11
|
+
if (value === undefined) {
|
|
12
|
+
return fallback;
|
|
13
|
+
}
|
|
14
|
+
const parsed = Number.parseInt(value, 10);
|
|
15
|
+
if (Number.isFinite(parsed) && parsed >= 0) {
|
|
16
|
+
return parsed;
|
|
17
|
+
}
|
|
18
|
+
return fallback;
|
|
19
|
+
}
|
|
20
|
+
function parseEnvFloat(value, fallback) {
|
|
21
|
+
if (value === undefined) {
|
|
22
|
+
return fallback;
|
|
23
|
+
}
|
|
24
|
+
const parsed = Number.parseFloat(value);
|
|
25
|
+
if (Number.isFinite(parsed)) {
|
|
26
|
+
return parsed;
|
|
27
|
+
}
|
|
28
|
+
return fallback;
|
|
29
|
+
}
|
|
30
|
+
function validateServerConfig(config) {
|
|
31
|
+
const { features, hints, penalties } = config;
|
|
32
|
+
if (features.snippetWindow < 8) {
|
|
33
|
+
throw new Error("snippetWindow must be >= 8 to keep bundle context useful");
|
|
34
|
+
}
|
|
35
|
+
if (hints.priority.textMultiplier <= 0 || hints.priority.pathMultiplier <= 0) {
|
|
36
|
+
throw new Error("Hint priority multipliers must be positive numbers");
|
|
37
|
+
}
|
|
38
|
+
if (hints.priority.baseBonus <= 0) {
|
|
39
|
+
throw new Error("Hint priority base bonus must be positive");
|
|
40
|
+
}
|
|
41
|
+
if (hints.directory.limit < 0 || hints.directory.maxFiles < 1) {
|
|
42
|
+
throw new Error("Directory hint limits must be non-negative and maxFiles >= 1");
|
|
43
|
+
}
|
|
44
|
+
if (hints.dependency.outLimit < 0 || hints.dependency.inLimit < 0) {
|
|
45
|
+
throw new Error("Dependency hint limits must be non-negative");
|
|
46
|
+
}
|
|
47
|
+
if (hints.semantic.limit < 0 || hints.semantic.dirCandidateLimit < 1) {
|
|
48
|
+
throw new Error("Semantic hint limits must be non-negative and candidate limit >= 1");
|
|
49
|
+
}
|
|
50
|
+
if (hints.semantic.threshold <= 0 || hints.semantic.threshold > 1) {
|
|
51
|
+
throw new Error("Semantic hint threshold must be within (0, 1]");
|
|
52
|
+
}
|
|
53
|
+
if (hints.perHintLimit < 0) {
|
|
54
|
+
throw new Error("Per-hint limit must be >= 0");
|
|
55
|
+
}
|
|
56
|
+
if (hints.enabled && hints.perHintLimit < 1) {
|
|
57
|
+
throw new Error("Per-hint limit must be >= 1 when hints are enabled");
|
|
58
|
+
}
|
|
59
|
+
if (hints.dbQueryLimit < 0) {
|
|
60
|
+
throw new Error("Hint DB query budget must be >= 0");
|
|
61
|
+
}
|
|
62
|
+
if (hints.enabled && hints.dbQueryLimit < 1) {
|
|
63
|
+
throw new Error("Hint DB query budget must be >= 1 when hints are enabled");
|
|
64
|
+
}
|
|
65
|
+
if (hints.substring.limit < 0) {
|
|
66
|
+
throw new Error("Substring hint limit must be non-negative");
|
|
67
|
+
}
|
|
68
|
+
if (penalties.pathMissDelta > 0 || penalties.largeFileDelta > 0) {
|
|
69
|
+
throw new Error("Penalty deltas should be <= 0 (they reduce scores)");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function loadServerConfig() {
|
|
73
|
+
if (cachedConfig) {
|
|
74
|
+
return cachedConfig;
|
|
75
|
+
}
|
|
76
|
+
const suppressNonCode = envFlagEnabled(process.env.KIRI_SUPPRESS_NON_CODE, true);
|
|
77
|
+
const suppressFinalResults = envFlagEnabled(process.env.KIRI_SUPPRESS_FINAL_RESULTS, true);
|
|
78
|
+
const clampSnippets = envFlagEnabled(process.env.KIRI_CLAMP_SNIPPETS, true);
|
|
79
|
+
const snippetWindow = Math.max(8, parseEnvNumber(process.env.KIRI_SNIPPET_WINDOW, 16));
|
|
80
|
+
const directoryEnabled = envFlagEnabled(process.env.KIRI_HINT_ENABLE_DIR, false);
|
|
81
|
+
const dependencyEnabled = envFlagEnabled(process.env.KIRI_HINT_ENABLE_DEP, false);
|
|
82
|
+
const semanticEnabled = envFlagEnabled(process.env.KIRI_HINT_ENABLE_SEM, false);
|
|
83
|
+
const substringEnabled = envFlagEnabled(process.env.KIRI_HINT_ENABLE_SUBSTRING, true);
|
|
84
|
+
const hintsEnabled = directoryEnabled || dependencyEnabled || semanticEnabled;
|
|
85
|
+
const config = {
|
|
86
|
+
features: {
|
|
87
|
+
suppressNonCode,
|
|
88
|
+
suppressFinalResults,
|
|
89
|
+
clampSnippets,
|
|
90
|
+
snippetWindow,
|
|
91
|
+
},
|
|
92
|
+
hints: {
|
|
93
|
+
enabled: hintsEnabled,
|
|
94
|
+
priority: {
|
|
95
|
+
textMultiplier: parseEnvFloat(process.env.KIRI_HINT_TEXT_MULTIPLIER, 6),
|
|
96
|
+
pathMultiplier: parseEnvFloat(process.env.KIRI_HINT_PATH_MULTIPLIER, 2),
|
|
97
|
+
baseBonus: parseEnvFloat(process.env.KIRI_HINT_BASE_BONUS, 5),
|
|
98
|
+
},
|
|
99
|
+
directory: {
|
|
100
|
+
enabled: directoryEnabled,
|
|
101
|
+
limit: directoryEnabled
|
|
102
|
+
? Math.max(0, parseEnvNumber(process.env.KIRI_HINT_NEAR_LIMIT_DIR, 2))
|
|
103
|
+
: 0,
|
|
104
|
+
maxFiles: Math.max(1, parseEnvNumber(process.env.KIRI_HINT_NEAR_MAX_FILES, 10)),
|
|
105
|
+
},
|
|
106
|
+
dependency: {
|
|
107
|
+
enabled: dependencyEnabled,
|
|
108
|
+
outLimit: dependencyEnabled
|
|
109
|
+
? Math.max(0, parseEnvNumber(process.env.KIRI_HINT_DEP_OUT_LIMIT, 1))
|
|
110
|
+
: 0,
|
|
111
|
+
inLimit: dependencyEnabled
|
|
112
|
+
? Math.max(0, parseEnvNumber(process.env.KIRI_HINT_DEP_IN_LIMIT, 1))
|
|
113
|
+
: 0,
|
|
114
|
+
},
|
|
115
|
+
semantic: {
|
|
116
|
+
enabled: semanticEnabled,
|
|
117
|
+
limit: semanticEnabled
|
|
118
|
+
? Math.max(0, parseEnvNumber(process.env.KIRI_HINT_SEM_LIMIT, 2))
|
|
119
|
+
: 0,
|
|
120
|
+
dirCandidateLimit: Math.max(1, parseEnvNumber(process.env.KIRI_HINT_SEM_DIR_CANDIDATES, 20)),
|
|
121
|
+
threshold: parseEnvFloat(process.env.KIRI_HINT_SEM_THRESHOLD, 0.65),
|
|
122
|
+
},
|
|
123
|
+
substring: {
|
|
124
|
+
enabled: substringEnabled,
|
|
125
|
+
limit: substringEnabled
|
|
126
|
+
? Math.max(0, parseEnvNumber(process.env.KIRI_HINT_SUBSTRING_LIMIT, 3))
|
|
127
|
+
: 0,
|
|
128
|
+
boost: parseEnvFloat(process.env.KIRI_HINT_SUBSTRING_BOOST, 3),
|
|
129
|
+
},
|
|
130
|
+
perHintLimit: hintsEnabled
|
|
131
|
+
? Math.max(1, parseEnvNumber(process.env.KIRI_HINT_PER_HINT_LIMIT, 6))
|
|
132
|
+
: 0,
|
|
133
|
+
dbQueryLimit: hintsEnabled
|
|
134
|
+
? Math.max(1, parseEnvNumber(process.env.KIRI_HINT_DB_QUERY_LIMIT, 12))
|
|
135
|
+
: 0,
|
|
136
|
+
},
|
|
137
|
+
penalties: {
|
|
138
|
+
pathMissDelta: parseEnvFloat(process.env.KIRI_PATH_MISS_DELTA, -0.5),
|
|
139
|
+
largeFileDelta: parseEnvFloat(process.env.KIRI_LARGE_FILE_DELTA, -0.8),
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
validateServerConfig(config);
|
|
143
|
+
cachedConfig = config;
|
|
144
|
+
return config;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/server/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,47 @@
|
|
|
1
1
|
import { DuckDBClient } from "../shared/duckdb.js";
|
|
2
2
|
import { WarningManager } from "./rpc.js";
|
|
3
|
+
import { ServerServices } from "./services/index.js";
|
|
3
4
|
export interface FtsStatusCache {
|
|
4
5
|
ready: boolean;
|
|
5
6
|
schemaExists: boolean;
|
|
6
7
|
anyDirty: boolean;
|
|
7
8
|
lastChecked: number;
|
|
8
9
|
}
|
|
10
|
+
export interface TableAvailability {
|
|
11
|
+
hasMetadataTables: boolean;
|
|
12
|
+
hasLinkTable: boolean;
|
|
13
|
+
hasHintLog: boolean;
|
|
14
|
+
hasHintDictionary: boolean;
|
|
15
|
+
}
|
|
9
16
|
export interface ServerContext {
|
|
10
17
|
db: DuckDBClient;
|
|
11
18
|
repoId: number;
|
|
19
|
+
services: ServerServices;
|
|
12
20
|
features?: {
|
|
13
21
|
fts?: boolean;
|
|
14
22
|
};
|
|
15
23
|
ftsStatusCache?: FtsStatusCache;
|
|
24
|
+
tableAvailability: TableAvailability;
|
|
16
25
|
warningManager: WarningManager;
|
|
17
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* createServerContext
|
|
29
|
+
*
|
|
30
|
+
* ServerContext を生成するファクトリ関数。
|
|
31
|
+
* テストや複数のエントリポイントで共通の初期化パスを提供する。
|
|
32
|
+
*
|
|
33
|
+
* @param options - コンテキスト初期化オプション
|
|
34
|
+
* @returns 初期化された ServerContext
|
|
35
|
+
*/
|
|
36
|
+
export declare function createServerContext(options: {
|
|
37
|
+
db: DuckDBClient;
|
|
38
|
+
repoId: number;
|
|
39
|
+
services: ServerServices;
|
|
40
|
+
features?: {
|
|
41
|
+
fts?: boolean;
|
|
42
|
+
};
|
|
43
|
+
ftsStatusCache?: FtsStatusCache;
|
|
44
|
+
tableAvailability: TableAvailability;
|
|
45
|
+
warningManager: WarningManager;
|
|
46
|
+
}): ServerContext;
|
|
18
47
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/server/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/server/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,YAAY,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;IACF,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,cAAc,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,EAAE,EAAE,YAAY,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,cAAc,CAAC;CAChC,GAAG,aAAa,CAmBhB"}
|
|
@@ -1,2 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* createServerContext
|
|
3
|
+
*
|
|
4
|
+
* ServerContext を生成するファクトリ関数。
|
|
5
|
+
* テストや複数のエントリポイントで共通の初期化パスを提供する。
|
|
6
|
+
*
|
|
7
|
+
* @param options - コンテキスト初期化オプション
|
|
8
|
+
* @returns 初期化された ServerContext
|
|
9
|
+
*/
|
|
10
|
+
export function createServerContext(options) {
|
|
11
|
+
const context = {
|
|
12
|
+
db: options.db,
|
|
13
|
+
repoId: options.repoId,
|
|
14
|
+
services: options.services,
|
|
15
|
+
tableAvailability: options.tableAvailability,
|
|
16
|
+
warningManager: options.warningManager,
|
|
17
|
+
};
|
|
18
|
+
// exactOptionalPropertyTypes: true を満たすため、undefined の場合は代入しない
|
|
19
|
+
if (options.features !== undefined) {
|
|
20
|
+
context.features = options.features;
|
|
21
|
+
}
|
|
22
|
+
if (options.ftsStatusCache !== undefined) {
|
|
23
|
+
context.ftsStatusCache = options.ftsStatusCache;
|
|
24
|
+
}
|
|
25
|
+
return context;
|
|
26
|
+
}
|
|
2
27
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/server/context.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/server/context.ts"],"names":[],"mappings":"AA+BA;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAQnC;IACC,MAAM,OAAO,GAAkB;QAC7B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC;IAEF,8DAA8D;IAC9D,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACtC,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAClD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ServerContext } from "../context.js";
|
|
2
|
+
/**
|
|
3
|
+
* snippets_get tool のパラメータ
|
|
4
|
+
*/
|
|
5
|
+
export interface SnippetsGetParams {
|
|
6
|
+
path: string;
|
|
7
|
+
start_line?: number;
|
|
8
|
+
end_line?: number;
|
|
9
|
+
compact?: boolean;
|
|
10
|
+
includeLineNumbers?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* snippets_get tool のレスポンス
|
|
14
|
+
*/
|
|
15
|
+
export interface SnippetResult {
|
|
16
|
+
path: string;
|
|
17
|
+
startLine: number;
|
|
18
|
+
endLine: number;
|
|
19
|
+
content?: string;
|
|
20
|
+
totalLines: number;
|
|
21
|
+
symbolName: string | null;
|
|
22
|
+
symbolKind: string | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* snippets_get MCP Tool Handler
|
|
26
|
+
*
|
|
27
|
+
* 指定されたファイルパスから、シンボル境界を考慮したコードスニペットを取得する。
|
|
28
|
+
* start_line/end_line が指定されていない場合、最適なシンボル(関数、クラスなど)を自動選択する。
|
|
29
|
+
*
|
|
30
|
+
* @param context - サーバーコンテキスト(DB、repoId等)
|
|
31
|
+
* @param params - snippets_get パラメータ
|
|
32
|
+
* @returns スニペット結果
|
|
33
|
+
* @throws Error ファイルが見つからない、バイナリファイル、コンテンツが利用不可の場合
|
|
34
|
+
*/
|
|
35
|
+
export declare function snippetsGet(context: ServerContext, params: SnippetsGetParams): Promise<SnippetResult>;
|
|
36
|
+
//# sourceMappingURL=snippets-get.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippets-get.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/snippets-get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAmDD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,aAAa,CAAC,CAmHxB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_SNIPPET_WINDOW = 150;
|
|
5
|
+
/**
|
|
6
|
+
* 行番号をプレフィックスとして追加する(動的幅調整)
|
|
7
|
+
*
|
|
8
|
+
* @param snippet - スニペットの内容
|
|
9
|
+
* @param startLine - 開始行番号(1-indexed)
|
|
10
|
+
* @returns 行番号付きスニペット
|
|
11
|
+
*/
|
|
12
|
+
function prependLineNumbers(snippet, startLine) {
|
|
13
|
+
const lines = snippet.split(/\r?\n/);
|
|
14
|
+
if (lines.length === 0) {
|
|
15
|
+
return snippet;
|
|
16
|
+
}
|
|
17
|
+
// Calculate required width from the last line number (dynamic sizing)
|
|
18
|
+
const endLine = startLine + lines.length - 1;
|
|
19
|
+
const width = String(endLine).length;
|
|
20
|
+
return lines
|
|
21
|
+
.map((line, index) => `${String(startLine + index).padStart(width, " ")}→${line}`)
|
|
22
|
+
.join("\n");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* snippets_get MCP Tool Handler
|
|
26
|
+
*
|
|
27
|
+
* 指定されたファイルパスから、シンボル境界を考慮したコードスニペットを取得する。
|
|
28
|
+
* start_line/end_line が指定されていない場合、最適なシンボル(関数、クラスなど)を自動選択する。
|
|
29
|
+
*
|
|
30
|
+
* @param context - サーバーコンテキスト(DB、repoId等)
|
|
31
|
+
* @param params - snippets_get パラメータ
|
|
32
|
+
* @returns スニペット結果
|
|
33
|
+
* @throws Error ファイルが見つからない、バイナリファイル、コンテンツが利用不可の場合
|
|
34
|
+
*/
|
|
35
|
+
export async function snippetsGet(context, params) {
|
|
36
|
+
const { db, repoId } = context;
|
|
37
|
+
if (!params.path) {
|
|
38
|
+
throw new Error("snippets_get requires a file path. Specify a tracked text file path to continue.");
|
|
39
|
+
}
|
|
40
|
+
const rows = await db.all(`
|
|
41
|
+
SELECT f.path, f.lang, f.ext, f.is_binary, b.content
|
|
42
|
+
FROM file f
|
|
43
|
+
JOIN blob b ON b.hash = f.blob_hash
|
|
44
|
+
WHERE f.repo_id = ? AND f.path = ?
|
|
45
|
+
LIMIT 1
|
|
46
|
+
`, [repoId, params.path]);
|
|
47
|
+
if (rows.length === 0) {
|
|
48
|
+
throw new Error(`Requested snippet file ${params.path} was not indexed. Re-run the indexer or choose another path.`);
|
|
49
|
+
}
|
|
50
|
+
const row = rows[0];
|
|
51
|
+
if (!row) {
|
|
52
|
+
throw new Error(`Requested snippet file ${params.path} was not indexed. Re-run the indexer or choose another path.`);
|
|
53
|
+
}
|
|
54
|
+
if (row.is_binary) {
|
|
55
|
+
throw new Error("Binary snippets are not supported. Choose a text file to preview its content.");
|
|
56
|
+
}
|
|
57
|
+
if (row.content === null) {
|
|
58
|
+
throw new Error(`Snippet content was NULL for ${params.path}. Re-run the indexer with --full to repopulate blob content.`);
|
|
59
|
+
}
|
|
60
|
+
const lines = row.content.split(/\r?\n/);
|
|
61
|
+
const totalLines = lines.length;
|
|
62
|
+
const snippetRows = await db.all(`
|
|
63
|
+
SELECT s.snippet_id, s.start_line, s.end_line, s.symbol_id, sym.name AS symbol_name, sym.kind AS symbol_kind
|
|
64
|
+
FROM snippet s
|
|
65
|
+
LEFT JOIN symbol sym
|
|
66
|
+
ON sym.repo_id = s.repo_id
|
|
67
|
+
AND sym.path = s.path
|
|
68
|
+
AND sym.symbol_id = s.symbol_id
|
|
69
|
+
WHERE s.repo_id = ? AND s.path = ?
|
|
70
|
+
ORDER BY s.start_line
|
|
71
|
+
`, [repoId, params.path]);
|
|
72
|
+
const requestedStart = params.start_line ?? 1;
|
|
73
|
+
const requestedEnd = params.end_line ?? Math.min(totalLines, requestedStart + DEFAULT_SNIPPET_WINDOW - 1);
|
|
74
|
+
const useSymbolSnippets = snippetRows.length > 0 && params.end_line === undefined;
|
|
75
|
+
let snippetSelection = null;
|
|
76
|
+
if (useSymbolSnippets) {
|
|
77
|
+
snippetSelection =
|
|
78
|
+
snippetRows.find((snippet) => requestedStart >= snippet.start_line && requestedStart <= snippet.end_line) ?? null;
|
|
79
|
+
if (!snippetSelection) {
|
|
80
|
+
const firstSnippet = snippetRows[0];
|
|
81
|
+
if (firstSnippet && requestedStart < firstSnippet.start_line) {
|
|
82
|
+
snippetSelection = firstSnippet;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
snippetSelection = snippetRows[snippetRows.length - 1] ?? null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
let startLine;
|
|
90
|
+
let endLine;
|
|
91
|
+
let symbolName = null;
|
|
92
|
+
let symbolKind = null;
|
|
93
|
+
if (snippetSelection) {
|
|
94
|
+
startLine = snippetSelection.start_line;
|
|
95
|
+
endLine = snippetSelection.end_line;
|
|
96
|
+
symbolName = snippetSelection.symbol_name;
|
|
97
|
+
symbolKind = snippetSelection.symbol_kind;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
startLine = Math.max(1, Math.min(totalLines, requestedStart));
|
|
101
|
+
endLine = Math.max(startLine, Math.min(totalLines, requestedEnd));
|
|
102
|
+
}
|
|
103
|
+
const isCompact = params.compact === true;
|
|
104
|
+
const addLineNumbers = params.includeLineNumbers === true && !isCompact;
|
|
105
|
+
let content;
|
|
106
|
+
if (!isCompact) {
|
|
107
|
+
const snippetContent = lines.slice(startLine - 1, endLine).join("\n");
|
|
108
|
+
content = addLineNumbers ? prependLineNumbers(snippetContent, startLine) : snippetContent;
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
path: row.path,
|
|
112
|
+
startLine,
|
|
113
|
+
endLine,
|
|
114
|
+
...(content !== undefined && { content }),
|
|
115
|
+
totalLines,
|
|
116
|
+
symbolName,
|
|
117
|
+
symbolKind,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=snippets-get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippets-get.js","sourceRoot":"","sources":["../../../../src/server/handlers/snippets-get.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import { DuckDBClient } from "../shared/duckdb.js";
|
|
2
2
|
import { type BoostProfileName } from "./boost-profiles.js";
|
|
3
|
-
import { ServerContext } from "./context.js";
|
|
3
|
+
import { ServerContext, TableAvailability } from "./context.js";
|
|
4
|
+
import { ServerServices } from "./services/index.js";
|
|
5
|
+
export { snippetsGet, type SnippetsGetParams, type SnippetResult, } from "./handlers/snippets-get.js";
|
|
6
|
+
/**
|
|
7
|
+
* checkTableAvailability
|
|
8
|
+
*
|
|
9
|
+
* 起動時にテーブルの存在を確認し、TableAvailabilityオブジェクトを生成する。
|
|
10
|
+
* これにより、グローバルミュータブル変数による競合状態を回避する。
|
|
11
|
+
*
|
|
12
|
+
* NOTE: スキーマ変更(テーブル追加)後はサーバーの再起動が必要です。
|
|
13
|
+
*
|
|
14
|
+
* @param db - DuckDBClient インスタンス
|
|
15
|
+
* @returns TableAvailability オブジェクト
|
|
16
|
+
* @throws データベース接続エラー等、テーブル不在以外のエラーが発生した場合
|
|
17
|
+
*/
|
|
18
|
+
export declare function checkTableAvailability(db: DuckDBClient): Promise<TableAvailability>;
|
|
4
19
|
export interface FilesSearchParams {
|
|
5
20
|
query: string;
|
|
6
21
|
lang?: string;
|
|
@@ -9,6 +24,7 @@ export interface FilesSearchParams {
|
|
|
9
24
|
limit?: number;
|
|
10
25
|
boost_profile?: BoostProfileName;
|
|
11
26
|
compact?: boolean;
|
|
27
|
+
metadata_filters?: Record<string, string | string[]>;
|
|
12
28
|
}
|
|
13
29
|
export interface FilesSearchResult {
|
|
14
30
|
path: string;
|
|
@@ -18,26 +34,11 @@ export interface FilesSearchResult {
|
|
|
18
34
|
ext: string | null;
|
|
19
35
|
score: number;
|
|
20
36
|
}
|
|
21
|
-
export interface SnippetsGetParams {
|
|
22
|
-
path: string;
|
|
23
|
-
start_line?: number;
|
|
24
|
-
end_line?: number;
|
|
25
|
-
compact?: boolean;
|
|
26
|
-
includeLineNumbers?: boolean;
|
|
27
|
-
}
|
|
28
|
-
export interface SnippetResult {
|
|
29
|
-
path: string;
|
|
30
|
-
startLine: number;
|
|
31
|
-
endLine: number;
|
|
32
|
-
content?: string;
|
|
33
|
-
totalLines: number;
|
|
34
|
-
symbolName: string | null;
|
|
35
|
-
symbolKind: string | null;
|
|
36
|
-
}
|
|
37
37
|
export interface ContextBundleArtifacts {
|
|
38
38
|
editing_path?: string;
|
|
39
39
|
failing_tests?: string[];
|
|
40
40
|
last_diff?: string;
|
|
41
|
+
hints?: string[];
|
|
41
42
|
}
|
|
42
43
|
export interface ContextBundleParams {
|
|
43
44
|
goal: string;
|
|
@@ -47,6 +48,7 @@ export interface ContextBundleParams {
|
|
|
47
48
|
boost_profile?: BoostProfileName;
|
|
48
49
|
compact?: boolean;
|
|
49
50
|
includeTokensEstimate?: boolean;
|
|
51
|
+
metadata_filters?: Record<string, string | string[]>;
|
|
50
52
|
}
|
|
51
53
|
export interface ContextBundleItem {
|
|
52
54
|
path: string;
|
|
@@ -104,9 +106,19 @@ export interface DepsClosureResult {
|
|
|
104
106
|
edges: DepsClosureEdge[];
|
|
105
107
|
}
|
|
106
108
|
export declare function filesSearch(context: ServerContext, params: FilesSearchParams): Promise<FilesSearchResult[]>;
|
|
107
|
-
export declare function snippetsGet(context: ServerContext, params: SnippetsGetParams): Promise<SnippetResult>;
|
|
108
|
-
export declare function contextBundle(context: ServerContext, params: ContextBundleParams): Promise<ContextBundleResult>;
|
|
109
109
|
export declare function semanticRerank(context: ServerContext, params: SemanticRerankParams): Promise<SemanticRerankResult>;
|
|
110
110
|
export declare function depsClosure(context: ServerContext, params: DepsClosureParams): Promise<DepsClosureResult>;
|
|
111
|
-
|
|
111
|
+
/**
|
|
112
|
+
* リポジトリのrootパスをデータベースIDに解決する。
|
|
113
|
+
*
|
|
114
|
+
* この関数は下位互換性のために保持されているが、内部的には新しいRepoResolverを使用する。
|
|
115
|
+
*
|
|
116
|
+
* @param db - DuckDBクライアント
|
|
117
|
+
* @param repoRoot - リポジトリのrootパス
|
|
118
|
+
* @param services - オプショナルなServerServices(指定がなければ新規作成される)
|
|
119
|
+
* @returns リポジトリID
|
|
120
|
+
* @throws Error リポジトリがインデックスされていない場合
|
|
121
|
+
*/
|
|
122
|
+
export declare function resolveRepoId(db: DuckDBClient, repoRoot: string, services?: ServerServices): Promise<number>;
|
|
123
|
+
export declare function contextBundle(context: ServerContext, params: ContextBundleParams): Promise<ContextBundleResult>;
|
|
112
124
|
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/server/handlers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/server/handlers.ts"],"names":[],"mappings":"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"}
|