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
@@ -0,0 +1,352 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildArktsEvidencePacks = buildArktsEvidencePacks;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const node_fs_1 = require("node:fs");
6
+ const utils_1 = require("../utils");
7
+ const evidence_rendering_1 = require("./evidence-rendering");
8
+ const explore_dedup_1 = require("./explore-dedup");
9
+ const evidence_paths_1 = require("../graph/evidence-paths");
10
+ const LIMITS = { nodes: 36, expand: 12, edges: 48, files: 8, fileBytes: 512 * 1024, bytes: 2 * 1024 * 1024 };
11
+ const DECLARATIONS = new Set(['class', 'struct', 'component', 'interface', 'method', 'function', 'property', 'field', 'constant', 'variable', 'enum']);
12
+ const CONTAINERS = new Set(['class', 'struct', 'component', 'interface', 'enum']);
13
+ const RELATIONS = new Set(['calls', 'references', 'extends', 'implements', 'instantiates']);
14
+ const inline = (s) => s.replace(/[`\r\n]/g, ' ');
15
+ const location = (n) => `${n.filePath}:${n.startLine}`;
16
+ const label = (n) => `${n.qualifiedName || n.name} @ ${location(n)}`;
17
+ const local = (n) => !n.filePath.startsWith('ohos-sdk:') && !/\.d\.(?:ts|ets)$/i.test(n.filePath) && !(0, utils_1.isConfigLeafNode)(n);
18
+ // ArkAnalyzer's virtual entry/implicit constructor has no declaration on disk.
19
+ // Explicit constructors with a real range remain available through the normal renderer.
20
+ const artifact = (n) => n.filePath.includes('@dummy') || n.name.startsWith('@dummy')
21
+ || (n.name === 'constructor' && n.startLine === 1 && n.endLine === 1);
22
+ /** Consume already-located nodes. No text search, new planner call or recursive retrieval. */
23
+ function buildArktsEvidencePacks(graph, options) {
24
+ if (!options.nodes.some(n => local(n) && /\.ets$/i.test(n.filePath) && DECLARATIONS.has(n.kind)))
25
+ return null;
26
+ const search = options.pathSearch;
27
+ const requiredIds = search ? new Set([...search.goal.anchorIds, ...search.paths.flatMap(p => p.nodeIds)]) : options.focusIds;
28
+ const inputNodes = search && requiredIds.size ? [...requiredIds].flatMap(id => { const n = graph.getNode(id); return n ? [n] : []; }) : options.nodes;
29
+ const all = (0, evidence_rendering_1.canonicalSourceDeclarations)(inputNodes.filter(n => DECLARATIONS.has(n.kind) && local(n) && !artifact(n)));
30
+ if (!all.length)
31
+ return null;
32
+ const candidates = all.sort((a, b) => Number(requiredIds.has(b.id)) - Number(requiredIds.has(a.id))
33
+ || a.filePath.localeCompare(b.filePath) || a.startLine - b.startLine).slice(0, LIMITS.nodes);
34
+ const focus = candidates.filter(n => requiredIds.has(n.id));
35
+ // A named owning type provides scope for its named members, not another
36
+ // callable endpoint. Do not invent a missing Type→method call obligation.
37
+ const relationFocus = focus.filter(n => !CONTAINERS.has(n.kind) || !focus.some(child => child.id !== n.id
38
+ && child.filePath === n.filePath && child.startLine >= n.startLine && child.endLine <= n.endLine
39
+ && !CONTAINERS.has(child.kind)));
40
+ const packs = [];
41
+ const sources = new Map();
42
+ const nodeSources = new Map();
43
+ const fileCache = new Map();
44
+ const globalGaps = [];
45
+ let bytesRead = 0;
46
+ const root = (0, node_fs_1.realpathSync)(options.projectRoot);
47
+ const maxFiles = Math.max(1, Math.min(LIMITS.files, options.maxFiles ?? LIMITS.files));
48
+ const readSource = (node) => {
49
+ const previous = nodeSources.get(node.id);
50
+ if (previous)
51
+ return previous;
52
+ if (!local(node) || artifact(node) || !DECLARATIONS.has(node.kind)) {
53
+ const failure = { gap: { target: label(node), reason: 'unavailable', nextAnchor: location(node) } };
54
+ nodeSources.set(node.id, failure);
55
+ return failure;
56
+ }
57
+ let file = fileCache.get(node.filePath);
58
+ if (!file) {
59
+ file = {};
60
+ try {
61
+ const absolute = (0, utils_1.validatePathWithinRoot)(root, node.filePath);
62
+ if (!absolute) {
63
+ file.reason = 'unavailable';
64
+ }
65
+ else {
66
+ const stat = (0, node_fs_1.statSync)(absolute);
67
+ const size = stat.size;
68
+ if (!stat.isFile())
69
+ file.reason = 'unavailable';
70
+ else if (fileCache.size >= maxFiles || size > LIMITS.fileBytes || bytesRead + size > LIMITS.bytes)
71
+ file.reason = 'scope_limit';
72
+ else {
73
+ // A file growing after stat must not turn a bounded read into an unbounded one.
74
+ const descriptor = (0, node_fs_1.openSync)(absolute, 'r');
75
+ const buffer = Buffer.alloc(size + 1);
76
+ let bytes = 0;
77
+ try {
78
+ while (bytes < buffer.length) {
79
+ const read = (0, node_fs_1.readSync)(descriptor, buffer, bytes, buffer.length - bytes, bytes);
80
+ if (read === 0)
81
+ break;
82
+ bytes += read;
83
+ }
84
+ }
85
+ finally {
86
+ (0, node_fs_1.closeSync)(descriptor);
87
+ }
88
+ bytesRead += bytes;
89
+ const content = buffer.subarray(0, bytes).toString('utf8');
90
+ const indexed = graph.getFile(node.filePath);
91
+ // Hash equality, not mtime: edits can retain timestamps and invalidate ranges.
92
+ if (bytes !== size || !indexed || indexed.contentHash !== (0, node_crypto_1.createHash)('sha256').update(content).digest('hex'))
93
+ file.reason = 'stale';
94
+ else
95
+ file = { content, lines: content.split('\n'), fingerprint: (0, explore_dedup_1.fileFingerprint)(content) };
96
+ }
97
+ }
98
+ }
99
+ catch {
100
+ file.reason = 'unavailable';
101
+ }
102
+ fileCache.set(node.filePath, file);
103
+ }
104
+ const reason = file.reason ?? (!Number.isInteger(node.startLine) || !Number.isInteger(node.endLine)
105
+ || node.startLine < 1 || node.endLine < node.startLine || node.endLine > file.lines.length
106
+ || !file.lines.slice(node.startLine - 1, node.endLine).join('\n').trim() ? 'invalid_range' : undefined);
107
+ if (reason) {
108
+ const failure = { gap: { target: label(node), reason, nextAnchor: location(node) } };
109
+ nodeSources.set(node.id, failure);
110
+ return failure;
111
+ }
112
+ // Preserve contiguous ArkTS decorators when the extractor starts at the declaration.
113
+ let start = node.startLine;
114
+ while (start > 1 && /^\s*@\w+(?:\([^\n]*\))?\s*$/.test(file.lines[start - 2]))
115
+ start--;
116
+ const id = `${node.filePath}:${start}-${node.endLine}`;
117
+ if (!sources.has(id))
118
+ sources.set(id, { id, node, start, end: node.endLine,
119
+ source: file.lines.slice(start - 1, node.endLine).join('\n'), fingerprint: file.fingerprint });
120
+ const result = { id };
121
+ nodeSources.set(node.id, result);
122
+ return result;
123
+ };
124
+ const dependencies = (nodes) => {
125
+ const resolved = nodes.map(readSource);
126
+ return { sources: [...new Set(resolved.flatMap(s => s.id ? [s.id] : []))],
127
+ gaps: resolved.flatMap(s => s.gap ? [s.gap] : []) };
128
+ };
129
+ // Read focused declarations before peripheral endpoints spend the file-read allowance.
130
+ for (const n of candidates)
131
+ packs.push({ id: `source:${n.id}`, label: label(n),
132
+ priority: requiredIds.has(n.id) ? 80 : 20, ...dependencies([n]) });
133
+ if (all.length > candidates.length)
134
+ globalGaps.push({ target: `${all.length - candidates.length} additional candidates`,
135
+ reason: 'scope_limit', nextAnchor: location(all[candidates.length]) });
136
+ const candidateIds = new Set(candidates.map(n => n.id));
137
+ const edges = [];
138
+ const edgeKeys = new Set();
139
+ let edgesLimited = false;
140
+ for (const n of search ? [] : (relationFocus.length ? relationFocus : candidates).slice(0, LIMITS.expand)) {
141
+ const adjacent = [...graph.getOutgoingEdges(n.id), ...graph.getIncomingEdges(n.id)];
142
+ for (const edge of adjacent) {
143
+ if (!RELATIONS.has(edge.kind))
144
+ continue;
145
+ const from = graph.getNode(edge.source);
146
+ const to = graph.getNode(edge.target);
147
+ if ((from && artifact(from)) || (to && artifact(to)))
148
+ continue;
149
+ const key = JSON.stringify([edge.source, edge.target, edge.kind, edge.line, edge.metadata?.registeredAt]);
150
+ if (edgeKeys.has(key))
151
+ continue;
152
+ edgeKeys.add(key);
153
+ if (edges.length >= LIMITS.edges) {
154
+ edgesLimited = true;
155
+ continue;
156
+ }
157
+ edges.push(edge);
158
+ }
159
+ }
160
+ if (search) {
161
+ const fallbackNeighbors = search.missing.length || search.goal.anchorIds.length < 2 ? search.neighbors : [];
162
+ for (const edge of [...search.paths.flatMap(p => p.edges), ...fallbackNeighbors]) {
163
+ const key = (0, evidence_paths_1.evidenceEdgeKey)(edge);
164
+ if (!edgeKeys.has(key)) {
165
+ edgeKeys.add(key);
166
+ edges.push(edge);
167
+ }
168
+ }
169
+ for (const pair of search.missing) {
170
+ const from = graph.getNode(pair.from);
171
+ const to = graph.getNode(pair.to);
172
+ globalGaps.push({ target: `${search.goal.kind} path: ${from ? label(from) : pair.from} → ${to ? label(to) : pair.to}`,
173
+ reason: search.stopReason === 'budget_exhausted' ? 'scope_limit' : 'unindexed_connection', nextAnchor: to ? location(to) : pair.to });
174
+ }
175
+ for (const name of search.goal.ambiguous)
176
+ globalGaps.push({ target: `qualify the symbol with its owning type or file: ${name}`,
177
+ reason: 'ambiguous_anchor', nextAnchor: name });
178
+ if (search.goal.limited || (search.goal.anchorIds.length < 2 && search.stopReason === 'budget_exhausted')) {
179
+ globalGaps.push({ target: `query path search limit: ${search.limitsHit.join(', ')}`, reason: 'scope_limit', nextAnchor: location(candidates[0]) });
180
+ }
181
+ if (!search.missing.length && !search.goal.ambiguous.length && (search.stopReason === 'no_path_in_scope'
182
+ || (!search.paths.length && !search.neighbors.length))) {
183
+ globalGaps.push({ target: `no ${search.goal.kind} relation in the bounded scope`, reason: 'unindexed_connection', nextAnchor: location(candidates[0]) });
184
+ }
185
+ }
186
+ if (!search && (edgesLimited || relationFocus.length > LIMITS.expand))
187
+ globalGaps.push({ target: 'additional graph neighbors', reason: 'scope_limit',
188
+ nextAnchor: location(relationFocus[0] ?? candidates[0]) });
189
+ const connected = new Set();
190
+ const relationPacks = new Map();
191
+ edges.sort((a, b) => Number(candidateIds.has(b.source) && candidateIds.has(b.target))
192
+ - Number(candidateIds.has(a.source) && candidateIds.has(a.target)));
193
+ for (const [i, edge] of edges.entries()) {
194
+ const from = graph.getNode(edge.source);
195
+ const to = graph.getNode(edge.target);
196
+ if (!from || !to || !local(from) || !local(to)) {
197
+ globalGaps.push({ target: `${from ? label(from) : edge.source} ${edge.kind} ${to ? label(to) : edge.target}`,
198
+ reason: 'unavailable', nextAnchor: from ? location(from) : edge.source });
199
+ continue;
200
+ }
201
+ const required = [from, to];
202
+ const gaps = [];
203
+ const registration = edge.metadata?.registeredAt;
204
+ if (typeof registration === 'string') {
205
+ const match = registration.match(/^(.*):(\d+)$/);
206
+ const line = match ? Number(match[2]) : 0;
207
+ const owner = match ? graph.getNodesInFile(match[1]).filter(n => DECLARATIONS.has(n.kind)
208
+ && n.startLine <= line && n.endLine >= line).sort((a, b) => (a.endLine - a.startLine) - (b.endLine - b.startLine))[0] : undefined;
209
+ if (owner)
210
+ required.push(owner);
211
+ else
212
+ gaps.push({ target: `registration at ${registration}`, reason: 'registration_source', nextAnchor: registration });
213
+ }
214
+ else if (edge.line && (edge.line < from.startLine || edge.line > from.endLine)) {
215
+ const owner = graph.getNodesInFile(from.filePath).filter(n => DECLARATIONS.has(n.kind)
216
+ && n.startLine <= edge.line && n.endLine >= edge.line).sort((a, b) => (a.endLine - a.startLine) - (b.endLine - b.startLine))[0];
217
+ if (owner)
218
+ required.push(owner);
219
+ else
220
+ gaps.push({ target: `relation site ${from.filePath}:${edge.line}`, reason: 'registration_source', nextAnchor: `${from.filePath}:${edge.line}` });
221
+ }
222
+ const deps = dependencies(required);
223
+ connected.add(from.id);
224
+ connected.add(to.id);
225
+ const state = edge.metadata?.synthesizedBy === 'viewtree' && edge.metadata?.via === 'Prop'
226
+ ? 'state: @Prop one-way' : edge.metadata?.synthesizedBy === 'viewtree' && edge.metadata?.via === 'Link'
227
+ ? 'state: @Link two-way' : '';
228
+ const via = [edge.metadata?.synthesizedBy, edge.metadata?.via, state].filter(v => typeof v === 'string' && v).join('/');
229
+ const site = typeof registration === 'string' ? registration : edge.line ? `${from.filePath}:${edge.line}` : undefined;
230
+ packs.push({ id: `relation:${i}`, label: `${label(from)} → ${edge.kind} → ${label(to)}`,
231
+ priority: candidateIds.has(from.id) && candidateIds.has(to.id) ? 100 : 60,
232
+ sources: deps.sources, gaps: [...deps.gaps, ...gaps],
233
+ relation: { source: from.id, target: to.id, kind: edge.kind, provenance: edge.provenance, ...(via ? { via } : {}), ...(site ? { site } : {}) } });
234
+ relationPacks.set((0, evidence_paths_1.evidenceEdgeKey)(edge), packs[packs.length - 1]);
235
+ }
236
+ for (const path of search?.paths ?? []) {
237
+ const members = path.edges.map(e => relationPacks.get((0, evidence_paths_1.evidenceEdgeKey)(e)));
238
+ const missing = members.some(p => !p);
239
+ const target = path.nodeIds.map(id => { const n = graph.getNode(id); return n ? label(n) : id; }).join(' → ');
240
+ packs.push({ id: path.id, label: `directed ${search.goal.kind} path: ${target}`, priority: 160,
241
+ sources: [...new Set(members.flatMap(p => p?.sources ?? []))],
242
+ gaps: missing ? [{ target, reason: 'unavailable', nextAnchor: target }] : members.flatMap(p => p.gaps),
243
+ path: { id: path.id, nodeIds: path.nodeIds, relations: members.flatMap(p => p?.relation ? [p.relation] : []) } });
244
+ }
245
+ for (const n of search ? [] : relationFocus)
246
+ if (!connected.has(n.id))
247
+ globalGaps.push({ target: `call/use connection for ${label(n)}`,
248
+ reason: 'unindexed_connection', nextAnchor: location(n) });
249
+ // Individual neighbors do not prove that two requested anchors are connected.
250
+ if (!search && relationFocus.length > 1) {
251
+ const reached = new Set([relationFocus[0].id]);
252
+ for (let i = 0; i < edges.length; i++) {
253
+ let changed = false;
254
+ for (const e of edges)
255
+ if (reached.has(e.source) || reached.has(e.target)) {
256
+ if (!reached.has(e.source) || !reached.has(e.target))
257
+ changed = true;
258
+ reached.add(e.source);
259
+ reached.add(e.target);
260
+ }
261
+ if (!changed)
262
+ break;
263
+ }
264
+ const disconnected = relationFocus.filter(n => !reached.has(n.id));
265
+ if (disconnected.length)
266
+ globalGaps.push({ target: `connecting path in the bounded graph slice: ${label(relationFocus[0])} → ${label(disconnected[0])}`,
267
+ reason: 'unindexed_connection', nextAnchor: location(disconnected[0]) });
268
+ }
269
+ const selected = [];
270
+ const rejectedGap = (p) => p.gaps.length ? p.gaps : [{ target: p.label, reason: 'budget',
271
+ nextAnchor: sources.get(p.sources[0] ?? '') ? location(sources.get(p.sources[0]).node) : p.label }];
272
+ const gapsFor = (chosen) => {
273
+ const ids = new Set(chosen.map(p => p.id));
274
+ return [...new Map([...globalGaps, ...packs.filter(p => !ids.has(p.id)).flatMap(rejectedGap)]
275
+ .map(g => [`${g.reason}:${g.target}`, g])).values()];
276
+ };
277
+ const unitsFor = (chosen) => {
278
+ const units = [...new Set(chosen.flatMap(p => p.sources))].map(id => sources.get(id));
279
+ // A complete enclosing declaration already contains the nested declaration.
280
+ return units.filter(s => !units.some(other => other.id !== s.id && other.node.filePath === s.node.filePath
281
+ && other.start <= s.start && other.end >= s.end)).sort((a, b) => a.node.filePath.localeCompare(b.node.filePath) || a.start - b.start);
282
+ };
283
+ const relationsFor = (chosen) => [...new Map(chosen.flatMap(p => p.path?.relations ?? (p.relation ? [p.relation] : []))
284
+ .map(r => [JSON.stringify(r), r])).values()];
285
+ const stopFor = (chosen) => search?.stopReason === 'supported'
286
+ && search.paths.some(p => !chosen.some(c => c.path?.id === p.id)) ? 'source_incomplete' : search?.stopReason ?? '';
287
+ const render = (chosen) => {
288
+ const gaps = gapsFor(chosen);
289
+ const lines = ['**ArkTS evidence packs**', gaps.length ? '> **Partial locator** — explicit gaps below.' : '> Bounded evidence supplied for the selected declarations and static links.',
290
+ 'Complete declarations preserve internal branches. Enclosing callers and runtime order/value flow are not proven. Retrieval is not task completion.'];
291
+ if (search)
292
+ lines.push(`Path goal: ${search.goal.kind}; search direction: ${search.goal.direction}; stop: ${stopFor(chosen)}. Static paths do not prove runtime behavior.`);
293
+ const chosenPaths = chosen.filter(p => p.path);
294
+ if (chosenPaths.length)
295
+ lines.push('**Directed paths (all source dependencies provided)**', ...chosenPaths.map(p => `- ${inline(p.label)}`));
296
+ const relations = relationsFor(chosen);
297
+ if (relations.length)
298
+ lines.push('**Static relations (with source dependencies)**', ...relations.map(r => {
299
+ const from = graph.getNode(r.source);
300
+ const to = graph.getNode(r.target);
301
+ return `- ${inline(from ? label(from) : r.source)} → ${r.kind} → ${inline(to ? label(to) : r.target)} [${r.provenance ?? 'indexed'}${r.via ? `; ${inline(r.via)}` : ''}${r.site ? `; site ${inline(r.site)}` : ''}]`;
302
+ }));
303
+ for (const unit of unitsFor(chosen)) {
304
+ // Fence longer than any source backtick run: source-like guidance cannot escape.
305
+ const fence = '`'.repeat(Math.max(3, ...Array.from(unit.source.matchAll(/`+/g), m => m[0].length + 1)));
306
+ lines.push(`### ${inline(unit.node.filePath)}:${unit.start}-${unit.end} — complete declaration; file-fingerprint=${unit.fingerprint}`, fence + unit.node.language, unit.source.split('\n').map((line, i) => `${unit.start + i}\t${line}`).join('\n'), fence);
307
+ }
308
+ if (gaps.length) {
309
+ lines.push('**Gaps — inspect only the missing evidence needed for the task**', ...gaps.slice(0, 6).map(g => `- ${g.reason}: ${inline(g.target)}. Next anchor: ${inline(g.nextAnchor)}.`));
310
+ if (gaps.length > 6)
311
+ lines.push(`- ${gaps.length - 6} further gaps omitted from this bounded display; coverage remains partial.`);
312
+ }
313
+ return lines.join('\n\n');
314
+ };
315
+ const maxChars = Math.max(0, Math.floor(options.maxChars));
316
+ for (const pack of packs.sort((a, b) => b.priority - a.priority || a.id.localeCompare(b.id))) {
317
+ if (!pack.gaps.length && render([...selected, pack]).length <= maxChars)
318
+ selected.push(pack);
319
+ }
320
+ let text = render(selected);
321
+ // Very small shared budgets may not even fit gap locators. Never cut source.
322
+ if (text.length > maxChars) {
323
+ selected.length = 0;
324
+ text = '> Partial locator — evidence pack omitted: shared output budget exhausted.'.slice(0, maxChars);
325
+ }
326
+ const gaps = gapsFor(selected);
327
+ const units = unitsFor(selected);
328
+ const files = [];
329
+ for (const unit of units) {
330
+ let entry = files.find(f => f.path === unit.node.filePath);
331
+ if (!entry) {
332
+ entry = { path: unit.node.filePath, ranges: [], bytes: 0, fingerprint: unit.fingerprint };
333
+ files.push(entry);
334
+ }
335
+ entry.ranges.push({ start: unit.start, end: unit.end });
336
+ entry.bytes += unit.source.length;
337
+ }
338
+ for (const file of files)
339
+ file.ranges = (0, explore_dedup_1.mergeRanges)(file.ranges);
340
+ const locatedNodes = candidates.filter(n => units.some(s => s.node.filePath === n.filePath && s.start <= n.startLine && s.end >= n.endLine))
341
+ .map(n => ({ id: n.id, name: n.name, qualifiedName: n.qualifiedName, filePath: n.filePath, startLine: n.startLine }));
342
+ const status = !units.length ? 'empty' : gaps.length ? 'partial' : 'complete';
343
+ return { text, emission: { projectRoot: options.projectRoot, query: options.query, files,
344
+ sourceBytes: files.reduce((sum, f) => sum + f.bytes, 0), responseBytes: text.length, locatedNodes,
345
+ evidenceStatus: status, partial: status !== 'complete', coveredObligations: selected.map(p => p.label),
346
+ uncoveredObligations: gaps.map(g => `${g.reason}: ${g.target}`), nextAnchor: gaps[0]?.nextAnchor },
347
+ metadata: { version: search ? 2 : 1, scope: 'bounded_static_evidence', status, selectedPacks: selected.map(p => p.id), gaps,
348
+ relations: relationsFor(selected), ...(search ? { pathSearch: { goal: search.goal, stopReason: stopFor(selected),
349
+ limitsHit: search.limitsHit, stats: search.stats, paths: search.paths.map(p => ({ id: p.id, nodeIds: p.nodeIds, cost: p.cost,
350
+ evidence: selected.some(c => c.path?.id === p.id) ? 'provided' : 'partial' })) } } : {}) } };
351
+ }
352
+ //# sourceMappingURL=arkts-evidence-packs.js.map
@@ -182,7 +182,7 @@ class Daemon {
182
182
  // serialize and starve the MCP transport (clients time out). Direct mode
183
183
  // (one stdio client) leaves the pool off; `CODEGRAPH_QUERY_POOL_SIZE=0`
184
184
  // disables it here too.
185
- this.engine = new engine_1.MCPEngine({ queryPool: true });
185
+ this.engine = new engine_1.MCPEngine({ queryPool: true, rootFloor: projectRoot });
186
186
  this.engine.setProjectPathHint(projectRoot);
187
187
  }
188
188
  /**
@@ -25,6 +25,13 @@ export interface MCPEngineOptions {
25
25
  * mode too.
26
26
  */
27
27
  queryPool?: boolean;
28
+ /**
29
+ * Upper bound for root resolution: an ancestor `.homegraph/` above this
30
+ * directory is never adopted. Set from the MCP host's explicit `--path`
31
+ * (CLI flag / client rootUri) — a stray ancestor index otherwise hijacks
32
+ * every nested server (spec 0028). Absent → unbounded git-style walk-up.
33
+ */
34
+ rootFloor?: string | null;
28
35
  }
29
36
  /**
30
37
  * Shared MCP engine. Thread-safe in the sense that multiple sessions can
@@ -71,13 +78,13 @@ export declare class MCPEngine {
71
78
  * subsequent-tool-call semantics; we preserve them by NOT throwing when the
72
79
  * search misses (just leaves `cg` null so the next call can retry).
73
80
  */
74
- ensureInitialized(searchFrom: string): Promise<void>;
81
+ ensureInitialized(searchFrom: string, floor?: string): Promise<void>;
75
82
  /**
76
83
  * Synchronous last-resort init used by the per-session retry loop when the
77
84
  * background `ensureInitialized` already finished (or failed) and we need
78
85
  * to pick up a project that appeared *after* the engine started.
79
86
  */
80
- retryInitializeSync(searchFrom: string): void;
87
+ retryInitializeSync(searchFrom: string, floor?: string): void;
81
88
  /**
82
89
  * Close everything. Used on graceful daemon shutdown (SIGTERM/idle timeout)
83
90
  * and on direct-mode stop. Idempotent.
@@ -93,18 +100,24 @@ export declare class MCPEngine {
93
100
  * @returns true if the engine is fully wired to a new (or racing) index
94
101
  */
95
102
  private tryAutoInit;
103
+ /**
104
+ * Open an index another process just created (Spec 0032 cold-start race).
105
+ * Brief retries cover the window between mkdir and db file create.
106
+ */
107
+ private openAfterAutoInitRace;
96
108
  /**
97
109
  * If a previous auto-init child finished indexing but never flipped
98
110
  * build_phase (MCP died mid-flight), heal so deep tools unlock.
99
111
  */
100
112
  private healBuildPhase;
101
113
  /**
102
- * Run `homegraph index` in a detached sibling process so the MCP stdio
103
- * server stays responsive (fast map + homegraph_project keep working).
114
+ * Full symbol build in this MCP/daemon process (Spec 0032).
115
+ * Fire-and-forget: MCP tools keep answering with empty/fast/syncing while
116
+ * indexAll yields between batches. One writer — no sibling CLI process.
104
117
  */
105
- private startDetachedFullIndex;
106
- private startInProcessFullIndex;
107
- private watchIndexCompletion;
118
+ private startBackgroundFullBuild;
119
+ /** Enable watch + catch-up once auto-init full build is done (or gave up). */
120
+ private startWatchingAfterAutoInit;
108
121
  /**
109
122
  * Start file watching on the active HomeGraph instance. Idempotent — the
110
123
  * watcher is per-engine, not per-session, which is why the daemon path