@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
@@ -454,6 +454,20 @@ export class ToolManualService implements IToolManualService {
454
454
  }));
455
455
  }
456
456
 
457
+ async sharedSignInKeysForManual(
458
+ manualName: string,
459
+ ): Promise<{ key: string; name: string; label: string | null; oauthScopes?: string[] }[]> {
460
+ const manual = (await this.scan()).manuals.find((m) => m.name === manualName);
461
+ return (manual?.variables ?? [])
462
+ .filter((v) => v.scope === 'admin' && v.oauth != null)
463
+ .map((v) => ({
464
+ key: utcpNamespacedKey(manualName, v.name),
465
+ name: v.name,
466
+ label: v.label ?? null,
467
+ oauthScopes: v.oauth?.scopes,
468
+ }));
469
+ }
470
+
457
471
  async scopeOfVariable(effectiveKey: string): Promise<ToolVariableScope> {
458
472
  // UTCP looks up `<namespace-with-doubled-underscores>_<VAR>`. Find the manual
459
473
  // whose namespace prefixes this key; the declared var is the remainder. Match
@@ -802,6 +816,10 @@ export class ToolManualService implements IToolManualService {
802
816
  if (m.type !== 'mcp') continue;
803
817
  const oauthVar = (m.variables ?? []).find((v) => v.oauth != null);
804
818
  if (oauthVar) {
819
+ // A MANAGED sign-in has nothing for an owner to set up here: its
820
+ // client is the broker's, its endpoints are in the file. No setup
821
+ // kind, so no surface asks for a client secret it does not need.
822
+ if (oauthVar.oauth?.managed) continue;
805
823
  // An owner-registered client is `oauth-manual` by definition — whether
806
824
  // the declaration is complete or still needs its endpoints discovered.
807
825
  // Explicit wins over discovery: never registered over, never probed
@@ -909,8 +927,15 @@ export class ToolManualService implements IToolManualService {
909
927
  m.setup = { kind: 'oauth-manual', reason: `sign-in endpoint discovery is unavailable — ${declaredByHand}` };
910
928
  return;
911
929
  }
930
+ // A file-declared sign-in carries its client id unless it is managed, and
931
+ // a managed one has nothing to discover: its endpoints are in the file.
932
+ const clientId = v.oauth?.clientId;
933
+ if (!clientId) {
934
+ m.setup = { kind: 'oauth-manual', reason: `the sign-in names no client id — ${declaredByHand}` };
935
+ return;
936
+ }
912
937
  try {
913
- const found = await discovery.providerForDeclaredClient(m.name, m.url!, v.oauth!.clientId);
938
+ const found = await discovery.providerForDeclaredClient(m.name, m.url!, clientId);
914
939
  if (found.status !== 'oauth') {
915
940
  m.setup = {
916
941
  kind: 'oauth-manual',
@@ -1579,8 +1604,11 @@ function normalizeVariables(raw: unknown): ToolVariable[] {
1579
1604
  const label = typeof e.label === 'string' && e.label.trim() ? e.label.trim() : undefined;
1580
1605
  const oauth = normalizeVariableOAuth(at, e.oauth);
1581
1606
  // OAuth is inherently per-caller — each user signs in for their own token. An
1582
- // admin-shared OAuth token would leak one user's token to all callers.
1583
- if (oauth && scope !== 'user') {
1607
+ // admin-shared OAuth token would leak one user's token to all callers. The
1608
+ // one exception is a MANAGED sign-in enabled as a workspace connection:
1609
+ // there the shared token is the point (one CRM account for the company),
1610
+ // and only an owner of the tool can make it.
1611
+ if (oauth && scope !== 'user' && !oauth.managed) {
1584
1612
  throw new Error(`${at}\` has \`oauth\`, so its \`scope\` must be \`user\``);
1585
1613
  }
1586
1614
  return {
@@ -1640,8 +1668,27 @@ function normalizeVariableOAuth(at: string, raw: unknown): ToolVariableOAuth | u
1640
1668
  };
1641
1669
  const authorizationUrl = safeUrl(o.authorizationUrl, 'authorizationUrl');
1642
1670
  const tokenUrl = safeUrl(o.tokenUrl, 'tokenUrl');
1671
+ // A managed sign-in names the platform connector it goes through instead
1672
+ // of a client id: the client is the broker's. Both parts are ids of OURS
1673
+ // (matched against the catalog later), so the shape check here is all the
1674
+ // file gets — and neither value is repeated in a refusal.
1675
+ let managed: { connectorId: string; scopeSet: string } | undefined;
1676
+ if (o.managed !== undefined) {
1677
+ const m = o.managed as Record<string, unknown> | null;
1678
+ const connectorId = m && typeof m === 'object' && typeof m.connectorId === 'string' ? m.connectorId.trim() : '';
1679
+ const scopeSet = m && typeof m === 'object' && typeof m.scopeSet === 'string' ? m.scopeSet.trim() : '';
1680
+ if (!isValidId(connectorId) || !isValidId(scopeSet)) {
1681
+ throw new Error(`${at}.oauth.managed\` must be { connectorId, scopeSet } (lowercase snake_case ids)`);
1682
+ }
1683
+ managed = { connectorId, scopeSet };
1684
+ }
1643
1685
  const clientId = typeof o.clientId === 'string' && o.clientId.trim() ? o.clientId.trim() : '';
1644
- if (!clientId) throw new Error(`${at}.oauth.clientId\` is required`);
1686
+ if (!clientId && !managed) throw new Error(`${at}.oauth.clientId\` is required`);
1687
+ // One client or the other: a managed sign-in runs with the broker's app, and
1688
+ // a client id beside it would be a declaration two flows claim.
1689
+ if (clientId && managed) {
1690
+ throw new Error(`${at}.oauth\` names both \`managed\` and a \`clientId\`; a managed sign-in has no client of its own`);
1691
+ }
1645
1692
  let scopes: string[] | undefined;
1646
1693
  if (o.scopes !== undefined) {
1647
1694
  if (!Array.isArray(o.scopes) || !o.scopes.every((s) => typeof s === 'string')) {
@@ -1670,11 +1717,12 @@ function normalizeVariableOAuth(at: string, raw: unknown): ToolVariableOAuth | u
1670
1717
  return {
1671
1718
  authorizationUrl,
1672
1719
  tokenUrl,
1673
- clientId,
1720
+ ...(clientId ? { clientId } : {}),
1674
1721
  ...(scopes ? { scopes } : {}),
1675
1722
  ...(authParams ? { authParams } : {}),
1676
1723
  ...(o.pkce === false ? { pkce: false } : {}),
1677
1724
  ...(resource ? { resource } : {}),
1725
+ ...(managed ? { managed } : {}),
1678
1726
  };
1679
1727
  }
1680
1728
 
@@ -7,7 +7,7 @@ import type { IAccessControl } from '../access/index.js';
7
7
  import { utcpNamespacedKey } from '../../shared/utcp-namespace.js';
8
8
  import type { ConnectorScope, IToolManualService } from './tool-manuals.contract.js';
9
9
  import type { HiddenToolSource } from '../../shared/hidden-tools.js';
10
- import { userSecretGap } from '../secrets-vault/index.js';
10
+ import { scopesCovered, userSecretGap } from '../secrets-vault/index.js';
11
11
 
12
12
  /**
13
13
  * What `list_tool_setup` needs from the secrets vault (structurally satisfied
@@ -29,6 +29,9 @@ export interface VariableStatusPort {
29
29
  adminKind?: 'static' | 'oauth' | null;
30
30
  userConfigured: boolean;
31
31
  userAuthorized?: boolean;
32
+ /** For a shared (workspace) sign-in: the owner's row holds tokens, and what they were granted. */
33
+ adminAuthorized?: boolean;
34
+ adminGrantedScopes?: string;
32
35
  userKind?: 'static' | 'oauth' | null;
33
36
  grantedScopes?: string;
34
37
  }[]
@@ -116,18 +119,15 @@ export function registerToolManualsTools(
116
119
  // hidden tool's entry CONTAINS is on the field below rather than here.
117
120
  description:
118
121
  'Configuration status of every `.tool` the current user can access: what each needs set up and what is ' +
119
- 'configured, as `{ tools, invalid, onBranchOnly, note? }`. Scoped to the CALLER: a `.tool` it cannot ' +
120
- 'READ is absent, and every flag is the caller\'s own. ' +
121
- 'Secret VALUES are never returned and can never be set through a tool: an admin enters them in the tool ' +
122
- 'editor; users sign in on /connect. ' +
123
- 'Setting a tool\'s shared secrets is gated by `canWrite` on the `.tool` FILE (its frontmatter ' +
124
- '`write:`/`owner:` verbs and the access.md chain), NOT by a platform role: who manages the file configures ' +
125
- 'the tool. ' +
126
- '`hiddenTools` names the tools Hexis hides from agents for an invalid schema. ' +
127
- 'The listing is the RELEASED catalog, built from the default branch only: a server or `.tool` you declared on a ' +
128
- 'draft is not listed, callable or signed-in-able until it is merged. Pass `branch` (the draft you wrote the ' +
129
- 'declaration on) and `onBranchOnly` names every tool declared there that the default branch does not serve ' +
130
- 'yet — open a change request and ask the user to merge it.',
122
+ 'configured, as `{ tools, invalid, onBranchOnly, note? }`. Scoped to the CALLER: a `.tool` it cannot READ is ' +
123
+ "absent, and a `user` variable's flags are the caller's own. An `admin` variable with `oauth` is a WORKSPACE " +
124
+ "connection: `authorized` is the owner's connection, which only a writer of the tool can make or remake. " +
125
+ 'Secret VALUES are never returned or set through a tool: an admin enters them in the tool editor; users sign ' +
126
+ 'in on /connect. Setting shared secrets is gated by `canWrite` on the `.tool` FILE (its frontmatter verbs and ' +
127
+ 'the access.md chain), not by a platform role. `hiddenTools` names the tools Hexis hides for an invalid ' +
128
+ 'schema. The listing is the RELEASED catalog (default branch only): a server or `.tool` declared on a draft is ' +
129
+ 'not listed, callable or signed-in-able until merged. Pass `branch` and `onBranchOnly` names every tool ' +
130
+ 'declared there that the default branch does not serve yet — open a change request and ask the user to merge it.',
131
131
  path: '/api/agent/tools/list_tool_setup',
132
132
  inputs: {
133
133
  type: 'object',
@@ -211,7 +211,22 @@ export function registerToolManualsTools(
211
211
  'Shared value set (plain admin vars), or the owner finished provider setup (OAuth vars).',
212
212
  },
213
213
  userConfigured: { type: 'boolean' },
214
- authorized: { type: ['boolean', 'null'], description: 'OAuth vars: current user signed in.' },
214
+ authorized: {
215
+ type: ['boolean', 'null'],
216
+ description:
217
+ 'OAuth vars: a token is stored that covers the declared scopes — the current user\'s for a `user` ' +
218
+ 'variable, the WORKSPACE connection an owner made for an `admin` one (a managed connector enabled ' +
219
+ 'as one shared connection; a reader cannot connect that, a writer of the tool can).',
220
+ },
221
+ managed: {
222
+ type: 'object',
223
+ description:
224
+ 'Present when the sign-in goes through a managed connector (the distribution\'s own OAuth app, a ' +
225
+ 'broker doing the round-trip): which connector and scope set. Members connect on /connect; an ' +
226
+ 'owner needs no client secret for it.',
227
+ properties: { connectorId: { type: 'string' }, scopeSet: { type: 'string' } },
228
+ required: ['connectorId', 'scopeSet'],
229
+ },
215
230
  },
216
231
  required: ['name', 'scope', 'oauth', 'adminConfigured', 'userConfigured'],
217
232
  },
@@ -304,6 +319,16 @@ export function registerToolManualsTools(
304
319
  variables: (m.variables ?? []).map((v) => {
305
320
  const st = statusByKey.get(varKey(m.name, v.name));
306
321
  const isOAuth = v.oauth != null;
322
+ // A sign-in counts as authorized when a token is stored AND it
323
+ // still covers what the tool declares — the one readiness rule,
324
+ // so this flag agrees with the sign-in note below. A shared
325
+ // sign-in (a managed workspace connection) reads the owner's
326
+ // row: it is everyone's once an owner has connected it.
327
+ const authorized = isOAuth
328
+ ? v.scope === 'admin'
329
+ ? st?.adminAuthorized === true && scopesCovered(v.oauth?.scopes, st.adminGrantedScopes)
330
+ : st?.userAuthorized === true && scopesCovered(v.oauth?.scopes, st.grantedScopes)
331
+ : null;
307
332
  return {
308
333
  name: v.name,
309
334
  scope: v.scope,
@@ -311,7 +336,8 @@ export function registerToolManualsTools(
311
336
  oauth: isOAuth,
312
337
  adminConfigured: st?.adminConfigured ?? false,
313
338
  userConfigured: st?.userConfigured ?? false,
314
- authorized: isOAuth ? (st?.userAuthorized ?? false) : null,
339
+ authorized,
340
+ ...(v.oauth?.managed ? { managed: v.oauth.managed } : {}),
315
341
  };
316
342
  }),
317
343
  };
@@ -3,8 +3,8 @@ import express from 'express';
3
3
  import { describe, expect, it } from 'vitest';
4
4
  import { inputSchemaDefect } from '@bevel-software/platform-mcp-core';
5
5
  import { ToolRegistry } from '../tool-registry.js';
6
- import { registerWorkflowTools } from '../../workflow/agent-tools/workflow.tools.js';
7
- import { registerChangeRequestReadTools } from '../../workflow/agent-tools/change-request-read.tools.js';
6
+ import { registerVersionControlTools } from '../../version-control/agent-tools/version-control.tools.js';
7
+ import { registerChangeRequestReadTools } from '../../version-control/agent-tools/change-request-read.tools.js';
8
8
  import { registerWorkspaceTools } from '../../workspace/workspace.tools.js';
9
9
  import { registerSkillsTools } from '../../skills/skills.tools.js';
10
10
  import { registerPluginsTools } from '../../plugins/plugins.tools.js';
@@ -58,8 +58,8 @@ const CORE_SERVER_SOURCE = new URL('../../../core/create-core-server.ts', import
58
58
  /** Every tool-registering module, by the name the server calls it under. */
59
59
  const MODULES: ReadonlyArray<{ name: string; register: (registry: ToolRegistry) => void }> = [
60
60
  {
61
- name: 'registerWorkflowTools',
62
- register: (registry) => registerWorkflowTools(registry, express.Router(), pass, handler, testKbContext(), async () => true, { canRead: async () => true, canReadAtRef: async () => true, canReadBatch: async () => new Map(), canReadBatchAtRef: async () => new Map(), canWrite: async () => true } as never, { recoveryBotEmail: 'recovery@x', hooks: { runAgentRead: async () => undefined }, notes: { onChange: () => undefined } } as never),
61
+ name: 'registerVersionControlTools',
62
+ register: (registry) => registerVersionControlTools(registry, express.Router(), pass, handler, testKbContext(), async () => true, { canRead: async () => true, canReadAtRef: async () => true, canReadBatch: async () => new Map(), canReadBatchAtRef: async () => new Map(), canWrite: async () => true } as never, { recoveryBotEmail: 'recovery@x', hooks: { runAgentRead: async () => undefined }, notes: { onChange: () => undefined } } as never),
63
63
  },
64
64
  {
65
65
  name: 'registerChangeRequestReadTools',
@@ -13,8 +13,8 @@ import {
13
13
  createToolHintsRoutes,
14
14
  } from '../index.js';
15
15
  import { toolDef } from '../../tool-helpers/index.js';
16
- import { registerWorkflowTools } from '../../workflow/agent-tools/workflow.tools.js';
17
- import { registerChangeRequestReadTools } from '../../workflow/agent-tools/change-request-read.tools.js';
16
+ import { registerVersionControlTools } from '../../version-control/agent-tools/version-control.tools.js';
17
+ import { registerChangeRequestReadTools } from '../../version-control/agent-tools/change-request-read.tools.js';
18
18
  import { registerWorkspaceTools } from '../../workspace/workspace.tools.js';
19
19
  import { registerSkillsTools } from '../../skills/index.js';
20
20
  import { registerPluginsTools } from '../../plugins/index.js';
@@ -98,7 +98,7 @@ const INTERNAL_ONLY = new Set(['switch_branch']);
98
98
  function platformRegistry(): ToolRegistry {
99
99
  const registry = new ToolRegistry();
100
100
  const kb = testKbContext();
101
- registerWorkflowTools(registry, express.Router(), pass, handler, kb, async () => true);
101
+ registerVersionControlTools(registry, express.Router(), pass, handler, kb, async () => true);
102
102
  registerChangeRequestReadTools(registry, express.Router(), pass, handler, nothing, kb);
103
103
  registerWorkspaceTools(
104
104
  registry,
@@ -130,7 +130,7 @@ describe('no Hexis tool description is long enough to be cut', () => {
130
130
  // purpose, and this assertion is what keeps that a stated fact rather than
131
131
  // an oversight: if it ever reaches the catalog, the cap test above measures
132
132
  // it like everything else.
133
- const { createCallToolChainTool } = await import('../../code-mode/code-mode.tool.js');
133
+ const { createCallToolChainTool } = await import('../../code-mode/index.js');
134
134
  const mastraTool = createCallToolChainTool(unused(), unused(), EXTERNAL_KB_MANUAL_NAME) as unknown as {
135
135
  description: string;
136
136
  };
@@ -218,14 +218,14 @@ describe('the shared rules describe the tools they name', () => {
218
218
  // The opener is only honest if the rules it points at are THERE. These
219
219
  // two were paragraphs of the chain's description; they moved, whole, and a
220
220
  // description that kept them as well would be the long one a client cuts.
221
- const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'tool-chain')!;
221
+ const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'tool-chain')!;
222
222
  expect(rule.body).toContain(CHAIN_FAILURES_RULE);
223
223
  expect(rule.body).toContain(CHAIN_LARGE_RESULTS_RULE);
224
224
  const served = (await hexisTools()).find((t) => t.name === CALL_TOOL_CHAIN_NAME)!;
225
225
  expect(served.description).not.toContain(CHAIN_FAILURES_RULE);
226
226
  expect(served.description).not.toContain(CHAIN_LARGE_RESULTS_RULE);
227
227
  // What a chained read does to an image was already one of the shared rules.
228
- const content = sharedFileRules(testKbContext().layout).find((r) => r.id === 'content-kinds')!;
228
+ const content = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'content-kinds')!;
229
229
  expect(content.body).toContain('image_omitted');
230
230
  });
231
231
 
@@ -244,7 +244,7 @@ describe('the shared rules describe the tools they name', () => {
244
244
  // rejects: `delete_file` has no `dryRun`, so an agent told to preflight a
245
245
  // single-file delete gets a validation error on the safe call and learns to
246
246
  // skip it. Read off the schemas rather than asserted by hand.
247
- const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'dry-run-confirm')!;
247
+ const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'dry-run-confirm')!;
248
248
  const tools = await hexisTools();
249
249
  // `toolDef` wraps a tool's own inputs under `body`, which is the schema a
250
250
  // client validates against — so that is where the argument either is or is not.
@@ -272,7 +272,7 @@ describe('the shared rules describe the tools they name', () => {
272
272
  });
273
273
 
274
274
  it('gives each platform file the depth it actually counts at', () => {
275
- const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'managed-items')!;
275
+ const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'managed-items')!;
276
276
  const { anyDepth, rootOnly } = platformFilesByDepth(testKbContext().layout);
277
277
  // The split is the half of the rule a list of names leaves out, and
278
278
  // `isPlatformFile` is the predicate the prose has to match.
@@ -283,7 +283,7 @@ describe('the shared rules describe the tools they name', () => {
283
283
  });
284
284
 
285
285
  it('says what unzip extracts, rather than that it takes any bytes', () => {
286
- const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'content-kinds')!;
286
+ const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'content-kinds')!;
287
287
  // `unzip` refuses anything but a `.zip` (`workspace.service.ts`: "Only .zip
288
288
  // files can be extracted"), so the byte-tool clause must not sweep it in.
289
289
  expect(rule.body).toContain('unzip extracts the entries of a `.zip`');
@@ -5,7 +5,7 @@ import type { AddressInfo } from 'node:net';
5
5
  import express from 'express';
6
6
  import { describe, it, expect, afterEach, vi } from 'vitest';
7
7
  import { testKbContext } from '../../../__tests__/kb-context.js';
8
- import type { AuthUser, FileApprovalState, IWorkflowService, WorkflowEvent } from '@bevel-software/platform-shared';
8
+ import type { AuthUser, FileApprovalState, IVersionControlService, VersionControlEvent } from '@bevel-software/platform-shared';
9
9
  import type { IAccessControl } from '../../access/access-control.interface.js';
10
10
  import type { AuthService } from '../../auth/auth.service.js';
11
11
  import type { WorkspaceService } from '../../workspace/workspace.service.js';
@@ -13,18 +13,18 @@ import type { Database } from '../../database/connection.js';
13
13
  import type { GitService } from '../git/git.service.js';
14
14
  import type { PullRequestService } from '../git/pull-request.service.js';
15
15
  import { PullRequestService as RealPullRequestService } from '../git/pull-request.service.js';
16
- import type { IReviewWorkflowService } from '../review-workflow/review-workflow.interface.js';
17
- import { ReviewWorkflowService } from '../review-workflow/review-workflow.service.js';
16
+ import type { IChangeRequestReviewService } from '../change-request-review/change-request-review.interface.js';
17
+ import { ChangeRequestReviewService } from '../change-request-review/change-request-review.service.js';
18
18
  import type { FileLockService } from '../file-lock.service.js';
19
19
  import type { PendingCommitsService } from '../pending-commits.service.js';
20
- import { WorkflowEventBus } from '../event-bus.js';
20
+ import { VersionControlEventBus } from '../event-bus.js';
21
21
  import type { SQL } from 'drizzle-orm';
22
22
  import { PgDialect } from 'drizzle-orm/pg-core';
23
23
  import { changeRequests } from '../../database/schema.js';
24
24
  import { coreMigrationsDir } from '../../../assets.js';
25
- import { WorkflowService } from '../workflow.service.js';
26
- import { APPLY_FAILURE_REASON_WITHHELD, createWorkflowRoutes } from '../workflow.routes.js';
27
- import { WorkflowDomainError, WorkflowValidationError } from '../../../shared/domain-errors.js';
25
+ import { VersionControlService } from '../version-control.service.js';
26
+ import { APPLY_FAILURE_REASON_WITHHELD, createVersionControlRoutes } from '../version-control.routes.js';
27
+ import { VersionControlDomainError, VersionControlValidationError } from '../../../shared/domain-errors.js';
28
28
  import { openChangeGate } from '../../../__tests__/open-change-gate.js';
29
29
 
30
30
  /**
@@ -43,8 +43,8 @@ const ADMIN: AuthUser = { id: 'u-admin', email: 'admin@example.com', name: 'Ada
43
43
  interface RouteHarness {
44
44
  server: Server;
45
45
  baseUrl: string;
46
- emitted: WorkflowEvent[];
47
- workflow: {
46
+ emitted: VersionControlEvent[];
47
+ versionControl: {
48
48
  getChangeRequestDetail: ReturnType<typeof vi.fn>;
49
49
  mergeChangeRequest: ReturnType<typeof vi.fn>;
50
50
  beginApplyAttempt: ReturnType<typeof vi.fn>;
@@ -60,9 +60,9 @@ async function routeHarness(
60
60
  canReadBatch?: (paths: string[]) => Promise<Map<string, boolean>>;
61
61
  } = {},
62
62
  ): Promise<RouteHarness> {
63
- const emitted: WorkflowEvent[] = [];
63
+ const emitted: VersionControlEvent[] = [];
64
64
  const canReadBatch = opts.canReadBatch ?? (async (paths: string[]) => new Map(paths.map((p) => [p, true])));
65
- const workflow = {
65
+ const versionControl = {
66
66
  getChangeRequestDetail: vi.fn(async () => ({
67
67
  headSha: 'h',
68
68
  approvals: [],
@@ -84,11 +84,11 @@ async function routeHarness(
84
84
  });
85
85
  app.use(
86
86
  '/api',
87
- createWorkflowRoutes(
88
- workflow as unknown as IWorkflowService,
87
+ createVersionControlRoutes(
88
+ versionControl as unknown as IVersionControlService,
89
89
  { getOrCreateForUser: vi.fn(async () => ({ id: 'ws-admin' })) } as unknown as WorkspaceService,
90
90
  { getUserById: vi.fn(async () => ADMIN) } as unknown as AuthService,
91
- { emit: (e: WorkflowEvent) => emitted.push(e) } as unknown as WorkflowEventBus,
91
+ { emit: (e: VersionControlEvent) => emitted.push(e) } as unknown as VersionControlEventBus,
92
92
  {
93
93
  canReadBatch: async (_ws: string, _email: string, paths: string[]) => canReadBatch(paths),
94
94
  } as unknown as IAccessControl,
@@ -99,7 +99,7 @@ async function routeHarness(
99
99
  const s = app.listen(0, () => resolve(s));
100
100
  });
101
101
  const addr = server.address() as AddressInfo;
102
- return { server, baseUrl: `http://127.0.0.1:${addr.port}`, emitted, workflow };
102
+ return { server, baseUrl: `http://127.0.0.1:${addr.port}`, emitted, versionControl };
103
103
  }
104
104
 
105
105
  const closeServer = (s: Server) =>
@@ -123,22 +123,22 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
123
123
  h = await routeHarness(async () => {
124
124
  // The gate's own `MergeBlockedError` shape: a 422 carrying the reasons it
125
125
  // still waits on. Its message is what the route reports.
126
- throw new WorkflowDomainError('Merge gate rejected: Waiting on approval for Plugins/x/SKILL.md', 422, {
126
+ throw new VersionControlDomainError('Merge gate rejected: Waiting on approval for Plugins/x/SKILL.md', 422, {
127
127
  mergeBlockedReasons: ['Waiting on approval for Plugins/x/SKILL.md'],
128
128
  });
129
129
  });
130
130
  const res = await post(h.baseUrl);
131
131
  expect(res.status).toBe(202);
132
132
 
133
- await vi.waitFor(() => expect(h!.workflow.recordApplyFailure).toHaveBeenCalled());
134
- expect(h.workflow.recordApplyFailure).toHaveBeenCalledWith(
133
+ await vi.waitFor(() => expect(h!.versionControl.recordApplyFailure).toHaveBeenCalled());
134
+ expect(h.versionControl.recordApplyFailure).toHaveBeenCalledWith(
135
135
  7,
136
136
  { reason: expect.stringContaining('Waiting on approval'), kind: 'gate', at: expect.any(Date) },
137
137
  ADMIN,
138
138
  1,
139
139
  );
140
140
  // The clicker's event and the persisted refusal name the same instant.
141
- const [, { at }] = h.workflow.recordApplyFailure.mock.calls[0] as [number, { at: Date }];
141
+ const [, { at }] = h.versionControl.recordApplyFailure.mock.calls[0] as [number, { at: Date }];
142
142
  // The clicker's own answer is unchanged.
143
143
  expect(h.emitted).toContainEqual(
144
144
  expect.objectContaining({
@@ -153,16 +153,16 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
153
153
  it("the clicker's own answer is scoped like the stored one: a clicker who cannot read the files gets no reason", async () => {
154
154
  h = await routeHarness(
155
155
  async () => {
156
- throw new WorkflowValidationError('Waiting on approval for Plugins/x/SKILL.md');
156
+ throw new VersionControlValidationError('Waiting on approval for Plugins/x/SKILL.md');
157
157
  },
158
158
  { canReadBatch: async (paths) => new Map(paths.map((p) => [p, false])) },
159
159
  );
160
160
  await post(h.baseUrl);
161
- await vi.waitFor(() => expect(h!.workflow.recordApplyFailure).toHaveBeenCalled());
161
+ await vi.waitFor(() => expect(h!.versionControl.recordApplyFailure).toHaveBeenCalled());
162
162
  const answer = h.emitted.find((e) => e.kind === 'change-request-merge-failed') as { reason: string };
163
163
  expect(answer.reason).toBe(APPLY_FAILURE_REASON_WITHHELD);
164
164
  // The raw reason is still what is stored, for the viewers who may read it.
165
- expect(h.workflow.recordApplyFailure).toHaveBeenCalledWith(
165
+ expect(h.versionControl.recordApplyFailure).toHaveBeenCalledWith(
166
166
  7,
167
167
  expect.objectContaining({ reason: expect.stringContaining('Plugins/x/SKILL.md') }),
168
168
  ADMIN,
@@ -173,7 +173,7 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
173
173
  it("a request with no resolved touched paths withholds the clicker's reason too", async () => {
174
174
  h = await routeHarness(
175
175
  async () => {
176
- throw new WorkflowValidationError('Waiting on approval for Plugins/x/SKILL.md');
176
+ throw new VersionControlValidationError('Waiting on approval for Plugins/x/SKILL.md');
177
177
  },
178
178
  { touchedNodePaths: [] },
179
179
  );
@@ -187,7 +187,7 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
187
187
 
188
188
  it('a refusal of the caller reaches the caller alone and erases nobody\'s verdict', async () => {
189
189
  h = await routeHarness(async () => {
190
- throw new WorkflowDomainError('Only admins can merge with bypass.', 403);
190
+ throw new VersionControlDomainError('Only admins can merge with bypass.', 403);
191
191
  });
192
192
  await post(h.baseUrl);
193
193
  await vi.waitFor(() =>
@@ -195,16 +195,16 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
195
195
  expect.objectContaining({ kind: 'change-request-merge-failed', forUserId: ADMIN.id }),
196
196
  ),
197
197
  );
198
- expect(h.workflow.recordApplyFailure).not.toHaveBeenCalled();
198
+ expect(h.versionControl.recordApplyFailure).not.toHaveBeenCalled();
199
199
  });
200
200
 
201
201
  it('any other refusal is persisted as an error, which an approval does not answer', async () => {
202
202
  h = await routeHarness(async () => {
203
- throw new WorkflowDomainError('Merge failed: push rejected', 502);
203
+ throw new VersionControlDomainError('Merge failed: push rejected', 502);
204
204
  });
205
205
  await post(h.baseUrl);
206
- await vi.waitFor(() => expect(h!.workflow.recordApplyFailure).toHaveBeenCalled());
207
- expect(h.workflow.recordApplyFailure).toHaveBeenCalledWith(
206
+ await vi.waitFor(() => expect(h!.versionControl.recordApplyFailure).toHaveBeenCalled());
207
+ expect(h.versionControl.recordApplyFailure).toHaveBeenCalledWith(
208
208
  7,
209
209
  expect.objectContaining({ kind: 'error' }),
210
210
  ADMIN,
@@ -215,8 +215,8 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
215
215
  it('a conflict is persisted as a conflict', async () => {
216
216
  h = await routeHarness(async () => ({ kind: 'conflicts-need-resolution', conflictedPaths: ['a.md'] }));
217
217
  await post(h.baseUrl);
218
- await vi.waitFor(() => expect(h!.workflow.recordApplyFailure).toHaveBeenCalled());
219
- expect(h.workflow.recordApplyFailure).toHaveBeenCalledWith(
218
+ await vi.waitFor(() => expect(h!.versionControl.recordApplyFailure).toHaveBeenCalled());
219
+ expect(h.versionControl.recordApplyFailure).toHaveBeenCalledWith(
220
220
  7,
221
221
  expect.objectContaining({ kind: 'conflicts' }),
222
222
  ADMIN,
@@ -238,21 +238,21 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
238
238
  await done;
239
239
  // One macrotask: the route's continuation after `mergeChangeRequest` resolves.
240
240
  await new Promise((r) => setImmediate(r));
241
- expect(h.workflow.mergeChangeRequest).toHaveBeenCalledTimes(1);
242
- expect(h.workflow.recordApplyFailure).not.toHaveBeenCalled();
241
+ expect(h.versionControl.mergeChangeRequest).toHaveBeenCalledTimes(1);
242
+ expect(h.versionControl.recordApplyFailure).not.toHaveBeenCalled();
243
243
  expect(h.emitted.filter((e) => e.kind === 'change-request-merge-failed')).toEqual([]);
244
244
  // The attempt ended, so the service holds no entry for it.
245
- expect(h.workflow.endApplyAttempt).toHaveBeenCalledWith(7, 1);
245
+ expect(h.versionControl.endApplyAttempt).toHaveBeenCalledWith(7, 1);
246
246
  });
247
247
 
248
248
  it('a failed attempt ends too, after its refusal is recorded', async () => {
249
249
  h = await routeHarness(async () => {
250
- throw new WorkflowValidationError('gate says no');
250
+ throw new VersionControlValidationError('gate says no');
251
251
  });
252
252
  await post(h.baseUrl);
253
- await vi.waitFor(() => expect(h!.workflow.endApplyAttempt).toHaveBeenCalledWith(7, 1));
254
- expect(h.workflow.recordApplyFailure.mock.invocationCallOrder[0]).toBeLessThan(
255
- h.workflow.endApplyAttempt.mock.invocationCallOrder[0]!,
253
+ await vi.waitFor(() => expect(h!.versionControl.endApplyAttempt).toHaveBeenCalledWith(7, 1));
254
+ expect(h.versionControl.recordApplyFailure.mock.invocationCallOrder[0]).toBeLessThan(
255
+ h.versionControl.endApplyAttempt.mock.invocationCallOrder[0]!,
256
256
  );
257
257
  });
258
258
 
@@ -260,7 +260,7 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
260
260
  h = await routeHarness(async () => {
261
261
  throw new Error('gate says no');
262
262
  });
263
- h.workflow.recordApplyFailure.mockRejectedValue(new Error('db down'));
263
+ h.versionControl.recordApplyFailure.mockRejectedValue(new Error('db down'));
264
264
  await post(h.baseUrl);
265
265
  await vi.waitFor(() =>
266
266
  expect(h!.emitted).toContainEqual(expect.objectContaining({ kind: 'change-request-merge-failed' })),
@@ -268,7 +268,7 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
268
268
  });
269
269
  });
270
270
 
271
- // ── WorkflowService.recordApplyFailure ──────────────────────────────────────
271
+ // ── VersionControlService.recordApplyFailure ──────────────────────────────────────
272
272
 
273
273
  function updateDb(openRows = 1) {
274
274
  const sets: Record<string, unknown>[] = [];
@@ -370,27 +370,27 @@ const refusal = (kind: 'gate' | 'conflicts' | 'error', at: Date): Partial<Row> =
370
370
  function service(
371
371
  db: Database,
372
372
  emit: (e: unknown) => void,
373
- reviewWorkflow: Partial<IReviewWorkflowService> = {},
373
+ changeRequestReview: Partial<IChangeRequestReviewService> = {},
374
374
  deps: { git?: Partial<GitService>; prs?: Record<string, unknown> } = {},
375
375
  ) {
376
376
  const prs = { invalidateDetailCache: vi.fn(), ...deps.prs };
377
- const svc = new WorkflowService(
377
+ const svc = new VersionControlService(
378
378
  db,
379
379
  (deps.git ?? {}) as GitService,
380
380
  prs as unknown as PullRequestService,
381
- reviewWorkflow as IReviewWorkflowService,
381
+ changeRequestReview as IChangeRequestReviewService,
382
382
  {} as WorkspaceService,
383
383
  {} as IAccessControl,
384
384
  {} as FileLockService,
385
385
  {} as PendingCommitsService,
386
386
  testKbContext(),
387
387
  openChangeGate(),
388
- { emit } as unknown as WorkflowEventBus,
388
+ { emit } as unknown as VersionControlEventBus,
389
389
  );
390
390
  return { svc, prs };
391
391
  }
392
392
 
393
- describe('WorkflowService — the persisted apply refusal', () => {
393
+ describe('VersionControlService — the persisted apply refusal', () => {
394
394
  it('records the reason, evicts the cached lists, and announces it to everyone without the text', async () => {
395
395
  const { db, sets } = updateDb();
396
396
  const emitted: unknown[] = [];
@@ -522,7 +522,7 @@ describe('WorkflowService — the persisted apply refusal', () => {
522
522
 
523
523
  describe('change-request-apply-failed on the bus', () => {
524
524
  it('reaches every session — the author and other viewers, not only the clicker', () => {
525
- const bus = new WorkflowEventBus();
525
+ const bus = new VersionControlEventBus();
526
526
  const sub = (sessionId: string, userId: string) => ({
527
527
  sessionId,
528
528
  userId,
@@ -544,11 +544,11 @@ describe('change-request-apply-failed on the bus', () => {
544
544
 
545
545
  // ── Read back through the summary ───────────────────────────────────────────
546
546
 
547
- describe('WorkflowService — a refusal clears when a change makes it obsolete', () => {
547
+ describe('VersionControlService — a refusal clears when a change makes it obsolete', () => {
548
548
  const approveArgs = [7, 'Plugins/x/SKILL.md', ADMIN, [], 'h', 'main', null, 'ws'] as const;
549
549
  const EARLIER = new Date(Date.now() - 60_000);
550
550
 
551
- /** A gate-bound markdown file's approval state, as the review workflow returns it. */
551
+ /** A gate-bound markdown file's approval state, as the change-request review returns it. */
552
552
  const fileState = (path: string, isApproved: boolean): FileApprovalState => ({
553
553
  path,
554
554
  eligibleApprovers: { roles: ['Plugin owners'], users: [] },
@@ -571,7 +571,7 @@ describe('WorkflowService — a refusal clears when a change makes it obsolete',
571
571
  return approvalsAfter;
572
572
  }),
573
573
  // The real gate: whether an approval answers the refusal is its verdict.
574
- evaluateMergeGate: (input) => ReviewWorkflowService.prototype.evaluateMergeGate.call({}, input),
574
+ evaluateMergeGate: (input) => ChangeRequestReviewService.prototype.evaluateMergeGate.call({}, input),
575
575
  });
576
576
  return { ...store, svc, prs, emitted };
577
577
  }
@@ -695,7 +695,7 @@ describe('WorkflowService — a refusal clears when a change makes it obsolete',
695
695
  } as unknown as Database;
696
696
  const { svc } = service(db, () => {}, {
697
697
  approveFile: vi.fn(async () => ALL_APPROVED),
698
- evaluateMergeGate: (input) => ReviewWorkflowService.prototype.evaluateMergeGate.call({}, input),
698
+ evaluateMergeGate: (input) => ChangeRequestReviewService.prototype.evaluateMergeGate.call({}, input),
699
699
  });
700
700
  await expect(svc.approveFile(...approveArgs)).resolves.toEqual(ALL_APPROVED);
701
701
  });
@@ -839,7 +839,7 @@ describe('GET change requests — the refusal reason reaches only viewers who ca
839
839
  touchedNodePaths: opts.touchedNodePaths ?? CR.touchedNodePaths,
840
840
  lastApplyFailure: { ...FAILURE },
841
841
  };
842
- const workflow = {
842
+ const versionControl = {
843
843
  listChangeRequests: vi.fn(async () => [cached]),
844
844
  listChangeRequestsAuthoredBy: vi.fn(async () => [cached]),
845
845
  listChangeRequestsForUser: vi.fn(async () => [cached]),
@@ -855,11 +855,11 @@ describe('GET change requests — the refusal reason reaches only viewers who ca
855
855
  });
856
856
  app.use(
857
857
  '/api',
858
- createWorkflowRoutes(
859
- workflow as unknown as IWorkflowService,
858
+ createVersionControlRoutes(
859
+ versionControl as unknown as IVersionControlService,
860
860
  { getOrCreateForUser: vi.fn(async () => ({ id: 'ws-bo' })) } as unknown as WorkspaceService,
861
861
  { getUserById: vi.fn(async () => BO) } as unknown as AuthService,
862
- { emit: () => {} } as unknown as WorkflowEventBus,
862
+ { emit: () => {} } as unknown as VersionControlEventBus,
863
863
  { canReadBatch } as unknown as IAccessControl,
864
864
  'knowledge-base',
865
865
  ),
@@ -1043,7 +1043,7 @@ describe('migration 0009 — refusals recorded before the kind existed are class
1043
1043
 
1044
1044
  it("the prefix it matches is the one the merge gate's refusal actually carries", () => {
1045
1045
  const gateSource = readFileSync(
1046
- path.join(coreMigrationsDir(), '..', 'src/modules/workflow/review-workflow/review-workflow.service.ts'),
1046
+ path.join(coreMigrationsDir(), '..', 'src/modules/version-control/change-request-review/change-request-review.service.ts'),
1047
1047
  'utf8',
1048
1048
  );
1049
1049
  const prefix = /LIKE '([^%']*)%' THEN 'gate'/.exec(migration)![1]!;