gitnexus 1.6.9 → 1.6.10-aptos.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 (540) hide show
  1. package/README.md +236 -53
  2. package/dist/_shared/graph/types.d.ts +67 -3
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +1 -0
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
  8. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  9. package/dist/_shared/integrations/resilient-fetch.js +4 -3
  10. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  11. package/dist/_shared/language-detection.d.ts.map +1 -1
  12. package/dist/_shared/language-detection.js +2 -0
  13. package/dist/_shared/language-detection.js.map +1 -1
  14. package/dist/_shared/languages.d.ts +2 -0
  15. package/dist/_shared/languages.d.ts.map +1 -1
  16. package/dist/_shared/languages.js +2 -0
  17. package/dist/_shared/languages.js.map +1 -1
  18. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  19. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  20. package/dist/_shared/lbug/schema-constants.js +8 -0
  21. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  22. package/dist/_shared/pipeline.d.ts +1 -1
  23. package/dist/_shared/pipeline.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
  25. package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
  26. package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
  27. package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
  28. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
  29. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
  31. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  32. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  33. package/dist/_shared/scope-resolution/language-classification.js +1 -0
  34. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  35. package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
  36. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  37. package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
  38. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  39. package/dist/_shared/scope-resolution/types.d.ts +20 -3
  40. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  41. package/dist/cli/ai-context.d.ts +1 -1
  42. package/dist/cli/ai-context.js +25 -44
  43. package/dist/cli/analyze.d.ts +5 -2
  44. package/dist/cli/analyze.js +205 -11
  45. package/dist/cli/clean.js +17 -3
  46. package/dist/cli/cli-message.d.ts +1 -1
  47. package/dist/cli/doctor.d.ts +18 -0
  48. package/dist/cli/doctor.js +96 -5
  49. package/dist/cli/editor-targets.d.ts +17 -2
  50. package/dist/cli/editor-targets.js +44 -0
  51. package/dist/cli/embeddings.d.ts +12 -0
  52. package/dist/cli/embeddings.js +49 -0
  53. package/dist/cli/eval-server.d.ts +23 -1
  54. package/dist/cli/eval-server.js +126 -8
  55. package/dist/cli/help-i18n.js +6 -0
  56. package/dist/cli/i18n/en.d.ts +18 -8
  57. package/dist/cli/i18n/en.js +18 -8
  58. package/dist/cli/i18n/resources.d.ts +28 -8
  59. package/dist/cli/i18n/zh-CN.d.ts +10 -0
  60. package/dist/cli/i18n/zh-CN.js +18 -8
  61. package/dist/cli/index.js +21 -7
  62. package/dist/cli/lazy-action.d.ts +7 -0
  63. package/dist/cli/lazy-action.js +27 -0
  64. package/dist/cli/mcp.js +6 -3
  65. package/dist/cli/move-availability.d.ts +5 -0
  66. package/dist/cli/move-availability.js +11 -0
  67. package/dist/cli/setup.d.ts +8 -0
  68. package/dist/cli/setup.js +230 -32
  69. package/dist/cli/skill-gen.js +38 -18
  70. package/dist/cli/standard-skills.d.ts +76 -0
  71. package/dist/cli/standard-skills.js +45 -0
  72. package/dist/cli/status.d.ts +4 -1
  73. package/dist/cli/status.js +57 -4
  74. package/dist/cli/tool.js +11 -0
  75. package/dist/cli/uninstall.js +77 -18
  76. package/dist/cli/wiki.d.ts +1 -0
  77. package/dist/cli/wiki.js +7 -1
  78. package/dist/config/ignore-service.d.ts +2 -0
  79. package/dist/config/ignore-service.js +27 -0
  80. package/dist/core/analysis-features.d.ts +21 -0
  81. package/dist/core/analysis-features.js +59 -0
  82. package/dist/core/analyzer-identity.d.ts +74 -0
  83. package/dist/core/analyzer-identity.js +1820 -0
  84. package/dist/core/augmentation/engine.js +13 -8
  85. package/dist/core/embeddings/embedder.d.ts +3 -2
  86. package/dist/core/embeddings/embedder.js +24 -7
  87. package/dist/core/embeddings/embedding-identity.d.ts +11 -0
  88. package/dist/core/embeddings/embedding-identity.js +24 -0
  89. package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
  90. package/dist/core/embeddings/embedding-pipeline.js +100 -9
  91. package/dist/core/embeddings/http-client.d.ts +33 -3
  92. package/dist/core/embeddings/http-client.js +237 -25
  93. package/dist/core/embeddings/node-module-compat.d.ts +25 -0
  94. package/dist/core/embeddings/node-module-compat.js +25 -0
  95. package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
  96. package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
  97. package/dist/core/embeddings/runtime-install.d.ts +119 -0
  98. package/dist/core/embeddings/runtime-install.js +372 -0
  99. package/dist/core/embeddings/runtime-support.d.ts +48 -17
  100. package/dist/core/embeddings/runtime-support.js +96 -0
  101. package/dist/core/git-staleness.js +1 -1
  102. package/dist/core/group/bridge-db.js +2 -0
  103. package/dist/core/group/extractors/http-patterns/python.js +246 -108
  104. package/dist/core/group/extractors/manifest-extractor.js +4 -0
  105. package/dist/core/incremental/escalation-gate.d.ts +38 -0
  106. package/dist/core/incremental/escalation-gate.js +48 -0
  107. package/dist/core/incremental/shadow-candidates.d.ts +3 -3
  108. package/dist/core/incremental/shadow-candidates.js +3 -3
  109. package/dist/core/incremental/subgraph-extract.d.ts +2 -2
  110. package/dist/core/incremental/subgraph-extract.js +2 -2
  111. package/dist/core/index-freshness.d.ts +5 -0
  112. package/dist/core/index-freshness.js +13 -0
  113. package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
  114. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
  115. package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
  116. package/dist/core/ingestion/cobol-processor.js +27 -26
  117. package/dist/core/ingestion/community-processor.d.ts +51 -1
  118. package/dist/core/ingestion/community-processor.js +323 -64
  119. package/dist/core/ingestion/emit-references.js +7 -2
  120. package/dist/core/ingestion/filesystem-walker.js +4 -0
  121. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
  122. package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
  123. package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
  124. package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
  125. package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
  126. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
  127. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
  128. package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
  129. package/dist/core/ingestion/languages/c/captures.js +56 -0
  130. package/dist/core/ingestion/languages/c/query.js +17 -0
  131. package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
  132. package/dist/core/ingestion/languages/cobol/captures.js +93 -0
  133. package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
  134. package/dist/core/ingestion/languages/cpp/captures.js +365 -75
  135. package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
  136. package/dist/core/ingestion/languages/csharp/captures.js +25 -0
  137. package/dist/core/ingestion/languages/dart/captures.js +90 -2
  138. package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
  139. package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
  140. package/dist/core/ingestion/languages/dart.js +2 -0
  141. package/dist/core/ingestion/languages/go/captures.js +34 -0
  142. package/dist/core/ingestion/languages/index.d.ts +1 -0
  143. package/dist/core/ingestion/languages/index.js +2 -0
  144. package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
  145. package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
  146. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
  147. package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
  148. package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
  149. package/dist/core/ingestion/languages/java/captures.js +193 -17
  150. package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
  151. package/dist/core/ingestion/languages/java/package-facts.js +9 -0
  152. package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
  153. package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
  154. package/dist/core/ingestion/languages/java/query.js +23 -0
  155. package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
  156. package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
  157. package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
  158. package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
  159. package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
  160. package/dist/core/ingestion/languages/java.js +3 -0
  161. package/dist/core/ingestion/languages/javascript/captures.js +16 -0
  162. package/dist/core/ingestion/languages/javascript/query.js +21 -0
  163. package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
  164. package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
  165. package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
  166. package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
  167. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
  168. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
  169. package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
  170. package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
  171. package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
  172. package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
  173. package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
  174. package/dist/core/ingestion/languages/kotlin/query.js +19 -0
  175. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
  176. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
  177. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
  178. package/dist/core/ingestion/languages/kotlin.js +5 -6
  179. package/dist/core/ingestion/languages/move.d.ts +1 -0
  180. package/dist/core/ingestion/languages/move.js +27 -0
  181. package/dist/core/ingestion/languages/php/captures.js +40 -0
  182. package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
  183. package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
  184. package/dist/core/ingestion/languages/php/import-target.js +110 -2
  185. package/dist/core/ingestion/languages/php/interpret.js +10 -0
  186. package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
  187. package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
  188. package/dist/core/ingestion/languages/python/captures.js +24 -5
  189. package/dist/core/ingestion/languages/python/interpret.js +4 -0
  190. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
  191. package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
  192. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
  193. package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
  194. package/dist/core/ingestion/languages/ruby/captures.js +42 -0
  195. package/dist/core/ingestion/languages/rust/captures.js +13 -0
  196. package/dist/core/ingestion/languages/rust/interpret.js +18 -0
  197. package/dist/core/ingestion/languages/rust/query.js +9 -0
  198. package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
  199. package/dist/core/ingestion/languages/swift/captures.js +12 -0
  200. package/dist/core/ingestion/languages/typescript/captures.js +21 -0
  201. package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
  202. package/dist/core/ingestion/languages/typescript/query.js +37 -0
  203. package/dist/core/ingestion/markdown-processor.js +3 -2
  204. package/dist/core/ingestion/model/registration-table.js +1 -0
  205. package/dist/core/ingestion/parsing-processor.d.ts +3 -1
  206. package/dist/core/ingestion/parsing-processor.js +36 -1
  207. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  208. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  209. package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
  210. package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
  211. package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
  212. package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
  213. package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
  214. package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
  215. package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
  216. package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +16 -0
  217. package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
  218. package/dist/core/ingestion/pipeline.d.ts +4 -2
  219. package/dist/core/ingestion/pipeline.js +14 -2
  220. package/dist/core/ingestion/resolve-references.js +12 -0
  221. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
  222. package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
  223. package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
  224. package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
  225. package/dist/core/ingestion/scope-extractor.js +306 -43
  226. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
  227. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
  228. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
  229. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
  230. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
  231. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
  232. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
  233. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
  234. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
  235. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
  236. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
  237. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
  238. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
  239. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
  240. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
  241. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
  242. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
  243. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
  244. package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
  245. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
  246. package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
  247. package/dist/core/ingestion/taint/typescript-model.js +34 -2
  248. package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
  249. package/dist/core/ingestion/tree-sitter-queries.js +23 -2
  250. package/dist/core/ingestion/type-extractors/jvm.js +17 -2
  251. package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
  252. package/dist/core/ingestion/utils/ast-helpers.js +153 -2
  253. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
  254. package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
  255. package/dist/core/ingestion/utils/line-base.d.ts +20 -0
  256. package/dist/core/ingestion/utils/line-base.js +20 -0
  257. package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
  258. package/dist/core/ingestion/utils/symbol-labels.js +45 -0
  259. package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
  260. package/dist/core/ingestion/workers/parse-worker.js +40 -5
  261. package/dist/core/ingestion/workers/result-merge.js +4 -0
  262. package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
  263. package/dist/core/ingestion/workers/worker-pool.js +128 -28
  264. package/dist/core/lbug/csv-generator.d.ts +15 -0
  265. package/dist/core/lbug/csv-generator.js +124 -27
  266. package/dist/core/lbug/cypher-escape.d.ts +20 -0
  267. package/dist/core/lbug/cypher-escape.js +20 -0
  268. package/dist/core/lbug/extension-load-error.d.ts +67 -0
  269. package/dist/core/lbug/extension-load-error.js +326 -0
  270. package/dist/core/lbug/extension-loader.d.ts +17 -2
  271. package/dist/core/lbug/extension-loader.js +38 -13
  272. package/dist/core/lbug/lbug-adapter.d.ts +203 -2
  273. package/dist/core/lbug/lbug-adapter.js +527 -86
  274. package/dist/core/lbug/lbug-config.d.ts +56 -2
  275. package/dist/core/lbug/lbug-config.js +267 -7
  276. package/dist/core/lbug/move-columns.d.ts +7 -0
  277. package/dist/core/lbug/move-columns.js +86 -0
  278. package/dist/core/lbug/native-check.d.ts +40 -0
  279. package/dist/core/lbug/native-check.js +90 -0
  280. package/dist/core/lbug/node-table-layout.d.ts +29 -0
  281. package/dist/core/lbug/node-table-layout.js +119 -0
  282. package/dist/core/lbug/pool-adapter.d.ts +23 -1
  283. package/dist/core/lbug/pool-adapter.js +115 -8
  284. package/dist/core/lbug/schema.d.ts +4 -3
  285. package/dist/core/lbug/schema.js +16 -16
  286. package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
  287. package/dist/core/lbug/sidecar-recovery.js +418 -16
  288. package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
  289. package/dist/core/move/artifact-download.d.ts +19 -0
  290. package/dist/core/move/artifact-download.js +179 -0
  291. package/dist/core/move/compiler-facts.d.ts +120 -0
  292. package/dist/core/move/compiler-facts.js +9 -0
  293. package/dist/core/move/consistency.d.ts +74 -0
  294. package/dist/core/move/consistency.js +182 -0
  295. package/dist/core/move/constants.d.ts +98 -0
  296. package/dist/core/move/constants.js +136 -0
  297. package/dist/core/move/discovery.d.ts +10 -0
  298. package/dist/core/move/discovery.js +22 -0
  299. package/dist/core/move/entry-points.d.ts +14 -0
  300. package/dist/core/move/entry-points.js +40 -0
  301. package/dist/core/move/facts-mapper.d.ts +75 -0
  302. package/dist/core/move/facts-mapper.js +534 -0
  303. package/dist/core/move/install-lock.d.ts +14 -0
  304. package/dist/core/move/install-lock.js +102 -0
  305. package/dist/core/move/install.d.ts +39 -0
  306. package/dist/core/move/install.js +391 -0
  307. package/dist/core/move/mcp-client.d.ts +115 -0
  308. package/dist/core/move/mcp-client.js +436 -0
  309. package/dist/core/move/move-ingest.d.ts +52 -0
  310. package/dist/core/move/move-ingest.js +403 -0
  311. package/dist/core/move/provision.d.ts +19 -0
  312. package/dist/core/move/provision.js +91 -0
  313. package/dist/core/move/release.d.ts +6 -0
  314. package/dist/core/move/release.js +10 -0
  315. package/dist/core/move/symbol-id.d.ts +35 -0
  316. package/dist/core/move/symbol-id.js +65 -0
  317. package/dist/core/move/type-parser.d.ts +11 -0
  318. package/dist/core/move/type-parser.js +38 -0
  319. package/dist/core/platform/capabilities.d.ts +0 -1
  320. package/dist/core/platform/capabilities.js +39 -8
  321. package/dist/core/run-analyze.d.ts +9 -3
  322. package/dist/core/run-analyze.js +1002 -184
  323. package/dist/core/search/fts-indexes.d.ts +31 -0
  324. package/dist/core/search/fts-indexes.js +73 -0
  325. package/dist/core/search/fts-schema.js +2 -0
  326. package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
  327. package/dist/core/tree-sitter/safe-parse.js +21 -7
  328. package/dist/core/wiki/graph-queries.js +6 -5
  329. package/dist/core/wiki/llm-client.d.ts +8 -2
  330. package/dist/core/wiki/llm-client.js +41 -5
  331. package/dist/mcp/core/embedder.js +16 -2
  332. package/dist/mcp/http-transport.d.ts +5 -0
  333. package/dist/mcp/http-transport.js +19 -5
  334. package/dist/mcp/local/bean-metadata.d.ts +2 -0
  335. package/dist/mcp/local/bean-metadata.js +25 -0
  336. package/dist/mcp/local/line-display.d.ts +22 -0
  337. package/dist/mcp/local/line-display.js +3 -0
  338. package/dist/mcp/local/local-backend.d.ts +19 -1
  339. package/dist/mcp/local/local-backend.js +402 -155
  340. package/dist/mcp/local/pdg-impact.d.ts +5 -3
  341. package/dist/mcp/local/pdg-impact.js +5 -2
  342. package/dist/mcp/output-budget.d.ts +5 -0
  343. package/dist/mcp/output-budget.js +52 -0
  344. package/dist/mcp/read-only-policy.d.ts +12 -0
  345. package/dist/mcp/read-only-policy.js +102 -0
  346. package/dist/mcp/repository-policy.d.ts +34 -0
  347. package/dist/mcp/repository-policy.js +328 -0
  348. package/dist/mcp/resources.js +32 -5
  349. package/dist/mcp/server.d.ts +5 -2
  350. package/dist/mcp/server.js +29 -9
  351. package/dist/mcp/tools.d.ts +0 -8
  352. package/dist/mcp/tools.js +102 -5
  353. package/dist/server/analyze-job.d.ts +3 -0
  354. package/dist/server/analyze-job.js +17 -0
  355. package/dist/server/analyze-launch.d.ts +6 -0
  356. package/dist/server/analyze-launch.js +82 -6
  357. package/dist/server/analyze-worker-core.d.ts +2 -1
  358. package/dist/server/analyze-worker-core.js +5 -2
  359. package/dist/server/analyze-worker.js +29 -6
  360. package/dist/server/api.d.ts +30 -0
  361. package/dist/server/api.js +120 -34
  362. package/dist/server/mcp-http.d.ts +1 -1
  363. package/dist/server/mcp-http.js +4 -2
  364. package/dist/server/upload-ingest.js +2 -1
  365. package/dist/server/validation.js +2 -1
  366. package/dist/storage/git.d.ts +31 -0
  367. package/dist/storage/git.js +111 -1
  368. package/dist/storage/parse-cache.js +7 -1
  369. package/dist/storage/parsedfile-store.d.ts +8 -0
  370. package/dist/storage/parsedfile-store.js +165 -1
  371. package/dist/storage/repo-manager.d.ts +194 -2
  372. package/dist/storage/repo-manager.js +56 -1
  373. package/dist/types/pipeline.d.ts +7 -0
  374. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
  375. package/hooks/claude/gitnexus-hook.cjs +59 -9
  376. package/hooks/claude/pre-tool-use.sh +0 -0
  377. package/hooks/claude/session-start.sh +0 -0
  378. package/package.json +21 -15
  379. package/scripts/cross-platform-tests.ts +56 -0
  380. package/scripts/ensure-fts.ts +43 -0
  381. package/scripts/install-duckdb-extension.mjs +85 -24
  382. package/scripts/run-cross-platform.ts +61 -6
  383. package/scripts/shard-arg.ts +30 -0
  384. package/scripts/sync-plugin-manifests.mjs +192 -0
  385. package/skills/gitnexus-lfg/README.md +55 -0
  386. package/skills/gitnexus-lfg/SKILL.md +86 -0
  387. package/skills/gitnexus-plan/README.md +142 -0
  388. package/skills/gitnexus-plan/SKILL.md +348 -0
  389. package/skills/gitnexus-plan/references/context-ledger.md +137 -0
  390. package/skills/gitnexus-plan/references/context-pack.md +126 -0
  391. package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
  392. package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
  393. package/skills/gitnexus-plan/references/plan-template.md +201 -0
  394. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
  395. package/skills/gitnexus-review/SKILL.md +273 -0
  396. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
  397. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
  398. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
  399. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
  400. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
  401. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
  402. package/skills/gitnexus-work/README.md +71 -0
  403. package/skills/gitnexus-work/SKILL.md +269 -0
  404. package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
  405. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
  406. package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
  407. package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
  408. package/web/assets/agent-Bqxn-abU.js +626 -0
  409. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
  410. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
  411. package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
  412. package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
  413. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
  414. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
  415. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
  416. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
  417. package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
  418. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
  419. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
  420. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
  421. package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
  422. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
  423. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
  424. package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
  425. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
  426. package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
  427. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
  428. package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
  429. package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
  430. package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
  431. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
  432. package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
  433. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
  434. package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
  435. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
  436. package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
  437. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
  438. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
  439. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
  440. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
  441. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
  442. package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
  443. package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
  444. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
  445. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
  446. package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
  447. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
  448. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
  449. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
  450. package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
  451. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
  452. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
  453. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
  454. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
  455. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
  456. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
  457. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
  458. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
  459. package/web/assets/index-CX_fADmQ.css +2 -0
  460. package/web/assets/index-D1Z3dGGz.js +575 -0
  461. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
  462. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
  463. package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
  464. package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
  465. package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
  466. package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
  467. package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
  468. package/web/assets/node-Ct_zna8U.js +8 -0
  469. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
  470. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
  471. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
  472. package/web/assets/preload-helper-Czpn1I53.js +1 -0
  473. package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
  474. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
  475. package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
  476. package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  477. package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
  478. package/web/assets/sdk-CzHHH8tD.js +37 -0
  479. package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
  480. package/web/assets/src-JV30wyV8.js +1 -0
  481. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
  482. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
  483. package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
  484. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
  485. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
  486. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
  487. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
  488. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
  489. package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
  490. package/web/index.html +18 -10
  491. package/skills/gitnexus-pr-review.md +0 -163
  492. package/web/assets/agent-Dli_x7bU.js +0 -660
  493. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
  494. package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
  495. package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
  496. package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
  497. package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
  498. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
  499. package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
  500. package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
  501. package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
  502. package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
  503. package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
  504. package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
  505. package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
  506. package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
  507. package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
  508. package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
  509. package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
  510. package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
  511. package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
  512. package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
  513. package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
  514. package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
  515. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
  516. package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
  517. package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
  518. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
  519. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
  520. package/web/assets/index-KctnI3Vq.js +0 -635
  521. package/web/assets/index-_lgn7hs5.css +0 -2
  522. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
  523. package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
  524. package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
  525. package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
  526. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
  527. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
  528. package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
  529. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
  530. package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
  531. package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
  532. package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
  533. package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
  534. package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
  535. package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
  536. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
  537. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
  538. package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
  539. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
  540. package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
@@ -39,8 +39,15 @@ export declare function resolveNativeSafeStorageDir(storagePath: string, subdir:
39
39
  * `true` (0.16.0). Existing call sites that relied on the positional
40
40
  * default must now pass `false` explicitly to preserve behaviour.
41
41
  *
42
- * Putting both in one shared module guarantees every `new lbug.Database(...)`
43
- * call site agrees on the same ceiling and behaviour.
42
+ * 3. `bufferManagerSize` (not a 0.16.0 change, same pin-explicitly
43
+ * principle): `0` means "native default", and the native default buffer
44
+ * pool is 80% of physical RAM. A long-lived `gitnexus mcp` process or a
45
+ * large incremental analyze can balloon to that ceiling and OOM-kill the
46
+ * host session (#2557), so GitNexus pins an explicit bounded pool — see
47
+ * `resolveBufferManagerSize`.
48
+ *
49
+ * Putting these in one shared module guarantees every `new lbug.Database(...)`
50
+ * call site agrees on the same ceilings and behaviour.
44
51
  */
45
52
  /**
46
53
  * Upper bound for any single GitNexus LadybugDB file (graph index, group
@@ -54,6 +61,16 @@ export declare function resolveNativeSafeStorageDir(storagePath: string, subdir:
54
61
  */
55
62
  export declare const LBUG_MAX_DB_SIZE: number;
56
63
  export declare const parseWalCheckpointThreshold: (raw: string | undefined) => number | undefined;
64
+ /**
65
+ * Size the buffer pool to an estimated graph size (node + relationship count),
66
+ * clamped to [ADAPTIVE_POOL_FLOOR, defaultBufferPoolSize()]. The estimate can
67
+ * only *shrink* the pool from the default — never above the 2 GiB / 80%-RAM cap,
68
+ * never below the COPY-safety floor — so no repo is under-sized or gets more
69
+ * than the default it would have today.
70
+ */
71
+ export declare const estimateBufferPool: (graphElementCount: number) => number;
72
+ /** Set (bytes) or clear (`undefined`) the per-run buffer-pool size hint. */
73
+ export declare const setBufferPoolSizeHint: (bytes: number | undefined) => void;
57
74
  export declare const WAL_RECOVERY_SUGGESTION = "WAL corruption detected. Run `gitnexus analyze --force` to rebuild the index.";
58
75
  export declare function isWalCorruptionError(err: unknown): boolean;
59
76
  /**
@@ -62,6 +79,31 @@ export declare function isWalCorruptionError(err: unknown): boolean;
62
79
  * back to the permissive matcher.
63
80
  */
64
81
  export declare const isLbugCheckpointIoError: (err: unknown) => boolean;
82
+ /**
83
+ * True when `err` looks like the LadybugDB buffer manager failing to release
84
+ * frame memory — the failure mode of a 4 KiB page-size assumption on a
85
+ * 16 KiB/64 KiB-page kernel (#1231). Deliberately does NOT match the
86
+ * generic "buffer pool is full" exhaustion error, which is a sizing
87
+ * problem, not a page-size one.
88
+ */
89
+ export declare const isLbugPageSizeFrameError: (err: unknown) => boolean;
90
+ /**
91
+ * True when the given `@ladybugdb/core` version contains the runtime
92
+ * OS-page-size detection introduced in 0.18.0 (see the matcher comment
93
+ * above). Unknown/unparseable versions return false so callers err on the
94
+ * side of showing the upgrade hint.
95
+ */
96
+ export declare const isPageSizeAwareLadybug: (version: string | undefined) => boolean;
97
+ /**
98
+ * OS memory page size in bytes, or `undefined` when it cannot be determined
99
+ * (Windows, missing getconf, sandboxed exec). Node exposes no page-size API,
100
+ * so this shells out to POSIX `getconf PAGE_SIZE` — same execFileSync shape
101
+ * as the Windows 8.3 short-path probe above, but with a tighter timeout and
102
+ * an explicit killSignal (see the options comment below).
103
+ */
104
+ export declare const getOsPageSize: () => number | undefined;
105
+ /** Exported only for unit tests — clears the getconf probe cache. */
106
+ export declare const _resetOsPageSizeCacheForTest: () => void;
65
107
  type LbugModule = typeof lbug;
66
108
  export interface LbugDatabaseOptions {
67
109
  readOnly?: boolean;
@@ -86,6 +128,15 @@ export interface LbugConnectionHandle {
86
128
  * import directly from this module — no re-export to keep in sync.
87
129
  */
88
130
  export declare const isDbBusyError: (err: unknown) => boolean;
131
+ /**
132
+ * True when a WAL-checkpoint IO error ALSO carries a busy/lock signal — the
133
+ * rotation failed because another handle (a `gitnexus mcp` server, or this
134
+ * process's own reader) holds the store's WAL open, rather than a permanent
135
+ * disk error. Reuses `isDbBusyError`'s already-tested keyword set instead of a
136
+ * fresh regex, so an unmatched message degrades to "IO error" rather than
137
+ * silently claiming a held-open cause. (#2599)
138
+ */
139
+ export declare const isLbugCheckpointBusyError: (err: unknown) => boolean;
89
140
  /** See {@link classifyDeleteAllError}. */
90
141
  export type DeleteAllErrorClass = 'benign-missing-table' | 'rethrow';
91
142
  /**
@@ -108,6 +159,8 @@ export type DeleteAllErrorClass = 'benign-missing-table' | 'rethrow';
108
159
  */
109
160
  export declare const classifyDeleteAllError: (err: unknown) => DeleteAllErrorClass;
110
161
  export declare function createLbugDatabase(lbugModule: LbugModule, databasePath: string, options?: LbugDatabaseOptions): lbug.Database;
162
+ export declare const HANDLE_RELEASE_PROBE_ATTEMPTS = 5;
163
+ export declare const HANDLE_RELEASE_PROBE_DELAY_MS = 50;
111
164
  /**
112
165
  * Marker symbol attached to lock errors after `openWithLockRetry` exhausts
113
166
  * its budget. `withLbugDb`'s outer query-time retry consults this so it
@@ -121,6 +174,7 @@ export declare const LBUG_OPEN_RETRY_EXHAUSTED: unique symbol;
121
174
  export declare const isOpenRetryExhausted: (err: unknown) => boolean;
122
175
  /** Exported only for direct unit testing — production callers use `openWithLockRetry`. */
123
176
  export declare const _isTestFixturePathForTest: (dbPath: string) => boolean;
177
+ export declare const sleep: (ms: number) => Promise<void>;
124
178
  export declare function openLbugConnection(lbugModule: LbugModule, databasePath: string, options?: LbugDatabaseOptions): Promise<LbugConnectionHandle>;
125
179
  export declare function closeLbugConnection(handle: LbugConnectionHandle): Promise<void>;
126
180
  /**
@@ -227,8 +227,15 @@ export function resolveNativeSafeStorageDir(storagePath, subdir) {
227
227
  * `true` (0.16.0). Existing call sites that relied on the positional
228
228
  * default must now pass `false` explicitly to preserve behaviour.
229
229
  *
230
- * Putting both in one shared module guarantees every `new lbug.Database(...)`
231
- * call site agrees on the same ceiling and behaviour.
230
+ * 3. `bufferManagerSize` (not a 0.16.0 change, same pin-explicitly
231
+ * principle): `0` means "native default", and the native default buffer
232
+ * pool is 80% of physical RAM. A long-lived `gitnexus mcp` process or a
233
+ * large incremental analyze can balloon to that ceiling and OOM-kill the
234
+ * host session (#2557), so GitNexus pins an explicit bounded pool — see
235
+ * `resolveBufferManagerSize`.
236
+ *
237
+ * Putting these in one shared module guarantees every `new lbug.Database(...)`
238
+ * call site agrees on the same ceilings and behaviour.
232
239
  */
233
240
  /**
234
241
  * Upper bound for any single GitNexus LadybugDB file (graph index, group
@@ -286,6 +293,116 @@ const resolveCheckpointThreshold = () => {
286
293
  }
287
294
  return DEFAULT_WAL_CHECKPOINT_THRESHOLD;
288
295
  };
296
+ /**
297
+ * Default ceiling for the LadybugDB buffer pool in bytes (#2557).
298
+ *
299
+ * The pool is a page cache with eviction, so the ceiling trades throughput
300
+ * on very large working sets for a machine that stays alive: 2 GiB is
301
+ * ~40× the GitNexus self-index, while the native 80%-of-RAM default let a
302
+ * `detect_changes` call grow a 105 MiB on-disk index to 19.5 GiB RSS and
303
+ * OOM-kill the reporter's session. The `min` with 80% of `os.totalmem()`
304
+ * keeps sub-2.5-GiB machines at the native-equivalent bound (no regression
305
+ * there); the 64 MiB floor keeps tiny containers above any plausible
306
+ * native minimum pool size.
307
+ */
308
+ const DEFAULT_BUFFER_POOL_CAP = 2 * 1024 * 1024 * 1024;
309
+ const BUFFER_POOL_FLOOR = 64 * 1024 * 1024;
310
+ // COPY-safety floor for the adaptive hint (below). LadybugDB's bulk COPY needs
311
+ // working buffer-pool memory that scales with the repo: a 64 MiB pool fails
312
+ // ("buffer pool is full and no memory could be freed") on any non-trivial repo,
313
+ // and even the ~1800-file GitNexus checkout needs ≥256 MiB. COPY working
314
+ // memory also scales with schema width (buffer pages are held per column):
315
+ // the Move node tables (main-aptos) add dozens of columns across Function/
316
+ // Struct/Enum/EnumVariant/Const/Module, and a 256 MiB pool deterministically
317
+ // fails their COPY on @ladybugdb/core 0.18.3 even for tiny fixtures
318
+ // (incremental-dirty-recovery reproduces it; 512 MiB passes). So the adaptive
319
+ // size never drops a repo below this — a distinct, higher floor than
320
+ // BUFFER_POOL_FLOOR, which only guards defaultBufferPoolSize on tiny-RAM
321
+ // machines. It is still clamped up to defaultBufferPoolSize, so a machine whose
322
+ // default is below this floor keeps its default rather than over-committing.
323
+ const ADAPTIVE_POOL_FLOOR = 512 * 1024 * 1024;
324
+ const parseBufferPoolSize = (raw) => {
325
+ if (raw === undefined)
326
+ return undefined;
327
+ const normalized = raw.trim();
328
+ if (normalized.length === 0)
329
+ return undefined;
330
+ const parsed = Number(normalized);
331
+ if (!Number.isFinite(parsed) || parsed < 0)
332
+ return undefined;
333
+ return Math.floor(parsed);
334
+ };
335
+ const defaultBufferPoolSize = () => Math.min(DEFAULT_BUFFER_POOL_CAP, Math.max(BUFFER_POOL_FLOOR, Math.floor(os.totalmem() * 0.8)));
336
+ /**
337
+ * Clamp an adaptive pool request to [ADAPTIVE_POOL_FLOOR, default]. The lower
338
+ * bound keeps LadybugDB's COPY viable; the upper bound (defaultBufferPoolSize)
339
+ * means the hint can only shrink the pool from today's default and can never
340
+ * exceed the 2 GiB / 80%-RAM cap — and on a machine whose default is below the
341
+ * COPY floor, the default wins, so the pool is never over-committed.
342
+ */
343
+ const clampBufferPool = (bytes) => Math.min(defaultBufferPoolSize(), Math.max(ADAPTIVE_POOL_FLOOR, Math.floor(bytes)));
344
+ /**
345
+ * Buffer-pool bytes to provision per graph element (node + relationship).
346
+ *
347
+ * The fixed 2 GiB default is far larger than most repos' working set, and
348
+ * LadybugDB eagerly commits the pool at DB open — measured: a full
349
+ * `analyze --force` of the GitNexus checkout takes ~51 s with the 2 GiB pool
350
+ * vs ~35 s with the ~414 MiB this factor yields (31% faster; the oversized
351
+ * pool's commit dominates). The pool is a page cache over the on-disk index,
352
+ * which scales with node/edge count, so a per-element budget sizes it to the
353
+ * repo. Kept generous so the whole index stays resident (no COPY thrash) and
354
+ * always clamped to at least ADAPTIVE_POOL_FLOOR; tuned by timing a real
355
+ * large-repo `analyze --force` at this factor vs a forced 2 GiB pool (the pool
356
+ * is a native eager allocation, measured with a real analyze, not a build-free
357
+ * bench — see the emit-path COPY timing note in bench/emit-persistence).
358
+ */
359
+ const POOL_BYTES_PER_ELEMENT = 4 * 1024;
360
+ /**
361
+ * Size the buffer pool to an estimated graph size (node + relationship count),
362
+ * clamped to [ADAPTIVE_POOL_FLOOR, defaultBufferPoolSize()]. The estimate can
363
+ * only *shrink* the pool from the default — never above the 2 GiB / 80%-RAM cap,
364
+ * never below the COPY-safety floor — so no repo is under-sized or gets more
365
+ * than the default it would have today.
366
+ */
367
+ export const estimateBufferPool = (graphElementCount) => clampBufferPool(graphElementCount * POOL_BYTES_PER_ELEMENT);
368
+ /**
369
+ * Optional per-run buffer-pool size hint (bytes). The analyze orchestrator sets
370
+ * it once the graph size is known (after the pipeline, before the DB open) so
371
+ * the pool is sized to the repo instead of the fixed 2 GiB default, and clears
372
+ * it at run end. Non-analyze opens (MCP serve, `native-check` `:memory:`) never
373
+ * set it and keep the default.
374
+ */
375
+ let bufferPoolSizeHint;
376
+ /** Set (bytes) or clear (`undefined`) the per-run buffer-pool size hint. */
377
+ export const setBufferPoolSizeHint = (bytes) => {
378
+ bufferPoolSizeHint = bytes;
379
+ };
380
+ /**
381
+ * Resolve the `bufferManagerSize` passed to every `new lbug.Database(...)`.
382
+ * `GITNEXUS_LBUG_BUFFER_POOL_SIZE` (bytes) overrides everything; `0` is a
383
+ * deliberate escape hatch that restores LadybugDB's native unbounded
384
+ * 80%-of-RAM default. With no env override, a per-run `setBufferPoolSizeHint`
385
+ * (clamped to [floor, default]) sizes the pool to the repo; otherwise the
386
+ * default. Resolved at call time (not module load) so tests can stub the env
387
+ * var, the hint, and `os.totalmem`.
388
+ */
389
+ const resolveBufferManagerSize = () => {
390
+ const raw = process.env.GITNEXUS_LBUG_BUFFER_POOL_SIZE;
391
+ if (raw === undefined) {
392
+ return bufferPoolSizeHint !== undefined
393
+ ? clampBufferPool(bufferPoolSizeHint)
394
+ : defaultBufferPoolSize();
395
+ }
396
+ const parsed = parseBufferPoolSize(raw);
397
+ if (parsed !== undefined)
398
+ return parsed;
399
+ // Non-empty but unparseable input: warn the operator and fall back —
400
+ // mirrors the GITNEXUS_WAL_CHECKPOINT_THRESHOLD env path above.
401
+ if (raw.trim().length > 0) {
402
+ logger.warn({ rawValue: raw, fallback: defaultBufferPoolSize() }, `Ignoring invalid GITNEXUS_LBUG_BUFFER_POOL_SIZE=${raw}; expected integer >= 0 (bytes; 0 restores the native 80%-of-RAM default); falling back to min(2 GiB, 80% of RAM).`);
403
+ }
404
+ return defaultBufferPoolSize();
405
+ };
289
406
  /** Matches WAL corruption errors from the LadybugDB engine. */
290
407
  const WAL_CORRUPTION_RE = /corrupt(ed)?\s+wal|invalid\s+wal\s+record|wal.*corrupt|checksum.*wal/i;
291
408
  export const WAL_RECOVERY_SUGGESTION = 'WAL corruption detected. Run `gitnexus analyze --force` to rebuild the index.';
@@ -337,6 +454,106 @@ export const isLbugCheckpointIoError = (err) => {
337
454
  return true;
338
455
  return LBUG_CHECKPOINT_PERMISSIVE_RE.test(msg);
339
456
  };
457
+ // ─── Ladybug non-4K page-size frame-release matcher (#1231) ─────────────────
458
+ //
459
+ // LadybugDB <= 0.17.x hardcoded a 4 KiB OS-page assumption in its buffer
460
+ // manager: evicting a frame released physical memory with
461
+ // `madvise(frame, frameSize, MADV_DONTNEED)` on 4 KiB-aligned frame
462
+ // addresses (verified by disassembling `VMRegion::releaseFrame` in
463
+ // @ladybugdb/core-linux-arm64 0.17.1 — `mov w2, #0x4` = MADV_DONTNEED,
464
+ // throw on non-zero return). On kernels with 16 KiB pages (Raspberry Pi 5
465
+ // default 2712 kernel, Asahi Linux) or 64 KiB pages (some enterprise arm64
466
+ // distros), madvise rejects addresses that are not multiples of the real
467
+ // page size with EINVAL, surfacing as:
468
+ // "Buffer manager exception: Releasing physical memory associated with a
469
+ // frame failed with error code -1: Invalid argument."
470
+ // which aborts `gitnexus analyze` mid-COPY.
471
+ //
472
+ // @ladybugdb/core 0.18.0 rewrote the release path with runtime OS-page-size
473
+ // detection and discard-granule-aligned madvise (new binary strings:
474
+ // "Failed to detect the operating system page size.", "Unsupported page
475
+ // size combination: frame size {}, discard granule size {}, frame group
476
+ // size {}."), so upgrading is the fix. The residual 0.18.0 guard
477
+ // ("Unsupported page size combination") is matched here too so exotic
478
+ // configurations receive the same actionable guidance instead of a raw
479
+ // native message.
480
+ const LBUG_FRAME_RELEASE_RE = /releasing physical memory associated with a frame failed/i;
481
+ const LBUG_PAGE_COMBO_RE = /unsupported page size combination/i;
482
+ /**
483
+ * True when `err` looks like the LadybugDB buffer manager failing to release
484
+ * frame memory — the failure mode of a 4 KiB page-size assumption on a
485
+ * 16 KiB/64 KiB-page kernel (#1231). Deliberately does NOT match the
486
+ * generic "buffer pool is full" exhaustion error, which is a sizing
487
+ * problem, not a page-size one.
488
+ */
489
+ export const isLbugPageSizeFrameError = (err) => {
490
+ if (!err)
491
+ return false;
492
+ const msg = err instanceof Error ? err.message : String(err);
493
+ return LBUG_FRAME_RELEASE_RE.test(msg) || LBUG_PAGE_COMBO_RE.test(msg);
494
+ };
495
+ /**
496
+ * True when the given `@ladybugdb/core` version contains the runtime
497
+ * OS-page-size detection introduced in 0.18.0 (see the matcher comment
498
+ * above). Unknown/unparseable versions return false so callers err on the
499
+ * side of showing the upgrade hint.
500
+ */
501
+ export const isPageSizeAwareLadybug = (version) => {
502
+ if (!version)
503
+ return false;
504
+ const m = /^(\d+)\.(\d+)/.exec(version.trim());
505
+ if (!m)
506
+ return false;
507
+ const major = Number(m[1]);
508
+ const minor = Number(m[2]);
509
+ return major > 0 || minor >= 18;
510
+ };
511
+ // `undefined` = not probed yet; `null` = probed and unavailable. Cached
512
+ // because analyze error paths and doctor may both ask, and getconf forks.
513
+ let cachedOsPageSize;
514
+ /**
515
+ * OS memory page size in bytes, or `undefined` when it cannot be determined
516
+ * (Windows, missing getconf, sandboxed exec). Node exposes no page-size API,
517
+ * so this shells out to POSIX `getconf PAGE_SIZE` — same execFileSync shape
518
+ * as the Windows 8.3 short-path probe above, but with a tighter timeout and
519
+ * an explicit killSignal (see the options comment below).
520
+ */
521
+ export const getOsPageSize = () => {
522
+ if (cachedOsPageSize !== undefined)
523
+ return cachedOsPageSize ?? undefined;
524
+ if (process.platform === 'win32') {
525
+ // Windows allocation granularity is not what madvise alignment is about;
526
+ // the #1231 failure mode is POSIX-only.
527
+ cachedOsPageSize = null;
528
+ return undefined;
529
+ }
530
+ try {
531
+ // killSignal SIGKILL (first use in this repo): the default SIGTERM is
532
+ // catchable, so a signal-trapping child held the "5s" timeout for 9s in
533
+ // review reproduction — SIGKILL makes the timeout real for everything
534
+ // except a child stuck in uninterruptible I/O (D state). 2000ms, not
535
+ // 5000: doctor runs this probe on its happy path and real getconf
536
+ // answers in ~2ms, but keep margin for loaded Pi-class hardware — a
537
+ // too-tight ceiling would silently drop the very #1231 diagnostics this
538
+ // probe exists to provide (the catch caches the failure). (#2424 review)
539
+ const out = execFileSync('getconf', ['PAGE_SIZE'], {
540
+ encoding: 'utf-8',
541
+ timeout: 2000,
542
+ killSignal: 'SIGKILL',
543
+ stdio: ['ignore', 'pipe', 'pipe'],
544
+ });
545
+ const parsed = Number(out.trim());
546
+ cachedOsPageSize = Number.isInteger(parsed) && parsed > 0 ? parsed : null;
547
+ }
548
+ catch {
549
+ cachedOsPageSize = null;
550
+ }
551
+ return cachedOsPageSize ?? undefined;
552
+ };
553
+ /** Exported only for unit tests — clears the getconf probe cache. */
554
+ export const _resetOsPageSizeCacheForTest = () => {
555
+ cachedOsPageSize = undefined;
556
+ };
340
557
  /**
341
558
  * Return true when the error message indicates that a LadybugDB write
342
559
  * transaction could not proceed due to lock contention — either a file
@@ -370,6 +587,27 @@ export const isDbBusyError = (err) => {
370
587
  msg.includes('already in use') ||
371
588
  msg.includes('only one write transaction at a time'));
372
589
  };
590
+ /**
591
+ * True when a WAL-checkpoint IO error ALSO carries a busy/lock signal — the
592
+ * rotation failed because another handle (a `gitnexus mcp` server, or this
593
+ * process's own reader) holds the store's WAL open, rather than a permanent
594
+ * disk error. Reuses `isDbBusyError`'s already-tested keyword set instead of a
595
+ * fresh regex, so an unmatched message degrades to "IO error" rather than
596
+ * silently claiming a held-open cause. (#2599)
597
+ */
598
+ export const isLbugCheckpointBusyError = (err) => {
599
+ if (!isLbugCheckpointIoError(err))
600
+ return false;
601
+ // Anchor to real held-open wording rather than isDbBusyError's broad
602
+ // `.includes('lock')`, which matches the DB PATH embedded in the checkpoint
603
+ // error message (e.g. a repo under `blockchain-app`) and would misclassify a
604
+ // pure disk fault as held-open (#2614 LOW).
605
+ const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
606
+ return (msg.includes('could not set lock') ||
607
+ msg.includes('lock is held') ||
608
+ msg.includes('being used by another process') ||
609
+ msg.includes('is busy'));
610
+ };
373
611
  /**
374
612
  * Classify an error thrown while clearing all relationships of one type
375
613
  * before an incremental re-write (`deleteAllRelationshipsOfType` in
@@ -396,7 +634,7 @@ export const classifyDeleteAllError = (err) => {
396
634
  };
397
635
  export function createLbugDatabase(lbugModule, databasePath, options = {}) {
398
636
  // .d.ts declares fewer args than the native constructor accepts.
399
- return new lbugModule.Database(databasePath, 0, // bufferManagerSize
637
+ return new lbugModule.Database(databasePath, resolveBufferManagerSize(), // bufferManagerSize (#2557: default min(2 GiB, 80% RAM); GITNEXUS_LBUG_BUFFER_POOL_SIZE overrides; 0 restores the native 80%-of-RAM default)
400
638
  false, // enableCompression (pinned for v0.16.0)
401
639
  options.readOnly ?? false, LBUG_MAX_DB_SIZE, true, // autoCheckpoint (always on)
402
640
  resolveCheckpointThreshold(), // checkpointThreshold (default 64 MiB; override with GITNEXUS_WAL_CHECKPOINT_THRESHOLD; -1 keeps Ladybug stock ~16 MiB)
@@ -411,7 +649,10 @@ export function createLbugDatabase(lbugModule, databasePath, options = {}) {
411
649
  // 1. OPEN_LOCK_RETRY_ATTEMPTS / OPEN_LOCK_RETRY_DELAY_MS (this file)
412
650
  // → `new lbug.Database()` constructor lock failures
413
651
  // 2. HANDLE_RELEASE_PROBE_ATTEMPTS / HANDLE_RELEASE_PROBE_DELAY_MS (this file)
414
- // → post-close fs.open probe to absorb Windows handle-release lag
652
+ // → post-close fs.open probe to absorb Windows handle-release lag; also
653
+ // the shared budget for wipeLbugDbFiles' ENOENT-verified removal
654
+ // (lbug-adapter.ts) and the dirty-recovery sidecar park's
655
+ // rename/rm retries (sidecar-recovery.ts) — same lock class
415
656
  // 3. DB_LOCK_RETRY_ATTEMPTS / DB_LOCK_RETRY_DELAY_MS (lbug-adapter.ts withLbugDb)
416
657
  // → query-time busy/lock retry around already-open connections
417
658
  //
@@ -429,9 +670,26 @@ export function createLbugDatabase(lbugModule, databasePath, options = {}) {
429
670
  // matches on is unchanged.)
430
671
  const OPEN_LOCK_RETRY_ATTEMPTS = 5;
431
672
  const OPEN_LOCK_RETRY_DELAY_MS = 100;
432
- const HANDLE_RELEASE_PROBE_ATTEMPTS = 5;
433
- const HANDLE_RELEASE_PROBE_DELAY_MS = 50;
673
+ // Exported (this shipping review, FIX 1/2): the dirty-recovery sidecar park
674
+ // (sidecar-recovery.ts) and the ENOENT-verified wipe (lbug-adapter.ts
675
+ // wipeLbugDbFiles) retry the SAME Windows handle-release/AV lock class, and
676
+ // their previous private mirror constants were documentation-coupled copies
677
+ // that could drift from this tuning-knob registry silently.
678
+ export const HANDLE_RELEASE_PROBE_ATTEMPTS = 5;
679
+ export const HANDLE_RELEASE_PROBE_DELAY_MS = 50;
434
680
  const HANDLE_RELEASE_LOCK_CODES = new Set(['EBUSY', 'EPERM', 'EACCES']);
681
+ // Retry-budget registry, part 2 (retry-budget consolidation): the remaining
682
+ // open-time lock retries live next to their call sites but are catalogued here
683
+ // so all lbug retry budgets surface in one grep. They retry the same lock class
684
+ // as 1–3 ("Could not set lock" while a writer rebuilds the index):
685
+ // 4. LOCK_RETRY_ATTEMPTS / LOCK_RETRY_DELAY_MS (pool-adapter.ts)
686
+ // → read pool's read-only open while `gitnexus analyze` is writing
687
+ // (3 attempts, linear 2s·n back-off ≈ 6s total)
688
+ // 5. LBUG_OPEN_RETRY_ATTEMPTS / _BASE_MS / _MAX_MS (group/bridge-db.ts)
689
+ // → cross-repo bridge RO open race (10 attempts, linear 100ms·n capped
690
+ // at 500ms ≈ 3.5s total)
691
+ // Kept in-file (not moved here) so explicit `lbug-config` test mocks don't have
692
+ // to enumerate them; change a budget in its call site and update this catalogue.
435
693
  /**
436
694
  * Test-fixture directory prefixes recognized by `isTestFixturePath`.
437
695
  *
@@ -492,7 +750,9 @@ const isTestFixturePath = (dbPath) => {
492
750
  };
493
751
  /** Exported only for direct unit testing — production callers use `openWithLockRetry`. */
494
752
  export const _isTestFixturePathForTest = isTestFixturePath;
495
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
753
+ // Exported alongside HANDLE_RELEASE_PROBE_* (this shipping review, FIX 1/2)
754
+ // so the consumers of the shared retry budget do not each grow a private copy.
755
+ export const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
496
756
  /**
497
757
  * Attempt to remove stale `.wal` / `.lock` sidecars that a previous aborted
498
758
  * test run may have left behind. Best-effort: ENOENT is normal, anything
@@ -0,0 +1,7 @@
1
+ export declare const CODE_ELEMENT_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "isExported", "content", "description"];
2
+ export declare const MULTI_LANG_BASE_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "content", "description"];
3
+ export declare const MOVE_FUNCTION_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "isExported", "content", "description", "language", "qualifiedName", "moduleQualifiedName", "visibility", "visibilityModifier", "isEntry", "isView", "isInline", "isNative", "parameterCount", "returnType", "acquires", "usedTypes", "attributes", "attributesJson", "typeParamsJson", "locationFidelity"];
4
+ export declare const MOVE_STRUCT_LIKE_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "content", "description", "language", "qualifiedName", "moduleQualifiedName", "moduleAddress", "abilities", "isResource", "isEvent", "fieldList", "attributes", "attributesJson", "typeParamsJson", "moveDeclarationKind", "locationFidelity"];
5
+ export declare const MOVE_ENUM_VARIANT_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "content", "description", "language", "qualifiedName", "parentEnum", "moduleQualifiedName", "variantKind", "fieldsJson", "attributes", "attributesJson", "locationFidelity"];
6
+ export declare const MOVE_CONST_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "content", "description", "language", "qualifiedName", "moduleQualifiedName", "constType", "constValue", "isErrorCode", "locationFidelity"];
7
+ export declare const MOVE_MODULE_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "content", "description", "language", "qualifiedName", "moduleAddress", "attributes", "attributesJson", "locationFidelity"];
@@ -0,0 +1,86 @@
1
+ export const CODE_ELEMENT_COLUMNS = [
2
+ 'id',
3
+ 'name',
4
+ 'filePath',
5
+ 'startLine',
6
+ 'endLine',
7
+ 'isExported',
8
+ 'content',
9
+ 'description',
10
+ ];
11
+ export const MULTI_LANG_BASE_COLUMNS = [
12
+ 'id',
13
+ 'name',
14
+ 'filePath',
15
+ 'startLine',
16
+ 'endLine',
17
+ 'content',
18
+ 'description',
19
+ ];
20
+ export const MOVE_FUNCTION_COLUMNS = [
21
+ ...CODE_ELEMENT_COLUMNS,
22
+ 'language',
23
+ 'qualifiedName',
24
+ 'moduleQualifiedName',
25
+ 'visibility',
26
+ 'visibilityModifier',
27
+ 'isEntry',
28
+ 'isView',
29
+ 'isInline',
30
+ 'isNative',
31
+ 'parameterCount',
32
+ 'returnType',
33
+ 'acquires',
34
+ 'usedTypes',
35
+ 'attributes',
36
+ 'attributesJson',
37
+ 'typeParamsJson',
38
+ 'locationFidelity',
39
+ ];
40
+ export const MOVE_STRUCT_LIKE_COLUMNS = [
41
+ ...MULTI_LANG_BASE_COLUMNS,
42
+ 'language',
43
+ 'qualifiedName',
44
+ 'moduleQualifiedName',
45
+ 'moduleAddress',
46
+ 'abilities',
47
+ 'isResource',
48
+ 'isEvent',
49
+ 'fieldList',
50
+ 'attributes',
51
+ 'attributesJson',
52
+ 'typeParamsJson',
53
+ 'moveDeclarationKind',
54
+ 'locationFidelity',
55
+ ];
56
+ export const MOVE_ENUM_VARIANT_COLUMNS = [
57
+ ...MULTI_LANG_BASE_COLUMNS,
58
+ 'language',
59
+ 'qualifiedName',
60
+ 'parentEnum',
61
+ 'moduleQualifiedName',
62
+ 'variantKind',
63
+ 'fieldsJson',
64
+ 'attributes',
65
+ 'attributesJson',
66
+ 'locationFidelity',
67
+ ];
68
+ export const MOVE_CONST_COLUMNS = [
69
+ ...MULTI_LANG_BASE_COLUMNS,
70
+ 'language',
71
+ 'qualifiedName',
72
+ 'moduleQualifiedName',
73
+ 'constType',
74
+ 'constValue',
75
+ 'isErrorCode',
76
+ 'locationFidelity',
77
+ ];
78
+ export const MOVE_MODULE_COLUMNS = [
79
+ ...MULTI_LANG_BASE_COLUMNS,
80
+ 'language',
81
+ 'qualifiedName',
82
+ 'moduleAddress',
83
+ 'attributes',
84
+ 'attributesJson',
85
+ 'locationFidelity',
86
+ ];
@@ -4,3 +4,43 @@ export interface NativeCheckResult {
4
4
  message?: string;
5
5
  }
6
6
  export declare function checkLbugNative(overridePkgDir?: string): NativeCheckResult;
7
+ export interface FtsProbeResult {
8
+ loaded: boolean;
9
+ /** Collapsed LadybugDB error when `loaded` is false. */
10
+ reason?: string;
11
+ }
12
+ /** Same shape for every optional extension; `FtsProbeResult` is the legacy name. */
13
+ export type ExtensionProbeResult = FtsProbeResult;
14
+ /**
15
+ * Live-probe `LOAD EXTENSION fts` on a throwaway in-memory database.
16
+ *
17
+ * `doctor` used to print the static platform capability, which contradicted
18
+ * analyze whenever the extension file was missing or unloadable (#2374).
19
+ * LOAD never touches the network, so the probe is safe offline, and it
20
+ * surfaces LadybugDB's real error — which distinguishes a missing extension
21
+ * file from a present-but-broken one (wrong platform, truncated download).
22
+ * Dynamic import so doctor still runs when the native module itself is broken.
23
+ *
24
+ * Bounded by `timeoutMs`: an unresponsive extension file (e.g. on a hung
25
+ * network home dir) must never freeze `doctor` — the tool the degradation
26
+ * warnings send users to. `Promise.race` lets doctor report and move on; it
27
+ * cannot cancel an in-flight native call, so a future thread-blocking case
28
+ * would need an out-of-process probe.
29
+ */
30
+ export declare function probeFtsExtensionLoad(timeoutMs?: number): Promise<FtsProbeResult>;
31
+ /**
32
+ * Live-probe `LOAD EXTENSION vector`, the VECTOR counterpart of the FTS probe.
33
+ *
34
+ * Needed for the same reason #2374 needed the FTS one, and reported the same
35
+ * way: #2623's reporter saw `doctor` print `VECTOR index: available` while
36
+ * every incremental `analyze` was dying because the extension had not loaded.
37
+ * `doctor` derived that line from a static platform capability, so it read
38
+ * "available" no matter what the extension file was doing.
39
+ *
40
+ * Probes for real on every platform, Windows included: the extension server
41
+ * ships win_amd64 VECTOR artifacts for every 0.18.x extension version (the
42
+ * old blanket Windows refusal was stale, #1365-era). LOAD never touches the
43
+ * network and never invokes the installer, so this probe is exactly as safe
44
+ * as the FTS one above.
45
+ */
46
+ export declare function probeVectorExtensionLoad(timeoutMs?: number): Promise<ExtensionProbeResult>;
@@ -81,3 +81,93 @@ export function checkLbugNative(overridePkgDir) {
81
81
  }
82
82
  return { ok: true, binaryPath };
83
83
  }
84
+ const DEFAULT_FTS_PROBE_TIMEOUT_MS = 10_000;
85
+ /** Close each result, swallowing close-time errors so a successful LOAD is not
86
+ * misreported as a failure (native-check keeps no static lbug dependency, so it
87
+ * cannot reuse the adapter's closeQueryResults — that would eagerly load the
88
+ * module and defeat the dynamic import below). */
89
+ const closeProbeResults = (result) => {
90
+ for (const r of Array.isArray(result) ? result : [result]) {
91
+ try {
92
+ r?.close?.();
93
+ }
94
+ catch {
95
+ // ignore — a close failure must not flip a successful LOAD to failed
96
+ }
97
+ }
98
+ };
99
+ /**
100
+ * Live-probe `LOAD EXTENSION fts` on a throwaway in-memory database.
101
+ *
102
+ * `doctor` used to print the static platform capability, which contradicted
103
+ * analyze whenever the extension file was missing or unloadable (#2374).
104
+ * LOAD never touches the network, so the probe is safe offline, and it
105
+ * surfaces LadybugDB's real error — which distinguishes a missing extension
106
+ * file from a present-but-broken one (wrong platform, truncated download).
107
+ * Dynamic import so doctor still runs when the native module itself is broken.
108
+ *
109
+ * Bounded by `timeoutMs`: an unresponsive extension file (e.g. on a hung
110
+ * network home dir) must never freeze `doctor` — the tool the degradation
111
+ * warnings send users to. `Promise.race` lets doctor report and move on; it
112
+ * cannot cancel an in-flight native call, so a future thread-blocking case
113
+ * would need an out-of-process probe.
114
+ */
115
+ export async function probeFtsExtensionLoad(timeoutMs = DEFAULT_FTS_PROBE_TIMEOUT_MS) {
116
+ return await probeExtensionLoad('fts', timeoutMs);
117
+ }
118
+ /**
119
+ * Live-probe `LOAD EXTENSION vector`, the VECTOR counterpart of the FTS probe.
120
+ *
121
+ * Needed for the same reason #2374 needed the FTS one, and reported the same
122
+ * way: #2623's reporter saw `doctor` print `VECTOR index: available` while
123
+ * every incremental `analyze` was dying because the extension had not loaded.
124
+ * `doctor` derived that line from a static platform capability, so it read
125
+ * "available" no matter what the extension file was doing.
126
+ *
127
+ * Probes for real on every platform, Windows included: the extension server
128
+ * ships win_amd64 VECTOR artifacts for every 0.18.x extension version (the
129
+ * old blanket Windows refusal was stale, #1365-era). LOAD never touches the
130
+ * network and never invokes the installer, so this probe is exactly as safe
131
+ * as the FTS one above.
132
+ */
133
+ export async function probeVectorExtensionLoad(timeoutMs = DEFAULT_FTS_PROBE_TIMEOUT_MS) {
134
+ return await probeExtensionLoad('vector', timeoutMs);
135
+ }
136
+ /**
137
+ * Shared LOAD probe. `extension` is a fixed internal literal, never user input.
138
+ */
139
+ async function probeExtensionLoad(extension, timeoutMs) {
140
+ let timer;
141
+ const timeout = new Promise((resolve) => {
142
+ timer = setTimeout(() => resolve({
143
+ loaded: false,
144
+ reason: 'probe timed out — extension file or filesystem unresponsive',
145
+ }), timeoutMs);
146
+ });
147
+ const probe = (async () => {
148
+ try {
149
+ const { default: lbug } = await import('@ladybugdb/core');
150
+ const db = new lbug.Database(':memory:');
151
+ // Nested finallys so `db` is closed even if the Connection ctor throws.
152
+ try {
153
+ const conn = new lbug.Connection(db);
154
+ try {
155
+ const result = await conn.query(`LOAD EXTENSION ${extension}`);
156
+ closeProbeResults(result);
157
+ return { loaded: true };
158
+ }
159
+ finally {
160
+ await conn.close().catch(() => { });
161
+ }
162
+ }
163
+ finally {
164
+ await db.close().catch(() => { });
165
+ }
166
+ }
167
+ catch (err) {
168
+ const message = err instanceof Error ? err.message : String(err);
169
+ return { loaded: false, reason: message.replace(/\s+/g, ' ').trim() };
170
+ }
171
+ })();
172
+ return await Promise.race([probe, timeout]).finally(() => clearTimeout(timer));
173
+ }