@bharanidev/bhgraph-darwin-x64 1.0.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 (842) hide show
  1. package/bin/bhgraph +19 -0
  2. package/lib/dist/bin/bhgraph.d.ts +26 -0
  3. package/lib/dist/bin/bhgraph.d.ts.map +1 -0
  4. package/lib/dist/bin/bhgraph.js +2207 -0
  5. package/lib/dist/bin/bhgraph.js.map +1 -0
  6. package/lib/dist/bin/command-supervision.d.ts +12 -0
  7. package/lib/dist/bin/command-supervision.d.ts.map +1 -0
  8. package/lib/dist/bin/command-supervision.js +89 -0
  9. package/lib/dist/bin/command-supervision.js.map +1 -0
  10. package/lib/dist/bin/fatal-handler.d.ts +20 -0
  11. package/lib/dist/bin/fatal-handler.d.ts.map +1 -0
  12. package/lib/dist/bin/fatal-handler.js +118 -0
  13. package/lib/dist/bin/fatal-handler.js.map +1 -0
  14. package/lib/dist/bin/node-version-check.d.ts +37 -0
  15. package/lib/dist/bin/node-version-check.d.ts.map +1 -0
  16. package/lib/dist/bin/node-version-check.js +79 -0
  17. package/lib/dist/bin/node-version-check.js.map +1 -0
  18. package/lib/dist/bin/uninstall.d.ts +14 -0
  19. package/lib/dist/bin/uninstall.d.ts.map +1 -0
  20. package/lib/dist/bin/uninstall.js +36 -0
  21. package/lib/dist/bin/uninstall.js.map +1 -0
  22. package/lib/dist/context/formatter.d.ts +30 -0
  23. package/lib/dist/context/formatter.d.ts.map +1 -0
  24. package/lib/dist/context/formatter.js +263 -0
  25. package/lib/dist/context/formatter.js.map +1 -0
  26. package/lib/dist/context/index.d.ts +119 -0
  27. package/lib/dist/context/index.d.ts.map +1 -0
  28. package/lib/dist/context/index.js +1296 -0
  29. package/lib/dist/context/index.js.map +1 -0
  30. package/lib/dist/context/markers.d.ts +19 -0
  31. package/lib/dist/context/markers.d.ts.map +1 -0
  32. package/lib/dist/context/markers.js +22 -0
  33. package/lib/dist/context/markers.js.map +1 -0
  34. package/lib/dist/db/index.d.ts +142 -0
  35. package/lib/dist/db/index.d.ts.map +1 -0
  36. package/lib/dist/db/index.js +335 -0
  37. package/lib/dist/db/index.js.map +1 -0
  38. package/lib/dist/db/migrations.d.ts +44 -0
  39. package/lib/dist/db/migrations.d.ts.map +1 -0
  40. package/lib/dist/db/migrations.js +182 -0
  41. package/lib/dist/db/migrations.js.map +1 -0
  42. package/lib/dist/db/queries.d.ts +452 -0
  43. package/lib/dist/db/queries.d.ts.map +1 -0
  44. package/lib/dist/db/queries.js +1740 -0
  45. package/lib/dist/db/queries.js.map +1 -0
  46. package/lib/dist/db/schema.sql +182 -0
  47. package/lib/dist/db/sqlite-adapter.d.ts +53 -0
  48. package/lib/dist/db/sqlite-adapter.d.ts.map +1 -0
  49. package/lib/dist/db/sqlite-adapter.js +117 -0
  50. package/lib/dist/db/sqlite-adapter.js.map +1 -0
  51. package/lib/dist/directory.d.ts +183 -0
  52. package/lib/dist/directory.d.ts.map +1 -0
  53. package/lib/dist/directory.js +797 -0
  54. package/lib/dist/directory.js.map +1 -0
  55. package/lib/dist/errors.d.ts +136 -0
  56. package/lib/dist/errors.d.ts.map +1 -0
  57. package/lib/dist/errors.js +219 -0
  58. package/lib/dist/errors.js.map +1 -0
  59. package/lib/dist/extraction/astro-extractor.d.ts +79 -0
  60. package/lib/dist/extraction/astro-extractor.d.ts.map +1 -0
  61. package/lib/dist/extraction/astro-extractor.js +320 -0
  62. package/lib/dist/extraction/astro-extractor.js.map +1 -0
  63. package/lib/dist/extraction/cfml-extractor.d.ts +107 -0
  64. package/lib/dist/extraction/cfml-extractor.d.ts.map +1 -0
  65. package/lib/dist/extraction/cfml-extractor.js +494 -0
  66. package/lib/dist/extraction/cfml-extractor.js.map +1 -0
  67. package/lib/dist/extraction/dfm-extractor.d.ts +31 -0
  68. package/lib/dist/extraction/dfm-extractor.d.ts.map +1 -0
  69. package/lib/dist/extraction/dfm-extractor.js +151 -0
  70. package/lib/dist/extraction/dfm-extractor.js.map +1 -0
  71. package/lib/dist/extraction/extraction-version.d.ts +25 -0
  72. package/lib/dist/extraction/extraction-version.d.ts.map +1 -0
  73. package/lib/dist/extraction/extraction-version.js +28 -0
  74. package/lib/dist/extraction/extraction-version.js.map +1 -0
  75. package/lib/dist/extraction/function-ref.d.ts +118 -0
  76. package/lib/dist/extraction/function-ref.d.ts.map +1 -0
  77. package/lib/dist/extraction/function-ref.js +727 -0
  78. package/lib/dist/extraction/function-ref.js.map +1 -0
  79. package/lib/dist/extraction/generated-detection.d.ts +30 -0
  80. package/lib/dist/extraction/generated-detection.d.ts.map +1 -0
  81. package/lib/dist/extraction/generated-detection.js +83 -0
  82. package/lib/dist/extraction/generated-detection.js.map +1 -0
  83. package/lib/dist/extraction/grammars.d.ts +123 -0
  84. package/lib/dist/extraction/grammars.d.ts.map +1 -0
  85. package/lib/dist/extraction/grammars.js +589 -0
  86. package/lib/dist/extraction/grammars.js.map +1 -0
  87. package/lib/dist/extraction/index.d.ts +232 -0
  88. package/lib/dist/extraction/index.d.ts.map +1 -0
  89. package/lib/dist/extraction/index.js +2269 -0
  90. package/lib/dist/extraction/index.js.map +1 -0
  91. package/lib/dist/extraction/languages/arkts.d.ts +3 -0
  92. package/lib/dist/extraction/languages/arkts.d.ts.map +1 -0
  93. package/lib/dist/extraction/languages/arkts.js +127 -0
  94. package/lib/dist/extraction/languages/arkts.js.map +1 -0
  95. package/lib/dist/extraction/languages/c-cpp.d.ts +110 -0
  96. package/lib/dist/extraction/languages/c-cpp.d.ts.map +1 -0
  97. package/lib/dist/extraction/languages/c-cpp.js +837 -0
  98. package/lib/dist/extraction/languages/c-cpp.js.map +1 -0
  99. package/lib/dist/extraction/languages/cfquery.d.ts +12 -0
  100. package/lib/dist/extraction/languages/cfquery.d.ts.map +1 -0
  101. package/lib/dist/extraction/languages/cfquery.js +28 -0
  102. package/lib/dist/extraction/languages/cfquery.js.map +1 -0
  103. package/lib/dist/extraction/languages/cfscript.d.ts +3 -0
  104. package/lib/dist/extraction/languages/cfscript.d.ts.map +1 -0
  105. package/lib/dist/extraction/languages/cfscript.js +73 -0
  106. package/lib/dist/extraction/languages/cfscript.js.map +1 -0
  107. package/lib/dist/extraction/languages/cobol.d.ts +33 -0
  108. package/lib/dist/extraction/languages/cobol.d.ts.map +1 -0
  109. package/lib/dist/extraction/languages/cobol.js +499 -0
  110. package/lib/dist/extraction/languages/cobol.js.map +1 -0
  111. package/lib/dist/extraction/languages/csharp.d.ts +25 -0
  112. package/lib/dist/extraction/languages/csharp.d.ts.map +1 -0
  113. package/lib/dist/extraction/languages/csharp.js +175 -0
  114. package/lib/dist/extraction/languages/csharp.js.map +1 -0
  115. package/lib/dist/extraction/languages/dart.d.ts +3 -0
  116. package/lib/dist/extraction/languages/dart.d.ts.map +1 -0
  117. package/lib/dist/extraction/languages/dart.js +374 -0
  118. package/lib/dist/extraction/languages/dart.js.map +1 -0
  119. package/lib/dist/extraction/languages/erlang.d.ts +3 -0
  120. package/lib/dist/extraction/languages/erlang.d.ts.map +1 -0
  121. package/lib/dist/extraction/languages/erlang.js +350 -0
  122. package/lib/dist/extraction/languages/erlang.js.map +1 -0
  123. package/lib/dist/extraction/languages/go.d.ts +3 -0
  124. package/lib/dist/extraction/languages/go.d.ts.map +1 -0
  125. package/lib/dist/extraction/languages/go.js +111 -0
  126. package/lib/dist/extraction/languages/go.js.map +1 -0
  127. package/lib/dist/extraction/languages/index.d.ts +10 -0
  128. package/lib/dist/extraction/languages/index.d.ts.map +1 -0
  129. package/lib/dist/extraction/languages/index.js +71 -0
  130. package/lib/dist/extraction/languages/index.js.map +1 -0
  131. package/lib/dist/extraction/languages/java.d.ts +3 -0
  132. package/lib/dist/extraction/languages/java.d.ts.map +1 -0
  133. package/lib/dist/extraction/languages/java.js +315 -0
  134. package/lib/dist/extraction/languages/java.js.map +1 -0
  135. package/lib/dist/extraction/languages/javascript.d.ts +3 -0
  136. package/lib/dist/extraction/languages/javascript.d.ts.map +1 -0
  137. package/lib/dist/extraction/languages/javascript.js +106 -0
  138. package/lib/dist/extraction/languages/javascript.js.map +1 -0
  139. package/lib/dist/extraction/languages/kotlin.d.ts +3 -0
  140. package/lib/dist/extraction/languages/kotlin.d.ts.map +1 -0
  141. package/lib/dist/extraction/languages/kotlin.js +379 -0
  142. package/lib/dist/extraction/languages/kotlin.js.map +1 -0
  143. package/lib/dist/extraction/languages/lua.d.ts +3 -0
  144. package/lib/dist/extraction/languages/lua.d.ts.map +1 -0
  145. package/lib/dist/extraction/languages/lua.js +150 -0
  146. package/lib/dist/extraction/languages/lua.js.map +1 -0
  147. package/lib/dist/extraction/languages/luau.d.ts +3 -0
  148. package/lib/dist/extraction/languages/luau.d.ts.map +1 -0
  149. package/lib/dist/extraction/languages/luau.js +37 -0
  150. package/lib/dist/extraction/languages/luau.js.map +1 -0
  151. package/lib/dist/extraction/languages/nix.d.ts +3 -0
  152. package/lib/dist/extraction/languages/nix.d.ts.map +1 -0
  153. package/lib/dist/extraction/languages/nix.js +294 -0
  154. package/lib/dist/extraction/languages/nix.js.map +1 -0
  155. package/lib/dist/extraction/languages/objc.d.ts +3 -0
  156. package/lib/dist/extraction/languages/objc.d.ts.map +1 -0
  157. package/lib/dist/extraction/languages/objc.js +175 -0
  158. package/lib/dist/extraction/languages/objc.js.map +1 -0
  159. package/lib/dist/extraction/languages/pascal.d.ts +3 -0
  160. package/lib/dist/extraction/languages/pascal.d.ts.map +1 -0
  161. package/lib/dist/extraction/languages/pascal.js +77 -0
  162. package/lib/dist/extraction/languages/pascal.js.map +1 -0
  163. package/lib/dist/extraction/languages/php.d.ts +3 -0
  164. package/lib/dist/extraction/languages/php.d.ts.map +1 -0
  165. package/lib/dist/extraction/languages/php.js +196 -0
  166. package/lib/dist/extraction/languages/php.js.map +1 -0
  167. package/lib/dist/extraction/languages/python.d.ts +3 -0
  168. package/lib/dist/extraction/languages/python.d.ts.map +1 -0
  169. package/lib/dist/extraction/languages/python.js +56 -0
  170. package/lib/dist/extraction/languages/python.js.map +1 -0
  171. package/lib/dist/extraction/languages/r.d.ts +3 -0
  172. package/lib/dist/extraction/languages/r.d.ts.map +1 -0
  173. package/lib/dist/extraction/languages/r.js +314 -0
  174. package/lib/dist/extraction/languages/r.js.map +1 -0
  175. package/lib/dist/extraction/languages/ruby.d.ts +3 -0
  176. package/lib/dist/extraction/languages/ruby.d.ts.map +1 -0
  177. package/lib/dist/extraction/languages/ruby.js +149 -0
  178. package/lib/dist/extraction/languages/ruby.js.map +1 -0
  179. package/lib/dist/extraction/languages/rust.d.ts +3 -0
  180. package/lib/dist/extraction/languages/rust.d.ts.map +1 -0
  181. package/lib/dist/extraction/languages/rust.js +142 -0
  182. package/lib/dist/extraction/languages/rust.js.map +1 -0
  183. package/lib/dist/extraction/languages/scala.d.ts +3 -0
  184. package/lib/dist/extraction/languages/scala.d.ts.map +1 -0
  185. package/lib/dist/extraction/languages/scala.js +209 -0
  186. package/lib/dist/extraction/languages/scala.js.map +1 -0
  187. package/lib/dist/extraction/languages/solidity.d.ts +3 -0
  188. package/lib/dist/extraction/languages/solidity.d.ts.map +1 -0
  189. package/lib/dist/extraction/languages/solidity.js +293 -0
  190. package/lib/dist/extraction/languages/solidity.js.map +1 -0
  191. package/lib/dist/extraction/languages/swift.d.ts +3 -0
  192. package/lib/dist/extraction/languages/swift.d.ts.map +1 -0
  193. package/lib/dist/extraction/languages/swift.js +152 -0
  194. package/lib/dist/extraction/languages/swift.js.map +1 -0
  195. package/lib/dist/extraction/languages/terraform.d.ts +3 -0
  196. package/lib/dist/extraction/languages/terraform.d.ts.map +1 -0
  197. package/lib/dist/extraction/languages/terraform.js +641 -0
  198. package/lib/dist/extraction/languages/terraform.js.map +1 -0
  199. package/lib/dist/extraction/languages/typescript.d.ts +16 -0
  200. package/lib/dist/extraction/languages/typescript.d.ts.map +1 -0
  201. package/lib/dist/extraction/languages/typescript.js +167 -0
  202. package/lib/dist/extraction/languages/typescript.js.map +1 -0
  203. package/lib/dist/extraction/languages/vbnet.d.ts +11 -0
  204. package/lib/dist/extraction/languages/vbnet.d.ts.map +1 -0
  205. package/lib/dist/extraction/languages/vbnet.js +141 -0
  206. package/lib/dist/extraction/languages/vbnet.js.map +1 -0
  207. package/lib/dist/extraction/liquid-extractor.d.ts +59 -0
  208. package/lib/dist/extraction/liquid-extractor.d.ts.map +1 -0
  209. package/lib/dist/extraction/liquid-extractor.js +357 -0
  210. package/lib/dist/extraction/liquid-extractor.js.map +1 -0
  211. package/lib/dist/extraction/mybatis-extractor.d.ts +68 -0
  212. package/lib/dist/extraction/mybatis-extractor.d.ts.map +1 -0
  213. package/lib/dist/extraction/mybatis-extractor.js +300 -0
  214. package/lib/dist/extraction/mybatis-extractor.js.map +1 -0
  215. package/lib/dist/extraction/parse-pool.d.ts +126 -0
  216. package/lib/dist/extraction/parse-pool.d.ts.map +1 -0
  217. package/lib/dist/extraction/parse-pool.js +319 -0
  218. package/lib/dist/extraction/parse-pool.js.map +1 -0
  219. package/lib/dist/extraction/parse-worker.d.ts +8 -0
  220. package/lib/dist/extraction/parse-worker.d.ts.map +1 -0
  221. package/lib/dist/extraction/parse-worker.js +97 -0
  222. package/lib/dist/extraction/parse-worker.js.map +1 -0
  223. package/lib/dist/extraction/razor-extractor.d.ts +42 -0
  224. package/lib/dist/extraction/razor-extractor.d.ts.map +1 -0
  225. package/lib/dist/extraction/razor-extractor.js +285 -0
  226. package/lib/dist/extraction/razor-extractor.js.map +1 -0
  227. package/lib/dist/extraction/svelte-extractor.d.ts +56 -0
  228. package/lib/dist/extraction/svelte-extractor.d.ts.map +1 -0
  229. package/lib/dist/extraction/svelte-extractor.js +275 -0
  230. package/lib/dist/extraction/svelte-extractor.js.map +1 -0
  231. package/lib/dist/extraction/tree-sitter-helpers.d.ts +28 -0
  232. package/lib/dist/extraction/tree-sitter-helpers.d.ts.map +1 -0
  233. package/lib/dist/extraction/tree-sitter-helpers.js +153 -0
  234. package/lib/dist/extraction/tree-sitter-helpers.js.map +1 -0
  235. package/lib/dist/extraction/tree-sitter-types.d.ts +258 -0
  236. package/lib/dist/extraction/tree-sitter-types.d.ts.map +1 -0
  237. package/lib/dist/extraction/tree-sitter-types.js +10 -0
  238. package/lib/dist/extraction/tree-sitter-types.js.map +1 -0
  239. package/lib/dist/extraction/tree-sitter.d.ts +706 -0
  240. package/lib/dist/extraction/tree-sitter.d.ts.map +1 -0
  241. package/lib/dist/extraction/tree-sitter.js +6506 -0
  242. package/lib/dist/extraction/tree-sitter.js.map +1 -0
  243. package/lib/dist/extraction/vue-extractor.d.ts +51 -0
  244. package/lib/dist/extraction/vue-extractor.d.ts.map +1 -0
  245. package/lib/dist/extraction/vue-extractor.js +254 -0
  246. package/lib/dist/extraction/vue-extractor.js.map +1 -0
  247. package/lib/dist/extraction/wasm/tree-sitter-arkts.wasm +0 -0
  248. package/lib/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
  249. package/lib/dist/extraction/wasm/tree-sitter-cfml.wasm +0 -0
  250. package/lib/dist/extraction/wasm/tree-sitter-cfquery.wasm +0 -0
  251. package/lib/dist/extraction/wasm/tree-sitter-cfscript.wasm +0 -0
  252. package/lib/dist/extraction/wasm/tree-sitter-cobol.wasm +0 -0
  253. package/lib/dist/extraction/wasm/tree-sitter-erlang.wasm +0 -0
  254. package/lib/dist/extraction/wasm/tree-sitter-lua.wasm +0 -0
  255. package/lib/dist/extraction/wasm/tree-sitter-luau.wasm +0 -0
  256. package/lib/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
  257. package/lib/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  258. package/lib/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
  259. package/lib/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
  260. package/lib/dist/extraction/wasm/tree-sitter-terraform.wasm +0 -0
  261. package/lib/dist/extraction/wasm/tree-sitter-vbnet.wasm +0 -0
  262. package/lib/dist/extraction/wasm-runtime-flags.d.ts +38 -0
  263. package/lib/dist/extraction/wasm-runtime-flags.d.ts.map +1 -0
  264. package/lib/dist/extraction/wasm-runtime-flags.js +106 -0
  265. package/lib/dist/extraction/wasm-runtime-flags.js.map +1 -0
  266. package/lib/dist/graph/index.d.ts +8 -0
  267. package/lib/dist/graph/index.d.ts.map +1 -0
  268. package/lib/dist/graph/index.js +13 -0
  269. package/lib/dist/graph/index.js.map +1 -0
  270. package/lib/dist/graph/queries.d.ts +106 -0
  271. package/lib/dist/graph/queries.d.ts.map +1 -0
  272. package/lib/dist/graph/queries.js +339 -0
  273. package/lib/dist/graph/queries.js.map +1 -0
  274. package/lib/dist/graph/traversal.d.ts +127 -0
  275. package/lib/dist/graph/traversal.d.ts.map +1 -0
  276. package/lib/dist/graph/traversal.js +599 -0
  277. package/lib/dist/graph/traversal.js.map +1 -0
  278. package/lib/dist/index.d.ts +642 -0
  279. package/lib/dist/index.d.ts.map +1 -0
  280. package/lib/dist/index.js +1387 -0
  281. package/lib/dist/index.js.map +1 -0
  282. package/lib/dist/installer/config-writer.d.ts +28 -0
  283. package/lib/dist/installer/config-writer.d.ts.map +1 -0
  284. package/lib/dist/installer/config-writer.js +91 -0
  285. package/lib/dist/installer/config-writer.js.map +1 -0
  286. package/lib/dist/installer/index.d.ts +100 -0
  287. package/lib/dist/installer/index.d.ts.map +1 -0
  288. package/lib/dist/installer/index.js +526 -0
  289. package/lib/dist/installer/index.js.map +1 -0
  290. package/lib/dist/installer/instructions-template.d.ts +41 -0
  291. package/lib/dist/installer/instructions-template.d.ts.map +1 -0
  292. package/lib/dist/installer/instructions-template.js +53 -0
  293. package/lib/dist/installer/instructions-template.js.map +1 -0
  294. package/lib/dist/installer/targets/antigravity.d.ts +57 -0
  295. package/lib/dist/installer/targets/antigravity.d.ts.map +1 -0
  296. package/lib/dist/installer/targets/antigravity.js +308 -0
  297. package/lib/dist/installer/targets/antigravity.js.map +1 -0
  298. package/lib/dist/installer/targets/claude.d.ts +62 -0
  299. package/lib/dist/installer/targets/claude.d.ts.map +1 -0
  300. package/lib/dist/installer/targets/claude.js +454 -0
  301. package/lib/dist/installer/targets/claude.js.map +1 -0
  302. package/lib/dist/installer/targets/codex.d.ts +18 -0
  303. package/lib/dist/installer/targets/codex.d.ts.map +1 -0
  304. package/lib/dist/installer/targets/codex.js +185 -0
  305. package/lib/dist/installer/targets/codex.js.map +1 -0
  306. package/lib/dist/installer/targets/cursor.d.ts +35 -0
  307. package/lib/dist/installer/targets/cursor.d.ts.map +1 -0
  308. package/lib/dist/installer/targets/cursor.js +254 -0
  309. package/lib/dist/installer/targets/cursor.js.map +1 -0
  310. package/lib/dist/installer/targets/gemini.d.ts +26 -0
  311. package/lib/dist/installer/targets/gemini.d.ts.map +1 -0
  312. package/lib/dist/installer/targets/gemini.js +165 -0
  313. package/lib/dist/installer/targets/gemini.js.map +1 -0
  314. package/lib/dist/installer/targets/hermes.d.ts +18 -0
  315. package/lib/dist/installer/targets/hermes.d.ts.map +1 -0
  316. package/lib/dist/installer/targets/hermes.js +359 -0
  317. package/lib/dist/installer/targets/hermes.js.map +1 -0
  318. package/lib/dist/installer/targets/kiro.d.ts +27 -0
  319. package/lib/dist/installer/targets/kiro.d.ts.map +1 -0
  320. package/lib/dist/installer/targets/kiro.js +178 -0
  321. package/lib/dist/installer/targets/kiro.js.map +1 -0
  322. package/lib/dist/installer/targets/opencode.d.ts +38 -0
  323. package/lib/dist/installer/targets/opencode.d.ts.map +1 -0
  324. package/lib/dist/installer/targets/opencode.js +288 -0
  325. package/lib/dist/installer/targets/opencode.js.map +1 -0
  326. package/lib/dist/installer/targets/registry.d.ts +35 -0
  327. package/lib/dist/installer/targets/registry.d.ts.map +1 -0
  328. package/lib/dist/installer/targets/registry.js +91 -0
  329. package/lib/dist/installer/targets/registry.js.map +1 -0
  330. package/lib/dist/installer/targets/shared.d.ts +101 -0
  331. package/lib/dist/installer/targets/shared.d.ts.map +1 -0
  332. package/lib/dist/installer/targets/shared.js +264 -0
  333. package/lib/dist/installer/targets/shared.js.map +1 -0
  334. package/lib/dist/installer/targets/toml.d.ts +52 -0
  335. package/lib/dist/installer/targets/toml.d.ts.map +1 -0
  336. package/lib/dist/installer/targets/toml.js +147 -0
  337. package/lib/dist/installer/targets/toml.js.map +1 -0
  338. package/lib/dist/installer/targets/types.d.ts +108 -0
  339. package/lib/dist/installer/targets/types.d.ts.map +1 -0
  340. package/lib/dist/installer/targets/types.js +16 -0
  341. package/lib/dist/installer/targets/types.js.map +1 -0
  342. package/lib/dist/mcp/daemon-manager.d.ts +42 -0
  343. package/lib/dist/mcp/daemon-manager.d.ts.map +1 -0
  344. package/lib/dist/mcp/daemon-manager.js +129 -0
  345. package/lib/dist/mcp/daemon-manager.js.map +1 -0
  346. package/lib/dist/mcp/daemon-paths.d.ts +73 -0
  347. package/lib/dist/mcp/daemon-paths.d.ts.map +1 -0
  348. package/lib/dist/mcp/daemon-paths.js +165 -0
  349. package/lib/dist/mcp/daemon-paths.js.map +1 -0
  350. package/lib/dist/mcp/daemon-registry.d.ts +47 -0
  351. package/lib/dist/mcp/daemon-registry.d.ts.map +1 -0
  352. package/lib/dist/mcp/daemon-registry.js +233 -0
  353. package/lib/dist/mcp/daemon-registry.js.map +1 -0
  354. package/lib/dist/mcp/daemon.d.ts +290 -0
  355. package/lib/dist/mcp/daemon.d.ts.map +1 -0
  356. package/lib/dist/mcp/daemon.js +840 -0
  357. package/lib/dist/mcp/daemon.js.map +1 -0
  358. package/lib/dist/mcp/dynamic-boundaries.d.ts +41 -0
  359. package/lib/dist/mcp/dynamic-boundaries.d.ts.map +1 -0
  360. package/lib/dist/mcp/dynamic-boundaries.js +360 -0
  361. package/lib/dist/mcp/dynamic-boundaries.js.map +1 -0
  362. package/lib/dist/mcp/early-ppid.d.ts +26 -0
  363. package/lib/dist/mcp/early-ppid.d.ts.map +1 -0
  364. package/lib/dist/mcp/early-ppid.js +29 -0
  365. package/lib/dist/mcp/early-ppid.js.map +1 -0
  366. package/lib/dist/mcp/engine.d.ts +122 -0
  367. package/lib/dist/mcp/engine.d.ts.map +1 -0
  368. package/lib/dist/mcp/engine.js +350 -0
  369. package/lib/dist/mcp/engine.js.map +1 -0
  370. package/lib/dist/mcp/index.d.ts +113 -0
  371. package/lib/dist/mcp/index.d.ts.map +1 -0
  372. package/lib/dist/mcp/index.js +498 -0
  373. package/lib/dist/mcp/index.js.map +1 -0
  374. package/lib/dist/mcp/liveness-watchdog.d.ts +18 -0
  375. package/lib/dist/mcp/liveness-watchdog.d.ts.map +1 -0
  376. package/lib/dist/mcp/liveness-watchdog.js +207 -0
  377. package/lib/dist/mcp/liveness-watchdog.js.map +1 -0
  378. package/lib/dist/mcp/ppid-watchdog.d.ts +62 -0
  379. package/lib/dist/mcp/ppid-watchdog.d.ts.map +1 -0
  380. package/lib/dist/mcp/ppid-watchdog.js +64 -0
  381. package/lib/dist/mcp/ppid-watchdog.js.map +1 -0
  382. package/lib/dist/mcp/proxy.d.ts +87 -0
  383. package/lib/dist/mcp/proxy.d.ts.map +1 -0
  384. package/lib/dist/mcp/proxy.js +659 -0
  385. package/lib/dist/mcp/proxy.js.map +1 -0
  386. package/lib/dist/mcp/query-pool.d.ts +94 -0
  387. package/lib/dist/mcp/query-pool.d.ts.map +1 -0
  388. package/lib/dist/mcp/query-pool.js +297 -0
  389. package/lib/dist/mcp/query-pool.js.map +1 -0
  390. package/lib/dist/mcp/query-worker.d.ts +24 -0
  391. package/lib/dist/mcp/query-worker.d.ts.map +1 -0
  392. package/lib/dist/mcp/query-worker.js +87 -0
  393. package/lib/dist/mcp/query-worker.js.map +1 -0
  394. package/lib/dist/mcp/server-instructions.d.ts +34 -0
  395. package/lib/dist/mcp/server-instructions.d.ts.map +1 -0
  396. package/lib/dist/mcp/server-instructions.js +106 -0
  397. package/lib/dist/mcp/server-instructions.js.map +1 -0
  398. package/lib/dist/mcp/session.d.ts +79 -0
  399. package/lib/dist/mcp/session.d.ts.map +1 -0
  400. package/lib/dist/mcp/session.js +330 -0
  401. package/lib/dist/mcp/session.js.map +1 -0
  402. package/lib/dist/mcp/startup-handshake.d.ts +44 -0
  403. package/lib/dist/mcp/startup-handshake.d.ts.map +1 -0
  404. package/lib/dist/mcp/startup-handshake.js +73 -0
  405. package/lib/dist/mcp/startup-handshake.js.map +1 -0
  406. package/lib/dist/mcp/stdin-teardown.d.ts +27 -0
  407. package/lib/dist/mcp/stdin-teardown.d.ts.map +1 -0
  408. package/lib/dist/mcp/stdin-teardown.js +49 -0
  409. package/lib/dist/mcp/stdin-teardown.js.map +1 -0
  410. package/lib/dist/mcp/tools.d.ts +613 -0
  411. package/lib/dist/mcp/tools.d.ts.map +1 -0
  412. package/lib/dist/mcp/tools.js +4424 -0
  413. package/lib/dist/mcp/tools.js.map +1 -0
  414. package/lib/dist/mcp/transport.d.ts +188 -0
  415. package/lib/dist/mcp/transport.d.ts.map +1 -0
  416. package/lib/dist/mcp/transport.js +359 -0
  417. package/lib/dist/mcp/transport.js.map +1 -0
  418. package/lib/dist/mcp/version.d.ts +19 -0
  419. package/lib/dist/mcp/version.d.ts.map +1 -0
  420. package/lib/dist/mcp/version.js +71 -0
  421. package/lib/dist/mcp/version.js.map +1 -0
  422. package/lib/dist/project-config.d.ts +94 -0
  423. package/lib/dist/project-config.d.ts.map +1 -0
  424. package/lib/dist/project-config.js +374 -0
  425. package/lib/dist/project-config.js.map +1 -0
  426. package/lib/dist/resolution/c-fnptr-synthesizer.d.ts +5 -0
  427. package/lib/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -0
  428. package/lib/dist/resolution/c-fnptr-synthesizer.js +1038 -0
  429. package/lib/dist/resolution/c-fnptr-synthesizer.js.map +1 -0
  430. package/lib/dist/resolution/callback-synthesizer.d.ts +15 -0
  431. package/lib/dist/resolution/callback-synthesizer.d.ts.map +1 -0
  432. package/lib/dist/resolution/callback-synthesizer.js +3658 -0
  433. package/lib/dist/resolution/callback-synthesizer.js.map +1 -0
  434. package/lib/dist/resolution/cooperative-yield.d.ts +32 -0
  435. package/lib/dist/resolution/cooperative-yield.d.ts.map +1 -0
  436. package/lib/dist/resolution/cooperative-yield.js +42 -0
  437. package/lib/dist/resolution/cooperative-yield.js.map +1 -0
  438. package/lib/dist/resolution/frameworks/astro.d.ts +9 -0
  439. package/lib/dist/resolution/frameworks/astro.d.ts.map +1 -0
  440. package/lib/dist/resolution/frameworks/astro.js +169 -0
  441. package/lib/dist/resolution/frameworks/astro.js.map +1 -0
  442. package/lib/dist/resolution/frameworks/cargo-workspace.d.ts +18 -0
  443. package/lib/dist/resolution/frameworks/cargo-workspace.d.ts.map +1 -0
  444. package/lib/dist/resolution/frameworks/cargo-workspace.js +225 -0
  445. package/lib/dist/resolution/frameworks/cargo-workspace.js.map +1 -0
  446. package/lib/dist/resolution/frameworks/cics.d.ts +20 -0
  447. package/lib/dist/resolution/frameworks/cics.d.ts.map +1 -0
  448. package/lib/dist/resolution/frameworks/cics.js +90 -0
  449. package/lib/dist/resolution/frameworks/cics.js.map +1 -0
  450. package/lib/dist/resolution/frameworks/csharp.d.ts +8 -0
  451. package/lib/dist/resolution/frameworks/csharp.d.ts.map +1 -0
  452. package/lib/dist/resolution/frameworks/csharp.js +241 -0
  453. package/lib/dist/resolution/frameworks/csharp.js.map +1 -0
  454. package/lib/dist/resolution/frameworks/drupal.d.ts +51 -0
  455. package/lib/dist/resolution/frameworks/drupal.d.ts.map +1 -0
  456. package/lib/dist/resolution/frameworks/drupal.js +367 -0
  457. package/lib/dist/resolution/frameworks/drupal.js.map +1 -0
  458. package/lib/dist/resolution/frameworks/expo-modules.d.ts +3 -0
  459. package/lib/dist/resolution/frameworks/expo-modules.d.ts.map +1 -0
  460. package/lib/dist/resolution/frameworks/expo-modules.js +148 -0
  461. package/lib/dist/resolution/frameworks/expo-modules.js.map +1 -0
  462. package/lib/dist/resolution/frameworks/express.d.ts +8 -0
  463. package/lib/dist/resolution/frameworks/express.d.ts.map +1 -0
  464. package/lib/dist/resolution/frameworks/express.js +308 -0
  465. package/lib/dist/resolution/frameworks/express.js.map +1 -0
  466. package/lib/dist/resolution/frameworks/fabric.d.ts +3 -0
  467. package/lib/dist/resolution/frameworks/fabric.d.ts.map +1 -0
  468. package/lib/dist/resolution/frameworks/fabric.js +354 -0
  469. package/lib/dist/resolution/frameworks/fabric.js.map +1 -0
  470. package/lib/dist/resolution/frameworks/go.d.ts +8 -0
  471. package/lib/dist/resolution/frameworks/go.d.ts.map +1 -0
  472. package/lib/dist/resolution/frameworks/go.js +161 -0
  473. package/lib/dist/resolution/frameworks/go.js.map +1 -0
  474. package/lib/dist/resolution/frameworks/goframe.d.ts +41 -0
  475. package/lib/dist/resolution/frameworks/goframe.d.ts.map +1 -0
  476. package/lib/dist/resolution/frameworks/goframe.js +112 -0
  477. package/lib/dist/resolution/frameworks/goframe.js.map +1 -0
  478. package/lib/dist/resolution/frameworks/index.d.ts +50 -0
  479. package/lib/dist/resolution/frameworks/index.d.ts.map +1 -0
  480. package/lib/dist/resolution/frameworks/index.js +175 -0
  481. package/lib/dist/resolution/frameworks/index.js.map +1 -0
  482. package/lib/dist/resolution/frameworks/java.d.ts +8 -0
  483. package/lib/dist/resolution/frameworks/java.d.ts.map +1 -0
  484. package/lib/dist/resolution/frameworks/java.js +517 -0
  485. package/lib/dist/resolution/frameworks/java.js.map +1 -0
  486. package/lib/dist/resolution/frameworks/laravel.d.ts +13 -0
  487. package/lib/dist/resolution/frameworks/laravel.d.ts.map +1 -0
  488. package/lib/dist/resolution/frameworks/laravel.js +257 -0
  489. package/lib/dist/resolution/frameworks/laravel.js.map +1 -0
  490. package/lib/dist/resolution/frameworks/nestjs.d.ts +26 -0
  491. package/lib/dist/resolution/frameworks/nestjs.d.ts.map +1 -0
  492. package/lib/dist/resolution/frameworks/nestjs.js +698 -0
  493. package/lib/dist/resolution/frameworks/nestjs.js.map +1 -0
  494. package/lib/dist/resolution/frameworks/play.d.ts +19 -0
  495. package/lib/dist/resolution/frameworks/play.d.ts.map +1 -0
  496. package/lib/dist/resolution/frameworks/play.js +111 -0
  497. package/lib/dist/resolution/frameworks/play.js.map +1 -0
  498. package/lib/dist/resolution/frameworks/python.d.ts +10 -0
  499. package/lib/dist/resolution/frameworks/python.d.ts.map +1 -0
  500. package/lib/dist/resolution/frameworks/python.js +400 -0
  501. package/lib/dist/resolution/frameworks/python.js.map +1 -0
  502. package/lib/dist/resolution/frameworks/react-native.d.ts +3 -0
  503. package/lib/dist/resolution/frameworks/react-native.d.ts.map +1 -0
  504. package/lib/dist/resolution/frameworks/react-native.js +410 -0
  505. package/lib/dist/resolution/frameworks/react-native.js.map +1 -0
  506. package/lib/dist/resolution/frameworks/react.d.ts +8 -0
  507. package/lib/dist/resolution/frameworks/react.d.ts.map +1 -0
  508. package/lib/dist/resolution/frameworks/react.js +334 -0
  509. package/lib/dist/resolution/frameworks/react.js.map +1 -0
  510. package/lib/dist/resolution/frameworks/ruby.d.ts +8 -0
  511. package/lib/dist/resolution/frameworks/ruby.d.ts.map +1 -0
  512. package/lib/dist/resolution/frameworks/ruby.js +302 -0
  513. package/lib/dist/resolution/frameworks/ruby.js.map +1 -0
  514. package/lib/dist/resolution/frameworks/rust.d.ts +8 -0
  515. package/lib/dist/resolution/frameworks/rust.d.ts.map +1 -0
  516. package/lib/dist/resolution/frameworks/rust.js +304 -0
  517. package/lib/dist/resolution/frameworks/rust.js.map +1 -0
  518. package/lib/dist/resolution/frameworks/svelte.d.ts +9 -0
  519. package/lib/dist/resolution/frameworks/svelte.d.ts.map +1 -0
  520. package/lib/dist/resolution/frameworks/svelte.js +253 -0
  521. package/lib/dist/resolution/frameworks/svelte.js.map +1 -0
  522. package/lib/dist/resolution/frameworks/swift-objc.d.ts +37 -0
  523. package/lib/dist/resolution/frameworks/swift-objc.d.ts.map +1 -0
  524. package/lib/dist/resolution/frameworks/swift-objc.js +252 -0
  525. package/lib/dist/resolution/frameworks/swift-objc.js.map +1 -0
  526. package/lib/dist/resolution/frameworks/swift.d.ts +10 -0
  527. package/lib/dist/resolution/frameworks/swift.d.ts.map +1 -0
  528. package/lib/dist/resolution/frameworks/swift.js +400 -0
  529. package/lib/dist/resolution/frameworks/swift.js.map +1 -0
  530. package/lib/dist/resolution/frameworks/terraform.d.ts +38 -0
  531. package/lib/dist/resolution/frameworks/terraform.d.ts.map +1 -0
  532. package/lib/dist/resolution/frameworks/terraform.js +277 -0
  533. package/lib/dist/resolution/frameworks/terraform.js.map +1 -0
  534. package/lib/dist/resolution/frameworks/vue.d.ts +9 -0
  535. package/lib/dist/resolution/frameworks/vue.d.ts.map +1 -0
  536. package/lib/dist/resolution/frameworks/vue.js +303 -0
  537. package/lib/dist/resolution/frameworks/vue.js.map +1 -0
  538. package/lib/dist/resolution/go-module.d.ts +26 -0
  539. package/lib/dist/resolution/go-module.d.ts.map +1 -0
  540. package/lib/dist/resolution/go-module.js +78 -0
  541. package/lib/dist/resolution/go-module.js.map +1 -0
  542. package/lib/dist/resolution/goframe-synthesizer.d.ts +28 -0
  543. package/lib/dist/resolution/goframe-synthesizer.d.ts.map +1 -0
  544. package/lib/dist/resolution/goframe-synthesizer.js +158 -0
  545. package/lib/dist/resolution/goframe-synthesizer.js.map +1 -0
  546. package/lib/dist/resolution/import-resolver.d.ts +85 -0
  547. package/lib/dist/resolution/import-resolver.d.ts.map +1 -0
  548. package/lib/dist/resolution/import-resolver.js +1974 -0
  549. package/lib/dist/resolution/import-resolver.js.map +1 -0
  550. package/lib/dist/resolution/index.d.ts +238 -0
  551. package/lib/dist/resolution/index.d.ts.map +1 -0
  552. package/lib/dist/resolution/index.js +1633 -0
  553. package/lib/dist/resolution/index.js.map +1 -0
  554. package/lib/dist/resolution/lru-cache.d.ts +24 -0
  555. package/lib/dist/resolution/lru-cache.d.ts.map +1 -0
  556. package/lib/dist/resolution/lru-cache.js +62 -0
  557. package/lib/dist/resolution/lru-cache.js.map +1 -0
  558. package/lib/dist/resolution/name-matcher.d.ts +112 -0
  559. package/lib/dist/resolution/name-matcher.d.ts.map +1 -0
  560. package/lib/dist/resolution/name-matcher.js +1701 -0
  561. package/lib/dist/resolution/name-matcher.js.map +1 -0
  562. package/lib/dist/resolution/path-aliases.d.ts +68 -0
  563. package/lib/dist/resolution/path-aliases.d.ts.map +1 -0
  564. package/lib/dist/resolution/path-aliases.js +238 -0
  565. package/lib/dist/resolution/path-aliases.js.map +1 -0
  566. package/lib/dist/resolution/strip-comments.d.ts +27 -0
  567. package/lib/dist/resolution/strip-comments.d.ts.map +1 -0
  568. package/lib/dist/resolution/strip-comments.js +492 -0
  569. package/lib/dist/resolution/strip-comments.js.map +1 -0
  570. package/lib/dist/resolution/swift-objc-bridge.d.ts +134 -0
  571. package/lib/dist/resolution/swift-objc-bridge.d.ts.map +1 -0
  572. package/lib/dist/resolution/swift-objc-bridge.js +256 -0
  573. package/lib/dist/resolution/swift-objc-bridge.js.map +1 -0
  574. package/lib/dist/resolution/types.d.ts +253 -0
  575. package/lib/dist/resolution/types.d.ts.map +1 -0
  576. package/lib/dist/resolution/types.js +8 -0
  577. package/lib/dist/resolution/types.js.map +1 -0
  578. package/lib/dist/resolution/workspace-packages.d.ts +58 -0
  579. package/lib/dist/resolution/workspace-packages.d.ts.map +1 -0
  580. package/lib/dist/resolution/workspace-packages.js +346 -0
  581. package/lib/dist/resolution/workspace-packages.js.map +1 -0
  582. package/lib/dist/search/identifier-segments.d.ts +60 -0
  583. package/lib/dist/search/identifier-segments.d.ts.map +1 -0
  584. package/lib/dist/search/identifier-segments.js +176 -0
  585. package/lib/dist/search/identifier-segments.js.map +1 -0
  586. package/lib/dist/search/query-parser.d.ts +57 -0
  587. package/lib/dist/search/query-parser.d.ts.map +1 -0
  588. package/lib/dist/search/query-parser.js +177 -0
  589. package/lib/dist/search/query-parser.js.map +1 -0
  590. package/lib/dist/search/query-utils.d.ts +87 -0
  591. package/lib/dist/search/query-utils.d.ts.map +1 -0
  592. package/lib/dist/search/query-utils.js +449 -0
  593. package/lib/dist/search/query-utils.js.map +1 -0
  594. package/lib/dist/sync/git-hooks.d.ts +45 -0
  595. package/lib/dist/sync/git-hooks.d.ts.map +1 -0
  596. package/lib/dist/sync/git-hooks.js +227 -0
  597. package/lib/dist/sync/git-hooks.js.map +1 -0
  598. package/lib/dist/sync/index.d.ts +19 -0
  599. package/lib/dist/sync/index.d.ts.map +1 -0
  600. package/lib/dist/sync/index.js +35 -0
  601. package/lib/dist/sync/index.js.map +1 -0
  602. package/lib/dist/sync/watch-policy.d.ts +48 -0
  603. package/lib/dist/sync/watch-policy.d.ts.map +1 -0
  604. package/lib/dist/sync/watch-policy.js +124 -0
  605. package/lib/dist/sync/watch-policy.js.map +1 -0
  606. package/lib/dist/sync/watcher.d.ts +355 -0
  607. package/lib/dist/sync/watcher.d.ts.map +1 -0
  608. package/lib/dist/sync/watcher.js +848 -0
  609. package/lib/dist/sync/watcher.js.map +1 -0
  610. package/lib/dist/sync/worktree.d.ts +63 -0
  611. package/lib/dist/sync/worktree.d.ts.map +1 -0
  612. package/lib/dist/sync/worktree.js +182 -0
  613. package/lib/dist/sync/worktree.js.map +1 -0
  614. package/lib/dist/telemetry/index.d.ts +143 -0
  615. package/lib/dist/telemetry/index.d.ts.map +1 -0
  616. package/lib/dist/telemetry/index.js +541 -0
  617. package/lib/dist/telemetry/index.js.map +1 -0
  618. package/lib/dist/types.d.ts +415 -0
  619. package/lib/dist/types.d.ts.map +1 -0
  620. package/lib/dist/types.js +91 -0
  621. package/lib/dist/types.js.map +1 -0
  622. package/lib/dist/ui/glyphs.d.ts +42 -0
  623. package/lib/dist/ui/glyphs.d.ts.map +1 -0
  624. package/lib/dist/ui/glyphs.js +78 -0
  625. package/lib/dist/ui/glyphs.js.map +1 -0
  626. package/lib/dist/ui/shimmer-progress.d.ts +11 -0
  627. package/lib/dist/ui/shimmer-progress.d.ts.map +1 -0
  628. package/lib/dist/ui/shimmer-progress.js +90 -0
  629. package/lib/dist/ui/shimmer-progress.js.map +1 -0
  630. package/lib/dist/ui/shimmer-worker.d.ts +2 -0
  631. package/lib/dist/ui/shimmer-worker.d.ts.map +1 -0
  632. package/lib/dist/ui/shimmer-worker.js +118 -0
  633. package/lib/dist/ui/shimmer-worker.js.map +1 -0
  634. package/lib/dist/ui/types.d.ts +17 -0
  635. package/lib/dist/ui/types.d.ts.map +1 -0
  636. package/lib/dist/ui/types.js +3 -0
  637. package/lib/dist/ui/types.js.map +1 -0
  638. package/lib/dist/upgrade/index.d.ts +132 -0
  639. package/lib/dist/upgrade/index.d.ts.map +1 -0
  640. package/lib/dist/upgrade/index.js +498 -0
  641. package/lib/dist/upgrade/index.js.map +1 -0
  642. package/lib/dist/utils.d.ts +224 -0
  643. package/lib/dist/utils.d.ts.map +1 -0
  644. package/lib/dist/utils.js +583 -0
  645. package/lib/dist/utils.js.map +1 -0
  646. package/lib/node_modules/.package-lock.json +125 -0
  647. package/lib/node_modules/@clack/core/CHANGELOG.md +348 -0
  648. package/lib/node_modules/@clack/core/LICENSE +9 -0
  649. package/lib/node_modules/@clack/core/README.md +22 -0
  650. package/lib/node_modules/@clack/core/dist/index.d.mts +363 -0
  651. package/lib/node_modules/@clack/core/dist/index.mjs +17 -0
  652. package/lib/node_modules/@clack/core/dist/index.mjs.map +1 -0
  653. package/lib/node_modules/@clack/core/package.json +63 -0
  654. package/lib/node_modules/@clack/prompts/CHANGELOG.md +591 -0
  655. package/lib/node_modules/@clack/prompts/LICENSE +9 -0
  656. package/lib/node_modules/@clack/prompts/README.md +375 -0
  657. package/lib/node_modules/@clack/prompts/dist/index.d.mts +396 -0
  658. package/lib/node_modules/@clack/prompts/dist/index.mjs +144 -0
  659. package/lib/node_modules/@clack/prompts/dist/index.mjs.map +1 -0
  660. package/lib/node_modules/@clack/prompts/package.json +68 -0
  661. package/lib/node_modules/commander/LICENSE +22 -0
  662. package/lib/node_modules/commander/Readme.md +1176 -0
  663. package/lib/node_modules/commander/esm.mjs +16 -0
  664. package/lib/node_modules/commander/index.js +24 -0
  665. package/lib/node_modules/commander/lib/argument.js +150 -0
  666. package/lib/node_modules/commander/lib/command.js +2777 -0
  667. package/lib/node_modules/commander/lib/error.js +39 -0
  668. package/lib/node_modules/commander/lib/help.js +747 -0
  669. package/lib/node_modules/commander/lib/option.js +380 -0
  670. package/lib/node_modules/commander/lib/suggestSimilar.js +101 -0
  671. package/lib/node_modules/commander/package-support.json +19 -0
  672. package/lib/node_modules/commander/package.json +82 -0
  673. package/lib/node_modules/commander/typings/esm.d.mts +3 -0
  674. package/lib/node_modules/commander/typings/index.d.ts +1113 -0
  675. package/lib/node_modules/fast-string-truncated-width/dist/index.d.ts +4 -0
  676. package/lib/node_modules/fast-string-truncated-width/dist/index.js +111 -0
  677. package/lib/node_modules/fast-string-truncated-width/dist/types.d.ts +19 -0
  678. package/lib/node_modules/fast-string-truncated-width/dist/types.js +2 -0
  679. package/lib/node_modules/fast-string-truncated-width/dist/utils.d.ts +4 -0
  680. package/lib/node_modules/fast-string-truncated-width/dist/utils.js +20 -0
  681. package/lib/node_modules/fast-string-truncated-width/license +21 -0
  682. package/lib/node_modules/fast-string-truncated-width/package.json +35 -0
  683. package/lib/node_modules/fast-string-truncated-width/readme.md +59 -0
  684. package/lib/node_modules/fast-string-width/dist/index.d.ts +4 -0
  685. package/lib/node_modules/fast-string-width/dist/index.js +14 -0
  686. package/lib/node_modules/fast-string-width/license +21 -0
  687. package/lib/node_modules/fast-string-width/package.json +34 -0
  688. package/lib/node_modules/fast-string-width/readme.md +42 -0
  689. package/lib/node_modules/fast-wrap-ansi/LICENSE +23 -0
  690. package/lib/node_modules/fast-wrap-ansi/README.md +26 -0
  691. package/lib/node_modules/fast-wrap-ansi/lib/main.d.ts +6 -0
  692. package/lib/node_modules/fast-wrap-ansi/lib/main.js +219 -0
  693. package/lib/node_modules/fast-wrap-ansi/lib/main.js.map +1 -0
  694. package/lib/node_modules/fast-wrap-ansi/package.json +51 -0
  695. package/lib/node_modules/ignore/LICENSE-MIT +21 -0
  696. package/lib/node_modules/ignore/README.md +452 -0
  697. package/lib/node_modules/ignore/index.d.ts +81 -0
  698. package/lib/node_modules/ignore/index.js +784 -0
  699. package/lib/node_modules/ignore/legacy.js +681 -0
  700. package/lib/node_modules/ignore/package.json +87 -0
  701. package/lib/node_modules/jsonc-parser/CHANGELOG.md +76 -0
  702. package/lib/node_modules/jsonc-parser/LICENSE.md +21 -0
  703. package/lib/node_modules/jsonc-parser/README.md +364 -0
  704. package/lib/node_modules/jsonc-parser/SECURITY.md +41 -0
  705. package/lib/node_modules/jsonc-parser/lib/esm/impl/edit.js +185 -0
  706. package/lib/node_modules/jsonc-parser/lib/esm/impl/format.js +261 -0
  707. package/lib/node_modules/jsonc-parser/lib/esm/impl/parser.js +659 -0
  708. package/lib/node_modules/jsonc-parser/lib/esm/impl/scanner.js +443 -0
  709. package/lib/node_modules/jsonc-parser/lib/esm/impl/string-intern.js +29 -0
  710. package/lib/node_modules/jsonc-parser/lib/esm/main.d.ts +351 -0
  711. package/lib/node_modules/jsonc-parser/lib/esm/main.js +178 -0
  712. package/lib/node_modules/jsonc-parser/lib/umd/impl/edit.js +201 -0
  713. package/lib/node_modules/jsonc-parser/lib/umd/impl/format.js +275 -0
  714. package/lib/node_modules/jsonc-parser/lib/umd/impl/parser.js +682 -0
  715. package/lib/node_modules/jsonc-parser/lib/umd/impl/scanner.js +456 -0
  716. package/lib/node_modules/jsonc-parser/lib/umd/impl/string-intern.js +42 -0
  717. package/lib/node_modules/jsonc-parser/lib/umd/main.d.ts +351 -0
  718. package/lib/node_modules/jsonc-parser/lib/umd/main.js +194 -0
  719. package/lib/node_modules/jsonc-parser/package.json +37 -0
  720. package/lib/node_modules/picomatch/LICENSE +21 -0
  721. package/lib/node_modules/picomatch/README.md +738 -0
  722. package/lib/node_modules/picomatch/index.js +17 -0
  723. package/lib/node_modules/picomatch/lib/constants.js +180 -0
  724. package/lib/node_modules/picomatch/lib/parse.js +1085 -0
  725. package/lib/node_modules/picomatch/lib/picomatch.js +341 -0
  726. package/lib/node_modules/picomatch/lib/scan.js +391 -0
  727. package/lib/node_modules/picomatch/lib/utils.js +72 -0
  728. package/lib/node_modules/picomatch/package.json +83 -0
  729. package/lib/node_modules/picomatch/posix.js +3 -0
  730. package/lib/node_modules/sisteransi/license +21 -0
  731. package/lib/node_modules/sisteransi/package.json +34 -0
  732. package/lib/node_modules/sisteransi/readme.md +113 -0
  733. package/lib/node_modules/sisteransi/src/index.js +58 -0
  734. package/lib/node_modules/sisteransi/src/sisteransi.d.ts +35 -0
  735. package/lib/node_modules/tree-sitter-wasms/LICENSE +24 -0
  736. package/lib/node_modules/tree-sitter-wasms/README.md +23 -0
  737. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-bash.wasm +0 -0
  738. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-c.wasm +0 -0
  739. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-c_sharp.wasm +0 -0
  740. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-cpp.wasm +0 -0
  741. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-css.wasm +0 -0
  742. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-dart.wasm +0 -0
  743. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-elisp.wasm +0 -0
  744. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-elixir.wasm +0 -0
  745. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-elm.wasm +0 -0
  746. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-embedded_template.wasm +0 -0
  747. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-go.wasm +0 -0
  748. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-html.wasm +0 -0
  749. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-java.wasm +0 -0
  750. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-javascript.wasm +0 -0
  751. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-json.wasm +0 -0
  752. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-kotlin.wasm +0 -0
  753. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-lua.wasm +0 -0
  754. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-objc.wasm +0 -0
  755. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-ocaml.wasm +0 -0
  756. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-php.wasm +0 -0
  757. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-python.wasm +0 -0
  758. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-ql.wasm +0 -0
  759. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-rescript.wasm +0 -0
  760. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-ruby.wasm +0 -0
  761. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-rust.wasm +0 -0
  762. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-scala.wasm +0 -0
  763. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-solidity.wasm +0 -0
  764. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-swift.wasm +0 -0
  765. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-systemrdl.wasm +0 -0
  766. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-tlaplus.wasm +0 -0
  767. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-toml.wasm +0 -0
  768. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-tsx.wasm +0 -0
  769. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-typescript.wasm +0 -0
  770. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-vue.wasm +0 -0
  771. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-yaml.wasm +0 -0
  772. package/lib/node_modules/tree-sitter-wasms/out/tree-sitter-zig.wasm +0 -0
  773. package/lib/node_modules/tree-sitter-wasms/package.json +64 -0
  774. package/lib/node_modules/web-tree-sitter/LICENSE +21 -0
  775. package/lib/node_modules/web-tree-sitter/README.md +269 -0
  776. package/lib/node_modules/web-tree-sitter/debug/tree-sitter.cjs +4558 -0
  777. package/lib/node_modules/web-tree-sitter/debug/tree-sitter.cjs.map +7 -0
  778. package/lib/node_modules/web-tree-sitter/debug/tree-sitter.js +4516 -0
  779. package/lib/node_modules/web-tree-sitter/debug/tree-sitter.js.map +7 -0
  780. package/lib/node_modules/web-tree-sitter/debug/tree-sitter.wasm +0 -0
  781. package/lib/node_modules/web-tree-sitter/debug/tree-sitter.wasm.map +31 -0
  782. package/lib/node_modules/web-tree-sitter/lib/alloc.c +48 -0
  783. package/lib/node_modules/web-tree-sitter/lib/alloc.h +41 -0
  784. package/lib/node_modules/web-tree-sitter/lib/array.h +291 -0
  785. package/lib/node_modules/web-tree-sitter/lib/atomic.h +68 -0
  786. package/lib/node_modules/web-tree-sitter/lib/clock.h +146 -0
  787. package/lib/node_modules/web-tree-sitter/lib/error_costs.h +11 -0
  788. package/lib/node_modules/web-tree-sitter/lib/get_changed_ranges.c +523 -0
  789. package/lib/node_modules/web-tree-sitter/lib/get_changed_ranges.h +36 -0
  790. package/lib/node_modules/web-tree-sitter/lib/host.h +21 -0
  791. package/lib/node_modules/web-tree-sitter/lib/language.c +293 -0
  792. package/lib/node_modules/web-tree-sitter/lib/language.h +293 -0
  793. package/lib/node_modules/web-tree-sitter/lib/length.h +52 -0
  794. package/lib/node_modules/web-tree-sitter/lib/lexer.c +483 -0
  795. package/lib/node_modules/web-tree-sitter/lib/lexer.h +54 -0
  796. package/lib/node_modules/web-tree-sitter/lib/lib.c +12 -0
  797. package/lib/node_modules/web-tree-sitter/lib/node.c +875 -0
  798. package/lib/node_modules/web-tree-sitter/lib/parser.c +2297 -0
  799. package/lib/node_modules/web-tree-sitter/lib/parser.h +286 -0
  800. package/lib/node_modules/web-tree-sitter/lib/point.h +48 -0
  801. package/lib/node_modules/web-tree-sitter/lib/query.c +4347 -0
  802. package/lib/node_modules/web-tree-sitter/lib/reduce_action.h +34 -0
  803. package/lib/node_modules/web-tree-sitter/lib/reusable_node.h +95 -0
  804. package/lib/node_modules/web-tree-sitter/lib/stack.c +912 -0
  805. package/lib/node_modules/web-tree-sitter/lib/stack.h +133 -0
  806. package/lib/node_modules/web-tree-sitter/lib/subtree.c +1034 -0
  807. package/lib/node_modules/web-tree-sitter/lib/subtree.h +399 -0
  808. package/lib/node_modules/web-tree-sitter/lib/tree-sitter.c +987 -0
  809. package/lib/node_modules/web-tree-sitter/lib/tree-sitter.cjs +2988 -0
  810. package/lib/node_modules/web-tree-sitter/lib/tree-sitter.wasm +0 -0
  811. package/lib/node_modules/web-tree-sitter/lib/tree-sitter.wasm.map +1 -0
  812. package/lib/node_modules/web-tree-sitter/lib/tree.c +170 -0
  813. package/lib/node_modules/web-tree-sitter/lib/tree.h +31 -0
  814. package/lib/node_modules/web-tree-sitter/lib/tree_cursor.c +716 -0
  815. package/lib/node_modules/web-tree-sitter/lib/tree_cursor.h +48 -0
  816. package/lib/node_modules/web-tree-sitter/lib/ts_assert.h +11 -0
  817. package/lib/node_modules/web-tree-sitter/lib/unicode.h +75 -0
  818. package/lib/node_modules/web-tree-sitter/lib/wasm_store.c +1937 -0
  819. package/lib/node_modules/web-tree-sitter/lib/wasm_store.h +31 -0
  820. package/lib/node_modules/web-tree-sitter/package.json +98 -0
  821. package/lib/node_modules/web-tree-sitter/src/bindings.ts +26 -0
  822. package/lib/node_modules/web-tree-sitter/src/constants.ts +133 -0
  823. package/lib/node_modules/web-tree-sitter/src/index.ts +31 -0
  824. package/lib/node_modules/web-tree-sitter/src/language.ts +291 -0
  825. package/lib/node_modules/web-tree-sitter/src/lookahead_iterator.ts +75 -0
  826. package/lib/node_modules/web-tree-sitter/src/marshal.ts +176 -0
  827. package/lib/node_modules/web-tree-sitter/src/node.ts +646 -0
  828. package/lib/node_modules/web-tree-sitter/src/parser.ts +325 -0
  829. package/lib/node_modules/web-tree-sitter/src/query.ts +973 -0
  830. package/lib/node_modules/web-tree-sitter/src/tree.ts +145 -0
  831. package/lib/node_modules/web-tree-sitter/src/tree_cursor.ts +318 -0
  832. package/lib/node_modules/web-tree-sitter/tree-sitter.cjs +4031 -0
  833. package/lib/node_modules/web-tree-sitter/tree-sitter.cjs.map +7 -0
  834. package/lib/node_modules/web-tree-sitter/tree-sitter.js +3980 -0
  835. package/lib/node_modules/web-tree-sitter/tree-sitter.js.map +7 -0
  836. package/lib/node_modules/web-tree-sitter/tree-sitter.wasm +0 -0
  837. package/lib/node_modules/web-tree-sitter/tree-sitter.wasm.map +30 -0
  838. package/lib/node_modules/web-tree-sitter/web-tree-sitter.d.ts +1030 -0
  839. package/lib/node_modules/web-tree-sitter/web-tree-sitter.d.ts.map +56 -0
  840. package/lib/package.json +64 -0
  841. package/node +0 -0
  842. package/package.json +17 -0
@@ -0,0 +1,840 @@
1
+ "use strict";
2
+ /**
3
+ * Shared MCP daemon — issue #411.
4
+ *
5
+ * One detached `bhgraph serve --mcp` daemon process per project root,
6
+ * accepting N concurrent MCP clients over a Unix-domain socket (or named pipe
7
+ * on Windows). Each incoming connection gets its own {@link MCPSession}; all
8
+ * sessions share a single {@link MCPEngine}, which means a single file watcher
9
+ * (one inotify set), a single SQLite connection (one WAL writer), and a single
10
+ * tree-sitter warm-up — paid once, amortized across every agent talking to the
11
+ * project.
12
+ *
13
+ * Lifecycle (see also `./index.ts` and `./proxy.ts`):
14
+ * - The daemon is spawned **detached** (its own session/process group, stdio
15
+ * decoupled) by the first launcher that finds no daemon running. It is NOT
16
+ * a child of any MCP host, so closing one terminal / Ctrl-C'ing one session
17
+ * can't take it down and sever the others. That's why this process has no
18
+ * PPID watchdog: it deliberately outlives every individual client.
19
+ * - Every MCP host talks to the daemon through a thin `proxy` process (the
20
+ * thing the host actually spawned). The proxy keeps the #277 PPID watchdog,
21
+ * so a SIGKILL'd host still reaps its proxy promptly; the proxy's socket
22
+ * close then decrements the daemon's refcount.
23
+ * - When the last client disconnects the daemon lingers for
24
+ * `BHGRAPH_DAEMON_IDLE_TIMEOUT_MS` (default 300s) so back-to-back agent
25
+ * runs in the same project don't repay startup, then exits cleanly. This is
26
+ * what keeps a single-agent session from leaking a daemon forever (#277).
27
+ *
28
+ * What this file owns:
29
+ * - Listening on the daemon socket and spawning per-connection sessions.
30
+ * - The handshake "hello" line that lets a proxy verify it found a
31
+ * same-version daemon before piping any JSON-RPC through it.
32
+ * - The lockfile (`.bhgraph/daemon.pid`) competing daemons arbitrate
33
+ * against — atomic `O_EXCL` create with the full record written in the same
34
+ * breath (no empty-file window) + cleanup on exit.
35
+ * - Reference counting + idle timeout.
36
+ * - Graceful shutdown on SIGTERM/SIGINT and idle exit.
37
+ *
38
+ * What this file does NOT own:
39
+ * - The proxy side (`./proxy.ts`).
40
+ * - The decision of *whether* to run as daemon at all — that's `MCPServer`.
41
+ * - The MCP protocol state machine — that's `./session.ts`.
42
+ */
43
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
44
+ if (k2 === undefined) k2 = k;
45
+ var desc = Object.getOwnPropertyDescriptor(m, k);
46
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
47
+ desc = { enumerable: true, get: function() { return m[k]; } };
48
+ }
49
+ Object.defineProperty(o, k2, desc);
50
+ }) : (function(o, m, k, k2) {
51
+ if (k2 === undefined) k2 = k;
52
+ o[k2] = m[k];
53
+ }));
54
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
55
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
56
+ }) : function(o, v) {
57
+ o["default"] = v;
58
+ });
59
+ var __importStar = (this && this.__importStar) || (function () {
60
+ var ownKeys = function(o) {
61
+ ownKeys = Object.getOwnPropertyNames || function (o) {
62
+ var ar = [];
63
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
64
+ return ar;
65
+ };
66
+ return ownKeys(o);
67
+ };
68
+ return function (mod) {
69
+ if (mod && mod.__esModule) return mod;
70
+ var result = {};
71
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
72
+ __setModuleDefault(result, mod);
73
+ return result;
74
+ };
75
+ })();
76
+ Object.defineProperty(exports, "__esModule", { value: true });
77
+ exports.MAX_HELLO_LINE_BYTES = exports.Daemon = void 0;
78
+ exports.finalizeDaemonExit = finalizeDaemonExit;
79
+ exports.tryAcquireDaemonLock = tryAcquireDaemonLock;
80
+ exports.acquireLockViaExclusiveOpen = acquireLockViaExclusiveOpen;
81
+ exports.clearStaleDaemonLock = clearStaleDaemonLock;
82
+ exports.isProcessAlive = isProcessAlive;
83
+ exports.bindFirstUsableSocket = bindFirstUsableSocket;
84
+ exports.parseClientHelloLine = parseClientHelloLine;
85
+ exports.peerIsDead = peerIsDead;
86
+ const fs = __importStar(require("fs"));
87
+ const net = __importStar(require("net"));
88
+ const path = __importStar(require("path"));
89
+ const engine_1 = require("./engine");
90
+ const session_1 = require("./session");
91
+ const transport_1 = require("./transport");
92
+ const daemon_paths_1 = require("./daemon-paths");
93
+ const version_1 = require("./version");
94
+ const daemon_registry_1 = require("./daemon-registry");
95
+ /** Default idle linger after the last client disconnects. */
96
+ const DEFAULT_IDLE_TIMEOUT_MS = 300_000;
97
+ /**
98
+ * Hard ceiling on how long the daemon stays up with clients connected but no
99
+ * inbound traffic. A backstop (#692): if a client's socket-close is never
100
+ * delivered (a Windows named-pipe hazard) it stays counted forever and the
101
+ * normal idle timer — which only arms at zero clients — never fires. A phantom
102
+ * client sends no traffic, so bounding on inactivity reaps the daemon anyway.
103
+ * Set generously so a real but momentarily-idle session isn't reaped mid-use.
104
+ */
105
+ const DEFAULT_MAX_IDLE_MS = 1_800_000; // 30 min
106
+ /**
107
+ * Windows-only shutdown backstop. On Windows, calling `process.exit()` while a
108
+ * recursive `fs.watch` handle is still tearing down aborts the process with a
109
+ * libuv `UV_HANDLE_CLOSING` assertion (`0xC0000409`) — reproducible whenever the
110
+ * watched tree contains a nested repo (submodule / embedded clone), since that's
111
+ * what keeps a watch active at shutdown. The fix is to let the event loop drain
112
+ * so libuv finishes closing those handles, then exit naturally; this timer only
113
+ * force-exits if some unexpected handle keeps the loop alive past the grace
114
+ * window. Kept short so shutdown stays snappy in that fallback. See
115
+ * `finalizeDaemonExit`.
116
+ */
117
+ const DAEMON_SHUTDOWN_BACKSTOP_MS = 2_000;
118
+ /**
119
+ * Finalize daemon shutdown. On POSIX, exit immediately — it's clean and fast.
120
+ * On Windows, do NOT force an exit while watchers may still be closing (that
121
+ * trips the libuv assertion above); instead mark success and let the loop drain
122
+ * to a natural exit, with an UNREF'd backstop that force-exits only if a stray
123
+ * handle would otherwise hang shutdown. Pure and platform-injected so both
124
+ * branches are unit-testable off-Windows. Returns the backstop timer (Windows)
125
+ * so callers/tests can clear it.
126
+ */
127
+ function finalizeDaemonExit(platform, exit) {
128
+ if (platform === 'win32') {
129
+ process.exitCode = 0;
130
+ const backstop = setTimeout(() => exit(0), DAEMON_SHUTDOWN_BACKSTOP_MS);
131
+ // Unref so it never keeps the loop alive: a natural drain (watchers closed,
132
+ // nothing else pending) exits before it fires; it only fires when some other
133
+ // handle is keeping the loop running, which is exactly when we need it.
134
+ backstop.unref?.();
135
+ return backstop;
136
+ }
137
+ exit(0);
138
+ return null;
139
+ }
140
+ /** How often the daemon sweeps connected clients for a dead peer process (#692). */
141
+ const DEFAULT_CLIENT_SWEEP_MS = 30_000;
142
+ /** How long the daemon waits for the optional client-hello before proceeding without it. */
143
+ const CLIENT_HELLO_TIMEOUT_MS = 3_000;
144
+ /** Bytes/parse-window for an oversized hello line — bounded against a malicious peer. */
145
+ const MAX_HELLO_LINE_BYTES = 4096;
146
+ exports.MAX_HELLO_LINE_BYTES = MAX_HELLO_LINE_BYTES;
147
+ /**
148
+ * Run as the shared daemon for `projectRoot`. Resolves once the socket is
149
+ * listening. The Daemon owns the socket, the engine, and the lockfile until
150
+ * `stop()` is called or it exits on idle/signal.
151
+ *
152
+ * Race-safe: callers must first call `tryAcquireDaemonLock(projectRoot)` and
153
+ * only construct a Daemon if they got the lock (`kind: 'acquired'`). The atomic
154
+ * `O_EXCL` create inside the acquire helper — which now also writes the full
155
+ * record before returning — is the only synchronization between competing
156
+ * daemons.
157
+ */
158
+ class Daemon {
159
+ projectRoot;
160
+ server = null;
161
+ clients = new Set();
162
+ /** Per-client peer pids from the optional client-hello, for the liveness sweep. */
163
+ clientPeers = new Map();
164
+ idleTimer = null;
165
+ idleTimeoutMs;
166
+ maxIdleMs;
167
+ lastActivityAt = Date.now();
168
+ maxIdleTimer = null;
169
+ clientSweepTimer = null;
170
+ engine;
171
+ stopping = false;
172
+ socketPath;
173
+ pidPath;
174
+ constructor(projectRoot, opts = {}) {
175
+ this.projectRoot = projectRoot;
176
+ this.socketPath = (0, daemon_paths_1.getDaemonSocketPath)(projectRoot);
177
+ this.pidPath = (0, daemon_paths_1.getDaemonPidPath)(projectRoot);
178
+ this.idleTimeoutMs = opts.idleTimeoutMs ?? resolveIdleTimeoutMs();
179
+ this.maxIdleMs = opts.maxIdleMs ?? resolveMaxIdleMs();
180
+ // Daemon mode serves many concurrent clients on one event loop, so off-load
181
+ // read-tool dispatch to a worker pool — otherwise concurrent explores
182
+ // serialize and starve the MCP transport (clients time out). Direct mode
183
+ // (one stdio client) leaves the pool off; `BHGRAPH_QUERY_POOL_SIZE=0`
184
+ // disables it here too.
185
+ this.engine = new engine_1.MCPEngine({ queryPool: true });
186
+ this.engine.setProjectPathHint(projectRoot);
187
+ }
188
+ /**
189
+ * Bind the socket, kick off engine init, and register signal handlers. The
190
+ * lockfile body was already written atomically by `tryAcquireDaemonLock`, so
191
+ * there is nothing to write here. The promise resolves once the server is
192
+ * listening — the daemon then sticks around until idle/shutdown.
193
+ */
194
+ async start() {
195
+ // Engine init is deliberately backgrounded — see #172. The first session
196
+ // to land waits on `ensureInitialized` either way, and unloaded sessions
197
+ // (cross-project tool calls only) shouldn't pay any open cost.
198
+ void this.engine.ensureInitialized(this.projectRoot);
199
+ // Walk the ordered socket candidates and bind the first that works. The
200
+ // in-project path comes first; the deterministic tmpdir path is the fallback
201
+ // for a filesystem that can't host an AF_UNIX node at all (ExFAT/FAT external
202
+ // volumes, some network mounts, WSL2 DrvFs → ENOTSUP/EACCES; #997, #974). The
203
+ // `listen` closure clears a stale socket (left by a SIGKILL'd previous daemon)
204
+ // before each attempt — safe because we hold the lockfile, so no live daemon
205
+ // owns it; without it `listen` would wedge on EADDRINUSE.
206
+ const candidates = (0, daemon_paths_1.getDaemonSocketCandidates)(this.projectRoot);
207
+ const listen = (socketPath) => new Promise((resolve, reject) => {
208
+ if (process.platform !== 'win32') {
209
+ try {
210
+ fs.unlinkSync(socketPath);
211
+ }
212
+ catch { /* not-exists is fine */ }
213
+ }
214
+ const server = net.createServer((socket) => this.handleConnection(socket));
215
+ server.once('error', reject);
216
+ server.listen(socketPath, () => {
217
+ // POSIX: tighten permissions to user-only — the socket lives under
218
+ // `.bhgraph/` (git-ignored, maybe a shared FS) or tmpdir.
219
+ if (process.platform !== 'win32') {
220
+ try {
221
+ fs.chmodSync(socketPath, 0o600);
222
+ }
223
+ catch { /* best-effort */ }
224
+ }
225
+ resolve(server);
226
+ });
227
+ });
228
+ let bound;
229
+ try {
230
+ bound = await bindFirstUsableSocket(candidates, listen, {
231
+ onRelocate: (from, to, code) => process.stderr.write(`[BHGraph daemon] Socket ${from} unusable (${code}); relocating to ${to}.\n`),
232
+ });
233
+ }
234
+ catch (err) {
235
+ // Every candidate failed (the last one, or a non-relocatable error like a
236
+ // racing EADDRINUSE). We already hold the lockfile `tryAcquireDaemonLock`
237
+ // wrote; release it and any partial sockets so the NEXT launcher doesn't
238
+ // spin respawning us on a stale lock pointing at our now-dying pid. Then
239
+ // re-throw so the caller (the bin's try/catch) exits this detached daemon
240
+ // cleanly and every launcher falls back to direct mode (#974).
241
+ this.cleanupLockfile();
242
+ if (process.platform !== 'win32') {
243
+ for (const candidate of candidates) {
244
+ try {
245
+ fs.unlinkSync(candidate);
246
+ }
247
+ catch { /* may not exist */ }
248
+ }
249
+ }
250
+ throw err;
251
+ }
252
+ this.server = bound.server;
253
+ // Adopt the path we ACTUALLY bound — it may be a tmpdir fallback past an
254
+ // unusable in-project location. Everything downstream (lockfile, registry,
255
+ // chmod, cleanup, status) keys off this real path, not the preferred guess.
256
+ this.socketPath = bound.socketPath;
257
+ const lock = {
258
+ pid: process.pid,
259
+ version: version_1.BHGraphPackageVersion,
260
+ socketPath: this.socketPath,
261
+ startedAt: Date.now(),
262
+ };
263
+ // `tryAcquireDaemonLock` wrote the pidfile with the PREFERRED path (candidate
264
+ // 0) before we knew which one would bind. If we relocated, rewrite it so the
265
+ // per-project record is honest. Atomic temp+rename; safe because we hold the
266
+ // lock and we're alive — `clearStaleDaemonLock` pid-verifies, so no racing
267
+ // candidate clears or clobbers a live daemon's lock.
268
+ if (this.socketPath !== candidates[0]) {
269
+ try {
270
+ const tmpPid = `${this.pidPath}.${process.pid}.relocate`;
271
+ fs.writeFileSync(tmpPid, (0, daemon_paths_1.encodeLockInfo)(lock), { mode: 0o600 });
272
+ fs.renameSync(tmpPid, this.pidPath);
273
+ }
274
+ catch { /* best-effort; the registry record below carries the real path */ }
275
+ }
276
+ // Drop a discovery record so `bhgraph list` / `stop --all` can find us.
277
+ // Best-effort; a missing record only means list's liveness prune covers it.
278
+ (0, daemon_registry_1.registerDaemon)({ root: this.projectRoot, ...lock });
279
+ process.stderr.write(`[BHGraph daemon] Listening on ${this.socketPath} (pid ${process.pid}, v${version_1.BHGraphPackageVersion}). Idle timeout ${this.idleTimeoutMs}ms.\n`);
280
+ // No clients yet: arm the idle timer immediately so a daemon that nobody
281
+ // ever connects to (e.g. spawned then abandoned because the launcher died)
282
+ // doesn't pin resources forever.
283
+ this.armIdleTimer();
284
+ this.startLivenessTimers();
285
+ process.on('SIGINT', () => this.stop('SIGINT'));
286
+ process.on('SIGTERM', () => this.stop('SIGTERM'));
287
+ return { socketPath: this.socketPath, lock };
288
+ }
289
+ /** Currently-connected client count. Exposed for tests / status output. */
290
+ getClientCount() {
291
+ return this.clients.size;
292
+ }
293
+ /** The socket path the daemon is (or will be) listening on. */
294
+ getSocketPath() {
295
+ return this.socketPath;
296
+ }
297
+ /** Graceful shutdown: close all sessions, the engine, and clean up the lock. */
298
+ async stop(reason = 'stop') {
299
+ if (this.stopping)
300
+ return;
301
+ this.stopping = true;
302
+ if (this.idleTimer) {
303
+ clearTimeout(this.idleTimer);
304
+ this.idleTimer = null;
305
+ }
306
+ if (this.maxIdleTimer) {
307
+ clearInterval(this.maxIdleTimer);
308
+ this.maxIdleTimer = null;
309
+ }
310
+ if (this.clientSweepTimer) {
311
+ clearInterval(this.clientSweepTimer);
312
+ this.clientSweepTimer = null;
313
+ }
314
+ process.stderr.write(`[BHGraph daemon] Shutting down (${reason}; clients=${this.clients.size}).\n`);
315
+ for (const session of [...this.clients]) {
316
+ try {
317
+ session.stop();
318
+ }
319
+ catch { /* best-effort */ }
320
+ }
321
+ this.clients.clear();
322
+ if (this.server) {
323
+ await new Promise((resolve) => this.server.close(() => resolve()));
324
+ this.server = null;
325
+ }
326
+ this.engine.stop();
327
+ this.cleanupLockfile();
328
+ (0, daemon_registry_1.deregisterDaemon)(this.projectRoot);
329
+ if (process.platform !== 'win32') {
330
+ try {
331
+ fs.unlinkSync(this.socketPath);
332
+ }
333
+ catch { /* may already be gone */ }
334
+ }
335
+ // POSIX exits here; Windows drains first (engine.stop() above began closing
336
+ // the file watcher, and exiting mid-teardown aborts the process). See
337
+ // finalizeDaemonExit / DAEMON_SHUTDOWN_BACKSTOP_MS.
338
+ finalizeDaemonExit(process.platform, (code) => process.exit(code));
339
+ }
340
+ handleConnection(socket) {
341
+ // Hello first so the proxy can verify versions before piping any
342
+ // application bytes. The proxy reads exactly one line, then forwards.
343
+ const hello = {
344
+ bhgraph: version_1.BHGraphPackageVersion,
345
+ pid: process.pid,
346
+ socketPath: this.socketPath,
347
+ protocol: 1,
348
+ };
349
+ socket.write(JSON.stringify(hello) + '\n');
350
+ // Read the optional client-hello (proxy → daemon) to learn the client's
351
+ // peer pids, then hand the socket to the session. Fail-safe: any problem —
352
+ // timeout, a non-hello first line, an early close — yields null pids and we
353
+ // fall back to the socket-close lifecycle exactly as before (#692).
354
+ void readClientHello(socket).then((peers) => {
355
+ const transport = new transport_1.SocketTransport(socket);
356
+ const session = new session_1.MCPSession(transport, this.engine, {
357
+ explicitProjectPath: this.projectRoot,
358
+ });
359
+ transport.onClose(() => this.dropClient(session));
360
+ this.clients.add(session);
361
+ this.clientPeers.set(session, peers);
362
+ this.disarmIdleTimer();
363
+ session.start();
364
+ // Observe inbound bytes purely to feed the inactivity backstop — a second
365
+ // 'data' listener that reads nothing, added AFTER the transport's so the
366
+ // unshifted client-hello tail reaches the transport intact.
367
+ socket.on('data', () => { this.lastActivityAt = Date.now(); });
368
+ });
369
+ }
370
+ dropClient(session) {
371
+ if (!this.clients.delete(session))
372
+ return;
373
+ this.clientPeers.delete(session);
374
+ if (this.clients.size === 0)
375
+ this.armIdleTimer();
376
+ }
377
+ armIdleTimer() {
378
+ if (this.idleTimer || this.stopping)
379
+ return;
380
+ if (this.idleTimeoutMs <= 0)
381
+ return; // 0 = never idle-exit
382
+ this.idleTimer = setTimeout(() => {
383
+ this.idleTimer = null;
384
+ // Last-second sanity check: if a connection landed between the timer
385
+ // firing and now, don't exit. (setImmediate-ordering is the only way
386
+ // this races; cheap to defend against.)
387
+ if (this.clients.size > 0) {
388
+ this.armIdleTimer();
389
+ return;
390
+ }
391
+ void this.stop('idle timeout');
392
+ }, this.idleTimeoutMs);
393
+ // Don't keep the event loop alive just for this — the net.Server keeps the
394
+ // loop alive while listening, so the timer still fires; once we stop() the
395
+ // loop should drain naturally.
396
+ this.idleTimer.unref?.();
397
+ }
398
+ disarmIdleTimer() {
399
+ if (!this.idleTimer)
400
+ return;
401
+ clearTimeout(this.idleTimer);
402
+ this.idleTimer = null;
403
+ }
404
+ /**
405
+ * Defense-in-depth against a daemon that outlives its clients (#692), for the
406
+ * cases the refcount + idle timer miss because a socket close never arrives:
407
+ * - **Inactivity backstop:** after `maxIdleMs` with no inbound traffic, reap
408
+ * the daemon — but ONLY if no connected client can be proven alive (see
409
+ * {@link backstopShouldExit}). This is the sole phantom class the sweep
410
+ * below can't catch: a client whose client-hello never arrived, so we have
411
+ * no pid to check.
412
+ * - **Liveness sweep:** drop any client whose peer process has died (per the
413
+ * client-hello pids), which re-arms the idle timer once the last real
414
+ * client is gone. Catches a dead peer within one sweep instead of waiting
415
+ * out the whole backstop.
416
+ * Both timers are unref'd — the listening server keeps the loop alive, and
417
+ * neither should hold it open on its own.
418
+ */
419
+ startLivenessTimers() {
420
+ if (this.maxIdleMs > 0) {
421
+ const tick = Math.min(this.maxIdleMs, 60_000);
422
+ this.maxIdleTimer = setInterval(() => {
423
+ if (this.backstopShouldExit(isProcessAlive))
424
+ void this.stop('inactivity backstop');
425
+ }, tick);
426
+ this.maxIdleTimer.unref?.();
427
+ }
428
+ const sweepMs = resolveClientSweepMs();
429
+ if (sweepMs > 0) {
430
+ this.clientSweepTimer = setInterval(() => this.reapDeadClients(isProcessAlive), sweepMs);
431
+ this.clientSweepTimer.unref?.();
432
+ }
433
+ }
434
+ /**
435
+ * Decide whether the inactivity backstop should reap the daemon right now.
436
+ * Public + `isAlive`-injected for deterministic tests; the timer calls it each
437
+ * tick with the real liveness probe.
438
+ *
439
+ * The backstop exists ONLY to catch a **phantom** client (#692) — one counted
440
+ * but actually gone, whose socket-close was never delivered. It must never
441
+ * reap a **live-but-quiet** session (connected, alive peer, just not querying):
442
+ * doing so silently severed the shared daemon and degraded that session — and
443
+ * any others sharing it — to an in-process engine. `lastActivityAt` only tracks
444
+ * inbound query bytes, and MCP has no keepalive, so a genuinely-live session
445
+ * trips the raw inactivity window after ~30 min of not being queried.
446
+ *
447
+ * So: once the inactivity window elapses, drop provably-dead peers (the same
448
+ * check the periodic sweep runs), then reap the daemon only when NOT ONE
449
+ * remaining client can be proven alive — i.e. every client left is an
450
+ * unknown-pid connection the sweep can't verify. A single provably-alive
451
+ * client keeps the daemon up. Has the sweep's side effect (drops dead peers).
452
+ */
453
+ backstopShouldExit(isAlive) {
454
+ if (this.stopping || this.clients.size === 0)
455
+ return false; // idle timer owns the no-client case
456
+ if (Date.now() - this.lastActivityAt < this.maxIdleMs)
457
+ return false; // still within the window
458
+ this.reapDeadClients(isAlive);
459
+ if (this.clients.size === 0)
460
+ return false; // sweep cleared them — idle timer takes over
461
+ const anyProvablyAlive = [...this.clients].some((session) => {
462
+ const peers = this.clientPeers.get(session);
463
+ return peers != null && peers.pid !== null && !peerIsDead(peers, isAlive);
464
+ });
465
+ return !anyProvablyAlive;
466
+ }
467
+ /**
468
+ * Drop every connected client whose peer process is gone. Returns the count
469
+ * reaped. `isAlive` is injected for testing. Clients with unknown pids (no
470
+ * client-hello) are skipped — they rely on the socket-close path.
471
+ */
472
+ reapDeadClients(isAlive) {
473
+ if (this.clients.size === 0)
474
+ return 0;
475
+ let reaped = 0;
476
+ for (const session of [...this.clients]) {
477
+ const peers = this.clientPeers.get(session);
478
+ if (!peers || !peerIsDead(peers, isAlive))
479
+ continue;
480
+ process.stderr.write(`[BHGraph daemon] Reaping client with dead peer (pid ${peers.pid}); clients=${this.clients.size - 1}.\n`);
481
+ try {
482
+ session.stop();
483
+ }
484
+ catch { /* best-effort */ }
485
+ this.dropClient(session);
486
+ reaped++;
487
+ }
488
+ return reaped;
489
+ }
490
+ cleanupLockfile() {
491
+ try {
492
+ if (fs.existsSync(this.pidPath)) {
493
+ // Only remove if it still belongs to us — another daemon may have
494
+ // already taken over while we were shutting down (extremely rare).
495
+ const raw = fs.readFileSync(this.pidPath, 'utf8');
496
+ const info = (0, daemon_paths_1.decodeLockInfo)(raw);
497
+ if (info && info.pid === process.pid) {
498
+ fs.unlinkSync(this.pidPath);
499
+ }
500
+ }
501
+ }
502
+ catch { /* best-effort; we're exiting anyway */ }
503
+ }
504
+ }
505
+ exports.Daemon = Daemon;
506
+ /**
507
+ * Atomically create the daemon pidfile with its full record already in place.
508
+ * Returns either an `acquired` result (the caller is the daemon-elect and may
509
+ * construct a {@link Daemon}) or a `taken` result.
510
+ *
511
+ * must-fix 1 (issue #411 review): the lockfile must appear in ONE atomic step,
512
+ * already complete — never empty, even momentarily. The first attempt at this
513
+ * (`O_EXCL` create then a separate `writeSync`) left a microsecond window where
514
+ * the file existed but was empty; under concurrent daemon startup a third
515
+ * candidate could read that empty file, decode it as `null`, and `unlink` the
516
+ * winner's lock → two daemons (two watchers, two writers). The window was
517
+ * normally too small to hit, but the file watcher's extra startup time made
518
+ * concurrent daemons overlap enough to reproduce it reliably.
519
+ *
520
+ * The fix writes the complete record to a private temp file, then hard-links it
521
+ * into place: `link()` is atomic AND exclusive (EEXIST if the target exists), so
522
+ * the pidfile becomes visible in one step already containing a full record.
523
+ * Whoever links first wins; everyone else gets EEXIST and reads a complete file.
524
+ * There is no empty-file window at all.
525
+ *
526
+ * Filesystems without hard links (#997): ExFAT/FAT external volumes and some
527
+ * network mounts can't `link()` at all — it throws ENOTSUP/EPERM, which would
528
+ * otherwise kill the daemon before it ever reaches the socket bind. There we
529
+ * fall back to an O_EXCL create (`acquireLockViaExclusiveOpen`): still exclusive
530
+ * ("first writer wins"), but the full record is written through the fd in a
531
+ * second step, so the empty-file window the link approach removed is reopened —
532
+ * only on these filesystems, only for the microseconds between create and write
533
+ * (far narrower than the original bug, which the file watcher's startup latency
534
+ * widened). The race's worst case is two daemons briefly; on a single external
535
+ * drive that's strictly better than the daemon never starting at all.
536
+ */
537
+ function tryAcquireDaemonLock(projectRoot) {
538
+ const pidPath = (0, daemon_paths_1.getDaemonPidPath)(projectRoot);
539
+ // Make sure the .bhgraph/ directory exists — the daemon may be the first
540
+ // thing to touch it on a fresh-clone-but-already-initialized checkout.
541
+ fs.mkdirSync(path.dirname(pidPath), { recursive: true });
542
+ const info = {
543
+ pid: process.pid,
544
+ version: version_1.BHGraphPackageVersion,
545
+ socketPath: (0, daemon_paths_1.getDaemonSocketPath)(projectRoot),
546
+ startedAt: Date.now(),
547
+ };
548
+ // Temp name is pid-scoped so racing candidates never collide on it.
549
+ const tmp = `${pidPath}.${process.pid}.tmp`;
550
+ let acquired = false;
551
+ try {
552
+ fs.writeFileSync(tmp, (0, daemon_paths_1.encodeLockInfo)(info), { mode: 0o600 });
553
+ try {
554
+ fs.linkSync(tmp, pidPath); // atomic + exclusive (race-free; see must-fix 1)
555
+ acquired = true;
556
+ }
557
+ catch (err) {
558
+ if (err.code === 'EEXIST') {
559
+ // Lost the race — another candidate already holds it. Fall through to read.
560
+ }
561
+ else {
562
+ // link() failed for a non-conflict reason — nearly always "this filesystem
563
+ // has no hard links" (ExFAT/FAT external volumes, some network mounts),
564
+ // which surfaces as a DIFFERENT errno on every OS: ENOTSUP on macOS, EPERM
565
+ // on Linux, EISDIR on Windows (#997). Enumerating them is whack-a-mole and
566
+ // unnecessary: the `tmp` write above already proved this directory is
567
+ // writable, so an O_EXCL create is a valid atomic+exclusive substitute. If
568
+ // IT fails too, that's a genuine error and propagates. EEXIST ⇒ taken.
569
+ acquired = acquireLockViaExclusiveOpen(pidPath, info);
570
+ }
571
+ }
572
+ }
573
+ finally {
574
+ try {
575
+ fs.unlinkSync(tmp);
576
+ }
577
+ catch { /* temp already gone */ }
578
+ }
579
+ if (acquired)
580
+ return { kind: 'acquired', pidPath, info };
581
+ // Taken. Because the pidfile was link'd atomically it always holds a complete
582
+ // record — `existing` is null only for a genuinely corrupt leftover, never a
583
+ // mid-write race.
584
+ let existing = null;
585
+ try {
586
+ existing = (0, daemon_paths_1.decodeLockInfo)(fs.readFileSync(pidPath, 'utf8'));
587
+ }
588
+ catch { /* unreadable lockfile — treat as malformed */ }
589
+ return { kind: 'taken', existing, pidPath };
590
+ }
591
+ /**
592
+ * Exclusive-create the pidfile (O_CREAT|O_EXCL via the `wx` flag) and write the
593
+ * full record through the same fd — the hard-link-free fallback used by
594
+ * {@link tryAcquireDaemonLock} on filesystems without `link()`. Returns true if
595
+ * we created it (acquired the lock), false on EEXIST (another candidate holds
596
+ * it). Any other error propagates. Still exclusive, so "first writer wins" holds
597
+ * exactly as the link path does; the only difference is the brief empty-file
598
+ * window between create and write. Exported for testing.
599
+ */
600
+ function acquireLockViaExclusiveOpen(pidPath, info) {
601
+ let fd;
602
+ try {
603
+ fd = fs.openSync(pidPath, 'wx', 0o600); // O_CREAT | O_EXCL | O_WRONLY
604
+ }
605
+ catch (err) {
606
+ if (err.code === 'EEXIST')
607
+ return false;
608
+ throw err;
609
+ }
610
+ try {
611
+ fs.writeSync(fd, (0, daemon_paths_1.encodeLockInfo)(info));
612
+ }
613
+ finally {
614
+ fs.closeSync(fd);
615
+ }
616
+ return true;
617
+ }
618
+ /**
619
+ * Remove a stale pidfile, but only if it still names a dead process. Re-reads
620
+ * the file immediately before unlinking so we never delete a lock that a live
621
+ * daemon (re)acquired in the meantime.
622
+ *
623
+ * must-fix 1 (issue #411 review): the original unconditionally `unlink`'d,
624
+ * which let a racing candidate delete a healthy daemon's lock. Passing
625
+ * `expectedDeadPid` (the pid the caller believed was dead) makes the clear a
626
+ * compare-and-delete: bail if the file now holds a different pid, or any live
627
+ * pid. Returns true when the stale lock is gone (or was already gone).
628
+ */
629
+ function clearStaleDaemonLock(pidPath, expectedDeadPid) {
630
+ try {
631
+ const raw = fs.readFileSync(pidPath, 'utf8');
632
+ const info = (0, daemon_paths_1.decodeLockInfo)(raw);
633
+ if (info) {
634
+ // A different pid took over since we read it — not ours to clear.
635
+ if (expectedDeadPid !== undefined && info.pid !== expectedDeadPid)
636
+ return false;
637
+ // Holder is actually alive — never clear a live daemon's lock.
638
+ if (info.pid > 0 && isProcessAlive(info.pid))
639
+ return false;
640
+ }
641
+ fs.unlinkSync(pidPath);
642
+ return true;
643
+ }
644
+ catch (err) {
645
+ const e = err;
646
+ if (e.code === 'ENOENT')
647
+ return true; // already gone
648
+ return false;
649
+ }
650
+ }
651
+ /**
652
+ * Probe whether `pid` is currently alive (signal-0). Treats EPERM as alive on
653
+ * every platform (the process exists, it's just not ours to signal) so we never
654
+ * mistake a live daemon for a dead one and clear its lock.
655
+ */
656
+ function isProcessAlive(pid) {
657
+ try {
658
+ process.kill(pid, 0);
659
+ return true;
660
+ }
661
+ catch (err) {
662
+ const e = err;
663
+ if (e.code === 'EPERM')
664
+ return true; // exists, just not ours to signal
665
+ return false;
666
+ }
667
+ }
668
+ /**
669
+ * The one `listen()` error we must NOT relocate past. EADDRINUSE means the path
670
+ * is genuinely occupied — a racing daemon that legitimately owns it, or a
671
+ * leftover node we couldn't clear (the #974 planted-dir case) — so relocating
672
+ * would abandon a path another daemon owns; the caller instead releases its lock
673
+ * and falls back to direct mode. EVERY OTHER bind error just means "this path
674
+ * didn't work," almost always a filesystem that can't host an AF_UNIX node at all
675
+ * (ExFAT/FAT, network mounts, WSL2 DrvFs), which reports a DIFFERENT errno per OS
676
+ * (ENOTSUP macOS, EPERM Linux; #997). Enumerating the "unsupported" codes is
677
+ * whack-a-mole, so we relocate on anything-but-conflict instead — robust and
678
+ * self-correcting: if the deterministic tmpdir fallback ALSO fails, that error
679
+ * propagates from the last candidate. (ENAMETOOLONG never reaches here — the
680
+ * candidate list already routes over-long paths straight to tmpdir.)
681
+ */
682
+ const SOCKET_BIND_CONFLICT_CODE = 'EADDRINUSE';
683
+ /**
684
+ * Bind the first usable socket from an ordered candidate list, relocating past
685
+ * any path that fails to bind for a non-conflict reason (see {@link
686
+ * SOCKET_BIND_CONFLICT_CODE}). The injected `listen` does the real
687
+ * `net.Server.listen` (and stale-socket clear); abstracted so the relocation
688
+ * policy is unit-testable without a real unsupported filesystem. Returns the
689
+ * server plus the path actually bound. An EADDRINUSE, or any error on the LAST
690
+ * candidate, propagates — the caller releases the lockfile and falls back to
691
+ * direct mode (#974). Exported for testing.
692
+ */
693
+ async function bindFirstUsableSocket(candidates, listen, opts = {}) {
694
+ let lastErr;
695
+ for (let i = 0; i < candidates.length; i++) {
696
+ const socketPath = candidates[i]; // i < length, so always defined
697
+ const isLast = i === candidates.length - 1;
698
+ try {
699
+ const server = await listen(socketPath);
700
+ return { server, socketPath };
701
+ }
702
+ catch (err) {
703
+ lastErr = err;
704
+ const code = err.code;
705
+ if (!isLast && code !== SOCKET_BIND_CONFLICT_CODE) {
706
+ opts.onRelocate?.(socketPath, candidates[i + 1], code ?? ''); // !isLast ⇒ i+1 in range
707
+ continue;
708
+ }
709
+ throw err;
710
+ }
711
+ }
712
+ // Only reachable with an empty candidate list — a programmer error.
713
+ throw lastErr ?? new Error('no socket candidates to bind');
714
+ }
715
+ function resolveIdleTimeoutMs() {
716
+ const raw = process.env.BHGRAPH_DAEMON_IDLE_TIMEOUT_MS;
717
+ if (raw === undefined || raw === '')
718
+ return DEFAULT_IDLE_TIMEOUT_MS;
719
+ const parsed = Number(raw);
720
+ if (!Number.isFinite(parsed) || parsed < 0)
721
+ return DEFAULT_IDLE_TIMEOUT_MS;
722
+ return Math.floor(parsed);
723
+ }
724
+ function resolveMaxIdleMs() {
725
+ const raw = process.env.BHGRAPH_DAEMON_MAX_IDLE_MS;
726
+ if (raw === undefined || raw === '')
727
+ return DEFAULT_MAX_IDLE_MS;
728
+ const parsed = Number(raw);
729
+ if (!Number.isFinite(parsed) || parsed < 0)
730
+ return DEFAULT_MAX_IDLE_MS;
731
+ return Math.floor(parsed); // 0 disables the backstop
732
+ }
733
+ function resolveClientSweepMs() {
734
+ const raw = process.env.BHGRAPH_DAEMON_CLIENT_SWEEP_MS;
735
+ if (raw === undefined || raw === '')
736
+ return DEFAULT_CLIENT_SWEEP_MS;
737
+ const parsed = Number(raw);
738
+ if (!Number.isFinite(parsed) || parsed < 0)
739
+ return DEFAULT_CLIENT_SWEEP_MS;
740
+ return Math.floor(parsed); // 0 disables the sweep
741
+ }
742
+ /**
743
+ * Parse one client-hello line. Returns the peer pids if `line` is a well-formed
744
+ * client-hello (carries the `bhgraph_client` marker), or null otherwise — in
745
+ * which case the caller treats the bytes as ordinary JSON-RPC.
746
+ */
747
+ function parseClientHelloLine(line) {
748
+ let parsed;
749
+ try {
750
+ parsed = JSON.parse(line);
751
+ }
752
+ catch {
753
+ return null;
754
+ }
755
+ if (!parsed || typeof parsed !== 'object')
756
+ return null;
757
+ const o = parsed;
758
+ if (o.bhgraph_client !== 1 || typeof o.pid !== 'number')
759
+ return null;
760
+ return { pid: o.pid, hostPid: typeof o.hostPid === 'number' ? o.hostPid : null };
761
+ }
762
+ /**
763
+ * A client's peer is dead when its proxy process is gone, or when its known
764
+ * host process is gone. Unknown pid (no client-hello) is never "dead" on this
765
+ * basis — those clients rely on the socket-close path. Exported for testing.
766
+ */
767
+ function peerIsDead(peers, isAlive) {
768
+ if (peers.pid === null)
769
+ return false;
770
+ if (!isAlive(peers.pid))
771
+ return true;
772
+ if (peers.hostPid !== null && !isAlive(peers.hostPid))
773
+ return true;
774
+ return false;
775
+ }
776
+ /**
777
+ * Read the optional client-hello line a proxy sends after the daemon hello.
778
+ * Always resolves (never rejects) — fail-safe by design, since every connection
779
+ * funnels through here. Resolves with the peer pids when the first line is a
780
+ * client-hello; otherwise resolves with null pids and unshifts the already-read
781
+ * bytes so the transport parses them as the client's first JSON-RPC message(s).
782
+ * Accumulates as Buffers and splits on the newline byte so a UTF-8 sequence
783
+ * straddling a chunk boundary in the unshifted tail is never corrupted.
784
+ */
785
+ function readClientHello(socket) {
786
+ return new Promise((resolve) => {
787
+ let chunks = [];
788
+ let total = 0;
789
+ let settled = false;
790
+ const finish = (peers, putBack) => {
791
+ if (settled)
792
+ return;
793
+ settled = true;
794
+ socket.removeListener('data', onData);
795
+ socket.removeListener('error', onEnd);
796
+ socket.removeListener('close', onEnd);
797
+ clearTimeout(timer);
798
+ if (putBack && putBack.length > 0 && !socket.destroyed) {
799
+ try {
800
+ socket.unshift(putBack);
801
+ }
802
+ catch { /* stream already gone */ }
803
+ }
804
+ resolve(peers);
805
+ };
806
+ const onData = (chunk) => {
807
+ const buf = typeof chunk === 'string' ? Buffer.from(chunk, 'utf8') : chunk;
808
+ chunks.push(buf);
809
+ total += buf.length;
810
+ const all = chunks.length === 1 ? buf : Buffer.concat(chunks, total);
811
+ const nl = all.indexOf(0x0a); // '\n'
812
+ if (nl === -1) {
813
+ // No newline yet. If it's already too long to be a hello, it isn't one —
814
+ // hand the bytes back as data; otherwise keep accumulating.
815
+ if (total > MAX_HELLO_LINE_BYTES)
816
+ finish({ pid: null, hostPid: null }, all);
817
+ else
818
+ chunks = [all];
819
+ return;
820
+ }
821
+ const peers = parseClientHelloLine(all.subarray(0, nl).toString('utf8'));
822
+ if (peers) {
823
+ const tail = all.subarray(nl + 1);
824
+ finish(peers, tail.length > 0 ? tail : undefined);
825
+ }
826
+ else {
827
+ // First line is not a client-hello (legacy/direct client) — hand the
828
+ // whole buffer back so the transport sees the message verbatim.
829
+ finish({ pid: null, hostPid: null }, all);
830
+ }
831
+ };
832
+ const onEnd = () => finish({ pid: null, hostPid: null });
833
+ const timer = setTimeout(() => finish({ pid: null, hostPid: null }), CLIENT_HELLO_TIMEOUT_MS);
834
+ timer.unref?.();
835
+ socket.on('data', onData);
836
+ socket.on('error', onEnd);
837
+ socket.on('close', onEnd);
838
+ });
839
+ }
840
+ //# sourceMappingURL=daemon.js.map