cgraphx 2.0.1 → 2.0.3

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 (701) hide show
  1. package/dist/.claude-template/FLOW-MAP.md +7 -5
  2. package/dist/.claude-template/commands/end.md +1 -1
  3. package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +2 -1
  4. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +4 -2
  5. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +5 -2
  6. package/dist/.claude-template/skills/iboc-check/SKILL.md +116 -0
  7. package/dist/.claude-template/skills/iboc-check/filler-prompt.md +75 -0
  8. package/dist/.claude-template/skills/implementation/SKILL.md +7 -0
  9. package/dist/.claude-template/skills/init-project-guides/SKILL.md +1 -1
  10. package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
  11. package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
  12. package/dist/.claude-template/skills/write-api/assets/template-request.bru +3 -3
  13. package/dist/.claude-template/skills/write-api/references/bru-format.md +6 -6
  14. package/dist/.claude-template/skills/write-delivery-guide/SKILL.md +97 -0
  15. package/dist/.claude-template/skills/write-delivery-guide/template-change-type.md +120 -0
  16. package/dist/.claude-template/skills/write-delivery-guide/template-multi-role-flow.md +148 -0
  17. package/dist/.claude-template/skills/write-unit-test-code/SKILL.md +23 -6
  18. package/dist/core/code/engine/cli/analyze-config.js +320 -0
  19. package/dist/core/code/engine/cli/analyze.js +1086 -0
  20. package/dist/core/code/engine/cli/cli-message.js +83 -0
  21. package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
  22. package/dist/core/code/engine/cli/embedding-dims.js +43 -0
  23. package/dist/core/code/engine/cli/format-elapsed.js +12 -0
  24. package/dist/core/code/engine/cli/help-i18n.js +144 -0
  25. package/dist/core/code/engine/cli/i18n/en.js +110 -0
  26. package/dist/core/code/engine/cli/i18n/index.js +47 -0
  27. package/dist/core/code/engine/cli/i18n/resources.js +9 -0
  28. package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
  29. package/dist/core/code/engine/cli/lazy-action.js +67 -0
  30. package/dist/core/code/engine/cli/optional-grammars.js +136 -0
  31. package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
  32. package/dist/core/code/engine/cli/status.js +156 -0
  33. package/dist/core/code/engine/cli/tool.js +384 -0
  34. package/dist/core/code/engine/config/ignore-service.js +511 -0
  35. package/dist/core/code/engine/config/supported-languages.js +17 -0
  36. package/dist/core/code/engine/core/analysis-features.js +64 -0
  37. package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
  38. package/dist/core/code/engine/core/git-staleness.js +180 -0
  39. package/dist/core/code/engine/core/graph/graph.js +180 -0
  40. package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
  41. package/dist/core/code/engine/core/graph/types.js +2 -0
  42. package/dist/core/code/engine/core/index-freshness.js +12 -0
  43. package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
  44. package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
  45. package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
  46. package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
  47. package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
  48. package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
  49. package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
  50. package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
  51. package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
  52. package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
  53. package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
  54. package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
  55. package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
  56. package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
  57. package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
  58. package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
  59. package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
  60. package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
  61. package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
  62. package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
  63. package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
  64. package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
  65. package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
  66. package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
  67. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
  68. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
  69. package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
  70. package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
  71. package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
  72. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
  73. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
  74. package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
  75. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
  76. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
  77. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
  78. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
  79. package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
  80. package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
  81. package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
  82. package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
  83. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
  84. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
  85. package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
  86. package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
  87. package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
  88. package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
  89. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
  90. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
  91. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
  92. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
  93. package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
  94. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
  95. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
  96. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
  97. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
  98. package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
  99. package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
  100. package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
  101. package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
  102. package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
  103. package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
  104. package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
  105. package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
  106. package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
  107. package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
  108. package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
  109. package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
  110. package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
  111. package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
  112. package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
  113. package/dist/core/code/engine/core/ingestion/constants.js +26 -0
  114. package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
  115. package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
  116. package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
  117. package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
  118. package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
  119. package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
  120. package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
  121. package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
  122. package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
  123. package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
  124. package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
  125. package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
  126. package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
  127. package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
  128. package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
  129. package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
  130. package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
  131. package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
  132. package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
  133. package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
  134. package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
  135. package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
  136. package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
  137. package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
  138. package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
  139. package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
  140. package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
  141. package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
  142. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
  143. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
  144. package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
  145. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
  146. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
  147. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
  148. package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
  149. package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
  150. package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
  151. package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
  152. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
  153. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
  154. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
  155. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
  156. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
  157. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
  158. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
  159. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
  160. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
  161. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
  162. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
  163. package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
  164. package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
  165. package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
  166. package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
  167. package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
  168. package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
  169. package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
  170. package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
  171. package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
  172. package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
  173. package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
  174. package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
  175. package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
  176. package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
  177. package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
  178. package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
  179. package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
  180. package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
  181. package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
  182. package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
  183. package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
  184. package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
  185. package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
  186. package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
  187. package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
  188. package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
  189. package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
  190. package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
  191. package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
  192. package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
  193. package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
  194. package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
  195. package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
  196. package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
  197. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
  198. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
  199. package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
  200. package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
  201. package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
  202. package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
  203. package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
  204. package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
  205. package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
  206. package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
  207. package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
  208. package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
  209. package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
  210. package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
  211. package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
  212. package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
  213. package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
  214. package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
  215. package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
  216. package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
  217. package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
  218. package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
  219. package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
  220. package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
  221. package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
  222. package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
  223. package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
  224. package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
  225. package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
  226. package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
  227. package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
  228. package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
  229. package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
  230. package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
  231. package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
  232. package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
  233. package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
  234. package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
  235. package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
  236. package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
  237. package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
  238. package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
  239. package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
  240. package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
  241. package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
  242. package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
  243. package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
  244. package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
  245. package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
  246. package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
  247. package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
  248. package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
  249. package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
  250. package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
  251. package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
  252. package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
  253. package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
  254. package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
  255. package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
  256. package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
  257. package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
  258. package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
  259. package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
  260. package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
  261. package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
  262. package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
  263. package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
  264. package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
  265. package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
  266. package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
  267. package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
  268. package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
  269. package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
  270. package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
  271. package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
  272. package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
  273. package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
  274. package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
  275. package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
  276. package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
  277. package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
  278. package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
  279. package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
  280. package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
  281. package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
  282. package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
  283. package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
  284. package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
  285. package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
  286. package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
  287. package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
  288. package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
  289. package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
  290. package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
  291. package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
  292. package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
  293. package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
  294. package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
  295. package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
  296. package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
  297. package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
  298. package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
  299. package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
  300. package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
  301. package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
  302. package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
  303. package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
  304. package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
  305. package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
  306. package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
  307. package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
  308. package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
  309. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
  310. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
  311. package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
  312. package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
  313. package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
  314. package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
  315. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
  316. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
  317. package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
  318. package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
  319. package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
  320. package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
  321. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
  322. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
  323. package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
  324. package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
  325. package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
  326. package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
  327. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
  328. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
  329. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
  330. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
  331. package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
  332. package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
  333. package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
  334. package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
  335. package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
  336. package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
  337. package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
  338. package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
  339. package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
  340. package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
  341. package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
  342. package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
  343. package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
  344. package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
  345. package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
  346. package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
  347. package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
  348. package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
  349. package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
  350. package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
  351. package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
  352. package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
  353. package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
  354. package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
  355. package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
  356. package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
  357. package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
  358. package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
  359. package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
  360. package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
  361. package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
  362. package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
  363. package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
  364. package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
  365. package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
  366. package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
  367. package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
  368. package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
  369. package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
  370. package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
  371. package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
  372. package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
  373. package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
  374. package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
  375. package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
  376. package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
  377. package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
  378. package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
  379. package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
  380. package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
  381. package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
  382. package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
  383. package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
  384. package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
  385. package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
  386. package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
  387. package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
  388. package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
  389. package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
  390. package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
  391. package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
  392. package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
  393. package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
  394. package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
  395. package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
  396. package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
  397. package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
  398. package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
  399. package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
  400. package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
  401. package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
  402. package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
  403. package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
  404. package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
  405. package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
  406. package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
  407. package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
  408. package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
  409. package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
  410. package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
  411. package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
  412. package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
  413. package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
  414. package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
  415. package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
  416. package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
  417. package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
  418. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
  419. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
  420. package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
  421. package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
  422. package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
  423. package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
  424. package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
  425. package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
  426. package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
  427. package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
  428. package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
  429. package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
  430. package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
  431. package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
  432. package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
  433. package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
  434. package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
  435. package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
  436. package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
  437. package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  438. package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
  439. package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
  440. package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
  441. package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
  442. package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
  443. package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
  444. package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
  445. package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
  446. package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
  447. package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
  448. package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
  449. package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
  450. package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
  451. package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
  452. package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
  453. package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
  454. package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
  455. package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
  456. package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
  457. package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
  458. package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
  459. package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
  460. package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
  461. package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
  462. package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
  463. package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
  464. package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
  465. package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
  466. package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
  467. package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
  468. package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
  469. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
  470. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
  471. package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
  472. package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
  473. package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
  474. package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
  475. package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
  476. package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
  477. package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
  478. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
  479. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
  480. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
  481. package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
  482. package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
  483. package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
  484. package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
  485. package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
  486. package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
  487. package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
  488. package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
  489. package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
  490. package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
  491. package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
  492. package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
  493. package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
  494. package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
  495. package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
  496. package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
  497. package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
  498. package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
  499. package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
  500. package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
  501. package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
  502. package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
  503. package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
  504. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
  505. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
  506. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
  507. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
  508. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
  509. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
  510. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
  511. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
  512. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
  513. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
  514. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
  515. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
  516. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
  517. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
  518. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
  519. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
  520. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
  521. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
  522. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
  523. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
  524. package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
  525. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
  526. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
  527. package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
  528. package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
  529. package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
  530. package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
  531. package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
  532. package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
  533. package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
  534. package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
  535. package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
  536. package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
  537. package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
  538. package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
  539. package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
  540. package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
  541. package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
  542. package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
  543. package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
  544. package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
  545. package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
  546. package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
  547. package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
  548. package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
  549. package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
  550. package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
  551. package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
  552. package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
  553. package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
  554. package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
  555. package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
  556. package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
  557. package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
  558. package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
  559. package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
  560. package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
  561. package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
  562. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
  563. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
  564. package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
  565. package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
  566. package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
  567. package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
  568. package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
  569. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
  570. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
  571. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
  572. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
  573. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
  574. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
  575. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
  576. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
  577. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
  578. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
  579. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
  580. package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
  581. package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
  582. package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
  583. package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
  584. package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
  585. package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
  586. package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
  587. package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
  588. package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
  589. package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
  590. package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
  591. package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
  592. package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
  593. package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
  594. package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
  595. package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
  596. package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
  597. package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
  598. package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
  599. package/dist/core/code/engine/core/lbug/native-check.js +435 -0
  600. package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
  601. package/dist/core/code/engine/core/lbug/query-params.js +25 -0
  602. package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
  603. package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
  604. package/dist/core/code/engine/core/lbug/schema.js +771 -0
  605. package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
  606. package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
  607. package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
  608. package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
  609. package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
  610. package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
  611. package/dist/core/code/engine/core/logger.js +339 -0
  612. package/dist/core/code/engine/core/platform/capabilities.js +91 -0
  613. package/dist/core/code/engine/core/run-analyze.js +1098 -0
  614. package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
  615. package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
  616. package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
  617. package/dist/core/code/engine/lib/utils.js +121 -0
  618. package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
  619. package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
  620. package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
  621. package/dist/core/code/engine/mcp/local/limits.js +15 -0
  622. package/dist/core/code/engine/mcp/local/line-display.js +6 -0
  623. package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
  624. package/dist/core/code/engine/storage/branch-index.js +72 -0
  625. package/dist/core/code/engine/storage/file-hash.js +95 -0
  626. package/dist/core/code/engine/storage/fs-atomic.js +34 -0
  627. package/dist/core/code/engine/storage/git.js +555 -0
  628. package/dist/core/code/engine/storage/index-lock.js +664 -0
  629. package/dist/core/code/engine/storage/parse-cache.js +650 -0
  630. package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
  631. package/dist/core/code/engine/storage/repo-manager.js +1061 -0
  632. package/dist/core/code/engine/storage/scope-index-store.js +247 -0
  633. package/dist/core/code/engine/types/pipeline.js +2 -0
  634. package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
  635. package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
  636. package/dist/core/code/shared/graph/types.js +8 -0
  637. package/dist/core/code/shared/index.js +105 -0
  638. package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
  639. package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
  640. package/dist/core/code/shared/integrations/retry.js +70 -0
  641. package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
  642. package/dist/core/code/shared/language-detection.js +162 -0
  643. package/dist/core/code/shared/languages.js +27 -0
  644. package/dist/core/code/shared/lbug/schema-constants.js +98 -0
  645. package/dist/core/code/shared/mro-strategy.js +2 -0
  646. package/dist/core/code/shared/pipeline.js +5 -0
  647. package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
  648. package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
  649. package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
  650. package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
  651. package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
  652. package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
  653. package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
  654. package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
  655. package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
  656. package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
  657. package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
  658. package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
  659. package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
  660. package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
  661. package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
  662. package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
  663. package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
  664. package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
  665. package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
  666. package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
  667. package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
  668. package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
  669. package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
  670. package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
  671. package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
  672. package/dist/core/code/shared/scope-resolution/types.js +25 -0
  673. package/dist/core/code/shared/test-helpers.js +17 -0
  674. package/dist/core/code/vendor/leiden/index.cjs +355 -0
  675. package/dist/core/code/vendor/leiden/utils.cjs +419 -0
  676. package/dist/core/features/scanner.d.ts +2 -0
  677. package/dist/core/features/scanner.d.ts.map +1 -1
  678. package/dist/core/features/scanner.js +27 -6
  679. package/dist/core/features/scanner.js.map +1 -1
  680. package/dist/core/timeline/cli.d.ts.map +1 -1
  681. package/dist/core/timeline/cli.js +13 -6
  682. package/dist/core/timeline/cli.js.map +1 -1
  683. package/dist/core/timeline/debris.d.ts +20 -0
  684. package/dist/core/timeline/debris.d.ts.map +1 -0
  685. package/dist/core/timeline/debris.js +124 -0
  686. package/dist/core/timeline/debris.js.map +1 -0
  687. package/dist/core/timeline/hook-runner.d.ts.map +1 -1
  688. package/dist/core/timeline/hook-runner.js +3 -1
  689. package/dist/core/timeline/hook-runner.js.map +1 -1
  690. package/dist/core/timeline/hooks.d.ts.map +1 -1
  691. package/dist/core/timeline/hooks.js +13 -5
  692. package/dist/core/timeline/hooks.js.map +1 -1
  693. package/dist/core/timeline/installer.d.ts +2 -0
  694. package/dist/core/timeline/installer.d.ts.map +1 -1
  695. package/dist/core/timeline/installer.js +12 -0
  696. package/dist/core/timeline/installer.js.map +1 -1
  697. package/dist/core/timeline/project-root.d.ts +21 -0
  698. package/dist/core/timeline/project-root.d.ts.map +1 -0
  699. package/dist/core/timeline/project-root.js +83 -0
  700. package/dist/core/timeline/project-root.js.map +1 -0
  701. package/package.json +1 -1
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.escapeCypherString = void 0;
4
+ /**
5
+ * Escape a value for embedding in a single-quoted Cypher string literal.
6
+ *
7
+ * LadybugDB's parser uses backslash escapes and REJECTS SQL-style `''`
8
+ * doubling — `'we''ird'` is a parser error, not an escaped quote (#2409
9
+ * review). Every call site that used doubling produced a query that never
10
+ * parsed; the failures were invisible wherever the site swallowed errors
11
+ * (per-file deletes skipping quoted paths, importer BFS returning [],
12
+ * augment/wiki batch lookups silently missing rows).
13
+ *
14
+ * Backslashes are escaped first, then quotes — reversing the order would
15
+ * double the backslash that the quote escape just introduced. For values
16
+ * inside single-quoted literals only; table/label names go through
17
+ * `escapeTableName` in lbug-adapter instead.
18
+ *
19
+ * NOT for CSV emission: the COPY path (csv-generator.ts) quotes fields for
20
+ * LadybugDB's CSV reader (`ESCAPE='"'`), a different grammar with its own
21
+ * rules — its `''` usages are not this bug.
22
+ */
23
+ const escapeCypherString = (value) => value.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
24
+ exports.escapeCypherString = escapeCypherString;
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FILE_CORRUPTION_SIGNATURES = void 0;
4
+ exports.classifyExtensionLoadError = classifyExtensionLoadError;
5
+ exports.extractExtensionPath = extractExtensionPath;
6
+ exports.classifyBinaryHeader = classifyBinaryHeader;
7
+ exports.inspectExtensionBinary = inspectExtensionBinary;
8
+ exports.diagnoseExtensionLoad = diagnoseExtensionLoad;
9
+ /**
10
+ * Classify a LadybugDB `LOAD EXTENSION` failure into one of four actionable
11
+ * classes and produce an accurate, literal-English remedy.
12
+ *
13
+ * Background (#2374): PR #2375 made the real LadybugDB LOAD error visible
14
+ * (instead of a false "not pre-installed" message). The rc.4 reproduction then
15
+ * showed the remaining defect — on Windows the extension file downloads and
16
+ * INSTALLs fine, but `LoadLibrary` fails with error 126 ("the specified module
17
+ * could not be found" / `找不到指定的模块`) because the extension dynamically
18
+ * imports OpenSSL 3 / MSVC 14 DLLs that ship nowhere. For that class, telling
19
+ * the user to reinstall/redownload is wrong — the file is fine; a *runtime
20
+ * dependency* is missing. This module decides which class an error is so each
21
+ * surface (the analyze degrade warning, capability diagnostics) can emit the
22
+ * right remedy instead of a one-size-fits-all "reinstall over the network".
23
+ *
24
+ * `classifyExtensionLoadError` is pure string logic — no `@ladybugdb/core`
25
+ * import, no filesystem — which keeps `native-check.ts` free of a static lbug
26
+ * dependency. `diagnoseExtensionLoad` layers a LANGUAGE-INDEPENDENT structural
27
+ * check on top: it pulls the extension's file path out of lbug's own (English)
28
+ * wrapper and inspects the binary header directly (PE/ELF/Mach-O magic +
29
+ * architecture), so corrupt-vs-valid is decided by the file itself, not by the
30
+ * localized OS error tail. It reads the file (node:fs core module only, still no
31
+ * lbug) and never throws — any read failure degrades to the string classifier.
32
+ */
33
+ const node_fs_1 = require("node:fs");
34
+ /** LadybugDB says the extension file was never installed. INSTALL can heal it. */
35
+ const MISSING_FILE_SIGNATURES = [
36
+ /has not been installed/i,
37
+ /not been installed/i,
38
+ ];
39
+ /**
40
+ * On-disk file corruption / wrong-platform. FORCE INSTALL re-downloads.
41
+ * Kept byte-identical to `FILE_CORRUPTION_SIGNATURES` in
42
+ * scripts/install-duckdb-extension.mjs (that `.mjs` cannot import this `.ts`;
43
+ * the duplication is deliberate — the two serve different call sites). Note
44
+ * `/not a valid/i` already covers Windows error 193 ("is not a valid Win32
45
+ * application"), so a truncated Windows download is caught here, before the
46
+ * missing-dependency branch.
47
+ */
48
+ // Exported so a parity test can assert this stays byte-identical to the copy in
49
+ // scripts/install-duckdb-extension.mjs (that `.mjs` cannot import this `.ts`), #2383 F5b.
50
+ exports.FILE_CORRUPTION_SIGNATURES = [
51
+ /invalid elf/i,
52
+ /file too short/i,
53
+ /not a valid/i,
54
+ /bad magic/i,
55
+ /wrong architecture/i,
56
+ /mach-o/i,
57
+ /truncat/i,
58
+ ];
59
+ /**
60
+ * A *transitive dependency* of the extension is missing — the file loaded far
61
+ * enough to be found, but a library it needs is absent. Reinstalling the
62
+ * extension is a no-op for this class.
63
+ *
64
+ * WINDOWS CATCH-ALL GUARD (adversarial review): LadybugDB wraps *every* Windows
65
+ * load failure in `Failed to load library … which is needed by extension`, so
66
+ * that generic wrapper must NOT be sufficient — otherwise error 127 (wrong
67
+ * OpenSSL minor / unresolved procedure), 5 (AV/permission lock), and 1114
68
+ * (dependency DllMain failure) would all be mislabeled `missing_dependency` and
69
+ * told to install a runtime, the opposite of their real fix. We key strictly on
70
+ * the specific error-126 tail. Linux/macOS loaders name the missing library
71
+ * directly, so their signals are unambiguous.
72
+ *
73
+ * Localized Windows tails we do not enumerate (French, German, Japanese, …) and
74
+ * mojibake renderings of the Chinese text won't match here — but they still
75
+ * carry lbug's language-independent `Failed to load library` wrapper, so they
76
+ * are caught by the hedged fallback (LOAD_FAILURE_WRAPPER) with a non-committal
77
+ * remedy, never a wrong confident "reinstall" instruction.
78
+ */
79
+ const WINDOWS_MISSING_DEPENDENCY_SIGNATURES = [
80
+ /找不到指定的模块/,
81
+ /specified module could not be found/i,
82
+ ];
83
+ const POSIX_MISSING_DEPENDENCY_SIGNATURES = [
84
+ /cannot open shared object file/i, // Linux ld.so
85
+ /image not found/i, // macOS dyld
86
+ /library not loaded/i, // macOS dyld
87
+ ];
88
+ /**
89
+ * LadybugDB's own English wrapper for a dlopen/LoadLibrary failure
90
+ * (extension.cpp: `Failed to load library: {path} which is needed by extension:
91
+ * {name}`). It is emitted for EVERY extension load failure regardless of the OS
92
+ * display language — the only localized part is the OS-error tail after it. So
93
+ * it is the language-independent fallback signal once the specific tails miss: a
94
+ * French/German/Japanese Windows 126 has a localized tail we cannot enumerate,
95
+ * but it still carries this wrapper. See hedgedLoadFailureRemedy.
96
+ */
97
+ const LOAD_FAILURE_WRAPPER = /failed to load library/i;
98
+ // Remedies are label-parameterized (#2623 follow-up) so each extension's
99
+ // failure is reported under its own name.
100
+ const missingFileRemedy = (label) => `The ${label} extension is not installed. Re-run with network access and ` +
101
+ `CGRAPH_LBUG_EXTENSION_INSTALL=auto to download it.`;
102
+ const corruptFileRemedy = (label) => `The ${label} extension file is present but unreadable (corrupt, truncated, or built for another ` +
103
+ `platform). Re-download it with network access and ` +
104
+ `CGRAPH_LBUG_EXTENSION_INSTALL=auto.`;
105
+ // Single source of truth for the VC++ runtime-install pointer, shared by the
106
+ // Windows-126 and structural missing-dependency remedies so the name/URL cannot
107
+ // drift between them (#2383 F5).
108
+ const VC_REDIST_INSTALL_HINT = 'the Microsoft Visual C++ 2015-2022 Redistributable (x64) from ' +
109
+ 'https://aka.ms/vs/17/release/vc_redist.x64.exe';
110
+ // Git for Windows already ships the OpenSSL 3 DLLs in its mingw64 bin directory,
111
+ // so the identical command that fails in PowerShell succeeds in Git Bash (#2669
112
+ // reporter, who had the VC++ redist installed and still failed until that
113
+ // directory was on PATH). Deliberately a fixed system path and never a
114
+ // user-profile one, so no `C:\Users\…` path ever reaches a user through this
115
+ // surface.
116
+ const GIT_BASH_OPENSSL_HINT = ' If Git for Windows is installed you already have those DLLs: run the same command from Git Bash, ' +
117
+ 'or prepend "C:\\Program Files\\Git\\mingw64\\bin" to PATH.';
118
+ // MSVC-first per DuckDB's canonical answer for this exact error; OpenSSL second.
119
+ const windowsMissingDependencyRemedy = (label) => `The ${label} extension is present but a required runtime library is missing (Windows error 126). ` +
120
+ 'Reinstalling the extension will NOT help. Install ' +
121
+ VC_REDIST_INSTALL_HINT +
122
+ '; if the error persists, the extension also needs OpenSSL 3 ' +
123
+ '(libcrypto-3-x64.dll / libssl-3-x64.dll) on the DLL search path.' +
124
+ GIT_BASH_OPENSSL_HINT;
125
+ const posixMissingDependencyRemedy = (label) => `The ${label} extension is present but a shared library it depends on could not be loaded (named in ` +
126
+ 'the error above). Reinstalling the extension will NOT help — install that library or add it to ' +
127
+ 'your loader search path.';
128
+ // Language-independent fallback: we know the extension failed to load, but the
129
+ // OS-error tail is in a locale we did not enumerate, so we cannot say which class
130
+ // it is. Hedge honestly — point at the user's own localized error and give both
131
+ // branches — rather than confidently prescribing the wrong single fix. The clean
132
+ // long-term fix is upstream: have LadybugDB include the numeric GetLastError/errno
133
+ // in the message (as it already does elsewhere), so this becomes a code match.
134
+ const hedgedLoadFailureRemedy = (label) => `The ${label} extension file was found but could not be loaded — see the "Error:" text above (shown ` +
135
+ "in your system's language). Reinstalling usually will not help. If it names a missing module or " +
136
+ 'library, install the required runtime (on Windows: the Microsoft Visual C++ 2015-2022 ' +
137
+ 'Redistributable x64 and OpenSSL 3); if it names a corrupt or invalid file, ' +
138
+ 're-run analyze with network access and CGRAPH_LBUG_EXTENSION_INSTALL=auto to re-download.';
139
+ const unknownRemedy = (label) => `The ${label} extension failed to load for an unrecognized reason. Verify the extension ` +
140
+ `file and platform; re-install with network access and CGRAPH_LBUG_EXTENSION_INSTALL=auto.`;
141
+ const matchesAny = (reason, signatures) => signatures.some((re) => re.test(reason));
142
+ /**
143
+ * Classify a collapsed LadybugDB LOAD error. Order is most-specific-first and is
144
+ * load-bearing: corrupt-file is tested before missing-dependency so a truncated
145
+ * Windows download (error 193, matched by `/not a valid/i`) routes to
146
+ * FORCE-reinstall rather than to the runtime-install remedy.
147
+ */
148
+ function classifyExtensionLoadError(reason, label = 'optional') {
149
+ const text = reason ?? '';
150
+ if (matchesAny(text, MISSING_FILE_SIGNATURES)) {
151
+ return { kind: 'missing_file', remedy: missingFileRemedy(label) };
152
+ }
153
+ if (matchesAny(text, exports.FILE_CORRUPTION_SIGNATURES)) {
154
+ return { kind: 'corrupt_file', remedy: corruptFileRemedy(label) };
155
+ }
156
+ if (matchesAny(text, WINDOWS_MISSING_DEPENDENCY_SIGNATURES)) {
157
+ return { kind: 'missing_dependency', remedy: windowsMissingDependencyRemedy(label) };
158
+ }
159
+ if (matchesAny(text, POSIX_MISSING_DEPENDENCY_SIGNATURES)) {
160
+ return { kind: 'missing_dependency', remedy: posixMissingDependencyRemedy(label) };
161
+ }
162
+ // Language-independent fallback: the extension demonstrably failed to load
163
+ // (lbug's English wrapper is present) but the localized OS tail matched no
164
+ // specific class. Treat as a dependency/runtime load failure with a hedged
165
+ // remedy — strictly better than the generic `unknown` for non-English hosts,
166
+ // and it never prescribes the wrong fix.
167
+ if (LOAD_FAILURE_WRAPPER.test(text)) {
168
+ return { kind: 'missing_dependency', remedy: hedgedLoadFailureRemedy(label) };
169
+ }
170
+ return { kind: 'unknown', remedy: unknownRemedy(label) };
171
+ }
172
+ const structuralMissingDependencyRemedy = (label) => `The ${label} extension file is valid, so the failure is a missing or incompatible runtime dependency, ` +
173
+ 'not the extension itself — reinstalling will NOT help. On Windows, install ' +
174
+ VC_REDIST_INSTALL_HINT +
175
+ ' and ensure OpenSSL 3 is available; on Linux/macOS install the shared library named in the error above.' +
176
+ GIT_BASH_OPENSSL_HINT;
177
+ /**
178
+ * Pull the extension file path out of lbug's load error. lbug's wrapper is
179
+ * English regardless of OS language — `Failed to load library: {path} which is
180
+ * needed by extension: {name}` (real lbug), or the quoted `Failed to load
181
+ * library '{path}': {reason}` variant — so the path is recoverable in any locale.
182
+ * Only paths ending in `.lbug_extension` are accepted, so a regex misfire can
183
+ * never point the inspector at an arbitrary file.
184
+ */
185
+ function extractExtensionPath(reason) {
186
+ const text = reason ?? '';
187
+ const m = /failed to load library:?\s*['"]?(.+?\.lbug_extension)/i.exec(text);
188
+ const path = m?.[1]?.trim();
189
+ return path && path.length > 0 ? path : null;
190
+ }
191
+ /** Node `process.arch` → PE `Machine`. Undefined for arches we don't map. */
192
+ const PE_MACHINE = { x64: 0x8664, arm64: 0xaa64 };
193
+ /** Node `process.arch` → ELF `e_machine`. */
194
+ const ELF_MACHINE = { x64: 0x3e, arm64: 0xb7 };
195
+ /** Node `process.arch` → Mach-O `cputype`. */
196
+ const MACHO_CPUTYPE = { x64: 0x01000007, arm64: 0x0100000c };
197
+ function classifyPE(buf, bytesRead, arch) {
198
+ if (bytesRead < 0x40 || buf[0] !== 0x4d || buf[1] !== 0x5a)
199
+ return 'corrupt'; // 'MZ'
200
+ const peOffset = buf.readUInt32LE(0x3c);
201
+ // The PE header (e_lfanew) points beyond what we read. A large-DOS-stub VALID PE
202
+ // and a garbage e_lfanew are indistinguishable from here, so don't claim 'corrupt'
203
+ // — defer to the loader's own report (#2383 F1-secondary).
204
+ if (peOffset + 6 > bytesRead)
205
+ return 'indeterminate';
206
+ const isPE = buf[peOffset] === 0x50 &&
207
+ buf[peOffset + 1] === 0x45 &&
208
+ buf[peOffset + 2] === 0 &&
209
+ buf[peOffset + 3] === 0;
210
+ if (!isPE)
211
+ return 'corrupt';
212
+ const expected = PE_MACHINE[arch];
213
+ if (expected === undefined)
214
+ return 'valid'; // arch we don't map: don't claim corrupt
215
+ return buf.readUInt16LE(peOffset + 4) === expected ? 'valid' : 'corrupt';
216
+ }
217
+ function classifyELF(buf, bytesRead, arch) {
218
+ if (bytesRead < 20)
219
+ return 'corrupt';
220
+ if (buf[0] !== 0x7f || buf[1] !== 0x45 || buf[2] !== 0x4c || buf[3] !== 0x46)
221
+ return 'corrupt'; // 0x7F ELF
222
+ const littleEndian = buf[5] === 1; // EI_DATA
223
+ const eMachine = littleEndian ? buf.readUInt16LE(18) : buf.readUInt16BE(18);
224
+ const expected = ELF_MACHINE[arch];
225
+ if (expected === undefined)
226
+ return 'valid';
227
+ return eMachine === expected ? 'valid' : 'corrupt';
228
+ }
229
+ function classifyMachO(buf, bytesRead, arch) {
230
+ if (bytesRead < 8)
231
+ return 'corrupt';
232
+ const magicLE = buf.readUInt32LE(0);
233
+ const magicBE = buf.readUInt32BE(0);
234
+ // Universal ("fat") binary — assume it carries the host slice.
235
+ if (magicBE === 0xcafebabe || magicLE === 0xcafebabe)
236
+ return 'valid';
237
+ const thin = magicLE === 0xfeedfacf || magicLE === 0xfeedface;
238
+ const thinSwapped = magicBE === 0xfeedfacf || magicBE === 0xfeedface;
239
+ if (!thin && !thinSwapped)
240
+ return 'corrupt';
241
+ const cpuType = thin ? buf.readUInt32LE(4) : buf.readUInt32BE(4);
242
+ const expected = MACHO_CPUTYPE[arch];
243
+ if (expected === undefined)
244
+ return 'valid';
245
+ return cpuType === expected ? 'valid' : 'corrupt';
246
+ }
247
+ /**
248
+ * Decide whether a binary header is a well-formed shared library for the given
249
+ * platform + architecture — using only the file's structure, no localized text.
250
+ * Pure and injectable (platform/arch as params) so every format+arch combination
251
+ * is unit-testable regardless of the host it runs on.
252
+ */
253
+ function classifyBinaryHeader(buf, bytesRead, platform, arch) {
254
+ if (platform === 'win32')
255
+ return classifyPE(buf, bytesRead, arch);
256
+ if (platform === 'linux')
257
+ return classifyELF(buf, bytesRead, arch);
258
+ if (platform === 'darwin')
259
+ return classifyMachO(buf, bytesRead, arch);
260
+ return 'valid'; // unknown host: never claim corrupt
261
+ }
262
+ const BINARY_HEADER_BYTES = 4096;
263
+ /**
264
+ * Best-effort language-independent inspection of the extension file. Reads the
265
+ * header and classifies it; never throws — a missing file is `absent`, an
266
+ * unreadable one is `indeterminate`.
267
+ */
268
+ function inspectExtensionBinary(extensionPath) {
269
+ if (!extensionPath)
270
+ return 'indeterminate';
271
+ let fd;
272
+ try {
273
+ fd = (0, node_fs_1.openSync)(extensionPath, 'r');
274
+ }
275
+ catch (err) {
276
+ return err?.code === 'ENOENT' ? 'absent' : 'indeterminate';
277
+ }
278
+ try {
279
+ const buf = Buffer.alloc(BINARY_HEADER_BYTES);
280
+ const bytesRead = (0, node_fs_1.readSync)(fd, buf, 0, BINARY_HEADER_BYTES, 0);
281
+ return classifyBinaryHeader(buf, bytesRead, process.platform, process.arch);
282
+ }
283
+ catch {
284
+ return 'indeterminate';
285
+ }
286
+ finally {
287
+ try {
288
+ (0, node_fs_1.closeSync)(fd);
289
+ }
290
+ catch {
291
+ /* closing the probe fd must never surface */
292
+ }
293
+ }
294
+ }
295
+ /**
296
+ * Diagnose a LadybugDB load failure, preferring a LANGUAGE-INDEPENDENT structural
297
+ * check of the extension binary over the localized error text:
298
+ * - file absent → missing_file
299
+ * - present but malformed → corrupt_file (bad magic / wrong architecture)
300
+ * - present and well-formed → missing_dependency (a valid binary the loader rejected)
301
+ * The path comes from lbug's own English wrapper, so this holds in any OS display
302
+ * language. When the file cannot be located or read, it falls back to the string
303
+ * classifier (which still carries the language-independent hedged fallback). This
304
+ * is the entry point every surface should call.
305
+ */
306
+ function diagnoseExtensionLoad(reason, label = 'optional') {
307
+ const text = reason ?? '';
308
+ const stringResult = classifyExtensionLoadError(text, label);
309
+ const fileState = inspectExtensionBinary(extractExtensionPath(text));
310
+ if (fileState === 'corrupt') {
311
+ return { kind: 'corrupt_file', remedy: corruptFileRemedy(label) };
312
+ }
313
+ if (fileState === 'valid') {
314
+ // The structural probe only inspects the first BINARY_HEADER_BYTES, so a file
315
+ // truncated AFTER its header still reads 'valid'. When the loader itself reported
316
+ // corruption (e.g. "file too short" / Windows error 193 "not a valid Win32
317
+ // application"), that whole-file verdict is stronger evidence than an intact-looking
318
+ // header — honor it and route to re-download, not a runtime-dependency install (#2383
319
+ // F1). Localized corrupt tails classify as hedged missing_dependency (not
320
+ // corrupt_file), so they still fall through to the dependency remedy below.
321
+ if (stringResult.kind === 'corrupt_file') {
322
+ return stringResult;
323
+ }
324
+ // A structurally sound binary that still failed to load ⇒ a dependency/runtime
325
+ // problem, decided WITHOUT the localized tail. Keep the string classifier's
326
+ // sharper remedy when it recognized the specific case (e.g. English 126).
327
+ const remedy = stringResult.kind === 'missing_dependency'
328
+ ? stringResult.remedy
329
+ : structuralMissingDependencyRemedy(label);
330
+ return { kind: 'missing_dependency', remedy };
331
+ }
332
+ // 'absent' or 'indeterminate' → no positive structural evidence, so defer to the
333
+ // string classifier. Note a real never-installed extension has NO path in its
334
+ // reason (lbug says "has not been installed"), so it lands here via
335
+ // 'indeterminate' and the string classifier reports missing_file correctly; a
336
+ // path that lbug named but that is now gone (stale/racy) is better judged by
337
+ // what lbug actually reported than by re-deriving from disk.
338
+ return stringResult;
339
+ }
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resetExtensionState = exports.getExtensionCapability = exports.getExtensionCapabilities = exports.extensionManager = exports.ExtensionManager = exports.installDuckDbExtensionOutOfProcess = exports.getExtensionInstallChildProcessArgs = exports.getExtensionInstallTimeoutMs = exports.resolveAnalyzeInstallPolicy = exports.getExtensionInstallPolicy = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const node_url_1 = require("node:url");
6
+ const lbug_config_js_1 = require("./lbug-config.js");
7
+ const extension_load_error_js_1 = require("./extension-load-error.js");
8
+ const logger_js_1 = require("../logger.js");
9
+ const DEFAULT_EXTENSION_INSTALL_TIMEOUT_MS = 15_000;
10
+ const EXTENSION_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_]*$/;
11
+ const alreadyAvailable = (message) => message.includes('already loaded') ||
12
+ message.includes('already installed') ||
13
+ message.includes('already exists');
14
+ /** LadybugDB errors are multi-line; collapse for single-line warn/reason strings. */
15
+ const oneLine = (value) => value.replace(/\s+/g, ' ').trim();
16
+ const resolvePolicyFromEnv = () => {
17
+ const raw = process.env.CGRAPH_LBUG_EXTENSION_INSTALL;
18
+ if (raw === 'load-only' || raw === 'never' || raw === 'auto')
19
+ return raw;
20
+ return 'load-only';
21
+ };
22
+ const getExtensionInstallPolicy = () => resolvePolicyFromEnv();
23
+ exports.getExtensionInstallPolicy = getExtensionInstallPolicy;
24
+ /**
25
+ * Install policy for the **analyze (write) path**.
26
+ *
27
+ * The global default (`resolvePolicyFromEnv`) is `load-only` so read paths
28
+ * never require outbound network access (PR #1161, offline-first). The analyze
29
+ * path is different: it owns building optional-extension-backed indexes, so it
30
+ * defaults to `auto` — LOAD the extension if present, otherwise attempt one
31
+ * bounded out-of-process INSTALL (the VECTOR/embeddings path, #726 contract).
32
+ * An explicit `CGRAPH_LBUG_EXTENSION_INSTALL` value still wins, so operators
33
+ * can force `load-only`/`never` for fully offline analyze; `auto` LOADs-first,
34
+ * so offline machines still degrade gracefully when the INSTALL cannot reach
35
+ * the network.
36
+ */
37
+ const resolveAnalyzeInstallPolicy = () => {
38
+ const raw = process.env.CGRAPH_LBUG_EXTENSION_INSTALL;
39
+ if (raw === 'load-only' || raw === 'never' || raw === 'auto')
40
+ return raw;
41
+ return 'auto';
42
+ };
43
+ exports.resolveAnalyzeInstallPolicy = resolveAnalyzeInstallPolicy;
44
+ const getExtensionInstallTimeoutMs = () => {
45
+ const raw = process.env.CGRAPH_LBUG_EXTENSION_INSTALL_TIMEOUT_MS;
46
+ const parsed = raw ? Number(raw) : NaN;
47
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_EXTENSION_INSTALL_TIMEOUT_MS;
48
+ };
49
+ exports.getExtensionInstallTimeoutMs = getExtensionInstallTimeoutMs;
50
+ const getExtensionInstallChildProcessArgs = (extensionName, maxDbSize = lbug_config_js_1.LBUG_MAX_DB_SIZE) => {
51
+ const childScript = new URL('../../../scripts/install-duckdb-extension.mjs', (0, node_url_1.pathToFileURL)(__filename));
52
+ return [(0, node_url_1.fileURLToPath)(childScript), extensionName, String(maxDbSize)];
53
+ };
54
+ exports.getExtensionInstallChildProcessArgs = getExtensionInstallChildProcessArgs;
55
+ /**
56
+ * Run `INSTALL <extension>` in a short-lived child Node process so the parent
57
+ * event loop is never blocked by DuckDB's synchronous network call.
58
+ *
59
+ * The child opens its own scratch LadybugDB, executes the install, and exits.
60
+ * If the child exceeds `timeoutMs` the parent kills it with SIGKILL and
61
+ * resolves with `timedOut: true`.
62
+ */
63
+ const installDuckDbExtensionOutOfProcess = async (extensionName, timeoutMs = (0, exports.getExtensionInstallTimeoutMs)(), loadError) => {
64
+ if (!EXTENSION_NAME_PATTERN.test(extensionName)) {
65
+ throw new Error(`Invalid DuckDB extension name: ${extensionName}`);
66
+ }
67
+ return await new Promise((resolve) => {
68
+ const child = (0, child_process_1.spawn)(process.execPath, (0, exports.getExtensionInstallChildProcessArgs)(extensionName), {
69
+ env: {
70
+ ...process.env,
71
+ CGRAPH_LBUG_EXTENSION_NAME: extensionName,
72
+ // The child picks INSTALL vs FORCE INSTALL from this LOAD error so it
73
+ // only re-downloads when the on-disk extension file is actually broken.
74
+ ...(loadError ? { CGRAPH_LBUG_EXTENSION_LOAD_ERROR: loadError } : {}),
75
+ },
76
+ stdio: ['ignore', 'ignore', 'pipe'],
77
+ windowsHide: true,
78
+ });
79
+ let stderr = '';
80
+ child.stderr?.setEncoding('utf8');
81
+ child.stderr?.on('data', (chunk) => {
82
+ stderr = (stderr + chunk).slice(-4000);
83
+ });
84
+ let settled = false;
85
+ const timer = setTimeout(() => {
86
+ if (settled)
87
+ return;
88
+ settled = true;
89
+ child.kill('SIGKILL');
90
+ resolve({
91
+ success: false,
92
+ timedOut: true,
93
+ message: `extension install for ${extensionName} timed out after ${timeoutMs}ms`,
94
+ });
95
+ }, timeoutMs);
96
+ child.on('error', (err) => {
97
+ if (settled)
98
+ return;
99
+ settled = true;
100
+ clearTimeout(timer);
101
+ resolve({ success: false, timedOut: false, message: err.message });
102
+ });
103
+ child.on('exit', (code, signal) => {
104
+ if (settled)
105
+ return;
106
+ settled = true;
107
+ clearTimeout(timer);
108
+ resolve({
109
+ success: code === 0,
110
+ timedOut: false,
111
+ message: code === 0
112
+ ? `extension install for ${extensionName} completed`
113
+ : `extension install for ${extensionName} failed with ${signal ?? `exit code ${code}`}${stderr ? `: ${stderr.trim()}` : ''}`,
114
+ });
115
+ });
116
+ });
117
+ };
118
+ exports.installDuckDbExtensionOutOfProcess = installDuckDbExtensionOutOfProcess;
119
+ /**
120
+ * Centralized lifecycle manager for optional LadybugDB extensions.
121
+ *
122
+ * Always tries `LOAD EXTENSION <name>` first — it is per-connection,
123
+ * idempotent, and never touches the network. If `LOAD` fails and the active
124
+ * policy permits, the manager runs a single bounded out-of-process `INSTALL`
125
+ * attempt per process and retries `LOAD`. Capability outcomes are cached so
126
+ * unavailable extensions degrade search features without ever blocking
127
+ * subsequent analyze or query calls.
128
+ *
129
+ * Policy precedence (most specific wins):
130
+ * per-call `opts.policy` → constructor `options.policy` → env → `load-only`
131
+ */
132
+ class ExtensionManager {
133
+ options;
134
+ capabilities = new Map();
135
+ installAttempted = new Map();
136
+ warnedKeys = new Set();
137
+ constructor(options = {}) {
138
+ this.options = options;
139
+ }
140
+ /** Reset cached capability and install state. Test-only. */
141
+ reset() {
142
+ this.capabilities.clear();
143
+ this.installAttempted.clear();
144
+ this.warnedKeys.clear();
145
+ }
146
+ /** Snapshot of currently-known optional extension capabilities. */
147
+ getCapabilities() {
148
+ return Array.from(this.capabilities.values());
149
+ }
150
+ /**
151
+ * Ensure an optional extension is loaded on the supplied connection.
152
+ *
153
+ * Returns `true` when the extension is usable on `query`, `false` when it
154
+ * is unavailable. Never throws on install failure — analyze and query
155
+ * paths are expected to degrade gracefully.
156
+ */
157
+ async ensure(query, name, label, opts = {}) {
158
+ if (!EXTENSION_NAME_PATTERN.test(name)) {
159
+ throw new Error(`Invalid DuckDB extension name: ${name}`);
160
+ }
161
+ const policy = opts.policy ?? this.options.policy ?? resolvePolicyFromEnv();
162
+ const timeoutMs = opts.installTimeoutMs ?? this.options.installTimeoutMs ?? (0, exports.getExtensionInstallTimeoutMs)();
163
+ const warn = this.options.warn ?? ((msg) => logger_js_1.logger.warn(msg));
164
+ const quiet = opts.quiet === true;
165
+ if (policy === 'never') {
166
+ this.markUnavailable(name, label, 'extension install policy is "never"', warn, quiet);
167
+ return false;
168
+ }
169
+ const loadError = await this.tryLoad(query, name);
170
+ if (loadError === null) {
171
+ this.markLoaded(name);
172
+ return true;
173
+ }
174
+ if (policy === 'load-only') {
175
+ this.markUnavailable(name, label, `load-only policy (no install attempted); LOAD ${name} failed: ${loadError}`, warn, quiet);
176
+ return false;
177
+ }
178
+ let install = this.installAttempted.get(name);
179
+ if (!install) {
180
+ const installFn = this.options.installExtension ?? exports.installDuckDbExtensionOutOfProcess;
181
+ // Hand the child the LOAD error so it re-downloads (FORCE) only when the
182
+ // present extension file is provably broken, not on every LOAD failure.
183
+ install = await installFn(name, timeoutMs, loadError);
184
+ this.installAttempted.set(name, install);
185
+ }
186
+ if (!install.success) {
187
+ this.markUnavailable(name, label, `${install.message}; LOAD ${name} had failed: ${loadError}`, warn, quiet);
188
+ return false;
189
+ }
190
+ const retryError = await this.tryLoad(query, name);
191
+ if (retryError === null) {
192
+ this.markLoaded(name);
193
+ return true;
194
+ }
195
+ this.markUnavailable(name, label, `LOAD ${name} failed after successful INSTALL: ${retryError}`, warn, quiet);
196
+ return false;
197
+ }
198
+ /**
199
+ * Attempt `LOAD EXTENSION <name>`; returns `null` on success and the
200
+ * collapsed error message on failure. The message is the load-side ground
201
+ * truth — LadybugDB distinguishes a missing extension file from a present
202
+ * but unloadable one (wrong platform, truncated download, version mismatch),
203
+ * and discarding it left users staring at "not pre-installed" when the file
204
+ * existed all along (#2374).
205
+ */
206
+ async tryLoad(query, name) {
207
+ try {
208
+ await query(`LOAD EXTENSION ${name}`);
209
+ return null;
210
+ }
211
+ catch (err) {
212
+ const msg = err instanceof Error ? err.message : String(err);
213
+ return alreadyAvailable(msg) ? null : oneLine(msg);
214
+ }
215
+ }
216
+ markLoaded(name) {
217
+ this.capabilities.set(name, { name, loaded: true });
218
+ }
219
+ markUnavailable(name, label, reason, warn, quiet = false) {
220
+ // Classify once here (the single load-failure sink, run per Database not per
221
+ // request) so the hot per-request warning path does no file I/O (#2383 F3).
222
+ this.capabilities.set(name, {
223
+ name,
224
+ loaded: false,
225
+ reason,
226
+ diagnosis: (0, extension_load_error_js_1.diagnoseExtensionLoad)(reason, label),
227
+ });
228
+ const message = `GitNexus: ${label} extension unavailable; continuing without ${label} features. ${reason}`;
229
+ // A quiet probe must not register the dedup key: the owning caller may hit
230
+ // the identical reason later, and that one is the real degradation report.
231
+ if (quiet) {
232
+ logger_js_1.logger.debug(message);
233
+ return;
234
+ }
235
+ const key = `${name}:${reason}`;
236
+ if (this.warnedKeys.has(key))
237
+ return;
238
+ this.warnedKeys.add(key);
239
+ warn(message);
240
+ }
241
+ }
242
+ exports.ExtensionManager = ExtensionManager;
243
+ /** Process-wide singleton shared by core and pool adapters. */
244
+ exports.extensionManager = new ExtensionManager();
245
+ /** Snapshot of which optional DuckDB extensions are loaded in this process. */
246
+ const getExtensionCapabilities = () => exports.extensionManager.getCapabilities();
247
+ exports.getExtensionCapabilities = getExtensionCapabilities;
248
+ /**
249
+ * One optional extension's capability record, or `undefined` when nothing in
250
+ * this process has resolved it yet.
251
+ *
252
+ * `getExtensionCapabilities().find((c) => c.name === …)` was spelled out at five
253
+ * call sites across four modules (#2841 review), each re-deriving the same
254
+ * lookup — and each free to drift on the extension NAME, which is the one string
255
+ * the lookup is keyed on. Keep the name in one place.
256
+ */
257
+ const getExtensionCapability = (name) => (0, exports.getExtensionCapabilities)().find((c) => c.name === name);
258
+ exports.getExtensionCapability = getExtensionCapability;
259
+ /** Test-only: clear the singleton's cached capability and install state. */
260
+ const resetExtensionState = () => exports.extensionManager.reset();
261
+ exports.resetExtensionState = resetExtensionState;