@cstart/coldstart 2.0.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 (360) hide show
  1. package/README.md +236 -0
  2. package/dist/cache/disk-cache.d.ts +14 -0
  3. package/dist/cache/disk-cache.d.ts.map +1 -0
  4. package/dist/cache/disk-cache.js +371 -0
  5. package/dist/cache/disk-cache.js.map +1 -0
  6. package/dist/cli.d.ts +18 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +206 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/constants.d.ts +8 -0
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/constants.js +111 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/daemon-lock.d.ts +63 -0
  15. package/dist/daemon-lock.d.ts.map +1 -0
  16. package/dist/daemon-lock.js +218 -0
  17. package/dist/daemon-lock.js.map +1 -0
  18. package/dist/daemon-log.d.ts +26 -0
  19. package/dist/daemon-log.d.ts.map +1 -0
  20. package/dist/daemon-log.js +110 -0
  21. package/dist/daemon-log.js.map +1 -0
  22. package/dist/index-manager.d.ts +103 -0
  23. package/dist/index-manager.d.ts.map +1 -0
  24. package/dist/index-manager.js +361 -0
  25. package/dist/index-manager.js.map +1 -0
  26. package/dist/index.d.ts +4 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +724 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/indexer/content-tokens.d.ts +74 -0
  31. package/dist/indexer/content-tokens.d.ts.map +1 -0
  32. package/dist/indexer/content-tokens.js +406 -0
  33. package/dist/indexer/content-tokens.js.map +1 -0
  34. package/dist/indexer/cpp-include-roots.d.ts +7 -0
  35. package/dist/indexer/cpp-include-roots.d.ts.map +1 -0
  36. package/dist/indexer/cpp-include-roots.js +166 -0
  37. package/dist/indexer/cpp-include-roots.js.map +1 -0
  38. package/dist/indexer/csharp-synthetic.d.ts +9 -0
  39. package/dist/indexer/csharp-synthetic.d.ts.map +1 -0
  40. package/dist/indexer/csharp-synthetic.js +51 -0
  41. package/dist/indexer/csharp-synthetic.js.map +1 -0
  42. package/dist/indexer/django-synthetic.d.ts +12 -0
  43. package/dist/indexer/django-synthetic.d.ts.map +1 -0
  44. package/dist/indexer/django-synthetic.js +49 -0
  45. package/dist/indexer/django-synthetic.js.map +1 -0
  46. package/dist/indexer/extractors/angularjs.d.ts +16 -0
  47. package/dist/indexer/extractors/angularjs.d.ts.map +1 -0
  48. package/dist/indexer/extractors/angularjs.js +49 -0
  49. package/dist/indexer/extractors/angularjs.js.map +1 -0
  50. package/dist/indexer/extractors/cpp.d.ts +9 -0
  51. package/dist/indexer/extractors/cpp.d.ts.map +1 -0
  52. package/dist/indexer/extractors/cpp.js +254 -0
  53. package/dist/indexer/extractors/cpp.js.map +1 -0
  54. package/dist/indexer/extractors/csharp.d.ts +19 -0
  55. package/dist/indexer/extractors/csharp.d.ts.map +1 -0
  56. package/dist/indexer/extractors/csharp.js +327 -0
  57. package/dist/indexer/extractors/csharp.js.map +1 -0
  58. package/dist/indexer/extractors/env.d.ts +9 -0
  59. package/dist/indexer/extractors/env.d.ts.map +1 -0
  60. package/dist/indexer/extractors/env.js +43 -0
  61. package/dist/indexer/extractors/env.js.map +1 -0
  62. package/dist/indexer/extractors/go.d.ts +9 -0
  63. package/dist/indexer/extractors/go.d.ts.map +1 -0
  64. package/dist/indexer/extractors/go.js +227 -0
  65. package/dist/indexer/extractors/go.js.map +1 -0
  66. package/dist/indexer/extractors/graphql.d.ts +22 -0
  67. package/dist/indexer/extractors/graphql.d.ts.map +1 -0
  68. package/dist/indexer/extractors/graphql.js +88 -0
  69. package/dist/indexer/extractors/graphql.js.map +1 -0
  70. package/dist/indexer/extractors/groovy.d.ts +9 -0
  71. package/dist/indexer/extractors/groovy.d.ts.map +1 -0
  72. package/dist/indexer/extractors/groovy.js +356 -0
  73. package/dist/indexer/extractors/groovy.js.map +1 -0
  74. package/dist/indexer/extractors/java.d.ts +10 -0
  75. package/dist/indexer/extractors/java.d.ts.map +1 -0
  76. package/dist/indexer/extractors/java.js +586 -0
  77. package/dist/indexer/extractors/java.js.map +1 -0
  78. package/dist/indexer/extractors/kotlin.d.ts +10 -0
  79. package/dist/indexer/extractors/kotlin.d.ts.map +1 -0
  80. package/dist/indexer/extractors/kotlin.js +398 -0
  81. package/dist/indexer/extractors/kotlin.js.map +1 -0
  82. package/dist/indexer/extractors/node-helpers.d.ts +13 -0
  83. package/dist/indexer/extractors/node-helpers.d.ts.map +1 -0
  84. package/dist/indexer/extractors/node-helpers.js +17 -0
  85. package/dist/indexer/extractors/node-helpers.js.map +1 -0
  86. package/dist/indexer/extractors/parser-factory.d.ts +4 -0
  87. package/dist/indexer/extractors/parser-factory.d.ts.map +1 -0
  88. package/dist/indexer/extractors/parser-factory.js +28 -0
  89. package/dist/indexer/extractors/parser-factory.js.map +1 -0
  90. package/dist/indexer/extractors/php.d.ts +17 -0
  91. package/dist/indexer/extractors/php.d.ts.map +1 -0
  92. package/dist/indexer/extractors/php.js +363 -0
  93. package/dist/indexer/extractors/php.js.map +1 -0
  94. package/dist/indexer/extractors/python.d.ts +14 -0
  95. package/dist/indexer/extractors/python.d.ts.map +1 -0
  96. package/dist/indexer/extractors/python.js +449 -0
  97. package/dist/indexer/extractors/python.js.map +1 -0
  98. package/dist/indexer/extractors/ruby.d.ts +10 -0
  99. package/dist/indexer/extractors/ruby.d.ts.map +1 -0
  100. package/dist/indexer/extractors/ruby.js +996 -0
  101. package/dist/indexer/extractors/ruby.js.map +1 -0
  102. package/dist/indexer/extractors/rust.d.ts +9 -0
  103. package/dist/indexer/extractors/rust.d.ts.map +1 -0
  104. package/dist/indexer/extractors/rust.js +322 -0
  105. package/dist/indexer/extractors/rust.js.map +1 -0
  106. package/dist/indexer/extractors/toml.d.ts +9 -0
  107. package/dist/indexer/extractors/toml.d.ts.map +1 -0
  108. package/dist/indexer/extractors/toml.js +84 -0
  109. package/dist/indexer/extractors/toml.js.map +1 -0
  110. package/dist/indexer/extractors/xml.d.ts +9 -0
  111. package/dist/indexer/extractors/xml.d.ts.map +1 -0
  112. package/dist/indexer/extractors/xml.js +163 -0
  113. package/dist/indexer/extractors/xml.js.map +1 -0
  114. package/dist/indexer/extractors/yaml.d.ts +9 -0
  115. package/dist/indexer/extractors/yaml.d.ts.map +1 -0
  116. package/dist/indexer/extractors/yaml.js +117 -0
  117. package/dist/indexer/extractors/yaml.js.map +1 -0
  118. package/dist/indexer/git.d.ts +19 -0
  119. package/dist/indexer/git.d.ts.map +1 -0
  120. package/dist/indexer/git.js +55 -0
  121. package/dist/indexer/git.js.map +1 -0
  122. package/dist/indexer/graph.d.ts +7 -0
  123. package/dist/indexer/graph.d.ts.map +1 -0
  124. package/dist/indexer/graph.js +20 -0
  125. package/dist/indexer/graph.js.map +1 -0
  126. package/dist/indexer/indexed-file.d.ts +15 -0
  127. package/dist/indexer/indexed-file.d.ts.map +1 -0
  128. package/dist/indexer/indexed-file.js +50 -0
  129. package/dist/indexer/indexed-file.js.map +1 -0
  130. package/dist/indexer/invariants.d.ts +15 -0
  131. package/dist/indexer/invariants.d.ts.map +1 -0
  132. package/dist/indexer/invariants.js +96 -0
  133. package/dist/indexer/invariants.js.map +1 -0
  134. package/dist/indexer/laravel-synthetic.d.ts +10 -0
  135. package/dist/indexer/laravel-synthetic.d.ts.map +1 -0
  136. package/dist/indexer/laravel-synthetic.js +78 -0
  137. package/dist/indexer/laravel-synthetic.js.map +1 -0
  138. package/dist/indexer/parser.d.ts +4 -0
  139. package/dist/indexer/parser.d.ts.map +1 -0
  140. package/dist/indexer/parser.js +499 -0
  141. package/dist/indexer/parser.js.map +1 -0
  142. package/dist/indexer/patch.d.ts +3 -0
  143. package/dist/indexer/patch.d.ts.map +1 -0
  144. package/dist/indexer/patch.js +291 -0
  145. package/dist/indexer/patch.js.map +1 -0
  146. package/dist/indexer/rails-synthetic.d.ts +11 -0
  147. package/dist/indexer/rails-synthetic.d.ts.map +1 -0
  148. package/dist/indexer/rails-synthetic.js +80 -0
  149. package/dist/indexer/rails-synthetic.js.map +1 -0
  150. package/dist/indexer/reconcile.d.ts +9 -0
  151. package/dist/indexer/reconcile.d.ts.map +1 -0
  152. package/dist/indexer/reconcile.js +96 -0
  153. package/dist/indexer/reconcile.js.map +1 -0
  154. package/dist/indexer/resolvers/cpp.d.ts +15 -0
  155. package/dist/indexer/resolvers/cpp.d.ts.map +1 -0
  156. package/dist/indexer/resolvers/cpp.js +35 -0
  157. package/dist/indexer/resolvers/cpp.js.map +1 -0
  158. package/dist/indexer/resolvers/csharp.d.ts +2 -0
  159. package/dist/indexer/resolvers/csharp.d.ts.map +1 -0
  160. package/dist/indexer/resolvers/csharp.js +89 -0
  161. package/dist/indexer/resolvers/csharp.js.map +1 -0
  162. package/dist/indexer/resolvers/generic.d.ts +10 -0
  163. package/dist/indexer/resolvers/generic.d.ts.map +1 -0
  164. package/dist/indexer/resolvers/generic.js +35 -0
  165. package/dist/indexer/resolvers/generic.js.map +1 -0
  166. package/dist/indexer/resolvers/go.d.ts +2 -0
  167. package/dist/indexer/resolvers/go.d.ts.map +1 -0
  168. package/dist/indexer/resolvers/go.js +171 -0
  169. package/dist/indexer/resolvers/go.js.map +1 -0
  170. package/dist/indexer/resolvers/index.d.ts +26 -0
  171. package/dist/indexer/resolvers/index.d.ts.map +1 -0
  172. package/dist/indexer/resolvers/index.js +301 -0
  173. package/dist/indexer/resolvers/index.js.map +1 -0
  174. package/dist/indexer/resolvers/java.d.ts +17 -0
  175. package/dist/indexer/resolvers/java.d.ts.map +1 -0
  176. package/dist/indexer/resolvers/java.js +104 -0
  177. package/dist/indexer/resolvers/java.js.map +1 -0
  178. package/dist/indexer/resolvers/php.d.ts +2 -0
  179. package/dist/indexer/resolvers/php.d.ts.map +1 -0
  180. package/dist/indexer/resolvers/php.js +108 -0
  181. package/dist/indexer/resolvers/php.js.map +1 -0
  182. package/dist/indexer/resolvers/python.d.ts +17 -0
  183. package/dist/indexer/resolvers/python.d.ts.map +1 -0
  184. package/dist/indexer/resolvers/python.js +63 -0
  185. package/dist/indexer/resolvers/python.js.map +1 -0
  186. package/dist/indexer/resolvers/ruby.d.ts +13 -0
  187. package/dist/indexer/resolvers/ruby.d.ts.map +1 -0
  188. package/dist/indexer/resolvers/ruby.js +199 -0
  189. package/dist/indexer/resolvers/ruby.js.map +1 -0
  190. package/dist/indexer/resolvers/rust.d.ts +12 -0
  191. package/dist/indexer/resolvers/rust.d.ts.map +1 -0
  192. package/dist/indexer/resolvers/rust.js +61 -0
  193. package/dist/indexer/resolvers/rust.js.map +1 -0
  194. package/dist/indexer/resolvers/shared.d.ts +18 -0
  195. package/dist/indexer/resolvers/shared.d.ts.map +1 -0
  196. package/dist/indexer/resolvers/shared.js +71 -0
  197. package/dist/indexer/resolvers/shared.js.map +1 -0
  198. package/dist/indexer/rust-workspace.d.ts +25 -0
  199. package/dist/indexer/rust-workspace.d.ts.map +1 -0
  200. package/dist/indexer/rust-workspace.js +155 -0
  201. package/dist/indexer/rust-workspace.js.map +1 -0
  202. package/dist/indexer/symbol-edges.d.ts +19 -0
  203. package/dist/indexer/symbol-edges.d.ts.map +1 -0
  204. package/dist/indexer/symbol-edges.js +117 -0
  205. package/dist/indexer/symbol-edges.js.map +1 -0
  206. package/dist/indexer/tokenize.d.ts +26 -0
  207. package/dist/indexer/tokenize.d.ts.map +1 -0
  208. package/dist/indexer/tokenize.js +200 -0
  209. package/dist/indexer/tokenize.js.map +1 -0
  210. package/dist/indexer/ts-parser.d.ts +10 -0
  211. package/dist/indexer/ts-parser.d.ts.map +1 -0
  212. package/dist/indexer/ts-parser.js +605 -0
  213. package/dist/indexer/ts-parser.js.map +1 -0
  214. package/dist/indexer/walker.d.ts +9 -0
  215. package/dist/indexer/walker.d.ts.map +1 -0
  216. package/dist/indexer/walker.js +91 -0
  217. package/dist/indexer/walker.js.map +1 -0
  218. package/dist/init.d.ts +111 -0
  219. package/dist/init.d.ts.map +1 -0
  220. package/dist/init.js +787 -0
  221. package/dist/init.js.map +1 -0
  222. package/dist/kb/cli.d.ts +2 -0
  223. package/dist/kb/cli.d.ts.map +1 -0
  224. package/dist/kb/cli.js +377 -0
  225. package/dist/kb/cli.js.map +1 -0
  226. package/dist/kb/commit.d.ts +6 -0
  227. package/dist/kb/commit.d.ts.map +1 -0
  228. package/dist/kb/commit.js +84 -0
  229. package/dist/kb/commit.js.map +1 -0
  230. package/dist/kb/fold.d.ts +42 -0
  231. package/dist/kb/fold.d.ts.map +1 -0
  232. package/dist/kb/fold.js +285 -0
  233. package/dist/kb/fold.js.map +1 -0
  234. package/dist/kb/freshness.d.ts +9 -0
  235. package/dist/kb/freshness.d.ts.map +1 -0
  236. package/dist/kb/freshness.js +52 -0
  237. package/dist/kb/freshness.js.map +1 -0
  238. package/dist/kb/git.d.ts +4 -0
  239. package/dist/kb/git.d.ts.map +1 -0
  240. package/dist/kb/git.js +28 -0
  241. package/dist/kb/git.js.map +1 -0
  242. package/dist/kb/ids.d.ts +8 -0
  243. package/dist/kb/ids.d.ts.map +1 -0
  244. package/dist/kb/ids.js +42 -0
  245. package/dist/kb/ids.js.map +1 -0
  246. package/dist/kb/lint.d.ts +23 -0
  247. package/dist/kb/lint.d.ts.map +1 -0
  248. package/dist/kb/lint.js +102 -0
  249. package/dist/kb/lint.js.map +1 -0
  250. package/dist/kb/lookup.d.ts +55 -0
  251. package/dist/kb/lookup.d.ts.map +1 -0
  252. package/dist/kb/lookup.js +92 -0
  253. package/dist/kb/lookup.js.map +1 -0
  254. package/dist/kb/notes-index.d.ts +31 -0
  255. package/dist/kb/notes-index.d.ts.map +1 -0
  256. package/dist/kb/notes-index.js +0 -0
  257. package/dist/kb/notes-index.js.map +1 -0
  258. package/dist/kb/raw-log.d.ts +34 -0
  259. package/dist/kb/raw-log.d.ts.map +1 -0
  260. package/dist/kb/raw-log.js +106 -0
  261. package/dist/kb/raw-log.js.map +1 -0
  262. package/dist/kb/render.d.ts +17 -0
  263. package/dist/kb/render.d.ts.map +1 -0
  264. package/dist/kb/render.js +101 -0
  265. package/dist/kb/render.js.map +1 -0
  266. package/dist/kb/search.d.ts +110 -0
  267. package/dist/kb/search.d.ts.map +1 -0
  268. package/dist/kb/search.js +453 -0
  269. package/dist/kb/search.js.map +1 -0
  270. package/dist/kb/store.d.ts +35 -0
  271. package/dist/kb/store.d.ts.map +1 -0
  272. package/dist/kb/store.js +160 -0
  273. package/dist/kb/store.js.map +1 -0
  274. package/dist/kb/types.d.ts +142 -0
  275. package/dist/kb/types.d.ts.map +1 -0
  276. package/dist/kb/types.js +13 -0
  277. package/dist/kb/types.js.map +1 -0
  278. package/dist/kb/view-template.d.ts +8 -0
  279. package/dist/kb/view-template.d.ts.map +1 -0
  280. package/dist/kb/view-template.js +8 -0
  281. package/dist/kb/view-template.js.map +1 -0
  282. package/dist/kb/view.d.ts +42 -0
  283. package/dist/kb/view.d.ts.map +1 -0
  284. package/dist/kb/view.js +118 -0
  285. package/dist/kb/view.js.map +1 -0
  286. package/dist/kb/write.d.ts +72 -0
  287. package/dist/kb/write.d.ts.map +1 -0
  288. package/dist/kb/write.js +345 -0
  289. package/dist/kb/write.js.map +1 -0
  290. package/dist/keeper-state.d.ts +29 -0
  291. package/dist/keeper-state.d.ts.map +1 -0
  292. package/dist/keeper-state.js +89 -0
  293. package/dist/keeper-state.js.map +1 -0
  294. package/dist/keeper.d.ts +23 -0
  295. package/dist/keeper.d.ts.map +1 -0
  296. package/dist/keeper.js +105 -0
  297. package/dist/keeper.js.map +1 -0
  298. package/dist/migrate.d.ts +9 -0
  299. package/dist/migrate.d.ts.map +1 -0
  300. package/dist/migrate.js +102 -0
  301. package/dist/migrate.js.map +1 -0
  302. package/dist/restart.d.ts +15 -0
  303. package/dist/restart.d.ts.map +1 -0
  304. package/dist/restart.js +48 -0
  305. package/dist/restart.js.map +1 -0
  306. package/dist/server/find.d.ts +39 -0
  307. package/dist/server/find.d.ts.map +1 -0
  308. package/dist/server/find.js +979 -0
  309. package/dist/server/find.js.map +1 -0
  310. package/dist/server/mcp.d.ts +117 -0
  311. package/dist/server/mcp.d.ts.map +1 -0
  312. package/dist/server/mcp.js +301 -0
  313. package/dist/server/mcp.js.map +1 -0
  314. package/dist/server/searcher.d.ts +14 -0
  315. package/dist/server/searcher.d.ts.map +1 -0
  316. package/dist/server/searcher.js +146 -0
  317. package/dist/server/searcher.js.map +1 -0
  318. package/dist/server/tools.d.ts +17 -0
  319. package/dist/server/tools.d.ts.map +1 -0
  320. package/dist/server/tools.js +875 -0
  321. package/dist/server/tools.js.map +1 -0
  322. package/dist/status.d.ts +12 -0
  323. package/dist/status.d.ts.map +1 -0
  324. package/dist/status.js +157 -0
  325. package/dist/status.js.map +1 -0
  326. package/dist/types.d.ts +138 -0
  327. package/dist/types.d.ts.map +1 -0
  328. package/dist/types.js +3 -0
  329. package/dist/types.js.map +1 -0
  330. package/dist/watcher.d.ts +11 -0
  331. package/dist/watcher.d.ts.map +1 -0
  332. package/dist/watcher.js +67 -0
  333. package/dist/watcher.js.map +1 -0
  334. package/hooks/canonical-find-key.mjs +68 -0
  335. package/hooks/codex-find-nudge.mjs +15 -0
  336. package/hooks/codex-find-preguard.mjs +14 -0
  337. package/hooks/codex-kb-elicit.mjs +329 -0
  338. package/hooks/codex-kb-recall.mjs +151 -0
  339. package/hooks/codex-nudge-handler.mjs +370 -0
  340. package/hooks/codex-preguard-handler.mjs +75 -0
  341. package/hooks/codex-run-hook.mjs +132 -0
  342. package/hooks/coldstart-call.mjs +58 -0
  343. package/hooks/cursor-find-nudge.mjs +15 -0
  344. package/hooks/cursor-find-preguard.mjs +14 -0
  345. package/hooks/cursor-input.mjs +72 -0
  346. package/hooks/cursor-kb-elicit.mjs +335 -0
  347. package/hooks/cursor-kb-recall.mjs +138 -0
  348. package/hooks/cursor-nudge-handler.mjs +33 -0
  349. package/hooks/cursor-preguard-handler.mjs +39 -0
  350. package/hooks/cursor-run-hook.mjs +129 -0
  351. package/hooks/find-nudge.mjs +15 -0
  352. package/hooks/find-preguard.mjs +14 -0
  353. package/hooks/kb-elicit.mjs +334 -0
  354. package/hooks/kb-recall.mjs +151 -0
  355. package/hooks/nudge-handler.mjs +370 -0
  356. package/hooks/preguard-handler.mjs +75 -0
  357. package/hooks/run-hook.mjs +132 -0
  358. package/package.json +69 -0
  359. package/templates/coldstart.cli.md +60 -0
  360. package/templates/coldstart.mcp.md +59 -0
@@ -0,0 +1,361 @@
1
+ import { watch } from 'node:fs';
2
+ import { existsSync } from 'node:fs';
3
+ import { stat } from 'node:fs/promises';
4
+ import { join, basename } from 'node:path';
5
+ import { startWatcher } from './watcher.js';
6
+ import { renderIds, notebookExists } from './kb/store.js';
7
+ import { buildKbNotesIndex, saveKbNotesIndex } from './kb/notes-index.js';
8
+ import { patchIndex } from './indexer/patch.js';
9
+ import { getGitHead } from './indexer/git.js';
10
+ import { lintIndexInvariants } from './indexer/invariants.js';
11
+ import { saveCachedIndex, getCacheDir } from './cache/disk-cache.js';
12
+ import { updateKeeperState, appendRepairLog } from './keeper-state.js';
13
+ import { patchThreshold } from './constants.js';
14
+ /**
15
+ * Owns the live in-memory index and orchestrates incremental patches vs full rebuilds.
16
+ *
17
+ * Decision logic (fires on each debounced batch from the file watcher):
18
+ * - batch.size === 0 → no-op
19
+ * - batch.size <= 30 → incremental patch (serial, ~2-5ms per file)
20
+ * - batch.size > 30 → full rebuild in background, serve stale index until complete
21
+ * - patch throws → fallback to full rebuild
22
+ *
23
+ * Changes that arrive WHILE a rebuild is running are collected into a pending set.
24
+ * After the rebuild completes, the pending set is processed as a new batch so no
25
+ * changes are silently dropped.
26
+ *
27
+ * Tool calls always read `getContext().index` which is the last stable snapshot.
28
+ * Index swaps are atomic (single JS assignment).
29
+ */
30
+ export class IndexManager {
31
+ rebuild;
32
+ cacheDir;
33
+ noCache;
34
+ quiet;
35
+ activeIndex;
36
+ rebuilding = false;
37
+ stopWatcherFn = null;
38
+ stopCacheWatcherFn = null;
39
+ pendingCacheSave = null;
40
+ /**
41
+ * Paths that changed while a rebuild was in progress.
42
+ * Processed as a follow-up batch once the rebuild completes.
43
+ */
44
+ pendingDuringRebuild = new Set();
45
+ constructor(initialIndex, rebuild, cacheDir, noCache, quiet) {
46
+ this.rebuild = rebuild;
47
+ this.cacheDir = cacheDir;
48
+ this.noCache = noCache;
49
+ this.quiet = quiet;
50
+ this.activeIndex = initialIndex;
51
+ }
52
+ /** Returns the current index snapshot and rebuild status for tool calls. */
53
+ getContext() {
54
+ return { index: this.activeIndex, isRebuilding: this.rebuilding };
55
+ }
56
+ /** Start watching the project root for file changes. */
57
+ startWatching() {
58
+ this.stopWatcherFn = startWatcher(this.activeIndex.rootDir, (batch) => { void this.handleBatch(batch); }, (batch) => { this.handleNotebookRawBatch(batch); });
59
+ this.log('[coldstart] File watcher active');
60
+ // Fix #2: Watch cache directory for manual deletes
61
+ this.stopCacheWatcherFn = this.startCacheWatcher();
62
+ // Seed the KB notes index so kb readers (which never load the code index)
63
+ // have lane-2 inventories + absence stamps from the first query on.
64
+ void this.refreshKbNotesIndex();
65
+ }
66
+ /** Stop watching (called on process exit). */
67
+ stopWatching() {
68
+ this.stopWatcherFn?.();
69
+ this.stopWatcherFn = null;
70
+ this.stopCacheWatcherFn?.();
71
+ this.stopCacheWatcherFn = null;
72
+ if (this.pendingCacheSave)
73
+ clearTimeout(this.pendingCacheSave);
74
+ if (this.rebuildRetryTimer)
75
+ clearTimeout(this.rebuildRetryTimer);
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Internal
79
+ // ---------------------------------------------------------------------------
80
+ log(...args) {
81
+ if (!this.quiet)
82
+ process.stderr.write(args.join(' ') + '\n');
83
+ }
84
+ /**
85
+ * Notebook `.raw` logs changed (an agent wrote a note, or a git merge
86
+ * unioned two logs) — re-fold and re-render the derived md for those ids.
87
+ * Never touches the code index; md here is a browsability nicety (search
88
+ * folds from `.raw` directly), so failures only log.
89
+ */
90
+ handleNotebookRawBatch(batch) {
91
+ try {
92
+ const ids = [...batch]
93
+ .filter((p) => p.endsWith('.jsonl'))
94
+ .map((p) => basename(p, '.jsonl'));
95
+ if (!ids.length)
96
+ return;
97
+ const rendered = renderIds(this.activeIndex.rootDir, ids);
98
+ this.log(`[coldstart] notebook: re-rendered ${rendered.length} note(s)`);
99
+ }
100
+ catch (err) {
101
+ this.log(`[coldstart] notebook render failed: ${err}`);
102
+ }
103
+ // Note anchors / absence terms may have changed — refresh the notes index.
104
+ void this.refreshKbNotesIndex();
105
+ }
106
+ /**
107
+ * Rebuild the keeper-maintained KB notes index (per-anchor symbol
108
+ * inventories + absence verdict stamps) from the live code index, and
109
+ * persist it beside the cache. Single-flight: a refresh landing while one
110
+ * runs is coalesced into one follow-up pass, so stamps never go stale
111
+ * silently. kb readers only ever READ this file (C1 decoupling).
112
+ */
113
+ refreshingKb = false;
114
+ kbRefreshQueued = false;
115
+ async refreshKbNotesIndex() {
116
+ if (this.noCache)
117
+ return; // disk writes disabled
118
+ if (!notebookExists(this.activeIndex.rootDir))
119
+ return;
120
+ if (this.refreshingKb) {
121
+ this.kbRefreshQueued = true;
122
+ return;
123
+ }
124
+ this.refreshingKb = true;
125
+ try {
126
+ const kb = await buildKbNotesIndex(this.activeIndex, this.activeIndex.rootDir);
127
+ await saveKbNotesIndex(this.activeIndex.rootDir, kb, this.cacheDir);
128
+ this.log(`[coldstart] KB notes index refreshed (${Object.keys(kb.anchors).length} anchors, ${Object.keys(kb.absence).length} absence stamps)`);
129
+ }
130
+ catch (err) {
131
+ this.log(`[coldstart] KB notes index refresh failed: ${err}`);
132
+ }
133
+ finally {
134
+ this.refreshingKb = false;
135
+ if (this.kbRefreshQueued) {
136
+ this.kbRefreshQueued = false;
137
+ void this.refreshKbNotesIndex();
138
+ }
139
+ }
140
+ }
141
+ async handleBatch(batch) {
142
+ if (batch.size === 0)
143
+ return;
144
+ if (this.rebuilding) {
145
+ // Collect changes that arrive mid-rebuild. They are processed as a
146
+ // follow-up batch once the rebuild completes (see triggerRebuild finally).
147
+ for (const p of batch)
148
+ this.pendingDuringRebuild.add(p);
149
+ this.log(`[coldstart] Rebuild in progress — queued ${batch.size} change(s) for post-rebuild patch`);
150
+ return;
151
+ }
152
+ const threshold = patchThreshold(this.activeIndex.files.size);
153
+ if (batch.size <= threshold) {
154
+ this.log(`[coldstart] ${batch.size} file(s) changed — patching incrementally`);
155
+ try {
156
+ await patchIndex(this.activeIndex, batch, this.activeIndex.rootDir);
157
+ // Invariant lint: a patch that left the graph inconsistent must not
158
+ // be served or persisted — rebuild from scratch instead.
159
+ const problems = lintIndexInvariants(this.activeIndex);
160
+ if (problems.length > 0) {
161
+ this.log(`[coldstart] INVARIANT VIOLATION after patch — rebuilding. ${problems.join(' | ')}`);
162
+ void this.report('invariant-violation', problems.join(' | '));
163
+ await this.triggerRebuild();
164
+ return;
165
+ }
166
+ this.log('[coldstart] Incremental patch done');
167
+ void this.stamp({ lastPatch: { at: Date.now(), detail: `${batch.size} file(s)` } });
168
+ this.scheduleCacheSave();
169
+ }
170
+ catch (err) {
171
+ this.log(`[coldstart] Patch failed (${err}) — falling back to full rebuild`);
172
+ void this.report('patch-failed', String(err));
173
+ await this.triggerRebuild();
174
+ }
175
+ }
176
+ else {
177
+ this.log(`[coldstart] ${batch.size} files changed (> ${threshold}) — triggering full rebuild`);
178
+ await this.triggerRebuild();
179
+ }
180
+ }
181
+ /** Best-effort observability writers (skipped under --no-cache). Stamps are
182
+ * serialized through one promise chain: updateKeeperState is read-merge-
183
+ * write, so two in-flight stamps would silently drop each other's fields. */
184
+ stampChain = Promise.resolve();
185
+ async stamp(patch) {
186
+ if (this.noCache)
187
+ return;
188
+ this.stampChain = this.stampChain
189
+ .then(() => updateKeeperState(this.activeIndex.rootDir, patch, this.cacheDir))
190
+ .catch(() => { });
191
+ await this.stampChain;
192
+ }
193
+ async report(event, detail) {
194
+ if (this.noCache)
195
+ return;
196
+ await appendRepairLog(this.activeIndex.rootDir, event, detail, this.cacheDir);
197
+ }
198
+ async triggerRebuild() {
199
+ if (this.rebuilding)
200
+ return;
201
+ this.rebuilding = true;
202
+ try {
203
+ const newIndex = await this.rebuild();
204
+ this.activeIndex = newIndex; // atomic swap
205
+ this.log(`[coldstart] Rebuild complete (${newIndex.files.size} files)`);
206
+ this.rebuildFailures = 0;
207
+ void this.stamp({ lastRebuild: { at: Date.now(), detail: `${newIndex.files.size} files` } });
208
+ this.scheduleCacheSave();
209
+ }
210
+ catch (err) {
211
+ this.log(`[coldstart] Rebuild failed: ${err}`);
212
+ void this.report('rebuild-failed', String(err));
213
+ this.scheduleRebuildRetry();
214
+ }
215
+ finally {
216
+ this.rebuilding = false;
217
+ // Process any changes that arrived while the rebuild was running.
218
+ // These may not be reflected in the freshly built snapshot.
219
+ if (this.pendingDuringRebuild.size > 0) {
220
+ const pending = new Set(this.pendingDuringRebuild);
221
+ this.pendingDuringRebuild.clear();
222
+ this.log(`[coldstart] Processing ${pending.size} change(s) that arrived during rebuild`);
223
+ void this.handleBatch(pending);
224
+ }
225
+ }
226
+ }
227
+ /**
228
+ * A failed rebuild leaves the keeper serving a stale snapshot with no
229
+ * guarantee another change event ever arrives — retry on a timer, backing
230
+ * off, and give up (until the next real change) after a few attempts.
231
+ */
232
+ rebuildFailures = 0;
233
+ rebuildRetryTimer = null;
234
+ scheduleRebuildRetry() {
235
+ this.rebuildFailures++;
236
+ if (this.rebuildFailures > 3) {
237
+ this.log(`[coldstart] Rebuild failed ${this.rebuildFailures - 1} time(s) — giving up until the next file change`);
238
+ this.rebuildFailures = 0;
239
+ return;
240
+ }
241
+ const delayMs = 60_000 * this.rebuildFailures;
242
+ this.log(`[coldstart] Retrying rebuild in ${delayMs / 1000}s (attempt ${this.rebuildFailures})`);
243
+ if (this.rebuildRetryTimer)
244
+ clearTimeout(this.rebuildRetryTimer);
245
+ this.rebuildRetryTimer = setTimeout(() => {
246
+ this.rebuildRetryTimer = null;
247
+ void this.triggerRebuild();
248
+ }, delayMs);
249
+ }
250
+ /**
251
+ * Sampled fingerprint audit — after each cache save, stat a rotating window
252
+ * of indexed files against their parse-time fingerprints. Catches changes
253
+ * the watcher missed (dropped fs events, edits in paths fs.watch didn't
254
+ * cover); drifted files are re-fed through the normal patch path.
255
+ */
256
+ auditCursor = 0;
257
+ async auditFingerprints(sample = 50) {
258
+ const files = [...this.activeIndex.files.values()];
259
+ if (files.length === 0)
260
+ return;
261
+ const n = Math.min(sample, files.length);
262
+ const stale = new Set();
263
+ for (let i = 0; i < n; i++) {
264
+ const f = files[(this.auditCursor + i) % files.length];
265
+ try {
266
+ const st = await stat(f.path);
267
+ if (f.mtimeMs === undefined || f.sizeBytes === undefined
268
+ || st.mtimeMs !== f.mtimeMs || st.size !== f.sizeBytes)
269
+ stale.add(f.path);
270
+ }
271
+ catch {
272
+ stale.add(f.path); // gone — patch plans the delete
273
+ }
274
+ }
275
+ this.auditCursor = (this.auditCursor + n) % files.length;
276
+ if (stale.size > 0) {
277
+ this.log(`[coldstart] Fingerprint audit: ${stale.size}/${n} sampled file(s) drifted — re-patching (watcher may have missed events)`);
278
+ void this.handleBatch(stale);
279
+ }
280
+ }
281
+ /** Debounced cache write — avoids hammering disk on rapid successive patches. */
282
+ savingCache = false;
283
+ scheduleCacheSave() {
284
+ if (this.noCache)
285
+ return; // --no-cache: watcher is active but disk writes are disabled
286
+ if (this.pendingCacheSave)
287
+ clearTimeout(this.pendingCacheSave);
288
+ this.pendingCacheSave = setTimeout(() => {
289
+ this.pendingCacheSave = null;
290
+ this.savingCache = true;
291
+ // Refresh the stored head at save time: watcher patches track file
292
+ // content but a checkout also moves HEAD, and a save stamped with the
293
+ // old head makes every reader burn the full HEAD-drift wait forever.
294
+ getGitHead(this.activeIndex.rootDir)
295
+ .then((head) => {
296
+ if (head)
297
+ this.activeIndex.gitHead = head;
298
+ return saveCachedIndex(this.activeIndex, this.cacheDir);
299
+ })
300
+ .then(() => this.stamp({ lastSave: { at: Date.now(), detail: `${this.activeIndex.files.size} files` } }))
301
+ .then(() => this.auditFingerprints())
302
+ .catch(err => this.log(`[coldstart] Cache write failed: ${err}`))
303
+ .finally(() => { this.savingCache = false; });
304
+ // Code changed → anchored files' symbols and absence-search results may
305
+ // have too; re-stamp the KB notes index alongside the cache save.
306
+ void this.refreshKbNotesIndex();
307
+ }, 5_000); // write 5s after last change settles
308
+ }
309
+ /**
310
+ * Fix #2: Watch the cache directory for manual deletes (e.g., user runs
311
+ * `rm -rf ~/.coldstart/indexes/<x>/meta.json`). If meta.json is missing,
312
+ * trigger a rebuild so the cache is recreated.
313
+ *
314
+ * Uses fs.watch on the parent directory (Windows quirk) and checks for
315
+ * meta.json existence. The existence check prevents a loop: the daemon
316
+ * itself writes meta.json on every save, which would fire the watch event,
317
+ * but we only rebuild if meta.json is MISSING.
318
+ */
319
+ startCacheWatcher() {
320
+ if (this.noCache)
321
+ return () => { }; // No cache watching if caching is disabled
322
+ const cacheDir = getCacheDir(this.activeIndex.rootDir, this.cacheDir);
323
+ const metaPath = join(cacheDir, 'meta.json');
324
+ let debounceTimer = null;
325
+ let watcher = null;
326
+ try {
327
+ watcher = watch(cacheDir, { recursive: false }, (_eventType, filename) => {
328
+ // Watch fires on file changes in the cache dir. Only rebuild if meta.json
329
+ // is missing (e.g., user deleted it via `rm meta.json`).
330
+ // The existence check is the safety gate: if meta.json was just written
331
+ // by the daemon, it exists and we don't rebuild.
332
+ if (debounceTimer)
333
+ clearTimeout(debounceTimer);
334
+ debounceTimer = setTimeout(() => {
335
+ debounceTimer = null;
336
+ // Only rebuild if meta.json is missing (user deleted cache manually).
337
+ // Stand down while a rebuild or save is already in flight: the keeper
338
+ // itself writes to this dir between rebuild and (debounced) meta save
339
+ // (keeper-state stamps, segments), and treating those events as "cache
340
+ // still missing" turned one heal into an infinite rebuild loop.
341
+ if (!existsSync(metaPath)) {
342
+ if (this.rebuilding || this.pendingCacheSave !== null || this.savingCache)
343
+ return;
344
+ this.log('[coldstart] Cache meta.json missing — triggering rebuild');
345
+ void this.triggerRebuild();
346
+ }
347
+ }, 200);
348
+ });
349
+ }
350
+ catch (err) {
351
+ this.log(`[coldstart] Cache watcher unavailable: ${err}`);
352
+ return () => { };
353
+ }
354
+ return () => {
355
+ if (debounceTimer)
356
+ clearTimeout(debounceTimer);
357
+ watcher?.close();
358
+ };
359
+ }
360
+ }
361
+ //# sourceMappingURL=index-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-manager.js","sourceRoot":"","sources":["../src/index-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAW,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAWhD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,YAAY;IAeJ;IACA;IACA;IACA;IAjBX,WAAW,CAAgB;IAC3B,UAAU,GAAG,KAAK,CAAC;IACnB,aAAa,GAAwB,IAAI,CAAC;IAC1C,kBAAkB,GAAwB,IAAI,CAAC;IAC/C,gBAAgB,GAAyC,IAAI,CAAC;IAEtE;;;OAGG;IACK,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjD,YACE,YAA2B,EACV,OAAkB,EAClB,QAA4B,EAC5B,OAAgB,EAChB,KAAc;QAHd,YAAO,GAAP,OAAO,CAAW;QAClB,aAAQ,GAAR,QAAQ,CAAoB;QAC5B,YAAO,GAAP,OAAO,CAAS;QAChB,UAAK,GAAL,KAAK,CAAS;QAE/B,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;IAClC,CAAC;IAED,4EAA4E;IAC5E,UAAU;QACR,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IACpE,CAAC;IAED,wDAAwD;IACxD,aAAa;QACX,IAAI,CAAC,aAAa,GAAG,YAAY,CAC/B,IAAI,CAAC,WAAW,CAAC,OAAO,EACxB,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAC5C,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACnD,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE5C,mDAAmD;QACnD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEnD,0EAA0E;QAC1E,oEAAoE;QACpE,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAClC,CAAC;IAED,8CAA8C;IAC9C,YAAY;QACV,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,IAAI,CAAC,gBAAgB;YAAE,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,iBAAiB;YAAE,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnE,CAAC;IAED,8EAA8E;IAC9E,WAAW;IACX,8EAA8E;IAEtE,GAAG,CAAC,GAAG,IAAe;QAC5B,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED;;;;;OAKG;IACK,sBAAsB,CAAC,KAAkB;QAC/C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;iBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;iBACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,MAAM;gBAAE,OAAO;YACxB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1D,IAAI,CAAC,GAAG,CAAC,qCAAqC,QAAQ,CAAC,MAAM,UAAU,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,2EAA2E;QAC3E,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAClC,CAAC;IAED;;;;;;OAMG;IACK,YAAY,GAAG,KAAK,CAAC;IACrB,eAAe,GAAG,KAAK,CAAC;IACxB,KAAK,CAAC,mBAAmB;QAC/B,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,uBAAuB;QACjD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YAAE,OAAO;QACtD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAAC,OAAO;QAAC,CAAC;QAC/D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/E,MAAM,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpE,IAAI,CAAC,GAAG,CAAC,yCAAyC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,aAAa,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,kBAAkB,CAAC,CAAC;QACjJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,8CAA8C,GAAG,EAAE,CAAC,CAAC;QAChE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAkB;QAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QAE7B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,mEAAmE;YACnE,2EAA2E;YAC3E,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC,GAAG,CAAC,4CAA4C,KAAK,CAAC,IAAI,mCAAmC,CAAC,CAAC;YACpG,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,2CAA2C,CAAC,CAAC;YAC/E,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBACpE,oEAAoE;gBACpE,yDAAyD;gBACzD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACvD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,GAAG,CAAC,6DAA6D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC9F,KAAK,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC9D,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC5B,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;gBAC/C,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,UAAU,EAAE,EAAE,CAAC,CAAC;gBACpF,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,6BAA6B,GAAG,kCAAkC,CAAC,CAAC;gBAC7E,KAAK,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9C,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,qBAAqB,SAAS,6BAA6B,CAAC,CAAC;YAC/F,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;kFAE8E;IACtE,UAAU,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9C,KAAK,CAAC,KAAK,CAAC,KAA8C;QAChE,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;aAC9B,IAAI,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC7E,KAAK,CAAC,GAAG,EAAE,GAAqB,CAAC,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,KAAgE,EAAE,MAAc;QACnG,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChF,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC,cAAc;YAC3C,IAAI,CAAC,GAAG,CAAC,iCAAiC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC;YACxE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;YACzB,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC7F,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;YAC/C,KAAK,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YAExB,kEAAkE;YAClE,4DAA4D;YAC5D,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACnD,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;gBAClC,IAAI,CAAC,GAAG,CAAC,0BAA0B,OAAO,CAAC,IAAI,wCAAwC,CAAC,CAAC;gBACzF,KAAK,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,eAAe,GAAG,CAAC,CAAC;IACpB,iBAAiB,GAAyC,IAAI,CAAC;IAC/D,oBAAoB;QAC1B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,eAAe,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAClH,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,mCAAmC,OAAO,GAAG,IAAI,cAAc,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QACjG,IAAI,IAAI,CAAC,iBAAiB;YAAE,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjE,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7B,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACK,WAAW,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC9B,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS;uBACnD,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS;oBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9E,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gCAAgC;YACrD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QACzD,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,kCAAkC,KAAK,CAAC,IAAI,IAAI,CAAC,yEAAyE,CAAC,CAAC;YACrI,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,iFAAiF;IACzE,WAAW,GAAG,KAAK,CAAC;IACpB,iBAAiB;QACvB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,6DAA6D;QACvF,IAAI,IAAI,CAAC,gBAAgB;YAAE,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/D,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,mEAAmE;YACnE,sEAAsE;YACtE,qEAAqE;YACrE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;iBACjC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBACb,IAAI,IAAI;oBAAE,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC1C,OAAO,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,CAAC,CAAC;iBACD,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;iBACxG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;iBACpC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;iBAChE,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,wEAAwE;YACxE,kEAAkE;YAClE,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAClC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,qCAAqC;IAClD,CAAC;IAED;;;;;;;;;OASG;IACK,iBAAiB;QACvB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,2CAA2C;QAE9E,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE7C,IAAI,aAAa,GAAyC,IAAI,CAAC;QAC/D,IAAI,OAAO,GAAoC,IAAI,CAAC;QAEpD,IAAI,CAAC;YACH,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;gBACvE,0EAA0E;gBAC1E,yDAAyD;gBACzD,wEAAwE;gBACxE,iDAAiD;gBACjD,IAAI,aAAa;oBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC/C,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,aAAa,GAAG,IAAI,CAAC;oBACrB,sEAAsE;oBACtE,sEAAsE;oBACtE,sEAAsE;oBACtE,uEAAuE;oBACvE,gEAAgE;oBAChE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC1B,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW;4BAAE,OAAO;wBAClF,IAAI,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;wBACrE,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC7B,CAAC;gBACH,CAAC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;YAC1D,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,GAAG,EAAE;YACV,IAAI,aAAa;gBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;YAC/C,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import type { CodebaseIndex } from './types.js';
3
+ export declare function buildIndex(rootDir: string, excludes: string[], includes: string[], quiet: boolean): Promise<CodebaseIndex>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAgDA,OAAO,KAAK,EAAE,aAAa,EAA2B,MAAM,YAAY,CAAC;AAqFzE,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,aAAa,CAAC,CA8IxB"}