kiri-mcp-server 0.10.0 → 0.12.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 +52 -10
- package/config/kiri.yml +25 -0
- package/config/scoring-profiles.yml +82 -35
- package/dist/config/kiri.yml +25 -0
- 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 +6 -5
- package/dist/src/server/boost-profiles.d.ts.map +1 -1
- package/dist/src/server/boost-profiles.js +138 -0
- package/dist/src/server/boost-profiles.js.map +1 -1
- package/dist/src/server/config-loader.d.ts +9 -0
- package/dist/src/server/config-loader.d.ts.map +1 -0
- package/dist/src/server/config-loader.js +121 -0
- package/dist/src/server/config-loader.js.map +1 -0
- package/dist/src/server/config.d.ts +47 -0
- package/dist/src/server/config.d.ts.map +1 -0
- package/dist/src/server/config.js +157 -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 +33 -20
- package/dist/src/server/handlers.d.ts.map +1 -1
- package/dist/src/server/handlers.js +1805 -370
- 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 +60 -10
- 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/tokenizer.d.ts +1 -1
- package/dist/src/shared/tokenizer.d.ts.map +1 -1
- package/dist/src/shared/tokenizer.js +97 -15
- package/dist/src/shared/tokenizer.js.map +1 -1
- 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 +9 -1
|
@@ -3,10 +3,12 @@ import { checkFTSAvailability } from "../indexer/schema.js";
|
|
|
3
3
|
import { DuckDBClient } from "../shared/duckdb.js";
|
|
4
4
|
import { ensureDbParentDir, normalizeDbPath, getRepoPathCandidates } from "../shared/utils/path.js";
|
|
5
5
|
import { bootstrapServer } from "./bootstrap.js";
|
|
6
|
+
import { createServerContext } from "./context.js";
|
|
6
7
|
import { DegradeController } from "./fallbacks/degradeController.js";
|
|
7
|
-
import { resolveRepoId } from "./handlers.js";
|
|
8
|
+
import { checkTableAvailability, resolveRepoId } from "./handlers.js";
|
|
8
9
|
import { MetricsRegistry } from "./observability/metrics.js";
|
|
9
10
|
import { WarningManager } from "./rpc.js";
|
|
11
|
+
import { createServerServices } from "./services/index.js";
|
|
10
12
|
export async function createServerRuntime(options) {
|
|
11
13
|
const repoPathCandidates = getRepoPathCandidates(options.repoRoot);
|
|
12
14
|
const repoRoot = repoPathCandidates[0];
|
|
@@ -32,7 +34,11 @@ export async function createServerRuntime(options) {
|
|
|
32
34
|
let db = null;
|
|
33
35
|
try {
|
|
34
36
|
db = await DuckDBClient.connect({ databasePath, ensureDirectory: true });
|
|
35
|
-
|
|
37
|
+
// Phase 1: Initialize server services (single instance for request sharing)
|
|
38
|
+
const services = createServerServices(db);
|
|
39
|
+
const repoId = await resolveRepoId(db, options.repoRoot, services);
|
|
40
|
+
// DEBUG: Log resolved repo_id for troubleshooting golden set evaluation
|
|
41
|
+
console.log(`[DEBUG runtime] Resolved repo_id=${repoId} for repoRoot="${options.repoRoot}" (databasePath="${databasePath}")`);
|
|
36
42
|
// Phase 2: FTS拡張の利用可否を確認(作成はしない)
|
|
37
43
|
let hasFTS = await checkFTSAvailability(db);
|
|
38
44
|
const ftsStatus = {
|
|
@@ -66,15 +72,19 @@ export async function createServerRuntime(options) {
|
|
|
66
72
|
}
|
|
67
73
|
}
|
|
68
74
|
const warningManager = new WarningManager();
|
|
69
|
-
|
|
75
|
+
// Phase 4: Check table availability at startup
|
|
76
|
+
const tableAvailability = await checkTableAvailability(db);
|
|
77
|
+
const context = createServerContext({
|
|
70
78
|
db,
|
|
71
79
|
repoId,
|
|
80
|
+
services,
|
|
72
81
|
features: {
|
|
73
82
|
fts: hasFTS,
|
|
74
83
|
},
|
|
75
84
|
ftsStatusCache: ftsStatus,
|
|
85
|
+
tableAvailability,
|
|
76
86
|
warningManager,
|
|
77
|
-
};
|
|
87
|
+
});
|
|
78
88
|
const degrade = new DegradeController(repoRoot);
|
|
79
89
|
const metrics = new MetricsRegistry();
|
|
80
90
|
const tokens = bootstrap.security.config.sensitive_tokens ?? [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/server/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEpG,OAAO,EAAE,eAAe,EAAyB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/server/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,8 +21,14 @@ export interface ScoringWeights {
|
|
|
21
21
|
configPenaltyMultiplier: number;
|
|
22
22
|
/** 実装ファイルへの乗算的ブースト(1.0以上、デフォルト: 1.3 = 30%ブースト) */
|
|
23
23
|
implBoostMultiplier: number;
|
|
24
|
+
/** ブラックリストディレクトリへの乗算的ペナルティ(0.0-1.0、デフォルト: 0.01 = 99%削減) */
|
|
25
|
+
blacklistPenaltyMultiplier: number;
|
|
26
|
+
/** テストファイルへの乗算的ペナルティ(0.0-1.0、デフォルト: 0.05 = 95%削減) */
|
|
27
|
+
testPenaltyMultiplier: number;
|
|
28
|
+
/** Lockファイルへの乗算的ペナルティ(0.0-1.0、デフォルト: 0.01 = 99%削減) */
|
|
29
|
+
lockPenaltyMultiplier: number;
|
|
24
30
|
}
|
|
25
|
-
export type ScoringProfileName = "default" | "bugfix" | "testfail" | "typeerror" | "feature";
|
|
31
|
+
export type ScoringProfileName = "default" | "bugfix" | "testfail" | "typeerror" | "feature" | "debug" | "api" | "editor";
|
|
26
32
|
export declare function coerceProfileName(name?: string | null): ScoringProfileName | null;
|
|
27
33
|
export declare function loadScoringProfile(profileName?: ScoringProfileName | null): ScoringWeights;
|
|
28
34
|
//# sourceMappingURL=scoring.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../../src/server/scoring.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oDAAoD;IACpD,uBAAuB,EAAE,MAAM,CAAC;IAChC,kDAAkD;IAClD,mBAAmB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../../src/server/scoring.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oDAAoD;IACpD,uBAAuB,EAAE,MAAM,CAAC;IAChC,kDAAkD;IAClD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2DAA2D;IAC3D,0BAA0B,EAAE,MAAM,CAAC;IACnC,qDAAqD;IACrD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sDAAsD;IACtD,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,QAAQ,GACR,UAAU,GACV,WAAW,GACX,SAAS,GACT,OAAO,GACP,KAAK,GACL,QAAQ,CAAC;AA4Rb,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB,GAAG,IAAI,CAOjF;AAED,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,kBAAkB,GAAG,IAAI,GAAG,cAAc,CAO1F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { parseSimpleYaml } from "../shared/utils/simpleYaml.js";
|
|
@@ -22,16 +22,75 @@ function validateWeights(weights, profileName) {
|
|
|
22
22
|
"docPenaltyMultiplier",
|
|
23
23
|
"configPenaltyMultiplier",
|
|
24
24
|
"implBoostMultiplier",
|
|
25
|
+
"blacklistPenaltyMultiplier",
|
|
26
|
+
"testPenaltyMultiplier",
|
|
27
|
+
"lockPenaltyMultiplier",
|
|
25
28
|
];
|
|
26
29
|
const obj = weights;
|
|
30
|
+
// v1.0.0: Provide default values for new fields (backward compatibility)
|
|
31
|
+
if (obj.blacklistPenaltyMultiplier === undefined) {
|
|
32
|
+
console.warn(`[KIRI] Profile '${profileName}' missing blacklistPenaltyMultiplier, using default 0.01`);
|
|
33
|
+
obj.blacklistPenaltyMultiplier = 0.01;
|
|
34
|
+
}
|
|
35
|
+
if (obj.testPenaltyMultiplier === undefined) {
|
|
36
|
+
console.warn(`[KIRI] Profile '${profileName}' missing testPenaltyMultiplier, using default 0.02`);
|
|
37
|
+
obj.testPenaltyMultiplier = 0.02;
|
|
38
|
+
}
|
|
39
|
+
if (obj.lockPenaltyMultiplier === undefined) {
|
|
40
|
+
console.warn(`[KIRI] Profile '${profileName}' missing lockPenaltyMultiplier, using default 0.01`);
|
|
41
|
+
obj.lockPenaltyMultiplier = 0.01;
|
|
42
|
+
}
|
|
27
43
|
for (const key of required) {
|
|
28
44
|
const value = obj[key];
|
|
29
45
|
if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
|
|
30
46
|
throw new Error(`Profile '${profileName}' has invalid ${key}: ${String(value)}. Must be a non-negative finite number.`);
|
|
31
47
|
}
|
|
32
48
|
}
|
|
49
|
+
if (obj.docPenaltyMultiplier > 1) {
|
|
50
|
+
throw new Error(`Profile '${profileName}' has docPenaltyMultiplier > 1 (${obj.docPenaltyMultiplier}). Penalties must be ≤ 1.`);
|
|
51
|
+
}
|
|
52
|
+
if (obj.configPenaltyMultiplier > 1) {
|
|
53
|
+
throw new Error(`Profile '${profileName}' has configPenaltyMultiplier > 1 (${obj.configPenaltyMultiplier}). Penalties must be ≤ 1.`);
|
|
54
|
+
}
|
|
55
|
+
if (obj.implBoostMultiplier < 1) {
|
|
56
|
+
throw new Error(`Profile '${profileName}' has implBoostMultiplier < 1 (${obj.implBoostMultiplier}). Boost multipliers must be ≥ 1.`);
|
|
57
|
+
}
|
|
58
|
+
if (obj.blacklistPenaltyMultiplier > 1) {
|
|
59
|
+
throw new Error(`Profile '${profileName}' has blacklistPenaltyMultiplier > 1 (${obj.blacklistPenaltyMultiplier}). Penalties must be ≤ 1.`);
|
|
60
|
+
}
|
|
61
|
+
if (obj.testPenaltyMultiplier > 1) {
|
|
62
|
+
throw new Error(`Profile '${profileName}' has testPenaltyMultiplier > 1 (${obj.testPenaltyMultiplier}). Penalties must be ≤ 1.`);
|
|
63
|
+
}
|
|
64
|
+
if (obj.lockPenaltyMultiplier > 1) {
|
|
65
|
+
throw new Error(`Profile '${profileName}' has lockPenaltyMultiplier > 1 (${obj.lockPenaltyMultiplier}). Penalties must be ≤ 1.`);
|
|
66
|
+
}
|
|
67
|
+
const totalWeight = obj.textMatch +
|
|
68
|
+
obj.pathMatch +
|
|
69
|
+
obj.editingPath +
|
|
70
|
+
obj.dependency +
|
|
71
|
+
obj.proximity +
|
|
72
|
+
obj.structural;
|
|
73
|
+
if (totalWeight < 2 || totalWeight > 15) {
|
|
74
|
+
console.warn(`Profile '${profileName}' has unusual aggregate weight ${totalWeight.toFixed(2)}. Review weight balance if this was unintentional.`);
|
|
75
|
+
}
|
|
33
76
|
return weights;
|
|
34
77
|
}
|
|
78
|
+
function resolveScoringConfigPath(currentDir) {
|
|
79
|
+
const envPath = process.env.KIRI_SCORING_CONFIG;
|
|
80
|
+
const candidates = [
|
|
81
|
+
envPath,
|
|
82
|
+
join(process.cwd(), "config/scoring-profiles.yml"),
|
|
83
|
+
join(currentDir, "../../../config/scoring-profiles.yml"),
|
|
84
|
+
join(currentDir, "../../../../config/scoring-profiles.yml"),
|
|
85
|
+
].filter((candidate) => Boolean(candidate));
|
|
86
|
+
for (const candidate of candidates) {
|
|
87
|
+
if (existsSync(candidate)) {
|
|
88
|
+
return candidate;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
throw new Error(`Scoring profiles config not found. Checked paths: ${candidates.join(", ")}. ` +
|
|
92
|
+
"Set KIRI_SCORING_CONFIG or place config/scoring-profiles.yml in the repo root.");
|
|
93
|
+
}
|
|
35
94
|
function loadProfilesFromConfig() {
|
|
36
95
|
if (profilesCache) {
|
|
37
96
|
return profilesCache;
|
|
@@ -40,7 +99,7 @@ function loadProfilesFromConfig() {
|
|
|
40
99
|
// 環境変数でカスタムパスを指定可能
|
|
41
100
|
// 開発環境(src/)と本番環境(dist/src/)の両方で動作するようにdirname(__filename)から相対パス解決
|
|
42
101
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
43
|
-
const configPath =
|
|
102
|
+
const configPath = resolveScoringConfigPath(__dirname);
|
|
44
103
|
const configContent = readFileSync(configPath, "utf-8");
|
|
45
104
|
const parsed = parseSimpleYaml(configContent);
|
|
46
105
|
// 必須プロファイルの検証とウェイトのバリデーション
|
|
@@ -50,6 +109,9 @@ function loadProfilesFromConfig() {
|
|
|
50
109
|
"testfail",
|
|
51
110
|
"typeerror",
|
|
52
111
|
"feature",
|
|
112
|
+
"debug",
|
|
113
|
+
"api",
|
|
114
|
+
"editor",
|
|
53
115
|
];
|
|
54
116
|
const validated = {};
|
|
55
117
|
for (const profile of requiredProfiles) {
|
|
@@ -75,6 +137,51 @@ function loadProfilesFromConfig() {
|
|
|
75
137
|
docPenaltyMultiplier: 0.5,
|
|
76
138
|
configPenaltyMultiplier: 0.05,
|
|
77
139
|
implBoostMultiplier: 1.3,
|
|
140
|
+
blacklistPenaltyMultiplier: 0.01,
|
|
141
|
+
testPenaltyMultiplier: 0.02,
|
|
142
|
+
lockPenaltyMultiplier: 0.01,
|
|
143
|
+
},
|
|
144
|
+
debug: {
|
|
145
|
+
textMatch: 1.0,
|
|
146
|
+
pathMatch: 1.3,
|
|
147
|
+
editingPath: 1.7,
|
|
148
|
+
dependency: 1.2,
|
|
149
|
+
proximity: 0.35,
|
|
150
|
+
structural: 0.9,
|
|
151
|
+
docPenaltyMultiplier: 0.5,
|
|
152
|
+
configPenaltyMultiplier: 0.05,
|
|
153
|
+
implBoostMultiplier: 1.45,
|
|
154
|
+
blacklistPenaltyMultiplier: 0.01,
|
|
155
|
+
testPenaltyMultiplier: 0.02,
|
|
156
|
+
lockPenaltyMultiplier: 0.01,
|
|
157
|
+
},
|
|
158
|
+
api: {
|
|
159
|
+
textMatch: 1.0,
|
|
160
|
+
pathMatch: 1.5,
|
|
161
|
+
editingPath: 1.8,
|
|
162
|
+
dependency: 1.0,
|
|
163
|
+
proximity: 0.3,
|
|
164
|
+
structural: 0.95,
|
|
165
|
+
docPenaltyMultiplier: 0.55,
|
|
166
|
+
configPenaltyMultiplier: 0.05,
|
|
167
|
+
implBoostMultiplier: 1.4,
|
|
168
|
+
blacklistPenaltyMultiplier: 0.01,
|
|
169
|
+
testPenaltyMultiplier: 0.02,
|
|
170
|
+
lockPenaltyMultiplier: 0.01,
|
|
171
|
+
},
|
|
172
|
+
editor: {
|
|
173
|
+
textMatch: 1.0,
|
|
174
|
+
pathMatch: 1.4,
|
|
175
|
+
editingPath: 1.9,
|
|
176
|
+
dependency: 1.0,
|
|
177
|
+
proximity: 0.4,
|
|
178
|
+
structural: 0.9,
|
|
179
|
+
docPenaltyMultiplier: 0.6,
|
|
180
|
+
configPenaltyMultiplier: 0.05,
|
|
181
|
+
implBoostMultiplier: 1.4,
|
|
182
|
+
blacklistPenaltyMultiplier: 0.01,
|
|
183
|
+
testPenaltyMultiplier: 0.02,
|
|
184
|
+
lockPenaltyMultiplier: 0.01,
|
|
78
185
|
},
|
|
79
186
|
bugfix: {
|
|
80
187
|
textMatch: 1.0,
|
|
@@ -86,6 +193,9 @@ function loadProfilesFromConfig() {
|
|
|
86
193
|
docPenaltyMultiplier: 0.5,
|
|
87
194
|
configPenaltyMultiplier: 0.05,
|
|
88
195
|
implBoostMultiplier: 1.3,
|
|
196
|
+
blacklistPenaltyMultiplier: 0.01,
|
|
197
|
+
testPenaltyMultiplier: 0.02,
|
|
198
|
+
lockPenaltyMultiplier: 0.01,
|
|
89
199
|
},
|
|
90
200
|
testfail: {
|
|
91
201
|
textMatch: 1.0,
|
|
@@ -97,6 +207,9 @@ function loadProfilesFromConfig() {
|
|
|
97
207
|
docPenaltyMultiplier: 0.5,
|
|
98
208
|
configPenaltyMultiplier: 0.05,
|
|
99
209
|
implBoostMultiplier: 1.3,
|
|
210
|
+
blacklistPenaltyMultiplier: 0.01,
|
|
211
|
+
testPenaltyMultiplier: 0.2,
|
|
212
|
+
lockPenaltyMultiplier: 0.01,
|
|
100
213
|
},
|
|
101
214
|
typeerror: {
|
|
102
215
|
textMatch: 1.0,
|
|
@@ -108,6 +221,9 @@ function loadProfilesFromConfig() {
|
|
|
108
221
|
docPenaltyMultiplier: 0.5,
|
|
109
222
|
configPenaltyMultiplier: 0.05,
|
|
110
223
|
implBoostMultiplier: 1.3,
|
|
224
|
+
blacklistPenaltyMultiplier: 0.01,
|
|
225
|
+
testPenaltyMultiplier: 0.02,
|
|
226
|
+
lockPenaltyMultiplier: 0.01,
|
|
111
227
|
},
|
|
112
228
|
feature: {
|
|
113
229
|
textMatch: 1.0,
|
|
@@ -119,6 +235,9 @@ function loadProfilesFromConfig() {
|
|
|
119
235
|
docPenaltyMultiplier: 0.5,
|
|
120
236
|
configPenaltyMultiplier: 0.05,
|
|
121
237
|
implBoostMultiplier: 1.3,
|
|
238
|
+
blacklistPenaltyMultiplier: 0.01,
|
|
239
|
+
testPenaltyMultiplier: 0.02,
|
|
240
|
+
lockPenaltyMultiplier: 0.01,
|
|
122
241
|
},
|
|
123
242
|
};
|
|
124
243
|
return profilesCache;
|
|
@@ -134,25 +253,6 @@ export function coerceProfileName(name) {
|
|
|
134
253
|
}
|
|
135
254
|
export function loadScoringProfile(profileName) {
|
|
136
255
|
const profiles = loadProfilesFromConfig();
|
|
137
|
-
// ⚠️ DEPRECATION WARNING (v0.9.10+): config/scoring-profiles.yml is ignored
|
|
138
|
-
// Emit warning if user has custom config that differs from defaults
|
|
139
|
-
if (profiles.default) {
|
|
140
|
-
const hasCustomConfig = profiles.default.docPenaltyMultiplier !== 0.5 ||
|
|
141
|
-
profiles.default.configPenaltyMultiplier !== 0.05 ||
|
|
142
|
-
profiles.default.implBoostMultiplier !== 1.3;
|
|
143
|
-
if (hasCustomConfig) {
|
|
144
|
-
console.warn("[DEPRECATION WARNING] config/scoring-profiles.yml is no longer used in v0.9.10+.\n" +
|
|
145
|
-
`Your custom values: { docPenaltyMultiplier: ${profiles.default.docPenaltyMultiplier}, ` +
|
|
146
|
-
`configPenaltyMultiplier: ${profiles.default.configPenaltyMultiplier}, ` +
|
|
147
|
-
`implBoostMultiplier: ${profiles.default.implBoostMultiplier} }\n` +
|
|
148
|
-
"Boost profiles now use fixed multipliers from src/server/boost-profiles.ts.\n" +
|
|
149
|
-
"Please select a built-in profile via 'boost_profile' parameter:\n" +
|
|
150
|
-
" - 'default': prioritizes implementation (impl: 1.3x, docs: 0.5x)\n" +
|
|
151
|
-
" - 'balanced': equal weight (impl: 1.0x, docs: 1.0x) - NEW in v0.9.10\n" +
|
|
152
|
-
" - 'docs': prioritizes documentation (docs: 1.5x, impl: 0.5x)\n" +
|
|
153
|
-
"See docs/search-ranking.md for details.");
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
256
|
if (profileName && profileName in profiles) {
|
|
157
257
|
return profiles[profileName];
|
|
158
258
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../../src/server/scoring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../../src/server/scoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { DuckDBClient } from "../../shared/duckdb.js";
|
|
2
|
+
import { RepoRepository } from "./repo-repository.js";
|
|
3
|
+
import { RepoResolver } from "./repo-resolver.js";
|
|
4
|
+
/**
|
|
5
|
+
* ServerServices
|
|
6
|
+
*
|
|
7
|
+
* サーバー全体で共有されるサービスの集合。
|
|
8
|
+
* リクエスト間で共有され、単一のインスタンスを持つ。
|
|
9
|
+
*/
|
|
10
|
+
export interface ServerServices {
|
|
11
|
+
repoRepository: RepoRepository;
|
|
12
|
+
repoResolver: RepoResolver;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* createServerServices
|
|
16
|
+
*
|
|
17
|
+
* サーバーサービスを初期化して返す。
|
|
18
|
+
* サーバー起動時に一度だけ呼び出される。
|
|
19
|
+
*
|
|
20
|
+
* @param db - DuckDBクライアント
|
|
21
|
+
* @returns 初期化されたサービス群
|
|
22
|
+
*/
|
|
23
|
+
export declare function createServerServices(db: DuckDBClient): ServerServices;
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,GAAG,cAAc,CAQrE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { RepoRepository } from "./repo-repository.js";
|
|
2
|
+
import { RepoResolver } from "./repo-resolver.js";
|
|
3
|
+
/**
|
|
4
|
+
* createServerServices
|
|
5
|
+
*
|
|
6
|
+
* サーバーサービスを初期化して返す。
|
|
7
|
+
* サーバー起動時に一度だけ呼び出される。
|
|
8
|
+
*
|
|
9
|
+
* @param db - DuckDBクライアント
|
|
10
|
+
* @returns 初期化されたサービス群
|
|
11
|
+
*/
|
|
12
|
+
export function createServerServices(db) {
|
|
13
|
+
const repoRepository = new RepoRepository(db);
|
|
14
|
+
const repoResolver = new RepoResolver(repoRepository);
|
|
15
|
+
return {
|
|
16
|
+
repoRepository,
|
|
17
|
+
repoResolver,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/services/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAalD;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAgB;IACnD,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC;IAEtD,OAAO;QACL,cAAc;QACd,YAAY;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { DuckDBClient } from "../../shared/duckdb.js";
|
|
2
|
+
/**
|
|
3
|
+
* RepoRecord
|
|
4
|
+
*
|
|
5
|
+
* リポジトリレコードのデータ構造
|
|
6
|
+
*/
|
|
7
|
+
export interface RepoRecord {
|
|
8
|
+
id: number;
|
|
9
|
+
root: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* RepoRepository
|
|
13
|
+
*
|
|
14
|
+
* リポジトリテーブルへのデータアクセスを担当するクラス。
|
|
15
|
+
* DB I/O のみを行い、ビジネスロジックは持たない。
|
|
16
|
+
*/
|
|
17
|
+
export declare class RepoRepository {
|
|
18
|
+
private db;
|
|
19
|
+
constructor(db: DuckDBClient);
|
|
20
|
+
/**
|
|
21
|
+
* normalized_root 列が存在するかチェックする。
|
|
22
|
+
* 後方互換性のため、カラム存在チェックを行う。
|
|
23
|
+
*
|
|
24
|
+
* @returns カラムが存在する場合は true
|
|
25
|
+
*/
|
|
26
|
+
private hasNormalizedRootColumn;
|
|
27
|
+
/**
|
|
28
|
+
* 指定されたパス候補のいずれかに一致するリポジトリを検索する。
|
|
29
|
+
* Phase 1: normalized_root列を使用した高速検索をサポート。
|
|
30
|
+
*
|
|
31
|
+
* @param candidates - 検索するパス候補の配列
|
|
32
|
+
* @returns 最初に見つかったリポジトリレコード、見つからない場合はnull
|
|
33
|
+
*/
|
|
34
|
+
findByPaths(candidates: string[]): Promise<RepoRecord | null>;
|
|
35
|
+
/**
|
|
36
|
+
* 正規化されたパスに一致するリポジトリを検索する(レガシーフォールバック)。
|
|
37
|
+
* Phase 1: normalized_root 列が存在する場合、このメソッドは使用されなくなります。
|
|
38
|
+
* マイグレーション期間中の安全性のため保持されています。
|
|
39
|
+
*
|
|
40
|
+
* NOTE: この処理は O(n) である。normalized_root カラム + インデックスが存在すれば不要。
|
|
41
|
+
*
|
|
42
|
+
* @param normalized - 正規化されたパス
|
|
43
|
+
* @param normalizeFn - パスを正規化する関数
|
|
44
|
+
* @returns 見つかったリポジトリレコード、見つからない場合はnull
|
|
45
|
+
*/
|
|
46
|
+
findByNormalizedPath(normalized: string, normalizeFn: (path: string) => string): Promise<RepoRecord | null>;
|
|
47
|
+
/**
|
|
48
|
+
* リポジトリのrootパスを更新する。
|
|
49
|
+
*
|
|
50
|
+
* @param id - リポジトリID
|
|
51
|
+
* @param newRoot - 新しいrootパス
|
|
52
|
+
*/
|
|
53
|
+
updateRoot(id: number, newRoot: string): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* repoテーブルが存在するかチェックする。
|
|
56
|
+
*
|
|
57
|
+
* @returns テーブルが存在する場合はtrue
|
|
58
|
+
*/
|
|
59
|
+
tableExists(): Promise<boolean>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=repo-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-repository.d.ts","sourceRoot":"","sources":["../../../../src/server/services/repo-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGtD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,YAAY;IAEpC;;;;;OAKG;YACW,uBAAuB;IAQrC;;;;;;OAMG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAgCnE;;;;;;;;;;OAUG;IACG,oBAAoB,CACxB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GACpC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAK7B;;;;;OAKG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAWtC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { normalizeRepoPath } from "../../shared/utils/path.js";
|
|
2
|
+
/**
|
|
3
|
+
* RepoRepository
|
|
4
|
+
*
|
|
5
|
+
* リポジトリテーブルへのデータアクセスを担当するクラス。
|
|
6
|
+
* DB I/O のみを行い、ビジネスロジックは持たない。
|
|
7
|
+
*/
|
|
8
|
+
export class RepoRepository {
|
|
9
|
+
db;
|
|
10
|
+
constructor(db) {
|
|
11
|
+
this.db = db;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* normalized_root 列が存在するかチェックする。
|
|
15
|
+
* 後方互換性のため、カラム存在チェックを行う。
|
|
16
|
+
*
|
|
17
|
+
* @returns カラムが存在する場合は true
|
|
18
|
+
*/
|
|
19
|
+
async hasNormalizedRootColumn() {
|
|
20
|
+
const cols = await this.db.all(`SELECT column_name FROM duckdb_columns()
|
|
21
|
+
WHERE table_name = 'repo' AND column_name = 'normalized_root'`);
|
|
22
|
+
return cols.length > 0;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 指定されたパス候補のいずれかに一致するリポジトリを検索する。
|
|
26
|
+
* Phase 1: normalized_root列を使用した高速検索をサポート。
|
|
27
|
+
*
|
|
28
|
+
* @param candidates - 検索するパス候補の配列
|
|
29
|
+
* @returns 最初に見つかったリポジトリレコード、見つからない場合はnull
|
|
30
|
+
*/
|
|
31
|
+
async findByPaths(candidates) {
|
|
32
|
+
if (candidates.length === 0) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
// Step 1: Try direct root lookup first (legacy compatibility)
|
|
36
|
+
const rootPlaceholders = candidates.map(() => "?").join(", ");
|
|
37
|
+
let rows = await this.db.all(`SELECT id, root FROM repo WHERE root IN (${rootPlaceholders}) LIMIT 1`, candidates);
|
|
38
|
+
if (rows.length > 0) {
|
|
39
|
+
return rows[0] ?? null; // exactOptionalPropertyTypes 対応: undefined を null に変換
|
|
40
|
+
}
|
|
41
|
+
// Step 2: Try normalized_root lookup (fast path with index) if column exists
|
|
42
|
+
const hasNormalizedRoot = await this.hasNormalizedRootColumn();
|
|
43
|
+
if (hasNormalizedRoot) {
|
|
44
|
+
const normalizedCandidates = candidates.map((c) => normalizeRepoPath(c));
|
|
45
|
+
const normalizedPlaceholders = normalizedCandidates.map(() => "?").join(", ");
|
|
46
|
+
rows = await this.db.all(`SELECT id, root FROM repo WHERE normalized_root IN (${normalizedPlaceholders}) LIMIT 1`, normalizedCandidates);
|
|
47
|
+
return rows[0] ?? null; // exactOptionalPropertyTypes 対応: undefined を null に変換
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 正規化されたパスに一致するリポジトリを検索する(レガシーフォールバック)。
|
|
53
|
+
* Phase 1: normalized_root 列が存在する場合、このメソッドは使用されなくなります。
|
|
54
|
+
* マイグレーション期間中の安全性のため保持されています。
|
|
55
|
+
*
|
|
56
|
+
* NOTE: この処理は O(n) である。normalized_root カラム + インデックスが存在すれば不要。
|
|
57
|
+
*
|
|
58
|
+
* @param normalized - 正規化されたパス
|
|
59
|
+
* @param normalizeFn - パスを正規化する関数
|
|
60
|
+
* @returns 見つかったリポジトリレコード、見つからない場合はnull
|
|
61
|
+
*/
|
|
62
|
+
async findByNormalizedPath(normalized, normalizeFn) {
|
|
63
|
+
const allRepos = await this.db.all("SELECT id, root FROM repo");
|
|
64
|
+
return allRepos.find((repo) => normalizeFn(repo.root) === normalized) || null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* リポジトリのrootパスを更新する。
|
|
68
|
+
*
|
|
69
|
+
* @param id - リポジトリID
|
|
70
|
+
* @param newRoot - 新しいrootパス
|
|
71
|
+
*/
|
|
72
|
+
async updateRoot(id, newRoot) {
|
|
73
|
+
await this.db.run("UPDATE repo SET root = ? WHERE id = ?", [newRoot, id]);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* repoテーブルが存在するかチェックする。
|
|
77
|
+
*
|
|
78
|
+
* @returns テーブルが存在する場合はtrue
|
|
79
|
+
*/
|
|
80
|
+
async tableExists() {
|
|
81
|
+
try {
|
|
82
|
+
await this.db.all("SELECT 1 FROM repo LIMIT 1");
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof Error && error.message.includes("Table with name repo")) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
throw new Error("Repo metadata check failed. Verify DuckDB permissions before retrying.");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=repo-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-repository.js","sourceRoot":"","sources":["../../../../src/server/services/repo-repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAY/D;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACL;IAApB,YAAoB,EAAgB;QAAhB,OAAE,GAAF,EAAE,CAAc;IAAG,CAAC;IAExC;;;;;OAKG;IACK,KAAK,CAAC,uBAAuB;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAC5B;qEAC+D,CAChE,CAAC;QACF,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CAAC,UAAoB;QACpC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,8DAA8D;QAC9D,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAC1B,4CAA4C,gBAAgB,WAAW,EACvE,UAAU,CACX,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,sDAAsD;QAChF,CAAC;QAED,6EAA6E;QAC7E,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/D,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,oBAAoB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,MAAM,sBAAsB,GAAG,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9E,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CACtB,uDAAuD,sBAAsB,WAAW,EACxF,oBAAoB,CACrB,CAAC;YAEF,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,sDAAsD;QAChF,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,oBAAoB,CACxB,UAAkB,EAClB,WAAqC;QAErC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAa,2BAA2B,CAAC,CAAC;QAC5E,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,IAAI,IAAI,CAAC;IAChF,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,OAAe;QAC1C,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,uCAAuC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBAC7E,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { RepoRepository } from "./repo-repository.js";
|
|
2
|
+
/**
|
|
3
|
+
* RepoNotFoundError
|
|
4
|
+
*
|
|
5
|
+
* リポジトリが見つからなかった場合のエラー
|
|
6
|
+
*/
|
|
7
|
+
export declare class RepoNotFoundError extends Error {
|
|
8
|
+
constructor(message: string);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* RepoResolver
|
|
12
|
+
*
|
|
13
|
+
* リポジトリパスをデータベースIDに解決する責務を持つクラス。
|
|
14
|
+
* パス正規化とDB検索を組み合わせ、エラー処理も担当する。
|
|
15
|
+
*/
|
|
16
|
+
export declare class RepoResolver {
|
|
17
|
+
private repository;
|
|
18
|
+
constructor(repository: RepoRepository);
|
|
19
|
+
/**
|
|
20
|
+
* リポジトリのrootパスをデータベースIDに解決する。
|
|
21
|
+
*
|
|
22
|
+
* @param repoRoot - リポジトリのrootパス
|
|
23
|
+
* @returns リポジトリID
|
|
24
|
+
* @throws RepoNotFoundError リポジトリがインデックスされていない場合
|
|
25
|
+
*/
|
|
26
|
+
resolveId(repoRoot: string): Promise<number>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=repo-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-resolver.d.ts","sourceRoot":"","sources":["../../../../src/server/services/repo-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,cAAc;IAE9C;;;;;;OAMG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA4CnD"}
|