emdash 0.29.0 → 0.30.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-b8WIiGU4.mjs} +253 -153
- package/dist/api-b8WIiGU4.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-CmIJK9j8.mjs} +34 -37
- package/dist/apply-CmIJK9j8.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 +326 -110
- 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 +15 -14
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +16 -21
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +15 -14
- 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 +40 -39
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +40 -39
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +45 -39
- 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 +39 -38
- 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 +42 -39
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +45 -39
- 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 +39 -38
- 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 +45 -40
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +39 -38
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +39 -38
- 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 +43 -40
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +39 -38
- 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 +44 -41
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +40 -39
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +39 -38
- 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 +39 -38
- 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 +13 -12
- 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 +18 -17
- 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 +12 -12
- 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 +23 -22
- 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 +7 -8
- 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 +39 -38
- 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 +39 -38
- 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 +39 -38
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +39 -38
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +39 -38
- 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 +39 -38
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +39 -38
- 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 +14 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +14 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +14 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +14 -13
- 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 +9 -9
- 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-WxsiePzy.mjs} +7 -4
- package/dist/authorize-WxsiePzy.mjs.map +1 -0
- package/dist/backup-S8kFWtwD.mjs +241 -0
- package/dist/backup-S8kFWtwD.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-XEjchwzZ.mjs} +6 -6
- package/dist/{byline-BWb5H-65.mjs.map → byline-XEjchwzZ.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-BGuKFaBy.mjs → bylines-BJbT4gKS.mjs} +4 -4
- package/dist/{bylines-BGuKFaBy.mjs.map → bylines-BJbT4gKS.mjs.map} +1 -1
- package/dist/{bylines-CHojDMpj.mjs → bylines-czseViYo.mjs} +6 -6
- package/dist/{bylines-CHojDMpj.mjs.map → bylines-czseViYo.mjs.map} +1 -1
- package/dist/{cache-BeR7RfN8.mjs → cache-CGCd6AVM.mjs} +2 -2
- package/dist/{cache-BeR7RfN8.mjs.map → cache-CGCd6AVM.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-BxXyunY-.mjs} +2 -2
- package/dist/{chunks-BU5_nrAC.mjs.map → chunks-BxXyunY-.mjs.map} +1 -1
- package/dist/cli/index.mjs +138 -31
- 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-DPT0WKyd.mjs} +2 -2
- package/dist/{comment-SWh31kS0.mjs.map → comment-DPT0WKyd.mjs.map} +1 -1
- package/dist/{comment-reaction-DgcpziXI.mjs → comment-reaction-C65MldIB.mjs} +2 -2
- package/dist/{comment-reaction-DgcpziXI.mjs.map → comment-reaction-C65MldIB.mjs.map} +1 -1
- package/dist/{comments-kZYGppMS.mjs → comments-Bz6sCbgD.mjs} +3 -3
- package/dist/{comments-kZYGppMS.mjs.map → comments-Bz6sCbgD.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/{content-BO61Sx4j.mjs → content-Ci04z2z-.mjs} +53 -19
- package/dist/content-Ci04z2z-.mjs.map +1 -0
- package/dist/{content-refresh-BkkApzeS.mjs → content-refresh-D4khvC0R.mjs} +95 -3
- package/dist/content-refresh-D4khvC0R.mjs.map +1 -0
- package/dist/{context-DtSFYFuS.mjs → context-B6hc7zJL.mjs} +97 -74
- package/dist/context-B6hc7zJL.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-C5NkXFbi.mjs} +4 -4
- package/dist/{dashboard-xo_gPs_D.mjs.map → dashboard-C5NkXFbi.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-HxEQGl_1.mjs} +57 -11
- package/dist/{dialect-helpers-Cue7QQOR.mjs.map → dialect-helpers-HxEQGl_1.mjs.map} +1 -1
- 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-CEGF6UZb.mjs +90 -0
- package/dist/error-CEGF6UZb.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-DvmlgP-D.mjs} +2 -2
- package/dist/{field-defs-cache-BVrNCgSj.mjs.map → field-defs-cache-DvmlgP-D.mjs.map} +1 -1
- package/dist/{fts-manager-BD9s77qh.mjs → fts-manager-DzqIBrrW.mjs} +3 -3
- package/dist/{fts-manager-BD9s77qh.mjs.map → fts-manager-DzqIBrrW.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-db2Tpb2o.mjs} +5 -5
- package/dist/{hreflang-pAWUiPd_.mjs.map → hreflang-db2Tpb2o.mjs.map} +1 -1
- package/dist/{import-2jHtLzsO.mjs → import-Dmkm8S1W.mjs} +4 -4
- package/dist/{import-2jHtLzsO.mjs.map → import-Dmkm8S1W.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-wYnC6u4o.d.mts} +780 -15
- package/dist/index-wYnC6u4o.d.mts.map +1 -0
- package/dist/index.d.mts +18 -19
- package/dist/index.mjs +59 -58
- package/dist/{load-DgoWMdRX.mjs → load-Cx27ki1l.mjs} +2 -2
- package/dist/{load-DgoWMdRX.mjs.map → load-Cx27ki1l.mjs.map} +1 -1
- package/dist/{loader-Rb8QlGZp.mjs → loader-Be3ouI5L.mjs} +170 -6
- package/dist/loader-Be3ouI5L.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-D2ZFowpn.mjs → media-BjhhENaJ.mjs} +2 -2
- package/dist/{media-D2ZFowpn.mjs.map → media-BjhhENaJ.mjs.map} +1 -1
- 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-kIV1IxFf.mjs +243 -0
- package/dist/media-kIV1IxFf.mjs.map +1 -0
- package/dist/media-upload-D2wk3EIt.mjs +145 -0
- package/dist/media-upload-D2wk3EIt.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-CljdO1mc.mjs} +138 -5
- package/dist/{media-usage-B__v9NMm.mjs.map → media-usage-CljdO1mc.mjs.map} +1 -1
- package/dist/{menus-BtvH7Z7t.mjs → menus-BcyElFtI.mjs} +155 -12
- package/dist/menus-BcyElFtI.mjs.map +1 -0
- package/dist/{menus-BpfevlJD.mjs → menus-CZyG6rvx.mjs} +2 -2
- package/dist/{menus-BpfevlJD.mjs.map → menus-CZyG6rvx.mjs.map} +1 -1
- 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-C_-6klII.mjs} +4 -12
- package/dist/{parse-GLksnn-B.mjs.map → parse-C_-6klII.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-DR73ZNfm.mjs} +14 -14
- package/dist/{query-ZzvXyxWq.mjs.map → query-DR73ZNfm.mjs.map} +1 -1
- package/dist/{query-BxT95opY.mjs → query-Di7DOmPV.mjs} +3 -3
- package/dist/{query-BxT95opY.mjs.map → query-Di7DOmPV.mjs.map} +1 -1
- package/dist/{rate-limit-Cg4Rvc_-.mjs → rate-limit-CMj83JNW.mjs} +2 -2
- package/dist/{rate-limit-Cg4Rvc_-.mjs.map → rate-limit-CMj83JNW.mjs.map} +1 -1
- 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/{redirect-Ch3E98qZ.mjs → redirect-CgLPYflR.mjs} +10 -4
- package/dist/redirect-CgLPYflR.mjs.map +1 -0
- package/dist/{redirects-CXmVGRNZ.mjs → redirects-B7t9bKsL.mjs} +4 -4
- package/dist/{redirects-CXmVGRNZ.mjs.map → redirects-B7t9bKsL.mjs.map} +1 -1
- package/dist/{redirects-CeD7K7EX.mjs → redirects-BBq3n2Rj.mjs} +4 -175
- package/dist/redirects-BBq3n2Rj.mjs.map +1 -0
- package/dist/{registry-CyIXPi4E.mjs → registry-FV15nLge.mjs} +97 -8
- package/dist/registry-FV15nLge.mjs.map +1 -0
- package/dist/{relation-Ba68Tm4Z.mjs → relation-9M9j_UWo.mjs} +3 -3
- package/dist/{relation-Ba68Tm4Z.mjs.map → relation-9M9j_UWo.mjs.map} +1 -1
- package/dist/{relations-BmBmX4Eb.mjs → relations-5_avdrN_.mjs} +2 -2
- package/dist/{relations-BmBmX4Eb.mjs.map → relations-5_avdrN_.mjs.map} +1 -1
- package/dist/{relations-C8hVyEy0.mjs → relations-BKvO39-9.mjs} +5 -5
- package/dist/{relations-C8hVyEy0.mjs.map → relations-BKvO39-9.mjs.map} +1 -1
- package/dist/{relations-CbBpoOys.d.mts → relations-Bh8jlFsU.d.mts} +306 -4
- package/dist/relations-Bh8jlFsU.d.mts.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/{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/{runner-jt65bF7F.mjs → runner-DfnZ5eUr.mjs} +333 -199
- package/dist/runner-DfnZ5eUr.mjs.map +1 -0
- 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-BXxlHeAf.mjs} +3 -3
- package/dist/{schema-DwjufZ1S.mjs.map → schema-BXxlHeAf.mjs.map} +1 -1
- package/dist/scopes-Bl4IwHA-.mjs +27 -0
- package/dist/scopes-Bl4IwHA-.mjs.map +1 -0
- package/dist/{search-Cl875CVE.mjs → search-Bff-7jFt.mjs} +5 -5
- package/dist/{search-Cl875CVE.mjs.map → search-Bff-7jFt.mjs.map} +1 -1
- package/dist/{secrets-CO_bEmII.mjs → secrets-CSwQIl4q.mjs} +3 -3
- package/dist/{secrets-CO_bEmII.mjs.map → secrets-CSwQIl4q.mjs.map} +1 -1
- package/dist/{sections-DTKzgoiS.mjs → sections-CwW4s1al.mjs} +3 -3
- package/dist/{sections-DTKzgoiS.mjs.map → sections-CwW4s1al.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 +16 -16
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-BLm6SXzS.mjs → seo-2cmFHZns.mjs} +2 -2
- package/dist/{seo-BLm6SXzS.mjs.map → seo-2cmFHZns.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/{service-D6zDmKXy.mjs → service-DkGTWGIi.mjs} +3 -3
- package/dist/{service-D6zDmKXy.mjs.map → service-DkGTWGIi.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-CmS3TwXf.mjs → settings-C4s8hFQm.mjs} +3 -3
- package/dist/{settings-CmS3TwXf.mjs.map → settings-C4s8hFQm.mjs.map} +1 -1
- package/dist/{settings-BuQYvLfy.mjs → settings-CpA4lQFt.mjs} +4 -4
- package/dist/{settings-BuQYvLfy.mjs.map → settings-CpA4lQFt.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-ClS4RKaZ.mjs → taxonomies-Ce49uIzY.mjs} +4 -4
- package/dist/{taxonomies-ClS4RKaZ.mjs.map → taxonomies-Ce49uIzY.mjs.map} +1 -1
- package/dist/{taxonomies-pUkuD6nj.mjs → taxonomies-DjSKBZpq.mjs} +7 -7
- package/dist/{taxonomies-pUkuD6nj.mjs.map → taxonomies-DjSKBZpq.mjs.map} +1 -1
- package/dist/{taxonomy-BkxbUMSw.mjs → taxonomy-DfVooU4W.mjs} +51 -13
- package/dist/taxonomy-DfVooU4W.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-D1iJ3DpO.mjs} +3 -3
- package/dist/{types-Ch8pFMEm.mjs.map → types-D1iJ3DpO.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-Bh-L1qo6.mjs} +3 -3
- package/dist/{user-DTxX_Fha.mjs.map → user-Bh-L1qo6.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-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/{validate-C3CpWlNt.mjs → validate-V9nCwq_-.mjs} +2 -2
- package/dist/{validate-C3CpWlNt.mjs.map → validate-V9nCwq_-.mjs.map} +1 -1
- package/dist/{validation-DM2K_NJC.mjs → validation-BsVUJfsP.mjs} +10 -10
- package/dist/{validation-DM2K_NJC.mjs.map → validation-BsVUJfsP.mjs.map} +1 -1
- package/dist/version-907opKac.mjs +7 -0
- package/dist/{version-BlIJvNAZ.mjs.map → version-907opKac.mjs.map} +1 -1
- package/dist/{widgets-B_X6_UXJ.mjs → widgets-DGv1Z04V.mjs} +3 -3
- package/dist/{widgets-B_X6_UXJ.mjs.map → widgets-DGv1Z04V.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-Cs1N6O8z.mjs} +3 -3
- package/dist/{wxr-taxonomies-oNJB2S81.mjs.map → wxr-taxonomies-Cs1N6O8z.mjs.map} +1 -1
- package/dist/{zod-generator-CrfV79De.mjs → zod-generator-B5prQ5M4.mjs} +2 -2
- package/dist/{zod-generator-CrfV79De.mjs.map → zod-generator-B5prQ5M4.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/content.ts +36 -2
- 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/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/snapshot.ts +21 -3
- 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/common.ts +6 -2
- package/src/api/schemas/media-usage.ts +72 -0
- package/src/api/schemas/media.ts +32 -1
- 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/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 +2 -6
- 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/InlinePortableTextEditor.tsx +56 -35
- package/src/components/marks/Link.astro +5 -1
- package/src/database/dialect-helpers.ts +77 -3
- 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/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 +310 -66
- 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/seed/apply.ts +28 -29
- 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/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/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-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-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/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/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
|
@@ -29,6 +29,8 @@ export interface PluginInfo {
|
|
|
29
29
|
hasAdminPages: boolean;
|
|
30
30
|
hasDashboardWidgets: boolean;
|
|
31
31
|
hasHooks: boolean;
|
|
32
|
+
/** True when the plugin declares `admin.settingsSchema` (auto-generated settings form) */
|
|
33
|
+
hasSettings: boolean;
|
|
32
34
|
installedAt?: string;
|
|
33
35
|
activatedAt?: string;
|
|
34
36
|
deactivatedAt?: string;
|
|
@@ -36,6 +38,14 @@ export interface PluginInfo {
|
|
|
36
38
|
description?: string;
|
|
37
39
|
/** URL to the plugin icon on the marketplace */
|
|
38
40
|
iconUrl?: string;
|
|
41
|
+
mcpToolsEnabled: boolean;
|
|
42
|
+
mcpTools: Array<{
|
|
43
|
+
name: string;
|
|
44
|
+
description: string;
|
|
45
|
+
route: string;
|
|
46
|
+
permission: string;
|
|
47
|
+
destructive: boolean;
|
|
48
|
+
}>;
|
|
39
49
|
}
|
|
40
50
|
|
|
41
51
|
export interface PluginListResponse {
|
|
@@ -78,12 +88,28 @@ function buildPluginInfo(
|
|
|
78
88
|
hasAdminPages: (plugin.admin.pages?.length ?? 0) > 0,
|
|
79
89
|
hasDashboardWidgets: (plugin.admin.widgets?.length ?? 0) > 0,
|
|
80
90
|
hasHooks: Object.keys(plugin.hooks ?? {}).length > 0,
|
|
91
|
+
hasSettings: Object.keys(plugin.admin.settingsSchema ?? {}).length > 0,
|
|
81
92
|
installedAt: state?.installedAt?.toISOString(),
|
|
82
93
|
activatedAt: state?.activatedAt?.toISOString() ?? undefined,
|
|
83
94
|
deactivatedAt: state?.deactivatedAt?.toISOString() ?? undefined,
|
|
84
95
|
description: state?.description ?? undefined,
|
|
85
96
|
iconUrl:
|
|
86
97
|
isMarketplace && marketplaceUrl ? marketplaceIconUrl(marketplaceUrl, plugin.id) : undefined,
|
|
98
|
+
mcpToolsEnabled: state?.mcpToolsEnabled ?? false,
|
|
99
|
+
mcpTools: Object.entries(plugin.mcp?.tools ?? {}).flatMap(([name, tool]) => {
|
|
100
|
+
const permission = plugin.routes[tool.route]?.permission;
|
|
101
|
+
return permission
|
|
102
|
+
? [
|
|
103
|
+
{
|
|
104
|
+
name,
|
|
105
|
+
description: tool.description,
|
|
106
|
+
route: tool.route,
|
|
107
|
+
permission,
|
|
108
|
+
destructive: tool.destructive ?? false,
|
|
109
|
+
},
|
|
110
|
+
]
|
|
111
|
+
: [];
|
|
112
|
+
}),
|
|
87
113
|
};
|
|
88
114
|
}
|
|
89
115
|
|
|
@@ -110,10 +136,13 @@ function buildSandboxedPluginInfo(
|
|
|
110
136
|
hasAdminPages: (entry.adminPages?.length ?? 0) > 0,
|
|
111
137
|
hasDashboardWidgets: (entry.adminWidgets?.length ?? 0) > 0,
|
|
112
138
|
hasHooks: false,
|
|
139
|
+
hasSettings: Object.keys(entry.settingsSchema ?? {}).length > 0,
|
|
113
140
|
installedAt: state?.installedAt?.toISOString(),
|
|
114
141
|
activatedAt: state?.activatedAt?.toISOString() ?? undefined,
|
|
115
142
|
deactivatedAt: state?.deactivatedAt?.toISOString() ?? undefined,
|
|
116
143
|
description: state?.description ?? undefined,
|
|
144
|
+
mcpToolsEnabled: state?.mcpToolsEnabled ?? false,
|
|
145
|
+
mcpTools: entry.mcp?.tools.map(({ inputSchema: _, outputSchema: __, ...tool }) => tool) ?? [],
|
|
117
146
|
};
|
|
118
147
|
}
|
|
119
148
|
|
|
@@ -125,6 +154,12 @@ export async function handlePluginList(
|
|
|
125
154
|
configuredPlugins: ResolvedPlugin[],
|
|
126
155
|
sandboxedPluginEntries: SandboxedPluginEntry[],
|
|
127
156
|
marketplaceUrl?: string,
|
|
157
|
+
/**
|
|
158
|
+
* Settings-schema lookup for runtime-installed (marketplace/registry)
|
|
159
|
+
* plugins, which aren't in either build-time list. Typically
|
|
160
|
+
* `EmDashRuntime.getRuntimePluginSettingsSchema`.
|
|
161
|
+
*/
|
|
162
|
+
runtimeSettingsSchemaLookup?: (pluginId: string) => Record<string, unknown> | null,
|
|
128
163
|
): Promise<ApiResult<PluginListResponse>> {
|
|
129
164
|
try {
|
|
130
165
|
const stateRepo = new PluginStateRepository(db);
|
|
@@ -166,6 +201,7 @@ export async function handlePluginList(
|
|
|
166
201
|
hasAdminPages: false,
|
|
167
202
|
hasDashboardWidgets: false,
|
|
168
203
|
hasHooks: false,
|
|
204
|
+
hasSettings: Object.keys(runtimeSettingsSchemaLookup?.(state.pluginId) ?? {}).length > 0,
|
|
169
205
|
installedAt: state.installedAt?.toISOString(),
|
|
170
206
|
activatedAt: state.activatedAt?.toISOString() ?? undefined,
|
|
171
207
|
deactivatedAt: state.deactivatedAt?.toISOString() ?? undefined,
|
|
@@ -174,6 +210,8 @@ export async function handlePluginList(
|
|
|
174
210
|
state.source === "marketplace" && marketplaceUrl
|
|
175
211
|
? marketplaceIconUrl(marketplaceUrl, state.pluginId)
|
|
176
212
|
: undefined,
|
|
213
|
+
mcpToolsEnabled: state.mcpToolsEnabled,
|
|
214
|
+
mcpTools: [],
|
|
177
215
|
});
|
|
178
216
|
}
|
|
179
217
|
|
|
@@ -266,10 +304,13 @@ function buildStateOnlyPluginInfo(
|
|
|
266
304
|
hasAdminPages: false,
|
|
267
305
|
hasDashboardWidgets: false,
|
|
268
306
|
hasHooks: false,
|
|
307
|
+
hasSettings: false,
|
|
269
308
|
installedAt: state.installedAt?.toISOString(),
|
|
270
309
|
activatedAt: state.activatedAt?.toISOString() ?? undefined,
|
|
271
310
|
deactivatedAt: state.deactivatedAt?.toISOString() ?? undefined,
|
|
272
311
|
description: state.description ?? undefined,
|
|
312
|
+
mcpToolsEnabled: state.mcpToolsEnabled,
|
|
313
|
+
mcpTools: [],
|
|
273
314
|
};
|
|
274
315
|
}
|
|
275
316
|
|
|
@@ -121,6 +121,7 @@ export interface RegistryInstallInput {
|
|
|
121
121
|
* surface a consent UI before posting (e.g. CI scripts) opt out.
|
|
122
122
|
*/
|
|
123
123
|
acknowledgedDeclaredAccess?: unknown;
|
|
124
|
+
acknowledgedMcpTools?: unknown;
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
export interface RegistryInstallResult {
|
|
@@ -1098,6 +1099,22 @@ export async function handleRegistryInstall(
|
|
|
1098
1099
|
}
|
|
1099
1100
|
}
|
|
1100
1101
|
|
|
1102
|
+
const actualMcpTools = (bundle.manifest.mcp?.tools ?? []).map(
|
|
1103
|
+
({ inputSchema: _, outputSchema: __, ...tool }) => tool,
|
|
1104
|
+
);
|
|
1105
|
+
if (actualMcpTools.length > 0) {
|
|
1106
|
+
if (JSON.stringify(input.acknowledgedMcpTools) !== JSON.stringify(actualMcpTools)) {
|
|
1107
|
+
return {
|
|
1108
|
+
success: false,
|
|
1109
|
+
error: {
|
|
1110
|
+
code: "MCP_TOOL_CONSENT_REQUIRED",
|
|
1111
|
+
message: "Plugin MCP tools require explicit consent",
|
|
1112
|
+
details: { mcpTools: actualMcpTools },
|
|
1113
|
+
},
|
|
1114
|
+
};
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1101
1118
|
// Step 7: store in R2 under the registry prefix.
|
|
1102
1119
|
await storeBundleInR2(storage, pluginId, version, bundle, "registry");
|
|
1103
1120
|
|
|
@@ -1318,6 +1335,7 @@ export async function handleRegistryUpdate(
|
|
|
1318
1335
|
version?: string;
|
|
1319
1336
|
confirmCapabilityChanges?: boolean;
|
|
1320
1337
|
confirmRouteVisibilityChanges?: boolean;
|
|
1338
|
+
confirmMcpTools?: boolean;
|
|
1321
1339
|
hostEnv?: HostEnv;
|
|
1322
1340
|
},
|
|
1323
1341
|
): Promise<ApiResult<RegistryUpdateResult>> {
|
|
@@ -1590,6 +1608,25 @@ export async function handleRegistryUpdate(
|
|
|
1590
1608
|
};
|
|
1591
1609
|
}
|
|
1592
1610
|
|
|
1611
|
+
const oldMcpTools = [...(oldBundle?.manifest.mcp?.tools ?? [])].toSorted((a, b) =>
|
|
1612
|
+
a.name.localeCompare(b.name),
|
|
1613
|
+
);
|
|
1614
|
+
const newMcpTools = [...(bundle.manifest.mcp?.tools ?? [])].toSorted((a, b) =>
|
|
1615
|
+
a.name.localeCompare(b.name),
|
|
1616
|
+
);
|
|
1617
|
+
if (JSON.stringify(oldMcpTools) !== JSON.stringify(newMcpTools) && !opts?.confirmMcpTools) {
|
|
1618
|
+
return {
|
|
1619
|
+
success: false,
|
|
1620
|
+
error: {
|
|
1621
|
+
code: "MCP_TOOL_CONSENT_REQUIRED",
|
|
1622
|
+
message: "Plugin update changes its MCP tools",
|
|
1623
|
+
details: {
|
|
1624
|
+
mcpTools: newMcpTools.map(({ inputSchema: _, outputSchema: __, ...tool }) => tool),
|
|
1625
|
+
},
|
|
1626
|
+
},
|
|
1627
|
+
};
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1593
1630
|
// Store new bundle. R2 prefix is deterministic per (pluginId, version),
|
|
1594
1631
|
// so a retry of the same update is idempotent.
|
|
1595
1632
|
await storeBundleInR2(storage, pluginId, newVersion, bundle, "registry");
|
|
@@ -1605,6 +1642,8 @@ export async function handleRegistryUpdate(
|
|
|
1605
1642
|
registrySlug: slug,
|
|
1606
1643
|
displayName: existing.displayName ?? slug,
|
|
1607
1644
|
description: existing.description ?? undefined,
|
|
1645
|
+
mcpToolsEnabled: false,
|
|
1646
|
+
mcpToolsConsent: null,
|
|
1608
1647
|
});
|
|
1609
1648
|
|
|
1610
1649
|
// Best-effort cleanup of the old bundle. Failures here don't roll
|
|
@@ -218,10 +218,19 @@ interface ColumnInfo {
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
export interface GenerateSnapshotOptions {
|
|
221
|
-
/** Include draft and
|
|
221
|
+
/** Include draft and scheduled content (default: false) */
|
|
222
222
|
includeDrafts?: boolean;
|
|
223
|
+
/** Include trashed content (deleted_at set). Used by backups (default: false) */
|
|
224
|
+
includeTrashed?: boolean;
|
|
223
225
|
/** Origin URL for absolutizing local media URLs (e.g. "https://mysite.com") */
|
|
224
226
|
origin?: string;
|
|
227
|
+
/**
|
|
228
|
+
* Allowlist of options-table key prefixes to include (default:
|
|
229
|
+
* `SAFE_OPTIONS_PREFIXES`). Callers widening this must never include a
|
|
230
|
+
* prefix that matches secrets (`emdash:preview_secret`, `plugin:`,
|
|
231
|
+
* `emdash:passkey_pending:`) — the output may be user-downloadable.
|
|
232
|
+
*/
|
|
233
|
+
optionPrefixes?: string[];
|
|
225
234
|
}
|
|
226
235
|
|
|
227
236
|
/**
|
|
@@ -235,6 +244,8 @@ export async function generateSnapshot(
|
|
|
235
244
|
options?: GenerateSnapshotOptions,
|
|
236
245
|
): Promise<Snapshot> {
|
|
237
246
|
const includeDrafts = options?.includeDrafts ?? false;
|
|
247
|
+
const includeTrashed = options?.includeTrashed ?? false;
|
|
248
|
+
const optionPrefixes = options?.optionPrefixes ?? SAFE_OPTIONS_PREFIXES;
|
|
238
249
|
|
|
239
250
|
// Discover all ec_* content tables
|
|
240
251
|
const tableResult = await sql<{ name: string }>`
|
|
@@ -280,7 +291,14 @@ export async function generateSnapshot(
|
|
|
280
291
|
let rows: Record<string, unknown>[];
|
|
281
292
|
|
|
282
293
|
if (tableName.startsWith("ec_")) {
|
|
283
|
-
if (
|
|
294
|
+
if (includeTrashed) {
|
|
295
|
+
// Everything, including trash — full-fidelity backup export
|
|
296
|
+
rows = (
|
|
297
|
+
await sql<Record<string, unknown>>`
|
|
298
|
+
SELECT * FROM ${sql.raw(`"${tableName}"`)}
|
|
299
|
+
`.execute(db)
|
|
300
|
+
).rows;
|
|
301
|
+
} else if (includeDrafts) {
|
|
284
302
|
// Include all non-deleted content (published, draft, scheduled)
|
|
285
303
|
rows = (
|
|
286
304
|
await sql<Record<string, unknown>>`
|
|
@@ -307,7 +325,7 @@ export async function generateSnapshot(
|
|
|
307
325
|
`.execute(db)
|
|
308
326
|
).rows.filter((row) => {
|
|
309
327
|
const name = typeof row.name === "string" ? row.name : "";
|
|
310
|
-
return
|
|
328
|
+
return optionPrefixes.some((prefix) => name.startsWith(prefix));
|
|
311
329
|
});
|
|
312
330
|
} else {
|
|
313
331
|
rows = (
|
|
@@ -37,14 +37,22 @@ import {
|
|
|
37
37
|
contentUpdateBody,
|
|
38
38
|
trashedContentListResponseSchema,
|
|
39
39
|
} from "../schemas/content.js";
|
|
40
|
-
import {
|
|
40
|
+
import {
|
|
41
|
+
mediaUsageDetailsQuery,
|
|
42
|
+
mediaUsageDetailsResponseSchema,
|
|
43
|
+
mediaUsageRepairBody,
|
|
44
|
+
mediaUsageRepairResponseSchema,
|
|
45
|
+
} from "../schemas/media-usage.js";
|
|
41
46
|
import {
|
|
42
47
|
DEFAULT_MAX_UPLOAD_SIZE,
|
|
43
48
|
mediaConfirmBody,
|
|
44
49
|
mediaConfirmResponseSchema,
|
|
45
50
|
mediaExistingResponseSchema,
|
|
51
|
+
mediaGetQuery,
|
|
46
52
|
mediaListQuery,
|
|
53
|
+
mediaListReadResponseSchema,
|
|
47
54
|
mediaListResponseSchema,
|
|
55
|
+
mediaReadResponseSchema,
|
|
48
56
|
mediaResponseSchema,
|
|
49
57
|
mediaUpdateBody,
|
|
50
58
|
mediaUploadUrlBody,
|
|
@@ -661,15 +669,19 @@ function buildMediaPaths(maxUploadSize: number) {
|
|
|
661
669
|
get: {
|
|
662
670
|
operationId: "listMedia",
|
|
663
671
|
summary: "List media items",
|
|
672
|
+
description:
|
|
673
|
+
"Lists media items. Set `includeUsage=1` to attach coverage-aware advisory usage counts; a count may be null when the caller cannot read draft-derived usage.",
|
|
664
674
|
tags: ["Media"],
|
|
665
675
|
requestParams: { query: mediaListQuery },
|
|
666
676
|
responses: {
|
|
667
677
|
"200": {
|
|
668
678
|
description: "Media list",
|
|
669
|
-
content: {
|
|
679
|
+
content: {
|
|
680
|
+
[JSON_CONTENT]: { schema: successEnvelope(mediaListReadResponseSchema) },
|
|
681
|
+
},
|
|
670
682
|
},
|
|
671
683
|
...authErrors,
|
|
672
|
-
...standardErrors(500),
|
|
684
|
+
...standardErrors(400, 500),
|
|
673
685
|
},
|
|
674
686
|
},
|
|
675
687
|
},
|
|
@@ -677,17 +689,20 @@ function buildMediaPaths(maxUploadSize: number) {
|
|
|
677
689
|
get: {
|
|
678
690
|
operationId: "getMedia",
|
|
679
691
|
summary: "Get a media item",
|
|
692
|
+
description:
|
|
693
|
+
"Gets a media item. Set `includeUsage=1` to attach a coverage-aware advisory usage count; the count may be null when the caller cannot read draft-derived usage.",
|
|
680
694
|
tags: ["Media"],
|
|
681
695
|
requestParams: {
|
|
682
696
|
path: z.object({ id: z.string().meta({ description: "Media ID" }) }),
|
|
697
|
+
query: mediaGetQuery,
|
|
683
698
|
},
|
|
684
699
|
responses: {
|
|
685
700
|
"200": {
|
|
686
701
|
description: "Media item",
|
|
687
|
-
content: { [JSON_CONTENT]: { schema: successEnvelope(
|
|
702
|
+
content: { [JSON_CONTENT]: { schema: successEnvelope(mediaReadResponseSchema) } },
|
|
688
703
|
},
|
|
689
704
|
...authErrors,
|
|
690
|
-
...standardErrors(404, 500),
|
|
705
|
+
...standardErrors(400, 404, 500),
|
|
691
706
|
},
|
|
692
707
|
},
|
|
693
708
|
put: {
|
|
@@ -724,6 +739,29 @@ function buildMediaPaths(maxUploadSize: number) {
|
|
|
724
739
|
},
|
|
725
740
|
},
|
|
726
741
|
},
|
|
742
|
+
"/_emdash/api/media/{id}/usage": {
|
|
743
|
+
get: {
|
|
744
|
+
operationId: "getMediaUsage",
|
|
745
|
+
summary: "Get media usage details",
|
|
746
|
+
description:
|
|
747
|
+
"Returns paginated content entry groups whose current indexed sources reference a local media item. Results include aggregate coverage and are advisory during concurrent writes. Requires media read and draft-content read permission; token-authenticated callers also require admin scope.",
|
|
748
|
+
tags: ["Media"],
|
|
749
|
+
requestParams: {
|
|
750
|
+
path: z.object({ id: z.string().meta({ description: "Media ID" }) }),
|
|
751
|
+
query: mediaUsageDetailsQuery,
|
|
752
|
+
},
|
|
753
|
+
responses: {
|
|
754
|
+
"200": {
|
|
755
|
+
description: "Entry-grouped media usage details",
|
|
756
|
+
content: {
|
|
757
|
+
[JSON_CONTENT]: { schema: successEnvelope(mediaUsageDetailsResponseSchema) },
|
|
758
|
+
},
|
|
759
|
+
},
|
|
760
|
+
...authErrors,
|
|
761
|
+
...standardErrors(400, 404, 500),
|
|
762
|
+
},
|
|
763
|
+
},
|
|
764
|
+
},
|
|
727
765
|
"/_emdash/api/admin/media-usage/repair": {
|
|
728
766
|
post: {
|
|
729
767
|
operationId: "repairMediaUsage",
|
|
@@ -2351,7 +2389,7 @@ export function generateOpenApiDocument(
|
|
|
2351
2389
|
title: "EmDash CMS API",
|
|
2352
2390
|
version: "0.1.0",
|
|
2353
2391
|
description:
|
|
2354
|
-
"REST API for the EmDash CMS. All endpoints require authentication and return responses wrapped in a `{ data }` envelope.",
|
|
2392
|
+
"REST API for the EmDash CMS. All endpoints require authentication and return responses wrapped in a `{ success, data }` envelope.",
|
|
2355
2393
|
},
|
|
2356
2394
|
servers: [
|
|
2357
2395
|
{
|
|
@@ -2417,6 +2455,10 @@ export function generateOpenApiDocument(
|
|
|
2417
2455
|
},
|
|
2418
2456
|
],
|
|
2419
2457
|
components: {
|
|
2458
|
+
schemas: {
|
|
2459
|
+
// Preserve the previously published component while media reads use richer schemas.
|
|
2460
|
+
MediaListResponse: mediaListResponseSchema,
|
|
2461
|
+
},
|
|
2420
2462
|
securitySchemes: {
|
|
2421
2463
|
session: {
|
|
2422
2464
|
type: "apiKey",
|
package/src/api/parse.ts
CHANGED
|
@@ -113,21 +113,7 @@ function validate<T extends z.ZodType>(schema: T, data: unknown): ParseResult<z.
|
|
|
113
113
|
message: issue.message,
|
|
114
114
|
}));
|
|
115
115
|
|
|
116
|
-
return
|
|
117
|
-
{
|
|
118
|
-
error: {
|
|
119
|
-
code: "VALIDATION_ERROR",
|
|
120
|
-
message: "Invalid request data",
|
|
121
|
-
details: { issues },
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
status: 400,
|
|
126
|
-
headers: {
|
|
127
|
-
"Cache-Control": "private, no-store",
|
|
128
|
-
},
|
|
129
|
-
},
|
|
130
|
-
);
|
|
116
|
+
return apiError("VALIDATION_ERROR", "Invalid request data", 400, { issues });
|
|
131
117
|
}
|
|
132
118
|
|
|
133
119
|
/**
|
package/src/api/public-url.ts
CHANGED
|
@@ -22,8 +22,10 @@ interface SiteUrlConfig {
|
|
|
22
22
|
* the build. Container deployments set env vars at runtime, so we must read
|
|
23
23
|
* process.env which Vite leaves untouched.
|
|
24
24
|
*
|
|
25
|
-
* On Cloudflare Workers process.env is
|
|
26
|
-
*
|
|
25
|
+
* On Cloudflare Workers process.env is empty by default, so the fallback
|
|
26
|
+
* chain continues to url.origin — unless the Worker enables the
|
|
27
|
+
* `nodejs_compat_populate_process_env` compatibility flag, in which case
|
|
28
|
+
* `vars`/secrets (e.g. EMDASH_SITE_URL) are readable here too.
|
|
27
29
|
*
|
|
28
30
|
* Caches after first call.
|
|
29
31
|
*/
|
|
@@ -73,6 +73,7 @@ export const localeFilterQuery = z
|
|
|
73
73
|
/** Standard API error response */
|
|
74
74
|
export const apiErrorSchema = z
|
|
75
75
|
.object({
|
|
76
|
+
success: z.literal(false).meta({ description: "Discriminant: always false for errors" }),
|
|
76
77
|
error: z.object({
|
|
77
78
|
code: z.string().meta({ description: "Machine-readable error code", example: "NOT_FOUND" }),
|
|
78
79
|
message: z.string().meta({ description: "Human-readable error message" }),
|
|
@@ -80,9 +81,12 @@ export const apiErrorSchema = z
|
|
|
80
81
|
})
|
|
81
82
|
.meta({ id: "ApiError" });
|
|
82
83
|
|
|
83
|
-
/** Wrap a data schema in the standard success envelope: { data: T } */
|
|
84
|
+
/** Wrap a data schema in the standard success envelope: { success: true, data: T } */
|
|
84
85
|
export function successEnvelope<T extends z.ZodType>(dataSchema: T) {
|
|
85
|
-
return z.object({
|
|
86
|
+
return z.object({
|
|
87
|
+
success: z.literal(true).meta({ description: "Discriminant: always true for success" }),
|
|
88
|
+
data: dataSchema,
|
|
89
|
+
});
|
|
86
90
|
}
|
|
87
91
|
|
|
88
92
|
/** Standard delete response */
|
|
@@ -2,6 +2,71 @@ import { z } from "zod";
|
|
|
2
2
|
|
|
3
3
|
import { slugPattern } from "./common.js";
|
|
4
4
|
|
|
5
|
+
export const mediaUsageCoverageStatusSchema = z
|
|
6
|
+
.enum(["complete", "never", "running", "partial", "failed", "stale", "unknown"])
|
|
7
|
+
.meta({ id: "MediaUsageCoverageStatus" });
|
|
8
|
+
|
|
9
|
+
export const mediaUsageCoverageSchema = z
|
|
10
|
+
.object({
|
|
11
|
+
scope: z.literal("all_content_collections"),
|
|
12
|
+
status: mediaUsageCoverageStatusSchema,
|
|
13
|
+
})
|
|
14
|
+
.meta({ id: "MediaUsageCoverage" });
|
|
15
|
+
|
|
16
|
+
export const mediaUsageSummarySchema = z
|
|
17
|
+
.object({
|
|
18
|
+
count: z.number().int().min(0).nullable(),
|
|
19
|
+
coverage: mediaUsageCoverageSchema,
|
|
20
|
+
})
|
|
21
|
+
.meta({ id: "MediaUsageSummary" });
|
|
22
|
+
|
|
23
|
+
export const mediaUsageDetailsQuery = z.object({
|
|
24
|
+
cursor: z.string().min(1).max(2048).optional().meta({
|
|
25
|
+
description: "Opaque content-entry-group cursor",
|
|
26
|
+
}),
|
|
27
|
+
limit: z.coerce.number().int().min(1).max(100).optional().default(50).meta({
|
|
28
|
+
description: "Maximum number of content entry groups to return (1-100, default 50)",
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export const mediaUsageOccurrenceDetailSchema = z
|
|
33
|
+
.object({
|
|
34
|
+
fieldSlug: z.string(),
|
|
35
|
+
fieldPath: z.string(),
|
|
36
|
+
occurrenceIndex: z.number().int().min(0),
|
|
37
|
+
referenceType: z.enum(["image_field", "file_field", "portable_text_image", "unknown"]),
|
|
38
|
+
})
|
|
39
|
+
.meta({ id: "MediaUsageOccurrenceDetail" });
|
|
40
|
+
|
|
41
|
+
export const mediaUsageSourceDetailSchema = z
|
|
42
|
+
.object({
|
|
43
|
+
variant: z.enum(["columns", "draft_overlay"]),
|
|
44
|
+
occurrences: z.array(mediaUsageOccurrenceDetailSchema),
|
|
45
|
+
})
|
|
46
|
+
.meta({ id: "MediaUsageSourceDetail" });
|
|
47
|
+
|
|
48
|
+
export const mediaUsageEntryDetailSchema = z
|
|
49
|
+
.object({
|
|
50
|
+
collection: z.string(),
|
|
51
|
+
contentId: z.string(),
|
|
52
|
+
title: z.string().nullable(),
|
|
53
|
+
slug: z.string().nullable(),
|
|
54
|
+
locale: z.string().nullable(),
|
|
55
|
+
status: z.string().nullable(),
|
|
56
|
+
scheduledAt: z.string().nullable(),
|
|
57
|
+
deletedAt: z.string().nullable(),
|
|
58
|
+
sources: z.array(mediaUsageSourceDetailSchema),
|
|
59
|
+
})
|
|
60
|
+
.meta({ id: "MediaUsageEntryDetail" });
|
|
61
|
+
|
|
62
|
+
export const mediaUsageDetailsResponseSchema = z
|
|
63
|
+
.object({
|
|
64
|
+
items: z.array(mediaUsageEntryDetailSchema),
|
|
65
|
+
nextCursor: z.string().optional(),
|
|
66
|
+
coverage: mediaUsageCoverageSchema,
|
|
67
|
+
})
|
|
68
|
+
.meta({ id: "MediaUsageDetailsResponse" });
|
|
69
|
+
|
|
5
70
|
export const mediaUsageRepairStatusSchema = z
|
|
6
71
|
.enum(["complete", "partial", "failed", "stale"])
|
|
7
72
|
.meta({ id: "MediaUsageRepairStatus" });
|
|
@@ -46,3 +111,10 @@ export const mediaUsageRepairResponseSchema = z
|
|
|
46
111
|
|
|
47
112
|
export type MediaUsageRepairRequest = z.infer<typeof mediaUsageRepairBody>;
|
|
48
113
|
export type MediaUsageRepairResponse = z.infer<typeof mediaUsageRepairResponseSchema>;
|
|
114
|
+
export type MediaUsageCoverageStatus = z.infer<typeof mediaUsageCoverageStatusSchema>;
|
|
115
|
+
export type MediaUsageCoverage = z.infer<typeof mediaUsageCoverageSchema>;
|
|
116
|
+
export type MediaUsageSummary = z.infer<typeof mediaUsageSummarySchema>;
|
|
117
|
+
export type MediaUsageOccurrenceDetail = z.infer<typeof mediaUsageOccurrenceDetailSchema>;
|
|
118
|
+
export type MediaUsageSourceDetail = z.infer<typeof mediaUsageSourceDetailSchema>;
|
|
119
|
+
export type MediaUsageEntryDetail = z.infer<typeof mediaUsageEntryDetailSchema>;
|
|
120
|
+
export type MediaUsageDetailsResponse = z.infer<typeof mediaUsageDetailsResponseSchema>;
|
package/src/api/schemas/media.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
|
|
3
3
|
import { cursorPaginationQuery } from "./common.js";
|
|
4
|
+
import { mediaUsageSummarySchema } from "./media-usage.js";
|
|
4
5
|
|
|
5
6
|
// ---------------------------------------------------------------------------
|
|
6
7
|
// Media: Input schemas
|
|
@@ -23,9 +24,20 @@ export const mediaListQuery = cursorPaginationQuery
|
|
|
23
24
|
mimeType: mimeTypeFilter,
|
|
24
25
|
/** Case-insensitive filename substring search (also matches extensions). */
|
|
25
26
|
q: z.string().trim().min(1).max(200).optional(),
|
|
27
|
+
includeUsage: z.literal("1").optional().meta({
|
|
28
|
+
description: "Include a coverage-aware usage summary on each media item",
|
|
29
|
+
}),
|
|
26
30
|
})
|
|
27
31
|
.meta({ id: "MediaListQuery" });
|
|
28
32
|
|
|
33
|
+
export const mediaGetQuery = z
|
|
34
|
+
.object({
|
|
35
|
+
includeUsage: z.literal("1").optional().meta({
|
|
36
|
+
description: "Include a coverage-aware usage summary on the media item",
|
|
37
|
+
}),
|
|
38
|
+
})
|
|
39
|
+
.meta({ id: "MediaGetQuery" });
|
|
40
|
+
|
|
29
41
|
export const mediaUpdateBody = z
|
|
30
42
|
.object({
|
|
31
43
|
alt: z.string().optional(),
|
|
@@ -46,7 +58,7 @@ export function formatFileSize(bytes: number): string {
|
|
|
46
58
|
|
|
47
59
|
// Matches a full MIME type (type/subtype) with an optional semicolon-delimited
|
|
48
60
|
// parameter section. Forbids CR/LF to prevent header injection.
|
|
49
|
-
const CONTENT_TYPE_RE = /^[a-z0-9][a-z0-9!#$&^_+\-.]*\/[a-z0-9!#$&^_+\-.]+(\s*;[^\r\n]*)?$/i;
|
|
61
|
+
export const CONTENT_TYPE_RE = /^[a-z0-9][a-z0-9!#$&^_+\-.]*\/[a-z0-9!#$&^_+\-.]+(\s*;[^\r\n]*)?$/i;
|
|
50
62
|
|
|
51
63
|
export function mediaUploadUrlBody(maxSize: number) {
|
|
52
64
|
if (!Number.isFinite(maxSize) || maxSize <= 0) {
|
|
@@ -115,6 +127,25 @@ export const mediaResponseSchema = z
|
|
|
115
127
|
.object({ item: mediaItemSchema })
|
|
116
128
|
.meta({ id: "MediaResponse" });
|
|
117
129
|
|
|
130
|
+
export const mediaReadItemSchema = mediaItemSchema
|
|
131
|
+
.extend({ usage: mediaUsageSummarySchema.optional() })
|
|
132
|
+
.meta({ id: "MediaReadItem" });
|
|
133
|
+
|
|
134
|
+
export const mediaReadResponseSchema = z
|
|
135
|
+
.object({ item: mediaReadItemSchema })
|
|
136
|
+
.meta({ id: "MediaReadResponse" });
|
|
137
|
+
|
|
138
|
+
export const mediaListReadItemSchema = mediaReadItemSchema
|
|
139
|
+
.extend({ url: z.string() })
|
|
140
|
+
.meta({ id: "MediaListReadItem" });
|
|
141
|
+
|
|
142
|
+
export const mediaListReadResponseSchema = z
|
|
143
|
+
.object({
|
|
144
|
+
items: z.array(mediaListReadItemSchema),
|
|
145
|
+
nextCursor: z.string().optional(),
|
|
146
|
+
})
|
|
147
|
+
.meta({ id: "MediaListReadResponse" });
|
|
148
|
+
|
|
118
149
|
export const mediaListResponseSchema = z
|
|
119
150
|
.object({
|
|
120
151
|
items: z.array(mediaItemSchema),
|
|
@@ -195,6 +195,34 @@ export function resolveImageEndpoint(opts: {
|
|
|
195
195
|
};
|
|
196
196
|
}
|
|
197
197
|
|
|
198
|
+
/**
|
|
199
|
+
* Warn when `@astrojs/react` is not registered in the host's `integrations`.
|
|
200
|
+
*
|
|
201
|
+
* The admin SPA is a React app hydrated via `client:only="react"`. Without the
|
|
202
|
+
* React integration the build succeeds and the admin route returns 200, but the
|
|
203
|
+
* bundle never hydrates -- the page sits on "Loading EmDash..." forever with no
|
|
204
|
+
* error anywhere (#962). Checked in `astro:config:done` so integrations added
|
|
205
|
+
* by other integrations are visible too.
|
|
206
|
+
*
|
|
207
|
+
* @internal Exported for unit testing.
|
|
208
|
+
*/
|
|
209
|
+
export function missingReactIntegrationWarning(
|
|
210
|
+
integrations: readonly { name: string }[],
|
|
211
|
+
): string | undefined {
|
|
212
|
+
if (integrations.some((integration) => integration.name === "@astrojs/react")) {
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
return (
|
|
216
|
+
`@astrojs/react is not registered in your Astro config. The EmDash admin UI ` +
|
|
217
|
+
`will not hydrate without it (the page stays on "Loading EmDash..."). ` +
|
|
218
|
+
`Add it to your integrations:\n\n` +
|
|
219
|
+
` import react from "@astrojs/react";\n` +
|
|
220
|
+
` export default defineConfig({\n` +
|
|
221
|
+
` integrations: [react(), emdash({ ... })],\n` +
|
|
222
|
+
` });`
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
|
|
198
226
|
// Terminal formatting
|
|
199
227
|
const dim = (s: string) => `\x1b[2m${s}\x1b[22m`;
|
|
200
228
|
const bold = (s: string) => `\x1b[1m${s}\x1b[22m`;
|
|
@@ -381,6 +409,12 @@ export function emdash(config: EmDashConfig = {}): AstroIntegration {
|
|
|
381
409
|
if (astroVersion !== undefined) {
|
|
382
410
|
serializableConfig.astroVersion = astroVersion;
|
|
383
411
|
}
|
|
412
|
+
// EmDashHead must not access Astro.csp when the host has disabled
|
|
413
|
+
// Astro's built-in CSP runtime; Astro logs a warning for that access.
|
|
414
|
+
serializableConfig.astroCspEnabled = Boolean(astroConfig.security.csp);
|
|
415
|
+
// Expose Astro's trailingSlash routing policy so plugins can build
|
|
416
|
+
// URLs (sitemap/canonical/hreflang) that match what the site serves.
|
|
417
|
+
serializableConfig.trailingSlash = astroConfig.trailingSlash;
|
|
384
418
|
// Extract i18n config from Astro config
|
|
385
419
|
// Astro locales can be strings OR { path, codes } objects — normalize to paths
|
|
386
420
|
if (astroConfig.i18n) {
|
|
@@ -556,6 +590,10 @@ export function emdash(config: EmDashConfig = {}): AstroIntegration {
|
|
|
556
590
|
// dev server is listening (see astro:server:setup), since the
|
|
557
591
|
// port isn't known yet here. Nothing useful to print for build.
|
|
558
592
|
},
|
|
593
|
+
"astro:config:done": ({ config: finalConfig, logger }) => {
|
|
594
|
+
const warning = missingReactIntegrationWarning(finalConfig.integrations);
|
|
595
|
+
if (warning) logger.warn(warning);
|
|
596
|
+
},
|
|
559
597
|
"astro:server:setup": ({ server, logger }) => {
|
|
560
598
|
// Print route info with absolute, clickable URLs once the server
|
|
561
599
|
// is listening. Only in `astro dev` -- the dev-bypass shortcut is
|
|
@@ -213,6 +213,11 @@ export function injectCoreRoutes(
|
|
|
213
213
|
entrypoint: resolveRoute("api/media/[id].ts"),
|
|
214
214
|
});
|
|
215
215
|
|
|
216
|
+
injectRoute({
|
|
217
|
+
pattern: "/_emdash/api/media/[id]/usage",
|
|
218
|
+
entrypoint: resolveRoute("api/media/[id]/usage.ts"),
|
|
219
|
+
});
|
|
220
|
+
|
|
216
221
|
injectRoute({
|
|
217
222
|
pattern: "/_emdash/api/media/[id]/confirm",
|
|
218
223
|
entrypoint: resolveRoute("api/media/[id]/confirm.ts"),
|
|
@@ -346,6 +351,27 @@ export function injectCoreRoutes(
|
|
|
346
351
|
entrypoint: resolveRoute("api/settings/email.ts"),
|
|
347
352
|
});
|
|
348
353
|
|
|
354
|
+
// Backup routes
|
|
355
|
+
injectRoute({
|
|
356
|
+
pattern: "/_emdash/api/settings/backups",
|
|
357
|
+
entrypoint: resolveRoute("api/settings/backups/index.ts"),
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
injectRoute({
|
|
361
|
+
pattern: "/_emdash/api/settings/backups/export",
|
|
362
|
+
entrypoint: resolveRoute("api/settings/backups/export.ts"),
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
injectRoute({
|
|
366
|
+
pattern: "/_emdash/api/settings/backups/archives",
|
|
367
|
+
entrypoint: resolveRoute("api/settings/backups/archives/index.ts"),
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
injectRoute({
|
|
371
|
+
pattern: "/_emdash/api/settings/backups/archives/[name]",
|
|
372
|
+
entrypoint: resolveRoute("api/settings/backups/archives/[name].ts"),
|
|
373
|
+
});
|
|
374
|
+
|
|
349
375
|
// Snapshot route (for DO preview database population)
|
|
350
376
|
injectRoute({
|
|
351
377
|
pattern: "/_emdash/api/snapshot",
|
|
@@ -398,6 +424,15 @@ export function injectCoreRoutes(
|
|
|
398
424
|
pattern: "/_emdash/api/admin/plugins/[id]/disable",
|
|
399
425
|
entrypoint: resolveRoute("api/admin/plugins/[id]/disable.ts"),
|
|
400
426
|
});
|
|
427
|
+
injectRoute({
|
|
428
|
+
pattern: "/_emdash/api/admin/plugins/[id]/mcp",
|
|
429
|
+
entrypoint: resolveRoute("api/admin/plugins/[id]/mcp.ts"),
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
injectRoute({
|
|
433
|
+
pattern: "/_emdash/api/admin/plugins/[id]/settings",
|
|
434
|
+
entrypoint: resolveRoute("api/admin/plugins/[id]/settings.ts"),
|
|
435
|
+
});
|
|
401
436
|
|
|
402
437
|
// Marketplace plugin routes
|
|
403
438
|
injectRoute({
|