@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
@@ -17,6 +17,8 @@
17
17
  * those backings land.
18
18
  */
19
19
  import path from 'node:path';
20
+ import { execFile } from 'node:child_process';
21
+ import { promisify } from 'node:util';
20
22
  import { logger } from '../../shared/logging.js';
21
23
  // One logger per tag this file has always written under, so a line's prefix
22
24
  // is unchanged for a reader and its `module` field is exact for a filter.
@@ -28,24 +30,21 @@ const mergeLog = logger('merge');
28
30
  /** Who the leftover cleanup deletes as. Its deletions skip the authorship check, and the log names them `system`. */
29
31
  const SYSTEM_ACTOR = { id: 'system', email: 'system', name: 'system' };
30
32
  import { promises as fs } from 'node:fs';
31
- import { execFile } from 'node:child_process';
32
- import { promisify } from 'node:util';
33
- import { isFolderPlaceholder, folderPlaceholderPath, isPlatformRestoreShape, } from '@bevel-software/platform-shared';
33
+ import { isFolderPlaceholder, folderPlaceholderPath, isPlatformRestoreShape, CHANGE_REQUEST_DESCRIPTION_MAX, CHANGE_REQUEST_TITLE_MAX, } from '@bevel-software/platform-shared';
34
34
  import { readableAtCommits, ReadOnBranchDeniedError } from './read-on-branch.js';
35
35
  import { and, desc, eq, inArray, isNotNull, isNull, lt, ne, or, sql } from 'drizzle-orm';
36
- import { changeRequests } from '../database/schema.js';
37
- import { pgErrorCode } from '../database/pg-error.js';
36
+ import { changeRequests, pgErrorCode } from '../database/index.js';
38
37
  import { redactSecret } from '../../shared/redact-secret.js';
39
38
  import { workspaceIdForBranch, branchForWorkspaceId } from '../../shared/workspace-id.js';
40
39
  import { canonicalFileIdentity } from '../../shared/canonical-file-identity.js';
41
40
  import { describeSyncFailure, sanitizeError } from './sanitize-error.js';
42
41
  import { WorkflowHooks } from './workflow-hooks.js';
43
- import { WorkspaceMutex } from '../kb-fs/mutex.js';
44
- import { assertValidBranchName } from '../kb-fs/branch-name.js';
42
+ import { ChangeRequestHooks, } from './change-request-hooks.js';
43
+ import { WorkspaceMutex, assertValidBranchName } from '../kb-fs/index.js';
45
44
  import { canonicalEmail, hashEmail } from '../../shared/email-identity.js';
46
45
  import { BranchAuthorshipError, BranchDeleteBlockedError, BranchNotFoundError, ChangeRequestConflictsError, DuplicateChangeRequestError, OpenChangeRequestBlocksMergeError, ProtectedBranchError, RolesYamlPreservationError, PullRebaseConflictError, PushNeedsAgentResolutionError, RemoteBranchGoneError, WorkflowDomainError, WorkflowValidationError, } from '../../shared/domain-errors.js';
47
46
  import { RECOVERY_BOT_EMAIL, RECOVERY_BOT_NAME } from './recovery-bot.js';
48
- import { AccessDeniedError } from '../access-model/access-errors.js';
47
+ import { AccessDeniedError, EVERYONE_CANONICAL } from '../access-model/index.js';
49
48
  import { printable } from '../../shared/printable.js';
50
49
  const execFileAsync = promisify(execFile);
51
50
  /** The partial unique index that enforces one OPEN change request per (source, target) pair. */
@@ -107,61 +106,27 @@ function redactTokens(msg, token) {
107
106
  return redactSecret(msg, [token]);
108
107
  }
109
108
  /**
110
- * Cap on how many changed paths the `## Affected owners` CR-body block lists
111
- * individually. The block is passed to `gh pr create --body`, an argv string,
112
- * so an uncapped per-path list on a large changeset (hundreds/thousands of
113
- * files) makes the whole command exceed the OS arg limit and fail with E2BIG.
109
+ * Only an open request's title and description may change: an applied one is
110
+ * history, and a closed one is no longer asking anything. A worded 409 either
111
+ * way, so the refusal says which.
114
112
  */
115
- export const MAX_AFFECTED_PATHS_LISTED = 50;
116
- const formatWriter = (u) => u.name ? `${u.name} <${u.email}>` : u.email;
117
113
  /**
118
- * Render the `## Affected owners` block for the CR body: eligible approvers per
119
- * changed path, but only the first `maxListed` paths are listed individually;
120
- * the overflow is collapsed into a single deduped summary of every eligible
121
- * approver across the change. This keeps the body bounded regardless of how
122
- * many files the change touches (see {@link MAX_AFFECTED_PATHS_LISTED}).
123
- * Returns '' when no path has resolvable eligibility. The empty-folder
124
- * placeholder is never listed or counted: it is not content, and no one
125
- * reviews it.
114
+ * A description — on opening, a replacement, or what an append leaves — is
115
+ * at most {@link CHANGE_REQUEST_DESCRIPTION_MAX} characters; a worded 400
116
+ * past it. Undefined (no description given) always fits.
126
117
  */
127
- export function formatAffectedOwnersBlock(paths, resolved, maxListed = MAX_AFFECTED_PATHS_LISTED) {
128
- const listed = [];
129
- const allRoles = new Set();
130
- const allUsers = new Map(); // email -> display, deduped
131
- let eligible = 0;
132
- for (const p of paths) {
133
- if (isFolderPlaceholder(p))
134
- continue;
135
- const info = resolved.get(p);
136
- if (!info)
137
- continue;
138
- const parts = [];
139
- if (info.roles.length > 0) {
140
- info.roles.forEach((r) => allRoles.add(r));
141
- parts.push(info.roles.join(', '));
142
- }
143
- if (info.users.length > 0) {
144
- info.users.forEach((u) => allUsers.set(u.email, formatWriter(u)));
145
- parts.push(info.users.map(formatWriter).join(', '));
146
- }
147
- if (parts.length === 0)
148
- continue;
149
- eligible++;
150
- if (listed.length < maxListed)
151
- listed.push(`- \`${p}\` — ${parts.join('; ')}`);
152
- }
153
- if (eligible === 0)
154
- return '';
155
- const out = ['## Affected owners', '', ...listed];
156
- if (eligible > listed.length) {
157
- const summary = [
158
- allRoles.size > 0 ? [...allRoles].sort().join(', ') : '',
159
- allUsers.size > 0 ? [...allUsers.values()].sort().join(', ') : '',
160
- ].filter((s) => s.length > 0);
161
- out.push('', `…and ${eligible - listed.length} more changed path(s). ` +
162
- `All eligible approvers across this change: ${summary.join('; ')}`);
163
- }
164
- return out.join('\n');
118
+ function assertDescriptionFits(description) {
119
+ if (description !== undefined && description.length > CHANGE_REQUEST_DESCRIPTION_MAX) {
120
+ throw new WorkflowValidationError(`A change request's description is at most ${CHANGE_REQUEST_DESCRIPTION_MAX} characters; this one would have ${description.length}.`);
121
+ }
122
+ }
123
+ function assertEditable(state) {
124
+ if (state === 'merged') {
125
+ throw new WorkflowDomainError('This change request has already been applied; its title and description can no longer be changed.', 409);
126
+ }
127
+ if (state !== 'open') {
128
+ throw new WorkflowDomainError('This change request is closed; its title and description can no longer be changed.', 409);
129
+ }
165
130
  }
166
131
  /** Git commit subjects are capped at 200 characters (`GitService.commitFile`). */
167
132
  const MAX_COMMIT_SUBJECT = 200;
@@ -197,6 +162,8 @@ export class WorkflowService {
197
162
  events;
198
163
  fileChanges;
199
164
  hooks;
165
+ changeRequestHooks;
166
+ accounts;
200
167
  /**
201
168
  * Concrete `PullRequestService` (not the interface) so the facade can call
202
169
  * `invalidateDetailCache` after a mutation lands — the legacy routes do
@@ -258,7 +225,20 @@ export class WorkflowService {
258
225
  * consult; the default keeps test constructions (which don't exercise
259
226
  * hooks) unchanged.
260
227
  */
261
- hooks = new WorkflowHooks()) {
228
+ hooks = new WorkflowHooks(),
229
+ /**
230
+ * The seam a deployment's notification extends when a request is opened
231
+ * (see `change-request-hooks.ts`). The composition root passes the SAME
232
+ * instance it exposes as `changeRequestHooks`; the default registers
233
+ * nobody, so a test construction notifies nobody and says so.
234
+ */
235
+ changeRequestHooks = new ChangeRequestHooks(),
236
+ /**
237
+ * Who turns the addresses the access model names into accounts, for the
238
+ * opened event's `approvers`. Absent (a harness without accounts), every
239
+ * approver counts as unresolved.
240
+ */
241
+ accounts) {
262
242
  this.db = db;
263
243
  this.git = git;
264
244
  this.prs = prs;
@@ -272,6 +252,8 @@ export class WorkflowService {
272
252
  this.events = events;
273
253
  this.fileChanges = fileChanges;
274
254
  this.hooks = hooks;
255
+ this.changeRequestHooks = changeRequestHooks;
256
+ this.accounts = accounts;
275
257
  // The type already requires it; this holds for a caller the compiler did
276
258
  // not see (plain JavaScript, a positional slip in a harness).
277
259
  if (!changeGate || typeof changeGate.assertMayChange !== 'function') {
@@ -583,7 +565,6 @@ export class WorkflowService {
583
565
  source: summary.branch,
584
566
  target: summary.base,
585
567
  authorIdHash: summary.authorId ?? null,
586
- title: summary.title,
587
568
  });
588
569
  }
589
570
  }
@@ -1859,6 +1840,10 @@ export class WorkflowService {
1859
1840
  * account, so no hidden body marker). The DB-assigned number is the CR id.
1860
1841
  * 6. Re-fetch the full detail via the PR service so the response shape
1861
1842
  * matches every other CR endpoint.
1843
+ * 7. Tell the deployment's change-request listeners (see
1844
+ * `change-request-hooks.ts`); `notified` in the answer says which
1845
+ * channels reached the approvers. Once per request, here, whether a
1846
+ * person or an agent opened it — both take this road.
1862
1847
  */
1863
1848
  async openChangeRequest(workspaceId, user, input) {
1864
1849
  if (!input.sourceBranch)
@@ -1870,6 +1855,7 @@ export class WorkflowService {
1870
1855
  }
1871
1856
  if (!input.title?.trim())
1872
1857
  throw new WorkflowValidationError('title is required');
1858
+ assertDescriptionFits(input.description?.trim());
1873
1859
  if (this.kb.isProtectedBranch(input.sourceBranch)) {
1874
1860
  throw new WorkflowValidationError(`Cannot open a change request *from* a protected branch ("${input.sourceBranch}").`, { kind: 'source-is-protected', sourceBranch: input.sourceBranch });
1875
1861
  }
@@ -1884,7 +1870,13 @@ export class WorkflowService {
1884
1870
  // its branches is retired inside the window, and holding only the source
1885
1871
  // left a `Y -> X` request open to X being deleted under it — the very
1886
1872
  // failure the widened guards exist to prevent.
1887
- return this.runOnBranchPair(input.sourceBranch, input.targetBranch, async () => {
1873
+ //
1874
+ // The deployment's listeners are told AFTER the locks are released: they
1875
+ // are awaited (the answer's `notified` is true to what happened), and a
1876
+ // slow mailer must hold up this answer alone, never a delete or a merge
1877
+ // on either branch. So the locked part answers what it made — the detail,
1878
+ // or the refusal — and the telling follows.
1879
+ const outcome = await this.runOnBranchPair(input.sourceBranch, input.targetBranch, async () => {
1888
1880
  // Uniqueness rule — A→B blocks A→B (the spec is explicit that B→A in
1889
1881
  // parallel is still allowed). `listOpenPrs` is cached for 30s so we
1890
1882
  // force-fresh to catch a CR that opened just now.
@@ -1918,18 +1910,17 @@ export class WorkflowService {
1918
1910
  }
1919
1911
  const workspacePath = await this.workspaceService.getWorkspacePath(workspaceId);
1920
1912
  const cwd = path.join(workspacePath, this.kbDirName);
1921
- // Touched paths between target and source — basis for the
1922
- // affected-owners block we append to the CR body. We compute it
1923
- // ourselves rather than waiting for GitHub to expose `pr.files`
1924
- // (which only populates after the PR exists). Three-dot range
1925
- // matches what `gh pr create` will eventually show as the diff.
1913
+ // Touched paths between target and source — the diff the request will
1914
+ // surface — and the eligible approvers per path at the target, resolved
1915
+ // once for the opened event, which hands the same people to the
1916
+ // deployment's listeners. None of it is written into the body: the request
1917
+ // is a DB row whose author is a column, whose body is the description and
1918
+ // nothing else, and whose access-request level and note are columns of
1919
+ // their own. Who must approve each file is resolved live, per file,
1920
+ // whenever the request is read.
1926
1921
  const touchedPaths = await this.listChangedPathsBetweenBranches(cwd, input.targetBranch, input.sourceBranch);
1927
- const affectedOwnersBlock = await this.buildAffectedOwnersBlock(workspaceId, input.targetBranch, touchedPaths);
1928
- // The change request is a plain DB row now — no provider PR. Author is a
1929
- // real column (no hidden body marker needed, since nothing runs as a shared
1930
- // service account anymore).
1931
- const description = input.description?.trim() ?? '';
1932
- const body = [description, affectedOwnersBlock].filter((s) => s.length > 0).join('\n\n');
1922
+ const eligible = await this.eligibleWritersFor(workspaceId, input.targetBranch, touchedPaths);
1923
+ const note = input.accessRequest?.note?.trim();
1933
1924
  let prNumber;
1934
1925
  try {
1935
1926
  const [row] = await this.db
@@ -1938,10 +1929,12 @@ export class WorkflowService {
1938
1929
  sourceBranch: input.sourceBranch,
1939
1930
  targetBranch: input.targetBranch,
1940
1931
  title: input.title.trim(),
1941
- body,
1932
+ body: input.description?.trim() ?? '',
1942
1933
  authorEmail: canonicalEmail(user.email),
1943
1934
  authorEmailBidx: user.email,
1944
1935
  authorName: user.name,
1936
+ accessRequestLevel: input.accessRequest?.level ?? null,
1937
+ accessRequestNote: note ? note : null,
1945
1938
  })
1946
1939
  .returning({ number: changeRequests.number });
1947
1940
  prNumber = row.number;
@@ -1983,27 +1976,120 @@ export class WorkflowService {
1983
1976
  source: input.sourceBranch,
1984
1977
  target: input.targetBranch,
1985
1978
  authorIdHash: hashEmail(user.email),
1986
- title: input.title,
1987
1979
  };
1988
1980
  if (pushRefused) {
1989
1981
  // The request exists; its detail reads the published refs, which the
1990
1982
  // refused push never moved — answering the refusal is what the caller
1991
1983
  // needs, not a detail read that may fail on a branch the host lacks.
1992
1984
  this.events?.emit(opened);
1993
- throw pushRefused;
1994
- }
1995
- const detail = await this.prs.getPrDetail(prNumber, {
1996
- fresh: true,
1997
- workspaceId,
1998
- viewerEmail: user.email,
1999
- });
2000
- if (!detail) {
2001
- throw new WorkflowValidationError(`Created change request #${prNumber} but could not fetch its detail`);
1985
+ return { number: prNumber, eligible, detail: null, pushRefused, detailError: null };
2002
1986
  }
1987
+ // The row exists and the push landed: every tab is told, whatever the
1988
+ // read-back below does.
2003
1989
  this.events?.emit(opened);
2004
- return detail;
1990
+ // Reading the detail back is the caller's answer, not the open: a read
1991
+ // that fails is reported, but it is not allowed to cost the reviewers
1992
+ // their message — the request stands, and a retry of the open meets the
1993
+ // duplicate check, so there is no second chance to tell them.
1994
+ let detail = null;
1995
+ let detailError = null;
1996
+ try {
1997
+ detail = await this.prs.getPrDetail(prNumber, {
1998
+ fresh: true,
1999
+ workspaceId,
2000
+ viewerEmail: user.email,
2001
+ });
2002
+ }
2003
+ catch (err) {
2004
+ detailError = err instanceof Error ? err : new Error(String(err));
2005
+ }
2006
+ if (detail)
2007
+ return { number: prNumber, eligible, detail, pushRefused: null, detailError: null };
2008
+ return {
2009
+ number: prNumber,
2010
+ eligible,
2011
+ detail: null,
2012
+ pushRefused: null,
2013
+ detailError: detailError ?? new WorkflowValidationError(`Created change request #${prNumber} but could not fetch its detail`),
2014
+ };
2015
+ });
2016
+ // The request exists in every branch of the outcome — the listeners are
2017
+ // told all the same when the push was refused (`pushPending` says so:
2018
+ // the request is there to find, its commits reach the host with the
2019
+ // branch's next push, and what that is worth to a reviewer is each
2020
+ // listener's call) and when its detail could not be read back. Only
2021
+ // then is the refusal or the failed read the caller's answer.
2022
+ const notified = await this.notifyOpened(outcome.number, input, user, outcome.eligible, outcome.pushRefused !== null);
2023
+ if (outcome.pushRefused)
2024
+ throw outcome.pushRefused;
2025
+ if (outcome.detailError)
2026
+ throw outcome.detailError;
2027
+ return { ...outcome.detail, notified };
2028
+ }
2029
+ /**
2030
+ * Tell the deployment's listeners the request was opened (see
2031
+ * {@link IChangeRequestHooks}); the channels that reached the approvers.
2032
+ * Never throws: a listener's failure is the hooks' to log, and a failed
2033
+ * read of the approvers' accounts hands the listeners none of them, counted
2034
+ * as unresolved.
2035
+ */
2036
+ async notifyOpened(number, input, user, eligible, pushPending) {
2037
+ const { approvers, unresolvedApprovers } = await this.resolveApprovers(eligible);
2038
+ // Only an address a person can open from outside is handed over; the
2039
+ // relative in-app path (no `PUBLIC_FRONTEND_URL`) is the listener's to
2040
+ // complete.
2041
+ const link = this.prs.linkFor(number);
2042
+ return this.changeRequestHooks.runChangeRequestOpened({
2043
+ number,
2044
+ title: input.title.trim(),
2045
+ sourceBranch: input.sourceBranch,
2046
+ targetBranch: input.targetBranch,
2047
+ openedBy: { id: user.id, email: user.email, name: user.name },
2048
+ approvers,
2049
+ unresolvedApprovers,
2050
+ ...(link.urlNote === undefined ? { url: link.url } : {}),
2051
+ pushPending,
2005
2052
  });
2006
2053
  }
2054
+ /**
2055
+ * The distinct people eligible to approve some changed path, as accounts.
2056
+ * Each path's eligibility already expands its roles and groups to the
2057
+ * addresses the access model names (`emails`), so a person is one address
2058
+ * however many paths or roles name them; the addresses are looked up as
2059
+ * live accounts in one read. An address with no account, or with one
2060
+ * switched off, and the built-in `everyone` (anyone signed in may approve;
2061
+ * nobody can be listed for that), are counted, not handed over.
2062
+ */
2063
+ async resolveApprovers(eligible) {
2064
+ const addresses = new Set();
2065
+ let everyone = false;
2066
+ for (const info of eligible?.values() ?? []) {
2067
+ for (const email of info.emails)
2068
+ addresses.add(canonicalEmail(email));
2069
+ if (info.roles.includes(EVERYONE_CANONICAL))
2070
+ everyone = true;
2071
+ }
2072
+ let accounts = new Map();
2073
+ if (addresses.size > 0 && this.accounts) {
2074
+ try {
2075
+ accounts = await this.accounts.findActiveAccountsByEmail([...addresses]);
2076
+ }
2077
+ catch (err) {
2078
+ crLog.warn('the approvers of a change request could not be read as accounts; the listeners are handed none:', { err });
2079
+ }
2080
+ }
2081
+ const approvers = [];
2082
+ let unresolvedApprovers = everyone ? 1 : 0;
2083
+ for (const address of addresses) {
2084
+ const account = accounts.get(address);
2085
+ if (account)
2086
+ approvers.push({ id: account.id, email: account.email, name: account.name });
2087
+ else
2088
+ unresolvedApprovers++;
2089
+ }
2090
+ approvers.sort((a, b) => a.email.localeCompare(b.email));
2091
+ return { approvers, unresolvedApprovers };
2092
+ }
2007
2093
  /**
2008
2094
  * Refresh an existing change request from its target — re-runs the
2009
2095
  * `target → source` auto-merge so the CR diff reflects what the merge
@@ -2197,23 +2283,6 @@ export class WorkflowService {
2197
2283
  }
2198
2284
  return { ...refreshed, updatedPaths };
2199
2285
  }
2200
- listComments(number) {
2201
- return this.reviewWorkflow.listComments(number);
2202
- }
2203
- async postComment(number, user, input, headSha) {
2204
- const comment = await this.reviewWorkflow.postComment(number, user, input, headSha);
2205
- this.prs.invalidateDetailCache(number);
2206
- return comment;
2207
- }
2208
- async editComment(commentId, number, user, body) {
2209
- const updated = await this.reviewWorkflow.editComment(commentId, number, user, body);
2210
- this.prs.invalidateDetailCache(number);
2211
- return updated;
2212
- }
2213
- async deleteComment(commentId, number, user) {
2214
- await this.reviewWorkflow.deleteComment(commentId, number, user);
2215
- this.prs.invalidateDetailCache(number);
2216
- }
2217
2286
  async approveFile(number, path, user, files, headSha, baseBranch, authorIdHash, workspaceId) {
2218
2287
  // Taken BEFORE the approval lands (see `clearApplyFailure`).
2219
2288
  const approvedAfter = new Date();
@@ -2231,6 +2300,7 @@ export class WorkflowService {
2231
2300
  kind: 'approval-changed',
2232
2301
  number,
2233
2302
  path,
2303
+ targetBranch: baseBranch,
2234
2304
  approverUserId: user.id,
2235
2305
  change: 'added',
2236
2306
  });
@@ -2243,6 +2313,7 @@ export class WorkflowService {
2243
2313
  kind: 'approval-changed',
2244
2314
  number,
2245
2315
  path,
2316
+ targetBranch: baseBranch,
2246
2317
  approverUserId: user.id,
2247
2318
  change: 'removed',
2248
2319
  });
@@ -2734,6 +2805,172 @@ export class WorkflowService {
2734
2805
  }
2735
2806
  await this.retireMergedSourceBranch(number, summary.base, user);
2736
2807
  }
2808
+ /**
2809
+ * The one rule for who may DECIDE an open change request — close it
2810
+ * (`rejectChangeRequest`) or rewrite what it asks (`updateChangeRequest`):
2811
+ * - its author (the stored author hash, never anything the caller sends),
2812
+ * - an admin (write on `roles.yaml` at `origin/<base>`), or
2813
+ * - the holder of write on every file it changes at `origin/<base>`,
2814
+ * i.e. anyone who may merge it.
2815
+ * Returns which grant the caller holds, or `null` for none.
2816
+ *
2817
+ * The grants beyond authorship are read at `origin/<base>`, never a local
2818
+ * ref, behind a STRICT fetch: a right revoked a moment ago must not still
2819
+ * pass against a stale tree, so an unreachable origin is a worded 409, not
2820
+ * a refusal. The path list comes from a fresh detail read, so the rule
2821
+ * applies to the current head. A base that cannot be read, or a detail read
2822
+ * that fails (one of the request's branches is gone), kicks the
2823
+ * deleted-branch sweep; see `kickDeletedBranchSweep`.
2824
+ */
2825
+ async changeRequestDecisionGrant(number, user, authorIdHash, baseBranch, resolveWorkspaceId) {
2826
+ if (authorIdHash && authorIdHash === hashEmail(user.email))
2827
+ return 'author';
2828
+ const workspaceId = await resolveWorkspaceId();
2829
+ // `force` as well as `strict`: `strict` alone trusts a fetch from
2830
+ // within the cache window, so a right revoked inside it — with origin
2831
+ // down for the refresh — would still pass against the older refs.
2832
+ try {
2833
+ await this.workspaceService.ensureRemotesFetched(workspaceId, { strict: true, force: true });
2834
+ }
2835
+ catch {
2836
+ this.kickDeletedBranchSweep();
2837
+ throw new WorkflowDomainError(`Could not verify the base branch "${baseBranch}" — origin was unreachable. Retry in a moment.`, 409);
2838
+ }
2839
+ const isAdmin = await this.accessControl.canWriteAtRef(workspaceId, `origin/${baseBranch}`, user.email, 'roles.yaml');
2840
+ if (isAdmin === true)
2841
+ return 'admin';
2842
+ // A base that cannot be read decides nothing further: the per-file check
2843
+ // below reads the same tree and would answer the same, after a detail
2844
+ // read and a batch lookup done for nothing.
2845
+ if (isAdmin === null) {
2846
+ this.kickDeletedBranchSweep();
2847
+ throw new WorkflowDomainError(`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.`, 409);
2848
+ }
2849
+ let detail;
2850
+ try {
2851
+ detail = await this.prs.getPrDetail(number, {
2852
+ fresh: true,
2853
+ workspaceId,
2854
+ viewerEmail: user.email,
2855
+ // Only `files[].path` is read below; a patch per file would be one
2856
+ // git subprocess each, generated for nothing.
2857
+ patches: false,
2858
+ });
2859
+ }
2860
+ catch (err) {
2861
+ this.kickDeletedBranchSweep();
2862
+ throw err;
2863
+ }
2864
+ const paths = detail?.files.map((f) => f.path) ?? [];
2865
+ if (paths.length > 0) {
2866
+ const writeMap = await this.accessControl.canWriteBatchAtRef(workspaceId, `origin/${baseBranch}`, user.email, paths);
2867
+ if (writeMap && paths.every((p) => writeMap.get(p) === true))
2868
+ return 'writes-every-file';
2869
+ }
2870
+ return null;
2871
+ }
2872
+ /**
2873
+ * Change an OPEN request's title and/or description. Who may: the people
2874
+ * who may close it — `changeRequestDecisionGrant`, the one rule both verbs
2875
+ * share. What a request asks belongs to the same people who may decide it.
2876
+ *
2877
+ * `description` replaces the body whole — the body is the description and
2878
+ * nothing else; `appendDescription` adds a paragraph after it as stored.
2879
+ */
2880
+ async updateChangeRequest(number, user, input) {
2881
+ const title = input.title === undefined ? undefined : input.title.trim();
2882
+ const description = input.description === undefined ? undefined : input.description.trim();
2883
+ const appended = input.appendDescription === undefined ? undefined : input.appendDescription.trim();
2884
+ if (title === undefined && description === undefined && appended === undefined) {
2885
+ throw new WorkflowValidationError('Give a new title, a new description, or both.');
2886
+ }
2887
+ if (description !== undefined && appended !== undefined) {
2888
+ throw new WorkflowValidationError('Give either a new description or text to append to it, not both.');
2889
+ }
2890
+ if (title !== undefined && title.length === 0) {
2891
+ throw new WorkflowValidationError('A change request needs a title; it cannot be empty.');
2892
+ }
2893
+ if (title !== undefined && title.length > CHANGE_REQUEST_TITLE_MAX) {
2894
+ throw new WorkflowValidationError(`A change request's title is at most ${CHANGE_REQUEST_TITLE_MAX} characters; this one has ${title.length}.`);
2895
+ }
2896
+ // A replacement is measured here; an append is measured on what it
2897
+ // leaves, inside the transaction, since that depends on the body as
2898
+ // stored.
2899
+ assertDescriptionFits(description);
2900
+ const summary = await this.prs.getPr(number);
2901
+ if (!summary)
2902
+ throw new WorkflowDomainError('change request not found', 404);
2903
+ assertEditable(summary.state);
2904
+ // The grants beyond authorship are read in the base branch's own workspace,
2905
+ // resolved only once authorship has not already decided: an author's edit
2906
+ // touches no workspace. Any failure to resolve it kicks the deleted-branch
2907
+ // sweep, as delete does.
2908
+ const grant = await this.changeRequestDecisionGrant(number, user, summary.authorId ?? null, summary.base, async () => {
2909
+ try {
2910
+ return (await this.workspaceService.getOrCreateForBranch(summary.base)).id;
2911
+ }
2912
+ catch (err) {
2913
+ this.kickDeletedBranchSweep();
2914
+ throw err;
2915
+ }
2916
+ });
2917
+ if (grant === null) {
2918
+ throw new WorkflowDomainError("Only the request's author, an admin, or someone who may approve every file it changes can edit its title and description.", 403);
2919
+ }
2920
+ // The body is rewritten from the row as stored, not from the summary read
2921
+ // above, inside one transaction holding the row's lock (`FOR UPDATE`) from
2922
+ // the read to the write: a merge or close that won the race leaves no open
2923
+ // row and refuses the edit instead of being written over, and an edit
2924
+ // racing this one waits for it and then applies to the body it left — so
2925
+ // two appends racing each other both land. The lock, never a comparison of
2926
+ // the stored body, is what serialises them: `body` is encrypted with a
2927
+ // fresh IV on every write, so its ciphertext never equals a re-encryption
2928
+ // of the same text.
2929
+ const updated = await this.db.transaction(async (tx) => {
2930
+ const [row] = await tx
2931
+ .select({ body: changeRequests.body })
2932
+ .from(changeRequests)
2933
+ .where(and(eq(changeRequests.number, number), eq(changeRequests.state, 'open')))
2934
+ .limit(1)
2935
+ .for('update');
2936
+ if (!row)
2937
+ return false;
2938
+ // The body IS the description: a replacement is written as given, an
2939
+ // append goes after the text as stored. An access request's level and
2940
+ // note live on their own columns and are never touched by an edit.
2941
+ const body = appended === undefined
2942
+ ? description
2943
+ : [row.body.trim(), appended].filter((s) => s.length > 0).join('\n\n');
2944
+ // What an append leaves is measured against the same ceiling as a
2945
+ // replacement; a refusal here rolls the transaction back and writes
2946
+ // nothing.
2947
+ assertDescriptionFits(body);
2948
+ const written = await tx
2949
+ .update(changeRequests)
2950
+ .set({
2951
+ ...(title !== undefined ? { title } : {}),
2952
+ ...(body !== undefined ? { body } : {}),
2953
+ updatedAt: new Date(),
2954
+ })
2955
+ .where(and(eq(changeRequests.number, number), eq(changeRequests.state, 'open')))
2956
+ .returning({ id: changeRequests.id });
2957
+ return written.length > 0;
2958
+ });
2959
+ this.prs.invalidateDetailCache(number);
2960
+ if (!updated) {
2961
+ const fresh = await this.prs.getPr(number);
2962
+ if (!fresh)
2963
+ throw new WorkflowDomainError('change request not found', 404);
2964
+ assertEditable(fresh.state);
2965
+ throw new WorkflowDomainError('This change request changed while it was being edited. Retry in a moment.', 409);
2966
+ }
2967
+ crLog.info(`#${number} title/description edited`);
2968
+ this.events?.emit({ kind: 'change-request-edited', number });
2969
+ const fresh = await this.prs.getPr(number);
2970
+ if (!fresh)
2971
+ throw new WorkflowDomainError('change request not found', 404);
2972
+ return fresh;
2973
+ }
2737
2974
  /**
2738
2975
  * Close an open change request whose diff has EMPTIED — everything it
2739
2976
  * proposed has since landed on the target, been reverted, or been undone on
@@ -3244,61 +3481,26 @@ export class WorkflowService {
3244
3481
  return removed;
3245
3482
  }
3246
3483
  /**
3247
- * Reject (close-without-merging) a change request. Per PLAN.md spec, the
3248
- * authorized set is:
3249
- * - the CR author (hash-matched against the body marker), OR
3250
- * - any user with write permission to *every* changed file on the
3251
- * target branch, OR
3252
- * - an admin (write on `roles.yaml` at `origin/<target>`).
3484
+ * Reject (close-without-merging) a change request. Who may: the people
3485
+ * `changeRequestDecisionGrant` names — its author, an admin, or the holder
3486
+ * of write on every file it changes at `origin/<target>`.
3253
3487
  *
3254
- * The first and third are enforced by the underlying `cancelPr`. The
3255
- * second is the workflow's broader rule; we check it here and, on
3256
- * success, spoof `authorIdHash` to `hashEmail(user.email)` so `cancelPr`
3257
- * accepts the call via its existing "viewer is author" branch. The
3258
- * spoofing is safe because no caller outside this method can construct
3259
- * an `authorIdHash` that matches its own email's hash — `cancelPr`
3260
- * receives the hash via this internal call only.
3488
+ * A caller holding a grant reaches the underlying `cancelPr` as the author
3489
+ * (its `authorIdHash` is set to the caller's own hash); one holding none is
3490
+ * passed through unchanged, and `cancelPr` refuses it.
3261
3491
  */
3262
3492
  async rejectChangeRequest(number, user, state, authorIdHash, baseBranch, workspaceId) {
3263
3493
  let effectiveAuthorIdHash = authorIdHash;
3264
- const callerHash = hashEmail(user.email);
3265
- const callerIsAuthor = !!(authorIdHash && authorIdHash === callerHash);
3266
- if (!callerIsAuthor) {
3267
- // Broader rule: write perm on every changed file at origin/<target>.
3268
- // The path list comes from the PR detail — fetch fresh so the rule
3269
- // applies against the current head (a stale list would let a user
3270
- // reject a CR whose files they no longer all own).
3271
- let detail;
3272
- try {
3273
- detail = await this.prs.getPrDetail(number, {
3274
- fresh: true,
3275
- workspaceId,
3276
- viewerEmail: user.email,
3277
- // Only `files[].path` is read below; a patch per file would be one
3278
- // git subprocess each, generated for nothing, on every reject by a
3279
- // non-author.
3280
- patches: false,
3281
- });
3282
- }
3283
- catch (err) {
3284
- // The detail read resolves both branch tips (`resolvePrShas`), so a
3285
- // request one of whose branches is gone fails HERE, on the verb that
3286
- // exists to get rid of it. Kick the sweep (which proves the absence
3287
- // and closes the stranded rows) and surface the failure; see
3288
- // `kickDeletedBranchSweep`.
3289
- this.kickDeletedBranchSweep();
3290
- throw err;
3291
- }
3292
- const paths = detail?.files.map((f) => f.path) ?? [];
3293
- if (paths.length > 0) {
3294
- const writeMap = await this.accessControl.canWriteBatchAtRef(workspaceId, `origin/${baseBranch}`, user.email, paths);
3295
- const writesAll = !!writeMap && paths.every((p) => writeMap.get(p) === true);
3296
- if (writesAll) {
3297
- // Spoof so the underlying `cancelPr` authorizes via its viewer-
3298
- // is-author branch. The admin branch (write on roles.yaml) still
3299
- // works alongside — `cancelPr` checks both.
3300
- effectiveAuthorIdHash = callerHash;
3301
- }
3494
+ // A request that is no longer open is refused by `cancelPr` with its own
3495
+ // already-applied / already-cancelled answer; no grant is read for it.
3496
+ if (state === 'open') {
3497
+ const grant = await this.changeRequestDecisionGrant(number, user, authorIdHash, baseBranch, async () => workspaceId);
3498
+ if (grant !== null) {
3499
+ // Spoof so the underlying `cancelPr` authorizes via its viewer-is-
3500
+ // author branch. The spoofing is safe because no caller outside this
3501
+ // method can construct an `authorIdHash` that matches its own email's
3502
+ // hash — `cancelPr` receives the hash via this internal call only.
3503
+ effectiveAuthorIdHash = hashEmail(user.email);
3302
3504
  }
3303
3505
  }
3304
3506
  const result = await this.reviewWorkflow.cancelPr(number, user, state, effectiveAuthorIdHash, baseBranch, workspaceId);
@@ -3925,31 +4127,24 @@ export class WorkflowService {
3925
4127
  }
3926
4128
  }
3927
4129
  /**
3928
- * Build the `## Affected owners` markdown block that gets appended to
3929
- * the CR body. Lists the eligible approvers (roles + named users) per
3930
- * changed path, per the access tree on `origin/<targetBranch>` — the same
3931
- * tree the approval gate uses server-side, so what the body advertises
3932
- * matches who can actually approve at merge time. The per-path list is
3933
- * capped (see {@link formatAffectedOwnersBlock}) so the body stays within
3934
- * the `gh pr create --body` arg limit on large changesets.
3935
- *
3936
- * Returns the empty string when there are no touched paths or no
3937
- * resolvable eligibility — keeps the body clean rather than printing
3938
- * a stub heading.
4130
+ * The eligible approvers (roles + named users, and the addresses they
4131
+ * expand to) per changed path, per the access tree on
4132
+ * `origin/<targetBranch>` — the same tree the approval gate uses
4133
+ * server-side, so what the body advertises and the listeners are told
4134
+ * matches who can actually approve at merge time. Null when there are no
4135
+ * touched paths or no resolvable eligibility: a missing affected-owners
4136
+ * block is cosmetic, not a reason to abort the open.
3939
4137
  */
3940
- async buildAffectedOwnersBlock(workspaceId, targetBranch, paths) {
4138
+ async eligibleWritersFor(workspaceId, targetBranch, paths) {
3941
4139
  if (paths.length === 0)
3942
- return '';
3943
- let resolved = null;
4140
+ return null;
3944
4141
  try {
3945
- resolved = await this.accessControl.eligibleWritersForPathsAtRef(workspaceId, `origin/${targetBranch}`, paths);
4142
+ return await this.accessControl.eligibleWritersForPathsAtRef(workspaceId, `origin/${targetBranch}`, paths);
3946
4143
  }
3947
4144
  catch (err) {
3948
4145
  log.warn('eligibleWritersForPathsAtRef failed:', { err });
4146
+ return null;
3949
4147
  }
3950
- if (!resolved || resolved.size === 0)
3951
- return '';
3952
- return formatAffectedOwnersBlock(paths, resolved);
3953
4148
  }
3954
4149
  async updateBranch(workspaceId, user, opts = {}) {
3955
4150
  const branch = branchForWorkspaceId(workspaceId);