emdash 0.29.0 → 0.31.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.
- package/dist/{adapters-DPAkL6QF.d.mts → adapters-C0ONzkUP.d.mts} +10 -1
- package/dist/adapters-C0ONzkUP.d.mts.map +1 -0
- package/dist/{allowed-origins-FXB-FplB.mjs → allowed-origins-CCEi9bPI.mjs} +2 -2
- package/dist/{allowed-origins-FXB-FplB.mjs.map → allowed-origins-CCEi9bPI.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.d.mts.map +1 -1
- package/dist/api/route-utils.mjs +19 -19
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -4
- package/dist/{api-DVbHNApo.mjs → api-EibxGP-V.mjs} +260 -160
- package/dist/api-EibxGP-V.mjs.map +1 -0
- package/dist/api-tokens-Cvmixds7.mjs +3 -0
- package/dist/{api-tokens-UYBkl17d.mjs → api-tokens-uPt8UDpx.mjs} +2 -2
- package/dist/{api-tokens-UYBkl17d.mjs.map → api-tokens-uPt8UDpx.mjs.map} +1 -1
- package/dist/{apply-D23iUV4q.mjs → apply-fGHCAwWN.mjs} +42 -44
- package/dist/apply-fGHCAwWN.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -13
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +90 -11
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -11
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +56 -107
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/redirect.mjs +7 -7
- package/dist/astro/middleware/request-context.mjs +4 -4
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +47 -3
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +410 -123
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/PluginRegistry.d.mts +5 -1
- package/dist/astro/routes/PluginRegistry.d.mts.map +1 -1
- package/dist/astro/routes/PluginRegistry.mjs +2 -1
- package/dist/astro/routes/PluginRegistry.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +9 -8
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +9 -8
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
- package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +5 -5
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +10 -9
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +10 -9
- package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +10 -9
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +16 -15
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -22
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +20 -18
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +13 -12
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -10
- package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/index.mjs +11 -10
- package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +5 -5
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +4 -4
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +12 -10
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +41 -40
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +41 -40
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +46 -40
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +39 -0
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/_id_/settings.d.mts +9 -0
- package/dist/astro/routes/api/admin/plugins/_id_/settings.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +78 -0
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +40 -39
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +43 -40
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +46 -40
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +40 -39
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +46 -41
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +40 -39
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +40 -39
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +44 -41
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +40 -39
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +45 -42
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +41 -40
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +40 -39
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +4 -4
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +40 -39
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +9 -8
- package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +5 -5
- package/dist/astro/routes/api/admin/users/index.mjs +9 -8
- package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/dev-bypass.mjs +7 -7
- package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/complete.mjs +13 -12
- package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/index.mjs +10 -9
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +12 -11
- package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/logout.mjs +4 -4
- package/dist/astro/routes/api/auth/magic-link/send.mjs +12 -11
- package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +5 -5
- package/dist/astro/routes/api/auth/me.mjs +9 -8
- package/dist/astro/routes/api/auth/me.mjs.map +1 -1
- package/dist/astro/routes/api/auth/mode.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/mode.mjs +6 -3
- package/dist/astro/routes/api/auth/mode.mjs.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +15 -5
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +11 -5
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +8 -7
- package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
- package/dist/astro/routes/api/auth/passkey/options.mjs +13 -12
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -10
- package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -11
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -11
- package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.mjs +13 -12
- package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/request.mjs +12 -11
- package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +14 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +13 -12
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +5 -4
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -5
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +14 -13
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +10 -8
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +20 -19
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -4
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +10 -8
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +19 -18
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +5 -4
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -9
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/authors.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/index.mjs +12 -10
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +10 -9
- package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
- package/dist/astro/routes/api/dashboard.mjs +8 -8
- package/dist/astro/routes/api/dev/emails.mjs +4 -4
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +17 -16
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +4 -4
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -12
- package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/execute.mjs +13 -13
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -11
- package/dist/astro/routes/api/import/wordpress/media.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.mjs +11 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +11 -10
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -12
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +11 -10
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +17 -16
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -12
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +24 -23
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +7 -8
- package/dist/astro/routes/api/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/mcp.d.mts.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +149 -45
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +9 -8
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/usage.d.mts +8 -0
- package/dist/astro/routes/api/media/_id_/usage.d.mts.map +1 -0
- package/dist/astro/routes/api/media/_id_/usage.mjs +37 -0
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -0
- package/dist/astro/routes/api/media/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +26 -10
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +4 -3
- package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -4
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -4
- package/dist/astro/routes/api/media/providers/index.mjs +4 -4
- package/dist/astro/routes/api/media/upload-url.mjs +10 -9
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.d.mts.map +1 -1
- package/dist/astro/routes/api/media.mjs +31 -11
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +10 -9
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +10 -9
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +10 -9
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +10 -9
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +10 -9
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +10 -9
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.d.mts.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.mjs +29 -16
- package/dist/astro/routes/api/oauth/authorize.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -7
- package/dist/astro/routes/api/oauth/device/code.mjs +10 -10
- package/dist/astro/routes/api/oauth/device/token.mjs +9 -9
- package/dist/astro/routes/api/oauth/register.mjs +4 -4
- package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -7
- package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -7
- package/dist/astro/routes/api/oauth/token.mjs +7 -7
- package/dist/astro/routes/api/openapi.json.mjs +52 -24
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +20 -32
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/index.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +13 -12
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +13 -12
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +16 -15
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +11 -11
- package/dist/astro/routes/api/relations/index.mjs +16 -15
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +40 -39
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +40 -39
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +40 -39
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +40 -39
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +40 -39
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +9 -9
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +40 -39
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +40 -39
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +13 -12
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +12 -11
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +13 -12
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +8 -8
- package/dist/astro/routes/api/search/suggest.mjs +12 -11
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +12 -11
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +12 -11
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.d.mts +9 -0
- package/dist/astro/routes/api/settings/backups/archives/_name_.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +48 -0
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs.map +1 -0
- package/dist/astro/routes/api/settings/backups/archives/index.d.mts +8 -0
- package/dist/astro/routes/api/settings/backups/archives/index.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +23 -0
- package/dist/astro/routes/api/settings/backups/archives/index.mjs.map +1 -0
- package/dist/astro/routes/api/settings/backups/export.d.mts +8 -0
- package/dist/astro/routes/api/settings/backups/export.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/backups/export.mjs +35 -0
- package/dist/astro/routes/api/settings/backups/export.mjs.map +1 -0
- package/dist/astro/routes/api/settings/backups/index.d.mts +9 -0
- package/dist/astro/routes/api/settings/backups/index.d.mts.map +1 -0
- package/dist/astro/routes/api/settings/backups/index.mjs +52 -0
- package/dist/astro/routes/api/settings/backups/index.mjs.map +1 -0
- package/dist/astro/routes/api/settings/email.mjs +5 -5
- package/dist/astro/routes/api/settings.mjs +14 -13
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +19 -15
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +18 -14
- package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +26 -26
- package/dist/astro/routes/api/setup/dev-reset.mjs +3 -3
- package/dist/astro/routes/api/setup/index.mjs +28 -27
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +5 -5
- package/dist/astro/routes/api/snapshot.mjs +8 -215
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +15 -14
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +15 -14
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +15 -14
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +15 -14
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +6 -6
- package/dist/astro/routes/api/typegen.mjs +6 -6
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.d.mts.map +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +4 -3
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs.map +1 -1
- package/dist/astro/routes/api/well-known/oauth-protected-resource.d.mts.map +1 -1
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +4 -3
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +9 -8
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +12 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +12 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -7
- package/dist/astro/routes/api/widget-areas/index.mjs +12 -11
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +4 -4
- package/dist/astro/routes/robots.txt.mjs +7 -7
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +11 -11
- package/dist/astro/routes/sitemap.xml.mjs +8 -8
- package/dist/astro/types.d.mts +38 -17
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{authorize-BmCwQCib.mjs → authorize-6WPZa1xZ.mjs} +7 -4
- package/dist/authorize-6WPZa1xZ.mjs.map +1 -0
- package/dist/backup-Qr9PaGUo.mjs +241 -0
- package/dist/backup-Qr9PaGUo.mjs.map +1 -0
- package/dist/{base64-C74Msx8h.mjs → base64-B-PsqheR.mjs} +8 -4
- package/dist/base64-B-PsqheR.mjs.map +1 -0
- package/dist/{byline-BWb5H-65.mjs → byline-BTOxUlFF.mjs} +6 -6
- package/dist/{byline-BWb5H-65.mjs.map → byline-BTOxUlFF.mjs.map} +1 -1
- package/dist/{byline-fields-DO6bAYK8.mjs → byline-fields-CdU_LTF1.mjs} +1 -1
- package/dist/{byline-fields-DO6bAYK8.mjs.map → byline-fields-CdU_LTF1.mjs.map} +1 -1
- package/dist/{bylines-CHojDMpj.mjs → bylines-FyZu6TbJ.mjs} +7 -7
- package/dist/{bylines-CHojDMpj.mjs.map → bylines-FyZu6TbJ.mjs.map} +1 -1
- package/dist/{bylines-BGuKFaBy.mjs → bylines-oVN0iPwX.mjs} +12 -8
- package/dist/bylines-oVN0iPwX.mjs.map +1 -0
- package/dist/{cache-BeR7RfN8.mjs → cache-DDwy3JDW.mjs} +2 -2
- package/dist/{cache-BeR7RfN8.mjs.map → cache-DDwy3JDW.mjs.map} +1 -1
- package/dist/{challenge-store-B426wQ6O.mjs → challenge-store-BFzgFRog.mjs} +1 -1
- package/dist/{challenge-store-B426wQ6O.mjs.map → challenge-store-BFzgFRog.mjs.map} +1 -1
- package/dist/{chunks-BU5_nrAC.mjs → chunks-Bq-5DPrD.mjs} +2 -2
- package/dist/{chunks-BU5_nrAC.mjs.map → chunks-Bq-5DPrD.mjs.map} +1 -1
- package/dist/cli/index.mjs +139 -32
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +54 -3
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +16 -4
- package/dist/client/index.mjs.map +1 -1
- package/dist/{comment-SWh31kS0.mjs → comment-B9cUud8H.mjs} +2 -2
- package/dist/{comment-SWh31kS0.mjs.map → comment-B9cUud8H.mjs.map} +1 -1
- package/dist/{comment-reaction-DgcpziXI.mjs → comment-reaction-VUXO981F.mjs} +2 -2
- package/dist/{comment-reaction-DgcpziXI.mjs.map → comment-reaction-VUXO981F.mjs.map} +1 -1
- package/dist/{comments-kZYGppMS.mjs → comments-PXj1E9Si.mjs} +3 -3
- package/dist/{comments-kZYGppMS.mjs.map → comments-PXj1E9Si.mjs.map} +1 -1
- package/dist/{components-CliOkZAs.mjs → components-DZkL4Fx0.mjs} +1 -1
- package/dist/{components-CliOkZAs.mjs.map → components-DZkL4Fx0.mjs.map} +1 -1
- package/dist/{config-CVssduLe.mjs → config-B6b_BobR.mjs} +6 -2
- package/dist/config-B6b_BobR.mjs.map +1 -0
- package/dist/{content-BO61Sx4j.mjs → content-BC43pICM.mjs} +53 -19
- package/dist/content-BC43pICM.mjs.map +1 -0
- package/dist/{content-refresh-BkkApzeS.mjs → content-refresh-CPMSauD3.mjs} +96 -4
- package/dist/content-refresh-CPMSauD3.mjs.map +1 -0
- package/dist/{context-DtSFYFuS.mjs → context-DOurRIrb.mjs} +97 -74
- package/dist/context-DOurRIrb.mjs.map +1 -0
- package/dist/{cron-YFJ7uNVA.mjs → cron-BlKIMD_e.mjs} +1 -1
- package/dist/{cron-YFJ7uNVA.mjs.map → cron-BlKIMD_e.mjs.map} +1 -1
- package/dist/{dashboard-xo_gPs_D.mjs → dashboard-CBm4zhc3.mjs} +4 -4
- package/dist/{dashboard-xo_gPs_D.mjs.map → dashboard-CBm4zhc3.mjs.map} +1 -1
- package/dist/database/pg-migration-lock.d.mts.map +1 -1
- package/dist/database/pg-migration-lock.mjs +1 -4
- package/dist/database/pg-migration-lock.mjs.map +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +2 -2
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{db-errors-BKuXh_fi.mjs → db-errors-CcWLaRiR.mjs} +4 -2
- package/dist/db-errors-CcWLaRiR.mjs.map +1 -0
- package/dist/{default-DY5ovGUG.mjs → default-C4v9KP56.mjs} +1 -1
- package/dist/{default-DY5ovGUG.mjs.map → default-C4v9KP56.mjs.map} +1 -1
- package/dist/{device-flow-CPXQ_QfW.mjs → device-flow-BeA6lUS1.mjs} +5 -6
- package/dist/device-flow-BeA6lUS1.mjs.map +1 -0
- package/dist/{dialect-helpers-Cue7QQOR.mjs → dialect-helpers-BtOwo2us.mjs} +60 -14
- package/dist/dialect-helpers-BtOwo2us.mjs.map +1 -0
- package/dist/{email-console-CjkQc7oY.mjs → email-console-C-9Ng8DM.mjs} +1 -1
- package/dist/{email-console-CjkQc7oY.mjs.map → email-console-C-9Ng8DM.mjs.map} +1 -1
- package/dist/error-DJ98TRbQ.mjs +90 -0
- package/dist/error-DJ98TRbQ.mjs.map +1 -0
- package/dist/{error-CfJMLSkd.mjs → errors-DtEXIQQV.mjs} +15 -84
- package/dist/errors-DtEXIQQV.mjs.map +1 -0
- package/dist/{escape-r8_GbEU2.mjs → escape-CFedIB1C.mjs} +1 -1
- package/dist/{escape-r8_GbEU2.mjs.map → escape-CFedIB1C.mjs.map} +1 -1
- package/dist/{field-defs-cache-BVrNCgSj.mjs → field-defs-cache-KfNJ_qLQ.mjs} +2 -2
- package/dist/{field-defs-cache-BVrNCgSj.mjs.map → field-defs-cache-KfNJ_qLQ.mjs.map} +1 -1
- package/dist/{fts-manager-BD9s77qh.mjs → fts-manager-hyCU9OOp.mjs} +3 -3
- package/dist/{fts-manager-BD9s77qh.mjs.map → fts-manager-hyCU9OOp.mjs.map} +1 -1
- package/dist/{hreflang-CgIxhH4k.d.mts → hreflang-CIxH_LKz.d.mts} +2 -2
- package/dist/{hreflang-CgIxhH4k.d.mts.map → hreflang-CIxH_LKz.d.mts.map} +1 -1
- package/dist/{hreflang-pAWUiPd_.mjs → hreflang-CbYeCzl9.mjs} +7 -7
- package/dist/{hreflang-pAWUiPd_.mjs.map → hreflang-CbYeCzl9.mjs.map} +1 -1
- package/dist/{import-2jHtLzsO.mjs → import-oDYCgNYQ.mjs} +4 -4
- package/dist/{import-2jHtLzsO.mjs.map → import-oDYCgNYQ.mjs.map} +1 -1
- package/dist/{index-DxjWLKGT.d.mts → index-BEui-cRd.d.mts} +3 -3
- package/dist/{index-DxjWLKGT.d.mts.map → index-BEui-cRd.d.mts.map} +1 -1
- package/dist/{index-BXOCyLj0.d.mts → index-BcEH_FfS.d.mts} +812 -16
- package/dist/index-BcEH_FfS.d.mts.map +1 -0
- package/dist/index.d.mts +18 -19
- package/dist/index.mjs +61 -60
- package/dist/{load-DgoWMdRX.mjs → load-Dg5gtWma.mjs} +2 -2
- package/dist/{load-DgoWMdRX.mjs.map → load-Dg5gtWma.mjs.map} +1 -1
- package/dist/{loader-Rb8QlGZp.mjs → loader-D4rigvjR.mjs} +170 -6
- package/dist/loader-D4rigvjR.mjs.map +1 -0
- package/dist/{manifest-schema-DeGNma2O.mjs → manifest-schema-bCq54i7F.mjs} +16 -2
- package/dist/manifest-schema-bCq54i7F.mjs.map +1 -0
- package/dist/media/image-endpoint.d.mts +30 -2
- package/dist/media/image-endpoint.d.mts.map +1 -1
- package/dist/media/image-endpoint.mjs +29 -3
- package/dist/media/image-endpoint.mjs.map +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/local-runtime.d.mts +12 -13
- package/dist/media/local-runtime.d.mts.map +1 -1
- package/dist/media/local-runtime.mjs +6 -6
- package/dist/media-BJ6SRY3g.mjs +247 -0
- package/dist/media-BJ6SRY3g.mjs.map +1 -0
- package/dist/{media-allowlist-Dc05vKtt.mjs → media-allowlist-jUppPWFy.mjs} +1 -1
- package/dist/{media-allowlist-Dc05vKtt.mjs.map → media-allowlist-jUppPWFy.mjs.map} +1 -1
- package/dist/{media-D2ZFowpn.mjs → media-its1WLYv.mjs} +2 -2
- package/dist/{media-D2ZFowpn.mjs.map → media-its1WLYv.mjs.map} +1 -1
- package/dist/media-upload-DNu3QySc.mjs +145 -0
- package/dist/media-upload-DNu3QySc.mjs.map +1 -0
- package/dist/{media-url-DgIEYZr4.mjs → media-url-BCm5vBn6.mjs} +1 -1
- package/dist/{media-url-DgIEYZr4.mjs.map → media-url-BCm5vBn6.mjs.map} +1 -1
- package/dist/{media-usage-B__v9NMm.mjs → media-usage-DPQ3K4xB.mjs} +138 -5
- package/dist/{media-usage-B__v9NMm.mjs.map → media-usage-DPQ3K4xB.mjs.map} +1 -1
- package/dist/{menus-BpfevlJD.mjs → menus-BMGzWyWH.mjs} +15 -8
- package/dist/menus-BMGzWyWH.mjs.map +1 -0
- package/dist/{menus-BtvH7Z7t.mjs → menus-CPf_SW7u.mjs} +234 -13
- package/dist/menus-CPf_SW7u.mjs.map +1 -0
- package/dist/{mode-BVnhGZ2o.mjs → mode-fiXRMfeA.mjs} +1 -1
- package/dist/{mode-BVnhGZ2o.mjs.map → mode-fiXRMfeA.mjs.map} +1 -1
- package/dist/{oauth-authorization-BWqWTHBK.mjs → oauth-authorization-oqfbBuMH.mjs} +5 -6
- package/dist/oauth-authorization-oqfbBuMH.mjs.map +1 -0
- package/dist/{oauth-clients-43_XADoa.mjs → oauth-clients-BlrUHAsf.mjs} +1 -1
- package/dist/{oauth-clients-43_XADoa.mjs.map → oauth-clients-BlrUHAsf.mjs.map} +1 -1
- package/dist/{oauth-state-store-BRSUEkmx.mjs → oauth-state-store-DnvjRMy6.mjs} +2 -1
- package/dist/{oauth-state-store-BRSUEkmx.mjs.map → oauth-state-store-DnvjRMy6.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-Ctgemb0k.mjs → oauth-user-lookup-oUllxvAv.mjs} +1 -1
- package/dist/{oauth-user-lookup-Ctgemb0k.mjs.map → oauth-user-lookup-oUllxvAv.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{options-COXGTtqd.d.mts → options-BqMkWfYa.d.mts} +6 -6
- package/dist/{options-COXGTtqd.d.mts.map → options-BqMkWfYa.d.mts.map} +1 -1
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.d.mts.map +1 -1
- package/dist/page/index.mjs.map +1 -1
- package/dist/{parse-GLksnn-B.mjs → parse-53zyxlpv.mjs} +4 -12
- package/dist/{parse-GLksnn-B.mjs.map → parse-53zyxlpv.mjs.map} +1 -1
- package/dist/{passkey-config-CjA1UbDj.mjs → passkey-config-C-SKpc0-.mjs} +1 -1
- package/dist/{passkey-config-CjA1UbDj.mjs.map → passkey-config-C-SKpc0-.mjs.map} +1 -1
- package/dist/{placeholder-DR-eeZr-.d.mts → placeholder-Dop47JMM.d.mts} +1 -1
- package/dist/{placeholder-DR-eeZr-.d.mts.map → placeholder-Dop47JMM.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +21 -2
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-utils.d.mts +18 -17
- package/dist/plugin-utils.d.mts.map +1 -1
- package/dist/plugin-utils.mjs +8 -6
- package/dist/plugin-utils.mjs.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -11
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.mjs +15 -3
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/{portable-text-BAkgEKcv.mjs → portable-text-sDj92Kxv.mjs} +1 -1
- package/dist/{portable-text-BAkgEKcv.mjs.map → portable-text-sDj92Kxv.mjs.map} +1 -1
- package/dist/{preview-Rloa09Wp.mjs → preview-D4Jnbfx7.mjs} +2 -2
- package/dist/{preview-Rloa09Wp.mjs.map → preview-D4Jnbfx7.mjs.map} +1 -1
- package/dist/{public-url-C0cEvrRu.mjs → public-url-DSGTnJFw.mjs} +5 -3
- package/dist/public-url-DSGTnJFw.mjs.map +1 -0
- package/dist/{query-ZzvXyxWq.mjs → query-BbJQ-dGg.mjs} +15 -15
- package/dist/{query-ZzvXyxWq.mjs.map → query-BbJQ-dGg.mjs.map} +1 -1
- package/dist/{query-BxT95opY.mjs → query-DdFGHzQF.mjs} +3 -3
- package/dist/{query-BxT95opY.mjs.map → query-DdFGHzQF.mjs.map} +1 -1
- package/dist/{rate-limit-Cg4Rvc_-.mjs → rate-limit-D3IEiUi2.mjs} +2 -2
- package/dist/{rate-limit-Cg4Rvc_-.mjs.map → rate-limit-D3IEiUi2.mjs.map} +1 -1
- package/dist/{redirect-Ch3E98qZ.mjs → redirect-BoUac4NT.mjs} +10 -4
- package/dist/redirect-BoUac4NT.mjs.map +1 -0
- package/dist/{redirect-Ce_6Yb6z.mjs → redirect-Botom7X6.mjs} +1 -1
- package/dist/{redirect-Ce_6Yb6z.mjs.map → redirect-Botom7X6.mjs.map} +1 -1
- package/dist/{redirects-CXmVGRNZ.mjs → redirects-ChbpqKiS.mjs} +4 -4
- package/dist/{redirects-CXmVGRNZ.mjs.map → redirects-ChbpqKiS.mjs.map} +1 -1
- package/dist/{redirects-CeD7K7EX.mjs → redirects-D457qwt0.mjs} +10 -181
- package/dist/redirects-D457qwt0.mjs.map +1 -0
- package/dist/{registry-CyIXPi4E.mjs → registry-y21kjhfG.mjs} +97 -8
- package/dist/registry-y21kjhfG.mjs.map +1 -0
- package/dist/{relation-Ba68Tm4Z.mjs → relation-Du0r04E0.mjs} +3 -3
- package/dist/{relation-Ba68Tm4Z.mjs.map → relation-Du0r04E0.mjs.map} +1 -1
- package/dist/{relations-CbBpoOys.d.mts → relations-BKybBoOX.d.mts} +315 -9
- package/dist/relations-BKybBoOX.d.mts.map +1 -0
- package/dist/{relations-BmBmX4Eb.mjs → relations-CZMpBqEd.mjs} +3 -3
- package/dist/{relations-BmBmX4Eb.mjs.map → relations-CZMpBqEd.mjs.map} +1 -1
- package/dist/{relations-C8hVyEy0.mjs → relations-DtX1UMBH.mjs} +13 -7
- package/dist/relations-DtX1UMBH.mjs.map +1 -0
- package/dist/{request-meta-DCwktC5P.mjs → request-meta-DzXYYI-n.mjs} +2 -2
- package/dist/{request-meta-DCwktC5P.mjs.map → request-meta-DzXYYI-n.mjs.map} +1 -1
- package/dist/{resolve-Cd9dzclN.mjs → resolve-DFr4kq72.mjs} +2 -2
- package/dist/{resolve-Cd9dzclN.mjs.map → resolve-DFr4kq72.mjs.map} +1 -1
- package/dist/{runner-jt65bF7F.mjs → runner-BdeLEgad.mjs} +334 -200
- package/dist/runner-BdeLEgad.mjs.map +1 -0
- package/dist/{runner-CiNdIk3y.d.mts → runner-Dd8m8k9F.d.mts} +2 -2
- package/dist/{runner-CiNdIk3y.d.mts.map → runner-Dd8m8k9F.d.mts.map} +1 -1
- package/dist/runtime.d.mts +11 -12
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +4 -4
- package/dist/{schema-DwjufZ1S.mjs → schema-BH8P8vaC.mjs} +3 -3
- package/dist/{schema-DwjufZ1S.mjs.map → schema-BH8P8vaC.mjs.map} +1 -1
- package/dist/scopes-DTIkIaGA.mjs +27 -0
- package/dist/scopes-DTIkIaGA.mjs.map +1 -0
- package/dist/{search-Cl875CVE.mjs → search-D-Yhpmvs.mjs} +8 -7
- package/dist/search-D-Yhpmvs.mjs.map +1 -0
- package/dist/{secrets-CO_bEmII.mjs → secrets-CQ-69kF9.mjs} +25 -19
- package/dist/secrets-CQ-69kF9.mjs.map +1 -0
- package/dist/{sections-DTKzgoiS.mjs → sections-CzVBAKjw.mjs} +3 -3
- package/dist/{sections-DTKzgoiS.mjs.map → sections-CzVBAKjw.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +20 -20
- package/dist/seo/index.d.mts +14 -3
- package/dist/seo/index.d.mts.map +1 -1
- package/dist/seo/index.mjs +17 -17
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-BjrbXAd_.mjs → seo-C3GDfT0V.mjs} +1 -1
- package/dist/{seo-BjrbXAd_.mjs.map → seo-C3GDfT0V.mjs.map} +1 -1
- package/dist/{seo-BLm6SXzS.mjs → seo-kJzVAmmu.mjs} +2 -2
- package/dist/{seo-BLm6SXzS.mjs.map → seo-kJzVAmmu.mjs.map} +1 -1
- package/dist/{service-D6zDmKXy.mjs → service-CQnc276a.mjs} +3 -3
- package/dist/{service-D6zDmKXy.mjs.map → service-CQnc276a.mjs.map} +1 -1
- package/dist/{session-user-DoSs6YM8.mjs → session-user-DbHqKDKe.mjs} +1 -1
- package/dist/{session-user-DoSs6YM8.mjs.map → session-user-DbHqKDKe.mjs.map} +1 -1
- package/dist/{settings-BuQYvLfy.mjs → settings-C2PaBS49.mjs} +4 -4
- package/dist/{settings-BuQYvLfy.mjs.map → settings-C2PaBS49.mjs.map} +1 -1
- package/dist/{settings-CmS3TwXf.mjs → settings-Dtc0DU31.mjs} +3 -3
- package/dist/{settings-CmS3TwXf.mjs.map → settings-Dtc0DU31.mjs.map} +1 -1
- package/dist/{setup-complete-BPNgLHlU.mjs → setup-complete-CdIlqloh.mjs} +1 -1
- package/dist/{setup-complete-BPNgLHlU.mjs.map → setup-complete-CdIlqloh.mjs.map} +1 -1
- package/dist/{setup-nonce-DEPZX96T.mjs → setup-nonce-DqiIPr-J.mjs} +1 -1
- package/dist/{setup-nonce-DEPZX96T.mjs.map → setup-nonce-DqiIPr-J.mjs.map} +1 -1
- package/dist/{single-flight-cache-DEtW-OEG.mjs → single-flight-cache-C2exrGAi.mjs} +1 -1
- package/dist/{single-flight-cache-DEtW-OEG.mjs.map → single-flight-cache-C2exrGAi.mjs.map} +1 -1
- package/dist/{site-url-CcLy5D5s.mjs → site-url-NGJT6NTU.mjs} +1 -1
- package/dist/{site-url-CcLy5D5s.mjs.map → site-url-NGJT6NTU.mjs.map} +1 -1
- package/dist/snapshot-BdpUJKD-.mjs +216 -0
- package/dist/snapshot-BdpUJKD-.mjs.map +1 -0
- package/dist/{ssrf-TrKYJAy0.mjs → ssrf-CviKqWmq.mjs} +1 -1
- package/dist/{ssrf-TrKYJAy0.mjs.map → ssrf-CviKqWmq.mjs.map} +1 -1
- package/dist/state-xxv6ZTMv.mjs +128 -0
- package/dist/state-xxv6ZTMv.mjs.map +1 -0
- package/dist/{status-D3Gy1Zc6.mjs → status-COfycGIU.mjs} +1 -1
- package/dist/{status-D3Gy1Zc6.mjs.map → status-COfycGIU.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{taxonomies-pUkuD6nj.mjs → taxonomies-HI9fnTdp.mjs} +8 -8
- package/dist/{taxonomies-pUkuD6nj.mjs.map → taxonomies-HI9fnTdp.mjs.map} +1 -1
- package/dist/{taxonomies-ClS4RKaZ.mjs → taxonomies-rMeBzOjX.mjs} +26 -17
- package/dist/taxonomies-rMeBzOjX.mjs.map +1 -0
- package/dist/{taxonomy-BkxbUMSw.mjs → taxonomy-0mCI25HN.mjs} +51 -13
- package/dist/taxonomy-0mCI25HN.mjs.map +1 -0
- package/dist/{tokens-BV6fgl5A.mjs → tokens-DVltpO2D.mjs} +2 -2
- package/dist/{tokens-BV6fgl5A.mjs.map → tokens-DVltpO2D.mjs.map} +1 -1
- package/dist/{transport-DTFhhPOg.mjs → transport-CKrlqSpD.mjs} +1 -1
- package/dist/{transport-DTFhhPOg.mjs.map → transport-CKrlqSpD.mjs.map} +1 -1
- package/dist/{transport-DmlmzD2U.d.mts → transport-Vd7VdqHv.d.mts} +1 -1
- package/dist/{transport-DmlmzD2U.d.mts.map → transport-Vd7VdqHv.d.mts.map} +1 -1
- package/dist/{trusted-proxy-CSgZVESw.mjs → trusted-proxy-CwjQj0YG.mjs} +1 -1
- package/dist/{trusted-proxy-CSgZVESw.mjs.map → trusted-proxy-CwjQj0YG.mjs.map} +1 -1
- package/dist/{types-B6-N9cBB.d.mts → types-B4vm81VH.d.mts} +1 -1
- package/dist/{types-B6-N9cBB.d.mts.map → types-B4vm81VH.d.mts.map} +1 -1
- package/dist/{types-Cm4Cz-8M.d.mts → types-B97jg3aW.d.mts} +6 -1
- package/dist/{types-Cm4Cz-8M.d.mts.map → types-B97jg3aW.d.mts.map} +1 -1
- package/dist/{types-BNZsPL9z.mjs → types-BD40g7zz.mjs} +1 -1
- package/dist/{types-BNZsPL9z.mjs.map → types-BD40g7zz.mjs.map} +1 -1
- package/dist/{types-QnlQIyPE.d.mts → types-BNfPHfay.d.mts} +1 -1
- package/dist/{types-QnlQIyPE.d.mts.map → types-BNfPHfay.d.mts.map} +1 -1
- package/dist/{types-DLIrNtv5.d.mts → types-BfYUPJdP.d.mts} +2 -2
- package/dist/{types-DLIrNtv5.d.mts.map → types-BfYUPJdP.d.mts.map} +1 -1
- package/dist/{types-CtDVagM4.d.mts → types-BvB7gDOD.d.mts} +38 -4
- package/dist/types-BvB7gDOD.d.mts.map +1 -0
- package/dist/{types-B_pmP7Yq.d.mts → types-C7U0HlEr.d.mts} +1 -1
- package/dist/{types-B_pmP7Yq.d.mts.map → types-C7U0HlEr.d.mts.map} +1 -1
- package/dist/{types-Ch8pFMEm.mjs → types-CrRUFdej.mjs} +3 -3
- package/dist/{types-Ch8pFMEm.mjs.map → types-CrRUFdej.mjs.map} +1 -1
- package/dist/{types-momGysZk.d.mts → types-DPKhI5ib.d.mts} +9 -1
- package/dist/types-DPKhI5ib.d.mts.map +1 -0
- package/dist/{types-BCVuUPrL.d.mts → types-Kmaxdarz.d.mts} +1 -1
- package/dist/{types-BCVuUPrL.d.mts.map → types-Kmaxdarz.d.mts.map} +1 -1
- package/dist/{types-qljd1hsL.d.mts → types-iVeZ5g6N.d.mts} +1 -1
- package/dist/{types-qljd1hsL.d.mts.map → types-iVeZ5g6N.d.mts.map} +1 -1
- package/dist/{user-DTxX_Fha.mjs → user-aTXqmXBz.mjs} +3 -3
- package/dist/{user-DTxX_Fha.mjs.map → user-aTXqmXBz.mjs.map} +1 -1
- package/dist/{utils-Cz8PVrl4.mjs → utils-BbUgmeZG.mjs} +1 -1
- package/dist/{utils-Cz8PVrl4.mjs.map → utils-BbUgmeZG.mjs.map} +1 -1
- package/dist/{validate-C3CpWlNt.mjs → validate-CDT1jl6_.mjs} +11 -6
- package/dist/validate-CDT1jl6_.mjs.map +1 -0
- package/dist/{validate-9jLuE301.d.mts → validate-DULfgpJP.d.mts} +5 -5
- package/dist/{validate-9jLuE301.d.mts.map → validate-DULfgpJP.d.mts.map} +1 -1
- package/dist/{validation-DM2K_NJC.mjs → validation-DlD0E35W.mjs} +10 -10
- package/dist/{validation-DM2K_NJC.mjs.map → validation-DlD0E35W.mjs.map} +1 -1
- package/dist/version-Ci6bw6YK.mjs +7 -0
- package/dist/{version-BlIJvNAZ.mjs.map → version-Ci6bw6YK.mjs.map} +1 -1
- package/dist/{widgets-B_X6_UXJ.mjs → widgets-5fipNkMT.mjs} +3 -3
- package/dist/{widgets-B_X6_UXJ.mjs.map → widgets-5fipNkMT.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-tADW4KTa.d.mts → wxr-taxonomies-B4tMuN5T.d.mts} +1 -1
- package/dist/{wxr-taxonomies-tADW4KTa.d.mts.map → wxr-taxonomies-B4tMuN5T.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-oNJB2S81.mjs → wxr-taxonomies-BmUnBNgz.mjs} +4 -4
- package/dist/{wxr-taxonomies-oNJB2S81.mjs.map → wxr-taxonomies-BmUnBNgz.mjs.map} +1 -1
- package/dist/{zod-generator-CrfV79De.mjs → zod-generator-CwkHWz4f.mjs} +2 -2
- package/dist/{zod-generator-CrfV79De.mjs.map → zod-generator-CwkHWz4f.mjs.map} +1 -1
- package/package.json +8 -8
- package/src/api/authorize.ts +10 -1
- package/src/api/error.ts +5 -5
- package/src/api/errors.ts +14 -0
- package/src/api/handlers/backup.ts +312 -0
- package/src/api/handlers/bylines.ts +5 -4
- package/src/api/handlers/content.ts +61 -9
- package/src/api/handlers/device-flow.ts +2 -3
- package/src/api/handlers/index.ts +16 -0
- package/src/api/handlers/marketplace.ts +38 -0
- package/src/api/handlers/media-upload.ts +210 -0
- package/src/api/handlers/media-usage.ts +211 -2
- package/src/api/handlers/menus.ts +11 -6
- package/src/api/handlers/oauth-authorization.ts +2 -6
- package/src/api/handlers/plugin-settings.ts +218 -0
- package/src/api/handlers/plugins.ts +41 -0
- package/src/api/handlers/registry.ts +39 -0
- package/src/api/handlers/relations.ts +7 -2
- package/src/api/handlers/snapshot.ts +21 -3
- package/src/api/handlers/taxonomies.ts +22 -14
- package/src/api/openapi/document.ts +48 -6
- package/src/api/parse.ts +1 -15
- package/src/api/public-url.ts +4 -2
- package/src/api/schemas/bylines.ts +4 -4
- package/src/api/schemas/common.ts +13 -8
- package/src/api/schemas/media-usage.ts +72 -0
- package/src/api/schemas/media.ts +32 -1
- package/src/api/schemas/menus.ts +2 -1
- package/src/api/schemas/relations.ts +3 -1
- package/src/api/schemas/taxonomies.ts +4 -2
- package/src/astro/integration/index.ts +38 -0
- package/src/astro/integration/routes.ts +35 -0
- package/src/astro/integration/runtime.ts +6 -0
- package/src/astro/integration/virtual-modules.ts +41 -7
- package/src/astro/integration/vite-config.ts +17 -1
- package/src/astro/middleware/auth.ts +70 -78
- package/src/astro/middleware/csp.ts +5 -2
- package/src/astro/middleware.ts +86 -31
- package/src/astro/public-plugin-api-routes.ts +2 -1
- package/src/astro/routes/PluginRegistry.tsx +5 -2
- package/src/astro/routes/admin.astro +56 -16
- package/src/astro/routes/api/admin/api-tokens/index.ts +2 -2
- package/src/astro/routes/api/admin/bylines/[id]/translations.ts +2 -5
- package/src/astro/routes/api/admin/bylines/index.ts +5 -8
- package/src/astro/routes/api/admin/plugins/[id]/index.ts +6 -0
- package/src/astro/routes/api/admin/plugins/[id]/mcp.ts +42 -0
- package/src/astro/routes/api/admin/plugins/[id]/settings.ts +80 -0
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +2 -0
- package/src/astro/routes/api/admin/plugins/index.ts +9 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +2 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +2 -0
- package/src/astro/routes/api/admin/plugins/registry/install.ts +2 -0
- package/src/astro/routes/api/admin/plugins/updates.ts +2 -4
- package/src/astro/routes/api/auth/mode.ts +6 -14
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +21 -4
- package/src/astro/routes/api/auth/oauth/[provider].ts +24 -6
- package/src/astro/routes/api/content/[collection]/[id]/compare.ts +3 -4
- package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +2 -3
- package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +2 -3
- package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +3 -4
- package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +4 -6
- package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/parents.ts +2 -3
- package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +3 -4
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +4 -6
- package/src/astro/routes/api/content/[collection]/[id]/translations.ts +3 -4
- package/src/astro/routes/api/content/[collection]/[id].ts +3 -4
- package/src/astro/routes/api/content/[collection]/authors.ts +2 -3
- package/src/astro/routes/api/content/[collection]/index.ts +6 -8
- package/src/astro/routes/api/content/[collection]/trash.ts +2 -3
- package/src/astro/routes/api/manifest.ts +2 -9
- package/src/astro/routes/api/mcp.ts +2 -1
- package/src/astro/routes/api/media/[id]/usage.ts +30 -0
- package/src/astro/routes/api/media/[id].ts +17 -6
- package/src/astro/routes/api/media/file/[...key].ts +8 -0
- package/src/astro/routes/api/media.ts +21 -2
- package/src/astro/routes/api/oauth/authorize.ts +43 -15
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +17 -3
- package/src/astro/routes/api/settings/backups/archives/[name].ts +78 -0
- package/src/astro/routes/api/settings/backups/archives/index.ts +33 -0
- package/src/astro/routes/api/settings/backups/export.ts +43 -0
- package/src/astro/routes/api/settings/backups/index.ts +76 -0
- package/src/astro/routes/api/setup/admin-verify.ts +8 -4
- package/src/astro/routes/api/setup/admin.ts +11 -4
- package/src/astro/routes/api/well-known/oauth-authorization-server.ts +4 -1
- package/src/astro/routes/api/well-known/oauth-protected-resource.ts +5 -1
- package/src/astro/types.ts +48 -2
- package/src/auth/api-tokens.ts +1 -0
- package/src/auth/oauth-state-store.ts +3 -0
- package/src/auth/providers/github-admin.tsx +5 -6
- package/src/auth/providers/google-admin.tsx +5 -6
- package/src/auth/scopes.ts +3 -9
- package/src/cli/client-factory.ts +0 -1
- package/src/cli/commands/bundle-utils.ts +50 -1
- package/src/cli/commands/bundle.ts +9 -2
- package/src/cli/commands/media.ts +127 -0
- package/src/client/index.ts +84 -2
- package/src/client/transport.ts +1 -1
- package/src/components/EmDashHead.astro +4 -8
- package/src/components/Gallery.astro +141 -26
- package/src/components/InlinePortableTextEditor.tsx +56 -35
- package/src/components/marks/Link.astro +5 -1
- package/src/config/secrets.ts +25 -19
- package/src/content/converters/gallery.ts +61 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +19 -0
- package/src/content/converters/prosemirror-to-portable-text.ts +18 -0
- package/src/content/converters/types.ts +36 -0
- package/src/database/dialect-helpers.ts +80 -7
- package/src/database/migrations/051_content_taxonomies_denorm.ts +120 -0
- package/src/database/migrations/052_media_usage_read_index.ts +26 -0
- package/src/database/migrations/053_plugin_mcp_tools.ts +21 -0
- package/src/database/migrations/runner.ts +6 -0
- package/src/database/pg-migration-lock.ts +1 -4
- package/src/database/repositories/audit.ts +2 -1
- package/src/database/repositories/content.ts +98 -16
- package/src/database/repositories/media-usage.ts +250 -1
- package/src/database/repositories/plugin-storage.ts +29 -32
- package/src/database/repositories/redirect.ts +14 -2
- package/src/database/repositories/taxonomy.ts +57 -8
- package/src/database/types.ts +23 -0
- package/src/db/adapters.ts +9 -0
- package/src/emdash-runtime.ts +365 -83
- package/src/i18n/config.ts +8 -0
- package/src/i18n/repair-locale-casing.ts +51 -0
- package/src/loader.ts +292 -1
- package/src/mcp/server.ts +222 -5
- package/src/media/image-endpoint.ts +38 -2
- package/src/page/metadata.ts +27 -0
- package/src/plugin-types.ts +19 -0
- package/src/plugin-utils.ts +8 -6
- package/src/plugins/adapt-sandbox-entry.ts +30 -1
- package/src/plugins/context.ts +7 -0
- package/src/plugins/define-plugin.ts +16 -0
- package/src/plugins/manifest-schema.ts +28 -1
- package/src/plugins/routes.ts +27 -1
- package/src/plugins/sandbox/runner-options.ts +16 -0
- package/src/plugins/sandbox/types.ts +6 -1
- package/src/plugins/state.ts +17 -1
- package/src/plugins/storage-query.ts +67 -33
- package/src/plugins/types.ts +41 -0
- package/src/schema/registry.ts +141 -5
- package/src/search/query.ts +3 -2
- package/src/seed/apply.ts +37 -36
- package/src/seed/validate.ts +15 -4
- package/src/seo/index.ts +19 -4
- package/src/storage/types.ts +6 -0
- package/src/utils/base64.ts +7 -2
- package/src/utils/db-errors.ts +3 -1
- package/src/virtual-modules.d.ts +13 -0
- package/src/visual-editing/toolbar.ts +1 -1
- package/dist/adapters-DPAkL6QF.d.mts.map +0 -1
- package/dist/api-DVbHNApo.mjs.map +0 -1
- package/dist/api-tokens-Dk2GrJMY.mjs +0 -3
- package/dist/apply-D23iUV4q.mjs.map +0 -1
- package/dist/authorize-BmCwQCib.mjs.map +0 -1
- package/dist/base64-C74Msx8h.mjs.map +0 -1
- package/dist/bylines-BGuKFaBy.mjs.map +0 -1
- package/dist/config-CVssduLe.mjs.map +0 -1
- package/dist/content-BO61Sx4j.mjs.map +0 -1
- package/dist/content-refresh-BkkApzeS.mjs.map +0 -1
- package/dist/context-DtSFYFuS.mjs.map +0 -1
- package/dist/db-errors-BKuXh_fi.mjs.map +0 -1
- package/dist/device-flow-CPXQ_QfW.mjs.map +0 -1
- package/dist/dialect-helpers-Cue7QQOR.mjs.map +0 -1
- package/dist/error-CfJMLSkd.mjs.map +0 -1
- package/dist/index-BXOCyLj0.d.mts.map +0 -1
- package/dist/loader-Rb8QlGZp.mjs.map +0 -1
- package/dist/manifest-schema-DeGNma2O.mjs.map +0 -1
- package/dist/menus-BpfevlJD.mjs.map +0 -1
- package/dist/menus-BtvH7Z7t.mjs.map +0 -1
- package/dist/oauth-authorization-BWqWTHBK.mjs.map +0 -1
- package/dist/public-url-C0cEvrRu.mjs.map +0 -1
- package/dist/redirect-Ch3E98qZ.mjs.map +0 -1
- package/dist/redirects-CeD7K7EX.mjs.map +0 -1
- package/dist/registry-CyIXPi4E.mjs.map +0 -1
- package/dist/relations-C8hVyEy0.mjs.map +0 -1
- package/dist/relations-CbBpoOys.d.mts.map +0 -1
- package/dist/runner-jt65bF7F.mjs.map +0 -1
- package/dist/scheduled-publish-DlJHGcuL.d.mts +0 -11
- package/dist/scheduled-publish-DlJHGcuL.d.mts.map +0 -1
- package/dist/search-Cl875CVE.mjs.map +0 -1
- package/dist/secrets-CO_bEmII.mjs.map +0 -1
- package/dist/taxonomies-ClS4RKaZ.mjs.map +0 -1
- package/dist/taxonomy-BkxbUMSw.mjs.map +0 -1
- package/dist/types-CtDVagM4.d.mts.map +0 -1
- package/dist/types-momGysZk.d.mts.map +0 -1
- package/dist/validate-C3CpWlNt.mjs.map +0 -1
- package/dist/version-BlIJvNAZ.mjs +0 -7
- /package/dist/{ssrf-B5DOv5E5.mjs → ssrf-BB__xfNM.mjs} +0 -0
- /package/dist/{types-DeCZBZxn.mjs → types-CK0LxPUQ.mjs} +0 -0
|
@@ -21,6 +21,8 @@ export const GET: APIRoute = async ({ params, request, locals }) => {
|
|
|
21
21
|
const { emdash, user } = locals;
|
|
22
22
|
const { collection, id, relation } = params;
|
|
23
23
|
|
|
24
|
+
const dbErr = requireDb(emdash?.db);
|
|
25
|
+
if (dbErr) return dbErr;
|
|
24
26
|
const denied = requirePerm(user, "content:read");
|
|
25
27
|
if (denied) return denied;
|
|
26
28
|
|
|
@@ -28,9 +30,6 @@ export const GET: APIRoute = async ({ params, request, locals }) => {
|
|
|
28
30
|
return apiError("VALIDATION_ERROR", "Collection, id, and relation required", 400);
|
|
29
31
|
}
|
|
30
32
|
|
|
31
|
-
const dbErr = requireDb(emdash?.db);
|
|
32
|
-
if (dbErr) return dbErr;
|
|
33
|
-
|
|
34
33
|
const query = parseQuery(new URL(request.url), cursorPaginationQuery);
|
|
35
34
|
if (isParseError(query)) return query;
|
|
36
35
|
|
|
@@ -57,6 +56,8 @@ export const POST: APIRoute = async ({ params, request, locals }) => {
|
|
|
57
56
|
return apiError("VALIDATION_ERROR", "Collection, id, and relation required", 400);
|
|
58
57
|
}
|
|
59
58
|
|
|
59
|
+
const dbErr = requireDb(emdash?.db);
|
|
60
|
+
if (dbErr) return dbErr;
|
|
60
61
|
// Gate on the base edit capability BEFORE the existence lookup. Resolving the
|
|
61
62
|
// entry first would let a user with no edit permission distinguish real ids
|
|
62
63
|
// (403) from missing ids (404) — an existence oracle. Mirrors the taxonomy
|
|
@@ -64,9 +65,6 @@ export const POST: APIRoute = async ({ params, request, locals }) => {
|
|
|
64
65
|
const denied = requirePerm(user, "content:edit_own");
|
|
65
66
|
if (denied) return denied;
|
|
66
67
|
|
|
67
|
-
const dbErr = requireDb(emdash?.db);
|
|
68
|
-
if (dbErr) return dbErr;
|
|
69
|
-
|
|
70
68
|
// Resolve the parent entry to gate on its author (ownership-aware write).
|
|
71
69
|
const parent = await new ContentRepository(emdash.db).findByIdOrSlug(collection, id);
|
|
72
70
|
if (!parent) return apiError("NOT_FOUND", "Content not found", 404);
|
|
@@ -19,6 +19,8 @@ export const GET: APIRoute = async ({ params, request, locals }) => {
|
|
|
19
19
|
const { emdash, user } = locals;
|
|
20
20
|
const { collection, id, relation } = params;
|
|
21
21
|
|
|
22
|
+
const dbErr = requireDb(emdash?.db);
|
|
23
|
+
if (dbErr) return dbErr;
|
|
22
24
|
const denied = requirePerm(user, "content:read");
|
|
23
25
|
if (denied) return denied;
|
|
24
26
|
|
|
@@ -26,9 +28,6 @@ export const GET: APIRoute = async ({ params, request, locals }) => {
|
|
|
26
28
|
return apiError("VALIDATION_ERROR", "Collection, id, and relation required", 400);
|
|
27
29
|
}
|
|
28
30
|
|
|
29
|
-
const dbErr = requireDb(emdash?.db);
|
|
30
|
-
if (dbErr) return dbErr;
|
|
31
|
-
|
|
32
31
|
const query = parseQuery(new URL(request.url), cursorPaginationQuery);
|
|
33
32
|
if (isParseError(query)) return query;
|
|
34
33
|
|
|
@@ -13,15 +13,14 @@ export const prerender = false;
|
|
|
13
13
|
|
|
14
14
|
export const GET: APIRoute = async ({ params, url, locals }) => {
|
|
15
15
|
const { emdash, user } = locals;
|
|
16
|
+
if (!emdash?.handleRevisionList) {
|
|
17
|
+
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
18
|
+
}
|
|
16
19
|
const denied = requirePerm(user, "content:read_drafts");
|
|
17
20
|
if (denied) return denied;
|
|
18
21
|
const collection = params.collection!;
|
|
19
22
|
const id = params.id!;
|
|
20
23
|
|
|
21
|
-
if (!emdash?.handleRevisionList) {
|
|
22
|
-
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
24
|
const limitParam = url.searchParams.get("limit");
|
|
26
25
|
const parsedLimit = limitParam ? parseInt(limitParam, 10) : undefined;
|
|
27
26
|
const result = await emdash.handleRevisionList(collection, id, {
|
|
@@ -24,6 +24,8 @@ export const GET: APIRoute = async ({ params, locals }) => {
|
|
|
24
24
|
const { emdash, user } = locals;
|
|
25
25
|
const { collection, id, taxonomy } = params;
|
|
26
26
|
|
|
27
|
+
const dbErr = requireDb(emdash?.db);
|
|
28
|
+
if (dbErr) return dbErr;
|
|
27
29
|
const denied = requirePerm(user, "content:read");
|
|
28
30
|
if (denied) return denied;
|
|
29
31
|
|
|
@@ -31,9 +33,6 @@ export const GET: APIRoute = async ({ params, locals }) => {
|
|
|
31
33
|
return apiError("VALIDATION_ERROR", "Collection, id, and taxonomy required", 400);
|
|
32
34
|
}
|
|
33
35
|
|
|
34
|
-
const dbErr = requireDb(emdash?.db);
|
|
35
|
-
if (dbErr) return dbErr;
|
|
36
|
-
|
|
37
36
|
try {
|
|
38
37
|
// Terms are stored against the per-locale entry row but their
|
|
39
38
|
// translation_group spans every locale. Resolve the entry's own locale
|
|
@@ -71,11 +70,10 @@ export const POST: APIRoute = async ({ params, request, locals }) => {
|
|
|
71
70
|
return apiError("VALIDATION_ERROR", "Collection, id, and taxonomy required", 400);
|
|
72
71
|
}
|
|
73
72
|
|
|
74
|
-
const denied = requirePerm(user, "content:edit_own");
|
|
75
|
-
if (denied) return denied;
|
|
76
|
-
|
|
77
73
|
const dbErr = requireDb(emdash?.db);
|
|
78
74
|
if (dbErr) return dbErr;
|
|
75
|
+
const denied = requirePerm(user, "content:edit_own");
|
|
76
|
+
if (denied) return denied;
|
|
79
77
|
|
|
80
78
|
if (!emdash.handleContentGet) {
|
|
81
79
|
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
@@ -25,15 +25,14 @@ function isPublished(t: unknown): boolean {
|
|
|
25
25
|
|
|
26
26
|
export const GET: APIRoute = async ({ params, locals }) => {
|
|
27
27
|
const { emdash, user } = locals;
|
|
28
|
+
if (!emdash?.handleContentTranslations) {
|
|
29
|
+
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
30
|
+
}
|
|
28
31
|
const denied = requirePerm(user, "content:read");
|
|
29
32
|
if (denied) return denied;
|
|
30
33
|
const collection = params.collection!;
|
|
31
34
|
const id = params.id!;
|
|
32
35
|
|
|
33
|
-
if (!emdash?.handleContentTranslations) {
|
|
34
|
-
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
36
|
const result = await emdash.handleContentTranslations(collection, id);
|
|
38
37
|
|
|
39
38
|
// Filter out non-published translations for users without read_drafts so a
|
|
@@ -18,16 +18,15 @@ export const prerender = false;
|
|
|
18
18
|
|
|
19
19
|
export const GET: APIRoute = async ({ params, url, locals }) => {
|
|
20
20
|
const { emdash, user } = locals;
|
|
21
|
+
if (!emdash?.handleContentGet) {
|
|
22
|
+
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
23
|
+
}
|
|
21
24
|
const denied = requirePerm(user, "content:read");
|
|
22
25
|
if (denied) return denied;
|
|
23
26
|
const collection = params.collection!;
|
|
24
27
|
const id = params.id!;
|
|
25
28
|
const locale = url.searchParams.get("locale") || undefined;
|
|
26
29
|
|
|
27
|
-
if (!emdash?.handleContentGet) {
|
|
28
|
-
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
30
|
const result = await emdash.handleContentGet(collection, id, locale);
|
|
32
31
|
|
|
33
32
|
// Hide non-published items from users without content:read_drafts. Return
|
|
@@ -21,12 +21,11 @@ export const GET: APIRoute = async ({ params, locals }) => {
|
|
|
21
21
|
// not be reachable by subscribers (content:read). content:read_drafts is
|
|
22
22
|
// the same tier the list route requires before it stops forcing
|
|
23
23
|
// status=published, so the visibility surfaces line up.
|
|
24
|
-
const denied = requirePerm(user, "content:read_drafts");
|
|
25
|
-
if (denied) return denied;
|
|
26
|
-
|
|
27
24
|
if (!emdash?.handleContentAuthors) {
|
|
28
25
|
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
29
26
|
}
|
|
27
|
+
const denied = requirePerm(user, "content:read_drafts");
|
|
28
|
+
if (denied) return denied;
|
|
30
29
|
|
|
31
30
|
const result = await emdash.handleContentAuthors(collection);
|
|
32
31
|
|
|
@@ -17,16 +17,15 @@ export const prerender = false;
|
|
|
17
17
|
|
|
18
18
|
export const GET: APIRoute = async ({ params, url, locals }) => {
|
|
19
19
|
const { emdash, user } = locals;
|
|
20
|
+
if (!emdash?.handleContentList) {
|
|
21
|
+
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
22
|
+
}
|
|
20
23
|
const denied = requirePerm(user, "content:read");
|
|
21
24
|
if (denied) return denied;
|
|
22
25
|
const collection = params.collection!;
|
|
23
26
|
const query = parseQuery(url, contentListQuery);
|
|
24
27
|
if (isParseError(query)) return query;
|
|
25
28
|
|
|
26
|
-
if (!emdash?.handleContentList) {
|
|
27
|
-
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
29
|
// Subscribers must only see published content; force the status filter
|
|
31
30
|
// regardless of caller-supplied value. Any user with content:read_drafts
|
|
32
31
|
// (CONTRIBUTOR+) keeps the requested filter.
|
|
@@ -41,16 +40,15 @@ export const GET: APIRoute = async ({ params, url, locals }) => {
|
|
|
41
40
|
|
|
42
41
|
export const POST: APIRoute = async ({ params, request, locals, cache }) => {
|
|
43
42
|
const { emdash, user } = locals;
|
|
43
|
+
if (!emdash?.handleContentCreate || !emdash?.handleContentGet) {
|
|
44
|
+
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
45
|
+
}
|
|
44
46
|
const denied = requirePerm(user, "content:create");
|
|
45
47
|
if (denied) return denied;
|
|
46
48
|
const collection = params.collection!;
|
|
47
49
|
const body = await parseBody(request, contentCreateBody);
|
|
48
50
|
if (isParseError(body)) return body;
|
|
49
51
|
|
|
50
|
-
if (!emdash?.handleContentCreate || !emdash?.handleContentGet) {
|
|
51
|
-
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
52
|
// Creating a translation requires edit permission on the source item
|
|
55
53
|
if (body.translationOf) {
|
|
56
54
|
const source = await emdash.handleContentGet(collection, body.translationOf);
|
|
@@ -17,12 +17,11 @@ export const GET: APIRoute = async ({ params, url, locals }) => {
|
|
|
17
17
|
const { emdash, user } = locals;
|
|
18
18
|
const collection = params.collection!;
|
|
19
19
|
|
|
20
|
-
const denied = requirePerm(user, "content:read_drafts");
|
|
21
|
-
if (denied) return denied;
|
|
22
|
-
|
|
23
20
|
if (!emdash?.handleContentListTrashed) {
|
|
24
21
|
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
25
22
|
}
|
|
23
|
+
const denied = requirePerm(user, "content:read_drafts");
|
|
24
|
+
if (denied) return denied;
|
|
26
25
|
|
|
27
26
|
const query = parseQuery(url, contentTrashQuery);
|
|
28
27
|
if (isParseError(query)) return query;
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import type { APIRoute } from "astro";
|
|
11
11
|
|
|
12
|
-
import { handleError } from "#api/error.js";
|
|
12
|
+
import { apiSuccess, handleError } from "#api/error.js";
|
|
13
13
|
import { getAuthMode } from "#auth/mode.js";
|
|
14
14
|
import { OptionsRepository } from "#db/repositories/options.js";
|
|
15
15
|
|
|
@@ -94,14 +94,7 @@ export const GET: APIRoute = async ({ locals }) => {
|
|
|
94
94
|
admin: adminBranding,
|
|
95
95
|
};
|
|
96
96
|
|
|
97
|
-
return
|
|
98
|
-
{ data: manifest },
|
|
99
|
-
{
|
|
100
|
-
headers: {
|
|
101
|
-
"Cache-Control": "private, no-store",
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
);
|
|
97
|
+
return apiSuccess(manifest);
|
|
105
98
|
} catch (error) {
|
|
106
99
|
return handleError(error, "Failed to build manifest", "MANIFEST_BUILD_ERROR");
|
|
107
100
|
}
|
|
@@ -30,7 +30,8 @@ export const POST: APIRoute = async ({ request, locals }) => {
|
|
|
30
30
|
return apiError("UNAUTHORIZED", "Authentication required", 401);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
const
|
|
33
|
+
const pluginTools = await emdash.getEnabledPluginMcpTools();
|
|
34
|
+
const server = createMcpServer(pluginTools, request);
|
|
34
35
|
|
|
35
36
|
try {
|
|
36
37
|
const transport = new WebStandardStreamableHTTPServerTransport({
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { APIRoute } from "astro";
|
|
2
|
+
|
|
3
|
+
import { requirePerm } from "#api/authorize.js";
|
|
4
|
+
import { apiError, unwrapResult } from "#api/error.js";
|
|
5
|
+
import { handleMediaUsageDetails } from "#api/handlers/media-usage.js";
|
|
6
|
+
import { isParseError, parseQuery } from "#api/parse.js";
|
|
7
|
+
import { mediaUsageDetailsQuery } from "#api/schemas.js";
|
|
8
|
+
import { requireScope } from "#auth/scopes.js";
|
|
9
|
+
|
|
10
|
+
export const prerender = false;
|
|
11
|
+
|
|
12
|
+
export const GET: APIRoute = async ({ params, request, locals }) => {
|
|
13
|
+
const { emdash, user } = locals;
|
|
14
|
+
|
|
15
|
+
const mediaDenied = requirePerm(user, "media:read");
|
|
16
|
+
if (mediaDenied) return mediaDenied;
|
|
17
|
+
const contentDenied = requirePerm(user, "content:read_drafts");
|
|
18
|
+
if (contentDenied) return contentDenied;
|
|
19
|
+
const scopeDenied = requireScope(locals, "admin");
|
|
20
|
+
if (scopeDenied) return scopeDenied;
|
|
21
|
+
|
|
22
|
+
const { id } = params;
|
|
23
|
+
if (!id) return apiError("INVALID_REQUEST", "Media ID required", 400);
|
|
24
|
+
if (!emdash?.db) return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
25
|
+
|
|
26
|
+
const query = parseQuery(new URL(request.url), mediaUsageDetailsQuery);
|
|
27
|
+
if (isParseError(query)) return query;
|
|
28
|
+
|
|
29
|
+
return unwrapResult(await handleMediaUsageDetails(emdash.db, id, query));
|
|
30
|
+
};
|
|
@@ -8,17 +8,18 @@
|
|
|
8
8
|
|
|
9
9
|
import type { APIRoute } from "astro";
|
|
10
10
|
|
|
11
|
-
import { requireOwnerPerm, requirePerm } from "#api/authorize.js";
|
|
12
|
-
import { apiError, handleError, unwrapResult } from "#api/error.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
11
|
+
import { canReadMediaUsageCount, requireOwnerPerm, requirePerm } from "#api/authorize.js";
|
|
12
|
+
import { apiError, apiSuccess, handleError, unwrapResult } from "#api/error.js";
|
|
13
|
+
import { handleMediaUsageSummaries } from "#api/handlers/media-usage.js";
|
|
14
|
+
import { isParseError, parseBody, parseQuery } from "#api/parse.js";
|
|
15
|
+
import { mediaGetQuery, mediaUpdateBody } from "#api/schemas.js";
|
|
15
16
|
|
|
16
17
|
export const prerender = false;
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* Get media item
|
|
20
21
|
*/
|
|
21
|
-
export const GET: APIRoute = async ({ params, locals }) => {
|
|
22
|
+
export const GET: APIRoute = async ({ params, request, locals }) => {
|
|
22
23
|
const { emdash, user } = locals;
|
|
23
24
|
const { id } = params;
|
|
24
25
|
|
|
@@ -32,9 +33,19 @@ export const GET: APIRoute = async ({ params, locals }) => {
|
|
|
32
33
|
if (!emdash?.handleMediaGet) {
|
|
33
34
|
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
34
35
|
}
|
|
36
|
+
const query = parseQuery(new URL(request.url), mediaGetQuery);
|
|
37
|
+
if (isParseError(query)) return query;
|
|
35
38
|
|
|
36
39
|
const result = await emdash.handleMediaGet(id);
|
|
37
|
-
return unwrapResult(result);
|
|
40
|
+
if (!result.success || query.includeUsage !== "1") return unwrapResult(result);
|
|
41
|
+
|
|
42
|
+
const includeCount = canReadMediaUsageCount(user, locals.tokenScopes);
|
|
43
|
+
const usageResult = await handleMediaUsageSummaries(emdash.db, [id], { includeCount });
|
|
44
|
+
if (!usageResult.success) return unwrapResult(usageResult);
|
|
45
|
+
const usage = usageResult.data[id];
|
|
46
|
+
if (!usage) return apiError("MEDIA_USAGE_READ_ERROR", "Failed to read media usage", 500);
|
|
47
|
+
|
|
48
|
+
return apiSuccess({ item: { ...result.data.item, usage } });
|
|
38
49
|
};
|
|
39
50
|
|
|
40
51
|
/**
|
|
@@ -36,6 +36,14 @@ export const GET: APIRoute = async ({ params, locals }) => {
|
|
|
36
36
|
return apiError("NOT_FOUND", "File not found", 404);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
// Backup archives share the storage bucket but hold the site's full
|
|
40
|
+
// content export — they must never be reachable through the public,
|
|
41
|
+
// unauthenticated media route. Admins download them via the
|
|
42
|
+
// authenticated backups API.
|
|
43
|
+
if (key.startsWith("backups/")) {
|
|
44
|
+
return apiError("NOT_FOUND", "File not found", 404);
|
|
45
|
+
}
|
|
46
|
+
|
|
39
47
|
if (!emdash?.storage) {
|
|
40
48
|
return apiError("NOT_CONFIGURED", "Storage not configured", 500);
|
|
41
49
|
}
|
|
@@ -10,9 +10,10 @@ import * as path from "node:path";
|
|
|
10
10
|
import type { APIRoute } from "astro";
|
|
11
11
|
import { ulid } from "ulidx";
|
|
12
12
|
|
|
13
|
-
import { requirePerm } from "#api/authorize.js";
|
|
13
|
+
import { canReadMediaUsageCount, requirePerm } from "#api/authorize.js";
|
|
14
14
|
import { apiError, apiSuccess, handleError, unwrapResult } from "#api/error.js";
|
|
15
15
|
import { GLOBAL_UPLOAD_ALLOWLIST, resolveFieldAllowlist } from "#api/handlers/media-allowlist.js";
|
|
16
|
+
import { handleMediaUsageSummaries } from "#api/handlers/media-usage.js";
|
|
16
17
|
import { isParseError, parseQuery } from "#api/parse.js";
|
|
17
18
|
import { DEFAULT_MAX_UPLOAD_SIZE, formatFileSize, mediaListQuery } from "#api/schemas.js";
|
|
18
19
|
import { MediaRepository } from "#db/repositories/media.js";
|
|
@@ -65,8 +66,26 @@ export const GET: APIRoute = async ({ request, locals }) => {
|
|
|
65
66
|
|
|
66
67
|
// Add URL to each media item (relative URLs for portability)
|
|
67
68
|
const itemsWithUrl = result.data.items.map((item) => addUrlToMedia(item));
|
|
69
|
+
if (query.includeUsage !== "1") {
|
|
70
|
+
return apiSuccess({ items: itemsWithUrl, nextCursor: result.data.nextCursor });
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const includeCount = canReadMediaUsageCount(user, locals.tokenScopes);
|
|
74
|
+
const usageResult = await handleMediaUsageSummaries(
|
|
75
|
+
emdash.db,
|
|
76
|
+
itemsWithUrl.map((item) => item.id),
|
|
77
|
+
{ includeCount },
|
|
78
|
+
);
|
|
79
|
+
if (!usageResult.success) return unwrapResult(usageResult);
|
|
80
|
+
|
|
81
|
+
const itemsWithUsage = [];
|
|
82
|
+
for (const item of itemsWithUrl) {
|
|
83
|
+
const usage = usageResult.data[item.id];
|
|
84
|
+
if (!usage) return apiError("MEDIA_USAGE_READ_ERROR", "Failed to read media usage", 500);
|
|
85
|
+
itemsWithUsage.push({ ...item, usage });
|
|
86
|
+
}
|
|
68
87
|
|
|
69
|
-
return apiSuccess({ items:
|
|
88
|
+
return apiSuccess({ items: itemsWithUsage, nextCursor: result.data.nextCursor });
|
|
70
89
|
};
|
|
71
90
|
|
|
72
91
|
/**
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
} from "#api/handlers/oauth-authorization.js";
|
|
24
24
|
import { lookupOAuthClient, validateClientRedirectUri } from "#api/handlers/oauth-clients.js";
|
|
25
25
|
import { getPublicOrigin } from "#api/public-url.js";
|
|
26
|
-
import {
|
|
26
|
+
import { isValidScope } from "#auth/api-tokens.js";
|
|
27
27
|
|
|
28
28
|
export const prerender = false;
|
|
29
29
|
|
|
@@ -69,11 +69,16 @@ function getCsrfCookie(request: Request): string | null {
|
|
|
69
69
|
|
|
70
70
|
const SCOPE_LABELS: Record<string, string> = {
|
|
71
71
|
"content:read": "Read content (posts, pages, etc.)",
|
|
72
|
-
"content:write": "Create, edit, and delete content",
|
|
72
|
+
"content:write": "Create, edit, and delete content; manage menus and taxonomies",
|
|
73
73
|
"media:read": "View media files",
|
|
74
74
|
"media:write": "Upload and manage media files",
|
|
75
75
|
"schema:read": "View collection schemas",
|
|
76
76
|
"schema:write": "Create and modify collection schemas",
|
|
77
|
+
"taxonomies:manage": "Manage taxonomies",
|
|
78
|
+
"menus:manage": "Manage navigation menus",
|
|
79
|
+
"settings:read": "View site settings",
|
|
80
|
+
"settings:manage": "Modify site settings",
|
|
81
|
+
"mcp:tools": "Use MCP tools from all enabled plugins",
|
|
77
82
|
admin: "Full administrative access",
|
|
78
83
|
};
|
|
79
84
|
|
|
@@ -141,11 +146,9 @@ export const GET: APIRoute = async ({ url, request, locals }) => {
|
|
|
141
146
|
}
|
|
142
147
|
|
|
143
148
|
// Parse and validate scopes
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
.filter(Boolean)
|
|
148
|
-
.filter((s) => validSet.has(s));
|
|
149
|
+
const requestedScopes = [
|
|
150
|
+
...new Set((scope ?? "").split(" ").filter(Boolean).filter(isValidScope)),
|
|
151
|
+
];
|
|
149
152
|
|
|
150
153
|
if (requestedScopes.length === 0) {
|
|
151
154
|
return new Response(renderErrorPage("No valid scopes requested."), {
|
|
@@ -205,6 +208,21 @@ export const POST: APIRoute = async ({ request, locals }) => {
|
|
|
205
208
|
const v = formData.get(name);
|
|
206
209
|
return typeof v === "string" ? v : fallback;
|
|
207
210
|
};
|
|
211
|
+
const requestedScopes = new Set(
|
|
212
|
+
(new URL(request.url).searchParams.get("scope") ?? "")
|
|
213
|
+
.split(" ")
|
|
214
|
+
.filter(Boolean)
|
|
215
|
+
.filter(isValidScope),
|
|
216
|
+
);
|
|
217
|
+
const selectedScopes = [
|
|
218
|
+
...new Set(
|
|
219
|
+
formData
|
|
220
|
+
.getAll("scope")
|
|
221
|
+
.filter((value): value is string => typeof value === "string")
|
|
222
|
+
.filter(isValidScope)
|
|
223
|
+
.filter((scope) => requestedScopes.has(scope)),
|
|
224
|
+
),
|
|
225
|
+
];
|
|
208
226
|
|
|
209
227
|
// SEC-18: Validate CSRF token (double-submit cookie pattern).
|
|
210
228
|
// The form includes a hidden csrf_token field; the cookie has the same value.
|
|
@@ -289,7 +307,7 @@ export const POST: APIRoute = async ({ request, locals }) => {
|
|
|
289
307
|
response_type: field("response_type", "code"),
|
|
290
308
|
client_id: field("client_id"),
|
|
291
309
|
redirect_uri: redirectUri,
|
|
292
|
-
scope:
|
|
310
|
+
scope: selectedScopes.join(" "),
|
|
293
311
|
state,
|
|
294
312
|
code_challenge: field("code_challenge"),
|
|
295
313
|
code_challenge_method: field("code_challenge_method", "S256"),
|
|
@@ -298,12 +316,16 @@ export const POST: APIRoute = async ({ request, locals }) => {
|
|
|
298
316
|
|
|
299
317
|
if (!result.success) {
|
|
300
318
|
const errMsg = result.error?.message ?? "Authorization failed";
|
|
319
|
+
const invalidScope = result.error?.code === "INVALID_SCOPE";
|
|
301
320
|
// On error, redirect back with error params — use generic description to avoid
|
|
302
321
|
// leaking internal error details to the (already-validated) redirect target
|
|
303
322
|
try {
|
|
304
323
|
const errorUrl = new URL(redirectUri);
|
|
305
|
-
errorUrl.searchParams.set("error", "server_error");
|
|
306
|
-
errorUrl.searchParams.set(
|
|
324
|
+
errorUrl.searchParams.set("error", invalidScope ? "invalid_scope" : "server_error");
|
|
325
|
+
errorUrl.searchParams.set(
|
|
326
|
+
"error_description",
|
|
327
|
+
invalidScope ? "No selected permission can be granted" : "Authorization failed",
|
|
328
|
+
);
|
|
307
329
|
if (state) errorUrl.searchParams.set("state", state);
|
|
308
330
|
return Response.redirect(errorUrl.toString(), 302);
|
|
309
331
|
} catch {
|
|
@@ -335,8 +357,8 @@ function renderConsentPage(params: {
|
|
|
335
357
|
}): string {
|
|
336
358
|
const scopeList = params.scopes
|
|
337
359
|
.map((s) => {
|
|
338
|
-
const label = SCOPE_LABELS[s] ?? s;
|
|
339
|
-
return `<li>${escapeHtml(label)}</li>`;
|
|
360
|
+
const label = SCOPE_LABELS[s] ?? getPluginScopeLabel(s) ?? s;
|
|
361
|
+
return `<li><label><input type="checkbox" name="scope" value="${escapeHtml(s)}" checked><span>${escapeHtml(label)}</span></label></li>`;
|
|
340
362
|
})
|
|
341
363
|
.join("\n");
|
|
342
364
|
|
|
@@ -357,6 +379,8 @@ function renderConsentPage(params: {
|
|
|
357
379
|
ul { list-style: none; margin-bottom: 1.5rem; }
|
|
358
380
|
li { padding: 0.5rem 0; border-bottom: 1px solid #262626; font-size: 0.875rem; }
|
|
359
381
|
li:last-child { border-bottom: none; }
|
|
382
|
+
label { display: flex; align-items: flex-start; gap: 0.625rem; cursor: pointer; }
|
|
383
|
+
input[type="checkbox"] { margin-top: 0.125rem; accent-color: #2563eb; }
|
|
360
384
|
.actions { display: flex; gap: 0.75rem; }
|
|
361
385
|
button { flex: 1; padding: 0.625rem 1rem; border-radius: 8px; border: none; font-size: 0.875rem; font-weight: 500; cursor: pointer; }
|
|
362
386
|
.approve { background: #2563eb; color: white; }
|
|
@@ -370,14 +394,13 @@ function renderConsentPage(params: {
|
|
|
370
394
|
<h1>Authorize Application</h1>
|
|
371
395
|
<p class="client-id">${escapeHtml(params.clientId)}</p>
|
|
372
396
|
<p class="user">Signed in as <strong>${escapeHtml(params.userName)}</strong></p>
|
|
373
|
-
<h2>Permissions requested</h2>
|
|
374
|
-
<ul>${scopeList}</ul>
|
|
375
397
|
<form method="POST">
|
|
398
|
+
<h2>Permissions requested</h2>
|
|
399
|
+
<ul>${scopeList}</ul>
|
|
376
400
|
<input type="hidden" name="csrf_token" value="${escapeHtml(params.csrfToken)}">
|
|
377
401
|
<input type="hidden" name="response_type" value="${escapeHtml(params.responseType)}">
|
|
378
402
|
<input type="hidden" name="client_id" value="${escapeHtml(params.clientId)}">
|
|
379
403
|
<input type="hidden" name="redirect_uri" value="${escapeHtml(params.redirectUri)}">
|
|
380
|
-
<input type="hidden" name="scope" value="${escapeHtml(params.scopes.join(" "))}">
|
|
381
404
|
<input type="hidden" name="state" value="${escapeHtml(params.state)}">
|
|
382
405
|
<input type="hidden" name="code_challenge" value="${escapeHtml(params.codeChallenge)}">
|
|
383
406
|
<input type="hidden" name="code_challenge_method" value="${escapeHtml(params.codeChallengeMethod)}">
|
|
@@ -392,6 +415,11 @@ function renderConsentPage(params: {
|
|
|
392
415
|
</html>`;
|
|
393
416
|
}
|
|
394
417
|
|
|
418
|
+
function getPluginScopeLabel(scope: string): string | null {
|
|
419
|
+
const pluginId = scope.startsWith("mcp:tools:") ? scope.slice("mcp:tools:".length) : "";
|
|
420
|
+
return pluginId ? `Use MCP tools from ${pluginId}` : null;
|
|
421
|
+
}
|
|
422
|
+
|
|
395
423
|
function renderErrorPage(message: string): string {
|
|
396
424
|
return `<!DOCTYPE html>
|
|
397
425
|
<html lang="en">
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* Private routes (the default) require authentication and appropriate permissions.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import { Permissions, type Permission } from "@emdash-cms/auth";
|
|
12
13
|
import type { APIRoute } from "astro";
|
|
13
14
|
|
|
14
15
|
import { requirePerm } from "#api/authorize.js";
|
|
@@ -47,8 +48,13 @@ const handleRequest: APIRoute = async ({ params, request, locals }) => {
|
|
|
47
48
|
// since HEAD is CORS-safe) invoke a mutating admin route by choosing the
|
|
48
49
|
// method (#1853). Astro also dispatches HEAD to the GET export, so no
|
|
49
50
|
// explicit HEAD handler is needed to reach a "GET" route. Gate every
|
|
50
|
-
// private invocation on
|
|
51
|
-
|
|
51
|
+
// private invocation on the route's declared permission (defaulting to
|
|
52
|
+
// `plugins:manage`) + CSRF regardless of method.
|
|
53
|
+
const permission = routeMeta.permission ?? "plugins:manage";
|
|
54
|
+
if (!(permission in Permissions)) {
|
|
55
|
+
return apiError("INVALID_PLUGIN_ROUTE", "Plugin route declares an invalid permission", 500);
|
|
56
|
+
}
|
|
57
|
+
const denied = requirePerm(user, permission as Permission);
|
|
52
58
|
if (denied) return denied;
|
|
53
59
|
|
|
54
60
|
// Token scope enforcement — plugin routes require "admin" scope.
|
|
@@ -83,7 +89,15 @@ const handleRequest: APIRoute = async ({ params, request, locals }) => {
|
|
|
83
89
|
return apiError(code, message, status);
|
|
84
90
|
}
|
|
85
91
|
|
|
86
|
-
|
|
92
|
+
const response = apiSuccess(result.data);
|
|
93
|
+
// Public routes may opt in to CDN/browser caching for GET responses.
|
|
94
|
+
// getRouteMeta only ever exposes cacheControl on public routes, and errors
|
|
95
|
+
// above keep the default private, no-store. Astro serves HEAD via this GET
|
|
96
|
+
// export, which is fine: same headers, no body.
|
|
97
|
+
if (routeMeta.cacheControl && (method === "GET" || method === "HEAD")) {
|
|
98
|
+
response.headers.set("Cache-Control", routeMeta.cacheControl);
|
|
99
|
+
}
|
|
100
|
+
return response;
|
|
87
101
|
};
|
|
88
102
|
|
|
89
103
|
// Export handlers for all HTTP methods
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backup archives — download / delete
|
|
3
|
+
*
|
|
4
|
+
* GET /_emdash/api/settings/backups/archives/:name — download an archive.
|
|
5
|
+
* DELETE /_emdash/api/settings/backups/archives/:name — delete an archive.
|
|
6
|
+
*
|
|
7
|
+
* `name` is validated against the strict archive-filename pattern before it
|
|
8
|
+
* touches a storage key, so path traversal into other prefixes is impossible.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { APIRoute } from "astro";
|
|
12
|
+
|
|
13
|
+
import { requirePerm } from "#api/authorize.js";
|
|
14
|
+
import { apiError, handleError, unwrapResult } from "#api/error.js";
|
|
15
|
+
import { ErrorCode } from "#api/errors.js";
|
|
16
|
+
import {
|
|
17
|
+
BACKUP_STORAGE_PREFIX,
|
|
18
|
+
deleteBackupArchive,
|
|
19
|
+
isValidArchiveName,
|
|
20
|
+
} from "#api/handlers/backup.js";
|
|
21
|
+
|
|
22
|
+
export const prerender = false;
|
|
23
|
+
|
|
24
|
+
export const GET: APIRoute = async ({ params, locals }) => {
|
|
25
|
+
const { emdash, user } = locals;
|
|
26
|
+
const name = params.name ?? "";
|
|
27
|
+
|
|
28
|
+
if (!emdash?.db) {
|
|
29
|
+
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const denied = requirePerm(user, "backups:manage");
|
|
33
|
+
if (denied) return denied;
|
|
34
|
+
|
|
35
|
+
if (!emdash.storage) {
|
|
36
|
+
return apiError("STORAGE_NOT_CONFIGURED", "No storage backend is configured", 503);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (!isValidArchiveName(name)) {
|
|
40
|
+
return apiError("VALIDATION_ERROR", "Invalid archive name", 400);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
const result = await emdash.storage.download(`${BACKUP_STORAGE_PREFIX}${name}`);
|
|
45
|
+
return new Response(result.body, {
|
|
46
|
+
status: 200,
|
|
47
|
+
headers: {
|
|
48
|
+
"Content-Type": "application/json",
|
|
49
|
+
"Content-Disposition": `attachment; filename="${name}"`,
|
|
50
|
+
"Cache-Control": "private, no-store",
|
|
51
|
+
"X-Content-Type-Options": "nosniff",
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
} catch (error) {
|
|
55
|
+
if (error instanceof Error && error.message.toLowerCase().includes("not found")) {
|
|
56
|
+
return apiError("NOT_FOUND", "Archive not found", 404);
|
|
57
|
+
}
|
|
58
|
+
return handleError(error, "Failed to download archive", ErrorCode.BACKUP_DOWNLOAD_ERROR);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export const DELETE: APIRoute = async ({ params, locals }) => {
|
|
63
|
+
const { emdash, user } = locals;
|
|
64
|
+
const name = params.name ?? "";
|
|
65
|
+
|
|
66
|
+
if (!emdash?.db) {
|
|
67
|
+
return apiError("NOT_CONFIGURED", "EmDash is not initialized", 500);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const denied = requirePerm(user, "backups:manage");
|
|
71
|
+
if (denied) return denied;
|
|
72
|
+
|
|
73
|
+
if (!emdash.storage) {
|
|
74
|
+
return apiError("STORAGE_NOT_CONFIGURED", "No storage backend is configured", 503);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return unwrapResult(await deleteBackupArchive(emdash.storage, name));
|
|
78
|
+
};
|