kiri-mcp-server 0.2.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 (212) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +399 -0
  3. package/config/default.example.yml +12 -0
  4. package/config/denylist.yml +15 -0
  5. package/config/scoring-profiles.yml +37 -0
  6. package/config/security.yml +10 -0
  7. package/dist/client/cli.js +68 -0
  8. package/dist/client/cli.js.map +1 -0
  9. package/dist/client/index.js +5 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/config/default.example.yml +12 -0
  12. package/dist/config/denylist.yml +15 -0
  13. package/dist/config/scoring-profiles.yml +37 -0
  14. package/dist/config/security.yml +10 -0
  15. package/dist/eval/metrics.js +47 -0
  16. package/dist/eval/metrics.js.map +1 -0
  17. package/dist/indexer/cli.js +362 -0
  18. package/dist/indexer/cli.js.map +1 -0
  19. package/dist/indexer/codeintel.js +182 -0
  20. package/dist/indexer/codeintel.js.map +1 -0
  21. package/dist/indexer/git.js +30 -0
  22. package/dist/indexer/git.js.map +1 -0
  23. package/dist/indexer/language.js +34 -0
  24. package/dist/indexer/language.js.map +1 -0
  25. package/dist/indexer/pipeline/filters/denylist.js +71 -0
  26. package/dist/indexer/pipeline/filters/denylist.js.map +1 -0
  27. package/dist/indexer/schema.js +101 -0
  28. package/dist/indexer/schema.js.map +1 -0
  29. package/dist/package.json +93 -0
  30. package/dist/server/bootstrap.js +19 -0
  31. package/dist/server/bootstrap.js.map +1 -0
  32. package/dist/server/context.js +2 -0
  33. package/dist/server/context.js.map +1 -0
  34. package/dist/server/fallbacks/degradeController.js +69 -0
  35. package/dist/server/fallbacks/degradeController.js.map +1 -0
  36. package/dist/server/handlers.js +800 -0
  37. package/dist/server/handlers.js.map +1 -0
  38. package/dist/server/main.js +151 -0
  39. package/dist/server/main.js.map +1 -0
  40. package/dist/server/observability/metrics.js +56 -0
  41. package/dist/server/observability/metrics.js.map +1 -0
  42. package/dist/server/observability/tracing.js +58 -0
  43. package/dist/server/observability/tracing.js.map +1 -0
  44. package/dist/server/rpc.js +477 -0
  45. package/dist/server/rpc.js.map +1 -0
  46. package/dist/server/runtime.js +47 -0
  47. package/dist/server/runtime.js.map +1 -0
  48. package/dist/server/scoring.js +111 -0
  49. package/dist/server/scoring.js.map +1 -0
  50. package/dist/server/stdio.js +76 -0
  51. package/dist/server/stdio.js.map +1 -0
  52. package/dist/shared/duckdb.js +121 -0
  53. package/dist/shared/duckdb.js.map +1 -0
  54. package/dist/shared/embedding.js +85 -0
  55. package/dist/shared/embedding.js.map +1 -0
  56. package/dist/shared/index.js +9 -0
  57. package/dist/shared/index.js.map +1 -0
  58. package/dist/shared/security/config.js +64 -0
  59. package/dist/shared/security/config.js.map +1 -0
  60. package/dist/shared/security/masker.js +56 -0
  61. package/dist/shared/security/masker.js.map +1 -0
  62. package/dist/shared/tokenizer.js +5 -0
  63. package/dist/shared/tokenizer.js.map +1 -0
  64. package/dist/shared/utils/simpleYaml.js +90 -0
  65. package/dist/shared/utils/simpleYaml.js.map +1 -0
  66. package/dist/sql/schema.sql +6 -0
  67. package/dist/src/client/cli.d.ts +3 -0
  68. package/dist/src/client/cli.d.ts.map +1 -0
  69. package/dist/src/client/cli.js +68 -0
  70. package/dist/src/client/cli.js.map +1 -0
  71. package/dist/src/client/index.d.ts +5 -0
  72. package/dist/src/client/index.d.ts.map +1 -0
  73. package/dist/src/client/index.js +5 -0
  74. package/dist/src/client/index.js.map +1 -0
  75. package/dist/src/client/proxy.d.ts +9 -0
  76. package/dist/src/client/proxy.d.ts.map +1 -0
  77. package/dist/src/client/proxy.js +198 -0
  78. package/dist/src/client/proxy.js.map +1 -0
  79. package/dist/src/client/start-daemon.d.ts +30 -0
  80. package/dist/src/client/start-daemon.d.ts.map +1 -0
  81. package/dist/src/client/start-daemon.js +175 -0
  82. package/dist/src/client/start-daemon.js.map +1 -0
  83. package/dist/src/daemon/daemon.d.ts +9 -0
  84. package/dist/src/daemon/daemon.d.ts.map +1 -0
  85. package/dist/src/daemon/daemon.js +149 -0
  86. package/dist/src/daemon/daemon.js.map +1 -0
  87. package/dist/src/daemon/lifecycle.d.ts +101 -0
  88. package/dist/src/daemon/lifecycle.d.ts.map +1 -0
  89. package/dist/src/daemon/lifecycle.js +266 -0
  90. package/dist/src/daemon/lifecycle.js.map +1 -0
  91. package/dist/src/daemon/socket.d.ts +26 -0
  92. package/dist/src/daemon/socket.d.ts.map +1 -0
  93. package/dist/src/daemon/socket.js +132 -0
  94. package/dist/src/daemon/socket.js.map +1 -0
  95. package/dist/src/eval/metrics.d.ts +23 -0
  96. package/dist/src/eval/metrics.d.ts.map +1 -0
  97. package/dist/src/eval/metrics.js +47 -0
  98. package/dist/src/eval/metrics.js.map +1 -0
  99. package/dist/src/index.d.ts +11 -0
  100. package/dist/src/index.d.ts.map +1 -0
  101. package/dist/src/index.js +11 -0
  102. package/dist/src/index.js.map +1 -0
  103. package/dist/src/indexer/cli.d.ts +9 -0
  104. package/dist/src/indexer/cli.d.ts.map +1 -0
  105. package/dist/src/indexer/cli.js +402 -0
  106. package/dist/src/indexer/cli.js.map +1 -0
  107. package/dist/src/indexer/codeintel.d.ts +28 -0
  108. package/dist/src/indexer/codeintel.d.ts.map +1 -0
  109. package/dist/src/indexer/codeintel.js +451 -0
  110. package/dist/src/indexer/codeintel.js.map +1 -0
  111. package/dist/src/indexer/git.d.ts +4 -0
  112. package/dist/src/indexer/git.d.ts.map +1 -0
  113. package/dist/src/indexer/git.js +30 -0
  114. package/dist/src/indexer/git.js.map +1 -0
  115. package/dist/src/indexer/language.d.ts +2 -0
  116. package/dist/src/indexer/language.d.ts.map +1 -0
  117. package/dist/src/indexer/language.js +34 -0
  118. package/dist/src/indexer/language.js.map +1 -0
  119. package/dist/src/indexer/pipeline/filters/denylist.d.ts +10 -0
  120. package/dist/src/indexer/pipeline/filters/denylist.d.ts.map +1 -0
  121. package/dist/src/indexer/pipeline/filters/denylist.js +71 -0
  122. package/dist/src/indexer/pipeline/filters/denylist.js.map +1 -0
  123. package/dist/src/indexer/schema.d.ts +9 -0
  124. package/dist/src/indexer/schema.d.ts.map +1 -0
  125. package/dist/src/indexer/schema.js +125 -0
  126. package/dist/src/indexer/schema.js.map +1 -0
  127. package/dist/src/indexer/watch.d.ts +97 -0
  128. package/dist/src/indexer/watch.d.ts.map +1 -0
  129. package/dist/src/indexer/watch.js +264 -0
  130. package/dist/src/indexer/watch.js.map +1 -0
  131. package/dist/src/server/bootstrap.d.ts +11 -0
  132. package/dist/src/server/bootstrap.d.ts.map +1 -0
  133. package/dist/src/server/bootstrap.js +19 -0
  134. package/dist/src/server/bootstrap.js.map +1 -0
  135. package/dist/src/server/context.d.ts +9 -0
  136. package/dist/src/server/context.d.ts.map +1 -0
  137. package/dist/src/server/context.js +2 -0
  138. package/dist/src/server/context.js.map +1 -0
  139. package/dist/src/server/fallbacks/degradeController.d.ts +24 -0
  140. package/dist/src/server/fallbacks/degradeController.d.ts.map +1 -0
  141. package/dist/src/server/fallbacks/degradeController.js +135 -0
  142. package/dist/src/server/fallbacks/degradeController.js.map +1 -0
  143. package/dist/src/server/handlers.d.ts +105 -0
  144. package/dist/src/server/handlers.d.ts.map +1 -0
  145. package/dist/src/server/handlers.js +954 -0
  146. package/dist/src/server/handlers.js.map +1 -0
  147. package/dist/src/server/indexBootstrap.d.ts +13 -0
  148. package/dist/src/server/indexBootstrap.d.ts.map +1 -0
  149. package/dist/src/server/indexBootstrap.js +109 -0
  150. package/dist/src/server/indexBootstrap.js.map +1 -0
  151. package/dist/src/server/main.d.ts +10 -0
  152. package/dist/src/server/main.d.ts.map +1 -0
  153. package/dist/src/server/main.js +217 -0
  154. package/dist/src/server/main.js.map +1 -0
  155. package/dist/src/server/observability/metrics.d.ts +35 -0
  156. package/dist/src/server/observability/metrics.d.ts.map +1 -0
  157. package/dist/src/server/observability/metrics.js +70 -0
  158. package/dist/src/server/observability/metrics.js.map +1 -0
  159. package/dist/src/server/observability/tracing.d.ts +3 -0
  160. package/dist/src/server/observability/tracing.d.ts.map +1 -0
  161. package/dist/src/server/observability/tracing.js +58 -0
  162. package/dist/src/server/observability/tracing.js.map +1 -0
  163. package/dist/src/server/rpc.d.ts +39 -0
  164. package/dist/src/server/rpc.d.ts.map +1 -0
  165. package/dist/src/server/rpc.js +551 -0
  166. package/dist/src/server/rpc.js.map +1 -0
  167. package/dist/src/server/runtime.d.ts +21 -0
  168. package/dist/src/server/runtime.d.ts.map +1 -0
  169. package/dist/src/server/runtime.js +59 -0
  170. package/dist/src/server/runtime.js.map +1 -0
  171. package/dist/src/server/scoring.d.ts +20 -0
  172. package/dist/src/server/scoring.d.ts.map +1 -0
  173. package/dist/src/server/scoring.js +112 -0
  174. package/dist/src/server/scoring.js.map +1 -0
  175. package/dist/src/server/stdio.d.ts +4 -0
  176. package/dist/src/server/stdio.d.ts.map +1 -0
  177. package/dist/src/server/stdio.js +88 -0
  178. package/dist/src/server/stdio.js.map +1 -0
  179. package/dist/src/shared/duckdb.d.ts +16 -0
  180. package/dist/src/shared/duckdb.d.ts.map +1 -0
  181. package/dist/src/shared/duckdb.js +121 -0
  182. package/dist/src/shared/duckdb.js.map +1 -0
  183. package/dist/src/shared/embedding.d.ts +19 -0
  184. package/dist/src/shared/embedding.d.ts.map +1 -0
  185. package/dist/src/shared/embedding.js +85 -0
  186. package/dist/src/shared/embedding.js.map +1 -0
  187. package/dist/src/shared/index.d.ts +3 -0
  188. package/dist/src/shared/index.d.ts.map +1 -0
  189. package/dist/src/shared/index.js +9 -0
  190. package/dist/src/shared/index.js.map +1 -0
  191. package/dist/src/shared/security/config.d.ts +23 -0
  192. package/dist/src/shared/security/config.d.ts.map +1 -0
  193. package/dist/src/shared/security/config.js +66 -0
  194. package/dist/src/shared/security/config.js.map +1 -0
  195. package/dist/src/shared/security/masker.d.ts +10 -0
  196. package/dist/src/shared/security/masker.d.ts.map +1 -0
  197. package/dist/src/shared/security/masker.js +56 -0
  198. package/dist/src/shared/security/masker.js.map +1 -0
  199. package/dist/src/shared/tokenizer.d.ts +2 -0
  200. package/dist/src/shared/tokenizer.d.ts.map +1 -0
  201. package/dist/src/shared/tokenizer.js +5 -0
  202. package/dist/src/shared/tokenizer.js.map +1 -0
  203. package/dist/src/shared/utils/lockfile.d.ts +46 -0
  204. package/dist/src/shared/utils/lockfile.d.ts.map +1 -0
  205. package/dist/src/shared/utils/lockfile.js +136 -0
  206. package/dist/src/shared/utils/lockfile.js.map +1 -0
  207. package/dist/src/shared/utils/simpleYaml.d.ts +6 -0
  208. package/dist/src/shared/utils/simpleYaml.d.ts.map +1 -0
  209. package/dist/src/shared/utils/simpleYaml.js +90 -0
  210. package/dist/src/shared/utils/simpleYaml.js.map +1 -0
  211. package/package.json +91 -0
  212. package/sql/schema.sql +6 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"denylist.d.ts","sourceRoot":"","sources":["../../../../../src/indexer/pipeline/filters/denylist.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,IAAI,IAAI,MAAM,EAAE,CAAC;CAClB;AA6CD,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAWtE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAgB1F"}
@@ -0,0 +1,71 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { parseSimpleYaml } from "../../../shared/utils/simpleYaml.js";
4
+ /**
5
+ * Globćƒ‘ć‚æćƒ¼ćƒ³ć‚’ę­£č¦č”Øē¾ć«å¤‰ę›ļ¼ˆReDoSåÆ¾ē­–ęøˆćæļ¼‰
6
+ * @param pattern Globćƒ‘ć‚æćƒ¼ćƒ³ę–‡å­—åˆ—
7
+ * @returns ć‚³ćƒ³ćƒ‘ć‚¤ćƒ«ęøˆćæę­£č¦č”Øē¾
8
+ * @throws ćƒ‘ć‚æćƒ¼ćƒ³ćŒé•·ć™ćŽć‚‹ć€ć¾ćŸćÆč¤‡é›‘ć™ćŽć‚‹å “åˆ
9
+ */
10
+ function toRegex(pattern) {
11
+ // ReDoS対策: ćƒ‘ć‚æćƒ¼ćƒ³é•·ć®åˆ¶é™
12
+ if (pattern.length > 500) {
13
+ throw new Error("Denylist pattern exceeds maximum length. Simplify the pattern.");
14
+ }
15
+ const normalized = pattern.endsWith("/") ? pattern.slice(0, -1) : pattern;
16
+ const escaped = normalized
17
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&")
18
+ .replace(/\*\*/g, "::DOUBLESTAR::");
19
+ const withWildcards = escaped
20
+ .replace(/::DOUBLESTAR::/g, ".*")
21
+ .replace(/\*/g, "[^/]*")
22
+ .replace(/\?/g, ".");
23
+ const suffix = pattern.endsWith("/") ? "(?:/.*)?" : "";
24
+ // ReDoS対策: ęœ€ēµ‚ćƒ‘ć‚æćƒ¼ćƒ³ć®č¤‡é›‘åŗ¦ćƒć‚§ćƒƒć‚Æļ¼ˆćƒć‚¹ćƒˆć—ćŸé‡ęŒ‡å®šå­ļ¼‰
25
+ const finalPattern = `^${withWildcards}${suffix}$`;
26
+ if (/(\*|\+|\{).*(\*|\+|\{).*(\*|\+|\{)/.test(finalPattern)) {
27
+ throw new Error("Denylist pattern is too complex. Use simpler glob patterns.");
28
+ }
29
+ return new RegExp(finalPattern);
30
+ }
31
+ function loadGitignore(repoRoot) {
32
+ try {
33
+ const raw = readFileSync(resolve(repoRoot, ".gitignore"), "utf8");
34
+ return raw
35
+ .split(/\r?\n/)
36
+ .map((line) => line.trim())
37
+ .filter((line) => line.length > 0 && !line.startsWith("#"));
38
+ }
39
+ catch {
40
+ return [];
41
+ }
42
+ }
43
+ export function loadDenylistConfig(configPath) {
44
+ const path = resolve(configPath ?? "config/denylist.yml");
45
+ const content = readFileSync(path, "utf8");
46
+ const parsed = parseSimpleYaml(content);
47
+ const patterns = Array.isArray(parsed.patterns)
48
+ ? parsed.patterns.filter((value) => typeof value === "string")
49
+ : [];
50
+ if (patterns.length === 0) {
51
+ throw new Error("config/denylist.yml must contain patterns array");
52
+ }
53
+ return { patterns };
54
+ }
55
+ export function createDenylistFilter(repoRoot, configPath) {
56
+ const { patterns } = loadDenylistConfig(configPath);
57
+ const gitignorePatterns = loadGitignore(repoRoot);
58
+ const combined = Array.from(new Set([...patterns, ...gitignorePatterns]));
59
+ const regexList = combined.map(toRegex);
60
+ const diffEntries = gitignorePatterns.filter((pattern) => !patterns.includes(pattern));
61
+ return {
62
+ isDenied(path) {
63
+ const normalized = path.startsWith("/") ? path.slice(1) : path;
64
+ return regexList.some((regex) => regex.test(normalized));
65
+ },
66
+ diff() {
67
+ return diffEntries;
68
+ },
69
+ };
70
+ }
71
+ //# sourceMappingURL=denylist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"denylist.js","sourceRoot":"","sources":["../../../../../src/indexer/pipeline/filters/denylist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAWtE;;;;;GAKG;AACH,SAAS,OAAO,CAAC,OAAe;IAC9B,oBAAoB;IACpB,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1E,MAAM,OAAO,GAAG,UAAU;SACvB,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,OAAO;SAC1B,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;SAChC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvD,qCAAqC;IACrC,MAAM,YAAY,GAAG,IAAI,aAAa,GAAG,MAAM,GAAG,CAAC;IACnD,IAAI,oCAAoC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;QAClE,OAAO,GAAG;aACP,KAAK,CAAC,OAAO,CAAC;aACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAmB;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,IAAI,qBAAqB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAA4B,CAAC;IACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC7C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QAC/E,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,UAAmB;IACxE,MAAM,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,iBAAiB,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAEvF,OAAO;QACL,QAAQ,CAAC,IAAY;YACnB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/D,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI;YACF,OAAO,WAAW,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { DuckDBClient } from "../shared/duckdb.js";
2
+ export declare function ensureBaseSchema(db: DuckDBClient): Promise<void>;
3
+ /**
4
+ * FTSļ¼ˆå…Øę–‡ę¤œē“¢ļ¼‰ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć®ä½œęˆć‚’č©¦č”Œ
5
+ * @param db - DuckDBć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ
6
+ * @returns FTSę‹”å¼µćŒåˆ©ē”ØåÆčƒ½ćŖå “åˆtrueć€ćć‚Œä»„å¤–false
7
+ */
8
+ export declare function tryCreateFTSIndex(db: DuckDBClient): Promise<boolean>;
9
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/indexer/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8GtE;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB1E"}
@@ -0,0 +1,125 @@
1
+ export async function ensureBaseSchema(db) {
2
+ await db.run(`
3
+ CREATE SEQUENCE IF NOT EXISTS repo_id_seq START 1
4
+ `);
5
+ await db.run(`
6
+ CREATE TABLE IF NOT EXISTS repo (
7
+ id INTEGER PRIMARY KEY DEFAULT nextval('repo_id_seq'),
8
+ root TEXT NOT NULL UNIQUE,
9
+ default_branch TEXT,
10
+ indexed_at TIMESTAMP
11
+ )
12
+ `);
13
+ await db.run(`
14
+ CREATE TABLE IF NOT EXISTS blob (
15
+ hash TEXT PRIMARY KEY,
16
+ size_bytes INTEGER,
17
+ line_count INTEGER,
18
+ content TEXT
19
+ )
20
+ `);
21
+ await db.run(`
22
+ CREATE TABLE IF NOT EXISTS tree (
23
+ repo_id INTEGER,
24
+ commit_hash TEXT,
25
+ path TEXT,
26
+ blob_hash TEXT,
27
+ ext TEXT,
28
+ lang TEXT,
29
+ is_binary BOOLEAN,
30
+ mtime TIMESTAMP,
31
+ PRIMARY KEY (repo_id, commit_hash, path)
32
+ )
33
+ `);
34
+ await db.run(`
35
+ CREATE TABLE IF NOT EXISTS file (
36
+ repo_id INTEGER,
37
+ path TEXT,
38
+ blob_hash TEXT,
39
+ ext TEXT,
40
+ lang TEXT,
41
+ is_binary BOOLEAN,
42
+ mtime TIMESTAMP,
43
+ PRIMARY KEY (repo_id, path)
44
+ )
45
+ `);
46
+ await db.run(`
47
+ CREATE INDEX IF NOT EXISTS idx_file_lang ON file(repo_id, lang)
48
+ `);
49
+ await db.run(`
50
+ CREATE TABLE IF NOT EXISTS symbol (
51
+ repo_id INTEGER,
52
+ path TEXT,
53
+ symbol_id BIGINT,
54
+ name TEXT,
55
+ kind TEXT,
56
+ range_start_line INTEGER,
57
+ range_end_line INTEGER,
58
+ signature TEXT,
59
+ doc TEXT,
60
+ PRIMARY KEY (repo_id, path, symbol_id)
61
+ )
62
+ `);
63
+ await db.run(`
64
+ CREATE INDEX IF NOT EXISTS idx_symbol_name ON symbol(repo_id, name)
65
+ `);
66
+ await db.run(`
67
+ CREATE TABLE IF NOT EXISTS snippet (
68
+ repo_id INTEGER,
69
+ path TEXT,
70
+ snippet_id BIGINT,
71
+ start_line INTEGER,
72
+ end_line INTEGER,
73
+ symbol_id BIGINT NULL,
74
+ PRIMARY KEY (repo_id, path, snippet_id)
75
+ )
76
+ `);
77
+ await db.run(`
78
+ CREATE TABLE IF NOT EXISTS dependency (
79
+ repo_id INTEGER,
80
+ src_path TEXT,
81
+ dst_kind TEXT,
82
+ dst TEXT,
83
+ rel TEXT,
84
+ PRIMARY KEY (repo_id, src_path, dst_kind, dst, rel)
85
+ )
86
+ `);
87
+ await db.run(`
88
+ CREATE INDEX IF NOT EXISTS idx_dep_src ON dependency(repo_id, src_path)
89
+ `);
90
+ await db.run(`
91
+ CREATE TABLE IF NOT EXISTS file_embedding (
92
+ repo_id INTEGER,
93
+ path TEXT,
94
+ dims INTEGER NOT NULL,
95
+ vector_json TEXT NOT NULL,
96
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
97
+ PRIMARY KEY (repo_id, path)
98
+ )
99
+ `);
100
+ }
101
+ /**
102
+ * FTSļ¼ˆå…Øę–‡ę¤œē“¢ļ¼‰ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć®ä½œęˆć‚’č©¦č”Œ
103
+ * @param db - DuckDBć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ
104
+ * @returns FTSę‹”å¼µćŒåˆ©ē”ØåÆčƒ½ćŖå “åˆtrueć€ćć‚Œä»„å¤–false
105
+ */
106
+ export async function tryCreateFTSIndex(db) {
107
+ try {
108
+ // FTSę‹”å¼µć®åˆ©ē”ØåÆčƒ½ę€§ć‚’ē¢ŗčŖ
109
+ await db.run(`
110
+ INSTALL fts;
111
+ LOAD fts;
112
+ `);
113
+ // blob.content 恫 FTS ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć‚’ä½œęˆ
114
+ await db.run(`
115
+ PRAGMA create_fts_index('blob', 'hash', 'content', overwrite=1);
116
+ `);
117
+ return true;
118
+ }
119
+ catch (error) {
120
+ // FTSę‹”å¼µćŒåˆ©ē”Øć§ććŖć„å “åˆćÆč­¦å‘Šć‚’å‡ŗć—ć¦falseを返す
121
+ console.warn("FTS extension unavailable, using ILIKE fallback:", error);
122
+ return false;
123
+ }
124
+ }
125
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/indexer/schema.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAgB;IACrD,MAAM,EAAE,CAAC,GAAG,CAAC;;GAEZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;GAOZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;GAOZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;;GAYZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;GAWZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;GAEZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;;;GAaZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;GAEZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;GAUZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;GASZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;GAEZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;GASZ,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAgB;IACtD,IAAI,CAAC;QACH,iBAAiB;QACjB,MAAM,EAAE,CAAC,GAAG,CAAC;;;KAGZ,CAAC,CAAC;QAEH,+BAA+B;QAC/B,MAAM,EAAE,CAAC,GAAG,CAAC;;KAEZ,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gCAAgC;QAChC,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Configuration options for IndexWatcher.
3
+ */
4
+ export interface IndexWatcherOptions {
5
+ /** Absolute path to repository root */
6
+ repoRoot: string;
7
+ /** Absolute path to DuckDB database file */
8
+ databasePath: string;
9
+ /** Debounce time in milliseconds (default: 500ms) */
10
+ debounceMs?: number;
11
+ /** Optional path to denylist config */
12
+ configPath?: string;
13
+ /** Optional AbortSignal for graceful shutdown */
14
+ signal?: AbortSignal;
15
+ }
16
+ /**
17
+ * Statistics tracked by the file watcher.
18
+ */
19
+ export interface WatcherStatistics {
20
+ /** Total number of reindex operations completed */
21
+ reindexCount: number;
22
+ /** Duration of last reindex in milliseconds */
23
+ lastReindexDuration: number;
24
+ /** Number of file events currently queued */
25
+ queueDepth: number;
26
+ /** Timestamp of last reindex start */
27
+ lastReindexStart: number | null;
28
+ /** Timestamp of watcher start */
29
+ watcherStartTime: number;
30
+ }
31
+ /**
32
+ * IndexWatcher monitors filesystem changes and triggers automatic reindexing.
33
+ *
34
+ * Features:
35
+ * - Debouncing: Aggregates rapid consecutive changes to minimize reindex operations
36
+ * - Denylist Integration: Respects both denylist.yml and .gitignore patterns
37
+ * - Lock Management: Prevents concurrent indexing using lock files
38
+ * - Graceful Shutdown: Supports AbortSignal for clean process termination
39
+ * - Statistics: Tracks reindex count, duration, and queue depth
40
+ *
41
+ * Implementation Note:
42
+ * Uses full reindex (not incremental) for simplicity and consistency.
43
+ * This approach ensures no stale data or broken dependencies.
44
+ */
45
+ export declare class IndexWatcher {
46
+ private readonly options;
47
+ private watcher;
48
+ private reindexTimer;
49
+ private isReindexing;
50
+ private reindexPromise;
51
+ private pendingReindex;
52
+ private pendingFiles;
53
+ private readonly stats;
54
+ private readonly lockfilePath;
55
+ private isStopping;
56
+ constructor(options: IndexWatcherOptions);
57
+ /**
58
+ * Starts the file watcher and begins monitoring for changes.
59
+ *
60
+ * @throws {Error} If the watcher is already running
61
+ */
62
+ start(): Promise<void>;
63
+ /**
64
+ * Schedules a reindex operation with debouncing.
65
+ *
66
+ * Multiple rapid changes are aggregated into a single reindex operation.
67
+ *
68
+ * @param event - Type of file event (add/change/unlink)
69
+ * @param path - Absolute path to the changed file
70
+ */
71
+ private scheduleReindex;
72
+ /**
73
+ * Executes a full reindex operation.
74
+ *
75
+ * If a reindex is already in progress, marks a pending flag to trigger
76
+ * another reindex after the current one completes.
77
+ */
78
+ private executeReindex;
79
+ /**
80
+ * Stops the file watcher and cleans up resources.
81
+ *
82
+ * Waits for any ongoing reindex to complete before stopping.
83
+ * Uses the reindex promise to ensure proper synchronization.
84
+ */
85
+ stop(): Promise<void>;
86
+ /**
87
+ * Returns current watcher statistics.
88
+ *
89
+ * Useful for monitoring and diagnostics.
90
+ */
91
+ getStatistics(): Readonly<WatcherStatistics>;
92
+ /**
93
+ * Checks if the watcher is currently running.
94
+ */
95
+ isRunning(): boolean;
96
+ }
97
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/indexer/watch.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAMtB;IACF,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,mBAAmB;IAiCxC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C5B;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAmCvB;;;;;OAKG;YACW,cAAc;IAiG5B;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC3B;;;;OAIG;IACH,aAAa,IAAI,QAAQ,CAAC,iBAAiB,CAAC;IAI5C;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB"}
@@ -0,0 +1,264 @@
1
+ import { resolve } from "node:path";
2
+ import { performance } from "node:perf_hooks";
3
+ import { watch } from "chokidar";
4
+ import { acquireLock, releaseLock, getLockOwner, LockfileError } from "../shared/utils/lockfile.js";
5
+ import { runIndexer } from "./cli.js";
6
+ import { createDenylistFilter } from "./pipeline/filters/denylist.js";
7
+ /**
8
+ * IndexWatcher monitors filesystem changes and triggers automatic reindexing.
9
+ *
10
+ * Features:
11
+ * - Debouncing: Aggregates rapid consecutive changes to minimize reindex operations
12
+ * - Denylist Integration: Respects both denylist.yml and .gitignore patterns
13
+ * - Lock Management: Prevents concurrent indexing using lock files
14
+ * - Graceful Shutdown: Supports AbortSignal for clean process termination
15
+ * - Statistics: Tracks reindex count, duration, and queue depth
16
+ *
17
+ * Implementation Note:
18
+ * Uses full reindex (not incremental) for simplicity and consistency.
19
+ * This approach ensures no stale data or broken dependencies.
20
+ */
21
+ export class IndexWatcher {
22
+ options;
23
+ watcher = null;
24
+ reindexTimer = null;
25
+ isReindexing = false;
26
+ reindexPromise = null;
27
+ pendingReindex = false;
28
+ pendingFiles = new Set();
29
+ stats;
30
+ lockfilePath;
31
+ isStopping = false; // Flag to prevent new reindexes during shutdown
32
+ constructor(options) {
33
+ this.options = {
34
+ repoRoot: resolve(options.repoRoot),
35
+ databasePath: resolve(options.databasePath),
36
+ debounceMs: options.debounceMs ?? 500,
37
+ };
38
+ if (options.configPath) {
39
+ this.options.configPath = options.configPath;
40
+ }
41
+ if (options.signal) {
42
+ this.options.signal = options.signal;
43
+ }
44
+ this.lockfilePath = `${this.options.databasePath}.lock`;
45
+ this.stats = {
46
+ reindexCount: 0,
47
+ lastReindexDuration: 0,
48
+ queueDepth: 0,
49
+ lastReindexStart: null,
50
+ watcherStartTime: performance.now(),
51
+ };
52
+ // Handle abort signal if provided
53
+ if (this.options.signal) {
54
+ this.options.signal.addEventListener("abort", () => {
55
+ void this.stop();
56
+ });
57
+ }
58
+ }
59
+ /**
60
+ * Starts the file watcher and begins monitoring for changes.
61
+ *
62
+ * @throws {Error} If the watcher is already running
63
+ */
64
+ async start() {
65
+ if (this.watcher !== null) {
66
+ throw new Error("IndexWatcher is already running. Call stop() before starting again.");
67
+ }
68
+ // Load denylist patterns
69
+ const denylistFilter = createDenylistFilter(this.options.repoRoot, this.options.configPath);
70
+ // Configure chokidar with denylist and editor-specific options
71
+ this.watcher = watch(this.options.repoRoot, {
72
+ persistent: true,
73
+ ignoreInitial: true, // Don't trigger on existing files
74
+ ignored: (path) => {
75
+ const relativePath = path.replace(this.options.repoRoot + "/", "");
76
+ return denylistFilter.isDenied(relativePath);
77
+ },
78
+ // Editor-specific handling
79
+ awaitWriteFinish: {
80
+ stabilityThreshold: 200, // Wait 200ms for file to stabilize
81
+ pollInterval: 100,
82
+ },
83
+ // Performance tuning
84
+ usePolling: false, // Use native OS events (faster)
85
+ // depth option omitted for no depth limit
86
+ });
87
+ // Register event handlers
88
+ this.watcher
89
+ .on("add", (path) => this.scheduleReindex("add", path))
90
+ .on("change", (path) => this.scheduleReindex("change", path))
91
+ .on("unlink", (path) => this.scheduleReindex("unlink", path))
92
+ .on("error", (error) => {
93
+ process.stderr.write(`āŒ File watcher error: ${error instanceof Error ? error.message : String(error)}\n`);
94
+ })
95
+ .on("ready", () => {
96
+ process.stderr.write(`šŸ‘ļø Watch mode started. Monitoring ${this.options.repoRoot} for changes...\n`);
97
+ process.stderr.write(` Debounce: ${this.options.debounceMs}ms\n`);
98
+ });
99
+ }
100
+ /**
101
+ * Schedules a reindex operation with debouncing.
102
+ *
103
+ * Multiple rapid changes are aggregated into a single reindex operation.
104
+ *
105
+ * @param event - Type of file event (add/change/unlink)
106
+ * @param path - Absolute path to the changed file
107
+ */
108
+ scheduleReindex(event, path) {
109
+ // Don't schedule new reindexes if watcher is stopping
110
+ if (this.isStopping) {
111
+ return;
112
+ }
113
+ const relativePath = path.replace(this.options.repoRoot + "/", "");
114
+ this.pendingFiles.add(relativePath);
115
+ // Clear existing timer if present
116
+ if (this.reindexTimer !== null) {
117
+ clearTimeout(this.reindexTimer);
118
+ }
119
+ // Set new timer with debounce
120
+ this.reindexTimer = setTimeout(() => {
121
+ this.reindexTimer = null;
122
+ this.stats.queueDepth = this.pendingFiles.size;
123
+ // Log aggregated changes
124
+ const fileList = Array.from(this.pendingFiles).slice(0, 5).join(", ");
125
+ const moreCount = Math.max(0, this.pendingFiles.size - 5);
126
+ const summary = moreCount > 0 ? `${fileList} (+${moreCount} more)` : fileList;
127
+ process.stderr.write(`\nšŸ“ File changes detected: ${summary}\n`);
128
+ // Clear pending files and trigger reindex
129
+ this.pendingFiles.clear();
130
+ void this.executeReindex();
131
+ }, this.options.debounceMs);
132
+ // Mark pending flag (used if reindex is already running)
133
+ this.pendingReindex = true;
134
+ }
135
+ /**
136
+ * Executes a full reindex operation.
137
+ *
138
+ * If a reindex is already in progress, marks a pending flag to trigger
139
+ * another reindex after the current one completes.
140
+ */
141
+ async executeReindex() {
142
+ // Don't start reindex if watcher is stopping
143
+ if (this.isStopping) {
144
+ process.stderr.write(`šŸ›‘ Watcher stopping. Skipping reindex.\n`);
145
+ return;
146
+ }
147
+ // Check if already reindexing
148
+ if (this.isReindexing) {
149
+ process.stderr.write(`ā³ Reindex already in progress. Will reindex again after completion.\n`);
150
+ this.pendingReindex = true;
151
+ return;
152
+ }
153
+ this.isReindexing = true;
154
+ this.pendingReindex = false;
155
+ this.stats.lastReindexStart = performance.now();
156
+ // Create and store the reindex promise for proper shutdown handling
157
+ this.reindexPromise = (async () => {
158
+ try {
159
+ // Double-check stopping flag before acquiring lock
160
+ if (this.isStopping) {
161
+ process.stderr.write(`šŸ›‘ Watcher stopping. Skipping reindex.\n`);
162
+ return;
163
+ }
164
+ // Acquire lock to prevent concurrent indexing
165
+ try {
166
+ acquireLock(this.lockfilePath);
167
+ }
168
+ catch (error) {
169
+ if (error instanceof LockfileError) {
170
+ const ownerPid = error.ownerPid ?? getLockOwner(this.lockfilePath);
171
+ const ownerInfo = ownerPid ? ` (PID: ${ownerPid})` : "";
172
+ process.stderr.write(`āš ļø Another indexing process${ownerInfo} holds the lock. Skipping this reindex.\n`);
173
+ return;
174
+ }
175
+ throw error;
176
+ }
177
+ // Run full reindex
178
+ const start = performance.now();
179
+ process.stderr.write(`šŸ”„ Reindexing ${this.options.repoRoot}...\n`);
180
+ await runIndexer({
181
+ repoRoot: this.options.repoRoot,
182
+ databasePath: this.options.databasePath,
183
+ full: true,
184
+ });
185
+ const duration = performance.now() - start;
186
+ this.stats.reindexCount++;
187
+ this.stats.lastReindexDuration = duration;
188
+ this.stats.queueDepth = 0;
189
+ process.stderr.write(`āœ… Reindex complete in ${Math.round(duration)}ms\n`);
190
+ // Periodic statistics (every 10 reindexes)
191
+ if (this.stats.reindexCount % 10 === 0) {
192
+ const uptime = Math.round((performance.now() - this.stats.watcherStartTime) / 1000);
193
+ process.stderr.write(`šŸ“Š Watcher stats: ${this.stats.reindexCount} reindexes, ${uptime}s uptime\n`);
194
+ }
195
+ }
196
+ catch (error) {
197
+ process.stderr.write(`āŒ Reindex failed: ${error instanceof Error ? error.message : String(error)}\n`);
198
+ process.stderr.write(` Watch mode continues. Next change will trigger reindex.\n`);
199
+ }
200
+ finally {
201
+ this.isReindexing = false;
202
+ releaseLock(this.lockfilePath);
203
+ this.reindexPromise = null;
204
+ // Clear timer to prevent resource leak
205
+ if (this.reindexTimer !== null) {
206
+ clearTimeout(this.reindexTimer);
207
+ this.reindexTimer = null;
208
+ }
209
+ // If more changes occurred during reindex, schedule another one
210
+ if (this.pendingReindex) {
211
+ process.stderr.write(`šŸ” New changes detected during reindex. Scheduling another reindex...\n`);
212
+ this.scheduleReindex("batch", "(multiple files)");
213
+ }
214
+ }
215
+ })();
216
+ await this.reindexPromise;
217
+ }
218
+ /**
219
+ * Stops the file watcher and cleans up resources.
220
+ *
221
+ * Waits for any ongoing reindex to complete before stopping.
222
+ * Uses the reindex promise to ensure proper synchronization.
223
+ */
224
+ async stop() {
225
+ if (this.watcher === null) {
226
+ return; // Already stopped
227
+ }
228
+ process.stderr.write(`\nšŸ›‘ Stopping watch mode...\n`);
229
+ // Set stopping flag FIRST to prevent new reindex operations
230
+ this.isStopping = true;
231
+ // Clear pending timer
232
+ if (this.reindexTimer !== null) {
233
+ clearTimeout(this.reindexTimer);
234
+ this.reindexTimer = null;
235
+ }
236
+ // Wait for ongoing reindex to complete using the promise
237
+ // This is more reliable than polling isReindexing flag
238
+ if (this.reindexPromise !== null) {
239
+ await this.reindexPromise;
240
+ }
241
+ // Close watcher
242
+ await this.watcher.close();
243
+ this.watcher = null;
244
+ // Print final statistics
245
+ const uptime = Math.round((performance.now() - this.stats.watcherStartTime) / 1000);
246
+ process.stderr.write(`šŸ“Š Final stats: ${this.stats.reindexCount} reindexes, ${uptime}s uptime\n`);
247
+ process.stderr.write(`āœ… Watch mode stopped.\n`);
248
+ }
249
+ /**
250
+ * Returns current watcher statistics.
251
+ *
252
+ * Useful for monitoring and diagnostics.
253
+ */
254
+ getStatistics() {
255
+ return { ...this.stats };
256
+ }
257
+ /**
258
+ * Checks if the watcher is currently running.
259
+ */
260
+ isRunning() {
261
+ return this.watcher !== null;
262
+ }
263
+ }
264
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/indexer/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { evaluateSecurityStatus } from "../shared/security/config.js";
2
+ export interface BootstrapOptions {
3
+ securityConfigPath?: string;
4
+ securityLockPath?: string;
5
+ allowWriteLock?: boolean;
6
+ }
7
+ export interface BootstrapReport {
8
+ security: ReturnType<typeof evaluateSecurityStatus>;
9
+ }
10
+ export declare function bootstrapServer(options?: BootstrapOptions): BootstrapReport;
11
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/server/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAEvB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;CACrD;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAgB/E"}
@@ -0,0 +1,19 @@
1
+ import { assertSecurityBaseline, evaluateSecurityStatus, updateSecurityLock, } from "../shared/security/config.js";
2
+ export function bootstrapServer(options = {}) {
3
+ const security = evaluateSecurityStatus(options.securityConfigPath, options.securityLockPath);
4
+ if (!security.matches) {
5
+ if (!security.lockHash && options.allowWriteLock) {
6
+ updateSecurityLock(security.hash, options.securityLockPath);
7
+ return {
8
+ security: {
9
+ ...security,
10
+ lockHash: security.hash,
11
+ matches: true,
12
+ },
13
+ };
14
+ }
15
+ assertSecurityBaseline(options.securityConfigPath, options.securityLockPath);
16
+ }
17
+ return { security };
18
+ }
19
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/server/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAYtC,MAAM,UAAU,eAAe,CAAC,UAA4B,EAAE;IAC5D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9F,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YACjD,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC5D,OAAO;gBACL,QAAQ,EAAE;oBACR,GAAG,QAAQ;oBACX,QAAQ,EAAE,QAAQ,CAAC,IAAI;oBACvB,OAAO,EAAE,IAAI;iBACd;aACF,CAAC;QACJ,CAAC;QACD,sBAAsB,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { DuckDBClient } from "../shared/duckdb.js";
2
+ export interface ServerContext {
3
+ db: DuckDBClient;
4
+ repoId: number;
5
+ features?: {
6
+ fts?: boolean;
7
+ };
8
+ }
9
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +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,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,YAAY,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;CACH"}