@bevel-software/platform-core-backend 0.31.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (984) hide show
  1. package/agent-guide/access-control.md +5 -0
  2. package/agent-guide/html-views.md +46 -10
  3. package/dist/core/create-core-server.d.ts.map +1 -1
  4. package/dist/core/create-core-server.js +29 -4
  5. package/dist/core/create-core-server.js.map +1 -1
  6. package/dist/core/create-core-services.d.ts +14 -2
  7. package/dist/core/create-core-services.d.ts.map +1 -1
  8. package/dist/core/create-core-services.js +34 -7
  9. package/dist/core/create-core-services.js.map +1 -1
  10. package/dist/core/lifecycle.d.ts +8 -0
  11. package/dist/core/lifecycle.d.ts.map +1 -1
  12. package/dist/core/lifecycle.js +4 -0
  13. package/dist/core/lifecycle.js.map +1 -1
  14. package/dist/core/public-config.d.ts +10 -0
  15. package/dist/core/public-config.d.ts.map +1 -1
  16. package/dist/core/public-config.js +10 -0
  17. package/dist/core/public-config.js.map +1 -1
  18. package/dist/index.d.ts +1 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/modules/access/access-control.service.d.ts +3 -3
  23. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  24. package/dist/modules/access/access-control.service.js +4 -5
  25. package/dist/modules/access/access-control.service.js.map +1 -1
  26. package/dist/modules/access/access-declarations.d.ts +1 -1
  27. package/dist/modules/access/access-declarations.d.ts.map +1 -1
  28. package/dist/modules/access/access-declarations.js +1 -1
  29. package/dist/modules/access/access-declarations.js.map +1 -1
  30. package/dist/modules/access/access-mutation.service.d.ts +8 -3
  31. package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
  32. package/dist/modules/access/access-mutation.service.js +3 -3
  33. package/dist/modules/access/access-mutation.service.js.map +1 -1
  34. package/dist/modules/access/access-requests.contract.d.ts +1 -1
  35. package/dist/modules/access/access-requests.contract.d.ts.map +1 -1
  36. package/dist/modules/access/access-requests.routes.d.ts +3 -3
  37. package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
  38. package/dist/modules/access/access-requests.routes.js +7 -7
  39. package/dist/modules/access/access-requests.routes.js.map +1 -1
  40. package/dist/modules/access/access-requests.service.d.ts +21 -20
  41. package/dist/modules/access/access-requests.service.d.ts.map +1 -1
  42. package/dist/modules/access/access-requests.service.js +22 -68
  43. package/dist/modules/access/access-requests.service.js.map +1 -1
  44. package/dist/modules/access/access-view.d.ts +1 -1
  45. package/dist/modules/access/access-view.d.ts.map +1 -1
  46. package/dist/modules/access/access-view.js +1 -1
  47. package/dist/modules/access/access-view.js.map +1 -1
  48. package/dist/modules/access/access.routes.d.ts +5 -7
  49. package/dist/modules/access/access.routes.d.ts.map +1 -1
  50. package/dist/modules/access/access.routes.js +4 -4
  51. package/dist/modules/access/access.routes.js.map +1 -1
  52. package/dist/modules/access/admin-locked-commit.d.ts +2 -2
  53. package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
  54. package/dist/modules/access/admin-locked-commit.js +1 -1
  55. package/dist/modules/access/admin-locked-commit.js.map +1 -1
  56. package/dist/modules/access/capability-registry.js +1 -1
  57. package/dist/modules/access/capability-registry.js.map +1 -1
  58. package/dist/modules/access/change-read-gate.d.ts +2 -2
  59. package/dist/modules/access/change-read-gate.d.ts.map +1 -1
  60. package/dist/modules/access/change-read-gate.js +1 -3
  61. package/dist/modules/access/change-read-gate.js.map +1 -1
  62. package/dist/modules/access/creator-access.d.ts +2 -2
  63. package/dist/modules/access/creator-access.d.ts.map +1 -1
  64. package/dist/modules/access/creator-access.js +2 -4
  65. package/dist/modules/access/creator-access.js.map +1 -1
  66. package/dist/modules/access/directory-sync-bot.d.ts +1 -1
  67. package/dist/modules/access/directory-sync-bot.d.ts.map +1 -1
  68. package/dist/modules/access/directory-sync-bot.js +1 -1
  69. package/dist/modules/access/directory-sync-bot.js.map +1 -1
  70. package/dist/modules/access/groups-admin.routes.d.ts +2 -2
  71. package/dist/modules/access/groups-admin.routes.d.ts.map +1 -1
  72. package/dist/modules/access/groups-admin.routes.js +2 -2
  73. package/dist/modules/access/groups-admin.routes.js.map +1 -1
  74. package/dist/modules/access/groups-admin.service.d.ts +1 -1
  75. package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
  76. package/dist/modules/access/groups-admin.service.js +2 -3
  77. package/dist/modules/access/groups-admin.service.js.map +1 -1
  78. package/dist/modules/access/groups-edit.js +2 -2
  79. package/dist/modules/access/groups-edit.js.map +1 -1
  80. package/dist/modules/access/index.d.ts +17 -0
  81. package/dist/modules/access/index.d.ts.map +1 -0
  82. package/dist/modules/access/index.js +6 -0
  83. package/dist/modules/access/index.js.map +1 -0
  84. package/dist/modules/access/reference-scan.js +1 -1
  85. package/dist/modules/access/reference-scan.js.map +1 -1
  86. package/dist/modules/access/roles-admin.service.d.ts +1 -1
  87. package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
  88. package/dist/modules/access/roles-admin.service.js +2 -5
  89. package/dist/modules/access/roles-admin.service.js.map +1 -1
  90. package/dist/modules/access/roles-edit.js +1 -1
  91. package/dist/modules/access/roles-edit.js.map +1 -1
  92. package/dist/modules/access/synced-groups-committer.d.ts +2 -2
  93. package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
  94. package/dist/modules/access/synced-groups-committer.js +2 -2
  95. package/dist/modules/access/synced-groups-committer.js.map +1 -1
  96. package/dist/modules/access/synced-groups-writer.js +2 -2
  97. package/dist/modules/access/synced-groups-writer.js.map +1 -1
  98. package/dist/modules/access/user-access-removal.service.d.ts +1 -1
  99. package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
  100. package/dist/modules/access/user-access-removal.service.js +2 -5
  101. package/dist/modules/access/user-access-removal.service.js.map +1 -1
  102. package/dist/modules/access-model/index.d.ts +29 -0
  103. package/dist/modules/access-model/index.d.ts.map +1 -0
  104. package/dist/modules/access-model/index.js +26 -0
  105. package/dist/modules/access-model/index.js.map +1 -0
  106. package/dist/modules/access-model/roles-yaml-guard.d.ts +1 -1
  107. package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
  108. package/dist/modules/admin/admin-access.routes.d.ts +1 -1
  109. package/dist/modules/admin/admin-access.routes.d.ts.map +1 -1
  110. package/dist/modules/admin/admin-access.routes.js +1 -1
  111. package/dist/modules/admin/admin-access.routes.js.map +1 -1
  112. package/dist/modules/admin/admin-access.service.d.ts +2 -2
  113. package/dist/modules/admin/admin-access.service.d.ts.map +1 -1
  114. package/dist/modules/admin/index.d.ts +8 -0
  115. package/dist/modules/admin/index.d.ts.map +1 -0
  116. package/dist/modules/admin/index.js +2 -0
  117. package/dist/modules/admin/index.js.map +1 -0
  118. package/dist/modules/agent-guide/agent-guide.js +1 -1
  119. package/dist/modules/agent-guide/agent-guide.js.map +1 -1
  120. package/dist/modules/agent-guide/agent-guide.tools.d.ts +3 -3
  121. package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
  122. package/dist/modules/agent-guide/agent-guide.tools.js +2 -4
  123. package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
  124. package/dist/modules/agent-guide/index.d.ts +1 -1
  125. package/dist/modules/agent-guide/index.d.ts.map +1 -1
  126. package/dist/modules/agent-guide/index.js +1 -1
  127. package/dist/modules/agent-guide/index.js.map +1 -1
  128. package/dist/modules/agent-instructions/read-preamble.d.ts +1 -1
  129. package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
  130. package/dist/modules/audit/agent-audit.service.d.ts +2 -2
  131. package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
  132. package/dist/modules/audit/agent-audit.service.js +1 -1
  133. package/dist/modules/audit/agent-audit.service.js.map +1 -1
  134. package/dist/modules/audit/agent-connection.routes.d.ts +1 -1
  135. package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -1
  136. package/dist/modules/audit/agent-connection.routes.js +1 -1
  137. package/dist/modules/audit/agent-connection.routes.js.map +1 -1
  138. package/dist/modules/audit/agent-rest-audit.middleware.d.ts +1 -1
  139. package/dist/modules/audit/agent-rest-audit.middleware.d.ts.map +1 -1
  140. package/dist/modules/audit/agent-rest-audit.middleware.js +1 -1
  141. package/dist/modules/audit/agent-rest-audit.middleware.js.map +1 -1
  142. package/dist/modules/audit/audit.routes.d.ts +3 -3
  143. package/dist/modules/audit/audit.routes.d.ts.map +1 -1
  144. package/dist/modules/audit/audit.routes.js +2 -2
  145. package/dist/modules/audit/audit.routes.js.map +1 -1
  146. package/dist/modules/auth/account-erasure.service.d.ts +3 -3
  147. package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
  148. package/dist/modules/auth/account-erasure.service.js +1 -5
  149. package/dist/modules/auth/account-erasure.service.js.map +1 -1
  150. package/dist/modules/auth/account-hooks.d.ts +4 -6
  151. package/dist/modules/auth/account-hooks.d.ts.map +1 -1
  152. package/dist/modules/auth/account-hooks.js +7 -17
  153. package/dist/modules/auth/account-hooks.js.map +1 -1
  154. package/dist/modules/auth/account-switch-lock.d.ts +1 -1
  155. package/dist/modules/auth/account-switch-lock.d.ts.map +1 -1
  156. package/dist/modules/auth/account-switch-lock.js +1 -1
  157. package/dist/modules/auth/account-switch-lock.js.map +1 -1
  158. package/dist/modules/auth/account.routes.d.ts +2 -2
  159. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  160. package/dist/modules/auth/account.routes.js +1 -1
  161. package/dist/modules/auth/account.routes.js.map +1 -1
  162. package/dist/modules/auth/auth.service.d.ts +10 -9
  163. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  164. package/dist/modules/auth/auth.service.js +22 -21
  165. package/dist/modules/auth/auth.service.js.map +1 -1
  166. package/dist/modules/auth/index.d.ts +2 -0
  167. package/dist/modules/auth/index.d.ts.map +1 -1
  168. package/dist/modules/auth/oidc-auth-provider.js +1 -1
  169. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  170. package/dist/modules/code-mode/code-mode.tool.d.ts +1 -1
  171. package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
  172. package/dist/modules/connection-probe/connection-probe.service.d.ts +2 -2
  173. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  174. package/dist/modules/connection-probe/connection-probe.service.js +1 -4
  175. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  176. package/dist/modules/database/core-schema.d.ts +128 -235
  177. package/dist/modules/database/core-schema.d.ts.map +1 -1
  178. package/dist/modules/database/core-schema.js +55 -36
  179. package/dist/modules/database/core-schema.js.map +1 -1
  180. package/dist/modules/database/index.d.ts +10 -0
  181. package/dist/modules/database/index.d.ts.map +1 -0
  182. package/dist/modules/database/index.js +4 -0
  183. package/dist/modules/database/index.js.map +1 -0
  184. package/dist/modules/database/migrate.d.ts.map +1 -1
  185. package/dist/modules/database/migrate.js +78 -3
  186. package/dist/modules/database/migrate.js.map +1 -1
  187. package/dist/modules/declared-variables/declared-variables.routes.d.ts +2 -2
  188. package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
  189. package/dist/modules/diff/diff.routes.d.ts +3 -3
  190. package/dist/modules/diff/diff.routes.d.ts.map +1 -1
  191. package/dist/modules/diff/diff.routes.js +3 -3
  192. package/dist/modules/diff/diff.routes.js.map +1 -1
  193. package/dist/modules/diff/diff.service.d.ts +2 -2
  194. package/dist/modules/diff/diff.service.d.ts.map +1 -1
  195. package/dist/modules/diff/index.d.ts +7 -0
  196. package/dist/modules/diff/index.d.ts.map +1 -0
  197. package/dist/modules/diff/index.js +2 -0
  198. package/dist/modules/diff/index.js.map +1 -0
  199. package/dist/modules/embed/account-link.service.d.ts +1 -1
  200. package/dist/modules/embed/account-link.service.d.ts.map +1 -1
  201. package/dist/modules/embed/account-link.service.js +1 -1
  202. package/dist/modules/embed/account-link.service.js.map +1 -1
  203. package/dist/modules/embed/embed.routes.d.ts +1 -1
  204. package/dist/modules/embed/embed.routes.d.ts.map +1 -1
  205. package/dist/modules/embed/embed.routes.js +2 -2
  206. package/dist/modules/embed/embed.routes.js.map +1 -1
  207. package/dist/modules/embed/embed.service.d.ts +1 -1
  208. package/dist/modules/embed/embed.service.d.ts.map +1 -1
  209. package/dist/modules/embed/embed.tools.d.ts +4 -4
  210. package/dist/modules/embed/embed.tools.d.ts.map +1 -1
  211. package/dist/modules/embed/embed.tools.js +3 -5
  212. package/dist/modules/embed/embed.tools.js.map +1 -1
  213. package/dist/modules/github-app/github-app.connection.d.ts +1 -1
  214. package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
  215. package/dist/modules/github-app/github-app.routes.d.ts +3 -3
  216. package/dist/modules/github-app/github-app.routes.d.ts.map +1 -1
  217. package/dist/modules/github-app/github-app.routes.js +1 -1
  218. package/dist/modules/github-app/github-app.routes.js.map +1 -1
  219. package/dist/modules/kb-fs/index.d.ts +10 -0
  220. package/dist/modules/kb-fs/index.d.ts.map +1 -1
  221. package/dist/modules/kb-fs/index.js +10 -0
  222. package/dist/modules/kb-fs/index.js.map +1 -1
  223. package/dist/modules/kb-fs/locking-filesystem.d.ts +1 -1
  224. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  225. package/dist/modules/kb-sync/kb-sync.routes.d.ts +1 -1
  226. package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -1
  227. package/dist/modules/kb-sync/kb-sync.routes.js +2 -2
  228. package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -1
  229. package/dist/modules/kb-sync/kb-sync.service.js +1 -1
  230. package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
  231. package/dist/modules/kb-sync/sync-auth.js +1 -1
  232. package/dist/modules/kb-sync/sync-auth.js.map +1 -1
  233. package/dist/modules/kb-sync/sync-payload.js +1 -1
  234. package/dist/modules/kb-sync/sync-payload.js.map +1 -1
  235. package/dist/modules/marketplace/git-http.routes.d.ts +1 -1
  236. package/dist/modules/marketplace/git-http.routes.d.ts.map +1 -1
  237. package/dist/modules/marketplace/git-http.routes.js +1 -1
  238. package/dist/modules/marketplace/git-http.routes.js.map +1 -1
  239. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts +1 -1
  240. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts.map +1 -1
  241. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js +1 -1
  242. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js.map +1 -1
  243. package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts +1 -1
  244. package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts.map +1 -1
  245. package/dist/modules/marketplace/github-facade/github-facade-codes.store.js +1 -1
  246. package/dist/modules/marketplace/github-facade/github-facade-codes.store.js.map +1 -1
  247. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts +1 -1
  248. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts.map +1 -1
  249. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js +1 -1
  250. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js.map +1 -1
  251. package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts +2 -2
  252. package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts.map +1 -1
  253. package/dist/modules/marketplace/github-facade/github-facade.routes.js +2 -2
  254. package/dist/modules/marketplace/github-facade/github-facade.routes.js.map +1 -1
  255. package/dist/modules/marketplace/github-facade/github-facade.service.d.ts +2 -2
  256. package/dist/modules/marketplace/github-facade/github-facade.service.d.ts.map +1 -1
  257. package/dist/modules/marketplace/github-facade/github-facade.service.js +1 -1
  258. package/dist/modules/marketplace/github-facade/github-facade.service.js.map +1 -1
  259. package/dist/modules/marketplace/marketplace-repo.service.d.ts +1 -1
  260. package/dist/modules/marketplace/marketplace-repo.service.d.ts.map +1 -1
  261. package/dist/modules/marketplace/marketplace-repo.service.js +1 -1
  262. package/dist/modules/mcp/index.d.ts +8 -0
  263. package/dist/modules/mcp/index.d.ts.map +1 -0
  264. package/dist/modules/mcp/index.js +7 -0
  265. package/dist/modules/mcp/index.js.map +1 -0
  266. package/dist/modules/mcp/mcp-auth.middleware.d.ts +4 -5
  267. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
  268. package/dist/modules/mcp/mcp-auth.middleware.js +4 -4
  269. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
  270. package/dist/modules/mcp/mcp.routes.d.ts +2 -4
  271. package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
  272. package/dist/modules/mcp/mcp.routes.js +2 -2
  273. package/dist/modules/mcp/mcp.routes.js.map +1 -1
  274. package/dist/modules/mcp/mcp.service.d.ts +14 -4
  275. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  276. package/dist/modules/mcp/mcp.service.js +17 -7
  277. package/dist/modules/mcp/mcp.service.js.map +1 -1
  278. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +29 -1
  279. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
  280. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +167 -40
  281. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
  282. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +1 -1
  283. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
  284. package/dist/modules/mcp/oauth/oauth-consent.routes.js +1 -1
  285. package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
  286. package/dist/modules/onboarding/onboarding.routes.d.ts +1 -1
  287. package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -1
  288. package/dist/modules/onboarding/onboarding.routes.js +1 -1
  289. package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
  290. package/dist/modules/onboarding/starter-pack.service.d.ts +4 -5
  291. package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
  292. package/dist/modules/onboarding/starter-pack.service.js +2 -2
  293. package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
  294. package/dist/modules/plugins/compile/compile-marketplace.d.ts +1 -1
  295. package/dist/modules/plugins/compile/compile-marketplace.d.ts.map +1 -1
  296. package/dist/modules/plugins/compile/compile-marketplace.js +1 -1
  297. package/dist/modules/plugins/compile/compile-marketplace.js.map +1 -1
  298. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +3 -3
  299. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
  300. package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts +1 -1
  301. package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts.map +1 -1
  302. package/dist/modules/plugins/discovery/bundle-dialect/registry.js +1 -1
  303. package/dist/modules/plugins/discovery/bundle-dialect/registry.js.map +1 -1
  304. package/dist/modules/plugins/index.d.ts +1 -0
  305. package/dist/modules/plugins/index.d.ts.map +1 -1
  306. package/dist/modules/plugins/index.js +2 -0
  307. package/dist/modules/plugins/index.js.map +1 -1
  308. package/dist/modules/plugins/join-proposals.d.ts +2 -2
  309. package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
  310. package/dist/modules/plugins/join-proposals.js +1 -1
  311. package/dist/modules/plugins/join-proposals.js.map +1 -1
  312. package/dist/modules/plugins/join-request-jobs.service.d.ts +1 -1
  313. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  314. package/dist/modules/plugins/join-request-jobs.service.js +2 -2
  315. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  316. package/dist/modules/plugins/join-request-records.store.d.ts +1 -1
  317. package/dist/modules/plugins/join-request-records.store.d.ts.map +1 -1
  318. package/dist/modules/plugins/join-request-records.store.js +1 -1
  319. package/dist/modules/plugins/join-request-records.store.js.map +1 -1
  320. package/dist/modules/plugins/join-requests.service.d.ts +3 -3
  321. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  322. package/dist/modules/plugins/join-requests.service.js +1 -1
  323. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  324. package/dist/modules/plugins/plugin-links.d.ts +3 -3
  325. package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
  326. package/dist/modules/plugins/plugin-links.js +1 -1
  327. package/dist/modules/plugins/plugin-links.js.map +1 -1
  328. package/dist/modules/plugins/plugin-links.service.d.ts +8 -5
  329. package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
  330. package/dist/modules/plugins/plugin-links.service.js +8 -6
  331. package/dist/modules/plugins/plugin-links.service.js.map +1 -1
  332. package/dist/modules/plugins/plugin-provision.service.d.ts +2 -2
  333. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  334. package/dist/modules/plugins/plugin-provision.service.js +2 -3
  335. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  336. package/dist/modules/plugins/plugin-rename.service.d.ts +2 -2
  337. package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
  338. package/dist/modules/plugins/plugin-rename.service.js +1 -1
  339. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  340. package/dist/modules/plugins/plugins.contract.d.ts +1 -1
  341. package/dist/modules/plugins/plugins.contract.d.ts.map +1 -1
  342. package/dist/modules/plugins/plugins.routes.d.ts +2 -2
  343. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  344. package/dist/modules/plugins/plugins.routes.js +3 -3
  345. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  346. package/dist/modules/plugins/plugins.service.d.ts +4 -4
  347. package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
  348. package/dist/modules/plugins/plugins.service.js +1 -1
  349. package/dist/modules/plugins/plugins.service.js.map +1 -1
  350. package/dist/modules/plugins/plugins.tools.d.ts +1 -1
  351. package/dist/modules/plugins/plugins.tools.d.ts.map +1 -1
  352. package/dist/modules/plugins/plugins.tools.js +3 -3
  353. package/dist/modules/plugins/plugins.tools.js.map +1 -1
  354. package/dist/modules/plugins/teams.routes.d.ts +3 -3
  355. package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
  356. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +1 -1
  357. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
  358. package/dist/modules/secrets-vault/db-secrets-vault.service.js +1 -1
  359. package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
  360. package/dist/modules/secrets-vault/index.d.ts +1 -0
  361. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  362. package/dist/modules/secrets-vault/index.js +2 -0
  363. package/dist/modules/secrets-vault/index.js.map +1 -1
  364. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +4 -4
  365. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  366. package/dist/modules/secrets-vault/secrets-vault.routes.js +1 -1
  367. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  368. package/dist/modules/settings/connection-check.js +1 -1
  369. package/dist/modules/settings/connection-check.js.map +1 -1
  370. package/dist/modules/settings/deployment-settings.service.d.ts +7 -1
  371. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  372. package/dist/modules/settings/deployment-settings.service.js +45 -3
  373. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  374. package/dist/modules/settings/git-root-folders.js +1 -1
  375. package/dist/modules/settings/git-root-folders.js.map +1 -1
  376. package/dist/modules/settings/index.d.ts +13 -0
  377. package/dist/modules/settings/index.d.ts.map +1 -0
  378. package/dist/modules/settings/index.js +3 -0
  379. package/dist/modules/settings/index.js.map +1 -0
  380. package/dist/modules/settings/setup.routes.d.ts +3 -3
  381. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  382. package/dist/modules/settings/setup.routes.js +2 -2
  383. package/dist/modules/settings/setup.routes.js.map +1 -1
  384. package/dist/modules/skills/allowed-tools-check.d.ts +2 -2
  385. package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
  386. package/dist/modules/skills/allowed-tools-check.js +1 -1
  387. package/dist/modules/skills/allowed-tools-check.js.map +1 -1
  388. package/dist/modules/skills/index.d.ts +1 -0
  389. package/dist/modules/skills/index.d.ts.map +1 -1
  390. package/dist/modules/skills/pending-skills.service.d.ts +3 -3
  391. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  392. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  393. package/dist/modules/skills/skill-access-requests.routes.d.ts +5 -5
  394. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  395. package/dist/modules/skills/skill-access-requests.routes.js +6 -13
  396. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  397. package/dist/modules/skills/skills.routes.d.ts +1 -1
  398. package/dist/modules/skills/skills.routes.d.ts.map +1 -1
  399. package/dist/modules/skills/skills.routes.js +1 -1
  400. package/dist/modules/skills/skills.routes.js.map +1 -1
  401. package/dist/modules/skills/skills.service.d.ts +2 -2
  402. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  403. package/dist/modules/skills/skills.tools.d.ts +3 -3
  404. package/dist/modules/skills/skills.tools.d.ts.map +1 -1
  405. package/dist/modules/skills/skills.tools.js +3 -7
  406. package/dist/modules/skills/skills.tools.js.map +1 -1
  407. package/dist/modules/tool-auth/connection-key-rejection.js +1 -1
  408. package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
  409. package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts +2 -2
  410. package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts.map +1 -1
  411. package/dist/modules/tool-auth/connection-keys-admin.routes.js +1 -1
  412. package/dist/modules/tool-auth/connection-keys-admin.routes.js.map +1 -1
  413. package/dist/modules/tool-auth/external-api-key.service.d.ts +1 -1
  414. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
  415. package/dist/modules/tool-auth/external-api-key.service.js +1 -1
  416. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
  417. package/dist/modules/tool-auth/index.d.ts +15 -0
  418. package/dist/modules/tool-auth/index.d.ts.map +1 -0
  419. package/dist/modules/tool-auth/index.js +11 -0
  420. package/dist/modules/tool-auth/index.js.map +1 -0
  421. package/dist/modules/tool-auth/tool-auth.middleware.d.ts +2 -2
  422. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
  423. package/dist/modules/tool-auth/tool-auth.middleware.js +1 -1
  424. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
  425. package/dist/modules/tool-helpers/default-branch-write.d.ts +1 -1
  426. package/dist/modules/tool-helpers/default-branch-write.d.ts.map +1 -1
  427. package/dist/modules/tool-helpers/index.d.ts +4 -1
  428. package/dist/modules/tool-helpers/index.d.ts.map +1 -1
  429. package/dist/modules/tool-helpers/index.js +3 -0
  430. package/dist/modules/tool-helpers/index.js.map +1 -1
  431. package/dist/modules/tool-helpers/route-argument-check.js +1 -1
  432. package/dist/modules/tool-helpers/route-argument-check.js.map +1 -1
  433. package/dist/modules/tool-helpers/route-tool-schemas.d.ts +1 -1
  434. package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -1
  435. package/dist/modules/tool-helpers/tool-context.d.ts +5 -6
  436. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
  437. package/dist/modules/tool-helpers/tool-context.js +2 -3
  438. package/dist/modules/tool-helpers/tool-context.js.map +1 -1
  439. package/dist/modules/tool-helpers/tool-def.d.ts +4 -2
  440. package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
  441. package/dist/modules/tool-helpers/tool-def.js +3 -1
  442. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  443. package/dist/modules/tool-helpers/tool-handler.d.ts +2 -2
  444. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
  445. package/dist/modules/tool-helpers/tool-handler.js +2 -2
  446. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  447. package/dist/modules/tool-helpers/tool.contract.d.ts +2 -2
  448. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  449. package/dist/modules/tool-helpers/validate-token.d.ts +1 -2
  450. package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -1
  451. package/dist/modules/tool-helpers/validate-token.js +1 -1
  452. package/dist/modules/tool-helpers/validate-token.js.map +1 -1
  453. package/dist/modules/tool-manuals/index.d.ts +5 -0
  454. package/dist/modules/tool-manuals/index.d.ts.map +1 -1
  455. package/dist/modules/tool-manuals/index.js +4 -0
  456. package/dist/modules/tool-manuals/index.js.map +1 -1
  457. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +2 -2
  458. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
  459. package/dist/modules/tool-manuals/pending-tools.service.d.ts +2 -2
  460. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  461. package/dist/modules/tool-manuals/tool-delete.service.d.ts +5 -6
  462. package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
  463. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  464. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +5 -5
  465. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
  466. package/dist/modules/tool-manuals/tool-manuals.routes.js +2 -2
  467. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
  468. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +3 -3
  469. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  470. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -3
  471. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  472. package/dist/modules/tool-manuals/tool-manuals.tools.js +1 -2
  473. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  474. package/dist/modules/tool-registry/description-length.js +2 -2
  475. package/dist/modules/tool-registry/description-length.js.map +1 -1
  476. package/dist/modules/tool-registry/index.d.ts +8 -0
  477. package/dist/modules/tool-registry/index.d.ts.map +1 -0
  478. package/dist/modules/tool-registry/index.js +8 -0
  479. package/dist/modules/tool-registry/index.js.map +1 -0
  480. package/dist/modules/tool-registry/manual.routes.d.ts +37 -2
  481. package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -1
  482. package/dist/modules/tool-registry/manual.routes.js +14 -7
  483. package/dist/modules/tool-registry/manual.routes.js.map +1 -1
  484. package/dist/modules/tool-registry/read-only-hints.contract.d.ts +52 -0
  485. package/dist/modules/tool-registry/read-only-hints.contract.d.ts.map +1 -0
  486. package/dist/modules/tool-registry/read-only-hints.contract.js +2 -0
  487. package/dist/modules/tool-registry/read-only-hints.contract.js.map +1 -0
  488. package/dist/modules/tool-registry/read-only-hints.d.ts +89 -0
  489. package/dist/modules/tool-registry/read-only-hints.d.ts.map +1 -0
  490. package/dist/modules/tool-registry/read-only-hints.js +212 -0
  491. package/dist/modules/tool-registry/read-only-hints.js.map +1 -0
  492. package/dist/modules/tool-registry/tool.contract.d.ts +8 -0
  493. package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -1
  494. package/dist/modules/tool-registry/tool.contract.js +10 -1
  495. package/dist/modules/tool-registry/tool.contract.js.map +1 -1
  496. package/dist/modules/update-check/update-check.routes.d.ts +2 -2
  497. package/dist/modules/update-check/update-check.routes.d.ts.map +1 -1
  498. package/dist/modules/update-check/update-check.routes.js +1 -1
  499. package/dist/modules/update-check/update-check.routes.js.map +1 -1
  500. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts +9 -104
  501. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +1 -1
  502. package/dist/modules/workflow/agent-tools/change-request-read-shape.js +8 -118
  503. package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +1 -1
  504. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +16 -17
  505. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -1
  506. package/dist/modules/workflow/agent-tools/change-request-read.tools.js +19 -86
  507. package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -1
  508. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +15 -2
  509. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
  510. package/dist/modules/workflow/agent-tools/change-request-summary.js +12 -1
  511. package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -1
  512. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +7 -5
  513. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  514. package/dist/modules/workflow/agent-tools/workflow.tools.js +51 -68
  515. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  516. package/dist/modules/workflow/change-request-hooks.d.ts +78 -0
  517. package/dist/modules/workflow/change-request-hooks.d.ts.map +1 -0
  518. package/dist/modules/workflow/change-request-hooks.js +15 -0
  519. package/dist/modules/workflow/change-request-hooks.js.map +1 -0
  520. package/dist/modules/workflow/event-bus.d.ts.map +1 -1
  521. package/dist/modules/workflow/event-bus.js +3 -1
  522. package/dist/modules/workflow/event-bus.js.map +1 -1
  523. package/dist/modules/workflow/events-delivery.d.ts +120 -0
  524. package/dist/modules/workflow/events-delivery.d.ts.map +1 -0
  525. package/dist/modules/workflow/events-delivery.js +202 -0
  526. package/dist/modules/workflow/events-delivery.js.map +1 -0
  527. package/dist/modules/workflow/events.routes.d.ts +16 -7
  528. package/dist/modules/workflow/events.routes.d.ts.map +1 -1
  529. package/dist/modules/workflow/events.routes.js +23 -4
  530. package/dist/modules/workflow/events.routes.js.map +1 -1
  531. package/dist/modules/workflow/file-lock.service.d.ts +1 -1
  532. package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
  533. package/dist/modules/workflow/file-lock.service.js +1 -1
  534. package/dist/modules/workflow/file-lock.service.js.map +1 -1
  535. package/dist/modules/workflow/git/git.service.d.ts +2 -2
  536. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  537. package/dist/modules/workflow/git/git.service.js +3 -6
  538. package/dist/modules/workflow/git/git.service.js.map +1 -1
  539. package/dist/modules/workflow/git/node-git-runner.js +1 -1
  540. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  541. package/dist/modules/workflow/git/pull-request.service.d.ts +16 -7
  542. package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
  543. package/dist/modules/workflow/git/pull-request.service.js +49 -33
  544. package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
  545. package/dist/modules/workflow/index.d.ts +14 -2
  546. package/dist/modules/workflow/index.d.ts.map +1 -1
  547. package/dist/modules/workflow/index.js +11 -2
  548. package/dist/modules/workflow/index.js.map +1 -1
  549. package/dist/modules/workflow/pending-commits.service.d.ts +1 -1
  550. package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
  551. package/dist/modules/workflow/pending-commits.service.js +1 -1
  552. package/dist/modules/workflow/pending-commits.service.js.map +1 -1
  553. package/dist/modules/workflow/read-on-branch.d.ts +1 -1
  554. package/dist/modules/workflow/read-on-branch.d.ts.map +1 -1
  555. package/dist/modules/workflow/recovery-bot.d.ts +1 -1
  556. package/dist/modules/workflow/recovery-bot.d.ts.map +1 -1
  557. package/dist/modules/workflow/recovery-bot.js +1 -1
  558. package/dist/modules/workflow/recovery-bot.js.map +1 -1
  559. package/dist/modules/workflow/review-workflow/approval-lock.d.ts +1 -1
  560. package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +1 -1
  561. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts +4 -20
  562. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +1 -1
  563. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +4 -8
  564. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  565. package/dist/modules/workflow/review-workflow/review-workflow.service.js +3 -138
  566. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  567. package/dist/modules/workflow/workflow.routes.d.ts +5 -5
  568. package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
  569. package/dist/modules/workflow/workflow.routes.js +42 -94
  570. package/dist/modules/workflow/workflow.routes.js.map +1 -1
  571. package/dist/modules/workflow/workflow.service.d.ts +112 -62
  572. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  573. package/dist/modules/workflow/workflow.service.js +367 -172
  574. package/dist/modules/workflow/workflow.service.js.map +1 -1
  575. package/dist/modules/workspace/agent-access.gate.d.ts +3 -3
  576. package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
  577. package/dist/modules/workspace/agent-download.builder.d.ts +1 -1
  578. package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -1
  579. package/dist/modules/workspace/agent-download.builder.js +1 -1
  580. package/dist/modules/workspace/agent-download.builder.js.map +1 -1
  581. package/dist/modules/workspace/agent-upload.routes.d.ts.map +1 -1
  582. package/dist/modules/workspace/agent-upload.routes.js +19 -0
  583. package/dist/modules/workspace/agent-upload.routes.js.map +1 -1
  584. package/dist/modules/workspace/agent-upload.store.d.ts +11 -0
  585. package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
  586. package/dist/modules/workspace/agent-upload.store.js +18 -0
  587. package/dist/modules/workspace/agent-upload.store.js.map +1 -1
  588. package/dist/modules/workspace/bounded-matcher.d.ts +5 -11
  589. package/dist/modules/workspace/bounded-matcher.d.ts.map +1 -1
  590. package/dist/modules/workspace/bounded-matcher.js +26 -87
  591. package/dist/modules/workspace/bounded-matcher.js.map +1 -1
  592. package/dist/modules/workspace/file-readers/doc-extract.service.d.ts +54 -10
  593. package/dist/modules/workspace/file-readers/doc-extract.service.d.ts.map +1 -1
  594. package/dist/modules/workspace/file-readers/doc-extract.service.js +69 -17
  595. package/dist/modules/workspace/file-readers/doc-extract.service.js.map +1 -1
  596. package/dist/modules/workspace/file-readers/doc-extract.types.d.ts +9 -2
  597. package/dist/modules/workspace/file-readers/doc-extract.types.d.ts.map +1 -1
  598. package/dist/modules/workspace/file-readers/doc-extract.types.js.map +1 -1
  599. package/dist/modules/workspace/file-readers/document-extractor.contract.d.ts +41 -0
  600. package/dist/modules/workspace/file-readers/document-extractor.contract.d.ts.map +1 -0
  601. package/dist/modules/workspace/file-readers/document-extractor.contract.js +5 -0
  602. package/dist/modules/workspace/file-readers/document-extractor.contract.js.map +1 -0
  603. package/dist/modules/workspace/file-readers/document-extractors.d.ts +9 -0
  604. package/dist/modules/workspace/file-readers/document-extractors.d.ts.map +1 -0
  605. package/dist/modules/workspace/file-readers/document-extractors.js +26 -0
  606. package/dist/modules/workspace/file-readers/document-extractors.js.map +1 -0
  607. package/dist/modules/workspace/file-readers/document-formats.d.ts +12 -0
  608. package/dist/modules/workspace/file-readers/document-formats.d.ts.map +1 -0
  609. package/dist/modules/workspace/file-readers/document-formats.js +11 -0
  610. package/dist/modules/workspace/file-readers/document-formats.js.map +1 -0
  611. package/dist/modules/workspace/file-readers/document-reader.d.ts +21 -17
  612. package/dist/modules/workspace/file-readers/document-reader.d.ts.map +1 -1
  613. package/dist/modules/workspace/file-readers/document-reader.js +38 -34
  614. package/dist/modules/workspace/file-readers/document-reader.js.map +1 -1
  615. package/dist/modules/workspace/file-readers/extract-in-worker.d.ts +60 -0
  616. package/dist/modules/workspace/file-readers/extract-in-worker.d.ts.map +1 -0
  617. package/dist/modules/workspace/file-readers/extract-in-worker.js +140 -0
  618. package/dist/modules/workspace/file-readers/extract-in-worker.js.map +1 -0
  619. package/dist/modules/workspace/file-readers/extract-pdf.d.ts +2 -0
  620. package/dist/modules/workspace/file-readers/extract-pdf.d.ts.map +1 -1
  621. package/dist/modules/workspace/file-readers/extract-pdf.js +20 -3
  622. package/dist/modules/workspace/file-readers/extract-pdf.js.map +1 -1
  623. package/dist/modules/workspace/file-readers/extract.worker.d.ts +2 -0
  624. package/dist/modules/workspace/file-readers/extract.worker.d.ts.map +1 -0
  625. package/dist/modules/workspace/file-readers/extract.worker.js +5 -0
  626. package/dist/modules/workspace/file-readers/extract.worker.js.map +1 -0
  627. package/dist/modules/workspace/file-readers/extraction-cache.d.ts +21 -5
  628. package/dist/modules/workspace/file-readers/extraction-cache.d.ts.map +1 -1
  629. package/dist/modules/workspace/file-readers/extraction-cache.js +24 -10
  630. package/dist/modules/workspace/file-readers/extraction-cache.js.map +1 -1
  631. package/dist/modules/workspace/file-readers/extraction-worker.d.ts +42 -0
  632. package/dist/modules/workspace/file-readers/extraction-worker.d.ts.map +1 -0
  633. package/dist/modules/workspace/file-readers/extraction-worker.js +69 -0
  634. package/dist/modules/workspace/file-readers/extraction-worker.js.map +1 -0
  635. package/dist/modules/workspace/file-readers/file-reader.d.ts +13 -4
  636. package/dist/modules/workspace/file-readers/file-reader.d.ts.map +1 -1
  637. package/dist/modules/workspace/file-readers/file-reader.js.map +1 -1
  638. package/dist/modules/workspace/file-readers/file-reader.registry.d.ts +3 -2
  639. package/dist/modules/workspace/file-readers/file-reader.registry.d.ts.map +1 -1
  640. package/dist/modules/workspace/file-readers/file-reader.registry.js +6 -20
  641. package/dist/modules/workspace/file-readers/file-reader.registry.js.map +1 -1
  642. package/dist/modules/workspace/first-run.js +1 -1
  643. package/dist/modules/workspace/first-run.js.map +1 -1
  644. package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
  645. package/dist/modules/workspace/git-internals.middleware.d.ts.map +1 -1
  646. package/dist/modules/workspace/git-internals.middleware.js +1 -1
  647. package/dist/modules/workspace/git-internals.middleware.js.map +1 -1
  648. package/dist/modules/workspace/index.d.ts +16 -0
  649. package/dist/modules/workspace/index.d.ts.map +1 -1
  650. package/dist/modules/workspace/index.js +13 -0
  651. package/dist/modules/workspace/index.js.map +1 -1
  652. package/dist/modules/workspace/kb-repository.d.ts.map +1 -1
  653. package/dist/modules/workspace/kb-repository.js +1 -1
  654. package/dist/modules/workspace/kb-repository.js.map +1 -1
  655. package/dist/modules/workspace/not-found.d.ts +1 -1
  656. package/dist/modules/workspace/not-found.d.ts.map +1 -1
  657. package/dist/modules/workspace/not-found.js +1 -1
  658. package/dist/modules/workspace/not-found.js.map +1 -1
  659. package/dist/modules/workspace/pattern-matcher.contract.d.ts +1 -1
  660. package/dist/modules/workspace/pattern-matcher.contract.d.ts.map +1 -1
  661. package/dist/modules/workspace/pattern-matcher.contract.js +1 -1
  662. package/dist/modules/workspace/pattern-matcher.contract.js.map +1 -1
  663. package/dist/modules/workspace/routine-write-policy.js +1 -1
  664. package/dist/modules/workspace/routine-write-policy.js.map +1 -1
  665. package/dist/modules/workspace/startup/kb-git.js +1 -1
  666. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  667. package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
  668. package/dist/modules/workspace/startup/kb-startup-runner.js +1 -2
  669. package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
  670. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +2 -2
  671. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
  672. package/dist/modules/workspace/startup/steps/personal-spaces.step.js +2 -2
  673. package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
  674. package/dist/modules/workspace/startup/steps/plugin-layout.js +1 -1
  675. package/dist/modules/workspace/startup/steps/plugin-layout.js.map +1 -1
  676. package/dist/modules/workspace/startup/steps/roles-yaml.step.js +1 -1
  677. package/dist/modules/workspace/startup/steps/roles-yaml.step.js.map +1 -1
  678. package/dist/modules/workspace/startup/steps/seed-tree.js +2 -2
  679. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  680. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +1 -1
  681. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  682. package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
  683. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  684. package/dist/modules/workspace/startup/steps/template-source.js +2 -2
  685. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  686. package/dist/modules/workspace/worker-pool.d.ts +100 -0
  687. package/dist/modules/workspace/worker-pool.d.ts.map +1 -0
  688. package/dist/modules/workspace/worker-pool.js +156 -0
  689. package/dist/modules/workspace/worker-pool.js.map +1 -0
  690. package/dist/modules/workspace/workspace.routes.d.ts +7 -8
  691. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  692. package/dist/modules/workspace/workspace.routes.js +4 -6
  693. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  694. package/dist/modules/workspace/workspace.service.d.ts +1 -1
  695. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  696. package/dist/modules/workspace/workspace.service.js +3 -6
  697. package/dist/modules/workspace/workspace.service.js.map +1 -1
  698. package/dist/modules/workspace/workspace.tools.d.ts +7 -7
  699. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  700. package/dist/modules/workspace/workspace.tools.js +45 -27
  701. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  702. package/dist/modules/workspace/write-denial.d.ts +4 -4
  703. package/dist/modules/workspace/write-denial.d.ts.map +1 -1
  704. package/dist/modules/workspace/write-denial.js +2 -3
  705. package/dist/modules/workspace/write-denial.js.map +1 -1
  706. package/dist/modules/write-access/index.d.ts +8 -0
  707. package/dist/modules/write-access/index.d.ts.map +1 -0
  708. package/dist/modules/write-access/index.js +7 -0
  709. package/dist/modules/write-access/index.js.map +1 -0
  710. package/dist/shared/listener-seam.d.ts +34 -0
  711. package/dist/shared/listener-seam.d.ts.map +1 -0
  712. package/dist/shared/listener-seam.js +42 -0
  713. package/dist/shared/listener-seam.js.map +1 -0
  714. package/migrations/0019_oauth_token_rotated_at.sql +7 -0
  715. package/migrations/0020_change_request_body_is_the_description.sql +20 -0
  716. package/migrations/0021_data_migrations_ledger.sql +11 -0
  717. package/migrations/meta/0019_snapshot.json +2435 -0
  718. package/migrations/meta/0020_snapshot.json +2321 -0
  719. package/migrations/meta/0021_snapshot.json +2353 -0
  720. package/migrations/meta/_journal.json +21 -0
  721. package/package.json +3 -3
  722. package/src/core/__tests__/damaged-document.tools.test.ts +374 -0
  723. package/src/core/__tests__/public-config.test.ts +5 -0
  724. package/src/core/create-core-server.ts +32 -3
  725. package/src/core/create-core-services.ts +49 -5
  726. package/src/core/lifecycle.ts +10 -0
  727. package/src/core/public-config.ts +10 -0
  728. package/src/index.ts +7 -0
  729. package/src/modules/access/__tests__/access-requests.routes.test.ts +29 -15
  730. package/src/modules/access/access-control.service.ts +5 -6
  731. package/src/modules/access/access-declarations.ts +1 -1
  732. package/src/modules/access/access-mutation.service.ts +10 -4
  733. package/src/modules/access/access-requests.contract.ts +1 -1
  734. package/src/modules/access/access-requests.routes.ts +10 -15
  735. package/src/modules/access/access-requests.service.ts +29 -71
  736. package/src/modules/access/access-view.ts +1 -1
  737. package/src/modules/access/access.routes.ts +9 -11
  738. package/src/modules/access/admin-locked-commit.ts +3 -2
  739. package/src/modules/access/capability-registry.ts +1 -1
  740. package/src/modules/access/change-read-gate.ts +3 -5
  741. package/src/modules/access/creator-access.ts +3 -5
  742. package/src/modules/access/directory-sync-bot.ts +2 -2
  743. package/src/modules/access/groups-admin.routes.ts +3 -3
  744. package/src/modules/access/groups-admin.service.ts +3 -4
  745. package/src/modules/access/groups-edit.ts +2 -2
  746. package/src/modules/access/index.ts +17 -0
  747. package/src/modules/access/reference-scan.ts +1 -1
  748. package/src/modules/access/roles-admin.service.ts +3 -6
  749. package/src/modules/access/roles-edit.ts +1 -1
  750. package/src/modules/access/synced-groups-committer.ts +4 -4
  751. package/src/modules/access/synced-groups-writer.ts +2 -2
  752. package/src/modules/access/user-access-removal.service.ts +3 -6
  753. package/src/modules/access-model/index.ts +29 -0
  754. package/src/modules/access-model/roles-yaml-guard.ts +1 -1
  755. package/src/modules/admin/admin-access.routes.ts +1 -1
  756. package/src/modules/admin/admin-access.service.ts +2 -2
  757. package/src/modules/admin/index.ts +7 -0
  758. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +5 -0
  759. package/src/modules/agent-guide/agent-guide.tools.ts +4 -6
  760. package/src/modules/agent-guide/agent-guide.ts +1 -1
  761. package/src/modules/agent-guide/index.ts +1 -1
  762. package/src/modules/agent-instructions/read-preamble.ts +1 -1
  763. package/src/modules/audit/agent-audit.service.ts +3 -3
  764. package/src/modules/audit/agent-connection.routes.ts +1 -1
  765. package/src/modules/audit/agent-rest-audit.middleware.ts +1 -1
  766. package/src/modules/audit/audit.routes.ts +4 -4
  767. package/src/modules/auth/__tests__/account-deactivation.test.ts +38 -2
  768. package/src/modules/auth/account-erasure.service.ts +4 -9
  769. package/src/modules/auth/account-hooks.ts +13 -21
  770. package/src/modules/auth/account-switch-lock.ts +2 -2
  771. package/src/modules/auth/account.routes.ts +3 -3
  772. package/src/modules/auth/auth.service.ts +23 -22
  773. package/src/modules/auth/index.ts +3 -0
  774. package/src/modules/auth/oidc-auth-provider.ts +1 -1
  775. package/src/modules/code-mode/code-mode.tool.ts +1 -1
  776. package/src/modules/connection-probe/connection-probe.service.ts +3 -6
  777. package/src/modules/database/__tests__/legacy-change-request-body.test.ts +118 -0
  778. package/src/modules/database/__tests__/legacy-request-bodies.pg.test.ts +258 -0
  779. package/src/modules/database/__tests__/pii-backfill.pg.test.ts +15 -18
  780. package/src/modules/database/core-schema.ts +59 -37
  781. package/src/modules/database/index.ts +9 -0
  782. package/src/modules/database/migrate.ts +79 -3
  783. package/src/modules/declared-variables/declared-variables.routes.ts +2 -2
  784. package/src/modules/diff/diff.routes.ts +5 -5
  785. package/src/modules/diff/diff.service.ts +2 -2
  786. package/src/modules/diff/index.ts +6 -0
  787. package/src/modules/embed/account-link.service.ts +2 -2
  788. package/src/modules/embed/embed.routes.ts +2 -2
  789. package/src/modules/embed/embed.service.ts +1 -1
  790. package/src/modules/embed/embed.tools.ts +6 -9
  791. package/src/modules/github-app/github-app.connection.ts +1 -1
  792. package/src/modules/github-app/github-app.routes.ts +3 -3
  793. package/src/modules/kb-fs/index.ts +11 -0
  794. package/src/modules/kb-fs/locking-filesystem.ts +1 -1
  795. package/src/modules/kb-sync/kb-sync.routes.ts +3 -3
  796. package/src/modules/kb-sync/kb-sync.service.ts +1 -1
  797. package/src/modules/kb-sync/sync-auth.ts +1 -1
  798. package/src/modules/kb-sync/sync-payload.ts +1 -1
  799. package/src/modules/marketplace/git-http.routes.ts +1 -1
  800. package/src/modules/marketplace/github-facade/github-facade-admin.routes.ts +1 -1
  801. package/src/modules/marketplace/github-facade/github-facade-codes.store.ts +2 -2
  802. package/src/modules/marketplace/github-facade/github-facade-credentials.service.ts +2 -2
  803. package/src/modules/marketplace/github-facade/github-facade.routes.ts +2 -2
  804. package/src/modules/marketplace/github-facade/github-facade.service.ts +2 -2
  805. package/src/modules/marketplace/marketplace-repo.service.ts +2 -2
  806. package/src/modules/mcp/__tests__/bevel-oauth-provider.pg.test.ts +279 -0
  807. package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +190 -15
  808. package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +213 -0
  809. package/src/modules/mcp/index.ts +7 -0
  810. package/src/modules/mcp/mcp-auth.middleware.ts +6 -7
  811. package/src/modules/mcp/mcp.routes.ts +3 -5
  812. package/src/modules/mcp/mcp.service.ts +30 -13
  813. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +216 -50
  814. package/src/modules/mcp/oauth/oauth-consent.routes.ts +1 -1
  815. package/src/modules/onboarding/onboarding.routes.ts +1 -1
  816. package/src/modules/onboarding/starter-pack.service.ts +5 -6
  817. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +2 -1
  818. package/src/modules/plugins/__tests__/plugin-links.service.test.ts +2 -1
  819. package/src/modules/plugins/compile/compile-marketplace.ts +2 -2
  820. package/src/modules/plugins/compile/marketplace-compiler.service.ts +3 -3
  821. package/src/modules/plugins/discovery/bundle-dialect/registry.ts +1 -1
  822. package/src/modules/plugins/index.ts +2 -0
  823. package/src/modules/plugins/join-proposals.ts +2 -2
  824. package/src/modules/plugins/join-request-jobs.service.ts +3 -3
  825. package/src/modules/plugins/join-request-records.store.ts +2 -2
  826. package/src/modules/plugins/join-requests.service.ts +4 -4
  827. package/src/modules/plugins/plugin-links.service.ts +10 -11
  828. package/src/modules/plugins/plugin-links.ts +4 -4
  829. package/src/modules/plugins/plugin-provision.service.ts +4 -5
  830. package/src/modules/plugins/plugin-rename.service.ts +3 -3
  831. package/src/modules/plugins/plugins.contract.ts +1 -1
  832. package/src/modules/plugins/plugins.routes.ts +4 -4
  833. package/src/modules/plugins/plugins.service.ts +5 -5
  834. package/src/modules/plugins/plugins.tools.ts +4 -4
  835. package/src/modules/plugins/teams.routes.ts +3 -3
  836. package/src/modules/secrets-vault/db-secrets-vault.service.ts +2 -2
  837. package/src/modules/secrets-vault/index.ts +2 -0
  838. package/src/modules/secrets-vault/secrets-vault.routes.ts +4 -4
  839. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +88 -1
  840. package/src/modules/settings/connection-check.ts +1 -1
  841. package/src/modules/settings/deployment-settings.service.ts +44 -4
  842. package/src/modules/settings/git-root-folders.ts +1 -1
  843. package/src/modules/settings/index.ts +12 -0
  844. package/src/modules/settings/setup.routes.ts +5 -4
  845. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +2 -2
  846. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +6 -3
  847. package/src/modules/skills/allowed-tools-check.ts +2 -6
  848. package/src/modules/skills/index.ts +2 -0
  849. package/src/modules/skills/pending-skills.service.ts +3 -4
  850. package/src/modules/skills/skill-access-requests.routes.ts +10 -17
  851. package/src/modules/skills/skills.routes.ts +1 -1
  852. package/src/modules/skills/skills.service.ts +2 -2
  853. package/src/modules/skills/skills.tools.ts +5 -9
  854. package/src/modules/tool-auth/connection-key-rejection.ts +1 -1
  855. package/src/modules/tool-auth/connection-keys-admin.routes.ts +2 -2
  856. package/src/modules/tool-auth/external-api-key.service.ts +2 -2
  857. package/src/modules/tool-auth/index.ts +14 -0
  858. package/src/modules/tool-auth/tool-auth.middleware.ts +3 -3
  859. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +2 -2
  860. package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +2 -2
  861. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +2 -2
  862. package/src/modules/tool-helpers/default-branch-write.ts +1 -1
  863. package/src/modules/tool-helpers/index.ts +5 -1
  864. package/src/modules/tool-helpers/route-argument-check.ts +1 -1
  865. package/src/modules/tool-helpers/route-tool-schemas.ts +1 -1
  866. package/src/modules/tool-helpers/tool-context.ts +8 -10
  867. package/src/modules/tool-helpers/tool-def.ts +7 -3
  868. package/src/modules/tool-helpers/tool-handler.ts +2 -2
  869. package/src/modules/tool-helpers/tool.contract.ts +2 -2
  870. package/src/modules/tool-helpers/validate-token.ts +2 -3
  871. package/src/modules/tool-manuals/index.ts +6 -0
  872. package/src/modules/tool-manuals/mcp-server-edit.service.ts +2 -2
  873. package/src/modules/tool-manuals/pending-tools.service.ts +2 -2
  874. package/src/modules/tool-manuals/tool-delete.service.ts +5 -6
  875. package/src/modules/tool-manuals/tool-manuals.routes.ts +5 -5
  876. package/src/modules/tool-manuals/tool-manuals.service.ts +3 -3
  877. package/src/modules/tool-manuals/tool-manuals.tools.ts +4 -6
  878. package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +439 -0
  879. package/src/modules/tool-registry/__tests__/tool-registry.test.ts +9 -2
  880. package/src/modules/tool-registry/description-length.ts +2 -2
  881. package/src/modules/tool-registry/index.ts +22 -0
  882. package/src/modules/tool-registry/manual.routes.ts +14 -8
  883. package/src/modules/tool-registry/read-only-hints.contract.ts +54 -0
  884. package/src/modules/tool-registry/read-only-hints.ts +225 -0
  885. package/src/modules/tool-registry/tool.contract.ts +11 -0
  886. package/src/modules/update-check/update-check.routes.ts +2 -2
  887. package/src/modules/workflow/__tests__/change-request-hooks.test.ts +62 -0
  888. package/src/modules/workflow/__tests__/event-bus.test.ts +14 -2
  889. package/src/modules/workflow/__tests__/events-delivery.test.ts +778 -0
  890. package/src/modules/workflow/__tests__/workflow.routes.open-change-request.test.ts +79 -0
  891. package/src/modules/workflow/__tests__/workflow.service.delete-branch.test.ts +9 -1
  892. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +342 -22
  893. package/src/modules/workflow/__tests__/workflow.service.update-change-request.pg.test.ts +120 -0
  894. package/src/modules/workflow/__tests__/workflow.service.update-change-request.test.ts +346 -0
  895. package/src/modules/workflow/agent-tools/__tests__/change-request-read-shape.test.ts +32 -209
  896. package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +16 -245
  897. package/src/modules/workflow/agent-tools/__tests__/update-change-request.parity.test.ts +306 -0
  898. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +43 -57
  899. package/src/modules/workflow/agent-tools/change-request-read-shape.ts +18 -153
  900. package/src/modules/workflow/agent-tools/change-request-read.tools.ts +24 -96
  901. package/src/modules/workflow/agent-tools/change-request-summary.ts +26 -3
  902. package/src/modules/workflow/agent-tools/workflow.tools.ts +55 -75
  903. package/src/modules/workflow/change-request-hooks.ts +96 -0
  904. package/src/modules/workflow/event-bus.ts +3 -1
  905. package/src/modules/workflow/events-delivery.ts +278 -0
  906. package/src/modules/workflow/events.routes.ts +30 -9
  907. package/src/modules/workflow/file-lock.service.ts +2 -2
  908. package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +24 -9
  909. package/src/modules/workflow/git/git.service.ts +5 -8
  910. package/src/modules/workflow/git/node-git-runner.ts +1 -1
  911. package/src/modules/workflow/git/pull-request.service.ts +44 -29
  912. package/src/modules/workflow/index.ts +15 -2
  913. package/src/modules/workflow/pending-commits.service.ts +2 -2
  914. package/src/modules/workflow/read-on-branch.ts +1 -1
  915. package/src/modules/workflow/recovery-bot.ts +2 -2
  916. package/src/modules/workflow/review-workflow/approval-lock.ts +1 -1
  917. package/src/modules/workflow/review-workflow/review-workflow.interface.ts +3 -35
  918. package/src/modules/workflow/review-workflow/review-workflow.service.ts +6 -165
  919. package/src/modules/workflow/workflow.routes.ts +46 -100
  920. package/src/modules/workflow/workflow.service.ts +444 -215
  921. package/src/modules/workspace/__tests__/agent-downloads.test.ts +2 -1
  922. package/src/modules/workspace/__tests__/agent-uploads.test.ts +87 -1
  923. package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +2 -1
  924. package/src/modules/workspace/__tests__/file-stat-access.test.ts +2 -1
  925. package/src/modules/workspace/__tests__/git-internals.security.test.ts +2 -1
  926. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +2 -1
  927. package/src/modules/workspace/__tests__/worker-pool.test.ts +118 -0
  928. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
  929. package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +30 -0
  930. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +2 -1
  931. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +2 -1
  932. package/src/modules/workspace/__tests__/workspace.tools.test.ts +30 -4
  933. package/src/modules/workspace/agent-access.gate.ts +3 -3
  934. package/src/modules/workspace/agent-download.builder.ts +1 -1
  935. package/src/modules/workspace/agent-upload.routes.ts +19 -0
  936. package/src/modules/workspace/agent-upload.store.ts +18 -0
  937. package/src/modules/workspace/bounded-matcher.ts +32 -89
  938. package/src/modules/workspace/file-readers/README.md +9 -0
  939. package/src/modules/workspace/file-readers/__tests__/doc-extract.service.test.ts +165 -0
  940. package/src/modules/workspace/file-readers/__tests__/doc-extract.test.ts +21 -16
  941. package/src/modules/workspace/file-readers/__tests__/extract-in-worker.test.ts +229 -0
  942. package/src/modules/workspace/file-readers/__tests__/file-reader.registry.test.ts +2 -1
  943. package/src/modules/workspace/file-readers/__tests__/fixtures/damaged-pdf.ts +34 -0
  944. package/src/modules/workspace/file-readers/__tests__/fixtures/misbehaving-extract.worker.ts +57 -0
  945. package/src/modules/workspace/file-readers/__tests__/fixtures/pdf-in-trouble.worker.ts +20 -0
  946. package/src/modules/workspace/file-readers/__tests__/fixtures/unloadable-extract.worker.ts +2 -0
  947. package/src/modules/workspace/file-readers/doc-extract.service.ts +95 -20
  948. package/src/modules/workspace/file-readers/doc-extract.types.ts +13 -3
  949. package/src/modules/workspace/file-readers/document-extractor.contract.ts +42 -0
  950. package/src/modules/workspace/file-readers/document-extractors.ts +28 -0
  951. package/src/modules/workspace/file-readers/document-formats.ts +13 -0
  952. package/src/modules/workspace/file-readers/document-reader.ts +40 -36
  953. package/src/modules/workspace/file-readers/extract-in-worker.ts +183 -0
  954. package/src/modules/workspace/file-readers/extract-pdf.ts +23 -4
  955. package/src/modules/workspace/file-readers/extract.worker.ts +5 -0
  956. package/src/modules/workspace/file-readers/extraction-cache.ts +33 -12
  957. package/src/modules/workspace/file-readers/extraction-worker.ts +86 -0
  958. package/src/modules/workspace/file-readers/file-reader.registry.ts +6 -20
  959. package/src/modules/workspace/file-readers/file-reader.ts +14 -4
  960. package/src/modules/workspace/first-run.ts +1 -1
  961. package/src/modules/workspace/git-internals.middleware.ts +1 -1
  962. package/src/modules/workspace/index.ts +17 -0
  963. package/src/modules/workspace/kb-repository.ts +3 -2
  964. package/src/modules/workspace/not-found.ts +1 -1
  965. package/src/modules/workspace/pattern-matcher.contract.ts +1 -1
  966. package/src/modules/workspace/routine-write-policy.ts +1 -1
  967. package/src/modules/workspace/startup/kb-git.ts +1 -1
  968. package/src/modules/workspace/startup/kb-startup-runner.ts +1 -2
  969. package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +3 -3
  970. package/src/modules/workspace/startup/steps/personal-spaces.step.ts +2 -2
  971. package/src/modules/workspace/startup/steps/plugin-layout.ts +1 -1
  972. package/src/modules/workspace/startup/steps/roles-yaml.step.ts +1 -1
  973. package/src/modules/workspace/startup/steps/seed-tree.ts +2 -2
  974. package/src/modules/workspace/startup/steps/template-files.step.ts +2 -2
  975. package/src/modules/workspace/startup/steps/template-source.ts +2 -2
  976. package/src/modules/workspace/worker-pool.ts +193 -0
  977. package/src/modules/workspace/workspace.routes.ts +9 -12
  978. package/src/modules/workspace/workspace.service.ts +4 -7
  979. package/src/modules/workspace/workspace.tools.ts +53 -34
  980. package/src/modules/workspace/write-denial.ts +4 -5
  981. package/src/modules/write-access/index.ts +7 -0
  982. package/src/shared/__tests__/module-boundaries.lint.test.ts +301 -0
  983. package/src/shared/listener-seam.ts +52 -0
  984. package/src/modules/workflow/__tests__/format-affected-owners.test.ts +0 -85
@@ -18,6 +18,8 @@
18
18
  */
19
19
 
20
20
  import path from 'node:path';
21
+ import { execFile } from 'node:child_process';
22
+ import { promisify } from 'node:util';
21
23
  import { logger } from '../../shared/logging.js';
22
24
 
23
25
  // One logger per tag this file has always written under, so a line's prefix
@@ -31,8 +33,6 @@ const mergeLog = logger('merge');
31
33
  /** Who the leftover cleanup deletes as. Its deletions skip the authorship check, and the log names them `system`. */
32
34
  const SYSTEM_ACTOR: AuthUser = { id: 'system', email: 'system', name: 'system' };
33
35
  import { promises as fs } from 'node:fs';
34
- import { execFile } from 'node:child_process';
35
- import { promisify } from 'node:util';
36
36
  import type {
37
37
  AcquireLockResult,
38
38
  AuthUser,
@@ -44,7 +44,6 @@ import type {
44
44
  ChangeInput,
45
45
  ChangeRequest,
46
46
  ChangeRequestApplyFailureKind,
47
- ChangeRequestComment,
48
47
  ChangeRequestDetail,
49
48
  ChangeRequestUpdateResult,
50
49
  ChangeRequestState,
@@ -60,37 +59,42 @@ import type {
60
59
  MergeChangeRequestOutcome,
61
60
  MergeResolution,
62
61
  OpenChangeRequestInput,
63
- PostChangeRequestCommentInput,
64
62
  RemoteSyncPullResult,
65
63
  UpdateBranchOutcome,
64
+ UpdateChangeRequestFields,
66
65
  } from '@bevel-software/platform-shared';
67
66
  import {
68
67
  isFolderPlaceholder,
69
68
  folderPlaceholderPath,
70
69
  isPlatformRestoreShape,
70
+ CHANGE_REQUEST_DESCRIPTION_MAX,
71
+ CHANGE_REQUEST_TITLE_MAX,
71
72
  } from '@bevel-software/platform-shared';
72
73
  import type { KbContext } from '../../shared/kb-context.js';
73
74
  import { readableAtCommits, ReadOnBranchDeniedError } from './read-on-branch.js';
74
75
  import { and, desc, eq, inArray, isNotNull, isNull, lt, ne, or, sql } from 'drizzle-orm';
75
- import type { Database } from '../database/connection.js';
76
- import { changeRequests } from '../database/schema.js';
77
- import { pgErrorCode } from '../database/pg-error.js';
76
+ import type { Database } from '../database/index.js';
77
+ import { changeRequests, pgErrorCode } from '../database/index.js';
78
78
  import type { GitService } from './git/git.service.js';
79
79
  import { redactSecret } from '../../shared/redact-secret.js';
80
80
  import type { PullRequestService } from './git/pull-request.service.js';
81
81
  import type { IReviewWorkflowService } from './review-workflow/review-workflow.interface.js';
82
- import type { WorkspaceService } from '../workspace/workspace.service.js';
82
+ import type { WorkspaceService } from '../workspace/index.js';
83
83
  import { workspaceIdForBranch, branchForWorkspaceId } from '../../shared/workspace-id.js';
84
- import type { IAccessControl } from '../access/access-control.interface.js';
85
- import { FileLockService } from './file-lock.service.js';
84
+ import type { IAccessControl } from '../access/index.js';
85
+ import type { FileLockService } from './file-lock.service.js';
86
86
  import { canonicalFileIdentity } from '../../shared/canonical-file-identity.js';
87
- import { PendingCommitsService } from './pending-commits.service.js';
87
+ import type { PendingCommitsService } from './pending-commits.service.js';
88
88
  import type { WorkflowEventBus } from './event-bus.js';
89
89
  import { describeSyncFailure, sanitizeError } from './sanitize-error.js';
90
- import type { FileChangeNotifier } from '../kb-fs/file-change-notifier.js';
90
+ import type { FileChangeNotifier } from '../kb-fs/index.js';
91
91
  import { WorkflowHooks } from './workflow-hooks.js';
92
- import { WorkspaceMutex } from '../kb-fs/mutex.js';
93
- import { assertValidBranchName } from '../kb-fs/branch-name.js';
92
+ import {
93
+ ChangeRequestHooks,
94
+ type ChangeRequestPerson,
95
+ type IChangeRequestHooks,
96
+ } from './change-request-hooks.js';
97
+ import { WorkspaceMutex, assertValidBranchName } from '../kb-fs/index.js';
94
98
  import { canonicalEmail, hashEmail } from '../../shared/email-identity.js';
95
99
  import {
96
100
  BranchAuthorshipError,
@@ -108,8 +112,7 @@ import {
108
112
  WorkflowValidationError,
109
113
  } from '../../shared/domain-errors.js';
110
114
  import { RECOVERY_BOT_EMAIL, RECOVERY_BOT_NAME } from './recovery-bot.js';
111
- import { AccessDeniedError } from '../access-model/access-errors.js';
112
- import type { IChangeReadGate } from '../access-model/change-gate.js';
115
+ import { AccessDeniedError, EVERYONE_CANONICAL, type IChangeReadGate } from '../access-model/index.js';
113
116
  import { printable } from '../../shared/printable.js';
114
117
 
115
118
  const execFileAsync = promisify(execFile);
@@ -181,72 +184,51 @@ function redactTokens(msg: string, token: string | null | undefined): string {
181
184
  }
182
185
 
183
186
  /**
184
- * Cap on how many changed paths the `## Affected owners` CR-body block lists
185
- * individually. The block is passed to `gh pr create --body`, an argv string,
186
- * so an uncapped per-path list on a large changeset (hundreds/thousands of
187
- * files) makes the whole command exceed the OS arg limit and fail with E2BIG.
187
+ * Only an open request's title and description may change: an applied one is
188
+ * history, and a closed one is no longer asking anything. A worded 409 either
189
+ * way, so the refusal says which.
188
190
  */
189
- export const MAX_AFFECTED_PATHS_LISTED = 50;
190
-
191
- type EligibleWriters = Map<
192
- string,
193
- { roles: string[]; users: { name: string; email: string }[] }
194
- >;
195
-
196
- const formatWriter = (u: { name: string; email: string }): string =>
197
- u.name ? `${u.name} <${u.email}>` : u.email;
198
-
199
191
  /**
200
- * Render the `## Affected owners` block for the CR body: eligible approvers per
201
- * changed path, but only the first `maxListed` paths are listed individually;
202
- * the overflow is collapsed into a single deduped summary of every eligible
203
- * approver across the change. This keeps the body bounded regardless of how
204
- * many files the change touches (see {@link MAX_AFFECTED_PATHS_LISTED}).
205
- * Returns '' when no path has resolvable eligibility. The empty-folder
206
- * placeholder is never listed or counted: it is not content, and no one
207
- * reviews it.
192
+ * A description — on opening, a replacement, or what an append leaves — is
193
+ * at most {@link CHANGE_REQUEST_DESCRIPTION_MAX} characters; a worded 400
194
+ * past it. Undefined (no description given) always fits.
208
195
  */
209
- export function formatAffectedOwnersBlock(
210
- paths: string[],
211
- resolved: EligibleWriters,
212
- maxListed: number = MAX_AFFECTED_PATHS_LISTED,
213
- ): string {
214
- const listed: string[] = [];
215
- const allRoles = new Set<string>();
216
- const allUsers = new Map<string, string>(); // email -> display, deduped
217
- let eligible = 0;
218
- for (const p of paths) {
219
- if (isFolderPlaceholder(p)) continue;
220
- const info = resolved.get(p);
221
- if (!info) continue;
222
- const parts: string[] = [];
223
- if (info.roles.length > 0) {
224
- info.roles.forEach((r) => allRoles.add(r));
225
- parts.push(info.roles.join(', '));
226
- }
227
- if (info.users.length > 0) {
228
- info.users.forEach((u) => allUsers.set(u.email, formatWriter(u)));
229
- parts.push(info.users.map(formatWriter).join(', '));
230
- }
231
- if (parts.length === 0) continue;
232
- eligible++;
233
- if (listed.length < maxListed) listed.push(`- \`${p}\` — ${parts.join('; ')}`);
196
+ function assertDescriptionFits(description: string | undefined): void {
197
+ if (description !== undefined && description.length > CHANGE_REQUEST_DESCRIPTION_MAX) {
198
+ throw new WorkflowValidationError(
199
+ `A change request's description is at most ${CHANGE_REQUEST_DESCRIPTION_MAX} characters; this one would have ${description.length}.`,
200
+ );
234
201
  }
235
- if (eligible === 0) return '';
236
-
237
- const out = ['## Affected owners', '', ...listed];
238
- if (eligible > listed.length) {
239
- const summary = [
240
- allRoles.size > 0 ? [...allRoles].sort().join(', ') : '',
241
- allUsers.size > 0 ? [...allUsers.values()].sort().join(', ') : '',
242
- ].filter((s) => s.length > 0);
243
- out.push(
244
- '',
245
- `…and ${eligible - listed.length} more changed path(s). ` +
246
- `All eligible approvers across this change: ${summary.join('; ')}`,
202
+ }
203
+
204
+ function assertEditable(state: string): void {
205
+ if (state === 'merged') {
206
+ throw new WorkflowDomainError(
207
+ 'This change request has already been applied; its title and description can no longer be changed.',
208
+ 409,
209
+ );
210
+ }
211
+ if (state !== 'open') {
212
+ throw new WorkflowDomainError(
213
+ 'This change request is closed; its title and description can no longer be changed.',
214
+ 409,
247
215
  );
248
216
  }
249
- return out.join('\n');
217
+ }
218
+
219
+ /** What the access layer answers for the changed paths of a request, or null when it cannot. */
220
+ type EligibleWritersAtRef = Awaited<ReturnType<IAccessControl['eligibleWritersForPathsAtRef']>>;
221
+
222
+ /**
223
+ * The one question the open asks of accounts: which of these addresses have
224
+ * a live account. `AuthService.findActiveAccountsByEmail` answers it in a
225
+ * single indexed read; the shape is spelled here so the workflow module
226
+ * imports nothing of auth's. Keyed by the canonical address asked for.
227
+ */
228
+ export interface ApproverAccounts {
229
+ findActiveAccountsByEmail(
230
+ emails: readonly string[],
231
+ ): Promise<Map<string, { id: string; email: string; name: string }>>;
250
232
  }
251
233
 
252
234
  /** Git commit subjects are capped at 200 characters (`GitService.commitFile`). */
@@ -343,6 +325,19 @@ export class WorkflowService implements IWorkflowService {
343
325
  * hooks) unchanged.
344
326
  */
345
327
  public readonly hooks: WorkflowHooks = new WorkflowHooks(),
328
+ /**
329
+ * The seam a deployment's notification extends when a request is opened
330
+ * (see `change-request-hooks.ts`). The composition root passes the SAME
331
+ * instance it exposes as `changeRequestHooks`; the default registers
332
+ * nobody, so a test construction notifies nobody and says so.
333
+ */
334
+ private readonly changeRequestHooks: IChangeRequestHooks = new ChangeRequestHooks(),
335
+ /**
336
+ * Who turns the addresses the access model names into accounts, for the
337
+ * opened event's `approvers`. Absent (a harness without accounts), every
338
+ * approver counts as unresolved.
339
+ */
340
+ private readonly accounts?: ApproverAccounts,
346
341
  ) {
347
342
  // The type already requires it; this holds for a caller the compiler did
348
343
  // not see (plain JavaScript, a positional slip in a harness).
@@ -716,7 +711,6 @@ export class WorkflowService implements IWorkflowService {
716
711
  source: summary.branch,
717
712
  target: summary.base,
718
713
  authorIdHash: summary.authorId ?? null,
719
- title: summary.title,
720
714
  });
721
715
  }
722
716
  }
@@ -2270,18 +2264,23 @@ export class WorkflowService implements IWorkflowService {
2270
2264
  * account, so no hidden body marker). The DB-assigned number is the CR id.
2271
2265
  * 6. Re-fetch the full detail via the PR service so the response shape
2272
2266
  * matches every other CR endpoint.
2267
+ * 7. Tell the deployment's change-request listeners (see
2268
+ * `change-request-hooks.ts`); `notified` in the answer says which
2269
+ * channels reached the approvers. Once per request, here, whether a
2270
+ * person or an agent opened it — both take this road.
2273
2271
  */
2274
2272
  async openChangeRequest(
2275
2273
  workspaceId: string,
2276
2274
  user: AuthUser,
2277
2275
  input: OpenChangeRequestInput,
2278
- ): Promise<ChangeRequestDetail> {
2276
+ ): Promise<ChangeRequestDetail & { notified: string[] }> {
2279
2277
  if (!input.sourceBranch) throw new WorkflowValidationError('sourceBranch is required');
2280
2278
  if (!input.targetBranch) throw new WorkflowValidationError('targetBranch is required');
2281
2279
  if (input.sourceBranch === input.targetBranch) {
2282
2280
  throw new WorkflowValidationError('source and target branches must differ');
2283
2281
  }
2284
2282
  if (!input.title?.trim()) throw new WorkflowValidationError('title is required');
2283
+ assertDescriptionFits(input.description?.trim());
2285
2284
  if (this.kb.isProtectedBranch(input.sourceBranch)) {
2286
2285
  throw new WorkflowValidationError(
2287
2286
  `Cannot open a change request *from* a protected branch ("${input.sourceBranch}").`,
@@ -2300,7 +2299,19 @@ export class WorkflowService implements IWorkflowService {
2300
2299
  // its branches is retired inside the window, and holding only the source
2301
2300
  // left a `Y -> X` request open to X being deleted under it — the very
2302
2301
  // failure the widened guards exist to prevent.
2303
- return this.runOnBranchPair(input.sourceBranch, input.targetBranch, async () => {
2302
+ //
2303
+ // The deployment's listeners are told AFTER the locks are released: they
2304
+ // are awaited (the answer's `notified` is true to what happened), and a
2305
+ // slow mailer must hold up this answer alone, never a delete or a merge
2306
+ // on either branch. So the locked part answers what it made — the detail,
2307
+ // or the refusal — and the telling follows.
2308
+ const outcome = await this.runOnBranchPair(input.sourceBranch, input.targetBranch, async (): Promise<
2309
+ { number: number; eligible: EligibleWritersAtRef } & (
2310
+ | { detail: ChangeRequestDetail; pushRefused: null; detailError: null }
2311
+ | { detail: null; pushRefused: PushNeedsAgentResolutionError; detailError: null }
2312
+ | { detail: null; pushRefused: null; detailError: Error }
2313
+ )
2314
+ > => {
2304
2315
  // Uniqueness rule — A→B blocks A→B (the spec is explicit that B→A in
2305
2316
  // parallel is still allowed). `listOpenPrs` is cached for 30s so we
2306
2317
  // force-fresh to catch a CR that opened just now.
@@ -2356,27 +2367,21 @@ export class WorkflowService implements IWorkflowService {
2356
2367
  const workspacePath = await this.workspaceService.getWorkspacePath(workspaceId);
2357
2368
  const cwd = path.join(workspacePath, this.kbDirName);
2358
2369
 
2359
- // Touched paths between target and source — basis for the
2360
- // affected-owners block we append to the CR body. We compute it
2361
- // ourselves rather than waiting for GitHub to expose `pr.files`
2362
- // (which only populates after the PR exists). Three-dot range
2363
- // matches what `gh pr create` will eventually show as the diff.
2370
+ // Touched paths between target and source — the diff the request will
2371
+ // surface — and the eligible approvers per path at the target, resolved
2372
+ // once for the opened event, which hands the same people to the
2373
+ // deployment's listeners. None of it is written into the body: the request
2374
+ // is a DB row whose author is a column, whose body is the description and
2375
+ // nothing else, and whose access-request level and note are columns of
2376
+ // their own. Who must approve each file is resolved live, per file,
2377
+ // whenever the request is read.
2364
2378
  const touchedPaths = await this.listChangedPathsBetweenBranches(
2365
2379
  cwd,
2366
2380
  input.targetBranch,
2367
2381
  input.sourceBranch,
2368
2382
  );
2369
- const affectedOwnersBlock = await this.buildAffectedOwnersBlock(
2370
- workspaceId,
2371
- input.targetBranch,
2372
- touchedPaths,
2373
- );
2374
-
2375
- // The change request is a plain DB row now — no provider PR. Author is a
2376
- // real column (no hidden body marker needed, since nothing runs as a shared
2377
- // service account anymore).
2378
- const description = input.description?.trim() ?? '';
2379
- const body = [description, affectedOwnersBlock].filter((s) => s.length > 0).join('\n\n');
2383
+ const eligible = await this.eligibleWritersFor(workspaceId, input.targetBranch, touchedPaths);
2384
+ const note = input.accessRequest?.note?.trim();
2380
2385
 
2381
2386
  let prNumber: number;
2382
2387
  try {
@@ -2386,10 +2391,12 @@ export class WorkflowService implements IWorkflowService {
2386
2391
  sourceBranch: input.sourceBranch,
2387
2392
  targetBranch: input.targetBranch,
2388
2393
  title: input.title.trim(),
2389
- body,
2394
+ body: input.description?.trim() ?? '',
2390
2395
  authorEmail: canonicalEmail(user.email),
2391
2396
  authorEmailBidx: user.email,
2392
2397
  authorName: user.name,
2398
+ accessRequestLevel: input.accessRequest?.level ?? null,
2399
+ accessRequestNote: note ? note : null,
2393
2400
  })
2394
2401
  .returning({ number: changeRequests.number });
2395
2402
  prNumber = row.number;
@@ -2446,31 +2453,125 @@ export class WorkflowService implements IWorkflowService {
2446
2453
  source: input.sourceBranch,
2447
2454
  target: input.targetBranch,
2448
2455
  authorIdHash: hashEmail(user.email),
2449
- title: input.title,
2450
2456
  } as const;
2451
2457
  if (pushRefused) {
2452
2458
  // The request exists; its detail reads the published refs, which the
2453
2459
  // refused push never moved — answering the refusal is what the caller
2454
2460
  // needs, not a detail read that may fail on a branch the host lacks.
2455
2461
  this.events?.emit(opened);
2456
- throw pushRefused;
2462
+ return { number: prNumber, eligible, detail: null, pushRefused, detailError: null };
2457
2463
  }
2458
2464
 
2459
- const detail = await this.prs.getPrDetail(prNumber, {
2460
- fresh: true,
2461
- workspaceId,
2462
- viewerEmail: user.email,
2463
- });
2464
- if (!detail) {
2465
- throw new WorkflowValidationError(
2466
- `Created change request #${prNumber} but could not fetch its detail`,
2467
- );
2468
- }
2465
+ // The row exists and the push landed: every tab is told, whatever the
2466
+ // read-back below does.
2469
2467
  this.events?.emit(opened);
2470
- return detail;
2468
+ // Reading the detail back is the caller's answer, not the open: a read
2469
+ // that fails is reported, but it is not allowed to cost the reviewers
2470
+ // their message — the request stands, and a retry of the open meets the
2471
+ // duplicate check, so there is no second chance to tell them.
2472
+ let detail: ChangeRequestDetail | null = null;
2473
+ let detailError: Error | null = null;
2474
+ try {
2475
+ detail = await this.prs.getPrDetail(prNumber, {
2476
+ fresh: true,
2477
+ workspaceId,
2478
+ viewerEmail: user.email,
2479
+ });
2480
+ } catch (err) {
2481
+ detailError = err instanceof Error ? err : new Error(String(err));
2482
+ }
2483
+ if (detail) return { number: prNumber, eligible, detail, pushRefused: null, detailError: null };
2484
+ return {
2485
+ number: prNumber,
2486
+ eligible,
2487
+ detail: null,
2488
+ pushRefused: null,
2489
+ detailError:
2490
+ detailError ?? new WorkflowValidationError(`Created change request #${prNumber} but could not fetch its detail`),
2491
+ };
2492
+ });
2493
+
2494
+ // The request exists in every branch of the outcome — the listeners are
2495
+ // told all the same when the push was refused (`pushPending` says so:
2496
+ // the request is there to find, its commits reach the host with the
2497
+ // branch's next push, and what that is worth to a reviewer is each
2498
+ // listener's call) and when its detail could not be read back. Only
2499
+ // then is the refusal or the failed read the caller's answer.
2500
+ const notified = await this.notifyOpened(outcome.number, input, user, outcome.eligible, outcome.pushRefused !== null);
2501
+ if (outcome.pushRefused) throw outcome.pushRefused;
2502
+ if (outcome.detailError) throw outcome.detailError;
2503
+ return { ...outcome.detail, notified };
2504
+ }
2505
+
2506
+ /**
2507
+ * Tell the deployment's listeners the request was opened (see
2508
+ * {@link IChangeRequestHooks}); the channels that reached the approvers.
2509
+ * Never throws: a listener's failure is the hooks' to log, and a failed
2510
+ * read of the approvers' accounts hands the listeners none of them, counted
2511
+ * as unresolved.
2512
+ */
2513
+ private async notifyOpened(
2514
+ number: number,
2515
+ input: OpenChangeRequestInput,
2516
+ user: AuthUser,
2517
+ eligible: EligibleWritersAtRef,
2518
+ pushPending: boolean,
2519
+ ): Promise<string[]> {
2520
+ const { approvers, unresolvedApprovers } = await this.resolveApprovers(eligible);
2521
+ // Only an address a person can open from outside is handed over; the
2522
+ // relative in-app path (no `PUBLIC_FRONTEND_URL`) is the listener's to
2523
+ // complete.
2524
+ const link = this.prs.linkFor(number);
2525
+ return this.changeRequestHooks.runChangeRequestOpened({
2526
+ number,
2527
+ title: input.title.trim(),
2528
+ sourceBranch: input.sourceBranch,
2529
+ targetBranch: input.targetBranch,
2530
+ openedBy: { id: user.id, email: user.email, name: user.name },
2531
+ approvers,
2532
+ unresolvedApprovers,
2533
+ ...(link.urlNote === undefined ? { url: link.url } : {}),
2534
+ pushPending,
2471
2535
  });
2472
2536
  }
2473
2537
 
2538
+ /**
2539
+ * The distinct people eligible to approve some changed path, as accounts.
2540
+ * Each path's eligibility already expands its roles and groups to the
2541
+ * addresses the access model names (`emails`), so a person is one address
2542
+ * however many paths or roles name them; the addresses are looked up as
2543
+ * live accounts in one read. An address with no account, or with one
2544
+ * switched off, and the built-in `everyone` (anyone signed in may approve;
2545
+ * nobody can be listed for that), are counted, not handed over.
2546
+ */
2547
+ private async resolveApprovers(
2548
+ eligible: EligibleWritersAtRef,
2549
+ ): Promise<{ approvers: ChangeRequestPerson[]; unresolvedApprovers: number }> {
2550
+ const addresses = new Set<string>();
2551
+ let everyone = false;
2552
+ for (const info of eligible?.values() ?? []) {
2553
+ for (const email of info.emails) addresses.add(canonicalEmail(email));
2554
+ if (info.roles.includes(EVERYONE_CANONICAL)) everyone = true;
2555
+ }
2556
+ let accounts = new Map<string, { id: string; email: string; name: string }>();
2557
+ if (addresses.size > 0 && this.accounts) {
2558
+ try {
2559
+ accounts = await this.accounts.findActiveAccountsByEmail([...addresses]);
2560
+ } catch (err) {
2561
+ crLog.warn('the approvers of a change request could not be read as accounts; the listeners are handed none:', { err });
2562
+ }
2563
+ }
2564
+ const approvers: ChangeRequestPerson[] = [];
2565
+ let unresolvedApprovers = everyone ? 1 : 0;
2566
+ for (const address of addresses) {
2567
+ const account = accounts.get(address);
2568
+ if (account) approvers.push({ id: account.id, email: account.email, name: account.name });
2569
+ else unresolvedApprovers++;
2570
+ }
2571
+ approvers.sort((a, b) => a.email.localeCompare(b.email));
2572
+ return { approvers, unresolvedApprovers };
2573
+ }
2574
+
2474
2575
  /**
2475
2576
  * Refresh an existing change request from its target — re-runs the
2476
2577
  * `target → source` auto-merge so the CR diff reflects what the merge
@@ -2707,37 +2808,6 @@ export class WorkflowService implements IWorkflowService {
2707
2808
  return { ...refreshed, updatedPaths };
2708
2809
  }
2709
2810
 
2710
- listComments(number: number): Promise<ChangeRequestComment[]> {
2711
- return this.reviewWorkflow.listComments(number);
2712
- }
2713
-
2714
- async postComment(
2715
- number: number,
2716
- user: AuthUser,
2717
- input: PostChangeRequestCommentInput,
2718
- headSha: string,
2719
- ): Promise<ChangeRequestComment> {
2720
- const comment = await this.reviewWorkflow.postComment(number, user, input, headSha);
2721
- this.prs.invalidateDetailCache(number);
2722
- return comment;
2723
- }
2724
-
2725
- async editComment(
2726
- commentId: string,
2727
- number: number,
2728
- user: AuthUser,
2729
- body: string,
2730
- ): Promise<ChangeRequestComment> {
2731
- const updated = await this.reviewWorkflow.editComment(commentId, number, user, body);
2732
- this.prs.invalidateDetailCache(number);
2733
- return updated;
2734
- }
2735
-
2736
- async deleteComment(commentId: string, number: number, user: AuthUser): Promise<void> {
2737
- await this.reviewWorkflow.deleteComment(commentId, number, user);
2738
- this.prs.invalidateDetailCache(number);
2739
- }
2740
-
2741
2811
  async approveFile(
2742
2812
  number: number,
2743
2813
  path: string,
@@ -2773,6 +2843,7 @@ export class WorkflowService implements IWorkflowService {
2773
2843
  kind: 'approval-changed',
2774
2844
  number,
2775
2845
  path,
2846
+ targetBranch: baseBranch,
2776
2847
  approverUserId: user.id,
2777
2848
  change: 'added',
2778
2849
  });
@@ -2804,6 +2875,7 @@ export class WorkflowService implements IWorkflowService {
2804
2875
  kind: 'approval-changed',
2805
2876
  number,
2806
2877
  path,
2878
+ targetBranch: baseBranch,
2807
2879
  approverUserId: user.id,
2808
2880
  change: 'removed',
2809
2881
  });
@@ -3385,6 +3457,204 @@ export class WorkflowService implements IWorkflowService {
3385
3457
  await this.retireMergedSourceBranch(number, summary.base, user);
3386
3458
  }
3387
3459
 
3460
+ /**
3461
+ * The one rule for who may DECIDE an open change request — close it
3462
+ * (`rejectChangeRequest`) or rewrite what it asks (`updateChangeRequest`):
3463
+ * - its author (the stored author hash, never anything the caller sends),
3464
+ * - an admin (write on `roles.yaml` at `origin/<base>`), or
3465
+ * - the holder of write on every file it changes at `origin/<base>`,
3466
+ * i.e. anyone who may merge it.
3467
+ * Returns which grant the caller holds, or `null` for none.
3468
+ *
3469
+ * The grants beyond authorship are read at `origin/<base>`, never a local
3470
+ * ref, behind a STRICT fetch: a right revoked a moment ago must not still
3471
+ * pass against a stale tree, so an unreachable origin is a worded 409, not
3472
+ * a refusal. The path list comes from a fresh detail read, so the rule
3473
+ * applies to the current head. A base that cannot be read, or a detail read
3474
+ * that fails (one of the request's branches is gone), kicks the
3475
+ * deleted-branch sweep; see `kickDeletedBranchSweep`.
3476
+ */
3477
+ private async changeRequestDecisionGrant(
3478
+ number: number,
3479
+ user: AuthUser,
3480
+ authorIdHash: string | null,
3481
+ baseBranch: string,
3482
+ resolveWorkspaceId: () => Promise<string>,
3483
+ ): Promise<'author' | 'admin' | 'writes-every-file' | null> {
3484
+ if (authorIdHash && authorIdHash === hashEmail(user.email)) return 'author';
3485
+ const workspaceId = await resolveWorkspaceId();
3486
+ // `force` as well as `strict`: `strict` alone trusts a fetch from
3487
+ // within the cache window, so a right revoked inside it — with origin
3488
+ // down for the refresh — would still pass against the older refs.
3489
+ try {
3490
+ await this.workspaceService.ensureRemotesFetched(workspaceId, { strict: true, force: true });
3491
+ } catch {
3492
+ this.kickDeletedBranchSweep();
3493
+ throw new WorkflowDomainError(
3494
+ `Could not verify the base branch "${baseBranch}" — origin was unreachable. Retry in a moment.`,
3495
+ 409,
3496
+ );
3497
+ }
3498
+ const isAdmin = await this.accessControl.canWriteAtRef(
3499
+ workspaceId,
3500
+ `origin/${baseBranch}`,
3501
+ user.email,
3502
+ 'roles.yaml',
3503
+ );
3504
+ if (isAdmin === true) return 'admin';
3505
+ // A base that cannot be read decides nothing further: the per-file check
3506
+ // below reads the same tree and would answer the same, after a detail
3507
+ // read and a batch lookup done for nothing.
3508
+ if (isAdmin === null) {
3509
+ this.kickDeletedBranchSweep();
3510
+ throw new WorkflowDomainError(
3511
+ `The base branch "${baseBranch}" could not be resolved — it may have been deleted, or origin was unreachable. A background check is running; retry in a moment.`,
3512
+ 409,
3513
+ );
3514
+ }
3515
+ let detail;
3516
+ try {
3517
+ detail = await this.prs.getPrDetail(number, {
3518
+ fresh: true,
3519
+ workspaceId,
3520
+ viewerEmail: user.email,
3521
+ // Only `files[].path` is read below; a patch per file would be one
3522
+ // git subprocess each, generated for nothing.
3523
+ patches: false,
3524
+ });
3525
+ } catch (err) {
3526
+ this.kickDeletedBranchSweep();
3527
+ throw err;
3528
+ }
3529
+ const paths = detail?.files.map((f) => f.path) ?? [];
3530
+ if (paths.length > 0) {
3531
+ const writeMap = await this.accessControl.canWriteBatchAtRef(
3532
+ workspaceId,
3533
+ `origin/${baseBranch}`,
3534
+ user.email,
3535
+ paths,
3536
+ );
3537
+ if (writeMap && paths.every((p) => writeMap.get(p) === true)) return 'writes-every-file';
3538
+ }
3539
+ return null;
3540
+ }
3541
+
3542
+ /**
3543
+ * Change an OPEN request's title and/or description. Who may: the people
3544
+ * who may close it — `changeRequestDecisionGrant`, the one rule both verbs
3545
+ * share. What a request asks belongs to the same people who may decide it.
3546
+ *
3547
+ * `description` replaces the body whole — the body is the description and
3548
+ * nothing else; `appendDescription` adds a paragraph after it as stored.
3549
+ */
3550
+ async updateChangeRequest(
3551
+ number: number,
3552
+ user: AuthUser,
3553
+ input: UpdateChangeRequestFields,
3554
+ ): Promise<ChangeRequest> {
3555
+ const title = input.title === undefined ? undefined : input.title.trim();
3556
+ const description = input.description === undefined ? undefined : input.description.trim();
3557
+ const appended = input.appendDescription === undefined ? undefined : input.appendDescription.trim();
3558
+ if (title === undefined && description === undefined && appended === undefined) {
3559
+ throw new WorkflowValidationError('Give a new title, a new description, or both.');
3560
+ }
3561
+ if (description !== undefined && appended !== undefined) {
3562
+ throw new WorkflowValidationError('Give either a new description or text to append to it, not both.');
3563
+ }
3564
+ if (title !== undefined && title.length === 0) {
3565
+ throw new WorkflowValidationError('A change request needs a title; it cannot be empty.');
3566
+ }
3567
+ if (title !== undefined && title.length > CHANGE_REQUEST_TITLE_MAX) {
3568
+ throw new WorkflowValidationError(
3569
+ `A change request's title is at most ${CHANGE_REQUEST_TITLE_MAX} characters; this one has ${title.length}.`,
3570
+ );
3571
+ }
3572
+ // A replacement is measured here; an append is measured on what it
3573
+ // leaves, inside the transaction, since that depends on the body as
3574
+ // stored.
3575
+ assertDescriptionFits(description);
3576
+ const summary = await this.prs.getPr(number);
3577
+ if (!summary) throw new WorkflowDomainError('change request not found', 404);
3578
+ assertEditable(summary.state);
3579
+
3580
+ // The grants beyond authorship are read in the base branch's own workspace,
3581
+ // resolved only once authorship has not already decided: an author's edit
3582
+ // touches no workspace. Any failure to resolve it kicks the deleted-branch
3583
+ // sweep, as delete does.
3584
+ const grant = await this.changeRequestDecisionGrant(
3585
+ number,
3586
+ user,
3587
+ summary.authorId ?? null,
3588
+ summary.base,
3589
+ async () => {
3590
+ try {
3591
+ return (await this.workspaceService.getOrCreateForBranch(summary.base)).id;
3592
+ } catch (err) {
3593
+ this.kickDeletedBranchSweep();
3594
+ throw err;
3595
+ }
3596
+ },
3597
+ );
3598
+ if (grant === null) {
3599
+ throw new WorkflowDomainError(
3600
+ "Only the request's author, an admin, or someone who may approve every file it changes can edit its title and description.",
3601
+ 403,
3602
+ );
3603
+ }
3604
+
3605
+ // The body is rewritten from the row as stored, not from the summary read
3606
+ // above, inside one transaction holding the row's lock (`FOR UPDATE`) from
3607
+ // the read to the write: a merge or close that won the race leaves no open
3608
+ // row and refuses the edit instead of being written over, and an edit
3609
+ // racing this one waits for it and then applies to the body it left — so
3610
+ // two appends racing each other both land. The lock, never a comparison of
3611
+ // the stored body, is what serialises them: `body` is encrypted with a
3612
+ // fresh IV on every write, so its ciphertext never equals a re-encryption
3613
+ // of the same text.
3614
+ const updated = await this.db.transaction(async (tx) => {
3615
+ const [row] = await tx
3616
+ .select({ body: changeRequests.body })
3617
+ .from(changeRequests)
3618
+ .where(and(eq(changeRequests.number, number), eq(changeRequests.state, 'open')))
3619
+ .limit(1)
3620
+ .for('update');
3621
+ if (!row) return false;
3622
+ // The body IS the description: a replacement is written as given, an
3623
+ // append goes after the text as stored. An access request's level and
3624
+ // note live on their own columns and are never touched by an edit.
3625
+ const body =
3626
+ appended === undefined
3627
+ ? description
3628
+ : [row.body.trim(), appended].filter((s) => s.length > 0).join('\n\n');
3629
+ // What an append leaves is measured against the same ceiling as a
3630
+ // replacement; a refusal here rolls the transaction back and writes
3631
+ // nothing.
3632
+ assertDescriptionFits(body);
3633
+ const written = await tx
3634
+ .update(changeRequests)
3635
+ .set({
3636
+ ...(title !== undefined ? { title } : {}),
3637
+ ...(body !== undefined ? { body } : {}),
3638
+ updatedAt: new Date(),
3639
+ })
3640
+ .where(and(eq(changeRequests.number, number), eq(changeRequests.state, 'open')))
3641
+ .returning({ id: changeRequests.id });
3642
+ return written.length > 0;
3643
+ });
3644
+ this.prs.invalidateDetailCache(number);
3645
+ if (!updated) {
3646
+ const fresh = await this.prs.getPr(number);
3647
+ if (!fresh) throw new WorkflowDomainError('change request not found', 404);
3648
+ assertEditable(fresh.state);
3649
+ throw new WorkflowDomainError('This change request changed while it was being edited. Retry in a moment.', 409);
3650
+ }
3651
+ crLog.info(`#${number} title/description edited`);
3652
+ this.events?.emit({ kind: 'change-request-edited', number });
3653
+ const fresh = await this.prs.getPr(number);
3654
+ if (!fresh) throw new WorkflowDomainError('change request not found', 404);
3655
+ return fresh;
3656
+ }
3657
+
3388
3658
  /**
3389
3659
  * Close an open change request whose diff has EMPTIED — everything it
3390
3660
  * proposed has since landed on the target, been reverted, or been undone on
@@ -3891,20 +4161,13 @@ export class WorkflowService implements IWorkflowService {
3891
4161
 
3892
4162
 
3893
4163
  /**
3894
- * Reject (close-without-merging) a change request. Per PLAN.md spec, the
3895
- * authorized set is:
3896
- * - the CR author (hash-matched against the body marker), OR
3897
- * - any user with write permission to *every* changed file on the
3898
- * target branch, OR
3899
- * - an admin (write on `roles.yaml` at `origin/<target>`).
4164
+ * Reject (close-without-merging) a change request. Who may: the people
4165
+ * `changeRequestDecisionGrant` names — its author, an admin, or the holder
4166
+ * of write on every file it changes at `origin/<target>`.
3900
4167
  *
3901
- * The first and third are enforced by the underlying `cancelPr`. The
3902
- * second is the workflow's broader rule; we check it here and, on
3903
- * success, spoof `authorIdHash` to `hashEmail(user.email)` so `cancelPr`
3904
- * accepts the call via its existing "viewer is author" branch. The
3905
- * spoofing is safe because no caller outside this method can construct
3906
- * an `authorIdHash` that matches its own email's hash — `cancelPr`
3907
- * receives the hash via this internal call only.
4168
+ * A caller holding a grant reaches the underlying `cancelPr` as the author
4169
+ * (its `authorIdHash` is set to the caller's own hash); one holding none is
4170
+ * passed through unchanged, and `cancelPr` refuses it.
3908
4171
  */
3909
4172
  async rejectChangeRequest(
3910
4173
  number: number,
@@ -3915,49 +4178,22 @@ export class WorkflowService implements IWorkflowService {
3915
4178
  workspaceId: string,
3916
4179
  ): Promise<CancelChangeRequestResult> {
3917
4180
  let effectiveAuthorIdHash = authorIdHash;
3918
- const callerHash = hashEmail(user.email);
3919
- const callerIsAuthor = !!(authorIdHash && authorIdHash === callerHash);
3920
-
3921
- if (!callerIsAuthor) {
3922
- // Broader rule: write perm on every changed file at origin/<target>.
3923
- // The path list comes from the PR detail — fetch fresh so the rule
3924
- // applies against the current head (a stale list would let a user
3925
- // reject a CR whose files they no longer all own).
3926
- let detail;
3927
- try {
3928
- detail = await this.prs.getPrDetail(number, {
3929
- fresh: true,
3930
- workspaceId,
3931
- viewerEmail: user.email,
3932
- // Only `files[].path` is read below; a patch per file would be one
3933
- // git subprocess each, generated for nothing, on every reject by a
3934
- // non-author.
3935
- patches: false,
3936
- });
3937
- } catch (err) {
3938
- // The detail read resolves both branch tips (`resolvePrShas`), so a
3939
- // request one of whose branches is gone fails HERE, on the verb that
3940
- // exists to get rid of it. Kick the sweep (which proves the absence
3941
- // and closes the stranded rows) and surface the failure; see
3942
- // `kickDeletedBranchSweep`.
3943
- this.kickDeletedBranchSweep();
3944
- throw err;
3945
- }
3946
- const paths = detail?.files.map((f) => f.path) ?? [];
3947
- if (paths.length > 0) {
3948
- const writeMap = await this.accessControl.canWriteBatchAtRef(
3949
- workspaceId,
3950
- `origin/${baseBranch}`,
3951
- user.email,
3952
- paths,
3953
- );
3954
- const writesAll = !!writeMap && paths.every((p) => writeMap.get(p) === true);
3955
- if (writesAll) {
3956
- // Spoof so the underlying `cancelPr` authorizes via its viewer-
3957
- // is-author branch. The admin branch (write on roles.yaml) still
3958
- // works alongside — `cancelPr` checks both.
3959
- effectiveAuthorIdHash = callerHash;
3960
- }
4181
+ // A request that is no longer open is refused by `cancelPr` with its own
4182
+ // already-applied / already-cancelled answer; no grant is read for it.
4183
+ if (state === 'open') {
4184
+ const grant = await this.changeRequestDecisionGrant(
4185
+ number,
4186
+ user,
4187
+ authorIdHash,
4188
+ baseBranch,
4189
+ async () => workspaceId,
4190
+ );
4191
+ if (grant !== null) {
4192
+ // Spoof so the underlying `cancelPr` authorizes via its viewer-is-
4193
+ // author branch. The spoofing is safe because no caller outside this
4194
+ // method can construct an `authorIdHash` that matches its own email's
4195
+ // hash — `cancelPr` receives the hash via this internal call only.
4196
+ effectiveAuthorIdHash = hashEmail(user.email);
3961
4197
  }
3962
4198
  }
3963
4199
 
@@ -4694,37 +4930,30 @@ export class WorkflowService implements IWorkflowService {
4694
4930
  }
4695
4931
 
4696
4932
  /**
4697
- * Build the `## Affected owners` markdown block that gets appended to
4698
- * the CR body. Lists the eligible approvers (roles + named users) per
4699
- * changed path, per the access tree on `origin/<targetBranch>` — the same
4700
- * tree the approval gate uses server-side, so what the body advertises
4701
- * matches who can actually approve at merge time. The per-path list is
4702
- * capped (see {@link formatAffectedOwnersBlock}) so the body stays within
4703
- * the `gh pr create --body` arg limit on large changesets.
4704
- *
4705
- * Returns the empty string when there are no touched paths or no
4706
- * resolvable eligibility — keeps the body clean rather than printing
4707
- * a stub heading.
4933
+ * The eligible approvers (roles + named users, and the addresses they
4934
+ * expand to) per changed path, per the access tree on
4935
+ * `origin/<targetBranch>` — the same tree the approval gate uses
4936
+ * server-side, so what the body advertises and the listeners are told
4937
+ * matches who can actually approve at merge time. Null when there are no
4938
+ * touched paths or no resolvable eligibility: a missing affected-owners
4939
+ * block is cosmetic, not a reason to abort the open.
4708
4940
  */
4709
- private async buildAffectedOwnersBlock(
4941
+ private async eligibleWritersFor(
4710
4942
  workspaceId: string,
4711
4943
  targetBranch: string,
4712
4944
  paths: string[],
4713
- ): Promise<string> {
4714
- if (paths.length === 0) return '';
4715
- let resolved: Awaited<ReturnType<IAccessControl['eligibleWritersForPathsAtRef']>> = null;
4945
+ ): Promise<EligibleWritersAtRef> {
4946
+ if (paths.length === 0) return null;
4716
4947
  try {
4717
- resolved = await this.accessControl.eligibleWritersForPathsAtRef(
4948
+ return await this.accessControl.eligibleWritersForPathsAtRef(
4718
4949
  workspaceId,
4719
4950
  `origin/${targetBranch}`,
4720
4951
  paths,
4721
4952
  );
4722
4953
  } catch (err) {
4723
4954
  log.warn('eligibleWritersForPathsAtRef failed:', { err });
4955
+ return null;
4724
4956
  }
4725
- if (!resolved || resolved.size === 0) return '';
4726
-
4727
- return formatAffectedOwnersBlock(paths, resolved);
4728
4957
  }
4729
4958
 
4730
4959
  async updateBranch(