gitnexus 1.6.9 → 1.6.10-aptos.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. package/README.md +211 -53
  2. package/dist/_shared/graph/types.d.ts +67 -3
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +1 -0
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
  8. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  9. package/dist/_shared/integrations/resilient-fetch.js +4 -3
  10. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  11. package/dist/_shared/language-detection.d.ts.map +1 -1
  12. package/dist/_shared/language-detection.js +2 -0
  13. package/dist/_shared/language-detection.js.map +1 -1
  14. package/dist/_shared/languages.d.ts +2 -0
  15. package/dist/_shared/languages.d.ts.map +1 -1
  16. package/dist/_shared/languages.js +2 -0
  17. package/dist/_shared/languages.js.map +1 -1
  18. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  19. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  20. package/dist/_shared/lbug/schema-constants.js +8 -0
  21. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  22. package/dist/_shared/pipeline.d.ts +1 -1
  23. package/dist/_shared/pipeline.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
  25. package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
  26. package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
  27. package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
  28. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
  29. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
  31. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  32. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  33. package/dist/_shared/scope-resolution/language-classification.js +1 -0
  34. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  35. package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
  36. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  37. package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
  38. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  39. package/dist/_shared/scope-resolution/types.d.ts +20 -3
  40. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  41. package/dist/cli/ai-context.d.ts +1 -1
  42. package/dist/cli/ai-context.js +25 -44
  43. package/dist/cli/analyze.d.ts +5 -2
  44. package/dist/cli/analyze.js +197 -11
  45. package/dist/cli/clean.js +17 -3
  46. package/dist/cli/cli-message.d.ts +1 -1
  47. package/dist/cli/doctor.d.ts +18 -0
  48. package/dist/cli/doctor.js +96 -5
  49. package/dist/cli/editor-targets.d.ts +17 -2
  50. package/dist/cli/editor-targets.js +44 -0
  51. package/dist/cli/embeddings.d.ts +12 -0
  52. package/dist/cli/embeddings.js +49 -0
  53. package/dist/cli/eval-server.d.ts +23 -1
  54. package/dist/cli/eval-server.js +126 -8
  55. package/dist/cli/help-i18n.js +6 -0
  56. package/dist/cli/i18n/en.d.ts +18 -8
  57. package/dist/cli/i18n/en.js +18 -8
  58. package/dist/cli/i18n/resources.d.ts +28 -8
  59. package/dist/cli/i18n/zh-CN.d.ts +10 -0
  60. package/dist/cli/i18n/zh-CN.js +18 -8
  61. package/dist/cli/index.js +21 -7
  62. package/dist/cli/lazy-action.d.ts +7 -0
  63. package/dist/cli/lazy-action.js +27 -0
  64. package/dist/cli/mcp.js +6 -3
  65. package/dist/cli/move-availability.d.ts +5 -0
  66. package/dist/cli/move-availability.js +11 -0
  67. package/dist/cli/setup.d.ts +8 -0
  68. package/dist/cli/setup.js +230 -32
  69. package/dist/cli/skill-gen.js +38 -18
  70. package/dist/cli/standard-skills.d.ts +76 -0
  71. package/dist/cli/standard-skills.js +45 -0
  72. package/dist/cli/status.d.ts +4 -1
  73. package/dist/cli/status.js +57 -4
  74. package/dist/cli/tool.js +11 -0
  75. package/dist/cli/uninstall.js +77 -18
  76. package/dist/cli/wiki.d.ts +1 -0
  77. package/dist/cli/wiki.js +7 -1
  78. package/dist/config/ignore-service.d.ts +2 -0
  79. package/dist/config/ignore-service.js +27 -0
  80. package/dist/core/analysis-features.d.ts +21 -0
  81. package/dist/core/analysis-features.js +59 -0
  82. package/dist/core/analyzer-identity.d.ts +74 -0
  83. package/dist/core/analyzer-identity.js +1820 -0
  84. package/dist/core/augmentation/engine.js +13 -8
  85. package/dist/core/embeddings/embedder.d.ts +3 -2
  86. package/dist/core/embeddings/embedder.js +24 -7
  87. package/dist/core/embeddings/embedding-identity.d.ts +11 -0
  88. package/dist/core/embeddings/embedding-identity.js +24 -0
  89. package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
  90. package/dist/core/embeddings/embedding-pipeline.js +100 -9
  91. package/dist/core/embeddings/http-client.d.ts +33 -3
  92. package/dist/core/embeddings/http-client.js +237 -25
  93. package/dist/core/embeddings/node-module-compat.d.ts +25 -0
  94. package/dist/core/embeddings/node-module-compat.js +25 -0
  95. package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
  96. package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
  97. package/dist/core/embeddings/runtime-install.d.ts +119 -0
  98. package/dist/core/embeddings/runtime-install.js +372 -0
  99. package/dist/core/embeddings/runtime-support.d.ts +48 -17
  100. package/dist/core/embeddings/runtime-support.js +96 -0
  101. package/dist/core/git-staleness.js +1 -1
  102. package/dist/core/group/bridge-db.js +2 -0
  103. package/dist/core/group/extractors/http-patterns/python.js +246 -108
  104. package/dist/core/group/extractors/manifest-extractor.js +4 -0
  105. package/dist/core/incremental/escalation-gate.d.ts +38 -0
  106. package/dist/core/incremental/escalation-gate.js +48 -0
  107. package/dist/core/incremental/shadow-candidates.d.ts +3 -3
  108. package/dist/core/incremental/shadow-candidates.js +3 -3
  109. package/dist/core/incremental/subgraph-extract.d.ts +2 -2
  110. package/dist/core/incremental/subgraph-extract.js +2 -2
  111. package/dist/core/index-freshness.d.ts +5 -0
  112. package/dist/core/index-freshness.js +13 -0
  113. package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
  114. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
  115. package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
  116. package/dist/core/ingestion/cobol-processor.js +27 -26
  117. package/dist/core/ingestion/community-processor.d.ts +51 -1
  118. package/dist/core/ingestion/community-processor.js +323 -64
  119. package/dist/core/ingestion/emit-references.js +7 -2
  120. package/dist/core/ingestion/filesystem-walker.js +4 -0
  121. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
  122. package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
  123. package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
  124. package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
  125. package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
  126. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
  127. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
  128. package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
  129. package/dist/core/ingestion/languages/c/captures.js +56 -0
  130. package/dist/core/ingestion/languages/c/query.js +17 -0
  131. package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
  132. package/dist/core/ingestion/languages/cobol/captures.js +93 -0
  133. package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
  134. package/dist/core/ingestion/languages/cpp/captures.js +365 -75
  135. package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
  136. package/dist/core/ingestion/languages/csharp/captures.js +25 -0
  137. package/dist/core/ingestion/languages/dart/captures.js +90 -2
  138. package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
  139. package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
  140. package/dist/core/ingestion/languages/dart.js +2 -0
  141. package/dist/core/ingestion/languages/go/captures.js +34 -0
  142. package/dist/core/ingestion/languages/index.d.ts +1 -0
  143. package/dist/core/ingestion/languages/index.js +2 -0
  144. package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
  145. package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
  146. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
  147. package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
  148. package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
  149. package/dist/core/ingestion/languages/java/captures.js +193 -17
  150. package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
  151. package/dist/core/ingestion/languages/java/package-facts.js +9 -0
  152. package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
  153. package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
  154. package/dist/core/ingestion/languages/java/query.js +23 -0
  155. package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
  156. package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
  157. package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
  158. package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
  159. package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
  160. package/dist/core/ingestion/languages/java.js +3 -0
  161. package/dist/core/ingestion/languages/javascript/captures.js +16 -0
  162. package/dist/core/ingestion/languages/javascript/query.js +21 -0
  163. package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
  164. package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
  165. package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
  166. package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
  167. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
  168. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
  169. package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
  170. package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
  171. package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
  172. package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
  173. package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
  174. package/dist/core/ingestion/languages/kotlin/query.js +19 -0
  175. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
  176. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
  177. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
  178. package/dist/core/ingestion/languages/kotlin.js +5 -6
  179. package/dist/core/ingestion/languages/move.d.ts +1 -0
  180. package/dist/core/ingestion/languages/move.js +27 -0
  181. package/dist/core/ingestion/languages/php/captures.js +40 -0
  182. package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
  183. package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
  184. package/dist/core/ingestion/languages/php/import-target.js +110 -2
  185. package/dist/core/ingestion/languages/php/interpret.js +10 -0
  186. package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
  187. package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
  188. package/dist/core/ingestion/languages/python/captures.js +24 -5
  189. package/dist/core/ingestion/languages/python/interpret.js +4 -0
  190. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
  191. package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
  192. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
  193. package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
  194. package/dist/core/ingestion/languages/ruby/captures.js +42 -0
  195. package/dist/core/ingestion/languages/rust/captures.js +13 -0
  196. package/dist/core/ingestion/languages/rust/interpret.js +18 -0
  197. package/dist/core/ingestion/languages/rust/query.js +9 -0
  198. package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
  199. package/dist/core/ingestion/languages/swift/captures.js +12 -0
  200. package/dist/core/ingestion/languages/typescript/captures.js +21 -0
  201. package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
  202. package/dist/core/ingestion/languages/typescript/query.js +37 -0
  203. package/dist/core/ingestion/markdown-processor.js +3 -2
  204. package/dist/core/ingestion/model/registration-table.js +1 -0
  205. package/dist/core/ingestion/parsing-processor.d.ts +3 -1
  206. package/dist/core/ingestion/parsing-processor.js +36 -1
  207. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  208. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  209. package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
  210. package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
  211. package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
  212. package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
  213. package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
  214. package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
  215. package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
  216. package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +10 -0
  217. package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
  218. package/dist/core/ingestion/pipeline.d.ts +4 -2
  219. package/dist/core/ingestion/pipeline.js +5 -2
  220. package/dist/core/ingestion/resolve-references.js +12 -0
  221. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
  222. package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
  223. package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
  224. package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
  225. package/dist/core/ingestion/scope-extractor.js +306 -43
  226. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
  227. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
  228. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
  229. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
  230. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
  231. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
  232. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
  233. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
  234. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
  235. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
  236. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
  237. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
  238. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
  239. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
  240. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
  241. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
  242. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
  243. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
  244. package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
  245. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
  246. package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
  247. package/dist/core/ingestion/taint/typescript-model.js +34 -2
  248. package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
  249. package/dist/core/ingestion/tree-sitter-queries.js +23 -2
  250. package/dist/core/ingestion/type-extractors/jvm.js +17 -2
  251. package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
  252. package/dist/core/ingestion/utils/ast-helpers.js +153 -2
  253. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
  254. package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
  255. package/dist/core/ingestion/utils/line-base.d.ts +20 -0
  256. package/dist/core/ingestion/utils/line-base.js +20 -0
  257. package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
  258. package/dist/core/ingestion/utils/symbol-labels.js +45 -0
  259. package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
  260. package/dist/core/ingestion/workers/parse-worker.js +40 -5
  261. package/dist/core/ingestion/workers/result-merge.js +4 -0
  262. package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
  263. package/dist/core/ingestion/workers/worker-pool.js +128 -28
  264. package/dist/core/lbug/csv-generator.d.ts +15 -0
  265. package/dist/core/lbug/csv-generator.js +124 -27
  266. package/dist/core/lbug/cypher-escape.d.ts +20 -0
  267. package/dist/core/lbug/cypher-escape.js +20 -0
  268. package/dist/core/lbug/extension-load-error.d.ts +67 -0
  269. package/dist/core/lbug/extension-load-error.js +326 -0
  270. package/dist/core/lbug/extension-loader.d.ts +17 -2
  271. package/dist/core/lbug/extension-loader.js +38 -13
  272. package/dist/core/lbug/lbug-adapter.d.ts +203 -2
  273. package/dist/core/lbug/lbug-adapter.js +527 -86
  274. package/dist/core/lbug/lbug-config.d.ts +56 -2
  275. package/dist/core/lbug/lbug-config.js +267 -7
  276. package/dist/core/lbug/move-columns.d.ts +7 -0
  277. package/dist/core/lbug/move-columns.js +86 -0
  278. package/dist/core/lbug/native-check.d.ts +40 -0
  279. package/dist/core/lbug/native-check.js +90 -0
  280. package/dist/core/lbug/node-table-layout.d.ts +29 -0
  281. package/dist/core/lbug/node-table-layout.js +119 -0
  282. package/dist/core/lbug/pool-adapter.d.ts +23 -1
  283. package/dist/core/lbug/pool-adapter.js +115 -8
  284. package/dist/core/lbug/schema.d.ts +4 -3
  285. package/dist/core/lbug/schema.js +16 -16
  286. package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
  287. package/dist/core/lbug/sidecar-recovery.js +418 -16
  288. package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
  289. package/dist/core/move/artifact-download.d.ts +19 -0
  290. package/dist/core/move/artifact-download.js +179 -0
  291. package/dist/core/move/compiler-facts.d.ts +120 -0
  292. package/dist/core/move/compiler-facts.js +9 -0
  293. package/dist/core/move/consistency.d.ts +28 -0
  294. package/dist/core/move/consistency.js +98 -0
  295. package/dist/core/move/constants.d.ts +98 -0
  296. package/dist/core/move/constants.js +136 -0
  297. package/dist/core/move/discovery.d.ts +10 -0
  298. package/dist/core/move/discovery.js +22 -0
  299. package/dist/core/move/entry-points.d.ts +14 -0
  300. package/dist/core/move/entry-points.js +40 -0
  301. package/dist/core/move/facts-mapper.d.ts +75 -0
  302. package/dist/core/move/facts-mapper.js +534 -0
  303. package/dist/core/move/install-lock.d.ts +14 -0
  304. package/dist/core/move/install-lock.js +102 -0
  305. package/dist/core/move/install.d.ts +39 -0
  306. package/dist/core/move/install.js +391 -0
  307. package/dist/core/move/mcp-client.d.ts +115 -0
  308. package/dist/core/move/mcp-client.js +436 -0
  309. package/dist/core/move/move-ingest.d.ts +49 -0
  310. package/dist/core/move/move-ingest.js +320 -0
  311. package/dist/core/move/provision.d.ts +19 -0
  312. package/dist/core/move/provision.js +91 -0
  313. package/dist/core/move/release.d.ts +6 -0
  314. package/dist/core/move/release.js +10 -0
  315. package/dist/core/move/symbol-id.d.ts +35 -0
  316. package/dist/core/move/symbol-id.js +65 -0
  317. package/dist/core/move/type-parser.d.ts +11 -0
  318. package/dist/core/move/type-parser.js +38 -0
  319. package/dist/core/platform/capabilities.d.ts +0 -1
  320. package/dist/core/platform/capabilities.js +39 -8
  321. package/dist/core/run-analyze.d.ts +3 -3
  322. package/dist/core/run-analyze.js +1001 -184
  323. package/dist/core/search/fts-indexes.d.ts +31 -0
  324. package/dist/core/search/fts-indexes.js +73 -0
  325. package/dist/core/search/fts-schema.js +2 -0
  326. package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
  327. package/dist/core/tree-sitter/safe-parse.js +21 -7
  328. package/dist/core/wiki/graph-queries.js +6 -5
  329. package/dist/core/wiki/llm-client.d.ts +8 -2
  330. package/dist/core/wiki/llm-client.js +41 -5
  331. package/dist/mcp/core/embedder.js +16 -2
  332. package/dist/mcp/http-transport.d.ts +5 -0
  333. package/dist/mcp/http-transport.js +19 -5
  334. package/dist/mcp/local/bean-metadata.d.ts +2 -0
  335. package/dist/mcp/local/bean-metadata.js +25 -0
  336. package/dist/mcp/local/line-display.d.ts +22 -0
  337. package/dist/mcp/local/line-display.js +3 -0
  338. package/dist/mcp/local/local-backend.d.ts +19 -1
  339. package/dist/mcp/local/local-backend.js +402 -155
  340. package/dist/mcp/local/pdg-impact.d.ts +5 -3
  341. package/dist/mcp/local/pdg-impact.js +5 -2
  342. package/dist/mcp/output-budget.d.ts +5 -0
  343. package/dist/mcp/output-budget.js +52 -0
  344. package/dist/mcp/read-only-policy.d.ts +12 -0
  345. package/dist/mcp/read-only-policy.js +102 -0
  346. package/dist/mcp/repository-policy.d.ts +34 -0
  347. package/dist/mcp/repository-policy.js +328 -0
  348. package/dist/mcp/resources.js +32 -5
  349. package/dist/mcp/server.d.ts +5 -2
  350. package/dist/mcp/server.js +29 -9
  351. package/dist/mcp/tools.d.ts +0 -8
  352. package/dist/mcp/tools.js +102 -5
  353. package/dist/server/analyze-job.d.ts +3 -0
  354. package/dist/server/analyze-job.js +17 -0
  355. package/dist/server/analyze-launch.d.ts +6 -0
  356. package/dist/server/analyze-launch.js +82 -6
  357. package/dist/server/analyze-worker-core.d.ts +2 -1
  358. package/dist/server/analyze-worker-core.js +5 -2
  359. package/dist/server/analyze-worker.js +29 -6
  360. package/dist/server/api.d.ts +30 -0
  361. package/dist/server/api.js +120 -34
  362. package/dist/server/mcp-http.d.ts +1 -1
  363. package/dist/server/mcp-http.js +4 -2
  364. package/dist/server/upload-ingest.js +2 -1
  365. package/dist/server/validation.js +2 -1
  366. package/dist/storage/git.d.ts +31 -0
  367. package/dist/storage/git.js +111 -1
  368. package/dist/storage/parse-cache.js +7 -1
  369. package/dist/storage/parsedfile-store.d.ts +8 -0
  370. package/dist/storage/parsedfile-store.js +165 -1
  371. package/dist/storage/repo-manager.d.ts +194 -2
  372. package/dist/storage/repo-manager.js +56 -1
  373. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
  374. package/hooks/claude/gitnexus-hook.cjs +59 -9
  375. package/hooks/claude/pre-tool-use.sh +0 -0
  376. package/hooks/claude/session-start.sh +0 -0
  377. package/package.json +21 -15
  378. package/scripts/cross-platform-tests.ts +56 -0
  379. package/scripts/ensure-fts.ts +43 -0
  380. package/scripts/install-duckdb-extension.mjs +85 -24
  381. package/scripts/run-cross-platform.ts +61 -6
  382. package/scripts/shard-arg.ts +30 -0
  383. package/scripts/sync-plugin-manifests.mjs +192 -0
  384. package/skills/gitnexus-lfg/README.md +55 -0
  385. package/skills/gitnexus-lfg/SKILL.md +86 -0
  386. package/skills/gitnexus-plan/README.md +142 -0
  387. package/skills/gitnexus-plan/SKILL.md +348 -0
  388. package/skills/gitnexus-plan/references/context-ledger.md +137 -0
  389. package/skills/gitnexus-plan/references/context-pack.md +126 -0
  390. package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
  391. package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
  392. package/skills/gitnexus-plan/references/plan-template.md +201 -0
  393. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
  394. package/skills/gitnexus-review/SKILL.md +273 -0
  395. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
  396. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
  397. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
  398. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
  399. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
  400. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
  401. package/skills/gitnexus-work/README.md +71 -0
  402. package/skills/gitnexus-work/SKILL.md +269 -0
  403. package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
  404. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
  405. package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
  406. package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
  407. package/web/assets/agent-Bqxn-abU.js +626 -0
  408. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
  409. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
  410. package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
  411. package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
  412. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
  413. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
  414. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
  415. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
  416. package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
  417. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
  418. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
  419. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
  420. package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
  421. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
  422. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
  423. package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
  424. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
  425. package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
  426. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
  427. package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
  428. package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
  429. package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
  430. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
  431. package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
  432. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
  433. package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
  434. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
  435. package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
  436. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
  437. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
  438. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
  439. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
  440. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
  441. package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
  442. package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
  443. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
  444. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
  445. package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
  446. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
  447. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
  448. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
  449. package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
  450. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
  451. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
  452. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
  453. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
  454. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
  455. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
  456. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
  457. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
  458. package/web/assets/index-CX_fADmQ.css +2 -0
  459. package/web/assets/index-D1Z3dGGz.js +575 -0
  460. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
  461. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
  462. package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
  463. package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
  464. package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
  465. package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
  466. package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
  467. package/web/assets/node-Ct_zna8U.js +8 -0
  468. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
  469. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
  470. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
  471. package/web/assets/preload-helper-Czpn1I53.js +1 -0
  472. package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
  473. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
  474. package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
  475. package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  476. package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
  477. package/web/assets/sdk-CzHHH8tD.js +37 -0
  478. package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
  479. package/web/assets/src-JV30wyV8.js +1 -0
  480. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
  481. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
  482. package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
  483. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
  484. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
  485. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
  486. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
  487. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
  488. package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
  489. package/web/index.html +18 -10
  490. package/skills/gitnexus-pr-review.md +0 -163
  491. package/web/assets/agent-Dli_x7bU.js +0 -660
  492. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
  493. package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
  494. package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
  495. package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
  496. package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
  497. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
  498. package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
  499. package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
  500. package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
  501. package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
  502. package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
  503. package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
  504. package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
  505. package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
  506. package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
  507. package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
  508. package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
  509. package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
  510. package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
  511. package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
  512. package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
  513. package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
  514. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
  515. package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
  516. package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
  517. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
  518. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
  519. package/web/assets/index-KctnI3Vq.js +0 -635
  520. package/web/assets/index-_lgn7hs5.css +0 -2
  521. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
  522. package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
  523. package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
  524. package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
  525. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
  526. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
  527. package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
  528. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
  529. package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
  530. package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
  531. package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
  532. package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
  533. package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
  534. package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
  535. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
  536. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
  537. package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
  538. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
  539. package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
@@ -15,6 +15,7 @@
15
15
  */
16
16
  import path from 'path';
17
17
  import { listRegisteredRepos } from '../../storage/repo-manager.js';
18
+ import { escapeCypherString } from '../lbug/cypher-escape.js';
18
19
  /**
19
20
  * Find the best matching repo for a given working directory.
20
21
  * Matches by checking if cwd is within the repo's path.
@@ -40,11 +41,15 @@ async function findRepoForCwd(cwd) {
40
41
  if (normalizedCwd === normalizedRepo) {
41
42
  matched = true;
42
43
  }
43
- else if (normalizedCwd.startsWith(normalizedRepo + sep)) {
44
- matched = true;
45
- }
46
- else if (normalizedRepo.startsWith(normalizedCwd + sep)) {
47
- matched = true;
44
+ else {
45
+ const repoPrefix = normalizedRepo.endsWith(sep) ? normalizedRepo : normalizedRepo + sep;
46
+ const cwdPrefix = normalizedCwd.endsWith(sep) ? normalizedCwd : normalizedCwd + sep;
47
+ if (normalizedCwd.startsWith(repoPrefix)) {
48
+ matched = true;
49
+ }
50
+ else if (normalizedRepo.startsWith(cwdPrefix)) {
51
+ matched = true;
52
+ }
48
53
  }
49
54
  if (matched && normalizedRepo.length > bestLen) {
50
55
  bestMatch = entry;
@@ -76,7 +81,7 @@ async function findRepoForCwd(cwd) {
76
81
  export async function augment(pattern, cwd) {
77
82
  if (!pattern || pattern.length < 3)
78
83
  return '';
79
- const patternFirstWord = pattern.trim().replace(/'/g, "''").split(/\s+/)[0];
84
+ const patternFirstWord = escapeCypherString(pattern.trim()).split(/\s+/)[0];
80
85
  if (!patternFirstWord || patternFirstWord.length < 2)
81
86
  return '';
82
87
  const workDir = cwd || process.cwd();
@@ -97,7 +102,7 @@ export async function augment(pattern, cwd) {
97
102
  // Step 2: Map BM25 file results to symbols
98
103
  const symbolMatches = [];
99
104
  for (const result of bm25Results.slice(0, 5)) {
100
- const escaped = result.filePath.replace(/'/g, "''");
105
+ const escaped = escapeCypherString(result.filePath);
101
106
  try {
102
107
  const symbols = await executeQuery(repoId, `
103
108
  MATCH (n) WHERE n.filePath = '${escaped}'
@@ -147,7 +152,7 @@ export async function augment(pattern, cwd) {
147
152
  .filter((sym, i, arr) => arr.findIndex((s) => s.nodeId === sym.nodeId) === i);
148
153
  if (uniqueSymbols.length === 0)
149
154
  return '';
150
- const idList = uniqueSymbols.map((s) => `'${s.nodeId.replace(/'/g, "''")}'`).join(', ');
155
+ const idList = uniqueSymbols.map((s) => `'${escapeCypherString(s.nodeId)}'`).join(', ');
151
156
  // Batch fetch callers
152
157
  const callersMap = new Map();
153
158
  try {
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import type { FeatureExtractionPipeline } from '@huggingface/transformers';
10
10
  import { type EmbeddingConfig, type ModelProgress } from './types.js';
11
+ import { type EmbeddingRequestOptions } from './http-client.js';
11
12
  /**
12
13
  * Progress callback type for model loading
13
14
  */
@@ -45,7 +46,7 @@ export declare const getEmbedder: () => FeatureExtractionPipeline;
45
46
  * @param text - Text to embed
46
47
  * @returns Float32Array of embedding vector
47
48
  */
48
- export declare const embedText: (text: string) => Promise<Float32Array>;
49
+ export declare const embedText: (text: string, options?: EmbeddingRequestOptions) => Promise<Float32Array>;
49
50
  /**
50
51
  * Embed multiple texts in a single batch
51
52
  * More efficient than calling embedText multiple times
@@ -53,7 +54,7 @@ export declare const embedText: (text: string) => Promise<Float32Array>;
53
54
  * @param texts - Array of texts to embed
54
55
  * @returns Array of Float32Array embedding vectors
55
56
  */
56
- export declare const embedBatch: (texts: string[]) => Promise<Float32Array[]>;
57
+ export declare const embedBatch: (texts: string[], options?: EmbeddingRequestOptions) => Promise<Float32Array[]>;
57
58
  /**
58
59
  * Convert Float32Array to regular number array (for LadybugDB storage)
59
60
  */
@@ -13,11 +13,12 @@ if (!process.env.ORT_LOG_LEVEL) {
13
13
  process.env.ORT_LOG_LEVEL = '3';
14
14
  }
15
15
  import { DEFAULT_EMBEDDING_CONFIG } from './types.js';
16
- import { isHttpMode, getHttpDimensions, httpEmbed } from './http-client.js';
16
+ import { isHttpMode, getHttpDimensions, httpEmbed, } from './http-client.js';
17
17
  import { resolveEmbeddingConfig } from './config.js';
18
18
  import { applyHfEnvOverrides, isHfDownloadFailure, withHfDownloadRetry } from './hf-env.js';
19
- import { getLocalEmbeddingRuntimeBlocker } from './runtime-support.js';
19
+ import { getLocalEmbeddingRuntimeBlocker, getMissingLocalEmbeddingStackMessage, } from './runtime-support.js';
20
20
  import { ensureOnnxRuntimeCommonResolvable } from './onnxruntime-common-resolver.js';
21
+ import { ensureEmbeddingStackResolvable } from './runtime-install.js';
21
22
  import { ensureOnnxRuntimeNodeMatchesSystem, isEffectiveCudaAvailable, } from './onnxruntime-node-resolver.js';
22
23
  import { logger } from '../logger.js';
23
24
  // Module-level state for singleton pattern
@@ -73,6 +74,11 @@ export const initEmbedder = async (onProgress, config = {}, forceDevice) => {
73
74
  try {
74
75
  // Lazy-load transformers.js only after the runtime guard has passed, so
75
76
  // unsupported platforms never reach the native ONNX import (#1515).
77
+ // Registered FIRST so it sits last in the hook chain (registerHooks runs
78
+ // the most recent hook first): when the optional stack was pruned at
79
+ // install time (#2370), its bare specifiers fall back to the on-demand
80
+ // runtime prefix.
81
+ ensureEmbeddingStackResolvable();
76
82
  // Under pnpm-strict / `pnpm dlx`, transformers' phantom `onnxruntime-common`
77
83
  // import is unresolvable; register the fallback resolver first (#307).
78
84
  ensureOnnxRuntimeCommonResolvable();
@@ -82,7 +88,15 @@ export const initEmbedder = async (onProgress, config = {}, forceDevice) => {
82
88
  // to the CUDA-13 build before transformers imports them. No-op on matching
83
89
  // layouts, non-CUDA, Windows/DirectML, and macOS.
84
90
  ensureOnnxRuntimeNodeMatchesSystem();
85
- const { pipeline, env } = await import('@huggingface/transformers');
91
+ // The stack is an optionalDependency: npm prunes it when onnxruntime-node's
92
+ // postinstall can't reach api.nuget.org (#2370). Rethrow with actionable
93
+ // reinstall guidance instead of a raw ERR_MODULE_NOT_FOUND.
94
+ const { pipeline, env } = await import('@huggingface/transformers').catch((err) => {
95
+ const missing = getMissingLocalEmbeddingStackMessage(err);
96
+ if (missing)
97
+ throw new Error(missing);
98
+ throw err;
99
+ });
86
100
  // Configure transformers.js environment
87
101
  env.allowLocalModels = false;
88
102
  // Bridge user-controlled env vars to transformers.js: HF_HOME →
@@ -229,9 +243,10 @@ export const getEmbedder = () => {
229
243
  * @param text - Text to embed
230
244
  * @returns Float32Array of embedding vector
231
245
  */
232
- export const embedText = async (text) => {
246
+ export const embedText = async (text, options = {}) => {
247
+ options.signal?.throwIfAborted();
233
248
  if (isHttpMode()) {
234
- const [vec] = await httpEmbed([text]);
249
+ const [vec] = await httpEmbed([text], options);
235
250
  return vec;
236
251
  }
237
252
  const embedder = getEmbedder();
@@ -249,12 +264,13 @@ export const embedText = async (text) => {
249
264
  * @param texts - Array of texts to embed
250
265
  * @returns Array of Float32Array embedding vectors
251
266
  */
252
- export const embedBatch = async (texts) => {
267
+ export const embedBatch = async (texts, options = {}) => {
268
+ options.signal?.throwIfAborted();
253
269
  if (texts.length === 0) {
254
270
  return [];
255
271
  }
256
272
  if (isHttpMode()) {
257
- return httpEmbed(texts);
273
+ return httpEmbed(texts, options);
258
274
  }
259
275
  const embedder = getEmbedder();
260
276
  // Process batch
@@ -262,6 +278,7 @@ export const embedBatch = async (texts) => {
262
278
  pooling: 'mean',
263
279
  normalize: true,
264
280
  });
281
+ options.signal?.throwIfAborted();
265
282
  // Result shape is [batch_size, dimensions]
266
283
  // Need to split into individual vectors
267
284
  const data = result.data;
@@ -0,0 +1,11 @@
1
+ export interface EmbeddingIdentity {
2
+ model: string;
3
+ dimensions: number;
4
+ provider: string;
5
+ }
6
+ /**
7
+ * Identify the vector space strongly enough to resume without mixing providers.
8
+ * The HTTP fingerprint excludes URL credentials and query parameters before
9
+ * hashing, so metadata contains neither an endpoint nor a secret-derived hash.
10
+ */
11
+ export declare function resolveEmbeddingIdentity(): EmbeddingIdentity;
@@ -0,0 +1,24 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { getEmbeddingDimensions } from './embedder.js';
3
+ import { resolveEmbeddingConfig } from './config.js';
4
+ import { isHttpMode, safeUrl } from './http-client.js';
5
+ /**
6
+ * Identify the vector space strongly enough to resume without mixing providers.
7
+ * The HTTP fingerprint excludes URL credentials and query parameters before
8
+ * hashing, so metadata contains neither an endpoint nor a secret-derived hash.
9
+ */
10
+ export function resolveEmbeddingIdentity() {
11
+ const httpMode = isHttpMode();
12
+ const provider = httpMode
13
+ ? `http:${createHash('sha256')
14
+ .update(safeUrl(process.env.GITNEXUS_EMBEDDING_URL ?? ''))
15
+ .digest('hex')}`
16
+ : 'local';
17
+ return {
18
+ model: httpMode
19
+ ? process.env.GITNEXUS_EMBEDDING_MODEL
20
+ : resolveEmbeddingConfig().modelId,
21
+ dimensions: getEmbeddingDimensions(),
22
+ provider,
23
+ };
24
+ }
@@ -51,12 +51,47 @@ export declare const batchInsertEmbeddings: (executeWithReusedStatement: (cypher
51
51
  embedding: number[];
52
52
  contentHash?: string;
53
53
  }>) => Promise<void>;
54
+ /**
55
+ * Create the vector index for semantic search (indexes the CodeEmbedding table).
56
+ *
57
+ * Keeps the embedding-specific extension-install policy gate here
58
+ * (ensureVectorExtensionAvailable → resolveEmbeddingInstallPolicy, default
59
+ * `auto` for the analyze write path), then delegates the actual
60
+ * `CALL CREATE_VECTOR_INDEX(...)` to the adapter, which runs it through the
61
+ * unprepared `conn.query()` path. It must NOT go through the injected
62
+ * `executeQuery` (prepared `conn.prepare()`): LadybugDB cannot prepare that
63
+ * procedure and fails with "We do not support prepare multiple statements" —
64
+ * the silent degrade in #2114.
65
+ *
66
+ * Exported for run-analyze's wipe-and-restore seam (tri-review 4669518496
67
+ * P1): a full-rebuild/escalated write wipes the DB files — index included —
68
+ * and a preserve-only run restores embedding ROWS without ever reaching the
69
+ * pipeline call sites below, so the orchestrator recreates the index through
70
+ * this same policy-gated, warn-on-failure entry point. Consumed there via
71
+ * dynamic import only (lazy-embeddings convention, #2370).
72
+ */
73
+ export declare const buildVectorIndex: () => Promise<boolean>;
54
74
  export interface EmbeddingPipelineResult {
55
75
  nodesProcessed: number;
56
76
  chunksProcessed: number;
57
77
  vectorIndexReady: boolean;
58
78
  semanticMode: 'vector-index' | 'exact-scan';
59
79
  }
80
+ export interface EmbeddingPipelineCheckpoint {
81
+ nodesProcessed: number;
82
+ totalNodes: number;
83
+ chunksProcessed: number;
84
+ }
85
+ export interface EmbeddingPipelineCheckpointWindow extends EmbeddingPipelineCheckpoint {
86
+ nodeIds: string[];
87
+ }
88
+ export interface EmbeddingPipelineOptions {
89
+ signal?: AbortSignal;
90
+ checkpointEveryNodes?: number;
91
+ forceReembedNodeIds?: ReadonlySet<string>;
92
+ onCheckpointWindowStart?: (window: EmbeddingPipelineCheckpointWindow) => Promise<void>;
93
+ onCheckpoint?: (checkpoint: EmbeddingPipelineCheckpoint) => Promise<void>;
94
+ }
60
95
  /**
61
96
  * Run the embedding pipeline
62
97
  *
@@ -69,7 +104,7 @@ export interface EmbeddingPipelineResult {
69
104
  * Nodes whose hash matches are skipped; nodes with a changed hash are DELETE'd
70
105
  * and re-embedded; nodes not in the map are embedded fresh.
71
106
  */
72
- export declare const runEmbeddingPipeline: (executeQuery: (cypher: string) => Promise<any[]>, executeWithReusedStatement: (cypher: string, paramsList: Array<Record<string, any>>) => Promise<void>, onProgress: EmbeddingProgressCallback, config?: Partial<EmbeddingConfig>, skipNodeIds?: Set<string>, existingEmbeddings?: Map<string, string>) => Promise<EmbeddingPipelineResult>;
107
+ export declare const runEmbeddingPipeline: (executeQuery: (cypher: string) => Promise<any[]>, executeWithReusedStatement: (cypher: string, paramsList: Array<Record<string, any>>) => Promise<void>, onProgress: EmbeddingProgressCallback, config?: Partial<EmbeddingConfig>, skipNodeIds?: Set<string>, existingEmbeddings?: Map<string, string>, pipelineOptions?: EmbeddingPipelineOptions) => Promise<EmbeddingPipelineResult>;
73
108
  /**
74
109
  * Perform semantic search using the vector index with chunk deduplication
75
110
  */
@@ -18,6 +18,7 @@ import { DEFAULT_VECTOR_MAX_DISTANCE, getVectorMaxDistance, resolveEmbeddingConf
18
18
  import { rankExactEmbeddingRows } from './exact-search.js';
19
19
  import { EMBEDDING_TABLE_NAME, EMBEDDING_INDEX_NAME, STALE_HASH_SENTINEL } from '../lbug/schema.js';
20
20
  import { loadVectorExtension, createVectorIndex } from '../lbug/lbug-adapter.js';
21
+ import { escapeCypherString } from '../lbug/cypher-escape.js';
21
22
  import { getExactScanLimit } from '../platform/capabilities.js';
22
23
  import { logger } from '../logger.js';
23
24
  const isDev = process.env.NODE_ENV === 'development';
@@ -134,13 +135,49 @@ const queryEmbeddableNodes = async (executeQuery) => {
134
135
  }
135
136
  }
136
137
  }
137
- return allNodes;
138
+ return allNodes.length > 0 ? allNodes : queryFallbackFileNodes(executeQuery);
139
+ };
140
+ /**
141
+ * Static and documentation repositories may contain no code symbols while
142
+ * still persisting useful text on File nodes. Keep File embeddings as a
143
+ * zero-symbol fallback so code repositories retain symbol-first selection.
144
+ */
145
+ const queryFallbackFileNodes = async (executeQuery) => {
146
+ try {
147
+ const rows = await executeQuery(`
148
+ MATCH (n:File)
149
+ RETURN n.id AS id, n.name AS name, 'File' AS label,
150
+ n.filePath AS filePath, n.content AS content
151
+ `);
152
+ return rows
153
+ .map((row) => {
154
+ const content = row.content ?? row[4] ?? '';
155
+ return {
156
+ id: row.id ?? row[0],
157
+ name: row.name ?? row[1],
158
+ label: row.label ?? row[2] ?? 'File',
159
+ filePath: row.filePath ?? row[3],
160
+ content,
161
+ startLine: 1,
162
+ endLine: Math.max(1, content.split('\n').length),
163
+ };
164
+ })
165
+ .filter((node) => node.id &&
166
+ node.filePath &&
167
+ node.content.trim() &&
168
+ node.content !== '[Binary file - content not stored]');
169
+ }
170
+ catch (error) {
171
+ if (isDev) {
172
+ logger.warn({ error }, 'Fallback File-node embedding query failed:');
173
+ }
174
+ return [];
175
+ }
138
176
  };
139
177
  /**
140
178
  * Batch INSERT chunk-aware embeddings into CodeEmbedding table
141
179
  */
142
180
  export const batchInsertEmbeddings = async (executeWithReusedStatement, updates) => {
143
- const cypher = `CREATE (e:${EMBEDDING_TABLE_NAME} {id: $id, nodeId: $nodeId, chunkIndex: $chunkIndex, startLine: $startLine, endLine: $endLine, embedding: $embedding, contentHash: $contentHash})`;
144
181
  const paramsList = updates.map((u) => ({
145
182
  id: `${u.nodeId}:${u.chunkIndex}`,
146
183
  nodeId: u.nodeId,
@@ -150,6 +187,10 @@ export const batchInsertEmbeddings = async (executeWithReusedStatement, updates)
150
187
  embedding: u.embedding,
151
188
  contentHash: u.contentHash ?? STALE_HASH_SENTINEL,
152
189
  }));
190
+ if (paramsList.length === 0)
191
+ return;
192
+ await executeWithReusedStatement(`MATCH (e:${EMBEDDING_TABLE_NAME} {id: $id}) DELETE e`, paramsList.map(({ id }) => ({ id })));
193
+ const cypher = `CREATE (e:${EMBEDDING_TABLE_NAME} {id: $id, nodeId: $nodeId, chunkIndex: $chunkIndex, startLine: $startLine, endLine: $endLine, embedding: $embedding, contentHash: $contentHash})`;
153
194
  await executeWithReusedStatement(cypher, paramsList);
154
195
  };
155
196
  /**
@@ -163,8 +204,15 @@ export const batchInsertEmbeddings = async (executeWithReusedStatement, updates)
163
204
  * `executeQuery` (prepared `conn.prepare()`): LadybugDB cannot prepare that
164
205
  * procedure and fails with "We do not support prepare multiple statements" —
165
206
  * the silent degrade in #2114.
207
+ *
208
+ * Exported for run-analyze's wipe-and-restore seam (tri-review 4669518496
209
+ * P1): a full-rebuild/escalated write wipes the DB files — index included —
210
+ * and a preserve-only run restores embedding ROWS without ever reaching the
211
+ * pipeline call sites below, so the orchestrator recreates the index through
212
+ * this same policy-gated, warn-on-failure entry point. Consumed there via
213
+ * dynamic import only (lazy-embeddings convention, #2370).
166
214
  */
167
- const buildVectorIndex = async () => {
215
+ export const buildVectorIndex = async () => {
168
216
  // This pre-check applies the embedding-specific install policy
169
217
  // (resolveEmbeddingInstallPolicy, default `auto` for analyze) before reaching
170
218
  // the adapter. The adapter's createVectorIndex() calls loadVectorExtension()
@@ -223,11 +271,18 @@ const deleteStaleEmbeddingRows = async (executeWithReusedStatement, nodeIds) =>
223
271
  * Nodes whose hash matches are skipped; nodes with a changed hash are DELETE'd
224
272
  * and re-embedded; nodes not in the map are embedded fresh.
225
273
  */
226
- export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatement, onProgress, config = {}, skipNodeIds, existingEmbeddings) => {
274
+ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatement, onProgress, config = {}, skipNodeIds, existingEmbeddings, pipelineOptions = {}) => {
227
275
  const finalConfig = resolveEmbeddingConfig(config);
228
276
  let totalChunks = 0;
277
+ const checkpointEveryNodes = pipelineOptions.checkpointEveryNodes ?? 5_000;
278
+ if (!Number.isSafeInteger(checkpointEveryNodes) || checkpointEveryNodes <= 0) {
279
+ throw new Error('checkpointEveryNodes must be a positive integer');
280
+ }
281
+ const throwIfCancelled = () => pipelineOptions.signal?.throwIfAborted();
229
282
  try {
283
+ throwIfCancelled();
230
284
  const vectorAvailable = await ensureVectorExtensionAvailable();
285
+ throwIfCancelled();
231
286
  if (!vectorAvailable) {
232
287
  logger.warn(vectorUnavailableMessage);
233
288
  }
@@ -246,6 +301,7 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
246
301
  modelDownloadPercent: downloadPercent,
247
302
  });
248
303
  }, finalConfig);
304
+ throwIfCancelled();
249
305
  }
250
306
  onProgress({
251
307
  phase: 'loading-model',
@@ -257,6 +313,8 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
257
313
  }
258
314
  // Phase 2: Query embeddable nodes
259
315
  let nodes = await queryEmbeddableNodes(executeQuery);
316
+ throwIfCancelled();
317
+ const embeddableNodeIds = new Set(nodes.map((node) => node.id));
260
318
  // Incremental mode: compare content hashes, delete stale rows, skip fresh ones.
261
319
  // Computed hashes for stale nodes are cached so batchInsertEmbeddings can reuse them
262
320
  // (avoids double computation).
@@ -265,16 +323,18 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
265
323
  // than all up front — see U6 / KTD7. `staleNodeIds` is consulted inside the
266
324
  // batch loop; it stays empty in full (non-incremental) mode so no deletes fire.
267
325
  const staleNodeIds = new Set();
268
- if (existingEmbeddings && existingEmbeddings.size > 0) {
326
+ const forceReembedNodeIds = pipelineOptions.forceReembedNodeIds;
327
+ if ((existingEmbeddings && existingEmbeddings.size > 0) ||
328
+ (forceReembedNodeIds && forceReembedNodeIds.size > 0)) {
269
329
  const beforeCount = nodes.length;
270
330
  nodes = nodes.filter((n) => {
271
- const existingHash = existingEmbeddings.get(n.id);
331
+ const existingHash = existingEmbeddings?.get(n.id);
272
332
  if (existingHash === undefined) {
273
333
  // New node — needs embedding
274
334
  return true;
275
335
  }
276
336
  const currentHash = contentHashForNode(n, finalConfig);
277
- if (currentHash !== existingHash) {
337
+ if (currentHash !== existingHash || forceReembedNodeIds?.has(n.id)) {
278
338
  // Content changed — cache hash for reuse during insert, mark for DELETE + re-embed
279
339
  computedStaleHashes.set(n.id, currentHash);
280
340
  staleNodeIds.add(n.id);
@@ -287,11 +347,17 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
287
347
  logger.info(`📦 Incremental embeddings: ${beforeCount} total, ${existingEmbeddings.size} cached, ${staleNodeIds.size} stale, ${nodes.length} to embed`);
288
348
  }
289
349
  }
350
+ if (forceReembedNodeIds && forceReembedNodeIds.size > 0) {
351
+ const removedPendingNodeIds = [...forceReembedNodeIds].filter((nodeId) => !embeddableNodeIds.has(nodeId));
352
+ await deleteStaleEmbeddingRows(executeWithReusedStatement, removedPendingNodeIds);
353
+ throwIfCancelled();
354
+ }
290
355
  const totalNodes = nodes.length;
291
356
  if (isDev) {
292
357
  logger.info(`📊 Found ${totalNodes} embeddable nodes`);
293
358
  }
294
359
  if (totalNodes === 0) {
360
+ throwIfCancelled();
295
361
  // Ensure the vector index exists even when no new nodes need embedding.
296
362
  // A prior crash or first-time incremental run may have left CodeEmbedding
297
363
  // rows without ever reaching index creation.
@@ -313,6 +379,7 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
313
379
  const batchSize = finalConfig.batchSize;
314
380
  const chunkSize = finalConfig.chunkSize;
315
381
  const overlap = finalConfig.overlap;
382
+ const checkpointWindowNodeCount = Math.max(batchSize, Math.ceil(checkpointEveryNodes / batchSize) * batchSize);
316
383
  let processedNodes = 0;
317
384
  onProgress({
318
385
  phase: 'embedding',
@@ -324,6 +391,18 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
324
391
  });
325
392
  // Process in batches of nodes
326
393
  for (let batchIndex = 0; batchIndex < totalNodes; batchIndex += batchSize) {
394
+ throwIfCancelled();
395
+ if (pipelineOptions.onCheckpointWindowStart && batchIndex % checkpointWindowNodeCount === 0) {
396
+ await pipelineOptions.onCheckpointWindowStart({
397
+ nodesProcessed: processedNodes,
398
+ totalNodes,
399
+ chunksProcessed: totalChunks,
400
+ nodeIds: nodes
401
+ .slice(batchIndex, batchIndex + checkpointWindowNodeCount)
402
+ .map((node) => node.id),
403
+ });
404
+ throwIfCancelled();
405
+ }
327
406
  const batch = nodes.slice(batchIndex, batchIndex + batchSize);
328
407
  // Chunk each node and generate text
329
408
  const allTexts = [];
@@ -379,6 +458,7 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
379
458
  // Preserves Kuzu's required DELETE-before-INSERT for vector-indexed rows.
380
459
  const batchStaleIds = batch.filter((n) => staleNodeIds.has(n.id)).map((n) => n.id);
381
460
  await deleteStaleEmbeddingRows(executeWithReusedStatement, batchStaleIds);
461
+ throwIfCancelled();
382
462
  // Embed chunk texts in sub-batches to control memory
383
463
  const EMBED_SUB_BATCH = finalConfig.subBatchSize;
384
464
  for (let si = 0; si < allTexts.length; si += EMBED_SUB_BATCH) {
@@ -386,7 +466,7 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
386
466
  const subUpdates = allUpdates.slice(si, si + EMBED_SUB_BATCH);
387
467
  let embeddings;
388
468
  try {
389
- embeddings = await embedBatch(subTexts);
469
+ embeddings = await embedBatch(subTexts, { signal: pipelineOptions.signal });
390
470
  }
391
471
  catch (embedErr) {
392
472
  logger.error({ embedErr }, `❌ embedBatch failed for ${subTexts.length} texts (first: "${subTexts[0]?.substring(0, 80)}..."):`);
@@ -397,6 +477,7 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
397
477
  embedding: embeddingToArray(embeddings[i]),
398
478
  }));
399
479
  await batchInsertEmbeddings(executeWithReusedStatement, dbUpdates);
480
+ throwIfCancelled();
400
481
  }
401
482
  processedNodes += batch.length;
402
483
  totalChunks += allUpdates.length;
@@ -409,8 +490,18 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
409
490
  currentBatch: Math.floor(batchIndex / batchSize) + 1,
410
491
  totalBatches: Math.ceil(totalNodes / batchSize),
411
492
  });
493
+ if (pipelineOptions.onCheckpoint &&
494
+ (processedNodes % checkpointWindowNodeCount === 0 || processedNodes === totalNodes)) {
495
+ await pipelineOptions.onCheckpoint({
496
+ nodesProcessed: processedNodes,
497
+ totalNodes,
498
+ chunksProcessed: totalChunks,
499
+ });
500
+ throwIfCancelled();
501
+ }
412
502
  }
413
503
  // Phase 4: Create vector index
504
+ throwIfCancelled();
414
505
  onProgress({
415
506
  phase: 'indexing',
416
507
  percent: 90,
@@ -536,7 +627,7 @@ export const semanticSearch = async (executeQuery, query, k = 10, maxDistance =
536
627
  // Batch-fetch metadata per label
537
628
  const results = [];
538
629
  for (const [label, items] of byLabel) {
539
- const idList = items.map((i) => `'${i.nodeId.replace(/'/g, "''")}'`).join(', ');
630
+ const idList = items.map((i) => `'${escapeCypherString(i.nodeId)}'`).join(', ');
540
631
  try {
541
632
  const nodeQuery = `
542
633
  MATCH (n:\`${label}\`) WHERE n.id IN [${idList}]
@@ -10,8 +10,17 @@
10
10
  * fails fast on a flapping endpoint. Per-attempt timeout is enforced
11
11
  * via `AbortSignal.timeout` on the underlying fetch.
12
12
  */
13
+ export interface EmbeddingRequestOptions {
14
+ signal?: AbortSignal;
15
+ }
13
16
  /**
14
- * Check whether HTTP embedding mode is active (env vars are set).
17
+ * Whether HTTP embedding mode is active — i.e. both `GITNEXUS_EMBEDDING_URL` and
18
+ * `GITNEXUS_EMBEDDING_MODEL` are set. A pure presence probe: it deliberately does
19
+ * NOT call {@link readConfig}, so it never throws on a malformed
20
+ * `GITNEXUS_EMBEDDING_DIMS`. This lets its ~13 call sites (analyze, doctor,
21
+ * run-analyze, embedder, mcp) probe the mode without a defensive try/catch; the
22
+ * DIMS value is validated where it is actually used (`readConfig` in
23
+ * `httpEmbed`/`httpEmbedQuery`), surfacing a recognizable config error. See #2385.
15
24
  */
16
25
  export declare const isHttpMode: () => boolean;
17
26
  /**
@@ -26,6 +35,27 @@ export declare const getHttpDimensions: () => number | undefined;
26
35
  * custom-endpoint confirmation can mask the same way.
27
36
  */
28
37
  export declare const safeUrl: (url: string) => string;
38
+ /**
39
+ * Error thrown by this module's HTTP embedding path (`httpEmbedBatch` /
40
+ * `httpEmbed` / `httpEmbedQuery`) for any endpoint failure — a
41
+ * connection/timeout/DNS error, an open circuit, a non-OK status, an
42
+ * unparseable or wrong-shape response body, an empty response, or a dimension
43
+ * mismatch.
44
+ *
45
+ * Carrying a distinct type (rather than a plain `Error`) lets the CLI tell a
46
+ * *custom endpoint* failure apart from a HuggingFace *model download* failure
47
+ * without matching message text: the two share the same underlying network
48
+ * substrings (`fetch failed`, `ECONNREFUSED`, …), which is exactly why
49
+ * `isNetworkFetchError` in `hf-env.ts` cannot tell them apart. Keying on the
50
+ * type instead of the message is also locale-proof and survives message
51
+ * rewording. The human-readable `.message` (built with `safeUrl` and the
52
+ * underlying reason) is what the CLI surfaces to the user. See #2385.
53
+ */
54
+ export declare class HttpEmbeddingError extends Error {
55
+ constructor(message: string, options?: {
56
+ cause?: unknown;
57
+ });
58
+ }
29
59
  /**
30
60
  * Embed texts via the HTTP backend, splitting into batches.
31
61
  * Reads config from env vars on every call.
@@ -33,7 +63,7 @@ export declare const safeUrl: (url: string) => string;
33
63
  * @param texts - Array of texts to embed
34
64
  * @returns Array of Float32Array embedding vectors
35
65
  */
36
- export declare const httpEmbed: (texts: string[]) => Promise<Float32Array[]>;
66
+ export declare const httpEmbed: (texts: string[], requestOptions?: EmbeddingRequestOptions) => Promise<Float32Array[]>;
37
67
  /**
38
68
  * Embed a single query text via the HTTP backend.
39
69
  * Convenience for MCP search where only one vector is needed.
@@ -41,4 +71,4 @@ export declare const httpEmbed: (texts: string[]) => Promise<Float32Array[]>;
41
71
  * @param text - Query text to embed
42
72
  * @returns Embedding vector as number array
43
73
  */
44
- export declare const httpEmbedQuery: (text: string) => Promise<number[]>;
74
+ export declare const httpEmbedQuery: (text: string, requestOptions?: EmbeddingRequestOptions) => Promise<number[]>;