@aphexcms/cms-core 9.3.0 → 9.5.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 (431) hide show
  1. package/dist/admin/block-previews.svelte.d.ts +46 -0
  2. package/dist/admin/block-previews.svelte.d.ts.map +1 -0
  3. package/dist/admin/block-previews.svelte.js +26 -0
  4. package/dist/admin/field-components.svelte.d.ts +16 -0
  5. package/dist/admin/field-components.svelte.d.ts.map +1 -0
  6. package/dist/admin/field-components.svelte.js +18 -0
  7. package/dist/admin/nav.svelte.d.ts +34 -0
  8. package/dist/admin/nav.svelte.d.ts.map +1 -0
  9. package/dist/admin/nav.svelte.js +78 -0
  10. package/dist/admin/slots.svelte.d.ts +50 -0
  11. package/dist/admin/slots.svelte.d.ts.map +1 -0
  12. package/dist/admin/slots.svelte.js +67 -0
  13. package/dist/admin/types.d.ts +7 -0
  14. package/dist/admin/types.d.ts.map +1 -0
  15. package/dist/admin/types.js +1 -0
  16. package/dist/api/schemas/api-keys.d.ts +4 -37
  17. package/dist/api/schemas/api-keys.d.ts.map +1 -1
  18. package/dist/api/schemas/api-keys.js +5 -2
  19. package/dist/api/schemas/assets.d.ts +4 -0
  20. package/dist/api/schemas/assets.d.ts.map +1 -1
  21. package/dist/api/schemas/assets.js +3 -0
  22. package/dist/api/schemas/plugin-settings.d.ts +6 -0
  23. package/dist/api/schemas/plugin-settings.d.ts.map +1 -0
  24. package/dist/api/schemas/plugin-settings.js +8 -0
  25. package/dist/api/schemas/roles.d.ts +7 -56
  26. package/dist/api/schemas/roles.d.ts.map +1 -1
  27. package/dist/api/schemas/roles.js +11 -6
  28. package/dist/api/schemas/user.d.ts +2 -1
  29. package/dist/api/schemas/user.d.ts.map +1 -1
  30. package/dist/api/schemas/user.js +7 -2
  31. package/dist/app-augment.d.ts +11 -0
  32. package/dist/app-augment.d.ts.map +1 -1
  33. package/dist/app.d.ts +2 -0
  34. package/dist/auth/provider.d.ts +3 -0
  35. package/dist/auth/provider.d.ts.map +1 -1
  36. package/dist/cli/generate-types.d.ts +10 -5
  37. package/dist/cli/generate-types.d.ts.map +1 -1
  38. package/dist/cli/generate-types.js +117 -77
  39. package/dist/cli/generate-types.js.map +1 -1
  40. package/dist/cli/index.js +5 -5
  41. package/dist/cli/index.js.map +1 -1
  42. package/dist/cli/migrate.d.ts +1 -1
  43. package/dist/cli/migrate.d.ts.map +1 -1
  44. package/dist/cli/migrate.js +27 -2
  45. package/dist/cli/migrate.js.map +1 -1
  46. package/dist/client/index.d.ts +6 -0
  47. package/dist/client/index.d.ts.map +1 -1
  48. package/dist/client/index.js +9 -0
  49. package/dist/components/AdminApp.svelte +271 -113
  50. package/dist/components/AdminApp.svelte.d.ts +18 -2
  51. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  52. package/dist/components/admin/AdminSlot.svelte +18 -0
  53. package/dist/components/admin/AdminSlot.svelte.d.ts +12 -0
  54. package/dist/components/admin/AdminSlot.svelte.d.ts.map +1 -0
  55. package/dist/components/admin/DocumentEditor.svelte +646 -385
  56. package/dist/components/admin/DocumentEditor.svelte.d.ts +13 -0
  57. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  58. package/dist/components/admin/MediaBrowser.svelte +13 -3
  59. package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -1
  60. package/dist/components/admin/PluginSettingsPanel.svelte +231 -0
  61. package/dist/components/admin/PluginSettingsPanel.svelte.d.ts +8 -0
  62. package/dist/components/admin/PluginSettingsPanel.svelte.d.ts.map +1 -0
  63. package/dist/components/admin/SchemaField.svelte +76 -95
  64. package/dist/components/admin/SchemaField.svelte.d.ts +7 -0
  65. package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -1
  66. package/dist/components/admin/fields/ArrayField.svelte +24 -2
  67. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
  68. package/dist/components/admin/fields/FieldInput.svelte +109 -0
  69. package/dist/components/admin/fields/FieldInput.svelte.d.ts +17 -0
  70. package/dist/components/admin/fields/FieldInput.svelte.d.ts.map +1 -0
  71. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte +5 -12
  72. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts +2 -9
  73. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts.map +1 -1
  74. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte +18 -17
  75. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts +2 -9
  76. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts.map +1 -1
  77. package/dist/components/admin/fields/richtext/RichtextField.svelte +55 -2
  78. package/dist/components/admin/fields/richtext/RichtextField.svelte.d.ts.map +1 -1
  79. package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts +7 -0
  80. package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -1
  81. package/dist/components/admin/fields/richtext/portable-text-object-node.js +4 -2
  82. package/dist/components/admin/fields/richtext/svelte-node-view.d.ts +16 -1
  83. package/dist/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -1
  84. package/dist/components/admin/fields/richtext/svelte-node-view.js +20 -1
  85. package/dist/components/layout/OrganizationSwitcher.svelte +31 -10
  86. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -1
  87. package/dist/components/layout/Sidebar.svelte +49 -11
  88. package/dist/components/layout/Sidebar.svelte.d.ts +5 -1
  89. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -1
  90. package/dist/components/layout/sidebar/AppSidebar.svelte +66 -3
  91. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +5 -0
  92. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -1
  93. package/dist/components/layout/sidebar/NavMain.svelte +3 -2
  94. package/dist/components/layout/sidebar/NavMain.svelte.d.ts +4 -3
  95. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -1
  96. package/dist/components/layout/sidebar/NavUser.svelte +5 -1
  97. package/dist/config.d.ts.map +1 -1
  98. package/dist/config.js +11 -0
  99. package/dist/db/interfaces/asset.d.ts +1 -0
  100. package/dist/db/interfaces/asset.d.ts.map +1 -1
  101. package/dist/db/interfaces/index.d.ts +3 -1
  102. package/dist/db/interfaces/index.d.ts.map +1 -1
  103. package/dist/db/interfaces/plugin-settings.d.ts +23 -0
  104. package/dist/db/interfaces/plugin-settings.d.ts.map +1 -0
  105. package/dist/db/interfaces/plugin-settings.js +13 -0
  106. package/dist/db/interfaces/role.d.ts +14 -5
  107. package/dist/db/interfaces/role.d.ts.map +1 -1
  108. package/dist/engine.d.ts +28 -0
  109. package/dist/engine.d.ts.map +1 -1
  110. package/dist/engine.js +44 -0
  111. package/dist/field-validation/utils.d.ts +15 -0
  112. package/dist/field-validation/utils.d.ts.map +1 -1
  113. package/dist/field-validation/utils.js +74 -0
  114. package/dist/graphql/resolvers.d.ts.map +1 -1
  115. package/dist/graphql/resolvers.js +9 -10
  116. package/dist/graphql/schema.d.ts.map +1 -1
  117. package/dist/graphql/schema.js +18 -19
  118. package/dist/hooks.d.ts +6 -0
  119. package/dist/hooks.d.ts.map +1 -1
  120. package/dist/hooks.js +59 -2
  121. package/dist/index.d.ts +2 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +5 -0
  124. package/dist/lib/admin/block-previews.svelte.d.ts +46 -0
  125. package/dist/lib/admin/block-previews.svelte.d.ts.map +1 -0
  126. package/dist/lib/admin/block-previews.svelte.js +27 -0
  127. package/dist/lib/admin/block-previews.svelte.js.map +1 -0
  128. package/dist/lib/admin/field-components.svelte.d.ts +16 -0
  129. package/dist/lib/admin/field-components.svelte.d.ts.map +1 -0
  130. package/dist/lib/admin/field-components.svelte.js +19 -0
  131. package/dist/lib/admin/field-components.svelte.js.map +1 -0
  132. package/dist/lib/admin/nav.svelte.d.ts +34 -0
  133. package/dist/lib/admin/nav.svelte.d.ts.map +1 -0
  134. package/dist/lib/admin/nav.svelte.js +79 -0
  135. package/dist/lib/admin/nav.svelte.js.map +1 -0
  136. package/dist/lib/admin/slots.svelte.d.ts +50 -0
  137. package/dist/lib/admin/slots.svelte.d.ts.map +1 -0
  138. package/dist/lib/admin/slots.svelte.js +68 -0
  139. package/dist/lib/admin/slots.svelte.js.map +1 -0
  140. package/dist/lib/admin/types.d.ts +7 -0
  141. package/dist/lib/admin/types.d.ts.map +1 -0
  142. package/dist/lib/admin/types.js +2 -0
  143. package/dist/lib/admin/types.js.map +1 -0
  144. package/dist/lib/api/schemas/api-keys.d.ts +4 -37
  145. package/dist/lib/api/schemas/api-keys.d.ts.map +1 -1
  146. package/dist/lib/api/schemas/api-keys.js +5 -2
  147. package/dist/lib/api/schemas/api-keys.js.map +1 -1
  148. package/dist/lib/api/schemas/assets.d.ts +4 -0
  149. package/dist/lib/api/schemas/assets.d.ts.map +1 -1
  150. package/dist/lib/api/schemas/assets.js +3 -0
  151. package/dist/lib/api/schemas/assets.js.map +1 -1
  152. package/dist/lib/api/schemas/plugin-settings.d.ts +6 -0
  153. package/dist/lib/api/schemas/plugin-settings.d.ts.map +1 -0
  154. package/dist/lib/api/schemas/plugin-settings.js +9 -0
  155. package/dist/lib/api/schemas/plugin-settings.js.map +1 -0
  156. package/dist/lib/api/schemas/roles.d.ts +7 -56
  157. package/dist/lib/api/schemas/roles.d.ts.map +1 -1
  158. package/dist/lib/api/schemas/roles.js +11 -6
  159. package/dist/lib/api/schemas/roles.js.map +1 -1
  160. package/dist/lib/api/schemas/user.d.ts +2 -1
  161. package/dist/lib/api/schemas/user.d.ts.map +1 -1
  162. package/dist/lib/api/schemas/user.js +7 -2
  163. package/dist/lib/api/schemas/user.js.map +1 -1
  164. package/dist/lib/app-augment.d.ts +11 -0
  165. package/dist/lib/app-augment.d.ts.map +1 -1
  166. package/dist/lib/auth/provider.d.ts +3 -0
  167. package/dist/lib/auth/provider.d.ts.map +1 -1
  168. package/dist/lib/client/index.d.ts +6 -0
  169. package/dist/lib/client/index.d.ts.map +1 -1
  170. package/dist/lib/client/index.js +9 -0
  171. package/dist/lib/client/index.js.map +1 -1
  172. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts +7 -0
  173. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -1
  174. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js +4 -2
  175. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js.map +1 -1
  176. package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts +16 -1
  177. package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -1
  178. package/dist/lib/components/admin/fields/richtext/svelte-node-view.js +20 -1
  179. package/dist/lib/components/admin/fields/richtext/svelte-node-view.js.map +1 -1
  180. package/dist/lib/config.d.ts.map +1 -1
  181. package/dist/lib/config.js +11 -0
  182. package/dist/lib/config.js.map +1 -1
  183. package/dist/lib/db/interfaces/asset.d.ts +1 -0
  184. package/dist/lib/db/interfaces/asset.d.ts.map +1 -1
  185. package/dist/lib/db/interfaces/index.d.ts +3 -1
  186. package/dist/lib/db/interfaces/index.d.ts.map +1 -1
  187. package/dist/lib/db/interfaces/plugin-settings.d.ts +23 -0
  188. package/dist/lib/db/interfaces/plugin-settings.d.ts.map +1 -0
  189. package/dist/lib/db/interfaces/plugin-settings.js +14 -0
  190. package/dist/lib/db/interfaces/plugin-settings.js.map +1 -0
  191. package/dist/lib/db/interfaces/role.d.ts +14 -5
  192. package/dist/lib/db/interfaces/role.d.ts.map +1 -1
  193. package/dist/lib/engine.d.ts +28 -0
  194. package/dist/lib/engine.d.ts.map +1 -1
  195. package/dist/lib/engine.js +44 -0
  196. package/dist/lib/engine.js.map +1 -1
  197. package/dist/lib/field-validation/utils.d.ts +15 -0
  198. package/dist/lib/field-validation/utils.d.ts.map +1 -1
  199. package/dist/lib/field-validation/utils.js +74 -0
  200. package/dist/lib/field-validation/utils.js.map +1 -1
  201. package/dist/lib/graphql/resolvers.d.ts.map +1 -1
  202. package/dist/lib/graphql/resolvers.js +9 -10
  203. package/dist/lib/graphql/resolvers.js.map +1 -1
  204. package/dist/lib/graphql/schema.d.ts.map +1 -1
  205. package/dist/lib/graphql/schema.js +18 -19
  206. package/dist/lib/graphql/schema.js.map +1 -1
  207. package/dist/lib/hooks.d.ts +6 -0
  208. package/dist/lib/hooks.d.ts.map +1 -1
  209. package/dist/lib/hooks.js +59 -2
  210. package/dist/lib/hooks.js.map +1 -1
  211. package/dist/lib/index.d.ts +2 -0
  212. package/dist/lib/index.d.ts.map +1 -1
  213. package/dist/lib/index.js +5 -0
  214. package/dist/lib/index.js.map +1 -1
  215. package/dist/lib/local-api/collection-api.d.ts.map +1 -1
  216. package/dist/lib/local-api/collection-api.js +4 -2
  217. package/dist/lib/local-api/collection-api.js.map +1 -1
  218. package/dist/lib/local-api/types.d.ts +8 -0
  219. package/dist/lib/local-api/types.d.ts.map +1 -1
  220. package/dist/lib/mcp/tools.d.ts.map +1 -1
  221. package/dist/lib/mcp/tools.js +110 -1
  222. package/dist/lib/mcp/tools.js.map +1 -1
  223. package/dist/lib/permissions-context.svelte.d.ts +7 -4
  224. package/dist/lib/permissions-context.svelte.d.ts.map +1 -1
  225. package/dist/lib/permissions-context.svelte.js.map +1 -1
  226. package/dist/lib/plugins/index.d.ts +3 -0
  227. package/dist/lib/plugins/index.d.ts.map +1 -0
  228. package/dist/lib/plugins/index.js +3 -0
  229. package/dist/lib/plugins/index.js.map +1 -0
  230. package/dist/lib/plugins/resolver.d.ts +49 -0
  231. package/dist/lib/plugins/resolver.d.ts.map +1 -0
  232. package/dist/lib/plugins/resolver.js +66 -0
  233. package/dist/lib/plugins/resolver.js.map +1 -0
  234. package/dist/lib/plugins/types.d.ts +233 -0
  235. package/dist/lib/plugins/types.d.ts.map +1 -0
  236. package/dist/lib/plugins/types.js +9 -0
  237. package/dist/lib/plugins/types.js.map +1 -0
  238. package/dist/lib/schema-utils/desugar.d.ts +27 -0
  239. package/dist/lib/schema-utils/desugar.d.ts.map +1 -0
  240. package/dist/lib/schema-utils/desugar.js +102 -0
  241. package/dist/lib/schema-utils/desugar.js.map +1 -0
  242. package/dist/lib/schema-utils/index.d.ts +2 -0
  243. package/dist/lib/schema-utils/index.d.ts.map +1 -1
  244. package/dist/lib/schema-utils/index.js +2 -0
  245. package/dist/lib/schema-utils/index.js.map +1 -1
  246. package/dist/lib/schema-utils/settings.d.ts +17 -0
  247. package/dist/lib/schema-utils/settings.d.ts.map +1 -0
  248. package/dist/lib/schema-utils/settings.js +23 -0
  249. package/dist/lib/schema-utils/settings.js.map +1 -0
  250. package/dist/lib/schema-utils/validator.d.ts.map +1 -1
  251. package/dist/lib/schema-utils/validator.js +11 -0
  252. package/dist/lib/schema-utils/validator.js.map +1 -1
  253. package/dist/lib/security/secret-crypto.d.ts +18 -0
  254. package/dist/lib/security/secret-crypto.d.ts.map +1 -0
  255. package/dist/lib/security/secret-crypto.js +71 -0
  256. package/dist/lib/security/secret-crypto.js.map +1 -0
  257. package/dist/lib/server/api/index.d.ts.map +1 -1
  258. package/dist/lib/server/api/index.js +3 -0
  259. package/dist/lib/server/api/index.js.map +1 -1
  260. package/dist/lib/server/api/routes/assets.d.ts.map +1 -1
  261. package/dist/lib/server/api/routes/assets.js +8 -2
  262. package/dist/lib/server/api/routes/assets.js.map +1 -1
  263. package/dist/lib/server/api/routes/organizations.d.ts.map +1 -1
  264. package/dist/lib/server/api/routes/organizations.js +4 -1
  265. package/dist/lib/server/api/routes/organizations.js.map +1 -1
  266. package/dist/lib/server/api/routes/plugin-settings.d.ts +4 -0
  267. package/dist/lib/server/api/routes/plugin-settings.d.ts.map +1 -0
  268. package/dist/lib/server/api/routes/plugin-settings.js +109 -0
  269. package/dist/lib/server/api/routes/plugin-settings.js.map +1 -0
  270. package/dist/lib/server/api/routes/roles.d.ts.map +1 -1
  271. package/dist/lib/server/api/routes/roles.js +37 -0
  272. package/dist/lib/server/api/routes/roles.js.map +1 -1
  273. package/dist/lib/server/api/routes/user.d.ts.map +1 -1
  274. package/dist/lib/server/api/routes/user.js +14 -3
  275. package/dist/lib/server/api/routes/user.js.map +1 -1
  276. package/dist/lib/services/asset-service.d.ts +1 -0
  277. package/dist/lib/services/asset-service.d.ts.map +1 -1
  278. package/dist/lib/services/asset-service.js.map +1 -1
  279. package/dist/lib/services/index.d.ts +2 -0
  280. package/dist/lib/services/index.d.ts.map +1 -1
  281. package/dist/lib/services/index.js +1 -0
  282. package/dist/lib/services/index.js.map +1 -1
  283. package/dist/lib/services/plugin-settings-service.d.ts +76 -0
  284. package/dist/lib/services/plugin-settings-service.d.ts.map +1 -0
  285. package/dist/lib/services/plugin-settings-service.js +236 -0
  286. package/dist/lib/services/plugin-settings-service.js.map +1 -0
  287. package/dist/lib/services/roles-service.d.ts +2 -2
  288. package/dist/lib/services/roles-service.d.ts.map +1 -1
  289. package/dist/lib/services/roles-service.js.map +1 -1
  290. package/dist/lib/theme/css.d.ts +30 -0
  291. package/dist/lib/theme/css.d.ts.map +1 -0
  292. package/dist/lib/theme/css.js +54 -0
  293. package/dist/lib/theme/css.js.map +1 -0
  294. package/dist/lib/theme/derive.d.ts +27 -0
  295. package/dist/lib/theme/derive.d.ts.map +1 -0
  296. package/dist/lib/theme/derive.js +108 -0
  297. package/dist/lib/theme/derive.js.map +1 -0
  298. package/dist/lib/theme/index.d.ts +5 -0
  299. package/dist/lib/theme/index.d.ts.map +1 -0
  300. package/dist/lib/theme/index.js +5 -0
  301. package/dist/lib/theme/index.js.map +1 -0
  302. package/dist/lib/theme/schemes.d.ts +60 -0
  303. package/dist/lib/theme/schemes.d.ts.map +1 -0
  304. package/dist/lib/theme/schemes.js +150 -0
  305. package/dist/lib/theme/schemes.js.map +1 -0
  306. package/dist/lib/theme/tokens.d.ts +57 -0
  307. package/dist/lib/theme/tokens.d.ts.map +1 -0
  308. package/dist/lib/theme/tokens.js +11 -0
  309. package/dist/lib/theme/tokens.js.map +1 -0
  310. package/dist/lib/types/auth.d.ts +10 -10
  311. package/dist/lib/types/auth.d.ts.map +1 -1
  312. package/dist/lib/types/capabilities.d.ts +50 -9
  313. package/dist/lib/types/capabilities.d.ts.map +1 -1
  314. package/dist/lib/types/capabilities.js +147 -5
  315. package/dist/lib/types/capabilities.js.map +1 -1
  316. package/dist/lib/types/config.d.ts +30 -1
  317. package/dist/lib/types/config.d.ts.map +1 -1
  318. package/dist/lib/types/schemas.d.ts +90 -2
  319. package/dist/lib/types/schemas.d.ts.map +1 -1
  320. package/dist/lib/types/schemas.js.map +1 -1
  321. package/dist/lib/types/sidebar.d.ts +3 -1
  322. package/dist/lib/types/sidebar.d.ts.map +1 -1
  323. package/dist/lib/utils/index.d.ts +1 -0
  324. package/dist/lib/utils/index.d.ts.map +1 -1
  325. package/dist/lib/utils/index.js +1 -0
  326. package/dist/lib/utils/index.js.map +1 -1
  327. package/dist/lib/utils/preview.d.ts +16 -5
  328. package/dist/lib/utils/preview.d.ts.map +1 -1
  329. package/dist/lib/utils/preview.js +7 -2
  330. package/dist/lib/utils/preview.js.map +1 -1
  331. package/dist/lib/utils/string-case.d.ts +21 -0
  332. package/dist/lib/utils/string-case.d.ts.map +1 -0
  333. package/dist/lib/utils/string-case.js +26 -0
  334. package/dist/lib/utils/string-case.js.map +1 -0
  335. package/dist/lib/vite/index.d.ts +7 -0
  336. package/dist/lib/vite/index.d.ts.map +1 -1
  337. package/dist/lib/vite/index.js +37 -6
  338. package/dist/lib/vite/index.js.map +1 -1
  339. package/dist/local-api/collection-api.d.ts.map +1 -1
  340. package/dist/local-api/collection-api.js +4 -2
  341. package/dist/local-api/types.d.ts +8 -0
  342. package/dist/local-api/types.d.ts.map +1 -1
  343. package/dist/mcp/tools.d.ts.map +1 -1
  344. package/dist/mcp/tools.js +110 -1
  345. package/dist/permissions-context.svelte.d.ts +7 -4
  346. package/dist/permissions-context.svelte.d.ts.map +1 -1
  347. package/dist/plugins/index.d.ts +3 -0
  348. package/dist/plugins/index.d.ts.map +1 -0
  349. package/dist/plugins/index.js +2 -0
  350. package/dist/plugins/resolver.d.ts +49 -0
  351. package/dist/plugins/resolver.d.ts.map +1 -0
  352. package/dist/plugins/resolver.js +65 -0
  353. package/dist/plugins/types.d.ts +233 -0
  354. package/dist/plugins/types.d.ts.map +1 -0
  355. package/dist/plugins/types.js +8 -0
  356. package/dist/schema-utils/desugar.d.ts +27 -0
  357. package/dist/schema-utils/desugar.d.ts.map +1 -0
  358. package/dist/schema-utils/desugar.js +101 -0
  359. package/dist/schema-utils/index.d.ts +2 -0
  360. package/dist/schema-utils/index.d.ts.map +1 -1
  361. package/dist/schema-utils/index.js +2 -0
  362. package/dist/schema-utils/settings.d.ts +17 -0
  363. package/dist/schema-utils/settings.d.ts.map +1 -0
  364. package/dist/schema-utils/settings.js +22 -0
  365. package/dist/schema-utils/validator.d.ts.map +1 -1
  366. package/dist/schema-utils/validator.js +11 -0
  367. package/dist/security/secret-crypto.d.ts +18 -0
  368. package/dist/security/secret-crypto.d.ts.map +1 -0
  369. package/dist/security/secret-crypto.js +70 -0
  370. package/dist/server/api/index.d.ts.map +1 -1
  371. package/dist/server/api/index.js +3 -0
  372. package/dist/server/api/routes/assets.d.ts.map +1 -1
  373. package/dist/server/api/routes/assets.js +8 -2
  374. package/dist/server/api/routes/organizations.d.ts.map +1 -1
  375. package/dist/server/api/routes/organizations.js +4 -1
  376. package/dist/server/api/routes/plugin-settings.d.ts +4 -0
  377. package/dist/server/api/routes/plugin-settings.d.ts.map +1 -0
  378. package/dist/server/api/routes/plugin-settings.js +108 -0
  379. package/dist/server/api/routes/roles.d.ts.map +1 -1
  380. package/dist/server/api/routes/roles.js +37 -0
  381. package/dist/server/api/routes/user.d.ts.map +1 -1
  382. package/dist/server/api/routes/user.js +14 -3
  383. package/dist/services/asset-service.d.ts +1 -0
  384. package/dist/services/asset-service.d.ts.map +1 -1
  385. package/dist/services/index.d.ts +2 -0
  386. package/dist/services/index.d.ts.map +1 -1
  387. package/dist/services/index.js +1 -0
  388. package/dist/services/plugin-settings-service.d.ts +76 -0
  389. package/dist/services/plugin-settings-service.d.ts.map +1 -0
  390. package/dist/services/plugin-settings-service.js +235 -0
  391. package/dist/services/roles-service.d.ts +2 -2
  392. package/dist/services/roles-service.d.ts.map +1 -1
  393. package/dist/theme/css.d.ts +30 -0
  394. package/dist/theme/css.d.ts.map +1 -0
  395. package/dist/theme/css.js +53 -0
  396. package/dist/theme/derive.d.ts +27 -0
  397. package/dist/theme/derive.d.ts.map +1 -0
  398. package/dist/theme/derive.js +107 -0
  399. package/dist/theme/index.d.ts +5 -0
  400. package/dist/theme/index.d.ts.map +1 -0
  401. package/dist/theme/index.js +4 -0
  402. package/dist/theme/schemes.d.ts +60 -0
  403. package/dist/theme/schemes.d.ts.map +1 -0
  404. package/dist/theme/schemes.js +149 -0
  405. package/dist/theme/tokens.d.ts +57 -0
  406. package/dist/theme/tokens.d.ts.map +1 -0
  407. package/dist/theme/tokens.js +10 -0
  408. package/dist/types/auth.d.ts +10 -10
  409. package/dist/types/auth.d.ts.map +1 -1
  410. package/dist/types/capabilities.d.ts +50 -9
  411. package/dist/types/capabilities.d.ts.map +1 -1
  412. package/dist/types/capabilities.js +147 -5
  413. package/dist/types/config.d.ts +30 -1
  414. package/dist/types/config.d.ts.map +1 -1
  415. package/dist/types/schemas.d.ts +90 -2
  416. package/dist/types/schemas.d.ts.map +1 -1
  417. package/dist/types/sidebar.d.ts +3 -1
  418. package/dist/types/sidebar.d.ts.map +1 -1
  419. package/dist/utils/index.d.ts +1 -0
  420. package/dist/utils/index.d.ts.map +1 -1
  421. package/dist/utils/index.js +1 -0
  422. package/dist/utils/preview.d.ts +16 -5
  423. package/dist/utils/preview.d.ts.map +1 -1
  424. package/dist/utils/preview.js +7 -2
  425. package/dist/utils/string-case.d.ts +21 -0
  426. package/dist/utils/string-case.d.ts.map +1 -0
  427. package/dist/utils/string-case.js +25 -0
  428. package/dist/vite/index.d.ts +7 -0
  429. package/dist/vite/index.d.ts.map +1 -1
  430. package/dist/vite/index.js +37 -6
  431. package/package.json +6 -4
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Rich-text block preview registry (client-side context).
3
+ *
4
+ * By default a custom Portable Text block renders in the editor as a generic card
5
+ * (title/subtitle from its `preview` config). That's fine for data-ish blocks, but for
6
+ * visual ones — an embed, a gallery, a button — authors expect to see the real thing
7
+ * inline while writing (the Ghost/Sanity "what you see is what you get" editor).
8
+ *
9
+ * An app registers a preview per block `_type`; RichtextField resolves it and the
10
+ * ProseMirror node view mounts it INSTEAD of the generic card. The preview still gets
11
+ * `onEdit`/`onDelete` so the block stays editable and removable.
12
+ *
13
+ * Deliberately separate from the field-component registry: that one supplies *inputs*
14
+ * (`field`/`value`/`onUpdate`); this one supplies *renderers* (`data`/`onEdit`). Same
15
+ * idea, different contract.
16
+ */
17
+ import { type Component } from 'svelte';
18
+ import type { PreviewSource } from '../utils/preview.js';
19
+ /**
20
+ * The stable props a block preview component receives.
21
+ *
22
+ * Also the contract for core's own built-in views (the generic card and the image
23
+ * view), so all three are mountable by the node view through one type.
24
+ */
25
+ export interface BlockPreviewProps {
26
+ /** The block's `_type`. */
27
+ type: string;
28
+ /** The block's `_key` — its stable identity within the field's array. */
29
+ nodeKey: string;
30
+ /** The block's stored data (its fields). */
31
+ data: Record<string, unknown>;
32
+ /** The block type's schema, for reading its `preview` config if useful. */
33
+ schema?: PreviewSource;
34
+ /** True while the block is selected in the editor. */
35
+ selected?: boolean;
36
+ /** Open the block's edit modal — wire this to a click/edit affordance. */
37
+ onEdit: () => void;
38
+ /** Remove the block. */
39
+ onDelete: () => void;
40
+ }
41
+ export type BlockPreviewLookup = (type: string) => Component<BlockPreviewProps> | undefined;
42
+ /** Publish the block-preview lookup to descendants (call in the admin shell). */
43
+ export declare function setBlockPreviews(lookup: BlockPreviewLookup): void;
44
+ /** Resolve the lookup. Returns a no-op lookup outside the admin shell. */
45
+ export declare function useBlockPreviews(): BlockPreviewLookup;
46
+ //# sourceMappingURL=block-previews.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-previews.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/admin/block-previews.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IACjC,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC;AAI5F,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAEjE;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,IAAI,kBAAkB,CAErD"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Rich-text block preview registry (client-side context).
3
+ *
4
+ * By default a custom Portable Text block renders in the editor as a generic card
5
+ * (title/subtitle from its `preview` config). That's fine for data-ish blocks, but for
6
+ * visual ones — an embed, a gallery, a button — authors expect to see the real thing
7
+ * inline while writing (the Ghost/Sanity "what you see is what you get" editor).
8
+ *
9
+ * An app registers a preview per block `_type`; RichtextField resolves it and the
10
+ * ProseMirror node view mounts it INSTEAD of the generic card. The preview still gets
11
+ * `onEdit`/`onDelete` so the block stays editable and removable.
12
+ *
13
+ * Deliberately separate from the field-component registry: that one supplies *inputs*
14
+ * (`field`/`value`/`onUpdate`); this one supplies *renderers* (`data`/`onEdit`). Same
15
+ * idea, different contract.
16
+ */
17
+ import { getContext, setContext } from 'svelte';
18
+ const BLOCK_PREVIEWS_KEY = Symbol.for('aphex.admin.block-previews');
19
+ /** Publish the block-preview lookup to descendants (call in the admin shell). */
20
+ export function setBlockPreviews(lookup) {
21
+ setContext(BLOCK_PREVIEWS_KEY, lookup);
22
+ }
23
+ /** Resolve the lookup. Returns a no-op lookup outside the admin shell. */
24
+ export function useBlockPreviews() {
25
+ return getContext(BLOCK_PREVIEWS_KEY) ?? (() => undefined);
26
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Field-input widget registry (client-side context).
3
+ *
4
+ * Plugins contribute custom input widgets via `aphex/field/component` parts, keyed
5
+ * by an `input` string. A field opts into one with `{ …, input: 'color' }`.
6
+ * The admin shell publishes a lookup here; SchemaField (however deeply nested)
7
+ * resolves the widget and renders it in place of the built-in for that field type.
8
+ */
9
+ import { type Component } from 'svelte';
10
+ import type { FieldComponentProps } from '../plugins/types.js';
11
+ export type FieldComponentLookup = (input: string) => Component<FieldComponentProps> | undefined;
12
+ /** Publish the widget lookup to descendants (call in the admin shell). */
13
+ export declare function setFieldComponents(lookup: FieldComponentLookup): void;
14
+ /** Resolve the widget lookup. Returns a no-op lookup outside the admin shell. */
15
+ export declare function useFieldComponents(): FieldComponentLookup;
16
+ //# sourceMappingURL=field-components.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-components.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/admin/field-components.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC,mBAAmB,CAAC,GAAG,SAAS,CAAC;AAIjG,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAErE;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,IAAI,oBAAoB,CAEzD"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Field-input widget registry (client-side context).
3
+ *
4
+ * Plugins contribute custom input widgets via `aphex/field/component` parts, keyed
5
+ * by an `input` string. A field opts into one with `{ …, input: 'color' }`.
6
+ * The admin shell publishes a lookup here; SchemaField (however deeply nested)
7
+ * resolves the widget and renders it in place of the built-in for that field type.
8
+ */
9
+ import { getContext, setContext } from 'svelte';
10
+ const FIELD_COMPONENTS_KEY = Symbol.for('aphex.admin.field-components');
11
+ /** Publish the widget lookup to descendants (call in the admin shell). */
12
+ export function setFieldComponents(lookup) {
13
+ setContext(FIELD_COMPONENTS_KEY, lookup);
14
+ }
15
+ /** Resolve the widget lookup. Returns a no-op lookup outside the admin shell. */
16
+ export function useFieldComponents() {
17
+ return getContext(FIELD_COMPONENTS_KEY) ?? (() => undefined);
18
+ }
@@ -0,0 +1,34 @@
1
+ import type { AdminArea } from './types.js';
2
+ /** The known admin URL params. Central list so intents never typo a key. */
3
+ export type AdminParam = 'view' | 'docType' | 'docId' | 'action' | 'stack' | 'history' | 'focus' | 'orgId' | 'fromDocId' | 'fromDocType';
4
+ /** A set of param changes: a value sets the key, `null` clears it. */
5
+ export type ParamPatch = Partial<Record<AdminParam, string | null>>;
6
+ export interface AdminNav {
7
+ /** Apply a param patch and navigate. `replace` defaults to true. */
8
+ patch(changes: ParamPatch, opts?: {
9
+ replace?: boolean;
10
+ }): Promise<void>;
11
+ /** Switch the top-level area/tab. `structure` clears `?view`; others set it. */
12
+ openArea(area: AdminArea): Promise<void>;
13
+ /** Show a document type's list (structure area). */
14
+ openType(docType: string): Promise<void>;
15
+ /**
16
+ * Open a document in the editor (structure area). `docType` is optional — when
17
+ * omitted the existing `?docType` is preserved (the URL effect resolves it).
18
+ */
19
+ openDocument(docId: string, docType?: string, opts?: {
20
+ replace?: boolean;
21
+ }): Promise<void>;
22
+ /** Start creating a new document of a type. */
23
+ createDocument(docType: string): Promise<void>;
24
+ /** Close the current document, back to its type's list. */
25
+ closeToType(docType: string): Promise<void>;
26
+ /** Back to the dashboard (no type, no doc). */
27
+ goHome(): Promise<void>;
28
+ }
29
+ /** Create an admin nav and publish it to descendants (call once in the shell). */
30
+ export declare function setAdminNav(basePath?: string): AdminNav;
31
+ /** Read the admin nav. `undefined` outside the admin shell (safe to guard). */
32
+ export declare function useAdminNav(): AdminNav | undefined;
33
+ export declare function createAdminNav(basePath?: string): AdminNav;
34
+ //# sourceMappingURL=nav.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/admin/nav.svelte.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,4EAA4E;AAC5E,MAAM,MAAM,UAAU,GACnB,MAAM,GACN,SAAS,GACT,OAAO,GACP,QAAQ,GACR,OAAO,GACP,SAAS,GACT,OAAO,GACP,OAAO,GACP,WAAW,GACX,aAAa,CAAC;AAEjB,sEAAsE;AACtE,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;AAEpE,MAAM,WAAW,QAAQ;IACxB,oEAAoE;IACpE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExE,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,+CAA+C;IAC/C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,2DAA2D;IAC3D,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,+CAA+C;IAC/C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAID,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,QAAQ,SAAW,GAAG,QAAQ,CAIzD;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,IAAI,QAAQ,GAAG,SAAS,CAElD;AAED,wBAAgB,cAAc,CAAC,QAAQ,SAAW,GAAG,QAAQ,CAgE5D"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Admin URL navigation — the single place that knows the admin's query-param
3
+ * vocabulary and how each navigation intent maps onto it.
4
+ *
5
+ * The admin encodes its whole view state in the URL (`?view`, `?docType`, `?docId`,
6
+ * `?action`, `?stack`, …) and a URL-watching effect derives component state from it.
7
+ * That's good (shareable, back-button-friendly) but the writes were scattered as
8
+ * ad-hoc `SvelteURLSearchParams` + `goto` blocks, each hand-clearing the params it
9
+ * happened to remember — which is how "opening a doc left a stale ?view" slipped in.
10
+ *
11
+ * This module replaces those with named intents. Each intent declares the FULL set
12
+ * of params it touches (setting some, clearing others), so no caller has to
13
+ * remember the interactions. `patch()` remains for the rare bespoke case.
14
+ */
15
+ import { getContext, setContext } from 'svelte';
16
+ import { goto } from '$app/navigation';
17
+ import { page } from '$app/state';
18
+ import { SvelteURLSearchParams } from 'svelte/reactivity';
19
+ const ADMIN_NAV_KEY = Symbol.for('aphex.admin.nav');
20
+ /** Create an admin nav and publish it to descendants (call once in the shell). */
21
+ export function setAdminNav(basePath = '/admin') {
22
+ const nav = createAdminNav(basePath);
23
+ setContext(ADMIN_NAV_KEY, nav);
24
+ return nav;
25
+ }
26
+ /** Read the admin nav. `undefined` outside the admin shell (safe to guard). */
27
+ export function useAdminNav() {
28
+ return getContext(ADMIN_NAV_KEY);
29
+ }
30
+ export function createAdminNav(basePath = '/admin') {
31
+ async function patch(changes, { replace = true } = {}) {
32
+ const params = new SvelteURLSearchParams(page.url.searchParams);
33
+ for (const [key, value] of Object.entries(changes)) {
34
+ if (value == null)
35
+ params.delete(key);
36
+ else
37
+ params.set(key, value);
38
+ }
39
+ const query = params.toString();
40
+ await goto(`${basePath}${query ? `?${query}` : ''}`, {
41
+ replaceState: replace,
42
+ keepFocus: true
43
+ });
44
+ }
45
+ return {
46
+ patch,
47
+ openArea: (area) =>
48
+ // A plugin/other area is addressable via ?view; structure is the default (no ?view).
49
+ // Leaving an area always drops any open document.
50
+ patch({
51
+ view: area === 'structure' ? null : area,
52
+ docId: null,
53
+ docType: null,
54
+ stack: null,
55
+ action: null
56
+ }),
57
+ openType: (docType) => patch({ docType, docId: null, action: null, stack: null, history: null, view: null }, { replace: false }),
58
+ openDocument: (docId, docType, opts) => patch({
59
+ docId,
60
+ ...(docType ? { docType } : {}),
61
+ action: null,
62
+ fromDocId: null,
63
+ fromDocType: null,
64
+ view: null
65
+ }, { replace: opts?.replace ?? false }),
66
+ createDocument: (docType) => patch({ docType, action: 'create', docId: null, stack: null, view: null }, { replace: false }),
67
+ closeToType: (docType) => patch({ docType, docId: null, action: null, stack: null, focus: null, history: null, view: null }, { replace: false }),
68
+ goHome: () => patch({
69
+ view: null,
70
+ docType: null,
71
+ docId: null,
72
+ action: null,
73
+ stack: null,
74
+ focus: null,
75
+ history: null
76
+ })
77
+ };
78
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Admin slot registry — the extension-point primitive for the admin shell.
3
+ *
4
+ * Named regions ("slots") in the admin chrome that any component can render UI
5
+ * into at runtime, without the shell knowing who the contributor is and without
6
+ * anyone patching AdminApp/Sidebar directly. This is the client-side half of the
7
+ * plugin system's "extension slots" (see references/PLUGIN_SYSTEM_PLAN.md §4):
8
+ * registration happens in the browser via context + snippets, never through
9
+ * SvelteKit `load` (load data must stay serializable — components can't cross it).
10
+ *
11
+ * Today's first consumer is the document editor, which registers its toolbar into
12
+ * the `navbar-start` / `navbar-end` slots so its controls live in the single top
13
+ * bar. Tomorrow, plugin document-actions and admin tools register the same way.
14
+ *
15
+ * Usage:
16
+ * // shell (once, high in the tree)
17
+ * const slots = setAdminSlots();
18
+ * // outlet
19
+ * {#each slots.get('navbar-end') as entry (entry.id)}{@render entry.snippet()}{/each}
20
+ * // contributor (auto-cleans up)
21
+ * const slots = useAdminSlots();
22
+ * $effect(() => slots?.register('navbar-end', { id: 'editor', snippet: bar }));
23
+ */
24
+ import { type Snippet } from 'svelte';
25
+ /** Well-known slot names. Plain strings are allowed too (e.g. plugin-defined). */
26
+ export type AdminSlotName = 'navbar-start' | 'navbar-end' | 'document-actions' | 'admin-tabs' | (string & {});
27
+ export interface AdminSlotEntry {
28
+ /** Stable id — re-registering with the same id replaces the prior entry. */
29
+ id: string;
30
+ snippet: Snippet;
31
+ /** Ascending sort within the slot. Defaults to 0. */
32
+ order?: number;
33
+ }
34
+ export declare class AdminSlots {
35
+ #private;
36
+ /**
37
+ * Register a snippet into a slot. Returns an unregister function — call it on
38
+ * cleanup (returning it from an `$effect` does this automatically).
39
+ */
40
+ register(name: AdminSlotName, entry: AdminSlotEntry): () => void;
41
+ /** Entries registered in a slot, in sort order. Empty array if none. */
42
+ get(name: AdminSlotName): AdminSlotEntry[];
43
+ /** Whether a slot has any entries — handy for conditional chrome. */
44
+ has(name: AdminSlotName): boolean;
45
+ }
46
+ /** Create a registry and publish it to descendants. Call once in the admin shell. */
47
+ export declare function setAdminSlots(): AdminSlots;
48
+ /** Read the registry. Returns `undefined` outside an admin shell (safe to guard). */
49
+ export declare function useAdminSlots(): AdminSlots | undefined;
50
+ //# sourceMappingURL=slots.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slots.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/admin/slots.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAmC,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGvE,kFAAkF;AAClF,MAAM,MAAM,aAAa,GACtB,cAAc,GACd,YAAY,GACZ,kBAAkB,GAClB,YAAY,GACZ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAEjB,MAAM,WAAW,cAAc;IAC9B,4EAA4E;IAC5E,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,UAAU;;IAItB;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM,IAAI;IAgBhE,wEAAwE;IACxE,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,EAAE;IAI1C,qEAAqE;IACrE,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;CAGjC;AAID,qFAAqF;AACrF,wBAAgB,aAAa,IAAI,UAAU,CAI1C;AAED,qFAAqF;AACrF,wBAAgB,aAAa,IAAI,UAAU,GAAG,SAAS,CAEtD"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Admin slot registry — the extension-point primitive for the admin shell.
3
+ *
4
+ * Named regions ("slots") in the admin chrome that any component can render UI
5
+ * into at runtime, without the shell knowing who the contributor is and without
6
+ * anyone patching AdminApp/Sidebar directly. This is the client-side half of the
7
+ * plugin system's "extension slots" (see references/PLUGIN_SYSTEM_PLAN.md §4):
8
+ * registration happens in the browser via context + snippets, never through
9
+ * SvelteKit `load` (load data must stay serializable — components can't cross it).
10
+ *
11
+ * Today's first consumer is the document editor, which registers its toolbar into
12
+ * the `navbar-start` / `navbar-end` slots so its controls live in the single top
13
+ * bar. Tomorrow, plugin document-actions and admin tools register the same way.
14
+ *
15
+ * Usage:
16
+ * // shell (once, high in the tree)
17
+ * const slots = setAdminSlots();
18
+ * // outlet
19
+ * {#each slots.get('navbar-end') as entry (entry.id)}{@render entry.snippet()}{/each}
20
+ * // contributor (auto-cleans up)
21
+ * const slots = useAdminSlots();
22
+ * $effect(() => slots?.register('navbar-end', { id: 'editor', snippet: bar }));
23
+ */
24
+ import { getContext, setContext, untrack } from 'svelte';
25
+ import { SvelteMap } from 'svelte/reactivity';
26
+ export class AdminSlots {
27
+ // Reactive so outlets re-render as entries come and go.
28
+ #slots = new SvelteMap();
29
+ /**
30
+ * Register a snippet into a slot. Returns an unregister function — call it on
31
+ * cleanup (returning it from an `$effect` does this automatically).
32
+ */
33
+ register(name, entry) {
34
+ const current = untrack(() => this.#slots.get(name) ?? []);
35
+ const next = [...current.filter((e) => e.id !== entry.id), entry].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
36
+ this.#slots.set(name, next);
37
+ return () => {
38
+ const list = untrack(() => this.#slots.get(name));
39
+ if (!list)
40
+ return;
41
+ const filtered = list.filter((e) => e.id !== entry.id);
42
+ if (filtered.length > 0)
43
+ this.#slots.set(name, filtered);
44
+ else
45
+ this.#slots.delete(name);
46
+ };
47
+ }
48
+ /** Entries registered in a slot, in sort order. Empty array if none. */
49
+ get(name) {
50
+ return this.#slots.get(name) ?? [];
51
+ }
52
+ /** Whether a slot has any entries — handy for conditional chrome. */
53
+ has(name) {
54
+ return this.get(name).length > 0;
55
+ }
56
+ }
57
+ const ADMIN_SLOTS_KEY = Symbol.for('aphex.admin.slots');
58
+ /** Create a registry and publish it to descendants. Call once in the admin shell. */
59
+ export function setAdminSlots() {
60
+ const slots = new AdminSlots();
61
+ setContext(ADMIN_SLOTS_KEY, slots);
62
+ return slots;
63
+ }
64
+ /** Read the registry. Returns `undefined` outside an admin shell (safe to guard). */
65
+ export function useAdminSlots() {
66
+ return getContext(ADMIN_SLOTS_KEY);
67
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The active admin area (tab). Built-in tools are named literals; plugin admin
3
+ * tools are addressed as `plugin:<tool-id>`, so the tab system is open-ended
4
+ * without the shell hardcoding plugin knowledge.
5
+ */
6
+ export type AdminArea = 'structure' | 'vision' | 'media' | `plugin:${string}`;
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/admin/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,MAAM,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -1,59 +1,26 @@
1
1
  import { z } from 'zod';
2
- import { type Capability } from '../../types/capabilities.js';
3
2
  export declare const apiKeyPermissionSchema: z.ZodEnum<{
4
3
  read: "read";
5
4
  write: "write";
6
5
  }>;
7
- export declare const apiKeyCapabilitySchema: z.ZodEnum<{
8
- "document.read": "document.read";
9
- "document.create": "document.create";
10
- "document.update": "document.update";
11
- "document.delete": "document.delete";
12
- "document.publish": "document.publish";
13
- "document.unpublish": "document.unpublish";
14
- "asset.read": "asset.read";
15
- "asset.upload": "asset.upload";
16
- "asset.delete": "asset.delete";
17
- "member.invite": "member.invite";
18
- "member.remove": "member.remove";
19
- "member.changeRole": "member.changeRole";
20
- "apiKey.manage": "apiKey.manage";
21
- "role.manage": "role.manage";
22
- "org.settings": "org.settings";
23
- }>;
6
+ export declare const apiKeyCapabilitySchema: z.ZodString;
24
7
  export declare const createApiKeyRequest: z.ZodPipe<z.ZodObject<{
25
8
  name: z.ZodString;
26
9
  permissions: z.ZodOptional<z.ZodArray<z.ZodEnum<{
27
10
  read: "read";
28
11
  write: "write";
29
12
  }>>>;
30
- capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<{
31
- "document.read": "document.read";
32
- "document.create": "document.create";
33
- "document.update": "document.update";
34
- "document.delete": "document.delete";
35
- "document.publish": "document.publish";
36
- "document.unpublish": "document.unpublish";
37
- "asset.read": "asset.read";
38
- "asset.upload": "asset.upload";
39
- "asset.delete": "asset.delete";
40
- "member.invite": "member.invite";
41
- "member.remove": "member.remove";
42
- "member.changeRole": "member.changeRole";
43
- "apiKey.manage": "apiKey.manage";
44
- "role.manage": "role.manage";
45
- "org.settings": "org.settings";
46
- }>>>;
13
+ capabilities: z.ZodOptional<z.ZodArray<z.ZodString>>;
47
14
  expiresInDays: z.ZodOptional<z.ZodNumber>;
48
15
  }, z.core.$strip>, z.ZodTransform<{
49
16
  permissions: ("read" | "write")[] | undefined;
50
- capabilities: Capability[] | undefined;
17
+ capabilities: string[] | undefined;
51
18
  name: string;
52
19
  expiresInDays?: number | undefined;
53
20
  }, {
54
21
  name: string;
55
22
  permissions?: ("read" | "write")[] | undefined;
56
- capabilities?: ("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")[] | undefined;
23
+ capabilities?: string[] | undefined;
57
24
  expiresInDays?: number | undefined;
58
25
  }>>;
59
26
  export type ApiKeyPermission = z.infer<typeof apiKeyPermissionSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../../src/lib/api/schemas/api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAA2C,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAIpG,eAAO,MAAM,sBAAsB;;;EAA4B,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;EAElC,CAAC;AASF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoB5B,CAAC;AAIL,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
1
+ {"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../../src/lib/api/schemas/api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,sBAAsB;;;EAA4B,CAAC;AAIhE,eAAO,MAAM,sBAAsB,aAAmB,CAAC;AASvD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;GAoB5B,CAAC;AAIL,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -1,8 +1,11 @@
1
1
  import { z } from 'zod';
2
- import { ALL_CAPABILITIES, normalizeCapabilities } from '../../types/capabilities.js';
2
+ import { normalizeCapabilities } from '../../types/capabilities.js';
3
+ import { capabilitySchema } from './roles.js';
3
4
  // ---------- Shared ----------
4
5
  export const apiKeyPermissionSchema = z.enum(['read', 'write']);
5
- export const apiKeyCapabilitySchema = z.enum(ALL_CAPABILITIES);
6
+ // Same capability-id format guard as roles; the authoritative validity check
7
+ // (against the runtime registry) happens in the route handler.
8
+ export const apiKeyCapabilitySchema = capabilitySchema;
6
9
  // ---------- POST /settings/api-keys ----------
7
10
  // Two provisioning modes:
8
11
  // 1. Coarse `permissions`: 'read' alone, or 'write' (always implies read).
@@ -34,6 +34,10 @@ export declare const listAssetsQuery: z.ZodObject<{
34
34
  }>>;
35
35
  mimeType: z.ZodOptional<z.ZodString>;
36
36
  search: z.ZodOptional<z.ZodString>;
37
+ includeSystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodEnum<{
38
+ true: "true";
39
+ false: "false";
40
+ }>, z.ZodTransform<boolean, "true" | "false">>]>>;
37
41
  limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
38
42
  offset: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
39
43
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/lib/api/schemas/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;iBAuBT,CAAC;AAEhB,eAAO,MAAM,oBAAoB;;;;;iBAK/B,CAAC;AAIH,eAAO,MAAM,eAAe;;;;;;;;;iBAM1B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAW7B,CAAC;AAIH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;iBAG3B,CAAC;AAIH,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;iBAG9B,CAAC;AAIH,eAAO,MAAM,mBAAmB;;iBAE9B,CAAC;AAIH,eAAO,MAAM,uBAAuB;;iBAElC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;iBAMnC,CAAC;AAIH,eAAO,MAAM,0BAA0B;;;;;;;;;;;iBAMrC,CAAC;AAIH,eAAO,MAAM,2BAA2B;;iBAEtC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;iBAGvC,CAAC;AAIH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AACnD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACpE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC9E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEpF,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AACtF,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC"}
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/lib/api/schemas/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;iBAuBT,CAAC;AAEhB,eAAO,MAAM,oBAAoB;;;;;iBAK/B,CAAC;AAIH,eAAO,MAAM,eAAe;;;;;;;;;;;;;iBAS1B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAW7B,CAAC;AAIH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;iBAG3B,CAAC;AAIH,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;iBAG9B,CAAC;AAIH,eAAO,MAAM,mBAAmB;;iBAE9B,CAAC;AAIH,eAAO,MAAM,uBAAuB;;iBAElC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;iBAMnC,CAAC;AAIH,eAAO,MAAM,0BAA0B;;;;;;;;;;;iBAMrC,CAAC;AAIH,eAAO,MAAM,2BAA2B;;iBAEtC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;iBAGvC,CAAC;AAIH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AACnD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACpE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC9E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEpF,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AACtF,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC"}
@@ -35,6 +35,9 @@ export const listAssetsQuery = z.object({
35
35
  assetType: z.enum(['image', 'file']).optional(),
36
36
  mimeType: z.string().optional(),
37
37
  search: z.string().optional(),
38
+ includeSystem: z
39
+ .union([z.boolean(), z.enum(['true', 'false']).transform((value) => value === 'true')])
40
+ .optional(),
38
41
  limit: z.coerce.number().int().min(1).max(500).optional(),
39
42
  offset: z.coerce.number().int().min(0).optional()
40
43
  });
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod';
2
+ export declare const savePluginSettingsRequest: z.ZodObject<{
3
+ values: z.ZodRecord<z.ZodString, z.ZodUnknown>;
4
+ }, z.core.$strip>;
5
+ export type SavePluginSettingsRequest = z.infer<typeof savePluginSettingsRequest>;
6
+ //# sourceMappingURL=plugin-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-settings.d.ts","sourceRoot":"","sources":["../../../src/lib/api/schemas/plugin-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,yBAAyB;;iBAEpC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ // Save a plugin's settings — a partial patch of field-name → value. Values are
3
+ // deliberately loose (`unknown`): the field types are plugin-declared, so the
4
+ // authoritative shape check is the declaration, enforced in the service (which
5
+ // whitelists to declared field names). This guard only ensures a well-formed body.
6
+ export const savePluginSettingsRequest = z.object({
7
+ values: z.record(z.string(), z.unknown())
8
+ });
@@ -1,76 +1,27 @@
1
1
  import { z } from 'zod';
2
- import { type Capability } from '../../types/capabilities.js';
3
- export declare const capabilitySchema: z.ZodEnum<{
4
- "document.read": "document.read";
5
- "document.create": "document.create";
6
- "document.update": "document.update";
7
- "document.delete": "document.delete";
8
- "document.publish": "document.publish";
9
- "document.unpublish": "document.unpublish";
10
- "asset.read": "asset.read";
11
- "asset.upload": "asset.upload";
12
- "asset.delete": "asset.delete";
13
- "member.invite": "member.invite";
14
- "member.remove": "member.remove";
15
- "member.changeRole": "member.changeRole";
16
- "apiKey.manage": "apiKey.manage";
17
- "role.manage": "role.manage";
18
- "org.settings": "org.settings";
19
- }>;
2
+ export declare const capabilitySchema: z.ZodString;
20
3
  export declare const createRoleRequest: z.ZodPipe<z.ZodObject<{
21
4
  name: z.ZodString;
22
5
  description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
23
- capabilities: z.ZodDefault<z.ZodArray<z.ZodEnum<{
24
- "document.read": "document.read";
25
- "document.create": "document.create";
26
- "document.update": "document.update";
27
- "document.delete": "document.delete";
28
- "document.publish": "document.publish";
29
- "document.unpublish": "document.unpublish";
30
- "asset.read": "asset.read";
31
- "asset.upload": "asset.upload";
32
- "asset.delete": "asset.delete";
33
- "member.invite": "member.invite";
34
- "member.remove": "member.remove";
35
- "member.changeRole": "member.changeRole";
36
- "apiKey.manage": "apiKey.manage";
37
- "role.manage": "role.manage";
38
- "org.settings": "org.settings";
39
- }>>>;
6
+ capabilities: z.ZodDefault<z.ZodArray<z.ZodString>>;
40
7
  }, z.core.$strip>, z.ZodTransform<{
41
- capabilities: Capability[];
8
+ capabilities: string[];
42
9
  name: string;
43
10
  description?: string | null | undefined;
44
11
  }, {
45
12
  name: string;
46
- capabilities: ("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")[];
13
+ capabilities: string[];
47
14
  description?: string | null | undefined;
48
15
  }>>;
49
16
  export declare const updateRoleRequest: z.ZodPipe<z.ZodObject<{
50
17
  description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
51
- capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<{
52
- "document.read": "document.read";
53
- "document.create": "document.create";
54
- "document.update": "document.update";
55
- "document.delete": "document.delete";
56
- "document.publish": "document.publish";
57
- "document.unpublish": "document.unpublish";
58
- "asset.read": "asset.read";
59
- "asset.upload": "asset.upload";
60
- "asset.delete": "asset.delete";
61
- "member.invite": "member.invite";
62
- "member.remove": "member.remove";
63
- "member.changeRole": "member.changeRole";
64
- "apiKey.manage": "apiKey.manage";
65
- "role.manage": "role.manage";
66
- "org.settings": "org.settings";
67
- }>>>;
18
+ capabilities: z.ZodOptional<z.ZodArray<z.ZodString>>;
68
19
  }, z.core.$strip>, z.ZodTransform<{
69
- capabilities: Capability[] | undefined;
20
+ capabilities: string[] | undefined;
70
21
  description?: string | null | undefined;
71
22
  }, {
72
23
  description?: string | null | undefined;
73
- capabilities?: ("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")[] | undefined;
24
+ capabilities?: string[] | undefined;
74
25
  }>>;
75
26
  export type CreateRoleRequest = z.infer<typeof createRoleRequest>;
76
27
  export type UpdateRoleRequest = z.infer<typeof updateRoleRequest>;
@@ -1 +1 @@
1
- {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../src/lib/api/schemas/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAA2C,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAMpG,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;EAE5B,CAAC;AAmBF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAMqD,CAAC;AAIpF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;GAW1B,CAAC;AAIL,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAClE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../src/lib/api/schemas/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,gBAAgB,aAI4D,CAAC;AAmB1F,eAAO,MAAM,iBAAiB;;;;;;;;;;;;GAMqD,CAAC;AAIpF,eAAO,MAAM,iBAAiB;;;;;;;;;GAW1B,CAAC;AAIL,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAClE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -1,10 +1,15 @@
1
1
  import { z } from 'zod';
2
- import { ALL_CAPABILITIES, normalizeCapabilities } from '../../types/capabilities.js';
3
- // Runtime enum of every known capability. Unknown strings are rejected so a
4
- // typo in a client request can't silently grant or strip permissions.
5
- // The cast preserves the literal Capability union in the inferred type — Zod
6
- // can't see the compile-time widening of the readonly array on its own.
7
- export const capabilitySchema = z.enum(ALL_CAPABILITIES);
2
+ import { normalizeCapabilities } from '../../types/capabilities.js';
3
+ // Capability id: a shape/format guard only dotted or colon segments, e.g.
4
+ // `document.publish` or `forms.export`. It deliberately does NOT enumerate the
5
+ // valid set, because plugin-declared capabilities aren't known at module-eval time.
6
+ // The route handler does the authoritative check against the runtime registry
7
+ // (`partResolver.capabilityCatalog()`), rejecting ids that don't actually exist.
8
+ export const capabilitySchema = z
9
+ .string()
10
+ .min(1)
11
+ .max(100)
12
+ .regex(/^[a-zA-Z0-9]+([.:][a-zA-Z0-9]+)+$/, { message: 'Invalid capability id format' });
8
13
  // Role name: human-readable identifier stored on member rows and referenced
9
14
  // in the API as /api/roles/[name]. Spaces are allowed (URL-encoded client
10
15
  // side); control characters and slashes are not, to keep routing unambiguous.