@bevel-software/platform-core-backend 0.32.0 → 0.34.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 (1188) hide show
  1. package/agent-guide/access-control.md +24 -8
  2. package/agent-guide/html-views.md +277 -15
  3. package/agent-guide/tool-manuals.md +1 -1
  4. package/dist/core/catalog-revision.d.ts +12 -1
  5. package/dist/core/catalog-revision.d.ts.map +1 -1
  6. package/dist/core/catalog-revision.js +23 -3
  7. package/dist/core/catalog-revision.js.map +1 -1
  8. package/dist/core/core-ports.d.ts +41 -0
  9. package/dist/core/core-ports.d.ts.map +1 -1
  10. package/dist/core/core-ports.js.map +1 -1
  11. package/dist/core/create-core-server.d.ts.map +1 -1
  12. package/dist/core/create-core-server.js +42 -10
  13. package/dist/core/create-core-server.js.map +1 -1
  14. package/dist/core/create-core-services.d.ts +22 -6
  15. package/dist/core/create-core-services.d.ts.map +1 -1
  16. package/dist/core/create-core-services.js +58 -17
  17. package/dist/core/create-core-services.js.map +1 -1
  18. package/dist/core/lifecycle.d.ts +24 -0
  19. package/dist/core/lifecycle.d.ts.map +1 -1
  20. package/dist/core/lifecycle.js +16 -2
  21. package/dist/core/lifecycle.js.map +1 -1
  22. package/dist/core/public-config.d.ts +10 -0
  23. package/dist/core/public-config.d.ts.map +1 -1
  24. package/dist/core/public-config.js +10 -0
  25. package/dist/core/public-config.js.map +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/modules/access/access-control.interface.d.ts +17 -9
  30. package/dist/modules/access/access-control.interface.d.ts.map +1 -1
  31. package/dist/modules/access/access-control.service.d.ts +13 -3
  32. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  33. package/dist/modules/access/access-control.service.js +165 -77
  34. package/dist/modules/access/access-control.service.js.map +1 -1
  35. package/dist/modules/access/access-declarations.d.ts +1 -1
  36. package/dist/modules/access/access-declarations.d.ts.map +1 -1
  37. package/dist/modules/access/access-declarations.js +1 -1
  38. package/dist/modules/access/access-declarations.js.map +1 -1
  39. package/dist/modules/access/access-mutation.service.d.ts +28 -25
  40. package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
  41. package/dist/modules/access/access-mutation.service.js +50 -53
  42. package/dist/modules/access/access-mutation.service.js.map +1 -1
  43. package/dist/modules/access/access-requests.contract.d.ts +1 -1
  44. package/dist/modules/access/access-requests.contract.d.ts.map +1 -1
  45. package/dist/modules/access/access-requests.routes.d.ts +3 -3
  46. package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
  47. package/dist/modules/access/access-requests.routes.js +7 -7
  48. package/dist/modules/access/access-requests.routes.js.map +1 -1
  49. package/dist/modules/access/access-requests.service.d.ts +21 -20
  50. package/dist/modules/access/access-requests.service.d.ts.map +1 -1
  51. package/dist/modules/access/access-requests.service.js +22 -68
  52. package/dist/modules/access/access-requests.service.js.map +1 -1
  53. package/dist/modules/access/access-view.d.ts +1 -1
  54. package/dist/modules/access/access-view.d.ts.map +1 -1
  55. package/dist/modules/access/access-view.js +12 -11
  56. package/dist/modules/access/access-view.js.map +1 -1
  57. package/dist/modules/access/access.routes.d.ts +8 -7
  58. package/dist/modules/access/access.routes.d.ts.map +1 -1
  59. package/dist/modules/access/access.routes.js +38 -32
  60. package/dist/modules/access/access.routes.js.map +1 -1
  61. package/dist/modules/access/admin-locked-commit.d.ts +2 -2
  62. package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
  63. package/dist/modules/access/admin-locked-commit.js +1 -1
  64. package/dist/modules/access/admin-locked-commit.js.map +1 -1
  65. package/dist/modules/access/capability-registry.js +1 -1
  66. package/dist/modules/access/capability-registry.js.map +1 -1
  67. package/dist/modules/access/change-read-gate.d.ts +2 -2
  68. package/dist/modules/access/change-read-gate.d.ts.map +1 -1
  69. package/dist/modules/access/change-read-gate.js +1 -3
  70. package/dist/modules/access/change-read-gate.js.map +1 -1
  71. package/dist/modules/access/creator-access.d.ts +2 -2
  72. package/dist/modules/access/creator-access.d.ts.map +1 -1
  73. package/dist/modules/access/creator-access.js +2 -4
  74. package/dist/modules/access/creator-access.js.map +1 -1
  75. package/dist/modules/access/directory-sync-bot.d.ts +1 -1
  76. package/dist/modules/access/directory-sync-bot.d.ts.map +1 -1
  77. package/dist/modules/access/directory-sync-bot.js +1 -1
  78. package/dist/modules/access/directory-sync-bot.js.map +1 -1
  79. package/dist/modules/access/groups-admin.routes.d.ts +2 -2
  80. package/dist/modules/access/groups-admin.routes.d.ts.map +1 -1
  81. package/dist/modules/access/groups-admin.routes.js +6 -4
  82. package/dist/modules/access/groups-admin.routes.js.map +1 -1
  83. package/dist/modules/access/groups-admin.service.d.ts +45 -14
  84. package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
  85. package/dist/modules/access/groups-admin.service.js +80 -39
  86. package/dist/modules/access/groups-admin.service.js.map +1 -1
  87. package/dist/modules/access/groups-edit.d.ts +1 -1
  88. package/dist/modules/access/groups-edit.d.ts.map +1 -1
  89. package/dist/modules/access/groups-edit.js +3 -3
  90. package/dist/modules/access/groups-edit.js.map +1 -1
  91. package/dist/modules/access/index.d.ts +17 -0
  92. package/dist/modules/access/index.d.ts.map +1 -0
  93. package/dist/modules/access/index.js +6 -0
  94. package/dist/modules/access/index.js.map +1 -0
  95. package/dist/modules/access/reference-scan.d.ts +116 -24
  96. package/dist/modules/access/reference-scan.d.ts.map +1 -1
  97. package/dist/modules/access/reference-scan.js +305 -44
  98. package/dist/modules/access/reference-scan.js.map +1 -1
  99. package/dist/modules/access/roles-admin.service.d.ts +18 -9
  100. package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
  101. package/dist/modules/access/roles-admin.service.js +32 -26
  102. package/dist/modules/access/roles-admin.service.js.map +1 -1
  103. package/dist/modules/access/roles-edit.js +1 -1
  104. package/dist/modules/access/roles-edit.js.map +1 -1
  105. package/dist/modules/access/synced-groups-committer.d.ts +2 -2
  106. package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
  107. package/dist/modules/access/synced-groups-committer.js +2 -2
  108. package/dist/modules/access/synced-groups-committer.js.map +1 -1
  109. package/dist/modules/access/synced-groups-writer.js +2 -2
  110. package/dist/modules/access/synced-groups-writer.js.map +1 -1
  111. package/dist/modules/access/user-access-removal.service.d.ts +1 -1
  112. package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
  113. package/dist/modules/access/user-access-removal.service.js +2 -5
  114. package/dist/modules/access/user-access-removal.service.js.map +1 -1
  115. package/dist/modules/access-model/access-grammar.d.ts +35 -10
  116. package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
  117. package/dist/modules/access-model/access-grammar.js +60 -20
  118. package/dist/modules/access-model/access-grammar.js.map +1 -1
  119. package/dist/modules/access-model/access-splice.d.ts +22 -18
  120. package/dist/modules/access-model/access-splice.d.ts.map +1 -1
  121. package/dist/modules/access-model/access-splice.js +20 -14
  122. package/dist/modules/access-model/access-splice.js.map +1 -1
  123. package/dist/modules/access-model/group-files.d.ts +1 -0
  124. package/dist/modules/access-model/group-files.d.ts.map +1 -1
  125. package/dist/modules/access-model/group-files.js +5 -1
  126. package/dist/modules/access-model/group-files.js.map +1 -1
  127. package/dist/modules/access-model/index.d.ts +20 -5
  128. package/dist/modules/access-model/index.d.ts.map +1 -1
  129. package/dist/modules/access-model/index.js +18 -5
  130. package/dist/modules/access-model/index.js.map +1 -1
  131. package/dist/modules/access-model/roles-yaml-guard.d.ts +1 -1
  132. package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
  133. package/dist/modules/admin/admin-access.routes.d.ts +1 -1
  134. package/dist/modules/admin/admin-access.routes.d.ts.map +1 -1
  135. package/dist/modules/admin/admin-access.routes.js +1 -1
  136. package/dist/modules/admin/admin-access.routes.js.map +1 -1
  137. package/dist/modules/admin/admin-access.service.d.ts +2 -2
  138. package/dist/modules/admin/admin-access.service.d.ts.map +1 -1
  139. package/dist/modules/admin/index.d.ts +8 -0
  140. package/dist/modules/admin/index.d.ts.map +1 -0
  141. package/dist/modules/admin/index.js +2 -0
  142. package/dist/modules/admin/index.js.map +1 -0
  143. package/dist/modules/agent-guide/agent-guide.js +1 -1
  144. package/dist/modules/agent-guide/agent-guide.js.map +1 -1
  145. package/dist/modules/agent-guide/agent-guide.tools.d.ts +3 -3
  146. package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
  147. package/dist/modules/agent-guide/agent-guide.tools.js +15 -7
  148. package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
  149. package/dist/modules/agent-guide/index.d.ts +1 -1
  150. package/dist/modules/agent-guide/index.d.ts.map +1 -1
  151. package/dist/modules/agent-guide/index.js +1 -1
  152. package/dist/modules/agent-guide/index.js.map +1 -1
  153. package/dist/modules/agent-instructions/compose.d.ts +3 -1
  154. package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
  155. package/dist/modules/agent-instructions/compose.js +3 -1
  156. package/dist/modules/agent-instructions/compose.js.map +1 -1
  157. package/dist/modules/agent-instructions/read-preamble.d.ts +1 -1
  158. package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
  159. package/dist/modules/agent-instructions/shared-file-rules.d.ts +5 -1
  160. package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
  161. package/dist/modules/agent-instructions/shared-file-rules.js +16 -1
  162. package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
  163. package/dist/modules/agent-scope/agent-scope.contract.d.ts +67 -0
  164. package/dist/modules/agent-scope/agent-scope.contract.d.ts.map +1 -0
  165. package/dist/modules/agent-scope/agent-scope.contract.js +27 -0
  166. package/dist/modules/agent-scope/agent-scope.contract.js.map +1 -0
  167. package/dist/modules/agent-scope/connection-scope.d.ts +111 -0
  168. package/dist/modules/agent-scope/connection-scope.d.ts.map +1 -0
  169. package/dist/modules/agent-scope/connection-scope.js +165 -0
  170. package/dist/modules/agent-scope/connection-scope.js.map +1 -0
  171. package/dist/modules/agent-scope/index.d.ts +3 -0
  172. package/dist/modules/agent-scope/index.d.ts.map +1 -0
  173. package/dist/modules/agent-scope/index.js +3 -0
  174. package/dist/modules/agent-scope/index.js.map +1 -0
  175. package/dist/modules/audit/agent-audit.service.d.ts +2 -2
  176. package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
  177. package/dist/modules/audit/agent-audit.service.js +3 -1
  178. package/dist/modules/audit/agent-audit.service.js.map +1 -1
  179. package/dist/modules/audit/agent-connection.routes.d.ts +1 -1
  180. package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -1
  181. package/dist/modules/audit/agent-connection.routes.js +1 -1
  182. package/dist/modules/audit/agent-connection.routes.js.map +1 -1
  183. package/dist/modules/audit/agent-rest-audit.middleware.d.ts +1 -1
  184. package/dist/modules/audit/agent-rest-audit.middleware.d.ts.map +1 -1
  185. package/dist/modules/audit/agent-rest-audit.middleware.js +1 -1
  186. package/dist/modules/audit/agent-rest-audit.middleware.js.map +1 -1
  187. package/dist/modules/audit/audit.contract.d.ts +6 -0
  188. package/dist/modules/audit/audit.contract.d.ts.map +1 -1
  189. package/dist/modules/audit/audit.contract.js.map +1 -1
  190. package/dist/modules/audit/audit.routes.d.ts +3 -3
  191. package/dist/modules/audit/audit.routes.d.ts.map +1 -1
  192. package/dist/modules/audit/audit.routes.js +2 -2
  193. package/dist/modules/audit/audit.routes.js.map +1 -1
  194. package/dist/modules/auth/account-admission.d.ts +12 -0
  195. package/dist/modules/auth/account-admission.d.ts.map +1 -1
  196. package/dist/modules/auth/account-admission.js +15 -0
  197. package/dist/modules/auth/account-admission.js.map +1 -1
  198. package/dist/modules/auth/account-erasure.service.d.ts +3 -3
  199. package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
  200. package/dist/modules/auth/account-erasure.service.js +1 -5
  201. package/dist/modules/auth/account-erasure.service.js.map +1 -1
  202. package/dist/modules/auth/account-switch-lock.d.ts +1 -1
  203. package/dist/modules/auth/account-switch-lock.d.ts.map +1 -1
  204. package/dist/modules/auth/account-switch-lock.js +1 -1
  205. package/dist/modules/auth/account-switch-lock.js.map +1 -1
  206. package/dist/modules/auth/account.routes.d.ts +2 -2
  207. package/dist/modules/auth/account.routes.d.ts.map +1 -1
  208. package/dist/modules/auth/account.routes.js +1 -1
  209. package/dist/modules/auth/account.routes.js.map +1 -1
  210. package/dist/modules/auth/auth.middleware.d.ts +27 -1
  211. package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
  212. package/dist/modules/auth/auth.middleware.js +42 -4
  213. package/dist/modules/auth/auth.middleware.js.map +1 -1
  214. package/dist/modules/auth/auth.routes.d.ts +13 -9
  215. package/dist/modules/auth/auth.routes.d.ts.map +1 -1
  216. package/dist/modules/auth/auth.routes.js +35 -29
  217. package/dist/modules/auth/auth.routes.js.map +1 -1
  218. package/dist/modules/auth/auth.service.d.ts +56 -7
  219. package/dist/modules/auth/auth.service.d.ts.map +1 -1
  220. package/dist/modules/auth/auth.service.js +131 -37
  221. package/dist/modules/auth/auth.service.js.map +1 -1
  222. package/dist/modules/auth/index.d.ts +3 -1
  223. package/dist/modules/auth/index.d.ts.map +1 -1
  224. package/dist/modules/auth/index.js +1 -1
  225. package/dist/modules/auth/index.js.map +1 -1
  226. package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
  227. package/dist/modules/auth/oidc-auth-provider.js +3 -10
  228. package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
  229. package/dist/modules/code-mode/code-mode.tool.d.ts +1 -1
  230. package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
  231. package/dist/modules/connection-probe/connection-probe.service.d.ts +2 -2
  232. package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
  233. package/dist/modules/connection-probe/connection-probe.service.js +1 -4
  234. package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
  235. package/dist/modules/database/core-schema.d.ts +175 -234
  236. package/dist/modules/database/core-schema.d.ts.map +1 -1
  237. package/dist/modules/database/core-schema.js +72 -35
  238. package/dist/modules/database/core-schema.js.map +1 -1
  239. package/dist/modules/database/index.d.ts +10 -0
  240. package/dist/modules/database/index.d.ts.map +1 -0
  241. package/dist/modules/database/index.js +4 -0
  242. package/dist/modules/database/index.js.map +1 -0
  243. package/dist/modules/database/migrate.d.ts.map +1 -1
  244. package/dist/modules/database/migrate.js +78 -3
  245. package/dist/modules/database/migrate.js.map +1 -1
  246. package/dist/modules/declared-variables/declared-variables.routes.d.ts +10 -3
  247. package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
  248. package/dist/modules/declared-variables/declared-variables.routes.js +13 -2
  249. package/dist/modules/declared-variables/declared-variables.routes.js.map +1 -1
  250. package/dist/modules/diff/diff.routes.d.ts +3 -3
  251. package/dist/modules/diff/diff.routes.d.ts.map +1 -1
  252. package/dist/modules/diff/diff.routes.js +3 -3
  253. package/dist/modules/diff/diff.routes.js.map +1 -1
  254. package/dist/modules/diff/diff.service.d.ts +2 -2
  255. package/dist/modules/diff/diff.service.d.ts.map +1 -1
  256. package/dist/modules/diff/index.d.ts +7 -0
  257. package/dist/modules/diff/index.d.ts.map +1 -0
  258. package/dist/modules/diff/index.js +2 -0
  259. package/dist/modules/diff/index.js.map +1 -0
  260. package/dist/modules/embed/account-link.service.d.ts +1 -1
  261. package/dist/modules/embed/account-link.service.d.ts.map +1 -1
  262. package/dist/modules/embed/account-link.service.js +1 -1
  263. package/dist/modules/embed/account-link.service.js.map +1 -1
  264. package/dist/modules/embed/embed.routes.d.ts +1 -1
  265. package/dist/modules/embed/embed.routes.d.ts.map +1 -1
  266. package/dist/modules/embed/embed.routes.js +2 -2
  267. package/dist/modules/embed/embed.routes.js.map +1 -1
  268. package/dist/modules/embed/embed.service.d.ts +1 -1
  269. package/dist/modules/embed/embed.service.d.ts.map +1 -1
  270. package/dist/modules/embed/embed.tools.d.ts +4 -4
  271. package/dist/modules/embed/embed.tools.d.ts.map +1 -1
  272. package/dist/modules/embed/embed.tools.js +8 -5
  273. package/dist/modules/embed/embed.tools.js.map +1 -1
  274. package/dist/modules/github-app/github-app.connection.d.ts +1 -1
  275. package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
  276. package/dist/modules/github-app/github-app.routes.d.ts +3 -3
  277. package/dist/modules/github-app/github-app.routes.d.ts.map +1 -1
  278. package/dist/modules/github-app/github-app.routes.js +1 -1
  279. package/dist/modules/github-app/github-app.routes.js.map +1 -1
  280. package/dist/modules/kb-fs/index.d.ts +12 -0
  281. package/dist/modules/kb-fs/index.d.ts.map +1 -1
  282. package/dist/modules/kb-fs/index.js +11 -0
  283. package/dist/modules/kb-fs/index.js.map +1 -1
  284. package/dist/modules/kb-fs/locking-filesystem.d.ts +1 -1
  285. package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
  286. package/dist/modules/kb-fs/locking-filesystem.js +7 -1
  287. package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
  288. package/dist/modules/kb-fs/repo-path.d.ts +26 -6
  289. package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
  290. package/dist/modules/kb-fs/repo-path.js +22 -7
  291. package/dist/modules/kb-fs/repo-path.js.map +1 -1
  292. package/dist/modules/kb-fs/tmp-ref.d.ts +36 -0
  293. package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -0
  294. package/dist/modules/kb-fs/tmp-ref.js +76 -0
  295. package/dist/modules/kb-fs/tmp-ref.js.map +1 -0
  296. package/dist/modules/kb-sync/kb-sync.routes.d.ts +1 -1
  297. package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -1
  298. package/dist/modules/kb-sync/kb-sync.routes.js +2 -2
  299. package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -1
  300. package/dist/modules/kb-sync/kb-sync.service.js +1 -1
  301. package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
  302. package/dist/modules/kb-sync/sync-auth.js +1 -1
  303. package/dist/modules/kb-sync/sync-auth.js.map +1 -1
  304. package/dist/modules/kb-sync/sync-payload.js +1 -1
  305. package/dist/modules/kb-sync/sync-payload.js.map +1 -1
  306. package/dist/modules/marketplace/git-http.routes.d.ts +1 -1
  307. package/dist/modules/marketplace/git-http.routes.d.ts.map +1 -1
  308. package/dist/modules/marketplace/git-http.routes.js +1 -1
  309. package/dist/modules/marketplace/git-http.routes.js.map +1 -1
  310. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts +1 -1
  311. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts.map +1 -1
  312. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js +1 -1
  313. package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js.map +1 -1
  314. package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts +1 -1
  315. package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts.map +1 -1
  316. package/dist/modules/marketplace/github-facade/github-facade-codes.store.js +1 -1
  317. package/dist/modules/marketplace/github-facade/github-facade-codes.store.js.map +1 -1
  318. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts +1 -1
  319. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts.map +1 -1
  320. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js +1 -1
  321. package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js.map +1 -1
  322. package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts +2 -2
  323. package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts.map +1 -1
  324. package/dist/modules/marketplace/github-facade/github-facade.routes.js +2 -2
  325. package/dist/modules/marketplace/github-facade/github-facade.routes.js.map +1 -1
  326. package/dist/modules/marketplace/github-facade/github-facade.service.d.ts +2 -2
  327. package/dist/modules/marketplace/github-facade/github-facade.service.d.ts.map +1 -1
  328. package/dist/modules/marketplace/github-facade/github-facade.service.js +1 -1
  329. package/dist/modules/marketplace/github-facade/github-facade.service.js.map +1 -1
  330. package/dist/modules/marketplace/marketplace-repo.service.d.ts +1 -1
  331. package/dist/modules/marketplace/marketplace-repo.service.d.ts.map +1 -1
  332. package/dist/modules/marketplace/marketplace-repo.service.js +1 -1
  333. package/dist/modules/mcp/index.d.ts +8 -0
  334. package/dist/modules/mcp/index.d.ts.map +1 -0
  335. package/dist/modules/mcp/index.js +7 -0
  336. package/dist/modules/mcp/index.js.map +1 -0
  337. package/dist/modules/mcp/mcp-auth.middleware.d.ts +11 -5
  338. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
  339. package/dist/modules/mcp/mcp-auth.middleware.js +18 -5
  340. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
  341. package/dist/modules/mcp/mcp.routes.d.ts +9 -5
  342. package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
  343. package/dist/modules/mcp/mcp.routes.js +41 -6
  344. package/dist/modules/mcp/mcp.routes.js.map +1 -1
  345. package/dist/modules/mcp/mcp.service.d.ts +25 -4
  346. package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
  347. package/dist/modules/mcp/mcp.service.js +84 -19
  348. package/dist/modules/mcp/mcp.service.js.map +1 -1
  349. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +25 -2
  350. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
  351. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +46 -11
  352. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
  353. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +10 -1
  354. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
  355. package/dist/modules/mcp/oauth/oauth-consent.routes.js +35 -2
  356. package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
  357. package/dist/modules/onboarding/onboarding.routes.d.ts +1 -1
  358. package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -1
  359. package/dist/modules/onboarding/onboarding.routes.js +1 -1
  360. package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
  361. package/dist/modules/onboarding/starter-pack.service.d.ts +4 -5
  362. package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
  363. package/dist/modules/onboarding/starter-pack.service.js +2 -2
  364. package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
  365. package/dist/modules/plugins/compile/compile-marketplace.d.ts +1 -1
  366. package/dist/modules/plugins/compile/compile-marketplace.d.ts.map +1 -1
  367. package/dist/modules/plugins/compile/compile-marketplace.js +1 -1
  368. package/dist/modules/plugins/compile/compile-marketplace.js.map +1 -1
  369. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +3 -3
  370. package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
  371. package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts +1 -1
  372. package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts.map +1 -1
  373. package/dist/modules/plugins/discovery/bundle-dialect/registry.js +1 -1
  374. package/dist/modules/plugins/discovery/bundle-dialect/registry.js.map +1 -1
  375. package/dist/modules/plugins/index.d.ts +2 -1
  376. package/dist/modules/plugins/index.d.ts.map +1 -1
  377. package/dist/modules/plugins/index.js +2 -0
  378. package/dist/modules/plugins/index.js.map +1 -1
  379. package/dist/modules/plugins/join-proposals.d.ts +2 -2
  380. package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
  381. package/dist/modules/plugins/join-proposals.js +1 -1
  382. package/dist/modules/plugins/join-proposals.js.map +1 -1
  383. package/dist/modules/plugins/join-request-jobs.service.d.ts +1 -1
  384. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  385. package/dist/modules/plugins/join-request-jobs.service.js +2 -2
  386. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  387. package/dist/modules/plugins/join-request-records.store.d.ts +1 -1
  388. package/dist/modules/plugins/join-request-records.store.d.ts.map +1 -1
  389. package/dist/modules/plugins/join-request-records.store.js +1 -1
  390. package/dist/modules/plugins/join-request-records.store.js.map +1 -1
  391. package/dist/modules/plugins/join-requests.service.d.ts +3 -3
  392. package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
  393. package/dist/modules/plugins/join-requests.service.js +1 -1
  394. package/dist/modules/plugins/join-requests.service.js.map +1 -1
  395. package/dist/modules/plugins/plugin-links.d.ts +21 -5
  396. package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
  397. package/dist/modules/plugins/plugin-links.js +1 -1
  398. package/dist/modules/plugins/plugin-links.js.map +1 -1
  399. package/dist/modules/plugins/plugin-links.service.d.ts +8 -5
  400. package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
  401. package/dist/modules/plugins/plugin-links.service.js +8 -6
  402. package/dist/modules/plugins/plugin-links.service.js.map +1 -1
  403. package/dist/modules/plugins/plugin-provision.service.d.ts +2 -2
  404. package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
  405. package/dist/modules/plugins/plugin-provision.service.js +2 -3
  406. package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
  407. package/dist/modules/plugins/plugin-rename.service.d.ts +2 -2
  408. package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
  409. package/dist/modules/plugins/plugin-rename.service.js +1 -1
  410. package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
  411. package/dist/modules/plugins/plugins.contract.d.ts +1 -1
  412. package/dist/modules/plugins/plugins.contract.d.ts.map +1 -1
  413. package/dist/modules/plugins/plugins.routes.d.ts +7 -3
  414. package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
  415. package/dist/modules/plugins/plugins.routes.js +35 -8
  416. package/dist/modules/plugins/plugins.routes.js.map +1 -1
  417. package/dist/modules/plugins/plugins.service.d.ts +4 -4
  418. package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
  419. package/dist/modules/plugins/plugins.service.js +1 -1
  420. package/dist/modules/plugins/plugins.service.js.map +1 -1
  421. package/dist/modules/plugins/plugins.tools.d.ts +1 -1
  422. package/dist/modules/plugins/plugins.tools.d.ts.map +1 -1
  423. package/dist/modules/plugins/plugins.tools.js +3 -3
  424. package/dist/modules/plugins/plugins.tools.js.map +1 -1
  425. package/dist/modules/plugins/teams.routes.d.ts +3 -3
  426. package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
  427. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +1 -1
  428. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
  429. package/dist/modules/secrets-vault/db-secrets-vault.service.js +1 -1
  430. package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
  431. package/dist/modules/secrets-vault/index.d.ts +1 -0
  432. package/dist/modules/secrets-vault/index.d.ts.map +1 -1
  433. package/dist/modules/secrets-vault/index.js +2 -0
  434. package/dist/modules/secrets-vault/index.js.map +1 -1
  435. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +13 -4
  436. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
  437. package/dist/modules/secrets-vault/secrets-vault.routes.js +16 -4
  438. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
  439. package/dist/modules/settings/connection-check.js +1 -1
  440. package/dist/modules/settings/connection-check.js.map +1 -1
  441. package/dist/modules/settings/deployment-settings.service.d.ts +7 -1
  442. package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
  443. package/dist/modules/settings/deployment-settings.service.js +45 -3
  444. package/dist/modules/settings/deployment-settings.service.js.map +1 -1
  445. package/dist/modules/settings/git-root-folders.js +1 -1
  446. package/dist/modules/settings/git-root-folders.js.map +1 -1
  447. package/dist/modules/settings/index.d.ts +13 -0
  448. package/dist/modules/settings/index.d.ts.map +1 -0
  449. package/dist/modules/settings/index.js +3 -0
  450. package/dist/modules/settings/index.js.map +1 -0
  451. package/dist/modules/settings/setup.routes.d.ts +3 -3
  452. package/dist/modules/settings/setup.routes.d.ts.map +1 -1
  453. package/dist/modules/settings/setup.routes.js +2 -2
  454. package/dist/modules/settings/setup.routes.js.map +1 -1
  455. package/dist/modules/skills/allowed-tools-check.d.ts +2 -2
  456. package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
  457. package/dist/modules/skills/allowed-tools-check.js +1 -1
  458. package/dist/modules/skills/allowed-tools-check.js.map +1 -1
  459. package/dist/modules/skills/index.d.ts +4 -3
  460. package/dist/modules/skills/index.d.ts.map +1 -1
  461. package/dist/modules/skills/index.js +0 -2
  462. package/dist/modules/skills/index.js.map +1 -1
  463. package/dist/modules/skills/pending-skills.service.d.ts +3 -3
  464. package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
  465. package/dist/modules/skills/pending-skills.service.js.map +1 -1
  466. package/dist/modules/skills/skill-access-requests.routes.d.ts +5 -5
  467. package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
  468. package/dist/modules/skills/skill-access-requests.routes.js +6 -13
  469. package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
  470. package/dist/modules/skills/skills.contract.d.ts +16 -0
  471. package/dist/modules/skills/skills.contract.d.ts.map +1 -1
  472. package/dist/modules/skills/skills.routes.d.ts +1 -1
  473. package/dist/modules/skills/skills.routes.d.ts.map +1 -1
  474. package/dist/modules/skills/skills.routes.js +1 -1
  475. package/dist/modules/skills/skills.routes.js.map +1 -1
  476. package/dist/modules/skills/skills.service.d.ts +2 -2
  477. package/dist/modules/skills/skills.service.d.ts.map +1 -1
  478. package/dist/modules/skills/skills.service.js +6 -1
  479. package/dist/modules/skills/skills.service.js.map +1 -1
  480. package/dist/modules/skills/skills.tools.d.ts +3 -3
  481. package/dist/modules/skills/skills.tools.d.ts.map +1 -1
  482. package/dist/modules/skills/skills.tools.js +27 -19
  483. package/dist/modules/skills/skills.tools.js.map +1 -1
  484. package/dist/modules/tool-auth/connection-key-rejection.js +1 -1
  485. package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
  486. package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts +2 -2
  487. package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts.map +1 -1
  488. package/dist/modules/tool-auth/connection-keys-admin.routes.js +1 -1
  489. package/dist/modules/tool-auth/connection-keys-admin.routes.js.map +1 -1
  490. package/dist/modules/tool-auth/external-api-key.interface.d.ts +11 -0
  491. package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
  492. package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
  493. package/dist/modules/tool-auth/external-api-key.service.d.ts +2 -1
  494. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
  495. package/dist/modules/tool-auth/external-api-key.service.js +5 -2
  496. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
  497. package/dist/modules/tool-auth/index.d.ts +15 -0
  498. package/dist/modules/tool-auth/index.d.ts.map +1 -0
  499. package/dist/modules/tool-auth/index.js +11 -0
  500. package/dist/modules/tool-auth/index.js.map +1 -0
  501. package/dist/modules/tool-auth/internal-token.service.d.ts +9 -0
  502. package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
  503. package/dist/modules/tool-auth/internal-token.service.js +1 -0
  504. package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
  505. package/dist/modules/tool-auth/tool-auth.middleware.d.ts +29 -5
  506. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
  507. package/dist/modules/tool-auth/tool-auth.middleware.js +33 -7
  508. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
  509. package/dist/modules/tool-helpers/default-branch-write.d.ts +1 -1
  510. package/dist/modules/tool-helpers/default-branch-write.d.ts.map +1 -1
  511. package/dist/modules/tool-helpers/index.d.ts +4 -1
  512. package/dist/modules/tool-helpers/index.d.ts.map +1 -1
  513. package/dist/modules/tool-helpers/index.js +3 -0
  514. package/dist/modules/tool-helpers/index.js.map +1 -1
  515. package/dist/modules/tool-helpers/route-argument-check.js +1 -1
  516. package/dist/modules/tool-helpers/route-argument-check.js.map +1 -1
  517. package/dist/modules/tool-helpers/route-tool-schemas.d.ts +1 -1
  518. package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -1
  519. package/dist/modules/tool-helpers/tool-context.d.ts +12 -6
  520. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
  521. package/dist/modules/tool-helpers/tool-context.js +5 -3
  522. package/dist/modules/tool-helpers/tool-context.js.map +1 -1
  523. package/dist/modules/tool-helpers/tool-def.d.ts +4 -2
  524. package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
  525. package/dist/modules/tool-helpers/tool-def.js +3 -1
  526. package/dist/modules/tool-helpers/tool-def.js.map +1 -1
  527. package/dist/modules/tool-helpers/tool-handler.d.ts +17 -2
  528. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
  529. package/dist/modules/tool-helpers/tool-handler.js +21 -2
  530. package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
  531. package/dist/modules/tool-helpers/tool.contract.d.ts +12 -2
  532. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
  533. package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
  534. package/dist/modules/tool-helpers/validate-token.d.ts +3 -2
  535. package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -1
  536. package/dist/modules/tool-helpers/validate-token.js +2 -2
  537. package/dist/modules/tool-helpers/validate-token.js.map +1 -1
  538. package/dist/modules/tool-manuals/index.d.ts +8 -3
  539. package/dist/modules/tool-manuals/index.d.ts.map +1 -1
  540. package/dist/modules/tool-manuals/index.js +4 -2
  541. package/dist/modules/tool-manuals/index.js.map +1 -1
  542. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +2 -2
  543. package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
  544. package/dist/modules/tool-manuals/pending-tools.service.d.ts +2 -2
  545. package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
  546. package/dist/modules/tool-manuals/tool-delete.service.d.ts +5 -6
  547. package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
  548. package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
  549. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +19 -6
  550. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
  551. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +12 -6
  552. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
  553. package/dist/modules/tool-manuals/tool-manuals.routes.js +43 -6
  554. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
  555. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +16 -9
  556. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
  557. package/dist/modules/tool-manuals/tool-manuals.service.js +23 -15
  558. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
  559. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -3
  560. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
  561. package/dist/modules/tool-manuals/tool-manuals.tools.js +26 -12
  562. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
  563. package/dist/modules/tool-registry/description-length.js +2 -2
  564. package/dist/modules/tool-registry/description-length.js.map +1 -1
  565. package/dist/modules/tool-registry/index.d.ts +8 -0
  566. package/dist/modules/tool-registry/index.d.ts.map +1 -0
  567. package/dist/modules/tool-registry/index.js +8 -0
  568. package/dist/modules/tool-registry/index.js.map +1 -0
  569. package/dist/modules/tool-registry/manual.routes.d.ts +44 -2
  570. package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -1
  571. package/dist/modules/tool-registry/manual.routes.js +38 -11
  572. package/dist/modules/tool-registry/manual.routes.js.map +1 -1
  573. package/dist/modules/tool-registry/read-only-hints.contract.d.ts +52 -0
  574. package/dist/modules/tool-registry/read-only-hints.contract.d.ts.map +1 -0
  575. package/dist/modules/tool-registry/read-only-hints.contract.js +2 -0
  576. package/dist/modules/tool-registry/read-only-hints.contract.js.map +1 -0
  577. package/dist/modules/tool-registry/read-only-hints.d.ts +89 -0
  578. package/dist/modules/tool-registry/read-only-hints.d.ts.map +1 -0
  579. package/dist/modules/tool-registry/read-only-hints.js +212 -0
  580. package/dist/modules/tool-registry/read-only-hints.js.map +1 -0
  581. package/dist/modules/tool-registry/tool.contract.d.ts +15 -0
  582. package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -1
  583. package/dist/modules/tool-registry/tool.contract.js +10 -1
  584. package/dist/modules/tool-registry/tool.contract.js.map +1 -1
  585. package/dist/modules/update-check/update-check.routes.d.ts +2 -2
  586. package/dist/modules/update-check/update-check.routes.d.ts.map +1 -1
  587. package/dist/modules/update-check/update-check.routes.js +1 -1
  588. package/dist/modules/update-check/update-check.routes.js.map +1 -1
  589. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts +9 -104
  590. package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +1 -1
  591. package/dist/modules/workflow/agent-tools/change-request-read-shape.js +8 -118
  592. package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +1 -1
  593. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +16 -17
  594. package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -1
  595. package/dist/modules/workflow/agent-tools/change-request-read.tools.js +19 -86
  596. package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -1
  597. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +5 -1
  598. package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
  599. package/dist/modules/workflow/agent-tools/change-request-summary.js +10 -1
  600. package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -1
  601. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +7 -5
  602. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
  603. package/dist/modules/workflow/agent-tools/workflow.tools.js +60 -77
  604. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
  605. package/dist/modules/workflow/change-request-hooks.d.ts +1 -1
  606. package/dist/modules/workflow/event-bus.d.ts.map +1 -1
  607. package/dist/modules/workflow/event-bus.js +3 -1
  608. package/dist/modules/workflow/event-bus.js.map +1 -1
  609. package/dist/modules/workflow/events-delivery.d.ts +120 -0
  610. package/dist/modules/workflow/events-delivery.d.ts.map +1 -0
  611. package/dist/modules/workflow/events-delivery.js +202 -0
  612. package/dist/modules/workflow/events-delivery.js.map +1 -0
  613. package/dist/modules/workflow/events.routes.d.ts +16 -7
  614. package/dist/modules/workflow/events.routes.d.ts.map +1 -1
  615. package/dist/modules/workflow/events.routes.js +23 -4
  616. package/dist/modules/workflow/events.routes.js.map +1 -1
  617. package/dist/modules/workflow/file-lock.service.d.ts +1 -1
  618. package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
  619. package/dist/modules/workflow/file-lock.service.js +1 -1
  620. package/dist/modules/workflow/file-lock.service.js.map +1 -1
  621. package/dist/modules/workflow/git/git.service.d.ts +4 -4
  622. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  623. package/dist/modules/workflow/git/git.service.js +23 -41
  624. package/dist/modules/workflow/git/git.service.js.map +1 -1
  625. package/dist/modules/workflow/git/node-git-runner.js +1 -1
  626. package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
  627. package/dist/modules/workflow/git/pull-request.service.d.ts +6 -7
  628. package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
  629. package/dist/modules/workflow/git/pull-request.service.js +40 -33
  630. package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
  631. package/dist/modules/workflow/index.d.ts +14 -2
  632. package/dist/modules/workflow/index.d.ts.map +1 -1
  633. package/dist/modules/workflow/index.js +11 -2
  634. package/dist/modules/workflow/index.js.map +1 -1
  635. package/dist/modules/workflow/pending-commits.service.d.ts +1 -1
  636. package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
  637. package/dist/modules/workflow/pending-commits.service.js +1 -1
  638. package/dist/modules/workflow/pending-commits.service.js.map +1 -1
  639. package/dist/modules/workflow/read-on-branch.d.ts +1 -1
  640. package/dist/modules/workflow/read-on-branch.d.ts.map +1 -1
  641. package/dist/modules/workflow/recovery-bot.d.ts +1 -1
  642. package/dist/modules/workflow/recovery-bot.d.ts.map +1 -1
  643. package/dist/modules/workflow/recovery-bot.js +1 -1
  644. package/dist/modules/workflow/recovery-bot.js.map +1 -1
  645. package/dist/modules/workflow/review-workflow/approval-lock.d.ts +1 -1
  646. package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +1 -1
  647. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts +4 -20
  648. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +1 -1
  649. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +4 -8
  650. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
  651. package/dist/modules/workflow/review-workflow/review-workflow.service.js +3 -138
  652. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
  653. package/dist/modules/workflow/workflow.routes.d.ts +5 -5
  654. package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
  655. package/dist/modules/workflow/workflow.routes.js +42 -94
  656. package/dist/modules/workflow/workflow.routes.js.map +1 -1
  657. package/dist/modules/workflow/workflow.service.d.ts +41 -50
  658. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  659. package/dist/modules/workflow/workflow.service.js +221 -154
  660. package/dist/modules/workflow/workflow.service.js.map +1 -1
  661. package/dist/modules/workspace/agent-access.gate.d.ts +3 -3
  662. package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
  663. package/dist/modules/workspace/agent-download.builder.d.ts +1 -1
  664. package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -1
  665. package/dist/modules/workspace/agent-download.builder.js +1 -1
  666. package/dist/modules/workspace/agent-download.builder.js.map +1 -1
  667. package/dist/modules/workspace/agent-upload.routes.d.ts.map +1 -1
  668. package/dist/modules/workspace/agent-upload.routes.js +19 -0
  669. package/dist/modules/workspace/agent-upload.routes.js.map +1 -1
  670. package/dist/modules/workspace/agent-upload.store.d.ts +11 -0
  671. package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
  672. package/dist/modules/workspace/agent-upload.store.js +18 -0
  673. package/dist/modules/workspace/agent-upload.store.js.map +1 -1
  674. package/dist/modules/workspace/file-readers/doc-extract.service.d.ts +82 -14
  675. package/dist/modules/workspace/file-readers/doc-extract.service.d.ts.map +1 -1
  676. package/dist/modules/workspace/file-readers/doc-extract.service.js +109 -36
  677. package/dist/modules/workspace/file-readers/doc-extract.service.js.map +1 -1
  678. package/dist/modules/workspace/file-readers/doc-extract.types.d.ts +9 -2
  679. package/dist/modules/workspace/file-readers/doc-extract.types.d.ts.map +1 -1
  680. package/dist/modules/workspace/file-readers/doc-extract.types.js.map +1 -1
  681. package/dist/modules/workspace/file-readers/document-extractor.contract.d.ts +41 -0
  682. package/dist/modules/workspace/file-readers/document-extractor.contract.d.ts.map +1 -0
  683. package/dist/modules/workspace/file-readers/document-extractor.contract.js +5 -0
  684. package/dist/modules/workspace/file-readers/document-extractor.contract.js.map +1 -0
  685. package/dist/modules/workspace/file-readers/document-extractors.d.ts +9 -0
  686. package/dist/modules/workspace/file-readers/document-extractors.d.ts.map +1 -0
  687. package/dist/modules/workspace/file-readers/document-extractors.js +26 -0
  688. package/dist/modules/workspace/file-readers/document-extractors.js.map +1 -0
  689. package/dist/modules/workspace/file-readers/document-formats.d.ts +12 -0
  690. package/dist/modules/workspace/file-readers/document-formats.d.ts.map +1 -0
  691. package/dist/modules/workspace/file-readers/document-formats.js +11 -0
  692. package/dist/modules/workspace/file-readers/document-formats.js.map +1 -0
  693. package/dist/modules/workspace/file-readers/document-reader.d.ts +21 -17
  694. package/dist/modules/workspace/file-readers/document-reader.d.ts.map +1 -1
  695. package/dist/modules/workspace/file-readers/document-reader.js +38 -34
  696. package/dist/modules/workspace/file-readers/document-reader.js.map +1 -1
  697. package/dist/modules/workspace/file-readers/extract-in-worker.d.ts +60 -0
  698. package/dist/modules/workspace/file-readers/extract-in-worker.d.ts.map +1 -0
  699. package/dist/modules/workspace/file-readers/extract-in-worker.js +140 -0
  700. package/dist/modules/workspace/file-readers/extract-in-worker.js.map +1 -0
  701. package/dist/modules/workspace/file-readers/extract-pdf.d.ts +2 -0
  702. package/dist/modules/workspace/file-readers/extract-pdf.d.ts.map +1 -1
  703. package/dist/modules/workspace/file-readers/extract-pdf.js +20 -3
  704. package/dist/modules/workspace/file-readers/extract-pdf.js.map +1 -1
  705. package/dist/modules/workspace/file-readers/extract.worker.d.ts +2 -0
  706. package/dist/modules/workspace/file-readers/extract.worker.d.ts.map +1 -0
  707. package/dist/modules/workspace/file-readers/extract.worker.js +5 -0
  708. package/dist/modules/workspace/file-readers/extract.worker.js.map +1 -0
  709. package/dist/modules/workspace/file-readers/extraction-cache.d.ts +21 -5
  710. package/dist/modules/workspace/file-readers/extraction-cache.d.ts.map +1 -1
  711. package/dist/modules/workspace/file-readers/extraction-cache.js +24 -10
  712. package/dist/modules/workspace/file-readers/extraction-cache.js.map +1 -1
  713. package/dist/modules/workspace/file-readers/extraction-worker.d.ts +42 -0
  714. package/dist/modules/workspace/file-readers/extraction-worker.d.ts.map +1 -0
  715. package/dist/modules/workspace/file-readers/extraction-worker.js +69 -0
  716. package/dist/modules/workspace/file-readers/extraction-worker.js.map +1 -0
  717. package/dist/modules/workspace/file-readers/file-reader.d.ts +13 -4
  718. package/dist/modules/workspace/file-readers/file-reader.d.ts.map +1 -1
  719. package/dist/modules/workspace/file-readers/file-reader.js.map +1 -1
  720. package/dist/modules/workspace/file-readers/file-reader.registry.d.ts +3 -2
  721. package/dist/modules/workspace/file-readers/file-reader.registry.d.ts.map +1 -1
  722. package/dist/modules/workspace/file-readers/file-reader.registry.js +6 -20
  723. package/dist/modules/workspace/file-readers/file-reader.registry.js.map +1 -1
  724. package/dist/modules/workspace/first-run.js +1 -1
  725. package/dist/modules/workspace/first-run.js.map +1 -1
  726. package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
  727. package/dist/modules/workspace/git-internals.middleware.d.ts.map +1 -1
  728. package/dist/modules/workspace/git-internals.middleware.js +1 -1
  729. package/dist/modules/workspace/git-internals.middleware.js.map +1 -1
  730. package/dist/modules/workspace/index.d.ts +24 -0
  731. package/dist/modules/workspace/index.d.ts.map +1 -1
  732. package/dist/modules/workspace/index.js +21 -0
  733. package/dist/modules/workspace/index.js.map +1 -1
  734. package/dist/modules/workspace/kb-repository.d.ts.map +1 -1
  735. package/dist/modules/workspace/kb-repository.js +1 -1
  736. package/dist/modules/workspace/kb-repository.js.map +1 -1
  737. package/dist/modules/workspace/not-found.d.ts +1 -1
  738. package/dist/modules/workspace/not-found.d.ts.map +1 -1
  739. package/dist/modules/workspace/not-found.js +1 -1
  740. package/dist/modules/workspace/not-found.js.map +1 -1
  741. package/dist/modules/workspace/nul-scan.d.ts +19 -0
  742. package/dist/modules/workspace/nul-scan.d.ts.map +1 -0
  743. package/dist/modules/workspace/nul-scan.js +55 -0
  744. package/dist/modules/workspace/nul-scan.js.map +1 -0
  745. package/dist/modules/workspace/pattern-matcher.contract.d.ts +111 -28
  746. package/dist/modules/workspace/pattern-matcher.contract.d.ts.map +1 -1
  747. package/dist/modules/workspace/pattern-matcher.contract.js +31 -14
  748. package/dist/modules/workspace/pattern-matcher.contract.js.map +1 -1
  749. package/dist/modules/workspace/ripgrep-search.d.ts +54 -0
  750. package/dist/modules/workspace/ripgrep-search.d.ts.map +1 -0
  751. package/dist/modules/workspace/ripgrep-search.js +657 -0
  752. package/dist/modules/workspace/ripgrep-search.js.map +1 -0
  753. package/dist/modules/workspace/ripgrep-version.d.ts +15 -0
  754. package/dist/modules/workspace/ripgrep-version.d.ts.map +1 -0
  755. package/dist/modules/workspace/ripgrep-version.js +31 -0
  756. package/dist/modules/workspace/ripgrep-version.js.map +1 -0
  757. package/dist/modules/workspace/routine-write-policy.js +1 -1
  758. package/dist/modules/workspace/routine-write-policy.js.map +1 -1
  759. package/dist/modules/workspace/startup/beside-checkout.d.ts +8 -5
  760. package/dist/modules/workspace/startup/beside-checkout.d.ts.map +1 -1
  761. package/dist/modules/workspace/startup/beside-checkout.js +14 -5
  762. package/dist/modules/workspace/startup/beside-checkout.js.map +1 -1
  763. package/dist/modules/workspace/startup/kb-git.js +1 -1
  764. package/dist/modules/workspace/startup/kb-git.js.map +1 -1
  765. package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
  766. package/dist/modules/workspace/startup/kb-startup-runner.js +1 -2
  767. package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
  768. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +2 -2
  769. package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
  770. package/dist/modules/workspace/startup/steps/personal-spaces.step.js +2 -2
  771. package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
  772. package/dist/modules/workspace/startup/steps/plugin-layout.js +1 -1
  773. package/dist/modules/workspace/startup/steps/plugin-layout.js.map +1 -1
  774. package/dist/modules/workspace/startup/steps/roles-yaml.step.js +1 -1
  775. package/dist/modules/workspace/startup/steps/roles-yaml.step.js.map +1 -1
  776. package/dist/modules/workspace/startup/steps/seed-tree.js +2 -2
  777. package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
  778. package/dist/modules/workspace/startup/steps/template-files.step.d.ts +1 -1
  779. package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
  780. package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
  781. package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
  782. package/dist/modules/workspace/startup/steps/template-source.js +2 -2
  783. package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
  784. package/dist/modules/workspace/worker-pool.d.ts +99 -0
  785. package/dist/modules/workspace/worker-pool.d.ts.map +1 -0
  786. package/dist/modules/workspace/worker-pool.js +156 -0
  787. package/dist/modules/workspace/worker-pool.js.map +1 -0
  788. package/dist/modules/workspace/workspace-tmp.d.ts +146 -0
  789. package/dist/modules/workspace/workspace-tmp.d.ts.map +1 -0
  790. package/dist/modules/workspace/workspace-tmp.js +435 -0
  791. package/dist/modules/workspace/workspace-tmp.js.map +1 -0
  792. package/dist/modules/workspace/workspace.routes.d.ts +7 -8
  793. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
  794. package/dist/modules/workspace/workspace.routes.js +9 -32
  795. package/dist/modules/workspace/workspace.routes.js.map +1 -1
  796. package/dist/modules/workspace/workspace.service.d.ts +48 -7
  797. package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
  798. package/dist/modules/workspace/workspace.service.js +89 -12
  799. package/dist/modules/workspace/workspace.service.js.map +1 -1
  800. package/dist/modules/workspace/workspace.tools.d.ts +7 -7
  801. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  802. package/dist/modules/workspace/workspace.tools.js +502 -140
  803. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  804. package/dist/modules/workspace/write-denial.d.ts +4 -4
  805. package/dist/modules/workspace/write-denial.d.ts.map +1 -1
  806. package/dist/modules/workspace/write-denial.js +2 -3
  807. package/dist/modules/workspace/write-denial.js.map +1 -1
  808. package/dist/modules/write-access/index.d.ts +8 -0
  809. package/dist/modules/write-access/index.d.ts.map +1 -0
  810. package/dist/modules/write-access/index.js +7 -0
  811. package/dist/modules/write-access/index.js.map +1 -0
  812. package/dist/shared/path-order.d.ts +28 -8
  813. package/dist/shared/path-order.d.ts.map +1 -1
  814. package/dist/shared/path-order.js +37 -8
  815. package/dist/shared/path-order.js.map +1 -1
  816. package/migrations/0020_change_request_body_is_the_description.sql +20 -0
  817. package/migrations/0021_data_migrations_ledger.sql +11 -0
  818. package/migrations/0022_session_version.sql +6 -0
  819. package/migrations/0023_agent_path.sql +3 -0
  820. package/migrations/meta/0020_snapshot.json +2321 -0
  821. package/migrations/meta/0021_snapshot.json +2353 -0
  822. package/migrations/meta/0022_snapshot.json +2360 -0
  823. package/migrations/meta/0023_snapshot.json +2378 -0
  824. package/migrations/meta/_journal.json +28 -0
  825. package/package.json +3 -3
  826. package/src/__tests__/pg-scratch.test.ts +69 -0
  827. package/src/__tests__/pg-scratch.ts +31 -0
  828. package/src/__tests__/slow-ripgrep.ts +65 -0
  829. package/src/core/__tests__/boot-without-ripgrep.test.ts +34 -0
  830. package/src/core/__tests__/catalog-revision.test.ts +89 -0
  831. package/src/core/__tests__/damaged-document.tools.test.ts +374 -0
  832. package/src/core/__tests__/gated-boot.test.ts +8 -1
  833. package/src/core/__tests__/lifecycle.test.ts +46 -13
  834. package/src/core/__tests__/public-config.test.ts +5 -0
  835. package/src/core/catalog-revision.ts +24 -2
  836. package/src/core/core-ports.ts +42 -0
  837. package/src/core/create-core-server.ts +45 -3
  838. package/src/core/create-core-services.ts +81 -17
  839. package/src/core/lifecycle.ts +36 -2
  840. package/src/core/public-config.ts +10 -0
  841. package/src/index.ts +1 -1
  842. package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +12 -0
  843. package/src/modules/access/__tests__/access-control.colliding-name-cases.test.ts +113 -0
  844. package/src/modules/access/__tests__/access-control.frontmatter-head.test.ts +117 -0
  845. package/src/modules/access/__tests__/access-control.group-named-admin.test.ts +122 -0
  846. package/src/modules/access/__tests__/access-control.preview-relocation.test.ts +50 -0
  847. package/src/modules/access/__tests__/access-declarations.test.ts +19 -0
  848. package/src/modules/access/__tests__/access-groups.test.ts +55 -22
  849. package/src/modules/access/__tests__/access-mutation.service.test.ts +85 -59
  850. package/src/modules/access/__tests__/access-requests.routes.test.ts +29 -15
  851. package/src/modules/access/__tests__/access-restrict-here.test.ts +7 -5
  852. package/src/modules/access/__tests__/access.routes.admins.test.ts +1 -0
  853. package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -0
  854. package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -0
  855. package/src/modules/access/__tests__/access.routes.group-grant.test.ts +50 -14
  856. package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
  857. package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +1 -0
  858. package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -0
  859. package/src/modules/access/__tests__/access.routes.revoke.test.ts +18 -13
  860. package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -0
  861. package/src/modules/access/__tests__/grant-sources.test.ts +20 -15
  862. package/src/modules/access/__tests__/groups-admin.routes.test.ts +61 -0
  863. package/src/modules/access/__tests__/groups-admin.service.test.ts +211 -18
  864. package/src/modules/access/__tests__/reference-scan.test.ts +366 -14
  865. package/src/modules/access/__tests__/roles-admin.security.test.ts +1 -1
  866. package/src/modules/access/__tests__/roles-admin.service.test.ts +43 -22
  867. package/src/modules/access/__tests__/roles-capabilities.test.ts +6 -2
  868. package/src/modules/access/__tests__/roles.routes.test.ts +1 -1
  869. package/src/modules/access/access-control.interface.ts +17 -10
  870. package/src/modules/access/access-control.service.ts +161 -76
  871. package/src/modules/access/access-declarations.ts +1 -1
  872. package/src/modules/access/access-mutation.service.ts +58 -57
  873. package/src/modules/access/access-requests.contract.ts +1 -1
  874. package/src/modules/access/access-requests.routes.ts +10 -15
  875. package/src/modules/access/access-requests.service.ts +29 -71
  876. package/src/modules/access/access-view.ts +13 -11
  877. package/src/modules/access/access.routes.ts +51 -43
  878. package/src/modules/access/admin-locked-commit.ts +3 -2
  879. package/src/modules/access/capability-registry.ts +1 -1
  880. package/src/modules/access/change-read-gate.ts +3 -5
  881. package/src/modules/access/creator-access.ts +3 -5
  882. package/src/modules/access/directory-sync-bot.ts +2 -2
  883. package/src/modules/access/groups-admin.routes.ts +7 -5
  884. package/src/modules/access/groups-admin.service.ts +116 -47
  885. package/src/modules/access/groups-edit.ts +3 -3
  886. package/src/modules/access/index.ts +17 -0
  887. package/src/modules/access/reference-scan.ts +320 -47
  888. package/src/modules/access/roles-admin.service.ts +45 -31
  889. package/src/modules/access/roles-edit.ts +1 -1
  890. package/src/modules/access/synced-groups-committer.ts +4 -4
  891. package/src/modules/access/synced-groups-writer.ts +3 -3
  892. package/src/modules/access/user-access-removal.service.ts +3 -6
  893. package/src/modules/access-model/__tests__/access-grammar.test.ts +38 -1
  894. package/src/modules/access-model/__tests__/access-splice.test.ts +50 -8
  895. package/src/modules/access-model/access-grammar.ts +65 -20
  896. package/src/modules/access-model/access-splice.ts +31 -23
  897. package/src/modules/access-model/group-files.ts +5 -0
  898. package/src/modules/access-model/index.ts +21 -5
  899. package/src/modules/access-model/roles-yaml-guard.ts +1 -1
  900. package/src/modules/admin/admin-access.routes.ts +1 -1
  901. package/src/modules/admin/admin-access.service.ts +2 -2
  902. package/src/modules/admin/index.ts +7 -0
  903. package/src/modules/agent-guide/__tests__/agent-guide.test.ts +36 -0
  904. package/src/modules/agent-guide/agent-guide.tools.ts +17 -8
  905. package/src/modules/agent-guide/agent-guide.ts +1 -1
  906. package/src/modules/agent-guide/index.ts +1 -1
  907. package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +1 -0
  908. package/src/modules/agent-instructions/compose.ts +3 -1
  909. package/src/modules/agent-instructions/read-preamble.ts +1 -1
  910. package/src/modules/agent-instructions/shared-file-rules.ts +17 -1
  911. package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +421 -0
  912. package/src/modules/agent-scope/__tests__/connection-scope.test.ts +46 -0
  913. package/src/modules/agent-scope/__tests__/in-memory-kb.ts +148 -0
  914. package/src/modules/agent-scope/agent-scope.contract.ts +83 -0
  915. package/src/modules/agent-scope/connection-scope.ts +199 -0
  916. package/src/modules/agent-scope/index.ts +15 -0
  917. package/src/modules/audit/agent-audit.service.ts +5 -3
  918. package/src/modules/audit/agent-connection.routes.ts +1 -1
  919. package/src/modules/audit/agent-rest-audit.middleware.ts +1 -1
  920. package/src/modules/audit/audit.contract.ts +6 -0
  921. package/src/modules/audit/audit.routes.ts +4 -4
  922. package/src/modules/auth/__tests__/auth.middleware.test.ts +30 -2
  923. package/src/modules/auth/__tests__/auth.routes.test.ts +71 -5
  924. package/src/modules/auth/__tests__/auth.service.test.ts +90 -9
  925. package/src/modules/auth/__tests__/password-change-sessions.pg.test.ts +269 -0
  926. package/src/modules/auth/account-admission.ts +19 -0
  927. package/src/modules/auth/account-erasure.service.ts +4 -9
  928. package/src/modules/auth/account-switch-lock.ts +2 -2
  929. package/src/modules/auth/account.routes.ts +3 -3
  930. package/src/modules/auth/auth.middleware.ts +45 -4
  931. package/src/modules/auth/auth.routes.ts +46 -29
  932. package/src/modules/auth/auth.service.ts +139 -38
  933. package/src/modules/auth/index.ts +5 -0
  934. package/src/modules/auth/oidc-auth-provider.ts +3 -10
  935. package/src/modules/code-mode/code-mode.tool.ts +1 -1
  936. package/src/modules/connection-probe/connection-probe.service.ts +3 -6
  937. package/src/modules/database/__tests__/legacy-change-request-body.test.ts +118 -0
  938. package/src/modules/database/__tests__/legacy-request-bodies.pg.test.ts +258 -0
  939. package/src/modules/database/__tests__/pii-backfill.pg.test.ts +15 -18
  940. package/src/modules/database/__tests__/session-version-migration.pg.test.ts +133 -0
  941. package/src/modules/database/core-schema.ts +76 -36
  942. package/src/modules/database/index.ts +9 -0
  943. package/src/modules/database/migrate.ts +79 -3
  944. package/src/modules/declared-variables/__tests__/declared-variables.route.test.ts +44 -1
  945. package/src/modules/declared-variables/declared-variables.routes.ts +14 -3
  946. package/src/modules/diff/diff.routes.ts +5 -5
  947. package/src/modules/diff/diff.service.ts +2 -2
  948. package/src/modules/diff/index.ts +6 -0
  949. package/src/modules/embed/__tests__/embed.tools.test.ts +12 -0
  950. package/src/modules/embed/account-link.service.ts +2 -2
  951. package/src/modules/embed/embed.routes.ts +2 -2
  952. package/src/modules/embed/embed.service.ts +1 -1
  953. package/src/modules/embed/embed.tools.ts +11 -9
  954. package/src/modules/github-app/github-app.connection.ts +1 -1
  955. package/src/modules/github-app/github-app.routes.ts +3 -3
  956. package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +25 -0
  957. package/src/modules/kb-fs/__tests__/repo-path.test.ts +53 -8
  958. package/src/modules/kb-fs/index.ts +13 -0
  959. package/src/modules/kb-fs/locking-filesystem.ts +8 -2
  960. package/src/modules/kb-fs/repo-path.ts +33 -7
  961. package/src/modules/kb-fs/tmp-ref.ts +81 -0
  962. package/src/modules/kb-sync/kb-sync.routes.ts +3 -3
  963. package/src/modules/kb-sync/kb-sync.service.ts +1 -1
  964. package/src/modules/kb-sync/sync-auth.ts +1 -1
  965. package/src/modules/kb-sync/sync-payload.ts +1 -1
  966. package/src/modules/marketplace/git-http.routes.ts +1 -1
  967. package/src/modules/marketplace/github-facade/github-facade-admin.routes.ts +1 -1
  968. package/src/modules/marketplace/github-facade/github-facade-codes.store.ts +2 -2
  969. package/src/modules/marketplace/github-facade/github-facade-credentials.service.ts +2 -2
  970. package/src/modules/marketplace/github-facade/github-facade.routes.ts +2 -2
  971. package/src/modules/marketplace/github-facade/github-facade.service.ts +2 -2
  972. package/src/modules/marketplace/marketplace-repo.service.ts +2 -2
  973. package/src/modules/mcp/__tests__/connect-as.pg.test.ts +137 -0
  974. package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +29 -5
  975. package/src/modules/mcp/__tests__/mcp-routes-harness.ts +8 -0
  976. package/src/modules/mcp/__tests__/mcp.connect-as.test.ts +195 -0
  977. package/src/modules/mcp/__tests__/mcp.routes.connect-as.test.ts +192 -0
  978. package/src/modules/mcp/__tests__/oauth-consent.connect-as.test.ts +146 -0
  979. package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +213 -0
  980. package/src/modules/mcp/index.ts +7 -0
  981. package/src/modules/mcp/mcp-auth.middleware.ts +25 -9
  982. package/src/modules/mcp/mcp.routes.ts +42 -8
  983. package/src/modules/mcp/mcp.service.ts +136 -29
  984. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +48 -10
  985. package/src/modules/mcp/oauth/oauth-consent.routes.ts +42 -2
  986. package/src/modules/onboarding/onboarding.routes.ts +1 -1
  987. package/src/modules/onboarding/starter-pack.service.ts +5 -6
  988. package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +2 -1
  989. package/src/modules/plugins/__tests__/plugin-links.service.test.ts +2 -1
  990. package/src/modules/plugins/__tests__/plugins.tools.test.ts +38 -2
  991. package/src/modules/plugins/compile/compile-marketplace.ts +2 -2
  992. package/src/modules/plugins/compile/marketplace-compiler.service.ts +3 -3
  993. package/src/modules/plugins/discovery/bundle-dialect/registry.ts +1 -1
  994. package/src/modules/plugins/index.ts +3 -1
  995. package/src/modules/plugins/join-proposals.ts +2 -2
  996. package/src/modules/plugins/join-request-jobs.service.ts +3 -3
  997. package/src/modules/plugins/join-request-records.store.ts +2 -2
  998. package/src/modules/plugins/join-requests.service.ts +4 -4
  999. package/src/modules/plugins/plugin-links.service.ts +10 -11
  1000. package/src/modules/plugins/plugin-links.ts +23 -6
  1001. package/src/modules/plugins/plugin-provision.service.ts +4 -5
  1002. package/src/modules/plugins/plugin-rename.service.ts +3 -3
  1003. package/src/modules/plugins/plugins.contract.ts +1 -1
  1004. package/src/modules/plugins/plugins.routes.ts +39 -8
  1005. package/src/modules/plugins/plugins.service.ts +5 -5
  1006. package/src/modules/plugins/plugins.tools.ts +4 -4
  1007. package/src/modules/plugins/teams.routes.ts +3 -3
  1008. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +113 -0
  1009. package/src/modules/secrets-vault/db-secrets-vault.service.ts +2 -2
  1010. package/src/modules/secrets-vault/index.ts +2 -0
  1011. package/src/modules/secrets-vault/secrets-vault.routes.ts +27 -7
  1012. package/src/modules/settings/__tests__/deployment-settings.service.test.ts +88 -1
  1013. package/src/modules/settings/connection-check.ts +1 -1
  1014. package/src/modules/settings/deployment-settings.service.ts +44 -4
  1015. package/src/modules/settings/git-root-folders.ts +1 -1
  1016. package/src/modules/settings/index.ts +12 -0
  1017. package/src/modules/settings/setup.routes.ts +5 -4
  1018. package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +2 -2
  1019. package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +6 -3
  1020. package/src/modules/skills/__tests__/skills.service.test.ts +34 -0
  1021. package/src/modules/skills/allowed-tools-check.ts +2 -6
  1022. package/src/modules/skills/index.ts +9 -2
  1023. package/src/modules/skills/pending-skills.service.ts +3 -4
  1024. package/src/modules/skills/skill-access-requests.routes.ts +10 -17
  1025. package/src/modules/skills/skills.contract.ts +17 -0
  1026. package/src/modules/skills/skills.routes.ts +1 -1
  1027. package/src/modules/skills/skills.service.ts +7 -3
  1028. package/src/modules/skills/skills.tools.ts +49 -22
  1029. package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +4 -0
  1030. package/src/modules/tool-auth/connection-key-rejection.ts +1 -1
  1031. package/src/modules/tool-auth/connection-keys-admin.routes.ts +2 -2
  1032. package/src/modules/tool-auth/external-api-key.interface.ts +11 -1
  1033. package/src/modules/tool-auth/external-api-key.service.ts +7 -4
  1034. package/src/modules/tool-auth/index.ts +14 -0
  1035. package/src/modules/tool-auth/internal-token.service.ts +10 -0
  1036. package/src/modules/tool-auth/tool-auth.middleware.ts +48 -6
  1037. package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +2 -2
  1038. package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +5 -3
  1039. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +2 -2
  1040. package/src/modules/tool-helpers/default-branch-write.ts +1 -1
  1041. package/src/modules/tool-helpers/index.ts +5 -1
  1042. package/src/modules/tool-helpers/route-argument-check.ts +1 -1
  1043. package/src/modules/tool-helpers/route-tool-schemas.ts +1 -1
  1044. package/src/modules/tool-helpers/tool-context.ts +18 -10
  1045. package/src/modules/tool-helpers/tool-def.ts +7 -3
  1046. package/src/modules/tool-helpers/tool-handler.ts +36 -2
  1047. package/src/modules/tool-helpers/tool.contract.ts +12 -2
  1048. package/src/modules/tool-helpers/validate-token.ts +5 -4
  1049. package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +80 -4
  1050. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +42 -0
  1051. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +3 -3
  1052. package/src/modules/tool-manuals/index.ts +12 -2
  1053. package/src/modules/tool-manuals/mcp-server-edit.service.ts +2 -2
  1054. package/src/modules/tool-manuals/pending-tools.service.ts +2 -2
  1055. package/src/modules/tool-manuals/tool-delete.service.ts +5 -6
  1056. package/src/modules/tool-manuals/tool-manuals.contract.ts +18 -6
  1057. package/src/modules/tool-manuals/tool-manuals.routes.ts +45 -8
  1058. package/src/modules/tool-manuals/tool-manuals.service.ts +34 -18
  1059. package/src/modules/tool-manuals/tool-manuals.tools.ts +32 -17
  1060. package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +439 -0
  1061. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +2 -2
  1062. package/src/modules/tool-registry/__tests__/tool-registry.test.ts +9 -2
  1063. package/src/modules/tool-registry/description-length.ts +2 -2
  1064. package/src/modules/tool-registry/index.ts +22 -0
  1065. package/src/modules/tool-registry/manual.routes.ts +38 -11
  1066. package/src/modules/tool-registry/read-only-hints.contract.ts +54 -0
  1067. package/src/modules/tool-registry/read-only-hints.ts +225 -0
  1068. package/src/modules/tool-registry/tool.contract.ts +18 -0
  1069. package/src/modules/update-check/update-check.routes.ts +2 -2
  1070. package/src/modules/workflow/__tests__/event-bus.test.ts +14 -2
  1071. package/src/modules/workflow/__tests__/events-delivery.test.ts +778 -0
  1072. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +85 -22
  1073. package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +1 -1
  1074. package/src/modules/workflow/__tests__/workflow.service.update-change-request.pg.test.ts +120 -0
  1075. package/src/modules/workflow/__tests__/workflow.service.update-change-request.test.ts +346 -0
  1076. package/src/modules/workflow/agent-tools/__tests__/change-request-read-shape.test.ts +32 -209
  1077. package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +16 -245
  1078. package/src/modules/workflow/agent-tools/__tests__/update-change-request.parity.test.ts +306 -0
  1079. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +87 -60
  1080. package/src/modules/workflow/agent-tools/change-request-read-shape.ts +18 -153
  1081. package/src/modules/workflow/agent-tools/change-request-read.tools.ts +24 -96
  1082. package/src/modules/workflow/agent-tools/change-request-summary.ts +16 -2
  1083. package/src/modules/workflow/agent-tools/workflow.tools.ts +63 -84
  1084. package/src/modules/workflow/change-request-hooks.ts +1 -1
  1085. package/src/modules/workflow/event-bus.ts +3 -1
  1086. package/src/modules/workflow/events-delivery.ts +278 -0
  1087. package/src/modules/workflow/events.routes.ts +30 -9
  1088. package/src/modules/workflow/file-lock.service.ts +2 -2
  1089. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +130 -3
  1090. package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +24 -9
  1091. package/src/modules/workflow/git/git.service.ts +34 -56
  1092. package/src/modules/workflow/git/node-git-runner.ts +1 -1
  1093. package/src/modules/workflow/git/pull-request.service.ts +34 -29
  1094. package/src/modules/workflow/index.ts +15 -2
  1095. package/src/modules/workflow/pending-commits.service.ts +2 -2
  1096. package/src/modules/workflow/read-on-branch.ts +1 -1
  1097. package/src/modules/workflow/recovery-bot.ts +2 -2
  1098. package/src/modules/workflow/review-workflow/approval-lock.ts +1 -1
  1099. package/src/modules/workflow/review-workflow/review-workflow.interface.ts +3 -35
  1100. package/src/modules/workflow/review-workflow/review-workflow.service.ts +6 -165
  1101. package/src/modules/workflow/workflow.routes.ts +46 -100
  1102. package/src/modules/workflow/workflow.service.ts +277 -191
  1103. package/src/modules/workspace/__tests__/agent-downloads.test.ts +2 -1
  1104. package/src/modules/workspace/__tests__/agent-uploads.test.ts +87 -1
  1105. package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +2 -1
  1106. package/src/modules/workspace/__tests__/file-stat-access.test.ts +2 -1
  1107. package/src/modules/workspace/__tests__/git-internals.security.test.ts +4 -3
  1108. package/src/modules/workspace/__tests__/holds-nul.test.ts +66 -0
  1109. package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +5 -4
  1110. package/src/modules/workspace/__tests__/ripgrep-search.test.ts +570 -0
  1111. package/src/modules/workspace/__tests__/ripgrep-version.test.ts +29 -0
  1112. package/src/modules/workspace/__tests__/worker-pool.test.ts +118 -0
  1113. package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
  1114. package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +928 -0
  1115. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +17 -37
  1116. package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +30 -0
  1117. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +20 -8
  1118. package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +4 -3
  1119. package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +24 -11
  1120. package/src/modules/workspace/__tests__/workspace.tools.test.ts +423 -117
  1121. package/src/modules/workspace/agent-access.gate.ts +3 -3
  1122. package/src/modules/workspace/agent-download.builder.ts +1 -1
  1123. package/src/modules/workspace/agent-upload.routes.ts +19 -0
  1124. package/src/modules/workspace/agent-upload.store.ts +18 -0
  1125. package/src/modules/workspace/file-readers/README.md +9 -0
  1126. package/src/modules/workspace/file-readers/__tests__/doc-extract.service.test.ts +175 -0
  1127. package/src/modules/workspace/file-readers/__tests__/doc-extract.test.ts +21 -16
  1128. package/src/modules/workspace/file-readers/__tests__/extract-in-worker.test.ts +229 -0
  1129. package/src/modules/workspace/file-readers/__tests__/file-reader.registry.test.ts +2 -1
  1130. package/src/modules/workspace/file-readers/__tests__/fixtures/damaged-pdf.ts +34 -0
  1131. package/src/modules/workspace/file-readers/__tests__/fixtures/misbehaving-extract.worker.ts +57 -0
  1132. package/src/modules/workspace/file-readers/__tests__/fixtures/pdf-in-trouble.worker.ts +20 -0
  1133. package/src/modules/workspace/file-readers/__tests__/fixtures/unloadable-extract.worker.ts +2 -0
  1134. package/src/modules/workspace/file-readers/doc-extract.service.ts +144 -36
  1135. package/src/modules/workspace/file-readers/doc-extract.types.ts +13 -3
  1136. package/src/modules/workspace/file-readers/document-extractor.contract.ts +42 -0
  1137. package/src/modules/workspace/file-readers/document-extractors.ts +28 -0
  1138. package/src/modules/workspace/file-readers/document-formats.ts +13 -0
  1139. package/src/modules/workspace/file-readers/document-reader.ts +40 -36
  1140. package/src/modules/workspace/file-readers/extract-in-worker.ts +183 -0
  1141. package/src/modules/workspace/file-readers/extract-pdf.ts +23 -4
  1142. package/src/modules/workspace/file-readers/extract.worker.ts +5 -0
  1143. package/src/modules/workspace/file-readers/extraction-cache.ts +33 -12
  1144. package/src/modules/workspace/file-readers/extraction-worker.ts +86 -0
  1145. package/src/modules/workspace/file-readers/file-reader.registry.ts +6 -20
  1146. package/src/modules/workspace/file-readers/file-reader.ts +14 -4
  1147. package/src/modules/workspace/first-run.ts +1 -1
  1148. package/src/modules/workspace/git-internals.middleware.ts +1 -1
  1149. package/src/modules/workspace/index.ts +37 -0
  1150. package/src/modules/workspace/kb-repository.ts +3 -2
  1151. package/src/modules/workspace/not-found.ts +1 -1
  1152. package/src/modules/workspace/nul-scan.ts +50 -0
  1153. package/src/modules/workspace/pattern-matcher.contract.ts +124 -33
  1154. package/src/modules/workspace/ripgrep-search.ts +715 -0
  1155. package/src/modules/workspace/ripgrep-version.ts +35 -0
  1156. package/src/modules/workspace/routine-write-policy.ts +1 -1
  1157. package/src/modules/workspace/startup/__tests__/beside-checkout.test.ts +11 -0
  1158. package/src/modules/workspace/startup/beside-checkout.ts +13 -5
  1159. package/src/modules/workspace/startup/kb-git.ts +1 -1
  1160. package/src/modules/workspace/startup/kb-startup-runner.ts +1 -2
  1161. package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +3 -3
  1162. package/src/modules/workspace/startup/steps/personal-spaces.step.ts +2 -2
  1163. package/src/modules/workspace/startup/steps/plugin-layout.ts +1 -1
  1164. package/src/modules/workspace/startup/steps/roles-yaml.step.ts +1 -1
  1165. package/src/modules/workspace/startup/steps/seed-tree.ts +2 -2
  1166. package/src/modules/workspace/startup/steps/template-files.step.ts +2 -2
  1167. package/src/modules/workspace/startup/steps/template-source.ts +2 -2
  1168. package/src/modules/workspace/worker-pool.ts +192 -0
  1169. package/src/modules/workspace/workspace-tmp.ts +457 -0
  1170. package/src/modules/workspace/workspace.routes.ts +15 -39
  1171. package/src/modules/workspace/workspace.service.ts +96 -22
  1172. package/src/modules/workspace/workspace.tools.ts +550 -186
  1173. package/src/modules/workspace/write-denial.ts +4 -5
  1174. package/src/modules/write-access/index.ts +7 -0
  1175. package/src/shared/__tests__/module-boundaries.lint.test.ts +301 -0
  1176. package/src/shared/path-order.ts +37 -8
  1177. package/starter-packs/engineering/Plugins/engineering-starter/access.md +1 -1
  1178. package/starter-packs/general/Plugins/general-starter/access.md +1 -1
  1179. package/starter-packs/operations/Plugins/operations-starter/access.md +1 -1
  1180. package/starter-packs/sales/Plugins/sales-starter/access.md +1 -1
  1181. package/starter-packs/support/Plugins/support-starter/access.md +1 -1
  1182. package/dist/modules/workspace/bounded-matcher.d.ts +0 -79
  1183. package/dist/modules/workspace/bounded-matcher.d.ts.map +0 -1
  1184. package/dist/modules/workspace/bounded-matcher.js +0 -261
  1185. package/dist/modules/workspace/bounded-matcher.js.map +0 -1
  1186. package/src/modules/workflow/__tests__/format-affected-owners.test.ts +0 -85
  1187. package/src/modules/workspace/__tests__/bounded-matcher.test.ts +0 -213
  1188. package/src/modules/workspace/bounded-matcher.ts +0 -328
@@ -36,19 +36,25 @@ import { workspaceIdForBranch } from '../../shared/workspace-id.js';
36
36
  import { logger } from '../../shared/logging.js';
37
37
 
38
38
  const log = logger('roles.recover');
39
- import type { WorkflowEventBus } from '../workflow/event-bus.js';
39
+ import type { WorkflowEventBus } from '../workflow/index.js';
40
40
  import type { AuthUser, IWorkspaceService, IWorkflowService } from '@bevel-software/platform-shared';
41
41
  import { WorkflowDomainError } from '../../shared/domain-errors.js';
42
+ import type { ITreeWalker } from '../../shared/fs.contract.js';
42
43
  import type { IAccessControl } from './access-control.interface.js';
43
44
  import {
44
45
  ADMIN_CANONICAL,
45
46
  ROLE_TOKEN_PREFIX,
46
47
  canonicalRoleName,
47
48
  canonicalEmail,
48
- } from '../access-model/access-grammar.js';
49
+ makeRolesYamlWriteValidator,
50
+ renderRolesYaml,
51
+ GROUPS_YAML,
52
+ SYNCED_GROUPS_YAML,
53
+ validateGroupsFile,
54
+ GROUP_REF_PREFIX,
55
+ RESERVED_ROLE_NAMES,
56
+ } from '../access-model/index.js';
49
57
  import { loadActiveGroups } from './access-control.service.js';
50
- import { makeRolesYamlWriteValidator } from '../access-model/roles-yaml-guard.js';
51
- import { renderRolesYaml } from '../access-model/render-roles-yaml.js';
52
58
  import {
53
59
  parseRolesModel,
54
60
  deleteRole as editDeleteRole,
@@ -60,7 +66,6 @@ import {
60
66
  RolesEditError,
61
67
  type EditResult,
62
68
  } from './roles-edit.js';
63
- import { GROUPS_YAML, SYNCED_GROUPS_YAML, validateGroupsFile } from '../access-model/group-files.js';
64
69
  import {
65
70
  GroupsEditError,
66
71
  assertSafeGroupDisplayName,
@@ -68,9 +73,8 @@ import {
68
73
  parseGroupsModel,
69
74
  } from './groups-edit.js';
70
75
  import { capabilityRoleFor, isLegacyPeopleSetRole } from './capability-registry.js';
71
- import { GROUP_REF_PREFIX, RESERVED_ROLE_NAMES } from '../access-model/access-grammar.js';
72
76
  import { AdminLockedCommits } from './admin-locked-commit.js';
73
- import { KbReferenceScanner } from './reference-scan.js';
77
+ import { KbReferenceScanner, readableReferences } from './reference-scan.js';
74
78
 
75
79
  /** A mutation that cannot proceed (invariant violation, contention, not found). */
76
80
  export class RolesAdminError extends WorkflowDomainError {
@@ -121,11 +125,11 @@ export interface RoleRosterEntry {
121
125
  capability: { description: string; groupAssignable: boolean } | null;
122
126
  /**
123
127
  * Every access rule referencing this ROLE — folder `access.md` AND node
124
- * frontmatter. `role/<name>` hits always count; a BARE-token hit counts
125
- * only when no group shadows the name (bare tokens resolve group-first, so
126
- * a shadowed bare grant is the GROUP's reference, listed on the groups
127
- * roster instead). Sound: this is the SAME scan the group rename/delete
128
- * rewrites use.
128
+ * frontmatter. `role/<name>` and BARE-token hits both count — a bare name
129
+ * is always the role when the role exists, even when a group shares the
130
+ * name (that group is `group/<name>`). Sound: this is the SAME scan the
131
+ * group rename/delete rewrites use. Only files the roster's viewer can read
132
+ * are listed (see `getRoster`).
129
133
  */
130
134
  referencedBy: { path: string; verb: string }[];
131
135
  }
@@ -183,6 +187,8 @@ export class RolesAdminService {
183
187
  private readonly workspaceService: IWorkspaceService,
184
188
  private readonly workflowService: IWorkflowService,
185
189
  private readonly accessControl: IAccessControl,
190
+ /** The composition root's walk — the one the resolver finds access rules with. */
191
+ disk: ITreeWalker,
186
192
  private readonly kbDirName: string,
187
193
  /**
188
194
  * The branch whose roles.yaml is authoritative for admin status, read
@@ -226,7 +232,7 @@ export class RolesAdminService {
226
232
  // The event bus keeps the roster's `referencedBy` fresh: a share-dialog
227
233
  // grant/revoke on any access.md happens outside this service, and the
228
234
  // scanner invalidates its cache on those writes' events (TTL as backstop).
229
- this.references = new KbReferenceScanner(workspaceService, kbDirName, eventBus);
235
+ this.references = new KbReferenceScanner(workspaceService, disk, kbDirName, eventBus);
230
236
  this.fixedAdminEmails = [
231
237
  ...new Set(deploymentAdmins.filter(Boolean).map((e) => canonicalEmail(e)).filter(Boolean)),
232
238
  ];
@@ -306,23 +312,24 @@ export class RolesAdminService {
306
312
 
307
313
  // ---- Read -------------------------------------------------------------
308
314
 
309
- /** The roster: every role on the default branch with members + references. */
310
- async getRoster(): Promise<RoleRosterEntry[]> {
315
+ /**
316
+ * The roster: every role on the default branch with members + references.
317
+ * `viewerEmail` is who the roster is for: `referencedBy` names only the
318
+ * files that viewer can read and omits the rest entirely, without a count —
319
+ * being an Admin is not read access to every file, and a path, or even a
320
+ * count of rules in unreadable content, is itself a disclosure.
321
+ */
322
+ async getRoster(viewerEmail: string): Promise<RoleRosterEntry[]> {
311
323
  const workspaceId = await this.ensureWorkspace();
312
324
  const text = await this.readRolesYaml(workspaceId);
313
325
  const model = parseRolesModel(text);
314
326
  // ONE sound scan of every candidate file (folder access.md + node
315
327
  // frontmatter) — cached in the shared scanner, so mutations returning the
316
328
  // fresh roster don't rerun the full-KB sweep — indexed by canonical entry
317
- // token. Attribution per spelling: a `role/<name>` hit is ALWAYS the
318
- // role's; a BARE hit is the role's only when no group shadows the name —
319
- // bare tokens resolve group-first, so a shadowed bare grant belongs to the
320
- // GROUP (and the groups roster attributes it there — the mirror image).
321
- const [referencesByToken, activeGroups] = await Promise.all([
322
- this.references.scan(workspaceId),
323
- loadActiveGroups((f) => this.locked.readKbFile(workspaceId, f)),
324
- ]);
325
- const groupOwnedBareNames = new Set(activeGroups.groups.keys());
329
+ // token. Attribution per spelling: a `role/<name>` hit and a BARE hit are
330
+ // both the role's — bare names resolve role-first, so a same-named group
331
+ // is only ever `group/<name>` (the groups roster's mirror image).
332
+ const referencesByToken = await this.references.scan(workspaceId);
326
333
  const out: RoleRosterEntry[] = [];
327
334
  for (const role of model) {
328
335
  const canonical = canonicalRoleName(role.displayName);
@@ -345,11 +352,18 @@ export class RolesAdminService {
345
352
  ? { description: registryEntry.description, groupAssignable: registryEntry.groupAssignable }
346
353
  : null,
347
354
  referencedBy: [
348
- ...(groupOwnedBareNames.has(canonical) ? [] : referencesByToken.get(canonical) ?? []),
355
+ ...(referencesByToken.get(canonical) ?? []),
349
356
  ...(referencesByToken.get(`${ROLE_TOKEN_PREFIX}${canonical}`) ?? []),
350
357
  ],
351
358
  });
352
359
  }
360
+ const paths = [...new Set(out.flatMap((r) => r.referencedBy.map((ref) => ref.path)))];
361
+ if (paths.length > 0) {
362
+ const readable = await this.accessControl.canReadBatch(workspaceId, viewerEmail, paths);
363
+ for (const r of out) {
364
+ r.referencedBy = readableReferences(r.referencedBy, readable);
365
+ }
366
+ }
353
367
  return out;
354
368
  }
355
369
 
@@ -453,7 +467,7 @@ export class RolesAdminService {
453
467
  );
454
468
  this.accessControl.invalidate(workspaceId);
455
469
  this.emitWrites(workspaceId, actor, [OLD_ROLES_YAML, ROLES_YAML]);
456
- return this.getRoster();
470
+ return this.getRoster(actor.email);
457
471
  }
458
472
 
459
473
  // ---- Mutations --------------------------------------------------------
@@ -487,7 +501,7 @@ export class RolesAdminService {
487
501
  ): Promise<RoleRosterEntry[]> {
488
502
  this.assertNotFixedAdmin(canonical, email);
489
503
  await this.runEdit(actor, (text) => editAddMember(text, canonical, email), opts?.aroundWrite);
490
- return this.getRoster();
504
+ return this.getRoster(actor.email);
491
505
  }
492
506
 
493
507
  /**
@@ -545,7 +559,7 @@ export class RolesAdminService {
545
559
  }
546
560
  return editRemoveMember(text, canonical, email);
547
561
  });
548
- return this.getRoster();
562
+ return this.getRoster(actor.email);
549
563
  }
550
564
 
551
565
  /**
@@ -575,12 +589,12 @@ export class RolesAdminService {
575
589
  }
576
590
  await this.runEdit(actor, (text) => editAddGroupRef(text, canonical, groupName));
577
591
  });
578
- return this.getRoster();
592
+ return this.getRoster(actor.email);
579
593
  }
580
594
 
581
595
  async unassignGroup(actor: AuthUser, canonical: string, groupName: string): Promise<RoleRosterEntry[]> {
582
596
  await this.runEdit(actor, (text) => editRemoveGroupRef(text, canonical, groupName));
583
- return this.getRoster();
597
+ return this.getRoster(actor.email);
584
598
  }
585
599
 
586
600
  /**
@@ -692,7 +706,7 @@ export class RolesAdminService {
692
706
  );
693
707
  this.accessControl.invalidate(workspaceId);
694
708
  this.emitWrites(workspaceId, actor, [ROLES_YAML, GROUPS_YAML]);
695
- return this.getRoster();
709
+ return this.getRoster(actor.email);
696
710
  }
697
711
 
698
712
  // ---- Internals --------------------------------------------------------
@@ -39,7 +39,7 @@ import {
39
39
  canonicalEmail,
40
40
  EMAIL_REGEX,
41
41
  GROUP_REF_PREFIX,
42
- } from '../access-model/access-grammar.js';
42
+ } from '../access-model/index.js';
43
43
 
44
44
  /** Bad-input failure when editing roles.yaml (invalid name/email, unknown role). */
45
45
  export class RolesEditError extends Error {
@@ -3,12 +3,12 @@ import { logger } from '../../shared/logging.js';
3
3
 
4
4
  const log = logger('directory-sync');
5
5
  import type { AuthUser, IWorkflowService } from '@bevel-software/platform-shared';
6
- import type { WorkspaceService } from '../workspace/workspace.service.js';
6
+ import type { WorkspaceService } from '../workspace/index.js';
7
7
  import { workspaceIdForBranch } from '../../shared/workspace-id.js';
8
8
  import type { AccessControlService } from './access-control.service.js';
9
- import { SYNCED_GROUPS_YAML } from '../access-model/group-files.js';
10
- import type { WorkflowEventBus } from '../workflow/event-bus.js';
11
- import { LockingFilesystem } from '../kb-fs/locking-filesystem.js';
9
+ import { SYNCED_GROUPS_YAML } from '../access-model/index.js';
10
+ import type { WorkflowEventBus } from '../workflow/index.js';
11
+ import { LockingFilesystem } from '../kb-fs/index.js';
12
12
  import { PushNeedsAgentResolutionError, WorkflowDomainError } from '../../shared/domain-errors.js';
13
13
  import { isAbsence } from '../../shared/fs.contract.js';
14
14
  import type { SyncedGroupsWriterDeps } from './synced-groups-writer.js';
@@ -4,8 +4,8 @@ import {
4
4
  canonicalEmail,
5
5
  canonicalRoleName,
6
6
  RESERVED_ROLE_NAMES,
7
- } from '../access-model/access-grammar.js';
8
- import { unsafeNameReason } from '../access-model/group-files.js';
7
+ } from '../access-model/index.js';
8
+ import { unsafeNameReason } from '../access-model/index.js';
9
9
  import { printable } from '../../shared/printable.js';
10
10
 
11
11
  /**
@@ -72,7 +72,7 @@ export interface SyncedGroupsSource {
72
72
 
73
73
  // Name safety is the SHARED predicate in `group-files.ts` (`unsafeNameReason`)
74
74
  // — the same rules the manual group editor asserts, including the reserved
75
- // `role/` prefix. Here the name arrives from the IdP, so an unsafe group is
75
+ // `role/` and `group/` prefixes. Here the name arrives from the IdP, so an unsafe group is
76
76
  // SKIPPED with a warning instead of erroring (fail-closed: an unrepresentable
77
77
  // group grants nothing).
78
78
 
@@ -37,7 +37,7 @@
37
37
  */
38
38
 
39
39
  import { workspaceIdForBranch } from '../../shared/workspace-id.js';
40
- import type { WorkflowEventBus } from '../workflow/event-bus.js';
40
+ import type { WorkflowEventBus } from '../workflow/index.js';
41
41
  import type { AuthUser, IWorkspaceService, IWorkflowService } from '@bevel-software/platform-shared';
42
42
  import { PushNeedsAgentResolutionError, WorkflowDomainError } from '../../shared/domain-errors.js';
43
43
  import type { IAccessControl } from './access-control.interface.js';
@@ -55,11 +55,8 @@ import {
55
55
  stripComment,
56
56
  type ParsedEntry,
57
57
  type Verb,
58
- } from '../access-model/access-grammar.js';
59
- import { spliceRevoke } from '../access-model/access-splice.js';
60
- import { scanFrontmatter } from '../access-model/frontmatter-lines.js';
61
- import { GROUPS_YAML, SYNCED_GROUPS_YAML, validateGroupsFile } from '../access-model/group-files.js';
62
- import { makeRolesYamlWriteValidator } from '../access-model/roles-yaml-guard.js';
58
+ } from '../access-model/index.js';
59
+ import { spliceRevoke, scanFrontmatter, GROUPS_YAML, SYNCED_GROUPS_YAML, validateGroupsFile, makeRolesYamlWriteValidator } from '../access-model/index.js';
63
60
  import { emitRolesModel, isGroupRefMember, parseRolesModel } from './roles-edit.js';
64
61
  import { emitGroupsModel, parseGroupsModel } from './groups-edit.js';
65
62
  import { AdminLockedCommits, type LockedWrite } from './admin-locked-commit.js';
@@ -6,8 +6,44 @@ import {
6
6
  accessFrontmatterExtensionList,
7
7
  parseOwnAccessEntries,
8
8
  parseRolesYaml,
9
+ parseAccessEntry,
10
+ mergeGroupsIntoRoles,
9
11
  } from '../access-grammar.js';
10
- import { parseGroupsFile } from '../group-files.js';
12
+ import { parseGroupsFile, unsafeNameReason } from '../group-files.js';
13
+
14
+ describe('principal spellings — a bare name is the role, group/<Name> the group', () => {
15
+ it('parses group/<Name> into the canonical group token, spacing normalised', () => {
16
+ const r = parseAccessEntry('group/ Product Team');
17
+ expect(r).toEqual({ ok: true, entry: { kind: 'role', role: 'group/product team', displayRole: 'group/ Product Team', deny: false } });
18
+ const d = parseAccessEntry('deny group/Admin');
19
+ expect(d.ok && d.entry.kind === 'role' && d.entry.role).toBe('group/admin');
20
+ expect(parseAccessEntry('group/').ok).toBe(false);
21
+ });
22
+
23
+ it('reserves the group/ prefix for roles and groups alike', () => {
24
+ const roles = parseRolesYaml('roles:\n Admin:\n - a@x.io\n group/Ops:\n - b@x.io\n');
25
+ expect(roles.ok).toBe(false);
26
+ if (!roles.ok) expect(roles.errors.join(' ')).toMatch(/reserved 'group\/' prefix/);
27
+ expect(unsafeNameReason('group/Ops')).toMatch(/group\//);
28
+ });
29
+
30
+ it('merging keeps the bare key for the role and registers group/ for every group', () => {
31
+ const parsed = parseRolesYaml('roles:\n Admin:\n - admin@x.io\n');
32
+ if (!parsed.ok) throw new Error('roles');
33
+ const groups = parseGroupsFile('groups:\n Admin:\n - mallory@x.io\n Sales:\n - sam@x.io\n', 'groups.yaml');
34
+ if (!groups.ok) throw new Error('groups');
35
+ const warnings = mergeGroupsIntoRoles(parsed.index, groups.groups, 'groups.yaml');
36
+ const idx = parsed.index.byCanonical;
37
+ expect(idx.get('admin')?.kind).toBe('role');
38
+ expect(idx.get('role/admin')).toBe(idx.get('admin'));
39
+ expect(idx.get('group/admin')?.kind).toBe('group');
40
+ expect(idx.get('sales')?.kind).toBe('group');
41
+ expect(idx.get('group/sales')).toBe(idx.get('sales'));
42
+ // The group's member holds only the group's keys, never the role's.
43
+ expect([...(parsed.index.byEmail.get('mallory@x.io') ?? [])]).toEqual(['group/admin']);
44
+ expect(warnings.join(' ')).toMatch(/resolves to the ROLE; use 'group\/admin'/);
45
+ });
46
+ });
11
47
 
12
48
  describe('parseYamlSubset — inline empty collections', () => {
13
49
  it('reads `key: []` as an empty list, not the scalar "[]"', () => {
@@ -103,6 +139,7 @@ describe('the access-frontmatter extension set', () => {
103
139
  expect(accessFrontmatterExtensionList()).toHaveLength(after);
104
140
  expect(accessFrontmatterExtensionList()).toContain('.md');
105
141
  expect(accessFrontmatterExtensionList()).toContain('.tool');
142
+ expect(accessFrontmatterExtensionList()).not.toContain('.agent');
106
143
  });
107
144
 
108
145
  it('throws on a malformed extension rather than skipping it', () => {
@@ -302,12 +302,13 @@ describe('round-trip — every granted entry parses back', () => {
302
302
  });
303
303
  });
304
304
 
305
- describe('token-kind family — exact-token grants, shadow-aware revokes', () => {
306
- // One name, two spellings, two possible principals: the bare token is the
307
- // GROUP's whenever a group shadows the name (group-first precedence), the
308
- // `role/` token is always the ROLE's. Grants must be exact-token idempotent;
309
- // revokes are alias-tolerant ONLY when unshadowed (the caller passes
310
- // tokenMatch: 'exact' when a group owns the bare name).
305
+ describe('token-kind family — exact-token grants, kind-aware revokes', () => {
306
+ // One name, three spellings, two possible principals: `role/` is always the
307
+ // ROLE's, `group/` always the GROUP's, and the bare token is the role's when
308
+ // one exists, else the group's. Grants must be exact-token idempotent;
309
+ // revokes are alias-tolerant (explicit + bare, never the other kind's
310
+ // explicit spelling) only when the bare name is the principal's — the
311
+ // caller passes tokenMatch: 'exact' otherwise.
311
312
  const SHARED = `---
312
313
  write:
313
314
  - role/Sales
@@ -360,10 +361,51 @@ write:
360
361
  expect(lines).not.toContain(' - Sales');
361
362
  });
362
363
 
363
- it("REVOKE unshadowed bare principal (group since vanished): 'name' matching strips both spellings", () => {
364
+ it("REVOKE bare principal: 'name' matching strips both role spellings", () => {
364
365
  const r = spliceRevoke(SHARED, 'write', { kind: 'role', role: 'Sales' });
365
366
  expect(r.changed).toBe(true);
366
- expect(r.text).not.toContain('Sales'); // bare token falls back to the role — same principal
367
+ expect(r.text).not.toContain('Sales'); // the bare token is the role — same principal
368
+ });
369
+
370
+ const ALL = `---
371
+ write:
372
+ - role/Sales
373
+ - Sales
374
+ - group/Sales
375
+ - Admin
376
+ ---
377
+ `;
378
+
379
+ it('GRANT is exact-token: a group/<Name> grant goes through beside the bare and role/ spellings', () => {
380
+ const md = '---\nwrite:\n - role/Sales\n - Sales\n---\n';
381
+ const r = spliceGrant(md, 'write', { kind: 'role', role: 'group/Sales' });
382
+ expect(r.changed).toBe(true);
383
+ expect(r.text.split('\n')).toContain(' - group/Sales');
384
+ expect(spliceGrant(ALL, 'write', { kind: 'role', role: 'group/Sales' }).changed).toBe(false);
385
+ });
386
+
387
+ it("REVOKE 'name' never crosses kinds: the role's revoke keeps group/, the group's keeps role/", () => {
388
+ const asRole = spliceRevoke(ALL, 'write', { kind: 'role', role: 'role/Sales' });
389
+ expect(asRole.text.split('\n')).toEqual(['---', 'write:', ' - group/Sales', ' - Admin', '---', '']);
390
+
391
+ // The service asks 'name' for a GROUP only while no role shares the name
392
+ // (with one, as in ALL, it picks 'exact' — the last test below), so the
393
+ // group's case is a file where the bare token can only be the group.
394
+ const GROUP_ONLY = '---\nwrite:\n - Sales\n - group/Sales\n - Admin\n---\n';
395
+ const asGroup = spliceRevoke(GROUP_ONLY, 'write', { kind: 'role', role: 'group/Sales' });
396
+ expect(asGroup.text.split('\n')).toEqual(['---', 'write:', ' - Admin', '---', '']);
397
+ });
398
+
399
+ it('REVOKE matches a spaced `group/ <Name>` request against the parsed `group/<name>` entry', () => {
400
+ const r = spliceRevoke(ALL, 'write', { kind: 'role', role: 'group/ Sales' }, { tokenMatch: 'exact' });
401
+ expect(r.text.split('\n')).toEqual(['---', 'write:', ' - role/Sales', ' - Sales', ' - Admin', '---', '']);
402
+ const md = '---\nwrite:\n - group/ Sales\n---\n';
403
+ expect(spliceRevoke(md, 'write', { kind: 'role', role: 'group/Sales' }).changed).toBe(true);
404
+ });
405
+
406
+ it("REVOKE 'exact' of group/<Name> strips only that spelling", () => {
407
+ const r = spliceRevoke(ALL, 'write', { kind: 'role', role: 'group/Sales' }, { tokenMatch: 'exact' });
408
+ expect(r.text.split('\n')).toEqual(['---', 'write:', ' - role/Sales', ' - Sales', ' - Admin', '---', '']);
367
409
  });
368
410
  });
369
411
 
@@ -92,14 +92,47 @@ export const DENY_PREFIX = 'deny ';
92
92
  export const GROUP_REF_PREFIX = 'group:';
93
93
  /**
94
94
  * Explicit ROLE token prefix in access.md entries: `role/<Name>` resolves to
95
- * the roles.yaml role only, never a group. A BARE name resolves GROUP-FIRST
96
- * and falls back to the role — so `role/` is the escape hatch when a group
97
- * shares the role's name. The prefix is reserved in the group name-safety
98
- * rules (a group may never be named `role/...`), and every role is also
99
- * registered in the principal index under its `role/<canonical>` alias.
95
+ * the roles.yaml role only, never a group. A BARE name resolves ROLE-FIRST
96
+ * and falls back to the group, so a group that shares a role's name is
97
+ * reached only as `group/<Name>` (see `GROUP_TOKEN_PREFIX`) — a group named
98
+ * `Admin` never takes over the grants written for the Admin role. The prefix
99
+ * is reserved in the group name-safety rules (a group may never be named
100
+ * `role/...`), and every role is also registered in the principal index under
101
+ * its `role/<canonical>` alias.
100
102
  */
101
103
  export const ROLE_TOKEN_PREFIX = 'role/';
102
104
 
105
+ /**
106
+ * Explicit GROUP token prefix in access.md entries: `group/<Name>` resolves
107
+ * to the active source's group only, never a role. Every group is registered
108
+ * in the principal index under its `group/<canonical>` alias; the bare name
109
+ * reaches the group only while no role of that name exists. The share dialog
110
+ * and the access API always write groups this way. Reserved in the group
111
+ * name-safety rules and in roles.yaml like `role/`.
112
+ */
113
+ export const GROUP_TOKEN_PREFIX = 'group/';
114
+
115
+ /**
116
+ * A canonical role-shaped token split into its explicit kind prefix and its
117
+ * bare name: `role/admin` → `{ prefix: 'role', name: 'admin' }`, `group/admin`
118
+ * → `{ prefix: 'group', name: 'admin' }`, anything else (a bare name, a
119
+ * plugin token, `everyone`) → `{ prefix: null, name: <token> }`. A prefixed
120
+ * name is canonicalised again, so `group/ admin` splits like `group/admin`
121
+ * (as `parseAccessEntry` reads it).
122
+ */
123
+ export function splitPrincipalToken(canonical: string): {
124
+ prefix: 'role' | 'group' | null;
125
+ name: string;
126
+ } {
127
+ if (canonical.startsWith(ROLE_TOKEN_PREFIX)) {
128
+ return { prefix: 'role', name: canonicalRoleName(canonical.slice(ROLE_TOKEN_PREFIX.length)) };
129
+ }
130
+ if (canonical.startsWith(GROUP_TOKEN_PREFIX)) {
131
+ return { prefix: 'group', name: canonicalRoleName(canonical.slice(GROUP_TOKEN_PREFIX.length)) };
132
+ }
133
+ return { prefix: null, name: canonical };
134
+ }
135
+
103
136
  /**
104
137
  * PLUGIN-principal token prefix in access.md entries: `plugin/<Name>/<verb>`
105
138
  * names everyone who holds `<verb>` on the plugin folder `Plugins/<Name>` —
@@ -585,6 +618,11 @@ export function parseAccessEntry(
585
618
  const suffix = canonicalRoleName(role.slice(ROLE_TOKEN_PREFIX.length));
586
619
  if (!suffix) return { ok: false, error: `entry '${body}' names no role after '${ROLE_TOKEN_PREFIX}'` };
587
620
  role = `${ROLE_TOKEN_PREFIX}${suffix}`;
621
+ } else if (role.startsWith(GROUP_TOKEN_PREFIX)) {
622
+ // Explicit group token, normalised the same way to `group/<canonicalName>`.
623
+ const suffix = canonicalRoleName(role.slice(GROUP_TOKEN_PREFIX.length));
624
+ if (!suffix) return { ok: false, error: `entry '${body}' names no group after '${GROUP_TOKEN_PREFIX}'` };
625
+ role = `${GROUP_TOKEN_PREFIX}${suffix}`;
588
626
  } else if (role.startsWith(PLUGIN_TOKEN_PREFIX)) {
589
627
  // `plugin/<Name>/<verb>`: the name is canonicalised to the plugin's
590
628
  // manifest slug, the verb must be one of the three. Anything else is a
@@ -649,6 +687,12 @@ export function parseRolesYaml(
649
687
  );
650
688
  continue;
651
689
  }
690
+ if (canonical.startsWith(GROUP_TOKEN_PREFIX)) {
691
+ errors.push(
692
+ `roles.yaml: role '${displayName}' starts with the reserved '${GROUP_TOKEN_PREFIX}' prefix — that spelling is the explicit group token in access entries`,
693
+ );
694
+ continue;
695
+ }
652
696
  // A role spelled `plugin/…` would be overwritten by the synthesised plugin
653
697
  // principal of the same key while its members kept the token — plugin
654
698
  // access for people who are not plugin members. Refused at parse time,
@@ -730,15 +774,17 @@ export function parseRolesYaml(
730
774
  *
731
775
  * Rules (the grant-grammar precedence):
732
776
  * - Every role is ALSO registered under its explicit `role/<canonical>`
733
- * alias — the token that always resolves to the role.
734
- * - A BARE name resolves GROUP-FIRST: when a group's canonical name
735
- * collides with a role's, the bare key resolves to the GROUP (warned);
736
- * the role stays reachable via `role/<canonical>`.
777
+ * alias, and every group under its explicit `group/<canonical>` alias —
778
+ * the tokens that always resolve to that kind.
779
+ * - A BARE name resolves ROLE-FIRST: when a group's canonical name
780
+ * collides with a role's, the bare key stays the ROLE's (warned); the
781
+ * group is reachable only via `group/<canonical>`. So a group named
782
+ * `Admin` — whoever proposed it — never gains what `Admin` is granted.
737
783
  * - Role `group:<Name>` refs — Admin's included — expand against the
738
784
  * merged groups; an unknown ref contributes nothing (warned).
739
785
  * - `byEmail` is rebuilt so each member holds exactly the tokens that
740
786
  * resolve to a principal they belong to (bare + `role/` alias for roles,
741
- * bare for groups).
787
+ * `group/` alias plus the bare name when the group owns it for groups).
742
788
  */
743
789
  export function mergeGroupsIntoRoles(
744
790
  index: RolesIndex,
@@ -765,19 +811,18 @@ export function mergeGroupsIntoRoles(
765
811
  }
766
812
  }
767
813
 
768
- // 2. Bare-name precedence: groups win the bare token; the role keeps its
769
- // `role/<canonical>` alias registered below.
814
+ // 2. Bare-name precedence: roles keep the bare token; every group gets its
815
+ // `group/<canonical>` alias, and the bare key only when no role owns it.
770
816
  for (const [canonical, def] of groups) {
817
+ const group = { displayName: def.displayName, emails: new Set(def.emails), kind: 'group' as const };
818
+ index.byCanonical.set(`${GROUP_TOKEN_PREFIX}${canonical}`, group);
771
819
  if (roleRecords.has(canonical)) {
772
820
  warnings.push(
773
- `${sourceFile}: group '${def.displayName}' shares its name with a role — the bare name now resolves to the GROUP; use '${ROLE_TOKEN_PREFIX}${canonical}' to reference the role`,
821
+ `${sourceFile}: group '${def.displayName}' shares its name with a role — the bare name resolves to the ROLE; use '${GROUP_TOKEN_PREFIX}${canonical}' to reference the group`,
774
822
  );
823
+ continue;
775
824
  }
776
- index.byCanonical.set(canonical, {
777
- displayName: def.displayName,
778
- emails: new Set(def.emails),
779
- kind: 'group',
780
- });
825
+ index.byCanonical.set(canonical, group);
781
826
  }
782
827
 
783
828
  // 3. Explicit `role/<canonical>` alias for every role (same record — the
@@ -788,8 +833,8 @@ export function mergeGroupsIntoRoles(
788
833
  }
789
834
 
790
835
  // 4. Rebuild the email → tokens map from the final index so membership
791
- // reflects the post-precedence keys (a collided role's members no longer
792
- // hold the bare token unless the group also contains them).
836
+ // reflects the post-precedence keys (a collided group's members hold
837
+ // only its `group/` alias, never the role's bare token).
793
838
  index.byEmail.clear();
794
839
  for (const [key, principal] of index.byCanonical) {
795
840
  for (const email of principal.emails) {
@@ -33,6 +33,7 @@ import {
33
33
  canonicalEmail,
34
34
  canonicalRoleName,
35
35
  accessMdDeclaresBodyRules,
36
+ splitPrincipalToken,
36
37
  } from './access-grammar.js';
37
38
  import { freshAccessMd } from './access-template.js';
38
39
  import { scanFrontmatter } from './frontmatter-lines.js';
@@ -149,15 +150,18 @@ export function validatePrincipal(p: Principal): Principal {
149
150
  /**
150
151
  * How a role-shaped principal's TOKEN is compared against a file entry:
151
152
  *
152
- * - `'exact'`: the entry must carry the SAME spelling — a bare token and a
153
- * `role/<name>` token are DIFFERENT principals (bare = whoever owns the
154
- * bare key under group-first precedence, `role/` = the role). Grants
155
- * always use this: granting the group `X` while `role/X` is present (or
156
- * vice versa) must NOT be treated as already-granted, or the other
157
- * principal silently never receives the grant.
158
- * - `'name'`: both spellings of the name match. Revokes use this ONLY when
159
- * no group shadows the bare name — then both spellings resolve to the
160
- * role, and revoking the role must also remove legacy bare spellings.
153
+ * - `'exact'`: the entry must carry the SAME spelling — a bare token, a
154
+ * `role/<name>` token and a `group/<name>` token can be DIFFERENT
155
+ * principals (bare = the role when one exists, else the group). Grants
156
+ * always use this: granting `group/X` while `role/X` or a bare `X` is
157
+ * present must NOT be treated as already-granted, or the group silently
158
+ * never receives the grant.
159
+ * - `'name'`: the principal's explicit spelling AND the bare name match —
160
+ * `role/X` (or a bare `X`) matches `X` and `role/X`; `group/X` matches
161
+ * `X` and `group/X`. Never across kinds: a role's revoke never touches
162
+ * `group/X`, a group's never `role/X`. Revokes use this only when the
163
+ * bare name is this principal's (AccessMutationService decides), so
164
+ * revoking also removes the legacy bare spelling.
161
165
  */
162
166
  export type TokenMatch = 'exact' | 'name';
163
167
 
@@ -169,11 +173,14 @@ export type TokenMatch = 'exact' | 'name';
169
173
  function entryMatches(entry: ParsedEntry, p: Principal, tokenMatch: TokenMatch): boolean {
170
174
  if (p.kind === 'user') return entry.kind === 'user' && entry.email === canonicalEmail(p.email);
171
175
  if (entry.kind !== 'role') return false;
172
- const canonicalPrincipal = canonicalRoleName(p.role);
173
- if (tokenMatch === 'exact') return entry.role === canonicalPrincipal;
174
- const strip = (token: string): string =>
175
- token.startsWith('role/') ? canonicalRoleName(token.slice('role/'.length)) : token;
176
- return strip(entry.role) === strip(canonicalPrincipal);
176
+ // Compare split, canonical halves: `group/ Product` in the request names the
177
+ // same principal as the `group/product` the parser reads from the file.
178
+ const own = splitPrincipalToken(canonicalRoleName(p.role));
179
+ const theirs = splitPrincipalToken(entry.role);
180
+ if (theirs.name !== own.name) return false;
181
+ if (tokenMatch === 'exact') return theirs.prefix === own.prefix;
182
+ // Same family only: a bare principal stands for the role, as `role/` does.
183
+ return theirs.prefix === null || theirs.prefix === (own.prefix ?? 'role');
177
184
  }
178
185
 
179
186
  // ---------------------------------------------------------------------------
@@ -344,10 +351,10 @@ function blockEntries(fm: string[], block: VerbBlock): { entry: ParsedEntry; lin
344
351
  * Add `principal` under `verb`. Idempotent: if an entry with the EXACT same
345
352
  * token spelling already exists with the SAME deny-ness (a grant when
346
353
  * granting, a deny when denying), returns `changed: false`. Idempotency is
347
- * deliberately exact-token, never name-level: a bare token and a `role/`
348
- * token are different principals (group-first precedence gives the bare key
349
- * to a same-named group), so a bare-`X` GROUP grant must go through even when
350
- * `role/X` is present, and vice versa. Creates the verb key (and the
354
+ * deliberately exact-token, never name-level: a bare token, a `role/` token
355
+ * and a `group/` token can be different principals (the bare key is the
356
+ * role's when one exists), so a `group/X` grant must go through even when a
357
+ * bare `X` or `role/X` is present, and vice versa. Creates the verb key (and the
351
358
  * frontmatter fence, for a fresh file) as needed. Preserves everything else
352
359
  * byte-for-byte.
353
360
  *
@@ -445,11 +452,12 @@ export function spliceGrant(
445
452
  * Preserves everything else.
446
453
  *
447
454
  * Token matching for role-shaped principals is `tokenMatch` (default `'name'`:
448
- * BOTH spellings — revoking the role removes legacy bare spellings too).
449
- * Callers pass `'exact'` when a GROUP shadows the principal's bare name: the
450
- * bare token then belongs to the group and the `role/` token to the role, so a
451
- * revoke of one must never strip the other (see AccessMutationService, which
452
- * derives the flag from the merged principal index).
455
+ * the explicit spelling and the bare one — revoking removes legacy bare
456
+ * spellings too). Callers pass `'exact'` when the bare name belongs to the
457
+ * OTHER kind (a group revoke while a same-named role owns the bare key, or a
458
+ * role revoke while only a group of that name exists), so a revoke of one
459
+ * never strips the other (see AccessMutationService, which derives the flag
460
+ * from the merged principal index).
453
461
  */
454
462
  export function spliceRevoke(
455
463
  text: string,