@bevel-software/platform-core-backend 0.35.0 → 0.36.1

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 (827) hide show
  1. package/agent-guide/directory-structure.md +1 -1
  2. package/agent-guide/onboarding.md +111 -0
  3. package/agent-guide/start-here.md +1 -0
  4. package/agent-guide/tool-manuals.md +1 -0
  5. package/dist/core/catalog-cache-invalidation.d.ts +2 -2
  6. package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
  7. package/dist/core/compose-embed.d.ts +2 -2
  8. package/dist/core/compose-embed.d.ts.map +1 -1
  9. package/dist/core/compose-embed.js +1 -1
  10. package/dist/core/compose-embed.js.map +1 -1
  11. package/dist/core/core-ports.d.ts +19 -4
  12. package/dist/core/core-ports.d.ts.map +1 -1
  13. package/dist/core/core-ports.js.map +1 -1
  14. package/dist/core/create-core-server.d.ts.map +1 -1
  15. package/dist/core/create-core-server.js +26 -24
  16. package/dist/core/create-core-server.js.map +1 -1
  17. package/dist/core/create-core-services.d.ts +19 -13
  18. package/dist/core/create-core-services.d.ts.map +1 -1
  19. package/dist/core/create-core-services.js +68 -56
  20. package/dist/core/create-core-services.js.map +1 -1
  21. package/dist/core/lifecycle.d.ts +4 -4
  22. package/dist/core/lifecycle.d.ts.map +1 -1
  23. package/dist/core/lifecycle.js +5 -5
  24. package/dist/core/lifecycle.js.map +1 -1
  25. package/dist/core-config.d.ts +2 -2
  26. package/dist/core-config.js +3 -3
  27. package/dist/core-config.js.map +1 -1
  28. package/dist/index.d.ts +4 -4
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +3 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/modules/access/access-control.service.js +1 -1
  33. package/dist/modules/access/access-control.service.js.map +1 -1
  34. package/dist/modules/access/access-declarations.d.ts +2 -2
  35. package/dist/modules/access/access-declarations.d.ts.map +1 -1
  36. package/dist/modules/access/access-declarations.js +2 -2
  37. package/dist/modules/access/access-declarations.js.map +1 -1
  38. package/dist/modules/access/access-mutation.service.d.ts +2 -2
  39. package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
  40. package/dist/modules/access/access-mutation.service.js +2 -2
  41. package/dist/modules/access/access-mutation.service.js.map +1 -1
  42. package/dist/modules/access/access-requests.routes.d.ts +2 -2
  43. package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
  44. package/dist/modules/access/access-requests.routes.js +5 -5
  45. package/dist/modules/access/access-requests.routes.js.map +1 -1
  46. package/dist/modules/access/access-requests.service.d.ts +2 -2
  47. package/dist/modules/access/access-requests.service.d.ts.map +1 -1
  48. package/dist/modules/access/access-requests.service.js +11 -11
  49. package/dist/modules/access/access-requests.service.js.map +1 -1
  50. package/dist/modules/access/access.routes.d.ts +2 -2
  51. package/dist/modules/access/access.routes.d.ts.map +1 -1
  52. package/dist/modules/access/access.routes.js +9 -9
  53. package/dist/modules/access/access.routes.js.map +1 -1
  54. package/dist/modules/access/admin-locked-commit.d.ts +5 -5
  55. package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
  56. package/dist/modules/access/admin-locked-commit.js +7 -7
  57. package/dist/modules/access/admin-locked-commit.js.map +1 -1
  58. package/dist/modules/access/admin-route-helpers.d.ts +1 -1
  59. package/dist/modules/access/admin-route-helpers.js +5 -5
  60. package/dist/modules/access/admin-route-helpers.js.map +1 -1
  61. package/dist/modules/access/change-read-gate.d.ts +1 -1
  62. package/dist/modules/access/change-read-gate.js +1 -1
  63. package/dist/modules/access/groups-admin.service.d.ts +7 -7
  64. package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
  65. package/dist/modules/access/groups-admin.service.js +6 -6
  66. package/dist/modules/access/groups-admin.service.js.map +1 -1
  67. package/dist/modules/access/reference-scan.d.ts +1 -1
  68. package/dist/modules/access/roles-admin.service.d.ts +7 -7
  69. package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
  70. package/dist/modules/access/roles-admin.service.js +8 -8
  71. package/dist/modules/access/roles-admin.service.js.map +1 -1
  72. package/dist/modules/access/synced-groups-committer.d.ts +4 -4
  73. package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
  74. package/dist/modules/access/synced-groups-committer.js +7 -7
  75. package/dist/modules/access/synced-groups-committer.js.map +1 -1
  76. package/dist/modules/access/user-access-removal.service.d.ts +6 -6
  77. package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
  78. package/dist/modules/access/user-access-removal.service.js +4 -4
  79. package/dist/modules/access/user-access-removal.service.js.map +1 -1
  80. package/dist/modules/access-model/access-errors.d.ts +4 -4
  81. package/dist/modules/access-model/access-errors.d.ts.map +1 -1
  82. package/dist/modules/access-model/access-errors.js +4 -4
  83. package/dist/modules/access-model/access-errors.js.map +1 -1
  84. package/dist/modules/access-model/access-grammar.d.ts +1 -1
  85. package/dist/modules/access-model/access-grammar.js +4 -4
  86. package/dist/modules/access-model/change-gate.d.ts +1 -1
  87. package/dist/modules/access-model/change-gate.js +1 -1
  88. package/dist/modules/access-model/roles-yaml-guard.d.ts +4 -4
  89. package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
  90. package/dist/modules/access-model/roles-yaml-guard.js +4 -4
  91. package/dist/modules/access-model/roles-yaml-guard.js.map +1 -1
  92. package/dist/modules/agent-guide/agent-guide.d.ts +19 -14
  93. package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
  94. package/dist/modules/agent-guide/agent-guide.js +42 -18
  95. package/dist/modules/agent-guide/agent-guide.js.map +1 -1
  96. package/dist/modules/agent-guide/guide-budget.d.ts +5 -2
  97. package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -1
  98. package/dist/modules/agent-guide/guide-budget.js +6 -2
  99. package/dist/modules/agent-guide/guide-budget.js.map +1 -1
  100. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +12 -5
  101. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
  102. package/dist/modules/agent-instructions/agent-instructions.routes.js +13 -6
  103. package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
  104. package/dist/modules/agent-instructions/compose.d.ts +15 -8
  105. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  106. package/dist/modules/agent-instructions/compose.js +24 -10
  107. package/dist/modules/agent-instructions/compose.js.map +1 -1
  108. package/dist/modules/agent-instructions/shared-file-rules.d.ts +14 -6
  109. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
  110. package/dist/modules/agent-instructions/shared-file-rules.js +51 -11
  111. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  112. package/dist/modules/auth/account-erasure.service.d.ts +36 -7
  113. package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
  114. package/dist/modules/auth/account-erasure.service.js +30 -10
  115. package/dist/modules/auth/account-erasure.service.js.map +1 -1
  116. package/dist/modules/auth/account-hooks.d.ts +20 -0
  117. package/dist/modules/auth/account-hooks.d.ts.map +1 -1
  118. package/dist/modules/auth/account-hooks.js +10 -0
  119. package/dist/modules/auth/account-hooks.js.map +1 -1
  120. package/dist/modules/auth/account-switch-lock.js +2 -2
  121. package/dist/modules/auth/account-switch-lock.js.map +1 -1
  122. package/dist/modules/auth/account.routes.d.ts +7 -2
  123. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  124. package/dist/modules/auth/account.routes.js +23 -4
  125. package/dist/modules/auth/account.routes.js.map +1 -1
  126. package/dist/modules/auth/auth.service.d.ts +1 -1
  127. package/dist/modules/auth/auth.service.js +4 -4
  128. package/dist/modules/auth/auth.service.js.map +1 -1
  129. package/dist/modules/auth/index.d.ts +1 -0
  130. package/dist/modules/auth/index.d.ts.map +1 -1
  131. package/dist/modules/database/core-schema.js +2 -2
  132. package/dist/modules/database/core-schema.js.map +1 -1
  133. package/dist/modules/diff/diff.routes.d.ts +3 -3
  134. package/dist/modules/diff/diff.routes.d.ts.map +1 -1
  135. package/dist/modules/diff/diff.routes.js +7 -7
  136. package/dist/modules/diff/diff.routes.js.map +1 -1
  137. package/dist/modules/embed/embed.routes.js +1 -1
  138. package/dist/modules/embed/embed.routes.js.map +1 -1
  139. package/dist/modules/embed/embed.service.d.ts +4 -4
  140. package/dist/modules/embed/embed.service.d.ts.map +1 -1
  141. package/dist/modules/embed/embed.service.js +18 -18
  142. package/dist/modules/embed/embed.service.js.map +1 -1
  143. package/dist/modules/kb-fs/branch-name.js +8 -8
  144. package/dist/modules/kb-fs/branch-name.js.map +1 -1
  145. package/dist/modules/kb-fs/file-change-notifier.d.ts +2 -2
  146. package/dist/modules/kb-fs/locking-filesystem.d.ts +9 -9
  147. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  148. package/dist/modules/kb-fs/locking-filesystem.js +27 -27
  149. package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
  150. package/dist/modules/kb-fs/repo-path.js +5 -5
  151. package/dist/modules/kb-fs/repo-path.js.map +1 -1
  152. package/dist/modules/kb-fs/tmp-ref.d.ts +2 -2
  153. package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -1
  154. package/dist/modules/kb-fs/tmp-ref.js +2 -2
  155. package/dist/modules/kb-fs/tmp-ref.js.map +1 -1
  156. package/dist/modules/kb-sync/index.d.ts +1 -1
  157. package/dist/modules/kb-sync/index.d.ts.map +1 -1
  158. package/dist/modules/kb-sync/kb-sync.interface.d.ts +3 -3
  159. package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
  160. package/dist/modules/kb-sync/kb-sync.service.d.ts +3 -3
  161. package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
  162. package/dist/modules/kb-sync/kb-sync.service.js +10 -10
  163. package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
  164. package/dist/modules/mcp/mcp.service.d.ts +11 -4
  165. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  166. package/dist/modules/mcp/mcp.service.js +75 -19
  167. package/dist/modules/mcp/mcp.service.js.map +1 -1
  168. package/dist/modules/onboarding/onboarding.contract.d.ts +1 -1
  169. package/dist/modules/onboarding/onboarding.routes.js +2 -2
  170. package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
  171. package/dist/modules/onboarding/starter-pack.service.d.ts +4 -4
  172. package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
  173. package/dist/modules/onboarding/starter-pack.service.js +4 -4
  174. package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
  175. package/dist/modules/plugins/join-request-jobs.service.d.ts +2 -2
  176. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  177. package/dist/modules/plugins/join-request-jobs.service.js +7 -7
  178. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  179. package/dist/modules/plugins/join-requests.service.d.ts +3 -3
  180. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  181. package/dist/modules/plugins/join-requests.service.js +5 -5
  182. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  183. package/dist/modules/plugins/plugin-rename.service.js +1 -1
  184. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  185. package/dist/modules/plugins/plugins.routes.d.ts +2 -2
  186. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  187. package/dist/modules/plugins/plugins.routes.js +8 -8
  188. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  189. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +77 -2
  190. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
  191. package/dist/modules/secrets-vault/db-secrets-vault.service.js +479 -53
  192. package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
  193. package/dist/modules/secrets-vault/index.d.ts +2 -1
  194. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  195. package/dist/modules/secrets-vault/index.js +1 -0
  196. package/dist/modules/secrets-vault/index.js.map +1 -1
  197. package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts +36 -0
  198. package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts.map +1 -0
  199. package/dist/modules/secrets-vault/managed-sign-in-erasure.js +37 -0
  200. package/dist/modules/secrets-vault/managed-sign-in-erasure.js.map +1 -0
  201. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +152 -0
  202. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
  203. package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
  204. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +7 -1
  205. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  206. package/dist/modules/secrets-vault/secrets-vault.routes.js +125 -10
  207. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  208. package/dist/modules/settings/connection-check.js +1 -1
  209. package/dist/modules/settings/connection-check.js.map +1 -1
  210. package/dist/modules/settings/deployment-settings.service.js +1 -1
  211. package/dist/modules/settings/git-root-folders.js +1 -1
  212. package/dist/modules/settings/git-root-folders.js.map +1 -1
  213. package/dist/modules/settings/setup.routes.d.ts +1 -1
  214. package/dist/modules/settings/setup.routes.js +1 -1
  215. package/dist/modules/skills/pending-skills.service.d.ts +3 -3
  216. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  217. package/dist/modules/skills/pending-skills.service.js +4 -4
  218. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  219. package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -2
  220. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  221. package/dist/modules/skills/skill-access-requests.routes.js +5 -5
  222. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  223. package/dist/modules/tool-helpers/tool-context.d.ts +4 -4
  224. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
  225. package/dist/modules/tool-helpers/tool-context.js +2 -2
  226. package/dist/modules/tool-helpers/tool-context.js.map +1 -1
  227. package/dist/modules/tool-helpers/tool-handler.js +2 -2
  228. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  229. package/dist/modules/tool-helpers/tool.contract.d.ts +4 -4
  230. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  231. package/dist/modules/tool-manuals/mcp-server-edit.service.js +1 -1
  232. package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
  233. package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -3
  234. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  235. package/dist/modules/tool-manuals/pending-tools.service.js +4 -4
  236. package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
  237. package/dist/modules/tool-manuals/tool-delete.service.js +1 -1
  238. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  239. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +43 -3
  240. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
  241. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +6 -0
  242. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  243. package/dist/modules/tool-manuals/tool-manuals.service.js +51 -5
  244. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  245. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
  246. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  247. package/dist/modules/tool-manuals/tool-manuals.tools.js +36 -15
  248. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  249. package/dist/modules/version-control/agent-tools/change-request-read-shape.d.ts.map +1 -0
  250. package/dist/modules/version-control/agent-tools/change-request-read-shape.js.map +1 -0
  251. package/dist/modules/version-control/agent-tools/change-request-read.tools.d.ts.map +1 -0
  252. package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.js +2 -2
  253. package/dist/modules/version-control/agent-tools/change-request-read.tools.js.map +1 -0
  254. package/dist/modules/version-control/agent-tools/change-request-summary.d.ts.map +1 -0
  255. package/dist/modules/version-control/agent-tools/change-request-summary.js.map +1 -0
  256. package/dist/modules/{workflow/agent-tools/workflow.tools.d.ts → version-control/agent-tools/version-control.tools.d.ts} +4 -4
  257. package/dist/modules/version-control/agent-tools/version-control.tools.d.ts.map +1 -0
  258. package/dist/modules/{workflow/agent-tools/workflow.tools.js → version-control/agent-tools/version-control.tools.js} +31 -31
  259. package/dist/modules/version-control/agent-tools/version-control.tools.js.map +1 -0
  260. package/dist/modules/{workflow → version-control}/change-request-hooks.d.ts +1 -1
  261. package/dist/modules/version-control/change-request-hooks.d.ts.map +1 -0
  262. package/dist/modules/version-control/change-request-hooks.js.map +1 -0
  263. package/dist/modules/version-control/change-request-review/approval-lock.d.ts.map +1 -0
  264. package/dist/modules/version-control/change-request-review/approval-lock.js.map +1 -0
  265. package/dist/modules/{workflow/review-workflow/review-workflow.interface.d.ts → version-control/change-request-review/change-request-review.interface.d.ts} +2 -2
  266. package/dist/modules/version-control/change-request-review/change-request-review.interface.d.ts.map +1 -0
  267. package/dist/modules/version-control/change-request-review/change-request-review.interface.js +2 -0
  268. package/dist/modules/version-control/change-request-review/change-request-review.interface.js.map +1 -0
  269. package/dist/modules/{workflow/review-workflow/review-workflow.service.d.ts → version-control/change-request-review/change-request-review.service.d.ts} +3 -3
  270. package/dist/modules/version-control/change-request-review/change-request-review.service.d.ts.map +1 -0
  271. package/dist/modules/{workflow/review-workflow/review-workflow.service.js → version-control/change-request-review/change-request-review.service.js} +26 -26
  272. package/dist/modules/version-control/change-request-review/change-request-review.service.js.map +1 -0
  273. package/dist/modules/{workflow → version-control}/event-bus.d.ts +8 -8
  274. package/dist/modules/version-control/event-bus.d.ts.map +1 -0
  275. package/dist/modules/{workflow → version-control}/event-bus.js +4 -4
  276. package/dist/modules/version-control/event-bus.js.map +1 -0
  277. package/dist/modules/{workflow → version-control}/events-delivery.d.ts +4 -4
  278. package/dist/modules/version-control/events-delivery.d.ts.map +1 -0
  279. package/dist/modules/version-control/events-delivery.js.map +1 -0
  280. package/dist/modules/{workflow → version-control}/events.routes.d.ts +4 -4
  281. package/dist/modules/version-control/events.routes.d.ts.map +1 -0
  282. package/dist/modules/version-control/events.routes.js.map +1 -0
  283. package/dist/modules/{workflow → version-control}/file-lock.service.d.ts +2 -2
  284. package/dist/modules/version-control/file-lock.service.d.ts.map +1 -0
  285. package/dist/modules/{workflow → version-control}/file-lock.service.js +6 -6
  286. package/dist/modules/version-control/file-lock.service.js.map +1 -0
  287. package/dist/modules/version-control/git/change-request-link.d.ts.map +1 -0
  288. package/dist/modules/version-control/git/change-request-link.js.map +1 -0
  289. package/dist/modules/version-control/git/git-version.d.ts.map +1 -0
  290. package/dist/modules/version-control/git/git-version.js.map +1 -0
  291. package/dist/modules/{workflow → version-control}/git/git.service.d.ts +8 -8
  292. package/dist/modules/version-control/git/git.service.d.ts.map +1 -0
  293. package/dist/modules/{workflow → version-control}/git/git.service.js +53 -53
  294. package/dist/modules/version-control/git/git.service.js.map +1 -0
  295. package/dist/modules/version-control/git/merge-commit.d.ts.map +1 -0
  296. package/dist/modules/version-control/git/merge-commit.js.map +1 -0
  297. package/dist/modules/version-control/git/node-git-runner.d.ts.map +1 -0
  298. package/dist/modules/{workflow → version-control}/git/node-git-runner.js +1 -1
  299. package/dist/modules/version-control/git/node-git-runner.js.map +1 -0
  300. package/dist/modules/{workflow → version-control}/git/pull-request.service.d.ts +5 -5
  301. package/dist/modules/version-control/git/pull-request.service.d.ts.map +1 -0
  302. package/dist/modules/{workflow → version-control}/git/pull-request.service.js +10 -10
  303. package/dist/modules/version-control/git/pull-request.service.js.map +1 -0
  304. package/dist/modules/{workflow → version-control}/index.d.ts +6 -5
  305. package/dist/modules/version-control/index.d.ts.map +1 -0
  306. package/dist/modules/{workflow → version-control}/index.js +3 -2
  307. package/dist/modules/version-control/index.js.map +1 -0
  308. package/dist/modules/{workflow → version-control}/pending-commits.service.d.ts +2 -2
  309. package/dist/modules/version-control/pending-commits.service.d.ts.map +1 -0
  310. package/dist/modules/{workflow → version-control}/pending-commits.service.js +2 -2
  311. package/dist/modules/version-control/pending-commits.service.js.map +1 -0
  312. package/dist/modules/{workflow → version-control}/pending-commits.worker.d.ts +5 -5
  313. package/dist/modules/version-control/pending-commits.worker.d.ts.map +1 -0
  314. package/dist/modules/{workflow → version-control}/pending-commits.worker.js +3 -3
  315. package/dist/modules/version-control/pending-commits.worker.js.map +1 -0
  316. package/dist/modules/{workflow → version-control}/read-on-branch.d.ts +2 -2
  317. package/dist/modules/version-control/read-on-branch.d.ts.map +1 -0
  318. package/dist/modules/{workflow → version-control}/read-on-branch.js +2 -2
  319. package/dist/modules/version-control/read-on-branch.js.map +1 -0
  320. package/dist/modules/version-control/recovery-bot.d.ts.map +1 -0
  321. package/dist/modules/version-control/recovery-bot.js.map +1 -0
  322. package/dist/modules/version-control/sanitize-error.d.ts.map +1 -0
  323. package/dist/modules/version-control/sanitize-error.js.map +1 -0
  324. package/dist/modules/{workflow/workflow-hooks.d.ts → version-control/version-control-hooks.d.ts} +4 -4
  325. package/dist/modules/version-control/version-control-hooks.d.ts.map +1 -0
  326. package/dist/modules/{workflow/workflow-hooks.js → version-control/version-control-hooks.js} +3 -3
  327. package/dist/modules/version-control/version-control-hooks.js.map +1 -0
  328. package/dist/modules/{workflow/workflow.routes.d.ts → version-control/version-control.routes.d.ts} +6 -5
  329. package/dist/modules/version-control/version-control.routes.d.ts.map +1 -0
  330. package/dist/modules/{workflow/workflow.routes.js → version-control/version-control.routes.js} +61 -60
  331. package/dist/modules/version-control/version-control.routes.js.map +1 -0
  332. package/dist/modules/{workflow/workflow.service.d.ts → version-control/version-control.service.d.ts} +26 -31
  333. package/dist/modules/version-control/version-control.service.d.ts.map +1 -0
  334. package/dist/modules/{workflow/workflow.service.js → version-control/version-control.service.js} +89 -94
  335. package/dist/modules/version-control/version-control.service.js.map +1 -0
  336. package/dist/modules/workspace/agent-access.gate.d.ts +5 -5
  337. package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
  338. package/dist/modules/workspace/agent-access.gate.js +1 -1
  339. package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
  340. package/dist/modules/workspace/git-internals.middleware.js +2 -2
  341. package/dist/modules/workspace/kb-repository.js +1 -1
  342. package/dist/modules/workspace/kb-repository.js.map +1 -1
  343. package/dist/modules/workspace/startup/kb-git.d.ts +1 -1
  344. package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
  345. package/dist/modules/workspace/startup/kb-git.js +1 -1
  346. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  347. package/dist/modules/workspace/startup/steps/seed-tree.d.ts +2 -2
  348. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  349. package/dist/modules/workspace/startup/steps/seed-tree.js +1 -1
  350. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  351. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +2 -2
  352. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  353. package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
  354. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  355. package/dist/modules/workspace/startup/steps/template-source.d.ts +17 -4
  356. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  357. package/dist/modules/workspace/startup/steps/template-source.js +8 -5
  358. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  359. package/dist/modules/workspace/workspace-tmp.js +3 -3
  360. package/dist/modules/workspace/workspace-tmp.js.map +1 -1
  361. package/dist/modules/workspace/workspace.routes.d.ts +4 -4
  362. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  363. package/dist/modules/workspace/workspace.routes.js +22 -22
  364. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  365. package/dist/modules/workspace/workspace.service.d.ts +6 -6
  366. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  367. package/dist/modules/workspace/workspace.service.js +11 -11
  368. package/dist/modules/workspace/workspace.service.js.map +1 -1
  369. package/dist/modules/workspace/workspace.tools.d.ts +2 -1
  370. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  371. package/dist/modules/workspace/workspace.tools.js +15 -10
  372. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  373. package/dist/shared/canonical-file-identity.d.ts +2 -2
  374. package/dist/shared/canonical-file-identity.js +5 -5
  375. package/dist/shared/canonical-file-identity.js.map +1 -1
  376. package/dist/shared/domain-errors.d.ts +39 -39
  377. package/dist/shared/domain-errors.d.ts.map +1 -1
  378. package/dist/shared/domain-errors.js +44 -44
  379. package/dist/shared/domain-errors.js.map +1 -1
  380. package/dist/shared/git.contract.d.ts +1 -1
  381. package/dist/shared/git.contract.js +1 -1
  382. package/dist/shared/http-errors.d.ts +3 -3
  383. package/dist/shared/http-errors.d.ts.map +1 -1
  384. package/dist/shared/http-errors.js +1 -1
  385. package/dist/shared/http-errors.js.map +1 -1
  386. package/dist/shared/pending-proposals.d.ts +3 -3
  387. package/dist/shared/pending-proposals.d.ts.map +1 -1
  388. package/dist/shared/pending-proposals.js +2 -2
  389. package/dist/shared/pending-proposals.js.map +1 -1
  390. package/dist/tenancy/static-tenant-source.js +1 -1
  391. package/dist/tenancy/static-tenant-source.js.map +1 -1
  392. package/migrations/0012_agent_audit.sql +40 -40
  393. package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -29
  394. package/migrations/meta/0012_snapshot.json +2246 -2246
  395. package/migrations/meta/0013_snapshot.json +2258 -2258
  396. package/package.json +4 -4
  397. package/src/__tests__/account-admin.ts +27 -0
  398. package/src/__tests__/hexis-catalog.ts +4 -4
  399. package/src/__tests__/kb-context.ts +30 -30
  400. package/src/__tests__/kb-layout-config.test.ts +21 -0
  401. package/src/__tests__/open-change-gate.ts +1 -1
  402. package/src/__tests__/tool-handler.ts +15 -0
  403. package/src/__tests__/tool-wiring.ts +10 -4
  404. package/src/__tests__/workspace-service.ts +1 -1
  405. package/src/core/__tests__/catalog-cache-invalidation.test.ts +3 -3
  406. package/src/core/__tests__/compose-embed.test.ts +1 -1
  407. package/src/core/__tests__/damaged-document.tools.test.ts +3 -3
  408. package/src/core/__tests__/erasure-slices-wired-once.test.ts +46 -0
  409. package/src/core/__tests__/gated-boot.test.ts +2 -2
  410. package/src/core/__tests__/lifecycle.test.ts +9 -9
  411. package/src/core/catalog-cache-invalidation.ts +2 -2
  412. package/src/core/compose-embed.ts +3 -3
  413. package/src/core/core-ports.ts +19 -4
  414. package/src/core/create-core-server.ts +39 -25
  415. package/src/core/create-core-services.ts +79 -63
  416. package/src/core/lifecycle.ts +9 -9
  417. package/src/core-config.ts +3 -3
  418. package/src/index.ts +5 -5
  419. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +4 -4
  420. package/src/modules/access/__tests__/access-own-read-grant.test.ts +14 -14
  421. package/src/modules/access/__tests__/access-requests.routes.test.ts +20 -20
  422. package/src/modules/access/__tests__/access.routes.admins.test.ts +4 -4
  423. package/src/modules/access/__tests__/access.routes.batch.test.ts +4 -4
  424. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +6 -6
  425. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -6
  426. package/src/modules/access/__tests__/access.routes.overrides.test.ts +5 -5
  427. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +6 -6
  428. package/src/modules/access/__tests__/access.routes.prospective.test.ts +3 -3
  429. package/src/modules/access/__tests__/access.routes.revoke.test.ts +6 -6
  430. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +6 -6
  431. package/src/modules/access/__tests__/admin-locked-commit.test.ts +6 -6
  432. package/src/modules/access/__tests__/admin-route-helpers.test.ts +5 -5
  433. package/src/modules/access/__tests__/groups-admin.service.test.ts +27 -27
  434. package/src/modules/access/__tests__/roles-admin.security.test.ts +14 -13
  435. package/src/modules/access/__tests__/roles-admin.service.test.ts +27 -27
  436. package/src/modules/access/__tests__/roles-capabilities.test.ts +19 -19
  437. package/src/modules/access/__tests__/roles.routes.test.ts +6 -6
  438. package/src/modules/access/__tests__/synced-groups-committer.test.ts +13 -13
  439. package/src/modules/access/__tests__/user-access-removal.service.test.ts +29 -29
  440. package/src/modules/access/access-control.service.ts +1 -1
  441. package/src/modules/access/access-declarations.ts +2 -2
  442. package/src/modules/access/access-mutation.service.ts +2 -2
  443. package/src/modules/access/access-requests.routes.ts +7 -7
  444. package/src/modules/access/access-requests.service.ts +13 -13
  445. package/src/modules/access/access.routes.ts +11 -11
  446. package/src/modules/access/admin-locked-commit.ts +11 -11
  447. package/src/modules/access/admin-route-helpers.ts +5 -5
  448. package/src/modules/access/change-read-gate.ts +1 -1
  449. package/src/modules/access/groups-admin.service.ts +7 -7
  450. package/src/modules/access/reference-scan.ts +1 -1
  451. package/src/modules/access/roles-admin.service.ts +9 -9
  452. package/src/modules/access/synced-groups-committer.ts +11 -11
  453. package/src/modules/access/user-access-removal.service.ts +7 -7
  454. package/src/modules/access-model/__tests__/access-grammar.test.ts +2 -2
  455. package/src/modules/access-model/access-errors.ts +4 -4
  456. package/src/modules/access-model/access-grammar.ts +4 -4
  457. package/src/modules/access-model/change-gate.ts +1 -1
  458. package/src/modules/access-model/roles-yaml-guard.ts +4 -4
  459. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +19 -4
  460. package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +1 -1
  461. package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +2 -2
  462. package/src/modules/agent-guide/agent-guide.ts +48 -22
  463. package/src/modules/agent-guide/guide-budget.ts +6 -2
  464. package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +4 -5
  465. package/src/modules/agent-instructions/__tests__/compose.test.ts +1 -1
  466. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +113 -7
  467. package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -5
  468. package/src/modules/agent-instructions/compose.ts +24 -9
  469. package/src/modules/agent-instructions/shared-file-rules.ts +53 -11
  470. package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +1 -1
  471. package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -113
  472. package/src/modules/audit/__tests__/event-classifier.test.ts +121 -121
  473. package/src/modules/audit/event-classifier.ts +155 -155
  474. package/src/modules/auth/__tests__/account-deactivation.test.ts +1 -1
  475. package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +4 -4
  476. package/src/modules/auth/__tests__/account-erasure.participants.test.ts +56 -0
  477. package/src/modules/auth/__tests__/account-switch-lock.pg.test.ts +2 -2
  478. package/src/modules/auth/__tests__/account-switch-lock.test.ts +2 -2
  479. package/src/modules/auth/__tests__/account.routes.test.ts +73 -11
  480. package/src/modules/auth/__tests__/auth.service.test.ts +1 -1
  481. package/src/modules/auth/account-erasure.service.ts +27 -9
  482. package/src/modules/auth/account-hooks.ts +34 -0
  483. package/src/modules/auth/account-switch-lock.ts +2 -2
  484. package/src/modules/auth/account.routes.ts +23 -5
  485. package/src/modules/auth/auth.service.ts +4 -4
  486. package/src/modules/auth/index.ts +1 -0
  487. package/src/modules/database/__tests__/advisory-lock.test.ts +169 -169
  488. package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -32
  489. package/src/modules/database/core-schema.ts +2 -2
  490. package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +2 -2
  491. package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +12 -12
  492. package/src/modules/diff/diff.routes.ts +8 -8
  493. package/src/modules/embed/__tests__/embed.service.lock.test.ts +7 -7
  494. package/src/modules/embed/__tests__/embed.service.test.ts +42 -42
  495. package/src/modules/embed/__tests__/embed.tools.test.ts +1 -1
  496. package/src/modules/embed/embed.routes.ts +1 -1
  497. package/src/modules/embed/embed.service.ts +17 -17
  498. package/src/modules/kb-fs/__tests__/branch-name.test.ts +2 -2
  499. package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +260 -260
  500. package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +34 -34
  501. package/src/modules/kb-fs/__tests__/repo-path.test.ts +8 -8
  502. package/src/modules/kb-fs/branch-name.ts +8 -8
  503. package/src/modules/kb-fs/file-change-notifier.ts +2 -2
  504. package/src/modules/kb-fs/locking-filesystem.ts +30 -30
  505. package/src/modules/kb-fs/repo-path.ts +5 -5
  506. package/src/modules/kb-fs/tmp-ref.ts +3 -3
  507. package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +36 -36
  508. package/src/modules/kb-sync/index.ts +1 -1
  509. package/src/modules/kb-sync/kb-sync.interface.ts +3 -3
  510. package/src/modules/kb-sync/kb-sync.service.ts +9 -9
  511. package/src/modules/marketplace/__tests__/github-facade.test.ts +1 -1
  512. package/src/modules/marketplace/__tests__/marketplace-git.test.ts +1 -1
  513. package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +4 -2
  514. package/src/modules/mcp/__tests__/mcp.e2e.test.ts +69 -8
  515. package/src/modules/mcp/__tests__/mcp.service.test.ts +91 -13
  516. package/src/modules/mcp/__tests__/read-only-hint.pg.test.ts +194 -0
  517. package/src/modules/mcp/mcp.service.ts +89 -28
  518. package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +55 -55
  519. package/src/modules/onboarding/onboarding.contract.ts +1 -1
  520. package/src/modules/onboarding/onboarding.routes.ts +2 -2
  521. package/src/modules/onboarding/starter-pack.service.ts +6 -6
  522. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +1 -1
  523. package/src/modules/plugins/__tests__/compile-marketplace.test.ts +1 -1
  524. package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +43 -43
  525. package/src/modules/plugins/__tests__/join-requests.service.test.ts +19 -19
  526. package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +26 -26
  527. package/src/modules/plugins/__tests__/plugins.routes.test.ts +25 -25
  528. package/src/modules/plugins/join-request-jobs.service.ts +10 -10
  529. package/src/modules/plugins/join-requests.service.ts +4 -4
  530. package/src/modules/plugins/plugin-rename.service.ts +1 -1
  531. package/src/modules/plugins/plugins.routes.ts +9 -9
  532. package/src/modules/secrets-vault/__tests__/db-secrets-vault.managed.test.ts +773 -0
  533. package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +28 -1
  534. package/src/modules/secrets-vault/__tests__/managed-sign-in.route.test.ts +351 -0
  535. package/src/modules/secrets-vault/db-secrets-vault.service.ts +562 -95
  536. package/src/modules/secrets-vault/index.ts +7 -0
  537. package/src/modules/secrets-vault/managed-sign-in-erasure.ts +41 -0
  538. package/src/modules/secrets-vault/secrets-variable-loader.ts +134 -134
  539. package/src/modules/secrets-vault/secrets-vault.contract.ts +152 -0
  540. package/src/modules/secrets-vault/secrets-vault.routes.ts +157 -10
  541. package/src/modules/settings/__tests__/repository-source.test.ts +1 -1
  542. package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +1 -1
  543. package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +1 -1
  544. package/src/modules/settings/connection-check.ts +1 -1
  545. package/src/modules/settings/deployment-settings.service.ts +1 -1
  546. package/src/modules/settings/git-root-folders.ts +1 -1
  547. package/src/modules/settings/setup.routes.ts +1 -1
  548. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +3 -3
  549. package/src/modules/skills/__tests__/branch-skills.tools.test.ts +1 -1
  550. package/src/modules/skills/__tests__/pending-skills.service.test.ts +8 -8
  551. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +18 -18
  552. package/src/modules/skills/__tests__/skills.service.test.ts +3 -3
  553. package/src/modules/skills/pending-skills.service.ts +3 -3
  554. package/src/modules/skills/skill-access-requests.routes.ts +7 -7
  555. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +4 -4
  556. package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +3 -3
  557. package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -3
  558. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +4 -4
  559. package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +3 -3
  560. package/src/modules/tool-helpers/__tests__/validate-token.test.ts +1 -1
  561. package/src/modules/tool-helpers/tool-context.ts +6 -6
  562. package/src/modules/tool-helpers/tool-handler.ts +2 -2
  563. package/src/modules/tool-helpers/tool.contract.ts +4 -4
  564. package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +9 -9
  565. package/src/modules/tool-manuals/__tests__/tool-manuals.managed-sign-in.test.ts +89 -0
  566. package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +1 -1
  567. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +36 -1
  568. package/src/modules/tool-manuals/mcp-server-edit.service.ts +1 -1
  569. package/src/modules/tool-manuals/pending-tools.service.ts +3 -3
  570. package/src/modules/tool-manuals/tool-delete.service.ts +1 -1
  571. package/src/modules/tool-manuals/tool-manuals.contract.ts +41 -3
  572. package/src/modules/tool-manuals/tool-manuals.service.ts +53 -5
  573. package/src/modules/tool-manuals/tool-manuals.tools.ts +41 -15
  574. package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +4 -4
  575. package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +3 -3
  576. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +6 -6
  577. package/src/modules/{workflow → version-control}/__tests__/apply-failure.test.ts +54 -54
  578. package/src/modules/{workflow → version-control}/__tests__/event-bus.test.ts +27 -27
  579. package/src/modules/{workflow → version-control}/__tests__/events-delivery.test.ts +37 -37
  580. package/src/modules/{workflow → version-control}/__tests__/file-lock.service.deletion-gate.test.ts +2 -2
  581. package/src/modules/{workflow → version-control}/__tests__/file-lock.service.path-identity.test.ts +8 -8
  582. package/src/modules/{workflow → version-control}/__tests__/merge-announces-tree.test.ts +11 -11
  583. package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.concurrency.test.ts +9 -9
  584. package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.test.ts +25 -25
  585. package/src/modules/{workflow → version-control}/__tests__/preserve-roles-yaml.test.ts +42 -42
  586. package/src/modules/version-control/__tests__/public-surface.test.ts +114 -0
  587. package/src/modules/{workflow/__tests__/workflow.routes.folder-proposals.test.ts → version-control/__tests__/version-control.routes.folder-proposals.test.ts} +18 -18
  588. package/src/modules/{workflow/__tests__/workflow.routes.fork-point-file.test.ts → version-control/__tests__/version-control.routes.fork-point-file.test.ts} +19 -19
  589. package/src/modules/{workflow/__tests__/workflow.routes.history-read-gate.test.ts → version-control/__tests__/version-control.routes.history-read-gate.test.ts} +13 -13
  590. package/src/modules/{workflow/__tests__/workflow.routes.lock-path.test.ts → version-control/__tests__/version-control.routes.lock-path.test.ts} +18 -18
  591. package/src/modules/{workflow/__tests__/workflow.routes.open-change-request.test.ts → version-control/__tests__/version-control.routes.open-change-request.test.ts} +7 -7
  592. package/src/modules/{workflow/__tests__/workflow.routes.push-refused.test.ts → version-control/__tests__/version-control.routes.push-refused.test.ts} +14 -14
  593. package/src/modules/{workflow/__tests__/workflow.service.branch-in-use.test.ts → version-control/__tests__/version-control.service.branch-in-use.test.ts} +6 -6
  594. package/src/modules/{workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts → version-control/__tests__/version-control.service.commitFileWhileLocked.test.ts} +14 -14
  595. package/src/modules/{workflow/__tests__/workflow.service.delete-branch.test.ts → version-control/__tests__/version-control.service.delete-branch.test.ts} +14 -14
  596. package/src/modules/{workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts → version-control/__tests__/version-control.service.deleted-branch-sweep.test.ts} +4 -4
  597. package/src/modules/{workflow/__tests__/workflow.service.facade.test.ts → version-control/__tests__/version-control.service.facade.test.ts} +97 -99
  598. package/src/modules/{workflow/__tests__/workflow.service.folder-proposals.test.ts → version-control/__tests__/version-control.service.folder-proposals.test.ts} +7 -7
  599. package/src/modules/{workflow/__tests__/workflow.service.platform-restore.test.ts → version-control/__tests__/version-control.service.platform-restore.test.ts} +6 -6
  600. package/src/modules/{workflow/__tests__/workflow.service.read-gate.test.ts → version-control/__tests__/version-control.service.read-gate.test.ts} +9 -9
  601. package/src/modules/{workflow/__tests__/workflow.service.releaseLock.test.ts → version-control/__tests__/version-control.service.releaseLock.test.ts} +42 -42
  602. package/src/modules/{workflow/__tests__/workflow.service.repository-replaced.test.ts → version-control/__tests__/version-control.service.repository-replaced.test.ts} +4 -4
  603. package/src/modules/{workflow/__tests__/workflow.service.sync.test.ts → version-control/__tests__/version-control.service.sync.test.ts} +17 -17
  604. package/src/modules/{workflow/__tests__/workflow.service.update-change-request.pg.test.ts → version-control/__tests__/version-control.service.update-change-request.pg.test.ts} +6 -6
  605. package/src/modules/{workflow/__tests__/workflow.service.update-change-request.test.ts → version-control/__tests__/version-control.service.update-change-request.test.ts} +11 -11
  606. package/src/modules/{workflow/__tests__/workflow.service.update-from-target.test.ts → version-control/__tests__/version-control.service.update-from-target.test.ts} +22 -22
  607. package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read.tools.test.ts +3 -3
  608. package/src/modules/{workflow → version-control}/agent-tools/__tests__/update-change-request.parity.test.ts +16 -16
  609. package/src/modules/{workflow/agent-tools/__tests__/workflow.tools.test.ts → version-control/agent-tools/__tests__/version-control.tools.test.ts} +9 -9
  610. package/src/modules/{workflow → version-control}/agent-tools/change-request-read.tools.ts +2 -2
  611. package/src/modules/{workflow/agent-tools/workflow.tools.ts → version-control/agent-tools/version-control.tools.ts} +30 -30
  612. package/src/modules/{workflow → version-control}/change-request-hooks.ts +1 -1
  613. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/approval-states.test.ts +5 -5
  614. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/cancel-pr.test.ts +8 -8
  615. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/carry-approvals-forward.test.ts +6 -6
  616. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/erase-approver.test.ts +5 -5
  617. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-gate.test.ts +3 -3
  618. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-records-own-commit.test.ts +3 -3
  619. package/src/modules/{workflow/review-workflow/review-workflow.interface.ts → version-control/change-request-review/change-request-review.interface.ts} +1 -1
  620. package/src/modules/{workflow/review-workflow/review-workflow.service.ts → version-control/change-request-review/change-request-review.service.ts} +28 -28
  621. package/src/modules/{workflow → version-control}/event-bus.ts +14 -14
  622. package/src/modules/{workflow → version-control}/events-delivery.ts +11 -11
  623. package/src/modules/{workflow → version-control}/events.routes.ts +5 -5
  624. package/src/modules/{workflow → version-control}/file-lock.service.ts +6 -6
  625. package/src/modules/{workflow → version-control}/git/__tests__/git-test-helpers.ts +3 -3
  626. package/src/modules/{workflow → version-control}/git/__tests__/git.service.accessGating.test.ts +5 -5
  627. package/src/modules/{workflow → version-control}/git/__tests__/git.service.appliedChange.test.ts +4 -4
  628. package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedFilesForPr.test.ts +16 -16
  629. package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedPathsMemo.test.ts +2 -2
  630. package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitChanges.test.ts +3 -3
  631. package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.strayPath.test.ts +10 -10
  632. package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.test.ts +3 -3
  633. package/src/modules/{workflow → version-control}/git/__tests__/git.service.createBranch.test.ts +3 -3
  634. package/src/modules/{workflow → version-control}/git/__tests__/git.service.deleteBranch.test.ts +7 -7
  635. package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileAtCommit.test.ts +9 -9
  636. package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileBetweenBranches.test.ts +23 -23
  637. package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileBytesAtCommit.test.ts +7 -7
  638. package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -3
  639. package/src/modules/{workflow → version-control}/git/__tests__/git.service.forkPoint.test.ts +2 -2
  640. package/src/modules/{workflow → version-control}/git/__tests__/git.service.history-guards.test.ts +2 -2
  641. package/src/modules/{workflow → version-control}/git/__tests__/git.service.list-branches.test.ts +12 -12
  642. package/src/modules/{workflow → version-control}/git/__tests__/git.service.listTrackedFiles.test.ts +2 -2
  643. package/src/modules/{workflow → version-control}/git/__tests__/git.service.logForFile.test.ts +6 -6
  644. package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeChangeRequest.test.ts +20 -20
  645. package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeIntoBranch.test.ts +16 -16
  646. package/src/modules/{workflow → version-control}/git/__tests__/git.service.pendingChanges.test.ts +2 -2
  647. package/src/modules/{workflow → version-control}/git/__tests__/git.service.postMergePull.test.ts +5 -5
  648. package/src/modules/{workflow → version-control}/git/__tests__/git.service.prFetchFailure.test.ts +2 -2
  649. package/src/modules/{workflow → version-control}/git/__tests__/git.service.pull.test.ts +12 -12
  650. package/src/modules/{workflow → version-control}/git/__tests__/git.service.readFileAtRef.test.ts +3 -3
  651. package/src/modules/{workflow → version-control}/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -2
  652. package/src/modules/{workflow → version-control}/git/__tests__/git.service.status.test.ts +4 -4
  653. package/src/modules/{workflow → version-control}/git/__tests__/git.service.syncFromRemote.test.ts +8 -8
  654. package/src/modules/{workflow → version-control}/git/__tests__/git.service.worktrees.test.ts +4 -4
  655. package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.list-fetch.test.ts +2 -2
  656. package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.test.ts +6 -6
  657. package/src/modules/{workflow → version-control}/git/git.service.ts +57 -57
  658. package/src/modules/{workflow → version-control}/git/node-git-runner.ts +1 -1
  659. package/src/modules/{workflow → version-control}/git/pull-request.service.ts +12 -12
  660. package/src/modules/{workflow → version-control}/index.ts +6 -5
  661. package/src/modules/{workflow → version-control}/pending-commits.service.ts +2 -2
  662. package/src/modules/{workflow → version-control}/pending-commits.worker.ts +8 -8
  663. package/src/modules/{workflow → version-control}/read-on-branch.ts +2 -2
  664. package/src/modules/{workflow/workflow-hooks.ts → version-control/version-control-hooks.ts} +3 -3
  665. package/src/modules/{workflow/workflow.routes.ts → version-control/version-control.routes.ts} +64 -63
  666. package/src/modules/{workflow/workflow.service.ts → version-control/version-control.service.ts} +92 -97
  667. package/src/modules/workspace/__tests__/agent-access.gate.test.ts +8 -8
  668. package/src/modules/workspace/__tests__/agent-downloads.test.ts +13 -16
  669. package/src/modules/workspace/__tests__/agent-uploads.test.ts +11 -12
  670. package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +11 -16
  671. package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -3
  672. package/src/modules/workspace/__tests__/git-internals.security.test.ts +27 -27
  673. package/src/modules/workspace/__tests__/kb-repository.test.ts +1 -1
  674. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
  675. package/src/modules/workspace/__tests__/start-session.default-branch.test.ts +152 -0
  676. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +6 -6
  677. package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +13 -14
  678. package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +6 -6
  679. package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +4 -4
  680. package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +6 -6
  681. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +8 -8
  682. package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +4 -4
  683. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +6 -6
  684. package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +6 -6
  685. package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +4 -4
  686. package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +6 -6
  687. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +7 -7
  688. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +13 -13
  689. package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +1 -1
  690. package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +1 -1
  691. package/src/modules/workspace/__tests__/workspace.service.worktrees.test.ts +1 -1
  692. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +5 -5
  693. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +5 -5
  694. package/src/modules/workspace/__tests__/workspace.tools.test.ts +27 -27
  695. package/src/modules/workspace/agent-access.gate.ts +5 -5
  696. package/src/modules/workspace/git-internals.middleware.ts +2 -2
  697. package/src/modules/workspace/kb-repository.ts +1 -1
  698. package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +1 -1
  699. package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +1 -1
  700. package/src/modules/workspace/startup/__tests__/kb-startup-runner.worktrees.test.ts +1 -1
  701. package/src/modules/workspace/startup/kb-git.ts +1 -1
  702. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +94 -70
  703. package/src/modules/workspace/startup/steps/seed-tree.ts +4 -5
  704. package/src/modules/workspace/startup/steps/template-files.step.ts +4 -5
  705. package/src/modules/workspace/startup/steps/template-source.ts +21 -6
  706. package/src/modules/workspace/workspace-tmp.ts +4 -4
  707. package/src/modules/workspace/workspace.routes.ts +26 -26
  708. package/src/modules/workspace/workspace.service.ts +11 -11
  709. package/src/modules/workspace/workspace.tools.ts +17 -10
  710. package/src/shared/__tests__/canonical-file-identity.test.ts +5 -5
  711. package/src/shared/__tests__/http-errors.test.ts +4 -4
  712. package/src/shared/canonical-file-identity.ts +5 -5
  713. package/src/shared/domain-errors.ts +44 -44
  714. package/src/shared/git.contract.ts +1 -1
  715. package/src/shared/http-errors.ts +3 -3
  716. package/src/shared/kb-context.ts +130 -130
  717. package/src/shared/pending-proposals.ts +4 -4
  718. package/src/tenancy/__tests__/tenant-host.test.ts +372 -372
  719. package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -221
  720. package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -35
  721. package/src/tenancy/index.ts +35 -35
  722. package/src/tenancy/static-tenant-source.ts +1 -1
  723. package/src/tenancy/tenant-host.ts +261 -261
  724. package/src/tenancy/tenant-runtime.ts +208 -208
  725. package/src/tenancy/tenant-source.contract.ts +59 -59
  726. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +0 -1
  727. package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +0 -1
  728. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +0 -1
  729. package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +0 -1
  730. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +0 -1
  731. package/dist/modules/workflow/agent-tools/change-request-summary.js.map +0 -1
  732. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +0 -1
  733. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +0 -1
  734. package/dist/modules/workflow/change-request-hooks.d.ts.map +0 -1
  735. package/dist/modules/workflow/change-request-hooks.js.map +0 -1
  736. package/dist/modules/workflow/event-bus.d.ts.map +0 -1
  737. package/dist/modules/workflow/event-bus.js.map +0 -1
  738. package/dist/modules/workflow/events-delivery.d.ts.map +0 -1
  739. package/dist/modules/workflow/events-delivery.js.map +0 -1
  740. package/dist/modules/workflow/events.routes.d.ts.map +0 -1
  741. package/dist/modules/workflow/events.routes.js.map +0 -1
  742. package/dist/modules/workflow/file-lock.service.d.ts.map +0 -1
  743. package/dist/modules/workflow/file-lock.service.js.map +0 -1
  744. package/dist/modules/workflow/git/change-request-link.d.ts.map +0 -1
  745. package/dist/modules/workflow/git/change-request-link.js.map +0 -1
  746. package/dist/modules/workflow/git/git-version.d.ts.map +0 -1
  747. package/dist/modules/workflow/git/git-version.js.map +0 -1
  748. package/dist/modules/workflow/git/git.service.d.ts.map +0 -1
  749. package/dist/modules/workflow/git/git.service.js.map +0 -1
  750. package/dist/modules/workflow/git/merge-commit.d.ts.map +0 -1
  751. package/dist/modules/workflow/git/merge-commit.js.map +0 -1
  752. package/dist/modules/workflow/git/node-git-runner.d.ts.map +0 -1
  753. package/dist/modules/workflow/git/node-git-runner.js.map +0 -1
  754. package/dist/modules/workflow/git/pull-request.service.d.ts.map +0 -1
  755. package/dist/modules/workflow/git/pull-request.service.js.map +0 -1
  756. package/dist/modules/workflow/index.d.ts.map +0 -1
  757. package/dist/modules/workflow/index.js.map +0 -1
  758. package/dist/modules/workflow/pending-commits.service.d.ts.map +0 -1
  759. package/dist/modules/workflow/pending-commits.service.js.map +0 -1
  760. package/dist/modules/workflow/pending-commits.worker.d.ts.map +0 -1
  761. package/dist/modules/workflow/pending-commits.worker.js.map +0 -1
  762. package/dist/modules/workflow/read-on-branch.d.ts.map +0 -1
  763. package/dist/modules/workflow/read-on-branch.js.map +0 -1
  764. package/dist/modules/workflow/recovery-bot.d.ts.map +0 -1
  765. package/dist/modules/workflow/recovery-bot.js.map +0 -1
  766. package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +0 -1
  767. package/dist/modules/workflow/review-workflow/approval-lock.js.map +0 -1
  768. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +0 -1
  769. package/dist/modules/workflow/review-workflow/review-workflow.interface.js +0 -2
  770. package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +0 -1
  771. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +0 -1
  772. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +0 -1
  773. package/dist/modules/workflow/sanitize-error.d.ts.map +0 -1
  774. package/dist/modules/workflow/sanitize-error.js.map +0 -1
  775. package/dist/modules/workflow/workflow-hooks.d.ts.map +0 -1
  776. package/dist/modules/workflow/workflow-hooks.js.map +0 -1
  777. package/dist/modules/workflow/workflow.routes.d.ts.map +0 -1
  778. package/dist/modules/workflow/workflow.routes.js.map +0 -1
  779. package/dist/modules/workflow/workflow.service.d.ts.map +0 -1
  780. package/dist/modules/workflow/workflow.service.js.map +0 -1
  781. package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +0 -213
  782. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.d.ts +0 -0
  783. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.js +0 -0
  784. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.d.ts +0 -0
  785. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.d.ts +0 -0
  786. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.js +0 -0
  787. /package/dist/modules/{workflow → version-control}/change-request-hooks.js +0 -0
  788. /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.d.ts +0 -0
  789. /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.js +0 -0
  790. /package/dist/modules/{workflow → version-control}/events-delivery.js +0 -0
  791. /package/dist/modules/{workflow → version-control}/events.routes.js +0 -0
  792. /package/dist/modules/{workflow → version-control}/git/change-request-link.d.ts +0 -0
  793. /package/dist/modules/{workflow → version-control}/git/change-request-link.js +0 -0
  794. /package/dist/modules/{workflow → version-control}/git/git-version.d.ts +0 -0
  795. /package/dist/modules/{workflow → version-control}/git/git-version.js +0 -0
  796. /package/dist/modules/{workflow → version-control}/git/merge-commit.d.ts +0 -0
  797. /package/dist/modules/{workflow → version-control}/git/merge-commit.js +0 -0
  798. /package/dist/modules/{workflow → version-control}/git/node-git-runner.d.ts +0 -0
  799. /package/dist/modules/{workflow → version-control}/recovery-bot.d.ts +0 -0
  800. /package/dist/modules/{workflow → version-control}/recovery-bot.js +0 -0
  801. /package/dist/modules/{workflow → version-control}/sanitize-error.d.ts +0 -0
  802. /package/dist/modules/{workflow → version-control}/sanitize-error.js +0 -0
  803. /package/src/modules/{workflow → version-control}/__tests__/change-request-hooks.test.ts +0 -0
  804. /package/src/modules/{workflow → version-control}/__tests__/fake-file-lock-db.ts +0 -0
  805. /package/src/modules/{workflow → version-control}/__tests__/pending-commits.canonical.test.ts +0 -0
  806. /package/src/modules/{workflow → version-control}/__tests__/pending-commits.enqueue-if-absent.test.ts +0 -0
  807. /package/src/modules/{workflow → version-control}/__tests__/pending-commits.repository-replaced.test.ts +0 -0
  808. /package/src/modules/{workflow → version-control}/__tests__/sanitize-error.test.ts +0 -0
  809. /package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read-shape.test.ts +0 -0
  810. /package/src/modules/{workflow → version-control}/agent-tools/change-request-read-shape.ts +0 -0
  811. /package/src/modules/{workflow → version-control}/agent-tools/change-request-summary.ts +0 -0
  812. /package/src/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.ts +0 -0
  813. /package/src/modules/{workflow → version-control}/git/__tests__/branchAuthor.test.ts +0 -0
  814. /package/src/modules/{workflow → version-control}/git/__tests__/change-request-link.test.ts +0 -0
  815. /package/src/modules/{workflow → version-control}/git/__tests__/git-version.failure.test.ts +0 -0
  816. /package/src/modules/{workflow → version-control}/git/__tests__/git-version.test.ts +0 -0
  817. /package/src/modules/{workflow → version-control}/git/__tests__/node-git-runner.test.ts +0 -0
  818. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.getPrDetail.test.ts +0 -0
  819. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.placeholder.test.ts +0 -0
  820. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +0 -0
  821. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-delete.test.ts +0 -0
  822. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-update.test.ts +0 -0
  823. /package/src/modules/{workflow → version-control}/git/change-request-link.ts +0 -0
  824. /package/src/modules/{workflow → version-control}/git/git-version.ts +0 -0
  825. /package/src/modules/{workflow → version-control}/git/merge-commit.ts +0 -0
  826. /package/src/modules/{workflow → version-control}/recovery-bot.ts +0 -0
  827. /package/src/modules/{workflow → version-control}/sanitize-error.ts +0 -0
@@ -10,23 +10,23 @@ import type {
10
10
  } from '@bevel-software/platform-shared';
11
11
  import type { GitService } from '../git/git.service.js';
12
12
  import type { PullRequestService } from '../git/pull-request.service.js';
13
- import type { IReviewWorkflowService } from '../review-workflow/review-workflow.interface.js';
13
+ import type { IChangeRequestReviewService } from '../change-request-review/change-request-review.interface.js';
14
14
  import type { WorkspaceService } from '../../workspace/workspace.service.js';
15
15
  import type { IAccessControl } from '../../access/access-control.interface.js';
16
16
  import { FileLockService } from '../file-lock.service.js';
17
17
  import { PendingCommitsService, type PendingCommit } from '../pending-commits.service.js';
18
18
  import { PendingCommitsWorker } from '../pending-commits.worker.js';
19
19
  import { HttpCommunicationProtocol } from '@utcp/http';
20
- import { WorkflowService } from '../workflow.service.js';
20
+ import { VersionControlService } from '../version-control.service.js';
21
21
  import type { ChangeRequestOpenedEvent, IChangeRequestHooks } from '../change-request-hooks.js';
22
22
  import {
23
23
  ChangeRequestConflictsError,
24
24
  PullRebaseConflictError,
25
25
  PushNeedsAgentResolutionError,
26
- WorkflowDomainError,
27
- WorkflowValidationError,
26
+ VersionControlDomainError,
27
+ VersionControlValidationError,
28
28
  } from '../../../shared/domain-errors.js';
29
- import type { WorkflowEventBus } from '../event-bus.js';
29
+ import type { VersionControlEventBus } from '../event-bus.js';
30
30
  import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
31
31
  import type { Database } from '../../database/connection.js';
32
32
  import { openChangeGate } from '../../../__tests__/open-change-gate.js';
@@ -173,9 +173,7 @@ function makeAccessControl(): IAccessControl {
173
173
  /**
174
174
  * The facade exists only to delegate — these tests pin down that contract.
175
175
  * For each backed method we verify (a) the right underlying call is made
176
- * with the right arguments, (b) the underlying return propagates back. For
177
- * each unimplemented method we verify it rejects with
178
- * `NotImplementedWorkflowError` so consumers can switch on the error class.
176
+ * with the right arguments, (b) the underlying return propagates back.
179
177
  *
180
178
  * Cache invalidation (`PullRequestService.invalidateDetailCache`) is part
181
179
  * of the facade contract for mutating change-request methods — without it
@@ -236,7 +234,7 @@ function makePrs(): PullRequestService {
236
234
  } as unknown as PullRequestService;
237
235
  }
238
236
 
239
- function makeReviewWorkflow(): IReviewWorkflowService {
237
+ function makeChangeRequestReview(): IChangeRequestReviewService {
240
238
  return {
241
239
  getApprovalStates: vi.fn(),
242
240
  approveFile: vi.fn(),
@@ -244,16 +242,16 @@ function makeReviewWorkflow(): IReviewWorkflowService {
244
242
  evaluateMergeGate: vi.fn(),
245
243
  mergePr: vi.fn(),
246
244
  cancelPr: vi.fn(),
247
- } as unknown as IReviewWorkflowService;
245
+ } as unknown as IChangeRequestReviewService;
248
246
  }
249
247
 
250
- describe('WorkflowService — branch delegation', () => {
248
+ describe('VersionControlService — branch delegation', () => {
251
249
  it('listBranches delegates to git.listBranches', async () => {
252
250
  const git = makeGit();
253
251
  const branches = [{ name: 'main', isCurrent: true, isProtected: true, hasRemote: true }];
254
252
  (git.listBranches as ReturnType<typeof vi.fn>).mockResolvedValue(branches);
255
253
 
256
- const svc = new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
254
+ const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
257
255
  await expect(svc.listBranches('w1')).resolves.toBe(branches);
258
256
  // listBranches(workspaceId, opts?) forwards opts — undefined when omitted.
259
257
  expect(git.listBranches).toHaveBeenCalledWith('w1', undefined);
@@ -263,7 +261,7 @@ describe('WorkflowService — branch delegation', () => {
263
261
  const git = makeGit();
264
262
  (git.createBranch as ReturnType<typeof vi.fn>).mockResolvedValue({ name: 'feat' });
265
263
 
266
- const svc = new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
264
+ const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
267
265
  await svc.createBranch('w1', 'feat', 'current-company-state');
268
266
  expect(git.createBranch).toHaveBeenCalledWith('w1', 'feat', 'current-company-state');
269
267
  });
@@ -273,13 +271,13 @@ describe('WorkflowService — branch delegation', () => {
273
271
  const status = { branch: 'main', isDirty: false, hasUpstream: true, unpushedCommits: 0, conflicted: [], unmergedFromUpstream: false };
274
272
  (git.status as ReturnType<typeof vi.fn>).mockResolvedValue(status);
275
273
 
276
- const svc = new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
274
+ const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
277
275
  await expect(svc.branchStatus('w1')).resolves.toBe(status);
278
276
  expect(git.status).toHaveBeenCalledWith('w1');
279
277
  });
280
278
  });
281
279
 
282
- describe('WorkflowService.updateBranch', () => {
280
+ describe('VersionControlService.updateBranch', () => {
283
281
  const user = { id: 'u1', email: 'ada@x.io', name: 'Ada' };
284
282
  /** A git double whose merge answers `outcome`, with the source on the remote. */
285
283
  const gitThatMerges = (outcome: unknown) => {
@@ -289,14 +287,14 @@ describe('WorkflowService.updateBranch', () => {
289
287
  return git;
290
288
  };
291
289
  const build = (git: GitService, pending = makePendingCommits()) =>
292
- new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), pending, testKbContext(), openChangeGate());
290
+ new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), pending, testKbContext(), openChangeGate());
293
291
 
294
292
  it('refuses a protected branch before asking git anything', async () => {
295
293
  const git = gitThatMerges({ kind: 'merged', sha: 'm', from: 'x', resolvedPaths: [] });
296
294
  const err = await build(git).updateBranch('target-company-state', user).catch((e: unknown) => e);
297
- expect(err).toBeInstanceOf(WorkflowDomainError);
298
- expect((err as WorkflowDomainError).status).toBe(403);
299
- expect((err as WorkflowDomainError).payload).toMatchObject({ kind: 'protected-update-target' });
295
+ expect(err).toBeInstanceOf(VersionControlDomainError);
296
+ expect((err as VersionControlDomainError).status).toBe(403);
297
+ expect((err as VersionControlDomainError).payload).toMatchObject({ kind: 'protected-update-target' });
300
298
  expect((git as unknown as { mergeIntoBranch: ReturnType<typeof vi.fn> }).mergeIntoBranch).not.toHaveBeenCalled();
301
299
  expect(git.push).not.toHaveBeenCalled();
302
300
  });
@@ -314,7 +312,7 @@ describe('WorkflowService.updateBranch', () => {
314
312
  it('refuses an update that would land an open change request from `from` into the draft, as the merge tool refuses it', async () => {
315
313
  const git = gitThatMerges({ kind: 'merged', sha: 'm', from: 'target-company-state', resolvedPaths: [] });
316
314
  const open = [{ number: 5, sourceBranch: 'target-company-state', targetBranch: 'ada/draft', state: 'open' }];
317
- const svc = new WorkflowService(makeDb(open), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
315
+ const svc = new VersionControlService(makeDb(open), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
318
316
  const err = await svc.updateBranch('ada%2Fdraft', user, { from: 'target-company-state' }).catch((e: unknown) => e);
319
317
  expect(err).toMatchObject({ status: 409, payload: { kind: 'open-change-request-blocks-merge', number: 5 } });
320
318
  expect((git as unknown as { mergeIntoBranch: ReturnType<typeof vi.fn> }).mergeIntoBranch).not.toHaveBeenCalled();
@@ -322,7 +320,7 @@ describe('WorkflowService.updateBranch', () => {
322
320
  // The other direction — the draft's own request, open INTO `from` — is
323
321
  // how a draft under review stays current: never blocked.
324
322
  const reverse = [{ number: 6, sourceBranch: 'ada/draft', targetBranch: 'target-company-state', state: 'open' }];
325
- const syncing = new WorkflowService(makeDb(reverse), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
323
+ const syncing = new VersionControlService(makeDb(reverse), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
326
324
  expect(await syncing.updateBranch('ada%2Fdraft', user, { from: 'target-company-state' })).toMatchObject({ kind: 'merged' });
327
325
  });
328
326
 
@@ -404,7 +402,7 @@ describe('WorkflowService.updateBranch', () => {
404
402
  expect(git.push).not.toHaveBeenCalled();
405
403
  });
406
404
 
407
- it("publishes through the one push policy every workflow push takes, over the merge's own moves", async () => {
405
+ it("publishes through the one push policy every version-control push takes, over the merge's own moves", async () => {
408
406
  const git = gitThatMerges({ kind: 'merged', sha: 'm', from: 'target-company-state', resolvedPaths: [] });
409
407
  await build(git).updateBranch('ada%2Fdraft', user, { from: 'target-company-state' });
410
408
  const merge = (git as unknown as { mergeIntoBranch: ReturnType<typeof vi.fn> }).mergeIntoBranch;
@@ -432,7 +430,7 @@ describe('WorkflowService.updateBranch', () => {
432
430
  expect(diverged).toBeInstanceOf(PushNeedsAgentResolutionError);
433
431
  expect(diverged as PushNeedsAgentResolutionError).toMatchObject({ branch: 'ada/draft', path: 'ada/draft', cause: 'diverged' });
434
432
  expect((diverged as Error).message).not.toContain('Secret/Plan.md');
435
- expect(JSON.stringify((diverged as WorkflowDomainError).payload)).not.toContain('Secret/Plan.md');
433
+ expect(JSON.stringify((diverged as VersionControlDomainError).payload)).not.toContain('Secret/Plan.md');
436
434
 
437
435
  // A host that refuses: the same hand-off, `refused`, no replay attempted.
438
436
  const untouched = vi.fn();
@@ -453,7 +451,7 @@ describe('WorkflowService.updateBranch', () => {
453
451
  gate.assertMayChange = async (...args: unknown[]) => {
454
452
  asked.push(args);
455
453
  };
456
- const svc = new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), access, makeFileLockService(), makePendingCommits(), testKbContext(), gate);
454
+ const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), access, makeFileLockService(), makePendingCommits(), testKbContext(), gate);
457
455
  const validated: unknown[][] = [];
458
456
  const validateWrite = vi.fn(async (...args: unknown[]) => { validated.push(args); });
459
457
  await svc.updateBranch('ada%2Fdraft', user, {
@@ -476,7 +474,7 @@ describe('WorkflowService.updateBranch', () => {
476
474
  expect(asked).toEqual([['ada%2Fdraft', 'ada@x.io', 'knowledge-base/A.md', 'file'], ['ada%2Fdraft', 'ada@x.io', 'knowledge-base/B.md', 'file']]);
477
475
 
478
476
  // The write gate's refusal refuses the update (a roles.yaml that would not parse, say).
479
- validateWrite.mockRejectedValueOnce(new WorkflowDomainError('roles.yaml would be invalid', 422));
477
+ validateWrite.mockRejectedValueOnce(new VersionControlDomainError('roles.yaml would be invalid', 422));
480
478
  await expect(opts.authorizeResolutions({ ours: 'o', theirs: 't' })).rejects.toMatchObject({ status: 422 });
481
479
 
482
480
  // Not readable at the draft's commit: refused before the change gate is asked.
@@ -521,7 +519,7 @@ describe('WorkflowService.updateBranch', () => {
521
519
  });
522
520
  });
523
521
 
524
- describe('WorkflowService — change delegation', () => {
522
+ describe('VersionControlService — change delegation', () => {
525
523
  it('commitChange delegates to git.commit', async () => {
526
524
  const git = makeGit();
527
525
  const user = makeUser();
@@ -529,7 +527,7 @@ describe('WorkflowService — change delegation', () => {
529
527
  const commit = { sha: 'abc', authorName: 'Alice', authorEmail: 'alice@example.com', subject: 'tweak owner', committedAt: '2026-01-01T00:00:00Z' };
530
528
  (git.commit as ReturnType<typeof vi.fn>).mockResolvedValue(commit);
531
529
 
532
- const svc = new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
530
+ const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
533
531
  await expect(svc.commitChange('w1', user, input)).resolves.toBe(commit);
534
532
  expect(git.commit).toHaveBeenCalledWith('w1', user, input);
535
533
  });
@@ -538,7 +536,7 @@ describe('WorkflowService — change delegation', () => {
538
536
  const git = makeGit();
539
537
  (git.logForFile as ReturnType<typeof vi.fn>).mockResolvedValue([]);
540
538
 
541
- const svc = new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
539
+ const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
542
540
  await svc.listChangesForFile('w1', 'Knowledge/Foo.md', 5);
543
541
  expect(git.logForFile).toHaveBeenCalledWith('w1', 'Knowledge/Foo.md', 5);
544
542
  });
@@ -547,7 +545,7 @@ describe('WorkflowService — change delegation', () => {
547
545
  const git = makeGit();
548
546
  (git.diffFileBetweenBranches as ReturnType<typeof vi.fn>).mockResolvedValue({ diff: '@@ diff', from: 'a1', to: 'b1' });
549
547
 
550
- const svc = new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
548
+ const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
551
549
  // The caller's verdict travels down to the git layer, which asks it at
552
550
  // the pinned commits; those commits travel back with the diff.
553
551
  const authorize = vi.fn(async () => {});
@@ -557,40 +555,40 @@ describe('WorkflowService — change delegation', () => {
557
555
  });
558
556
  });
559
557
 
560
- describe('WorkflowService — change request delegation + cache invalidation', () => {
558
+ describe('VersionControlService — change request delegation + cache invalidation', () => {
561
559
  it('listChangeRequests forwards opts to prs.listOpenPrs', async () => {
562
560
  const prs = makePrs();
563
561
  (prs.listOpenPrs as ReturnType<typeof vi.fn>).mockResolvedValue([]);
564
562
 
565
- const svc = new WorkflowService(makeDb(), makeGit(), prs, makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
563
+ const svc = new VersionControlService(makeDb(), makeGit(), prs, makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
566
564
  await svc.listChangeRequests({ fresh: true });
567
565
  expect(prs.listOpenPrs).toHaveBeenCalledWith({ fresh: true });
568
566
  });
569
567
 
570
568
  it('approveFile invalidates the PR detail cache exactly once', async () => {
571
569
  const prs = makePrs();
572
- const reviewWorkflow = makeReviewWorkflow();
573
- (reviewWorkflow.approveFile as ReturnType<typeof vi.fn>).mockResolvedValue([]);
570
+ const changeRequestReview = makeChangeRequestReview();
571
+ (changeRequestReview.approveFile as ReturnType<typeof vi.fn>).mockResolvedValue([]);
574
572
 
575
- const svc = new WorkflowService(makeDb(), makeGit(), prs, reviewWorkflow, makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
573
+ const svc = new VersionControlService(makeDb(), makeGit(), prs, changeRequestReview, makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
576
574
  await svc.approveFile(7, 'Foo.md', makeUser(), [], 'sha', 'main', null, 'w1');
577
575
  expect(prs.invalidateDetailCache).toHaveBeenCalledWith(7);
578
576
  expect(prs.invalidateDetailCache).toHaveBeenCalledTimes(1);
579
577
  });
580
578
 
581
- it('rejectChangeRequest delegates to reviewWorkflow.cancelPr', async () => {
579
+ it('rejectChangeRequest delegates to changeRequestReview.cancelPr', async () => {
582
580
  const prs = makePrs();
583
- const reviewWorkflow = makeReviewWorkflow();
584
- (reviewWorkflow.cancelPr as ReturnType<typeof vi.fn>).mockResolvedValue({ prNumber: 9, cancelledAt: 't' });
581
+ const changeRequestReview = makeChangeRequestReview();
582
+ (changeRequestReview.cancelPr as ReturnType<typeof vi.fn>).mockResolvedValue({ prNumber: 9, cancelledAt: 't' });
585
583
  // A caller holding no grant: not the author, not an admin, no files to own.
586
584
  const access = makeAccessControl();
587
585
  (access.canWriteAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(false);
588
586
 
589
- const svc = new WorkflowService(makeDb(), makeGit(), prs, reviewWorkflow, makeWorkspaceService(), access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
587
+ const svc = new VersionControlService(makeDb(), makeGit(), prs, changeRequestReview, makeWorkspaceService(), access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
590
588
  const user = makeUser();
591
589
  await svc.rejectChangeRequest(9, user, 'open', null, 'main', 'w1');
592
590
  // Passed through unchanged: `cancelPr` is the one that refuses it.
593
- expect(reviewWorkflow.cancelPr).toHaveBeenCalledWith(9, user, 'open', null, 'main', 'w1');
591
+ expect(changeRequestReview.cancelPr).toHaveBeenCalledWith(9, user, 'open', null, 'main', 'w1');
594
592
  expect(prs.invalidateDetailCache).toHaveBeenCalledWith(9);
595
593
  });
596
594
 
@@ -599,8 +597,8 @@ describe('WorkflowService — change request delegation + cache invalidation', (
599
597
  it('rejectChangeRequest lets the holder of write on every changed file close it as the author would', async () => {
600
598
  const prs = makePrs();
601
599
  (prs.getPrDetail as ReturnType<typeof vi.fn>).mockResolvedValue({ files: [{ path: 'a.md' }, { path: 'b.md' }] });
602
- const reviewWorkflow = makeReviewWorkflow();
603
- (reviewWorkflow.cancelPr as ReturnType<typeof vi.fn>).mockResolvedValue({ prNumber: 9, cancelledAt: 't' });
600
+ const changeRequestReview = makeChangeRequestReview();
601
+ (changeRequestReview.cancelPr as ReturnType<typeof vi.fn>).mockResolvedValue({ prNumber: 9, cancelledAt: 't' });
604
602
  const access = makeAccessControl();
605
603
  (access.canWriteAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(false);
606
604
  (access.canWriteBatchAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(
@@ -608,44 +606,44 @@ describe('WorkflowService — change request delegation + cache invalidation', (
608
606
  );
609
607
  const workspaceService = makeWorkspaceService();
610
608
 
611
- const svc = new WorkflowService(makeDb(), makeGit(), prs, reviewWorkflow, workspaceService, access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
609
+ const svc = new VersionControlService(makeDb(), makeGit(), prs, changeRequestReview, workspaceService, access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
612
610
  const user = makeUser();
613
611
  await svc.rejectChangeRequest(9, user, 'open', 'someone-else', 'main', 'w1');
614
612
  expect(workspaceService.ensureRemotesFetched).toHaveBeenCalledWith('w1', { strict: true, force: true });
615
613
  expect(access.canWriteBatchAtRef).toHaveBeenCalledWith('w1', 'origin/main', user.email, ['a.md', 'b.md']);
616
- expect(reviewWorkflow.cancelPr).toHaveBeenCalledWith(9, user, 'open', hashEmail(user.email), 'main', 'w1');
614
+ expect(changeRequestReview.cancelPr).toHaveBeenCalledWith(9, user, 'open', hashEmail(user.email), 'main', 'w1');
617
615
  });
618
616
 
619
617
  it('rejectChangeRequest refuses with a worded 409 when origin cannot be fetched, never against a stale tree', async () => {
620
- const reviewWorkflow = makeReviewWorkflow();
618
+ const changeRequestReview = makeChangeRequestReview();
621
619
  const workspaceService = makeWorkspaceService();
622
620
  (workspaceService.ensureRemotesFetched as ReturnType<typeof vi.fn>).mockRejectedValue(new Error('offline'));
623
621
  const access = makeAccessControl();
624
622
 
625
- const svc = new WorkflowService(makeDb(), makeGit(), makePrs(), reviewWorkflow, workspaceService, access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
623
+ const svc = new VersionControlService(makeDb(), makeGit(), makePrs(), changeRequestReview, workspaceService, access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
626
624
  await expect(svc.rejectChangeRequest(9, makeUser(), 'open', 'someone-else', 'main', 'w1')).rejects.toMatchObject({
627
625
  status: 409,
628
626
  message: expect.stringContaining('origin was unreachable'),
629
627
  });
630
628
  expect(access.canWriteAtRef).not.toHaveBeenCalled();
631
- expect(reviewWorkflow.cancelPr).not.toHaveBeenCalled();
629
+ expect(changeRequestReview.cancelPr).not.toHaveBeenCalled();
632
630
  });
633
631
 
634
632
  it("rejectChangeRequest reads no grant for a request that is no longer open — cancelPr answers it", async () => {
635
- const reviewWorkflow = makeReviewWorkflow();
636
- (reviewWorkflow.cancelPr as ReturnType<typeof vi.fn>).mockRejectedValue(new Error('already-applied'));
633
+ const changeRequestReview = makeChangeRequestReview();
634
+ (changeRequestReview.cancelPr as ReturnType<typeof vi.fn>).mockRejectedValue(new Error('already-applied'));
637
635
  const workspaceService = makeWorkspaceService();
638
636
 
639
- const svc = new WorkflowService(makeDb(), makeGit(), makePrs(), reviewWorkflow, workspaceService, makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
637
+ const svc = new VersionControlService(makeDb(), makeGit(), makePrs(), changeRequestReview, workspaceService, makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
640
638
  await expect(svc.rejectChangeRequest(9, makeUser(), 'merged', null, 'main', 'w1')).rejects.toThrow('already-applied');
641
639
  expect(workspaceService.ensureRemotesFetched).not.toHaveBeenCalled();
642
640
  });
643
641
 
644
642
  it('mergeChangeRequest wraps the underlying merge result in a "merged" outcome', async () => {
645
643
  const prs = makePrs();
646
- const reviewWorkflow = makeReviewWorkflow();
644
+ const changeRequestReview = makeChangeRequestReview();
647
645
  const mergeResult = { prNumber: 4, sha: 'abc', mergedAt: 't' };
648
- (reviewWorkflow.mergePr as ReturnType<typeof vi.fn>).mockResolvedValue(mergeResult);
646
+ (changeRequestReview.mergePr as ReturnType<typeof vi.fn>).mockResolvedValue(mergeResult);
649
647
  // The roles.yaml-preservation guard resolves the CR's source branch via
650
648
  // getPr. readFileAtRef (stubbed in makeGit) returns identical roles.yaml for
651
649
  // base + head, so the guard no-ops and the merge proceeds.
@@ -653,8 +651,8 @@ describe('WorkflowService — change request delegation + cache invalidation', (
653
651
 
654
652
  const git = makeGit();
655
653
  const workspaceService = makeWorkspaceService();
656
- const svc = new WorkflowService(makeDb(), git, prs, reviewWorkflow, workspaceService, makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
657
- // Conflicts are surfaced by the local merge inside `reviewWorkflow.mergePr`
654
+ const svc = new VersionControlService(makeDb(), git, prs, changeRequestReview, workspaceService, makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
655
+ // Conflicts are surfaced by the local merge inside `changeRequestReview.mergePr`
658
656
  // (mocked here), so there's no provider "mergeable" pre-check to stub.
659
657
  const outcome = await svc.mergeChangeRequest(
660
658
  4,
@@ -671,7 +669,7 @@ describe('WorkflowService — change request delegation + cache invalidation', (
671
669
  // The target branch's workspace is pulled so it doesn't fall behind origin.
672
670
  expect(workspaceService.getOrCreateForBranch).toHaveBeenCalledWith('main');
673
671
  expect(git.pull).toHaveBeenCalledWith('main', {});
674
- expect(reviewWorkflow.mergePr).toHaveBeenCalledWith(
672
+ expect(changeRequestReview.mergePr).toHaveBeenCalledWith(
675
673
  4,
676
674
  expect.objectContaining({ email: 'alice@example.com' }),
677
675
  'sha',
@@ -687,9 +685,9 @@ describe('WorkflowService — change request delegation + cache invalidation', (
687
685
 
688
686
  it('mergeChangeRequest still merges when the post-merge pull conflicts, and queues recovery on the TARGET workspace', async () => {
689
687
  const prs = makePrs();
690
- const reviewWorkflow = makeReviewWorkflow();
688
+ const changeRequestReview = makeChangeRequestReview();
691
689
  const mergeResult = { prNumber: 4, sha: 'abc', mergedAt: 't' };
692
- (reviewWorkflow.mergePr as ReturnType<typeof vi.fn>).mockResolvedValue(mergeResult);
690
+ (changeRequestReview.mergePr as ReturnType<typeof vi.fn>).mockResolvedValue(mergeResult);
693
691
  (prs.getPr as ReturnType<typeof vi.fn>).mockResolvedValue({ branch: 'alice/feat', base: 'main' });
694
692
 
695
693
  const git = makeGit();
@@ -708,7 +706,7 @@ describe('WorkflowService — change request delegation + cache invalidation', (
708
706
  id: 'resolved-target-ws',
709
707
  });
710
708
  const pending = makePendingCommits();
711
- const svc = new WorkflowService(makeDb(), git, prs, reviewWorkflow, workspaceService, makeAccessControl(), makeFileLockService(), pending, testKbContext(), openChangeGate());
709
+ const svc = new VersionControlService(makeDb(), git, prs, changeRequestReview, workspaceService, makeAccessControl(), makeFileLockService(), pending, testKbContext(), openChangeGate());
712
710
 
713
711
  const outcome = await svc.mergeChangeRequest(
714
712
  4, makeUser(), 'sha', [], 'open', 'PR title', 'main', 'w1', { bypass: true },
@@ -728,10 +726,10 @@ describe('WorkflowService — change request delegation + cache invalidation', (
728
726
  });
729
727
  });
730
728
 
731
- describe('WorkflowService — file lock delegation', () => {
729
+ describe('VersionControlService — file lock delegation', () => {
732
730
  it('acquireLock delegates to FileLockService.acquire', async () => {
733
731
  const fileLocks = makeFileLockService();
734
- const svc = new WorkflowService(makeDb(), makeGit(), makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
732
+ const svc = new VersionControlService(makeDb(), makeGit(), makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
735
733
  await svc.acquireLock('w1', 'b', 'p', makeUser());
736
734
  expect(fileLocks.acquire).toHaveBeenCalledWith('w1', 'b', 'p', expect.objectContaining({ email: 'alice@example.com' }), undefined);
737
735
  });
@@ -741,7 +739,7 @@ describe('WorkflowService — file lock delegation', () => {
741
739
  // a coordination hold masquerade as an edit lock on the very next read
742
740
  // (which is how the write paths decide what the holder may do).
743
741
  const fileLocks = makeFileLockService();
744
- const svc = new WorkflowService(makeDb(), makeGit(), makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
742
+ const svc = new VersionControlService(makeDb(), makeGit(), makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
745
743
  await svc.acquireLock('w1', 'b', 'p', makeUser(), { coordination: true });
746
744
  expect(fileLocks.acquire).toHaveBeenCalledWith(
747
745
  'w1', 'b', 'p', expect.objectContaining({ email: 'alice@example.com' }), { coordination: true },
@@ -750,7 +748,7 @@ describe('WorkflowService — file lock delegation', () => {
750
748
 
751
749
  it('getLock delegates to FileLockService.get', async () => {
752
750
  const fileLocks = makeFileLockService();
753
- const svc = new WorkflowService(makeDb(), makeGit(), makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
751
+ const svc = new VersionControlService(makeDb(), makeGit(), makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
754
752
  await expect(svc.getLock('w1', 'b', 'p')).resolves.toBeNull();
755
753
  expect(fileLocks.get).toHaveBeenCalledWith('w1', 'b', 'p');
756
754
  });
@@ -765,7 +763,7 @@ describe('WorkflowService — file lock delegation', () => {
765
763
  acquiredAt: '', lastHeartbeatAt: '', expiresAt: '',
766
764
  });
767
765
  const pending = makePendingCommits();
768
- const svc = new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), fileLocks, pending, testKbContext(), openChangeGate());
766
+ const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), fileLocks, pending, testKbContext(), openChangeGate());
769
767
  await expect(svc.releaseLock('w1', 'feat', 'Foo.md', makeUser())).resolves.toBeUndefined();
770
768
  // No inline git work — the worker handles that out of band.
771
769
  expect(git.commitFile).not.toHaveBeenCalled();
@@ -784,28 +782,28 @@ describe('WorkflowService — file lock delegation', () => {
784
782
  // One open request rides the branch — deleting it would strand the request.
785
783
  // `sourceBranch` matters to the guard now: it decides whether the refusal
786
784
  // says "withdraw yours" (source) or names the other request's actors (target).
787
- const svc = new WorkflowService(makeDb([{ number: 7, sourceBranch: 'feat/x', targetBranch: 'dev', state: 'open' }]), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
785
+ const svc = new VersionControlService(makeDb([{ number: 7, sourceBranch: 'feat/x', targetBranch: 'dev', state: 'open' }]), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
788
786
  await expect(svc.deleteBranch('w1', 'feat/x', makeUser())).rejects.toThrow(/open change request \(#7\)/);
789
787
  expect(git.deleteBranch).not.toHaveBeenCalled();
790
788
  });
791
789
 
792
790
  it('deleteBranch refuses when an open request proposes INTO the branch (target end)', async () => {
793
791
  const git = makeGit();
794
- const svc = new WorkflowService(makeDb([{ number: 9, sourceBranch: 'other/y', targetBranch: 'feat/x', state: 'open' }]), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
792
+ const svc = new VersionControlService(makeDb([{ number: 9, sourceBranch: 'other/y', targetBranch: 'feat/x', state: 'open' }]), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
795
793
  await expect(svc.deleteBranch('w1', 'feat/x', makeUser())).rejects.toThrow(/proposes changes into/);
796
794
  expect(git.deleteBranch).not.toHaveBeenCalled();
797
795
  });
798
796
 
799
797
  it('deleteBranch proceeds past a CLOSED request — the guard filters on state, not mere mention', async () => {
800
798
  const git = makeGit();
801
- const svc = new WorkflowService(makeDb([{ number: 7, sourceBranch: 'feat/x', targetBranch: 'dev', state: 'closed' }]), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
799
+ const svc = new VersionControlService(makeDb([{ number: 7, sourceBranch: 'feat/x', targetBranch: 'dev', state: 'closed' }]), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
802
800
  await expect(svc.deleteBranch('w1', 'feat/x', makeUser())).resolves.toBeUndefined();
803
801
  expect(git.deleteBranch).toHaveBeenCalled();
804
802
  });
805
803
 
806
804
  it('deleteBranch deletes when the branch has no open change request', async () => {
807
805
  const git = makeGit();
808
- const svc = new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
806
+ const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
809
807
  await expect(svc.deleteBranch('w1', 'feat/x', makeUser())).resolves.toBeUndefined();
810
808
  expect(git.deleteBranch).toHaveBeenCalledWith('w1', 'feat/x', expect.objectContaining({ email: 'alice@example.com' }), undefined);
811
809
  });
@@ -825,7 +823,7 @@ describe('WorkflowService — file lock delegation', () => {
825
823
  vi.mocked(git.deleteBranch)
826
824
  .mockImplementationOnce(async () => { order.push('first:start'); await gate; order.push('first:end'); return { lastCommit: null }; })
827
825
  .mockImplementationOnce(async () => { order.push('second'); return { lastCommit: null }; });
828
- const svc = new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
826
+ const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
829
827
  const first = svc.deleteBranch('w1', 'feat/x', makeUser());
830
828
  const second = svc.deleteBranch('w1', 'feat/x', makeUser());
831
829
  // Only release the gate once the first operation is provably inside its
@@ -840,7 +838,7 @@ describe('WorkflowService — file lock delegation', () => {
840
838
  it('releaseLock refuses when the caller does not hold the lock', async () => {
841
839
  const git = makeGit();
842
840
  const fileLocks = makeFileLockService(); // default: get → null
843
- const svc = new WorkflowService(makeDb(), git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
841
+ const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
844
842
  await expect(svc.releaseLock('w1', 'feat', 'Foo.md', makeUser())).rejects.toThrow(/not held by you/);
845
843
  // The commit must NOT run when the caller doesn't hold the lock —
846
844
  // otherwise a non-holder could trigger a commit attributed as them.
@@ -854,7 +852,7 @@ describe('WorkflowService — file lock delegation', () => {
854
852
  * predicate, the restore→commit→push order, the lock discipline, and the
855
853
  * authoritative emptiness re-check before anything closes.
856
854
  */
857
- describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest', () => {
855
+ describe('VersionControlService — revertChangeRequestFile / closeEmptyChangeRequest', () => {
858
856
  const SUMMARY = { number: 7, base: 'main', branch: 'ali/x', state: 'open' };
859
857
 
860
858
  function makeRevertGit(overrides: Record<string, unknown> = {}): GitService {
@@ -875,7 +873,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
875
873
  canWriteAtRef?: boolean | null;
876
874
  prState?: string;
877
875
  updateRows?: unknown[];
878
- events?: WorkflowEventBus;
876
+ events?: VersionControlEventBus;
879
877
  } = {}) {
880
878
  const git = opts.git ?? makeRevertGit();
881
879
  const prs = makePrs();
@@ -902,7 +900,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
902
900
  returning: vi.fn(async () => updateRows),
903
901
  });
904
902
  const db = chain as unknown as Database;
905
- const svc = new WorkflowService(db, git, prs, makeReviewWorkflow(), makeWorkspaceService(), access, fileLocks, makePendingCommits(), testKbContext(), openChangeGate(), opts.events);
903
+ const svc = new VersionControlService(db, git, prs, makeChangeRequestReview(), makeWorkspaceService(), access, fileLocks, makePendingCommits(), testKbContext(), openChangeGate(), opts.events);
906
904
  return { svc, git, prs, access, fileLocks, db: chain };
907
905
  }
908
906
 
@@ -1057,7 +1055,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
1057
1055
  // so the cooperative pull runs first; it changes nothing here.
1058
1056
  pull: vi.fn().mockResolvedValue({ treeChanged: false }),
1059
1057
  });
1060
- const { svc, fileLocks, prs, db } = makeHarness({ git, events: { emit } as unknown as WorkflowEventBus });
1058
+ const { svc, fileLocks, prs, db } = makeHarness({ git, events: { emit } as unknown as VersionControlEventBus });
1061
1059
 
1062
1060
  const err = await svc.revertChangeRequestFile(7, makeUser(), 'Docs/a.md').catch((e: unknown) => e);
1063
1061
  expect(err).toBeInstanceOf(PushNeedsAgentResolutionError);
@@ -1091,7 +1089,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
1091
1089
  const emit = vi.fn();
1092
1090
  const push = vi.fn().mockRejectedValueOnce(REFUSED).mockRejectedValueOnce(REFUSED).mockResolvedValue(undefined);
1093
1091
  const git = makeRevertGit({ push, pull: vi.fn().mockResolvedValue({ treeChanged: false }) });
1094
- const { svc } = makeHarness({ git, events: { emit } as unknown as WorkflowEventBus });
1092
+ const { svc } = makeHarness({ git, events: { emit } as unknown as VersionControlEventBus });
1095
1093
 
1096
1094
  await expect(svc.revertChangeRequestFile(7, makeUser(), 'Docs/a.md')).rejects.toBeInstanceOf(
1097
1095
  PushNeedsAgentResolutionError,
@@ -1129,7 +1127,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
1129
1127
  new Error("fatal: unable to access 'https://github.com/acme/kb.git/': The requested URL returned error: 403"),
1130
1128
  );
1131
1129
  const git = makeRevertGit({ push, pull });
1132
- const { svc } = makeHarness({ git, events: { emit } as unknown as WorkflowEventBus });
1130
+ const { svc } = makeHarness({ git, events: { emit } as unknown as VersionControlEventBus });
1133
1131
 
1134
1132
  await expect(svc.revertChangeRequestFile(7, makeUser(), 'Docs/a.md')).rejects.toBeInstanceOf(
1135
1133
  PushNeedsAgentResolutionError,
@@ -1149,7 +1147,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
1149
1147
  .mockResolvedValue(undefined);
1150
1148
  const pull = vi.fn().mockResolvedValue({ treeChanged: true });
1151
1149
  const git = makeRevertGit({ push, pull });
1152
- const { svc } = makeHarness({ git, events: { emit } as unknown as WorkflowEventBus });
1150
+ const { svc } = makeHarness({ git, events: { emit } as unknown as VersionControlEventBus });
1153
1151
 
1154
1152
  await expect(svc.revertChangeRequestFile(7, makeUser(), 'Docs/a.md')).resolves.toMatchObject({ closed: false });
1155
1153
  expect(push).toHaveBeenCalledTimes(2);
@@ -1204,7 +1202,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
1204
1202
  });
1205
1203
  });
1206
1204
 
1207
- describe('WorkflowService — deleteChangeRequest (the author’s and the admin’s verb)', () => {
1205
+ describe('VersionControlService — deleteChangeRequest (the author’s and the admin’s verb)', () => {
1208
1206
  const AUTHOR_EMAIL = 'alice@example.com'; // makeUser()'s default caller
1209
1207
  const STRANGER_AUTHOR = 'mallory@example.com';
1210
1208
 
@@ -1252,7 +1250,7 @@ describe('WorkflowService — deleteChangeRequest (the author’s and the admin
1252
1250
  returning: vi.fn(async () => [{ id: 1 }]),
1253
1251
  });
1254
1252
  const workspaces = makeWorkspaceService();
1255
- const svc = new WorkflowService(chain as unknown as Database, git, prs, makeReviewWorkflow(), workspaces, access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
1253
+ const svc = new VersionControlService(chain as unknown as Database, git, prs, makeChangeRequestReview(), workspaces, access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
1256
1254
  return { svc, prs, db: chain, access, workspaces, git };
1257
1255
  }
1258
1256
 
@@ -1426,7 +1424,7 @@ describe('WorkflowService — deleteChangeRequest (the author’s and the admin
1426
1424
  });
1427
1425
  });
1428
1426
 
1429
- describe('WorkflowService.mergeBranch — an agent merges branches, never an open change request', () => {
1427
+ describe('VersionControlService.mergeBranch — an agent merges branches, never an open change request', () => {
1430
1428
  // One open request, `alice/feat` → the protected default branch;
1431
1429
  // `alice/other` is an unprotected draft with no request.
1432
1430
  const PROTECTED = DEFAULT_BRANCH;
@@ -1466,7 +1464,7 @@ describe('WorkflowService.mergeBranch — an agent merges branches, never an ope
1466
1464
  const unpushed = await (git as unknown as { hasUnpushedCommits: (id: string) => Promise<boolean> })
1467
1465
  .hasUnpushedCommits(workspaceId);
1468
1466
  if (dirty.length > 0 || unpushed) {
1469
- throw new WorkflowDomainError(
1467
+ throw new VersionControlDomainError(
1470
1468
  `"${target}" has edits that are not shared yet.`,
1471
1469
  409,
1472
1470
  { kind: 'merge-target-busy', targetBranch: target },
@@ -1489,7 +1487,7 @@ describe('WorkflowService.mergeBranch — an agent merges branches, never an ope
1489
1487
  (access.canWriteBatchAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(opts.canWrite === undefined ? null : opts.canWrite);
1490
1488
  const workspaceService = makeWorkspaceService();
1491
1489
  const pending = opts.pending ?? makePendingCommits();
1492
- const svc = new WorkflowService(makeDb([OPEN_REQUEST]), git, makePrs(), makeReviewWorkflow(), workspaceService, access, makeFileLockService(), pending, testKbContext(), openChangeGate());
1490
+ const svc = new VersionControlService(makeDb([OPEN_REQUEST]), git, makePrs(), makeChangeRequestReview(), workspaceService, access, makeFileLockService(), pending, testKbContext(), openChangeGate());
1493
1491
  const merge = (git as unknown as { mergeChangeRequest: ReturnType<typeof vi.fn> }).mergeChangeRequest;
1494
1492
  return { svc, git, access, merge, pending };
1495
1493
  }
@@ -1614,7 +1612,7 @@ describe('WorkflowService.mergeBranch — an agent merges branches, never an ope
1614
1612
  * refuses must not undo the open: the merge is committed locally, the request
1615
1613
  * is a DB row, and the next push of the branch carries the commits.
1616
1614
  */
1617
- describe('WorkflowService.openChangeRequest — when the repository host refuses the push', () => {
1615
+ describe('VersionControlService.openChangeRequest — when the repository host refuses the push', () => {
1618
1616
  const INPUT = { sourceBranch: 'ali/x', targetBranch: 'main', title: 'Tidy the glossary' };
1619
1617
 
1620
1618
  function makeOpenHarness(push: ReturnType<typeof vi.fn>) {
@@ -1629,10 +1627,10 @@ describe('WorkflowService.openChangeRequest — when the repository host refuses
1629
1627
  (prs.getPrDetail as ReturnType<typeof vi.fn>).mockResolvedValue({ number: 12, branch: 'ali/x', base: 'main' });
1630
1628
  const values = vi.fn(() => ({ returning: vi.fn(async () => [{ number: 12 }]) }));
1631
1629
  const db = { insert: vi.fn(() => ({ values })) } as unknown as Database;
1632
- const svc = new WorkflowService(
1633
- db, git, prs, makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(),
1630
+ const svc = new VersionControlService(
1631
+ db, git, prs, makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(),
1634
1632
  makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate(),
1635
- { emit } as unknown as WorkflowEventBus,
1633
+ { emit } as unknown as VersionControlEventBus,
1636
1634
  );
1637
1635
  return { svc, git, prs, values, emit };
1638
1636
  }
@@ -1716,7 +1714,7 @@ describe('WorkflowService.openChangeRequest — when the repository host refuses
1716
1714
  * people the `## Affected owners` block lists, resolved to accounts and
1717
1715
  * handed over once each; who could not be is counted.
1718
1716
  */
1719
- describe('WorkflowService.openChangeRequest — tells the change-request listeners', () => {
1717
+ describe('VersionControlService.openChangeRequest — tells the change-request listeners', () => {
1720
1718
  const INPUT = { sourceBranch: 'ali/x', targetBranch: 'main', title: ' Tidy the glossary ' };
1721
1719
  const PATHS = ['KnowledgeBase/Sales/Deal.md', 'KnowledgeBase/Legal/Terms.md'];
1722
1720
  const ACCOUNTS: Record<string, { id: string; email: string; name: string }> = {
@@ -1800,10 +1798,10 @@ describe('WorkflowService.openChangeRequest — tells the change-request listene
1800
1798
  return found;
1801
1799
  }),
1802
1800
  };
1803
- const svc = new WorkflowService(
1804
- db, git, prs, makeReviewWorkflow(), workspaces, access,
1801
+ const svc = new VersionControlService(
1802
+ db, git, prs, makeChangeRequestReview(), workspaces, access,
1805
1803
  makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate(),
1806
- { emit: vi.fn() } as unknown as WorkflowEventBus, undefined, undefined, hooks, accounts,
1804
+ { emit: vi.fn() } as unknown as VersionControlEventBus, undefined, undefined, hooks, accounts,
1807
1805
  );
1808
1806
  return { svc, run, prs, access, accounts, values };
1809
1807
  }
@@ -1934,13 +1932,13 @@ describe('WorkflowService.openChangeRequest — tells the change-request listene
1934
1932
  expect(failing.run.mock.calls[0]![0]).toMatchObject({ number: 12, pushPending: false });
1935
1933
 
1936
1934
  const missing = makeNotifyHarness({ detail: vi.fn().mockResolvedValue(null) });
1937
- await expect(missing.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT)).rejects.toBeInstanceOf(WorkflowValidationError);
1935
+ await expect(missing.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT)).rejects.toBeInstanceOf(VersionControlValidationError);
1938
1936
  expect(missing.run).toHaveBeenCalledTimes(1);
1939
1937
  });
1940
1938
 
1941
1939
  it('a refused open tells nobody: a validation failure, a conflicting auto-merge', async () => {
1942
1940
  const invalid = makeNotifyHarness();
1943
- await expect(invalid.svc.openChangeRequest('ali%2Fx', makeUser(), { ...INPUT, title: ' ' })).rejects.toBeInstanceOf(WorkflowValidationError);
1941
+ await expect(invalid.svc.openChangeRequest('ali%2Fx', makeUser(), { ...INPUT, title: ' ' })).rejects.toBeInstanceOf(VersionControlValidationError);
1944
1942
  expect(invalid.run).not.toHaveBeenCalled();
1945
1943
  expect(invalid.values).not.toHaveBeenCalled();
1946
1944
 
@@ -1967,7 +1965,7 @@ describe('WorkflowService.openChangeRequest — tells the change-request listene
1967
1965
  * for the source's queue first — bounded, outside the lifecycle locks — and
1968
1966
  * says plainly when there was nothing to merge.
1969
1967
  */
1970
- describe('WorkflowService.mergeBranch — waits for the source branch\'s pending commits', () => {
1968
+ describe('VersionControlService.mergeBranch — waits for the source branch\'s pending commits', () => {
1971
1969
  const SOURCE = 'alice/other';
1972
1970
  const TARGET = 'alice/feat';
1973
1971
 
@@ -2031,9 +2029,9 @@ describe('WorkflowService.mergeBranch — waits for the source branch\'s pending
2031
2029
  (git as unknown as Record<string, unknown>).remoteBranchExists = vi.fn().mockResolvedValue(true);
2032
2030
  const merge = vi.fn(async (): Promise<unknown> => ({ kind: 'merged', sha: 'merge-sha', mergeCommit: 'merge-sha' }));
2033
2031
  (git as unknown as Record<string, unknown>).mergeChangeRequest = merge;
2034
- const svc = new WorkflowService(
2032
+ const svc = new VersionControlService(
2035
2033
  makeDb([{ number: 12, sourceBranch: 'alice/feat', targetBranch: DEFAULT_BRANCH, state: 'open' }]),
2036
- git, makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(),
2034
+ git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(),
2037
2035
  pending, testKbContext(), openChangeGate(),
2038
2036
  );
2039
2037
  svc.mergeWaitForPendingCommits = wait;
@@ -2057,7 +2055,7 @@ describe('WorkflowService.mergeBranch — waits for the source branch\'s pending
2057
2055
  // after a moment, the way a commit + push takes a few seconds.
2058
2056
  const worker = new PendingCommitsWorker({
2059
2057
  service,
2060
- workflow: {
2058
+ versionControl: {
2061
2059
  runPendingCommit: async (_ws: string, branch: string, path: string) => {
2062
2060
  await new Promise((r) => setTimeout(r, 150));
2063
2061
  remote.get(branch)!.add(path);
@@ -2109,8 +2107,8 @@ describe('WorkflowService.mergeBranch — waits for the source branch\'s pending
2109
2107
  });
2110
2108
 
2111
2109
  it('bounds the wait well inside the timeout an agent\'s call is forwarded under', () => {
2112
- const svc = new WorkflowService(
2113
- makeDb(), makeGit(), makePrs(), makeReviewWorkflow(), makeWorkspaceService(), makeAccessControl(),
2110
+ const svc = new VersionControlService(
2111
+ makeDb(), makeGit(), makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(),
2114
2112
  makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate(),
2115
2113
  );
2116
2114
  // Over `/api/mcp` the call reaches the tool through `@utcp/http`, whose
@@ -2201,11 +2199,11 @@ describe('WorkflowService.mergeBranch — waits for the source branch\'s pending
2201
2199
  it('leaves the app\'s change-request apply as it was: no wait, same outcome', async () => {
2202
2200
  const { service } = memoryQueue([row({ branch: 'alice/feat' })]);
2203
2201
  const prs = makePrs();
2204
- const reviewWorkflow = makeReviewWorkflow();
2202
+ const changeRequestReview = makeChangeRequestReview();
2205
2203
  const mergeResult = { prNumber: 4, sha: 'abc', mergedAt: 't' };
2206
- (reviewWorkflow.mergePr as ReturnType<typeof vi.fn>).mockResolvedValue(mergeResult);
2204
+ (changeRequestReview.mergePr as ReturnType<typeof vi.fn>).mockResolvedValue(mergeResult);
2207
2205
  (prs.getPr as ReturnType<typeof vi.fn>).mockResolvedValue({ branch: 'alice/feat', base: 'main' });
2208
- const svc = new WorkflowService(makeDb(), makeGit(), prs, reviewWorkflow, makeWorkspaceService(), makeAccessControl(), makeFileLockService(), service, testKbContext(), openChangeGate());
2206
+ const svc = new VersionControlService(makeDb(), makeGit(), prs, changeRequestReview, makeWorkspaceService(), makeAccessControl(), makeFileLockService(), service, testKbContext(), openChangeGate());
2209
2207
  const outcome = await svc.mergeChangeRequest(4, makeUser(), 'sha', [], 'open', 'PR title', 'main', 'w1', { bypass: true });
2210
2208
  expect(outcome).toEqual({ kind: 'merged', result: mergeResult });
2211
2209
  expect(service.queuedOnBranch).not.toHaveBeenCalled();