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.
Files changed (96) hide show
  1. package/README.md +52 -10
  2. package/config/kiri.yml +25 -0
  3. package/config/scoring-profiles.yml +82 -35
  4. package/dist/config/kiri.yml +25 -0
  5. package/dist/config/scoring-profiles.yml +82 -35
  6. package/dist/package.json +9 -1
  7. package/dist/src/indexer/cli.d.ts.map +1 -1
  8. package/dist/src/indexer/cli.js +712 -98
  9. package/dist/src/indexer/cli.js.map +1 -1
  10. package/dist/src/indexer/git.d.ts.map +1 -1
  11. package/dist/src/indexer/git.js +41 -3
  12. package/dist/src/indexer/git.js.map +1 -1
  13. package/dist/src/indexer/migrations/repo-merger.d.ts +33 -0
  14. package/dist/src/indexer/migrations/repo-merger.d.ts.map +1 -0
  15. package/dist/src/indexer/migrations/repo-merger.js +67 -0
  16. package/dist/src/indexer/migrations/repo-merger.js.map +1 -0
  17. package/dist/src/indexer/schema.d.ts +66 -0
  18. package/dist/src/indexer/schema.d.ts.map +1 -1
  19. package/dist/src/indexer/schema.js +337 -0
  20. package/dist/src/indexer/schema.js.map +1 -1
  21. package/dist/src/server/boost-profiles.d.ts +6 -5
  22. package/dist/src/server/boost-profiles.d.ts.map +1 -1
  23. package/dist/src/server/boost-profiles.js +138 -0
  24. package/dist/src/server/boost-profiles.js.map +1 -1
  25. package/dist/src/server/config-loader.d.ts +9 -0
  26. package/dist/src/server/config-loader.d.ts.map +1 -0
  27. package/dist/src/server/config-loader.js +121 -0
  28. package/dist/src/server/config-loader.js.map +1 -0
  29. package/dist/src/server/config.d.ts +47 -0
  30. package/dist/src/server/config.d.ts.map +1 -0
  31. package/dist/src/server/config.js +157 -0
  32. package/dist/src/server/config.js.map +1 -0
  33. package/dist/src/server/context.d.ts +29 -0
  34. package/dist/src/server/context.d.ts.map +1 -1
  35. package/dist/src/server/context.js +26 -1
  36. package/dist/src/server/context.js.map +1 -1
  37. package/dist/src/server/handlers/snippets-get.d.ts +36 -0
  38. package/dist/src/server/handlers/snippets-get.d.ts.map +1 -0
  39. package/dist/src/server/handlers/snippets-get.js +120 -0
  40. package/dist/src/server/handlers/snippets-get.js.map +1 -0
  41. package/dist/src/server/handlers.d.ts +33 -20
  42. package/dist/src/server/handlers.d.ts.map +1 -1
  43. package/dist/src/server/handlers.js +1805 -370
  44. package/dist/src/server/handlers.js.map +1 -1
  45. package/dist/src/server/indexBootstrap.d.ts.map +1 -1
  46. package/dist/src/server/indexBootstrap.js +49 -2
  47. package/dist/src/server/indexBootstrap.js.map +1 -1
  48. package/dist/src/server/main.d.ts.map +1 -1
  49. package/dist/src/server/main.js +7 -0
  50. package/dist/src/server/main.js.map +1 -1
  51. package/dist/src/server/profile-selector.d.ts +33 -0
  52. package/dist/src/server/profile-selector.d.ts.map +1 -0
  53. package/dist/src/server/profile-selector.js +291 -0
  54. package/dist/src/server/profile-selector.js.map +1 -0
  55. package/dist/src/server/rpc.d.ts.map +1 -1
  56. package/dist/src/server/rpc.js +60 -10
  57. package/dist/src/server/rpc.js.map +1 -1
  58. package/dist/src/server/runtime.d.ts.map +1 -1
  59. package/dist/src/server/runtime.js +14 -4
  60. package/dist/src/server/runtime.js.map +1 -1
  61. package/dist/src/server/scoring.d.ts +7 -1
  62. package/dist/src/server/scoring.d.ts.map +1 -1
  63. package/dist/src/server/scoring.js +121 -21
  64. package/dist/src/server/scoring.js.map +1 -1
  65. package/dist/src/server/services/index.d.ts +24 -0
  66. package/dist/src/server/services/index.d.ts.map +1 -0
  67. package/dist/src/server/services/index.js +20 -0
  68. package/dist/src/server/services/index.js.map +1 -0
  69. package/dist/src/server/services/repo-repository.d.ts +61 -0
  70. package/dist/src/server/services/repo-repository.d.ts.map +1 -0
  71. package/dist/src/server/services/repo-repository.js +93 -0
  72. package/dist/src/server/services/repo-repository.js.map +1 -0
  73. package/dist/src/server/services/repo-resolver.d.ts +28 -0
  74. package/dist/src/server/services/repo-resolver.d.ts.map +1 -0
  75. package/dist/src/server/services/repo-resolver.js +62 -0
  76. package/dist/src/server/services/repo-resolver.js.map +1 -0
  77. package/dist/src/shared/duckdb.d.ts.map +1 -1
  78. package/dist/src/shared/duckdb.js +21 -1
  79. package/dist/src/shared/duckdb.js.map +1 -1
  80. package/dist/src/shared/fs/safePath.d.ts +7 -0
  81. package/dist/src/shared/fs/safePath.d.ts.map +1 -0
  82. package/dist/src/shared/fs/safePath.js +23 -0
  83. package/dist/src/shared/fs/safePath.js.map +1 -0
  84. package/dist/src/shared/tokenizer.d.ts +1 -1
  85. package/dist/src/shared/tokenizer.d.ts.map +1 -1
  86. package/dist/src/shared/tokenizer.js +97 -15
  87. package/dist/src/shared/tokenizer.js.map +1 -1
  88. package/dist/src/shared/utils/glob.d.ts +5 -0
  89. package/dist/src/shared/utils/glob.d.ts.map +1 -0
  90. package/dist/src/shared/utils/glob.js +22 -0
  91. package/dist/src/shared/utils/glob.js.map +1 -0
  92. package/dist/src/shared/utils/retry.d.ts +8 -0
  93. package/dist/src/shared/utils/retry.d.ts.map +1 -0
  94. package/dist/src/shared/utils/retry.js +20 -0
  95. package/dist/src/shared/utils/retry.js.map +1 -0
  96. 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
- const repoId = await resolveRepoId(db, options.repoRoot);
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
- const context = {
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":"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"}
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;CAC7B;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;AAwI7F,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,CA+B1F"}
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 = process.env.KIRI_SCORING_CONFIG ?? join(__dirname, "../../../config/scoring-profiles.yml");
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":"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"}
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"}