@backbencher/brain 0.0.0-stage → 0.1.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 (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-KY7K552E.js +17 -0
  8. package/dist/brain-relationship-enrichment-QH7OOHUF.js +558 -0
  9. package/dist/brain.sql-EIM4WS4D.js +29 -0
  10. package/dist/chunk-2BSKD7O3.js +40 -0
  11. package/dist/chunk-2DE27DVC.js +1314 -0
  12. package/dist/chunk-2RRBMNBQ.js +322 -0
  13. package/dist/chunk-2RTN2DFU.js +711 -0
  14. package/dist/chunk-2WXYNLBA.js +29 -0
  15. package/dist/chunk-3CTFIJJB.js +17 -0
  16. package/dist/chunk-3LFTSMIV.js +174 -0
  17. package/dist/chunk-47HKX4AJ.js +930 -0
  18. package/dist/chunk-4H22TLOT.js +543 -0
  19. package/dist/chunk-5SD45FLC.js +818 -0
  20. package/dist/chunk-66A5ZFYA.js +1758 -0
  21. package/dist/chunk-6AIRWAO2.js +247 -0
  22. package/dist/chunk-6WNGD3NN.js +196 -0
  23. package/dist/chunk-7AN7U5IZ.js +371 -0
  24. package/dist/chunk-BHB7BYYI.js +626 -0
  25. package/dist/chunk-BQ3OVQ3P.js +125 -0
  26. package/dist/chunk-CW4XXSNN.js +1479 -0
  27. package/dist/chunk-D2Q4Y47A.js +53 -0
  28. package/dist/chunk-DIYAGQJL.js +34 -0
  29. package/dist/chunk-DYM4FQEE.js +90 -0
  30. package/dist/chunk-EWMWK7WN.js +75 -0
  31. package/dist/chunk-FVVQTSIM.js +3427 -0
  32. package/dist/chunk-FWSL4VG6.js +1290 -0
  33. package/dist/chunk-GBI7V7KY.js +69 -0
  34. package/dist/chunk-GEFFO6O2.js +152 -0
  35. package/dist/chunk-HOWAQXJO.js +236 -0
  36. package/dist/chunk-HQSPJDHI.js +613 -0
  37. package/dist/chunk-IFZNR5UJ.js +2863 -0
  38. package/dist/chunk-J4PMBXQQ.js +336 -0
  39. package/dist/chunk-KAET47ZL.js +125 -0
  40. package/dist/chunk-KCDECRJY.js +440 -0
  41. package/dist/chunk-KLK3PBTO.js +1119 -0
  42. package/dist/chunk-L5TDYKYK.js +76 -0
  43. package/dist/chunk-MLKGABMK.js +9 -0
  44. package/dist/chunk-OWISBAOF.js +61 -0
  45. package/dist/chunk-PJTNGD3Z.js +6924 -0
  46. package/dist/chunk-QLK6ED4Q.js +235 -0
  47. package/dist/chunk-R2GW4F6R.js +19 -0
  48. package/dist/chunk-RCMTFSEF.js +87 -0
  49. package/dist/chunk-RH7KC5HU.js +12050 -0
  50. package/dist/chunk-RM3PY6TG.js +376 -0
  51. package/dist/chunk-ROMM6KMC.js +433 -0
  52. package/dist/chunk-SK6YVHFZ.js +211 -0
  53. package/dist/chunk-SM7RFQRO.js +214 -0
  54. package/dist/chunk-UFE77L67.js +782 -0
  55. package/dist/chunk-UGR4QIGS.js +67 -0
  56. package/dist/chunk-UUNHHX4M.js +13 -0
  57. package/dist/chunk-V44PGPA6.js +2104 -0
  58. package/dist/chunk-VL52PL2T.js +71 -0
  59. package/dist/chunk-VURYFIHW.js +201 -0
  60. package/dist/chunk-XJKJYIPP.js +7436 -0
  61. package/dist/chunk-YI6FF2ZR.js +340 -0
  62. package/dist/cli/index.js +37 -0
  63. package/dist/config-HZAAYDP3.js +10 -0
  64. package/dist/content-search-642F7E5V.js +593 -0
  65. package/dist/database-TCTZDLE5.js +9 -0
  66. package/dist/doctor-GXCKSJOX.js +395 -0
  67. package/dist/edit-engine-KM7MPFEC.js +51 -0
  68. package/dist/engine-42TZFNIZ.js +11 -0
  69. package/dist/engine-LO6L4JLQ.js +18 -0
  70. package/dist/fingerprint-XDXFRWO6.js +33 -0
  71. package/dist/framework-intelligence-DWFCKV44.js +860 -0
  72. package/dist/freshness-3K6VU5OT.js +174 -0
  73. package/dist/graph-engine-PL5YA7BA.js +21 -0
  74. package/dist/graph_request-MM4REP6H.js +350 -0
  75. package/dist/impact_request-WDE47IZ5.js +68 -0
  76. package/dist/index-space-IUUN5WYV.js +15 -0
  77. package/dist/index-status-6BD7UBHR.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-4PW3AFXP.js +88 -0
  86. package/dist/pool-worker.js +1153 -0
  87. package/dist/project-health-ZS5TS2Z6.js +94 -0
  88. package/dist/project-index-5SDPHITE.js +57 -0
  89. package/dist/project-registry-DGZBIZS7.js +355 -0
  90. package/dist/real-bash-analyzer-SXSV67E2.js +2201 -0
  91. package/dist/real-c-analyzer-SY7FTZ6W.js +5942 -0
  92. package/dist/real-clean-analyzer-IGDHHLZK.js +3470 -0
  93. package/dist/real-clojure-analyzer-4OH7IWLB.js +2818 -0
  94. package/dist/real-cpp-analyzer-7LTDRJRJ.js +4101 -0
  95. package/dist/real-csharp-analyzer-KICU3TLH.js +3298 -0
  96. package/dist/real-css-analyzer-HPU277Q6.js +15 -0
  97. package/dist/real-dart-analyzer-7LZ5LCMW.js +3944 -0
  98. package/dist/real-elixir-analyzer-BE3MEVZO.js +2192 -0
  99. package/dist/real-erlang-analyzer-BZMAKYBK.js +1731 -0
  100. package/dist/real-fsharp-analyzer-5QLTOV3E.js +2390 -0
  101. package/dist/real-go-analyzer-POD7MZQR.js +4126 -0
  102. package/dist/real-graphql-analyzer-MAQRZ6QW.js +1442 -0
  103. package/dist/real-groovy-analyzer-MEWSUPMJ.js +2285 -0
  104. package/dist/real-haskell-analyzer-I5L2GR3Y.js +2533 -0
  105. package/dist/real-hcl-analyzer-DBOPXSWJ.js +725 -0
  106. package/dist/real-html-analyzer-O63XZLZD.js +1759 -0
  107. package/dist/real-java-analyzer-CHCW3EKA.js +4677 -0
  108. package/dist/real-javascript-analyzer-QAAJQYZE.js +14 -0
  109. package/dist/real-json-analyzer-UGBR7YQN.js +1640 -0
  110. package/dist/real-julia-analyzer-35Q4GHOZ.js +2085 -0
  111. package/dist/real-kotlin-analyzer-GRAYCWW2.js +3956 -0
  112. package/dist/real-lua-analyzer-5BAPDZDF.js +1957 -0
  113. package/dist/real-makefile-analyzer-YJKAHNAS.js +920 -0
  114. package/dist/real-markdown-analyzer-UKUQZO4F.js +1215 -0
  115. package/dist/real-matlab-analyzer-FVIKQZKG.js +480 -0
  116. package/dist/real-nim-analyzer-M7FAIABG.js +3603 -0
  117. package/dist/real-objective-c-analyzer-XMYQIGQI.js +1518 -0
  118. package/dist/real-perl-analyzer-ZLY6M2DZ.js +1865 -0
  119. package/dist/real-php-analyzer-KI2ZAM7X.js +9368 -0
  120. package/dist/real-powershell-analyzer-B3T5ZP6U.js +2915 -0
  121. package/dist/real-protobuf-analyzer-23OZ75XV.js +867 -0
  122. package/dist/real-python-analyzer-I4TIUB6D.js +4880 -0
  123. package/dist/real-r-analyzer-FJZJXXS6.js +2596 -0
  124. package/dist/real-ruby-analyzer-M3UFIVTQ.js +2429 -0
  125. package/dist/real-rust-analyzer-LVSONPAN.js +3359 -0
  126. package/dist/real-scala-analyzer-CWPI33Q2.js +3293 -0
  127. package/dist/real-scss-analyzer-TGRJQ7TH.js +1515 -0
  128. package/dist/real-solidity-analyzer-4P2VBVWA.js +2608 -0
  129. package/dist/real-sql-analyzer-J7DYZOZR.js +3840 -0
  130. package/dist/real-svelte-analyzer-NHEN2SX5.js +2532 -0
  131. package/dist/real-swift-analyzer-2NSYULWI.js +2311 -0
  132. package/dist/real-toml-analyzer-L3C66L7Q.js +929 -0
  133. package/dist/real-typescript-analyzer-FTC6ETRQ.js +14 -0
  134. package/dist/real-vb-analyzer-ORY7LAQS.js +3145 -0
  135. package/dist/real-vba-analyzer-JH2TTUFI.js +466 -0
  136. package/dist/real-vue-analyzer-OO4FUGBV.js +2680 -0
  137. package/dist/real-xml-analyzer-6CQVR477.js +2405 -0
  138. package/dist/real-yaml-analyzer-J6MQG3YX.js +3528 -0
  139. package/dist/real-zig-analyzer-EFKCPJNU.js +2430 -0
  140. package/dist/regex-search-OPTLKUN5.js +239 -0
  141. package/dist/rules-I453JTRC.js +152 -0
  142. package/dist/scoped-path-MJYWJZQX.js +11 -0
  143. package/dist/setup-show-Y5GB5KXA.js +15 -0
  144. package/dist/setup-wizard-G5YYR5T6.js +24 -0
  145. package/dist/symbol-search-KB4MU4SI.js +16 -0
  146. package/dist/taint-YOTN5X55.js +202 -0
  147. package/dist/taint-analyzer-N7YLZU3N.js +163 -0
  148. package/dist/tool-handlers-G4NAGJIH.js +72 -0
  149. package/dist/tool-registry-BPEJNSZG.js +17 -0
  150. package/dist/tool-validation-RF675A3C.js +32 -0
  151. package/dist/type-inference-4Y7WTMFE.js +13 -0
  152. package/dist/vector-binary-LMY4QGAN.js +19 -0
  153. package/dist/version-LXGNFO37.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,395 @@
1
+ import {
2
+ describeEmbeddingConfig,
3
+ embedding_diagnosis_exports
4
+ } from "./chunk-J4PMBXQQ.js";
5
+ import "./chunk-2RRBMNBQ.js";
6
+ import {
7
+ diagnosePoolStartupSync,
8
+ findPackageRoot
9
+ } from "./chunk-4H22TLOT.js";
10
+ import {
11
+ SemanticEngine,
12
+ isEmbeddingDisabled
13
+ } from "./chunk-5SD45FLC.js";
14
+ import "./chunk-7AN7U5IZ.js";
15
+ import "./chunk-UGR4QIGS.js";
16
+ import "./chunk-BQ3OVQ3P.js";
17
+ import {
18
+ bbDataDir
19
+ } from "./chunk-2BSKD7O3.js";
20
+ import "./chunk-MLKGABMK.js";
21
+
22
+ // src/setup/doctor.ts
23
+ import { existsSync, readFileSync, statSync, chmodSync } from "fs";
24
+ import { createRequire } from "module";
25
+ import path from "path";
26
+ var ROOT_PKG = findPackageRoot(import.meta.dirname ?? ".") ?? path.resolve(import.meta.dirname ?? ".", "../..");
27
+ function poolModuleDir() {
28
+ const dist = path.join(ROOT_PKG, "dist");
29
+ return existsSync(path.join(dist, "pool-worker.js")) ? dist : path.join(ROOT_PKG, "src", "ast");
30
+ }
31
+ var poolCache = null;
32
+ function runPoolDoctor(moduleDir, probe) {
33
+ const key = `${moduleDir}|${process.env.BB_POOL_WORKER ?? ""}|${probe === false ? "noprobe" : "probe"}`;
34
+ if (poolCache && poolCache.key === key) return poolCache.report;
35
+ const report = diagnosePoolStartupSync({ moduleDir, probe });
36
+ poolCache = { key, report };
37
+ return report;
38
+ }
39
+ function resetPoolDoctorCache() {
40
+ poolCache = null;
41
+ }
42
+ function openProjectDbReadonly(dbPath) {
43
+ const require2 = createRequire(path.join(ROOT_PKG, "package.json"));
44
+ if (typeof globalThis.Bun !== "undefined") {
45
+ const { Database: Database2 } = require2("bun:sqlite");
46
+ return new Database2(dbPath, { readonly: true });
47
+ }
48
+ const Database = require2("better-sqlite3");
49
+ return new Database(dbPath, { readonly: true, fileMustExist: true });
50
+ }
51
+ function readStoredModels(projectId, dataDir) {
52
+ const dbPath = path.join(dataDir, "projects", projectId, "brain.db");
53
+ if (!existsSync(dbPath)) return { models: [], unreadable: null };
54
+ try {
55
+ const db = openProjectDbReadonly(dbPath);
56
+ try {
57
+ const rows = db.prepare(
58
+ `SELECT embedding_model AS model, COUNT(*) AS count FROM brain_semantic_embedding WHERE project_id = ? GROUP BY embedding_model`
59
+ ).all(projectId);
60
+ return { models: rows.map((r) => ({ model: String(r.model), count: Number(r.count) })), unreadable: null };
61
+ } finally {
62
+ db.close();
63
+ }
64
+ } catch (e) {
65
+ const message = String(e?.message ?? e);
66
+ if (message.includes("no such table")) return { models: [], unreadable: null };
67
+ return { models: [], unreadable: message.slice(0, 200) };
68
+ }
69
+ }
70
+ function tierIssues(t) {
71
+ const missing = [];
72
+ if (t.present && !t.complete) {
73
+ const reason = t.incompleteReason ?? "";
74
+ if (reason.includes("base URL")) missing.push("base URL");
75
+ if (reason.includes("model")) missing.push("model");
76
+ if (!t.keyFingerprint) missing.push("API key");
77
+ }
78
+ const modeWrong = t.fileMode !== void 0 && t.fileMode !== 384;
79
+ return { missing, modeWrong };
80
+ }
81
+ function runDoctorChecks(opts) {
82
+ const cwd = opts.cwd ?? process.cwd();
83
+ const env = opts.env ?? process.env;
84
+ const dataDir = opts.dataDir ?? bbDataDir();
85
+ const state = describeEmbeddingConfig(cwd, env, dataDir);
86
+ const findings = [];
87
+ const embeddingChain = [];
88
+ const localLabel = SemanticEngine.LOCAL_MODEL_LABEL;
89
+ if (!state.configured) {
90
+ const skipped = state.tiers.some((t) => t.skippedMarker);
91
+ findings.push({
92
+ id: "no-config",
93
+ severity: "fail",
94
+ message: skipped ? "No embedding configuration (the wizard was skipped earlier)." : "No embedding configuration.",
95
+ fix: "bb setup"
96
+ });
97
+ }
98
+ for (const t of state.tiers) {
99
+ const { missing, modeWrong } = tierIssues(t);
100
+ if (missing.length > 0) {
101
+ findings.push({
102
+ id: `incomplete-${t.tier}`,
103
+ severity: "fail",
104
+ message: `${t.tier} tier is incomplete: missing ${missing.join(" + ")}.`,
105
+ fix: "bb setup"
106
+ });
107
+ }
108
+ if (modeWrong) {
109
+ findings.push({
110
+ id: `mode-${t.tier}`,
111
+ severity: "warn",
112
+ message: `${t.tier} config file has mode ${t.fileMode?.toString(8)} \u2014 the key may be world-readable.`,
113
+ fix: "bb doctor --fix"
114
+ });
115
+ }
116
+ }
117
+ const winnerTier = state.tiers.find((t) => t.complete);
118
+ const winnerModel = winnerTier?.model;
119
+ const storedRead = opts.storedModels ? { models: opts.storedModels, unreadable: null } : opts.projectId ? readStoredModels(opts.projectId, dataDir) : { models: [], unreadable: null };
120
+ const storedModels = storedRead.models;
121
+ if (storedRead.unreadable) {
122
+ findings.push({
123
+ id: "index-unreadable",
124
+ severity: "warn",
125
+ message: `This project's index exists but doctor could not read its embedding table from this runtime (${storedRead.unreadable}). Stored vectors are UNKNOWN, not absent \u2014 the model-consistency checks below cannot run.`,
126
+ fix: "run the shipped binary (npx @backbencher/brain doctor) or check the database file permissions"
127
+ });
128
+ }
129
+ if (winnerModel && storedModels.length > 0) {
130
+ const matches = storedModels.filter((s) => s.model === winnerModel);
131
+ if (matches.length === 0) {
132
+ const storedDesc = storedModels.map((s) => `${s.model} (${s.count} rows)`).join(", ");
133
+ findings.push({
134
+ id: "model-mismatch",
135
+ severity: "fail",
136
+ message: `Model mismatch: config has ${winnerModel}, index has ${storedDesc}. Vectors from different models cannot be compared \u2014 the stored vectors are unusable.`,
137
+ fix: "bb index --force"
138
+ });
139
+ } else {
140
+ const foreign = storedModels.filter((s) => s.model !== winnerModel);
141
+ if (foreign.length > 0) {
142
+ const foreignDesc = foreign.map((s) => `${s.model} (${s.count} rows)`).join(", ");
143
+ findings.push({
144
+ id: "model-mixed",
145
+ severity: "warn",
146
+ message: `The index contains foreign-model vectors: ${foreignDesc}. They are never compared with ${winnerModel} queries.`,
147
+ fix: "bb index --force"
148
+ });
149
+ }
150
+ }
151
+ } else if (!winnerModel && storedModels.length > 0) {
152
+ const total = storedModels.reduce((sum, m) => sum + m.count, 0);
153
+ const storedDesc = storedModels.map((s) => `${s.model} (${s.count} rows)`).join(", ");
154
+ const mixed = storedModels.length > 1;
155
+ findings.push({
156
+ id: "stored-unconfigured",
157
+ severity: "info",
158
+ message: `The index holds ${total.toLocaleString()} vector(s) from ${storedDesc}, but no embedding provider is configured from this directory. Queries would use ${localLabel}, which is a DIFFERENT embedding space, so those vectors are not comparable to new queries.` + (mixed ? " The index also contains vectors from more than one model, so even a configured query compares only one of them." : ""),
159
+ fix: "bb setup (or run bb doctor from the directory whose config built this index)"
160
+ });
161
+ } else if (winnerModel && storedModels.length === 0) {
162
+ findings.push({
163
+ id: "no-index",
164
+ severity: "info",
165
+ message: `No stored vectors for this project (no index or empty). Config model: ${winnerModel}.`,
166
+ fix: "bb index ."
167
+ });
168
+ }
169
+ if (!winnerModel) {
170
+ findings.push({
171
+ id: "semantic-degraded",
172
+ severity: "warn",
173
+ message: `Semantic search will use ${localLabel} (weaker).`,
174
+ fix: "bb setup"
175
+ });
176
+ }
177
+ try {
178
+ const { buildEmbeddingDiagnosis } = embedding_diagnosis_exports;
179
+ const diagnosis = buildEmbeddingDiagnosis({ state, env: process.env });
180
+ for (const p of diagnosis.problems ?? []) {
181
+ findings.push({
182
+ id: p.envVar ? `embedding.${p.envVar.toLowerCase()}` : "embedding.config",
183
+ severity: p.severity === "error" ? "fail" : "warn",
184
+ message: p.message,
185
+ // Never echo a key value — `envVar` is a variable NAME, and the module
186
+ // guarantees `message` carries only presence/source, never the secret.
187
+ ...p.envVar ? { fix: `set ${p.envVar} (bb setup walks through it)` } : {}
188
+ });
189
+ }
190
+ if (diagnosis.tierOrderDisagreement) {
191
+ findings.push({
192
+ id: "embedding.tier-order-disagreement",
193
+ severity: "warn",
194
+ message: `embedding configuration layers disagree on precedence: reports ${diagnosis.tierOrderDisagreement.reported} but resolves ${diagnosis.tierOrderDisagreement.actual} \u2014 ${diagnosis.tierOrderDisagreement.detail}`,
195
+ fix: "run `bb setup show` to see which layer wins"
196
+ });
197
+ }
198
+ if (diagnosis.chain?.length) {
199
+ for (const layer of diagnosis.chain) {
200
+ embeddingChain.push({
201
+ order: layer.order,
202
+ role: layer.role,
203
+ label: layer.label,
204
+ endpoint: layer.endpoint,
205
+ model: layer.model,
206
+ keyState: layer.keyState,
207
+ source: layer.source,
208
+ active: layer.active
209
+ });
210
+ }
211
+ }
212
+ if (isEmbeddingDisabled(process.env)) {
213
+ findings.push({
214
+ id: "embedding.disabled",
215
+ severity: "warn",
216
+ message: "embeddings are DISABLED (BB_EMBEDDING_DISABLED) \u2014 semantic search will not run at all",
217
+ fix: "unset BB_EMBEDDING_DISABLED to enable semantic search"
218
+ });
219
+ }
220
+ } catch (e) {
221
+ findings.push({
222
+ id: "embedding.diagnosis-unavailable",
223
+ severity: "warn",
224
+ message: `embedding diagnosis could not run: ${e?.message ?? e}`,
225
+ fix: "run `bb setup show` to inspect the embedding configuration"
226
+ });
227
+ }
228
+ const poolReport = runPoolDoctor(opts.poolModuleDir ?? poolModuleDir(), opts.poolProbe);
229
+ findings.push(...poolReport.findings.filter((f) => f.severity !== "info"));
230
+ const healthy = !findings.some((f) => f.severity === "fail");
231
+ return {
232
+ findings,
233
+ healthy,
234
+ winner: state.winner,
235
+ storedModels,
236
+ pool: summarizePool(poolReport),
237
+ ...embeddingChain.length ? { embeddingChain } : {}
238
+ };
239
+ }
240
+ function summarizePool(report) {
241
+ const res = report.resolution;
242
+ const probe = report.probe;
243
+ const facts = [
244
+ `runtime: ${process.execPath} (${process.version})`,
245
+ res.ok ? `worker: ${res.source === "compiled-dist" ? "compiled dist/pool-worker.js" : `tsx + ${path.basename(res.workerArgs[0] ?? "?")}`}` : `worker: not resolvable (${res.reason})`
246
+ ];
247
+ if (res.ok) facts.push(`root: ${res.projectRoot}`);
248
+ if (!res.ok) {
249
+ return {
250
+ status: report.status === "disabled" ? "disabled" : "unavailable",
251
+ summary: report.status === "disabled" ? "Pool workers are switched off (BB_POOL_WORKER) \u2014 indexing runs in-process, so it is slower." : `Pool workers cannot start (${res.reason}): ${res.message}`,
252
+ reasonCode: res.reason,
253
+ remediation: res.remediation,
254
+ facts
255
+ };
256
+ }
257
+ if (!probe) {
258
+ return {
259
+ status: "unchecked",
260
+ summary: `Pool fork target resolved (${res.source}) but was not started.`,
261
+ facts
262
+ };
263
+ }
264
+ if (!probe.ok) {
265
+ const unverifiable = probe.reason === "worker-selftest-unsupported";
266
+ return {
267
+ status: unverifiable ? "unchecked" : "unavailable",
268
+ summary: unverifiable ? `Pool workers could not be verified (${probe.reason}) \u2014 the installed worker predates the self-test.` : `Pool workers do not start (${probe.reason}): ${probe.message}`,
269
+ reasonCode: probe.reason,
270
+ remediation: probe.remediation,
271
+ facts
272
+ };
273
+ }
274
+ const r = probe.report;
275
+ facts.push(`self-test: ${probe.ms}ms (pid ${r.pid}, node ${r.node})`);
276
+ if (r.engine === "ok" && r.wasm === "ok") {
277
+ return {
278
+ status: "ok",
279
+ summary: `Pool workers start normally (${res.source}); engine and grammars loaded in ${probe.ms}ms.`,
280
+ facts
281
+ };
282
+ }
283
+ const broken = [];
284
+ if (r.engine !== "ok") broken.push("the AST engine did not load, so files are parsed by regex (fewer symbols)");
285
+ if (r.wasm !== "ok") broken.push("the tree-sitter grammars did not load, so there is no grammar-based parsing");
286
+ return {
287
+ status: "degraded",
288
+ summary: `Pool workers start but are DEGRADED: ${broken.join("; ")}.`,
289
+ reasonCode: r.engine !== "ok" ? "pool-engine-unavailable" : "pool-wasm-unavailable",
290
+ cause: r.diagnostics.join(" | ") || void 0,
291
+ remediation: ["npm rebuild --build-from-source && rm -rf node_modules && npm install --include=dev"],
292
+ facts
293
+ };
294
+ }
295
+ function renderDoctorReport(r) {
296
+ const lines = [];
297
+ lines.push("bb doctor \u2014 diagnostics");
298
+ lines.push("");
299
+ if (r.findings.length === 0) {
300
+ lines.push("\u2713 No problems found \u2014 config and index look consistent.");
301
+ }
302
+ if (r.pool) {
303
+ const poolIcon = {
304
+ ok: "\u2713",
305
+ degraded: "!",
306
+ unavailable: "\u2717",
307
+ disabled: "\xB7",
308
+ unchecked: "?"
309
+ };
310
+ lines.push(`${poolIcon[r.pool.status]} pool workers: ${r.pool.summary}`);
311
+ if (r.pool.reasonCode) lines.push(` reason: ${r.pool.reasonCode}`);
312
+ if (r.pool.cause) lines.push(` cause: ${r.pool.cause}`);
313
+ for (const fact of r.pool.facts ?? []) lines.push(` ${fact}`);
314
+ (r.pool.remediation ?? []).forEach((fix, i) => {
315
+ const [first, ...rest] = fix.split("\n");
316
+ lines.push(` fix ${i + 1}: ${first.trim()}`);
317
+ for (const cont of rest) if (cont.trim()) lines.push(` ${cont.trim()}`);
318
+ });
319
+ lines.push("");
320
+ }
321
+ if (r.embeddingChain?.length) {
322
+ lines.push("embedding layers, in the order bb resolves them:");
323
+ for (const layer of r.embeddingChain) {
324
+ const mark = layer.active ? "\u2192" : " ";
325
+ const key = layer.keyState === "present" ? "key present" : `key ${layer.keyState}`;
326
+ lines.push(` ${mark} ${layer.order}. ${layer.label} \u2014 ${layer.model} @ ${layer.endpoint} (${key}, from ${layer.source})`);
327
+ }
328
+ lines.push("");
329
+ }
330
+ const iconFor = { fail: "\u2717", warn: "!", info: "\xB7" };
331
+ for (const f of r.findings) {
332
+ lines.push(`${iconFor[f.severity]} ${f.message}`);
333
+ if (f.fix) lines.push(` Fix: ${f.fix}`);
334
+ }
335
+ return lines.join("\n") + "\n";
336
+ }
337
+ var MAX_FIX_ACTIONS = 8;
338
+ function planDoctorFixes(opts) {
339
+ const cwd = opts.cwd ?? process.cwd();
340
+ const env = opts.env ?? process.env;
341
+ const dataDir = opts.dataDir ?? bbDataDir();
342
+ const state = describeEmbeddingConfig(cwd, env, dataDir);
343
+ const actions = [];
344
+ const refusals = [];
345
+ for (const t of state.tiers) {
346
+ if (t.fileMode !== void 0 && t.fileMode !== 384 && t.file) {
347
+ if (actions.length >= MAX_FIX_ACTIONS) {
348
+ refusals.push({ id: `mode-${t.tier}`, reason: `repair cap exceeded (${MAX_FIX_ACTIONS}) \u2014 unexpected state, manual review required` });
349
+ continue;
350
+ }
351
+ actions.push({ id: `mode-${t.tier}`, file: t.file, fromMode: t.fileMode, toMode: 384 });
352
+ }
353
+ }
354
+ return { actions, refusals };
355
+ }
356
+ function renderFixPlan(plan, applied) {
357
+ const lines = [];
358
+ lines.push(applied ? "bb doctor --fix \u2014 applied" : "bb doctor --fix \u2014 dry run (nothing changed; pass --fix to apply)");
359
+ lines.push("");
360
+ if (plan.actions.length === 0 && plan.refusals.length === 0) {
361
+ lines.push("\u2713 No permission problems to fix.");
362
+ }
363
+ for (const a of plan.actions) {
364
+ lines.push(`${applied ? "\u2713" : "\xB7"} ${a.file}: mode ${a.fromMode?.toString(8)} -> ${a.toMode.toString(8)} ${applied ? "(applied)" : "(proposed)"}`);
365
+ }
366
+ for (const ref of plan.refusals) {
367
+ lines.push(`\u2717 REFUSED ${ref.id}: ${ref.reason}`);
368
+ }
369
+ return lines.join("\n") + "\n";
370
+ }
371
+ function applyDoctorFixes(opts) {
372
+ const plan = planDoctorFixes(opts);
373
+ const applied = opts.apply === true;
374
+ if (applied) {
375
+ for (const a of plan.actions) {
376
+ try {
377
+ const st = statSync(a.file);
378
+ if (!st.isFile()) throw new Error("not a regular file");
379
+ chmodSync(a.file, a.toMode);
380
+ } catch {
381
+ plan.refusals.push({ id: a.id, reason: "file changed between plan and apply \u2014 manual review required" });
382
+ plan.actions = plan.actions.filter((x) => x !== a);
383
+ }
384
+ }
385
+ }
386
+ return { plan, applied };
387
+ }
388
+ export {
389
+ applyDoctorFixes,
390
+ planDoctorFixes,
391
+ renderDoctorReport,
392
+ renderFixPlan,
393
+ resetPoolDoctorCache,
394
+ runDoctorChecks
395
+ };
@@ -0,0 +1,51 @@
1
+ import {
2
+ BATCH_ENTRY_MODES,
3
+ BATCH_WIDE_OPTIONS,
4
+ MAX_BATCH_EDITS,
5
+ WRITE_GUARD,
6
+ executeEdit,
7
+ expandBatchRequest,
8
+ fileHash,
9
+ findDeclarationName,
10
+ isBindingParentType,
11
+ isReferenceSite,
12
+ lineCount,
13
+ preImageMismatches,
14
+ resolveSafeEditPath,
15
+ writeGuardMessage
16
+ } from "./chunk-CW4XXSNN.js";
17
+ import "./chunk-PJTNGD3Z.js";
18
+ import "./chunk-4H22TLOT.js";
19
+ import "./chunk-GEFFO6O2.js";
20
+ import "./chunk-VURYFIHW.js";
21
+ import "./chunk-DYM4FQEE.js";
22
+ import "./chunk-YI6FF2ZR.js";
23
+ import "./chunk-QLK6ED4Q.js";
24
+ import "./chunk-KLK3PBTO.js";
25
+ import "./chunk-V44PGPA6.js";
26
+ import "./chunk-BQ3OVQ3P.js";
27
+ import "./chunk-SK6YVHFZ.js";
28
+ import "./chunk-2BSKD7O3.js";
29
+ import "./chunk-KAET47ZL.js";
30
+ import "./chunk-KCDECRJY.js";
31
+ import "./chunk-D2Q4Y47A.js";
32
+ import "./chunk-SM7RFQRO.js";
33
+ import "./chunk-L5TDYKYK.js";
34
+ import "./chunk-ROMM6KMC.js";
35
+ import "./chunk-MLKGABMK.js";
36
+ export {
37
+ BATCH_ENTRY_MODES,
38
+ BATCH_WIDE_OPTIONS,
39
+ MAX_BATCH_EDITS,
40
+ WRITE_GUARD,
41
+ executeEdit,
42
+ expandBatchRequest,
43
+ fileHash,
44
+ findDeclarationName,
45
+ isBindingParentType,
46
+ isReferenceSite,
47
+ lineCount,
48
+ preImageMismatches,
49
+ resolveSafeEditPath,
50
+ writeGuardMessage
51
+ };
@@ -0,0 +1,11 @@
1
+ import {
2
+ SemanticEngine
3
+ } from "./chunk-5SD45FLC.js";
4
+ import "./chunk-7AN7U5IZ.js";
5
+ import "./chunk-UGR4QIGS.js";
6
+ import "./chunk-BQ3OVQ3P.js";
7
+ import "./chunk-2BSKD7O3.js";
8
+ import "./chunk-MLKGABMK.js";
9
+ export {
10
+ SemanticEngine
11
+ };
@@ -0,0 +1,18 @@
1
+ import {
2
+ ASTEngine,
3
+ getCachedParser,
4
+ getParser,
5
+ parseFile
6
+ } from "./chunk-V44PGPA6.js";
7
+ import "./chunk-BQ3OVQ3P.js";
8
+ import "./chunk-SK6YVHFZ.js";
9
+ import "./chunk-2BSKD7O3.js";
10
+ import "./chunk-KAET47ZL.js";
11
+ import "./chunk-KCDECRJY.js";
12
+ import "./chunk-MLKGABMK.js";
13
+ export {
14
+ ASTEngine,
15
+ getCachedParser,
16
+ getParser,
17
+ parseFile
18
+ };
@@ -0,0 +1,33 @@
1
+ import {
2
+ computeCheckoutFingerprint,
3
+ computeDbFingerprint,
4
+ gitIdentity,
5
+ persistProjectFingerprint,
6
+ readStoredFingerprint,
7
+ relativePathFingerprint
8
+ } from "./chunk-3LFTSMIV.js";
9
+ import "./chunk-PJTNGD3Z.js";
10
+ import "./chunk-4H22TLOT.js";
11
+ import "./chunk-GEFFO6O2.js";
12
+ import "./chunk-VURYFIHW.js";
13
+ import "./chunk-DYM4FQEE.js";
14
+ import "./chunk-KLK3PBTO.js";
15
+ import "./chunk-V44PGPA6.js";
16
+ import "./chunk-BQ3OVQ3P.js";
17
+ import "./chunk-SK6YVHFZ.js";
18
+ import "./chunk-2BSKD7O3.js";
19
+ import "./chunk-KAET47ZL.js";
20
+ import "./chunk-KCDECRJY.js";
21
+ import "./chunk-D2Q4Y47A.js";
22
+ import "./chunk-SM7RFQRO.js";
23
+ import "./chunk-L5TDYKYK.js";
24
+ import "./chunk-ROMM6KMC.js";
25
+ import "./chunk-MLKGABMK.js";
26
+ export {
27
+ computeCheckoutFingerprint,
28
+ computeDbFingerprint,
29
+ gitIdentity,
30
+ persistProjectFingerprint,
31
+ readStoredFingerprint,
32
+ relativePathFingerprint
33
+ };