homegraph 1.5.6 → 1.5.8

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/CHANGELOG.md +53 -0
  2. package/README.md +12 -6
  3. package/dist/bin/homegraph.js +16 -14
  4. package/dist/context/index.js +120 -15
  5. package/dist/db/index.d.ts +1 -1
  6. package/dist/db/index.js +11 -25
  7. package/dist/db/queries.d.ts +5 -1
  8. package/dist/db/queries.js +31 -2
  9. package/dist/db/sqlite-adapter.d.ts +6 -12
  10. package/dist/db/sqlite-adapter.js +13 -41
  11. package/dist/directory.d.ts +1 -1
  12. package/dist/directory.js +25 -1
  13. package/dist/extraction/grammars.d.ts +2 -0
  14. package/dist/extraction/grammars.js +7 -7
  15. package/dist/extraction/languages/arkts.d.ts +25 -3
  16. package/dist/extraction/languages/arkts.js +184 -22
  17. package/dist/graph/evidence-paths.d.ts +63 -0
  18. package/dist/graph/evidence-paths.js +245 -0
  19. package/dist/index.d.ts +6 -1
  20. package/dist/index.js +55 -17
  21. package/dist/mcp/arkts-evidence-packs.d.ts +67 -0
  22. package/dist/mcp/arkts-evidence-packs.js +352 -0
  23. package/dist/mcp/daemon.js +1 -1
  24. package/dist/mcp/engine.d.ts +20 -7
  25. package/dist/mcp/engine.js +113 -106
  26. package/dist/mcp/evidence-rendering.d.ts +10 -0
  27. package/dist/mcp/evidence-rendering.js +71 -0
  28. package/dist/mcp/explore-repeat-guard.d.ts +8 -13
  29. package/dist/mcp/explore-repeat-guard.js +54 -114
  30. package/dist/mcp/explore-session-state.d.ts +26 -4
  31. package/dist/mcp/explore-session-state.js +50 -4
  32. package/dist/mcp/index-availability.d.ts +23 -0
  33. package/dist/mcp/index-availability.js +78 -0
  34. package/dist/mcp/index.js +5 -4
  35. package/dist/mcp/query-cache.d.ts +1 -1
  36. package/dist/mcp/query-cache.js +90 -3
  37. package/dist/mcp/query-worker.d.ts +1 -1
  38. package/dist/mcp/query-worker.js +1 -1
  39. package/dist/mcp/server-instructions.d.ts +4 -9
  40. package/dist/mcp/server-instructions.js +34 -61
  41. package/dist/mcp/session.js +12 -4
  42. package/dist/mcp/source-slice-identity.d.ts +3 -0
  43. package/dist/mcp/source-slice-identity.js +11 -0
  44. package/dist/mcp/tools.d.ts +43 -9
  45. package/dist/mcp/tools.js +859 -155
  46. package/dist/search/literal-evidence.d.ts +44 -0
  47. package/dist/search/literal-evidence.js +278 -0
  48. package/dist/search/query-plan-provider.d.ts +6 -0
  49. package/dist/search/query-plan-provider.js +289 -0
  50. package/dist/search/query-plan.d.ts +98 -0
  51. package/dist/search/query-plan.js +334 -0
  52. package/dist/search/query-utils.d.ts +6 -1
  53. package/dist/search/query-utils.js +64 -5
  54. package/dist/spec/llm/client.js +3 -15
  55. package/dist/spec/llm/openai-sdk.d.ts +14 -0
  56. package/dist/spec/llm/openai-sdk.js +37 -0
  57. package/dist/spec/llm/retry.js +8 -9
  58. package/dist/types.d.ts +17 -0
  59. package/dist/utils.d.ts +5 -0
  60. package/dist/utils.js +24 -0
  61. package/package.json +3 -5
  62. package/dist/addons/dynamic-import.d.ts.map +0 -1
  63. package/dist/addons/dynamic-import.js.map +0 -1
  64. package/dist/addons/init-template.d.ts.map +0 -1
  65. package/dist/addons/init-template.js.map +0 -1
  66. package/dist/addons/loader.d.ts.map +0 -1
  67. package/dist/addons/loader.js.map +0 -1
  68. package/dist/addons/manager.d.ts.map +0 -1
  69. package/dist/addons/manager.js.map +0 -1
  70. package/dist/addons/paths.d.ts.map +0 -1
  71. package/dist/addons/paths.js.map +0 -1
  72. package/dist/addons/registry.d.ts.map +0 -1
  73. package/dist/addons/registry.js.map +0 -1
  74. package/dist/addons/semver.d.ts.map +0 -1
  75. package/dist/addons/semver.js.map +0 -1
  76. package/dist/addons/types.d.ts.map +0 -1
  77. package/dist/addons/types.js.map +0 -1
  78. package/dist/addons/validate.d.ts.map +0 -1
  79. package/dist/addons/validate.js.map +0 -1
  80. package/dist/arkui/index.d.ts.map +0 -1
  81. package/dist/arkui/index.js.map +0 -1
  82. package/dist/arkui/migrate-passage.d.ts.map +0 -1
  83. package/dist/arkui/migrate-passage.js.map +0 -1
  84. package/dist/arkui/migrate-semantics.d.ts.map +0 -1
  85. package/dist/arkui/migrate-semantics.js.map +0 -1
  86. package/dist/arkui/migrate-snapshot.d.ts.map +0 -1
  87. package/dist/arkui/migrate-snapshot.js.map +0 -1
  88. package/dist/bin/addon-commands.d.ts.map +0 -1
  89. package/dist/bin/addon-commands.js.map +0 -1
  90. package/dist/bin/command-supervision.d.ts.map +0 -1
  91. package/dist/bin/command-supervision.js.map +0 -1
  92. package/dist/bin/fatal-handler.d.ts.map +0 -1
  93. package/dist/bin/fatal-handler.js.map +0 -1
  94. package/dist/bin/homegraph.d.ts.map +0 -1
  95. package/dist/bin/homegraph.js.map +0 -1
  96. package/dist/bin/node-version-check.d.ts.map +0 -1
  97. package/dist/bin/node-version-check.js.map +0 -1
  98. package/dist/bin/uninstall.d.ts.map +0 -1
  99. package/dist/bin/uninstall.js.map +0 -1
  100. package/dist/context/formatter.d.ts.map +0 -1
  101. package/dist/context/formatter.js.map +0 -1
  102. package/dist/context/index.d.ts.map +0 -1
  103. package/dist/context/index.js.map +0 -1
  104. package/dist/context/markers.d.ts.map +0 -1
  105. package/dist/context/markers.js.map +0 -1
  106. package/dist/db/index.d.ts.map +0 -1
  107. package/dist/db/index.js.map +0 -1
  108. package/dist/db/migrations.d.ts.map +0 -1
  109. package/dist/db/migrations.js.map +0 -1
  110. package/dist/db/queries.d.ts.map +0 -1
  111. package/dist/db/queries.js.map +0 -1
  112. package/dist/db/sqlite-adapter.d.ts.map +0 -1
  113. package/dist/db/sqlite-adapter.js.map +0 -1
  114. package/dist/db/wal-valve.d.ts.map +0 -1
  115. package/dist/db/wal-valve.js.map +0 -1
  116. package/dist/directory.d.ts.map +0 -1
  117. package/dist/directory.js.map +0 -1
  118. package/dist/errors.d.ts.map +0 -1
  119. package/dist/errors.js.map +0 -1
  120. package/dist/extraction/arkts-batch-worker.d.ts.map +0 -1
  121. package/dist/extraction/arkts-batch-worker.js.map +0 -1
  122. package/dist/extraction/astro-extractor.d.ts.map +0 -1
  123. package/dist/extraction/astro-extractor.js.map +0 -1
  124. package/dist/extraction/cfml-extractor.d.ts.map +0 -1
  125. package/dist/extraction/cfml-extractor.js.map +0 -1
  126. package/dist/extraction/context.d.ts.map +0 -1
  127. package/dist/extraction/context.js.map +0 -1
  128. package/dist/extraction/default-ignore.d.ts.map +0 -1
  129. package/dist/extraction/default-ignore.js.map +0 -1
  130. package/dist/extraction/dfm-extractor.d.ts.map +0 -1
  131. package/dist/extraction/dfm-extractor.js.map +0 -1
  132. package/dist/extraction/extraction-version.d.ts.map +0 -1
  133. package/dist/extraction/extraction-version.js.map +0 -1
  134. package/dist/extraction/function-ref.d.ts.map +0 -1
  135. package/dist/extraction/function-ref.js.map +0 -1
  136. package/dist/extraction/generated-detection.d.ts.map +0 -1
  137. package/dist/extraction/generated-detection.js.map +0 -1
  138. package/dist/extraction/grammars.d.ts.map +0 -1
  139. package/dist/extraction/grammars.js.map +0 -1
  140. package/dist/extraction/index.d.ts.map +0 -1
  141. package/dist/extraction/index.js.map +0 -1
  142. package/dist/extraction/languages/arkts.d.ts.map +0 -1
  143. package/dist/extraction/languages/arkts.js.map +0 -1
  144. package/dist/extraction/languages/c-cpp.d.ts.map +0 -1
  145. package/dist/extraction/languages/c-cpp.js.map +0 -1
  146. package/dist/extraction/languages/cfquery.d.ts.map +0 -1
  147. package/dist/extraction/languages/cfquery.js.map +0 -1
  148. package/dist/extraction/languages/cfscript.d.ts.map +0 -1
  149. package/dist/extraction/languages/cfscript.js.map +0 -1
  150. package/dist/extraction/languages/cobol.d.ts.map +0 -1
  151. package/dist/extraction/languages/cobol.js.map +0 -1
  152. package/dist/extraction/languages/csharp.d.ts.map +0 -1
  153. package/dist/extraction/languages/csharp.js.map +0 -1
  154. package/dist/extraction/languages/dart.d.ts.map +0 -1
  155. package/dist/extraction/languages/dart.js.map +0 -1
  156. package/dist/extraction/languages/erlang.d.ts.map +0 -1
  157. package/dist/extraction/languages/erlang.js.map +0 -1
  158. package/dist/extraction/languages/go.d.ts.map +0 -1
  159. package/dist/extraction/languages/go.js.map +0 -1
  160. package/dist/extraction/languages/index.d.ts.map +0 -1
  161. package/dist/extraction/languages/index.js.map +0 -1
  162. package/dist/extraction/languages/java.d.ts.map +0 -1
  163. package/dist/extraction/languages/java.js.map +0 -1
  164. package/dist/extraction/languages/javascript.d.ts.map +0 -1
  165. package/dist/extraction/languages/javascript.js.map +0 -1
  166. package/dist/extraction/languages/kotlin.d.ts.map +0 -1
  167. package/dist/extraction/languages/kotlin.js.map +0 -1
  168. package/dist/extraction/languages/lua.d.ts.map +0 -1
  169. package/dist/extraction/languages/lua.js.map +0 -1
  170. package/dist/extraction/languages/luau.d.ts.map +0 -1
  171. package/dist/extraction/languages/luau.js.map +0 -1
  172. package/dist/extraction/languages/nix.d.ts.map +0 -1
  173. package/dist/extraction/languages/nix.js.map +0 -1
  174. package/dist/extraction/languages/objc.d.ts.map +0 -1
  175. package/dist/extraction/languages/objc.js.map +0 -1
  176. package/dist/extraction/languages/pascal.d.ts.map +0 -1
  177. package/dist/extraction/languages/pascal.js.map +0 -1
  178. package/dist/extraction/languages/php.d.ts.map +0 -1
  179. package/dist/extraction/languages/php.js.map +0 -1
  180. package/dist/extraction/languages/python.d.ts.map +0 -1
  181. package/dist/extraction/languages/python.js.map +0 -1
  182. package/dist/extraction/languages/r.d.ts.map +0 -1
  183. package/dist/extraction/languages/r.js.map +0 -1
  184. package/dist/extraction/languages/ruby.d.ts.map +0 -1
  185. package/dist/extraction/languages/ruby.js.map +0 -1
  186. package/dist/extraction/languages/rust.d.ts.map +0 -1
  187. package/dist/extraction/languages/rust.js.map +0 -1
  188. package/dist/extraction/languages/scala.d.ts.map +0 -1
  189. package/dist/extraction/languages/scala.js.map +0 -1
  190. package/dist/extraction/languages/solidity.d.ts.map +0 -1
  191. package/dist/extraction/languages/solidity.js.map +0 -1
  192. package/dist/extraction/languages/swift.d.ts.map +0 -1
  193. package/dist/extraction/languages/swift.js.map +0 -1
  194. package/dist/extraction/languages/terraform.d.ts.map +0 -1
  195. package/dist/extraction/languages/terraform.js.map +0 -1
  196. package/dist/extraction/languages/typescript.d.ts.map +0 -1
  197. package/dist/extraction/languages/typescript.js.map +0 -1
  198. package/dist/extraction/languages/vbnet.d.ts.map +0 -1
  199. package/dist/extraction/languages/vbnet.js.map +0 -1
  200. package/dist/extraction/liquid-extractor.d.ts.map +0 -1
  201. package/dist/extraction/liquid-extractor.js.map +0 -1
  202. package/dist/extraction/mybatis-extractor.d.ts.map +0 -1
  203. package/dist/extraction/mybatis-extractor.js.map +0 -1
  204. package/dist/extraction/parse-pool.d.ts.map +0 -1
  205. package/dist/extraction/parse-pool.js.map +0 -1
  206. package/dist/extraction/parse-worker.d.ts.map +0 -1
  207. package/dist/extraction/parse-worker.js.map +0 -1
  208. package/dist/extraction/razor-extractor.d.ts.map +0 -1
  209. package/dist/extraction/razor-extractor.js.map +0 -1
  210. package/dist/extraction/store-worker.d.ts.map +0 -1
  211. package/dist/extraction/store-worker.js.map +0 -1
  212. package/dist/extraction/store-writer.d.ts.map +0 -1
  213. package/dist/extraction/store-writer.js.map +0 -1
  214. package/dist/extraction/svelte-extractor.d.ts.map +0 -1
  215. package/dist/extraction/svelte-extractor.js.map +0 -1
  216. package/dist/extraction/tree-sitter-helpers.d.ts.map +0 -1
  217. package/dist/extraction/tree-sitter-helpers.js.map +0 -1
  218. package/dist/extraction/tree-sitter-types.d.ts.map +0 -1
  219. package/dist/extraction/tree-sitter-types.js.map +0 -1
  220. package/dist/extraction/tree-sitter.d.ts.map +0 -1
  221. package/dist/extraction/tree-sitter.js.map +0 -1
  222. package/dist/extraction/vue-extractor.d.ts.map +0 -1
  223. package/dist/extraction/vue-extractor.js.map +0 -1
  224. package/dist/extraction/wasm/tree-sitter-arkts.wasm +0 -0
  225. package/dist/extraction/wasm-runtime-flags.d.ts.map +0 -1
  226. package/dist/extraction/wasm-runtime-flags.js.map +0 -1
  227. package/dist/graph/index.d.ts.map +0 -1
  228. package/dist/graph/index.js.map +0 -1
  229. package/dist/graph/queries.d.ts.map +0 -1
  230. package/dist/graph/queries.js.map +0 -1
  231. package/dist/graph/traversal.d.ts.map +0 -1
  232. package/dist/graph/traversal.js.map +0 -1
  233. package/dist/graph-sources.d.ts.map +0 -1
  234. package/dist/graph-sources.js.map +0 -1
  235. package/dist/index.d.ts.map +0 -1
  236. package/dist/index.js.map +0 -1
  237. package/dist/installer/config-writer.d.ts.map +0 -1
  238. package/dist/installer/config-writer.js.map +0 -1
  239. package/dist/installer/index.d.ts.map +0 -1
  240. package/dist/installer/index.js.map +0 -1
  241. package/dist/installer/instructions-template.d.ts.map +0 -1
  242. package/dist/installer/instructions-template.js.map +0 -1
  243. package/dist/installer/targets/antigravity.d.ts.map +0 -1
  244. package/dist/installer/targets/antigravity.js.map +0 -1
  245. package/dist/installer/targets/claude.d.ts.map +0 -1
  246. package/dist/installer/targets/claude.js.map +0 -1
  247. package/dist/installer/targets/codebuddy.d.ts.map +0 -1
  248. package/dist/installer/targets/codebuddy.js.map +0 -1
  249. package/dist/installer/targets/codex.d.ts.map +0 -1
  250. package/dist/installer/targets/codex.js.map +0 -1
  251. package/dist/installer/targets/cursor.d.ts.map +0 -1
  252. package/dist/installer/targets/cursor.js.map +0 -1
  253. package/dist/installer/targets/deveco.d.ts.map +0 -1
  254. package/dist/installer/targets/deveco.js.map +0 -1
  255. package/dist/installer/targets/gemini.d.ts.map +0 -1
  256. package/dist/installer/targets/gemini.js.map +0 -1
  257. package/dist/installer/targets/hermes.d.ts.map +0 -1
  258. package/dist/installer/targets/hermes.js.map +0 -1
  259. package/dist/installer/targets/kiro.d.ts.map +0 -1
  260. package/dist/installer/targets/kiro.js.map +0 -1
  261. package/dist/installer/targets/opencode.d.ts.map +0 -1
  262. package/dist/installer/targets/opencode.js.map +0 -1
  263. package/dist/installer/targets/registry.d.ts.map +0 -1
  264. package/dist/installer/targets/registry.js.map +0 -1
  265. package/dist/installer/targets/shared.d.ts.map +0 -1
  266. package/dist/installer/targets/shared.js.map +0 -1
  267. package/dist/installer/targets/toml.d.ts.map +0 -1
  268. package/dist/installer/targets/toml.js.map +0 -1
  269. package/dist/installer/targets/types.d.ts.map +0 -1
  270. package/dist/installer/targets/types.js.map +0 -1
  271. package/dist/mcp/daemon-manager.d.ts.map +0 -1
  272. package/dist/mcp/daemon-manager.js.map +0 -1
  273. package/dist/mcp/daemon-paths.d.ts.map +0 -1
  274. package/dist/mcp/daemon-paths.js.map +0 -1
  275. package/dist/mcp/daemon-registry.d.ts.map +0 -1
  276. package/dist/mcp/daemon-registry.js.map +0 -1
  277. package/dist/mcp/daemon.d.ts.map +0 -1
  278. package/dist/mcp/daemon.js.map +0 -1
  279. package/dist/mcp/diff-impact.d.ts.map +0 -1
  280. package/dist/mcp/diff-impact.js.map +0 -1
  281. package/dist/mcp/dynamic-boundaries.d.ts.map +0 -1
  282. package/dist/mcp/dynamic-boundaries.js.map +0 -1
  283. package/dist/mcp/early-ppid.d.ts.map +0 -1
  284. package/dist/mcp/early-ppid.js.map +0 -1
  285. package/dist/mcp/engine.d.ts.map +0 -1
  286. package/dist/mcp/engine.js.map +0 -1
  287. package/dist/mcp/explore-dedup.d.ts.map +0 -1
  288. package/dist/mcp/explore-dedup.js.map +0 -1
  289. package/dist/mcp/explore-repeat-guard.d.ts.map +0 -1
  290. package/dist/mcp/explore-repeat-guard.js.map +0 -1
  291. package/dist/mcp/explore-session-state.d.ts.map +0 -1
  292. package/dist/mcp/explore-session-state.js.map +0 -1
  293. package/dist/mcp/index.d.ts.map +0 -1
  294. package/dist/mcp/index.js.map +0 -1
  295. package/dist/mcp/liveness-watchdog.d.ts.map +0 -1
  296. package/dist/mcp/liveness-watchdog.js.map +0 -1
  297. package/dist/mcp/memory-budget.d.ts.map +0 -1
  298. package/dist/mcp/memory-budget.js.map +0 -1
  299. package/dist/mcp/ppid-watchdog.d.ts.map +0 -1
  300. package/dist/mcp/ppid-watchdog.js.map +0 -1
  301. package/dist/mcp/proxy.d.ts.map +0 -1
  302. package/dist/mcp/proxy.js.map +0 -1
  303. package/dist/mcp/query-cache.d.ts.map +0 -1
  304. package/dist/mcp/query-cache.js.map +0 -1
  305. package/dist/mcp/query-pool.d.ts.map +0 -1
  306. package/dist/mcp/query-pool.js.map +0 -1
  307. package/dist/mcp/query-worker.d.ts.map +0 -1
  308. package/dist/mcp/query-worker.js.map +0 -1
  309. package/dist/mcp/server-instructions.d.ts.map +0 -1
  310. package/dist/mcp/server-instructions.js.map +0 -1
  311. package/dist/mcp/session.d.ts.map +0 -1
  312. package/dist/mcp/session.js.map +0 -1
  313. package/dist/mcp/startup-handshake.d.ts.map +0 -1
  314. package/dist/mcp/startup-handshake.js.map +0 -1
  315. package/dist/mcp/stdin-teardown.d.ts.map +0 -1
  316. package/dist/mcp/stdin-teardown.js.map +0 -1
  317. package/dist/mcp/tools.d.ts.map +0 -1
  318. package/dist/mcp/tools.js.map +0 -1
  319. package/dist/mcp/transport.d.ts.map +0 -1
  320. package/dist/mcp/transport.js.map +0 -1
  321. package/dist/mcp/version.d.ts.map +0 -1
  322. package/dist/mcp/version.js.map +0 -1
  323. package/dist/project-config.d.ts.map +0 -1
  324. package/dist/project-config.js.map +0 -1
  325. package/dist/project-map/index.d.ts.map +0 -1
  326. package/dist/project-map/index.js.map +0 -1
  327. package/dist/resolution/c-fnptr-synthesizer.d.ts.map +0 -1
  328. package/dist/resolution/c-fnptr-synthesizer.js.map +0 -1
  329. package/dist/resolution/callback-synthesizer.d.ts.map +0 -1
  330. package/dist/resolution/callback-synthesizer.js.map +0 -1
  331. package/dist/resolution/cooperative-yield.d.ts.map +0 -1
  332. package/dist/resolution/cooperative-yield.js.map +0 -1
  333. package/dist/resolution/frameworks/arkts-entry.d.ts.map +0 -1
  334. package/dist/resolution/frameworks/arkts-entry.js.map +0 -1
  335. package/dist/resolution/frameworks/arkts-napi.d.ts.map +0 -1
  336. package/dist/resolution/frameworks/arkts-napi.js.map +0 -1
  337. package/dist/resolution/frameworks/astro.d.ts.map +0 -1
  338. package/dist/resolution/frameworks/astro.js.map +0 -1
  339. package/dist/resolution/frameworks/cargo-workspace.d.ts.map +0 -1
  340. package/dist/resolution/frameworks/cargo-workspace.js.map +0 -1
  341. package/dist/resolution/frameworks/cics.d.ts.map +0 -1
  342. package/dist/resolution/frameworks/cics.js.map +0 -1
  343. package/dist/resolution/frameworks/csharp.d.ts.map +0 -1
  344. package/dist/resolution/frameworks/csharp.js.map +0 -1
  345. package/dist/resolution/frameworks/drupal.d.ts.map +0 -1
  346. package/dist/resolution/frameworks/drupal.js.map +0 -1
  347. package/dist/resolution/frameworks/expo-modules.d.ts.map +0 -1
  348. package/dist/resolution/frameworks/expo-modules.js.map +0 -1
  349. package/dist/resolution/frameworks/express.d.ts.map +0 -1
  350. package/dist/resolution/frameworks/express.js.map +0 -1
  351. package/dist/resolution/frameworks/fabric.d.ts.map +0 -1
  352. package/dist/resolution/frameworks/fabric.js.map +0 -1
  353. package/dist/resolution/frameworks/go.d.ts.map +0 -1
  354. package/dist/resolution/frameworks/go.js.map +0 -1
  355. package/dist/resolution/frameworks/goframe.d.ts.map +0 -1
  356. package/dist/resolution/frameworks/goframe.js.map +0 -1
  357. package/dist/resolution/frameworks/index.d.ts.map +0 -1
  358. package/dist/resolution/frameworks/index.js.map +0 -1
  359. package/dist/resolution/frameworks/java.d.ts.map +0 -1
  360. package/dist/resolution/frameworks/java.js.map +0 -1
  361. package/dist/resolution/frameworks/laravel.d.ts.map +0 -1
  362. package/dist/resolution/frameworks/laravel.js.map +0 -1
  363. package/dist/resolution/frameworks/nestjs.d.ts.map +0 -1
  364. package/dist/resolution/frameworks/nestjs.js.map +0 -1
  365. package/dist/resolution/frameworks/play.d.ts.map +0 -1
  366. package/dist/resolution/frameworks/play.js.map +0 -1
  367. package/dist/resolution/frameworks/python.d.ts.map +0 -1
  368. package/dist/resolution/frameworks/python.js.map +0 -1
  369. package/dist/resolution/frameworks/react-native.d.ts.map +0 -1
  370. package/dist/resolution/frameworks/react-native.js.map +0 -1
  371. package/dist/resolution/frameworks/react.d.ts.map +0 -1
  372. package/dist/resolution/frameworks/react.js.map +0 -1
  373. package/dist/resolution/frameworks/ruby.d.ts.map +0 -1
  374. package/dist/resolution/frameworks/ruby.js.map +0 -1
  375. package/dist/resolution/frameworks/rust.d.ts.map +0 -1
  376. package/dist/resolution/frameworks/rust.js.map +0 -1
  377. package/dist/resolution/frameworks/svelte.d.ts.map +0 -1
  378. package/dist/resolution/frameworks/svelte.js.map +0 -1
  379. package/dist/resolution/frameworks/swift-objc.d.ts.map +0 -1
  380. package/dist/resolution/frameworks/swift-objc.js.map +0 -1
  381. package/dist/resolution/frameworks/swift.d.ts.map +0 -1
  382. package/dist/resolution/frameworks/swift.js.map +0 -1
  383. package/dist/resolution/frameworks/terraform.d.ts.map +0 -1
  384. package/dist/resolution/frameworks/terraform.js.map +0 -1
  385. package/dist/resolution/frameworks/vue.d.ts.map +0 -1
  386. package/dist/resolution/frameworks/vue.js.map +0 -1
  387. package/dist/resolution/go-module.d.ts.map +0 -1
  388. package/dist/resolution/go-module.js.map +0 -1
  389. package/dist/resolution/goframe-synthesizer.d.ts.map +0 -1
  390. package/dist/resolution/goframe-synthesizer.js.map +0 -1
  391. package/dist/resolution/import-resolver.d.ts.map +0 -1
  392. package/dist/resolution/import-resolver.js.map +0 -1
  393. package/dist/resolution/index.d.ts.map +0 -1
  394. package/dist/resolution/index.js.map +0 -1
  395. package/dist/resolution/lru-cache.d.ts.map +0 -1
  396. package/dist/resolution/lru-cache.js.map +0 -1
  397. package/dist/resolution/memory-budget.d.ts.map +0 -1
  398. package/dist/resolution/memory-budget.js.map +0 -1
  399. package/dist/resolution/name-matcher.d.ts.map +0 -1
  400. package/dist/resolution/name-matcher.js.map +0 -1
  401. package/dist/resolution/path-aliases.d.ts.map +0 -1
  402. package/dist/resolution/path-aliases.js.map +0 -1
  403. package/dist/resolution/resolver-pool.d.ts.map +0 -1
  404. package/dist/resolution/resolver-pool.js.map +0 -1
  405. package/dist/resolution/resolver-worker.d.ts.map +0 -1
  406. package/dist/resolution/resolver-worker.js.map +0 -1
  407. package/dist/resolution/strip-comments.d.ts.map +0 -1
  408. package/dist/resolution/strip-comments.js.map +0 -1
  409. package/dist/resolution/swift-objc-bridge.d.ts.map +0 -1
  410. package/dist/resolution/swift-objc-bridge.js.map +0 -1
  411. package/dist/resolution/types.d.ts.map +0 -1
  412. package/dist/resolution/types.js.map +0 -1
  413. package/dist/resolution/workspace-packages.d.ts.map +0 -1
  414. package/dist/resolution/workspace-packages.js.map +0 -1
  415. package/dist/search/identifier-segments.d.ts.map +0 -1
  416. package/dist/search/identifier-segments.js.map +0 -1
  417. package/dist/search/query-parser.d.ts.map +0 -1
  418. package/dist/search/query-parser.js.map +0 -1
  419. package/dist/search/query-utils.d.ts.map +0 -1
  420. package/dist/search/query-utils.js.map +0 -1
  421. package/dist/spec/build/diff-parser.d.ts.map +0 -1
  422. package/dist/spec/build/diff-parser.js.map +0 -1
  423. package/dist/spec/build/pipeline.d.ts.map +0 -1
  424. package/dist/spec/build/pipeline.js.map +0 -1
  425. package/dist/spec/build/scan.d.ts.map +0 -1
  426. package/dist/spec/build/scan.js.map +0 -1
  427. package/dist/spec/build/scope-resolver.d.ts.map +0 -1
  428. package/dist/spec/build/scope-resolver.js.map +0 -1
  429. package/dist/spec/build/spec-extractor.d.ts.map +0 -1
  430. package/dist/spec/build/spec-extractor.js.map +0 -1
  431. package/dist/spec/config.d.ts.map +0 -1
  432. package/dist/spec/config.js.map +0 -1
  433. package/dist/spec/db/commit-node.d.ts.map +0 -1
  434. package/dist/spec/db/commit-node.js.map +0 -1
  435. package/dist/spec/db/fragment-node.d.ts.map +0 -1
  436. package/dist/spec/db/fragment-node.js.map +0 -1
  437. package/dist/spec/db/fts.d.ts.map +0 -1
  438. package/dist/spec/db/fts.js.map +0 -1
  439. package/dist/spec/db/index.d.ts.map +0 -1
  440. package/dist/spec/db/index.js.map +0 -1
  441. package/dist/spec/db/persist.d.ts.map +0 -1
  442. package/dist/spec/db/persist.js.map +0 -1
  443. package/dist/spec/db/relations.d.ts.map +0 -1
  444. package/dist/spec/db/relations.js.map +0 -1
  445. package/dist/spec/db/schema.d.ts.map +0 -1
  446. package/dist/spec/db/schema.js.map +0 -1
  447. package/dist/spec/db/spec-node.d.ts.map +0 -1
  448. package/dist/spec/db/spec-node.js.map +0 -1
  449. package/dist/spec/db/sql-utils.d.ts.map +0 -1
  450. package/dist/spec/db/sql-utils.js.map +0 -1
  451. package/dist/spec/evolve/cluster-context.d.ts.map +0 -1
  452. package/dist/spec/evolve/cluster-context.js.map +0 -1
  453. package/dist/spec/evolve/commit-spec-analyzer.d.ts.map +0 -1
  454. package/dist/spec/evolve/commit-spec-analyzer.js.map +0 -1
  455. package/dist/spec/evolve/commit-spec-persister.d.ts.map +0 -1
  456. package/dist/spec/evolve/commit-spec-persister.js.map +0 -1
  457. package/dist/spec/evolve/impact-locator.d.ts.map +0 -1
  458. package/dist/spec/evolve/impact-locator.js.map +0 -1
  459. package/dist/spec/evolve/pipeline.d.ts.map +0 -1
  460. package/dist/spec/evolve/pipeline.js.map +0 -1
  461. package/dist/spec/evolve/spec-rewriter.d.ts.map +0 -1
  462. package/dist/spec/evolve/spec-rewriter.js.map +0 -1
  463. package/dist/spec/git/commits.d.ts.map +0 -1
  464. package/dist/spec/git/commits.js.map +0 -1
  465. package/dist/spec/git/exec.d.ts.map +0 -1
  466. package/dist/spec/git/exec.js.map +0 -1
  467. package/dist/spec/git/index.d.ts.map +0 -1
  468. package/dist/spec/git/index.js.map +0 -1
  469. package/dist/spec/graph/index.d.ts.map +0 -1
  470. package/dist/spec/graph/index.js.map +0 -1
  471. package/dist/spec/graph/queries.d.ts.map +0 -1
  472. package/dist/spec/graph/queries.js.map +0 -1
  473. package/dist/spec/llm/agent-client.d.ts.map +0 -1
  474. package/dist/spec/llm/agent-client.js.map +0 -1
  475. package/dist/spec/llm/agents/claude-code.d.ts.map +0 -1
  476. package/dist/spec/llm/agents/claude-code.js.map +0 -1
  477. package/dist/spec/llm/agents/codex.d.ts.map +0 -1
  478. package/dist/spec/llm/agents/codex.js.map +0 -1
  479. package/dist/spec/llm/agents/detect-utils.d.ts.map +0 -1
  480. package/dist/spec/llm/agents/detect-utils.js.map +0 -1
  481. package/dist/spec/llm/agents/deveco-code.d.ts.map +0 -1
  482. package/dist/spec/llm/agents/deveco-code.js.map +0 -1
  483. package/dist/spec/llm/agents/index.d.ts.map +0 -1
  484. package/dist/spec/llm/agents/index.js.map +0 -1
  485. package/dist/spec/llm/agents/types.d.ts.map +0 -1
  486. package/dist/spec/llm/agents/types.js.map +0 -1
  487. package/dist/spec/llm/client.d.ts.map +0 -1
  488. package/dist/spec/llm/client.js.map +0 -1
  489. package/dist/spec/llm/factory.d.ts.map +0 -1
  490. package/dist/spec/llm/factory.js.map +0 -1
  491. package/dist/spec/llm/prompts.d.ts.map +0 -1
  492. package/dist/spec/llm/prompts.js.map +0 -1
  493. package/dist/spec/llm/retry.d.ts.map +0 -1
  494. package/dist/spec/llm/retry.js.map +0 -1
  495. package/dist/spec/mine/addon/adapter.d.ts.map +0 -1
  496. package/dist/spec/mine/addon/adapter.js.map +0 -1
  497. package/dist/spec/mine/addon/render.d.ts.map +0 -1
  498. package/dist/spec/mine/addon/render.js.map +0 -1
  499. package/dist/spec/mine/addon/types.d.ts.map +0 -1
  500. package/dist/spec/mine/addon/types.js.map +0 -1
  501. package/dist/spec/mine/clustering/features.d.ts.map +0 -1
  502. package/dist/spec/mine/clustering/features.js.map +0 -1
  503. package/dist/spec/mine/clustering/index.d.ts.map +0 -1
  504. package/dist/spec/mine/clustering/index.js.map +0 -1
  505. package/dist/spec/mine/clustering/leiden.d.ts.map +0 -1
  506. package/dist/spec/mine/clustering/leiden.js.map +0 -1
  507. package/dist/spec/mine/clustering/text-similarity.d.ts.map +0 -1
  508. package/dist/spec/mine/clustering/text-similarity.js.map +0 -1
  509. package/dist/spec/mine/generator.d.ts.map +0 -1
  510. package/dist/spec/mine/generator.js.map +0 -1
  511. package/dist/spec/mine/persist.d.ts.map +0 -1
  512. package/dist/spec/mine/persist.js.map +0 -1
  513. package/dist/spec/mine/pipeline.d.ts.map +0 -1
  514. package/dist/spec/mine/pipeline.js.map +0 -1
  515. package/dist/spec/mine/scanner.d.ts.map +0 -1
  516. package/dist/spec/mine/scanner.js.map +0 -1
  517. package/dist/spec/types.d.ts.map +0 -1
  518. package/dist/spec/types.js.map +0 -1
  519. package/dist/spec/ui/index.d.ts.map +0 -1
  520. package/dist/spec/ui/index.js.map +0 -1
  521. package/dist/spec/ui/progress-handler.d.ts.map +0 -1
  522. package/dist/spec/ui/progress-handler.js.map +0 -1
  523. package/dist/spec/ui/progress.d.ts.map +0 -1
  524. package/dist/spec/ui/progress.js.map +0 -1
  525. package/dist/spec/utils/fs.d.ts.map +0 -1
  526. package/dist/spec/utils/fs.js.map +0 -1
  527. package/dist/spec/utils/index.d.ts.map +0 -1
  528. package/dist/spec/utils/index.js.map +0 -1
  529. package/dist/spec/utils/meta.d.ts.map +0 -1
  530. package/dist/spec/utils/meta.js.map +0 -1
  531. package/dist/spec/utils/truncate.d.ts.map +0 -1
  532. package/dist/spec/utils/truncate.js.map +0 -1
  533. package/dist/sync/git-hooks.d.ts.map +0 -1
  534. package/dist/sync/git-hooks.js.map +0 -1
  535. package/dist/sync/index.d.ts.map +0 -1
  536. package/dist/sync/index.js.map +0 -1
  537. package/dist/sync/watch-policy.d.ts.map +0 -1
  538. package/dist/sync/watch-policy.js.map +0 -1
  539. package/dist/sync/watcher.d.ts.map +0 -1
  540. package/dist/sync/watcher.js.map +0 -1
  541. package/dist/sync/worktree.d.ts.map +0 -1
  542. package/dist/sync/worktree.js.map +0 -1
  543. package/dist/types.d.ts.map +0 -1
  544. package/dist/types.js.map +0 -1
  545. package/dist/ui/glyphs.d.ts.map +0 -1
  546. package/dist/ui/glyphs.js.map +0 -1
  547. package/dist/ui/shimmer-progress.d.ts.map +0 -1
  548. package/dist/ui/shimmer-progress.js.map +0 -1
  549. package/dist/ui/shimmer-worker.d.ts.map +0 -1
  550. package/dist/ui/shimmer-worker.js.map +0 -1
  551. package/dist/ui/types.d.ts.map +0 -1
  552. package/dist/ui/types.js.map +0 -1
  553. package/dist/upgrade/index.d.ts.map +0 -1
  554. package/dist/upgrade/index.js.map +0 -1
  555. package/dist/upgrade/remove-binary.d.ts.map +0 -1
  556. package/dist/upgrade/remove-binary.js.map +0 -1
  557. package/dist/upgrade/update-check.d.ts.map +0 -1
  558. package/dist/upgrade/update-check.js.map +0 -1
  559. package/dist/utils.d.ts.map +0 -1
  560. package/dist/utils.js.map +0 -1
@@ -49,7 +49,6 @@ exports.parseFixedWindowEnv = parseFixedWindowEnv;
49
49
  exports.parseDebounceEnv = parseDebounceEnv;
50
50
  const os = __importStar(require("os"));
51
51
  const path = __importStar(require("path"));
52
- const child_process_1 = require("child_process");
53
52
  const directory_1 = require("../directory");
54
53
  const sync_1 = require("../sync");
55
54
  const tools_1 = require("./tools");
@@ -87,7 +86,7 @@ class MCPEngine {
87
86
  // project is open — workers each hold their own WAL read connection.
88
87
  queryPool = null;
89
88
  constructor(opts = {}) {
90
- this.opts = { watch: opts.watch ?? true, queryPool: opts.queryPool ?? false };
89
+ this.opts = { watch: opts.watch ?? true, queryPool: opts.queryPool ?? false, rootFloor: opts.rootFloor ?? null };
91
90
  this.toolHandler = new tools_1.ToolHandler(null);
92
91
  }
93
92
  /**
@@ -146,7 +145,7 @@ class MCPEngine {
146
145
  * subsequent-tool-call semantics; we preserve them by NOT throwing when the
147
146
  * search misses (just leaves `cg` null so the next call can retry).
148
147
  */
149
- async ensureInitialized(searchFrom) {
148
+ async ensureInitialized(searchFrom, floor) {
150
149
  if (this.closed)
151
150
  return;
152
151
  if (this.toolHandler.hasDefaultHomeGraph())
@@ -158,7 +157,7 @@ class MCPEngine {
158
157
  catch { /* let caller retry */ }
159
158
  return;
160
159
  }
161
- this.initPromise = this.doInitialize(searchFrom).finally(() => {
160
+ this.initPromise = this.doInitialize(searchFrom, floor).finally(() => {
162
161
  this.initPromise = null;
163
162
  });
164
163
  try {
@@ -174,13 +173,13 @@ class MCPEngine {
174
173
  * background `ensureInitialized` already finished (or failed) and we need
175
174
  * to pick up a project that appeared *after* the engine started.
176
175
  */
177
- retryInitializeSync(searchFrom) {
176
+ retryInitializeSync(searchFrom, floor) {
178
177
  if (this.closed)
179
178
  return;
180
179
  if (this.toolHandler.hasDefaultHomeGraph())
181
180
  return;
182
181
  this.toolHandler.setDefaultProjectHint(searchFrom);
183
- const resolvedRoot = (0, directory_1.findNearestHomeGraphRoot)(searchFrom);
182
+ const resolvedRoot = (0, directory_1.findNearestHomeGraphRoot)(searchFrom, floor ?? this.opts.rootFloor ?? undefined);
184
183
  if (!resolvedRoot)
185
184
  return;
186
185
  try {
@@ -230,9 +229,9 @@ class MCPEngine {
230
229
  this.cg = null;
231
230
  }
232
231
  }
233
- async doInitialize(searchFrom) {
232
+ async doInitialize(searchFrom, floor) {
234
233
  this.toolHandler.setDefaultProjectHint(searchFrom);
235
- let resolvedRoot = (0, directory_1.findNearestHomeGraphRoot)(searchFrom);
234
+ let resolvedRoot = (0, directory_1.findNearestHomeGraphRoot)(searchFrom, floor ?? this.opts.rootFloor ?? undefined);
236
235
  if (!resolvedRoot && autoInitEnabled()) {
237
236
  const created = await this.tryAutoInit(searchFrom);
238
237
  if (created)
@@ -280,66 +279,86 @@ class MCPEngine {
280
279
  process.stderr.write(`[HomeGraph MCP] Auto-init skipped — ${invalid}\n`);
281
280
  return false;
282
281
  }
282
+ // Race: another process finished init before we entered — open, don't bail
283
+ // (Spec 0032). Returning false here left the session with no cg forever.
283
284
  if ((0, directory_1.isInitialized)(root)) {
284
- // Race: another process finished init between our findNearest and here.
285
- return false;
285
+ return this.openAfterAutoInitRace(root);
286
286
  }
287
287
  try {
288
288
  process.stderr.write(`[HomeGraph MCP] Auto-init at ${root}\n`);
289
289
  const HomeGraph = loadHomeGraph();
290
290
  // Create DB immediately so tools/open succeed; index in background.
291
291
  const cg = await HomeGraph.init(root, { index: false });
292
+ // Pin empty state before returning so the first tool call cannot see `none`
293
+ // while the async fast-map task has not started (Spec 0032).
294
+ cg.setBuildPhase('building_fast');
292
295
  this.cg = cg;
293
296
  this.projectPath = root;
294
297
  this.toolHandler.setDefaultHomeGraph(cg);
295
- this.startWatching();
298
+ // Defer watch/catch-up until the full build finishes so auto-sync does not
299
+ // contend with the same-process writer (Spec 0032).
296
300
  this.maybeStartPool(root);
297
- // Fast map in-process (seconds, MCP stays up). Full index in a *detached*
298
- // child — in-process indexAll wedges the MCP event loop on large repos,
299
- // so DevEco marks the server "Connection closed" and agents fall back.
301
+ // Fast build in-process (seconds). Full build continues in *this* process
302
+ // as a background task — no sibling CLI (avoids second writer / lock fights).
303
+ // indexAll already yields between batches so MCP stdio can still answer
304
+ // tools with empty/fast/syncing guidance while the full build runs.
300
305
  void (async () => {
301
306
  try {
302
307
  cg.setBuildPhase('building_fast');
303
308
  const map = cg.buildProjectMap();
304
309
  cg.setBuildPhase('fast');
305
- process.stderr.write(`[HomeGraph MCP] Fast project map ready — modules=${map.modules.length} files=${map.files.length} (${map.durationMs}ms)\n`);
310
+ process.stderr.write(`[HomeGraph MCP] Fast build ready — modules=${map.modules.length} files=${map.files.length} (${map.durationMs}ms)\n`);
306
311
  }
307
312
  catch (err) {
308
313
  const msg = err instanceof Error ? err.message : String(err);
309
- process.stderr.write(`[HomeGraph MCP] Fast project map failed: ${msg}\n`);
314
+ process.stderr.write(`[HomeGraph MCP] Fast build failed: ${msg}\n`);
310
315
  }
311
- this.startDetachedFullIndex(cg, root);
316
+ this.startBackgroundFullBuild(cg);
312
317
  })();
313
318
  return true;
314
319
  }
315
320
  catch (err) {
316
321
  // Concurrent init from another process — treat as success path via open.
317
- if ((0, directory_1.isInitialized)(root)) {
318
- process.stderr.write(`[HomeGraph MCP] Auto-init raced; opening existing index at ${root}\n`);
319
- try {
320
- const mode = (0, graph_sources_1.resolveGraphSources)();
321
- if (!(0, graph_sources_1.graphSourceFlags)(mode).openProjectDb)
322
- return false;
323
- this.cg = await loadHomeGraph().open(root, { sources: mode });
324
- this.projectPath = root;
325
- this.toolHandler.setDefaultHomeGraph(this.cg);
326
- this.healBuildPhase(this.cg);
327
- this.startWatching();
328
- this.catchUpSync();
329
- this.maybeStartPool(root);
330
- return true;
331
- }
332
- catch (openErr) {
333
- const msg = openErr instanceof Error ? openErr.message : String(openErr);
334
- process.stderr.write(`[HomeGraph MCP] Auto-init open-after-race failed: ${msg}\n`);
335
- return false;
336
- }
322
+ if (await this.openAfterAutoInitRace(root)) {
323
+ return true;
337
324
  }
338
325
  const msg = err instanceof Error ? err.message : String(err);
339
326
  process.stderr.write(`[HomeGraph MCP] Auto-init failed: ${msg}\n`);
340
327
  return false;
341
328
  }
342
329
  }
330
+ /**
331
+ * Open an index another process just created (Spec 0032 cold-start race).
332
+ * Brief retries cover the window between mkdir and db file create.
333
+ */
334
+ async openAfterAutoInitRace(root) {
335
+ const mode = (0, graph_sources_1.resolveGraphSources)();
336
+ if (!(0, graph_sources_1.graphSourceFlags)(mode).openProjectDb)
337
+ return false;
338
+ for (let i = 0; i < 25; i++) {
339
+ if (!(0, directory_1.isInitialized)(root)) {
340
+ await new Promise((r) => setTimeout(r, 40));
341
+ continue;
342
+ }
343
+ try {
344
+ process.stderr.write(`[HomeGraph MCP] Auto-init raced; opening existing index at ${root}\n`);
345
+ this.cg = await loadHomeGraph().open(root, { sources: mode });
346
+ this.projectPath = root;
347
+ this.toolHandler.setDefaultHomeGraph(this.cg);
348
+ this.healBuildPhase(this.cg);
349
+ this.startWatching();
350
+ this.catchUpSync();
351
+ this.maybeStartPool(root);
352
+ return true;
353
+ }
354
+ catch (openErr) {
355
+ const msg = openErr instanceof Error ? openErr.message : String(openErr);
356
+ process.stderr.write(`[HomeGraph MCP] Auto-init open-after-race retry: ${msg}\n`);
357
+ await new Promise((r) => setTimeout(r, 40));
358
+ }
359
+ }
360
+ return false;
361
+ }
343
362
  /**
344
363
  * If a previous auto-init child finished indexing but never flipped
345
364
  * build_phase (MCP died mid-flight), heal so deep tools unlock.
@@ -355,10 +374,18 @@ class MCPEngine {
355
374
  process.stderr.write(`[HomeGraph MCP] Healed build_phase → full (index_state=${state})\n`);
356
375
  return;
357
376
  }
358
- // Index finished enough to have symbols but metadata stuck on indexing.
359
- if ((phase === 'indexing' || phase === 'fast') && cg.getStats().nodeCount > 0 && state !== 'indexing') {
377
+ // Symbols present after a full-build attempt — unlock deep tools even if
378
+ // metadata stayed on indexing/fast (crash mid-flight or soft fail).
379
+ let nodes = 0;
380
+ try {
381
+ nodes = cg.getStats().nodeCount;
382
+ }
383
+ catch {
384
+ return;
385
+ }
386
+ if (nodes > 0 && state !== 'failed' && (phase === 'indexing' || phase === 'fast')) {
360
387
  cg.setBuildPhase('full');
361
- process.stderr.write(`[HomeGraph MCP] Healed build_phase → full (nodes present, index_state=${state ?? 'null'})\n`);
388
+ process.stderr.write(`[HomeGraph MCP] Healed build_phase → full (nodes=${nodes}, index_state=${state ?? 'null'})\n`);
362
389
  }
363
390
  }
364
391
  catch {
@@ -366,88 +393,68 @@ class MCPEngine {
366
393
  }
367
394
  }
368
395
  /**
369
- * Run `homegraph index` in a detached sibling process so the MCP stdio
370
- * server stays responsive (fast map + homegraph_project keep working).
396
+ * Full symbol build in this MCP/daemon process (Spec 0032).
397
+ * Fire-and-forget: MCP tools keep answering with empty/fast/syncing while
398
+ * indexAll yields between batches. One writer — no sibling CLI process.
371
399
  */
372
- startDetachedFullIndex(cg, root) {
373
- cg.setBuildPhase('indexing');
374
- const scriptPath = process.argv[1];
375
- if (!scriptPath) {
376
- process.stderr.write('[HomeGraph MCP] No script path — falling back to in-process indexAll\n');
377
- this.startInProcessFullIndex(cg);
378
- return;
379
- }
380
- const args = [...process.execArgv, scriptPath, 'index', root];
381
- const env = { ...process.env };
382
- delete env.HOMEGRAPH_AUTO_INIT;
383
- process.stderr.write(`[HomeGraph MCP] Spawning background full index (detached) for ${root}\n`);
384
- try {
385
- const child = (0, child_process_1.spawn)(process.execPath, args, {
386
- detached: true,
387
- stdio: 'ignore',
388
- windowsHide: true,
389
- env,
390
- });
391
- child.on('error', (err) => {
392
- process.stderr.write(`[HomeGraph MCP] Detached index spawn error: ${err.message}; falling back in-process\n`);
393
- this.startInProcessFullIndex(cg);
394
- });
395
- child.unref();
396
- this.watchIndexCompletion(cg);
397
- }
398
- catch (err) {
399
- const msg = err instanceof Error ? err.message : String(err);
400
- process.stderr.write(`[HomeGraph MCP] Detached index spawn failed (${msg}); falling back in-process\n`);
401
- this.startInProcessFullIndex(cg);
402
- }
403
- }
404
- startInProcessFullIndex(cg) {
400
+ startBackgroundFullBuild(cg) {
405
401
  cg.setBuildPhase('indexing');
402
+ process.stderr.write('[HomeGraph MCP] Full build starting in-process (background)\n');
406
403
  void cg
407
404
  .indexAll()
408
405
  .then((result) => {
409
- cg.setBuildPhase('full');
410
406
  const files = result && typeof result === 'object' && 'filesIndexed' in result
411
- ? String(result.filesIndexed)
412
- : '?';
413
- process.stderr.write(`[HomeGraph MCP] Auto-init index complete — files=${files}\n`);
414
- })
415
- .catch((err) => {
416
- const msg = err instanceof Error ? err.message : String(err);
417
- process.stderr.write(`[HomeGraph MCP] Auto-init index failed: ${msg}\n`);
407
+ ? Number(result.filesIndexed ?? 0)
408
+ : 0;
409
+ const ok = !result || result.success !== false;
410
+ let nodes = 0;
418
411
  try {
419
- cg.setBuildPhase('fast');
412
+ nodes = cg.getStats().nodeCount;
420
413
  }
421
414
  catch {
422
- /* ignore */
415
+ /* busy */
423
416
  }
424
- });
425
- }
426
- watchIndexCompletion(cg) {
427
- const started = Date.now();
428
- const maxMs = 3 * 60 * 60 * 1000;
429
- const timer = setInterval(() => {
417
+ // Prefer symbols on disk over a soft failure flag — agents must unlock
418
+ // deep tools once a usable graph exists.
419
+ if (ok || nodes > 0 || files > 0) {
420
+ cg.setBuildPhase('full');
421
+ process.stderr.write(`[HomeGraph MCP] Full build complete — files=${files || '?'} nodes=${nodes}` +
422
+ (ok ? '\n' : ' (soft-fail but symbols present)\n'));
423
+ }
424
+ else {
425
+ cg.setBuildPhase('fast');
426
+ process.stderr.write('[HomeGraph MCP] Full build finished with no symbols — staying on fast map\n');
427
+ }
428
+ this.startWatchingAfterAutoInit();
429
+ })
430
+ .catch((err) => {
431
+ const msg = err instanceof Error ? err.message : String(err);
432
+ process.stderr.write(`[HomeGraph MCP] Full build failed: ${msg}\n`);
430
433
  try {
431
- const state = cg.getQueryBuilder().getMetadata('index_state');
432
- if (state === 'complete' || state === 'partial') {
433
- cg.setBuildPhase('full');
434
- clearInterval(timer);
435
- process.stderr.write(`[HomeGraph MCP] Auto-init index complete — index_state=${state}\n`);
436
- return;
434
+ let nodes = 0;
435
+ try {
436
+ nodes = cg.getStats().nodeCount;
437
437
  }
438
- if (state === 'failed') {
439
- cg.setBuildPhase('fast');
440
- clearInterval(timer);
441
- process.stderr.write('[HomeGraph MCP] Auto-init index failed — index_state=failed\n');
442
- return;
438
+ catch {
439
+ /* ignore */
440
+ }
441
+ cg.setBuildPhase(nodes > 0 ? 'full' : 'fast');
442
+ if (nodes > 0) {
443
+ process.stderr.write(`[HomeGraph MCP] Full build error after symbols written — phase=full (nodes=${nodes})\n`);
443
444
  }
444
445
  }
445
446
  catch {
446
- /* lock / transient */
447
+ /* ignore */
447
448
  }
448
- if (Date.now() - started > maxMs)
449
- clearInterval(timer);
450
- }, 2000);
449
+ this.startWatchingAfterAutoInit();
450
+ });
451
+ }
452
+ /** Enable watch + catch-up once auto-init full build is done (or gave up). */
453
+ startWatchingAfterAutoInit() {
454
+ if (this.watcherStarted)
455
+ return;
456
+ this.startWatching();
457
+ this.catchUpSync();
451
458
  }
452
459
  /**
453
460
  * Start file watching on the active HomeGraph instance. Idempotent — the
@@ -0,0 +1,10 @@
1
+ import type { Node } from '../types';
2
+ /** Multiple parser roles for one source declaration are not overloads. */
3
+ export declare function canonicalSourceDeclarations(nodes: Node[]): Node[];
4
+ /** Guidance describes retrieval; it must never close the host's coding task.
5
+ * Source fences are byte-preserved, including strings that resemble guidance.
6
+ */
7
+ export declare function neutralRetrievalGuidance(text: string): string;
8
+ /** Preserve complete lines at a shared output limit; never forge a full body. */
9
+ export declare function trimEvidenceAtLine(text: string, limit: number): string;
10
+ //# sourceMappingURL=evidence-rendering.d.ts.map
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canonicalSourceDeclarations = canonicalSourceDeclarations;
4
+ exports.neutralRetrievalGuidance = neutralRetrievalGuidance;
5
+ exports.trimEvidenceAtLine = trimEvidenceAtLine;
6
+ /** Multiple parser roles for one source declaration are not overloads. */
7
+ function canonicalSourceDeclarations(nodes) {
8
+ const out = [];
9
+ const roles = new Map();
10
+ const ids = new Set();
11
+ for (const node of nodes) {
12
+ if (ids.has(node.id))
13
+ continue;
14
+ ids.add(node.id);
15
+ if (node.kind !== 'struct' && node.kind !== 'component') {
16
+ out.push(node);
17
+ continue;
18
+ }
19
+ const key = `${node.filePath}:${node.startLine}:${node.name}`;
20
+ const prior = roles.get(key);
21
+ if (prior === undefined) {
22
+ roles.set(key, out.length);
23
+ out.push(node);
24
+ }
25
+ else if (node.kind === 'component')
26
+ out[prior] = node;
27
+ }
28
+ return out;
29
+ }
30
+ /** Guidance describes retrieval; it must never close the host's coding task.
31
+ * Source fences are byte-preserved, including strings that resemble guidance.
32
+ */
33
+ function neutralRetrievalGuidance(text) {
34
+ let fence = '';
35
+ return text.split('\n').map((line) => {
36
+ const marker = line.match(/^\s*(`{3,}|~{3,})/);
37
+ if (marker) {
38
+ if (!fence)
39
+ fence = marker[1][0];
40
+ else if (marker[1][0] === fence)
41
+ fence = '';
42
+ return line;
43
+ }
44
+ if (fence)
45
+ return line;
46
+ if (/^>\s*\*\*Explore complete/i.test(line)) {
47
+ return '> Retrieval returned the evidence shown above. Check missing requirements, continue the requested edits, and verify the resulting code.';
48
+ }
49
+ if (/^>/.test(line) && /treat as already Read|treat it as already Read/i.test(line)) {
50
+ return '> The displayed source ranges are available as evidence. Inspect omitted ranges or changed files when needed; avoid repeating unchanged ranges.';
51
+ }
52
+ return line
53
+ .replace(/\*{0,2}ANSWER NOW\*{0,2}/g, 'use the evidence shown')
54
+ .replace(/Flow \+ Source above are authoritative for this query\./g, 'Source coverage is limited to the displayed ranges.')
55
+ .replace(/Do \*\*not\*\* grep\/read\/`homegraph_node`\/`homegraph_search`[^.]*\./gi, 'Inspect missing evidence as needed.')
56
+ .replace(/do\s+\*{0,2}not\*{0,2}\s+(?:re-)?(?:grep|read|glob)(?:\/[^.;]+)?[^.;]*[.;]/gi, 'Avoid duplicate reads of unchanged ranges;');
57
+ }).join('\n');
58
+ }
59
+ /** Preserve complete lines at a shared output limit; never forge a full body. */
60
+ function trimEvidenceAtLine(text, limit) {
61
+ if (text.length <= limit)
62
+ return text;
63
+ const note = '\n[Partial source: shared output budget reached; omitted ranges remain available for a focused lookup.]';
64
+ const cut = text.slice(0, Math.max(0, limit - note.length - 5));
65
+ const boundary = cut.lastIndexOf('\n');
66
+ let kept = boundary >= 0 ? cut.slice(0, boundary) : '';
67
+ if ((kept.match(/^\s*```/gm)?.length ?? 0) % 2)
68
+ kept += '\n```';
69
+ return kept + note;
70
+ }
71
+ //# sourceMappingURL=evidence-rendering.js.map
@@ -1,13 +1,9 @@
1
1
  /**
2
2
  * Session-level explore repeat / partial guidance (generic).
3
3
  *
4
- * Stops agents from treating `homegraph_explore` as an iterative keyword
5
- * searcher: overlapping queries after a successful explore get a short refuse
6
- * instead of another multi-kB payload. Partial/busy replies carry concrete
7
- * retry anchors extracted from the query — never an empty 242-char shell.
8
- *
9
- * Failure fuse (post A/B): hard-cap explores per session, require tight
10
- * single-Type follow-ups after 2 calls, and bind Partial → named Next anchor.
4
+ * Repeated evidence is deduplicated; lexical overlap alone cannot prove that a
5
+ * follow-up's evidence obligation is already covered. Incomplete retrieval gets
6
+ * one bounded recovery, including when the first response was short or SDK-only.
11
7
  *
12
8
  * Shape-driven only — no product nouns.
13
9
  */
@@ -65,10 +61,10 @@ export declare function latestCountedExplore(prior: ExploreProjectState | null |
65
61
  * Whether `homegraph_node` / callers / callees should short-refuse after a
66
62
  * Partial explore (same failure class as explore×N — depth fan-out).
67
63
  *
68
- * After Partial: callers/callees are refused immediately (wrong tool + often a
69
- * multi-def token bomb). `homegraph_node` gets one shot, then refuse.
64
+ * Any one focused depth tool may recover missing evidence. The shared budget
65
+ * prevents fan-out without declaring callers/callees intrinsically invalid.
70
66
  */
71
- export declare function decideDepthToolFuse(prior: ExploreProjectState | null | undefined, depthCallCount: number, toolName?: string): DepthToolFuseDecision;
67
+ export declare function decideDepthToolFuse(prior: ExploreProjectState | null | undefined, depthCallCount: number, _toolName?: string): DepthToolFuseDecision;
72
68
  /** Success-shaped refuse when Partial already spent its one depth drill. */
73
69
  export declare function formatDepthToolRefuse(decision: DepthToolFuseDecision, toolName: string, symbolHint?: string): string;
74
70
  /** Candidate Type for Partial **Next anchor** / digest preference. */
@@ -92,12 +88,11 @@ export declare function pickBestDomainRoleAnchor(candidates: ReadonlyArray<Domai
92
88
  /** Format Next anchor caption used in Partial / soft-close footers. */
93
89
  export declare function formatNextAnchorCaption(c: DomainRoleAnchorCandidate): string;
94
90
  /**
95
- * Soft-close opening banner (must match footer — never pair with Partial locator).
91
+ * Coarse retrieval banner: source reuse is separate from task completion.
96
92
  */
97
93
  export declare function formatMechanismSoftCloseHeader(): string;
98
94
  /**
99
- * Soft-close footer: enough inventory + digest to answer without another explore.
100
- * Must NOT contain "Partial locator" so the session fuse treats the call as closed.
95
+ * Coarse retrieval footer; never claims that an inventory completes the task.
101
96
  */
102
97
  export declare function formatMechanismSoftCloseFooter(next?: DomainRoleAnchorCandidate): string;
103
98
  /** Honest Partial footer with a single Next anchor + ONE Grep. */