@backbencher/brain 0.0.0-stage → 0.1.1

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 (319) hide show
  1. package/CHANGELOG.md +298 -0
  2. package/EMBEDDINGS.md +355 -0
  3. package/LICENSE +21 -0
  4. package/README.md +415 -2
  5. package/bin/bb +13 -0
  6. package/dist/analysis-exclusions-7ZJDXOVZ.js +35 -0
  7. package/dist/brain-index-health-Q5APTJQL.js +17 -0
  8. package/dist/brain-relationship-enrichment-MYR2AM4F.js +558 -0
  9. package/dist/brain.sql-EIM4WS4D.js +29 -0
  10. package/dist/chunk-22V37YTK.js +1758 -0
  11. package/dist/chunk-2BSKD7O3.js +40 -0
  12. package/dist/chunk-2DE27DVC.js +1314 -0
  13. package/dist/chunk-2RRBMNBQ.js +322 -0
  14. package/dist/chunk-2WXYNLBA.js +29 -0
  15. package/dist/chunk-3CTFIJJB.js +17 -0
  16. package/dist/chunk-3ZTOHHSW.js +2104 -0
  17. package/dist/chunk-4H22TLOT.js +543 -0
  18. package/dist/chunk-5BVAH26D.js +340 -0
  19. package/dist/chunk-62DHLYW6.js +3427 -0
  20. package/dist/chunk-7AN7U5IZ.js +371 -0
  21. package/dist/chunk-7DRPNVIN.js +782 -0
  22. package/dist/chunk-7MBYT777.js +174 -0
  23. package/dist/chunk-AHDWGM7Q.js +236 -0
  24. package/dist/chunk-B5GEAAYF.js +818 -0
  25. package/dist/chunk-BEIZZ73B.js +1479 -0
  26. package/dist/chunk-BQ3OVQ3P.js +125 -0
  27. package/dist/chunk-D2Q4Y47A.js +53 -0
  28. package/dist/chunk-DIYAGQJL.js +34 -0
  29. package/dist/chunk-DWKXZ6IF.js +336 -0
  30. package/dist/chunk-DYM4FQEE.js +90 -0
  31. package/dist/chunk-ENW4BTBA.js +930 -0
  32. package/dist/chunk-EWMWK7WN.js +75 -0
  33. package/dist/chunk-EY5ZZUUA.js +626 -0
  34. package/dist/chunk-GBI7V7KY.js +69 -0
  35. package/dist/chunk-GEFFO6O2.js +152 -0
  36. package/dist/chunk-HJEWO5EV.js +247 -0
  37. package/dist/chunk-HQSPJDHI.js +613 -0
  38. package/dist/chunk-KAET47ZL.js +125 -0
  39. package/dist/chunk-KCDECRJY.js +440 -0
  40. package/dist/chunk-L5TDYKYK.js +76 -0
  41. package/dist/chunk-MLKGABMK.js +9 -0
  42. package/dist/chunk-NO3U3FJQ.js +201 -0
  43. package/dist/chunk-OWISBAOF.js +61 -0
  44. package/dist/chunk-QKTRECYS.js +1119 -0
  45. package/dist/chunk-QLK6ED4Q.js +235 -0
  46. package/dist/chunk-R2GW4F6R.js +19 -0
  47. package/dist/chunk-RCMTFSEF.js +87 -0
  48. package/dist/chunk-RM3PY6TG.js +376 -0
  49. package/dist/chunk-ROMM6KMC.js +433 -0
  50. package/dist/chunk-SGGCSHAX.js +12050 -0
  51. package/dist/chunk-SK6YVHFZ.js +211 -0
  52. package/dist/chunk-SM7RFQRO.js +214 -0
  53. package/dist/chunk-UGR4QIGS.js +67 -0
  54. package/dist/chunk-UQNQZXHY.js +711 -0
  55. package/dist/chunk-UUNHHX4M.js +13 -0
  56. package/dist/chunk-VL52PL2T.js +71 -0
  57. package/dist/chunk-WIG36E67.js +196 -0
  58. package/dist/chunk-XHK3WWGB.js +7436 -0
  59. package/dist/chunk-XTQM2IP3.js +2863 -0
  60. package/dist/chunk-ZE2LG76D.js +1296 -0
  61. package/dist/chunk-ZETTGPAW.js +6950 -0
  62. package/dist/cli/index.js +37 -0
  63. package/dist/config-HZAAYDP3.js +10 -0
  64. package/dist/content-search-7XIP555Q.js +593 -0
  65. package/dist/database-76RP44JG.js +9 -0
  66. package/dist/doctor-ANGETYMN.js +395 -0
  67. package/dist/edit-engine-CG72LDZD.js +51 -0
  68. package/dist/engine-BKEOGN7N.js +11 -0
  69. package/dist/engine-VIW6NSKO.js +18 -0
  70. package/dist/fingerprint-OBLIMZLP.js +33 -0
  71. package/dist/framework-intelligence-3LORTPOX.js +860 -0
  72. package/dist/freshness-3K6VU5OT.js +174 -0
  73. package/dist/graph-engine-HBSQNPTB.js +21 -0
  74. package/dist/graph_request-Q6NKB6N2.js +350 -0
  75. package/dist/impact_request-LYP672WE.js +68 -0
  76. package/dist/index-space-IUUN5WYV.js +15 -0
  77. package/dist/index-status-7OVGYSGW.js +34 -0
  78. package/dist/index.js +159 -0
  79. package/dist/instance-FO6QZRLH.js +19 -0
  80. package/dist/language-detection-DFCAU5DZ.js +11 -0
  81. package/dist/lsp/server.js +4301 -0
  82. package/dist/mcp/server.js +132 -0
  83. package/dist/onboard-DIQZV2NW.js +161 -0
  84. package/dist/override-companion-pass-XR7MHTP7.js +117 -0
  85. package/dist/parallel-indexer-FK2XKZXY.js +88 -0
  86. package/dist/pool-worker.js +1153 -0
  87. package/dist/project-health-6XPENVAA.js +94 -0
  88. package/dist/project-index-5SDPHITE.js +57 -0
  89. package/dist/project-registry-ZJ3DVUGO.js +355 -0
  90. package/dist/real-bash-analyzer-EJAU5LW5.js +2201 -0
  91. package/dist/real-c-analyzer-HBD3FNNH.js +5942 -0
  92. package/dist/real-clean-analyzer-4EEZLPV5.js +3470 -0
  93. package/dist/real-clojure-analyzer-Q55EBOO2.js +2818 -0
  94. package/dist/real-cpp-analyzer-IVVOD25R.js +4101 -0
  95. package/dist/real-csharp-analyzer-ZBNLNJZJ.js +3298 -0
  96. package/dist/real-css-analyzer-6XRQLUN7.js +15 -0
  97. package/dist/real-dart-analyzer-OLR72EFW.js +3944 -0
  98. package/dist/real-elixir-analyzer-MQWGAH2I.js +2192 -0
  99. package/dist/real-erlang-analyzer-7BVPQEHO.js +1731 -0
  100. package/dist/real-fsharp-analyzer-C2UPFNOA.js +2390 -0
  101. package/dist/real-go-analyzer-UKGI43YS.js +4126 -0
  102. package/dist/real-graphql-analyzer-VE2EEFII.js +1442 -0
  103. package/dist/real-groovy-analyzer-W26VACFW.js +2285 -0
  104. package/dist/real-haskell-analyzer-5CVVAJRX.js +2533 -0
  105. package/dist/real-hcl-analyzer-5ZT4U43N.js +725 -0
  106. package/dist/real-html-analyzer-JWNX3C6I.js +1759 -0
  107. package/dist/real-java-analyzer-GU42VBGQ.js +4677 -0
  108. package/dist/real-javascript-analyzer-QA4QOJ6W.js +14 -0
  109. package/dist/real-json-analyzer-MPA6PRXL.js +1640 -0
  110. package/dist/real-julia-analyzer-22CWYQMN.js +2085 -0
  111. package/dist/real-kotlin-analyzer-QDZJLXXU.js +3956 -0
  112. package/dist/real-lua-analyzer-G7NHLYKS.js +1957 -0
  113. package/dist/real-makefile-analyzer-OCY3GT5N.js +920 -0
  114. package/dist/real-markdown-analyzer-TEJK2JXJ.js +1215 -0
  115. package/dist/real-matlab-analyzer-Q5SWLN7Z.js +480 -0
  116. package/dist/real-nim-analyzer-YLXSK563.js +3603 -0
  117. package/dist/real-objective-c-analyzer-D23ACC2R.js +1518 -0
  118. package/dist/real-perl-analyzer-WWTRHYDT.js +1865 -0
  119. package/dist/real-php-analyzer-JNKJHTCL.js +9368 -0
  120. package/dist/real-powershell-analyzer-XRSNQERV.js +2915 -0
  121. package/dist/real-protobuf-analyzer-3OKUCZ7T.js +867 -0
  122. package/dist/real-python-analyzer-VXAFWI72.js +4880 -0
  123. package/dist/real-r-analyzer-ZGAIDVI4.js +2596 -0
  124. package/dist/real-ruby-analyzer-X2KTLVBH.js +2429 -0
  125. package/dist/real-rust-analyzer-OFFHPL2A.js +3359 -0
  126. package/dist/real-scala-analyzer-TSTW27J6.js +3293 -0
  127. package/dist/real-scss-analyzer-AVWYPSOQ.js +1515 -0
  128. package/dist/real-solidity-analyzer-UCI2KWUB.js +2608 -0
  129. package/dist/real-sql-analyzer-F77ZMQXR.js +3840 -0
  130. package/dist/real-svelte-analyzer-SF7NRUO5.js +2532 -0
  131. package/dist/real-swift-analyzer-MN5QT3QN.js +2311 -0
  132. package/dist/real-toml-analyzer-66L7BDCQ.js +929 -0
  133. package/dist/real-typescript-analyzer-6KEMVDWQ.js +14 -0
  134. package/dist/real-vb-analyzer-VICVPOP7.js +3145 -0
  135. package/dist/real-vba-analyzer-HXLTTHKM.js +466 -0
  136. package/dist/real-vue-analyzer-QXR56CFV.js +2680 -0
  137. package/dist/real-xml-analyzer-YL465ZJW.js +2405 -0
  138. package/dist/real-yaml-analyzer-SUBCBNSI.js +3528 -0
  139. package/dist/real-zig-analyzer-HIQLZMGY.js +2430 -0
  140. package/dist/regex-search-NJKHMZNO.js +239 -0
  141. package/dist/rules-ACHPB7QU.js +152 -0
  142. package/dist/scoped-path-MJYWJZQX.js +11 -0
  143. package/dist/setup-show-NT5ZHYNE.js +15 -0
  144. package/dist/setup-wizard-G5YYR5T6.js +24 -0
  145. package/dist/symbol-search-GZJIM2J2.js +16 -0
  146. package/dist/taint-KXUHHPIE.js +202 -0
  147. package/dist/taint-analyzer-N7YLZU3N.js +163 -0
  148. package/dist/tool-handlers-OJDC35DI.js +72 -0
  149. package/dist/tool-registry-BPEJNSZG.js +17 -0
  150. package/dist/tool-validation-Q57YMMBX.js +32 -0
  151. package/dist/type-inference-QMT2RMLV.js +13 -0
  152. package/dist/vector-binary-LMY4QGAN.js +19 -0
  153. package/dist/version-ABP2TUL2.js +9 -0
  154. package/dist/wasm-NMWO3WXY.js +16 -0
  155. package/docs/EMBEDDINGS.md +132 -0
  156. package/docs/README.md +178 -0
  157. package/docs/data/m10-baseline.json +602 -0
  158. package/docs/data/m10-benchmark-baseline.json +57 -0
  159. package/docs/data/m10-benchmark-last-run.json +127 -0
  160. package/docs/data/m10-final-audit.json +215 -0
  161. package/docs/data/m12-final-audit.json +138 -0
  162. package/docs/data/m12-surface-matrix.json +50 -0
  163. package/docs/data/public-tools.json +1902 -0
  164. package/docs/indexing/DEAD-ASSETS.md +88 -0
  165. package/docs/indexing/INDEXER-REVIEW.md +634 -0
  166. package/docs/indexing/PERFORMANCE-FINDINGS.md +106 -0
  167. package/docs/indexing/README.md +427 -0
  168. package/docs/indexing/discovery-matrix.md +41 -0
  169. package/docs/indexing/embeddings.md +325 -0
  170. package/docs/indexing/environment-variables.md +77 -0
  171. package/docs/indexing/performance.md +323 -0
  172. package/docs/indexing/resume.md +345 -0
  173. package/docs/indexing/troubleshooting.md +391 -0
  174. package/docs/man/bb.1 +190 -0
  175. package/docs/tools/bb_analyze.md +147 -0
  176. package/docs/tools/bb_annotate.md +110 -0
  177. package/docs/tools/bb_annotations.md +106 -0
  178. package/docs/tools/bb_ask.md +101 -0
  179. package/docs/tools/bb_cross_language.md +103 -0
  180. package/docs/tools/bb_doc.md +169 -0
  181. package/docs/tools/bb_edit.md +185 -0
  182. package/docs/tools/bb_graph.md +169 -0
  183. package/docs/tools/bb_health.md +156 -0
  184. package/docs/tools/bb_impact.md +117 -0
  185. package/docs/tools/bb_index.md +108 -0
  186. package/docs/tools/bb_migrate.md +135 -0
  187. package/docs/tools/bb_patterns.md +140 -0
  188. package/docs/tools/bb_search.md +150 -0
  189. package/docs/tools/bb_security.md +100 -0
  190. package/docs/tools/bb_visualize.md +184 -0
  191. package/grammars/README.md +57 -0
  192. package/grammars/THIRD-PARTY-NOTICES.md +50 -0
  193. package/grammars/tree-sitter-c/LICENSE +21 -0
  194. package/grammars/tree-sitter-clojure/LICENSE.md +21 -0
  195. package/grammars/tree-sitter-cpp/LICENSE +21 -0
  196. package/grammars/tree-sitter-csharp/LICENSE +21 -0
  197. package/grammars/tree-sitter-css/LICENSE +21 -0
  198. package/grammars/tree-sitter-css/README.md +21 -0
  199. package/grammars/tree-sitter-dart/LICENSE +20 -0
  200. package/grammars/tree-sitter-dart-upstream/LICENSE +20 -0
  201. package/grammars/tree-sitter-dart-upstream/README.md +18 -0
  202. package/grammars/tree-sitter-elixir/LICENSE +176 -0
  203. package/grammars/tree-sitter-elixir/README.md +11 -0
  204. package/grammars/tree-sitter-fsharp/LICENSE +21 -0
  205. package/grammars/tree-sitter-fsharp/README.md +45 -0
  206. package/grammars/tree-sitter-graphql/LICENSE +21 -0
  207. package/grammars/tree-sitter-graphql/README.md +106 -0
  208. package/grammars/tree-sitter-groovy/LICENSE +21 -0
  209. package/grammars/tree-sitter-groovy/README.md +4 -0
  210. package/grammars/tree-sitter-haskell/LICENSE +21 -0
  211. package/grammars/tree-sitter-haskell/README.md +394 -0
  212. package/grammars/tree-sitter-hcl/CHANGELOG.md +102 -0
  213. package/grammars/tree-sitter-hcl/LICENSE +201 -0
  214. package/grammars/tree-sitter-hcl/README.md +39 -0
  215. package/grammars/tree-sitter-html/LICENSE +21 -0
  216. package/grammars/tree-sitter-html/README.md +21 -0
  217. package/grammars/tree-sitter-julia/LICENSE +21 -0
  218. package/grammars/tree-sitter-julia/README.md +24 -0
  219. package/grammars/tree-sitter-kotlin/LICENSE +9 -0
  220. package/grammars/tree-sitter-lua/LICENSE.md +21 -0
  221. package/grammars/tree-sitter-lua/README.md +29 -0
  222. package/grammars/tree-sitter-make/LICENSE +21 -0
  223. package/grammars/tree-sitter-matlab/LICENSE +19 -0
  224. package/grammars/tree-sitter-matlab/README.md +99 -0
  225. package/grammars/tree-sitter-nim/LICENSE +373 -0
  226. package/grammars/tree-sitter-nim/README.md +46 -0
  227. package/grammars/tree-sitter-objc/LICENSE +21 -0
  228. package/grammars/tree-sitter-objc/README.md +20 -0
  229. package/grammars/tree-sitter-perl/LICENSE +7 -0
  230. package/grammars/tree-sitter-perl/README.md +100 -0
  231. package/grammars/tree-sitter-powershell/LICENSE +21 -0
  232. package/grammars/tree-sitter-powershell/README.md +7 -0
  233. package/grammars/tree-sitter-proto/LICENSE +21 -0
  234. package/grammars/tree-sitter-proto/README.md +105 -0
  235. package/grammars/tree-sitter-r/LICENSE +9 -0
  236. package/grammars/tree-sitter-r/README.md +66 -0
  237. package/grammars/tree-sitter-ruby/LICENSE +22 -0
  238. package/grammars/tree-sitter-scss/LICENSE +21 -0
  239. package/grammars/tree-sitter-scss/README.md +17 -0
  240. package/grammars/tree-sitter-solidity/LICENSE +7 -0
  241. package/grammars/tree-sitter-sql/LICENSE +21 -0
  242. package/grammars/tree-sitter-typescript/LICENSE +21 -0
  243. package/grammars/tree-sitter-vba/LICENSE +21 -0
  244. package/grammars/tree-sitter-vba/README.md +738 -0
  245. package/grammars/tree-sitter-vbnet/LICENSE +21 -0
  246. package/grammars/tree-sitter-vbnet/README.md +322 -0
  247. package/grammars/tree-sitter-xml/LICENSE +19 -0
  248. package/grammars/tree-sitter-yaml/LICENSE +20 -0
  249. package/grammars/tree-sitter-yaml/README.md +21 -0
  250. package/package.json +184 -4
  251. package/wasm/dart.wasm +0 -0
  252. package/wasm/tree-sitter-bash.wasm +0 -0
  253. package/wasm/tree-sitter-c.wasm +0 -0
  254. package/wasm/tree-sitter-c_sharp.wasm +0 -0
  255. package/wasm/tree-sitter-clean.wasm +0 -0
  256. package/wasm/tree-sitter-clojure.wasm +0 -0
  257. package/wasm/tree-sitter-core_schema.wasm +0 -0
  258. package/wasm/tree-sitter-cpp.wasm +0 -0
  259. package/wasm/tree-sitter-css.wasm +0 -0
  260. package/wasm/tree-sitter-dart.wasm +0 -0
  261. package/wasm/tree-sitter-elisp.wasm +0 -0
  262. package/wasm/tree-sitter-elixir.wasm +0 -0
  263. package/wasm/tree-sitter-elm.wasm +0 -0
  264. package/wasm/tree-sitter-embedded_template.wasm +0 -0
  265. package/wasm/tree-sitter-erlang.wasm +0 -0
  266. package/wasm/tree-sitter-fsharp.wasm +0 -0
  267. package/wasm/tree-sitter-fsharp_signature.wasm +0 -0
  268. package/wasm/tree-sitter-go.wasm +0 -0
  269. package/wasm/tree-sitter-graphql.wasm +0 -0
  270. package/wasm/tree-sitter-groovy.wasm +0 -0
  271. package/wasm/tree-sitter-haskell.wasm +0 -0
  272. package/wasm/tree-sitter-hcl.wasm +0 -0
  273. package/wasm/tree-sitter-html.wasm +0 -0
  274. package/wasm/tree-sitter-java.wasm +0 -0
  275. package/wasm/tree-sitter-javascript.wasm +0 -0
  276. package/wasm/tree-sitter-json.wasm +0 -0
  277. package/wasm/tree-sitter-json_schema.wasm +0 -0
  278. package/wasm/tree-sitter-julia.wasm +0 -0
  279. package/wasm/tree-sitter-kotlin.wasm +0 -0
  280. package/wasm/tree-sitter-lua.wasm +0 -0
  281. package/wasm/tree-sitter-make.wasm +0 -0
  282. package/wasm/tree-sitter-markdown.wasm +0 -0
  283. package/wasm/tree-sitter-markdown_inline.wasm +0 -0
  284. package/wasm/tree-sitter-matlab.wasm +0 -0
  285. package/wasm/tree-sitter-nim.wasm +0 -0
  286. package/wasm/tree-sitter-objc.wasm +0 -0
  287. package/wasm/tree-sitter-ocaml.wasm +0 -0
  288. package/wasm/tree-sitter-perl.wasm +0 -0
  289. package/wasm/tree-sitter-php.wasm +0 -0
  290. package/wasm/tree-sitter-php_only.wasm +0 -0
  291. package/wasm/tree-sitter-powershell.wasm +0 -0
  292. package/wasm/tree-sitter-protobuf.wasm +0 -0
  293. package/wasm/tree-sitter-python.wasm +0 -0
  294. package/wasm/tree-sitter-ql.wasm +0 -0
  295. package/wasm/tree-sitter-r.wasm +0 -0
  296. package/wasm/tree-sitter-rescript.wasm +0 -0
  297. package/wasm/tree-sitter-ruby.wasm +0 -0
  298. package/wasm/tree-sitter-rust.wasm +0 -0
  299. package/wasm/tree-sitter-scala.wasm +0 -0
  300. package/wasm/tree-sitter-scss.wasm +0 -0
  301. package/wasm/tree-sitter-solidity.wasm +0 -0
  302. package/wasm/tree-sitter-sql.wasm +0 -0
  303. package/wasm/tree-sitter-svelte.wasm +0 -0
  304. package/wasm/tree-sitter-swift.wasm +0 -0
  305. package/wasm/tree-sitter-systemrdl.wasm +0 -0
  306. package/wasm/tree-sitter-terraform.wasm +0 -0
  307. package/wasm/tree-sitter-tlaplus.wasm +0 -0
  308. package/wasm/tree-sitter-toml.wasm +0 -0
  309. package/wasm/tree-sitter-tsx.wasm +0 -0
  310. package/wasm/tree-sitter-typescript.wasm +0 -0
  311. package/wasm/tree-sitter-vba.wasm +0 -0
  312. package/wasm/tree-sitter-vbnet.wasm +0 -0
  313. package/wasm/tree-sitter-vue.wasm +0 -0
  314. package/wasm/tree-sitter-xml.wasm +0 -0
  315. package/wasm/tree-sitter-yaml.wasm +0 -0
  316. package/wasm/tree-sitter-zig.wasm +0 -0
  317. package/wasm/tree-sitter.wasm +0 -0
  318. package/wasm/tsx.wasm +0 -0
  319. package/wasm/typescript.wasm +0 -0
@@ -0,0 +1,174 @@
1
+ import {
2
+ ParallelIndexerConfig,
3
+ parallelIndexerCliSkipPatterns
4
+ } from "./chunk-ZETTGPAW.js";
5
+
6
+ // src/ast/fingerprint.ts
7
+ import { createHash } from "crypto";
8
+ import { readFile, readdir, stat, open } from "fs/promises";
9
+ import path from "path";
10
+ function relativePathFingerprint(sortedRel) {
11
+ return createHash("sha1").update(Array.from(new Set(sortedRel)).sort().join("\n")).digest("hex").substring(0, 40);
12
+ }
13
+ async function gitIdentity(root) {
14
+ try {
15
+ const { execFile } = await import("child_process");
16
+ const run = (args) => new Promise((resolve) => {
17
+ execFile("git", ["-C", root, ...args], { timeout: 4e3 }, (err, stdout) => {
18
+ resolve(err ? "" : stdout.toString().trim());
19
+ });
20
+ });
21
+ const remote = await run(["remote", "get-url", "origin"]);
22
+ const head = await run(["rev-parse", "HEAD"]);
23
+ if (!remote && !head) return null;
24
+ return `${remote || "(no-remote)"}|${head || "(no-head)"}`;
25
+ } catch {
26
+ return null;
27
+ }
28
+ }
29
+ var FULL_AST_LIMIT = 1 * 1024 * 1024;
30
+ var STRUCTURAL_LIMIT = 5 * 1024 * 1024;
31
+ var skipDirNames = /* @__PURE__ */ new Set([".git", ".svn", ".hg", ".cache", ".nyc_output", ".venv", ".next", ".nuxt", ".svelte-kit", ".turbo"]);
32
+ var compiledDirTokens = ["/perf/", "/Microbenchmarks/", "/wwwroot/", "/coverage/", "/node_modules/", "/dist/", "/build/", "/.git/", "/obj/", "/bin/", "/testData/"];
33
+ var cliSkipPatterns = Array.from(
34
+ /* @__PURE__ */ new Set([...ParallelIndexerConfig.skipPatterns, ...parallelIndexerCliSkipPatterns()])
35
+ );
36
+ async function loadIgnores(root, ownPath, parentIg) {
37
+ try {
38
+ const ignore = (await import("ignore")).default;
39
+ const ig = ignore({ ignorecase: false }).add(parentIg);
40
+ const entries = await readdir(ownPath, { withFileTypes: true });
41
+ for (const name of [".gitignore", ".bbignore"]) {
42
+ const f = entries.find((e) => e.isFile() && e.name === name);
43
+ if (!f) continue;
44
+ try {
45
+ const content = await readFile(path.join(ownPath, f.name), "utf8");
46
+ ig.add(content);
47
+ } catch {
48
+ }
49
+ }
50
+ return ig;
51
+ } catch {
52
+ return parentIg;
53
+ }
54
+ }
55
+ var DEFAULT_IGNORE_PATTERNS = [
56
+ "**/perf/**",
57
+ "**/Microbenchmarks/**",
58
+ "**/wwwroot/**",
59
+ "**/testassets/**",
60
+ "**/benchmarkapps/**",
61
+ "**/coverage/**",
62
+ "**/testData/**"
63
+ ];
64
+ async function readShebang(p) {
65
+ try {
66
+ const fh = await open(p, "r");
67
+ try {
68
+ const buf = Buffer.alloc(256);
69
+ const { bytesRead } = await fh.read(buf, 0, 256, 0);
70
+ return buf.subarray(0, bytesRead).toString("utf8");
71
+ } finally {
72
+ await fh.close();
73
+ }
74
+ } catch {
75
+ return "";
76
+ }
77
+ }
78
+ async function walk(root, dir, ig, depth, rel) {
79
+ if (depth > 50) return;
80
+ let entries = [];
81
+ try {
82
+ entries = await readdir(dir, { withFileTypes: true });
83
+ } catch {
84
+ return;
85
+ }
86
+ if (dir !== root && entries.some((e) => e.isDirectory() && e.name === ".git")) return;
87
+ const localIg = await loadIgnores(root, dir, ig);
88
+ const { detectLanguageFromPath } = await import("./language-detection-DFCAU5DZ.js");
89
+ const jobs = [];
90
+ for (const entry of entries) {
91
+ if (entry.isDirectory() && skipDirNames.has(entry.name)) continue;
92
+ const fullPath = path.join(dir, entry.name);
93
+ const relativePath = path.relative(root, fullPath);
94
+ const withSlash = relativePath + (entry.isDirectory() ? "/" : "");
95
+ const normPath = "/" + relativePath + (entry.isDirectory() ? "/" : "");
96
+ if (compiledDirTokens.some((t) => normPath.includes(t))) continue;
97
+ if (localIg.ignores(withSlash)) continue;
98
+ if (entry.isDirectory()) {
99
+ jobs.push(walk(root, fullPath, localIg, depth + 1, rel));
100
+ continue;
101
+ }
102
+ if (!entry.isFile()) continue;
103
+ const baseName = entry.name;
104
+ const hasExt = baseName.lastIndexOf(".") > 0;
105
+ let detected = null;
106
+ if (hasExt) {
107
+ detected = detectLanguageFromPath(fullPath);
108
+ } else {
109
+ detected = detectLanguageFromPath(fullPath);
110
+ if (!detected) detected = detectLanguageFromPath(fullPath, await readShebang(fullPath));
111
+ }
112
+ if (!detected) continue;
113
+ if (cliSkipPatterns.some((p) => p.test(normPath))) continue;
114
+ jobs.push(
115
+ (async () => {
116
+ try {
117
+ const s = await stat(fullPath);
118
+ if (s.size > STRUCTURAL_LIMIT) return;
119
+ rel.push(relativePath);
120
+ } catch {
121
+ }
122
+ })()
123
+ );
124
+ }
125
+ await Promise.all(jobs);
126
+ }
127
+ async function computeCheckoutFingerprint(root) {
128
+ const { default: ignore } = await import("ignore");
129
+ const ig = ignore({ ignorecase: false }).add(DEFAULT_IGNORE_PATTERNS);
130
+ const rel = [];
131
+ await walk(root, root, ig, 0, rel);
132
+ const sorted = Array.from(new Set(rel)).sort();
133
+ const git = await gitIdentity(root);
134
+ const fingerprint = createHash("sha1").update(sorted.join("\n")).update(git ?? "").digest("hex").substring(0, 40);
135
+ return { fingerprint, fileCount: sorted.length, git };
136
+ }
137
+ function computeDbFingerprint(raw, git) {
138
+ const rows = raw.prepare("SELECT relative_path FROM brain_file").all();
139
+ const sorted = rows.map((r) => String(r.relative_path)).sort();
140
+ return createHash("sha1").update(sorted.join("\n")).update(git ?? "").digest("hex").substring(0, 40);
141
+ }
142
+ function readStoredFingerprint(raw, projectId) {
143
+ try {
144
+ const row = raw.prepare(
145
+ "SELECT codebase_fingerprint FROM brain_index_status WHERE project_id = ?"
146
+ ).get(projectId);
147
+ return row?.codebase_fingerprint ?? void 0;
148
+ } catch {
149
+ return void 0;
150
+ }
151
+ }
152
+ async function persistProjectFingerprint(projectId, projectPath) {
153
+ try {
154
+ const cf = await computeCheckoutFingerprint(projectPath);
155
+ const { BrainDatabase } = await import("./database-76RP44JG.js");
156
+ const raw = await BrainDatabase.getRawInstance(projectId);
157
+ raw.prepare(
158
+ `UPDATE brain_index_status SET codebase_fingerprint = ?, codebase_git = ?, time_updated = strftime('%s','now')*1000
159
+ WHERE project_id = ?`
160
+ ).run(cf.fingerprint, cf.git ?? null, projectId);
161
+ return cf.fingerprint;
162
+ } catch {
163
+ return "";
164
+ }
165
+ }
166
+
167
+ export {
168
+ relativePathFingerprint,
169
+ gitIdentity,
170
+ computeCheckoutFingerprint,
171
+ computeDbFingerprint,
172
+ readStoredFingerprint,
173
+ persistProjectFingerprint
174
+ };
@@ -0,0 +1,236 @@
1
+ import {
2
+ readSymbolSnippet
3
+ } from "./chunk-3CTFIJJB.js";
4
+ import {
5
+ checkResultsFreshness
6
+ } from "./chunk-QLK6ED4Q.js";
7
+ import {
8
+ BrainDatabase
9
+ } from "./chunk-QKTRECYS.js";
10
+ import {
11
+ analysis_exclusions_exports
12
+ } from "./chunk-SM7RFQRO.js";
13
+
14
+ // src/intelligence/search/symbol-search.ts
15
+ var DEFAULT_PAGE_SIZE = 100;
16
+ function normalizePageSize(value) {
17
+ if (value === void 0 || value === null) return DEFAULT_PAGE_SIZE;
18
+ const n = Math.trunc(Number(value));
19
+ if (!Number.isFinite(n) || n < 0) return DEFAULT_PAGE_SIZE;
20
+ return n;
21
+ }
22
+ function normalizeOffset(value) {
23
+ if (value === void 0 || value === null) return 0;
24
+ const n = Math.trunc(Number(value));
25
+ if (!Number.isFinite(n) || n < 0) return 0;
26
+ return n;
27
+ }
28
+ var LIKE_ESCAPE_CHAR = "\\";
29
+ function escapeLike(fragment) {
30
+ return fragment.split(LIKE_ESCAPE_CHAR).join(LIKE_ESCAPE_CHAR + LIKE_ESCAPE_CHAR).split("%").join(LIKE_ESCAPE_CHAR + "%").split("_").join(LIKE_ESCAPE_CHAR + "_");
31
+ }
32
+ var LIKE_ESCAPE_CLAUSE = ` ESCAPE '${LIKE_ESCAPE_CHAR}'`;
33
+ var NON_ASCII = /[^\x00-\x7F]/;
34
+ function longestAsciiPrefix(value) {
35
+ let i = 0;
36
+ while (i < value.length && value.charCodeAt(i) < 128) i++;
37
+ return value.slice(0, i);
38
+ }
39
+ function isNoiseCandidate(row) {
40
+ return analysis_exclusions_exports.isHardNoisePath(row.relativePath) || analysis_exclusions_exports.isNoiseSymbolName(row.name);
41
+ }
42
+ async function searchSymbols(projectId, rawQuery, options = {}) {
43
+ const raw = await BrainDatabase.getRawInstance(projectId, { readonly: true });
44
+ if (options.mode === "content") {
45
+ const { searchContent } = await import("./content-search-7XIP555Q.js");
46
+ return searchContent(projectId, rawQuery, options);
47
+ }
48
+ if (options.mode === "regex" || options.regex) {
49
+ const { searchRegex } = await import("./regex-search-NJKHMZNO.js");
50
+ return searchRegex(projectId, rawQuery, options);
51
+ }
52
+ const query = String(rawQuery ?? "").trim();
53
+ const maxResults = normalizePageSize(options.maxResults);
54
+ const offset = normalizeOffset(options.offset);
55
+ if (!query) return emptyResult("symbol");
56
+ const caseSensitive = options.caseSensitive === true;
57
+ const unicodeQuery = NON_ASCII.test(query);
58
+ const phases = buildPhases(query, options.exact === true, caseSensitive, unicodeQuery);
59
+ const budget = offset + maxResults;
60
+ const fetchCap = Math.min(FETCH_CAP_MAX, Math.max(MIN_FETCH_CAP, budget * 4));
61
+ const idCap = Math.min(ID_CAP_MAX, Math.max(MIN_ID_CAP, budget * 4));
62
+ const candidates = [];
63
+ const seen = /* @__PURE__ */ new Set();
64
+ const truncationReasons = /* @__PURE__ */ new Set();
65
+ for (const phase of phases) {
66
+ const rows = await runPhase(raw, projectId, phase, { fetchCap, idCap, options, query, caseSensitive });
67
+ if (rows.truncated) truncationReasons.add(`candidate-cap:${phase.relevance}`);
68
+ for (const row of rows.rows) {
69
+ if (seen.has(row.id)) continue;
70
+ seen.add(row.id);
71
+ candidates.push({ ...row, phaseRelevance: phase.relevance });
72
+ }
73
+ }
74
+ const beforeNoise = candidates.length;
75
+ const kept = candidates.filter((row) => !isNoiseCandidate(row));
76
+ if (beforeNoise !== kept.length) truncationReasons.add("noise-filter");
77
+ const folded = unicodeQuery ? query.toLowerCase() : query;
78
+ const score = (name) => name.toLowerCase() === folded ? 3 : name.toLowerCase().startsWith(folded) ? 2 : 1;
79
+ kept.sort((a, b) => {
80
+ return score(b.name) - score(a.name) || (analysis_exclusions_exports.isTestPath(a.relativePath) ? 1 : 0) - (analysis_exclusions_exports.isTestPath(b.relativePath) ? 1 : 0) || b.complexity - a.complexity || compareCodeUnits(a.relativePath, b.relativePath) || compareCodeUnits(a.name, b.name);
81
+ });
82
+ const page = kept.slice(offset, offset + maxResults);
83
+ const results = emptyResult("symbol");
84
+ for (const row of page) {
85
+ results.push({
86
+ file: row.relativePath,
87
+ fileId: row.fileId,
88
+ line: row.line,
89
+ column: 0,
90
+ context: `${row.symbolType}: ${row.name}`,
91
+ symbolName: row.name,
92
+ symbolType: row.symbolType,
93
+ language: row.language,
94
+ matchType: "symbol",
95
+ snippet: options.includeContent ? await readSymbolSnippet(row.filePath, row.line, row.lineEnd) || row.name : row.name,
96
+ complexity: row.complexity,
97
+ _relevance: score(row.name)
98
+ });
99
+ }
100
+ results.totalMatches = kept.length;
101
+ results.truncated = truncationReasons.size > 0;
102
+ if (truncationReasons.size > 0) results.truncationReason = [...truncationReasons].sort().join(",");
103
+ applyFreshness(raw, results);
104
+ return results;
105
+ }
106
+ function emptyResult(mode) {
107
+ const results = [];
108
+ results.searchMode = mode;
109
+ results.staleCount = 0;
110
+ results.freshCount = 0;
111
+ results.totalMatches = 0;
112
+ return results;
113
+ }
114
+ function compareCodeUnits(a, b) {
115
+ return a < b ? -1 : a > b ? 1 : 0;
116
+ }
117
+ function buildPhases(query, exact, caseSensitive, unicodeQuery) {
118
+ if (unicodeQuery) {
119
+ const asciiPrefix = longestAsciiPrefix(query);
120
+ const narrow = asciiPrefix.length >= 2;
121
+ if (exact) {
122
+ return narrow ? [{ clause: "s.name LIKE ? ESCAPE '\\'", relevance: 3, value: escapeLike(asciiPrefix) + "%", substring: false, fold: "equal" }] : [{ clause: "LENGTH(s.name) = LENGTH(?)", relevance: 3, value: query, substring: false, fold: "equal" }];
123
+ }
124
+ if (narrow) {
125
+ return [
126
+ { clause: "s.name LIKE ? ESCAPE '\\'", relevance: 3, value: escapeLike(asciiPrefix) + "%", substring: false, fold: "equal" },
127
+ { clause: "s.name LIKE ? ESCAPE '\\'", relevance: 2, value: escapeLike(asciiPrefix) + "%", substring: false, fold: "prefix" },
128
+ { clause: "1 = 1", relevance: 1, value: "", substring: true, fold: "substring" }
129
+ ];
130
+ }
131
+ return [
132
+ { clause: "LENGTH(s.name) = LENGTH(?)", relevance: 3, value: query, substring: true, fold: "equal" },
133
+ { clause: "LENGTH(s.name) >= LENGTH(?)", relevance: 2, value: query, substring: true, fold: "prefix" },
134
+ { clause: "LENGTH(s.name) >= LENGTH(?)", relevance: 1, value: query, substring: true, fold: "substring" }
135
+ ];
136
+ }
137
+ if (exact) {
138
+ return [{ clause: caseSensitive ? "s.name = ?" : "s.name = ? COLLATE NOCASE", relevance: 3, value: query, substring: false }];
139
+ }
140
+ if (caseSensitive) {
141
+ return [
142
+ { clause: "s.name = ?", relevance: 3, value: query, substring: false },
143
+ // Indexed range scan, not instr(): `instr(name, ?)` is a full table scan
144
+ // for every query (EXPLAIN QUERY PLAN: `SCAN brain_symbol`).
145
+ { clause: "s.name LIKE ? ESCAPE '\\'", relevance: 2, value: escapeLike(query) + "%", substring: false },
146
+ { clause: "s.name LIKE ? ESCAPE '\\'", relevance: 1, value: "%" + escapeLike(query) + "%", substring: true }
147
+ ];
148
+ }
149
+ return [
150
+ { clause: "s.name = ? COLLATE NOCASE", relevance: 3, value: query, substring: false },
151
+ { clause: "s.name LIKE ? COLLATE NOCASE ESCAPE '\\'", relevance: 2, value: escapeLike(query) + "%", substring: false },
152
+ { clause: "s.name LIKE ? COLLATE NOCASE ESCAPE '\\'", relevance: 1, value: "%" + escapeLike(query) + "%", substring: true }
153
+ ];
154
+ }
155
+ function symbolSearchPhases(query, exact, caseSensitive) {
156
+ return buildPhases(query, exact, caseSensitive, NON_ASCII.test(query));
157
+ }
158
+ var MIN_FETCH_CAP = 2e4;
159
+ var FETCH_CAP_MAX = 2e5;
160
+ var MIN_ID_CAP = 2e4;
161
+ var ID_CAP_MAX = 2e5;
162
+ var ID_JOIN_CHUNK = 500;
163
+ async function runPhase(raw, projectId, phase, ctx) {
164
+ const { filters, params } = filterSql(ctx.options);
165
+ const base = `${SELECT_COLUMNS} FROM brain_symbol s JOIN brain_file f ON f.id = s.file_id
166
+ WHERE s.project_id = ? AND COALESCE(s.line_start, 0) > 0 AND s.name NOT LIKE '/%/%'${filters}`;
167
+ if (phase.fold) {
168
+ const rows2 = raw.prepare(`${base} AND ${phase.clause} LIMIT ?`).all(projectId, ...params, phase.value, ctx.fetchCap);
169
+ return { rows: filterFolded(rows2, phase, ctx.query), truncated: rows2.length >= ctx.fetchCap };
170
+ }
171
+ if (!phase.substring) {
172
+ const rows2 = raw.prepare(`${base} AND ${phase.clause} LIMIT ?`).all(projectId, ...params, phase.value, ctx.fetchCap);
173
+ return { rows: rows2, truncated: rows2.length >= ctx.fetchCap };
174
+ }
175
+ const { filters: idFilters, params: idFilterParams } = filterSql(ctx.options, "s", "f");
176
+ const idRows = raw.prepare(
177
+ `SELECT s.id FROM brain_symbol s JOIN brain_file f ON f.id = s.file_id
178
+ WHERE s.project_id = ? AND COALESCE(s.line_start, 0) > 0 AND s.name NOT LIKE '/%/%'${idFilters} AND ${phase.clause} LIMIT ?`
179
+ ).all(projectId, ...idFilterParams, phase.value, ctx.idCap);
180
+ if (idRows.length === 0) return { rows: [], truncated: false };
181
+ const distinct = [...new Set(idRows.map((row) => row.id))];
182
+ const rows = [];
183
+ for (let start = 0; start < distinct.length; start += ID_JOIN_CHUNK) {
184
+ const chunk = distinct.slice(start, start + ID_JOIN_CHUNK);
185
+ const placeholders = chunk.map(() => "?").join(",");
186
+ const page = raw.prepare(`${SELECT_COLUMNS} FROM brain_symbol s JOIN brain_file f ON f.id = s.file_id WHERE s.id IN (${placeholders})${filters}`).all(...chunk, ...params);
187
+ rows.push(...page);
188
+ }
189
+ return { rows, truncated: idRows.length >= ctx.idCap };
190
+ }
191
+ var SELECT_COLUMNS = `SELECT s.id, s.file_id AS fileId, s.name, s.symbol_type AS symbolType,
192
+ COALESCE(s.line_start, 0) AS line, COALESCE(s.line_end, 0) AS lineEnd, COALESCE(s.complexity, 0) AS complexity,
193
+ f.relative_path AS relativePath, f.path AS filePath, COALESCE(f.language, 'unknown') AS language`;
194
+ function filterSql(options, symbolAlias = "s", fileAlias = "f") {
195
+ let filters = "";
196
+ const params = [];
197
+ if (options.languages?.length) {
198
+ filters += ` AND ${fileAlias}.language COLLATE NOCASE IN (${options.languages.map(() => "?").join(",")})`;
199
+ params.push(...options.languages);
200
+ }
201
+ if (options.symbolKind) {
202
+ filters += ` AND ${symbolAlias}.symbol_type COLLATE NOCASE = ?`;
203
+ params.push(options.symbolKind);
204
+ }
205
+ return { filters, params };
206
+ }
207
+ function filterFolded(rows, phase, query) {
208
+ const needle = query.toLowerCase();
209
+ return rows.filter((row) => {
210
+ const name = row.name.toLowerCase();
211
+ if (phase.fold === "equal") return name === needle;
212
+ if (phase.fold === "prefix") return name.startsWith(needle);
213
+ return name.includes(needle);
214
+ });
215
+ }
216
+ function applyFreshness(raw, results) {
217
+ try {
218
+ const freshness = checkResultsFreshness(raw, results.map((result) => ({ fileId: result.fileId })));
219
+ let staleCount = 0;
220
+ for (const result of results) {
221
+ if (["stale", "missing"].includes(freshness.get(result.fileId) ?? "")) {
222
+ result.stale = true;
223
+ staleCount++;
224
+ }
225
+ }
226
+ results.staleCount = staleCount;
227
+ results.freshCount = results.length - staleCount;
228
+ } catch {
229
+ results.freshnessError = true;
230
+ }
231
+ }
232
+
233
+ export {
234
+ searchSymbols,
235
+ symbolSearchPhases
236
+ };