@flyingrobots/graft 0.7.0 → 0.8.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 +153 -0
  2. package/README.md +33 -17
  3. package/bin/graft.js +26 -26
  4. package/dist/api/index.d.ts +3 -0
  5. package/dist/api/index.d.ts.map +1 -1
  6. package/dist/api/index.js +2 -0
  7. package/dist/api/index.js.map +1 -1
  8. package/dist/cli/cli-error.d.ts.map +1 -1
  9. package/dist/cli/cli-error.js +22 -3
  10. package/dist/cli/cli-error.js.map +1 -1
  11. package/dist/cli/command-parser.d.ts.map +1 -1
  12. package/dist/cli/command-parser.js +62 -6
  13. package/dist/cli/command-parser.js.map +1 -1
  14. package/dist/cli/dead-symbols-render.d.ts +2 -0
  15. package/dist/cli/dead-symbols-render.d.ts.map +1 -0
  16. package/dist/cli/dead-symbols-render.js +23 -0
  17. package/dist/cli/dead-symbols-render.js.map +1 -0
  18. package/dist/cli/doctor-render.d.ts +2 -0
  19. package/dist/cli/doctor-render.d.ts.map +1 -0
  20. package/dist/cli/doctor-render.js +80 -0
  21. package/dist/cli/doctor-render.js.map +1 -0
  22. package/dist/cli/entrypoint.d.ts +1 -0
  23. package/dist/cli/entrypoint.d.ts.map +1 -1
  24. package/dist/cli/entrypoint.js +1 -0
  25. package/dist/cli/entrypoint.js.map +1 -1
  26. package/dist/cli/git-graft-enhance-model.d.ts +33 -3
  27. package/dist/cli/git-graft-enhance-model.d.ts.map +1 -1
  28. package/dist/cli/git-graft-enhance-model.js +38 -0
  29. package/dist/cli/git-graft-enhance-model.js.map +1 -1
  30. package/dist/cli/git-graft-enhance-render.d.ts.map +1 -1
  31. package/dist/cli/git-graft-enhance-render.js +13 -0
  32. package/dist/cli/git-graft-enhance-render.js.map +1 -1
  33. package/dist/cli/git-graft-enhance.d.ts.map +1 -1
  34. package/dist/cli/git-graft-enhance.js +44 -1
  35. package/dist/cli/git-graft-enhance.js.map +1 -1
  36. package/dist/cli/index-cmd.d.ts +1 -0
  37. package/dist/cli/index-cmd.d.ts.map +1 -1
  38. package/dist/cli/index-cmd.js +3 -0
  39. package/dist/cli/index-cmd.js.map +1 -1
  40. package/dist/cli/init-client-config.d.ts.map +1 -1
  41. package/dist/cli/init-client-config.js +40 -4
  42. package/dist/cli/init-client-config.js.map +1 -1
  43. package/dist/cli/init-model.js +2 -2
  44. package/dist/cli/init-model.js.map +1 -1
  45. package/dist/cli/json-document.d.ts +1 -0
  46. package/dist/cli/json-document.d.ts.map +1 -1
  47. package/dist/cli/json-document.js +3 -0
  48. package/dist/cli/json-document.js.map +1 -1
  49. package/dist/cli/main.d.ts +2 -0
  50. package/dist/cli/main.d.ts.map +1 -1
  51. package/dist/cli/main.js +24 -2
  52. package/dist/cli/main.js.map +1 -1
  53. package/dist/cli/peer-command.d.ts.map +1 -1
  54. package/dist/cli/peer-command.js +25 -0
  55. package/dist/cli/peer-command.js.map +1 -1
  56. package/dist/cli/review-cooldown.d.ts +15 -0
  57. package/dist/cli/review-cooldown.d.ts.map +1 -0
  58. package/dist/cli/review-cooldown.js +136 -0
  59. package/dist/cli/review-cooldown.js.map +1 -0
  60. package/dist/cli/structural-blame-render.d.ts +2 -0
  61. package/dist/cli/structural-blame-render.d.ts.map +1 -0
  62. package/dist/cli/structural-blame-render.js +39 -0
  63. package/dist/cli/structural-blame-render.js.map +1 -0
  64. package/dist/cli/structural-review-render.d.ts +2 -0
  65. package/dist/cli/structural-review-render.d.ts.map +1 -0
  66. package/dist/cli/structural-review-render.js +56 -0
  67. package/dist/cli/structural-review-render.js.map +1 -0
  68. package/dist/cli/structural-test-coverage-render.d.ts +2 -0
  69. package/dist/cli/structural-test-coverage-render.d.ts.map +1 -0
  70. package/dist/cli/structural-test-coverage-render.js +46 -0
  71. package/dist/cli/structural-test-coverage-render.js.map +1 -0
  72. package/dist/contracts/capabilities.d.ts +9 -6
  73. package/dist/contracts/capabilities.d.ts.map +1 -1
  74. package/dist/contracts/capabilities.js +40 -1
  75. package/dist/contracts/capabilities.js.map +1 -1
  76. package/dist/contracts/causal-ontology.d.ts +17 -17
  77. package/dist/contracts/output-schema-cli.d.ts +103 -41
  78. package/dist/contracts/output-schema-cli.d.ts.map +1 -1
  79. package/dist/contracts/output-schema-cli.js +29 -0
  80. package/dist/contracts/output-schema-cli.js.map +1 -1
  81. package/dist/contracts/output-schema-fragments.d.ts +76 -76
  82. package/dist/contracts/output-schema-mcp.d.ts +87 -62
  83. package/dist/contracts/output-schema-mcp.d.ts.map +1 -1
  84. package/dist/contracts/output-schema-mcp.js +43 -21
  85. package/dist/contracts/output-schema-mcp.js.map +1 -1
  86. package/dist/contracts/output-schema-meta.d.ts +2 -2
  87. package/dist/contracts/output-schema-meta.d.ts.map +1 -1
  88. package/dist/contracts/output-schemas.d.ts +7 -7
  89. package/dist/contracts/output-schemas.d.ts.map +1 -1
  90. package/dist/contracts/output-schemas.js +69 -1
  91. package/dist/contracts/output-schemas.js.map +1 -1
  92. package/dist/git/version-guard.d.ts +17 -0
  93. package/dist/git/version-guard.d.ts.map +1 -0
  94. package/dist/git/version-guard.js +51 -0
  95. package/dist/git/version-guard.js.map +1 -0
  96. package/dist/hooks/posttooluse-read.js +3 -3
  97. package/dist/hooks/posttooluse-read.js.map +1 -1
  98. package/dist/hooks/pretooluse-read.js +1 -1
  99. package/dist/hooks/pretooluse-read.js.map +1 -1
  100. package/dist/mcp/burden.d.ts.map +1 -1
  101. package/dist/mcp/burden.js +2 -0
  102. package/dist/mcp/burden.js.map +1 -1
  103. package/dist/mcp/daemon-server.d.ts.map +1 -1
  104. package/dist/mcp/daemon-server.js +2 -0
  105. package/dist/mcp/daemon-server.js.map +1 -1
  106. package/dist/mcp/daemon-worker-child-pool.d.ts +2 -0
  107. package/dist/mcp/daemon-worker-child-pool.d.ts.map +1 -1
  108. package/dist/mcp/daemon-worker-child-pool.js +10 -3
  109. package/dist/mcp/daemon-worker-child-pool.js.map +1 -1
  110. package/dist/mcp/daemon-worker-pool.d.ts +1 -1
  111. package/dist/mcp/daemon-worker-pool.d.ts.map +1 -1
  112. package/dist/mcp/daemon-worker-pool.js +1 -1
  113. package/dist/mcp/daemon-worker-pool.js.map +1 -1
  114. package/dist/mcp/persisted-local-history-graph.d.ts.map +1 -1
  115. package/dist/mcp/persisted-local-history-graph.js +2 -1
  116. package/dist/mcp/persisted-local-history-graph.js.map +1 -1
  117. package/dist/mcp/persisted-local-history.d.ts +5 -5
  118. package/dist/mcp/repo-tool-job.d.ts.map +1 -1
  119. package/dist/mcp/repo-tool-job.js +2 -0
  120. package/dist/mcp/repo-tool-job.js.map +1 -1
  121. package/dist/mcp/server-invocation.d.ts.map +1 -1
  122. package/dist/mcp/server-invocation.js +206 -147
  123. package/dist/mcp/server-invocation.js.map +1 -1
  124. package/dist/mcp/server.d.ts.map +1 -1
  125. package/dist/mcp/server.js +184 -116
  126. package/dist/mcp/server.js.map +1 -1
  127. package/dist/mcp/stdio-server.d.ts.map +1 -1
  128. package/dist/mcp/stdio-server.js +2 -0
  129. package/dist/mcp/stdio-server.js.map +1 -1
  130. package/dist/mcp/tool-registry.d.ts.map +1 -1
  131. package/dist/mcp/tool-registry.js +4 -0
  132. package/dist/mcp/tool-registry.js.map +1 -1
  133. package/dist/mcp/tools/changed-since.d.ts.map +1 -1
  134. package/dist/mcp/tools/changed-since.js +10 -3
  135. package/dist/mcp/tools/changed-since.js.map +1 -1
  136. package/dist/mcp/tools/dead-symbols.d.ts +3 -0
  137. package/dist/mcp/tools/dead-symbols.d.ts.map +1 -0
  138. package/dist/mcp/tools/dead-symbols.js +33 -0
  139. package/dist/mcp/tools/dead-symbols.js.map +1 -0
  140. package/dist/mcp/tools/map.d.ts.map +1 -1
  141. package/dist/mcp/tools/map.js +2 -0
  142. package/dist/mcp/tools/map.js.map +1 -1
  143. package/dist/mcp/tools/precision-warp.d.ts.map +1 -1
  144. package/dist/mcp/tools/precision-warp.js +2 -6
  145. package/dist/mcp/tools/precision-warp.js.map +1 -1
  146. package/dist/mcp/tools/refactor-difficulty.d.ts.map +1 -1
  147. package/dist/mcp/tools/refactor-difficulty.js +2 -0
  148. package/dist/mcp/tools/refactor-difficulty.js.map +1 -1
  149. package/dist/mcp/tools/safe-read.d.ts.map +1 -1
  150. package/dist/mcp/tools/safe-read.js +10 -105
  151. package/dist/mcp/tools/safe-read.js.map +1 -1
  152. package/dist/mcp/tools/structural-test-coverage.d.ts +3 -0
  153. package/dist/mcp/tools/structural-test-coverage.d.ts.map +1 -0
  154. package/dist/mcp/tools/structural-test-coverage.js +35 -0
  155. package/dist/mcp/tools/structural-test-coverage.js.map +1 -0
  156. package/dist/operations/cached-file.d.ts +6 -2
  157. package/dist/operations/cached-file.d.ts.map +1 -1
  158. package/dist/operations/cached-file.js +30 -6
  159. package/dist/operations/cached-file.js.map +1 -1
  160. package/dist/operations/export-surface-diff.d.ts.map +1 -1
  161. package/dist/operations/export-surface-diff.js +2 -0
  162. package/dist/operations/export-surface-diff.js.map +1 -1
  163. package/dist/operations/file-outline.js +2 -2
  164. package/dist/operations/file-outline.js.map +1 -1
  165. package/dist/operations/graft-diff.d.ts.map +1 -1
  166. package/dist/operations/graft-diff.js +2 -0
  167. package/dist/operations/graft-diff.js.map +1 -1
  168. package/dist/operations/projection-safety.d.ts.map +1 -1
  169. package/dist/operations/projection-safety.js +2 -0
  170. package/dist/operations/projection-safety.js.map +1 -1
  171. package/dist/operations/repo-workspace.d.ts.map +1 -1
  172. package/dist/operations/repo-workspace.js +26 -8
  173. package/dist/operations/repo-workspace.js.map +1 -1
  174. package/dist/operations/review-cooldown-status.d.ts +27 -0
  175. package/dist/operations/review-cooldown-status.d.ts.map +1 -0
  176. package/dist/operations/review-cooldown-status.js +115 -0
  177. package/dist/operations/review-cooldown-status.js.map +1 -0
  178. package/dist/operations/safe-read.js +2 -2
  179. package/dist/operations/safe-read.js.map +1 -1
  180. package/dist/operations/sludge-detector.d.ts.map +1 -1
  181. package/dist/operations/sludge-detector.js +2 -1
  182. package/dist/operations/sludge-detector.js.map +1 -1
  183. package/dist/operations/structural-review.js +8 -8
  184. package/dist/operations/structural-review.js.map +1 -1
  185. package/dist/operations/structural-test-coverage-map.d.ts +44 -0
  186. package/dist/operations/structural-test-coverage-map.d.ts.map +1 -0
  187. package/dist/operations/structural-test-coverage-map.js +331 -0
  188. package/dist/operations/structural-test-coverage-map.js.map +1 -0
  189. package/dist/operations/structured-buffer-compare.d.ts.map +1 -1
  190. package/dist/operations/structured-buffer-compare.js +4 -1
  191. package/dist/operations/structured-buffer-compare.js.map +1 -1
  192. package/dist/operations/structured-buffer-model.d.ts +15 -13
  193. package/dist/operations/structured-buffer-model.d.ts.map +1 -1
  194. package/dist/operations/structured-buffer-model.js +24 -5
  195. package/dist/operations/structured-buffer-model.js.map +1 -1
  196. package/dist/operations/structured-buffer-query.d.ts.map +1 -1
  197. package/dist/operations/structured-buffer-query.js +21 -12
  198. package/dist/operations/structured-buffer-query.js.map +1 -1
  199. package/dist/parser/extractors/common.d.ts +16 -0
  200. package/dist/parser/extractors/common.d.ts.map +1 -0
  201. package/dist/parser/extractors/common.js +23 -0
  202. package/dist/parser/extractors/common.js.map +1 -0
  203. package/dist/parser/extractors/go.d.ts +18 -0
  204. package/dist/parser/extractors/go.d.ts.map +1 -0
  205. package/dist/parser/extractors/go.js +200 -0
  206. package/dist/parser/extractors/go.js.map +1 -0
  207. package/dist/parser/extractors/graphql.d.ts +26 -0
  208. package/dist/parser/extractors/graphql.d.ts.map +1 -0
  209. package/dist/parser/extractors/graphql.js +239 -0
  210. package/dist/parser/extractors/graphql.js.map +1 -0
  211. package/dist/parser/extractors/index.d.ts +4 -0
  212. package/dist/parser/extractors/index.d.ts.map +1 -0
  213. package/dist/parser/extractors/index.js +26 -0
  214. package/dist/parser/extractors/index.js.map +1 -0
  215. package/dist/parser/extractors/json.d.ts +10 -0
  216. package/dist/parser/extractors/json.d.ts.map +1 -0
  217. package/dist/parser/extractors/json.js +75 -0
  218. package/dist/parser/extractors/json.js.map +1 -0
  219. package/dist/parser/extractors/python.d.ts +16 -0
  220. package/dist/parser/extractors/python.d.ts.map +1 -0
  221. package/dist/parser/extractors/python.js +145 -0
  222. package/dist/parser/extractors/python.js.map +1 -0
  223. package/dist/parser/extractors/rust.d.ts +12 -0
  224. package/dist/parser/extractors/rust.d.ts.map +1 -0
  225. package/dist/parser/extractors/rust.js +122 -0
  226. package/dist/parser/extractors/rust.js.map +1 -0
  227. package/dist/parser/extractors/toml.d.ts +10 -0
  228. package/dist/parser/extractors/toml.d.ts.map +1 -0
  229. package/dist/parser/extractors/toml.js +74 -0
  230. package/dist/parser/extractors/toml.js.map +1 -0
  231. package/dist/parser/extractors/typescript.d.ts +13 -0
  232. package/dist/parser/extractors/typescript.d.ts.map +1 -0
  233. package/dist/parser/extractors/typescript.js +179 -0
  234. package/dist/parser/extractors/typescript.js.map +1 -0
  235. package/dist/parser/extractors/yaml.d.ts +13 -0
  236. package/dist/parser/extractors/yaml.d.ts.map +1 -0
  237. package/dist/parser/extractors/yaml.js +93 -0
  238. package/dist/parser/extractors/yaml.js.map +1 -0
  239. package/dist/parser/lang.d.ts +2 -2
  240. package/dist/parser/lang.d.ts.map +1 -1
  241. package/dist/parser/lang.js +19 -1
  242. package/dist/parser/lang.js.map +1 -1
  243. package/dist/parser/outline.d.ts +4 -0
  244. package/dist/parser/outline.d.ts.map +1 -1
  245. package/dist/parser/outline.js +32 -221
  246. package/dist/parser/outline.js.map +1 -1
  247. package/dist/parser/runtime.d.ts +7 -0
  248. package/dist/parser/runtime.d.ts.map +1 -1
  249. package/dist/parser/runtime.js +99 -10
  250. package/dist/parser/runtime.js.map +1 -1
  251. package/dist/parser/types.d.ts +1 -1
  252. package/dist/parser/types.d.ts.map +1 -1
  253. package/dist/parser/types.js.map +1 -1
  254. package/dist/ports/provenance-timeline.d.ts +10 -0
  255. package/dist/ports/provenance-timeline.d.ts.map +1 -0
  256. package/dist/ports/provenance-timeline.js +17 -0
  257. package/dist/ports/provenance-timeline.js.map +1 -0
  258. package/dist/ports/semantic-enrichment.d.ts +47 -0
  259. package/dist/ports/semantic-enrichment.d.ts.map +1 -0
  260. package/dist/ports/semantic-enrichment.js +2 -0
  261. package/dist/ports/semantic-enrichment.js.map +1 -0
  262. package/dist/version.d.ts.map +1 -1
  263. package/dist/version.js +3 -1
  264. package/dist/version.js.map +1 -1
  265. package/dist/warp/ast-import-resolver.d.ts.map +1 -1
  266. package/dist/warp/ast-import-resolver.js +2 -1
  267. package/dist/warp/ast-import-resolver.js.map +1 -1
  268. package/dist/warp/dead-symbols.d.ts.map +1 -1
  269. package/dist/warp/dead-symbols.js +4 -7
  270. package/dist/warp/dead-symbols.js.map +1 -1
  271. package/dist/warp/index-head.d.ts +4 -0
  272. package/dist/warp/index-head.d.ts.map +1 -1
  273. package/dist/warp/index-head.js +255 -22
  274. package/dist/warp/index-head.js.map +1 -1
  275. package/dist/warp/observers.d.ts.map +1 -1
  276. package/dist/warp/observers.js +3 -2
  277. package/dist/warp/observers.js.map +1 -1
  278. package/dist/warp/refactor-difficulty.d.ts.map +1 -1
  279. package/dist/warp/refactor-difficulty.js +4 -9
  280. package/dist/warp/refactor-difficulty.js.map +1 -1
  281. package/dist/warp/references.d.ts.map +1 -1
  282. package/dist/warp/references.js +2 -1
  283. package/dist/warp/references.js.map +1 -1
  284. package/dist/warp/semantic-enrichment.d.ts +14 -0
  285. package/dist/warp/semantic-enrichment.d.ts.map +1 -0
  286. package/dist/warp/semantic-enrichment.js +55 -0
  287. package/dist/warp/semantic-enrichment.js.map +1 -0
  288. package/dist/warp/structural-queries.d.ts.map +1 -1
  289. package/dist/warp/structural-queries.js +7 -14
  290. package/dist/warp/structural-queries.js.map +1 -1
  291. package/dist/warp/sym-id-codec.d.ts +14 -0
  292. package/dist/warp/sym-id-codec.d.ts.map +1 -0
  293. package/dist/warp/sym-id-codec.js +47 -0
  294. package/dist/warp/sym-id-codec.js.map +1 -0
  295. package/dist/warp/symbol-timeline.d.ts.map +1 -1
  296. package/dist/warp/symbol-timeline.js +6 -14
  297. package/dist/warp/symbol-timeline.js.map +1 -1
  298. package/dist/warp/warp-structural-churn.d.ts.map +1 -1
  299. package/dist/warp/warp-structural-churn.js +6 -10
  300. package/dist/warp/warp-structural-churn.js.map +1 -1
  301. package/dist/warp/warp-structural-log.d.ts.map +1 -1
  302. package/dist/warp/warp-structural-log.js +8 -10
  303. package/dist/warp/warp-structural-log.js.map +1 -1
  304. package/docs/CLI.md +63 -5
  305. package/docs/MCP.md +2 -1
  306. package/docs/SETUP.md +11 -7
  307. package/package.json +12 -4
  308. package/src/adapters/canonical-json.ts +0 -56
  309. package/src/adapters/json-text-decoder.ts +0 -11
  310. package/src/adapters/node-fs.ts +0 -43
  311. package/src/adapters/node-git.ts +0 -47
  312. package/src/adapters/node-paths.ts +0 -35
  313. package/src/adapters/node-process-runner.ts +0 -27
  314. package/src/adapters/repo-paths.ts +0 -63
  315. package/src/adapters/rotating-ndjson-log.ts +0 -66
  316. package/src/api/index.ts +0 -107
  317. package/src/api/repo-local-graft.ts +0 -21
  318. package/src/api/repo-workspace.ts +0 -34
  319. package/src/api/tool-bridge.ts +0 -22
  320. package/src/cli/activity-render.ts +0 -112
  321. package/src/cli/cli-error.ts +0 -192
  322. package/src/cli/command-parser.ts +0 -484
  323. package/src/cli/daemon-status-model.ts +0 -238
  324. package/src/cli/daemon-status-render.ts +0 -102
  325. package/src/cli/daemon-status.ts +0 -100
  326. package/src/cli/entrypoint.ts +0 -18
  327. package/src/cli/git-graft-enhance-model.ts +0 -131
  328. package/src/cli/git-graft-enhance-render.ts +0 -33
  329. package/src/cli/git-graft-enhance.ts +0 -54
  330. package/src/cli/index-cmd.ts +0 -90
  331. package/src/cli/index-model.ts +0 -75
  332. package/src/cli/init-bootstrap.ts +0 -47
  333. package/src/cli/init-client-config.ts +0 -428
  334. package/src/cli/init-model.ts +0 -284
  335. package/src/cli/init-render.ts +0 -54
  336. package/src/cli/init-target-hooks.ts +0 -93
  337. package/src/cli/init.ts +0 -124
  338. package/src/cli/json-document.ts +0 -155
  339. package/src/cli/local-history-dag-model.ts +0 -437
  340. package/src/cli/local-history-dag-render.ts +0 -133
  341. package/src/cli/local-history-dag.ts +0 -103
  342. package/src/cli/main.ts +0 -197
  343. package/src/cli/migrate-local-history.ts +0 -119
  344. package/src/cli/peer-command.ts +0 -60
  345. package/src/contracts/capabilities.ts +0 -540
  346. package/src/contracts/causal-ontology.ts +0 -627
  347. package/src/contracts/causal-surface-next-action.ts +0 -18
  348. package/src/contracts/json-object.ts +0 -18
  349. package/src/contracts/mcp-runtime.ts +0 -16
  350. package/src/contracts/output-schema-cli.ts +0 -103
  351. package/src/contracts/output-schema-fragments.ts +0 -881
  352. package/src/contracts/output-schema-mcp.ts +0 -501
  353. package/src/contracts/output-schema-meta.ts +0 -119
  354. package/src/contracts/output-schemas.ts +0 -1524
  355. package/src/git/diff.ts +0 -161
  356. package/src/git/target-git-hook-bootstrap.ts +0 -56
  357. package/src/guards/stream-boundary.ts +0 -110
  358. package/src/hooks/posttooluse-read.ts +0 -54
  359. package/src/hooks/pretooluse-read.ts +0 -52
  360. package/src/hooks/read-governor.ts +0 -95
  361. package/src/hooks/read-messages.ts +0 -53
  362. package/src/hooks/shared.ts +0 -168
  363. package/src/index.ts +0 -1
  364. package/src/mcp/burden.ts +0 -132
  365. package/src/mcp/cache.ts +0 -7
  366. package/src/mcp/cached-file.ts +0 -1
  367. package/src/mcp/context.ts +0 -150
  368. package/src/mcp/control-plane/authz-storage.ts +0 -129
  369. package/src/mcp/control-plane/session-registry.ts +0 -115
  370. package/src/mcp/control-plane/status-projection.ts +0 -76
  371. package/src/mcp/control-plane/types.ts +0 -144
  372. package/src/mcp/daemon-bootstrap.ts +0 -100
  373. package/src/mcp/daemon-control-plane.ts +0 -310
  374. package/src/mcp/daemon-job-scheduler.ts +0 -279
  375. package/src/mcp/daemon-repos.ts +0 -99
  376. package/src/mcp/daemon-server.ts +0 -172
  377. package/src/mcp/daemon-session-host.ts +0 -234
  378. package/src/mcp/daemon-stdio-bridge.ts +0 -262
  379. package/src/mcp/daemon-worker-child-pool.ts +0 -213
  380. package/src/mcp/daemon-worker-inline-pool.ts +0 -46
  381. package/src/mcp/daemon-worker-pool.ts +0 -7
  382. package/src/mcp/daemon-worker-process.ts +0 -52
  383. package/src/mcp/daemon-worker-types.ts +0 -66
  384. package/src/mcp/metrics.ts +0 -176
  385. package/src/mcp/monitor-health.ts +0 -83
  386. package/src/mcp/monitor-persistence.ts +0 -54
  387. package/src/mcp/monitor-tick-job.ts +0 -153
  388. package/src/mcp/monitor-types.ts +0 -103
  389. package/src/mcp/persisted-local-history-graph.ts +0 -592
  390. package/src/mcp/persisted-local-history-policy.ts +0 -501
  391. package/src/mcp/persisted-local-history-views.ts +0 -250
  392. package/src/mcp/persisted-local-history.ts +0 -1621
  393. package/src/mcp/persistent-monitor-runtime.ts +0 -482
  394. package/src/mcp/policy.ts +0 -75
  395. package/src/mcp/receipt.ts +0 -201
  396. package/src/mcp/repo-concurrency.ts +0 -392
  397. package/src/mcp/repo-overview/filter.ts +0 -44
  398. package/src/mcp/repo-overview/types.ts +0 -63
  399. package/src/mcp/repo-overview/view-projection.ts +0 -90
  400. package/src/mcp/repo-state-git.ts +0 -247
  401. package/src/mcp/repo-state-observation.ts +0 -203
  402. package/src/mcp/repo-state-transition.ts +0 -151
  403. package/src/mcp/repo-state-types.ts +0 -107
  404. package/src/mcp/repo-state.ts +0 -146
  405. package/src/mcp/repo-tool-job.ts +0 -102
  406. package/src/mcp/repo-tool-worker-context.ts +0 -215
  407. package/src/mcp/repo-workspace.ts +0 -21
  408. package/src/mcp/run-capture-config.ts +0 -33
  409. package/src/mcp/runtime-causal-context.ts +0 -72
  410. package/src/mcp/runtime-observability.ts +0 -217
  411. package/src/mcp/runtime-staged-target.ts +0 -161
  412. package/src/mcp/runtime-workspace-overlay.ts +0 -255
  413. package/src/mcp/secret-scrub.ts +0 -89
  414. package/src/mcp/semantic-transition-guidance.ts +0 -60
  415. package/src/mcp/semantic-transition-summary.ts +0 -130
  416. package/src/mcp/server-context.ts +0 -236
  417. package/src/mcp/server-invocation.ts +0 -388
  418. package/src/mcp/server-tool-access.ts +0 -148
  419. package/src/mcp/server.ts +0 -270
  420. package/src/mcp/stdio-server.ts +0 -26
  421. package/src/mcp/stdio.ts +0 -3
  422. package/src/mcp/tool-registry.ts +0 -98
  423. package/src/mcp/tools/activity-view.ts +0 -325
  424. package/src/mcp/tools/budget.ts +0 -23
  425. package/src/mcp/tools/causal-attach.ts +0 -67
  426. package/src/mcp/tools/causal-status.ts +0 -58
  427. package/src/mcp/tools/changed-since.ts +0 -71
  428. package/src/mcp/tools/code-find.ts +0 -192
  429. package/src/mcp/tools/code-refs.ts +0 -470
  430. package/src/mcp/tools/code-show.ts +0 -289
  431. package/src/mcp/tools/daemon-monitors.ts +0 -14
  432. package/src/mcp/tools/daemon-repos.ts +0 -22
  433. package/src/mcp/tools/daemon-sessions.ts +0 -14
  434. package/src/mcp/tools/daemon-status.ts +0 -12
  435. package/src/mcp/tools/diagnostic-models.ts +0 -97
  436. package/src/mcp/tools/doctor.ts +0 -83
  437. package/src/mcp/tools/explain.ts +0 -84
  438. package/src/mcp/tools/export-surface-diff.ts +0 -26
  439. package/src/mcp/tools/file-outline.ts +0 -67
  440. package/src/mcp/tools/git-files.ts +0 -73
  441. package/src/mcp/tools/graft-diff.ts +0 -35
  442. package/src/mcp/tools/graft-edit.ts +0 -276
  443. package/src/mcp/tools/knowledge-map.ts +0 -34
  444. package/src/mcp/tools/map-collector.ts +0 -338
  445. package/src/mcp/tools/map.ts +0 -185
  446. package/src/mcp/tools/monitor-nudge.ts +0 -19
  447. package/src/mcp/tools/monitor-pause.ts +0 -18
  448. package/src/mcp/tools/monitor-resume.ts +0 -18
  449. package/src/mcp/tools/monitor-start.ts +0 -20
  450. package/src/mcp/tools/monitor-stop.ts +0 -18
  451. package/src/mcp/tools/precision-live.ts +0 -158
  452. package/src/mcp/tools/precision-match.ts +0 -54
  453. package/src/mcp/tools/precision-paths.ts +0 -59
  454. package/src/mcp/tools/precision-query.ts +0 -127
  455. package/src/mcp/tools/precision-show.ts +0 -86
  456. package/src/mcp/tools/precision-visibility.ts +0 -44
  457. package/src/mcp/tools/precision-warp.ts +0 -101
  458. package/src/mcp/tools/precision.ts +0 -21
  459. package/src/mcp/tools/read-range.ts +0 -28
  460. package/src/mcp/tools/refactor-difficulty.ts +0 -42
  461. package/src/mcp/tools/run-capture.ts +0 -149
  462. package/src/mcp/tools/safe-read.ts +0 -148
  463. package/src/mcp/tools/since.ts +0 -53
  464. package/src/mcp/tools/state.ts +0 -39
  465. package/src/mcp/tools/stats.ts +0 -24
  466. package/src/mcp/tools/structural-blame.ts +0 -55
  467. package/src/mcp/tools/structural-churn.ts +0 -28
  468. package/src/mcp/tools/structural-log.ts +0 -41
  469. package/src/mcp/tools/structural-review.ts +0 -63
  470. package/src/mcp/tools/workspace-authorizations.ts +0 -14
  471. package/src/mcp/tools/workspace-authorize.ts +0 -20
  472. package/src/mcp/tools/workspace-bind.ts +0 -25
  473. package/src/mcp/tools/workspace-rebind.ts +0 -25
  474. package/src/mcp/tools/workspace-revoke.ts +0 -18
  475. package/src/mcp/tools/workspace-status.ts +0 -12
  476. package/src/mcp/warp-pool.ts +0 -36
  477. package/src/mcp/workspace-read-observation-model.ts +0 -48
  478. package/src/mcp/workspace-read-observation.ts +0 -103
  479. package/src/mcp/workspace-router-capability.ts +0 -32
  480. package/src/mcp/workspace-router-history.ts +0 -233
  481. package/src/mcp/workspace-router-model.ts +0 -131
  482. package/src/mcp/workspace-router-resolution.ts +0 -71
  483. package/src/mcp/workspace-router-runtime.ts +0 -246
  484. package/src/mcp/workspace-router.ts +0 -688
  485. package/src/metrics/logger.ts +0 -40
  486. package/src/metrics/types.ts +0 -40
  487. package/src/operations/adaptive-projection.ts +0 -54
  488. package/src/operations/agent-handoff.ts +0 -59
  489. package/src/operations/cached-file.ts +0 -40
  490. package/src/operations/capture-range.ts +0 -64
  491. package/src/operations/conversation-primer.ts +0 -82
  492. package/src/operations/cross-session-resume.ts +0 -104
  493. package/src/operations/deterministic-replay.ts +0 -143
  494. package/src/operations/diff-identity.ts +0 -127
  495. package/src/operations/export-surface-diff.ts +0 -355
  496. package/src/operations/file-outline.ts +0 -48
  497. package/src/operations/footprint-parallelism.ts +0 -98
  498. package/src/operations/graft-diff.ts +0 -169
  499. package/src/operations/horizon-of-readability.ts +0 -60
  500. package/src/operations/import-reference-impact.ts +0 -143
  501. package/src/operations/knowledge-map.ts +0 -96
  502. package/src/operations/observation-cache.ts +0 -165
  503. package/src/operations/projection-safety.ts +0 -111
  504. package/src/operations/read-range.ts +0 -64
  505. package/src/operations/repo-workspace.ts +0 -339
  506. package/src/operations/result-dto.ts +0 -23
  507. package/src/operations/safe-read.ts +0 -118
  508. package/src/operations/semantic-drift.ts +0 -70
  509. package/src/operations/session-filtration.ts +0 -76
  510. package/src/operations/session-replay.ts +0 -73
  511. package/src/operations/sludge-detector.ts +0 -356
  512. package/src/operations/state.ts +0 -66
  513. package/src/operations/structural-blame.ts +0 -197
  514. package/src/operations/structural-review.ts +0 -317
  515. package/src/operations/structured-buffer-compare.ts +0 -429
  516. package/src/operations/structured-buffer-model.ts +0 -456
  517. package/src/operations/structured-buffer-query.ts +0 -794
  518. package/src/operations/structured-buffer.ts +0 -181
  519. package/src/operations/teaching-hints.ts +0 -52
  520. package/src/parser/diff.ts +0 -320
  521. package/src/parser/lang.ts +0 -71
  522. package/src/parser/markdown.ts +0 -197
  523. package/src/parser/outline.ts +0 -316
  524. package/src/parser/runtime.ts +0 -71
  525. package/src/parser/types.ts +0 -75
  526. package/src/policy/evaluate.ts +0 -178
  527. package/src/policy/graftignore.ts +0 -6
  528. package/src/policy/types.ts +0 -87
  529. package/src/ports/codec.ts +0 -13
  530. package/src/ports/filesystem.ts +0 -18
  531. package/src/ports/git.ts +0 -16
  532. package/src/ports/guards.ts +0 -68
  533. package/src/ports/paths.ts +0 -22
  534. package/src/ports/process-runner.ts +0 -22
  535. package/src/release/security-gate.ts +0 -102
  536. package/src/session/tracker.ts +0 -145
  537. package/src/session/types.ts +0 -23
  538. package/src/version.ts +0 -3
  539. package/src/warp/ast-emitter.ts +0 -133
  540. package/src/warp/ast-import-resolver.ts +0 -333
  541. package/src/warp/commit-meta.ts +0 -19
  542. package/src/warp/context.ts +0 -48
  543. package/src/warp/dead-symbols.ts +0 -174
  544. package/src/warp/drift-sentinel.ts +0 -101
  545. package/src/warp/index-head.ts +0 -348
  546. package/src/warp/observers.ts +0 -101
  547. package/src/warp/open.ts +0 -67
  548. package/src/warp/outline-diff-trailer.ts +0 -100
  549. package/src/warp/plumbing.d.ts +0 -24
  550. package/src/warp/refactor-difficulty.ts +0 -257
  551. package/src/warp/references.ts +0 -77
  552. package/src/warp/stale-docs.ts +0 -210
  553. package/src/warp/structural-drift-detection.ts +0 -97
  554. package/src/warp/structural-queries.ts +0 -258
  555. package/src/warp/symbol-timeline.ts +0 -209
  556. package/src/warp/traverse-hydrate.ts +0 -61
  557. package/src/warp/warp-reference-count.ts +0 -47
  558. package/src/warp/warp-structural-blame.ts +0 -65
  559. package/src/warp/warp-structural-churn.ts +0 -309
  560. package/src/warp/warp-structural-log.ts +0 -149
  561. package/src/warp/writer-id.ts +0 -30
@@ -1,201 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // Receipt builder — attaches decision metadata to every tool response
3
- // ---------------------------------------------------------------------------
4
-
5
- import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
6
- import type { MetricsSnapshot } from "./metrics.js";
7
- import type { Tripwire } from "../session/types.js";
8
- import type { JsonCodec } from "../ports/codec.js";
9
- import { attachMcpSchemaMeta, type McpToolName } from "../contracts/output-schemas.js";
10
- import {
11
- burdenKindForTool,
12
- isNonReadBurdenKind,
13
- projectBurdenByKind,
14
- totalNonReadBytesReturned,
15
- type BurdenByKind,
16
- type BurdenKind,
17
- } from "./burden.js";
18
-
19
- export type McpToolResult = CallToolResult;
20
-
21
- export interface ReceiptBudget {
22
- readonly total: number;
23
- readonly consumed: number;
24
- readonly remaining: number;
25
- readonly fraction: number;
26
- }
27
-
28
- export interface ReceiptCumulative {
29
- readonly reads: number;
30
- readonly outlines: number;
31
- readonly refusals: number;
32
- readonly cacheHits: number;
33
- readonly bytesReturned: number;
34
- readonly bytesAvoided: number;
35
- readonly nonReadBytesReturned: number;
36
- readonly burdenByKind: Readonly<BurdenByKind>;
37
- }
38
-
39
- export interface ReceiptBurden {
40
- readonly kind: BurdenKind;
41
- readonly nonRead: boolean;
42
- }
43
-
44
- export interface McpToolReceipt {
45
- readonly sessionId: string;
46
- readonly traceId: string;
47
- readonly seq: number;
48
- readonly ts: string;
49
- readonly tool: McpToolName;
50
- readonly projection: string;
51
- readonly reason: string;
52
- readonly latencyMs: number;
53
- readonly fileBytes: number | null;
54
- readonly returnedBytes: number;
55
- readonly burden: ReceiptBurden;
56
- readonly cumulative: ReceiptCumulative;
57
- readonly budget?: ReceiptBudget;
58
- readonly compressionRatio?: number | null;
59
- }
60
-
61
- export interface ReceiptDeps {
62
- readonly sessionId: string;
63
- readonly traceId: string;
64
- readonly seq: number;
65
- readonly latencyMs: number;
66
- readonly metrics: MetricsSnapshot;
67
- readonly tripwires: Tripwire[];
68
- readonly codec: JsonCodec;
69
- readonly budget?: ReceiptBudget | null;
70
- }
71
-
72
- /** Mutable draft used internally during the size-stabilization loop. */
73
- interface ReceiptDraft {
74
- sessionId: string;
75
- traceId: string;
76
- seq: number;
77
- ts: string;
78
- tool: McpToolName;
79
- projection: string;
80
- reason: string;
81
- latencyMs: number;
82
- fileBytes: number | null;
83
- returnedBytes: number;
84
- burden: ReceiptBurden;
85
- cumulative: {
86
- reads: number;
87
- outlines: number;
88
- refusals: number;
89
- cacheHits: number;
90
- bytesReturned: number;
91
- bytesAvoided: number;
92
- nonReadBytesReturned: number;
93
- burdenByKind: Readonly<BurdenByKind>;
94
- };
95
- budget?: ReceiptBudget;
96
- compressionRatio?: number | null;
97
- }
98
-
99
- function extractProjection(data: Record<string, unknown>): string {
100
- if (typeof data["projection"] === "string") return data["projection"];
101
- return "none";
102
- }
103
-
104
- function extractReason(data: Record<string, unknown>): string {
105
- if (typeof data["reason"] === "string") return data["reason"];
106
- return "none";
107
- }
108
-
109
- function extractFileBytes(data: Record<string, unknown>): number | null {
110
- const actual = data["actual"];
111
- if (actual !== null && typeof actual === "object" && "bytes" in actual) {
112
- const bytes = (actual as { bytes: unknown }).bytes;
113
- if (typeof bytes === "number") return bytes;
114
- }
115
- return null;
116
- }
117
-
118
- function freezeReceipt(draft: ReceiptDraft): McpToolReceipt {
119
- Object.freeze(draft.burden);
120
- Object.freeze(draft.cumulative);
121
- Object.freeze(draft);
122
- return draft as McpToolReceipt;
123
- }
124
-
125
- /**
126
- * Build a tool response with an attached receipt.
127
- * Returns the finalized MCP result and the byte count of the serialized text
128
- * so the caller can feed it back into cumulative metrics.
129
- */
130
- export function buildReceiptResult(
131
- tool: McpToolName,
132
- data: Record<string, unknown>,
133
- deps: ReceiptDeps,
134
- ): { result: McpToolResult; textBytes: number; receipt: McpToolReceipt } {
135
- const burdenKind = burdenKindForTool(tool);
136
-
137
- const draft: ReceiptDraft = {
138
- sessionId: deps.sessionId,
139
- traceId: deps.traceId,
140
- seq: deps.seq,
141
- ts: new Date().toISOString(),
142
- tool,
143
- projection: extractProjection(data),
144
- reason: extractReason(data),
145
- latencyMs: deps.latencyMs,
146
- fileBytes: extractFileBytes(data),
147
- returnedBytes: 0,
148
- burden: {
149
- kind: burdenKind,
150
- nonRead: isNonReadBurdenKind(burdenKind),
151
- },
152
- cumulative: {
153
- reads: deps.metrics.reads,
154
- outlines: deps.metrics.outlines,
155
- refusals: deps.metrics.refusals,
156
- cacheHits: deps.metrics.cacheHits,
157
- bytesReturned: 0,
158
- bytesAvoided: deps.metrics.bytesAvoided,
159
- nonReadBytesReturned: totalNonReadBytesReturned(deps.metrics.burdenByKind),
160
- burdenByKind: deps.metrics.burdenByKind,
161
- },
162
- };
163
-
164
- if (deps.budget != null) {
165
- draft.budget = deps.budget;
166
- }
167
-
168
- const fullData: Record<string, unknown> & { tripwire?: Tripwire[] } = attachMcpSchemaMeta(tool, {
169
- ...data,
170
- _receipt: draft,
171
- });
172
- if (deps.tripwires.length > 0) {
173
- fullData.tripwire = deps.tripwires;
174
- }
175
-
176
- // Stabilize self-referential size fields (use UTF-8 byte length, not char count)
177
- let prev = 0;
178
- let text = "";
179
- for (let i = 0; i < 5; i++) {
180
- text = deps.codec.encode(fullData);
181
- const byteLen = Buffer.byteLength(text, "utf8");
182
- if (byteLen === prev) break;
183
- prev = byteLen;
184
- draft.returnedBytes = byteLen;
185
- const burdenByKind = projectBurdenByKind(deps.metrics.burdenByKind, tool, byteLen);
186
- draft.compressionRatio = draft.fileBytes !== null && draft.fileBytes > 0
187
- ? Math.round((byteLen / draft.fileBytes) * 1000) / 1000
188
- : null;
189
- draft.cumulative.bytesReturned = deps.metrics.bytesReturned + byteLen;
190
- draft.cumulative.nonReadBytesReturned = totalNonReadBytesReturned(burdenByKind);
191
- draft.cumulative.burdenByKind = burdenByKind;
192
- }
193
-
194
- const receipt = freezeReceipt(draft);
195
-
196
- return {
197
- result: { content: [{ type: "text", text }] },
198
- textBytes: Buffer.byteLength(text, "utf8"),
199
- receipt,
200
- };
201
- }
@@ -1,392 +0,0 @@
1
- import type {
2
- AttributionSummary,
3
- CausalEvent,
4
- RepoConcurrencyAuthority,
5
- RepoConcurrencyPosture,
6
- } from "../contracts/causal-ontology.js";
7
-
8
- export interface RepoConcurrencyTouch {
9
- readonly contributorKey: string;
10
- readonly path: string;
11
- }
12
-
13
- export interface RepoConcurrencyWorktreeHistory {
14
- readonly worktreeId: string;
15
- readonly active: boolean;
16
- readonly checkoutEpochId: string | null;
17
- readonly causalSessionIds: readonly string[];
18
- readonly actorIds: readonly string[];
19
- readonly contributorKeys: readonly string[];
20
- readonly explicitHandoff: boolean;
21
- readonly touches: readonly RepoConcurrencyTouch[];
22
- }
23
-
24
- export interface RepoConcurrencySummary {
25
- readonly posture: RepoConcurrencyPosture;
26
- readonly authority: RepoConcurrencyAuthority;
27
- readonly observedWorktreeCount: number;
28
- readonly observedCausalSessionCount: number;
29
- readonly observedActorCount: number;
30
- readonly overlappingPathCount: number;
31
- readonly summary: string;
32
- readonly daemonSessionLiveness?: RepoConcurrencyDaemonSessionLiveness;
33
- }
34
-
35
- export interface RepoConcurrencyDaemonSessionLiveness {
36
- readonly idleTimeoutMs: number;
37
- readonly liveSessionCount: number;
38
- readonly staleSessionCount: number;
39
- }
40
-
41
- interface RepoConcurrencyInput {
42
- readonly currentWorktreeId: string;
43
- readonly histories: readonly RepoConcurrencyWorktreeHistory[];
44
- }
45
-
46
- export interface RepoConcurrencyLiveSession {
47
- readonly bindState: "bound" | "unbound";
48
- readonly repoId: string | null;
49
- readonly worktreeId: string | null;
50
- readonly causalSessionId: string | null;
51
- readonly checkoutEpochId: string | null;
52
- readonly lastActivityAt: string;
53
- }
54
-
55
- export const DEFAULT_DAEMON_SESSION_IDLE_TIMEOUT_MS = 5 * 60 * 1000;
56
-
57
- function countOverlapPaths(touches: readonly RepoConcurrencyTouch[]): number {
58
- const contributorsByPath = new Map<string, Set<string>>();
59
- for (const touch of touches) {
60
- const existing = contributorsByPath.get(touch.path) ?? new Set<string>();
61
- existing.add(touch.contributorKey);
62
- contributorsByPath.set(touch.path, existing);
63
- }
64
-
65
- let count = 0;
66
- for (const contributors of contributorsByPath.values()) {
67
- if (contributors.size > 1) {
68
- count += 1;
69
- }
70
- }
71
- return count;
72
- }
73
-
74
- function buildSummary(
75
- posture: RepoConcurrencyPosture,
76
- authority: RepoConcurrencyAuthority,
77
- observedWorktreeCount: number,
78
- observedCausalSessionCount: number,
79
- observedActorCount: number,
80
- overlappingPathCount: number,
81
- summary: string,
82
- ): RepoConcurrencySummary {
83
- return {
84
- posture,
85
- authority,
86
- observedWorktreeCount,
87
- observedCausalSessionCount,
88
- observedActorCount,
89
- overlappingPathCount,
90
- summary,
91
- };
92
- }
93
-
94
- function withObservedCounts(
95
- summary: RepoConcurrencySummary,
96
- input: {
97
- readonly observedWorktreeCount: number;
98
- readonly observedCausalSessionCount: number;
99
- readonly observedActorCount: number;
100
- },
101
- ): RepoConcurrencySummary {
102
- return {
103
- ...summary,
104
- observedWorktreeCount: Math.max(summary.observedWorktreeCount, input.observedWorktreeCount),
105
- observedCausalSessionCount: Math.max(summary.observedCausalSessionCount, input.observedCausalSessionCount),
106
- observedActorCount: Math.max(summary.observedActorCount, input.observedActorCount),
107
- };
108
- }
109
-
110
- function formatDurationMs(durationMs: number): string {
111
- if (durationMs % 60000 === 0) {
112
- const minutes = durationMs / 60000;
113
- return `${String(minutes)} minute${minutes === 1 ? "" : "s"}`;
114
- }
115
- if (durationMs % 1000 === 0) {
116
- const seconds = durationMs / 1000;
117
- return `${String(seconds)} second${seconds === 1 ? "" : "s"}`;
118
- }
119
- return `${String(durationMs)} ms`;
120
- }
121
-
122
- function appendStaleDaemonSessionSummary(
123
- summary: string,
124
- liveness: RepoConcurrencyDaemonSessionLiveness,
125
- ): string {
126
- if (liveness.staleSessionCount === 0) {
127
- return summary;
128
- }
129
- const noun = liveness.staleSessionCount === 1 ? "session" : "sessions";
130
- return `${summary} Excluded ${String(liveness.staleSessionCount)} stale daemon ${noun} idle for longer than ${formatDurationMs(liveness.idleTimeoutMs)}.`;
131
- }
132
-
133
- function withDaemonSessionLiveness(
134
- summary: RepoConcurrencySummary,
135
- liveness: RepoConcurrencyDaemonSessionLiveness,
136
- ): RepoConcurrencySummary {
137
- return {
138
- ...summary,
139
- summary: appendStaleDaemonSessionSummary(summary.summary, liveness),
140
- daemonSessionLiveness: liveness,
141
- };
142
- }
143
-
144
- function isStaleDaemonSession(
145
- session: RepoConcurrencyLiveSession,
146
- nowMs: number,
147
- idleTimeoutMs: number,
148
- ): boolean {
149
- const lastActivityMs = Date.parse(session.lastActivityAt);
150
- if (!Number.isFinite(lastActivityMs)) {
151
- return true;
152
- }
153
- return nowMs - lastActivityMs > idleTimeoutMs;
154
- }
155
-
156
- export function deriveRepoConcurrencySummary(input: RepoConcurrencyInput): RepoConcurrencySummary {
157
- const activeHistories = input.histories.filter((history) => history.active);
158
- const current = activeHistories.find((history) => history.worktreeId === input.currentWorktreeId)
159
- ?? input.histories.find((history) => history.worktreeId === input.currentWorktreeId)
160
- ?? null;
161
-
162
- if (current === null) {
163
- return buildSummary(
164
- "unknown",
165
- "unknown",
166
- 0,
167
- 0,
168
- 0,
169
- 0,
170
- "No lawful same-repo concurrency evidence is available for the current worktree.",
171
- );
172
- }
173
-
174
- const observedWorktreeCount = Math.max(1, new Set(activeHistories.map((history) => history.worktreeId)).size);
175
- const observedCausalSessionCount = new Set(
176
- activeHistories.flatMap((history) => history.causalSessionIds),
177
- ).size;
178
- const observedActorCount = new Set(
179
- activeHistories.flatMap((history) => history.actorIds),
180
- ).size;
181
- const overlappingPathCount = countOverlapPaths(current.touches);
182
- const otherActiveWorktrees = activeHistories.filter((history) => history.worktreeId !== current.worktreeId);
183
-
184
- if (otherActiveWorktrees.some((history) =>
185
- history.checkoutEpochId !== null &&
186
- current.checkoutEpochId !== null &&
187
- history.checkoutEpochId !== current.checkoutEpochId
188
- )) {
189
- return buildSummary(
190
- "divergent_checkout",
191
- "active_history_scan",
192
- observedWorktreeCount,
193
- observedCausalSessionCount,
194
- observedActorCount,
195
- overlappingPathCount,
196
- "Active same-repo work appears to be split across different checkout epochs or branches.",
197
- );
198
- }
199
-
200
- if (current.contributorKeys.length > 1 && overlappingPathCount > 0 && !current.explicitHandoff) {
201
- return buildSummary(
202
- "overlapping_actors",
203
- "footprint_overlap",
204
- observedWorktreeCount,
205
- observedCausalSessionCount,
206
- observedActorCount,
207
- overlappingPathCount,
208
- "Multiple contributors appear to touch overlapping paths in the same live worktree without explicit handoff evidence.",
209
- );
210
- }
211
-
212
- if (current.explicitHandoff && current.contributorKeys.length > 1 && otherActiveWorktrees.length === 0) {
213
- return buildSummary(
214
- "exclusive",
215
- "explicit_handoff",
216
- observedWorktreeCount,
217
- observedCausalSessionCount,
218
- observedActorCount,
219
- overlappingPathCount,
220
- "Explicit attach or handoff evidence keeps the current live worktree on one lawful line of work.",
221
- );
222
- }
223
-
224
- if (current.contributorKeys.length > 1) {
225
- return buildSummary(
226
- "shared_worktree",
227
- "active_history_scan",
228
- observedWorktreeCount,
229
- observedCausalSessionCount,
230
- observedActorCount,
231
- overlappingPathCount,
232
- "Multiple contributors have been observed on the current live worktree, so ownership stays shared rather than exclusive.",
233
- );
234
- }
235
-
236
- if (otherActiveWorktrees.length > 0) {
237
- return buildSummary(
238
- "shared_repo_only",
239
- "repo_identity_only",
240
- observedWorktreeCount,
241
- observedCausalSessionCount,
242
- observedActorCount,
243
- overlappingPathCount,
244
- "Other active worktrees share the same canonical repo identity, but not this live worktree footing.",
245
- );
246
- }
247
-
248
- return buildSummary(
249
- "exclusive",
250
- "active_history_scan",
251
- observedWorktreeCount,
252
- observedCausalSessionCount,
253
- observedActorCount,
254
- overlappingPathCount,
255
- "No other active same-repo worktree or overlapping actor evidence is currently visible.",
256
- );
257
- }
258
-
259
- export function mergeRepoConcurrencySummaryWithLiveSessions(input: {
260
- readonly currentSummary: RepoConcurrencySummary;
261
- readonly currentRepoId: string;
262
- readonly currentWorktreeId: string;
263
- readonly currentCheckoutEpochId: string | null;
264
- readonly sessions: readonly RepoConcurrencyLiveSession[];
265
- readonly nowMs?: number;
266
- readonly sessionIdleTimeoutMs?: number;
267
- }): RepoConcurrencySummary {
268
- const repoSessions = input.sessions.filter((session) =>
269
- session.bindState === "bound" &&
270
- session.repoId === input.currentRepoId &&
271
- session.worktreeId !== null
272
- );
273
-
274
- if (repoSessions.length === 0) {
275
- return input.currentSummary;
276
- }
277
-
278
- const nowMs = input.nowMs ?? Date.now();
279
- const idleTimeoutMs = input.sessionIdleTimeoutMs ?? DEFAULT_DAEMON_SESSION_IDLE_TIMEOUT_MS;
280
- const liveRepoSessions = repoSessions.filter((session) => !isStaleDaemonSession(session, nowMs, idleTimeoutMs));
281
- const liveness: RepoConcurrencyDaemonSessionLiveness = {
282
- idleTimeoutMs,
283
- liveSessionCount: liveRepoSessions.length,
284
- staleSessionCount: repoSessions.length - liveRepoSessions.length,
285
- };
286
-
287
- if (liveRepoSessions.length === 0) {
288
- return withDaemonSessionLiveness(input.currentSummary, liveness);
289
- }
290
-
291
- const observedWorktreeCount = new Set(liveRepoSessions.map((session) => session.worktreeId)).size;
292
- const observedCausalSessionCount = new Set(
293
- liveRepoSessions
294
- .map((session) => session.causalSessionId)
295
- .filter((sessionId): sessionId is string => sessionId !== null),
296
- ).size;
297
- const summaryWithCounts = withDaemonSessionLiveness(
298
- withObservedCounts(input.currentSummary, {
299
- observedWorktreeCount: Math.max(1, observedWorktreeCount),
300
- observedCausalSessionCount,
301
- observedActorCount: input.currentSummary.observedActorCount,
302
- }),
303
- liveness,
304
- );
305
-
306
- const currentWorktreeSessions = liveRepoSessions.filter((session) => session.worktreeId === input.currentWorktreeId);
307
- const otherWorktreeSessions = liveRepoSessions.filter((session) => session.worktreeId !== input.currentWorktreeId);
308
-
309
- if (
310
- otherWorktreeSessions.some((session) =>
311
- session.checkoutEpochId !== null &&
312
- input.currentCheckoutEpochId !== null &&
313
- session.checkoutEpochId !== input.currentCheckoutEpochId
314
- )
315
- ) {
316
- return {
317
- ...summaryWithCounts,
318
- posture: "divergent_checkout",
319
- authority: "daemon_live_sessions",
320
- summary: "Active same-repo daemon sessions are split across different checkout epochs or branches.",
321
- };
322
- }
323
-
324
- if (summaryWithCounts.posture === "overlapping_actors") {
325
- return summaryWithCounts;
326
- }
327
-
328
- if (currentWorktreeSessions.length > 1) {
329
- if (
330
- summaryWithCounts.posture === "exclusive" &&
331
- summaryWithCounts.authority === "explicit_handoff" &&
332
- otherWorktreeSessions.length === 0
333
- ) {
334
- return summaryWithCounts;
335
- }
336
- return {
337
- ...summaryWithCounts,
338
- posture: "shared_worktree",
339
- authority: "daemon_live_sessions",
340
- summary:
341
- "Multiple active daemon sessions share the current live worktree, so ownership stays shared rather than exclusive.",
342
- };
343
- }
344
-
345
- if (otherWorktreeSessions.length > 0) {
346
- return {
347
- ...summaryWithCounts,
348
- posture: "shared_repo_only",
349
- authority: "daemon_live_sessions",
350
- summary: "Other active daemon sessions share the same canonical repo identity, but not this live worktree footing.",
351
- };
352
- }
353
-
354
- return summaryWithCounts;
355
- }
356
-
357
- export function buildRepoConcurrencyContributorKey(input: {
358
- readonly actorId: string | null;
359
- readonly attribution: AttributionSummary;
360
- readonly causalSessionId: string | null;
361
- readonly transportSessionId: string | null;
362
- }): string | null {
363
- if (input.actorId !== null && input.attribution.actor.actorKind !== "unknown") {
364
- return `actor:${input.actorId}`;
365
- }
366
- if (input.causalSessionId !== null) {
367
- return `causal:${input.causalSessionId}`;
368
- }
369
- if (input.transportSessionId !== null) {
370
- return `transport:${input.transportSessionId}`;
371
- }
372
- return null;
373
- }
374
-
375
- export function buildRepoConcurrencyTouches(events: readonly CausalEvent[]): RepoConcurrencyTouch[] {
376
- const touches: RepoConcurrencyTouch[] = [];
377
- for (const event of events) {
378
- const contributorKey = buildRepoConcurrencyContributorKey({
379
- actorId: event.actorId,
380
- attribution: event.attribution,
381
- causalSessionId: event.causalSessionId,
382
- transportSessionId: event.transportSessionId,
383
- });
384
- if (contributorKey === null) {
385
- continue;
386
- }
387
- for (const path of event.footprint.paths) {
388
- touches.push({ contributorKey, path });
389
- }
390
- }
391
- return touches;
392
- }
@@ -1,44 +0,0 @@
1
- import type { AuthorizedWorkspaceRecord } from "../daemon-control-plane.js";
2
- import type { DaemonRepoFilter, DaemonRepoListView, DaemonRepoView } from "./types.js";
3
-
4
- // ---------------------------------------------------------------------------
5
- // Filter normalization
6
- // ---------------------------------------------------------------------------
7
-
8
- export function normalizeFilter(filter: DaemonRepoFilter): DaemonRepoFilter {
9
- const next: { repoId?: string; cwd?: string } = {};
10
- if (typeof filter.repoId === "string" && filter.repoId.trim().length > 0) {
11
- next.repoId = filter.repoId.trim();
12
- }
13
- if (typeof filter.cwd === "string" && filter.cwd.trim().length > 0) {
14
- next.cwd = filter.cwd.trim();
15
- }
16
- return next;
17
- }
18
-
19
- // ---------------------------------------------------------------------------
20
- // Workspace sorting
21
- // ---------------------------------------------------------------------------
22
-
23
- export function sortAuthorizedWorkspaces(
24
- records: readonly AuthorizedWorkspaceRecord[],
25
- ): readonly AuthorizedWorkspaceRecord[] {
26
- return [...records].sort((left, right) => left.worktreeRoot.localeCompare(right.worktreeRoot));
27
- }
28
-
29
- // ---------------------------------------------------------------------------
30
- // Result builders
31
- // ---------------------------------------------------------------------------
32
-
33
- export function buildResult(
34
- filter: DaemonRepoFilter,
35
- repos: readonly DaemonRepoView[],
36
- ): DaemonRepoListView {
37
- if (Object.keys(filter).length === 0) {
38
- return { repos };
39
- }
40
- return {
41
- repos,
42
- filter,
43
- };
44
- }
@@ -1,63 +0,0 @@
1
- import type { DaemonControlPlane } from "../daemon-control-plane.js";
2
- import type {
3
- MonitorHealth,
4
- MonitorLifecycleState,
5
- MonitorWorkerKind,
6
- PersistentMonitorRuntime,
7
- } from "../persistent-monitor-runtime.js";
8
-
9
- // ---------------------------------------------------------------------------
10
- // Filter
11
- // ---------------------------------------------------------------------------
12
-
13
- export interface DaemonRepoFilter {
14
- readonly repoId?: string | undefined;
15
- readonly cwd?: string | undefined;
16
- }
17
-
18
- // ---------------------------------------------------------------------------
19
- // View projections
20
- // ---------------------------------------------------------------------------
21
-
22
- export interface DaemonRepoWorktreeView {
23
- readonly worktreeId: string;
24
- readonly worktreeRoot: string;
25
- readonly activeSessions: number;
26
- readonly lastBoundAt: string | null;
27
- }
28
-
29
- export interface DaemonRepoMonitorView {
30
- readonly workerKind: MonitorWorkerKind;
31
- readonly lifecycleState: MonitorLifecycleState;
32
- readonly health: MonitorHealth;
33
- readonly lastTickAt: string | null;
34
- readonly lastSuccessAt: string | null;
35
- readonly lastError: string | null;
36
- }
37
-
38
- export interface DaemonRepoView {
39
- readonly repoId: string;
40
- readonly gitCommonDir: string;
41
- readonly authorizedWorkspaces: number;
42
- readonly boundSessions: number;
43
- readonly activeWorktrees: number;
44
- readonly backlogCommits: number;
45
- readonly lastBoundAt: string | null;
46
- readonly lastActivityAt: string | null;
47
- readonly monitor: DaemonRepoMonitorView | null;
48
- readonly worktrees: readonly DaemonRepoWorktreeView[];
49
- }
50
-
51
- export interface DaemonRepoListView {
52
- readonly repos: readonly DaemonRepoView[];
53
- readonly filter?: DaemonRepoFilter | undefined;
54
- }
55
-
56
- // ---------------------------------------------------------------------------
57
- // Options
58
- // ---------------------------------------------------------------------------
59
-
60
- export interface DaemonRepoOverviewOptions {
61
- readonly controlPlane: DaemonControlPlane;
62
- readonly monitorRuntime: PersistentMonitorRuntime;
63
- }