homegraph 1.2.0 → 1.5.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 (560) hide show
  1. package/README.md +48 -11
  2. package/dist/bin/homegraph.js +298 -72
  3. package/dist/bin/homegraph.js.map +1 -1
  4. package/dist/context/index.d.ts.map +1 -1
  5. package/dist/context/index.js +117 -11
  6. package/dist/context/index.js.map +1 -1
  7. package/dist/db/index.d.ts +207 -6
  8. package/dist/db/index.d.ts.map +1 -1
  9. package/dist/db/index.js +461 -20
  10. package/dist/db/index.js.map +1 -1
  11. package/dist/db/migrations.d.ts +1 -1
  12. package/dist/db/migrations.d.ts.map +1 -1
  13. package/dist/db/migrations.js +19 -1
  14. package/dist/db/migrations.js.map +1 -1
  15. package/dist/db/queries.d.ts +157 -3
  16. package/dist/db/queries.d.ts.map +1 -1
  17. package/dist/db/queries.js +426 -9
  18. package/dist/db/queries.js.map +1 -1
  19. package/dist/db/schema.sql +32 -1
  20. package/dist/db/sqlite-adapter.d.ts +24 -17
  21. package/dist/db/sqlite-adapter.d.ts.map +1 -1
  22. package/dist/db/sqlite-adapter.js +292 -36
  23. package/dist/db/sqlite-adapter.js.map +1 -1
  24. package/dist/db/wal-valve.d.ts +119 -0
  25. package/dist/db/wal-valve.d.ts.map +1 -0
  26. package/dist/db/wal-valve.js +290 -0
  27. package/dist/db/wal-valve.js.map +1 -0
  28. package/dist/directory.d.ts +9 -5
  29. package/dist/directory.d.ts.map +1 -1
  30. package/dist/directory.js +210 -19
  31. package/dist/directory.js.map +1 -1
  32. package/dist/extraction/arkts-batch-worker.js +3 -2
  33. package/dist/extraction/arkts-batch-worker.js.map +1 -1
  34. package/dist/extraction/cfml-extractor.d.ts +107 -0
  35. package/dist/extraction/cfml-extractor.d.ts.map +1 -0
  36. package/dist/extraction/cfml-extractor.js +494 -0
  37. package/dist/extraction/cfml-extractor.js.map +1 -0
  38. package/dist/extraction/default-ignore.d.ts +39 -0
  39. package/dist/extraction/default-ignore.d.ts.map +1 -0
  40. package/dist/extraction/default-ignore.js +221 -0
  41. package/dist/extraction/default-ignore.js.map +1 -0
  42. package/dist/extraction/grammars.d.ts +25 -1
  43. package/dist/extraction/grammars.d.ts.map +1 -1
  44. package/dist/extraction/grammars.js +177 -24
  45. package/dist/extraction/grammars.js.map +1 -1
  46. package/dist/extraction/index.d.ts +52 -14
  47. package/dist/extraction/index.d.ts.map +1 -1
  48. package/dist/extraction/index.js +521 -314
  49. package/dist/extraction/index.js.map +1 -1
  50. package/dist/extraction/languages/arkts.d.ts +90 -6
  51. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  52. package/dist/extraction/languages/arkts.js +1579 -128
  53. package/dist/extraction/languages/arkts.js.map +1 -1
  54. package/dist/extraction/languages/c-cpp.d.ts +42 -0
  55. package/dist/extraction/languages/c-cpp.d.ts.map +1 -1
  56. package/dist/extraction/languages/c-cpp.js +369 -4
  57. package/dist/extraction/languages/c-cpp.js.map +1 -1
  58. package/dist/extraction/languages/cfquery.d.ts +12 -0
  59. package/dist/extraction/languages/cfquery.d.ts.map +1 -0
  60. package/dist/extraction/languages/cfquery.js +28 -0
  61. package/dist/extraction/languages/cfquery.js.map +1 -0
  62. package/dist/extraction/languages/cfscript.d.ts +3 -0
  63. package/dist/extraction/languages/cfscript.d.ts.map +1 -0
  64. package/dist/extraction/languages/cfscript.js +73 -0
  65. package/dist/extraction/languages/cfscript.js.map +1 -0
  66. package/dist/extraction/languages/cobol.d.ts +33 -0
  67. package/dist/extraction/languages/cobol.d.ts.map +1 -0
  68. package/dist/extraction/languages/cobol.js +499 -0
  69. package/dist/extraction/languages/cobol.js.map +1 -0
  70. package/dist/extraction/languages/erlang.d.ts +3 -0
  71. package/dist/extraction/languages/erlang.d.ts.map +1 -0
  72. package/dist/extraction/languages/erlang.js +350 -0
  73. package/dist/extraction/languages/erlang.js.map +1 -0
  74. package/dist/extraction/languages/index.d.ts.map +1 -1
  75. package/dist/extraction/languages/index.js +16 -0
  76. package/dist/extraction/languages/index.js.map +1 -1
  77. package/dist/extraction/languages/nix.d.ts +3 -0
  78. package/dist/extraction/languages/nix.d.ts.map +1 -0
  79. package/dist/extraction/languages/nix.js +294 -0
  80. package/dist/extraction/languages/nix.js.map +1 -0
  81. package/dist/extraction/languages/solidity.d.ts +3 -0
  82. package/dist/extraction/languages/solidity.d.ts.map +1 -0
  83. package/dist/extraction/languages/solidity.js +293 -0
  84. package/dist/extraction/languages/solidity.js.map +1 -0
  85. package/dist/extraction/languages/terraform.d.ts +3 -0
  86. package/dist/extraction/languages/terraform.d.ts.map +1 -0
  87. package/dist/extraction/languages/terraform.js +641 -0
  88. package/dist/extraction/languages/terraform.js.map +1 -0
  89. package/dist/extraction/languages/vbnet.d.ts +11 -0
  90. package/dist/extraction/languages/vbnet.d.ts.map +1 -0
  91. package/dist/extraction/languages/vbnet.js +141 -0
  92. package/dist/extraction/languages/vbnet.js.map +1 -0
  93. package/dist/extraction/mybatis-extractor.d.ts +30 -10
  94. package/dist/extraction/mybatis-extractor.d.ts.map +1 -1
  95. package/dist/extraction/mybatis-extractor.js +140 -38
  96. package/dist/extraction/mybatis-extractor.js.map +1 -1
  97. package/dist/extraction/parse-pool.d.ts +27 -1
  98. package/dist/extraction/parse-pool.d.ts.map +1 -1
  99. package/dist/extraction/parse-pool.js +75 -7
  100. package/dist/extraction/parse-pool.js.map +1 -1
  101. package/dist/extraction/parse-worker.js +9 -2
  102. package/dist/extraction/parse-worker.js.map +1 -1
  103. package/dist/extraction/store-worker.d.ts +20 -0
  104. package/dist/extraction/store-worker.d.ts.map +1 -0
  105. package/dist/extraction/store-worker.js +102 -0
  106. package/dist/extraction/store-worker.js.map +1 -0
  107. package/dist/extraction/store-writer.d.ts +48 -0
  108. package/dist/extraction/store-writer.d.ts.map +1 -0
  109. package/dist/extraction/store-writer.js +167 -0
  110. package/dist/extraction/store-writer.js.map +1 -0
  111. package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -1
  112. package/dist/extraction/tree-sitter-helpers.js +1 -0
  113. package/dist/extraction/tree-sitter-helpers.js.map +1 -1
  114. package/dist/extraction/tree-sitter-types.d.ts +3 -1
  115. package/dist/extraction/tree-sitter-types.d.ts.map +1 -1
  116. package/dist/extraction/tree-sitter.d.ts +38 -0
  117. package/dist/extraction/tree-sitter.d.ts.map +1 -1
  118. package/dist/extraction/tree-sitter.js +801 -10
  119. package/dist/extraction/tree-sitter.js.map +1 -1
  120. package/dist/extraction/wasm/tree-sitter-arkts.wasm +0 -0
  121. package/dist/extraction/wasm/tree-sitter-cfml.wasm +0 -0
  122. package/dist/extraction/wasm/tree-sitter-cfquery.wasm +0 -0
  123. package/dist/extraction/wasm/tree-sitter-cfscript.wasm +0 -0
  124. package/dist/extraction/wasm/tree-sitter-cobol.wasm +0 -0
  125. package/dist/extraction/wasm/tree-sitter-erlang.wasm +0 -0
  126. package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
  127. package/dist/extraction/wasm/tree-sitter-terraform.wasm +0 -0
  128. package/dist/extraction/wasm/tree-sitter-vbnet.wasm +0 -0
  129. package/dist/extraction/wasm-runtime-flags.d.ts +14 -4
  130. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
  131. package/dist/extraction/wasm-runtime-flags.js +55 -7
  132. package/dist/extraction/wasm-runtime-flags.js.map +1 -1
  133. package/dist/graph/traversal.d.ts.map +1 -1
  134. package/dist/graph/traversal.js +1 -1
  135. package/dist/graph/traversal.js.map +1 -1
  136. package/dist/index.d.ts +74 -5
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +436 -55
  139. package/dist/index.js.map +1 -1
  140. package/dist/installer/index.d.ts +42 -0
  141. package/dist/installer/index.d.ts.map +1 -1
  142. package/dist/installer/index.js +97 -2
  143. package/dist/installer/index.js.map +1 -1
  144. package/dist/mcp/daemon.d.ts +25 -3
  145. package/dist/mcp/daemon.d.ts.map +1 -1
  146. package/dist/mcp/daemon.js +62 -8
  147. package/dist/mcp/daemon.js.map +1 -1
  148. package/dist/mcp/dynamic-boundaries.d.ts.map +1 -1
  149. package/dist/mcp/dynamic-boundaries.js +2 -1
  150. package/dist/mcp/dynamic-boundaries.js.map +1 -1
  151. package/dist/mcp/early-ppid.d.ts +26 -0
  152. package/dist/mcp/early-ppid.d.ts.map +1 -0
  153. package/dist/mcp/early-ppid.js +29 -0
  154. package/dist/mcp/early-ppid.js.map +1 -0
  155. package/dist/mcp/engine.d.ts +4 -5
  156. package/dist/mcp/engine.d.ts.map +1 -1
  157. package/dist/mcp/engine.js +27 -1
  158. package/dist/mcp/engine.js.map +1 -1
  159. package/dist/mcp/index.d.ts.map +1 -1
  160. package/dist/mcp/index.js +41 -6
  161. package/dist/mcp/index.js.map +1 -1
  162. package/dist/mcp/liveness-watchdog.d.ts +18 -1
  163. package/dist/mcp/liveness-watchdog.d.ts.map +1 -1
  164. package/dist/mcp/liveness-watchdog.js +73 -13
  165. package/dist/mcp/liveness-watchdog.js.map +1 -1
  166. package/dist/mcp/memory-budget.d.ts +30 -0
  167. package/dist/mcp/memory-budget.d.ts.map +1 -0
  168. package/dist/mcp/memory-budget.js +123 -0
  169. package/dist/mcp/memory-budget.js.map +1 -0
  170. package/dist/mcp/proxy.d.ts.map +1 -1
  171. package/dist/mcp/proxy.js +88 -4
  172. package/dist/mcp/proxy.js.map +1 -1
  173. package/dist/mcp/query-cache.d.ts +35 -4
  174. package/dist/mcp/query-cache.d.ts.map +1 -1
  175. package/dist/mcp/query-cache.js +89 -19
  176. package/dist/mcp/query-cache.js.map +1 -1
  177. package/dist/mcp/query-pool.d.ts +46 -12
  178. package/dist/mcp/query-pool.d.ts.map +1 -1
  179. package/dist/mcp/query-pool.js +100 -23
  180. package/dist/mcp/query-pool.js.map +1 -1
  181. package/dist/mcp/query-worker.d.ts +2 -2
  182. package/dist/mcp/query-worker.js +2 -2
  183. package/dist/mcp/server-instructions.d.ts +4 -27
  184. package/dist/mcp/server-instructions.d.ts.map +1 -1
  185. package/dist/mcp/server-instructions.js +39 -84
  186. package/dist/mcp/server-instructions.js.map +1 -1
  187. package/dist/mcp/session.d.ts +14 -0
  188. package/dist/mcp/session.d.ts.map +1 -1
  189. package/dist/mcp/session.js +28 -1
  190. package/dist/mcp/session.js.map +1 -1
  191. package/dist/mcp/startup-handshake.d.ts +44 -0
  192. package/dist/mcp/startup-handshake.d.ts.map +1 -0
  193. package/dist/mcp/startup-handshake.js +73 -0
  194. package/dist/mcp/startup-handshake.js.map +1 -0
  195. package/dist/mcp/tools.d.ts +104 -4
  196. package/dist/mcp/tools.d.ts.map +1 -1
  197. package/dist/mcp/tools.js +2432 -217
  198. package/dist/mcp/tools.js.map +1 -1
  199. package/dist/mcp/transport.d.ts.map +1 -1
  200. package/dist/mcp/transport.js +18 -0
  201. package/dist/mcp/transport.js.map +1 -1
  202. package/dist/project-config.d.ts +38 -0
  203. package/dist/project-config.d.ts.map +1 -1
  204. package/dist/project-config.js +101 -2
  205. package/dist/project-config.js.map +1 -1
  206. package/dist/resolution/c-fnptr-synthesizer.d.ts +2 -1
  207. package/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -1
  208. package/dist/resolution/c-fnptr-synthesizer.js +178 -146
  209. package/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
  210. package/dist/resolution/callback-synthesizer.d.ts +54 -10
  211. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  212. package/dist/resolution/callback-synthesizer.js +1299 -257
  213. package/dist/resolution/callback-synthesizer.js.map +1 -1
  214. package/dist/resolution/cooperative-yield.d.ts +10 -2
  215. package/dist/resolution/cooperative-yield.d.ts.map +1 -1
  216. package/dist/resolution/cooperative-yield.js +6 -4
  217. package/dist/resolution/cooperative-yield.js.map +1 -1
  218. package/dist/resolution/frameworks/cics.d.ts +20 -0
  219. package/dist/resolution/frameworks/cics.d.ts.map +1 -0
  220. package/dist/resolution/frameworks/cics.js +90 -0
  221. package/dist/resolution/frameworks/cics.js.map +1 -0
  222. package/dist/resolution/frameworks/go.d.ts.map +1 -1
  223. package/dist/resolution/frameworks/go.js +29 -6
  224. package/dist/resolution/frameworks/go.js.map +1 -1
  225. package/dist/resolution/frameworks/index.d.ts.map +1 -1
  226. package/dist/resolution/frameworks/index.js +3 -0
  227. package/dist/resolution/frameworks/index.js.map +1 -1
  228. package/dist/resolution/frameworks/java.d.ts.map +1 -1
  229. package/dist/resolution/frameworks/java.js +14 -6
  230. package/dist/resolution/frameworks/java.js.map +1 -1
  231. package/dist/resolution/frameworks/terraform.d.ts +38 -0
  232. package/dist/resolution/frameworks/terraform.d.ts.map +1 -0
  233. package/dist/resolution/frameworks/terraform.js +277 -0
  234. package/dist/resolution/frameworks/terraform.js.map +1 -0
  235. package/dist/resolution/goframe-synthesizer.d.ts +2 -1
  236. package/dist/resolution/goframe-synthesizer.d.ts.map +1 -1
  237. package/dist/resolution/goframe-synthesizer.js +8 -3
  238. package/dist/resolution/goframe-synthesizer.js.map +1 -1
  239. package/dist/resolution/import-resolver.d.ts +9 -3
  240. package/dist/resolution/import-resolver.d.ts.map +1 -1
  241. package/dist/resolution/import-resolver.js +295 -11
  242. package/dist/resolution/import-resolver.js.map +1 -1
  243. package/dist/resolution/index.d.ts +146 -8
  244. package/dist/resolution/index.d.ts.map +1 -1
  245. package/dist/resolution/index.js +1089 -131
  246. package/dist/resolution/index.js.map +1 -1
  247. package/dist/resolution/memory-budget.d.ts +48 -0
  248. package/dist/resolution/memory-budget.d.ts.map +1 -0
  249. package/dist/resolution/memory-budget.js +162 -0
  250. package/dist/resolution/memory-budget.js.map +1 -0
  251. package/dist/resolution/name-matcher.d.ts +12 -4
  252. package/dist/resolution/name-matcher.d.ts.map +1 -1
  253. package/dist/resolution/name-matcher.js +793 -130
  254. package/dist/resolution/name-matcher.js.map +1 -1
  255. package/dist/resolution/resolver-pool.d.ts +106 -0
  256. package/dist/resolution/resolver-pool.d.ts.map +1 -0
  257. package/dist/resolution/resolver-pool.js +344 -0
  258. package/dist/resolution/resolver-pool.js.map +1 -0
  259. package/dist/resolution/resolver-worker.d.ts +17 -0
  260. package/dist/resolution/resolver-worker.d.ts.map +1 -0
  261. package/dist/resolution/resolver-worker.js +141 -0
  262. package/dist/resolution/resolver-worker.js.map +1 -0
  263. package/dist/resolution/strip-comments.d.ts +1 -1
  264. package/dist/resolution/strip-comments.d.ts.map +1 -1
  265. package/dist/resolution/strip-comments.js +49 -0
  266. package/dist/resolution/strip-comments.js.map +1 -1
  267. package/dist/resolution/types.d.ts +32 -0
  268. package/dist/resolution/types.d.ts.map +1 -1
  269. package/dist/resolution/workspace-packages.d.ts +10 -0
  270. package/dist/resolution/workspace-packages.d.ts.map +1 -1
  271. package/dist/resolution/workspace-packages.js +142 -4
  272. package/dist/resolution/workspace-packages.js.map +1 -1
  273. package/dist/search/identifier-segments.d.ts +60 -0
  274. package/dist/search/identifier-segments.d.ts.map +1 -0
  275. package/dist/search/identifier-segments.js +176 -0
  276. package/dist/search/identifier-segments.js.map +1 -0
  277. package/dist/search/query-utils.d.ts +201 -0
  278. package/dist/search/query-utils.d.ts.map +1 -1
  279. package/dist/search/query-utils.js +919 -2
  280. package/dist/search/query-utils.js.map +1 -1
  281. package/dist/spec/build/diff-parser.d.ts +55 -0
  282. package/dist/spec/build/diff-parser.d.ts.map +1 -0
  283. package/dist/spec/build/diff-parser.js +205 -0
  284. package/dist/spec/build/diff-parser.js.map +1 -0
  285. package/dist/spec/build/git-scanner.d.ts +93 -0
  286. package/dist/spec/build/git-scanner.d.ts.map +1 -0
  287. package/dist/spec/build/git-scanner.js +254 -0
  288. package/dist/spec/build/git-scanner.js.map +1 -0
  289. package/dist/spec/build/pipeline.d.ts +54 -0
  290. package/dist/spec/build/pipeline.d.ts.map +1 -0
  291. package/dist/spec/build/pipeline.js +170 -0
  292. package/dist/spec/build/pipeline.js.map +1 -0
  293. package/dist/spec/build/scan.d.ts +48 -0
  294. package/dist/spec/build/scan.d.ts.map +1 -0
  295. package/dist/spec/build/scan.js +89 -0
  296. package/dist/spec/build/scan.js.map +1 -0
  297. package/dist/spec/build/scope-resolver.d.ts +50 -0
  298. package/dist/spec/build/scope-resolver.d.ts.map +1 -0
  299. package/dist/spec/build/scope-resolver.js +105 -0
  300. package/dist/spec/build/scope-resolver.js.map +1 -0
  301. package/dist/spec/build/spec-extractor.d.ts +74 -0
  302. package/dist/spec/build/spec-extractor.d.ts.map +1 -0
  303. package/dist/spec/build/spec-extractor.js +344 -0
  304. package/dist/spec/build/spec-extractor.js.map +1 -0
  305. package/dist/spec/config.d.ts +35 -1
  306. package/dist/spec/config.d.ts.map +1 -1
  307. package/dist/spec/config.js +30 -5
  308. package/dist/spec/config.js.map +1 -1
  309. package/dist/spec/db/fts.d.ts.map +1 -1
  310. package/dist/spec/db/fts.js +19 -50
  311. package/dist/spec/db/fts.js.map +1 -1
  312. package/dist/spec/db/index.d.ts +5 -3
  313. package/dist/spec/db/index.d.ts.map +1 -1
  314. package/dist/spec/db/index.js +16 -1
  315. package/dist/spec/db/index.js.map +1 -1
  316. package/dist/spec/db/persist.d.ts +45 -0
  317. package/dist/spec/db/persist.d.ts.map +1 -0
  318. package/dist/spec/db/persist.js +66 -0
  319. package/dist/spec/db/persist.js.map +1 -0
  320. package/dist/spec/db/relations.d.ts +80 -1
  321. package/dist/spec/db/relations.d.ts.map +1 -1
  322. package/dist/spec/db/relations.js +175 -4
  323. package/dist/spec/db/relations.js.map +1 -1
  324. package/dist/spec/db/schema.d.ts +4 -0
  325. package/dist/spec/db/schema.d.ts.map +1 -1
  326. package/dist/spec/db/schema.js +4 -0
  327. package/dist/spec/db/schema.js.map +1 -1
  328. package/dist/spec/db/schema.sql +5 -1
  329. package/dist/spec/db/spec-node.d.ts +5 -0
  330. package/dist/spec/db/spec-node.d.ts.map +1 -1
  331. package/dist/spec/db/spec-node.js +11 -5
  332. package/dist/spec/db/spec-node.js.map +1 -1
  333. package/dist/spec/db/sql-utils.d.ts +11 -0
  334. package/dist/spec/db/sql-utils.d.ts.map +1 -0
  335. package/dist/spec/db/sql-utils.js +19 -0
  336. package/dist/spec/db/sql-utils.js.map +1 -0
  337. package/dist/spec/evolve/cluster-context.d.ts +30 -0
  338. package/dist/spec/evolve/cluster-context.d.ts.map +1 -0
  339. package/dist/spec/evolve/cluster-context.js +78 -0
  340. package/dist/spec/evolve/cluster-context.js.map +1 -0
  341. package/dist/spec/evolve/commit-spec-analyzer.d.ts +51 -0
  342. package/dist/spec/evolve/commit-spec-analyzer.d.ts.map +1 -0
  343. package/dist/spec/evolve/commit-spec-analyzer.js +88 -0
  344. package/dist/spec/evolve/commit-spec-analyzer.js.map +1 -0
  345. package/dist/spec/evolve/commit-spec-persister.d.ts +53 -0
  346. package/dist/spec/evolve/commit-spec-persister.d.ts.map +1 -0
  347. package/dist/spec/evolve/commit-spec-persister.js +93 -0
  348. package/dist/spec/evolve/commit-spec-persister.js.map +1 -0
  349. package/dist/spec/evolve/impact-locator.d.ts +23 -7
  350. package/dist/spec/evolve/impact-locator.d.ts.map +1 -1
  351. package/dist/spec/evolve/impact-locator.js +58 -14
  352. package/dist/spec/evolve/impact-locator.js.map +1 -1
  353. package/dist/spec/evolve/pipeline.d.ts +62 -25
  354. package/dist/spec/evolve/pipeline.d.ts.map +1 -1
  355. package/dist/spec/evolve/pipeline.js +436 -457
  356. package/dist/spec/evolve/pipeline.js.map +1 -1
  357. package/dist/spec/evolve/spec-rewriter.d.ts +13 -13
  358. package/dist/spec/evolve/spec-rewriter.d.ts.map +1 -1
  359. package/dist/spec/evolve/spec-rewriter.js +45 -45
  360. package/dist/spec/evolve/spec-rewriter.js.map +1 -1
  361. package/dist/spec/git/commits.d.ts +85 -0
  362. package/dist/spec/git/commits.d.ts.map +1 -0
  363. package/dist/spec/git/commits.js +218 -0
  364. package/dist/spec/git/commits.js.map +1 -0
  365. package/dist/spec/git/exec.d.ts +13 -0
  366. package/dist/spec/git/exec.d.ts.map +1 -0
  367. package/dist/spec/git/exec.js +19 -0
  368. package/dist/spec/git/exec.js.map +1 -0
  369. package/dist/spec/git/index.d.ts +9 -0
  370. package/dist/spec/git/index.d.ts.map +1 -0
  371. package/dist/spec/git/index.js +22 -0
  372. package/dist/spec/git/index.js.map +1 -0
  373. package/dist/spec/git-utils.d.ts +8 -0
  374. package/dist/spec/git-utils.d.ts.map +1 -0
  375. package/dist/spec/git-utils.js +14 -0
  376. package/dist/spec/git-utils.js.map +1 -0
  377. package/dist/spec/graph/index.d.ts +8 -0
  378. package/dist/spec/graph/index.d.ts.map +1 -0
  379. package/dist/spec/graph/index.js +17 -0
  380. package/dist/spec/graph/index.js.map +1 -0
  381. package/dist/spec/graph/queries.d.ts +6 -35
  382. package/dist/spec/graph/queries.d.ts.map +1 -1
  383. package/dist/spec/graph/queries.js +71 -248
  384. package/dist/spec/graph/queries.js.map +1 -1
  385. package/dist/spec/llm/agent-client.d.ts +59 -0
  386. package/dist/spec/llm/agent-client.d.ts.map +1 -0
  387. package/dist/spec/llm/agent-client.js +213 -0
  388. package/dist/spec/llm/agent-client.js.map +1 -0
  389. package/dist/spec/llm/agents/claude-code.d.ts +32 -0
  390. package/dist/spec/llm/agents/claude-code.d.ts.map +1 -0
  391. package/dist/spec/llm/agents/claude-code.js +125 -0
  392. package/dist/spec/llm/agents/claude-code.js.map +1 -0
  393. package/dist/spec/llm/agents/codex.d.ts +32 -0
  394. package/dist/spec/llm/agents/codex.d.ts.map +1 -0
  395. package/dist/spec/llm/agents/codex.js +145 -0
  396. package/dist/spec/llm/agents/codex.js.map +1 -0
  397. package/dist/spec/llm/agents/detect-utils.d.ts +28 -0
  398. package/dist/spec/llm/agents/detect-utils.d.ts.map +1 -0
  399. package/dist/spec/llm/agents/detect-utils.js +91 -0
  400. package/dist/spec/llm/agents/detect-utils.js.map +1 -0
  401. package/dist/spec/llm/agents/deveco-code.d.ts +33 -0
  402. package/dist/spec/llm/agents/deveco-code.d.ts.map +1 -0
  403. package/dist/spec/llm/agents/deveco-code.js +165 -0
  404. package/dist/spec/llm/agents/deveco-code.js.map +1 -0
  405. package/dist/spec/llm/agents/index.d.ts +31 -0
  406. package/dist/spec/llm/agents/index.d.ts.map +1 -0
  407. package/dist/spec/llm/agents/index.js +65 -0
  408. package/dist/spec/llm/agents/index.js.map +1 -0
  409. package/dist/spec/llm/agents/types.d.ts +76 -0
  410. package/dist/spec/llm/agents/types.d.ts.map +1 -0
  411. package/dist/spec/llm/agents/types.js +15 -0
  412. package/dist/spec/llm/agents/types.js.map +1 -0
  413. package/dist/spec/llm/client.d.ts +31 -11
  414. package/dist/spec/llm/client.d.ts.map +1 -1
  415. package/dist/spec/llm/client.js +143 -81
  416. package/dist/spec/llm/client.js.map +1 -1
  417. package/dist/spec/llm/factory.d.ts +41 -0
  418. package/dist/spec/llm/factory.d.ts.map +1 -0
  419. package/dist/spec/llm/factory.js +80 -0
  420. package/dist/spec/llm/factory.js.map +1 -0
  421. package/dist/spec/llm/prompts.d.ts +24 -8
  422. package/dist/spec/llm/prompts.d.ts.map +1 -1
  423. package/dist/spec/llm/prompts.js +100 -50
  424. package/dist/spec/llm/prompts.js.map +1 -1
  425. package/dist/spec/llm/retry.d.ts +53 -0
  426. package/dist/spec/llm/retry.d.ts.map +1 -0
  427. package/dist/spec/llm/retry.js +153 -0
  428. package/dist/spec/llm/retry.js.map +1 -0
  429. package/dist/spec/mine/clusterer.d.ts +63 -0
  430. package/dist/spec/mine/clusterer.d.ts.map +1 -0
  431. package/dist/spec/mine/clusterer.js +904 -0
  432. package/dist/spec/mine/clusterer.js.map +1 -0
  433. package/dist/spec/mine/clustering/features.d.ts +38 -0
  434. package/dist/spec/mine/clustering/features.d.ts.map +1 -0
  435. package/dist/spec/mine/clustering/features.js +108 -0
  436. package/dist/spec/mine/clustering/features.js.map +1 -0
  437. package/dist/spec/mine/clustering/index.d.ts +62 -0
  438. package/dist/spec/mine/clustering/index.d.ts.map +1 -0
  439. package/dist/spec/mine/clustering/index.js +259 -0
  440. package/dist/spec/mine/clustering/index.js.map +1 -0
  441. package/dist/spec/mine/clustering/leiden.d.ts +61 -0
  442. package/dist/spec/mine/clustering/leiden.d.ts.map +1 -0
  443. package/dist/spec/mine/clustering/leiden.js +489 -0
  444. package/dist/spec/mine/clustering/leiden.js.map +1 -0
  445. package/dist/spec/mine/clustering/text-similarity.d.ts +22 -0
  446. package/dist/spec/mine/clustering/text-similarity.d.ts.map +1 -0
  447. package/dist/spec/mine/clustering/text-similarity.js +98 -0
  448. package/dist/spec/mine/clustering/text-similarity.js.map +1 -0
  449. package/dist/spec/mine/generator.d.ts +54 -0
  450. package/dist/spec/mine/generator.d.ts.map +1 -0
  451. package/dist/spec/mine/generator.js +267 -0
  452. package/dist/spec/mine/generator.js.map +1 -0
  453. package/dist/spec/mine/persist.d.ts +37 -0
  454. package/dist/spec/mine/persist.d.ts.map +1 -0
  455. package/dist/spec/mine/persist.js +170 -0
  456. package/dist/spec/mine/persist.js.map +1 -0
  457. package/dist/spec/mine/pipeline.d.ts +41 -0
  458. package/dist/spec/mine/pipeline.d.ts.map +1 -0
  459. package/dist/spec/mine/pipeline.js +236 -0
  460. package/dist/spec/mine/pipeline.js.map +1 -0
  461. package/dist/spec/mine/progress-handler.d.ts +22 -0
  462. package/dist/spec/mine/progress-handler.d.ts.map +1 -0
  463. package/dist/spec/mine/progress-handler.js +108 -0
  464. package/dist/spec/mine/progress-handler.js.map +1 -0
  465. package/dist/spec/mine/progress.d.ts +23 -0
  466. package/dist/spec/mine/progress.d.ts.map +1 -0
  467. package/dist/spec/mine/progress.js +12 -0
  468. package/dist/spec/mine/progress.js.map +1 -0
  469. package/dist/spec/mine/scanner.d.ts +59 -0
  470. package/dist/spec/mine/scanner.d.ts.map +1 -0
  471. package/dist/spec/mine/scanner.js +383 -0
  472. package/dist/spec/mine/scanner.js.map +1 -0
  473. package/dist/spec/types.d.ts +32 -0
  474. package/dist/spec/types.d.ts.map +1 -1
  475. package/dist/spec/ui/index.d.ts +9 -0
  476. package/dist/spec/ui/index.d.ts.map +1 -0
  477. package/dist/spec/ui/index.js +16 -0
  478. package/dist/spec/ui/index.js.map +1 -0
  479. package/dist/spec/ui/progress-handler.d.ts +33 -0
  480. package/dist/spec/ui/progress-handler.d.ts.map +1 -0
  481. package/dist/spec/ui/progress-handler.js +132 -0
  482. package/dist/spec/ui/progress-handler.js.map +1 -0
  483. package/dist/spec/ui/progress.d.ts +24 -0
  484. package/dist/spec/ui/progress.d.ts.map +1 -0
  485. package/dist/spec/ui/progress.js +13 -0
  486. package/dist/spec/ui/progress.js.map +1 -0
  487. package/dist/spec/utils/fs.d.ts +45 -0
  488. package/dist/spec/utils/fs.d.ts.map +1 -0
  489. package/dist/spec/utils/fs.js +163 -0
  490. package/dist/spec/utils/fs.js.map +1 -0
  491. package/dist/spec/utils/index.d.ts +12 -0
  492. package/dist/spec/utils/index.d.ts.map +1 -0
  493. package/dist/spec/utils/index.js +26 -0
  494. package/dist/spec/utils/index.js.map +1 -0
  495. package/dist/spec/utils/meta.d.ts +32 -0
  496. package/dist/spec/utils/meta.d.ts.map +1 -0
  497. package/dist/spec/utils/meta.js +122 -0
  498. package/dist/spec/utils/meta.js.map +1 -0
  499. package/dist/spec/utils/truncate.d.ts +86 -0
  500. package/dist/spec/utils/truncate.d.ts.map +1 -0
  501. package/dist/spec/utils/truncate.js +172 -0
  502. package/dist/spec/utils/truncate.js.map +1 -0
  503. package/dist/spec/utils.d.ts +4 -16
  504. package/dist/spec/utils.d.ts.map +1 -1
  505. package/dist/spec/utils.js +6 -58
  506. package/dist/spec/utils.js.map +1 -1
  507. package/dist/sync/git-hooks.d.ts.map +1 -1
  508. package/dist/sync/git-hooks.js +2 -0
  509. package/dist/sync/git-hooks.js.map +1 -1
  510. package/dist/sync/watcher.d.ts +35 -6
  511. package/dist/sync/watcher.d.ts.map +1 -1
  512. package/dist/sync/watcher.js +127 -17
  513. package/dist/sync/watcher.js.map +1 -1
  514. package/dist/sync/worktree.d.ts.map +1 -1
  515. package/dist/sync/worktree.js +5 -0
  516. package/dist/sync/worktree.js.map +1 -1
  517. package/dist/telemetry/index.js +3 -3
  518. package/dist/telemetry/index.js.map +1 -1
  519. package/dist/types.d.ts +22 -1
  520. package/dist/types.d.ts.map +1 -1
  521. package/dist/types.js +10 -0
  522. package/dist/types.js.map +1 -1
  523. package/dist/upgrade/index.d.ts +32 -0
  524. package/dist/upgrade/index.d.ts.map +1 -1
  525. package/dist/upgrade/index.js +162 -14
  526. package/dist/upgrade/index.js.map +1 -1
  527. package/dist/upgrade/remove-binary.d.ts +87 -0
  528. package/dist/upgrade/remove-binary.d.ts.map +1 -0
  529. package/dist/upgrade/remove-binary.js +289 -0
  530. package/dist/upgrade/remove-binary.js.map +1 -0
  531. package/dist/upgrade/update-check.d.ts +92 -0
  532. package/dist/upgrade/update-check.d.ts.map +1 -0
  533. package/dist/upgrade/update-check.js +258 -0
  534. package/dist/upgrade/update-check.js.map +1 -0
  535. package/package.json +6 -2
  536. package/scripts/agent-eval/run-all.sh +6 -0
  537. package/scripts/build-bundle.sh +5 -0
  538. package/scripts/npm-shim.js +8 -1
  539. package/scripts/exp_boundary_eval/__pycache__/_utils.cpython-310.pyc +0 -0
  540. package/scripts/exp_boundary_eval/__pycache__/analyze.cpython-310.pyc +0 -0
  541. package/scripts/exp_boundary_eval/__pycache__/deveco_arm.cpython-310.pyc +0 -0
  542. package/scripts/exp_boundary_eval/__pycache__/run_one.cpython-310.pyc +0 -0
  543. package/scripts/exp_boundary_eval/__pycache__/run_session.cpython-310.pyc +0 -0
  544. package/scripts/exp_boundary_eval/__pycache__/setup.cpython-310.pyc +0 -0
  545. package/scripts/exp_boundary_eval/data/agents.json +0 -109
  546. package/scripts/exp_boundary_eval/data/experiments.json +0 -140
  547. package/scripts/qa_eval/README.md +0 -407
  548. package/scripts/qa_eval/_test_deveco_probe.py +0 -41
  549. package/scripts/qa_eval/agent_runner.py +0 -526
  550. package/scripts/qa_eval/data/.gitignore +0 -4
  551. package/scripts/qa_eval/data/test-set.jsonl +0 -2
  552. package/scripts/qa_eval/eval_metrics.py +0 -274
  553. package/scripts/qa_eval/external_agent.py +0 -976
  554. package/scripts/qa_eval/llm_config.py +0 -92
  555. package/scripts/qa_eval/memory_monitor.py +0 -132
  556. package/scripts/qa_eval/my_answer_accuracy.py +0 -187
  557. package/scripts/qa_eval/requirements.txt +0 -2
  558. package/scripts/qa_eval/run_pipeline.py +0 -804
  559. package/scripts/qa_eval/stats_efficiency.py +0 -279
  560. package/scripts/qa_eval/stats_scores.py +0 -207
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+ /**
3
+ * CLI binary removal for `homegraph uninstall` (the #1071 shadow, uninstall
4
+ * edition).
5
+ *
6
+ * Before this module, three disconnected paths each removed PART of an
7
+ * installation and none removed it all: `homegraph uninstall` swept agent
8
+ * configs only, `install.sh --uninstall` deleted the bundle only, and npm's
9
+ * `preuninstall` hook cleaned configs when npm removed its own package. A
10
+ * user with more than one install method (the common drift: npm first, the
11
+ * bundle later — or vice versa) ran `homegraph uninstall` and still had a
12
+ * working `homegraph` on PATH.
13
+ *
14
+ * This module makes `homegraph uninstall` complete: PLAN every binary
15
+ * install present on the machine (bundle layout(s), the npm global package,
16
+ * the bin-dir shim), then EXECUTE the removals. Split planner/executor with
17
+ * injected side effects, same convention as the upgrade orchestrator.
18
+ *
19
+ * Safety rules:
20
+ * - A source checkout is REPORTED, never deleted — a git repo is the
21
+ * user's working tree, not an "install".
22
+ * - A project-local npm install is left alone — the project's
23
+ * package.json owns it, not the machine-level uninstaller.
24
+ * - On unix the default install dir (`~/.homegraph`) doubles as the
25
+ * machine-level state dir (telemetry choice, daemon records, the
26
+ * update-check cache) — only the install ARTIFACTS (`versions/`,
27
+ * `current`) are removed there, never the whole dir. A dedicated
28
+ * install dir (Windows `%LOCALAPPDATA%\homegraph`, or a custom
29
+ * `HOMEGRAPH_INSTALL_DIR`) is removed wholesale.
30
+ * - The bin-dir shim is removed only when it verifiably points into a
31
+ * detected install dir — a user's unrelated `homegraph` file survives.
32
+ * - Windows cannot DELETE a running exe but CAN rename it (the same
33
+ * trick the in-place upgrade uses): a locked `node.exe` is renamed
34
+ * aside and reported as a leftover for the user to delete after the
35
+ * window closes, instead of failing the whole removal.
36
+ */
37
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
38
+ if (k2 === undefined) k2 = k;
39
+ var desc = Object.getOwnPropertyDescriptor(m, k);
40
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
41
+ desc = { enumerable: true, get: function() { return m[k]; } };
42
+ }
43
+ Object.defineProperty(o, k2, desc);
44
+ }) : (function(o, m, k, k2) {
45
+ if (k2 === undefined) k2 = k;
46
+ o[k2] = m[k];
47
+ }));
48
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
49
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
50
+ }) : function(o, v) {
51
+ o["default"] = v;
52
+ });
53
+ var __importStar = (this && this.__importStar) || (function () {
54
+ var ownKeys = function(o) {
55
+ ownKeys = Object.getOwnPropertyNames || function (o) {
56
+ var ar = [];
57
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
58
+ return ar;
59
+ };
60
+ return ownKeys(o);
61
+ };
62
+ return function (mod) {
63
+ if (mod && mod.__esModule) return mod;
64
+ var result = {};
65
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
66
+ __setModuleDefault(result, mod);
67
+ return result;
68
+ };
69
+ })();
70
+ Object.defineProperty(exports, "__esModule", { value: true });
71
+ exports.defaultProbes = defaultProbes;
72
+ exports.planBinaryRemoval = planBinaryRemoval;
73
+ exports.defaultRemoveDeps = defaultRemoveDeps;
74
+ exports.executeBinaryRemoval = executeBinaryRemoval;
75
+ const fs = __importStar(require("fs"));
76
+ const path = __importStar(require("path"));
77
+ const os = __importStar(require("os"));
78
+ const child_process_1 = require("child_process");
79
+ const index_1 = require("./index");
80
+ function defaultProbes(filename) {
81
+ return {
82
+ filename,
83
+ platform: process.platform,
84
+ cwd: process.cwd(),
85
+ env: process.env,
86
+ homedir: os.homedir(),
87
+ exists: fs.existsSync,
88
+ readlink: (p) => {
89
+ try {
90
+ return fs.readlinkSync(p);
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ },
96
+ capture: (cmd, args) => {
97
+ const res = (0, child_process_1.spawnSync)(cmd, args, { encoding: 'utf8', windowsHide: true, timeout: 30_000 });
98
+ if (res.error || typeof res.status !== 'number')
99
+ return null;
100
+ return { code: res.status, stdout: res.stdout ?? '' };
101
+ },
102
+ };
103
+ }
104
+ /**
105
+ * Path math keyed on the TARGET platform (not the host) — same convention as
106
+ * `detectInstallMethod`, so the planner is deterministic when unit-tested with
107
+ * a win32 fixture on a POSIX host and vice versa. In production the probe's
108
+ * platform always matches the running host.
109
+ */
110
+ function pathFor(platform) {
111
+ return platform === 'win32' ? path.win32 : path.posix;
112
+ }
113
+ /** The machine-level state dir that must survive an artifacts-only removal. */
114
+ function stateDir(p) {
115
+ return pathFor(p.platform).join(p.homedir, '.homegraph');
116
+ }
117
+ /** Candidate bundle install dirs: the running binary's own, plus the defaults. */
118
+ function installDirCandidates(p) {
119
+ const P = pathFor(p.platform);
120
+ const dirs = [];
121
+ const method = (0, index_1.detectInstallMethod)({
122
+ filename: p.filename,
123
+ platform: p.platform,
124
+ cwd: p.cwd,
125
+ exists: p.exists,
126
+ });
127
+ if (method.kind === 'bundle' && method.installDir)
128
+ dirs.push(method.installDir);
129
+ if (p.env.HOMEGRAPH_INSTALL_DIR)
130
+ dirs.push(p.env.HOMEGRAPH_INSTALL_DIR);
131
+ // Platform defaults — probed even when the RUNNING binary is npm/source,
132
+ // because the whole point is clearing installs the user forgot about.
133
+ if (p.platform === 'win32') {
134
+ if (p.env.LOCALAPPDATA)
135
+ dirs.push(P.join(p.env.LOCALAPPDATA, 'homegraph'));
136
+ }
137
+ else {
138
+ dirs.push(stateDir(p));
139
+ }
140
+ return [...new Set(dirs.map((d) => P.resolve(d)))];
141
+ }
142
+ function planBinaryRemoval(p) {
143
+ const P = pathFor(p.platform);
144
+ const plan = {
145
+ paths: [],
146
+ npmGlobal: false,
147
+ npmRoot: null,
148
+ sourceRoot: null,
149
+ summary: [],
150
+ };
151
+ const method = (0, index_1.detectInstallMethod)({
152
+ filename: p.filename,
153
+ platform: p.platform,
154
+ cwd: p.cwd,
155
+ exists: p.exists,
156
+ });
157
+ if (method.kind === 'source') {
158
+ plan.sourceRoot = method.root;
159
+ }
160
+ // --- Bundle install(s) ----------------------------------------------------
161
+ const installDirs = [];
162
+ for (const dir of installDirCandidates(p)) {
163
+ // A dir counts as a bundle install only when it carries install artifacts.
164
+ const artifacts = ['versions', 'current']
165
+ .map((a) => P.join(dir, a))
166
+ .filter((a) => p.exists(a) || p.readlink(a) !== null); // `current` is a symlink on unix
167
+ if (artifacts.length === 0)
168
+ continue;
169
+ installDirs.push(dir);
170
+ if (P.resolve(dir) === P.resolve(stateDir(p))) {
171
+ // Shared with machine-level state: remove artifacts only.
172
+ plan.paths.push(...artifacts);
173
+ plan.summary.push(`bundle install at ${dir} (versions/ and current — state files kept)`);
174
+ }
175
+ else {
176
+ plan.paths.push(dir);
177
+ plan.summary.push(`bundle install at ${dir}`);
178
+ }
179
+ }
180
+ // --- Bin-dir shim (unix installer's symlink) --------------------------------
181
+ const binDir = p.env.HOMEGRAPH_BIN_DIR
182
+ ?? (p.platform === 'win32' ? null : P.join(p.homedir, '.local', 'bin'));
183
+ if (binDir) {
184
+ const shim = P.join(binDir, 'homegraph');
185
+ const target = p.readlink(shim);
186
+ // Only when the link demonstrably points into a bundle install dir —
187
+ // resolved against the link's own directory, since install.sh links an
188
+ // absolute target but a hand-made relative link must still verify.
189
+ if (target !== null) {
190
+ const resolved = P.resolve(binDir, target);
191
+ const ours = installDirs.some((d) => resolved.startsWith(P.resolve(d) + P.sep))
192
+ || resolved.includes(`${P.sep}.homegraph${P.sep}`);
193
+ if (ours) {
194
+ plan.paths.push(shim);
195
+ plan.summary.push(`launcher link at ${shim}`);
196
+ }
197
+ }
198
+ }
199
+ // --- npm global package -----------------------------------------------------
200
+ // Asking npm (not guessing prefixes) keeps this correct under nvm/fnm/volta.
201
+ // A LOCAL npm install (project dependency) is deliberately not offered.
202
+ const rootInv = (0, index_1.npmInvocation)(p.platform, ['root', '-g']);
203
+ const rootRes = p.capture(rootInv.cmd, rootInv.args);
204
+ if (rootRes && rootRes.code === 0) {
205
+ const pkgDir = P.join(rootRes.stdout.trim(), index_1.NPM_PACKAGE);
206
+ if (rootRes.stdout.trim() && p.exists(pkgDir)) {
207
+ plan.npmGlobal = true;
208
+ plan.npmRoot = rootRes.stdout.trim();
209
+ plan.summary.push(`npm global package (${index_1.NPM_PACKAGE})`);
210
+ }
211
+ }
212
+ return plan;
213
+ }
214
+ function defaultRemoveDeps() {
215
+ return {
216
+ platform: process.platform,
217
+ execPath: process.execPath,
218
+ rm: (p) => fs.rmSync(p, { recursive: true, force: true }),
219
+ rename: (from, to) => fs.renameSync(from, to),
220
+ run: (cmd, args) => {
221
+ const res = (0, child_process_1.spawnSync)(cmd, args, { stdio: 'inherit', windowsHide: true, timeout: 120_000 });
222
+ return typeof res.status === 'number' ? res.status : -1;
223
+ },
224
+ };
225
+ }
226
+ /**
227
+ * Rename the running (locked) node.exe out of `dir` so the rest of the tree
228
+ * deletes cleanly — Windows allows renaming a mapped image, just not deleting
229
+ * it. Returns the leftover path, or null when nothing needed moving.
230
+ */
231
+ function moveLockedExeAside(dir, deps) {
232
+ if (deps.platform !== 'win32')
233
+ return null;
234
+ const P = pathFor(deps.platform);
235
+ const resolvedDir = P.resolve(dir) + P.sep;
236
+ if (!P.resolve(deps.execPath).startsWith(resolvedDir))
237
+ return null;
238
+ const leftover = P.join(P.dirname(P.resolve(dir)), `homegraph-old-node-${process.pid}.exe`);
239
+ try {
240
+ deps.rename(deps.execPath, leftover);
241
+ return leftover;
242
+ }
243
+ catch {
244
+ return null; // rename failed too — the rm error will surface the dir
245
+ }
246
+ }
247
+ function executeBinaryRemoval(plan, deps = defaultRemoveDeps()) {
248
+ const result = { removed: [], leftovers: [], npm: 'skipped' };
249
+ const P = pathFor(deps.platform);
250
+ for (const p of plan.paths) {
251
+ // Planner-emitted paths are always deep, specific artifacts; this guard
252
+ // exists so no future planner bug can ever hand the executor a root.
253
+ if (P.resolve(p) === P.parse(P.resolve(p)).root) {
254
+ result.leftovers.push(p);
255
+ continue;
256
+ }
257
+ try {
258
+ deps.rm(p);
259
+ result.removed.push(p);
260
+ }
261
+ catch {
262
+ // Windows: the running exe inside this tree is deletable-after-rename.
263
+ const moved = moveLockedExeAside(p, deps);
264
+ try {
265
+ deps.rm(p);
266
+ result.removed.push(p);
267
+ if (moved)
268
+ result.leftovers.push(moved);
269
+ }
270
+ catch {
271
+ result.leftovers.push(p);
272
+ }
273
+ }
274
+ }
275
+ if (plan.npmGlobal) {
276
+ // If we are RUNNING from the npm install on Windows, npm's delete will
277
+ // hit the same lock — move the exe aside first.
278
+ let moved = null;
279
+ if (plan.npmRoot)
280
+ moved = moveLockedExeAside(plan.npmRoot, deps);
281
+ const inv = (0, index_1.npmInvocation)(deps.platform, ['uninstall', '-g', index_1.NPM_PACKAGE]);
282
+ const code = deps.run(inv.cmd, inv.args);
283
+ result.npm = code === 0 ? 'removed' : 'failed';
284
+ if (moved)
285
+ result.leftovers.push(moved);
286
+ }
287
+ return result;
288
+ }
289
+ //# sourceMappingURL=remove-binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-binary.js","sourceRoot":"","sources":["../../src/upgrade/remove-binary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Background update-availability check for long-lived servers (#1243).
3
+ *
4
+ * The recommended MCP config launches the LOCAL `homegraph` binary, so the
5
+ * server (and the prompt hook alongside it) silently stays on whatever version
6
+ * was last manually upgraded — users discover the drift only when something
7
+ * breaks. This module gives the running server *visibility* without changing
8
+ * behavior: a non-blocking check against the latest GitHub release, surfaced
9
+ * as a one-line notice (stderr log, MCP initialize instructions, and
10
+ * `homegraph_status`) telling the user to run `homegraph upgrade`.
11
+ *
12
+ * Invariants (mirrors the telemetry module's contract):
13
+ * - Never stdout — stdio is the MCP protocol channel.
14
+ * - Never blocking: the network refresh is fire-and-forget; every reader
15
+ * (`getUpdateNotice`) is a cheap synchronous cache read, so the #172
16
+ * respond-fast handshake contract holds.
17
+ * - Fail silent: offline / rate-limited / disk-full all degrade to "no
18
+ * notice", never an error, never a retry loop.
19
+ * - Off is off: `HOMEGRAPH_NO_UPDATE_CHECK` (dedicated) or `DO_NOT_TRACK`
20
+ * (broad don't-phone-home convention — set by e.g. the Pro container's
21
+ * data plane) suppresses the network call AND the notice entirely.
22
+ *
23
+ * The check itself reuses `resolveLatestVersion` — the GitHub release-redirect
24
+ * trick with the API fallback — so version resolution can't drift from what
25
+ * `homegraph upgrade` installs. Results are cached in `~/.homegraph/` (the
26
+ * same global state dir telemetry and the daemon registry use) with a 24h TTL
27
+ * on success and a 1h backoff after failure, shared across every proxy /
28
+ * daemon process on the machine.
29
+ */
30
+ /** Re-check the release feed after this long (successful checks). */
31
+ export declare const UPDATE_CHECK_TTL_MS: number;
32
+ /** Back off this long after a failed check (offline, rate-limited). */
33
+ export declare const UPDATE_CHECK_FAILURE_BACKOFF_MS: number;
34
+ export interface UpdateCheckCacheFile {
35
+ /** Last time a network check was attempted (ms epoch). */
36
+ lastAttemptAt: number;
37
+ /** Last time a network check succeeded (ms epoch). */
38
+ lastSuccessAt?: number;
39
+ /** Latest release tag from the last successful check (e.g. `v1.4.1`). */
40
+ latest?: string;
41
+ }
42
+ export interface UpdateCheckDeps {
43
+ /** Global state dir; defaults to ~/.homegraph. Tests inject a temp dir. */
44
+ dir?: string;
45
+ env?: NodeJS.ProcessEnv;
46
+ now?: () => number;
47
+ resolveLatest?: () => Promise<string>;
48
+ currentVersion?: string;
49
+ }
50
+ /**
51
+ * True when the update check must not run at all — no network call, no
52
+ * notice. `DO_NOT_TRACK` uses the same truthiness the telemetry opt-out does.
53
+ */
54
+ export declare function updateCheckDisabled(env?: NodeJS.ProcessEnv): boolean;
55
+ export declare function updateCheckCachePath(dir: string): string;
56
+ export declare function readUpdateCheckCache(dir: string): UpdateCheckCacheFile | null;
57
+ /**
58
+ * Rebuild a canonical `vX.Y.Z[-pre]` tag from the PARSED semver fields, or
59
+ * null when the input isn't version-shaped. The notice ends up inside the MCP
60
+ * initialize instructions — agent-visible, system-prompt-adjacent text — and
61
+ * the `latest` value arrives from a network redirect via an on-disk cache, so
62
+ * only a reconstructed canonical string may ever be interpolated, never the
63
+ * raw value. (`parseSemver`'s regex is not end-anchored: a value like
64
+ * `1.2.3-x <arbitrary text>` parses "valid" while the raw string would carry
65
+ * the trailing text straight into every session's instructions.)
66
+ */
67
+ export declare function canonicalVersionTag(v: string): string | null;
68
+ /** One user-facing sentence; every surface (stderr, instructions, status) shows this. */
69
+ export declare function formatUpdateNotice(current: string, latest: string): string;
70
+ /**
71
+ * Ensure the on-disk cache is fresh (hitting the network only past the TTL /
72
+ * backoff) and return the current notice, or null. Never throws.
73
+ */
74
+ export declare function refreshUpdateCheck(deps?: UpdateCheckDeps): Promise<string | null>;
75
+ /**
76
+ * The current update notice from the on-disk cache — synchronous and cheap
77
+ * (memoized disk read), safe on the initialize respond-fast path. When the
78
+ * cache has gone stale (e.g. a daemon that has been up for weeks), kicks a
79
+ * background refresh so the NEXT reader sees a current answer; this call
80
+ * still returns immediately from the stale cache.
81
+ */
82
+ export declare function getUpdateNotice(deps?: UpdateCheckDeps): string | null;
83
+ /** Test hook: clear the per-process memo. */
84
+ export declare function resetUpdateNoticeMemo(): void;
85
+ /**
86
+ * Fire-and-forget entry point for server startup: refresh the cache in the
87
+ * background and, if an update is available, emit ONE stderr line (stderr is
88
+ * the MCP-safe channel; hosts surface it in their server logs). Never throws,
89
+ * never blocks, never writes stdout.
90
+ */
91
+ export declare function checkForUpdateInBackground(deps?: UpdateCheckDeps, log?: (line: string) => void): void;
92
+ //# sourceMappingURL=update-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/upgrade/update-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAQH,qEAAqE;AACrE,eAAO,MAAM,mBAAmB,QAAsB,CAAC;AACvD,uEAAuE;AACvE,eAAO,MAAM,+BAA+B,QAAiB,CAAC;AAI9D,MAAM,WAAW,oBAAoB;IACnC,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAyBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAEjF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAS7E;AAWD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI5D;AAED,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK1E;AAyBD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2B3F;AAOD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,eAAoB,GAAG,MAAM,GAAG,IAAI,CAiBzE;AAED,6CAA6C;AAC7C,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,GAAE,eAAoB,EAC1B,GAAG,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAA2C,GACjE,IAAI,CAQN"}
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+ /**
3
+ * Background update-availability check for long-lived servers (#1243).
4
+ *
5
+ * The recommended MCP config launches the LOCAL `homegraph` binary, so the
6
+ * server (and the prompt hook alongside it) silently stays on whatever version
7
+ * was last manually upgraded — users discover the drift only when something
8
+ * breaks. This module gives the running server *visibility* without changing
9
+ * behavior: a non-blocking check against the latest GitHub release, surfaced
10
+ * as a one-line notice (stderr log, MCP initialize instructions, and
11
+ * `homegraph_status`) telling the user to run `homegraph upgrade`.
12
+ *
13
+ * Invariants (mirrors the telemetry module's contract):
14
+ * - Never stdout — stdio is the MCP protocol channel.
15
+ * - Never blocking: the network refresh is fire-and-forget; every reader
16
+ * (`getUpdateNotice`) is a cheap synchronous cache read, so the #172
17
+ * respond-fast handshake contract holds.
18
+ * - Fail silent: offline / rate-limited / disk-full all degrade to "no
19
+ * notice", never an error, never a retry loop.
20
+ * - Off is off: `HOMEGRAPH_NO_UPDATE_CHECK` (dedicated) or `DO_NOT_TRACK`
21
+ * (broad don't-phone-home convention — set by e.g. the Pro container's
22
+ * data plane) suppresses the network call AND the notice entirely.
23
+ *
24
+ * The check itself reuses `resolveLatestVersion` — the GitHub release-redirect
25
+ * trick with the API fallback — so version resolution can't drift from what
26
+ * `homegraph upgrade` installs. Results are cached in `~/.homegraph/` (the
27
+ * same global state dir telemetry and the daemon registry use) with a 24h TTL
28
+ * on success and a 1h backoff after failure, shared across every proxy /
29
+ * daemon process on the machine.
30
+ */
31
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
32
+ if (k2 === undefined) k2 = k;
33
+ var desc = Object.getOwnPropertyDescriptor(m, k);
34
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
35
+ desc = { enumerable: true, get: function() { return m[k]; } };
36
+ }
37
+ Object.defineProperty(o, k2, desc);
38
+ }) : (function(o, m, k, k2) {
39
+ if (k2 === undefined) k2 = k;
40
+ o[k2] = m[k];
41
+ }));
42
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
43
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
44
+ }) : function(o, v) {
45
+ o["default"] = v;
46
+ });
47
+ var __importStar = (this && this.__importStar) || (function () {
48
+ var ownKeys = function(o) {
49
+ ownKeys = Object.getOwnPropertyNames || function (o) {
50
+ var ar = [];
51
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
52
+ return ar;
53
+ };
54
+ return ownKeys(o);
55
+ };
56
+ return function (mod) {
57
+ if (mod && mod.__esModule) return mod;
58
+ var result = {};
59
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
60
+ __setModuleDefault(result, mod);
61
+ return result;
62
+ };
63
+ })();
64
+ Object.defineProperty(exports, "__esModule", { value: true });
65
+ exports.UPDATE_CHECK_FAILURE_BACKOFF_MS = exports.UPDATE_CHECK_TTL_MS = void 0;
66
+ exports.updateCheckDisabled = updateCheckDisabled;
67
+ exports.updateCheckCachePath = updateCheckCachePath;
68
+ exports.readUpdateCheckCache = readUpdateCheckCache;
69
+ exports.canonicalVersionTag = canonicalVersionTag;
70
+ exports.formatUpdateNotice = formatUpdateNotice;
71
+ exports.refreshUpdateCheck = refreshUpdateCheck;
72
+ exports.getUpdateNotice = getUpdateNotice;
73
+ exports.resetUpdateNoticeMemo = resetUpdateNoticeMemo;
74
+ exports.checkForUpdateInBackground = checkForUpdateInBackground;
75
+ const fs = __importStar(require("fs"));
76
+ const path = __importStar(require("path"));
77
+ const os = __importStar(require("os"));
78
+ const index_1 = require("./index");
79
+ const version_1 = require("../mcp/version");
80
+ /** Re-check the release feed after this long (successful checks). */
81
+ exports.UPDATE_CHECK_TTL_MS = 24 * 60 * 60 * 1000;
82
+ /** Back off this long after a failed check (offline, rate-limited). */
83
+ exports.UPDATE_CHECK_FAILURE_BACKOFF_MS = 60 * 60 * 1000;
84
+ /** Short network budget — the refresh is background work, not a handshake. */
85
+ const UPDATE_CHECK_NETWORK_TIMEOUT_MS = 5000;
86
+ function resolveDeps(deps = {}) {
87
+ return {
88
+ dir: deps.dir ?? path.join(os.homedir(), '.homegraph'),
89
+ env: deps.env ?? process.env,
90
+ now: deps.now ?? Date.now,
91
+ resolveLatest: deps.resolveLatest ?? (() => (0, index_1.resolveLatestVersion)(undefined, UPDATE_CHECK_NETWORK_TIMEOUT_MS)),
92
+ currentVersion: deps.currentVersion ?? version_1.HomeGraphPackageVersion,
93
+ };
94
+ }
95
+ function envTruthy(raw) {
96
+ return raw !== undefined && raw !== '' && raw !== '0' && raw.toLowerCase() !== 'false';
97
+ }
98
+ /**
99
+ * True when the update check must not run at all — no network call, no
100
+ * notice. `DO_NOT_TRACK` uses the same truthiness the telemetry opt-out does.
101
+ */
102
+ function updateCheckDisabled(env = process.env) {
103
+ return envTruthy(env.HOMEGRAPH_NO_UPDATE_CHECK) || envTruthy(env.DO_NOT_TRACK);
104
+ }
105
+ function updateCheckCachePath(dir) {
106
+ return path.join(dir, 'update-check.json');
107
+ }
108
+ function readUpdateCheckCache(dir) {
109
+ try {
110
+ const raw = fs.readFileSync(updateCheckCachePath(dir), 'utf8');
111
+ const parsed = JSON.parse(raw);
112
+ if (typeof parsed?.lastAttemptAt !== 'number')
113
+ return null;
114
+ return parsed;
115
+ }
116
+ catch {
117
+ return null; // missing / torn / unparseable — same as no cache
118
+ }
119
+ }
120
+ function writeUpdateCheckCache(dir, cache) {
121
+ try {
122
+ fs.mkdirSync(dir, { recursive: true });
123
+ fs.writeFileSync(updateCheckCachePath(dir), JSON.stringify(cache));
124
+ }
125
+ catch {
126
+ /* fail silent — a read-only home dir must not break the server */
127
+ }
128
+ }
129
+ /**
130
+ * Rebuild a canonical `vX.Y.Z[-pre]` tag from the PARSED semver fields, or
131
+ * null when the input isn't version-shaped. The notice ends up inside the MCP
132
+ * initialize instructions — agent-visible, system-prompt-adjacent text — and
133
+ * the `latest` value arrives from a network redirect via an on-disk cache, so
134
+ * only a reconstructed canonical string may ever be interpolated, never the
135
+ * raw value. (`parseSemver`'s regex is not end-anchored: a value like
136
+ * `1.2.3-x <arbitrary text>` parses "valid" while the raw string would carry
137
+ * the trailing text straight into every session's instructions.)
138
+ */
139
+ function canonicalVersionTag(v) {
140
+ const s = (0, index_1.parseSemver)(v);
141
+ if (!s)
142
+ return null;
143
+ return `v${s.major}.${s.minor}.${s.patch}${s.pre ? `-${s.pre}` : ''}`;
144
+ }
145
+ /** One user-facing sentence; every surface (stderr, instructions, status) shows this. */
146
+ function formatUpdateNotice(current, latest) {
147
+ return (`HomeGraph ${latest} is available (this server is running ` +
148
+ `${current}). Update with \`homegraph upgrade\`.`);
149
+ }
150
+ function noticeFrom(cache, d) {
151
+ if (!cache?.latest)
152
+ return null;
153
+ // A dev build whose package.json couldn't be read reports the sentinel
154
+ // version; any comparison against it would always claim an update.
155
+ if (d.currentVersion === '0.0.0-unknown')
156
+ return null;
157
+ // Canonicalize BOTH sides before comparing or rendering — a non-semver
158
+ // `latest` (garbage redirect, tampered cache) yields no notice at all
159
+ // rather than flowing into agent-visible text.
160
+ const latest = canonicalVersionTag(cache.latest);
161
+ const current = canonicalVersionTag(d.currentVersion);
162
+ if (!latest || !current)
163
+ return null;
164
+ return (0, index_1.isUpdateAvailable)(current, latest) ? formatUpdateNotice(current, latest) : null;
165
+ }
166
+ function cacheIsFresh(cache, nowMs) {
167
+ if (!cache)
168
+ return false;
169
+ if (cache.lastSuccessAt !== undefined && nowMs - cache.lastSuccessAt < exports.UPDATE_CHECK_TTL_MS) {
170
+ return true;
171
+ }
172
+ // No recent success: only the failure backoff holds the network call off.
173
+ return nowMs - cache.lastAttemptAt < exports.UPDATE_CHECK_FAILURE_BACKOFF_MS;
174
+ }
175
+ /**
176
+ * Ensure the on-disk cache is fresh (hitting the network only past the TTL /
177
+ * backoff) and return the current notice, or null. Never throws.
178
+ */
179
+ async function refreshUpdateCheck(deps = {}) {
180
+ const d = resolveDeps(deps);
181
+ if (updateCheckDisabled(d.env))
182
+ return null;
183
+ const cached = readUpdateCheckCache(d.dir);
184
+ const nowMs = d.now();
185
+ if (cacheIsFresh(cached, nowMs))
186
+ return noticeFrom(cached, d);
187
+ try {
188
+ const latest = canonicalVersionTag(await d.resolveLatest());
189
+ // A response that isn't version-shaped is a failure, not a result —
190
+ // fall through to the backoff path and keep the previous known-good tag.
191
+ if (!latest)
192
+ throw new Error('release feed returned a non-version tag');
193
+ const next = { lastAttemptAt: nowMs, lastSuccessAt: nowMs, latest };
194
+ writeUpdateCheckCache(d.dir, next);
195
+ return noticeFrom(next, d);
196
+ }
197
+ catch {
198
+ // Record the attempt (starts the backoff) but KEEP the previous latest —
199
+ // a transient outage must not hide an already-known update.
200
+ const next = {
201
+ lastAttemptAt: nowMs,
202
+ lastSuccessAt: cached?.lastSuccessAt,
203
+ latest: cached?.latest,
204
+ };
205
+ writeUpdateCheckCache(d.dir, next);
206
+ return noticeFrom(next, d);
207
+ }
208
+ }
209
+ // Per-process memo so the sync read path (MCP initialize, homegraph_status)
210
+ // touches the disk at most once a minute, not once per handshake.
211
+ const NOTICE_MEMO_TTL_MS = 60 * 1000;
212
+ let noticeMemo = null;
213
+ /**
214
+ * The current update notice from the on-disk cache — synchronous and cheap
215
+ * (memoized disk read), safe on the initialize respond-fast path. When the
216
+ * cache has gone stale (e.g. a daemon that has been up for weeks), kicks a
217
+ * background refresh so the NEXT reader sees a current answer; this call
218
+ * still returns immediately from the stale cache.
219
+ */
220
+ function getUpdateNotice(deps = {}) {
221
+ const d = resolveDeps(deps);
222
+ if (updateCheckDisabled(d.env))
223
+ return null;
224
+ const useMemo = deps.dir === undefined && deps.now === undefined;
225
+ const nowMs = d.now();
226
+ if (useMemo && noticeMemo && nowMs - noticeMemo.at < NOTICE_MEMO_TTL_MS) {
227
+ return noticeMemo.value;
228
+ }
229
+ const cached = readUpdateCheckCache(d.dir);
230
+ if (!cacheIsFresh(cached, nowMs)) {
231
+ void refreshUpdateCheck(deps).catch(() => { });
232
+ }
233
+ const value = noticeFrom(cached, d);
234
+ if (useMemo)
235
+ noticeMemo = { at: nowMs, value };
236
+ return value;
237
+ }
238
+ /** Test hook: clear the per-process memo. */
239
+ function resetUpdateNoticeMemo() {
240
+ noticeMemo = null;
241
+ }
242
+ /**
243
+ * Fire-and-forget entry point for server startup: refresh the cache in the
244
+ * background and, if an update is available, emit ONE stderr line (stderr is
245
+ * the MCP-safe channel; hosts surface it in their server logs). Never throws,
246
+ * never blocks, never writes stdout.
247
+ */
248
+ function checkForUpdateInBackground(deps = {}, log = (line) => process.stderr.write(line)) {
249
+ refreshUpdateCheck(deps)
250
+ .then((notice) => {
251
+ // The shared notice sentence starts with "HomeGraph …"; drop the word
252
+ // after the log tag so the line doesn't read "[HomeGraph] HomeGraph …".
253
+ if (notice)
254
+ log(`[HomeGraph] ${notice.replace(/^HomeGraph /, '')}\n`);
255
+ })
256
+ .catch(() => { });
257
+ }
258
+ //# sourceMappingURL=update-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/upgrade/update-check.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DH,kDAEC;AAED,oDAEC;AAED,oDASC;AAqBD,kDAIC;AAGD,gDAKC;AA6BD,gDA2BC;AAcD,0CAiBC;AAGD,sDAEC;AAQD,gEAWC;AA3ND,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,mCAA+E;AAC/E,4CAAyD;AAEzD,qEAAqE;AACxD,QAAA,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACvD,uEAAuE;AAC1D,QAAA,+BAA+B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9D,8EAA8E;AAC9E,MAAM,+BAA+B,GAAG,IAAI,CAAC;AA4B7C,SAAS,WAAW,CAAC,OAAwB,EAAE;IAC7C,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC;QACtD,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;QAC5B,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;QACzB,aAAa,EACX,IAAI,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,4BAAoB,EAAC,SAAS,EAAE,+BAA+B,CAAC,CAAC;QAChG,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,iCAAuB;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,GAAuB;IACxC,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;AACzF,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACtE,OAAO,SAAS,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACjF,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAW;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAW;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACvD,IAAI,OAAO,MAAM,EAAE,aAAa,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,kDAAkD;IACjE,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAW,EAAE,KAA2B;IACrE,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;IACpE,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,mBAAmB,CAAC,CAAS;IAC3C,MAAM,CAAC,GAAG,IAAA,mBAAW,EAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACxE,CAAC;AAED,yFAAyF;AACzF,SAAgB,kBAAkB,CAAC,OAAe,EAAE,MAAc;IAChE,OAAO,CACL,aAAa,MAAM,wCAAwC;QAC3D,GAAG,OAAO,uCAAuC,CAClD,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAkC,EAAE,CAAe;IACrE,IAAI,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,uEAAuE;IACvE,mEAAmE;IACnE,IAAI,CAAC,CAAC,cAAc,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IACtD,uEAAuE;IACvE,sEAAsE;IACtE,+CAA+C;IAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,IAAA,yBAAiB,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzF,CAAC;AAED,SAAS,YAAY,CAAC,KAAkC,EAAE,KAAa;IACrE,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,GAAG,KAAK,CAAC,aAAa,GAAG,2BAAmB,EAAE,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,0EAA0E;IAC1E,OAAO,KAAK,GAAG,KAAK,CAAC,aAAa,GAAG,uCAA+B,CAAC;AACvE,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CAAC,OAAwB,EAAE;IACjE,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,MAAM,GAAG,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACtB,IAAI,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5D,oEAAoE;QACpE,yEAAyE;QACzE,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACxE,MAAM,IAAI,GAAyB,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC1F,qBAAqB,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,OAAO,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,4DAA4D;QAC5D,MAAM,IAAI,GAAyB;YACjC,aAAa,EAAE,KAAK;YACpB,aAAa,EAAE,MAAM,EAAE,aAAa;YACpC,MAAM,EAAE,MAAM,EAAE,MAAM;SACvB,CAAC;QACF,qBAAqB,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,OAAO,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,kEAAkE;AAClE,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,IAAI,UAAU,GAAgD,IAAI,CAAC;AAEnE;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,OAAwB,EAAE;IACxD,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC;IACjE,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACtB,IAAI,OAAO,IAAI,UAAU,IAAI,KAAK,GAAG,UAAU,CAAC,EAAE,GAAG,kBAAkB,EAAE,CAAC;QACxE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAqB,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACpC,IAAI,OAAO;QAAE,UAAU,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC/C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6CAA6C;AAC7C,SAAgB,qBAAqB;IACnC,UAAU,GAAG,IAAI,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,0BAA0B,CACxC,OAAwB,EAAE,EAC1B,MAA8B,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IAElE,kBAAkB,CAAC,IAAI,CAAC;SACrB,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,sEAAsE;QACtE,wEAAwE;QACxE,IAAI,MAAM;YAAE,GAAG,CAAC,eAAe,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE,GAAqB,CAAC,CAAC,CAAC;AACxC,CAAC"}