@aphexcms/cms-core 2.0.10 → 2.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 (281) hide show
  1. package/dist/api/api-keys.d.ts +4 -0
  2. package/dist/api/api-keys.d.ts.map +1 -1
  3. package/dist/api/assets.d.ts.map +1 -1
  4. package/dist/api/index.d.ts +1 -0
  5. package/dist/api/index.d.ts.map +1 -1
  6. package/dist/api/index.js +1 -0
  7. package/dist/api/roles.d.ts +22 -0
  8. package/dist/api/roles.d.ts.map +1 -0
  9. package/dist/api/roles.js +26 -0
  10. package/dist/api/schemas/api-keys.d.ts +50 -4
  11. package/dist/api/schemas/api-keys.d.ts.map +1 -1
  12. package/dist/api/schemas/api-keys.js +22 -3
  13. package/dist/api/schemas/organizations.d.ts +4 -22
  14. package/dist/api/schemas/organizations.d.ts.map +1 -1
  15. package/dist/api/schemas/organizations.js +13 -2
  16. package/dist/api/schemas/roles.d.ts +77 -0
  17. package/dist/api/schemas/roles.d.ts.map +1 -0
  18. package/dist/api/schemas/roles.js +42 -0
  19. package/dist/app-augment.d.ts +32 -0
  20. package/dist/app-augment.d.ts.map +1 -0
  21. package/dist/app-augment.js +18 -0
  22. package/dist/auth/auth-hooks.d.ts +2 -1
  23. package/dist/auth/auth-hooks.d.ts.map +1 -1
  24. package/dist/auth/auth-hooks.js +22 -2
  25. package/dist/client/index.d.ts +4 -2
  26. package/dist/client/index.d.ts.map +1 -1
  27. package/dist/client/index.js +6 -2
  28. package/dist/components/AdminApp.svelte +300 -140
  29. package/dist/components/AdminApp.svelte.d.ts +8 -0
  30. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  31. package/dist/components/admin/DocumentEditor.svelte +633 -350
  32. package/dist/components/admin/DocumentEditor.svelte.d.ts +2 -0
  33. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  34. package/dist/components/admin/DocumentVersionPanel.svelte +46 -20
  35. package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
  36. package/dist/components/admin/MediaBrowser.svelte +70 -30
  37. package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -1
  38. package/dist/components/admin/ObjectModal.svelte +70 -95
  39. package/dist/components/admin/ObjectModal.svelte.d.ts +1 -2
  40. package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -1
  41. package/dist/components/admin/PermissionsDebug.svelte +119 -0
  42. package/dist/components/admin/PermissionsDebug.svelte.d.ts +4 -0
  43. package/dist/components/admin/PermissionsDebug.svelte.d.ts.map +1 -0
  44. package/dist/components/admin/SchemaField.svelte +3 -1
  45. package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -1
  46. package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte +8 -10
  47. package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte.d.ts.map +1 -1
  48. package/dist/components/admin/fields/ArrayField.svelte +104 -108
  49. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
  50. package/dist/components/admin/fields/FileField.svelte +22 -17
  51. package/dist/components/admin/fields/FileField.svelte.d.ts.map +1 -1
  52. package/dist/components/admin/fields/ImageField.svelte +21 -15
  53. package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -1
  54. package/dist/components/admin/fields/ReferenceField.svelte +142 -112
  55. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -1
  56. package/dist/components/admin/fields/TextareaField.svelte +4 -3
  57. package/dist/components/admin/fields/TextareaField.svelte.d.ts +2 -2
  58. package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -1
  59. package/dist/components/layout/Sidebar.svelte +21 -11
  60. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -1
  61. package/dist/components/layout/sidebar/NavMain.svelte +1 -0
  62. package/dist/db/interfaces/document.d.ts.map +1 -1
  63. package/dist/db/interfaces/index.d.ts +3 -1
  64. package/dist/db/interfaces/index.d.ts.map +1 -1
  65. package/dist/db/interfaces/organization.d.ts +1 -1
  66. package/dist/db/interfaces/organization.d.ts.map +1 -1
  67. package/dist/db/interfaces/role.d.ts +25 -0
  68. package/dist/db/interfaces/role.d.ts.map +1 -0
  69. package/dist/db/interfaces/role.js +1 -0
  70. package/dist/engine.d.ts.map +1 -1
  71. package/dist/engine.js +5 -0
  72. package/dist/field-access.d.ts +30 -0
  73. package/dist/field-access.d.ts.map +1 -0
  74. package/dist/field-access.js +79 -0
  75. package/dist/hooks.d.ts +2 -0
  76. package/dist/hooks.d.ts.map +1 -1
  77. package/dist/hooks.js +19 -13
  78. package/dist/lib/api/api-keys.d.ts +4 -0
  79. package/dist/lib/api/api-keys.d.ts.map +1 -1
  80. package/dist/lib/api/api-keys.js.map +1 -1
  81. package/dist/lib/api/assets.d.ts.map +1 -1
  82. package/dist/lib/api/assets.js.map +1 -1
  83. package/dist/lib/api/index.d.ts +1 -0
  84. package/dist/lib/api/index.d.ts.map +1 -1
  85. package/dist/lib/api/index.js +1 -0
  86. package/dist/lib/api/index.js.map +1 -1
  87. package/dist/lib/api/roles.d.ts +22 -0
  88. package/dist/lib/api/roles.d.ts.map +1 -0
  89. package/dist/lib/api/roles.js +27 -0
  90. package/dist/lib/api/roles.js.map +1 -0
  91. package/dist/lib/api/schemas/api-keys.d.ts +50 -4
  92. package/dist/lib/api/schemas/api-keys.d.ts.map +1 -1
  93. package/dist/lib/api/schemas/api-keys.js +22 -3
  94. package/dist/lib/api/schemas/api-keys.js.map +1 -1
  95. package/dist/lib/api/schemas/organizations.d.ts +4 -22
  96. package/dist/lib/api/schemas/organizations.d.ts.map +1 -1
  97. package/dist/lib/api/schemas/organizations.js +13 -2
  98. package/dist/lib/api/schemas/organizations.js.map +1 -1
  99. package/dist/lib/api/schemas/roles.d.ts +77 -0
  100. package/dist/lib/api/schemas/roles.d.ts.map +1 -0
  101. package/dist/lib/api/schemas/roles.js +43 -0
  102. package/dist/lib/api/schemas/roles.js.map +1 -0
  103. package/dist/lib/app-augment.d.ts +32 -0
  104. package/dist/lib/app-augment.d.ts.map +1 -0
  105. package/dist/lib/app-augment.js +19 -0
  106. package/dist/lib/app-augment.js.map +1 -0
  107. package/dist/lib/auth/auth-hooks.d.ts +2 -1
  108. package/dist/lib/auth/auth-hooks.d.ts.map +1 -1
  109. package/dist/lib/auth/auth-hooks.js +22 -2
  110. package/dist/lib/auth/auth-hooks.js.map +1 -1
  111. package/dist/lib/client/index.d.ts +4 -2
  112. package/dist/lib/client/index.d.ts.map +1 -1
  113. package/dist/lib/client/index.js +6 -2
  114. package/dist/lib/client/index.js.map +1 -1
  115. package/dist/lib/db/interfaces/document.d.ts.map +1 -1
  116. package/dist/lib/db/interfaces/index.d.ts +3 -1
  117. package/dist/lib/db/interfaces/index.d.ts.map +1 -1
  118. package/dist/lib/db/interfaces/organization.d.ts +1 -1
  119. package/dist/lib/db/interfaces/organization.d.ts.map +1 -1
  120. package/dist/lib/db/interfaces/role.d.ts +25 -0
  121. package/dist/lib/db/interfaces/role.d.ts.map +1 -0
  122. package/dist/lib/db/interfaces/role.js +2 -0
  123. package/dist/lib/db/interfaces/role.js.map +1 -0
  124. package/dist/lib/engine.d.ts.map +1 -1
  125. package/dist/lib/engine.js +5 -0
  126. package/dist/lib/engine.js.map +1 -1
  127. package/dist/lib/field-access.d.ts +30 -0
  128. package/dist/lib/field-access.d.ts.map +1 -0
  129. package/dist/lib/field-access.js +80 -0
  130. package/dist/lib/field-access.js.map +1 -0
  131. package/dist/lib/hooks.d.ts +2 -0
  132. package/dist/lib/hooks.d.ts.map +1 -1
  133. package/dist/lib/hooks.js +19 -13
  134. package/dist/lib/hooks.js.map +1 -1
  135. package/dist/lib/local-api/collection-api.d.ts +2 -0
  136. package/dist/lib/local-api/collection-api.d.ts.map +1 -1
  137. package/dist/lib/local-api/collection-api.js +98 -30
  138. package/dist/lib/local-api/collection-api.js.map +1 -1
  139. package/dist/lib/local-api/index.d.ts.map +1 -1
  140. package/dist/lib/local-api/index.js.map +1 -1
  141. package/dist/lib/local-api/permissions.d.ts +26 -26
  142. package/dist/lib/local-api/permissions.d.ts.map +1 -1
  143. package/dist/lib/local-api/permissions.js +122 -80
  144. package/dist/lib/local-api/permissions.js.map +1 -1
  145. package/dist/lib/permissions-context.svelte.d.ts +44 -0
  146. package/dist/lib/permissions-context.svelte.d.ts.map +1 -0
  147. package/dist/lib/permissions-context.svelte.js +80 -0
  148. package/dist/lib/permissions-context.svelte.js.map +1 -0
  149. package/dist/lib/routes/assets.d.ts.map +1 -1
  150. package/dist/lib/routes/assets.js.map +1 -1
  151. package/dist/lib/routes/document-versions.d.ts.map +1 -1
  152. package/dist/lib/routes/document-versions.js.map +1 -1
  153. package/dist/lib/routes/organizations-by-id.d.ts.map +1 -1
  154. package/dist/lib/routes/organizations-by-id.js +6 -3
  155. package/dist/lib/routes/organizations-by-id.js.map +1 -1
  156. package/dist/lib/routes/organizations-invitations.d.ts.map +1 -1
  157. package/dist/lib/routes/organizations-invitations.js +17 -7
  158. package/dist/lib/routes/organizations-invitations.js.map +1 -1
  159. package/dist/lib/routes/organizations-members.d.ts.map +1 -1
  160. package/dist/lib/routes/organizations-members.js +15 -7
  161. package/dist/lib/routes/organizations-members.js.map +1 -1
  162. package/dist/lib/routes/organizations.d.ts.map +1 -1
  163. package/dist/lib/routes/organizations.js +3 -0
  164. package/dist/lib/routes/organizations.js.map +1 -1
  165. package/dist/lib/routes/roles-by-name.d.ts +4 -0
  166. package/dist/lib/routes/roles-by-name.d.ts.map +1 -0
  167. package/dist/lib/routes/roles-by-name.js +112 -0
  168. package/dist/lib/routes/roles-by-name.js.map +1 -0
  169. package/dist/lib/routes/roles.d.ts +4 -0
  170. package/dist/lib/routes/roles.d.ts.map +1 -0
  171. package/dist/lib/routes/roles.js +91 -0
  172. package/dist/lib/routes/roles.js.map +1 -0
  173. package/dist/lib/routes-exports.d.ts +2 -0
  174. package/dist/lib/routes-exports.d.ts.map +1 -1
  175. package/dist/lib/routes-exports.js +3 -0
  176. package/dist/lib/routes-exports.js.map +1 -1
  177. package/dist/lib/save-state-context.svelte.d.ts +8 -0
  178. package/dist/lib/save-state-context.svelte.d.ts.map +1 -0
  179. package/dist/lib/save-state-context.svelte.js +9 -0
  180. package/dist/lib/save-state-context.svelte.js.map +1 -0
  181. package/dist/lib/schema-utils/validator.d.ts.map +1 -1
  182. package/dist/lib/schema-utils/validator.js +14 -0
  183. package/dist/lib/schema-utils/validator.js.map +1 -1
  184. package/dist/lib/server/index.d.ts +1 -0
  185. package/dist/lib/server/index.d.ts.map +1 -1
  186. package/dist/lib/server/index.js +1 -0
  187. package/dist/lib/server/index.js.map +1 -1
  188. package/dist/lib/services/index.d.ts +1 -0
  189. package/dist/lib/services/index.d.ts.map +1 -1
  190. package/dist/lib/services/index.js +1 -0
  191. package/dist/lib/services/index.js.map +1 -1
  192. package/dist/lib/services/roles-service.d.ts +35 -0
  193. package/dist/lib/services/roles-service.d.ts.map +1 -0
  194. package/dist/lib/services/roles-service.js +91 -0
  195. package/dist/lib/services/roles-service.js.map +1 -0
  196. package/dist/lib/services/version-service.d.ts.map +1 -1
  197. package/dist/lib/services/version-service.js.map +1 -1
  198. package/dist/lib/types/auth.d.ts +43 -9
  199. package/dist/lib/types/auth.d.ts.map +1 -1
  200. package/dist/lib/types/auth.js +31 -26
  201. package/dist/lib/types/auth.js.map +1 -1
  202. package/dist/lib/types/capabilities.d.ts +104 -0
  203. package/dist/lib/types/capabilities.d.ts.map +1 -0
  204. package/dist/lib/types/capabilities.js +217 -0
  205. package/dist/lib/types/capabilities.js.map +1 -0
  206. package/dist/lib/types/index.d.ts +1 -0
  207. package/dist/lib/types/index.d.ts.map +1 -1
  208. package/dist/lib/types/index.js +1 -0
  209. package/dist/lib/types/index.js.map +1 -1
  210. package/dist/lib/types/organization.d.ts +13 -4
  211. package/dist/lib/types/organization.d.ts.map +1 -1
  212. package/dist/lib/types/schemas.d.ts +71 -0
  213. package/dist/lib/types/schemas.d.ts.map +1 -1
  214. package/dist/lib/types/sidebar.d.ts +1 -1
  215. package/dist/lib/types/sidebar.d.ts.map +1 -1
  216. package/dist/lib/utils/mime-detect.d.ts.map +1 -1
  217. package/dist/lib/utils/mime-detect.js +28 -6
  218. package/dist/lib/utils/mime-detect.js.map +1 -1
  219. package/dist/local-api/collection-api.d.ts +2 -0
  220. package/dist/local-api/collection-api.d.ts.map +1 -1
  221. package/dist/local-api/collection-api.js +98 -30
  222. package/dist/local-api/index.d.ts.map +1 -1
  223. package/dist/local-api/permissions.d.ts +26 -26
  224. package/dist/local-api/permissions.d.ts.map +1 -1
  225. package/dist/local-api/permissions.js +122 -80
  226. package/dist/permissions-context.svelte.d.ts +44 -0
  227. package/dist/permissions-context.svelte.d.ts.map +1 -0
  228. package/dist/permissions-context.svelte.js +79 -0
  229. package/dist/plugins/README.md +20 -20
  230. package/dist/routes/assets.d.ts.map +1 -1
  231. package/dist/routes/document-versions.d.ts.map +1 -1
  232. package/dist/routes/organizations-by-id.d.ts.map +1 -1
  233. package/dist/routes/organizations-by-id.js +6 -3
  234. package/dist/routes/organizations-invitations.d.ts.map +1 -1
  235. package/dist/routes/organizations-invitations.js +17 -7
  236. package/dist/routes/organizations-members.d.ts.map +1 -1
  237. package/dist/routes/organizations-members.js +15 -7
  238. package/dist/routes/organizations.d.ts.map +1 -1
  239. package/dist/routes/organizations.js +3 -0
  240. package/dist/routes/roles-by-name.d.ts +4 -0
  241. package/dist/routes/roles-by-name.d.ts.map +1 -0
  242. package/dist/routes/roles-by-name.js +111 -0
  243. package/dist/routes/roles.d.ts +4 -0
  244. package/dist/routes/roles.d.ts.map +1 -0
  245. package/dist/routes/roles.js +90 -0
  246. package/dist/routes-exports.d.ts +2 -0
  247. package/dist/routes-exports.d.ts.map +1 -1
  248. package/dist/routes-exports.js +3 -0
  249. package/dist/save-state-context.svelte.d.ts +8 -0
  250. package/dist/save-state-context.svelte.d.ts.map +1 -0
  251. package/dist/save-state-context.svelte.js +8 -0
  252. package/dist/schema-utils/validator.d.ts.map +1 -1
  253. package/dist/schema-utils/validator.js +14 -0
  254. package/dist/server/index.d.ts +1 -0
  255. package/dist/server/index.d.ts.map +1 -1
  256. package/dist/server/index.js +1 -0
  257. package/dist/services/index.d.ts +1 -0
  258. package/dist/services/index.d.ts.map +1 -1
  259. package/dist/services/index.js +1 -0
  260. package/dist/services/roles-service.d.ts +35 -0
  261. package/dist/services/roles-service.d.ts.map +1 -0
  262. package/dist/services/roles-service.js +90 -0
  263. package/dist/services/version-service.d.ts.map +1 -1
  264. package/dist/types/auth.d.ts +43 -9
  265. package/dist/types/auth.d.ts.map +1 -1
  266. package/dist/types/auth.js +31 -26
  267. package/dist/types/capabilities.d.ts +104 -0
  268. package/dist/types/capabilities.d.ts.map +1 -0
  269. package/dist/types/capabilities.js +216 -0
  270. package/dist/types/index.d.ts +1 -0
  271. package/dist/types/index.d.ts.map +1 -1
  272. package/dist/types/index.js +1 -0
  273. package/dist/types/organization.d.ts +13 -4
  274. package/dist/types/organization.d.ts.map +1 -1
  275. package/dist/types/schemas.d.ts +71 -0
  276. package/dist/types/schemas.d.ts.map +1 -1
  277. package/dist/types/sidebar.d.ts +1 -1
  278. package/dist/types/sidebar.d.ts.map +1 -1
  279. package/dist/utils/mime-detect.d.ts.map +1 -1
  280. package/dist/utils/mime-detect.js +28 -6
  281. package/package.json +6 -2
@@ -22,6 +22,7 @@ export * from '../storage/providers/storage.js';
22
22
  // Services (includes sharp for image processing)
23
23
  export * from '../services/index.js';
24
24
  export { AssetService } from '../services/asset-service.js';
25
+ export { RolesService } from '../services/roles-service.js';
25
26
  // API Route handlers (for re-exporting in your app's API routes)
26
27
  // Re-export from routes-exports to avoid .js extension issues in workspace
27
28
  export * from '../routes-exports.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,+DAA+D;AAE/D,sDAAsD;AACtD,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAE/B,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAsB,MAAM,qBAAqB,CAAC;AAEpE,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,6CAA6C;AAC7C,OAAO,EAAE,aAAa,EAAqB,MAAM,UAAU,CAAC;AAE5D,qFAAqF;AACrF,cAAc,wBAAwB,CAAC;AAEvC,kCAAkC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAE7C,iDAAiD;AACjD,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,iEAAiE;AACjE,2EAA2E;AAC3E,cAAc,mBAAmB,CAAC;AAElC,mBAAmB;AACnB,cAAc,uBAAuB,CAAC;AAEtC,uCAAuC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,yCAAyC;AACzC,OAAO,EACN,oBAAoB,EAIpB,MAAM,kBAAkB,CAAC;AAE1B,uCAAuC;AACvC,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,eAAe,EAKf,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/server/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,+DAA+D;AAE/D,sDAAsD;AACtD,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAE/B,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAsB,MAAM,qBAAqB,CAAC;AAEpE,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,6CAA6C;AAC7C,OAAO,EAAE,aAAa,EAAqB,MAAM,UAAU,CAAC;AAE5D,qFAAqF;AACrF,cAAc,wBAAwB,CAAC;AAEvC,kCAAkC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAE7C,iDAAiD;AACjD,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,iEAAiE;AACjE,2EAA2E;AAC3E,cAAc,mBAAmB,CAAC;AAElC,mBAAmB;AACnB,cAAc,uBAAuB,CAAC;AAEtC,uCAAuC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,yCAAyC;AACzC,OAAO,EACN,oBAAoB,EAIpB,MAAM,kBAAkB,CAAC;AAE1B,uCAAuC;AACvC,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,eAAe,EAKf,MAAM,oBAAoB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export { AssetService } from './asset-service.js';
2
2
  export type { AssetUploadData, AssetFilters } from './asset-service.js';
3
3
  export { HierarchyService } from './hierarchy-service.js';
4
+ export { RolesService } from './roles-service.js';
4
5
  export { VersionService } from './version-service.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/services/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/services/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
@@ -3,5 +3,6 @@
3
3
  // Re-export services
4
4
  export { AssetService } from './asset-service.js';
5
5
  export { HierarchyService } from './hierarchy-service.js';
6
+ export { RolesService } from './roles-service.js';
6
7
  export { VersionService } from './version-service.js';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/services/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,uBAAuB;AAEvB,qBAAqB;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/services/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,uBAAuB;AAEvB,qBAAqB;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { CacheAdapter } from '../cache/index.js';
2
+ import type { DatabaseAdapter } from '../db/index.js';
3
+ import { type Capability, type Role } from '../types/capabilities.js';
4
+ /**
5
+ * RolesService — caches per-org role capability lookups.
6
+ *
7
+ * Mirrors HierarchyService's shape so both services share cache and
8
+ * in-flight deduplication patterns.
9
+ */
10
+ export declare class RolesService {
11
+ private db;
12
+ private cache;
13
+ private ttl;
14
+ private static DEFAULT_TTL;
15
+ private inflight;
16
+ constructor(db: DatabaseAdapter, cache?: CacheAdapter | null, ttl?: number);
17
+ /**
18
+ * Resolve the capability list for `(organizationId, roleName)`.
19
+ *
20
+ * Fallback order:
21
+ * 1. Cache hit.
22
+ * 2. DB lookup for the `(org, name)` row.
23
+ * 3. Built-in seed if the name matches a built-in.
24
+ * 4. Empty list — unknown role → no capabilities.
25
+ */
26
+ getCapabilities(organizationId: string, roleName: string): Promise<Capability[]>;
27
+ /** List every role defined for an organization. */
28
+ listRoles(organizationId: string): Promise<Role[]>;
29
+ /** Idempotent — safe to call on every request if you want. */
30
+ ensureBuiltins(organizationId: string): Promise<void>;
31
+ /** Invalidate cache entries for a single role. Call after mutation. */
32
+ invalidate(organizationId: string, roleName?: string): Promise<void>;
33
+ private resolveFromDb;
34
+ }
35
+ //# sourceMappingURL=roles-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles-service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/roles-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAGN,KAAK,UAAU,EACf,KAAK,IAAI,EACT,MAAM,uBAAuB,CAAC;AAI/B;;;;;GAKG;AACH,qBAAa,YAAY;IAKvB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,GAAG;IANZ,OAAO,CAAC,MAAM,CAAC,WAAW,CAAM;IAChC,OAAO,CAAC,QAAQ,CAA4C;gBAGnD,EAAE,EAAE,eAAe,EACnB,KAAK,GAAE,YAAY,GAAG,IAAW,EACjC,GAAG,GAAE,MAAiC;IAG/C;;;;;;;;OAQG;IACG,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAqBtF,mDAAmD;IAC7C,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAIxD,8DAA8D;IACxD,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,uEAAuE;IACjE,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAW5D,aAAa;CA2B3B"}
@@ -0,0 +1,91 @@
1
+ // services/roles-service.ts
2
+ //
3
+ // Resolves an org + role name to a concrete capability set, with a TTL cache
4
+ // and a built-in fallback so a missing row never locks an org out.
5
+ import { BUILTIN_ROLE_SEED, BUILTIN_ROLE_NAMES } from '../types/capabilities.js';
6
+ import { cmsLogger } from '../utils/logger.js';
7
+ /**
8
+ * RolesService — caches per-org role capability lookups.
9
+ *
10
+ * Mirrors HierarchyService's shape so both services share cache and
11
+ * in-flight deduplication patterns.
12
+ */
13
+ export class RolesService {
14
+ db;
15
+ cache;
16
+ ttl;
17
+ static DEFAULT_TTL = 30; // 30 seconds — roles change infrequently but should pick up edits quickly.
18
+ inflight = new Map();
19
+ constructor(db, cache = null, ttl = RolesService.DEFAULT_TTL) {
20
+ this.db = db;
21
+ this.cache = cache;
22
+ this.ttl = ttl;
23
+ }
24
+ /**
25
+ * Resolve the capability list for `(organizationId, roleName)`.
26
+ *
27
+ * Fallback order:
28
+ * 1. Cache hit.
29
+ * 2. DB lookup for the `(org, name)` row.
30
+ * 3. Built-in seed if the name matches a built-in.
31
+ * 4. Empty list — unknown role → no capabilities.
32
+ */
33
+ async getCapabilities(organizationId, roleName) {
34
+ const key = cacheKey(organizationId, roleName);
35
+ if (this.cache) {
36
+ const cached = await this.cache.get(key);
37
+ if (cached)
38
+ return cached;
39
+ }
40
+ const existing = this.inflight.get(key);
41
+ if (existing)
42
+ return existing;
43
+ const promise = this.resolveFromDb(organizationId, roleName).then(async (caps) => {
44
+ if (this.cache)
45
+ await this.cache.set(key, caps, this.ttl);
46
+ this.inflight.delete(key);
47
+ return caps;
48
+ });
49
+ this.inflight.set(key, promise);
50
+ return promise;
51
+ }
52
+ /** List every role defined for an organization. */
53
+ async listRoles(organizationId) {
54
+ return this.db.listRoles(organizationId);
55
+ }
56
+ /** Idempotent — safe to call on every request if you want. */
57
+ async ensureBuiltins(organizationId) {
58
+ await this.db.seedBuiltinRoles(organizationId);
59
+ }
60
+ /** Invalidate cache entries for a single role. Call after mutation. */
61
+ async invalidate(organizationId, roleName) {
62
+ if (!this.cache)
63
+ return;
64
+ if (roleName) {
65
+ await this.cache.delete(cacheKey(organizationId, roleName));
66
+ return;
67
+ }
68
+ await this.cache.invalidateByPrefix(`roles:${organizationId}:`);
69
+ }
70
+ // ---- internals -----------------------------------------------------------
71
+ async resolveFromDb(organizationId, roleName) {
72
+ const row = await this.db.findRoleByName(organizationId, roleName);
73
+ if (row) {
74
+ cmsLogger.debug('[RBAC]', `Resolved role "${roleName}" in org=${organizationId} via DB (${row.capabilities.length} caps)`);
75
+ return row.capabilities;
76
+ }
77
+ // Defense in depth: if a built-in row went missing (e.g. not yet seeded
78
+ // on a pre-existing org), fall back to the hard-coded seed so the app
79
+ // stays functional until `ensureBuiltins` runs.
80
+ if (BUILTIN_ROLE_NAMES.includes(roleName)) {
81
+ cmsLogger.warn('[RBAC]', `Role "${roleName}" not found in org=${organizationId} — using BUILTIN_ROLE_SEED fallback. Run ensureBuiltins.`);
82
+ return [...BUILTIN_ROLE_SEED[roleName].capabilities];
83
+ }
84
+ cmsLogger.warn('[RBAC]', `Unknown role "${roleName}" in org=${organizationId} — granting no capabilities`);
85
+ return [];
86
+ }
87
+ }
88
+ function cacheKey(organizationId, roleName) {
89
+ return `roles:${organizationId}:${roleName}`;
90
+ }
91
+ //# sourceMappingURL=roles-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles-service.js","sourceRoot":"","sources":["../../../src/lib/services/roles-service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"version-service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/version-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE7E;;;;;;GAMG;AACH,qBAAa,cAAc;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAI9C;;OAEG;IACG,aAAa,CAClB,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,OAAO,GAAG,SAAS,EAC9B,IAAI,EAAE,GAAG,EACT,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAelC;;OAEG;IACG,eAAe,CACpB,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,GAAG,EACT,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA2B3B;;OAEG;IACG,kBAAkB,CACvB,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgB3B;;OAEG;IACG,cAAc,CACnB,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAqCrB,YAAY,CACjB,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3C,OAAO,CAAC,mBAAmB,CAAC;IAKzB,UAAU,CACf,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;YAKpB,gBAAgB;CAoB9B"}
1
+ {"version":3,"file":"version-service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/version-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE7E;;;;;;GAMG;AACH,qBAAa,cAAc;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAI9C;;OAEG;IACG,aAAa,CAClB,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,OAAO,GAAG,SAAS,EAC9B,IAAI,EAAE,GAAG,EACT,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAelC;;OAEG;IACG,eAAe,CACpB,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,GAAG,EACT,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA2B3B;;OAEG;IACG,kBAAkB,CACvB,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgB3B;;OAEG;IACG,cAAc,CACnB,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAqCrB,YAAY,CACjB,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3C,OAAO,CAAC,mBAAmB,CAAC;IAKzB,UAAU,CACf,EAAE,EAAE,eAAe,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;YAKpB,gBAAgB;CAuB9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"version-service.js","sourceRoot":"","sources":["../../../src/lib/services/version-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"version-service.js","sourceRoot":"","sources":["../../../src/lib/services/version-service.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IAClB,WAAW,CAAS;IAE5B,YAAY,OAAkC;QAC7C,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAClB,EAAmB,EACnB,cAAsB,EACtB,UAAkB,EAClB,SAA8B,EAC9B,IAAS,EACT,MAAsB;QAEtB,IAAI,CAAC,EAAE,CAAC,qBAAqB;YAAE,OAAO,IAAI,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,qBAAqB,CAAC;YAC9C,UAAU;YACV,cAAc;YACd,SAAS;YACT,IAAI;YACJ,SAAS,EAAE,MAAM;SACjB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;QAC5D,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CACpB,EAAmB,EACnB,cAAsB,EACtB,UAAkB,EAClB,IAAS,EACT,MAAe;QAEf,IAAI,EAAE,CAAC,eAAe,IAAI,EAAE,CAAC,qBAAqB,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;gBAC5D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;gBACxF,IAAI,MAAM,EAAE,CAAC;oBACZ,MAAM,SAAS,CAAC,qBAAsB,CAAC;wBACtC,UAAU;wBACV,cAAc;wBACd,SAAS,EAAE,OAAO;wBAClB,IAAI;wBACJ,SAAS,EAAE,MAAM;qBACjB,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO,MAAM,CAAC;YACf,CAAC,CAAC,CAAC;YACH,IAAI,OAAO;gBAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YACzE,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,uBAAuB;QACvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,cAAc,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClF,IAAI,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACvB,EAAmB,EACnB,cAAsB,EACtB,UAAkB;QAElB,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,MAAM,IAAI,CAAC,aAAa,CACvB,EAAE,EACF,cAAc,EACd,UAAU,EACV,SAAS,EACT,SAAS,CAAC,aAAa,EACvB,SAAS,CAAC,SAAS,CACnB,CAAC;QAEF,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CACnB,EAAmB,EACnB,cAAsB,EACtB,UAAkB,EAClB,aAAqB,EACrB,MAAe;QAEf,IAAI,CAAC,EAAE,CAAC,kBAAkB;YAAE,OAAO,IAAI,CAAC;QAExC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,kBAAkB,CAAC,cAAc,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QACvF,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,IAAI,EAAE,CAAC,eAAe,IAAI,EAAE,CAAC,qBAAqB,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;gBAC7D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,cAAc,CAC5C,cAAc,EACd,UAAU,EACV,OAAO,CAAC,IAAI,EACZ,MAAM,CACN,CAAC;gBACF,IAAI,MAAM,EAAE,CAAC;oBACZ,MAAM,SAAS,CAAC,qBAAsB,CAAC;wBACtC,UAAU;wBACV,cAAc;wBACd,SAAS,EAAE,OAAO;wBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,SAAS,EAAE,MAAM;qBACjB,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO,MAAM,CAAC;YACf,CAAC,CAAC,CAAC;YACH,IAAI,QAAQ;gBAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAC1E,OAAO,QAAQ,CAAC;QACjB,CAAC;QAED,uBAAuB;QACvB,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,cAAc,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3F,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,YAAY,CACjB,EAAmB,EACnB,cAAsB,EACtB,UAAkB,EAClB,OAA6C;QAE7C,IAAI,CAAC,EAAE,CAAC,oBAAoB;YAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,CAAC,oBAAoB,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,UAAU,CACf,EAAmB,EACnB,cAAsB,EACtB,UAAkB,EAClB,aAAqB;QAErB,IAAI,CAAC,EAAE,CAAC,kBAAkB;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO,EAAE,CAAC,kBAAkB,CAAC,cAAc,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACzE,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC7B,EAAmB,EACnB,UAAkB,EAClB,cAAsB;QAEtB,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC;YAAE,OAAO;QAClC,IAAI,CAAC,EAAE,CAAC,oBAAoB,IAAI,CAAC,EAAE,CAAC,sBAAsB;YAAE,OAAO;QAEnE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,cAAc,EAAE,UAAU,EAAE;YACrF,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,CAAC;SACT,CAAC,CAAC;QAEH,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAEtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,EAAE,CAAC,sBAAsB,CAC9B,UAAU,EACV,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACzB,CAAC;QACH,CAAC;IACF,CAAC;CACD"}
@@ -1,5 +1,6 @@
1
1
  import type { CMSUser } from './user.js';
2
2
  import type { OrganizationRole } from './organization.js';
3
+ import type { Capability } from './capabilities.js';
3
4
  export interface SessionAuth {
4
5
  type: 'session';
5
6
  user: CMSUser;
@@ -8,12 +9,26 @@ export interface SessionAuth {
8
9
  expiresAt: Date;
9
10
  };
10
11
  organizationId: string;
11
- organizationRole: OrganizationRole;
12
+ /**
13
+ * Role name for the user in the active organization.
14
+ *
15
+ * Built-in roles (`owner`/`admin`/`editor`/`viewer`) are typed as the
16
+ * `OrganizationRole` union; custom roles defined per-org are plain
17
+ * strings. Consumers that need to branch on built-ins should use
18
+ * `effectiveOrganizationRole` from types/capabilities.
19
+ */
20
+ organizationRole: OrganizationRole | string;
21
+ /**
22
+ * Capabilities resolved for this session by the auth hook (RolesService).
23
+ * Present for fully-authenticated sessions. When absent, callers fall
24
+ * back to built-in seed values — see `resolveCapabilities`.
25
+ */
26
+ capabilities?: Capability[];
12
27
  organizations?: Array<{
13
28
  id: string;
14
29
  name: string;
15
30
  slug: string;
16
- role: OrganizationRole;
31
+ role: OrganizationRole | string;
17
32
  isActive: boolean;
18
33
  metadata?: any;
19
34
  }>;
@@ -34,29 +49,48 @@ export interface ApiKeyAuth {
34
49
  type: 'api_key';
35
50
  keyId: string;
36
51
  name: string;
52
+ /**
53
+ * Legacy coarse-grained scopes: `read` (read capabilities) and `write`
54
+ * (mutating capabilities). Preserved for backwards compatibility with
55
+ * keys issued before the fine-grained capability model. Still used as
56
+ * the fallback source when `capabilities` is not populated.
57
+ */
37
58
  permissions: ('read' | 'write')[];
59
+ /**
60
+ * Fine-grained capability allowlist for this API key. When present,
61
+ * overrides the coarse `permissions` mapping — the key can do exactly
62
+ * what's listed and nothing else. Storage format on the key metadata
63
+ * matches the Capability union.
64
+ */
65
+ capabilities?: Capability[];
38
66
  organizationId: string;
39
67
  environment?: string;
40
68
  lastUsedAt?: Date;
41
69
  }
42
70
  export type Auth = SessionAuth | PartialSessionAuth | ApiKeyAuth;
43
71
  /**
44
- * Check if a user has write permissions based on their organization role
45
- * Viewers have read-only access
72
+ * Does the user have *any* mutating capability?
73
+ *
74
+ * Coarse-grained on purpose: this is for UI gating where you just want to
75
+ * decide whether to show the entire edit/upload surface. Don't use it to
76
+ * authorise a specific mutation — the server's PermissionChecker does that
77
+ * per-operation (canCreate vs canUpdate vs canDelete, etc).
46
78
  */
47
79
  export declare function canWrite(auth: Auth): boolean;
48
80
  /**
49
- * Check if a user can manage organization members
50
- * Only owners and admins can manage members
81
+ * Can the user manage organization members (invite / remove / change role)?
51
82
  */
52
83
  export declare function canManageMembers(auth: Auth): boolean;
53
84
  /**
54
- * Check if a user can manage API keys
55
- * Only owners and admins can manage API keys
85
+ * Can the user manage API keys?
56
86
  */
57
87
  export declare function canManageApiKeys(auth: Auth): boolean;
58
88
  /**
59
- * Check if a user is a viewer (read-only access)
89
+ * Is this session effectively read-only?
90
+ *
91
+ * Inverse of `canWrite`. Named for historical reasons — prefer `canWrite()`
92
+ * for positive checks; `isViewer()` remains available for call sites that
93
+ * read more naturally in the negative (e.g. `isReadOnly={isViewer(auth)}`).
60
94
  */
61
95
  export declare function isViewer(auth: Auth): boolean;
62
96
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/lib/types/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,IAAI,CAAC;KAChB,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,CAAC,EAAE,KAAK,CAAC;QACrB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,gBAAgB,CAAC;QACvB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,GAAG,CAAC;KACf,CAAC,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,IAAI,CAAC;KAChB,CAAC;CACF;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,MAAM,IAAI,GAAG,WAAW,GAAG,kBAAkB,GAAG,UAAU,CAAC;AAIjE;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAM5C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAGpD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAGpD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAM5C"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/lib/types/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,IAAI,CAAC;KAChB,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;OAOG;IACH,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAC5C;;;;OAIG;IACH,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,KAAK,CAAC;QACrB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAAC;QAChC,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,GAAG,CAAC;KACf,CAAC,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,IAAI,CAAC;KAChB,CAAC;CACF;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,WAAW,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IAClC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,MAAM,IAAI,GAAG,WAAW,GAAG,kBAAkB,GAAG,UAAU,CAAC;AAYjE;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAO5C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAMpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAEpD;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE5C"}
@@ -1,43 +1,48 @@
1
- // Access control utilities
1
+ // Access control utilities.
2
+ //
3
+ // These are thin wrappers over the capability system. They exist so callers
4
+ // don't need to import `hasCapability` + a specific capability string for the
5
+ // common "can this user do X" branching in server loads and UI gating.
6
+ //
7
+ // Capabilities are resolved once per request by the auth hook and stored on
8
+ // `auth.capabilities`, so these remain synchronous.
9
+ import { hasCapability } from './capabilities.js';
2
10
  /**
3
- * Check if a user has write permissions based on their organization role
4
- * Viewers have read-only access
11
+ * Does the user have *any* mutating capability?
12
+ *
13
+ * Coarse-grained on purpose: this is for UI gating where you just want to
14
+ * decide whether to show the entire edit/upload surface. Don't use it to
15
+ * authorise a specific mutation — the server's PermissionChecker does that
16
+ * per-operation (canCreate vs canUpdate vs canDelete, etc).
5
17
  */
6
18
  export function canWrite(auth) {
7
- if (auth.type === 'partial_session')
8
- return false;
9
- if (auth.type === 'api_key') {
10
- return auth.permissions.includes('write');
11
- }
12
- return auth.organizationRole !== 'viewer';
19
+ return (hasCapability(auth, 'document.create') ||
20
+ hasCapability(auth, 'document.update') ||
21
+ hasCapability(auth, 'document.delete') ||
22
+ hasCapability(auth, 'asset.upload'));
13
23
  }
14
24
  /**
15
- * Check if a user can manage organization members
16
- * Only owners and admins can manage members
25
+ * Can the user manage organization members (invite / remove / change role)?
17
26
  */
18
27
  export function canManageMembers(auth) {
19
- if (auth.type === 'api_key' || auth.type === 'partial_session')
20
- return false;
21
- return auth.organizationRole === 'owner' || auth.organizationRole === 'admin';
28
+ return (hasCapability(auth, 'member.invite') ||
29
+ hasCapability(auth, 'member.remove') ||
30
+ hasCapability(auth, 'member.changeRole'));
22
31
  }
23
32
  /**
24
- * Check if a user can manage API keys
25
- * Only owners and admins can manage API keys
33
+ * Can the user manage API keys?
26
34
  */
27
35
  export function canManageApiKeys(auth) {
28
- if (auth.type === 'api_key' || auth.type === 'partial_session')
29
- return false;
30
- return auth.organizationRole === 'owner' || auth.organizationRole === 'admin';
36
+ return hasCapability(auth, 'apiKey.manage');
31
37
  }
32
38
  /**
33
- * Check if a user is a viewer (read-only access)
39
+ * Is this session effectively read-only?
40
+ *
41
+ * Inverse of `canWrite`. Named for historical reasons — prefer `canWrite()`
42
+ * for positive checks; `isViewer()` remains available for call sites that
43
+ * read more naturally in the negative (e.g. `isReadOnly={isViewer(auth)}`).
34
44
  */
35
45
  export function isViewer(auth) {
36
- if (auth.type === 'partial_session')
37
- return true;
38
- if (auth.type === 'api_key') {
39
- return !auth.permissions.includes('write');
40
- }
41
- return auth.organizationRole === 'viewer';
46
+ return !canWrite(auth);
42
47
  }
43
48
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/lib/types/auth.ts"],"names":[],"mappings":"AAgDA,2BAA2B;AAE3B;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAU;IAClC,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAU;IAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAC7E,OAAO,IAAI,CAAC,gBAAgB,KAAK,OAAO,IAAI,IAAI,CAAC,gBAAgB,KAAK,OAAO,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAU;IAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAC7E,OAAO,IAAI,CAAC,gBAAgB,KAAK,OAAO,IAAI,IAAI,CAAC,gBAAgB,KAAK,OAAO,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAU;IAClC,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/lib/types/auth.ts"],"names":[],"mappings":"AA4EA,4BAA4B;AAC5B,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,uEAAuE;AACvE,EAAE;AACF,4EAA4E;AAC5E,oDAAoD;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAU;IAClC,OAAO,CACN,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC;QACtC,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC;QACtC,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC;QACtC,aAAa,CAAC,IAAI,EAAE,cAAc,CAAC,CACnC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAU;IAC1C,OAAO,CACN,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC;QACpC,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC;QACpC,aAAa,CAAC,IAAI,EAAE,mBAAmB,CAAC,CACxC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAU;IAC1C,OAAO,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,104 @@
1
+ import type { Auth } from './auth.js';
2
+ import type { OrganizationRole } from './organization.js';
3
+ /**
4
+ * Flat, serializable permission primitives.
5
+ *
6
+ * Append-only: removing or renaming a value silently weakens every call site.
7
+ * If a capability is no longer needed, leave the string and stop granting it.
8
+ */
9
+ export type Capability = 'document.read' | 'document.create' | 'document.update' | 'document.delete' | 'document.publish' | 'document.unpublish' | 'asset.read' | 'asset.upload' | 'asset.delete' | 'member.invite' | 'member.remove' | 'member.changeRole' | 'apiKey.manage' | 'role.manage' | 'org.settings';
10
+ /**
11
+ * Enumerate every capability. Useful for owner seeding and validation.
12
+ */
13
+ export declare const ALL_CAPABILITIES: readonly Capability[];
14
+ /**
15
+ * Built-in role names. These are the guaranteed defaults every org receives.
16
+ * Custom role names are any other string.
17
+ */
18
+ export declare const BUILTIN_ROLE_NAMES: readonly OrganizationRole[];
19
+ /**
20
+ * Seed data for the four built-in roles.
21
+ *
22
+ * This is the **default floor** — the set of capabilities a freshly-created
23
+ * org starts with. Once seeded, rows live in `cms_roles` and can be edited by
24
+ * admins (via future Roles UI). Custom roles live alongside these.
25
+ *
26
+ * Also acts as the defense-in-depth fallback: if a role lookup misses (e.g.
27
+ * a row got deleted out-of-band for a built-in name), the checker falls back
28
+ * to this map rather than locking the org out.
29
+ */
30
+ export declare const BUILTIN_ROLE_SEED: Record<OrganizationRole, {
31
+ description: string;
32
+ capabilities: readonly Capability[];
33
+ }>;
34
+ /**
35
+ * Idempotently expand a capability list so that any write cap drags in the
36
+ * corresponding read. Used by both the role schema and the API-key schema.
37
+ */
38
+ export declare function normalizeCapabilities(caps: readonly Capability[]): Capability[];
39
+ /**
40
+ * A persisted role row (per organization).
41
+ */
42
+ export interface Role {
43
+ id: string;
44
+ organizationId: string;
45
+ name: string;
46
+ description: string | null;
47
+ capabilities: Capability[];
48
+ isBuiltIn: boolean;
49
+ createdAt: Date;
50
+ updatedAt: Date;
51
+ }
52
+ export interface NewRole {
53
+ organizationId: string;
54
+ name: string;
55
+ description?: string | null;
56
+ capabilities: Capability[];
57
+ isBuiltIn?: boolean;
58
+ }
59
+ /**
60
+ * Build the four built-in role rows for a newly-created organization.
61
+ * Used by migration, org-creation, and the runtime seeder.
62
+ */
63
+ export declare function buildBuiltinRoleRows(organizationId: string): NewRole[];
64
+ /**
65
+ * Check whether an Auth already has a capability.
66
+ *
67
+ * Expects `auth.capabilities` to have been populated by the auth hook via
68
+ * RolesService. If absent (e.g. legacy call site), falls back to the built-in
69
+ * seed for the org role so behavior remains safe.
70
+ */
71
+ export declare function hasCapability(auth: Auth, capability: Capability): boolean;
72
+ /**
73
+ * Resolve the effective capability set for an Auth.
74
+ *
75
+ * Precedence:
76
+ * 1. `auth.capabilities` (pre-resolved by the auth hook) — authoritative.
77
+ * 2. Instance-role override (super_admin/admin) → all capabilities.
78
+ * 3. API keys → derived from `read`/`write` scopes.
79
+ * 4. Session fallback → built-in seed for the org role.
80
+ * 5. Partial session → empty set.
81
+ */
82
+ export declare function resolveCapabilities(auth: Auth): ReadonlySet<Capability>;
83
+ /**
84
+ * Resolve the effective organization role name for an Auth, honoring
85
+ * instance-role overrides. Returns the role name as a string — built-in or
86
+ * custom — or `null` for partial sessions and API keys.
87
+ *
88
+ * Used by schema-level access lists: an allowlist like
89
+ * `['admin','owner','Testing']` is matched literally against this value, so
90
+ * custom role names participate just like built-ins do.
91
+ */
92
+ export declare function effectiveOrganizationRole(auth: Auth): string | null;
93
+ /**
94
+ * Shape of the RBAC payload exposed to the client by the admin layout's
95
+ * server load. Mirror this in `App.PageData` so Svelte pages can read
96
+ * `$page.data.rbac` without casting to `any`.
97
+ */
98
+ export interface RbacPayload {
99
+ /** Current organization role name (built-in or custom). `null` for none. */
100
+ role: string | null;
101
+ /** Capabilities resolved for this session. Safe to treat as read-only. */
102
+ capabilities: Capability[];
103
+ }
104
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/lib/types/capabilities.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAEnB,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,oBAAoB,GAEpB,YAAY,GACZ,cAAc,GACd,cAAc,GAEd,eAAe,GACf,eAAe,GACf,mBAAmB,GACnB,eAAe,GACf,aAAa,GACb,cAAc,CAAC;AAMlB;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,UAAU,EAgBxC,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,gBAAgB,EAKzD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACrC,gBAAgB,EAChB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,CA4C5D,CAAC;AAeF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,CAK/E;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,EAAE,CAQtE;AAWD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAEzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,CAoCvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAInE;AAID;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC3B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,0EAA0E;IAC1E,YAAY,EAAE,UAAU,EAAE,CAAC;CAC3B"}