@bevel-software/platform-core-backend 0.1.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 (720) hide show
  1. package/LICENSE +202 -0
  2. package/dist/assets.d.ts +5 -0
  3. package/dist/assets.d.ts.map +1 -0
  4. package/dist/assets.js +23 -0
  5. package/dist/assets.js.map +1 -0
  6. package/dist/core/core-ports.d.ts +83 -0
  7. package/dist/core/core-ports.d.ts.map +1 -0
  8. package/dist/core/core-ports.js +12 -0
  9. package/dist/core/core-ports.js.map +1 -0
  10. package/dist/core/create-core-server.d.ts +62 -0
  11. package/dist/core/create-core-server.d.ts.map +1 -0
  12. package/dist/core/create-core-server.js +204 -0
  13. package/dist/core/create-core-server.js.map +1 -0
  14. package/dist/core/create-core-services.d.ts +95 -0
  15. package/dist/core/create-core-services.d.ts.map +1 -0
  16. package/dist/core/create-core-services.js +352 -0
  17. package/dist/core/create-core-services.js.map +1 -0
  18. package/dist/core-config.d.ts +119 -0
  19. package/dist/core-config.d.ts.map +1 -0
  20. package/dist/core-config.js +240 -0
  21. package/dist/core-config.js.map +1 -0
  22. package/dist/index.d.ts +36 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +36 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/modules/access/access-control.interface.d.ts +348 -0
  27. package/dist/modules/access/access-control.interface.d.ts.map +1 -0
  28. package/dist/modules/access/access-control.interface.js +2 -0
  29. package/dist/modules/access/access-control.interface.js.map +1 -0
  30. package/dist/modules/access/access-control.service.d.ts +323 -0
  31. package/dist/modules/access/access-control.service.d.ts.map +1 -0
  32. package/dist/modules/access/access-control.service.js +1431 -0
  33. package/dist/modules/access/access-control.service.js.map +1 -0
  34. package/dist/modules/access/access-errors.d.ts +34 -0
  35. package/dist/modules/access/access-errors.d.ts.map +1 -0
  36. package/dist/modules/access/access-errors.js +40 -0
  37. package/dist/modules/access/access-errors.js.map +1 -0
  38. package/dist/modules/access/access-mutation.service.d.ts +176 -0
  39. package/dist/modules/access/access-mutation.service.d.ts.map +1 -0
  40. package/dist/modules/access/access-mutation.service.js +307 -0
  41. package/dist/modules/access/access-mutation.service.js.map +1 -0
  42. package/dist/modules/access/access-splice.d.ts +98 -0
  43. package/dist/modules/access/access-splice.d.ts.map +1 -0
  44. package/dist/modules/access/access-splice.js +346 -0
  45. package/dist/modules/access/access-splice.js.map +1 -0
  46. package/dist/modules/access/access.routes.d.ts +10 -0
  47. package/dist/modules/access/access.routes.d.ts.map +1 -0
  48. package/dist/modules/access/access.routes.js +757 -0
  49. package/dist/modules/access/access.routes.js.map +1 -0
  50. package/dist/modules/access/creator-access.d.ts +113 -0
  51. package/dist/modules/access/creator-access.d.ts.map +1 -0
  52. package/dist/modules/access/creator-access.js +212 -0
  53. package/dist/modules/access/creator-access.js.map +1 -0
  54. package/dist/modules/access/kb-read-filter.d.ts +41 -0
  55. package/dist/modules/access/kb-read-filter.d.ts.map +1 -0
  56. package/dist/modules/access/kb-read-filter.js +60 -0
  57. package/dist/modules/access/kb-read-filter.js.map +1 -0
  58. package/dist/modules/access/roles-admin.service.d.ts +240 -0
  59. package/dist/modules/access/roles-admin.service.d.ts.map +1 -0
  60. package/dist/modules/access/roles-admin.service.js +630 -0
  61. package/dist/modules/access/roles-admin.service.js.map +1 -0
  62. package/dist/modules/access/roles-edit.d.ts +91 -0
  63. package/dist/modules/access/roles-edit.d.ts.map +1 -0
  64. package/dist/modules/access/roles-edit.js +232 -0
  65. package/dist/modules/access/roles-edit.js.map +1 -0
  66. package/dist/modules/access/roles-yaml-guard.d.ts +56 -0
  67. package/dist/modules/access/roles-yaml-guard.d.ts.map +1 -0
  68. package/dist/modules/access/roles-yaml-guard.js +79 -0
  69. package/dist/modules/access/roles-yaml-guard.js.map +1 -0
  70. package/dist/modules/admin/admin-access.routes.d.ts +18 -0
  71. package/dist/modules/admin/admin-access.routes.d.ts.map +1 -0
  72. package/dist/modules/admin/admin-access.routes.js +26 -0
  73. package/dist/modules/admin/admin-access.routes.js.map +1 -0
  74. package/dist/modules/admin/admin-access.service.d.ts +24 -0
  75. package/dist/modules/admin/admin-access.service.d.ts.map +1 -0
  76. package/dist/modules/admin/admin-access.service.js +41 -0
  77. package/dist/modules/admin/admin-access.service.js.map +1 -0
  78. package/dist/modules/admin/admin.interface.d.ts +11 -0
  79. package/dist/modules/admin/admin.interface.d.ts.map +1 -0
  80. package/dist/modules/admin/admin.interface.js +2 -0
  81. package/dist/modules/admin/admin.interface.js.map +1 -0
  82. package/dist/modules/auth/account-erasure.service.d.ts +80 -0
  83. package/dist/modules/auth/account-erasure.service.d.ts.map +1 -0
  84. package/dist/modules/auth/account-erasure.service.js +91 -0
  85. package/dist/modules/auth/account-erasure.service.js.map +1 -0
  86. package/dist/modules/auth/auth.middleware.d.ts +23 -0
  87. package/dist/modules/auth/auth.middleware.d.ts.map +1 -0
  88. package/dist/modules/auth/auth.middleware.js +68 -0
  89. package/dist/modules/auth/auth.middleware.js.map +1 -0
  90. package/dist/modules/auth/auth.routes.d.ts +25 -0
  91. package/dist/modules/auth/auth.routes.d.ts.map +1 -0
  92. package/dist/modules/auth/auth.routes.js +72 -0
  93. package/dist/modules/auth/auth.routes.js.map +1 -0
  94. package/dist/modules/auth/auth.service.d.ts +76 -0
  95. package/dist/modules/auth/auth.service.d.ts.map +1 -0
  96. package/dist/modules/auth/auth.service.js +168 -0
  97. package/dist/modules/auth/auth.service.js.map +1 -0
  98. package/dist/modules/code-mode/code-mode-names.d.ts +16 -0
  99. package/dist/modules/code-mode/code-mode-names.d.ts.map +1 -0
  100. package/dist/modules/code-mode/code-mode-names.js +30 -0
  101. package/dist/modules/code-mode/code-mode-names.js.map +1 -0
  102. package/dist/modules/code-mode/code-mode.tool.d.ts +13 -0
  103. package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -0
  104. package/dist/modules/code-mode/code-mode.tool.js +112 -0
  105. package/dist/modules/code-mode/code-mode.tool.js.map +1 -0
  106. package/dist/modules/code-mode/index.d.ts +3 -0
  107. package/dist/modules/code-mode/index.d.ts.map +1 -0
  108. package/dist/modules/code-mode/index.js +3 -0
  109. package/dist/modules/code-mode/index.js.map +1 -0
  110. package/dist/modules/database/connection.d.ts +6 -0
  111. package/dist/modules/database/connection.d.ts.map +1 -0
  112. package/dist/modules/database/connection.js +12 -0
  113. package/dist/modules/database/connection.js.map +1 -0
  114. package/dist/modules/database/core-schema.d.ts +2273 -0
  115. package/dist/modules/database/core-schema.d.ts.map +1 -0
  116. package/dist/modules/database/core-schema.js +413 -0
  117. package/dist/modules/database/core-schema.js.map +1 -0
  118. package/dist/modules/database/migrate.d.ts +10 -0
  119. package/dist/modules/database/migrate.d.ts.map +1 -0
  120. package/dist/modules/database/migrate.js +40 -0
  121. package/dist/modules/database/migrate.js.map +1 -0
  122. package/dist/modules/database/schema.d.ts +12 -0
  123. package/dist/modules/database/schema.d.ts.map +1 -0
  124. package/dist/modules/database/schema.js +12 -0
  125. package/dist/modules/database/schema.js.map +1 -0
  126. package/dist/modules/diff/diff-paths.d.ts +2 -0
  127. package/dist/modules/diff/diff-paths.d.ts.map +1 -0
  128. package/dist/modules/diff/diff-paths.js +9 -0
  129. package/dist/modules/diff/diff-paths.js.map +1 -0
  130. package/dist/modules/diff/diff.config.d.ts +8 -0
  131. package/dist/modules/diff/diff.config.d.ts.map +1 -0
  132. package/dist/modules/diff/diff.config.js +13 -0
  133. package/dist/modules/diff/diff.config.js.map +1 -0
  134. package/dist/modules/diff/diff.interface.d.ts +73 -0
  135. package/dist/modules/diff/diff.interface.d.ts.map +1 -0
  136. package/dist/modules/diff/diff.interface.js +2 -0
  137. package/dist/modules/diff/diff.interface.js.map +1 -0
  138. package/dist/modules/diff/diff.routes.d.ts +35 -0
  139. package/dist/modules/diff/diff.routes.d.ts.map +1 -0
  140. package/dist/modules/diff/diff.routes.js +228 -0
  141. package/dist/modules/diff/diff.routes.js.map +1 -0
  142. package/dist/modules/diff/diff.service.d.ts +51 -0
  143. package/dist/modules/diff/diff.service.d.ts.map +1 -0
  144. package/dist/modules/diff/diff.service.js +489 -0
  145. package/dist/modules/diff/diff.service.js.map +1 -0
  146. package/dist/modules/diff/line-diff.d.ts +16 -0
  147. package/dist/modules/diff/line-diff.d.ts.map +1 -0
  148. package/dist/modules/diff/line-diff.js +67 -0
  149. package/dist/modules/diff/line-diff.js.map +1 -0
  150. package/dist/modules/mcp/mcp-auth.middleware.d.ts +27 -0
  151. package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -0
  152. package/dist/modules/mcp/mcp-auth.middleware.js +116 -0
  153. package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -0
  154. package/dist/modules/mcp/mcp-session-store.d.ts +74 -0
  155. package/dist/modules/mcp/mcp-session-store.d.ts.map +1 -0
  156. package/dist/modules/mcp/mcp-session-store.js +131 -0
  157. package/dist/modules/mcp/mcp-session-store.js.map +1 -0
  158. package/dist/modules/mcp/mcp.routes.d.ts +24 -0
  159. package/dist/modules/mcp/mcp.routes.d.ts.map +1 -0
  160. package/dist/modules/mcp/mcp.routes.js +229 -0
  161. package/dist/modules/mcp/mcp.routes.js.map +1 -0
  162. package/dist/modules/mcp/mcp.service.d.ts +198 -0
  163. package/dist/modules/mcp/mcp.service.d.ts.map +1 -0
  164. package/dist/modules/mcp/mcp.service.js +840 -0
  165. package/dist/modules/mcp/mcp.service.js.map +1 -0
  166. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +76 -0
  167. package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -0
  168. package/dist/modules/mcp/oauth/bevel-oauth-provider.js +291 -0
  169. package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -0
  170. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +18 -0
  171. package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -0
  172. package/dist/modules/mcp/oauth/oauth-consent.routes.js +52 -0
  173. package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -0
  174. package/dist/modules/mcp/oauth/oauth-state.d.ts +32 -0
  175. package/dist/modules/mcp/oauth/oauth-state.d.ts.map +1 -0
  176. package/dist/modules/mcp/oauth/oauth-state.js +34 -0
  177. package/dist/modules/mcp/oauth/oauth-state.js.map +1 -0
  178. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +92 -0
  179. package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -0
  180. package/dist/modules/secrets-vault/db-secrets-vault.service.js +728 -0
  181. package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -0
  182. package/dist/modules/secrets-vault/index.d.ts +7 -0
  183. package/dist/modules/secrets-vault/index.d.ts.map +1 -0
  184. package/dist/modules/secrets-vault/index.js +6 -0
  185. package/dist/modules/secrets-vault/index.js.map +1 -0
  186. package/dist/modules/secrets-vault/mcp-oauth-discovery.service.d.ts +63 -0
  187. package/dist/modules/secrets-vault/mcp-oauth-discovery.service.d.ts.map +1 -0
  188. package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js +269 -0
  189. package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js.map +1 -0
  190. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +46 -0
  191. package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -0
  192. package/dist/modules/secrets-vault/secrets-variable-loader.js +87 -0
  193. package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -0
  194. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +210 -0
  195. package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -0
  196. package/dist/modules/secrets-vault/secrets-vault.contract.js +90 -0
  197. package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -0
  198. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +30 -0
  199. package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -0
  200. package/dist/modules/secrets-vault/secrets-vault.routes.js +490 -0
  201. package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -0
  202. package/dist/modules/skills/index.d.ts +5 -0
  203. package/dist/modules/skills/index.d.ts.map +1 -0
  204. package/dist/modules/skills/index.js +4 -0
  205. package/dist/modules/skills/index.js.map +1 -0
  206. package/dist/modules/skills/skills.contract.d.ts +58 -0
  207. package/dist/modules/skills/skills.contract.d.ts.map +1 -0
  208. package/dist/modules/skills/skills.contract.js +10 -0
  209. package/dist/modules/skills/skills.contract.js.map +1 -0
  210. package/dist/modules/skills/skills.routes.d.ts +15 -0
  211. package/dist/modules/skills/skills.routes.d.ts.map +1 -0
  212. package/dist/modules/skills/skills.routes.js +34 -0
  213. package/dist/modules/skills/skills.routes.js.map +1 -0
  214. package/dist/modules/skills/skills.service.d.ts +21 -0
  215. package/dist/modules/skills/skills.service.d.ts.map +1 -0
  216. package/dist/modules/skills/skills.service.js +202 -0
  217. package/dist/modules/skills/skills.service.js.map +1 -0
  218. package/dist/modules/skills/skills.tools.d.ts +15 -0
  219. package/dist/modules/skills/skills.tools.d.ts.map +1 -0
  220. package/dist/modules/skills/skills.tools.js +96 -0
  221. package/dist/modules/skills/skills.tools.js.map +1 -0
  222. package/dist/modules/tool-auth/external-api-key.errors.d.ts +14 -0
  223. package/dist/modules/tool-auth/external-api-key.errors.d.ts.map +1 -0
  224. package/dist/modules/tool-auth/external-api-key.errors.js +23 -0
  225. package/dist/modules/tool-auth/external-api-key.errors.js.map +1 -0
  226. package/dist/modules/tool-auth/external-api-key.interface.d.ts +90 -0
  227. package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -0
  228. package/dist/modules/tool-auth/external-api-key.interface.js +2 -0
  229. package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -0
  230. package/dist/modules/tool-auth/external-api-key.service.d.ts +25 -0
  231. package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -0
  232. package/dist/modules/tool-auth/external-api-key.service.js +164 -0
  233. package/dist/modules/tool-auth/external-api-key.service.js.map +1 -0
  234. package/dist/modules/tool-auth/internal-token.service.d.ts +62 -0
  235. package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -0
  236. package/dist/modules/tool-auth/internal-token.service.js +85 -0
  237. package/dist/modules/tool-auth/internal-token.service.js.map +1 -0
  238. package/dist/modules/tool-auth/llm-usage-meter.d.ts +16 -0
  239. package/dist/modules/tool-auth/llm-usage-meter.d.ts.map +1 -0
  240. package/dist/modules/tool-auth/llm-usage-meter.js +6 -0
  241. package/dist/modules/tool-auth/llm-usage-meter.js.map +1 -0
  242. package/dist/modules/tool-auth/tool-auth.middleware.d.ts +101 -0
  243. package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -0
  244. package/dist/modules/tool-auth/tool-auth.middleware.js +166 -0
  245. package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -0
  246. package/dist/modules/tool-helpers/index.d.ts +19 -0
  247. package/dist/modules/tool-helpers/index.d.ts.map +1 -0
  248. package/dist/modules/tool-helpers/index.js +18 -0
  249. package/dist/modules/tool-helpers/index.js.map +1 -0
  250. package/dist/modules/tool-helpers/tool-context.d.ts +35 -0
  251. package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -0
  252. package/dist/modules/tool-helpers/tool-context.js +66 -0
  253. package/dist/modules/tool-helpers/tool-context.js.map +1 -0
  254. package/dist/modules/tool-helpers/tool-def.d.ts +33 -0
  255. package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -0
  256. package/dist/modules/tool-helpers/tool-def.js +57 -0
  257. package/dist/modules/tool-helpers/tool-def.js.map +1 -0
  258. package/dist/modules/tool-helpers/tool-handler.d.ts +19 -0
  259. package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -0
  260. package/dist/modules/tool-helpers/tool-handler.js +84 -0
  261. package/dist/modules/tool-helpers/tool-handler.js.map +1 -0
  262. package/dist/modules/tool-helpers/tool.contract.d.ts +64 -0
  263. package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -0
  264. package/dist/modules/tool-helpers/tool.contract.js +24 -0
  265. package/dist/modules/tool-helpers/tool.contract.js.map +1 -0
  266. package/dist/modules/tool-helpers/validate-token.d.ts +31 -0
  267. package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -0
  268. package/dist/modules/tool-helpers/validate-token.js +20 -0
  269. package/dist/modules/tool-helpers/validate-token.js.map +1 -0
  270. package/dist/modules/tool-manuals/index.d.ts +5 -0
  271. package/dist/modules/tool-manuals/index.d.ts.map +1 -0
  272. package/dist/modules/tool-manuals/index.js +5 -0
  273. package/dist/modules/tool-manuals/index.js.map +1 -0
  274. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +182 -0
  275. package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -0
  276. package/dist/modules/tool-manuals/tool-manuals.contract.js +19 -0
  277. package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -0
  278. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +24 -0
  279. package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -0
  280. package/dist/modules/tool-manuals/tool-manuals.routes.js +102 -0
  281. package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -0
  282. package/dist/modules/tool-manuals/tool-manuals.service.d.ts +108 -0
  283. package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -0
  284. package/dist/modules/tool-manuals/tool-manuals.service.js +710 -0
  285. package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -0
  286. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +35 -0
  287. package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -0
  288. package/dist/modules/tool-manuals/tool-manuals.tools.js +157 -0
  289. package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -0
  290. package/dist/modules/tool-registry/manual.routes.d.ts +6 -0
  291. package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -0
  292. package/dist/modules/tool-registry/manual.routes.js +76 -0
  293. package/dist/modules/tool-registry/manual.routes.js.map +1 -0
  294. package/dist/modules/tool-registry/tool-registry.d.ts +23 -0
  295. package/dist/modules/tool-registry/tool-registry.d.ts.map +1 -0
  296. package/dist/modules/tool-registry/tool-registry.js +46 -0
  297. package/dist/modules/tool-registry/tool-registry.js.map +1 -0
  298. package/dist/modules/tool-registry/tool.contract.d.ts +48 -0
  299. package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -0
  300. package/dist/modules/tool-registry/tool.contract.js +2 -0
  301. package/dist/modules/tool-registry/tool.contract.js.map +1 -0
  302. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +14 -0
  303. package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -0
  304. package/dist/modules/workflow/agent-tools/workflow.tools.js +437 -0
  305. package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -0
  306. package/dist/modules/workflow/event-bus.d.ts +107 -0
  307. package/dist/modules/workflow/event-bus.d.ts.map +1 -0
  308. package/dist/modules/workflow/event-bus.js +224 -0
  309. package/dist/modules/workflow/event-bus.js.map +1 -0
  310. package/dist/modules/workflow/events.routes.d.ts +80 -0
  311. package/dist/modules/workflow/events.routes.d.ts.map +1 -0
  312. package/dist/modules/workflow/events.routes.js +216 -0
  313. package/dist/modules/workflow/events.routes.js.map +1 -0
  314. package/dist/modules/workflow/file-change-notifier.d.ts +38 -0
  315. package/dist/modules/workflow/file-change-notifier.d.ts.map +1 -0
  316. package/dist/modules/workflow/file-change-notifier.js +22 -0
  317. package/dist/modules/workflow/file-change-notifier.js.map +1 -0
  318. package/dist/modules/workflow/file-lock.service.d.ts +57 -0
  319. package/dist/modules/workflow/file-lock.service.d.ts.map +1 -0
  320. package/dist/modules/workflow/file-lock.service.js +202 -0
  321. package/dist/modules/workflow/file-lock.service.js.map +1 -0
  322. package/dist/modules/workflow/git/branch-name.d.ts +10 -0
  323. package/dist/modules/workflow/git/branch-name.d.ts.map +1 -0
  324. package/dist/modules/workflow/git/branch-name.js +76 -0
  325. package/dist/modules/workflow/git/branch-name.js.map +1 -0
  326. package/dist/modules/workflow/git/clone-config.d.ts +61 -0
  327. package/dist/modules/workflow/git/clone-config.d.ts.map +1 -0
  328. package/dist/modules/workflow/git/clone-config.js +69 -0
  329. package/dist/modules/workflow/git/clone-config.js.map +1 -0
  330. package/dist/modules/workflow/git/git-version.d.ts +34 -0
  331. package/dist/modules/workflow/git/git-version.d.ts.map +1 -0
  332. package/dist/modules/workflow/git/git-version.js +63 -0
  333. package/dist/modules/workflow/git/git-version.js.map +1 -0
  334. package/dist/modules/workflow/git/git.service.d.ts +427 -0
  335. package/dist/modules/workflow/git/git.service.d.ts.map +1 -0
  336. package/dist/modules/workflow/git/git.service.js +1987 -0
  337. package/dist/modules/workflow/git/git.service.js.map +1 -0
  338. package/dist/modules/workflow/git/mutex.d.ts +11 -0
  339. package/dist/modules/workflow/git/mutex.d.ts.map +1 -0
  340. package/dist/modules/workflow/git/mutex.js +23 -0
  341. package/dist/modules/workflow/git/mutex.js.map +1 -0
  342. package/dist/modules/workflow/git/pull-request.service.d.ts +124 -0
  343. package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -0
  344. package/dist/modules/workflow/git/pull-request.service.js +328 -0
  345. package/dist/modules/workflow/git/pull-request.service.js.map +1 -0
  346. package/dist/modules/workflow/locking-filesystem.d.ts +133 -0
  347. package/dist/modules/workflow/locking-filesystem.d.ts.map +1 -0
  348. package/dist/modules/workflow/locking-filesystem.js +400 -0
  349. package/dist/modules/workflow/locking-filesystem.js.map +1 -0
  350. package/dist/modules/workflow/pending-commits.service.d.ts +221 -0
  351. package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -0
  352. package/dist/modules/workflow/pending-commits.service.js +364 -0
  353. package/dist/modules/workflow/pending-commits.service.js.map +1 -0
  354. package/dist/modules/workflow/pending-commits.worker.d.ts +148 -0
  355. package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -0
  356. package/dist/modules/workflow/pending-commits.worker.js +245 -0
  357. package/dist/modules/workflow/pending-commits.worker.js.map +1 -0
  358. package/dist/modules/workflow/read-only-filesystem.d.ts +24 -0
  359. package/dist/modules/workflow/read-only-filesystem.d.ts.map +1 -0
  360. package/dist/modules/workflow/read-only-filesystem.js +39 -0
  361. package/dist/modules/workflow/read-only-filesystem.js.map +1 -0
  362. package/dist/modules/workflow/recovery-bot.d.ts +31 -0
  363. package/dist/modules/workflow/recovery-bot.d.ts.map +1 -0
  364. package/dist/modules/workflow/recovery-bot.js +64 -0
  365. package/dist/modules/workflow/recovery-bot.js.map +1 -0
  366. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts +137 -0
  367. package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +1 -0
  368. package/dist/modules/workflow/review-workflow/review-workflow.interface.js +2 -0
  369. package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +1 -0
  370. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +26 -0
  371. package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -0
  372. package/dist/modules/workflow/review-workflow/review-workflow.service.js +636 -0
  373. package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -0
  374. package/dist/modules/workflow/sanitize-error.d.ts +29 -0
  375. package/dist/modules/workflow/sanitize-error.d.ts.map +1 -0
  376. package/dist/modules/workflow/sanitize-error.js +60 -0
  377. package/dist/modules/workflow/sanitize-error.js.map +1 -0
  378. package/dist/modules/workflow/session-ontology.policy.d.ts +52 -0
  379. package/dist/modules/workflow/session-ontology.policy.d.ts.map +1 -0
  380. package/dist/modules/workflow/session-ontology.policy.js +62 -0
  381. package/dist/modules/workflow/session-ontology.policy.js.map +1 -0
  382. package/dist/modules/workflow/session-ontology.service.d.ts +100 -0
  383. package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -0
  384. package/dist/modules/workflow/session-ontology.service.js +143 -0
  385. package/dist/modules/workflow/session-ontology.service.js.map +1 -0
  386. package/dist/modules/workflow/workflow-hooks.d.ts +87 -0
  387. package/dist/modules/workflow/workflow-hooks.d.ts.map +1 -0
  388. package/dist/modules/workflow/workflow-hooks.js +35 -0
  389. package/dist/modules/workflow/workflow-hooks.js.map +1 -0
  390. package/dist/modules/workflow/workflow.errors.d.ts +171 -0
  391. package/dist/modules/workflow/workflow.errors.d.ts.map +1 -0
  392. package/dist/modules/workflow/workflow.errors.js +260 -0
  393. package/dist/modules/workflow/workflow.errors.js.map +1 -0
  394. package/dist/modules/workflow/workflow.routes.d.ts +26 -0
  395. package/dist/modules/workflow/workflow.routes.d.ts.map +1 -0
  396. package/dist/modules/workflow/workflow.routes.js +804 -0
  397. package/dist/modules/workflow/workflow.routes.js.map +1 -0
  398. package/dist/modules/workflow/workflow.service.d.ts +385 -0
  399. package/dist/modules/workflow/workflow.service.d.ts.map +1 -0
  400. package/dist/modules/workflow/workflow.service.js +1155 -0
  401. package/dist/modules/workflow/workflow.service.js.map +1 -0
  402. package/dist/modules/workspace/bevel-ignore.d.ts +25 -0
  403. package/dist/modules/workspace/bevel-ignore.d.ts.map +1 -0
  404. package/dist/modules/workspace/bevel-ignore.js +57 -0
  405. package/dist/modules/workspace/bevel-ignore.js.map +1 -0
  406. package/dist/modules/workspace/kb-seed.interface.d.ts +36 -0
  407. package/dist/modules/workspace/kb-seed.interface.d.ts.map +1 -0
  408. package/dist/modules/workspace/kb-seed.interface.js +2 -0
  409. package/dist/modules/workspace/kb-seed.interface.js.map +1 -0
  410. package/dist/modules/workspace/kb-seed.service.d.ts +70 -0
  411. package/dist/modules/workspace/kb-seed.service.d.ts.map +1 -0
  412. package/dist/modules/workspace/kb-seed.service.js +325 -0
  413. package/dist/modules/workspace/kb-seed.service.js.map +1 -0
  414. package/dist/modules/workspace/routine-write-policy.d.ts +49 -0
  415. package/dist/modules/workspace/routine-write-policy.d.ts.map +1 -0
  416. package/dist/modules/workspace/routine-write-policy.js +46 -0
  417. package/dist/modules/workspace/routine-write-policy.js.map +1 -0
  418. package/dist/modules/workspace/session-ontology.gate.d.ts +112 -0
  419. package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -0
  420. package/dist/modules/workspace/session-ontology.gate.js +161 -0
  421. package/dist/modules/workspace/session-ontology.gate.js.map +1 -0
  422. package/dist/modules/workspace/session-sink.d.ts +25 -0
  423. package/dist/modules/workspace/session-sink.d.ts.map +1 -0
  424. package/dist/modules/workspace/session-sink.js +8 -0
  425. package/dist/modules/workspace/session-sink.js.map +1 -0
  426. package/dist/modules/workspace/spill-store.d.ts +24 -0
  427. package/dist/modules/workspace/spill-store.d.ts.map +1 -0
  428. package/dist/modules/workspace/spill-store.js +87 -0
  429. package/dist/modules/workspace/spill-store.js.map +1 -0
  430. package/dist/modules/workspace/workspace.routes.d.ts +25 -0
  431. package/dist/modules/workspace/workspace.routes.d.ts.map +1 -0
  432. package/dist/modules/workspace/workspace.routes.js +1046 -0
  433. package/dist/modules/workspace/workspace.routes.js.map +1 -0
  434. package/dist/modules/workspace/workspace.service.d.ts +339 -0
  435. package/dist/modules/workspace/workspace.service.d.ts.map +1 -0
  436. package/dist/modules/workspace/workspace.service.js +1221 -0
  437. package/dist/modules/workspace/workspace.service.js.map +1 -0
  438. package/dist/modules/workspace/workspace.tools.d.ts +19 -0
  439. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -0
  440. package/dist/modules/workspace/workspace.tools.js +767 -0
  441. package/dist/modules/workspace/workspace.tools.js.map +1 -0
  442. package/dist/shared/frontmatter-id.d.ts +35 -0
  443. package/dist/shared/frontmatter-id.d.ts.map +1 -0
  444. package/dist/shared/frontmatter-id.js +68 -0
  445. package/dist/shared/frontmatter-id.js.map +1 -0
  446. package/dist/shared/fs-walk.d.ts +9 -0
  447. package/dist/shared/fs-walk.d.ts.map +1 -0
  448. package/dist/shared/fs-walk.js +34 -0
  449. package/dist/shared/fs-walk.js.map +1 -0
  450. package/dist/shared/hash-email.d.ts +11 -0
  451. package/dist/shared/hash-email.d.ts.map +1 -0
  452. package/dist/shared/hash-email.js +14 -0
  453. package/dist/shared/hash-email.js.map +1 -0
  454. package/dist/shared/kb-layout.d.ts +38 -0
  455. package/dist/shared/kb-layout.d.ts.map +1 -0
  456. package/dist/shared/kb-layout.js +102 -0
  457. package/dist/shared/kb-layout.js.map +1 -0
  458. package/dist/shared/kb-layout.test.d.ts +2 -0
  459. package/dist/shared/kb-layout.test.d.ts.map +1 -0
  460. package/dist/shared/kb-layout.test.js +67 -0
  461. package/dist/shared/kb-layout.test.js.map +1 -0
  462. package/dist/shared/ssrf.d.ts +20 -0
  463. package/dist/shared/ssrf.d.ts.map +1 -0
  464. package/dist/shared/ssrf.js +89 -0
  465. package/dist/shared/ssrf.js.map +1 -0
  466. package/dist/shared/token-crypto.d.ts +16 -0
  467. package/dist/shared/token-crypto.d.ts.map +1 -0
  468. package/dist/shared/token-crypto.js +49 -0
  469. package/dist/shared/token-crypto.js.map +1 -0
  470. package/dist/shared/ttl-cache.d.ts +16 -0
  471. package/dist/shared/ttl-cache.d.ts.map +1 -0
  472. package/dist/shared/ttl-cache.js +27 -0
  473. package/dist/shared/ttl-cache.js.map +1 -0
  474. package/dist/shared/utcp-namespace.d.ts +46 -0
  475. package/dist/shared/utcp-namespace.d.ts.map +1 -0
  476. package/dist/shared/utcp-namespace.js +82 -0
  477. package/dist/shared/utcp-namespace.js.map +1 -0
  478. package/dist/version.d.ts +17 -0
  479. package/dist/version.d.ts.map +1 -0
  480. package/dist/version.js +19 -0
  481. package/dist/version.js.map +1 -0
  482. package/kb-template/.bevelignore +21 -0
  483. package/kb-template/Agents/.gitkeep +0 -0
  484. package/kb-template/Agents/README.md +38 -0
  485. package/kb-template/CLAUDE.md +419 -0
  486. package/kb-template/Data/.gitkeep +0 -0
  487. package/kb-template/Data/README.md +39 -0
  488. package/kb-template/KnowledgeBase/.gitkeep +0 -0
  489. package/kb-template/KnowledgeBase/README.md +37 -0
  490. package/kb-template/Pipelines/.gitkeep +0 -0
  491. package/kb-template/Pipelines/README.md +38 -0
  492. package/kb-template/Skills/.gitkeep +0 -0
  493. package/kb-template/Skills/README.md +32 -0
  494. package/kb-template/Tools/.gitkeep +0 -0
  495. package/kb-template/Tools/README.md +42 -0
  496. package/kb-template/access.md +36 -0
  497. package/migrations/0000_core_init.sql +243 -0
  498. package/migrations/meta/0000_snapshot.json +1480 -0
  499. package/migrations/meta/_journal.json +13 -0
  500. package/package.json +80 -0
  501. package/src/assets.ts +25 -0
  502. package/src/core/core-ports.ts +91 -0
  503. package/src/core/create-core-server.ts +338 -0
  504. package/src/core/create-core-services.ts +501 -0
  505. package/src/core-config.ts +257 -0
  506. package/src/index.ts +69 -0
  507. package/src/modules/access/__tests__/access-control.atref-batch.test.ts +98 -0
  508. package/src/modules/access/__tests__/access-control.read-batch.test.ts +132 -0
  509. package/src/modules/access/__tests__/access-control.service.test.ts +1011 -0
  510. package/src/modules/access/__tests__/access-mutation.service.test.ts +439 -0
  511. package/src/modules/access/__tests__/access-splice.test.ts +247 -0
  512. package/src/modules/access/__tests__/access.routes.revoke.test.ts +407 -0
  513. package/src/modules/access/__tests__/creator-access.test.ts +217 -0
  514. package/src/modules/access/__tests__/grant-sources.test.ts +204 -0
  515. package/src/modules/access/__tests__/kb-read-filter.test.ts +70 -0
  516. package/src/modules/access/__tests__/roles-admin.service.test.ts +469 -0
  517. package/src/modules/access/__tests__/roles-edit.test.ts +138 -0
  518. package/src/modules/access/__tests__/roles-yaml-guard.test.ts +70 -0
  519. package/src/modules/access/__tests__/roles.routes.test.ts +234 -0
  520. package/src/modules/access/access-control.interface.ts +383 -0
  521. package/src/modules/access/access-control.service.ts +1794 -0
  522. package/src/modules/access/access-errors.ts +60 -0
  523. package/src/modules/access/access-mutation.service.ts +369 -0
  524. package/src/modules/access/access-splice.ts +413 -0
  525. package/src/modules/access/access.routes.ts +894 -0
  526. package/src/modules/access/creator-access.ts +270 -0
  527. package/src/modules/access/kb-read-filter.ts +76 -0
  528. package/src/modules/access/roles-admin.service.ts +741 -0
  529. package/src/modules/access/roles-edit.ts +248 -0
  530. package/src/modules/access/roles-yaml-guard.ts +89 -0
  531. package/src/modules/admin/admin-access.routes.ts +29 -0
  532. package/src/modules/admin/admin-access.service.ts +38 -0
  533. package/src/modules/admin/admin.interface.ts +10 -0
  534. package/src/modules/auth/account-erasure.service.ts +183 -0
  535. package/src/modules/auth/auth.middleware.ts +78 -0
  536. package/src/modules/auth/auth.routes.ts +97 -0
  537. package/src/modules/auth/auth.service.ts +199 -0
  538. package/src/modules/code-mode/code-mode-names.ts +38 -0
  539. package/src/modules/code-mode/code-mode.tool.ts +117 -0
  540. package/src/modules/code-mode/index.ts +6 -0
  541. package/src/modules/database/connection.ts +15 -0
  542. package/src/modules/database/core-schema.ts +431 -0
  543. package/src/modules/database/migrate.ts +43 -0
  544. package/src/modules/database/schema.ts +11 -0
  545. package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +87 -0
  546. package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +150 -0
  547. package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +184 -0
  548. package/src/modules/diff/__tests__/diff.service.test.ts +202 -0
  549. package/src/modules/diff/diff-paths.ts +9 -0
  550. package/src/modules/diff/diff.config.ts +12 -0
  551. package/src/modules/diff/diff.interface.ts +78 -0
  552. package/src/modules/diff/diff.routes.ts +277 -0
  553. package/src/modules/diff/diff.service.ts +508 -0
  554. package/src/modules/diff/line-diff.ts +79 -0
  555. package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +287 -0
  556. package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +249 -0
  557. package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +253 -0
  558. package/src/modules/mcp/__tests__/mcp-session-store.test.ts +151 -0
  559. package/src/modules/mcp/__tests__/mcp.e2e.test.ts +150 -0
  560. package/src/modules/mcp/__tests__/mcp.routes.delete.test.ts +92 -0
  561. package/src/modules/mcp/__tests__/mcp.service.test.ts +414 -0
  562. package/src/modules/mcp/mcp-auth.middleware.ts +126 -0
  563. package/src/modules/mcp/mcp-session-store.ts +162 -0
  564. package/src/modules/mcp/mcp.routes.ts +263 -0
  565. package/src/modules/mcp/mcp.service.ts +973 -0
  566. package/src/modules/mcp/oauth/bevel-oauth-provider.ts +401 -0
  567. package/src/modules/mcp/oauth/oauth-consent.routes.ts +60 -0
  568. package/src/modules/mcp/oauth/oauth-state.ts +61 -0
  569. package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +277 -0
  570. package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +206 -0
  571. package/src/modules/secrets-vault/__tests__/mcp-oauth-discovery.service.test.ts +178 -0
  572. package/src/modules/secrets-vault/__tests__/scopes-covered.test.ts +101 -0
  573. package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +54 -0
  574. package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +143 -0
  575. package/src/modules/secrets-vault/db-secrets-vault.service.ts +792 -0
  576. package/src/modules/secrets-vault/index.ts +25 -0
  577. package/src/modules/secrets-vault/mcp-oauth-discovery.service.ts +289 -0
  578. package/src/modules/secrets-vault/secrets-variable-loader.ts +104 -0
  579. package/src/modules/secrets-vault/secrets-vault.contract.ts +270 -0
  580. package/src/modules/secrets-vault/secrets-vault.routes.ts +526 -0
  581. package/src/modules/skills/__tests__/skills.service.test.ts +176 -0
  582. package/src/modules/skills/index.ts +10 -0
  583. package/src/modules/skills/skills.contract.ts +54 -0
  584. package/src/modules/skills/skills.routes.ts +38 -0
  585. package/src/modules/skills/skills.service.ts +245 -0
  586. package/src/modules/skills/skills.tools.ts +121 -0
  587. package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +358 -0
  588. package/src/modules/tool-auth/__tests__/internal-token.service.test.ts +79 -0
  589. package/src/modules/tool-auth/__tests__/manual-auth.middleware.test.ts +88 -0
  590. package/src/modules/tool-auth/external-api-key.errors.ts +25 -0
  591. package/src/modules/tool-auth/external-api-key.interface.ts +99 -0
  592. package/src/modules/tool-auth/external-api-key.service.ts +209 -0
  593. package/src/modules/tool-auth/internal-token.service.ts +124 -0
  594. package/src/modules/tool-auth/llm-usage-meter.ts +19 -0
  595. package/src/modules/tool-auth/tool-auth.middleware.ts +220 -0
  596. package/src/modules/tool-helpers/__tests__/phase0-loopback-spike.test.ts +129 -0
  597. package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +95 -0
  598. package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +146 -0
  599. package/src/modules/tool-helpers/__tests__/validate-token.test.ts +75 -0
  600. package/src/modules/tool-helpers/index.ts +18 -0
  601. package/src/modules/tool-helpers/tool-context.ts +98 -0
  602. package/src/modules/tool-helpers/tool-def.ts +73 -0
  603. package/src/modules/tool-helpers/tool-handler.ts +91 -0
  604. package/src/modules/tool-helpers/tool.contract.ts +85 -0
  605. package/src/modules/tool-helpers/validate-token.ts +50 -0
  606. package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +200 -0
  607. package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +499 -0
  608. package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +156 -0
  609. package/src/modules/tool-manuals/index.ts +12 -0
  610. package/src/modules/tool-manuals/tool-manuals.contract.ts +183 -0
  611. package/src/modules/tool-manuals/tool-manuals.routes.ts +110 -0
  612. package/src/modules/tool-manuals/tool-manuals.service.ts +781 -0
  613. package/src/modules/tool-manuals/tool-manuals.tools.ts +202 -0
  614. package/src/modules/tool-registry/__tests__/tool-registry.test.ts +64 -0
  615. package/src/modules/tool-registry/manual.routes.ts +87 -0
  616. package/src/modules/tool-registry/tool-registry.ts +55 -0
  617. package/src/modules/tool-registry/tool.contract.ts +52 -0
  618. package/src/modules/workflow/__tests__/event-bus.test.ts +322 -0
  619. package/src/modules/workflow/__tests__/file-change-notifier.test.ts +51 -0
  620. package/src/modules/workflow/__tests__/format-affected-owners.test.ts +67 -0
  621. package/src/modules/workflow/__tests__/locking-filesystem.test.ts +445 -0
  622. package/src/modules/workflow/__tests__/pending-commits.canonical.test.ts +36 -0
  623. package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +243 -0
  624. package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +308 -0
  625. package/src/modules/workflow/__tests__/sanitize-error.test.ts +67 -0
  626. package/src/modules/workflow/__tests__/session-ontology.policy.test.ts +62 -0
  627. package/src/modules/workflow/__tests__/session-ontology.service.test.ts +200 -0
  628. package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +232 -0
  629. package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +380 -0
  630. package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +340 -0
  631. package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +192 -0
  632. package/src/modules/workflow/agent-tools/workflow.tools.ts +502 -0
  633. package/src/modules/workflow/event-bus.ts +262 -0
  634. package/src/modules/workflow/events.routes.ts +266 -0
  635. package/src/modules/workflow/file-change-notifier.ts +54 -0
  636. package/src/modules/workflow/file-lock.service.ts +269 -0
  637. package/src/modules/workflow/git/__tests__/branch-name.test.ts +86 -0
  638. package/src/modules/workflow/git/__tests__/branchAuthor.test.ts +80 -0
  639. package/src/modules/workflow/git/__tests__/clone-config.test.ts +15 -0
  640. package/src/modules/workflow/git/__tests__/git-test-helpers.ts +47 -0
  641. package/src/modules/workflow/git/__tests__/git-version.failure.test.ts +24 -0
  642. package/src/modules/workflow/git/__tests__/git-version.test.ts +49 -0
  643. package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +389 -0
  644. package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +124 -0
  645. package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +105 -0
  646. package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +211 -0
  647. package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +154 -0
  648. package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +320 -0
  649. package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +202 -0
  650. package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +453 -0
  651. package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +198 -0
  652. package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +125 -0
  653. package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +219 -0
  654. package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +145 -0
  655. package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +240 -0
  656. package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +272 -0
  657. package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +232 -0
  658. package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +101 -0
  659. package/src/modules/workflow/git/__tests__/git.service.status.test.ts +127 -0
  660. package/src/modules/workflow/git/__tests__/mutex.test.ts +78 -0
  661. package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +225 -0
  662. package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +101 -0
  663. package/src/modules/workflow/git/branch-name.ts +70 -0
  664. package/src/modules/workflow/git/clone-config.ts +71 -0
  665. package/src/modules/workflow/git/git-version.ts +70 -0
  666. package/src/modules/workflow/git/git.service.ts +2248 -0
  667. package/src/modules/workflow/git/mutex.ts +22 -0
  668. package/src/modules/workflow/git/pull-request.service.ts +447 -0
  669. package/src/modules/workflow/locking-filesystem.ts +489 -0
  670. package/src/modules/workflow/pending-commits.service.ts +444 -0
  671. package/src/modules/workflow/pending-commits.worker.ts +361 -0
  672. package/src/modules/workflow/read-only-filesystem.ts +54 -0
  673. package/src/modules/workflow/recovery-bot.ts +73 -0
  674. package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +560 -0
  675. package/src/modules/workflow/review-workflow/__tests__/cancel-pr.test.ts +176 -0
  676. package/src/modules/workflow/review-workflow/__tests__/merge-gate.test.ts +258 -0
  677. package/src/modules/workflow/review-workflow/review-workflow.interface.ts +199 -0
  678. package/src/modules/workflow/review-workflow/review-workflow.service.ts +806 -0
  679. package/src/modules/workflow/sanitize-error.ts +62 -0
  680. package/src/modules/workflow/session-ontology.policy.ts +70 -0
  681. package/src/modules/workflow/session-ontology.service.ts +178 -0
  682. package/src/modules/workflow/workflow-hooks.ts +101 -0
  683. package/src/modules/workflow/workflow.errors.ts +285 -0
  684. package/src/modules/workflow/workflow.routes.ts +858 -0
  685. package/src/modules/workflow/workflow.service.ts +1555 -0
  686. package/src/modules/workspace/__tests__/kb-seed.service.test.ts +213 -0
  687. package/src/modules/workspace/__tests__/routine-write-policy.test.ts +68 -0
  688. package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +237 -0
  689. package/src/modules/workspace/__tests__/spill-store.test.ts +43 -0
  690. package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +233 -0
  691. package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +176 -0
  692. package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +303 -0
  693. package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +276 -0
  694. package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +120 -0
  695. package/src/modules/workspace/__tests__/workspace.service.test.ts +565 -0
  696. package/src/modules/workspace/__tests__/workspace.tools.test.ts +504 -0
  697. package/src/modules/workspace/bevel-ignore.ts +62 -0
  698. package/src/modules/workspace/kb-seed.interface.ts +36 -0
  699. package/src/modules/workspace/kb-seed.service.ts +361 -0
  700. package/src/modules/workspace/routine-write-policy.ts +79 -0
  701. package/src/modules/workspace/session-ontology.gate.ts +189 -0
  702. package/src/modules/workspace/session-sink.ts +25 -0
  703. package/src/modules/workspace/spill-store.ts +87 -0
  704. package/src/modules/workspace/workspace.routes.ts +1114 -0
  705. package/src/modules/workspace/workspace.service.ts +1343 -0
  706. package/src/modules/workspace/workspace.tools.ts +885 -0
  707. package/src/shared/__tests__/frontmatter-id.test.ts +88 -0
  708. package/src/shared/__tests__/fs-walk.test.ts +42 -0
  709. package/src/shared/__tests__/ssrf.test.ts +53 -0
  710. package/src/shared/__tests__/utcp-namespace.test.ts +19 -0
  711. package/src/shared/frontmatter-id.ts +72 -0
  712. package/src/shared/fs-walk.ts +30 -0
  713. package/src/shared/hash-email.ts +14 -0
  714. package/src/shared/kb-layout.test.ts +88 -0
  715. package/src/shared/kb-layout.ts +101 -0
  716. package/src/shared/ssrf.ts +78 -0
  717. package/src/shared/token-crypto.ts +54 -0
  718. package/src/shared/ttl-cache.ts +27 -0
  719. package/src/shared/utcp-namespace.ts +88 -0
  720. package/src/version.ts +19 -0
@@ -0,0 +1,630 @@
1
+ /**
2
+ * Admin Roles & Members service — full CRUD on the default-branch `roles.yaml`.
3
+ *
4
+ * This is the deferred "Slice 2" of `manage-access-grant-revoke`: the in-product
5
+ * surface for creating/deleting roles, adding/removing members, and renaming a
6
+ * role. It is the ONLY writer of `roles.yaml` outside a hand-edit, and it is
7
+ * built around one non-negotiable safety property:
8
+ *
9
+ * roles.yaml has NO admin-rescue (canWrite('roles.yaml') is a pure isAdmin
10
+ * check) and loadModel HARD-THROWS on a parse failure (which isAdmin swallows
11
+ * into false for EVERYONE). So a single malformed write = a permanent,
12
+ * app-wide, in-app-unrecoverable admin lockout. Every mutation therefore runs
13
+ * the candidate text through the resolver's OWN parser (validateRolesYaml)
14
+ * before a byte hits disk; on any error it writes nothing.
15
+ *
16
+ * Two write paths, both gated by the same friendly pre-checks + validate gate:
17
+ *
18
+ * Single-file ops (create/delete role, add/remove member) — `runEdit`:
19
+ * pre-check roles.yaml isn't locked → RolesAdminError 409
20
+ * read CURRENT roles.yaml → parse → edit-in-memory → re-emit candidate
21
+ * validateRolesYaml(candidate) → RolesAdminError 422, write nothing
22
+ * LockingFilesystem.writeFile(roles.yaml) ← acquire → write → release;
23
+ * release IS the commit + push (default per-file summary), so the commit
24
+ * lands a beat after the write — same pipeline the human editor + agent
25
+ * use. The HTTP roster reads the (synchronously written) working tree.
26
+ *
27
+ * Rename (`renameRole`) — keeps an ATOMIC multi-file special case because it
28
+ * rewrites roles.yaml + every reference in ONE commit (a partial rewrite =
29
+ * silent access drop):
30
+ * pre-check roles.yaml isn't locked → RolesAdminError 409
31
+ * parse + rewrite refs (fail-closed) → validate gate
32
+ * LockingFilesystem.writeFiles(roles.yaml + refs) ← acquires every path's
33
+ * lock, commits the curated set as ONE change (via the workflow service's
34
+ * commitChanges), then releases without a per-file commit.
35
+ *
36
+ * All reads and writes target the DEFAULT branch — the file admin status itself
37
+ * derives from. Editing any other branch's copy would show a roster that
38
+ * doesn't match who is actually an admin.
39
+ */
40
+ import path from 'node:path';
41
+ import { promises as fs } from 'node:fs';
42
+ import { workspaceIdForBranch } from '../workspace/workspace.service.js';
43
+ import { LockingFilesystem } from '../workflow/locking-filesystem.js';
44
+ import { WorkflowDomainError } from '../workflow/workflow.errors.js';
45
+ import { ADMIN_CANONICAL, canonicalRoleName, canonicalEmail, parseAccessEntry, } from './access-control.service.js';
46
+ import { makeRolesYamlWriteValidator } from './roles-yaml-guard.js';
47
+ import { parseRolesModel, createRole as editCreateRole, deleteRole as editDeleteRole, addMember as editAddMember, removeMember as editRemoveMember, renameRoleDisplay as editRenameRoleDisplay, RolesEditError, } from './roles-edit.js';
48
+ /** A mutation that cannot proceed (invariant violation, contention, not found). */
49
+ export class RolesAdminError extends WorkflowDomainError {
50
+ constructor(message, status = 422, payload) {
51
+ super(message, status, payload);
52
+ this.name = 'RolesAdminError';
53
+ }
54
+ }
55
+ const ROLES_YAML = 'roles.yaml';
56
+ /** Where {@link RolesAdminService.recover} parks the corrupted file. */
57
+ const OLD_ROLES_YAML = 'old-roles.yaml';
58
+ /**
59
+ * The known-good `roles.yaml` the break-glass recovery restores. Mirrors the
60
+ * canonical Bevel roster — it is the ONLY content recovery ever writes, so it
61
+ * MUST parse (the post-recovery resolver loads it immediately). Keep the Admin
62
+ * list in sync with the canonical `osapiens-kb/roles.yaml`.
63
+ */
64
+ const RECOVERY_DEFAULT_ROLES_YAML = `# Identity → role mapping for access control.
65
+ # Role names are case- and whitespace-insensitive. The \`Admin\` role is special:
66
+ # only Admins may edit this file, and at least one Admin must always exist.
67
+ roles:
68
+ Admin:
69
+ - razvan.radulescu@bevel.software
70
+ - ali.raza@bevel.software
71
+ - juan@bevel.software
72
+ `;
73
+ export class RolesAdminService {
74
+ workspaceService;
75
+ workflowService;
76
+ accessControl;
77
+ kbDirName;
78
+ defaultBranch;
79
+ eventBus;
80
+ constructor(workspaceService, workflowService, accessControl, kbDirName,
81
+ /** The branch whose roles.yaml is authoritative for admin status. */
82
+ defaultBranch,
83
+ /**
84
+ * Optional so existing tests can construct the service without an event
85
+ * bus. When present, every committed write announces itself so already-open
86
+ * clients re-fetch the changed files and re-evaluate their permissions —
87
+ * a roles.yaml / access.md change is an access change, and without this an
88
+ * open tab keeps a now-stale read verdict until a manual reload.
89
+ */
90
+ eventBus) {
91
+ this.workspaceService = workspaceService;
92
+ this.workflowService = workflowService;
93
+ this.accessControl = accessControl;
94
+ this.kbDirName = kbDirName;
95
+ this.defaultBranch = defaultBranch;
96
+ this.eventBus = eventBus;
97
+ }
98
+ get workspaceId() {
99
+ return workspaceIdForBranch(this.defaultBranch);
100
+ }
101
+ /**
102
+ * Announce committed writes so watching clients refresh. Emits one
103
+ * `file-changed` per written file (workspace-relative path — the form the
104
+ * frontend keys tabs on, NOT the bare repo-relative path `commitChanges` takes)
105
+ * plus a single `fs-tree-changed`. `newSha: null` — the roster response is the
106
+ * authoritative post-commit state; clients only need the "go refetch" nudge.
107
+ */
108
+ emitWrites(workspaceId, actor, repoRelPaths) {
109
+ if (!this.eventBus || repoRelPaths.length === 0)
110
+ return;
111
+ for (const repoRel of repoRelPaths) {
112
+ this.eventBus.emit({
113
+ kind: 'file-changed',
114
+ workspaceId,
115
+ branch: this.defaultBranch,
116
+ path: `${this.kbDirName}/${repoRel}`,
117
+ newSha: null,
118
+ byUserId: actor.id,
119
+ byUserName: actor.name,
120
+ });
121
+ }
122
+ this.eventBus.emit({ kind: 'fs-tree-changed', workspaceId, branch: this.defaultBranch });
123
+ }
124
+ /** Ensure the authoritative clone exists, then return its workspace id. */
125
+ async ensureWorkspace() {
126
+ await this.workspaceService.getOrCreateForBranch(this.defaultBranch);
127
+ return this.workspaceId;
128
+ }
129
+ async repoDir(workspaceId) {
130
+ const wsDir = await this.workspaceService.getWorkspacePath(workspaceId);
131
+ return path.join(wsDir, this.kbDirName);
132
+ }
133
+ /**
134
+ * A lock-aware filesystem scoped to `actor` — writes auto-commit + push as the
135
+ * actor on release, through the same pipeline as the human editor and agent.
136
+ * Built per-op because the lock context captures the acting user.
137
+ */
138
+ async lockingFsForActor(workspaceId, actor) {
139
+ const basePath = await this.workspaceService.getWorkspacePath(workspaceId);
140
+ return new LockingFilesystem({ basePath, contained: true }, {
141
+ workflow: this.workflowService,
142
+ workspaceId,
143
+ branch: this.defaultBranch,
144
+ user: actor,
145
+ // Defence in depth: this surface already validates candidates before
146
+ // writing, but the same pre-disk gate the editor/agent use guarantees a
147
+ // malformed roles.yaml can never land through here either.
148
+ validateWrite: makeRolesYamlWriteValidator(this.kbDirName),
149
+ });
150
+ }
151
+ /**
152
+ * Fail fast with a friendly 409 if roles.yaml is already locked by someone
153
+ * else. The actual lock is taken by the LockingFilesystem write that follows;
154
+ * this only preserves the explicit "being edited by X" contract (the raw
155
+ * LockingFilesystem contention error is status-less and would surface as 500).
156
+ */
157
+ async assertRolesUnlocked(workspaceId, actor) {
158
+ const held = await this.workflowService.getLock(workspaceId, this.defaultBranch, `${this.kbDirName}/${ROLES_YAML}`);
159
+ if (held && held.holderUserId !== actor.id) {
160
+ throw new RolesAdminError(`Roles are being edited by ${held.holderName || 'another admin'}. Try again in a moment.`, 409);
161
+ }
162
+ }
163
+ /**
164
+ * Run a lock-aware filesystem write, mapping its status-less contention error
165
+ * ("Skipped editing … — locked by …") to the friendly 409. {@link
166
+ * assertRolesUnlocked} pre-checks the common case (and names the holder), but
167
+ * it's a TOCTOU check — another admin can grab the lock between it and the
168
+ * actual acquire inside the write. This catches that race so contention always
169
+ * surfaces as a 409, never an unhandled 500.
170
+ */
171
+ async mapLockContention(write) {
172
+ try {
173
+ return await write();
174
+ }
175
+ catch (err) {
176
+ if (err instanceof Error && /locked by /.test(err.message)) {
177
+ throw new RolesAdminError('Roles are being edited by another admin. Try again in a moment.', 409);
178
+ }
179
+ throw err;
180
+ }
181
+ }
182
+ async readRolesYaml(workspaceId) {
183
+ try {
184
+ return await this.workspaceService.readFile(workspaceId, path.posix.join(this.kbDirName, ROLES_YAML));
185
+ }
186
+ catch (err) {
187
+ const code = err?.code;
188
+ if (code === 'ENOENT' || code === 'ENOTDIR')
189
+ return '';
190
+ throw err;
191
+ }
192
+ }
193
+ // ---- Read -------------------------------------------------------------
194
+ /** The roster: every role on the default branch with members + references. */
195
+ async getRoster() {
196
+ const workspaceId = await this.ensureWorkspace();
197
+ const text = await this.readRolesYaml(workspaceId);
198
+ const model = parseRolesModel(text);
199
+ // ONE sound scan of every `.md` (folder access.md + node
200
+ // frontmatter), then index the references by canonical role. This is the
201
+ // SAME candidate set + parse the rename rewrite uses, so the delete warning
202
+ // can never undercount what the rename would actually touch.
203
+ const referencesByRole = await this.scanRoleReferences(workspaceId);
204
+ const out = [];
205
+ for (const role of model) {
206
+ const canonical = canonicalRoleName(role.displayName);
207
+ out.push({
208
+ canonical,
209
+ displayName: role.displayName,
210
+ members: role.members,
211
+ isAdmin: canonical === ADMIN_CANONICAL,
212
+ referencedBy: referencesByRole.get(canonical) ?? [],
213
+ });
214
+ }
215
+ return out;
216
+ }
217
+ /**
218
+ * Whether the default-branch roles.yaml parses. Drives the "roles file
219
+ * corrupted" banner. Auth-only (never admin-gated): a corrupted file resolves
220
+ * NOBODY as admin, so an admin-gated health check could never report the very
221
+ * state it exists to detect. A missing/empty file counts as corrupted —
222
+ * loadModel hard-throws on it exactly as it does on malformed YAML.
223
+ */
224
+ async getHealth() {
225
+ const workspaceId = await this.ensureWorkspace();
226
+ const text = await this.readRolesYaml(workspaceId);
227
+ const v = this.accessControl.validateRolesYaml(text);
228
+ return v.ok ? { ok: true, errors: [] } : { ok: false, errors: v.errors };
229
+ }
230
+ /**
231
+ * Break-glass recovery for a corrupted roles.yaml (the "Bevel Recovery"
232
+ * button). Copies the corrupted file to `old-roles.yaml` and restores the
233
+ * known-good default in ONE atomic commit, then returns the fresh roster.
234
+ *
235
+ * Authorization: this is the ONE roles mutation that is NOT admin-gated —
236
+ * by construction a corrupted roles.yaml resolves nobody as admin, so an
237
+ * admin gate would make recovery impossible (the lockout the user reported).
238
+ * Instead it is gated on the file ACTUALLY being unparseable: if roles.yaml
239
+ * is valid, recovery is refused (409) so it can never be used as an
240
+ * unauthenticated roster reset. The "only press if you are from Bevel" UI
241
+ * copy is the honour-system layer on top of that hard gate.
242
+ *
243
+ * This works on the protected default branch because the commit/push access
244
+ * gate reads roles.yaml AT-REF and fails OPEN when it can't parse (treating a
245
+ * broken config as "no rules in force") — so the restoring write is allowed
246
+ * through precisely when the file is broken.
247
+ */
248
+ async recover(actor) {
249
+ const workspaceId = await this.ensureWorkspace();
250
+ // Start from EXACTLY origin's state before deciding/writing. This (a) pulls
251
+ // in commits the clone was behind on so the restoring commit fast-forwards
252
+ // on push instead of being rejected non-fast-forward, and (b) discards any
253
+ // half-finished recovery commit a prior failed push left behind (which would
254
+ // otherwise make the LOCAL file look healthy while origin stays broken and
255
+ // the fix never reaches it). Best-effort: if origin is unreachable we fall
256
+ // back to the local state and still attempt the local fix.
257
+ try {
258
+ await this.workflowService.resetToRemote(workspaceId, this.defaultBranch);
259
+ this.accessControl.invalidate(workspaceId);
260
+ }
261
+ catch (err) {
262
+ console.warn('[roles.recover] could not sync with origin before recovery; proceeding with local state:', err instanceof Error ? err.message : err);
263
+ }
264
+ const current = await this.readRolesYaml(workspaceId);
265
+ // Hard gate: refuse unless the file is genuinely corrupted.
266
+ if (this.accessControl.validateRolesYaml(current).ok) {
267
+ throw new RolesAdminError('roles.yaml is valid — recovery is only available when the file is corrupted.', 409, { kind: 'not-corrupted' });
268
+ }
269
+ await this.assertRolesUnlocked(workspaceId, actor);
270
+ // Back up the corrupted bytes and restore the good default atomically. The
271
+ // default is valid, so the resolver loads immediately after this commit.
272
+ const fsys = await this.lockingFsForActor(workspaceId, actor);
273
+ await this.mapLockContention(() => fsys.writeFiles([
274
+ { path: `${this.kbDirName}/${OLD_ROLES_YAML}`, content: current },
275
+ { path: `${this.kbDirName}/${ROLES_YAML}`, content: RECOVERY_DEFAULT_ROLES_YAML },
276
+ ], 'Bevel recovery: reset corrupted roles.yaml'));
277
+ this.accessControl.invalidate(workspaceId);
278
+ this.emitWrites(workspaceId, actor, [OLD_ROLES_YAML, ROLES_YAML]);
279
+ return this.getRoster();
280
+ }
281
+ // ---- Mutations --------------------------------------------------------
282
+ async createRole(actor, displayName) {
283
+ await this.runEdit(actor, (text) => editCreateRole(text, displayName));
284
+ return this.getRoster();
285
+ }
286
+ async deleteRole(actor, canonical) {
287
+ if (canonical === ADMIN_CANONICAL) {
288
+ throw new RolesAdminError('The Admin role cannot be deleted', 422);
289
+ }
290
+ await this.runEdit(actor, (text) => editDeleteRole(text, canonical));
291
+ return this.getRoster();
292
+ }
293
+ async addMember(actor, canonical, email) {
294
+ await this.runEdit(actor, (text) => editAddMember(text, canonical, email));
295
+ return this.getRoster();
296
+ }
297
+ /**
298
+ * Remove a member. Refuses to empty the Admin role (422). Removing the
299
+ * caller's OWN last Admin membership requires `confirm` (409 otherwise) — no
300
+ * silent self-lockout, since admin status is read live from this file.
301
+ */
302
+ async removeMember(actor, canonical, email, confirm) {
303
+ await this.runEdit(actor, (text) => {
304
+ const target = canonicalEmail(email);
305
+ if (canonical === ADMIN_CANONICAL) {
306
+ const admin = parseRolesModel(text).find((r) => canonicalRoleName(r.displayName) === ADMIN_CANONICAL);
307
+ const members = admin?.members ?? [];
308
+ if (members.includes(target) && members.length <= 1) {
309
+ throw new RolesAdminError('The Admin role must keep at least one member', 422);
310
+ }
311
+ if (target === canonicalEmail(actor.email) && members.includes(target) && !confirm) {
312
+ throw new RolesAdminError('You are about to remove your own admin access', 409, {
313
+ kind: 'self-admin-removal',
314
+ });
315
+ }
316
+ }
317
+ return editRemoveMember(text, canonical, email);
318
+ });
319
+ return this.getRoster();
320
+ }
321
+ /**
322
+ * Rename a role's display name.
323
+ * - canonical UNCHANGED (casing/whitespace) → single roles.yaml edit.
324
+ * - canonical CHANGES → rewrite every genuine role reference in access.md +
325
+ * node frontmatter AND roles.yaml in ONE atomic commit.
326
+ * - Admin canonical → non-admin canonical is refused (400): it would break
327
+ * isAdminEmail's roles.has('admin') lookup. Casing-only Admin OK.
328
+ */
329
+ async renameRole(actor, canonical, newDisplayName) {
330
+ const newCanonical = canonicalRoleName(newDisplayName);
331
+ if (canonical === ADMIN_CANONICAL && newCanonical !== ADMIN_CANONICAL) {
332
+ throw new RolesAdminError('The Admin role cannot be renamed to a different name', 400);
333
+ }
334
+ const workspaceId = await this.ensureWorkspace();
335
+ // Preserve the friendly 409 on contention: writeFiles throws a status-less
336
+ // lock-skip error (→ 500), so pre-check the roles.yaml lock.
337
+ await this.assertRolesUnlocked(workspaceId, actor);
338
+ const text = await this.readRolesYaml(workspaceId);
339
+ const before = parseRolesModel(text);
340
+ if (!before.some((r) => canonicalRoleName(r.displayName) === canonical)) {
341
+ throw new RolesAdminError(`role not found: ${canonical}`, 404);
342
+ }
343
+ const rolesEdit = this.guardEdit(() => editRenameRoleDisplay(text, canonical, newDisplayName));
344
+ const writes = [];
345
+ // The roles.yaml change itself (skip if the re-emit was a no-op).
346
+ // REPO-relative path (bare); the kbDirName prefix is added below.
347
+ if (rolesEdit.changed) {
348
+ writes.push({ repoRelativePath: ROLES_YAML, content: rolesEdit.text });
349
+ }
350
+ // Identity change → rewrite every genuine role reference, atomically.
351
+ // (Fail-closed: an unreadable candidate throws here, BEFORE any write.)
352
+ if (newCanonical !== canonical) {
353
+ const repoDir = await this.repoDir(workspaceId);
354
+ const refWrites = await this.rewriteRoleReferences(workspaceId, repoDir, canonical, newDisplayName.trim());
355
+ writes.push(...refWrites);
356
+ }
357
+ if (writes.length === 0)
358
+ return this.getRoster(); // nothing changed
359
+ // The validate-gate: any roles.yaml write must parse via the resolver —
360
+ // runs BEFORE the atomic write so a bad candidate never reaches disk.
361
+ const rolesWrite = writes.find((w) => w.repoRelativePath === ROLES_YAML);
362
+ if (rolesWrite)
363
+ this.assertLoadable(rolesWrite.content);
364
+ // Rename keeps the ATOMIC multi-file commit (roles.yaml + every rewritten
365
+ // reference land as ONE commit, or none): a partial rewrite would leave a
366
+ // renamed role with references still pointing at the old name = silent
367
+ // access drop. The lock-aware filesystem owns this — it acquires every
368
+ // path's lock, writes them, and commits the curated set as one change.
369
+ const fsys = await this.lockingFsForActor(workspaceId, actor);
370
+ await this.mapLockContention(() => fsys.writeFiles(writes.map((w) => ({ path: `${this.kbDirName}/${w.repoRelativePath}`, content: w.content })), `Rename role ${canonical} → ${newDisplayName.trim()}`));
371
+ this.accessControl.invalidate(workspaceId);
372
+ this.emitWrites(workspaceId, actor, writes.map((w) => w.repoRelativePath));
373
+ return this.getRoster();
374
+ }
375
+ // ---- Internals --------------------------------------------------------
376
+ /** Map a RolesEditError to a RolesAdminError (preserving status). */
377
+ guardEdit(fn) {
378
+ try {
379
+ return fn();
380
+ }
381
+ catch (err) {
382
+ if (err instanceof RolesEditError)
383
+ throw new RolesAdminError(err.message, err.status);
384
+ throw err;
385
+ }
386
+ }
387
+ assertLoadable(candidate) {
388
+ const v = this.accessControl.validateRolesYaml(candidate);
389
+ if (!v.ok) {
390
+ throw new RolesAdminError(`roles.yaml would be invalid: ${v.errors.join('; ')}`, 422);
391
+ }
392
+ }
393
+ /**
394
+ * Single-file roles.yaml mutation. `pre` produces the candidate (and may throw
395
+ * RolesAdminError for invariant violations before any write). Skips on a no-op.
396
+ *
397
+ * The write goes through a {@link LockingFilesystem}: acquiring the per-file
398
+ * lock, writing, then releasing — and release IS the commit + push (attributed
399
+ * to `actor`), the same pipeline the human editor and agent use. So unlike the
400
+ * rename's synchronous atomic commit, the git commit here lands on release
401
+ * (a beat after the write); the HTTP response reads the working tree, which is
402
+ * already on disk, so the returned roster is correct.
403
+ */
404
+ async runEdit(actor, pre) {
405
+ const workspaceId = await this.ensureWorkspace();
406
+ await this.assertRolesUnlocked(workspaceId, actor);
407
+ const text = await this.readRolesYaml(workspaceId);
408
+ const result = this.guardEdit(() => pre(text));
409
+ if (!result.changed)
410
+ return;
411
+ this.assertLoadable(result.text);
412
+ // LockingFilesystem paths are WORKSPACE-relative, so carry the kbDirName
413
+ // prefix (unlike commitChanges' bare repo-relative paths). The release
414
+ // pipeline writes a default per-file commit summary ("Update roles.yaml");
415
+ // a bespoke summary isn't threadable through this path, which is fine for a
416
+ // single-file roles edit. The rename keeps its descriptive summary because
417
+ // it commits atomically via writeFiles.
418
+ const fsys = await this.lockingFsForActor(workspaceId, actor);
419
+ await this.mapLockContention(() => fsys.writeFile(`${this.kbDirName}/${ROLES_YAML}`, result.text));
420
+ this.accessControl.invalidate(workspaceId);
421
+ this.emitWrites(workspaceId, actor, [ROLES_YAML]);
422
+ }
423
+ /**
424
+ * Find every genuine role reference to `oldCanonical` across folder access.md
425
+ * AND node frontmatter, and rewrite each to `newDisplayName`. Reference-aware:
426
+ * a line is rewritten ONLY if it PARSES as a role entry whose canonical name
427
+ * == oldCanonical. Prose, comments, `Name <email>` user entries, other keys,
428
+ * and substrings never match. Returns the repo-relative writes to commit.
429
+ */
430
+ async rewriteRoleReferences(workspaceId, repoDir, oldCanonical, newDisplayName) {
431
+ const writes = [];
432
+ const candidates = await this.collectCandidateFiles(workspaceId);
433
+ for (const repoRel of candidates) {
434
+ const abs = path.join(repoDir, repoRel);
435
+ let text;
436
+ try {
437
+ text = await fs.readFile(abs, 'utf-8');
438
+ }
439
+ catch (err) {
440
+ // Fail closed: a candidate we cannot read might reference the
441
+ // old role. Skipping it would commit a partial rewrite (a half-renamed
442
+ // role pointing at the old name) and silently drop access. Abort the
443
+ // whole atomic rename instead so the admin can retry cleanly.
444
+ throw new RolesAdminError(`Cannot read ${repoRel} while rewriting role references; rename aborted with no changes`, 422, { cause: err?.message });
445
+ }
446
+ const rewritten = rewriteRoleTokensInText(text, oldCanonical, newDisplayName);
447
+ if (rewritten !== text) {
448
+ // REPO-relative (bare repoRel) for commitChanges — repoDir already points
449
+ // at <workspaceDir>/<kbDirName>.
450
+ writes.push({ repoRelativePath: repoRel, content: rewritten });
451
+ }
452
+ }
453
+ return writes;
454
+ }
455
+ /**
456
+ * Repo-relative paths of every file that could carry a role reference: all
457
+ * `access.md` files plus every `.md` node (its own frontmatter). Sourced from
458
+ * the workspace file tree (which already skips `.git` and honours
459
+ * `.bevelignore`), filtered to `.md` under the KB dir and returned bare
460
+ * repo-relative. (`roles.yaml` isn't `.md`, so it's excluded; the rename
461
+ * commits it separately.) Under save=share the working tree matches the
462
+ * committed set, so this is the same candidate list git-tracking would give.
463
+ */
464
+ async collectCandidateFiles(workspaceId) {
465
+ const tree = await this.workspaceService.listFiles(workspaceId);
466
+ const prefix = `${this.kbDirName}/`;
467
+ const out = [];
468
+ const visit = (node) => {
469
+ if (node.type === 'file') {
470
+ if (node.relativePath.startsWith(prefix) && node.relativePath.endsWith('.md')) {
471
+ out.push(node.relativePath.slice(prefix.length));
472
+ }
473
+ return;
474
+ }
475
+ for (const child of node.children ?? [])
476
+ visit(child);
477
+ };
478
+ visit(tree);
479
+ return out;
480
+ }
481
+ /**
482
+ * Sound scan of EVERY `.md` (folder `access.md` + node frontmatter)
483
+ * for genuine role references, indexed by canonical role name. Shares the
484
+ * candidate set and the config-region role-entry parse with the rename
485
+ * rewrite (`findRoleRefsInText` / `rewriteRoleTokensInText`), so the delete
486
+ * warning and the rename rewrite see the SAME references — the warning can no
487
+ * longer undercount frontmatter the rename would touch. A file we cannot read
488
+ * is skipped (this is an advisory read, not the atomic write path): missing a
489
+ * reference here only weakens the warning, it cannot drop access.
490
+ */
491
+ async scanRoleReferences(workspaceId) {
492
+ const repoDir = await this.repoDir(workspaceId);
493
+ const candidates = await this.collectCandidateFiles(workspaceId);
494
+ const byRole = new Map();
495
+ for (const repoRel of candidates) {
496
+ let text;
497
+ try {
498
+ text = await fs.readFile(path.join(repoDir, repoRel), 'utf-8');
499
+ }
500
+ catch {
501
+ continue;
502
+ }
503
+ for (const ref of findRoleRefsInText(text)) {
504
+ const list = byRole.get(ref.role);
505
+ if (list)
506
+ list.push({ path: repoRel, verb: ref.verb });
507
+ else
508
+ byRole.set(ref.role, [{ path: repoRel, verb: ref.verb }]);
509
+ }
510
+ }
511
+ return byRole;
512
+ }
513
+ }
514
+ /**
515
+ * Resolve the [start, end) line range that role rewrites may touch — the YAML
516
+ * config region only, NEVER the markdown body (CodeRabbit: a body line like
517
+ * `- Sales` or `owner: Sales` must not be rewritten).
518
+ *
519
+ * - A file with leading `---` frontmatter (folder `access.md`, node `.md`):
520
+ * only the lines BETWEEN the opening and closing `---` are eligible.
521
+ * - A fence-less file (e.g. a bare `roles.yaml`-style access config with no
522
+ * `---`): the whole file is config, so all lines are eligible.
523
+ * - A `.md` file with no frontmatter fence: no config region → empty range,
524
+ * nothing is rewritten.
525
+ */
526
+ function configLineRange(lines, isMarkdown) {
527
+ if (lines.length > 0 && lines[0].trim() === '---') {
528
+ for (let i = 1; i < lines.length; i++) {
529
+ if (lines[i].trim() === '---')
530
+ return { start: 1, end: i };
531
+ }
532
+ // Unterminated frontmatter — treat nothing as eligible (don't risk the body).
533
+ return { start: 0, end: 0 };
534
+ }
535
+ // No fence: a markdown file has no config region; a non-markdown access file
536
+ // (no body) is entirely config.
537
+ return isMarkdown ? { start: 0, end: 0 } : { start: 0, end: lines.length };
538
+ }
539
+ /** A known access verb key: heads a block list or holds a scalar role value. */
540
+ const VERB_KEY_RE = /^(\s*)(read|write|download|owner)(:\s*)(.*)$/;
541
+ /** A block-list item: ` - <token>` (token may carry a leading `deny `). */
542
+ const LIST_ITEM_RE = /^(\s*-\s+)(.*)$/;
543
+ /**
544
+ * Walk the CONFIG-REGION lines of `text`, invoking `onRoleRef` for every line
545
+ * that PARSES as a genuine role entry — both the block-list form (`- <token>`
546
+ * under a `read:`/`write:`/… key) and the inline scalar form (`owner: <token>`).
547
+ * `verb` is the access verb the reference sits under; for a block list it is the
548
+ * nearest enclosing verb key (lines before any verb key, or under an unknown
549
+ * key, are skipped). This is the SINGLE source of truth for "what is a role
550
+ * reference" — both the delete-warning scan and the rename rewrite drive off it,
551
+ * so they cannot disagree. The callback may mutate `lines[i]` (the rewrite does;
552
+ * the scan does not). User entries, other keys, comments and substrings never
553
+ * fire it.
554
+ */
555
+ function walkRoleRefs(lines, start, end, onRoleRef) {
556
+ let currentVerb = null;
557
+ /** A role-entry value → its parsed role entry, else null (user/empty/other). */
558
+ const roleEntry = (rawValue) => {
559
+ const parsed = parseAccessEntry(rawValue.replace(/\s+$/, ''));
560
+ return parsed.ok && parsed.entry.kind === 'role'
561
+ ? { role: parsed.entry.role, deny: parsed.entry.deny }
562
+ : null;
563
+ };
564
+ for (let i = start; i < end; i++) {
565
+ const line = lines[i];
566
+ // A verb key resets the block context. Its inline value (scalar form,
567
+ // `owner: Sales`) is itself a candidate reference under that same verb.
568
+ const kvM = line.match(VERB_KEY_RE);
569
+ if (kvM) {
570
+ currentVerb = kvM[2];
571
+ const inlineValue = kvM[4];
572
+ if (inlineValue.trim() !== '') {
573
+ const entry = roleEntry(inlineValue);
574
+ if (entry)
575
+ onRoleRef({ i, verb: currentVerb, entry, indent: `${kvM[1]}${kvM[2]}${kvM[3]}`, prefix: '' });
576
+ }
577
+ continue;
578
+ }
579
+ // Block-list item — belongs to the nearest enclosing verb key. A list item
580
+ // with no verb in scope is not a resolvable access rule; skip it.
581
+ const listM = line.match(LIST_ITEM_RE);
582
+ if (listM && currentVerb !== null) {
583
+ const entry = roleEntry(listM[2]);
584
+ if (entry)
585
+ onRoleRef({ i, verb: currentVerb, entry, indent: '', prefix: listM[1] });
586
+ continue;
587
+ }
588
+ // A non-empty, non-list, non-kv line ends the current block (e.g. a new
589
+ // top-level key whose value isn't a verb, or stray prose in config).
590
+ if (line.trim() !== '' && !listM)
591
+ currentVerb = null;
592
+ }
593
+ }
594
+ /** Every genuine role reference in `text`'s config region, as {role, verb}. */
595
+ export function findRoleRefsInText(text, isMarkdown = true) {
596
+ const lines = text.split('\n');
597
+ const { start, end } = configLineRange(lines, isMarkdown);
598
+ const out = [];
599
+ if (start >= end)
600
+ return out;
601
+ walkRoleRefs(lines, start, end, ({ verb, entry }) => out.push({ role: entry.role, verb }));
602
+ return out;
603
+ }
604
+ /**
605
+ * Rewrite every CONFIG-REGION line that PARSES as a role reference whose
606
+ * canonical name == `oldCanonical`, replacing the role token with
607
+ * `newDisplayName` (preserving any leading `deny ` and indentation). Only the
608
+ * frontmatter block of a markdown file is touched — the body is left
609
+ * byte-for-byte intact, so a prose line like `- Sales` is never corrupted.
610
+ * Lines that don't parse as a matching role entry (user entries, other keys,
611
+ * substrings) are also untouched. Exported for test.
612
+ *
613
+ * `isMarkdown` (default true) marks files that carry a markdown body below the
614
+ * frontmatter; pass false only for a pure-config file with no body.
615
+ */
616
+ export function rewriteRoleTokensInText(text, oldCanonical, newDisplayName, isMarkdown = true) {
617
+ const lines = text.split('\n');
618
+ const { start, end } = configLineRange(lines, isMarkdown);
619
+ if (start >= end)
620
+ return text;
621
+ let changed = false;
622
+ walkRoleRefs(lines, start, end, ({ i, entry, indent, prefix }) => {
623
+ if (entry.role !== oldCanonical)
624
+ return;
625
+ lines[i] = `${indent}${prefix}${entry.deny ? 'deny ' : ''}${newDisplayName}`;
626
+ changed = true;
627
+ });
628
+ return changed ? lines.join('\n') : text;
629
+ }
630
+ //# sourceMappingURL=roles-admin.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles-admin.service.js","sourceRoot":"","sources":["../../../src/modules/access/roles-admin.service.ts"],"names":[],"mappings":"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"}