@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,376 @@
1
+ import {
2
+ classifyTier
3
+ } from "./chunk-RCMTFSEF.js";
4
+
5
+ // src/lsp/signature.ts
6
+ var UNRESOLVED_TYPE = "unknown";
7
+ var UNKNOWN_PARAMETER_LIST = "\u2026";
8
+ var RAW_JSON_SHAPE = /[{\[]\s*"?[A-Za-z_][A-Za-z0-9_]*"?\s*:/;
9
+ var CALLABLE_TYPES = /* @__PURE__ */ new Set([
10
+ "function",
11
+ "method",
12
+ "constructor",
13
+ "procedure",
14
+ "subroutine",
15
+ "getter",
16
+ "setter"
17
+ ]);
18
+ function parseParameters(raw) {
19
+ if (raw === null || raw === void 0 || raw.trim() === "") return { shape: "absent", entries: [], text: "" };
20
+ const text = raw.trim();
21
+ let parsed;
22
+ try {
23
+ parsed = JSON.parse(text);
24
+ } catch {
25
+ return { shape: RAW_JSON_SHAPE.test(text) ? "serialized" : "opaque", entries: [], text };
26
+ }
27
+ if (!Array.isArray(parsed)) return { shape: "serialized", entries: [], text };
28
+ if (parsed.length === 0) return { shape: "empty", entries: [], text };
29
+ const entries = [];
30
+ for (const item of parsed) {
31
+ if (typeof item === "string") {
32
+ if (item.trim() !== "") entries.push({ name: item.trim() });
33
+ continue;
34
+ }
35
+ if (item === null || typeof item !== "object") {
36
+ return { shape: "serialized", entries: [], text };
37
+ }
38
+ const e = item;
39
+ const name = typeof e.name === "string" ? e.name : "";
40
+ if (name.trim() === "") {
41
+ return { shape: "serialized", entries: [], text };
42
+ }
43
+ entries.push({
44
+ name: name.trim(),
45
+ type: typeof e.type === "string" ? e.type : null,
46
+ isOptional: e.isOptional === true || e.optional === true,
47
+ defaultValue: typeof e.defaultValue === "string" ? e.defaultValue : null,
48
+ isRest: e.isRest === true || e.rest === true || e.variadic === true,
49
+ isImplicit: e.isImplicit === true
50
+ });
51
+ }
52
+ return { shape: "list", entries, text };
53
+ }
54
+ function splitRestMarker(name) {
55
+ if (name.startsWith("...")) return { name: name.slice(3), rest: true };
56
+ if (name.startsWith("*") && name.length > 1) return { name: name.slice(1), rest: true };
57
+ return { name, rest: false };
58
+ }
59
+ function resolvedType(type) {
60
+ const t = (type ?? "").trim();
61
+ return t === "" ? UNRESOLVED_TYPE : t;
62
+ }
63
+ function renderParameter(entry, language) {
64
+ const marked = splitRestMarker(entry.name);
65
+ const rest = entry.isRest === true || marked.rest;
66
+ const name = marked.name;
67
+ const type = resolvedType(entry.type);
68
+ const lang = (language ?? "").toLowerCase();
69
+ const trailingDefault = entry.defaultValue !== null && entry.defaultValue !== void 0 && entry.defaultValue !== "" ? ` = ${entry.defaultValue}` : "";
70
+ if (rest) {
71
+ if (lang === "python") return `*${name}: ${type}`;
72
+ if (lang === "java") return `${type}... ${name}`;
73
+ if (lang === "kotlin") return `vararg ${name}: ${type}`;
74
+ if (lang === "scala") return `${name}: ${type}*`;
75
+ return `...${name}: ${type}`;
76
+ }
77
+ if (entry.isImplicit === true) return name;
78
+ if (lang === "java") return trailingDefault !== "" ? `${type} ${name}${trailingDefault}` : `${type} ${name}`;
79
+ if (entry.isOptional === true && trailingDefault === "") {
80
+ if (lang === "javascript" || lang === "typescript" || lang === "" || lang === "unknown") return `${name}?: ${type}`;
81
+ return `${name}: ${type}`;
82
+ }
83
+ return `${name}: ${type}${trailingDefault}`;
84
+ }
85
+ function renderParameterList(raw, language) {
86
+ const parsed = parseParameters(raw);
87
+ switch (parsed.shape) {
88
+ case "absent":
89
+ return UNKNOWN_PARAMETER_LIST;
90
+ case "empty":
91
+ return "";
92
+ case "list":
93
+ return parsed.entries.map((e) => renderParameter(e, language)).join(", ");
94
+ case "opaque":
95
+ return parsed.text;
96
+ case "serialized":
97
+ return UNKNOWN_PARAMETER_LIST;
98
+ }
99
+ }
100
+ function renderSignature(symbol, language) {
101
+ const parts = [];
102
+ const visibility = (symbol.visibility ?? "").trim();
103
+ if (visibility !== "") parts.push(visibility);
104
+ parts.push(symbol.symbol_type);
105
+ let sig = symbol.symbol_type.toLowerCase() === symbol.name.toLowerCase() ? parts.join(" ") : `${parts.join(" ")} ${symbol.name}`;
106
+ const type = (symbol.symbol_type ?? "").toLowerCase();
107
+ if (CALLABLE_TYPES.has(type)) {
108
+ sig += `(${renderParameterList(symbol.parameters, language)})`;
109
+ }
110
+ const ret = (symbol.return_type ?? "").trim();
111
+ if (ret !== "") sig += ` \u2192 ${ret}`;
112
+ return sig;
113
+ }
114
+
115
+ // src/lsp/cross_language_hover.ts
116
+ function tierForCrossLanguageEdge(edge) {
117
+ return classifyTier({
118
+ relationshipType: edge.relationship_type,
119
+ confidence: edge.confidence,
120
+ evidenceClass: edge.evidence_class
121
+ });
122
+ }
123
+ var UNNAMED_BRIDGE = "unnamed bridge (stored row carries no mechanism)";
124
+ function factsFromRows(rows, hoverLanguage) {
125
+ if (hoverLanguage === null) return [];
126
+ const facts = [];
127
+ for (const row of rows) {
128
+ if (!row.other_language) continue;
129
+ facts.push({
130
+ pair: `${hoverLanguage} \u2192 ${row.other_language}`,
131
+ direction: row.direction,
132
+ bridge: row.bridge_mechanism ?? UNNAMED_BRIDGE,
133
+ tier: tierForCrossLanguageEdge(row),
134
+ confidence: row.confidence ?? 0,
135
+ relationshipType: row.relationship_type
136
+ });
137
+ }
138
+ return facts;
139
+ }
140
+ function crossLanguageSection(facts) {
141
+ if (facts.length === 0) return "";
142
+ const lines = ["**cross-language** (from stored index rows only):"];
143
+ for (const f of facts) {
144
+ const dir = f.direction === "caller" ? "called from" : "calls into";
145
+ lines.push(`- ${dir} ${f.pair.split(" \u2192 ")[1]} via ${f.bridge} \u2014 ${f.tier} (confidence ${f.confidence})`);
146
+ }
147
+ return lines.join("\n");
148
+ }
149
+ function storedCrossLanguageRows(db, symbolId) {
150
+ const rows = [];
151
+ const callers = db.prepare(
152
+ `SELECT r.relationship_type, r.confidence, r.bridge_mechanism, sf.language AS other_language, r.metadata
153
+ FROM brain_relationship r
154
+ JOIN brain_symbol ss ON ss.id = r.source_symbol_id AND ss.project_id = r.project_id
155
+ JOIN brain_file sf ON sf.id = ss.file_id
156
+ WHERE r.is_cross_language = 1 AND r.target_symbol_id = ?
157
+ AND r.project_id = (SELECT s2.project_id FROM brain_symbol s2 WHERE s2.id = ?)`
158
+ ).all(symbolId, symbolId);
159
+ for (const r of callers) rows.push({ ...r, direction: "caller", evidence_class: parseEvidenceClass(r.metadata) });
160
+ const callees = db.prepare(
161
+ `SELECT r.relationship_type, r.confidence, r.bridge_mechanism, tf.language AS other_language, r.metadata
162
+ FROM brain_relationship r
163
+ JOIN brain_symbol ts ON ts.id = r.target_symbol_id AND ts.project_id = r.project_id
164
+ JOIN brain_file tf ON tf.id = ts.file_id
165
+ WHERE r.is_cross_language = 1 AND r.source_symbol_id = ?
166
+ AND r.project_id = (SELECT s2.project_id FROM brain_symbol s2 WHERE s2.id = ?)`
167
+ ).all(symbolId, symbolId);
168
+ for (const r of callees) rows.push({ ...r, direction: "callee", evidence_class: parseEvidenceClass(r.metadata) });
169
+ return rows;
170
+ }
171
+ function parseEvidenceClass(metadata) {
172
+ if (!metadata) return null;
173
+ try {
174
+ const parsed = JSON.parse(metadata);
175
+ return typeof parsed["evidenceClass"] === "string" ? parsed["evidenceClass"] : null;
176
+ } catch {
177
+ return null;
178
+ }
179
+ }
180
+ var CROSS_LANGUAGE_DEFAULT_LIMIT = 200;
181
+ var CROSS_LANGUAGE_MAX_LIMIT = 1e3;
182
+ var CROSS_LANGUAGE_COPY_CAP = 200;
183
+ var SELF_COLUMNS = `r.id AS row_id, r.relationship_type AS relationship_type, r.confidence AS confidence,
184
+ r.bridge_mechanism AS bridge_mechanism, r.metadata AS metadata`;
185
+ var COPY_COLUMNS = `ts.id AS self_id, ts.name AS self_name, tf.relative_path AS self_file,
186
+ tf.language AS self_language, ts.line_start AS self_line,
187
+ NULL AS owner_id, NULL AS owner_name, NULL AS owner_file, NULL AS owner_language, NULL AS owner_line`;
188
+ var OTHER_COLUMNS_AS_TARGET = `ss.id AS other_id, ss.name AS other_name, sf.relative_path AS other_file,
189
+ sf.language AS other_language, ss.line_start AS other_line`;
190
+ var AGENT_FACTS_SQL = `
191
+ SELECT ${SELF_COLUMNS}, 'caller' AS direction, ${COPY_COLUMNS}, ${OTHER_COLUMNS_AS_TARGET}
192
+ FROM brain_symbol ts
193
+ CROSS JOIN brain_relationship r ON r.target_symbol_id = ts.id AND r.is_cross_language = 1
194
+ CROSS JOIN brain_symbol ss ON ss.id = r.source_symbol_id
195
+ JOIN brain_file tf ON tf.id = ts.file_id
196
+ JOIN brain_file sf ON sf.id = ss.file_id
197
+ WHERE ts.name = ? AND r.project_id = ?
198
+ UNION ALL
199
+ SELECT ${SELF_COLUMNS}, 'callee' AS direction, ${COPY_COLUMNS}, ${OTHER_COLUMNS_AS_TARGET}
200
+ FROM brain_symbol ts
201
+ CROSS JOIN brain_relationship r ON r.source_symbol_id = ts.id AND r.is_cross_language = 1
202
+ CROSS JOIN brain_symbol ss ON ss.id = r.target_symbol_id
203
+ JOIN brain_file tf ON tf.id = ts.file_id
204
+ JOIN brain_file sf ON sf.id = ss.file_id
205
+ WHERE ts.name = ? AND r.project_id = ?
206
+ ORDER BY self_file, self_line, direction, other_file, other_line, row_id`;
207
+ var ALL_COPIES_SQL = `
208
+ SELECT s.id AS id, s.name AS name, f.relative_path AS file, f.language AS language, s.line_start AS line
209
+ FROM brain_symbol s
210
+ JOIN brain_file f ON f.id = s.file_id
211
+ WHERE s.project_id = ? AND s.name = ?
212
+ ORDER BY f.relative_path, s.line_start, s.id
213
+ LIMIT ?`;
214
+ var COPY_COUNT_SQL = `
215
+ SELECT COUNT(*) AS total
216
+ FROM brain_symbol
217
+ WHERE project_id = ? AND name = ?`;
218
+ var COPY_LANGUAGES_SQL = `
219
+ SELECT DISTINCT f.language AS language
220
+ FROM brain_symbol s
221
+ JOIN brain_file f ON f.id = s.file_id
222
+ WHERE s.project_id = ? AND s.name = ? AND f.language IS NOT NULL AND TRIM(f.language) <> ''
223
+ ORDER BY f.language`;
224
+ var MEMBER_FACTS_SQL = `
225
+ SELECT ${SELF_COLUMNS}, 'caller' AS direction,
226
+ m.id AS self_id, m.name AS self_name, mfile.relative_path AS self_file,
227
+ mfile.language AS self_language, m.line_start AS self_line,
228
+ owner.id AS owner_id, owner.name AS owner_name, ofile.relative_path AS owner_file,
229
+ ofile.language AS owner_language, owner.line_start AS owner_line,
230
+ ${OTHER_COLUMNS_AS_TARGET}
231
+ FROM brain_symbol owner
232
+ CROSS JOIN brain_symbol m ON m.owner_symbol_id = owner.id
233
+ CROSS JOIN brain_relationship r ON r.target_symbol_id = m.id AND r.is_cross_language = 1
234
+ JOIN brain_file mfile ON mfile.id = m.file_id
235
+ JOIN brain_file ofile ON ofile.id = owner.file_id
236
+ JOIN brain_symbol ss ON ss.id = r.source_symbol_id
237
+ JOIN brain_file sf ON sf.id = ss.file_id
238
+ WHERE owner.name = ? AND r.project_id = ? AND m.name <> owner.name
239
+ UNION ALL
240
+ SELECT ${SELF_COLUMNS}, 'callee' AS direction,
241
+ m.id AS self_id, m.name AS self_name, mfile.relative_path AS self_file,
242
+ mfile.language AS self_language, m.line_start AS self_line,
243
+ owner.id AS owner_id, owner.name AS owner_name, ofile.relative_path AS owner_file,
244
+ ofile.language AS owner_language, owner.line_start AS owner_line,
245
+ ss.id AS other_id, ss.name AS other_name, sf.relative_path AS other_file,
246
+ sf.language AS other_language, ss.line_start AS other_line
247
+ FROM brain_symbol owner
248
+ CROSS JOIN brain_symbol m ON m.owner_symbol_id = owner.id
249
+ CROSS JOIN brain_relationship r ON r.source_symbol_id = m.id AND r.is_cross_language = 1
250
+ JOIN brain_file mfile ON mfile.id = m.file_id
251
+ JOIN brain_file ofile ON ofile.id = owner.file_id
252
+ JOIN brain_symbol ss ON ss.id = r.target_symbol_id
253
+ JOIN brain_file sf ON sf.id = ss.file_id
254
+ WHERE owner.name = ? AND r.project_id = ? AND m.name <> owner.name
255
+ ORDER BY self_file, self_line, owner_file, owner_line, direction, other_file, other_line, row_id`;
256
+ var DEEPER_DESCENDANT_ROWS_SQL = `
257
+ WITH RECURSIVE down(id, depth) AS (
258
+ SELECT m.id, 1
259
+ FROM brain_symbol o
260
+ CROSS JOIN brain_symbol m ON m.owner_symbol_id = o.id
261
+ WHERE o.project_id = ? AND o.name = ?
262
+ UNION ALL
263
+ SELECT m.id, down.depth + 1
264
+ FROM brain_symbol m JOIN down ON m.owner_symbol_id = down.id
265
+ )
266
+ SELECT COUNT(*) AS n FROM (
267
+ SELECT r.id FROM down CROSS JOIN brain_relationship r ON r.target_symbol_id = down.id
268
+ WHERE r.project_id = ? AND r.is_cross_language = 1 AND down.depth >= 2
269
+ UNION
270
+ SELECT r.id FROM down CROSS JOIN brain_relationship r ON r.source_symbol_id = down.id
271
+ WHERE r.project_id = ? AND r.is_cross_language = 1 AND down.depth >= 2
272
+ )`;
273
+ function factFromRow(row, match, counters) {
274
+ const pair = row.self_language && row.other_language && row.self_language.toLowerCase() !== row.other_language.toLowerCase() ? `${row.self_language} \u2192 ${row.other_language}` : null;
275
+ if (pair === null) {
276
+ counters.unpairable++;
277
+ return null;
278
+ }
279
+ const self = { symbol: row.self_name, file: row.self_file, language: row.self_language, line: row.self_line };
280
+ const fact = {
281
+ self,
282
+ direction: row.direction,
283
+ other: { symbol: row.other_name, file: row.other_file, language: row.other_language, line: row.other_line },
284
+ pair,
285
+ bridge: row.bridge_mechanism ?? UNNAMED_BRIDGE,
286
+ tier: tierForCrossLanguageEdge({
287
+ relationship_type: row.relationship_type,
288
+ confidence: row.confidence,
289
+ evidence_class: parseEvidenceClass(row.metadata)
290
+ }),
291
+ confidence: row.confidence ?? 0,
292
+ relationshipType: row.relationship_type,
293
+ rowId: row.row_id,
294
+ match
295
+ };
296
+ if (match === "owner-cascade") {
297
+ fact.owner = { symbol: row.owner_name, file: row.owner_file, language: row.owner_language, line: row.owner_line };
298
+ fact.matchedMember = self;
299
+ fact.matchedMemberId = row.self_id;
300
+ }
301
+ return fact;
302
+ }
303
+ function storedCrossLanguageFactsByName(db, projectId, name) {
304
+ const rows = db.prepare(AGENT_FACTS_SQL).all(name, projectId, name, projectId);
305
+ const memberRows = db.prepare(MEMBER_FACTS_SQL).all(name, projectId, name, projectId);
306
+ const allCopies = db.prepare(ALL_COPIES_SQL).all(projectId, name, CROSS_LANGUAGE_COPY_CAP);
307
+ const deeperDescendantRows = db.prepare(DEEPER_DESCENDANT_ROWS_SQL).get(projectId, name, projectId, projectId).n;
308
+ const copyTotal = db.prepare(COPY_COUNT_SQL).get(projectId, name).total;
309
+ const copyLanguages = db.prepare(COPY_LANGUAGES_SQL).all(projectId, name).map((r) => r.language);
310
+ const copies = /* @__PURE__ */ new Map();
311
+ for (const copy of allCopies) {
312
+ copies.set(copy.id, { id: copy.id, symbol: copy.name, file: copy.file, language: copy.language, line: copy.line, crossRowCount: 0 });
313
+ }
314
+ const seenRows = /* @__PURE__ */ new Set();
315
+ const facts = [];
316
+ const memberFacts = [];
317
+ const members = /* @__PURE__ */ new Set();
318
+ const counters = { unpairable: 0 };
319
+ let collapsed = 0;
320
+ for (const row of rows) {
321
+ const copy = copies.get(row.self_id);
322
+ if (copy) copy.crossRowCount++;
323
+ else {
324
+ copies.set(row.self_id, { id: row.self_id, symbol: row.self_name, file: row.self_file, language: row.self_language, line: row.self_line, crossRowCount: 1 });
325
+ }
326
+ if (seenRows.has(row.row_id)) {
327
+ collapsed++;
328
+ continue;
329
+ }
330
+ seenRows.add(row.row_id);
331
+ const fact = factFromRow(row, "exact", counters);
332
+ if (fact) facts.push(fact);
333
+ }
334
+ for (const row of memberRows) {
335
+ if (seenRows.has(row.row_id)) {
336
+ collapsed++;
337
+ continue;
338
+ }
339
+ seenRows.add(row.row_id);
340
+ members.add(row.self_id);
341
+ const fact = factFromRow(row, "owner-cascade", counters);
342
+ if (fact) memberFacts.push(fact);
343
+ }
344
+ const sorted = [...copies.values()].sort((a, b) => (a.file ?? "").localeCompare(b.file ?? "") || (a.line ?? 0) - (b.line ?? 0) || a.id.localeCompare(b.id));
345
+ const copyList = sorted.slice(0, CROSS_LANGUAGE_COPY_CAP);
346
+ const languages = copyLanguages.slice().sort();
347
+ return {
348
+ copies: copyList,
349
+ copyCount: copyTotal,
350
+ languages,
351
+ ambiguous: copyTotal > 1,
352
+ copiesTruncated: copyTotal > copyList.length,
353
+ copiesCap: CROSS_LANGUAGE_COPY_CAP,
354
+ deeperDescendantRowCount: deeperDescendantRows,
355
+ facts,
356
+ memberFacts,
357
+ storedRowCount: rows.length + memberRows.length,
358
+ unpairableRowCount: counters.unpairable,
359
+ collapsedRowCount: collapsed,
360
+ memberCount: members.size
361
+ };
362
+ }
363
+
364
+ export {
365
+ UNRESOLVED_TYPE,
366
+ UNKNOWN_PARAMETER_LIST,
367
+ parseParameters,
368
+ renderParameterList,
369
+ renderSignature,
370
+ factsFromRows,
371
+ crossLanguageSection,
372
+ storedCrossLanguageRows,
373
+ CROSS_LANGUAGE_DEFAULT_LIMIT,
374
+ CROSS_LANGUAGE_MAX_LIMIT,
375
+ storedCrossLanguageFactsByName
376
+ };