@flyingrobots/graft 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +1 -1
  3. package/dist/adapters/json-text-decoder.d.ts +3 -0
  4. package/dist/adapters/json-text-decoder.d.ts.map +1 -0
  5. package/dist/adapters/json-text-decoder.js +12 -0
  6. package/dist/adapters/json-text-decoder.js.map +1 -0
  7. package/dist/adapters/node-paths.d.ts +3 -0
  8. package/dist/adapters/node-paths.d.ts.map +1 -0
  9. package/dist/adapters/node-paths.js +29 -0
  10. package/dist/adapters/node-paths.js.map +1 -0
  11. package/dist/adapters/repo-paths.d.ts.map +1 -1
  12. package/dist/adapters/repo-paths.js +40 -5
  13. package/dist/adapters/repo-paths.js.map +1 -1
  14. package/dist/api/tool-bridge.d.ts +1 -1
  15. package/dist/api/tool-bridge.d.ts.map +1 -1
  16. package/dist/api/tool-bridge.js +1 -1
  17. package/dist/api/tool-bridge.js.map +1 -1
  18. package/dist/cli/cli-error.d.ts.map +1 -1
  19. package/dist/cli/cli-error.js +47 -10
  20. package/dist/cli/cli-error.js.map +1 -1
  21. package/dist/cli/command-parser.d.ts +12 -3
  22. package/dist/cli/command-parser.d.ts.map +1 -1
  23. package/dist/cli/command-parser.js +161 -2
  24. package/dist/cli/command-parser.js.map +1 -1
  25. package/dist/cli/daemon-status-model.d.ts +87 -0
  26. package/dist/cli/daemon-status-model.d.ts.map +1 -0
  27. package/dist/cli/daemon-status-model.js +142 -0
  28. package/dist/cli/daemon-status-model.js.map +1 -0
  29. package/dist/cli/daemon-status-render.d.ts +3 -0
  30. package/dist/cli/daemon-status-render.d.ts.map +1 -0
  31. package/dist/cli/daemon-status-render.js +100 -0
  32. package/dist/cli/daemon-status-render.js.map +1 -0
  33. package/dist/cli/daemon-status.d.ts +7 -0
  34. package/dist/cli/daemon-status.d.ts.map +1 -0
  35. package/dist/cli/daemon-status.js +79 -0
  36. package/dist/cli/daemon-status.js.map +1 -0
  37. package/dist/cli/git-graft-enhance-model.d.ts +67 -0
  38. package/dist/cli/git-graft-enhance-model.d.ts.map +1 -0
  39. package/dist/cli/git-graft-enhance-model.js +55 -0
  40. package/dist/cli/git-graft-enhance-model.js.map +1 -0
  41. package/dist/cli/git-graft-enhance-render.d.ts +3 -0
  42. package/dist/cli/git-graft-enhance-render.d.ts.map +1 -0
  43. package/dist/cli/git-graft-enhance-render.js +29 -0
  44. package/dist/cli/git-graft-enhance-render.js.map +1 -0
  45. package/dist/cli/git-graft-enhance.d.ts +14 -0
  46. package/dist/cli/git-graft-enhance.d.ts.map +1 -0
  47. package/dist/cli/git-graft-enhance.js +29 -0
  48. package/dist/cli/git-graft-enhance.js.map +1 -0
  49. package/dist/cli/index-cmd.d.ts.map +1 -1
  50. package/dist/cli/index-cmd.js +18 -21
  51. package/dist/cli/index-cmd.js.map +1 -1
  52. package/dist/cli/index-model.d.ts +5 -9
  53. package/dist/cli/index-model.d.ts.map +1 -1
  54. package/dist/cli/index-model.js +20 -18
  55. package/dist/cli/index-model.js.map +1 -1
  56. package/dist/cli/init-client-config.d.ts +12 -7
  57. package/dist/cli/init-client-config.d.ts.map +1 -1
  58. package/dist/cli/init-client-config.js +105 -43
  59. package/dist/cli/init-client-config.js.map +1 -1
  60. package/dist/cli/init-model.d.ts +9 -2
  61. package/dist/cli/init-model.d.ts.map +1 -1
  62. package/dist/cli/init-model.js +52 -4
  63. package/dist/cli/init-model.js.map +1 -1
  64. package/dist/cli/init-render.d.ts.map +1 -1
  65. package/dist/cli/init-render.js +2 -2
  66. package/dist/cli/init-render.js.map +1 -1
  67. package/dist/cli/init.d.ts.map +1 -1
  68. package/dist/cli/init.js +11 -9
  69. package/dist/cli/init.js.map +1 -1
  70. package/dist/cli/json-document.d.ts +5 -0
  71. package/dist/cli/json-document.d.ts.map +1 -1
  72. package/dist/cli/json-document.js +9 -0
  73. package/dist/cli/json-document.js.map +1 -1
  74. package/dist/cli/main.d.ts +7 -0
  75. package/dist/cli/main.d.ts.map +1 -1
  76. package/dist/cli/main.js +49 -7
  77. package/dist/cli/main.js.map +1 -1
  78. package/dist/cli/migrate-local-history.d.ts.map +1 -1
  79. package/dist/cli/migrate-local-history.js +3 -2
  80. package/dist/cli/migrate-local-history.js.map +1 -1
  81. package/dist/cli/peer-command.d.ts +1 -1
  82. package/dist/cli/peer-command.d.ts.map +1 -1
  83. package/dist/cli/peer-command.js +1 -1
  84. package/dist/cli/peer-command.js.map +1 -1
  85. package/dist/contracts/capabilities.d.ts +5 -5
  86. package/dist/contracts/capabilities.d.ts.map +1 -1
  87. package/dist/contracts/capabilities.js +89 -0
  88. package/dist/contracts/capabilities.js.map +1 -1
  89. package/dist/contracts/causal-ontology.d.ts +17 -17
  90. package/dist/contracts/json-object.d.ts +0 -1
  91. package/dist/contracts/json-object.d.ts.map +1 -1
  92. package/dist/contracts/json-object.js +0 -10
  93. package/dist/contracts/json-object.js.map +1 -1
  94. package/dist/contracts/output-schema-cli.d.ts +277 -25
  95. package/dist/contracts/output-schema-cli.d.ts.map +1 -1
  96. package/dist/contracts/output-schema-cli.js +35 -3
  97. package/dist/contracts/output-schema-cli.js.map +1 -1
  98. package/dist/contracts/output-schema-fragments.d.ts +212 -87
  99. package/dist/contracts/output-schema-fragments.d.ts.map +1 -1
  100. package/dist/contracts/output-schema-fragments.js +49 -2
  101. package/dist/contracts/output-schema-fragments.js.map +1 -1
  102. package/dist/contracts/output-schema-mcp.d.ts +372 -47
  103. package/dist/contracts/output-schema-mcp.d.ts.map +1 -1
  104. package/dist/contracts/output-schema-mcp.js +217 -1
  105. package/dist/contracts/output-schema-mcp.js.map +1 -1
  106. package/dist/contracts/output-schema-meta.d.ts +2 -2
  107. package/dist/contracts/output-schema-meta.d.ts.map +1 -1
  108. package/dist/contracts/output-schemas.d.ts +7 -7
  109. package/dist/contracts/output-schemas.d.ts.map +1 -1
  110. package/dist/contracts/output-schemas.js +294 -6
  111. package/dist/contracts/output-schemas.js.map +1 -1
  112. package/dist/git/diff.d.ts +11 -0
  113. package/dist/git/diff.d.ts.map +1 -1
  114. package/dist/git/diff.js +50 -6
  115. package/dist/git/diff.js.map +1 -1
  116. package/dist/mcp/burden.d.ts.map +1 -1
  117. package/dist/mcp/burden.js +9 -0
  118. package/dist/mcp/burden.js.map +1 -1
  119. package/dist/mcp/context.d.ts +3 -2
  120. package/dist/mcp/context.d.ts.map +1 -1
  121. package/dist/mcp/context.js +2 -37
  122. package/dist/mcp/context.js.map +1 -1
  123. package/dist/mcp/daemon-server.d.ts +2 -0
  124. package/dist/mcp/daemon-server.d.ts.map +1 -1
  125. package/dist/mcp/daemon-server.js +6 -1
  126. package/dist/mcp/daemon-server.js.map +1 -1
  127. package/dist/mcp/daemon-session-host.d.ts +1 -0
  128. package/dist/mcp/daemon-session-host.d.ts.map +1 -1
  129. package/dist/mcp/daemon-session-host.js +3 -0
  130. package/dist/mcp/daemon-session-host.js.map +1 -1
  131. package/dist/mcp/daemon-stdio-bridge.d.ts +1 -0
  132. package/dist/mcp/daemon-stdio-bridge.d.ts.map +1 -1
  133. package/dist/mcp/daemon-stdio-bridge.js +1 -0
  134. package/dist/mcp/daemon-stdio-bridge.js.map +1 -1
  135. package/dist/mcp/monitor-tick-job.d.ts +1 -0
  136. package/dist/mcp/monitor-tick-job.d.ts.map +1 -1
  137. package/dist/mcp/monitor-tick-job.js +84 -29
  138. package/dist/mcp/monitor-tick-job.js.map +1 -1
  139. package/dist/mcp/monitor-types.d.ts +1 -1
  140. package/dist/mcp/monitor-types.d.ts.map +1 -1
  141. package/dist/mcp/persisted-local-history-graph.d.ts +2 -2
  142. package/dist/mcp/persisted-local-history-graph.d.ts.map +1 -1
  143. package/dist/mcp/persisted-local-history-graph.js +3 -2
  144. package/dist/mcp/persisted-local-history-graph.js.map +1 -1
  145. package/dist/mcp/persisted-local-history.d.ts +5 -5
  146. package/dist/mcp/persisted-local-history.js +2 -2
  147. package/dist/mcp/persisted-local-history.js.map +1 -1
  148. package/dist/mcp/persistent-monitor-runtime.d.ts +1 -0
  149. package/dist/mcp/persistent-monitor-runtime.d.ts.map +1 -1
  150. package/dist/mcp/persistent-monitor-runtime.js +35 -0
  151. package/dist/mcp/persistent-monitor-runtime.js.map +1 -1
  152. package/dist/mcp/repo-tool-worker-context.d.ts.map +1 -1
  153. package/dist/mcp/repo-tool-worker-context.js +5 -2
  154. package/dist/mcp/repo-tool-worker-context.js.map +1 -1
  155. package/dist/mcp/server-context.d.ts.map +1 -1
  156. package/dist/mcp/server-context.js +13 -0
  157. package/dist/mcp/server-context.js.map +1 -1
  158. package/dist/mcp/server-tool-access.d.ts +1 -1
  159. package/dist/mcp/server-tool-access.d.ts.map +1 -1
  160. package/dist/mcp/server-tool-access.js +3 -1
  161. package/dist/mcp/server-tool-access.js.map +1 -1
  162. package/dist/mcp/server.d.ts +3 -0
  163. package/dist/mcp/server.d.ts.map +1 -1
  164. package/dist/mcp/server.js +5 -3
  165. package/dist/mcp/server.js.map +1 -1
  166. package/dist/mcp/tool-registry.d.ts.map +1 -1
  167. package/dist/mcp/tool-registry.js +18 -0
  168. package/dist/mcp/tool-registry.js.map +1 -1
  169. package/dist/mcp/tools/code-find.d.ts.map +1 -1
  170. package/dist/mcp/tools/code-find.js +20 -0
  171. package/dist/mcp/tools/code-find.js.map +1 -1
  172. package/dist/mcp/tools/code-show.d.ts.map +1 -1
  173. package/dist/mcp/tools/code-show.js +24 -0
  174. package/dist/mcp/tools/code-show.js.map +1 -1
  175. package/dist/mcp/tools/diagnostic-models.d.ts +2 -0
  176. package/dist/mcp/tools/diagnostic-models.d.ts.map +1 -1
  177. package/dist/mcp/tools/doctor.d.ts.map +1 -1
  178. package/dist/mcp/tools/doctor.js +18 -1
  179. package/dist/mcp/tools/doctor.js.map +1 -1
  180. package/dist/mcp/tools/export-surface-diff.d.ts +3 -0
  181. package/dist/mcp/tools/export-surface-diff.d.ts.map +1 -0
  182. package/dist/mcp/tools/export-surface-diff.js +24 -0
  183. package/dist/mcp/tools/export-surface-diff.js.map +1 -0
  184. package/dist/mcp/tools/file-outline.js +1 -1
  185. package/dist/mcp/tools/file-outline.js.map +1 -1
  186. package/dist/mcp/tools/graft-edit.d.ts +3 -0
  187. package/dist/mcp/tools/graft-edit.d.ts.map +1 -0
  188. package/dist/mcp/tools/graft-edit.js +192 -0
  189. package/dist/mcp/tools/graft-edit.js.map +1 -0
  190. package/dist/mcp/tools/knowledge-map.d.ts +3 -0
  191. package/dist/mcp/tools/knowledge-map.d.ts.map +1 -0
  192. package/dist/mcp/tools/knowledge-map.js +31 -0
  193. package/dist/mcp/tools/knowledge-map.js.map +1 -0
  194. package/dist/mcp/tools/monitor-nudge.d.ts +3 -0
  195. package/dist/mcp/tools/monitor-nudge.d.ts.map +1 -0
  196. package/dist/mcp/tools/monitor-nudge.js +17 -0
  197. package/dist/mcp/tools/monitor-nudge.js.map +1 -0
  198. package/dist/mcp/tools/precision-warp.d.ts +3 -3
  199. package/dist/mcp/tools/precision-warp.d.ts.map +1 -1
  200. package/dist/mcp/tools/precision-warp.js +24 -15
  201. package/dist/mcp/tools/precision-warp.js.map +1 -1
  202. package/dist/mcp/tools/refactor-difficulty.d.ts +3 -0
  203. package/dist/mcp/tools/refactor-difficulty.d.ts.map +1 -0
  204. package/dist/mcp/tools/refactor-difficulty.js +36 -0
  205. package/dist/mcp/tools/refactor-difficulty.js.map +1 -0
  206. package/dist/mcp/tools/safe-read.js +2 -2
  207. package/dist/mcp/tools/safe-read.js.map +1 -1
  208. package/dist/mcp/tools/structural-blame.d.ts +3 -0
  209. package/dist/mcp/tools/structural-blame.d.ts.map +1 -0
  210. package/dist/mcp/tools/structural-blame.js +44 -0
  211. package/dist/mcp/tools/structural-blame.js.map +1 -0
  212. package/dist/mcp/tools/structural-churn.d.ts +3 -0
  213. package/dist/mcp/tools/structural-churn.d.ts.map +1 -0
  214. package/dist/mcp/tools/structural-churn.js +28 -0
  215. package/dist/mcp/tools/structural-churn.js.map +1 -0
  216. package/dist/mcp/tools/structural-log.d.ts +3 -0
  217. package/dist/mcp/tools/structural-log.d.ts.map +1 -0
  218. package/dist/mcp/tools/structural-log.js +38 -0
  219. package/dist/mcp/tools/structural-log.js.map +1 -0
  220. package/dist/mcp/tools/structural-review.d.ts +3 -0
  221. package/dist/mcp/tools/structural-review.d.ts.map +1 -0
  222. package/dist/mcp/tools/structural-review.js +55 -0
  223. package/dist/mcp/tools/structural-review.js.map +1 -0
  224. package/dist/mcp/warp-pool.d.ts +4 -4
  225. package/dist/mcp/warp-pool.d.ts.map +1 -1
  226. package/dist/mcp/warp-pool.js.map +1 -1
  227. package/dist/mcp/workspace-router-model.d.ts +2 -2
  228. package/dist/mcp/workspace-router-model.d.ts.map +1 -1
  229. package/dist/mcp/workspace-router-runtime.d.ts +3 -3
  230. package/dist/mcp/workspace-router-runtime.d.ts.map +1 -1
  231. package/dist/mcp/workspace-router-runtime.js +4 -1
  232. package/dist/mcp/workspace-router-runtime.js.map +1 -1
  233. package/dist/mcp/workspace-router.d.ts +3 -2
  234. package/dist/mcp/workspace-router.d.ts.map +1 -1
  235. package/dist/mcp/workspace-router.js +6 -0
  236. package/dist/mcp/workspace-router.js.map +1 -1
  237. package/dist/operations/adaptive-projection.d.ts +22 -0
  238. package/dist/operations/adaptive-projection.d.ts.map +1 -0
  239. package/dist/operations/adaptive-projection.js +36 -0
  240. package/dist/operations/adaptive-projection.js.map +1 -0
  241. package/dist/operations/agent-handoff.d.ts +25 -0
  242. package/dist/operations/agent-handoff.d.ts.map +1 -0
  243. package/dist/operations/agent-handoff.js +36 -0
  244. package/dist/operations/agent-handoff.js.map +1 -0
  245. package/dist/operations/capture-range.d.ts +33 -0
  246. package/dist/operations/capture-range.d.ts.map +1 -0
  247. package/dist/operations/capture-range.js +45 -0
  248. package/dist/operations/capture-range.js.map +1 -0
  249. package/dist/operations/conversation-primer.d.ts +27 -0
  250. package/dist/operations/conversation-primer.d.ts.map +1 -0
  251. package/dist/operations/conversation-primer.js +52 -0
  252. package/dist/operations/conversation-primer.js.map +1 -0
  253. package/dist/operations/cross-session-resume.d.ts +28 -0
  254. package/dist/operations/cross-session-resume.d.ts.map +1 -0
  255. package/dist/operations/cross-session-resume.js +79 -0
  256. package/dist/operations/cross-session-resume.js.map +1 -0
  257. package/dist/operations/deterministic-replay.d.ts +39 -0
  258. package/dist/operations/deterministic-replay.d.ts.map +1 -0
  259. package/dist/operations/deterministic-replay.js +90 -0
  260. package/dist/operations/deterministic-replay.js.map +1 -0
  261. package/dist/operations/export-surface-diff.d.ts +36 -0
  262. package/dist/operations/export-surface-diff.d.ts.map +1 -0
  263. package/dist/operations/export-surface-diff.js +298 -0
  264. package/dist/operations/export-surface-diff.js.map +1 -0
  265. package/dist/operations/footprint-parallelism.d.ts +25 -0
  266. package/dist/operations/footprint-parallelism.d.ts.map +1 -0
  267. package/dist/operations/footprint-parallelism.js +79 -0
  268. package/dist/operations/footprint-parallelism.js.map +1 -0
  269. package/dist/operations/graft-diff.d.ts.map +1 -1
  270. package/dist/operations/graft-diff.js +14 -7
  271. package/dist/operations/graft-diff.js.map +1 -1
  272. package/dist/operations/horizon-of-readability.d.ts +23 -0
  273. package/dist/operations/horizon-of-readability.d.ts.map +1 -0
  274. package/dist/operations/horizon-of-readability.js +39 -0
  275. package/dist/operations/horizon-of-readability.js.map +1 -0
  276. package/dist/operations/import-reference-impact.d.ts +13 -0
  277. package/dist/operations/import-reference-impact.d.ts.map +1 -0
  278. package/dist/operations/import-reference-impact.js +101 -0
  279. package/dist/operations/import-reference-impact.js.map +1 -0
  280. package/dist/operations/knowledge-map.d.ts +30 -0
  281. package/dist/operations/knowledge-map.d.ts.map +1 -0
  282. package/dist/operations/knowledge-map.js +64 -0
  283. package/dist/operations/knowledge-map.js.map +1 -0
  284. package/dist/operations/observation-cache.d.ts +8 -2
  285. package/dist/operations/observation-cache.d.ts.map +1 -1
  286. package/dist/operations/observation-cache.js +17 -5
  287. package/dist/operations/observation-cache.js.map +1 -1
  288. package/dist/operations/projection-safety.d.ts +31 -0
  289. package/dist/operations/projection-safety.d.ts.map +1 -0
  290. package/dist/operations/projection-safety.js +77 -0
  291. package/dist/operations/projection-safety.js.map +1 -0
  292. package/dist/operations/repo-workspace.js +3 -3
  293. package/dist/operations/repo-workspace.js.map +1 -1
  294. package/dist/operations/semantic-drift.d.ts +27 -0
  295. package/dist/operations/semantic-drift.d.ts.map +1 -0
  296. package/dist/operations/semantic-drift.js +46 -0
  297. package/dist/operations/semantic-drift.js.map +1 -0
  298. package/dist/operations/session-filtration.d.ts +36 -0
  299. package/dist/operations/session-filtration.d.ts.map +1 -0
  300. package/dist/operations/session-filtration.js +48 -0
  301. package/dist/operations/session-filtration.js.map +1 -0
  302. package/dist/operations/session-replay.d.ts +17 -0
  303. package/dist/operations/session-replay.d.ts.map +1 -0
  304. package/dist/operations/session-replay.js +59 -0
  305. package/dist/operations/session-replay.js.map +1 -0
  306. package/dist/operations/sludge-detector.d.ts +45 -0
  307. package/dist/operations/sludge-detector.d.ts.map +1 -0
  308. package/dist/operations/sludge-detector.js +278 -0
  309. package/dist/operations/sludge-detector.js.map +1 -0
  310. package/dist/operations/structural-blame.d.ts +67 -0
  311. package/dist/operations/structural-blame.d.ts.map +1 -0
  312. package/dist/operations/structural-blame.js +111 -0
  313. package/dist/operations/structural-blame.js.map +1 -0
  314. package/dist/operations/structural-review.d.ts +47 -0
  315. package/dist/operations/structural-review.d.ts.map +1 -0
  316. package/dist/operations/structural-review.js +225 -0
  317. package/dist/operations/structural-review.js.map +1 -0
  318. package/dist/operations/teaching-hints.d.ts +18 -0
  319. package/dist/operations/teaching-hints.d.ts.map +1 -0
  320. package/dist/operations/teaching-hints.js +35 -0
  321. package/dist/operations/teaching-hints.js.map +1 -0
  322. package/dist/parser/diff.d.ts +2 -0
  323. package/dist/parser/diff.d.ts.map +1 -1
  324. package/dist/parser/diff.js +7 -0
  325. package/dist/parser/diff.js.map +1 -1
  326. package/dist/ports/paths.d.ts +17 -0
  327. package/dist/ports/paths.d.ts.map +1 -0
  328. package/dist/ports/{warp.js → paths.js} +2 -2
  329. package/dist/ports/paths.js.map +1 -0
  330. package/dist/warp/ast-emitter.d.ts +28 -0
  331. package/dist/warp/ast-emitter.d.ts.map +1 -0
  332. package/dist/warp/ast-emitter.js +90 -0
  333. package/dist/warp/ast-emitter.js.map +1 -0
  334. package/dist/warp/ast-import-resolver.d.ts +13 -0
  335. package/dist/warp/ast-import-resolver.d.ts.map +1 -0
  336. package/dist/warp/ast-import-resolver.js +259 -0
  337. package/dist/warp/ast-import-resolver.js.map +1 -0
  338. package/dist/warp/commit-meta.d.ts +8 -0
  339. package/dist/warp/commit-meta.d.ts.map +1 -0
  340. package/dist/warp/commit-meta.js +13 -0
  341. package/dist/warp/commit-meta.js.map +1 -0
  342. package/dist/warp/context.d.ts +10 -0
  343. package/dist/warp/context.d.ts.map +1 -0
  344. package/dist/warp/context.js +26 -0
  345. package/dist/warp/context.js.map +1 -0
  346. package/dist/warp/dead-symbols.d.ts +40 -0
  347. package/dist/warp/dead-symbols.d.ts.map +1 -0
  348. package/dist/warp/dead-symbols.js +127 -0
  349. package/dist/warp/dead-symbols.js.map +1 -0
  350. package/dist/warp/drift-sentinel.d.ts +30 -0
  351. package/dist/warp/drift-sentinel.d.ts.map +1 -0
  352. package/dist/warp/drift-sentinel.js +65 -0
  353. package/dist/warp/drift-sentinel.js.map +1 -0
  354. package/dist/warp/index-head.d.ts +32 -0
  355. package/dist/warp/index-head.d.ts.map +1 -0
  356. package/dist/warp/index-head.js +245 -0
  357. package/dist/warp/index-head.js.map +1 -0
  358. package/dist/warp/observers.d.ts +6 -6
  359. package/dist/warp/observers.d.ts.map +1 -1
  360. package/dist/warp/observers.js +5 -4
  361. package/dist/warp/observers.js.map +1 -1
  362. package/dist/warp/open.d.ts +5 -4
  363. package/dist/warp/open.d.ts.map +1 -1
  364. package/dist/warp/open.js +24 -49
  365. package/dist/warp/open.js.map +1 -1
  366. package/dist/warp/outline-diff-trailer.d.ts +26 -0
  367. package/dist/warp/outline-diff-trailer.d.ts.map +1 -0
  368. package/dist/warp/outline-diff-trailer.js +68 -0
  369. package/dist/warp/outline-diff-trailer.js.map +1 -0
  370. package/dist/warp/refactor-difficulty.d.ts +38 -0
  371. package/dist/warp/refactor-difficulty.d.ts.map +1 -0
  372. package/dist/warp/refactor-difficulty.js +169 -0
  373. package/dist/warp/refactor-difficulty.js.map +1 -0
  374. package/dist/warp/references.d.ts +22 -0
  375. package/dist/warp/references.d.ts.map +1 -0
  376. package/dist/warp/references.js +57 -0
  377. package/dist/warp/references.js.map +1 -0
  378. package/dist/warp/stale-docs.d.ts +56 -0
  379. package/dist/warp/stale-docs.d.ts.map +1 -0
  380. package/dist/warp/stale-docs.js +149 -0
  381. package/dist/warp/stale-docs.js.map +1 -0
  382. package/dist/warp/structural-drift-detection.d.ts +49 -0
  383. package/dist/warp/structural-drift-detection.d.ts.map +1 -0
  384. package/dist/warp/structural-drift-detection.js +51 -0
  385. package/dist/warp/structural-drift-detection.js.map +1 -0
  386. package/dist/warp/structural-queries.d.ts +49 -0
  387. package/dist/warp/structural-queries.d.ts.map +1 -0
  388. package/dist/warp/structural-queries.js +175 -0
  389. package/dist/warp/structural-queries.js.map +1 -0
  390. package/dist/warp/symbol-timeline.d.ts +34 -0
  391. package/dist/warp/symbol-timeline.d.ts.map +1 -0
  392. package/dist/warp/symbol-timeline.js +127 -0
  393. package/dist/warp/symbol-timeline.js.map +1 -0
  394. package/dist/warp/traverse-hydrate.d.ts +23 -0
  395. package/dist/warp/traverse-hydrate.d.ts.map +1 -0
  396. package/dist/warp/traverse-hydrate.js +39 -0
  397. package/dist/warp/traverse-hydrate.js.map +1 -0
  398. package/dist/warp/warp-reference-count.d.ts +19 -0
  399. package/dist/warp/warp-reference-count.d.ts.map +1 -0
  400. package/dist/warp/warp-reference-count.js +32 -0
  401. package/dist/warp/warp-reference-count.js.map +1 -0
  402. package/dist/warp/warp-structural-blame.d.ts +20 -0
  403. package/dist/warp/warp-structural-blame.d.ts.map +1 -0
  404. package/dist/warp/warp-structural-blame.js +43 -0
  405. package/dist/warp/warp-structural-blame.js.map +1 -0
  406. package/dist/warp/warp-structural-churn.d.ts +30 -0
  407. package/dist/warp/warp-structural-churn.d.ts.map +1 -0
  408. package/dist/warp/warp-structural-churn.js +213 -0
  409. package/dist/warp/warp-structural-churn.js.map +1 -0
  410. package/dist/warp/warp-structural-log.d.ts +35 -0
  411. package/dist/warp/warp-structural-log.d.ts.map +1 -0
  412. package/dist/warp/warp-structural-log.js +104 -0
  413. package/dist/warp/warp-structural-log.js.map +1 -0
  414. package/docs/CLI.md +68 -4
  415. package/docs/MCP.md +23 -0
  416. package/docs/SETUP.md +101 -20
  417. package/package.json +5 -3
  418. package/src/adapters/json-text-decoder.ts +11 -0
  419. package/src/adapters/node-paths.ts +35 -0
  420. package/src/adapters/repo-paths.ts +45 -4
  421. package/src/api/tool-bridge.ts +2 -1
  422. package/src/cli/cli-error.ts +49 -10
  423. package/src/cli/command-parser.ts +185 -3
  424. package/src/cli/daemon-status-model.ts +238 -0
  425. package/src/cli/daemon-status-render.ts +102 -0
  426. package/src/cli/daemon-status.ts +100 -0
  427. package/src/cli/git-graft-enhance-model.ts +131 -0
  428. package/src/cli/git-graft-enhance-render.ts +33 -0
  429. package/src/cli/git-graft-enhance.ts +54 -0
  430. package/src/cli/index-cmd.ts +18 -22
  431. package/src/cli/index-model.ts +21 -22
  432. package/src/cli/init-client-config.ts +167 -38
  433. package/src/cli/init-model.ts +57 -2
  434. package/src/cli/init-render.ts +2 -2
  435. package/src/cli/init.ts +11 -9
  436. package/src/cli/json-document.ts +11 -0
  437. package/src/cli/main.ts +53 -6
  438. package/src/cli/migrate-local-history.ts +3 -2
  439. package/src/cli/peer-command.ts +2 -1
  440. package/src/contracts/capabilities.ts +90 -0
  441. package/src/contracts/json-object.ts +1 -11
  442. package/src/contracts/output-schema-cli.ts +36 -3
  443. package/src/contracts/output-schema-fragments.ts +52 -2
  444. package/src/contracts/output-schema-mcp.ts +219 -0
  445. package/src/contracts/output-schemas.ts +300 -6
  446. package/src/git/diff.ts +61 -0
  447. package/src/mcp/burden.ts +9 -0
  448. package/src/mcp/context.ts +5 -42
  449. package/src/mcp/daemon-server.ts +8 -1
  450. package/src/mcp/daemon-session-host.ts +4 -0
  451. package/src/mcp/daemon-stdio-bridge.ts +2 -0
  452. package/src/mcp/monitor-tick-job.ts +90 -39
  453. package/src/mcp/monitor-types.ts +1 -1
  454. package/src/mcp/persisted-local-history-graph.ts +5 -4
  455. package/src/mcp/persisted-local-history.ts +2 -2
  456. package/src/mcp/persistent-monitor-runtime.ts +37 -0
  457. package/src/mcp/repo-tool-worker-context.ts +5 -2
  458. package/src/mcp/server-context.ts +15 -2
  459. package/src/mcp/server-tool-access.ts +4 -1
  460. package/src/mcp/server.ts +8 -3
  461. package/src/mcp/tool-registry.ts +18 -0
  462. package/src/mcp/tools/code-find.ts +23 -0
  463. package/src/mcp/tools/code-show.ts +27 -0
  464. package/src/mcp/tools/diagnostic-models.ts +2 -0
  465. package/src/mcp/tools/doctor.ts +18 -1
  466. package/src/mcp/tools/export-surface-diff.ts +26 -0
  467. package/src/mcp/tools/file-outline.ts +1 -1
  468. package/src/mcp/tools/graft-edit.ts +276 -0
  469. package/src/mcp/tools/knowledge-map.ts +34 -0
  470. package/src/mcp/tools/monitor-nudge.ts +19 -0
  471. package/src/mcp/tools/precision-warp.ts +27 -16
  472. package/src/mcp/tools/refactor-difficulty.ts +42 -0
  473. package/src/mcp/tools/safe-read.ts +2 -2
  474. package/src/mcp/tools/structural-blame.ts +55 -0
  475. package/src/mcp/tools/structural-churn.ts +28 -0
  476. package/src/mcp/tools/structural-log.ts +41 -0
  477. package/src/mcp/tools/structural-review.ts +63 -0
  478. package/src/mcp/warp-pool.ts +6 -6
  479. package/src/mcp/workspace-router-model.ts +2 -2
  480. package/src/mcp/workspace-router-runtime.ts +11 -8
  481. package/src/mcp/workspace-router.ts +9 -2
  482. package/src/operations/adaptive-projection.ts +54 -0
  483. package/src/operations/agent-handoff.ts +59 -0
  484. package/src/operations/capture-range.ts +64 -0
  485. package/src/operations/conversation-primer.ts +82 -0
  486. package/src/operations/cross-session-resume.ts +104 -0
  487. package/src/operations/deterministic-replay.ts +143 -0
  488. package/src/operations/export-surface-diff.ts +355 -0
  489. package/src/operations/footprint-parallelism.ts +98 -0
  490. package/src/operations/graft-diff.ts +14 -7
  491. package/src/operations/horizon-of-readability.ts +60 -0
  492. package/src/operations/import-reference-impact.ts +143 -0
  493. package/src/operations/knowledge-map.ts +96 -0
  494. package/src/operations/observation-cache.ts +20 -4
  495. package/src/operations/projection-safety.ts +111 -0
  496. package/src/operations/repo-workspace.ts +3 -3
  497. package/src/operations/semantic-drift.ts +70 -0
  498. package/src/operations/session-filtration.ts +76 -0
  499. package/src/operations/session-replay.ts +73 -0
  500. package/src/operations/sludge-detector.ts +356 -0
  501. package/src/operations/structural-blame.ts +197 -0
  502. package/src/operations/structural-review.ts +317 -0
  503. package/src/operations/teaching-hints.ts +52 -0
  504. package/src/parser/diff.ts +7 -0
  505. package/src/ports/paths.ts +22 -0
  506. package/src/warp/ast-emitter.ts +133 -0
  507. package/src/warp/ast-import-resolver.ts +333 -0
  508. package/src/warp/commit-meta.ts +19 -0
  509. package/src/warp/context.ts +48 -0
  510. package/src/warp/dead-symbols.ts +174 -0
  511. package/src/warp/drift-sentinel.ts +101 -0
  512. package/src/warp/index-head.ts +348 -0
  513. package/src/warp/observers.ts +8 -7
  514. package/src/warp/open.ts +40 -66
  515. package/src/warp/outline-diff-trailer.ts +100 -0
  516. package/src/warp/plumbing.d.ts +11 -2
  517. package/src/warp/refactor-difficulty.ts +257 -0
  518. package/src/warp/references.ts +77 -0
  519. package/src/warp/stale-docs.ts +210 -0
  520. package/src/warp/structural-drift-detection.ts +97 -0
  521. package/src/warp/structural-queries.ts +258 -0
  522. package/src/warp/symbol-timeline.ts +209 -0
  523. package/src/warp/traverse-hydrate.ts +61 -0
  524. package/src/warp/warp-reference-count.ts +47 -0
  525. package/src/warp/warp-structural-blame.ts +65 -0
  526. package/src/warp/warp-structural-churn.ts +309 -0
  527. package/src/warp/warp-structural-log.ts +149 -0
  528. package/dist/ports/warp.d.ts +0 -45
  529. package/dist/ports/warp.d.ts.map +0 -1
  530. package/dist/ports/warp.js.map +0 -1
  531. package/dist/warp/identity-resolver.d.ts +0 -14
  532. package/dist/warp/identity-resolver.d.ts.map +0 -1
  533. package/dist/warp/identity-resolver.js +0 -31
  534. package/dist/warp/identity-resolver.js.map +0 -1
  535. package/dist/warp/indexer-git.d.ts +0 -22
  536. package/dist/warp/indexer-git.d.ts.map +0 -1
  537. package/dist/warp/indexer-git.js +0 -148
  538. package/dist/warp/indexer-git.js.map +0 -1
  539. package/dist/warp/indexer-graph.d.ts +0 -17
  540. package/dist/warp/indexer-graph.d.ts.map +0 -1
  541. package/dist/warp/indexer-graph.js +0 -179
  542. package/dist/warp/indexer-graph.js.map +0 -1
  543. package/dist/warp/indexer-model.d.ts +0 -51
  544. package/dist/warp/indexer-model.d.ts.map +0 -1
  545. package/dist/warp/indexer-model.js +0 -21
  546. package/dist/warp/indexer-model.js.map +0 -1
  547. package/dist/warp/indexer.d.ts +0 -9
  548. package/dist/warp/indexer.d.ts.map +0 -1
  549. package/dist/warp/indexer.js +0 -112
  550. package/dist/warp/indexer.js.map +0 -1
  551. package/dist/warp/symbol-identity.d.ts +0 -11
  552. package/dist/warp/symbol-identity.d.ts.map +0 -1
  553. package/dist/warp/symbol-identity.js +0 -67
  554. package/dist/warp/symbol-identity.js.map +0 -1
  555. package/src/ports/warp.ts +0 -55
  556. package/src/warp/identity-resolver.ts +0 -35
  557. package/src/warp/indexer-git.ts +0 -182
  558. package/src/warp/indexer-graph.ts +0 -276
  559. package/src/warp/indexer-model.ts +0 -69
  560. package/src/warp/indexer.ts +0 -186
  561. package/src/warp/symbol-identity.ts +0 -100
@@ -1,5 +1,6 @@
1
- import { indexCommits } from "../warp/indexer.js";
1
+ import { DEFAULT_INDEX_MAX_FILES_PER_CALL, indexHead } from "../warp/index-head.js";
2
2
  import { nodeGit } from "../adapters/node-git.js";
3
+ import { nodePathOps } from "../adapters/node-paths.js";
3
4
  import { openWarp } from "../warp/open.js";
4
5
 
5
6
  export interface MonitorTickWorkerJob {
@@ -7,6 +8,7 @@ export interface MonitorTickWorkerJob {
7
8
  readonly worktreeRoot: string;
8
9
  readonly writerId: string;
9
10
  readonly lastIndexedCommit: string | null;
11
+ readonly maxFilesPerBatch?: number | undefined;
10
12
  }
11
13
 
12
14
  export type MonitorTickWorkerResult =
@@ -26,8 +28,8 @@ export type MonitorTickWorkerResult =
26
28
  readonly backlogCommits: number;
27
29
  };
28
30
 
29
- async function readGit(cwd: string, args: readonly string[]): Promise<string | null> {
30
- const result = await nodeGit.run({ cwd, args });
31
+ async function readHeadCommit(cwd: string): Promise<string | null> {
32
+ const result = await nodeGit.run({ cwd, args: ["rev-parse", "--verify", "HEAD"] });
31
33
  if (result.error !== undefined || result.status !== 0) {
32
34
  return null;
33
35
  }
@@ -35,68 +37,117 @@ async function readGit(cwd: string, args: readonly string[]): Promise<string | n
35
37
  return trimmed.length === 0 ? null : trimmed;
36
38
  }
37
39
 
38
- async function readHeadCommit(cwd: string): Promise<string | null> {
39
- return readGit(cwd, ["rev-parse", "--verify", "HEAD"]);
40
+ function parseGitPathList(output: string): readonly string[] {
41
+ const seen = new Set<string>();
42
+ const paths: string[] = [];
43
+ for (const line of output.split("\n")) {
44
+ const filePath = line.trim();
45
+ if (filePath.length === 0 || seen.has(filePath)) continue;
46
+ seen.add(filePath);
47
+ paths.push(filePath);
48
+ }
49
+ return paths;
40
50
  }
41
51
 
42
- async function countPendingCommits(
43
- cwd: string,
44
- from: string | null,
45
- to: string | null,
46
- ): Promise<number> {
47
- if (to === null) return 0;
48
- const range = from === null ? to : `${from}..${to}`;
49
- const output = await readGit(cwd, ["rev-list", "--count", range]);
50
- if (output === null) return 0;
51
- const parsed = Number.parseInt(output, 10);
52
- return Number.isInteger(parsed) && parsed >= 0 ? parsed : 0;
52
+ async function listTrackedPaths(cwd: string): Promise<readonly string[]> {
53
+ const result = await nodeGit.run({ cwd, args: ["ls-files"] });
54
+ if (result.error !== undefined || result.status !== 0) {
55
+ throw result.error ?? new Error(result.stderr.trim() || `git ls-files exited with status ${String(result.status)}`);
56
+ }
57
+ return parseGitPathList(result.stdout);
58
+ }
59
+
60
+ async function listChangedPaths(cwd: string, base: string, head: string): Promise<readonly string[] | null> {
61
+ const result = await nodeGit.run({ cwd, args: ["diff", "--name-only", `${base}..${head}`] });
62
+ if (result.error !== undefined || result.status !== 0) {
63
+ return null;
64
+ }
65
+ return parseGitPathList(result.stdout);
66
+ }
67
+
68
+ async function monitorIndexPaths(input: {
69
+ readonly cwd: string;
70
+ readonly currentHead: string | null;
71
+ readonly lastIndexedCommit: string | null;
72
+ }): Promise<readonly string[]> {
73
+ if (input.currentHead === null) return [];
74
+ if (input.lastIndexedCommit !== null) {
75
+ const changedPaths = await listChangedPaths(input.cwd, input.lastIndexedCommit, input.currentHead);
76
+ if (changedPaths !== null) return changedPaths;
77
+ }
78
+ return listTrackedPaths(input.cwd);
79
+ }
80
+
81
+ function pathBatches(paths: readonly string[], size: number): readonly (readonly string[])[] {
82
+ const batches: (readonly string[])[] = [];
83
+ for (let index = 0; index < paths.length; index += size) {
84
+ batches.push(paths.slice(index, index + size));
85
+ }
86
+ return batches;
53
87
  }
54
88
 
55
89
  export async function runMonitorTickJob(job: MonitorTickWorkerJob): Promise<MonitorTickWorkerResult> {
56
90
  const headAtStart = await readHeadCommit(job.worktreeRoot);
57
91
 
92
+ // ── Tick ceiling: skip indexing when HEAD hasn't moved ───────────
93
+ // When HEAD equals the last indexed commit (including both null for
94
+ // empty repos), there is nothing to index. Short-circuit before
95
+ // opening WARP or calling indexCommits to keep idle ticks near-zero-cost.
96
+ if (headAtStart === job.lastIndexedCommit) {
97
+ return {
98
+ ok: true,
99
+ headAtStart,
100
+ currentHead: headAtStart,
101
+ lastIndexedCommit: job.lastIndexedCommit,
102
+ backlogCommits: 0,
103
+ commitsIndexed: 0,
104
+ patchesWritten: 0,
105
+ };
106
+ }
107
+
58
108
  try {
59
- const warp = await openWarp({
109
+ const app = await openWarp({
60
110
  cwd: job.worktreeRoot,
61
111
  writerId: job.writerId,
62
112
  });
63
- const result = await indexCommits(warp, {
113
+ const ctx = { app, strandId: null };
114
+ const paths = await monitorIndexPaths({
64
115
  cwd: job.worktreeRoot,
65
- git: nodeGit,
66
- ...(job.lastIndexedCommit !== null ? { from: job.lastIndexedCommit } : {}),
67
- ...(headAtStart !== null ? { to: headAtStart } : {}),
116
+ currentHead: headAtStart,
117
+ lastIndexedCommit: job.lastIndexedCommit,
68
118
  });
69
- if (!result.ok) {
70
- throw new Error(result.error);
119
+ let commitsIndexed = 0;
120
+ let patchesWritten = 0;
121
+ const maxFilesPerBatch = job.maxFilesPerBatch ?? DEFAULT_INDEX_MAX_FILES_PER_CALL;
122
+ for (const batch of pathBatches(paths, maxFilesPerBatch)) {
123
+ const result = await indexHead({
124
+ cwd: job.worktreeRoot,
125
+ git: nodeGit,
126
+ pathOps: nodePathOps,
127
+ ctx,
128
+ paths: batch,
129
+ maxFilesPerCall: maxFilesPerBatch,
130
+ });
131
+ commitsIndexed += result.filesIndexed;
132
+ patchesWritten += result.nodesEmitted;
71
133
  }
72
134
  const currentHead = await readHeadCommit(job.worktreeRoot);
73
- const lastIndexedCommit = headAtStart ?? job.lastIndexedCommit;
74
- const backlogCommits = await countPendingCommits(
75
- job.worktreeRoot,
76
- lastIndexedCommit,
77
- currentHead,
78
- );
79
135
  return {
80
136
  ok: true,
81
137
  headAtStart,
82
138
  currentHead,
83
- lastIndexedCommit,
84
- backlogCommits,
85
- commitsIndexed: result.commitsIndexed,
86
- patchesWritten: result.patchesWritten,
139
+ lastIndexedCommit: headAtStart,
140
+ backlogCommits: 0,
141
+ commitsIndexed,
142
+ patchesWritten,
87
143
  };
88
144
  } catch (error) {
89
145
  const currentHead = await readHeadCommit(job.worktreeRoot);
90
- const backlogCommits = await countPendingCommits(
91
- job.worktreeRoot,
92
- job.lastIndexedCommit,
93
- currentHead,
94
- );
95
146
  return {
96
147
  ok: false,
97
148
  error: error instanceof Error ? error.message : String(error),
98
149
  currentHead,
99
- backlogCommits,
150
+ backlogCommits: 0,
100
151
  };
101
152
  }
102
153
  }
@@ -18,7 +18,7 @@ export const DEFAULT_POLL_INTERVAL_MS = 5_000;
18
18
  export type MonitorLifecycleState = "running" | "paused" | "stopped";
19
19
  export type MonitorHealth = "ok" | "lagging" | "error" | "unauthorized" | "paused" | "stopped";
20
20
  export type MonitorWorkerKind = "git_poll_indexer";
21
- export type MonitorAction = "start" | "pause" | "resume" | "stop";
21
+ export type MonitorAction = "start" | "pause" | "resume" | "stop" | "nudge";
22
22
 
23
23
  // ── Persistence schemas ────────────────────────────────────────────
24
24
 
@@ -6,10 +6,11 @@ import type {
6
6
  CausalRegion,
7
7
  Evidence,
8
8
  } from "../contracts/causal-ontology.js";
9
- import type { WarpHandle } from "../ports/warp.js";
9
+ import type { WarpContext } from "../warp/context.js";
10
+ import { patchGraph } from "../warp/context.js";
10
11
  import type { RuntimeStagedTargetFullFile } from "./runtime-staged-target.js";
11
12
 
12
- export type PersistedLocalHistoryGraphWarp = Pick<WarpHandle, "hasNode" | "observer" | "patch">;
13
+ export type PersistedLocalHistoryGraphWarp = WarpContext;
13
14
 
14
15
  export interface PersistedLocalHistoryGraphContext {
15
16
  readonly warp: PersistedLocalHistoryGraphWarp;
@@ -161,10 +162,10 @@ async function commitAccumulator(
161
162
  const ids = [...accumulator.nodes.keys()];
162
163
  const existence = new Map<string, boolean>();
163
164
  for (const id of ids) {
164
- existence.set(id, await graph.warp.hasNode(id));
165
+ existence.set(id, await graph.warp.app.core().hasNode(id));
165
166
  }
166
167
 
167
- await graph.warp.patch((patch) => {
168
+ await patchGraph(graph.warp, (patch) => {
168
169
  for (const [id, props] of accumulator.nodes.entries()) {
169
170
  const exists = existence.get(id) ?? false;
170
171
  if (!exists) {
@@ -462,7 +462,7 @@ async function loadObservedLocalHistoryGraph(
462
462
  return null;
463
463
  }
464
464
 
465
- const observer = await graph.warp.observer({
465
+ const observer = await graph.warp.app.observer({
466
466
  match: [...LOCAL_HISTORY_GRAPH_MATCH],
467
467
  expose: [...LOCAL_HISTORY_GRAPH_EXPOSE],
468
468
  });
@@ -980,7 +980,7 @@ async function hasLocalHistoryEventNode(
980
980
  graph: PersistedLocalHistoryGraphContext,
981
981
  eventId: string,
982
982
  ): Promise<boolean> {
983
- return graph.warp.hasNode(`lh:event:${eventId}`);
983
+ return graph.warp.app.core().hasNode(`lh:event:${eventId}`);
984
984
  }
985
985
 
986
986
  export async function migrateLegacyPersistedLocalHistoryToGraph(input: {
@@ -200,6 +200,43 @@ export class PersistentMonitorRuntime {
200
200
  return this.transitionMonitor("stop", request, "stopped");
201
201
  }
202
202
 
203
+ async nudgeMonitor(request: WorkspaceBindRequest): Promise<MonitorActionResult> {
204
+ await this.ensureLoaded();
205
+ const resolved = await this.resolveAuthorizedRepo(request);
206
+ if ("errorCode" in resolved) {
207
+ return {
208
+ ok: false,
209
+ action: "nudge",
210
+ created: false,
211
+ changed: false,
212
+ errorCode: resolved.errorCode,
213
+ error: resolved.error,
214
+ };
215
+ }
216
+ const { repoId } = resolved;
217
+ const record = this.records.get(repoId);
218
+ if (record?.lifecycleState !== "running") {
219
+ return {
220
+ ok: false,
221
+ action: "nudge",
222
+ created: false,
223
+ changed: false,
224
+ errorCode: "not_running",
225
+ error: "Monitor is not running — start it first.",
226
+ };
227
+ }
228
+ // Fire an immediate tick without changing lifecycle state
229
+ await this.runTick(repoId).catch(() => undefined);
230
+ return {
231
+ ok: true,
232
+ action: "nudge" as MonitorAction,
233
+ created: false,
234
+ changed: false,
235
+ status: await this.getStatusByRepoId(repoId),
236
+ };
237
+ }
238
+
239
+
203
240
  // ── Private: lifecycle transitions ─────────────────────────────
204
241
 
205
242
  private async transitionMonitor(
@@ -118,8 +118,8 @@ export function buildRepoToolWorkerContext(
118
118
  // captures footprint via AsyncLocalStorage in the invocation engine.
119
119
  },
120
120
  resolvePath: createRepoPathResolver(job.projectRoot),
121
- getWarp() {
122
- return openWarp({ cwd: job.projectRoot, writerId: job.writerId });
121
+ async getWarp() {
122
+ return { app: await openWarp({ cwd: job.projectRoot, writerId: job.writerId }), strandId: null };
123
123
  },
124
124
  getRepoState() {
125
125
  return job.repoState;
@@ -179,6 +179,9 @@ export function buildRepoToolWorkerContext(
179
179
  resumeMonitor() {
180
180
  return unsupported("resumeMonitor");
181
181
  },
182
+ nudgeMonitor() {
183
+ return unsupported("nudgeMonitor");
184
+ },
182
185
  stopMonitor() {
183
186
  return unsupported("stopMonitor");
184
187
  },
@@ -3,7 +3,7 @@ import type { CanonicalJsonCodec } from "../adapters/canonical-json.js";
3
3
  import type { FileSystem } from "../ports/filesystem.js";
4
4
  import type { ProcessRunner } from "../ports/process-runner.js";
5
5
  import type { GitClient } from "../ports/git.js";
6
- import type { WarpHandle } from "../ports/warp.js";
6
+ import type { WarpContext } from "../warp/context.js";
7
7
  import type { ToolContext, ToolDefinition } from "./context.js";
8
8
  import type { McpToolResult } from "./receipt.js";
9
9
  import type { RunCaptureConfig } from "./run-capture-config.js";
@@ -92,7 +92,7 @@ export function buildToolContext(deps: ToolContextDeps): ToolContext {
92
92
  git: deps.git,
93
93
  runCapture: deps.runCapture,
94
94
  observability: deps.observability,
95
- getWarp(): Promise<WarpHandle> {
95
+ getWarp(): Promise<WarpContext> {
96
96
  return getActiveExecutionContext()?.getWarp() ?? workspaceRouter.getWarp();
97
97
  },
98
98
  getRepoState() {
@@ -195,6 +195,19 @@ export function buildToolContext(deps: ToolContextDeps): ToolContext {
195
195
  }
196
196
  return monitorRuntime.resumeMonitor(request);
197
197
  },
198
+ nudgeMonitor(request) {
199
+ if (monitorRuntime === null) {
200
+ return Promise.resolve({
201
+ ok: false,
202
+ action: "nudge",
203
+ created: false,
204
+ changed: false,
205
+ errorCode: "no_daemon",
206
+ error: "Monitor runtime is not available.",
207
+ });
208
+ }
209
+ return monitorRuntime.nudgeMonitor(request);
210
+ },
198
211
  stopMonitor(request) {
199
212
  if (monitorRuntime === null) {
200
213
  throw new Error("monitor_stop is only available in daemon mode");
@@ -1,5 +1,6 @@
1
1
  import type { McpToolResult } from "./receipt.js";
2
- import { parseJsonTextObject, type JsonObject } from "../contracts/json-object.js";
2
+ import type { JsonObject } from "../contracts/json-object.js";
3
+ import { parseJsonTextObject } from "../adapters/json-text-decoder.js";
3
4
  import { evaluateMcpPolicy } from "./policy.js";
4
5
  import { RefusedResult } from "../policy/types.js";
5
6
  import { OFFLOADED_DAEMON_REPO_TOOL_NAMES, type OffloadedRepoToolName } from "./repo-tool-job.js";
@@ -18,6 +19,7 @@ const daemonAlwaysAvailableTools = new Set<string>([
18
19
  "monitor_start",
19
20
  "monitor_pause",
20
21
  "monitor_resume",
22
+ "monitor_nudge",
21
23
  "monitor_stop",
22
24
  "workspace_authorize",
23
25
  "workspace_authorizations",
@@ -37,6 +39,7 @@ export const repoStateOptionalTools = new Set<string>([
37
39
  "monitor_start",
38
40
  "monitor_pause",
39
41
  "monitor_resume",
42
+ "monitor_nudge",
40
43
  "monitor_stop",
41
44
  "workspace_authorize",
42
45
  "workspace_authorizations",
package/src/mcp/server.ts CHANGED
@@ -10,6 +10,7 @@ import { CanonicalJsonCodec } from "../adapters/canonical-json.js";
10
10
  import { nodeProcessRunner } from "../adapters/node-process-runner.js";
11
11
  import type { ProcessRunner } from "../ports/process-runner.js";
12
12
  import { nodeGit } from "../adapters/node-git.js";
13
+ import type { GitClient } from "../ports/git.js";
13
14
  import { openWarp } from "../warp/open.js";
14
15
  import type { RunCaptureConfig } from "./run-capture-config.js";
15
16
  import { resolveRunCaptureConfig } from "./run-capture-config.js";
@@ -64,6 +65,8 @@ export interface CreateGraftServerOptions {
64
65
  daemonWorkerPool?: DaemonWorkerPool;
65
66
  daemonRuntime?: (() => DaemonRuntimeDescriptor) | undefined;
66
67
  processRunner?: ProcessRunner;
68
+ git?: GitClient;
69
+ persistedLocalHistoryGraph?: boolean;
67
70
  }
68
71
 
69
72
  export function createGraftServer(options: CreateGraftServerOptions = {}): GraftServer {
@@ -88,6 +91,7 @@ export function createGraftServer(options: CreateGraftServerOptions = {}): Graft
88
91
  ...(options.env !== undefined ? { env: options.env } : {}),
89
92
  ...(options.runtimeObservability !== undefined ? { overrides: options.runtimeObservability } : {}),
90
93
  });
94
+ const gitClient = options.git ?? nodeGit;
91
95
  const runtimeLogger = new RuntimeEventLogger({
92
96
  fs: nodeFs,
93
97
  codec,
@@ -107,7 +111,7 @@ export function createGraftServer(options: CreateGraftServerOptions = {}): Graft
107
111
  ? (options.daemonControlPlane ?? new DaemonControlPlane({
108
112
  fs: nodeFs,
109
113
  codec,
110
- git: nodeGit,
114
+ git: gitClient,
111
115
  graftDir,
112
116
  }))
113
117
  : null;
@@ -116,7 +120,7 @@ export function createGraftServer(options: CreateGraftServerOptions = {}): Graft
116
120
  : (options.monitorRuntime ?? new PersistentMonitorRuntime({
117
121
  fs: nodeFs,
118
122
  codec,
119
- git: nodeGit,
123
+ git: gitClient,
120
124
  graftDir,
121
125
  controlPlane: daemonControlPlane,
122
126
  scheduler: daemonScheduler,
@@ -139,7 +143,7 @@ export function createGraftServer(options: CreateGraftServerOptions = {}): Graft
139
143
  const workspaceRouter = new WorkspaceRouter({
140
144
  mode,
141
145
  fs: nodeFs,
142
- git: nodeGit,
146
+ git: gitClient,
143
147
  graftDir,
144
148
  ...(projectRoot !== undefined ? { projectRoot } : {}),
145
149
  warpPool,
@@ -148,6 +152,7 @@ export function createGraftServer(options: CreateGraftServerOptions = {}): Graft
148
152
  ...(daemonControlPlane !== null ? { authorizationPolicy: daemonControlPlane } : {}),
149
153
  ...(daemonControlPlane !== null ? { sharedAttachPolicy: daemonControlPlane } : {}),
150
154
  persistedLocalHistory,
155
+ persistedLocalHistoryGraph: options.persistedLocalHistoryGraph ?? true,
151
156
  });
152
157
  const daemonRepoOverview = daemonControlPlane !== null && monitorRuntime !== null
153
158
  ? new DaemonRepoOverview({
@@ -1,6 +1,7 @@
1
1
  import type { ToolDefinition } from "./context.js";
2
2
 
3
3
  import { safeReadTool } from "./tools/safe-read.js";
4
+ import { graftEditTool } from "./tools/graft-edit.js";
4
5
  import { fileOutlineTool } from "./tools/file-outline.js";
5
6
  import { readRangeTool } from "./tools/read-range.js";
6
7
  import { changedSinceTool } from "./tools/changed-since.js";
@@ -16,15 +17,23 @@ import { mapTool } from "./tools/map.js";
16
17
  import { codeShowTool } from "./tools/code-show.js";
17
18
  import { codeFindTool } from "./tools/code-find.js";
18
19
  import { codeRefsTool } from "./tools/code-refs.js";
20
+ import { structuralChurnTool } from "./tools/structural-churn.js";
21
+ import { exportSurfaceDiffTool } from "./tools/export-surface-diff.js";
22
+ import { structuralLogTool } from "./tools/structural-log.js";
23
+ import { structuralBlameTool } from "./tools/structural-blame.js";
24
+ import { refactorDifficultyTool } from "./tools/refactor-difficulty.js";
25
+ import { structuralReviewTool } from "./tools/structural-review.js";
19
26
  import { daemonMonitorsTool } from "./tools/daemon-monitors.js";
20
27
  import { daemonReposTool } from "./tools/daemon-repos.js";
21
28
  import { daemonSessionsTool } from "./tools/daemon-sessions.js";
22
29
  import { daemonStatusTool } from "./tools/daemon-status.js";
23
30
  import { monitorPauseTool } from "./tools/monitor-pause.js";
24
31
  import { monitorResumeTool } from "./tools/monitor-resume.js";
32
+ import { monitorNudgeTool } from "./tools/monitor-nudge.js";
25
33
  import { monitorStartTool } from "./tools/monitor-start.js";
26
34
  import { monitorStopTool } from "./tools/monitor-stop.js";
27
35
  import { activityViewTool } from "./tools/activity-view.js";
36
+ import { knowledgeMapTool } from "./tools/knowledge-map.js";
28
37
  import { causalStatusTool } from "./tools/causal-status.js";
29
38
  import { causalAttachTool } from "./tools/causal-attach.js";
30
39
  import { workspaceAuthorizeTool } from "./tools/workspace-authorize.js";
@@ -36,6 +45,7 @@ import { workspaceRebindTool } from "./tools/workspace-rebind.js";
36
45
 
37
46
  export const TOOL_REGISTRY: readonly ToolDefinition[] = [
38
47
  safeReadTool,
48
+ graftEditTool,
39
49
  fileOutlineTool,
40
50
  readRangeTool,
41
51
  changedSinceTool,
@@ -55,6 +65,13 @@ export const TOOL_REGISTRY: readonly ToolDefinition[] = [
55
65
  codeShowTool,
56
66
  codeFindTool,
57
67
  codeRefsTool,
68
+ structuralChurnTool,
69
+ exportSurfaceDiffTool,
70
+ structuralLogTool,
71
+ structuralBlameTool,
72
+ refactorDifficultyTool,
73
+ structuralReviewTool,
74
+ knowledgeMapTool,
58
75
  ];
59
76
 
60
77
  export const DAEMON_TOOL_REGISTRY: readonly ToolDefinition[] = [
@@ -65,6 +82,7 @@ export const DAEMON_TOOL_REGISTRY: readonly ToolDefinition[] = [
65
82
  monitorStartTool,
66
83
  monitorPauseTool,
67
84
  monitorResumeTool,
85
+ monitorNudgeTool,
68
86
  monitorStopTool,
69
87
  workspaceAuthorizeTool,
70
88
  workspaceAuthorizationsTool,
@@ -1,5 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import type { ToolDefinition, ToolContext, ToolHandler } from "../context.js";
3
+ import { nodePathOps } from "../../adapters/node-paths.js";
4
+ import { indexHead } from "../../warp/index-head.js";
3
5
  import { GitFileQuery, listGitFiles } from "./git-files.js";
4
6
  import {
5
7
  evaluatePrecisionPolicy,
@@ -57,6 +59,26 @@ interface CodeFindOptions {
57
59
  readonly allowWarp: boolean;
58
60
  }
59
61
 
62
+ async function lazyIndexReadPaths(
63
+ ctx: ToolContext,
64
+ paths: readonly string[],
65
+ dirty: boolean,
66
+ ): Promise<void> {
67
+ if (dirty || paths.length === 0) return;
68
+ try {
69
+ const warp = await ctx.getWarp();
70
+ await indexHead({
71
+ cwd: ctx.projectRoot,
72
+ git: ctx.git,
73
+ pathOps: nodePathOps,
74
+ ctx: warp,
75
+ paths: [...new Set(paths)],
76
+ });
77
+ } catch {
78
+ // Lazy indexing must never turn a successful read/search into a failure.
79
+ }
80
+ }
81
+
60
82
  export async function runCodeFind(
61
83
  ctx: ToolContext,
62
84
  args: Record<string, unknown>,
@@ -140,6 +162,7 @@ export async function runCodeFind(
140
162
  paths: [...new Set(visibleMatches.map((m) => m.path))],
141
163
  symbols: visibleMatches.map((m) => m.name),
142
164
  });
165
+ await lazyIndexReadPaths(ctx, visibleMatches.map((m) => m.path), repoState.dirty);
143
166
 
144
167
  return ctx.respond("code_find", {
145
168
  query: request.query,
@@ -1,6 +1,8 @@
1
1
  import { z } from "zod";
2
2
  import { readRange } from "../../operations/read-range.js";
3
3
  import type { ToolDefinition, ToolContext, ToolHandler } from "../context.js";
4
+ import { nodePathOps } from "../../adapters/node-paths.js";
5
+ import { indexHead } from "../../warp/index-head.js";
4
6
  import { listProjectFiles } from "./git-files.js";
5
7
  import {
6
8
  evaluatePrecisionPolicy,
@@ -21,6 +23,26 @@ interface CodeShowOptions {
21
23
  readonly allowWarp: boolean;
22
24
  }
23
25
 
26
+ async function lazyIndexReadPaths(
27
+ ctx: ToolContext,
28
+ paths: readonly string[],
29
+ dirty: boolean,
30
+ ): Promise<void> {
31
+ if (dirty || paths.length === 0) return;
32
+ try {
33
+ const warp = await ctx.getWarp();
34
+ await indexHead({
35
+ cwd: ctx.projectRoot,
36
+ git: ctx.git,
37
+ pathOps: nodePathOps,
38
+ ctx: warp,
39
+ paths: [...new Set(paths)],
40
+ });
41
+ } catch {
42
+ // Lazy indexing is a cache refresh. It must not break the read response.
43
+ }
44
+ }
45
+
24
46
  export async function runCodeShow(
25
47
  ctx: ToolContext,
26
48
  args: Record<string, unknown>,
@@ -186,6 +208,7 @@ export async function runCodeShow(
186
208
  paths: [...new Set(visibleLocations.map((m) => m.path))],
187
209
  symbols: visibleLocations.map((m) => m.name),
188
210
  });
211
+ await lazyIndexReadPaths(ctx, visibleLocations.map((m) => m.path), repoState.dirty);
189
212
  return ctx.respond("code_show", {
190
213
  symbol: symbolName,
191
214
  ambiguous: true,
@@ -197,6 +220,9 @@ export async function runCodeShow(
197
220
 
198
221
  const loc = visibleLocations[0];
199
222
  if (loc?.startLine === undefined || loc.endLine === undefined) {
223
+ if (loc?.path !== undefined) {
224
+ await lazyIndexReadPaths(ctx, [loc.path], repoState.dirty);
225
+ }
200
226
  return ctx.respond("code_show", {
201
227
  symbol: symbolName,
202
228
  kind: loc?.kind,
@@ -228,6 +254,7 @@ export async function runCodeShow(
228
254
  symbols: [loc.name],
229
255
  regions: [{ path: loc.path, startLine: loc.startLine, endLine: loc.endLine }],
230
256
  });
257
+ await lazyIndexReadPaths(ctx, [loc.path], repoState.dirty);
231
258
 
232
259
  return ctx.respond("code_show", {
233
260
  symbol: loc.name,
@@ -12,6 +12,7 @@ import type {
12
12
  } from "../persisted-local-history.js";
13
13
  import type { RuntimeWorkspaceOverlayFooting } from "../runtime-workspace-overlay.js";
14
14
  import type { CausalSurfaceNextAction } from "../../contracts/causal-surface-next-action.js";
15
+ import type { SludgeReport } from "../../operations/sludge-detector.js";
15
16
 
16
17
  export interface SetBudgetResponse {
17
18
  readonly budget: {
@@ -72,6 +73,7 @@ export interface DoctorResponse {
72
73
  readonly attribution: PersistedLocalHistorySummary["attribution"];
73
74
  readonly persistedLocalHistory: PersistedLocalHistorySummary;
74
75
  readonly recommendedNextAction: CausalSurfaceNextAction;
76
+ readonly sludge?: SludgeReport | undefined;
75
77
  }
76
78
 
77
79
  export interface RunCapturePolicyBoundary {
@@ -5,14 +5,30 @@ import { deriveCausalSurfaceNextAction } from "../semantic-transition-guidance.j
5
5
  import type { ToolDefinition, ToolHandler } from "../context.js";
6
6
  import { toJsonObject } from "../../operations/result-dto.js";
7
7
  import type { DoctorResponse } from "./diagnostic-models.js";
8
+ import { detectSludge } from "../../operations/sludge-detector.js";
9
+ import { z } from "zod";
8
10
 
9
11
  export const doctorTool: ToolDefinition = {
10
12
  name: "doctor",
11
13
  description:
12
14
  "Runtime health check. Shows project root, parser status, active " +
13
15
  "thresholds, session depth, message count, and burden summary.",
16
+ schema: {
17
+ sludge: z.boolean().optional(),
18
+ path: z.string().optional(),
19
+ },
14
20
  createHandler(): ToolHandler {
15
- return async (_args, ctx) => {
21
+ return async (args, ctx) => {
22
+ const pathArg = typeof args["path"] === "string" ? args["path"] : undefined;
23
+ const sludge = args["sludge"] === true
24
+ ? await detectSludge({
25
+ cwd: ctx.projectRoot,
26
+ fs: ctx.fs,
27
+ git: ctx.git,
28
+ resolvePath: (filePath) => ctx.resolvePath(filePath),
29
+ ...(pathArg !== undefined ? { path: pathArg } : {}),
30
+ })
31
+ : undefined;
16
32
  const repoState = ctx.getRepoState();
17
33
  const causalContext = ctx.getCausalContext();
18
34
  const workspaceOverlayFooting = await ctx.getWorkspaceOverlayFooting();
@@ -59,6 +75,7 @@ export const doctorTool: ToolDefinition = {
59
75
  attribution: persistedLocalHistory.attribution,
60
76
  persistedLocalHistory,
61
77
  recommendedNextAction,
78
+ ...(sludge !== undefined ? { sludge } : {}),
62
79
  };
63
80
  return ctx.respond("doctor", toJsonObject(response));
64
81
  };
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ import { exportSurfaceDiff, exportSurfaceDiffToJson } from "../../operations/export-surface-diff.js";
3
+ import type { ToolDefinition, ToolHandler } from "../context.js";
4
+
5
+ export const exportSurfaceDiffTool: ToolDefinition = {
6
+ name: "graft_exports",
7
+ description:
8
+ "Export surface diff — what changed in the public API between two " +
9
+ "refs? Identifies added, removed, and signature-changed exported " +
10
+ "symbols and derives semver impact.",
11
+ schema: {
12
+ base: z.string().optional(),
13
+ head: z.string().optional(),
14
+ },
15
+ createHandler(): ToolHandler {
16
+ return async (args, ctx) => {
17
+ const result = await exportSurfaceDiff({
18
+ cwd: ctx.projectRoot,
19
+ git: ctx.git,
20
+ base: args["base"] as string | undefined,
21
+ head: args["head"] as string | undefined,
22
+ });
23
+ return ctx.respond("graft_exports", exportSurfaceDiffToJson(result));
24
+ };
25
+ },
26
+ };