@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,155 @@
1
+ import { dirname, join } from 'node:path';
2
+ import { readFile, readdir } from 'node:fs/promises';
3
+ const workspaceCache = new Map();
4
+ const startDirToWorkspaceToml = new Map();
5
+ async function readFileOpt(path) {
6
+ try {
7
+ return await readFile(path, 'utf-8');
8
+ }
9
+ catch {
10
+ return null;
11
+ }
12
+ }
13
+ /**
14
+ * Returns the member list when a [workspace] section exists (may be empty),
15
+ * or null when the toml has no [workspace] section at all.
16
+ */
17
+ function parseWorkspaceMembers(toml) {
18
+ const sectionRe = /^\s*\[workspace\]\s*$/m;
19
+ const wsMatch = toml.match(sectionRe);
20
+ if (!wsMatch)
21
+ return null;
22
+ const rest = toml.slice(wsMatch.index + wsMatch[0].length);
23
+ const nextSection = rest.search(/^\s*\[[^\]]+\]\s*$/m);
24
+ const section = nextSection >= 0 ? rest.slice(0, nextSection) : rest;
25
+ const arrMatch = section.match(/members\s*=\s*\[([\s\S]*?)\]/);
26
+ if (!arrMatch)
27
+ return [];
28
+ const members = [];
29
+ const strRe = /["']([^"']+)["']/g;
30
+ let mm;
31
+ while ((mm = strRe.exec(arrMatch[1])) !== null)
32
+ members.push(mm[1]);
33
+ return members;
34
+ }
35
+ function parsePackageName(toml) {
36
+ const pkgMatch = toml.match(/^\s*\[package\]\s*$/m);
37
+ if (!pkgMatch)
38
+ return null;
39
+ const rest = toml.slice(pkgMatch.index + pkgMatch[0].length);
40
+ const next = rest.search(/^\s*\[[^\]]+\]\s*$/m);
41
+ const section = next >= 0 ? rest.slice(0, next) : rest;
42
+ const nameMatch = section.match(/^\s*name\s*=\s*["']([^"']+)["']/m);
43
+ return nameMatch ? nameMatch[1] : null;
44
+ }
45
+ function escapeRegex(s) {
46
+ return s.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
47
+ }
48
+ async function expandMemberPattern(workspaceDir, pattern) {
49
+ if (pattern.startsWith('!'))
50
+ return [];
51
+ if (!pattern.includes('*'))
52
+ return [join(workspaceDir, pattern)];
53
+ const segments = pattern.split('/');
54
+ let dirs = [workspaceDir];
55
+ for (const seg of segments) {
56
+ if (!seg.includes('*')) {
57
+ dirs = dirs.map(d => join(d, seg));
58
+ continue;
59
+ }
60
+ const regex = new RegExp('^' + seg.split('*').map(escapeRegex).join('.*') + '$');
61
+ const next = [];
62
+ for (const d of dirs) {
63
+ try {
64
+ const entries = await readdir(d, { withFileTypes: true });
65
+ for (const e of entries) {
66
+ if (e.isDirectory() && regex.test(e.name))
67
+ next.push(join(d, e.name));
68
+ }
69
+ }
70
+ catch { /* skip */ }
71
+ }
72
+ dirs = next;
73
+ }
74
+ return dirs;
75
+ }
76
+ async function loadWorkspaceInfo(workspaceDir, workspaceToml, isWorkspace) {
77
+ const crates = new Map();
78
+ const addCrate = (name, srcRoot) => {
79
+ crates.set(name.replace(/-/g, '_'), { name, srcRoot });
80
+ };
81
+ // ripgrep's root Cargo.toml ships BOTH [workspace] and [package] — handle either.
82
+ const rootName = parsePackageName(workspaceToml);
83
+ if (rootName)
84
+ addCrate(rootName, join(workspaceDir, 'src'));
85
+ if (isWorkspace) {
86
+ const members = parseWorkspaceMembers(workspaceToml) ?? [];
87
+ for (const pattern of members) {
88
+ const memberDirs = await expandMemberPattern(workspaceDir, pattern);
89
+ for (const memberDir of memberDirs) {
90
+ const memberToml = await readFileOpt(join(memberDir, 'Cargo.toml'));
91
+ if (!memberToml)
92
+ continue;
93
+ const name = parsePackageName(memberToml);
94
+ if (!name)
95
+ continue;
96
+ addCrate(name, join(memberDir, 'src'));
97
+ }
98
+ }
99
+ }
100
+ return { workspaceDir, crates };
101
+ }
102
+ export async function findRustWorkspace(startDir) {
103
+ if (startDirToWorkspaceToml.has(startDir)) {
104
+ const tomlPath = startDirToWorkspaceToml.get(startDir);
105
+ return tomlPath ? workspaceCache.get(tomlPath) ?? null : null;
106
+ }
107
+ let workspaceTomlPath = null;
108
+ let workspaceTomlContent = null;
109
+ let nearestTomlPath = null;
110
+ let nearestTomlContent = null;
111
+ let dir = startDir;
112
+ for (let i = 0; i < 64; i++) {
113
+ const tomlPath = join(dir, 'Cargo.toml');
114
+ const content = await readFileOpt(tomlPath);
115
+ if (content !== null) {
116
+ if (!nearestTomlContent) {
117
+ nearestTomlPath = tomlPath;
118
+ nearestTomlContent = content;
119
+ }
120
+ if (parseWorkspaceMembers(content) !== null) {
121
+ workspaceTomlPath = tomlPath;
122
+ workspaceTomlContent = content;
123
+ break;
124
+ }
125
+ }
126
+ const parent = dirname(dir);
127
+ if (parent === dir)
128
+ break;
129
+ dir = parent;
130
+ }
131
+ let chosenPath = null;
132
+ let chosenContent = null;
133
+ let chosenIsWorkspace = false;
134
+ if (workspaceTomlPath && workspaceTomlContent) {
135
+ chosenPath = workspaceTomlPath;
136
+ chosenContent = workspaceTomlContent;
137
+ chosenIsWorkspace = true;
138
+ }
139
+ else if (nearestTomlPath && nearestTomlContent) {
140
+ chosenPath = nearestTomlPath;
141
+ chosenContent = nearestTomlContent;
142
+ }
143
+ if (!chosenPath || !chosenContent) {
144
+ startDirToWorkspaceToml.set(startDir, null);
145
+ return null;
146
+ }
147
+ startDirToWorkspaceToml.set(startDir, chosenPath);
148
+ const cached = workspaceCache.get(chosenPath);
149
+ if (cached !== undefined)
150
+ return cached;
151
+ const info = await loadWorkspaceInfo(dirname(chosenPath), chosenContent, chosenIsWorkspace);
152
+ workspaceCache.set(chosenPath, info);
153
+ return info;
154
+ }
155
+ //# sourceMappingURL=rust-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust-workspace.js","sourceRoot":"","sources":["../../src/indexer/rust-workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { IndexedFile, SymbolEdge } from '../types.js';
2
+ /**
3
+ * Build symbol-level edges for a set of files.
4
+ *
5
+ * For each symbol:
6
+ * - exports: file → symbol (for exported symbols)
7
+ * - calls: resolved to a qualified "fileId#name" edge where the callee name
8
+ * matches an export of one of the file's resolved imports; bare names that
9
+ * cannot be resolved are kept as-is (external/dynamic calls).
10
+ * - extends / implements: stored as bare names (resolved at query time)
11
+ *
12
+ * @param files The files to build edges for.
13
+ * @param outEdges File-level import graph: fileId → [importedFileId, ...]
14
+ * @param allFiles Full file map used to look up exports of imported files.
15
+ * For buildIndex this is the same set as `files`; for patch
16
+ * it is the full index.files map (includes unchanged files).
17
+ */
18
+ export declare function buildSymbolEdges(files: IndexedFile[], outEdges: Map<string, string[]>, allFiles: Map<string, IndexedFile>): SymbolEdge[];
19
+ //# sourceMappingURL=symbol-edges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-edges.d.ts","sourceRoot":"","sources":["../../src/indexer/symbol-edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAAE,EACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC/B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GACjC,UAAU,EAAE,CAiGd"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Build symbol-level edges for a set of files.
3
+ *
4
+ * For each symbol:
5
+ * - exports: file → symbol (for exported symbols)
6
+ * - calls: resolved to a qualified "fileId#name" edge where the callee name
7
+ * matches an export of one of the file's resolved imports; bare names that
8
+ * cannot be resolved are kept as-is (external/dynamic calls).
9
+ * - extends / implements: stored as bare names (resolved at query time)
10
+ *
11
+ * @param files The files to build edges for.
12
+ * @param outEdges File-level import graph: fileId → [importedFileId, ...]
13
+ * @param allFiles Full file map used to look up exports of imported files.
14
+ * For buildIndex this is the same set as `files`; for patch
15
+ * it is the full index.files map (includes unchanged files).
16
+ */
17
+ export function buildSymbolEdges(files, outEdges, allFiles) {
18
+ // Pre-build export lookup: fileId → Set<exportedSymbolName>
19
+ const exportsByFile = new Map();
20
+ // Suffix index for qualified names: fileId → Map<suffix, fullExportName>.
21
+ // Java methods are stored as "Class.method"; Ruby as "Class::method" or "Module::Class".
22
+ // Bare callees ("method") need to resolve back to the qualified export.
23
+ // If a file has two exports with the same suffix (rare in practice), drop both
24
+ // from the suffix index so we don't pick arbitrarily.
25
+ const suffixIndexByFile = new Map();
26
+ for (const [id, file] of allFiles) {
27
+ exportsByFile.set(id, new Set(file.exports));
28
+ const suffixMap = new Map();
29
+ const ambiguous = new Set();
30
+ for (const exp of file.exports) {
31
+ // Split on last '.' or '::'. Tree-sitter Java/Ruby extractors don't mix separators.
32
+ const dotIdx = exp.lastIndexOf('.');
33
+ const colonIdx = exp.lastIndexOf('::');
34
+ const sepIdx = Math.max(dotIdx, colonIdx);
35
+ if (sepIdx <= 0)
36
+ continue;
37
+ const sepLen = colonIdx === sepIdx ? 2 : 1;
38
+ const suffix = exp.slice(sepIdx + sepLen);
39
+ if (!suffix)
40
+ continue;
41
+ if (suffixMap.has(suffix))
42
+ ambiguous.add(suffix);
43
+ else
44
+ suffixMap.set(suffix, exp);
45
+ }
46
+ for (const a of ambiguous)
47
+ suffixMap.delete(a);
48
+ suffixIndexByFile.set(id, suffixMap);
49
+ }
50
+ const edges = [];
51
+ for (const file of files) {
52
+ const importedFileIds = outEdges.get(file.id) ?? [];
53
+ for (const sym of file.symbols) {
54
+ // exports: file → symbol
55
+ if (sym.isExported) {
56
+ edges.push({ from: file.id, to: sym.id, type: 'exports' });
57
+ }
58
+ // calls: resolve bare name → qualified id where possible
59
+ for (const callSite of sym.calls) {
60
+ const callee = callSite.name;
61
+ const line = callSite.line;
62
+ // Already qualified (intra-file resolution in ts-parser produces "fileId#name")
63
+ if (callee.includes('#')) {
64
+ edges.push({ from: sym.id, to: callee, type: 'calls', line });
65
+ continue;
66
+ }
67
+ // Try to resolve against imported files.
68
+ // Pass 1: direct export match (TS/JS, anything that exports bare names).
69
+ let resolved = null;
70
+ for (const importedId of importedFileIds) {
71
+ if (exportsByFile.get(importedId)?.has(callee)) {
72
+ resolved = `${importedId}#${callee}`;
73
+ break;
74
+ }
75
+ }
76
+ // Pass 2: suffix match against qualified exports (Java/Ruby). Only resolve
77
+ // if exactly one imported file's suffix index contains this callee — else
78
+ // we'd be guessing.
79
+ if (!resolved) {
80
+ let matchFile = null;
81
+ let matchFull = null;
82
+ let multiple = false;
83
+ for (const importedId of importedFileIds) {
84
+ const full = suffixIndexByFile.get(importedId)?.get(callee);
85
+ if (full) {
86
+ if (matchFile) {
87
+ multiple = true;
88
+ break;
89
+ }
90
+ matchFile = importedId;
91
+ matchFull = full;
92
+ }
93
+ }
94
+ if (matchFile && matchFull && !multiple) {
95
+ resolved = `${matchFile}#${matchFull}`;
96
+ }
97
+ }
98
+ // A2: drop unresolvable bare-name 'calls' edges. They're noise — query-time
99
+ // lookups always use qualified `fileId#name` ids, so bare-name targets
100
+ // never match and just bloat the symInEdges reverse-adjacency map.
101
+ // 'extends' / 'implements' bare-name edges are kept (queryable by class name).
102
+ if (resolved) {
103
+ edges.push({ from: sym.id, to: resolved, type: 'calls', line });
104
+ }
105
+ }
106
+ // extends / implements
107
+ if (sym.extendsName) {
108
+ edges.push({ from: sym.id, to: sym.extendsName, type: 'extends' });
109
+ }
110
+ for (const iface of sym.implementsNames) {
111
+ edges.push({ from: sym.id, to: iface, type: 'implements' });
112
+ }
113
+ }
114
+ }
115
+ return edges;
116
+ }
117
+ //# sourceMappingURL=symbol-edges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-edges.js","sourceRoot":"","sources":["../../src/indexer/symbol-edges.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { DomainEvidence } from '../types.js';
2
+ /**
3
+ * Returns true if any directory segment in the relative path contains a test
4
+ * infrastructure word (e.g. "e2e-tests/", "locators/", "__tests__/", "qa/"),
5
+ * or if the filename matches a per-language test convention.
6
+ * Works for any project structure — no hardcoded paths.
7
+ */
8
+ export declare function isTestPath(relativePath: string): boolean;
9
+ /**
10
+ * Split a name into lowercase tokens by camelCase, PascalCase, snake_case,
11
+ * kebab-case, and dot boundaries. Filters out stop words and single-char tokens.
12
+ */
13
+ export declare function tokenizeName(name: string): string[];
14
+ /**
15
+ * Build the domainMap Record<string, DomainEvidence> for a file from:
16
+ * 1. Non-generic directory segments in the relative path (path source)
17
+ * 2. Effective filename tokens (filename source, with dir-entry promotion)
18
+ * 3. Exported symbol names (symbol source)
19
+ *
20
+ * Import specifiers are intentionally excluded: what a file imports describes
21
+ * its dependencies, not its identity. Adding them caused high-fan-out files
22
+ * (routers, layout roots, API clients) to match every query for the features
23
+ * they depend on — pure noise. Identity comes from path and exports only.
24
+ */
25
+ export declare function buildFileDomains(relativePath: string, exports: string[]): Record<string, DomainEvidence>;
26
+ //# sourceMappingURL=tokenize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../../src/indexer/tokenize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA2ElD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAmBxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CASnD;AAsBD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EAAE,GAChB,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAgEhC"}
@@ -0,0 +1,200 @@
1
+ import { basename, extname } from 'node:path';
2
+ const STOP_WORDS = new Set([
3
+ 'index', 'component', 'util', 'helper', 'default',
4
+ 'type', 'interface', 'class', 'function', 'const', 'enum',
5
+ 'module', 'export', 'import', 'test', 'spec', 'mock',
6
+ 'base', 'abstract', 'impl', 'main', 'app', 'core',
7
+ 'get', 'set', 'has', 'is', 'on', 'to', 'from', 'with',
8
+ 'new', 'init',
9
+ 'handler', 'wrapper', 'provider', 'manager',
10
+ 'props', 'state', 'context', 'config', 'options', 'params',
11
+ ]);
12
+ const GENERIC_DIRS = new Set([
13
+ 'src', 'lib', 'app', 'apps', 'packages', 'pkg', 'source', 'code',
14
+ 'components', 'pages', 'views', 'screens', 'features',
15
+ ]);
16
+ // Directory-entry filenames: when a file has one of these names, use the
17
+ // parent directory name instead for the 'filename' source token.
18
+ const DIR_ENTRY_NAMES = new Set(['index', '__init__', 'mod', 'page', 'route', 'layout', 'loading']);
19
+ // Words that, when found as a token in any path segment, mark a file as test infrastructure.
20
+ // Matched via tokenizeName so word-boundary splitting handles e2e-tests, __tests__, pageObjects etc.
21
+ // Compound forms (integrationtest, uitests, etc.) are listed because tokenizeName won't split
22
+ // all-lowercase compounds without separators.
23
+ const TEST_SEGMENT_WORDS = new Set([
24
+ 'test', 'tests', 'spec', 'specs', 'e2e', 'mock', 'mocks', 'fixture', 'fixtures',
25
+ 'stub', 'stubs', 'locator', 'locators', 'pageobject', 'pageobjects',
26
+ 'automation', 'cypress', 'playwright', 'selenium', 'nightwatch', 'webdriver',
27
+ // QA top-level directories
28
+ 'qa', 'qe',
29
+ // Compound test-dir names (tokenizeName doesn't split all-lowercase compounds)
30
+ 'unittest', 'unittests',
31
+ 'integrationtest', 'integrationtests',
32
+ 'whiteboxtest', 'whiteboxtests',
33
+ 'blackboxtest', 'blackboxtests',
34
+ 'uitest', 'uitests',
35
+ 'apitest', 'apitests',
36
+ 'e2etest', 'e2etests',
37
+ 'smoketest', 'smoketests',
38
+ 'loadtest', 'loadtests',
39
+ 'perftest', 'perftests',
40
+ ]);
41
+ /**
42
+ * Detects test files by filename convention across the supported languages.
43
+ * Case-sensitive checks on the stem avoid false positives like `latest.js`,
44
+ * `Contest.java`, `Manifest.java`.
45
+ */
46
+ function isTestFilename(filename) {
47
+ const lower = filename.toLowerCase();
48
+ // 1. JS/TS dotted: foo.test.ts, foo.spec.js, foo.mock.tsx, foo.e2e.ts, foo.cy.ts
49
+ if (/\.(test|spec|mock|e2e|cy)\.[a-z]+$/.test(lower))
50
+ return true;
51
+ // 2. Snake_case suffix: foo_test.go, foo_spec.rb, foo_test.py, foo_tests.rs, foo_test.cpp
52
+ if (/_(?:tests?|specs?)\.[a-z]+$/.test(lower))
53
+ return true;
54
+ // 3. Snake_case prefix: test_foo.py, test_foo.cpp
55
+ if (/^test_.+\.(?:py|cpp|cc|cxx|h|hpp)$/.test(lower))
56
+ return true;
57
+ // 4. Pytest config
58
+ if (lower === 'conftest.py')
59
+ return true;
60
+ // 5. CamelCase suffix on stem (Java/Kotlin/C#/PHP): MyClassTest.java, MySpec.kt, MyITCase.java
61
+ const stem = filename.replace(/\.[^.]+$/, '');
62
+ if (/(?:Test|Tests|Spec|Specs|ITCase)$/.test(stem))
63
+ return true;
64
+ // 6. CamelCase prefix on stem (Java/Kotlin/C#/PHP): TestMyClass.java
65
+ if (/^Test[A-Z]/.test(stem))
66
+ return true;
67
+ return false;
68
+ }
69
+ /**
70
+ * Returns true if any directory segment in the relative path contains a test
71
+ * infrastructure word (e.g. "e2e-tests/", "locators/", "__tests__/", "qa/"),
72
+ * or if the filename matches a per-language test convention.
73
+ * Works for any project structure — no hardcoded paths.
74
+ */
75
+ export function isTestPath(relativePath) {
76
+ const normalized = relativePath.replace(/\\/g, '/');
77
+ const parts = normalized.split('/');
78
+ const filename = parts[parts.length - 1];
79
+ if (isTestFilename(filename))
80
+ return true;
81
+ // Check all directory segments
82
+ const dirParts = parts.slice(0, -1);
83
+ for (const segment of dirParts) {
84
+ const tokens = tokenizeName(segment);
85
+ for (const token of tokens) {
86
+ if (TEST_SEGMENT_WORDS.has(token))
87
+ return true;
88
+ }
89
+ // Also check the raw lowercased segment for compound words like "e2e" that survive intact
90
+ const lower = segment.toLowerCase();
91
+ if (TEST_SEGMENT_WORDS.has(lower))
92
+ return true;
93
+ }
94
+ return false;
95
+ }
96
+ /**
97
+ * Split a name into lowercase tokens by camelCase, PascalCase, snake_case,
98
+ * kebab-case, and dot boundaries. Filters out stop words and single-char tokens.
99
+ */
100
+ export function tokenizeName(name) {
101
+ const parts = name
102
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
103
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
104
+ .split(/[\s\-_.\/]+/)
105
+ .map(p => p.toLowerCase())
106
+ .filter(p => p.length > 1 && !STOP_WORDS.has(p));
107
+ return parts;
108
+ }
109
+ /**
110
+ * Additive pluralization: for each token length >= 5, add the singular form
111
+ * if the token ends in 's' or 'es' and the singular isn't already present.
112
+ * Both forms coexist. Copies evidence counts from the plural origin entry.
113
+ */
114
+ function addPlurals(map) {
115
+ for (const [token, evidence] of Object.entries(map)) {
116
+ if (token.length < 5)
117
+ continue;
118
+ let singular = null;
119
+ if (token.endsWith('es') && token.length > 4) {
120
+ singular = token.slice(0, -2);
121
+ }
122
+ else if (token.endsWith('s')) {
123
+ singular = token.slice(0, -1);
124
+ }
125
+ if (singular && singular.length >= 4 && !STOP_WORDS.has(singular) && !map[singular]) {
126
+ map[singular] = { ...evidence };
127
+ }
128
+ }
129
+ }
130
+ /**
131
+ * Build the domainMap Record<string, DomainEvidence> for a file from:
132
+ * 1. Non-generic directory segments in the relative path (path source)
133
+ * 2. Effective filename tokens (filename source, with dir-entry promotion)
134
+ * 3. Exported symbol names (symbol source)
135
+ *
136
+ * Import specifiers are intentionally excluded: what a file imports describes
137
+ * its dependencies, not its identity. Adding them caused high-fan-out files
138
+ * (routers, layout roots, API clients) to match every query for the features
139
+ * they depend on — pure noise. Identity comes from path and exports only.
140
+ */
141
+ export function buildFileDomains(relativePath, exports) {
142
+ const domainMap = {};
143
+ function addToken(token, source) {
144
+ if (!domainMap[token])
145
+ domainMap[token] = { filename: 0, path: 0, symbol: 0 };
146
+ domainMap[token][source]++;
147
+ }
148
+ const normalized = relativePath.replace(/\\/g, '/');
149
+ const parts = normalized.split('/');
150
+ const dirParts = parts.slice(0, -1);
151
+ const filenamePart = parts[parts.length - 1] ?? '';
152
+ const filenameWithoutExt = basename(filenamePart, extname(filenamePart));
153
+ const filenameLower = filenameWithoutExt.toLowerCase();
154
+ // 1. Directory segments → path source
155
+ for (const part of dirParts) {
156
+ const lower = part.toLowerCase();
157
+ if (!GENERIC_DIRS.has(lower)) {
158
+ for (const token of tokenizeName(part)) {
159
+ addToken(token, 'path');
160
+ }
161
+ }
162
+ }
163
+ // 2. Effective filename → filename source
164
+ // If the filename is a directory-entry name, use parent dir name instead
165
+ let effectiveFilename;
166
+ if (DIR_ENTRY_NAMES.has(filenameLower)) {
167
+ // Use the immediate parent directory name
168
+ effectiveFilename = dirParts[dirParts.length - 1] ?? '';
169
+ }
170
+ else {
171
+ effectiveFilename = filenameWithoutExt;
172
+ }
173
+ if (effectiveFilename) {
174
+ const effLower = effectiveFilename.toLowerCase();
175
+ if (!GENERIC_DIRS.has(effLower) && !STOP_WORDS.has(effLower)) {
176
+ for (const token of tokenizeName(effectiveFilename)) {
177
+ addToken(token, 'filename');
178
+ }
179
+ // Compound form
180
+ const compound = effLower;
181
+ if (compound.length > 3 && !STOP_WORDS.has(compound)) {
182
+ addToken(compound, 'filename');
183
+ }
184
+ }
185
+ }
186
+ // 3. Exported symbol names → symbol source
187
+ for (const exp of exports) {
188
+ for (const token of tokenizeName(exp)) {
189
+ addToken(token, 'symbol');
190
+ }
191
+ const fullLower = exp.toLowerCase();
192
+ if (fullLower.length > 3 && !STOP_WORDS.has(fullLower)) {
193
+ addToken(fullLower, 'symbol');
194
+ }
195
+ }
196
+ // 4. Additive pluralization
197
+ addPlurals(domainMap);
198
+ return domainMap;
199
+ }
200
+ //# sourceMappingURL=tokenize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../src/indexer/tokenize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { SymbolNode } from '../types.js';
2
+ export interface TsParseResult {
3
+ imports: string[];
4
+ exports: string[];
5
+ hasDefaultExport: boolean;
6
+ symbols: SymbolNode[];
7
+ reexportRatio: number;
8
+ }
9
+ export declare function parseTsContent(content: string, fileId: string, isTsx?: boolean): TsParseResult;
10
+ //# sourceMappingURL=ts-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ts-parser.d.ts","sourceRoot":"","sources":["../../src/indexer/ts-parser.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,aAAa,CAAC;AAubpE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAkBD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,UAAQ,GACZ,aAAa,CA4Kf"}