gitnexus 1.6.11-rc.8 → 1.6.11

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 (531) hide show
  1. package/README.md +95 -26
  2. package/dist/_shared/graph/types.d.ts +81 -2
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
  5. package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
  6. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  8. package/dist/_shared/language-detection.d.ts.map +1 -1
  9. package/dist/_shared/language-detection.js +2 -0
  10. package/dist/_shared/language-detection.js.map +1 -1
  11. package/dist/_shared/languages.d.ts +2 -1
  12. package/dist/_shared/languages.d.ts.map +1 -1
  13. package/dist/_shared/languages.js +1 -0
  14. package/dist/_shared/languages.js.map +1 -1
  15. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  16. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  17. package/dist/_shared/lbug/schema-constants.js +4 -0
  18. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  19. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  20. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -0
  21. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  22. package/dist/_shared/scope-resolution/language-classification.d.ts +3 -0
  23. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/language-classification.js +4 -0
  25. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  26. package/dist/_shared/scope-resolution/reference-site.d.ts +10 -0
  27. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  28. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  29. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  30. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  31. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  32. package/dist/_shared/scope-resolution/types.d.ts +15 -0
  33. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  34. package/dist/cli/ai-context.d.ts +4 -0
  35. package/dist/cli/ai-context.js +90 -14
  36. package/dist/cli/analyze-config.js +14 -0
  37. package/dist/cli/analyze-options.d.ts +14 -0
  38. package/dist/cli/analyze-watch.d.ts +20 -0
  39. package/dist/cli/analyze-watch.js +434 -0
  40. package/dist/cli/analyze.js +27 -9
  41. package/dist/cli/auto-sync.d.ts +1 -0
  42. package/dist/cli/auto-sync.js +107 -0
  43. package/dist/cli/command-banner.d.ts +15 -0
  44. package/dist/cli/command-banner.js +42 -0
  45. package/dist/cli/detect-changes-format.js +21 -0
  46. package/dist/cli/doctor.d.ts +7 -0
  47. package/dist/cli/doctor.js +14 -0
  48. package/dist/cli/group.js +7 -1
  49. package/dist/cli/help-i18n.js +4 -0
  50. package/dist/cli/i18n/en.d.ts +18 -3
  51. package/dist/cli/i18n/en.js +18 -3
  52. package/dist/cli/i18n/resources.d.ts +33 -3
  53. package/dist/cli/i18n/zh-CN.d.ts +15 -0
  54. package/dist/cli/i18n/zh-CN.js +18 -3
  55. package/dist/cli/index.js +34 -7
  56. package/dist/cli/mcp.d.ts +15 -0
  57. package/dist/cli/mcp.js +44 -0
  58. package/dist/cli/optional-grammars.d.ts +3 -2
  59. package/dist/cli/optional-grammars.js +19 -3
  60. package/dist/cli/setup.js +41 -15
  61. package/dist/cli/update-notice.d.ts +34 -0
  62. package/dist/cli/update-notice.js +91 -0
  63. package/dist/cli/update.d.ts +21 -0
  64. package/dist/cli/update.js +93 -0
  65. package/dist/cli/watch.d.ts +1 -20
  66. package/dist/cli/watch.js +5 -371
  67. package/dist/core/analysis-feature-registry.d.ts +2 -0
  68. package/dist/core/analysis-feature-registry.js +15 -0
  69. package/dist/core/analyzer-identity.js +21 -3
  70. package/dist/core/auto-sync/analysis-worker-launch.d.ts +30 -0
  71. package/dist/core/auto-sync/analysis-worker-launch.js +166 -0
  72. package/dist/core/auto-sync/config.d.ts +33 -0
  73. package/dist/core/auto-sync/config.js +320 -0
  74. package/dist/core/auto-sync/index.d.ts +6 -0
  75. package/dist/core/auto-sync/index.js +6 -0
  76. package/dist/core/auto-sync/path-security.d.ts +9 -0
  77. package/dist/core/auto-sync/path-security.js +251 -0
  78. package/dist/core/auto-sync/repo.d.ts +1 -0
  79. package/dist/core/auto-sync/repo.js +6 -0
  80. package/dist/core/auto-sync/runner.d.ts +44 -0
  81. package/dist/core/auto-sync/runner.js +428 -0
  82. package/dist/core/auto-sync/starter.d.ts +50 -0
  83. package/dist/core/auto-sync/starter.js +497 -0
  84. package/dist/core/auto-sync/state.d.ts +37 -0
  85. package/dist/core/auto-sync/state.js +119 -0
  86. package/dist/core/group/config-parser.js +8 -1
  87. package/dist/core/group/cross-impact.d.ts +3 -0
  88. package/dist/core/group/cross-impact.js +36 -4
  89. package/dist/core/group/extractors/http-patterns/java.js +22 -8
  90. package/dist/core/group/extractors/http-patterns/kotlin.js +86 -31
  91. package/dist/core/group/extractors/http-patterns/node.js +145 -8
  92. package/dist/core/group/extractors/http-patterns/python.js +11 -7
  93. package/dist/core/group/extractors/http-route-extractor.js +63 -17
  94. package/dist/core/group/extractors/java-workspace-extractor.js +244 -31
  95. package/dist/core/group/group-lock.js +5 -6
  96. package/dist/core/group/normalization.d.ts +38 -1
  97. package/dist/core/group/normalization.js +59 -3
  98. package/dist/core/group/service.d.ts +11 -0
  99. package/dist/core/group/service.js +13 -1
  100. package/dist/core/group/storage.js +2 -2
  101. package/dist/core/group/sync.d.ts +24 -1
  102. package/dist/core/group/sync.js +46 -8
  103. package/dist/core/group/types.d.ts +13 -0
  104. package/dist/core/incremental/derived-writeback.d.ts +36 -0
  105. package/dist/core/incremental/derived-writeback.js +68 -0
  106. package/dist/core/incremental/spring-config-drift.d.ts +12 -0
  107. package/dist/core/incremental/spring-config-drift.js +46 -0
  108. package/dist/core/incremental/subgraph-extract.d.ts +7 -4
  109. package/dist/core/incremental/subgraph-extract.js +30 -5
  110. package/dist/core/ingestion/asyncapi/document.d.ts +226 -0
  111. package/dist/core/ingestion/asyncapi/document.js +758 -0
  112. package/dist/core/ingestion/asyncapi/protocol.d.ts +79 -0
  113. package/dist/core/ingestion/asyncapi/protocol.js +203 -0
  114. package/dist/core/ingestion/call-extractors/configs/zig.d.ts +2 -0
  115. package/dist/core/ingestion/call-extractors/configs/zig.js +4 -0
  116. package/dist/core/ingestion/call-extractors/zig-static-gating.d.ts +100 -0
  117. package/dist/core/ingestion/call-extractors/zig-static-gating.js +319 -0
  118. package/dist/core/ingestion/call-processor.js +3 -1
  119. package/dist/core/ingestion/class-extractors/configs/zig.d.ts +2 -0
  120. package/dist/core/ingestion/class-extractors/configs/zig.js +32 -0
  121. package/dist/core/ingestion/class-extractors/generic.js +4 -1
  122. package/dist/core/ingestion/class-types.d.ts +6 -2
  123. package/dist/core/ingestion/destination-key.d.ts +59 -0
  124. package/dist/core/ingestion/destination-key.js +61 -0
  125. package/dist/core/ingestion/entry-point-scoring.d.ts +6 -2
  126. package/dist/core/ingestion/entry-point-scoring.js +8 -44
  127. package/dist/core/ingestion/export-detection.d.ts +37 -0
  128. package/dist/core/ingestion/export-detection.js +60 -0
  129. package/dist/core/ingestion/field-extractors/configs/zig.d.ts +8 -0
  130. package/dist/core/ingestion/field-extractors/configs/zig.js +49 -0
  131. package/dist/core/ingestion/field-extractors/generic.d.ts +1 -1
  132. package/dist/core/ingestion/field-extractors/generic.js +12 -1
  133. package/dist/core/ingestion/frameworks/spring/actuator-runtime.d.ts +26 -0
  134. package/dist/core/ingestion/frameworks/spring/actuator-runtime.js +843 -0
  135. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +5 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.js +9 -0
  137. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +8 -1
  138. package/dist/core/ingestion/frameworks/spring/argument-facts.d.ts +80 -0
  139. package/dist/core/ingestion/frameworks/spring/argument-facts.js +85 -0
  140. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +1 -0
  141. package/dist/core/ingestion/frameworks/spring/config-bindings.js +2 -1
  142. package/dist/core/ingestion/frameworks/spring/destinations.d.ts +539 -0
  143. package/dist/core/ingestion/frameworks/spring/destinations.js +840 -0
  144. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.d.ts +22 -0
  145. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.js +124 -0
  146. package/dist/core/ingestion/frameworks/spring/message-producers.d.ts +78 -0
  147. package/dist/core/ingestion/frameworks/spring/message-producers.js +90 -0
  148. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +29 -0
  149. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.d.ts +7 -0
  150. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.js +22 -0
  151. package/dist/core/ingestion/import-resolvers/configs/zig.d.ts +13 -0
  152. package/dist/core/ingestion/import-resolvers/configs/zig.js +26 -0
  153. package/dist/core/ingestion/import-resolvers/zig.d.ts +34 -0
  154. package/dist/core/ingestion/import-resolvers/zig.js +193 -0
  155. package/dist/core/ingestion/language-config.d.ts +177 -0
  156. package/dist/core/ingestion/language-config.js +719 -0
  157. package/dist/core/ingestion/language-provider.d.ts +178 -1
  158. package/dist/core/ingestion/language-provider.js +22 -0
  159. package/dist/core/ingestion/languages/csharp/razor-view-components.d.ts +62 -0
  160. package/dist/core/ingestion/languages/csharp/razor-view-components.js +954 -0
  161. package/dist/core/ingestion/languages/csharp/resolution-config.d.ts +3 -0
  162. package/dist/core/ingestion/languages/csharp/resolution-config.js +6 -1
  163. package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -0
  164. package/dist/core/ingestion/languages/index.d.ts +1 -0
  165. package/dist/core/ingestion/languages/index.js +2 -0
  166. package/dist/core/ingestion/languages/java/analysis-features.d.ts +1 -1
  167. package/dist/core/ingestion/languages/java/analysis-features.js +14 -6
  168. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +8 -0
  169. package/dist/core/ingestion/languages/java/capture-side-channel.js +34 -0
  170. package/dist/core/ingestion/languages/java/captures.js +22 -1
  171. package/dist/core/ingestion/languages/java/lombok-synthesizer.d.ts +42 -0
  172. package/dist/core/ingestion/languages/java/lombok-synthesizer.js +439 -0
  173. package/dist/core/ingestion/languages/java/scope-resolver.js +2 -0
  174. package/dist/core/ingestion/languages/java/spring-actuator.d.ts +2 -0
  175. package/dist/core/ingestion/languages/java/spring-actuator.js +62 -0
  176. package/dist/core/ingestion/languages/java/spring-di.d.ts +17 -1
  177. package/dist/core/ingestion/languages/java/spring-di.js +44 -2
  178. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.d.ts +8 -0
  179. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.js +62 -0
  180. package/dist/core/ingestion/languages/java/spring-message-producers.d.ts +20 -0
  181. package/dist/core/ingestion/languages/java/spring-message-producers.js +83 -0
  182. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +11 -1
  183. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +13 -3
  184. package/dist/core/ingestion/languages/java.js +18 -8
  185. package/dist/core/ingestion/languages/jvm/accessor-synthesis.d.ts +99 -0
  186. package/dist/core/ingestion/languages/jvm/accessor-synthesis.js +173 -0
  187. package/dist/core/ingestion/languages/jvm/beanspec.d.ts +17 -0
  188. package/dist/core/ingestion/languages/jvm/beanspec.js +42 -0
  189. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  190. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +50 -0
  191. package/dist/core/ingestion/languages/kotlin/captures.js +24 -1
  192. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.d.ts +26 -0
  193. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.js +417 -0
  194. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +4 -0
  195. package/dist/core/ingestion/languages/kotlin/spring-actuator.d.ts +4 -0
  196. package/dist/core/ingestion/languages/kotlin/spring-actuator.js +172 -0
  197. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.d.ts +18 -0
  198. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.js +411 -0
  199. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +51 -1
  200. package/dist/core/ingestion/languages/kotlin/spring-di.js +86 -6
  201. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.d.ts +8 -0
  202. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.js +77 -0
  203. package/dist/core/ingestion/languages/kotlin/spring-message-producers.d.ts +17 -0
  204. package/dist/core/ingestion/languages/kotlin/spring-message-producers.js +119 -0
  205. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +16 -0
  206. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +77 -2
  207. package/dist/core/ingestion/languages/kotlin.js +24 -0
  208. package/dist/core/ingestion/languages/python.js +2 -0
  209. package/dist/core/ingestion/languages/rust/query.js +8 -8
  210. package/dist/core/ingestion/languages/zig/captures.d.ts +260 -0
  211. package/dist/core/ingestion/languages/zig/captures.js +2070 -0
  212. package/dist/core/ingestion/languages/zig/index.d.ts +4 -0
  213. package/dist/core/ingestion/languages/zig/index.js +4 -0
  214. package/dist/core/ingestion/languages/zig/interpret.d.ts +36 -0
  215. package/dist/core/ingestion/languages/zig/interpret.js +176 -0
  216. package/dist/core/ingestion/languages/zig/query.d.ts +3 -0
  217. package/dist/core/ingestion/languages/zig/query.js +426 -0
  218. package/dist/core/ingestion/languages/zig/range-binding.d.ts +37 -0
  219. package/dist/core/ingestion/languages/zig/range-binding.js +373 -0
  220. package/dist/core/ingestion/languages/zig/scope-resolver.d.ts +12 -0
  221. package/dist/core/ingestion/languages/zig/scope-resolver.js +58 -0
  222. package/dist/core/ingestion/languages/zig/simple-hooks.d.ts +25 -0
  223. package/dist/core/ingestion/languages/zig/simple-hooks.js +143 -0
  224. package/dist/core/ingestion/languages/zig.d.ts +32 -0
  225. package/dist/core/ingestion/languages/zig.js +130 -0
  226. package/dist/core/ingestion/method-extractors/configs/zig.d.ts +2 -0
  227. package/dist/core/ingestion/method-extractors/configs/zig.js +120 -0
  228. package/dist/core/ingestion/method-extractors/generic.js +16 -4
  229. package/dist/core/ingestion/method-types.d.ts +10 -4
  230. package/dist/core/ingestion/model/field-registry.d.ts +3 -3
  231. package/dist/core/ingestion/model/field-registry.js +11 -7
  232. package/dist/core/ingestion/model/method-registry.d.ts +3 -3
  233. package/dist/core/ingestion/model/method-registry.js +13 -8
  234. package/dist/core/ingestion/model/registration-table.js +3 -0
  235. package/dist/core/ingestion/model/type-registry.js +8 -4
  236. package/dist/core/ingestion/pipeline-phases/di.js +47 -14
  237. package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
  238. package/dist/core/ingestion/pipeline-phases/index.js +1 -0
  239. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +7 -1
  240. package/dist/core/ingestion/pipeline-phases/parse-impl.js +79 -91
  241. package/dist/core/ingestion/pipeline-phases/parse.d.ts +17 -0
  242. package/dist/core/ingestion/pipeline-phases/processes.d.ts +2 -1
  243. package/dist/core/ingestion/pipeline-phases/processes.js +39 -4
  244. package/dist/core/ingestion/pipeline-phases/routes.js +27 -18
  245. package/dist/core/ingestion/pipeline-phases/runner.d.ts +4 -1
  246. package/dist/core/ingestion/pipeline-phases/runner.js +34 -14
  247. package/dist/core/ingestion/pipeline-phases/scan.js +82 -1
  248. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +2 -0
  249. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +8 -0
  250. package/dist/core/ingestion/pipeline-phases/spring-destinations.d.ts +123 -0
  251. package/dist/core/ingestion/pipeline-phases/spring-destinations.js +688 -0
  252. package/dist/core/ingestion/pipeline.d.ts +30 -1
  253. package/dist/core/ingestion/pipeline.js +52 -14
  254. package/dist/core/ingestion/resolve-references.js +5 -0
  255. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +16 -0
  256. package/dist/core/ingestion/route-extractors/constant-resolver.js +10 -0
  257. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +27 -1
  258. package/dist/core/ingestion/route-extractors/java-const-resolver.js +161 -13
  259. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.d.ts +12 -18
  260. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.js +214 -33
  261. package/dist/core/ingestion/route-extractors/kotlin-spring.d.ts +13 -0
  262. package/dist/core/ingestion/route-extractors/kotlin-spring.js +259 -0
  263. package/dist/core/ingestion/route-extractors/python-decorator-handler.d.ts +6 -0
  264. package/dist/core/ingestion/route-extractors/python-decorator-handler.js +16 -0
  265. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +30 -1
  266. package/dist/core/ingestion/route-extractors/spring-shared.js +77 -9
  267. package/dist/core/ingestion/route-extractors/spring.js +9 -5
  268. package/dist/core/ingestion/scope-extractor.js +8 -0
  269. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +62 -0
  270. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +4 -0
  271. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +2 -0
  272. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +28 -0
  273. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +11 -2
  274. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +23 -2
  275. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +24 -3
  276. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +11 -1
  277. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +26 -6
  278. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +11 -0
  279. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +29 -3
  280. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +8 -1
  281. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +35 -9
  282. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +1 -4
  283. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +277 -9
  284. package/dist/core/ingestion/scope-resolution/pipeline/registry.js +2 -0
  285. package/dist/core/ingestion/scope-resolution/pipeline/run.js +7 -3
  286. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +43 -9
  287. package/dist/core/ingestion/scope-resolution/scope/walkers.js +71 -10
  288. package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -0
  289. package/dist/core/ingestion/tree-sitter-queries.js +161 -0
  290. package/dist/core/ingestion/type-extractors/zig.d.ts +2 -0
  291. package/dist/core/ingestion/type-extractors/zig.js +17 -0
  292. package/dist/core/ingestion/utils/ast-helpers.d.ts +40 -1
  293. package/dist/core/ingestion/utils/ast-helpers.js +124 -6
  294. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +9 -0
  295. package/dist/core/ingestion/utils/callable-flow-captures.js +75 -14
  296. package/dist/core/ingestion/utils/test-file-path.d.ts +28 -0
  297. package/dist/core/ingestion/utils/test-file-path.js +87 -0
  298. package/dist/core/ingestion/variable-extractors/configs/zig.d.ts +2 -0
  299. package/dist/core/ingestion/variable-extractors/configs/zig.js +71 -0
  300. package/dist/core/ingestion/workers/parse-worker.js +85 -14
  301. package/dist/core/install-context.d.ts +4 -0
  302. package/dist/core/install-context.js +152 -0
  303. package/dist/core/lbug/csv-generator.d.ts +10 -1
  304. package/dist/core/lbug/csv-generator.js +92 -22
  305. package/dist/core/lbug/graph-emit-sink.d.ts +3 -2
  306. package/dist/core/lbug/graph-emit-sink.js +4 -2
  307. package/dist/core/lbug/lbug-adapter.d.ts +100 -5
  308. package/dist/core/lbug/lbug-adapter.js +236 -24
  309. package/dist/core/lbug/schema.d.ts +6 -5
  310. package/dist/core/lbug/schema.js +84 -22
  311. package/dist/core/net/url-guard.d.ts +6 -0
  312. package/dist/core/net/url-guard.js +147 -0
  313. package/dist/core/package-version.d.ts +5 -0
  314. package/dist/core/package-version.js +10 -0
  315. package/dist/core/run-analyze.d.ts +21 -4
  316. package/dist/core/run-analyze.js +426 -117
  317. package/dist/core/search/fts-indexes.d.ts +19 -1
  318. package/dist/core/search/fts-indexes.js +28 -1
  319. package/dist/core/tree-sitter/parser-loader.js +16 -0
  320. package/dist/core/update-cache.d.ts +39 -0
  321. package/dist/core/update-cache.js +141 -0
  322. package/dist/core/update-check.d.ts +31 -0
  323. package/dist/core/update-check.js +274 -0
  324. package/dist/mcp/local/local-backend.d.ts +27 -13
  325. package/dist/mcp/local/local-backend.js +148 -60
  326. package/dist/mcp/repository-policy.d.ts +5 -1
  327. package/dist/mcp/repository-policy.js +48 -4
  328. package/dist/mcp/resources.js +10 -1
  329. package/dist/mcp/server.js +8 -9
  330. package/dist/mcp/tools.js +32 -22
  331. package/dist/server/analyze-launch.d.ts +2 -0
  332. package/dist/server/analyze-launch.js +2 -0
  333. package/dist/server/analyze-worker-protocol.d.ts +6 -1
  334. package/dist/server/analyze-worker.d.ts +1 -0
  335. package/dist/server/analyze-worker.js +38 -20
  336. package/dist/server/api.d.ts +5 -1
  337. package/dist/server/api.js +105 -88
  338. package/dist/server/git-clone.d.ts +40 -16
  339. package/dist/server/git-clone.js +253 -199
  340. package/dist/server/grep-params.d.ts +18 -0
  341. package/dist/server/grep-params.js +83 -0
  342. package/dist/server/grep-scan.d.ts +23 -0
  343. package/dist/server/grep-scan.js +107 -0
  344. package/dist/server/grep-worker.d.ts +1 -0
  345. package/dist/server/grep-worker.js +12 -0
  346. package/dist/server/mcp-http.d.ts +8 -0
  347. package/dist/server/mcp-http.js +16 -1
  348. package/dist/server/update-controller.d.ts +29 -0
  349. package/dist/server/update-controller.js +82 -0
  350. package/dist/storage/file-lock.d.ts +15 -0
  351. package/dist/storage/file-lock.js +155 -0
  352. package/dist/storage/fs-atomic.d.ts +24 -0
  353. package/dist/storage/fs-atomic.js +86 -2
  354. package/dist/storage/global-dir.d.ts +2 -0
  355. package/dist/storage/global-dir.js +6 -0
  356. package/dist/storage/parse-cache.d.ts +45 -7
  357. package/dist/storage/parse-cache.js +189 -42
  358. package/dist/storage/parsedfile-store.d.ts +41 -60
  359. package/dist/storage/parsedfile-store.js +247 -171
  360. package/dist/storage/repo-manager.d.ts +10 -4
  361. package/dist/storage/repo-manager.js +35 -25
  362. package/dist/storage/repo-meta.d.ts +34 -0
  363. package/dist/storage/v8-sidecar.d.ts +48 -0
  364. package/dist/storage/v8-sidecar.js +347 -0
  365. package/dist/types/pipeline.d.ts +14 -0
  366. package/dist/utils/process-identity.d.ts +2 -0
  367. package/dist/utils/process-identity.js +35 -0
  368. package/package.json +10 -4
  369. package/scripts/assert-web-assets.mjs +35 -0
  370. package/scripts/build-web.js +72 -0
  371. package/scripts/build.js +31 -28
  372. package/scripts/cross-platform-tests.ts +5 -0
  373. package/skills/gitnexus-cli.md +5 -1
  374. package/web/assets/ProcessFlowModal-DAeX2BHW.js +24 -0
  375. package/web/assets/{abnfDiagram-QNN2D4NM-Cq2djWWe.js → abnfDiagram-PAR5IXJI-J3OdeHLl.js} +1 -1
  376. package/web/assets/{agent-BWAXPjC5.js → agent-BMRqXorA.js} +6 -4
  377. package/web/assets/architecture-7GRP2DOG-M7G3SWCO-G3sWyX6M.js +1 -0
  378. package/web/assets/architectureDiagram-2PNWDENW-ysKcRlGT.js +36 -0
  379. package/web/assets/blockDiagram-PUWGUBOA-oLXTa1lY.js +129 -0
  380. package/web/assets/c4Diagram-3NLNHZP5-D3iu4eC0.js +38 -0
  381. package/web/assets/{chunk-2SREHG4O-Dip42xOq.js → chunk-2NMSUPJH-B24w-wng.js} +1 -1
  382. package/web/assets/{chunk-VJFVEZTB-CX66F2ep.js → chunk-32MCUW2P-ByUyt0Sa.js} +3 -3
  383. package/web/assets/{chunk-4RFN2BYJ-DHHWuC-n.js → chunk-3NPNU5GP-DocZ07Sg.js} +1 -1
  384. package/web/assets/{chunk-XNMVGMAZ-Cg_LnPtj.js → chunk-3SMGFRGC-CAu4JRLv.js} +1 -1
  385. package/web/assets/{chunk-W44A43WB-BN8EQc_u.js → chunk-4CAJECRU-DRYMwG9z.js} +1 -1
  386. package/web/assets/chunk-4OADUZ5Q-CxrSvOwZ.js +10 -0
  387. package/web/assets/{chunk-DMV4VAQV-Bn6WXDSX.js → chunk-5IQCK5RY-CCMhl4so.js} +2 -2
  388. package/web/assets/{chunk-RRFMTAIC-CMN0wcYA.js → chunk-5MVFYWFU-Db9KvrYO.js} +1 -1
  389. package/web/assets/chunk-CLS4B6BI-Uvx5QNsu.js +168 -0
  390. package/web/assets/chunk-DZP67EKU-B3Mt380j.js +70 -0
  391. package/web/assets/{chunk-6L755F7B-CMhLBxi2.js → chunk-EICP7K5X-CqwE9hui.js} +1 -1
  392. package/web/assets/{chunk-BI6VK774-D0oaWk8V.js → chunk-GDY2UAB4-CtQQR0a8.js} +1 -1
  393. package/web/assets/chunk-H7VHZCWX-CE1nAmt6.js +1 -0
  394. package/web/assets/chunk-IJBDOHL6-BUKtY6oF.js +1 -0
  395. package/web/assets/{chunk-OIYT25JQ-CQ6KOZGX.js → chunk-JFFVMJIA-0fJenqia.js} +1 -1
  396. package/web/assets/{chunk-HNC4WDU7-DoU3KnA7.js → chunk-JZGDI5JK-BeTMSSkJ.js} +1 -1
  397. package/web/assets/{chunk-EQFTRU2I-1ix7TzW9.js → chunk-KD6SPIPN-Qp1Pflah.js} +1 -1
  398. package/web/assets/chunk-NF366YI6-CpSpya3n.js +231 -0
  399. package/web/assets/chunk-NUDPKBEF-CU1-BQIW.js +34 -0
  400. package/web/assets/{chunk-SATU7PGQ-B1zhgOvc.js → chunk-OJINMHTS-zOCQe4eI.js} +1 -1
  401. package/web/assets/{chunk-E5QJAATJ-dh-5CtIV.js → chunk-Q6NGPIAH-yyBomb63.js} +1 -1
  402. package/web/assets/chunk-QJSWEUOL-D_rf9gPD.js +128 -0
  403. package/web/assets/chunk-R7JDMUKV-CRoqKpD6.js +1 -0
  404. package/web/assets/{chunk-VE5CLXGZ-C1vB7wpY.js → chunk-RCXAM2GK-CUqrWQDV.js} +1 -1
  405. package/web/assets/{chunk-66DQ2XMT-CM0xjFAN.js → chunk-RT4MAWR3-zXy9-Lvt.js} +1 -1
  406. package/web/assets/{chunk-TZUXEDM2-B7p9AcTw.js → chunk-SFMINX4W-J2UrvMpD.js} +1 -1
  407. package/web/assets/{chunk-LORZLZWG-B57uGw2N.js → chunk-SLDQ463B-CHY6e_bQ.js} +2 -2
  408. package/web/assets/{chunk-FWYVLQTC-BgDItRzJ.js → chunk-TCEHX7R3-CXPDEVbm.js} +1 -1
  409. package/web/assets/{chunk-224SPVON-B8gxtXpy.js → chunk-VQC2EELJ-Dc8fIy4R.js} +1 -1
  410. package/web/assets/chunk-VRZKL3EH-DB3KixTQ.js +1 -0
  411. package/web/assets/{chunk-A7VWPJGB-B4O3oQdQ.js → chunk-VTHDQ7BV-b7FsPQZO.js} +1 -1
  412. package/web/assets/chunk-VY2OSTJR-Dkgc3Brg.js +2 -0
  413. package/web/assets/chunk-WUBWJARI-7FwILJ3k.js +2 -0
  414. package/web/assets/{chunk-D6VWDJW2-BxcBdZ9c.js → chunk-YBMQ5JGJ-BSnyWZmd.js} +1 -1
  415. package/web/assets/chunk-YDMLL4PJ-IHhMngTz.js +2 -0
  416. package/web/assets/chunk-Z6V44ARX-BjCEsF0Q.js +62 -0
  417. package/web/assets/chunk-ZJJ7VQJP-Dz089b-K.js +321 -0
  418. package/web/assets/chunk-ZNLK7HRR-B0iFpmW4.js +1 -0
  419. package/web/assets/chunk-ZQN7UHIL-Cy7KAjQt.js +1 -0
  420. package/web/assets/{chunk-L5GCOVLC-CE2w8Nm_.js → chunk-ZS6VBONO-DBjJO0w9.js} +2 -2
  421. package/web/assets/{chunk-NV3KIAZN-5yvcpMiu.js → chunk-ZUNWM646-DNRJyNPe.js} +1 -1
  422. package/web/assets/classDiagram-FGAMPOII-C5Ibyode.js +1 -0
  423. package/web/assets/classDiagram-v2-AI5RJEK4-C5Ibyode.js +1 -0
  424. package/web/assets/{cose-bilkent-RZA4XIPR-BHpK4Crp.js → cose-bilkent-Q72C2OJ3-DMeFXnK8.js} +1 -1
  425. package/web/assets/cynefin-OW5HDTMX-6OCTWOGG-vlqakYcO.js +1 -0
  426. package/web/assets/{cynefinDiagram-TR7LZUCG-C3Iar9lZ.js → cynefinDiagram-2OOWUY4M-BY6DZkTt.js} +1 -1
  427. package/web/assets/dagre-MPVFI544-DWO70fy_.js +4 -0
  428. package/web/assets/diagram-AE4NWXFW-f7JRVRUL.js +24 -0
  429. package/web/assets/{diagram-L7DVE3PN-GIRyVUtt.js → diagram-BUJID5UG-BXZv1rCS.js} +2 -2
  430. package/web/assets/{diagram-JCD7PQ7C-DC5-9FRr.js → diagram-C44CZ5NI-CRNfvjCq.js} +1 -1
  431. package/web/assets/diagram-EYOLEXXS-DZOjKQVE.js +30 -0
  432. package/web/assets/diagram-P7B6PWOJ-D3SQmw3_.js +3 -0
  433. package/web/assets/{ebnfDiagram-DRHRQJWO-D8_CI4ZF.js → ebnfDiagram-FTPZ3PV6-jKWpIDN2.js} +1 -1
  434. package/web/assets/erDiagram-H3ERR26V-BqJntEuJ.js +99 -0
  435. package/web/assets/eventmodeling-NTZA5JFV-WKSWQHFS-Bq4FqtBL.js +1 -0
  436. package/web/assets/flowDiagram-YHGXBVSY-Dnlk2bEu.js +1 -0
  437. package/web/assets/ganttDiagram-RWFTB7ED-Bl6Y1K5T.js +292 -0
  438. package/web/assets/gitGraph-4MIJSDKK-JH2HKYUO-B3yc4GkH.js +1 -0
  439. package/web/assets/gitGraphDiagram-MAR6GKOP-CkNvsrdw.js +106 -0
  440. package/web/assets/{index-CJDpyH-n.css → index-C2_aej58.css} +1 -1
  441. package/web/assets/{index-DDRie6_8.js → index-Dj3vQOHK.js} +51 -51
  442. package/web/assets/info-A6RAGUB7-3TX3OFWW-BM3N5_Dv.js +1 -0
  443. package/web/assets/infoDiagram-LV547AFH-COkFutAf.js +2 -0
  444. package/web/assets/{ishikawaDiagram-4JDSWWDM-DmqWtjkl.js → ishikawaDiagram-PUJQGNDS-Bb8FylSR.js} +2 -2
  445. package/web/assets/{journeyDiagram-QUS3FAKT-XAzVzrQW.js → journeyDiagram-EW5QJT4W-BzoHUBhM.js} +4 -4
  446. package/web/assets/{kanban-definition-D4L7SQKK-YurRnmYn.js → kanban-definition-JSQERAZB-Uy2Pi0yQ.js} +4 -4
  447. package/web/assets/katex-CZ4GXH2S-C0Fcou7U.js +257 -0
  448. package/web/assets/{mindmap-definition-66QP5TD6-ChrWWnil.js → mindmap-definition-VBJCLQLM-B-CnOnt_.js} +3 -3
  449. package/web/assets/packet-AYTQ26CC-MKII6P3Y-Bd52ZE3V.js +1 -0
  450. package/web/assets/{pegDiagram-YKIO5C6U-QGeQLEq2.js → pegDiagram-7WILOQTJ-D9sneKXg.js} +1 -1
  451. package/web/assets/pie-WAS4IAKB-6B4OPMJ5-DW5Xy69Z.js +1 -0
  452. package/web/assets/pieDiagram-EFA7CBSB-Dx2NQofL.js +39 -0
  453. package/web/assets/{quadrantDiagram-VO5QLCXA-B7098wSc.js → quadrantDiagram-WARVYA7P-DPKL9_0A.js} +3 -3
  454. package/web/assets/radar-RG4KPBEZ-UPTR3XUL-CkzibT2h.js +1 -0
  455. package/web/assets/railroad-74A4TZTK-MEFUPFMS-D9zF-mDN.js +1 -0
  456. package/web/assets/railroad-abnf-HS5TGJTU-R5YG2S5D-ruacjUbX.js +1 -0
  457. package/web/assets/railroad-ebnf-LZEXJU2U-G5QEX2L6-S1zc5OiO.js +1 -0
  458. package/web/assets/railroad-peg-WCYAUIDC-H5I2ZRY2-Cbcr0XzY.js +1 -0
  459. package/web/assets/{railroadDiagram-M77LTMSB-AXu4vxk_.js → railroadDiagram-5NIQVNLQ-DsweTo14.js} +1 -1
  460. package/web/assets/{requirementDiagram-RASO5HTO-B-l8InpK.js → requirementDiagram-SXREGOKZ-CXwdNSVR.js} +4 -4
  461. package/web/assets/{sankeyDiagram-F32LOJ6L-Kd7zjJgX.js → sankeyDiagram-VV74M2VP-CA6jtP9P.js} +3 -3
  462. package/web/assets/{sequenceDiagram-URATNSBD-BlcdY9DS.js → sequenceDiagram-52ZFIFDL-k_5rEbzm.js} +15 -15
  463. package/web/assets/src-Df5C1Nz4.js +1 -0
  464. package/web/assets/stateDiagram-3QAKPIVI-BejHTf31.js +1 -0
  465. package/web/assets/stateDiagram-v2-HN2P4RDZ-BrfoRuOc.js +1 -0
  466. package/web/assets/swimlanes-QLVP42QD-CQSVO5D6.js +1 -0
  467. package/web/assets/swimlanesDiagram-JKPDBFCN-DrWB9kcD.js +8 -0
  468. package/web/assets/{timeline-definition-WJXWRH4I-DUfp1R3E.js → timeline-definition-GS45XAXW-C0Ks8rPP.js} +4 -4
  469. package/web/assets/treeView-Q6P3EWNA-ZRJGANNQ-DmKOCo6L.js +1 -0
  470. package/web/assets/treemap-WGGIJYW6-K64VN5AS-DO3xY92U.js +1 -0
  471. package/web/assets/{vennDiagram-K3VCMQLI-Bj-FN-XS.js → vennDiagram-QIQU2ZRJ-rgPiS837.js} +3 -3
  472. package/web/assets/wardley-WFR3VGLG-D67OWCCH-DiDPBNft.js +1 -0
  473. package/web/assets/wardleyDiagram-U6YNM66N-DRVr7SPi.js +78 -0
  474. package/web/assets/{xychartDiagram-5VRUVLCW-CK_rbSWE.js → xychartDiagram-XJAZEDNM-COtlZzYb.js} +3 -3
  475. package/web/index.html +19 -17
  476. package/web/assets/ProcessFlowModal-Badh2Pbg.js +0 -24
  477. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +0 -1
  478. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +0 -36
  479. package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +0 -132
  480. package/web/assets/c4Diagram-X2LASM7V-CnhoT4aV.js +0 -10
  481. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +0 -127
  482. package/web/assets/chunk-5VCL7Z4A-CQ-2dYWj.js +0 -1
  483. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +0 -1
  484. package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +0 -2
  485. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +0 -32
  486. package/web/assets/chunk-KRXBNO2N-C-UNuKKf.js +0 -1
  487. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +0 -321
  488. package/web/assets/chunk-LIEV3EAG-pyKGssV3.js +0 -1
  489. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +0 -62
  490. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +0 -10
  491. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +0 -156
  492. package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +0 -70
  493. package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +0 -231
  494. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +0 -2
  495. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +0 -1
  496. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +0 -1
  497. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +0 -1
  498. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +0 -1
  499. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +0 -1
  500. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +0 -1
  501. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +0 -4
  502. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +0 -30
  503. package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +0 -3
  504. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +0 -24
  505. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +0 -85
  506. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +0 -1
  507. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +0 -1
  508. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +0 -292
  509. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +0 -1
  510. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +0 -106
  511. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +0 -1
  512. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +0 -2
  513. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +0 -257
  514. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +0 -1
  515. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +0 -1
  516. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +0 -39
  517. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +0 -1
  518. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +0 -1
  519. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +0 -1
  520. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +0 -1
  521. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +0 -1
  522. package/web/assets/src-C5sx_gMp.js +0 -1
  523. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +0 -1
  524. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +0 -1
  525. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +0 -2
  526. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +0 -8
  527. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +0 -1
  528. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +0 -1
  529. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +0 -1
  530. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +0 -78
  531. /package/web/assets/{sizeCapture-5GORAGP4-BEqQzsxs.js → sizeCapture-FGA5AGYP-BEqQzsxs.js} +0 -0
@@ -0,0 +1,44 @@
1
+ import { registerRepo, resolveBranchPlacement } from '../../storage/repo-manager.js';
2
+ import { cloneOrPull } from '../../server/git-clone.js';
3
+ import { resolveConfiguredCloneRoot } from './path-security.js';
4
+ import { loadAutoSyncState, saveAutoSyncState, writeProjectCommitInfo } from './state.js';
5
+ import type { AutoSyncConfig, AutoSyncProjectConfig } from './config.js';
6
+ import { type AutoSyncAnalysisRunner } from './analysis-worker-launch.js';
7
+ export interface AutoSyncLogger {
8
+ info(message: string): void;
9
+ warn(message: string): void;
10
+ error(message: string): void;
11
+ }
12
+ export interface AutoSyncRunDeps {
13
+ cloneOrPull: typeof cloneOrPull;
14
+ getCurrentBranch: (repoPath: string, timeoutMs: number) => Promise<string | undefined>;
15
+ getCurrentCommit: (repoPath: string, timeoutMs: number) => Promise<string>;
16
+ runAnalysis: AutoSyncAnalysisRunner;
17
+ registerRepo: typeof registerRepo;
18
+ resolveBranchPlacement: typeof resolveBranchPlacement;
19
+ loadState: typeof loadAutoSyncState;
20
+ saveState: typeof saveAutoSyncState;
21
+ writeCommitInfo: typeof writeProjectCommitInfo;
22
+ addRepoToGroup: typeof addRepoToGroup;
23
+ syncGroupByName: typeof syncGroupByName;
24
+ resolveCloneRoot: typeof resolveConfiguredCloneRoot;
25
+ getAvailableMemoryGB: () => number;
26
+ }
27
+ export interface AutoSyncRunResult {
28
+ synced: number;
29
+ analyzed: number;
30
+ skippedAnalysis: number;
31
+ failed: number;
32
+ }
33
+ export declare function runAutoSyncOnce(config: AutoSyncConfig, options?: {
34
+ deps?: Partial<AutoSyncRunDeps>;
35
+ logger?: AutoSyncLogger;
36
+ now?: () => Date;
37
+ signal?: AbortSignal;
38
+ onAnalysisCancellationRequested?: () => void;
39
+ }): Promise<AutoSyncRunResult>;
40
+ export declare function getConfiguredRepoPath(project: Pick<AutoSyncProjectConfig, 'localPath'>, repoName: string, remoteUrl?: string): string;
41
+ export declare function addRepoToGroup(project: Pick<AutoSyncProjectConfig, 'groupName'>, groupPath: string, registryName?: string): Promise<boolean>;
42
+ export declare function getAutoSyncRepoIdentity(remoteUrl: string): string;
43
+ export declare function syncGroupByName(groupName: string): Promise<void>;
44
+ export declare function resolveActualConcurrency(configured: number, availableMemoryGB: number): number;
@@ -0,0 +1,428 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { createRequire } from 'node:module';
4
+ import { loadGroupConfig } from '../group/config-parser.js';
5
+ import { getDefaultGitnexusDir, getGroupDir } from '../group/storage.js';
6
+ import { syncGroup } from '../group/sync.js';
7
+ import { registerRepo, resolveBranchPlacement } from '../../storage/repo-manager.js';
8
+ import { extractRepoNameFromRemoteUrl } from './repo.js';
9
+ import { cloneOrPull, runGit } from '../../server/git-clone.js';
10
+ import { resolveConfiguredCloneRoot } from './path-security.js';
11
+ import { buildStateKey, loadAutoSyncState, saveAutoSyncState, shouldAnalyzeCommit, writeProjectCommitInfo, } from './state.js';
12
+ import { validateAutoSyncRemoteUrl } from './config.js';
13
+ import { runAutoSyncAnalysis } from './analysis-worker-launch.js';
14
+ const _require = createRequire(import.meta.url);
15
+ const yaml = _require('js-yaml');
16
+ const DEFAULT_LOGGER = {
17
+ info: (message) => process.stderr.write(`${message}\n`),
18
+ warn: (message) => process.stderr.write(`${message}\n`),
19
+ error: (message) => process.stderr.write(`${message}\n`),
20
+ };
21
+ const DEFAULT_DEPS = {
22
+ cloneOrPull,
23
+ getCurrentBranch: async (repoPath, timeoutMs) => {
24
+ const branch = (await runGit(['branch', '--show-current'], repoPath, { timeoutMs })).trim();
25
+ return branch || undefined;
26
+ },
27
+ getCurrentCommit: async (repoPath, timeoutMs) => (await runGit(['rev-parse', 'HEAD'], repoPath, { timeoutMs })).trim(),
28
+ runAnalysis: runAutoSyncAnalysis,
29
+ registerRepo,
30
+ resolveBranchPlacement,
31
+ loadState: loadAutoSyncState,
32
+ saveState: saveAutoSyncState,
33
+ writeCommitInfo: writeProjectCommitInfo,
34
+ addRepoToGroup,
35
+ syncGroupByName,
36
+ resolveCloneRoot: resolveConfiguredCloneRoot,
37
+ getAvailableMemoryGB: () => Math.floor(process.availableMemory?.() ?? 0) / 1024 / 1024 / 1024,
38
+ };
39
+ export async function runAutoSyncOnce(config, options = {}) {
40
+ const deps = { ...DEFAULT_DEPS, ...options.deps };
41
+ const logger = options.logger ?? DEFAULT_LOGGER;
42
+ const now = options.now ?? (() => new Date());
43
+ throwIfAborted(options.signal);
44
+ const state = await deps.loadState();
45
+ throwIfAborted(options.signal);
46
+ const groupsToSync = new Set();
47
+ const groupStateKeys = new Map();
48
+ const result = { synced: 0, analyzed: 0, skippedAnalysis: 0, failed: 0 };
49
+ const commitInfoEntries = [];
50
+ const actualConcurrency = resolveActualConcurrency(config.maxConcurrency, deps.getAvailableMemoryGB());
51
+ logger.info(`[auto-sync] Starting sync loop with max_concurrency=${actualConcurrency} analyze_failure_threshold=${config.analyzeFailureThreshold}.`);
52
+ const workItems = await buildWorkItems(config, deps);
53
+ // What will actually run at once. One repo means one worker, so the common
54
+ // single-project case still hands that worker the whole machine budget.
55
+ const analysisParallelism = Math.max(1, Math.min(actualConcurrency, workItems.length));
56
+ const repoResults = await mapWithConcurrency(workItems, actualConcurrency, options.signal, async (item) => {
57
+ const lastSyncTime = now().toISOString();
58
+ try {
59
+ throwIfAborted(options.signal);
60
+ if (!item.cloneRoot || !item.repoName || !item.targetDir) {
61
+ throw new Error(item.error ?? 'Invalid auto-sync work item');
62
+ }
63
+ const repoName = item.repoName;
64
+ const targetDir = item.targetDir;
65
+ const syncResult = await syncFirstAvailableBranch({
66
+ item,
67
+ repoName,
68
+ targetDir,
69
+ timeoutMs: config.repoGitTimeoutMs,
70
+ deps,
71
+ logger,
72
+ });
73
+ throwIfAborted(options.signal);
74
+ if (syncResult.ok === false) {
75
+ logger.error(`[auto-sync] Repository sync failed for ${item.remoteUrl}; no configured branch could be pulled: ${syncResult.message}`);
76
+ return {
77
+ kind: 'failed',
78
+ project: item.project,
79
+ remoteUrl: item.remoteUrl,
80
+ targetDir,
81
+ branch: item.project.branches[0],
82
+ status: syncResult.status,
83
+ analyzeConsecutiveFailures: 0,
84
+ lastSyncTime,
85
+ };
86
+ }
87
+ const currentBranch = syncResult.branch;
88
+ const currentCommit = await deps.getCurrentCommit(targetDir, config.repoGitTimeoutMs);
89
+ const stateKey = buildStateKey(targetDir, currentBranch);
90
+ const previous = state[stateKey];
91
+ let analyzeStatus = 'skipped';
92
+ let analyzedCommitId = previous?.analyzedCommitId;
93
+ let analyzeConsecutiveFailures = previous?.analyzeConsecutiveFailures ?? 0;
94
+ let lastAnalyzeError = previous?.lastAnalyzeError;
95
+ const groupSyncPending = previous?.groupSyncPending === true;
96
+ let stats;
97
+ if (previous && previous.codeCommitId !== currentCommit) {
98
+ analyzeConsecutiveFailures = 0;
99
+ lastAnalyzeError = undefined;
100
+ }
101
+ if (analyzeConsecutiveFailures >= config.analyzeFailureThreshold) {
102
+ analyzeStatus = 'threshold_skipped';
103
+ logger.error(`[auto-sync] Skip analysis for ${targetDir}; analyze consecutive failures ${analyzeConsecutiveFailures}/${config.analyzeFailureThreshold} reached threshold. Fix the repository or clear auto-sync state before retrying.`);
104
+ }
105
+ else if (shouldAnalyzeCommit({
106
+ currentCommit,
107
+ previousAnalyzedCommit: previous?.analyzedCommitId,
108
+ previousStatus: previous?.lastAnalyzeStatus,
109
+ })) {
110
+ try {
111
+ const analysis = await deps.runAnalysis(targetDir, { branch: currentBranch, skipAgentsMd: true, skipSkills: true }, config.analyzeTimeoutMs, options.signal, options.onAnalysisCancellationRequested, analysisParallelism);
112
+ throwIfAborted(options.signal);
113
+ stats = analysis.stats;
114
+ analyzeStatus = 'success';
115
+ analyzedCommitId = currentCommit;
116
+ analyzeConsecutiveFailures = 0;
117
+ lastAnalyzeError = undefined;
118
+ }
119
+ catch (err) {
120
+ if (options.signal?.aborted)
121
+ throw err;
122
+ analyzeStatus = 'failed';
123
+ analyzeConsecutiveFailures += 1;
124
+ lastAnalyzeError = shortErrorMessage(err);
125
+ logger.error(`[auto-sync] Analysis failed for ${targetDir}; consecutive failures ${analyzeConsecutiveFailures}/${config.analyzeFailureThreshold}: ${lastAnalyzeError}`);
126
+ }
127
+ }
128
+ else {
129
+ logger.info(`[auto-sync] Skip analysis for ${targetDir}; commit unchanged.`);
130
+ }
131
+ throwIfAborted(options.signal);
132
+ return {
133
+ kind: 'synced',
134
+ project: item.project,
135
+ repoName,
136
+ remoteUrl: item.remoteUrl,
137
+ targetDir,
138
+ branch: currentBranch,
139
+ currentCommit,
140
+ analyzedCommitId,
141
+ analyzeStatus,
142
+ analyzeConsecutiveFailures,
143
+ lastAnalyzeError,
144
+ groupSyncPending,
145
+ stats,
146
+ stateKey,
147
+ lastSyncTime,
148
+ };
149
+ }
150
+ catch (err) {
151
+ if (options.signal?.aborted)
152
+ throw err;
153
+ logger.error(`[auto-sync] Repository sync failed for ${item.remoteUrl}: ${err.message}`);
154
+ return {
155
+ kind: 'failed',
156
+ project: item.project,
157
+ remoteUrl: item.remoteUrl,
158
+ targetDir: item.targetDir ?? '',
159
+ status: 'sync_failed',
160
+ lastSyncTime,
161
+ };
162
+ }
163
+ });
164
+ for (const repoResult of repoResults) {
165
+ if (repoResult.kind === 'failed') {
166
+ result.failed += 1;
167
+ commitInfoEntries.push({
168
+ remoteUrl: repoResult.remoteUrl,
169
+ localPath: repoResult.targetDir,
170
+ branch: repoResult.branch,
171
+ status: repoResult.status,
172
+ lastSyncTime: repoResult.lastSyncTime,
173
+ });
174
+ continue;
175
+ }
176
+ result.synced += 1;
177
+ let analyzeStatus = repoResult.analyzeStatus;
178
+ let analyzeConsecutiveFailures = repoResult.analyzeConsecutiveFailures;
179
+ let lastAnalyzeError = repoResult.lastAnalyzeError;
180
+ let analyzedCommitId = repoResult.analyzedCommitId;
181
+ if (analyzeStatus === 'success') {
182
+ const meta = {
183
+ repoPath: repoResult.targetDir,
184
+ lastCommit: repoResult.currentCommit,
185
+ indexedAt: repoResult.lastSyncTime,
186
+ stats: repoResult.stats,
187
+ branch: repoResult.branch,
188
+ remoteUrl: repoResult.remoteUrl,
189
+ };
190
+ try {
191
+ // Reproduce the placement the analyze worker already made. Registering
192
+ // without a branch always takes the primary/flat arm, which relabels a
193
+ // pinned branch entry with whatever this tick happened to sync — visible
194
+ // on the documented branch-fallback path.
195
+ const placement = await deps.resolveBranchPlacement(repoResult.targetDir, repoResult.branch);
196
+ await deps.registerRepo(repoResult.targetDir, meta, {
197
+ name: getAutoSyncRepoIdentity(repoResult.remoteUrl),
198
+ // Omitted rather than passed as undefined, so a primary index is
199
+ // registered with the same option shape it had before this branch.
200
+ ...(placement.branch ? { branch: placement.branch } : {}),
201
+ });
202
+ result.analyzed += 1;
203
+ }
204
+ catch (err) {
205
+ analyzeStatus = 'failed';
206
+ analyzedCommitId = undefined;
207
+ analyzeConsecutiveFailures += 1;
208
+ lastAnalyzeError = `Repository registration failed: ${shortErrorMessage(err)}`;
209
+ result.failed += 1;
210
+ logger.error(`[auto-sync] ${lastAnalyzeError}`);
211
+ }
212
+ }
213
+ else if (analyzeStatus === 'failed') {
214
+ result.failed += 1;
215
+ }
216
+ else {
217
+ result.skippedAnalysis += 1;
218
+ }
219
+ const stateEntry = {
220
+ codeCommitId: repoResult.currentCommit,
221
+ analyzedCommitId,
222
+ lastAnalyzeStatus: analyzeStatus,
223
+ analyzeConsecutiveFailures,
224
+ lastAnalyzeError,
225
+ groupSyncPending: repoResult.groupSyncPending,
226
+ lastSyncTime: repoResult.lastSyncTime,
227
+ };
228
+ state[repoResult.stateKey] = stateEntry;
229
+ commitInfoEntries.push({
230
+ remoteUrl: repoResult.remoteUrl,
231
+ localPath: repoResult.targetDir,
232
+ branch: repoResult.branch,
233
+ codeCommitId: repoResult.currentCommit,
234
+ analyzedCommitId,
235
+ status: analyzeStatus,
236
+ analyzeConsecutiveFailures,
237
+ analyzeFailureThreshold: config.analyzeFailureThreshold,
238
+ lastAnalyzeError,
239
+ lastSyncTime: repoResult.lastSyncTime,
240
+ });
241
+ if (repoResult.project.groupName) {
242
+ let groupMembershipOk = false;
243
+ let membershipAdded = false;
244
+ try {
245
+ membershipAdded = await deps.addRepoToGroup(repoResult.project, getAutoSyncRepoIdentity(repoResult.remoteUrl), getAutoSyncRepoIdentity(repoResult.remoteUrl));
246
+ groupMembershipOk = true;
247
+ }
248
+ catch (err) {
249
+ result.failed += 1;
250
+ logger.error(`[auto-sync] Group update failed for ${repoResult.project.groupName}: ${err.message}`);
251
+ }
252
+ if (groupMembershipOk &&
253
+ (analyzeStatus === 'success' ||
254
+ (membershipAdded && analyzeStatus === 'skipped') ||
255
+ (analyzeStatus === 'skipped' && repoResult.groupSyncPending))) {
256
+ const groupName = repoResult.project.groupName;
257
+ groupsToSync.add(groupName);
258
+ const keys = groupStateKeys.get(groupName) ?? [];
259
+ keys.push(repoResult.stateKey);
260
+ groupStateKeys.set(groupName, keys);
261
+ }
262
+ }
263
+ }
264
+ await deps.saveState(state);
265
+ await deps.writeCommitInfo(commitInfoEntries);
266
+ let groupStateChanged = false;
267
+ for (const groupName of groupsToSync) {
268
+ try {
269
+ await deps.syncGroupByName(groupName);
270
+ for (const stateKey of groupStateKeys.get(groupName) ?? []) {
271
+ if (state[stateKey].groupSyncPending) {
272
+ state[stateKey].groupSyncPending = false;
273
+ groupStateChanged = true;
274
+ }
275
+ }
276
+ }
277
+ catch (err) {
278
+ result.failed += 1;
279
+ for (const stateKey of groupStateKeys.get(groupName) ?? []) {
280
+ if (!state[stateKey].groupSyncPending) {
281
+ state[stateKey].groupSyncPending = true;
282
+ groupStateChanged = true;
283
+ }
284
+ }
285
+ logger.error(`[auto-sync] Group sync failed for ${groupName}: ${err.message}`);
286
+ }
287
+ }
288
+ if (groupStateChanged)
289
+ await deps.saveState(state);
290
+ return result;
291
+ }
292
+ function shortErrorMessage(err) {
293
+ const message = err instanceof Error ? err.message : String(err);
294
+ return message.replace(/\s+/g, ' ').slice(0, 240);
295
+ }
296
+ export function getConfiguredRepoPath(project, repoName, remoteUrl) {
297
+ if (!remoteUrl)
298
+ return path.resolve(project.localPath, repoName);
299
+ const identity = getAutoSyncRepoIdentity(remoteUrl);
300
+ return path.resolve(project.localPath, ...identity.split('/').slice(0, -1), repoName);
301
+ }
302
+ export async function addRepoToGroup(project, groupPath, registryName = groupPath) {
303
+ if (!project.groupName)
304
+ return false;
305
+ const groupDir = getGroupDir(getDefaultGitnexusDir(), project.groupName);
306
+ const config = await loadGroupConfig(groupDir);
307
+ if (config.repos[groupPath] === registryName)
308
+ return false;
309
+ if (config.repos[groupPath] !== undefined) {
310
+ throw new Error(`group path ${groupPath} is already mapped to ${config.repos[groupPath]}`);
311
+ }
312
+ config.repos[groupPath] = registryName;
313
+ await writeGroupConfigAtomic(path.join(groupDir, 'group.yaml'), config);
314
+ return true;
315
+ }
316
+ export function getAutoSyncRepoIdentity(remoteUrl) {
317
+ validateAutoSyncRemoteUrl(remoteUrl);
318
+ const [, host, remotePath] = /^git@([^:\s/]+):([^\s]+)$/.exec(remoteUrl.trim());
319
+ return `${host.toLowerCase()}/${remotePath.replace(/\.git$/i, '')}`;
320
+ }
321
+ export async function syncGroupByName(groupName) {
322
+ const groupDir = getGroupDir(getDefaultGitnexusDir(), groupName);
323
+ const config = await loadGroupConfig(groupDir);
324
+ await syncGroup(config, { groupDir });
325
+ }
326
+ async function writeGroupConfigAtomic(filePath, config) {
327
+ const tmpPath = `${filePath}.tmp.${process.pid}.${Date.now()}`;
328
+ await fs.writeFile(tmpPath, yaml.dump(config), 'utf-8');
329
+ await fs.rename(tmpPath, filePath);
330
+ }
331
+ export function resolveActualConcurrency(configured, availableMemoryGB) {
332
+ const memoryLimit = Math.max(1, Math.floor(availableMemoryGB / 2));
333
+ return Math.max(1, Math.min(configured, memoryLimit));
334
+ }
335
+ async function buildWorkItems(config, deps) {
336
+ const items = [];
337
+ const targetOwners = new Map();
338
+ for (const project of config.projects) {
339
+ let cloneRoot;
340
+ try {
341
+ cloneRoot = await deps.resolveCloneRoot(project.localPath);
342
+ }
343
+ catch (err) {
344
+ for (const remoteUrl of project.remoteUrls) {
345
+ items.push({ project, remoteUrl, error: shortErrorMessage(err) });
346
+ }
347
+ continue;
348
+ }
349
+ for (const remoteUrl of project.remoteUrls) {
350
+ try {
351
+ const repoName = extractRepoNameFromRemoteUrl(remoteUrl);
352
+ const targetDir = getConfiguredRepoPath({ localPath: cloneRoot.root }, repoName, remoteUrl);
353
+ const previous = targetOwners.get(targetDir);
354
+ if (previous !== undefined) {
355
+ throw new Error(`Duplicate auto-sync targetDir ${targetDir} for ${previous} and ${remoteUrl}`);
356
+ }
357
+ targetOwners.set(targetDir, remoteUrl);
358
+ items.push({ project, remoteUrl, cloneRoot, repoName, targetDir });
359
+ }
360
+ catch (err) {
361
+ items.push({ project, remoteUrl, error: shortErrorMessage(err) });
362
+ }
363
+ }
364
+ }
365
+ return items;
366
+ }
367
+ async function mapWithConcurrency(items, concurrency, signal, worker) {
368
+ const results = new Array(items.length);
369
+ let nextIndex = 0;
370
+ const runners = Array.from({ length: Math.min(concurrency, items.length) }, async () => {
371
+ while (nextIndex < items.length) {
372
+ throwIfAborted(signal);
373
+ const currentIndex = nextIndex;
374
+ nextIndex += 1;
375
+ results[currentIndex] = await worker(items[currentIndex]);
376
+ throwIfAborted(signal);
377
+ }
378
+ });
379
+ // Settle every runner before surfacing a failure. Promise.all rejects on the
380
+ // first error while siblings are still inside a clone or waiting on an
381
+ // analyze fork, and the caller treats that rejection as "the run is over" —
382
+ // it releases the watch mutex and exits, orphaning those children. Each
383
+ // runner already refuses new work at the abort check above, so waiting here
384
+ // costs nothing on the cancel path.
385
+ const settlements = await Promise.allSettled(runners);
386
+ const failure = settlements.find((s) => s.status === 'rejected');
387
+ if (failure)
388
+ throw failure.reason;
389
+ return results;
390
+ }
391
+ function throwIfAborted(signal) {
392
+ if (signal?.aborted)
393
+ throw new Error('Auto-sync run cancelled.');
394
+ }
395
+ async function syncFirstAvailableBranch(input) {
396
+ const failures = [];
397
+ let sawTimeout = false;
398
+ for (const branch of input.item.project.branches) {
399
+ try {
400
+ await input.deps.cloneOrPull(input.item.remoteUrl, input.targetDir, undefined, {
401
+ allowedCloneRoot: input.item.cloneRoot.root,
402
+ expectedRepoName: input.repoName,
403
+ quarantineRoot: input.item.cloneRoot.quarantineRoot,
404
+ allowAutoSyncSsh: true,
405
+ timeoutMs: input.timeoutMs,
406
+ branch,
407
+ overwriteLocalChanges: input.item.project.overwriteLocalChanges,
408
+ });
409
+ const currentBranch = await input.deps.getCurrentBranch(input.targetDir, input.timeoutMs);
410
+ if (currentBranch === branch)
411
+ return { ok: true, branch };
412
+ failures.push(`${branch}: checked out ${currentBranch ?? '<detached>'}`);
413
+ input.logger.warn(`[auto-sync] Branch ${branch} for ${input.item.remoteUrl} synced but current branch is ${currentBranch ?? '<detached>'}; trying next branch.`);
414
+ }
415
+ catch (err) {
416
+ const message = err.message;
417
+ if (message.includes('timed out'))
418
+ sawTimeout = true;
419
+ failures.push(`${branch}: ${message}`);
420
+ input.logger.warn(`[auto-sync] Branch ${branch} unavailable for ${input.item.remoteUrl}: ${message}`);
421
+ }
422
+ }
423
+ return {
424
+ ok: false,
425
+ status: sawTimeout ? 'sync_timeout' : 'branch_unavailable',
426
+ message: failures.join('; '),
427
+ };
428
+ }
@@ -0,0 +1,50 @@
1
+ import { runAutoSyncOnce } from './runner.js';
2
+ export interface AutoSyncStartHandle {
3
+ stop(): Promise<void>;
4
+ }
5
+ export type WatchStatusState = 'running' | 'cancelling' | 'stopping' | 'stopped' | 'stale' | 'error';
6
+ export type AutoSyncWatchStopResult = 'stopped' | 'not_running' | 'refused' | 'timeout';
7
+ export interface WatchStatusRecord {
8
+ state: WatchStatusState;
9
+ pid?: number;
10
+ ownerId?: string;
11
+ configPath?: string;
12
+ message?: string;
13
+ updatedAt: string;
14
+ }
15
+ export interface WatchOwnerRecord {
16
+ pid: number;
17
+ ownerId: string;
18
+ processStartTime: string;
19
+ createdAt: string;
20
+ }
21
+ export interface AutoSyncWatchPaths {
22
+ pidPath: string;
23
+ mutexPath: string;
24
+ ownerPath: string;
25
+ statusPath: string;
26
+ }
27
+ export interface AutoSyncWatchControlDeps {
28
+ isProcessAlive(pid: number): boolean;
29
+ readProcessCommand(pid: number): string | undefined;
30
+ readProcessStartTime(pid: number): string | undefined;
31
+ sleep(ms: number): Promise<void>;
32
+ }
33
+ export declare function getAutoSyncWatchPaths(gitnexusDir?: string): AutoSyncWatchPaths;
34
+ export declare function startAutoSyncWatch(options?: {
35
+ setIntervalFn?: typeof setInterval;
36
+ clearIntervalFn?: typeof clearInterval;
37
+ runOnce?: typeof runAutoSyncOnce;
38
+ stderr?: Pick<NodeJS.WriteStream, 'write'>;
39
+ keepAlive?: boolean;
40
+ paths?: AutoSyncWatchPaths;
41
+ deps?: Partial<AutoSyncWatchControlDeps>;
42
+ }): Promise<AutoSyncStartHandle | null>;
43
+ export declare function stopAutoSyncWatch(options?: {
44
+ paths?: AutoSyncWatchPaths;
45
+ stderr?: Pick<NodeJS.WriteStream, 'write'>;
46
+ deps?: Partial<AutoSyncWatchControlDeps>;
47
+ timeoutMs?: number;
48
+ pollMs?: number;
49
+ }): Promise<AutoSyncWatchStopResult>;
50
+ export declare function readAutoSyncWatchStatus(paths?: AutoSyncWatchPaths, deps?: Partial<AutoSyncWatchControlDeps>): Promise<WatchStatusRecord>;