@bevel-software/platform-core-backend 0.34.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 (908) hide show
  1. package/agent-guide/access-control.md +146 -300
  2. package/agent-guide/conventions.md +23 -25
  3. package/agent-guide/directory-structure.md +72 -120
  4. package/agent-guide/drafts-and-change-requests.md +92 -0
  5. package/agent-guide/for-git-users.md +47 -0
  6. package/agent-guide/glossary.md +36 -0
  7. package/agent-guide/how-agents-find-things.md +49 -0
  8. package/agent-guide/html-views.md +16 -11
  9. package/agent-guide/new-knowledge-base.md +9 -8
  10. package/agent-guide/onboarding.md +111 -0
  11. package/agent-guide/skills.md +67 -42
  12. package/agent-guide/start-here.md +66 -0
  13. package/agent-guide/tool-manuals.md +133 -154
  14. package/agent-guide/tools.md +67 -0
  15. package/agent-guide/where-a-new-file-goes.md +45 -28
  16. package/dist/core/catalog-cache-invalidation.d.ts +2 -2
  17. package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
  18. package/dist/core/compose-embed.d.ts +2 -2
  19. package/dist/core/compose-embed.d.ts.map +1 -1
  20. package/dist/core/compose-embed.js +1 -1
  21. package/dist/core/compose-embed.js.map +1 -1
  22. package/dist/core/core-ports.d.ts +19 -4
  23. package/dist/core/core-ports.d.ts.map +1 -1
  24. package/dist/core/core-ports.js.map +1 -1
  25. package/dist/core/create-core-server.d.ts.map +1 -1
  26. package/dist/core/create-core-server.js +27 -25
  27. package/dist/core/create-core-server.js.map +1 -1
  28. package/dist/core/create-core-services.d.ts +25 -13
  29. package/dist/core/create-core-services.d.ts.map +1 -1
  30. package/dist/core/create-core-services.js +75 -60
  31. package/dist/core/create-core-services.js.map +1 -1
  32. package/dist/core/lifecycle.d.ts +4 -4
  33. package/dist/core/lifecycle.d.ts.map +1 -1
  34. package/dist/core/lifecycle.js +5 -5
  35. package/dist/core/lifecycle.js.map +1 -1
  36. package/dist/core-config.d.ts +2 -2
  37. package/dist/core-config.js +3 -3
  38. package/dist/core-config.js.map +1 -1
  39. package/dist/index.d.ts +4 -4
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +3 -3
  42. package/dist/index.js.map +1 -1
  43. package/dist/modules/access/access-control.interface.d.ts +22 -0
  44. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  45. package/dist/modules/access/access-control.service.d.ts +3 -1
  46. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  47. package/dist/modules/access/access-control.service.js +76 -1
  48. package/dist/modules/access/access-control.service.js.map +1 -1
  49. package/dist/modules/access/access-declarations.d.ts +2 -2
  50. package/dist/modules/access/access-declarations.d.ts.map +1 -1
  51. package/dist/modules/access/access-declarations.js +2 -2
  52. package/dist/modules/access/access-declarations.js.map +1 -1
  53. package/dist/modules/access/access-mutation.service.d.ts +2 -2
  54. package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
  55. package/dist/modules/access/access-mutation.service.js +2 -2
  56. package/dist/modules/access/access-mutation.service.js.map +1 -1
  57. package/dist/modules/access/access-requests.routes.d.ts +2 -2
  58. package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
  59. package/dist/modules/access/access-requests.routes.js +5 -5
  60. package/dist/modules/access/access-requests.routes.js.map +1 -1
  61. package/dist/modules/access/access-requests.service.d.ts +2 -2
  62. package/dist/modules/access/access-requests.service.d.ts.map +1 -1
  63. package/dist/modules/access/access-requests.service.js +11 -11
  64. package/dist/modules/access/access-requests.service.js.map +1 -1
  65. package/dist/modules/access/access.routes.d.ts +2 -2
  66. package/dist/modules/access/access.routes.d.ts.map +1 -1
  67. package/dist/modules/access/access.routes.js +32 -13
  68. package/dist/modules/access/access.routes.js.map +1 -1
  69. package/dist/modules/access/admin-locked-commit.d.ts +5 -5
  70. package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
  71. package/dist/modules/access/admin-locked-commit.js +7 -7
  72. package/dist/modules/access/admin-locked-commit.js.map +1 -1
  73. package/dist/modules/access/admin-route-helpers.d.ts +1 -1
  74. package/dist/modules/access/admin-route-helpers.js +5 -5
  75. package/dist/modules/access/admin-route-helpers.js.map +1 -1
  76. package/dist/modules/access/change-read-gate.d.ts +1 -1
  77. package/dist/modules/access/change-read-gate.js +1 -1
  78. package/dist/modules/access/groups-admin.service.d.ts +7 -7
  79. package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
  80. package/dist/modules/access/groups-admin.service.js +6 -6
  81. package/dist/modules/access/groups-admin.service.js.map +1 -1
  82. package/dist/modules/access/index.d.ts +1 -1
  83. package/dist/modules/access/index.d.ts.map +1 -1
  84. package/dist/modules/access/reference-scan.d.ts +1 -1
  85. package/dist/modules/access/roles-admin.service.d.ts +7 -7
  86. package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
  87. package/dist/modules/access/roles-admin.service.js +8 -8
  88. package/dist/modules/access/roles-admin.service.js.map +1 -1
  89. package/dist/modules/access/synced-groups-committer.d.ts +4 -4
  90. package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
  91. package/dist/modules/access/synced-groups-committer.js +7 -7
  92. package/dist/modules/access/synced-groups-committer.js.map +1 -1
  93. package/dist/modules/access/user-access-removal.service.d.ts +6 -6
  94. package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
  95. package/dist/modules/access/user-access-removal.service.js +4 -4
  96. package/dist/modules/access/user-access-removal.service.js.map +1 -1
  97. package/dist/modules/access-model/access-errors.d.ts +4 -4
  98. package/dist/modules/access-model/access-errors.d.ts.map +1 -1
  99. package/dist/modules/access-model/access-errors.js +4 -4
  100. package/dist/modules/access-model/access-errors.js.map +1 -1
  101. package/dist/modules/access-model/access-grammar.d.ts +1 -1
  102. package/dist/modules/access-model/access-grammar.js +4 -4
  103. package/dist/modules/access-model/change-gate.d.ts +1 -1
  104. package/dist/modules/access-model/change-gate.js +1 -1
  105. package/dist/modules/access-model/roles-yaml-guard.d.ts +4 -4
  106. package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
  107. package/dist/modules/access-model/roles-yaml-guard.js +4 -4
  108. package/dist/modules/access-model/roles-yaml-guard.js.map +1 -1
  109. package/dist/modules/agent-guide/agent-guide.d.ts +63 -18
  110. package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
  111. package/dist/modules/agent-guide/agent-guide.js +144 -30
  112. package/dist/modules/agent-guide/agent-guide.js.map +1 -1
  113. package/dist/modules/agent-guide/agent-guide.tools.d.ts +6 -2
  114. package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
  115. package/dist/modules/agent-guide/agent-guide.tools.js +45 -31
  116. package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
  117. package/dist/modules/agent-guide/guide-budget.d.ts +51 -0
  118. package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -0
  119. package/dist/modules/agent-guide/guide-budget.js +71 -0
  120. package/dist/modules/agent-guide/guide-budget.js.map +1 -0
  121. package/dist/modules/agent-guide/index.d.ts +2 -1
  122. package/dist/modules/agent-guide/index.d.ts.map +1 -1
  123. package/dist/modules/agent-guide/index.js +2 -1
  124. package/dist/modules/agent-guide/index.js.map +1 -1
  125. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +12 -5
  126. package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
  127. package/dist/modules/agent-instructions/agent-instructions.routes.js +13 -6
  128. package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
  129. package/dist/modules/agent-instructions/compose.d.ts +15 -8
  130. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  131. package/dist/modules/agent-instructions/compose.js +28 -10
  132. package/dist/modules/agent-instructions/compose.js.map +1 -1
  133. package/dist/modules/agent-instructions/shared-file-rules.d.ts +14 -6
  134. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
  135. package/dist/modules/agent-instructions/shared-file-rules.js +60 -18
  136. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  137. package/dist/modules/auth/account-erasure.service.d.ts +36 -7
  138. package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
  139. package/dist/modules/auth/account-erasure.service.js +30 -10
  140. package/dist/modules/auth/account-erasure.service.js.map +1 -1
  141. package/dist/modules/auth/account-hooks.d.ts +20 -0
  142. package/dist/modules/auth/account-hooks.d.ts.map +1 -1
  143. package/dist/modules/auth/account-hooks.js +10 -0
  144. package/dist/modules/auth/account-hooks.js.map +1 -1
  145. package/dist/modules/auth/account-switch-lock.js +2 -2
  146. package/dist/modules/auth/account-switch-lock.js.map +1 -1
  147. package/dist/modules/auth/account.routes.d.ts +7 -2
  148. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  149. package/dist/modules/auth/account.routes.js +23 -4
  150. package/dist/modules/auth/account.routes.js.map +1 -1
  151. package/dist/modules/auth/auth.service.d.ts +1 -1
  152. package/dist/modules/auth/auth.service.js +4 -4
  153. package/dist/modules/auth/auth.service.js.map +1 -1
  154. package/dist/modules/auth/index.d.ts +1 -0
  155. package/dist/modules/auth/index.d.ts.map +1 -1
  156. package/dist/modules/code-mode/code-mode.tool.js +2 -2
  157. package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
  158. package/dist/modules/connection-probe/connection-probe.service.d.ts +0 -12
  159. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  160. package/dist/modules/connection-probe/connection-probe.service.js +1 -38
  161. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  162. package/dist/modules/database/core-schema.js +2 -2
  163. package/dist/modules/database/core-schema.js.map +1 -1
  164. package/dist/modules/diff/diff.routes.d.ts +3 -3
  165. package/dist/modules/diff/diff.routes.d.ts.map +1 -1
  166. package/dist/modules/diff/diff.routes.js +7 -7
  167. package/dist/modules/diff/diff.routes.js.map +1 -1
  168. package/dist/modules/embed/embed.routes.js +1 -1
  169. package/dist/modules/embed/embed.routes.js.map +1 -1
  170. package/dist/modules/embed/embed.service.d.ts +4 -4
  171. package/dist/modules/embed/embed.service.d.ts.map +1 -1
  172. package/dist/modules/embed/embed.service.js +18 -18
  173. package/dist/modules/embed/embed.service.js.map +1 -1
  174. package/dist/modules/kb-fs/branch-name.js +8 -8
  175. package/dist/modules/kb-fs/branch-name.js.map +1 -1
  176. package/dist/modules/kb-fs/file-change-notifier.d.ts +2 -2
  177. package/dist/modules/kb-fs/locking-filesystem.d.ts +9 -9
  178. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  179. package/dist/modules/kb-fs/locking-filesystem.js +27 -27
  180. package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
  181. package/dist/modules/kb-fs/repo-path.js +5 -5
  182. package/dist/modules/kb-fs/repo-path.js.map +1 -1
  183. package/dist/modules/kb-fs/tmp-ref.d.ts +2 -2
  184. package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -1
  185. package/dist/modules/kb-fs/tmp-ref.js +2 -2
  186. package/dist/modules/kb-fs/tmp-ref.js.map +1 -1
  187. package/dist/modules/kb-sync/index.d.ts +1 -1
  188. package/dist/modules/kb-sync/index.d.ts.map +1 -1
  189. package/dist/modules/kb-sync/kb-sync.interface.d.ts +3 -3
  190. package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
  191. package/dist/modules/kb-sync/kb-sync.service.d.ts +3 -3
  192. package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
  193. package/dist/modules/kb-sync/kb-sync.service.js +10 -10
  194. package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
  195. package/dist/modules/mcp/mcp.service.d.ts +11 -4
  196. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  197. package/dist/modules/mcp/mcp.service.js +80 -53
  198. package/dist/modules/mcp/mcp.service.js.map +1 -1
  199. package/dist/modules/onboarding/onboarding.contract.d.ts +1 -1
  200. package/dist/modules/onboarding/onboarding.routes.js +2 -2
  201. package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
  202. package/dist/modules/onboarding/starter-pack.service.d.ts +4 -4
  203. package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
  204. package/dist/modules/onboarding/starter-pack.service.js +4 -4
  205. package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
  206. package/dist/modules/plugins/join-request-jobs.service.d.ts +2 -2
  207. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  208. package/dist/modules/plugins/join-request-jobs.service.js +7 -7
  209. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  210. package/dist/modules/plugins/join-requests.service.d.ts +3 -3
  211. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  212. package/dist/modules/plugins/join-requests.service.js +5 -5
  213. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  214. package/dist/modules/plugins/plugin-rename.service.js +1 -1
  215. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  216. package/dist/modules/plugins/plugins.routes.d.ts +2 -2
  217. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  218. package/dist/modules/plugins/plugins.routes.js +8 -8
  219. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  220. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +87 -2
  221. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
  222. package/dist/modules/secrets-vault/db-secrets-vault.service.js +635 -74
  223. package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
  224. package/dist/modules/secrets-vault/index.d.ts +3 -2
  225. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  226. package/dist/modules/secrets-vault/index.js +2 -1
  227. package/dist/modules/secrets-vault/index.js.map +1 -1
  228. package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts +36 -0
  229. package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts.map +1 -0
  230. package/dist/modules/secrets-vault/managed-sign-in-erasure.js +37 -0
  231. package/dist/modules/secrets-vault/managed-sign-in-erasure.js.map +1 -0
  232. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +205 -11
  233. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
  234. package/dist/modules/secrets-vault/secrets-vault.contract.js +27 -0
  235. package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
  236. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +7 -1
  237. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  238. package/dist/modules/secrets-vault/secrets-vault.routes.js +206 -45
  239. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  240. package/dist/modules/settings/connection-check.js +1 -1
  241. package/dist/modules/settings/connection-check.js.map +1 -1
  242. package/dist/modules/settings/deployment-settings.service.js +1 -1
  243. package/dist/modules/settings/git-root-folders.js +1 -1
  244. package/dist/modules/settings/git-root-folders.js.map +1 -1
  245. package/dist/modules/settings/oidc-check.d.ts.map +1 -1
  246. package/dist/modules/settings/oidc-check.js +5 -17
  247. package/dist/modules/settings/oidc-check.js.map +1 -1
  248. package/dist/modules/settings/setup.routes.d.ts +1 -1
  249. package/dist/modules/settings/setup.routes.js +1 -1
  250. package/dist/modules/skills/pending-skills.service.d.ts +3 -3
  251. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  252. package/dist/modules/skills/pending-skills.service.js +4 -4
  253. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  254. package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -2
  255. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  256. package/dist/modules/skills/skill-access-requests.routes.js +5 -5
  257. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  258. package/dist/modules/skills/skills.tools.js +1 -1
  259. package/dist/modules/skills/skills.tools.js.map +1 -1
  260. package/dist/modules/tool-helpers/tool-context.d.ts +4 -4
  261. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
  262. package/dist/modules/tool-helpers/tool-context.js +2 -2
  263. package/dist/modules/tool-helpers/tool-context.js.map +1 -1
  264. package/dist/modules/tool-helpers/tool-def.js +1 -1
  265. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  266. package/dist/modules/tool-helpers/tool-handler.js +2 -2
  267. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  268. package/dist/modules/tool-helpers/tool.contract.d.ts +4 -4
  269. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  270. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +7 -1
  271. package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
  272. package/dist/modules/tool-manuals/mcp-json-discovery.js +69 -38
  273. package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
  274. package/dist/modules/tool-manuals/mcp-server-edit.service.js +1 -1
  275. package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
  276. package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -3
  277. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  278. package/dist/modules/tool-manuals/pending-tools.service.js +4 -4
  279. package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
  280. package/dist/modules/tool-manuals/tool-delete.service.js +1 -1
  281. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  282. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +70 -3
  283. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
  284. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +18 -8
  285. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  286. package/dist/modules/tool-manuals/tool-manuals.service.js +166 -49
  287. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  288. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +11 -2
  289. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  290. package/dist/modules/tool-manuals/tool-manuals.tools.js +66 -24
  291. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  292. package/dist/modules/version-control/agent-tools/change-request-read-shape.d.ts.map +1 -0
  293. package/dist/modules/version-control/agent-tools/change-request-read-shape.js.map +1 -0
  294. package/dist/modules/version-control/agent-tools/change-request-read.tools.d.ts.map +1 -0
  295. package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.js +2 -2
  296. package/dist/modules/version-control/agent-tools/change-request-read.tools.js.map +1 -0
  297. package/dist/modules/version-control/agent-tools/change-request-summary.d.ts.map +1 -0
  298. package/dist/modules/version-control/agent-tools/change-request-summary.js.map +1 -0
  299. package/dist/modules/{workflow/agent-tools/workflow.tools.d.ts → version-control/agent-tools/version-control.tools.d.ts} +4 -4
  300. package/dist/modules/version-control/agent-tools/version-control.tools.d.ts.map +1 -0
  301. package/dist/modules/{workflow/agent-tools/workflow.tools.js → version-control/agent-tools/version-control.tools.js} +53 -49
  302. package/dist/modules/version-control/agent-tools/version-control.tools.js.map +1 -0
  303. package/dist/modules/{workflow → version-control}/change-request-hooks.d.ts +1 -1
  304. package/dist/modules/version-control/change-request-hooks.d.ts.map +1 -0
  305. package/dist/modules/version-control/change-request-hooks.js.map +1 -0
  306. package/dist/modules/version-control/change-request-review/approval-lock.d.ts.map +1 -0
  307. package/dist/modules/version-control/change-request-review/approval-lock.js.map +1 -0
  308. package/dist/modules/{workflow/review-workflow/review-workflow.interface.d.ts → version-control/change-request-review/change-request-review.interface.d.ts} +2 -2
  309. package/dist/modules/version-control/change-request-review/change-request-review.interface.d.ts.map +1 -0
  310. package/dist/modules/version-control/change-request-review/change-request-review.interface.js +2 -0
  311. package/dist/modules/version-control/change-request-review/change-request-review.interface.js.map +1 -0
  312. package/dist/modules/{workflow/review-workflow/review-workflow.service.d.ts → version-control/change-request-review/change-request-review.service.d.ts} +3 -3
  313. package/dist/modules/version-control/change-request-review/change-request-review.service.d.ts.map +1 -0
  314. package/dist/modules/{workflow/review-workflow/review-workflow.service.js → version-control/change-request-review/change-request-review.service.js} +26 -26
  315. package/dist/modules/version-control/change-request-review/change-request-review.service.js.map +1 -0
  316. package/dist/modules/{workflow → version-control}/event-bus.d.ts +8 -8
  317. package/dist/modules/version-control/event-bus.d.ts.map +1 -0
  318. package/dist/modules/{workflow → version-control}/event-bus.js +4 -4
  319. package/dist/modules/version-control/event-bus.js.map +1 -0
  320. package/dist/modules/{workflow → version-control}/events-delivery.d.ts +4 -4
  321. package/dist/modules/version-control/events-delivery.d.ts.map +1 -0
  322. package/dist/modules/version-control/events-delivery.js.map +1 -0
  323. package/dist/modules/{workflow → version-control}/events.routes.d.ts +4 -4
  324. package/dist/modules/version-control/events.routes.d.ts.map +1 -0
  325. package/dist/modules/version-control/events.routes.js.map +1 -0
  326. package/dist/modules/{workflow → version-control}/file-lock.service.d.ts +2 -2
  327. package/dist/modules/version-control/file-lock.service.d.ts.map +1 -0
  328. package/dist/modules/{workflow → version-control}/file-lock.service.js +6 -6
  329. package/dist/modules/version-control/file-lock.service.js.map +1 -0
  330. package/dist/modules/version-control/git/change-request-link.d.ts.map +1 -0
  331. package/dist/modules/version-control/git/change-request-link.js.map +1 -0
  332. package/dist/modules/version-control/git/git-version.d.ts.map +1 -0
  333. package/dist/modules/version-control/git/git-version.js.map +1 -0
  334. package/dist/modules/{workflow → version-control}/git/git.service.d.ts +8 -8
  335. package/dist/modules/version-control/git/git.service.d.ts.map +1 -0
  336. package/dist/modules/{workflow → version-control}/git/git.service.js +53 -53
  337. package/dist/modules/version-control/git/git.service.js.map +1 -0
  338. package/dist/modules/version-control/git/merge-commit.d.ts.map +1 -0
  339. package/dist/modules/version-control/git/merge-commit.js.map +1 -0
  340. package/dist/modules/version-control/git/node-git-runner.d.ts.map +1 -0
  341. package/dist/modules/{workflow → version-control}/git/node-git-runner.js +1 -1
  342. package/dist/modules/version-control/git/node-git-runner.js.map +1 -0
  343. package/dist/modules/{workflow → version-control}/git/pull-request.service.d.ts +5 -5
  344. package/dist/modules/version-control/git/pull-request.service.d.ts.map +1 -0
  345. package/dist/modules/{workflow → version-control}/git/pull-request.service.js +10 -10
  346. package/dist/modules/version-control/git/pull-request.service.js.map +1 -0
  347. package/dist/modules/{workflow → version-control}/index.d.ts +6 -5
  348. package/dist/modules/version-control/index.d.ts.map +1 -0
  349. package/dist/modules/{workflow → version-control}/index.js +3 -2
  350. package/dist/modules/version-control/index.js.map +1 -0
  351. package/dist/modules/{workflow → version-control}/pending-commits.service.d.ts +2 -2
  352. package/dist/modules/version-control/pending-commits.service.d.ts.map +1 -0
  353. package/dist/modules/{workflow → version-control}/pending-commits.service.js +2 -2
  354. package/dist/modules/version-control/pending-commits.service.js.map +1 -0
  355. package/dist/modules/{workflow → version-control}/pending-commits.worker.d.ts +5 -5
  356. package/dist/modules/version-control/pending-commits.worker.d.ts.map +1 -0
  357. package/dist/modules/{workflow → version-control}/pending-commits.worker.js +3 -3
  358. package/dist/modules/version-control/pending-commits.worker.js.map +1 -0
  359. package/dist/modules/{workflow → version-control}/read-on-branch.d.ts +2 -2
  360. package/dist/modules/version-control/read-on-branch.d.ts.map +1 -0
  361. package/dist/modules/{workflow → version-control}/read-on-branch.js +2 -2
  362. package/dist/modules/version-control/read-on-branch.js.map +1 -0
  363. package/dist/modules/version-control/recovery-bot.d.ts.map +1 -0
  364. package/dist/modules/version-control/recovery-bot.js.map +1 -0
  365. package/dist/modules/version-control/sanitize-error.d.ts.map +1 -0
  366. package/dist/modules/version-control/sanitize-error.js.map +1 -0
  367. package/dist/modules/{workflow/workflow-hooks.d.ts → version-control/version-control-hooks.d.ts} +4 -4
  368. package/dist/modules/version-control/version-control-hooks.d.ts.map +1 -0
  369. package/dist/modules/{workflow/workflow-hooks.js → version-control/version-control-hooks.js} +3 -3
  370. package/dist/modules/version-control/version-control-hooks.js.map +1 -0
  371. package/dist/modules/{workflow/workflow.routes.d.ts → version-control/version-control.routes.d.ts} +6 -5
  372. package/dist/modules/version-control/version-control.routes.d.ts.map +1 -0
  373. package/dist/modules/{workflow/workflow.routes.js → version-control/version-control.routes.js} +61 -60
  374. package/dist/modules/version-control/version-control.routes.js.map +1 -0
  375. package/dist/modules/{workflow/workflow.service.d.ts → version-control/version-control.service.d.ts} +26 -31
  376. package/dist/modules/version-control/version-control.service.d.ts.map +1 -0
  377. package/dist/modules/{workflow/workflow.service.js → version-control/version-control.service.js} +89 -94
  378. package/dist/modules/version-control/version-control.service.js.map +1 -0
  379. package/dist/modules/workspace/agent-access.gate.d.ts +6 -6
  380. package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
  381. package/dist/modules/workspace/agent-access.gate.js +2 -2
  382. package/dist/modules/workspace/agent-access.gate.js.map +1 -1
  383. package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
  384. package/dist/modules/workspace/git-internals.middleware.js +2 -2
  385. package/dist/modules/workspace/kb-repository.js +1 -1
  386. package/dist/modules/workspace/kb-repository.js.map +1 -1
  387. package/dist/modules/workspace/startup/kb-git.d.ts +1 -1
  388. package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
  389. package/dist/modules/workspace/startup/kb-git.js +1 -1
  390. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  391. package/dist/modules/workspace/startup/steps/seed-tree.d.ts +2 -2
  392. package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
  393. package/dist/modules/workspace/startup/steps/seed-tree.js +1 -1
  394. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  395. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +2 -2
  396. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  397. package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
  398. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  399. package/dist/modules/workspace/startup/steps/template-source.d.ts +17 -4
  400. package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
  401. package/dist/modules/workspace/startup/steps/template-source.js +8 -5
  402. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  403. package/dist/modules/workspace/workspace-tmp.js +3 -3
  404. package/dist/modules/workspace/workspace-tmp.js.map +1 -1
  405. package/dist/modules/workspace/workspace.routes.d.ts +4 -4
  406. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  407. package/dist/modules/workspace/workspace.routes.js +22 -22
  408. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  409. package/dist/modules/workspace/workspace.service.d.ts +6 -6
  410. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  411. package/dist/modules/workspace/workspace.service.js +11 -11
  412. package/dist/modules/workspace/workspace.service.js.map +1 -1
  413. package/dist/modules/workspace/workspace.tools.d.ts +5 -3
  414. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  415. package/dist/modules/workspace/workspace.tools.js +85 -30
  416. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  417. package/dist/shared/canonical-file-identity.d.ts +2 -2
  418. package/dist/shared/canonical-file-identity.js +5 -5
  419. package/dist/shared/canonical-file-identity.js.map +1 -1
  420. package/dist/shared/domain-errors.d.ts +39 -39
  421. package/dist/shared/domain-errors.d.ts.map +1 -1
  422. package/dist/shared/domain-errors.js +44 -44
  423. package/dist/shared/domain-errors.js.map +1 -1
  424. package/dist/shared/git.contract.d.ts +1 -1
  425. package/dist/shared/git.contract.js +1 -1
  426. package/dist/shared/http-errors.d.ts +3 -3
  427. package/dist/shared/http-errors.d.ts.map +1 -1
  428. package/dist/shared/http-errors.js +1 -1
  429. package/dist/shared/http-errors.js.map +1 -1
  430. package/dist/shared/oauth-token-error.d.ts +23 -0
  431. package/dist/shared/oauth-token-error.d.ts.map +1 -0
  432. package/dist/shared/oauth-token-error.js +47 -0
  433. package/dist/shared/oauth-token-error.js.map +1 -0
  434. package/dist/shared/pending-proposals.d.ts +3 -3
  435. package/dist/shared/pending-proposals.d.ts.map +1 -1
  436. package/dist/shared/pending-proposals.js +2 -2
  437. package/dist/shared/pending-proposals.js.map +1 -1
  438. package/dist/shared/read-capped.d.ts +19 -0
  439. package/dist/shared/read-capped.d.ts.map +1 -0
  440. package/dist/shared/read-capped.js +45 -0
  441. package/dist/shared/read-capped.js.map +1 -0
  442. package/dist/tenancy/static-tenant-source.js +1 -1
  443. package/dist/tenancy/static-tenant-source.js.map +1 -1
  444. package/migrations/0012_agent_audit.sql +40 -40
  445. package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -29
  446. package/migrations/meta/0012_snapshot.json +2246 -2246
  447. package/migrations/meta/0013_snapshot.json +2258 -2258
  448. package/package.json +5 -4
  449. package/src/__tests__/account-admin.ts +27 -0
  450. package/src/__tests__/hexis-catalog.ts +144 -0
  451. package/src/__tests__/kb-context.ts +30 -30
  452. package/src/__tests__/kb-layout-config.test.ts +21 -0
  453. package/src/__tests__/open-change-gate.ts +1 -1
  454. package/src/__tests__/real-disk.ts +21 -0
  455. package/src/__tests__/tokens.ts +19 -0
  456. package/src/__tests__/tool-handler.ts +15 -0
  457. package/src/__tests__/tool-manuals.ts +32 -0
  458. package/src/__tests__/tool-wiring.ts +31 -0
  459. package/src/__tests__/workspace-service.ts +1 -1
  460. package/src/core/__tests__/catalog-cache-invalidation.test.ts +3 -3
  461. package/src/core/__tests__/compose-embed.test.ts +1 -1
  462. package/src/core/__tests__/damaged-document.tools.test.ts +3 -3
  463. package/src/core/__tests__/erasure-slices-wired-once.test.ts +46 -0
  464. package/src/core/__tests__/gated-boot.test.ts +2 -2
  465. package/src/core/__tests__/lifecycle.test.ts +9 -9
  466. package/src/core/__tests__/oauth-sign-in-real-file.test.ts +179 -0
  467. package/src/core/catalog-cache-invalidation.ts +2 -2
  468. package/src/core/compose-embed.ts +3 -3
  469. package/src/core/core-ports.ts +19 -4
  470. package/src/core/create-core-server.ts +40 -26
  471. package/src/core/create-core-services.ts +92 -66
  472. package/src/core/lifecycle.ts +9 -9
  473. package/src/core-config.ts +3 -3
  474. package/src/index.ts +5 -5
  475. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +4 -4
  476. package/src/modules/access/__tests__/access-own-read-grant.test.ts +14 -14
  477. package/src/modules/access/__tests__/access-requests.routes.test.ts +20 -20
  478. package/src/modules/access/__tests__/access.routes.admins.test.ts +4 -4
  479. package/src/modules/access/__tests__/access.routes.batch.test.ts +4 -4
  480. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +6 -6
  481. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -6
  482. package/src/modules/access/__tests__/access.routes.overrides.test.ts +5 -5
  483. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +6 -6
  484. package/src/modules/access/__tests__/access.routes.prospective.test.ts +54 -14
  485. package/src/modules/access/__tests__/access.routes.revoke.test.ts +6 -6
  486. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +6 -6
  487. package/src/modules/access/__tests__/admin-locked-commit.test.ts +6 -6
  488. package/src/modules/access/__tests__/admin-route-helpers.test.ts +5 -5
  489. package/src/modules/access/__tests__/groups-admin.service.test.ts +27 -27
  490. package/src/modules/access/__tests__/holder-changes.test.ts +127 -0
  491. package/src/modules/access/__tests__/roles-admin.security.test.ts +14 -13
  492. package/src/modules/access/__tests__/roles-admin.service.test.ts +27 -27
  493. package/src/modules/access/__tests__/roles-capabilities.test.ts +19 -19
  494. package/src/modules/access/__tests__/roles.routes.test.ts +6 -6
  495. package/src/modules/access/__tests__/synced-groups-committer.test.ts +13 -13
  496. package/src/modules/access/__tests__/user-access-removal.service.test.ts +29 -29
  497. package/src/modules/access/access-control.interface.ts +26 -0
  498. package/src/modules/access/access-control.service.ts +93 -1
  499. package/src/modules/access/access-declarations.ts +2 -2
  500. package/src/modules/access/access-mutation.service.ts +2 -2
  501. package/src/modules/access/access-requests.routes.ts +7 -7
  502. package/src/modules/access/access-requests.service.ts +13 -13
  503. package/src/modules/access/access.routes.ts +34 -15
  504. package/src/modules/access/admin-locked-commit.ts +11 -11
  505. package/src/modules/access/admin-route-helpers.ts +5 -5
  506. package/src/modules/access/change-read-gate.ts +1 -1
  507. package/src/modules/access/groups-admin.service.ts +7 -7
  508. package/src/modules/access/index.ts +1 -1
  509. package/src/modules/access/reference-scan.ts +1 -1
  510. package/src/modules/access/roles-admin.service.ts +9 -9
  511. package/src/modules/access/synced-groups-committer.ts +11 -11
  512. package/src/modules/access/user-access-removal.service.ts +7 -7
  513. package/src/modules/access-model/__tests__/access-grammar.test.ts +2 -2
  514. package/src/modules/access-model/access-errors.ts +4 -4
  515. package/src/modules/access-model/access-grammar.ts +4 -4
  516. package/src/modules/access-model/change-gate.ts +1 -1
  517. package/src/modules/access-model/roles-yaml-guard.ts +4 -4
  518. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +98 -29
  519. package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +39 -12
  520. package/src/modules/agent-guide/__tests__/guide-budget.test.ts +95 -0
  521. package/src/modules/agent-guide/__tests__/guide-eval.test.ts +182 -0
  522. package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +263 -0
  523. package/src/modules/agent-guide/__tests__/tool-surface.json +514 -0
  524. package/src/modules/agent-guide/__tests__/tool-surface.test.ts +75 -0
  525. package/src/modules/agent-guide/agent-guide.tools.ts +49 -31
  526. package/src/modules/agent-guide/agent-guide.ts +165 -32
  527. package/src/modules/agent-guide/guide-budget.ts +77 -0
  528. package/src/modules/agent-guide/index.ts +12 -0
  529. package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +4 -5
  530. package/src/modules/agent-instructions/__tests__/compose.test.ts +1 -1
  531. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +117 -11
  532. package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -5
  533. package/src/modules/agent-instructions/compose.ts +28 -9
  534. package/src/modules/agent-instructions/shared-file-rules.ts +62 -18
  535. package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +1 -1
  536. package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -113
  537. package/src/modules/audit/__tests__/event-classifier.test.ts +121 -121
  538. package/src/modules/audit/event-classifier.ts +155 -155
  539. package/src/modules/auth/__tests__/account-deactivation.test.ts +1 -1
  540. package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +4 -4
  541. package/src/modules/auth/__tests__/account-erasure.participants.test.ts +56 -0
  542. package/src/modules/auth/__tests__/account-switch-lock.pg.test.ts +2 -2
  543. package/src/modules/auth/__tests__/account-switch-lock.test.ts +2 -2
  544. package/src/modules/auth/__tests__/account.routes.test.ts +73 -11
  545. package/src/modules/auth/__tests__/auth.service.test.ts +1 -1
  546. package/src/modules/auth/account-erasure.service.ts +27 -9
  547. package/src/modules/auth/account-hooks.ts +34 -0
  548. package/src/modules/auth/account-switch-lock.ts +2 -2
  549. package/src/modules/auth/account.routes.ts +23 -5
  550. package/src/modules/auth/auth.service.ts +4 -4
  551. package/src/modules/auth/index.ts +1 -0
  552. package/src/modules/code-mode/code-mode.tool.ts +2 -2
  553. package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +5 -24
  554. package/src/modules/connection-probe/connection-probe.service.ts +1 -34
  555. package/src/modules/database/__tests__/advisory-lock.test.ts +169 -169
  556. package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -32
  557. package/src/modules/database/core-schema.ts +2 -2
  558. package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +2 -2
  559. package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +12 -12
  560. package/src/modules/diff/diff.routes.ts +8 -8
  561. package/src/modules/embed/__tests__/embed.service.lock.test.ts +7 -7
  562. package/src/modules/embed/__tests__/embed.service.test.ts +42 -42
  563. package/src/modules/embed/__tests__/embed.tools.test.ts +1 -1
  564. package/src/modules/embed/embed.routes.ts +1 -1
  565. package/src/modules/embed/embed.service.ts +17 -17
  566. package/src/modules/kb-fs/__tests__/branch-name.test.ts +2 -2
  567. package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +260 -260
  568. package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +34 -34
  569. package/src/modules/kb-fs/__tests__/repo-path.test.ts +8 -8
  570. package/src/modules/kb-fs/branch-name.ts +8 -8
  571. package/src/modules/kb-fs/file-change-notifier.ts +2 -2
  572. package/src/modules/kb-fs/locking-filesystem.ts +30 -30
  573. package/src/modules/kb-fs/repo-path.ts +5 -5
  574. package/src/modules/kb-fs/tmp-ref.ts +3 -3
  575. package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +36 -36
  576. package/src/modules/kb-sync/index.ts +1 -1
  577. package/src/modules/kb-sync/kb-sync.interface.ts +3 -3
  578. package/src/modules/kb-sync/kb-sync.service.ts +9 -9
  579. package/src/modules/marketplace/__tests__/github-facade.test.ts +1 -1
  580. package/src/modules/marketplace/__tests__/marketplace-git.test.ts +1 -1
  581. package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +4 -2
  582. package/src/modules/mcp/__tests__/mcp.e2e.test.ts +69 -8
  583. package/src/modules/mcp/__tests__/mcp.service.test.ts +91 -13
  584. package/src/modules/mcp/__tests__/read-only-hint.pg.test.ts +194 -0
  585. package/src/modules/mcp/mcp.service.ts +93 -62
  586. package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +55 -55
  587. package/src/modules/onboarding/onboarding.contract.ts +1 -1
  588. package/src/modules/onboarding/onboarding.routes.ts +2 -2
  589. package/src/modules/onboarding/starter-pack.service.ts +6 -6
  590. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +1 -1
  591. package/src/modules/plugins/__tests__/compile-marketplace.test.ts +1 -1
  592. package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +43 -43
  593. package/src/modules/plugins/__tests__/join-requests.service.test.ts +19 -19
  594. package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +26 -26
  595. package/src/modules/plugins/__tests__/plugins.routes.test.ts +25 -25
  596. package/src/modules/plugins/join-request-jobs.service.ts +10 -10
  597. package/src/modules/plugins/join-requests.service.ts +4 -4
  598. package/src/modules/plugins/plugin-rename.service.ts +1 -1
  599. package/src/modules/plugins/plugins.routes.ts +9 -9
  600. package/src/modules/secrets-vault/__tests__/db-secrets-vault.managed.test.ts +773 -0
  601. package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +458 -4
  602. package/src/modules/secrets-vault/__tests__/managed-sign-in.route.test.ts +351 -0
  603. package/src/modules/secrets-vault/__tests__/oauth-live-declaration.route.test.ts +218 -0
  604. package/src/modules/secrets-vault/__tests__/oauth-return-to.route.test.ts +39 -6
  605. package/src/modules/secrets-vault/db-secrets-vault.service.ts +728 -118
  606. package/src/modules/secrets-vault/index.ts +8 -1
  607. package/src/modules/secrets-vault/managed-sign-in-erasure.ts +41 -0
  608. package/src/modules/secrets-vault/secrets-variable-loader.ts +134 -134
  609. package/src/modules/secrets-vault/secrets-vault.contract.ts +213 -11
  610. package/src/modules/secrets-vault/secrets-vault.routes.ts +244 -45
  611. package/src/modules/settings/__tests__/repository-source.test.ts +1 -1
  612. package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +1 -1
  613. package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +1 -1
  614. package/src/modules/settings/connection-check.ts +1 -1
  615. package/src/modules/settings/deployment-settings.service.ts +1 -1
  616. package/src/modules/settings/git-root-folders.ts +1 -1
  617. package/src/modules/settings/oidc-check.ts +5 -18
  618. package/src/modules/settings/setup.routes.ts +1 -1
  619. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +3 -3
  620. package/src/modules/skills/__tests__/branch-skills.tools.test.ts +1 -1
  621. package/src/modules/skills/__tests__/pending-skills.service.test.ts +8 -8
  622. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +18 -18
  623. package/src/modules/skills/__tests__/skills.service.test.ts +3 -3
  624. package/src/modules/skills/pending-skills.service.ts +3 -3
  625. package/src/modules/skills/skill-access-requests.routes.ts +7 -7
  626. package/src/modules/skills/skills.tools.ts +1 -1
  627. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +22 -14
  628. package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +3 -3
  629. package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -3
  630. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +4 -4
  631. package/src/modules/tool-helpers/__tests__/route-tool-schemas.catalog.test.ts +38 -0
  632. package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +3 -3
  633. package/src/modules/tool-helpers/__tests__/validate-token.test.ts +1 -1
  634. package/src/modules/tool-helpers/tool-context.ts +6 -6
  635. package/src/modules/tool-helpers/tool-def.ts +1 -1
  636. package/src/modules/tool-helpers/tool-handler.ts +2 -2
  637. package/src/modules/tool-helpers/tool.contract.ts +4 -4
  638. package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +9 -9
  639. package/src/modules/tool-manuals/__tests__/tool-manuals.managed-sign-in.test.ts +89 -0
  640. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +197 -11
  641. package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +1 -1
  642. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +132 -6
  643. package/src/modules/tool-manuals/mcp-json-discovery.ts +73 -34
  644. package/src/modules/tool-manuals/mcp-server-edit.service.ts +1 -1
  645. package/src/modules/tool-manuals/pending-tools.service.ts +3 -3
  646. package/src/modules/tool-manuals/tool-delete.service.ts +1 -1
  647. package/src/modules/tool-manuals/tool-manuals.contract.ts +63 -3
  648. package/src/modules/tool-manuals/tool-manuals.service.ts +191 -51
  649. package/src/modules/tool-manuals/tool-manuals.tools.ts +93 -28
  650. package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +4 -4
  651. package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +3 -3
  652. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +12 -119
  653. package/src/modules/{workflow → version-control}/__tests__/apply-failure.test.ts +54 -54
  654. package/src/modules/{workflow → version-control}/__tests__/event-bus.test.ts +27 -27
  655. package/src/modules/{workflow → version-control}/__tests__/events-delivery.test.ts +37 -37
  656. package/src/modules/{workflow → version-control}/__tests__/file-lock.service.deletion-gate.test.ts +2 -2
  657. package/src/modules/{workflow → version-control}/__tests__/file-lock.service.path-identity.test.ts +8 -8
  658. package/src/modules/{workflow → version-control}/__tests__/merge-announces-tree.test.ts +11 -11
  659. package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.concurrency.test.ts +9 -9
  660. package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.test.ts +25 -25
  661. package/src/modules/{workflow → version-control}/__tests__/preserve-roles-yaml.test.ts +42 -42
  662. package/src/modules/version-control/__tests__/public-surface.test.ts +114 -0
  663. package/src/modules/{workflow/__tests__/workflow.routes.folder-proposals.test.ts → version-control/__tests__/version-control.routes.folder-proposals.test.ts} +18 -18
  664. 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
  665. 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
  666. package/src/modules/{workflow/__tests__/workflow.routes.lock-path.test.ts → version-control/__tests__/version-control.routes.lock-path.test.ts} +18 -18
  667. 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
  668. package/src/modules/{workflow/__tests__/workflow.routes.push-refused.test.ts → version-control/__tests__/version-control.routes.push-refused.test.ts} +14 -14
  669. 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
  670. package/src/modules/{workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts → version-control/__tests__/version-control.service.commitFileWhileLocked.test.ts} +14 -14
  671. package/src/modules/{workflow/__tests__/workflow.service.delete-branch.test.ts → version-control/__tests__/version-control.service.delete-branch.test.ts} +14 -14
  672. 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
  673. package/src/modules/{workflow/__tests__/workflow.service.facade.test.ts → version-control/__tests__/version-control.service.facade.test.ts} +97 -99
  674. package/src/modules/{workflow/__tests__/workflow.service.folder-proposals.test.ts → version-control/__tests__/version-control.service.folder-proposals.test.ts} +7 -7
  675. package/src/modules/{workflow/__tests__/workflow.service.platform-restore.test.ts → version-control/__tests__/version-control.service.platform-restore.test.ts} +6 -6
  676. package/src/modules/{workflow/__tests__/workflow.service.read-gate.test.ts → version-control/__tests__/version-control.service.read-gate.test.ts} +9 -9
  677. package/src/modules/{workflow/__tests__/workflow.service.releaseLock.test.ts → version-control/__tests__/version-control.service.releaseLock.test.ts} +42 -42
  678. package/src/modules/{workflow/__tests__/workflow.service.repository-replaced.test.ts → version-control/__tests__/version-control.service.repository-replaced.test.ts} +4 -4
  679. package/src/modules/{workflow/__tests__/workflow.service.sync.test.ts → version-control/__tests__/version-control.service.sync.test.ts} +17 -17
  680. 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
  681. 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
  682. 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
  683. package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read.tools.test.ts +3 -3
  684. package/src/modules/{workflow → version-control}/agent-tools/__tests__/update-change-request.parity.test.ts +16 -16
  685. package/src/modules/{workflow/agent-tools/__tests__/workflow.tools.test.ts → version-control/agent-tools/__tests__/version-control.tools.test.ts} +9 -9
  686. package/src/modules/{workflow → version-control}/agent-tools/change-request-read.tools.ts +2 -2
  687. package/src/modules/{workflow/agent-tools/workflow.tools.ts → version-control/agent-tools/version-control.tools.ts} +52 -48
  688. package/src/modules/{workflow → version-control}/change-request-hooks.ts +1 -1
  689. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/approval-states.test.ts +5 -5
  690. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/cancel-pr.test.ts +8 -8
  691. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/carry-approvals-forward.test.ts +6 -6
  692. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/erase-approver.test.ts +5 -5
  693. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-gate.test.ts +3 -3
  694. package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-records-own-commit.test.ts +3 -3
  695. package/src/modules/{workflow/review-workflow/review-workflow.interface.ts → version-control/change-request-review/change-request-review.interface.ts} +1 -1
  696. package/src/modules/{workflow/review-workflow/review-workflow.service.ts → version-control/change-request-review/change-request-review.service.ts} +28 -28
  697. package/src/modules/{workflow → version-control}/event-bus.ts +14 -14
  698. package/src/modules/{workflow → version-control}/events-delivery.ts +11 -11
  699. package/src/modules/{workflow → version-control}/events.routes.ts +5 -5
  700. package/src/modules/{workflow → version-control}/file-lock.service.ts +6 -6
  701. package/src/modules/{workflow → version-control}/git/__tests__/git-test-helpers.ts +3 -3
  702. package/src/modules/{workflow → version-control}/git/__tests__/git.service.accessGating.test.ts +5 -5
  703. package/src/modules/{workflow → version-control}/git/__tests__/git.service.appliedChange.test.ts +4 -4
  704. package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedFilesForPr.test.ts +16 -16
  705. package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedPathsMemo.test.ts +2 -2
  706. package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitChanges.test.ts +3 -3
  707. package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.strayPath.test.ts +10 -10
  708. package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.test.ts +3 -3
  709. package/src/modules/{workflow → version-control}/git/__tests__/git.service.createBranch.test.ts +3 -3
  710. package/src/modules/{workflow → version-control}/git/__tests__/git.service.deleteBranch.test.ts +7 -7
  711. package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileAtCommit.test.ts +9 -9
  712. package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileBetweenBranches.test.ts +23 -23
  713. package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileBytesAtCommit.test.ts +7 -7
  714. package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -3
  715. package/src/modules/{workflow → version-control}/git/__tests__/git.service.forkPoint.test.ts +2 -2
  716. package/src/modules/{workflow → version-control}/git/__tests__/git.service.history-guards.test.ts +2 -2
  717. package/src/modules/{workflow → version-control}/git/__tests__/git.service.list-branches.test.ts +12 -12
  718. package/src/modules/{workflow → version-control}/git/__tests__/git.service.listTrackedFiles.test.ts +2 -2
  719. package/src/modules/{workflow → version-control}/git/__tests__/git.service.logForFile.test.ts +6 -6
  720. package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeChangeRequest.test.ts +20 -20
  721. package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeIntoBranch.test.ts +16 -16
  722. package/src/modules/{workflow → version-control}/git/__tests__/git.service.pendingChanges.test.ts +2 -2
  723. package/src/modules/{workflow → version-control}/git/__tests__/git.service.postMergePull.test.ts +5 -5
  724. package/src/modules/{workflow → version-control}/git/__tests__/git.service.prFetchFailure.test.ts +2 -2
  725. package/src/modules/{workflow → version-control}/git/__tests__/git.service.pull.test.ts +12 -12
  726. package/src/modules/{workflow → version-control}/git/__tests__/git.service.readFileAtRef.test.ts +3 -3
  727. package/src/modules/{workflow → version-control}/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -2
  728. package/src/modules/{workflow → version-control}/git/__tests__/git.service.status.test.ts +4 -4
  729. package/src/modules/{workflow → version-control}/git/__tests__/git.service.syncFromRemote.test.ts +8 -8
  730. package/src/modules/{workflow → version-control}/git/__tests__/git.service.worktrees.test.ts +4 -4
  731. package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.list-fetch.test.ts +2 -2
  732. package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.test.ts +6 -6
  733. package/src/modules/{workflow → version-control}/git/git.service.ts +57 -57
  734. package/src/modules/{workflow → version-control}/git/node-git-runner.ts +1 -1
  735. package/src/modules/{workflow → version-control}/git/pull-request.service.ts +12 -12
  736. package/src/modules/{workflow → version-control}/index.ts +6 -5
  737. package/src/modules/{workflow → version-control}/pending-commits.service.ts +2 -2
  738. package/src/modules/{workflow → version-control}/pending-commits.worker.ts +8 -8
  739. package/src/modules/{workflow → version-control}/read-on-branch.ts +2 -2
  740. package/src/modules/{workflow/workflow-hooks.ts → version-control/version-control-hooks.ts} +3 -3
  741. package/src/modules/{workflow/workflow.routes.ts → version-control/version-control.routes.ts} +64 -63
  742. package/src/modules/{workflow/workflow.service.ts → version-control/version-control.service.ts} +92 -97
  743. package/src/modules/workspace/__tests__/agent-access.gate.test.ts +8 -8
  744. package/src/modules/workspace/__tests__/agent-downloads.test.ts +13 -16
  745. package/src/modules/workspace/__tests__/agent-uploads.test.ts +11 -12
  746. package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +11 -16
  747. package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -3
  748. package/src/modules/workspace/__tests__/git-internals.security.test.ts +27 -27
  749. package/src/modules/workspace/__tests__/kb-repository.test.ts +1 -1
  750. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
  751. package/src/modules/workspace/__tests__/start-session.default-branch.test.ts +152 -0
  752. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +6 -6
  753. package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +13 -14
  754. package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +6 -6
  755. package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +4 -4
  756. package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +6 -6
  757. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +8 -8
  758. package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +4 -4
  759. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +6 -6
  760. package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +6 -6
  761. package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +4 -4
  762. package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +6 -6
  763. package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +7 -7
  764. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +13 -13
  765. package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +1 -1
  766. package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +1 -1
  767. package/src/modules/workspace/__tests__/workspace.service.worktrees.test.ts +1 -1
  768. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +12 -14
  769. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +5 -5
  770. package/src/modules/workspace/__tests__/workspace.tools.test.ts +182 -75
  771. package/src/modules/workspace/agent-access.gate.ts +6 -6
  772. package/src/modules/workspace/git-internals.middleware.ts +2 -2
  773. package/src/modules/workspace/kb-repository.ts +1 -1
  774. package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +1 -1
  775. package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +1 -1
  776. package/src/modules/workspace/startup/__tests__/kb-startup-runner.worktrees.test.ts +1 -1
  777. package/src/modules/workspace/startup/kb-git.ts +1 -1
  778. package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +94 -70
  779. package/src/modules/workspace/startup/steps/seed-tree.ts +4 -5
  780. package/src/modules/workspace/startup/steps/template-files.step.ts +4 -5
  781. package/src/modules/workspace/startup/steps/template-source.ts +21 -6
  782. package/src/modules/workspace/workspace-tmp.ts +4 -4
  783. package/src/modules/workspace/workspace.routes.ts +26 -26
  784. package/src/modules/workspace/workspace.service.ts +11 -11
  785. package/src/modules/workspace/workspace.tools.ts +90 -30
  786. package/src/shared/__tests__/canonical-file-identity.test.ts +5 -5
  787. package/src/shared/__tests__/http-errors.test.ts +4 -4
  788. package/src/shared/__tests__/read-capped.test.ts +68 -0
  789. package/src/shared/canonical-file-identity.ts +5 -5
  790. package/src/shared/domain-errors.ts +44 -44
  791. package/src/shared/git.contract.ts +1 -1
  792. package/src/shared/http-errors.ts +3 -3
  793. package/src/shared/kb-context.ts +130 -130
  794. package/src/shared/oauth-token-error.ts +46 -0
  795. package/src/shared/pending-proposals.ts +4 -4
  796. package/src/shared/read-capped.ts +40 -0
  797. package/src/tenancy/__tests__/tenant-host.test.ts +372 -372
  798. package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -221
  799. package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -35
  800. package/src/tenancy/index.ts +35 -35
  801. package/src/tenancy/static-tenant-source.ts +1 -1
  802. package/src/tenancy/tenant-host.ts +261 -261
  803. package/src/tenancy/tenant-runtime.ts +208 -208
  804. package/src/tenancy/tenant-source.contract.ts +59 -59
  805. package/agent-guide/finding-things.md +0 -7
  806. package/agent-guide/introduction.md +0 -27
  807. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +0 -1
  808. package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +0 -1
  809. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +0 -1
  810. package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +0 -1
  811. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +0 -1
  812. package/dist/modules/workflow/agent-tools/change-request-summary.js.map +0 -1
  813. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +0 -1
  814. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +0 -1
  815. package/dist/modules/workflow/change-request-hooks.d.ts.map +0 -1
  816. package/dist/modules/workflow/change-request-hooks.js.map +0 -1
  817. package/dist/modules/workflow/event-bus.d.ts.map +0 -1
  818. package/dist/modules/workflow/event-bus.js.map +0 -1
  819. package/dist/modules/workflow/events-delivery.d.ts.map +0 -1
  820. package/dist/modules/workflow/events-delivery.js.map +0 -1
  821. package/dist/modules/workflow/events.routes.d.ts.map +0 -1
  822. package/dist/modules/workflow/events.routes.js.map +0 -1
  823. package/dist/modules/workflow/file-lock.service.d.ts.map +0 -1
  824. package/dist/modules/workflow/file-lock.service.js.map +0 -1
  825. package/dist/modules/workflow/git/change-request-link.d.ts.map +0 -1
  826. package/dist/modules/workflow/git/change-request-link.js.map +0 -1
  827. package/dist/modules/workflow/git/git-version.d.ts.map +0 -1
  828. package/dist/modules/workflow/git/git-version.js.map +0 -1
  829. package/dist/modules/workflow/git/git.service.d.ts.map +0 -1
  830. package/dist/modules/workflow/git/git.service.js.map +0 -1
  831. package/dist/modules/workflow/git/merge-commit.d.ts.map +0 -1
  832. package/dist/modules/workflow/git/merge-commit.js.map +0 -1
  833. package/dist/modules/workflow/git/node-git-runner.d.ts.map +0 -1
  834. package/dist/modules/workflow/git/node-git-runner.js.map +0 -1
  835. package/dist/modules/workflow/git/pull-request.service.d.ts.map +0 -1
  836. package/dist/modules/workflow/git/pull-request.service.js.map +0 -1
  837. package/dist/modules/workflow/index.d.ts.map +0 -1
  838. package/dist/modules/workflow/index.js.map +0 -1
  839. package/dist/modules/workflow/pending-commits.service.d.ts.map +0 -1
  840. package/dist/modules/workflow/pending-commits.service.js.map +0 -1
  841. package/dist/modules/workflow/pending-commits.worker.d.ts.map +0 -1
  842. package/dist/modules/workflow/pending-commits.worker.js.map +0 -1
  843. package/dist/modules/workflow/read-on-branch.d.ts.map +0 -1
  844. package/dist/modules/workflow/read-on-branch.js.map +0 -1
  845. package/dist/modules/workflow/recovery-bot.d.ts.map +0 -1
  846. package/dist/modules/workflow/recovery-bot.js.map +0 -1
  847. package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +0 -1
  848. package/dist/modules/workflow/review-workflow/approval-lock.js.map +0 -1
  849. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +0 -1
  850. package/dist/modules/workflow/review-workflow/review-workflow.interface.js +0 -2
  851. package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +0 -1
  852. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +0 -1
  853. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +0 -1
  854. package/dist/modules/workflow/sanitize-error.d.ts.map +0 -1
  855. package/dist/modules/workflow/sanitize-error.js.map +0 -1
  856. package/dist/modules/workflow/workflow-hooks.d.ts.map +0 -1
  857. package/dist/modules/workflow/workflow-hooks.js.map +0 -1
  858. package/dist/modules/workflow/workflow.routes.d.ts.map +0 -1
  859. package/dist/modules/workflow/workflow.routes.js.map +0 -1
  860. package/dist/modules/workflow/workflow.service.d.ts.map +0 -1
  861. package/dist/modules/workflow/workflow.service.js.map +0 -1
  862. package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +0 -213
  863. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.d.ts +0 -0
  864. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.js +0 -0
  865. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.d.ts +0 -0
  866. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.d.ts +0 -0
  867. /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.js +0 -0
  868. /package/dist/modules/{workflow → version-control}/change-request-hooks.js +0 -0
  869. /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.d.ts +0 -0
  870. /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.js +0 -0
  871. /package/dist/modules/{workflow → version-control}/events-delivery.js +0 -0
  872. /package/dist/modules/{workflow → version-control}/events.routes.js +0 -0
  873. /package/dist/modules/{workflow → version-control}/git/change-request-link.d.ts +0 -0
  874. /package/dist/modules/{workflow → version-control}/git/change-request-link.js +0 -0
  875. /package/dist/modules/{workflow → version-control}/git/git-version.d.ts +0 -0
  876. /package/dist/modules/{workflow → version-control}/git/git-version.js +0 -0
  877. /package/dist/modules/{workflow → version-control}/git/merge-commit.d.ts +0 -0
  878. /package/dist/modules/{workflow → version-control}/git/merge-commit.js +0 -0
  879. /package/dist/modules/{workflow → version-control}/git/node-git-runner.d.ts +0 -0
  880. /package/dist/modules/{workflow → version-control}/recovery-bot.d.ts +0 -0
  881. /package/dist/modules/{workflow → version-control}/recovery-bot.js +0 -0
  882. /package/dist/modules/{workflow → version-control}/sanitize-error.d.ts +0 -0
  883. /package/dist/modules/{workflow → version-control}/sanitize-error.js +0 -0
  884. /package/src/modules/{workflow → version-control}/__tests__/change-request-hooks.test.ts +0 -0
  885. /package/src/modules/{workflow → version-control}/__tests__/fake-file-lock-db.ts +0 -0
  886. /package/src/modules/{workflow → version-control}/__tests__/pending-commits.canonical.test.ts +0 -0
  887. /package/src/modules/{workflow → version-control}/__tests__/pending-commits.enqueue-if-absent.test.ts +0 -0
  888. /package/src/modules/{workflow → version-control}/__tests__/pending-commits.repository-replaced.test.ts +0 -0
  889. /package/src/modules/{workflow → version-control}/__tests__/sanitize-error.test.ts +0 -0
  890. /package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read-shape.test.ts +0 -0
  891. /package/src/modules/{workflow → version-control}/agent-tools/change-request-read-shape.ts +0 -0
  892. /package/src/modules/{workflow → version-control}/agent-tools/change-request-summary.ts +0 -0
  893. /package/src/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.ts +0 -0
  894. /package/src/modules/{workflow → version-control}/git/__tests__/branchAuthor.test.ts +0 -0
  895. /package/src/modules/{workflow → version-control}/git/__tests__/change-request-link.test.ts +0 -0
  896. /package/src/modules/{workflow → version-control}/git/__tests__/git-version.failure.test.ts +0 -0
  897. /package/src/modules/{workflow → version-control}/git/__tests__/git-version.test.ts +0 -0
  898. /package/src/modules/{workflow → version-control}/git/__tests__/node-git-runner.test.ts +0 -0
  899. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.getPrDetail.test.ts +0 -0
  900. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.placeholder.test.ts +0 -0
  901. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +0 -0
  902. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-delete.test.ts +0 -0
  903. /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-update.test.ts +0 -0
  904. /package/src/modules/{workflow → version-control}/git/change-request-link.ts +0 -0
  905. /package/src/modules/{workflow → version-control}/git/git-version.ts +0 -0
  906. /package/src/modules/{workflow → version-control}/git/merge-commit.ts +0 -0
  907. /package/src/modules/{workflow → version-control}/recovery-bot.ts +0 -0
  908. /package/src/modules/{workflow → version-control}/sanitize-error.ts +0 -0
@@ -10,40 +10,38 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
10
10
  import { testKbContext } from '../../../__tests__/kb-context.js';
11
11
  import { slowRipgrep } from '../../../__tests__/slow-ripgrep.js';
12
12
  import { LocalFilesystem } from '@mastra/core/workspace';
13
- import { ToolRegistry } from '../../tool-registry/tool-registry.js';
14
- import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
15
- import { ToolError, type ToolContext } from '../../tool-helpers/tool.contract.js';
16
- import type { ToolAuth } from '../../tool-auth/tool-auth.middleware.js';
13
+ import { GUIDE_FIRST_SENTENCE, ToolRegistry } from '../../tool-registry/index.js';
14
+ import { AccessControlService, VersionControlHooks, createToolHandlerFactory, type AgentOperationContext } from '../../../__tests__/tool-wiring.js';
15
+ import { ToolError, type ToolContext } from '../../tool-helpers/index.js';
16
+ import type { ToolAuth } from '../../tool-auth/index.js';
17
17
  import { registerWorkspaceTools } from '../workspace.tools.js';
18
18
  import { RipgrepPatternMatcher, type RipgrepPatternMatcherOptions } from '../index.js';
19
- import { sharedFileRules, sharedFileRulesSection } from '../../agent-instructions/shared-file-rules.js';
20
- import { composeAgentGuide } from '../../agent-guide/agent-guide.js';
21
- import { GUIDE_FIRST_SENTENCE } from '../../tool-registry/guide-first.js';
19
+ import { sharedFileRules, sharedFileRulesSection } from '../../agent-instructions/index.js';
20
+ import { composeAgentGuide } from '../../agent-guide/index.js';
22
21
  import { RoutineWritePolicyService } from '../routine-write-policy.js';
23
22
  import { UuidSessionSink, type ISessionSink } from '../session-sink.js';
24
23
  import { FIRST_RUN_SECTION_ID, STARTER_GUIDE_FILE, firstRunNote, type FirstRunStarterSource } from '../first-run.js';
25
- import { WorkflowHooks, type AgentOperationContext } from '../../workflow/workflow-hooks.js';
26
24
  import { SESSION_ID_DESCRIPTION, ToolDescriptionNotes } from '../agent-access.gate.js';
27
25
  import { SpillStore } from '../spill-store.js';
28
26
  import { DocExtractService } from '../file-readers/doc-extract.service.js';
29
27
  import { WorkerDocumentExtractor } from '../file-readers/extract-in-worker.js';
30
28
  import { OCTET_STREAM_FALLBACK_NOTE } from '../file-readers/content-mode.js';
31
- import type { IAccessControl } from '../../access/access-control.interface.js';
32
- import { AccessControlService } from '../../access/access-control.service.js';
33
- import { NodeFs } from '../../kb-fs/node-fs.js';
29
+ import type { IAccessControl } from '../../access/index.js';
30
+ import { realDisk } from '../../../__tests__/real-disk.js';
34
31
  import type { WorkspaceService } from '../workspace.service.js';
35
32
  import { DEFAULT_KB_LAYOUT, isBranchAuthoredBy, isOwnSuggestionsBranch } from '@bevel-software/platform-shared';
36
- import { normalizeWorkspacePath } from '../../kb-fs/repo-path.js';
33
+ import { normalizeWorkspacePath } from '../../kb-fs/index.js';
37
34
  import { GIT_INTERNALS_MESSAGE, PathNotFoundError } from '../../../shared/domain-errors.js';
38
- import { AccessDeniedError } from '../../access-model/access-errors.js';
35
+ import { AccessDeniedError } from '../../access-model/index.js';
39
36
  import { proposalTitleFor } from '../write-denial.js';
40
37
  import { NOT_FOUND_NEXT_STEP } from '../not-found.js';
41
38
  import { compileCheck, exampleArguments } from '@bevel-software/platform-mcp-core';
42
- import { routeToolSchemas } from '../../tool-helpers/route-tool-schemas.js';
43
- import { TOOL_DESCRIPTION_CAP, clientVisibleLength } from '../../tool-registry/description-length.js';
44
39
 
45
40
  const KB_DIR = 'knowledge-base';
46
41
 
42
+ /** A move that changes nobody's access: what a stand-in without rules answers. */
43
+ const NO_CHANGES = { lose: [], gain: [] };
44
+
47
45
  /** Allow-all access control — the default for tests not exercising read gating. */
48
46
  const allowAll = {
49
47
  canRead: async () => true,
@@ -67,6 +65,8 @@ const allowAll = {
67
65
  // a folder's `access.md` files actually does to it is exercised against
68
66
  // REAL rules in "a move preview judges the destination as it will be".
69
67
  previewAccessAfterRelocation: async () => ({ read: true, write: true, download: true, owner: true }),
68
+ // Who else loses or gains access in a move: nobody, here.
69
+ prospectiveHolderChanges: async () => NO_CHANGES,
70
70
  } as unknown as IAccessControl;
71
71
 
72
72
  /** Access control that denies `canRead` for an explicit set of repo-relative paths. */
@@ -120,7 +120,7 @@ let focusedBranch: string | undefined;
120
120
  /** The registry the tools were mounted into, so a test can inspect their defs. */
121
121
  let toolRegistry: ToolRegistry;
122
122
  /** The hook registry the tools were mounted against, so a test can register one. */
123
- let hooks: WorkflowHooks;
123
+ let hooks: VersionControlHooks;
124
124
  /** The note registry the tools were mounted against, so a test can register a note. */
125
125
  let notes: ToolDescriptionNotes;
126
126
  /**
@@ -165,7 +165,7 @@ async function start(
165
165
  await docExtractor?.close();
166
166
  const extractor = new WorkerDocumentExtractor();
167
167
  docExtractor = extractor;
168
- hooks = new WorkflowHooks();
168
+ hooks = new VersionControlHooks();
169
169
  notes = new ToolDescriptionNotes();
170
170
  callerSource = 'internal';
171
171
  tempDir = await mkdtemp(join(tmpdir(), 'ws-tools-'));
@@ -307,7 +307,7 @@ async function start(
307
307
  return { destination: '', extracted, skipped };
308
308
  },
309
309
  } as never,
310
- workflowService: {} as never,
310
+ versionControlService: {} as never,
311
311
  events: {} as never,
312
312
  getFilesystem: async () => fs,
313
313
  });
@@ -825,10 +825,10 @@ describe('write modes and per-path outcomes', () => {
825
825
  // The paragraph that said this in BOTH descriptions is one shared rule now.
826
826
  // What stays on the tool is the input the agent fills, which is where the
827
827
  // decision is actually taken.
828
- const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'write-mode')!;
828
+ const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'write-mode')!;
829
829
  expect(rule.body).toContain('DEFAULTS TO `create`');
830
830
  expect(rule.body).toContain('On write_file and write_files');
831
- expect(sharedFileRulesSection(testKbContext().layout).split(rule.body)).toHaveLength(2);
831
+ expect(sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch).split(rule.body)).toHaveLength(2);
832
832
  for (const name of ['write_file', 'write_files']) {
833
833
  const def = tools.find((t) => t.name === name)!;
834
834
  expect(def.description, name).not.toContain('DEFAULTS TO `create`');
@@ -2089,7 +2089,7 @@ describe('office documents and PDFs', () => {
2089
2089
  // description. Checked on the whole body rather than on a phrase: the
2090
2090
  // drift this PR exists to prevent is a paragraph pasted back onto a
2091
2091
  // tool, and naming only two marker phrases would catch two of eight.
2092
- for (const rule of sharedFileRules(testKbContext().layout)) {
2092
+ for (const rule of sharedFileRules(testKbContext().layout, testKbContext().defaultBranch)) {
2093
2093
  expect(def!.description, `${name} / ${rule.id}`).not.toContain(rule.body);
2094
2094
  }
2095
2095
  // The two lead-in labels the paragraphs used to arrive under are gone
@@ -2124,30 +2124,12 @@ describe('office documents and PDFs', () => {
2124
2124
  // Narrowed by hand: the assertion above already failed the test if not.
2125
2125
  if (!compiled.checkable) throw new Error(compiled.reason);
2126
2126
  expect(compiled.check(exampleArguments(def.inputs)), def.name).toEqual([]);
2127
- // And the FLAT schema, which is what the tool's own route checks the
2128
- // call against: the two must agree, or a call the example produced would
2129
- // be refused one layer in.
2130
- const flat = routeToolSchemas(def.name)?.flat;
2131
- expect(flat, def.name).toBeDefined();
2132
- const flatCheck = compileCheck(flat);
2133
- expect(flatCheck.checkable, `${def.name} (flat): ${flatCheck.checkable ? '' : flatCheck.reason}`).toBe(true);
2134
- if (!flatCheck.checkable) throw new Error(flatCheck.reason);
2135
- expect(flatCheck.check(exampleArguments(flat)), `${def.name} (flat)`).toEqual([]);
2136
- }
2137
- });
2138
-
2139
- it('every description, call example and purpose prefix included, stays inside the cap a client shows', async () => {
2140
- await start();
2141
- const tools = await toolRegistry.listInternal();
2142
- for (const def of tools) {
2143
- // Measured as a CLIENT receives it: the call line, the purpose prefix at
2144
- // its own cap (the four knowledge-base tools carry one), and the
2145
- // description — the three things that ride one tool's entry.
2146
- const received = clientVisibleLength(def);
2147
- expect(received, `${def.name} is ${received} characters (cap ${TOOL_DESCRIPTION_CAP})`).toBeLessThanOrEqual(
2148
- TOOL_DESCRIPTION_CAP,
2149
- );
2150
2127
  }
2128
+ // That the FLAT schema each route checks a call against agrees with the
2129
+ // example is the route layer's own property: tool-helpers'
2130
+ // `route-tool-schemas.catalog.test.ts` holds it over the whole catalog.
2131
+ // And that every description stays inside the cap a client shows is the
2132
+ // registry's: `tool-description-length.test.ts`, over the same catalog.
2151
2133
  });
2152
2134
 
2153
2135
  describe('binary capability contract: a text file, a document, an image and a zip', () => {
@@ -2296,10 +2278,10 @@ describe('office documents and PDFs', () => {
2296
2278
  it('says where the images a page uses go — once, in the shared rules', async () => {
2297
2279
  await start();
2298
2280
  const tools = await toolRegistry.listInternal();
2299
- const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'images-in-pages')!;
2281
+ const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'images-in-pages')!;
2300
2282
  expect(rule.body).toContain('`assets/` folder next to the page');
2301
2283
  expect(rule.body).toContain('![Approval screen](./assets/approval-screen.png)');
2302
- expect(sharedFileRulesSection(testKbContext().layout)).toContain(rule.body);
2284
+ expect(sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch)).toContain(rule.body);
2303
2285
  for (const name of ['write_file', 'write_files']) {
2304
2286
  expect(tools.find((t) => t.name === name)!.description, name).not.toContain('`assets/` folder next to the page');
2305
2287
  }
@@ -2420,7 +2402,7 @@ describe('start_session', () => {
2420
2402
  // The default branch's workspace directory, for the tests about the
2421
2403
  // `firstRun` note. Without one the workspace service is a bare stand-in
2422
2404
  // the note's check cannot use, which is what every other test here wants:
2423
- // the call answers with the id alone.
2405
+ // the call answers with the id and the default branch, never `firstRun`.
2424
2406
  defaultWorkspaceDir?: string,
2425
2407
  // The starter pack the knowledge base was filled from, for the note.
2426
2408
  starterPacks?: FirstRunStarterSource,
@@ -2440,7 +2422,7 @@ describe('start_session', () => {
2440
2422
  getWorkspacePath: async () => defaultWorkspaceDir,
2441
2423
  }
2442
2424
  : {}) as never,
2443
- workflowService: {} as never,
2425
+ versionControlService: {} as never,
2444
2426
  events: {} as never,
2445
2427
  getFilesystem: async () => ({}) as never,
2446
2428
  });
@@ -2466,7 +2448,7 @@ describe('start_session', () => {
2466
2448
  registerWorkspaceTools(
2467
2449
  registry, router, auth, toolHandler,
2468
2450
  new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract'), extractor), access, testKbContext({ kbDirName: KB_DIR }),
2469
- { recoveryBotEmail: RECOVERY_BOT, hooks: new WorkflowHooks(), notes: new ToolDescriptionNotes() },
2451
+ { recoveryBotEmail: RECOVERY_BOT, hooks: new VersionControlHooks(), notes: new ToolDescriptionNotes() },
2470
2452
  new RoutineWritePolicyService(),
2471
2453
  sink ?? fakeSessionSink,
2472
2454
  undefined,
@@ -2475,7 +2457,7 @@ describe('start_session', () => {
2475
2457
  undefined,
2476
2458
  undefined /* downloads */,
2477
2459
  starterPacks,
2478
- new NodeFs(),
2460
+ realDisk(),
2479
2461
  );
2480
2462
  app.use('/api', router);
2481
2463
  server = await new Promise<HttpServer>((r) => {
@@ -2601,7 +2583,7 @@ describe('start_session', () => {
2601
2583
  registerWorkspaceTools(
2602
2584
  registry, router, noopAuth, (() => () => {}) as never,
2603
2585
  new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract'), extractor), allowAll, testKbContext({ kbDirName: KB_DIR }),
2604
- { recoveryBotEmail: RECOVERY_BOT, hooks: new WorkflowHooks(), notes: new ToolDescriptionNotes() },
2586
+ { recoveryBotEmail: RECOVERY_BOT, hooks: new VersionControlHooks(), notes: new ToolDescriptionNotes() },
2605
2587
  new RoutineWritePolicyService(),
2606
2588
  {} as never,
2607
2589
  );
@@ -2700,7 +2682,7 @@ describe('start_session', () => {
2700
2682
 
2701
2683
  /**
2702
2684
  * The note is a read: it says what the knowledge folder holds. A caller
2703
- * who may not read the folder gets the id alone, and a pack page the
2685
+ * who may not read the folder gets the id and the default branch alone, and a pack page the
2704
2686
  * caller may not read is judged as anybody's page, so the note never
2705
2687
  * tells them it is still a placeholder.
2706
2688
  */
@@ -2708,7 +2690,7 @@ describe('start_session', () => {
2708
2690
  const closed = { ...allowAll, canRead: async () => false } as unknown as IAccessControl;
2709
2691
  const base = await startSessionApp('external', undefined, wsDir, undefined, closed);
2710
2692
  const res = (await (await postRaw(`${base}/api/agent/tools/start_session`)).json()) as { firstRun?: string };
2711
- expect(res).toEqual({ sessionId: 'thread-xyz' });
2693
+ expect(res).toEqual({ sessionId: 'thread-xyz', defaultBranch: 'target-company-state' });
2712
2694
  });
2713
2695
 
2714
2696
  it('judges the folder as the caller may see it: a page they may not read leaves the note standing', async () => {
@@ -2741,15 +2723,15 @@ describe('start_session', () => {
2741
2723
  } as unknown as IAccessControl;
2742
2724
  const base = await startSessionApp('external', undefined, wsDir, starter, pageClosed);
2743
2725
  const res = (await (await postRaw(`${base}/api/agent/tools/start_session`)).json()) as { firstRun?: string };
2744
- expect(res).toEqual({ sessionId: 'thread-xyz' });
2726
+ expect(res).toEqual({ sessionId: 'thread-xyz', defaultBranch: 'target-company-state' });
2745
2727
  });
2746
2728
 
2747
- it('never costs the session id: a workspace it cannot read answers with the id alone', async () => {
2729
+ it('never costs the session id: a workspace it cannot read answers with the id and the default branch', async () => {
2748
2730
  await rm(wsDir, { recursive: true, force: true });
2749
2731
 
2750
2732
  const res = await startSession();
2751
2733
 
2752
- expect(res).toEqual({ sessionId: 'thread-xyz' });
2734
+ expect(res).toEqual({ sessionId: 'thread-xyz', defaultBranch: 'target-company-state' });
2753
2735
  });
2754
2736
  });
2755
2737
  });
@@ -2786,7 +2768,7 @@ describe('branch is a required parameter in the tool contract', () => {
2786
2768
  new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract'), extractor),
2787
2769
  allowAll,
2788
2770
  testKbContext({ kbDirName: KB_DIR }),
2789
- { recoveryBotEmail: RECOVERY_BOT, hooks: new WorkflowHooks(), notes: new ToolDescriptionNotes() },
2771
+ { recoveryBotEmail: RECOVERY_BOT, hooks: new VersionControlHooks(), notes: new ToolDescriptionNotes() },
2790
2772
  new RoutineWritePolicyService(),
2791
2773
  {} as never,
2792
2774
  // Skill check, change gate, uploads, guide, downloads, starter packs, disk: not this harness's business.
@@ -3256,7 +3238,8 @@ describe('preflight for moves and deletes', () => {
3256
3238
  if (rel === 'sealed.md' || rel.endsWith('/sealed.md')) return { read: true, write: false, download: false, owner: false };
3257
3239
  if (rel.startsWith('HR/')) return { read: true, write: true, download: false, owner: false };
3258
3240
  if (rel.startsWith('Locked/')) return { read: true, write: false, download: false, owner: false };
3259
- if (rel.startsWith('Secret/')) return { read: false, write: false, download: false, owner: false };
3241
+ // The folder itself answers as its contents do, as the resolver's scopes do.
3242
+ if (rel === 'Secret' || rel.startsWith('Secret/')) return { read: false, write: false, download: false, owner: false };
3260
3243
  return { read: true, write: true, download: true, owner: true };
3261
3244
  };
3262
3245
  const rules = {
@@ -3273,6 +3256,7 @@ describe('preflight for moves and deletes', () => {
3273
3256
  // preview learned to relocate them, which keeps every ordering and
3274
3257
  // oracle test below about what it is about.
3275
3258
  previewAccessAfterRelocation: async (_w: string, _u: string, _from: string, to: string) => verbsFor(to),
3259
+ prospectiveHolderChanges: async () => NO_CHANGES,
3276
3260
  } as unknown as IAccessControl;
3277
3261
 
3278
3262
  const call = async (base: string, tool: string, body: Record<string, unknown>) => {
@@ -3401,10 +3385,12 @@ describe('preflight for moves and deletes', () => {
3401
3385
  writes.push(op.wsPath ?? '');
3402
3386
  });
3403
3387
  expect((await call(base, 'move_file', args)).body).toMatchObject({ moved: true });
3404
- // `Locked/refs.md` is named (left for want of write access, its links
3405
- // listed), so the read hook hears of it; the unreadable page and the
3406
- // transcript are never named, so it never hears of them.
3407
- expect(reads.sort()).toEqual([KB('Locked/refs.md'), KB('Sales/deal.md'), KB('Sales/index.md')]);
3388
+ // The move's two ends first, as read_file tells it (what moves, and
3389
+ // the folder it lands in); then `Locked/refs.md` is named (left for
3390
+ // want of write access, its links listed), so the read hook hears of
3391
+ // it; the unreadable page and the transcript are never named, so it
3392
+ // never hears of them.
3393
+ expect(reads.sort()).toEqual([KB('Locked/refs.md'), KB('Sales/2026'), KB('Sales/deal.md'), KB('Sales/deal.md'), KB('Sales/index.md')]);
3408
3394
  expect([...new Set(writes)].sort()).toEqual([KB('Sales/2026/deal.md'), KB('Sales/deal.md'), KB('Sales/index.md')]);
3409
3395
  });
3410
3396
 
@@ -3450,6 +3436,32 @@ describe('preflight for moves and deletes', () => {
3450
3436
  expect(await exists(args.src)).toBe(false);
3451
3437
  });
3452
3438
 
3439
+ it('a caller who cannot read what moves is refused as read_file refuses them, on a draft too, and nothing is looked at', async () => {
3440
+ const resolved: string[] = [];
3441
+ const base = await start('write', {
3442
+ ...rules,
3443
+ prospectiveHolderChanges: async (_w: string, from: string) => {
3444
+ resolved.push(from);
3445
+ return { lose: [{ kind: 'group', name: 'Board', verb: 'read' }], gain: [] };
3446
+ },
3447
+ } as unknown as IAccessControl);
3448
+ await fs.writeFile(KB('Secret/plan.md'), 'plan');
3449
+ // A draft is not write-gated, so only the read gate stands between a
3450
+ // caller and a move of a file they may not open — and it does: the dry
3451
+ // run, the unconfirmed move and the confirmed one are all read_file's
3452
+ // own refusal, with nobody resolved and nothing moved.
3453
+ const args = { branch: 'someone/draft', src: KB('Secret/plan.md'), dest: KB('Secret/old/plan.md') };
3454
+ const read = await call(base, 'read_file', { branch: args.branch, path: args.src });
3455
+ expect(read.status).toBe(403);
3456
+ for (const body of [{ ...args, dryRun: true }, args, { ...args, confirm: true }]) {
3457
+ const res = await call(base, 'move_file', body);
3458
+ expect(res.status).toBe(403);
3459
+ expect(res.body).toEqual(read.body);
3460
+ }
3461
+ expect(resolved).toEqual([]);
3462
+ expect(await exists(args.src)).toBe(true);
3463
+ });
3464
+
3453
3465
  it('an access-changing move shows before/after and runs only with confirm: true', async () => {
3454
3466
  const base = await seeded();
3455
3467
  const args = { src: KB('Sales/deal.md'), dest: KB('HR/deal.md') };
@@ -3648,13 +3660,18 @@ describe('preflight for moves and deletes', () => {
3648
3660
  expect(await exists(KB('Sales/moved'))).toBe(false);
3649
3661
  });
3650
3662
 
3651
- it('a denied move into a path the caller cannot read cannot be proposed, and says why', async () => {
3663
+ it('a move into a folder the caller cannot read is refused as read_file refuses the folder, before the write verdict', async () => {
3652
3664
  const base = await seeded();
3665
+ // The folder's rules are what a move preview would read back (the
3666
+ // caller's verdicts there, who else is affected), so the read refusal
3667
+ // comes first — not the write denial, which would say whether the path
3668
+ // can be proposed and name the folder's contents on a collision.
3653
3669
  const run = await call(base, 'move_file', { src: KB('Sales/deal.md'), dest: KB('Secret/deal.md'), confirm: true });
3654
3670
  expect(run.status).toBe(403);
3655
- expect(run.body).toMatchObject({ kind: 'write-denied', canPropose: false });
3671
+ expect(run.body.error).toContain(`permission to read "${KB('Secret')}"`);
3672
+ expect(run.body.kind).toBeUndefined();
3656
3673
  expect(run.body.proposal).toBeUndefined();
3657
- expect(run.body.cannotProposeReason).toContain('you cannot read this path');
3674
+ expect(await exists(KB('Sales/deal.md'))).toBe(true);
3658
3675
  });
3659
3676
 
3660
3677
  it('a draft branch is not write-gated, so the same move is allowed there', async () => {
@@ -4195,7 +4212,7 @@ describe('preflight for moves and deletes', () => {
4195
4212
  expect(d.description).toMatch(/destination must not exist/);
4196
4213
  // What refuses a move, and the dry-run/confirm protocol it shares with the
4197
4214
  // deletes, are shared rules — stated once, in the two shared places.
4198
- const rules = sharedFileRulesSection(testKbContext().layout);
4215
+ const rules = sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch);
4199
4216
  expect(rules).toContain('is a platform file and stays in its folder.');
4200
4217
  expect(rules).toContain('`dryRun: true`');
4201
4218
  expect(rules).toContain('`confirm: true`');
@@ -4223,9 +4240,10 @@ describe('preflight for moves and deletes', () => {
4223
4240
  const d = await def('delete_folder');
4224
4241
  expect(d.description).toContain('a non-empty folder wants `confirm: true`');
4225
4242
  // The protocol itself, and what a platform folder does to it, are shared.
4226
- const rules = sharedFileRulesSection(testKbContext().layout);
4243
+ const rules = sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch);
4227
4244
  expect(rules).toContain('`dryRun: true`');
4228
- expect(rules).toContain('A non-empty folder is deleted, and a move that changes your access runs, only with `confirm: true`');
4245
+ // Anyone's: a move asks when it changes who else may open or edit the file too (`holderChanges`).
4246
+ expect(rules).toContain("A non-empty folder is deleted, and a move that changes anyone's access runs, only with `confirm: true`");
4229
4247
  expect(rules).toContain('platform folder');
4230
4248
  const dry = await call(base, 'delete_folder', { path: KB('Sales/archive'), dryRun: true });
4231
4249
  const unconfirmed = await call(base, 'delete_folder', { path: KB('Sales/archive') });
@@ -4247,7 +4265,7 @@ describe('preflight for moves and deletes', () => {
4247
4265
  expect(stat.description).toContain('shared rules on what these tools never move or delete');
4248
4266
  // The proposal route applies to every tool a permission can refuse, so it
4249
4267
  // is stated once in the shared rules rather than on each of them.
4250
- expect(sharedFileRulesSection(testKbContext().layout)).toContain('`write-denied`');
4268
+ expect(sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch)).toContain('`write-denied`');
4251
4269
  for (const name of ['move_file', 'delete_file', 'delete_folder']) {
4252
4270
  expect((await def(name)).description.startsWith(GUIDE_FIRST_SENTENCE), name).toBe(true);
4253
4271
  }
@@ -4291,6 +4309,7 @@ describe('a write refused for permissions says whether and how to propose it', (
4291
4309
  canOwner: async () => true,
4292
4310
  canWriteBatchAtRef: async () => null,
4293
4311
  previewAccessAfterRelocation: async () => ({ read: true, write: true, download: true, owner: true }),
4312
+ prospectiveHolderChanges: async () => NO_CHANGES,
4294
4313
  eligibleWritersAtRef: async () => ({ roles: ['Sales Lead'], users: [{ name: 'Owner', email: 'owner@x' }] }),
4295
4314
  } as unknown as IAccessControl;
4296
4315
  return { ac, calls };
@@ -4364,7 +4383,7 @@ describe('a write refused for permissions says whether and how to propose it', (
4364
4383
  await fs.writeFile(DENIED, 'old text\n');
4365
4384
  await freeDestinationFor(tool);
4366
4385
  denyWrites();
4367
- const workflowCalls = workspacePathCalls.length;
4386
+ const versionControlCalls = workspacePathCalls.length;
4368
4387
 
4369
4388
  const { status, json } = await call(base, tool, body);
4370
4389
 
@@ -4387,12 +4406,12 @@ describe('a write refused for permissions says whether and how to propose it', (
4387
4406
  // The read verdict was asked of the repo-relative path.
4388
4407
  expect(calls).toContain('Sales/deal.md');
4389
4408
  // Nothing was created: no workspace was resolved for the DRAFT the answer
4390
- // suggests, and the context's workflow service is an empty stub, so a
4409
+ // suggests, and the context's version-control service is an empty stub, so a
4391
4410
  // create_branch or change request would have 500d. (The tools that
4392
4411
  // preflight do resolve the CALLER's own workspace on the way — to read
4393
4412
  // the on-disk spelling and refuse links — which is not a draft.)
4394
4413
  const forDraft = workspacePathCalls
4395
- .slice(workflowCalls)
4414
+ .slice(versionControlCalls)
4396
4415
  .filter((b) => b.includes(draft) || b.includes(encodeURIComponent(draft)));
4397
4416
  expect(forDraft).toEqual([]);
4398
4417
  });
@@ -4503,8 +4522,8 @@ describe('a write refused for permissions says whether and how to propose it', (
4503
4522
  // stated in the handshake instructions and in the managed guide, and in no
4504
4523
  // description. The refusal ITSELF still spells the steps out — that is what
4505
4524
  // the tests above this one assert.
4506
- const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'refused-for-permissions')!;
4507
- expect(sharedFileRulesSection(testKbContext().layout)).toContain(rule.body);
4525
+ const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'refused-for-permissions')!;
4526
+ expect(sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch)).toContain(rule.body);
4508
4527
  for (const def of tools) {
4509
4528
  expect(def.description ?? '', def.name).not.toContain('If this is refused for permissions');
4510
4529
  expect(def.description ?? '', def.name).not.toContain(rule.body);
@@ -5134,7 +5153,7 @@ describe('a move preview judges the destination as it will be', () => {
5134
5153
  ensureRemotesFetched: async () => undefined,
5135
5154
  } as unknown as WorkspaceService,
5136
5155
  KB_DIR,
5137
- new NodeFs(),
5156
+ realDisk(),
5138
5157
  );
5139
5158
  return {
5140
5159
  canRead: (w: string, u: string, r: string) => fresh().canRead(w, u, r),
@@ -5146,6 +5165,7 @@ describe('a move preview judges the destination as it will be', () => {
5146
5165
  previewAccessAfterRelocation: (
5147
5166
  w: string, u: string, from: string, to: string, opts?: { sourceRemains?: boolean },
5148
5167
  ) => fresh().previewAccessAfterRelocation(w, u, from, to, opts),
5168
+ prospectiveHolderChanges: (w: string, from: string, to: string) => fresh().prospectiveHolderChanges(w, from, to),
5149
5169
  } as unknown as IAccessControl;
5150
5170
  };
5151
5171
 
@@ -5189,6 +5209,8 @@ describe('a move preview judges the destination as it will be', () => {
5189
5209
  expect(dry.body).toMatchObject({ kind: 'folder', accessChanges: false, allowed: true, moved: false });
5190
5210
  expect(dry.body.access.after).toEqual(dry.body.access.before);
5191
5211
  expect(dry.body.access.after.owner).toBe(true);
5212
+ // A rename carries its own rules along: nobody else gains or loses either.
5213
+ expect(dry.body.holderChanges).toBeUndefined();
5192
5214
  // Nothing moved and nothing was written to answer the question.
5193
5215
  expect(await fs.exists(args.dest)).toBe(false);
5194
5216
  expect(await fs.exists(KB('Sales/access.md'))).toBe(true);
@@ -5213,6 +5235,91 @@ describe('a move preview judges the destination as it will be', () => {
5213
5235
  expect(await verbsAt(base, args.dest)).toEqual(dry.body.access.after);
5214
5236
  });
5215
5237
 
5238
+ it('a move that changes only who ELSE may edit it names them, and asks before it moves', async () => {
5239
+ const base = await seeded();
5240
+ // `Ops/` gives the caller what `Sales/` gives, and Ops Lead write as well.
5241
+ await fs.writeFile(
5242
+ KB('Ops/access.md'),
5243
+ rules(`write:\n - Mover <${MOVER}>\n - Ops Lead <ops@x.io>\nowner:\n - Mover <${MOVER}>\n`),
5244
+ );
5245
+ const args = { src: KB('Sales/deal.md'), dest: KB('Ops/deal.md') };
5246
+
5247
+ const dry = await call(base, 'move_file', { ...args, dryRun: true });
5248
+ expect(dry.body).toMatchObject({ accessChanges: false, allowed: true });
5249
+ // Everyone may read on both sides, so the only change is who may edit.
5250
+ expect(dry.body.holderChanges).toEqual({
5251
+ lose: [],
5252
+ gain: [{ kind: 'person', name: 'ops@x.io', email: 'ops@x.io', verb: 'write' }],
5253
+ });
5254
+
5255
+ const unconfirmed = await call(base, 'move_file', args);
5256
+ expect(unconfirmed.body).toMatchObject({ confirmationRequired: true, moved: false });
5257
+ expect(unconfirmed.body.message).toContain('`holderChanges`');
5258
+ expect(await fs.exists(args.src)).toBe(true);
5259
+ expect((await call(base, 'move_file', { ...args, confirm: true })).body).toMatchObject({ moved: true });
5260
+ });
5261
+
5262
+ it('a source the read hook refuses is refused as read_file refuses it: no preview, not even that the move would ask', async () => {
5263
+ const base = await seeded();
5264
+ await fs.writeFile(
5265
+ KB('Ops/access.md'),
5266
+ rules(`write:\n - Mover <${MOVER}>\n - Ops Lead <ops@x.io>\nowner:\n - Mover <${MOVER}>\n`),
5267
+ );
5268
+ const args = { src: KB('Sales/deal.md'), dest: KB('Ops/deal.md'), rewriteLinks: false };
5269
+ // The rules let the caller read it; a deployment's read hook does not. The
5270
+ // hook's refusal is the whole answer: a "this move asks for confirm" would
5271
+ // already say what the comparison found behind the hook.
5272
+ hooks.onAgentRead(async (op) => {
5273
+ if (op.wsPath === args.src) throw new Error('not for agents');
5274
+ });
5275
+ const read = await call(base, 'read_file', { path: args.src });
5276
+ expect(read.status).toBeGreaterThanOrEqual(400);
5277
+ for (const body of [{ ...args, dryRun: true }, args, { ...args, confirm: true }]) {
5278
+ const res = await call(base, 'move_file', body);
5279
+ expect(res.status).toBe(read.status);
5280
+ expect(res.body).toEqual(read.body);
5281
+ expect(JSON.stringify(res.body)).not.toContain('ops@x.io');
5282
+ }
5283
+ expect(await fs.exists(args.src)).toBe(true);
5284
+ });
5285
+
5286
+ it('a caller who reads what moves but not the folder it lands in is refused, on a draft too, and told nothing of the folder', async () => {
5287
+ const base = await seeded();
5288
+ // `Closed/` is somebody else's: its rules are what a move preview would
5289
+ // read back (who it lets in, whom it denies). On a draft no write gate
5290
+ // stands, so the read gate is what refuses — before anything is looked at.
5291
+ await fs.writeFile(
5292
+ KB('Closed/access.md'),
5293
+ rules('read:\n - Other <other@x.io>\n - deny everyone\nwrite:\n - Other <other@x.io>\n'),
5294
+ );
5295
+ await fs.writeFile(KB('Closed/deal.md'), 'taken');
5296
+ const args = { branch: 'someone/draft', src: KB('Sales/deal.md'), dest: KB('Closed/deal.md'), rewriteLinks: false };
5297
+
5298
+ for (const body of [{ ...args, dryRun: true }, args, { ...args, confirm: true }]) {
5299
+ const res = await call(base, 'move_file', body);
5300
+ expect(res.status).toBe(403);
5301
+ expect(res.body.error).toContain(`permission to read "${KB('Closed')}"`);
5302
+ // Neither the folder's rules nor what sits in it: the name clash at
5303
+ // `Closed/deal.md` is never reached.
5304
+ const text = JSON.stringify(res.body);
5305
+ expect(text).not.toContain('other@x.io');
5306
+ expect(text).not.toContain('already exists');
5307
+ }
5308
+ expect(await fs.exists(args.src)).toBe(true);
5309
+ expect(await fs.readFile(KB('Closed/deal.md'), { encoding: 'utf8' })).toBe('taken');
5310
+ });
5311
+
5312
+ it('a move out of a folder names everyone it leaves behind', async () => {
5313
+ const base = await seeded();
5314
+ const args = { src: KB('Work/Notes'), dest: KB('Legal/Notes') };
5315
+ const dry = await call(base, 'move_file', { ...args, dryRun: true });
5316
+ // Everyone may still read it in Legal/: the caller loses editing, not opening.
5317
+ expect(dry.body.holderChanges).toEqual({
5318
+ lose: [{ kind: 'person', name: MOVER, email: MOVER, verb: 'write' }],
5319
+ gain: [],
5320
+ });
5321
+ });
5322
+
5216
5323
  it('what the folder inherited is left behind; what its own access.md gives comes along', async () => {
5217
5324
  const base = await seeded();
5218
5325
  const args = { src: KB('Work/Team'), dest: KB('Legal/Team') };
@@ -2,7 +2,7 @@
2
2
  * Agent access gate — the per-call seam every gated agent tool runs through.
3
3
  *
4
4
  * It decides nothing of its own. It calls the hooks a DEPLOYMENT registered
5
- * (`WorkflowHooks`): one before an agent read of a knowledge-base path, one
5
+ * (`VersionControlHooks`): one before an agent read of a knowledge-base path, one
6
6
  * before an agent write. A hook that throws refuses the operation and the
7
7
  * caller sees that hook's own message and status. With no hook registered —
8
8
  * every core-only deployment — nothing is refused and nothing is recorded, and
@@ -21,7 +21,7 @@
21
21
 
22
22
  import type { JsonSchema } from '../tool-registry/index.js';
23
23
  import type { ToolContext } from '../tool-helpers/index.js';
24
- import type { WorkflowHooks } from '../workflow/index.js';
24
+ import type { VersionControlHooks } from '../version-control/index.js';
25
25
 
26
26
  /**
27
27
  * What the `sessionId` input says on its own, before any deployment note. The
@@ -32,7 +32,7 @@ import type { WorkflowHooks } from '../workflow/index.js';
32
32
  * takes, so a run's reads and its questions share one conversation.
33
33
  */
34
34
  export const SESSION_ID_DESCRIPTION =
35
- "This conversation's id, so the server can tell one run's calls apart. External agents (direct MCP calls and `call_tool_chain` alike): call the `start_session` tool ONCE at the very start of your work to obtain it, then pass that id here — the same id `ask` takes. The in-process agent runtime supplies this automatically (do not set it yourself).";
35
+ "This conversation's id: call `start_session` once, at the start of your work, and pass its id here, inside `call_tool_chain` too (and to `ask`, where the deployment offers it). The in-process agent runtime sets it itself.";
36
36
 
37
37
  /**
38
38
  * The `sessionId` input every gated tool declares. The description a MOUNTED
@@ -97,11 +97,11 @@ export interface AgentAccessGate {
97
97
  /** Lowercased email of the recovery/merge bot, which never reaches the hooks. */
98
98
  recoveryBotEmail: string;
99
99
  /**
100
- * The workflow lifecycle-hook registry holding the BLOCKING `agentRead` and
100
+ * The version-control lifecycle-hook registry holding the BLOCKING `agentRead` and
101
101
  * `preWrite` hooks. Core registers none; a deployment registers against
102
- * `workflowService.hooks` — pass that same instance here.
102
+ * `versionControlService.hooks` — pass that same instance here.
103
103
  */
104
- hooks: WorkflowHooks;
104
+ hooks: VersionControlHooks;
105
105
  /** The notes a deployment adds to what agents read about these tools. */
106
106
  notes: ToolDescriptionNotes;
107
107
  }
@@ -12,7 +12,7 @@ const GIT_GUARDED_QUERY_KEYS = ['path', 'toDir'] as const;
12
12
  const GIT_GUARDED_BODY_KEYS = ['path', 'oldPath', 'newPath', 'destination', 'paths', 'ancestor'] as const;
13
13
  /**
14
14
  * `from` names a PATH on the prospective-access route (`?from=<file>&toDir=…`)
15
- * and a BRANCH on the workflow comparison (`?from=<branch>`), so it is judged
15
+ * and a BRANCH on the version-control comparison (`?from=<branch>`), so it is judged
16
16
  * only where it is a path — a branch called after the git folder is refused
17
17
  * by the branch-name rule, not by this one.
18
18
  */
@@ -49,7 +49,7 @@ export function gitGuardedInputs(req: express.Request): string[] {
49
49
  * request must not make the server do.
50
50
  *
51
51
  * Mounted at the app, ahead of every router under that prefix — the file
52
- * routes, the review routes, the workflow and access ones, and whatever an
52
+ * routes, the review routes, the version-control and access ones, and whatever an
53
53
  * extension mounts — so a router added later is covered by the fact of its
54
54
  * prefix rather than by remembering this. The services underneath refuse
55
55
  * again on their own; this is what keeps the refusal ahead of the gates.
@@ -76,7 +76,7 @@ const READY_MARKER = 'hexis-repository-ready';
76
76
  /** Where a converted clone's stash and other local refs are kept, per workspace (see `importLocalRefs`). */
77
77
  export const CONVERTED_REFS = 'refs/kb-converted';
78
78
 
79
- /** Fallback committer identity; every workflow commit overrides it with `--author`. */
79
+ /** Fallback committer identity; every version-control commit overrides it with `--author`. */
80
80
  const BOT_NAME = 'Bevel Workflow';
81
81
  const BOT_EMAIL = 'bevel-workflow@bevel.software';
82
82
 
@@ -5,7 +5,7 @@ import fs from 'node:fs/promises';
5
5
  import os from 'node:os';
6
6
  import path from 'node:path';
7
7
  import { KbRemoteUnreachableError } from '../kb-startup-runner.js';
8
- import { NodeGitRunner } from '../../../workflow/git/node-git-runner.js';
8
+ import { NodeGitRunner } from '../../../version-control/git/node-git-runner.js';
9
9
  import { GitRunError, NO_GIT_CREDENTIALS, type IGitRunner } from '../../../../shared/git.contract.js';
10
10
  import type { OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
11
11
  import { newKbStartupRunner } from '../../../../__tests__/workspace-service.js';
@@ -6,7 +6,7 @@ import { promisify } from 'node:util';
6
6
  import fs from 'node:fs/promises';
7
7
  import os from 'node:os';
8
8
  import path from 'node:path';
9
- import { NodeGitRunner } from '../../../workflow/git/node-git-runner.js';
9
+ import { NodeGitRunner } from '../../../version-control/git/node-git-runner.js';
10
10
  import { ClassifiedFailure, classifyGitFailure, failureOf } from '../../../../shared/git-failure.js';
11
11
  import { GitRunError, gitCredentials } from '../../../../shared/git.contract.js';
12
12
  import type { OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
@@ -5,7 +5,7 @@ import fs from 'node:fs/promises';
5
5
  import os from 'node:os';
6
6
  import path from 'node:path';
7
7
  import { workingCopyShape } from '../../kb-repository.js';
8
- import { NodeGitRunner } from '../../../workflow/git/node-git-runner.js';
8
+ import { NodeGitRunner } from '../../../version-control/git/node-git-runner.js';
9
9
  import { gitCredentials, type IGitRunner } from '../../../../shared/git.contract.js';
10
10
  import type { OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
11
11
  import { newKbStartupRunner } from '../../../../__tests__/workspace-service.js';