emdash 0.36.0 → 0.37.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-CzL3H752.d.mts → adapters-BDQwg236.d.mts} +4 -2
- package/dist/{adapters-CzL3H752.d.mts.map → adapters-BDQwg236.d.mts.map} +1 -1
- package/dist/{allowed-origins-maylGaHv.mjs → allowed-origins-BGglilcs.mjs} +2 -2
- package/dist/{allowed-origins-maylGaHv.mjs.map → allowed-origins-BGglilcs.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +17 -17
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -5
- package/dist/api-Dz6rgoa3.mjs +10040 -0
- package/dist/api-Dz6rgoa3.mjs.map +1 -0
- package/dist/{api-tokens-9YrrCoE6.mjs → api-tokens-BSsQACNe.mjs} +2 -2
- package/dist/{api-tokens-9YrrCoE6.mjs.map → api-tokens-BSsQACNe.mjs.map} +1 -1
- package/dist/{apply-B_VMpJ2P.mjs → apply-B4SIOxR1.mjs} +18 -18
- package/dist/{apply-B_VMpJ2P.mjs.map → apply-B4SIOxR1.mjs.map} +1 -1
- package/dist/astro/image-endpoint.mjs +2 -2
- package/dist/astro/image-endpoint.mjs.map +1 -1
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +110 -37
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +6 -6
- package/dist/astro/middleware/media-usage-write-fence.mjs +2 -2
- package/dist/astro/middleware/redirect.mjs +3 -3
- package/dist/astro/middleware/request-context.mjs +2 -2
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +10 -10
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +157 -195
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +6 -6
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/api-tokens/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +3 -3
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +8 -8
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +8 -8
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +8 -8
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -14
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +14 -14
- package/dist/astro/routes/api/admin/bylines/index.mjs +14 -14
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +12 -12
- package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/bulk.mjs +10 -10
- package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/index.mjs +10 -10
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +3 -3
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +2 -2
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +10 -10
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +11 -11
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +14 -14
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +13 -13
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +13 -13
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +49 -49
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +49 -49
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +48 -48
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +48 -48
- 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 +54 -50
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +17 -16
- 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 +55 -51
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +93 -0
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/updates.mjs +47 -47
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +47 -47
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +47 -47
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +2 -2
- package/dist/astro/routes/api/admin/users/index.mjs +6 -6
- package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +10 -10
- package/dist/astro/routes/api/auth/invite/index.mjs +7 -7
- package/dist/astro/routes/api/auth/invite/register-options.mjs +9 -9
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +9 -9
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.mjs +7 -7
- package/dist/astro/routes/api/auth/mode.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -6
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +9 -9
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/complete.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/request.mjs +9 -9
- package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +12 -12
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +14 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +10 -10
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +13 -10
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +13 -13
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +14 -5
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
- package/dist/astro/routes/api/dashboard.mjs +7 -7
- package/dist/astro/routes/api/dev/emails.mjs +2 -2
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +15 -15
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +2 -2
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +11 -11
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +9 -9
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +9 -9
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +15 -15
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +22 -22
- package/dist/astro/routes/api/manifest.mjs +3 -3
- package/dist/astro/routes/api/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +188 -65
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +9 -9
- package/dist/astro/routes/api/media/_id_/replace.d.mts +8 -0
- package/dist/astro/routes/api/media/_id_/replace.d.mts.map +1 -0
- package/dist/astro/routes/api/media/_id_/replace.mjs +91 -0
- package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -0
- package/dist/astro/routes/api/media/_id_/upload.mjs +5 -5
- package/dist/astro/routes/api/media/_id_/usage.mjs +16 -16
- package/dist/astro/routes/api/media/_id_.mjs +15 -15
- package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -2
- package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
- package/dist/astro/routes/api/media/folders/_id_.mjs +8 -8
- package/dist/astro/routes/api/media/folders/index.mjs +8 -8
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
- package/dist/astro/routes/api/media/providers/index.mjs +2 -2
- package/dist/astro/routes/api/media/upload-url.mjs +15 -13
- 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 +47 -24
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +20 -13
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +15 -11
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +15 -11
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +16 -12
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +21 -14
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.d.mts.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +15 -11
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +5 -5
- package/dist/astro/routes/api/oauth/device/code.mjs +8 -8
- package/dist/astro/routes/api/oauth/device/token.mjs +7 -7
- package/dist/astro/routes/api/oauth/register.mjs +2 -2
- package/dist/astro/routes/api/oauth/token/refresh.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/revoke.mjs +5 -5
- package/dist/astro/routes/api/oauth/token.mjs +5 -5
- package/dist/astro/routes/api/openapi.json.mjs +104 -38
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
- package/dist/astro/routes/api/redirects/404s/index.mjs +8 -8
- package/dist/astro/routes/api/redirects/404s/summary.mjs +8 -8
- package/dist/astro/routes/api/redirects/_id_.mjs +9 -9
- package/dist/astro/routes/api/redirects/index.mjs +9 -9
- package/dist/astro/routes/api/relations/_id_/index.mjs +15 -15
- package/dist/astro/routes/api/relations/_id_/translations.mjs +10 -10
- package/dist/astro/routes/api/relations/index.mjs +15 -15
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/index.mjs +47 -47
- package/dist/astro/routes/api/schema/collections/reorder.mjs +47 -47
- package/dist/astro/routes/api/schema/index.mjs +8 -8
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +47 -47
- package/dist/astro/routes/api/schema/orphans/index.mjs +47 -47
- package/dist/astro/routes/api/search/enable.mjs +10 -10
- package/dist/astro/routes/api/search/index.mjs +9 -9
- package/dist/astro/routes/api/search/rebuild.mjs +10 -10
- package/dist/astro/routes/api/search/stats.mjs +5 -5
- package/dist/astro/routes/api/search/suggest.mjs +9 -9
- package/dist/astro/routes/api/sections/_slug_.mjs +9 -9
- package/dist/astro/routes/api/sections/index.mjs +9 -9
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +5 -5
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +4 -4
- package/dist/astro/routes/api/settings/backups/export.mjs +5 -5
- package/dist/astro/routes/api/settings/backups/index.mjs +6 -6
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings/email.mjs.map +1 -1
- package/dist/astro/routes/api/settings.d.mts.map +1 -1
- package/dist/astro/routes/api/settings.mjs +18 -14
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +11 -11
- package/dist/astro/routes/api/setup/admin.mjs +10 -10
- package/dist/astro/routes/api/setup/dev-bypass.mjs +25 -25
- package/dist/astro/routes/api/setup/dev-reset.mjs +1 -1
- package/dist/astro/routes/api/setup/index.mjs +25 -25
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +6 -6
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +19 -15
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +20 -16
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +24 -17
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +19 -15
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -18
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +19 -15
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +4 -4
- package/dist/astro/routes/api/typegen.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +10 -8
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +16 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +14 -11
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -5
- package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.d.mts.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.mjs +14 -11
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +5 -5
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +8 -8
- package/dist/astro/routes/sitemap.xml.mjs +6 -6
- package/dist/astro/types.d.mts +32 -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-ByYs-Uxs.mjs → authorize-Bkf_UHhD.mjs} +2 -2
- package/dist/{authorize-ByYs-Uxs.mjs.map → authorize-Bkf_UHhD.mjs.map} +1 -1
- package/dist/{backup-ChyHfIoX.mjs → backup-rwVAl9NI.mjs} +4 -4
- package/dist/{backup-ChyHfIoX.mjs.map → backup-rwVAl9NI.mjs.map} +1 -1
- package/dist/{bundle-DZFhFurR.mjs → bundle-C8S2Zl6U.mjs} +3 -3
- package/dist/{bundle-DZFhFurR.mjs.map → bundle-C8S2Zl6U.mjs.map} +1 -1
- package/dist/{byline-Cpnwrje1.mjs → byline-DuhF7NWl.mjs} +25 -12
- package/dist/byline-DuhF7NWl.mjs.map +1 -0
- package/dist/{byline-fields-CAyA_Umd.mjs → byline-fields-BovY4KYM.mjs} +1 -1
- package/dist/{byline-fields-CAyA_Umd.mjs.map → byline-fields-BovY4KYM.mjs.map} +1 -1
- package/dist/{bylines-BSo9B9RX.mjs → bylines-CJ5nd6Lw.mjs} +6 -6
- package/dist/{bylines-BSo9B9RX.mjs.map → bylines-CJ5nd6Lw.mjs.map} +1 -1
- package/dist/{bylines-CHjvehVX.mjs → bylines-RwBAeOF1.mjs} +3 -3
- package/dist/{bylines-CHjvehVX.mjs.map → bylines-RwBAeOF1.mjs.map} +1 -1
- package/dist/{cache-5VirJ2Cn.mjs → cache-BF5Kvn59.mjs} +2 -2
- package/dist/{cache-5VirJ2Cn.mjs.map → cache-BF5Kvn59.mjs.map} +1 -1
- package/dist/{challenge-store-D5pSY2S1.mjs → challenge-store-DQN_Yrck.mjs} +5 -3
- package/dist/challenge-store-DQN_Yrck.mjs.map +1 -0
- package/dist/chrome-tags-D8fiZG94.mjs +24 -0
- package/dist/chrome-tags-D8fiZG94.mjs.map +1 -0
- package/dist/{chunks-bNiX6_DR.mjs → chunks-C4szrD8o.mjs} +2 -2
- package/dist/{chunks-bNiX6_DR.mjs.map → chunks-C4szrD8o.mjs.map} +1 -1
- package/dist/cli/index.mjs +26 -26
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +2 -2
- package/dist/client/index.mjs +2 -2
- package/dist/{collection-deletion-m_oi2c0N.mjs → collection-deletion-Bj07NHbj.mjs} +2 -2
- package/dist/{collection-deletion-m_oi2c0N.mjs.map → collection-deletion-Bj07NHbj.mjs.map} +1 -1
- package/dist/{comment-reaction-CRuItEjt.mjs → comment-reaction-BhrvSHml.mjs} +2 -2
- package/dist/{comment-reaction-CRuItEjt.mjs.map → comment-reaction-BhrvSHml.mjs.map} +1 -1
- package/dist/{comment-DhvLEdhQ.mjs → comment-vxOzWbZN.mjs} +2 -2
- package/dist/{comment-DhvLEdhQ.mjs.map → comment-vxOzWbZN.mjs.map} +1 -1
- package/dist/{comments-CLj4bi8I.mjs → comments-Ct4ensnf.mjs} +2 -2
- package/dist/{comments-CLj4bi8I.mjs.map → comments-Ct4ensnf.mjs.map} +1 -1
- package/dist/{components-v4U4DT2y.mjs → components-DJbo1z0S.mjs} +1 -1
- package/dist/{components-v4U4DT2y.mjs.map → components-DJbo1z0S.mjs.map} +1 -1
- package/dist/{config-DrfghTPe.d.mts → config-B9eZ340f.d.mts} +1 -1
- package/dist/{config-DrfghTPe.d.mts.map → config-B9eZ340f.d.mts.map} +1 -1
- package/dist/config-it29yDLA.mjs +1163 -0
- package/dist/config-it29yDLA.mjs.map +1 -0
- package/dist/{content-CP-SeXNa.mjs → content-DjvM0T92.mjs} +84 -44
- package/dist/content-DjvM0T92.mjs.map +1 -0
- package/dist/{content-list-query-BhejKVqb.d.mts → content-list-query-Btqd4uV2.d.mts} +1 -1
- package/dist/{content-list-query-BhejKVqb.d.mts.map → content-list-query-Btqd4uV2.d.mts.map} +1 -1
- package/dist/{content-refresh-DLOfIhYc.mjs → content-refresh-Bwp-8yGy.mjs} +48 -21
- package/dist/content-refresh-Bwp-8yGy.mjs.map +1 -0
- package/dist/{content-repair-BCxzy0r4.mjs → content-repair-Czdp7jz5.mjs} +4 -4
- package/dist/{content-repair-BCxzy0r4.mjs.map → content-repair-Czdp7jz5.mjs.map} +1 -1
- package/dist/{context-BR5hRWiK.mjs → context-CX6gxOLW.mjs} +52 -17
- package/dist/context-CX6gxOLW.mjs.map +1 -0
- package/dist/{cron-CWfWrWKG.mjs → cron-C6o7VppJ.mjs} +1 -1
- package/dist/{cron-CWfWrWKG.mjs.map → cron-C6o7VppJ.mjs.map} +1 -1
- package/dist/{dashboard-CkIV2rnQ.mjs → dashboard-C2kTeeRI.mjs} +4 -4
- package/dist/{dashboard-CkIV2rnQ.mjs.map → dashboard-C2kTeeRI.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +4 -4
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +4 -4
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/postgres.d.mts.map +1 -1
- package/dist/db/postgres.mjs +19 -3
- package/dist/db/postgres.mjs.map +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +4 -4
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/{default-YMEfcQUx.mjs → default-Clra32mw.mjs} +1 -1
- package/dist/{default-YMEfcQUx.mjs.map → default-Clra32mw.mjs.map} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.d.mts → deferred-tasks-CvDETTJO.d.mts} +1 -1
- package/dist/{deferred-tasks-DfqxH5Xf.d.mts.map → deferred-tasks-CvDETTJO.d.mts.map} +1 -1
- package/dist/dev-typegen-DzOPfsNj.mjs +29 -0
- package/dist/dev-typegen-DzOPfsNj.mjs.map +1 -0
- package/dist/{device-flow-CojjSBwb.mjs → device-flow-D2oCWvLJ.mjs} +4 -4
- package/dist/{device-flow-CojjSBwb.mjs.map → device-flow-D2oCWvLJ.mjs.map} +1 -1
- package/dist/{direct-executor-BWeWiRYB.mjs → direct-executor-Bfa5_ToE.mjs} +3 -3
- package/dist/{direct-executor-BWeWiRYB.mjs.map → direct-executor-Bfa5_ToE.mjs.map} +1 -1
- package/dist/{email-console-CEJgR_LB.mjs → email-console-Dzb6uGYa.mjs} +1 -1
- package/dist/{email-console-CEJgR_LB.mjs.map → email-console-Dzb6uGYa.mjs.map} +1 -1
- package/dist/{error-D9w94fjV.mjs → error-DFrQjppn.mjs} +2 -2
- package/dist/{error-D9w94fjV.mjs.map → error-DFrQjppn.mjs.map} +1 -1
- package/dist/{errors-n2j49uNf.mjs → errors-DsVoDUjJ.mjs} +3 -1
- package/dist/errors-DsVoDUjJ.mjs.map +1 -0
- package/dist/{escape-DN4Qmjsl.mjs → escape-HmHTC1Is.mjs} +1 -1
- package/dist/{escape-DN4Qmjsl.mjs.map → escape-HmHTC1Is.mjs.map} +1 -1
- package/dist/{field-defs-cache-Bh4q6oar.mjs → field-defs-cache-BM4SIRqH.mjs} +2 -2
- package/dist/{field-defs-cache-Bh4q6oar.mjs.map → field-defs-cache-BM4SIRqH.mjs.map} +1 -1
- package/dist/{fts-manager-BhOdW0bi.mjs → fts-manager-Do1BlW2r.mjs} +2 -2
- package/dist/{fts-manager-BhOdW0bi.mjs.map → fts-manager-Do1BlW2r.mjs.map} +1 -1
- package/dist/{hash-CTcngWvj.mjs → hash-3JJPlHF2.mjs} +1 -1
- package/dist/{hash-CTcngWvj.mjs.map → hash-3JJPlHF2.mjs.map} +1 -1
- package/dist/hook-result-DCh2WUpe.d.mts +31 -0
- package/dist/hook-result-DCh2WUpe.d.mts.map +1 -0
- package/dist/{hreflang-7pTHsLZJ.d.mts → hreflang-B6hbAuuO.d.mts} +2 -2
- package/dist/{hreflang-7pTHsLZJ.d.mts.map → hreflang-B6hbAuuO.d.mts.map} +1 -1
- package/dist/{hreflang-Huc6O5wa.mjs → hreflang-DQbPZliA.mjs} +6 -6
- package/dist/{hreflang-Huc6O5wa.mjs.map → hreflang-DQbPZliA.mjs.map} +1 -1
- package/dist/{identity-DXmb4aVp.mjs → identity-DksvEazf.mjs} +3 -3
- package/dist/{identity-DXmb4aVp.mjs.map → identity-DksvEazf.mjs.map} +1 -1
- package/dist/{import-C4_O3KXU.mjs → import-CJpaBBBT.mjs} +5 -5
- package/dist/{import-C4_O3KXU.mjs.map → import-CJpaBBBT.mjs.map} +1 -1
- package/dist/{index-DWbJrsAg.d.mts → index-BJNMCWmu.d.mts} +158 -49
- package/dist/index-BJNMCWmu.d.mts.map +1 -0
- package/dist/{index-6bRee8zb.d.mts → index-Du8K7bWa.d.mts} +3 -3
- package/dist/{index-6bRee8zb.d.mts.map → index-Du8K7bWa.d.mts.map} +1 -1
- package/dist/index.d.mts +22 -21
- package/dist/index.mjs +70 -70
- package/dist/{load-Bo7fZAbg.mjs → load-CawHjTOH.mjs} +2 -2
- package/dist/{load-Bo7fZAbg.mjs.map → load-CawHjTOH.mjs.map} +1 -1
- package/dist/{loader-ZsjE4paL.mjs → loader-Z8vl7zTq.mjs} +48 -13
- package/dist/loader-Z8vl7zTq.mjs.map +1 -0
- package/dist/{manifest-builder-QXuqvVMP.mjs → manifest-builder-COtzuca2.mjs} +2 -2
- package/dist/{manifest-builder-QXuqvVMP.mjs.map → manifest-builder-COtzuca2.mjs.map} +1 -1
- package/dist/{manifest-schema-CUYPfCEH.mjs → manifest-schema-BNWwR8Vd.mjs} +5 -5
- package/dist/manifest-schema-BNWwR8Vd.mjs.map +1 -0
- package/dist/media/image-endpoint.d.mts +4 -2
- package/dist/media/image-endpoint.d.mts.map +1 -1
- package/dist/media/image-endpoint.mjs +6 -4
- package/dist/media/image-endpoint.mjs.map +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +1 -1
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +4 -4
- package/dist/{media-D6SeAfBl.mjs → media-BBm8Wg3f.mjs} +30 -2
- package/dist/media-BBm8Wg3f.mjs.map +1 -0
- package/dist/{media-BjwNuLEu.mjs → media-BHjus86Y.mjs} +35 -5
- package/dist/media-BHjus86Y.mjs.map +1 -0
- package/dist/{media-allowlist-D35v7bmL.mjs → media-allowlist-CoTBWoDp.mjs} +1 -1
- package/dist/{media-allowlist-D35v7bmL.mjs.map → media-allowlist-CoTBWoDp.mjs.map} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs → media-folders-BGkATs8n.mjs} +1 -1
- package/dist/{media-folders-D-0CmRZj.mjs.map → media-folders-BGkATs8n.mjs.map} +1 -1
- package/dist/{media-upload-C7bLXGcI.mjs → media-upload-BCidR-EY.mjs} +6 -6
- package/dist/{media-upload-C7bLXGcI.mjs.map → media-upload-BCidR-EY.mjs.map} +1 -1
- package/dist/{media-url-DH7giMx_.mjs → media-url-DHoPr0hq.mjs} +1 -1
- package/dist/{media-url-DH7giMx_.mjs.map → media-url-DHoPr0hq.mjs.map} +1 -1
- package/dist/{media-usage-BTRJvS6V.mjs → media-usage-CdY5jhSR.mjs} +8 -8
- package/dist/{media-usage-BTRJvS6V.mjs.map → media-usage-CdY5jhSR.mjs.map} +1 -1
- package/dist/{media-usage-activation-Dx0kPV6b.mjs → media-usage-activation-BgeMtK5C.mjs} +2 -2
- package/dist/{media-usage-activation-Dx0kPV6b.mjs.map → media-usage-activation-BgeMtK5C.mjs.map} +1 -1
- package/dist/{media-usage-work-DWb2XPMI.mjs → media-usage-work-CnGCdHxx.mjs} +4 -4
- package/dist/{media-usage-work-DWb2XPMI.mjs.map → media-usage-work-CnGCdHxx.mjs.map} +1 -1
- package/dist/{media-usage-work-C-fhM30c.mjs → media-usage-work-D6D9sMCA.mjs} +1 -1
- package/dist/{media-usage-work-C-fhM30c.mjs.map → media-usage-work-D6D9sMCA.mjs.map} +1 -1
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs → media-usage-write-fence-hjeD4u7s.mjs} +2 -2
- package/dist/{media-usage-write-fence-BwoJVRDC.mjs.map → media-usage-write-fence-hjeD4u7s.mjs.map} +1 -1
- package/dist/{menus-CNg0QlDt.mjs → menus-6qSwTNxG.mjs} +346 -94
- package/dist/menus-6qSwTNxG.mjs.map +1 -0
- package/dist/{menus-CD7EFLwz.mjs → menus-uvPLXMZf.mjs} +3 -3
- package/dist/{menus-CD7EFLwz.mjs.map → menus-uvPLXMZf.mjs.map} +1 -1
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/{mode-DaUM_MB2.mjs → mode-DN_WneRx.mjs} +1 -1
- package/dist/{mode-DaUM_MB2.mjs.map → mode-DN_WneRx.mjs.map} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs → node-sqlite-compat-BuJXIeMz.mjs} +1 -1
- package/dist/{node-sqlite-compat-Udb4Y-rs.mjs.map → node-sqlite-compat-BuJXIeMz.mjs.map} +1 -1
- package/dist/{normalize-CSxdKBVa.mjs → normalize-C2xNjTSG.mjs} +15 -5
- package/dist/normalize-C2xNjTSG.mjs.map +1 -0
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs → oauth-authorization-Dj6Kwc21.mjs} +4 -4
- package/dist/{oauth-authorization-Dpsb-fMJ.mjs.map → oauth-authorization-Dj6Kwc21.mjs.map} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs → oauth-clients-FD7I0J8m.mjs} +1 -1
- package/dist/{oauth-clients-Bxnoe_67.mjs.map → oauth-clients-FD7I0J8m.mjs.map} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs → oauth-state-store-DkmDOmHs.mjs} +1 -1
- package/dist/{oauth-state-store-0C4s0K6w.mjs.map → oauth-state-store-DkmDOmHs.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.mjs → oauth-user-lookup-CvIwGpYd.mjs} +1 -1
- package/dist/{oauth-user-lookup-wlGYSeqX.mjs.map → oauth-user-lookup-CvIwGpYd.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-71tPfV4A.mjs → object-cache-DVKnyOfy.mjs} +19 -3
- package/dist/object-cache-DVKnyOfy.mjs.map +1 -0
- package/dist/{options-BhZIeFY1.d.mts → options-CYb4y7hM.d.mts} +24 -11
- package/dist/options-CYb4y7hM.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-BRJg1kz8.mjs → parse-Ckpg-Qfp.mjs} +2 -2
- package/dist/{parse-BRJg1kz8.mjs.map → parse-Ckpg-Qfp.mjs.map} +1 -1
- package/dist/{passkey-config-B3P0nHRR.mjs → passkey-config-O_lj3y0k.mjs} +1 -1
- package/dist/{passkey-config-B3P0nHRR.mjs.map → passkey-config-O_lj3y0k.mjs.map} +1 -1
- package/dist/{placeholder-BR4ZhVJl.d.mts → placeholder-4X9BrRrp.d.mts} +1 -1
- package/dist/{placeholder-BR4ZhVJl.d.mts.map → placeholder-4X9BrRrp.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +8 -3
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-utils.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
- package/dist/{policy-BVRganJQ.mjs → policy-Dhtwntrt.mjs} +2 -2
- package/dist/{policy-BVRganJQ.mjs.map → policy-Dhtwntrt.mjs.map} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs → portable-text-U85hOafW.mjs} +1 -1
- package/dist/{portable-text-C8Tvp4_g.mjs.map → portable-text-U85hOafW.mjs.map} +1 -1
- package/dist/{preview-dn2dUyM0.mjs → preview-B_vJLvf8.mjs} +2 -2
- package/dist/{preview-dn2dUyM0.mjs.map → preview-B_vJLvf8.mjs.map} +1 -1
- package/dist/{protocol-CuBEsqgE.d.mts → protocol-JdD2YhY9.d.mts} +2 -2
- package/dist/{protocol-CuBEsqgE.d.mts.map → protocol-JdD2YhY9.d.mts.map} +1 -1
- package/dist/{public-url-DRz_AinV.mjs → public-url-CarhZJgf.mjs} +1 -1
- package/dist/{public-url-DRz_AinV.mjs.map → public-url-CarhZJgf.mjs.map} +1 -1
- package/dist/{query-D18vTdha.mjs → query-BZKZcG5b.mjs} +14 -14
- package/dist/{query-D18vTdha.mjs.map → query-BZKZcG5b.mjs.map} +1 -1
- package/dist/{query-tZDEdtCN.mjs → query-BndaFxxp.mjs} +4 -4
- package/dist/{query-tZDEdtCN.mjs.map → query-BndaFxxp.mjs.map} +1 -1
- package/dist/{rate-limit-on7KPo-v.mjs → rate-limit-BZmATC6W.mjs} +2 -2
- package/dist/{rate-limit-on7KPo-v.mjs.map → rate-limit-BZmATC6W.mjs.map} +1 -1
- package/dist/{redirect-DrbEmU9a.mjs → redirect-CzqnLxK-.mjs} +1 -1
- package/dist/{redirect-DrbEmU9a.mjs.map → redirect-CzqnLxK-.mjs.map} +1 -1
- package/dist/{redirects-CRIM55KH.mjs → redirects-BLNOWQTn.mjs} +63 -28
- package/dist/redirects-BLNOWQTn.mjs.map +1 -0
- package/dist/{redirects-BahWiu8Z.mjs → redirects-CqzNM0KM.mjs} +2 -2
- package/dist/{redirects-BahWiu8Z.mjs.map → redirects-CqzNM0KM.mjs.map} +1 -1
- package/dist/{registry-Cx-jEJOS.mjs → registry-AZAsRsor.mjs} +27 -9
- package/dist/registry-AZAsRsor.mjs.map +1 -0
- package/dist/{relation-A6wLF_DS.mjs → relation-04DfKRTO.mjs} +2 -2
- package/dist/{relation-A6wLF_DS.mjs.map → relation-04DfKRTO.mjs.map} +1 -1
- package/dist/{relations-BTPM2saV.mjs → relations-C4htk5sb.mjs} +7 -7
- package/dist/relations-C4htk5sb.mjs.map +1 -0
- package/dist/{relations-Cj5hZ6Zg.mjs → relations-CcFwDJdJ.mjs} +4 -4
- package/dist/{relations-Cj5hZ6Zg.mjs.map → relations-CcFwDJdJ.mjs.map} +1 -1
- package/dist/{relations-C7B46bcU.d.mts → relations-DnRK4YIT.d.mts} +175 -41
- package/dist/relations-DnRK4YIT.d.mts.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-DRp5ENd_.mjs → request-meta-DYxLlnmz.mjs} +2 -2
- package/dist/{request-meta-DRp5ENd_.mjs.map → request-meta-DYxLlnmz.mjs.map} +1 -1
- package/dist/{resolve-DxUpTMmE.mjs → resolve-prZ3mP7l.mjs} +1 -1
- package/dist/{resolve-DxUpTMmE.mjs.map → resolve-prZ3mP7l.mjs.map} +1 -1
- package/dist/{runner-77GOZCnH.mjs → runner-BLIDKpmA.mjs} +351 -294
- package/dist/runner-BLIDKpmA.mjs.map +1 -0
- package/dist/{runner-zgqA_CqP.d.mts → runner-YKfIMnaF.d.mts} +3 -2
- package/dist/runner-YKfIMnaF.d.mts.map +1 -0
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +1 -1
- package/dist/{schema-BY-oVntF.mjs → schema-CGnBeLiW.mjs} +3 -3
- package/dist/{schema-BY-oVntF.mjs.map → schema-CGnBeLiW.mjs.map} +1 -1
- package/dist/{schema-Cw9kVK0I.mjs → schema-DYr-Vd-L.mjs} +5 -5
- package/dist/{schema-Cw9kVK0I.mjs.map → schema-DYr-Vd-L.mjs.map} +1 -1
- package/dist/{scopes-vMR1uIbt.mjs → scopes-BhWvBavj.mjs} +3 -3
- package/dist/{scopes-vMR1uIbt.mjs.map → scopes-BhWvBavj.mjs.map} +1 -1
- package/dist/{search-CfT3KxO5.mjs → search-C-qDk4kx.mjs} +4 -4
- package/dist/{search-CfT3KxO5.mjs.map → search-C-qDk4kx.mjs.map} +1 -1
- package/dist/{secrets-BH2Qow1-.mjs → secrets-rEtHt-6z.mjs} +1 -1
- package/dist/{secrets-BH2Qow1-.mjs.map → secrets-rEtHt-6z.mjs.map} +1 -1
- package/dist/{sections-DTfjyf1z.mjs → sections-B_nYvlwn.mjs} +2 -2
- package/dist/{sections-DTfjyf1z.mjs.map → sections-B_nYvlwn.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +18 -18
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +13 -13
- package/dist/{seo-Cm-dtvgk.mjs → seo-926NRIgt.mjs} +3 -3
- package/dist/{seo-Cm-dtvgk.mjs.map → seo-926NRIgt.mjs.map} +1 -1
- package/dist/{seo-BSiTIXzd.mjs → seo-CVWkdv6x.mjs} +1 -1
- package/dist/{seo-BSiTIXzd.mjs.map → seo-CVWkdv6x.mjs.map} +1 -1
- package/dist/{service-DYsDHEKe.mjs → service-CJl3ZAYs.mjs} +3 -3
- package/dist/{service-DYsDHEKe.mjs.map → service-CJl3ZAYs.mjs.map} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs → session-user-BlMgqCHS.mjs} +1 -1
- package/dist/{session-user-CNAfvsdw.mjs.map → session-user-BlMgqCHS.mjs.map} +1 -1
- package/dist/{settings-BgN-0DT-.mjs → settings--wobrkkC.mjs} +18 -5
- package/dist/settings--wobrkkC.mjs.map +1 -0
- package/dist/{settings-DjtkUo__.mjs → settings-Cwm6o2jY.mjs} +3 -3
- package/dist/{settings-DjtkUo__.mjs.map → settings-Cwm6o2jY.mjs.map} +1 -1
- package/dist/{setup-complete-CcpXaPU7.mjs → setup-complete-DQbClIN2.mjs} +1 -1
- package/dist/{setup-complete-CcpXaPU7.mjs.map → setup-complete-DQbClIN2.mjs.map} +1 -1
- package/dist/{setup-nonce-Reyw30jg.mjs → setup-nonce-DZCFS2sn.mjs} +1 -1
- package/dist/{setup-nonce-Reyw30jg.mjs.map → setup-nonce-DZCFS2sn.mjs.map} +1 -1
- package/dist/{site-url-Cs_V9n3V.mjs → site-url-BrxA_E9H.mjs} +2 -2
- package/dist/{site-url-Cs_V9n3V.mjs.map → site-url-BrxA_E9H.mjs.map} +1 -1
- package/dist/{snapshot-DSB8P7Lm.mjs → snapshot--OCDTqdb.mjs} +1 -1
- package/dist/{snapshot-DSB8P7Lm.mjs.map → snapshot--OCDTqdb.mjs.map} +1 -1
- package/dist/{ssrf-DqebVE34.mjs → ssrf-5sIM5jzl.mjs} +4 -3
- package/dist/{ssrf-DqebVE34.mjs.map → ssrf-5sIM5jzl.mjs.map} +1 -1
- package/dist/{state-BJfU9Uzw.mjs → state-BpFVsJZB.mjs} +1 -1
- package/dist/{state-BJfU9Uzw.mjs.map → state-BpFVsJZB.mjs.map} +1 -1
- package/dist/{status-DDu8HIQl.mjs → status-B777-dXz.mjs} +1 -1
- package/dist/{status-DDu8HIQl.mjs.map → status-B777-dXz.mjs.map} +1 -1
- package/dist/storage/local.d.mts +2 -1
- package/dist/storage/local.d.mts.map +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/local.mjs.map +1 -1
- package/dist/storage/s3.d.mts +2 -1
- package/dist/storage/s3.d.mts.map +1 -1
- package/dist/storage/s3.mjs +3 -2
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/{target-D0o26Azo.mjs → target-BmR0iTwz.mjs} +1 -1
- package/dist/{target-D0o26Azo.mjs.map → target-BmR0iTwz.mjs.map} +1 -1
- package/dist/{taxonomies-CPGxo-bn.mjs → taxonomies-DkAkMupr.mjs} +16 -13
- package/dist/taxonomies-DkAkMupr.mjs.map +1 -0
- package/dist/{taxonomies-kmyudNGP.mjs → taxonomies-Wfy_Lg12.mjs} +42 -16
- package/dist/taxonomies-Wfy_Lg12.mjs.map +1 -0
- package/dist/{taxonomy-8X09dLN5.mjs → taxonomy-tJepplLL.mjs} +4 -4
- package/dist/{taxonomy-8X09dLN5.mjs.map → taxonomy-tJepplLL.mjs.map} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs → tokens-BCO1oruF.mjs} +1 -1
- package/dist/{tokens-gTS-IVUp.mjs.map → tokens-BCO1oruF.mjs.map} +1 -1
- package/dist/{transport-fX59xaJz.mjs → transport-Dr3qtwXC.mjs} +1 -1
- package/dist/{transport-fX59xaJz.mjs.map → transport-Dr3qtwXC.mjs.map} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts → transport-xh6YKW2G.d.mts} +1 -1
- package/dist/{transport-_6R1ub7t.d.mts.map → transport-xh6YKW2G.d.mts.map} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs → trusted-proxy-BR5F1Otp.mjs} +1 -1
- package/dist/{trusted-proxy-fe6nEgR4.mjs.map → trusted-proxy-BR5F1Otp.mjs.map} +1 -1
- package/dist/{types-BXUmsINL.mjs → types-3qNFPlci.mjs} +1 -1
- package/dist/{types-BXUmsINL.mjs.map → types-3qNFPlci.mjs.map} +1 -1
- package/dist/{types-Vg6f5i3s.d.mts → types-B6GrPic4.d.mts} +9 -3
- package/dist/{types-Vg6f5i3s.d.mts.map → types-B6GrPic4.d.mts.map} +1 -1
- package/dist/{types-DJQxln7q.d.mts → types-BuHW4xDE.d.mts} +11 -10
- package/dist/types-BuHW4xDE.d.mts.map +1 -0
- package/dist/{types-BzBd3PeX.d.mts → types-C00oyCZp.d.mts} +1 -1
- package/dist/{types-BzBd3PeX.d.mts.map → types-C00oyCZp.d.mts.map} +1 -1
- package/dist/{types-Blb-MRC3.d.mts → types-CDtkNSFQ.d.mts} +1 -1
- package/dist/{types-Blb-MRC3.d.mts.map → types-CDtkNSFQ.d.mts.map} +1 -1
- package/dist/{types-D5VVLr7J.d.mts → types-CPeXo1wF.d.mts} +1 -1
- package/dist/{types-D5VVLr7J.d.mts.map → types-CPeXo1wF.d.mts.map} +1 -1
- package/dist/types-CQPWhPxE.mjs.map +1 -1
- package/dist/{types-D_DWe7k9.d.mts → types-CXFkwEGC.d.mts} +3 -2
- package/dist/types-CXFkwEGC.d.mts.map +1 -0
- package/dist/{types-CLqvnd05.d.mts → types-DczELMop.d.mts} +1 -1
- package/dist/{types-CLqvnd05.d.mts.map → types-DczELMop.d.mts.map} +1 -1
- package/dist/types-DfuTR6dL.mjs +3 -0
- package/dist/{types-DHxzBjbD.d.mts → types-FV23hEoW.d.mts} +1 -1
- package/dist/{types-DHxzBjbD.d.mts.map → types-FV23hEoW.d.mts.map} +1 -1
- package/dist/{types-Br-ERaxh.d.mts → types-xDMtUFnO.d.mts} +1 -1
- package/dist/{types-Br-ERaxh.d.mts.map → types-xDMtUFnO.d.mts.map} +1 -1
- package/dist/{upload-attempts-CNyGSepg.mjs → upload-attempts-BsqoQ1fn.mjs} +1 -1
- package/dist/{upload-attempts-CNyGSepg.mjs.map → upload-attempts-BsqoQ1fn.mjs.map} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs → url-pattern-D4c2czpJ.mjs} +1 -1
- package/dist/{url-pattern-K-KdXcSe.mjs.map → url-pattern-D4c2czpJ.mjs.map} +1 -1
- package/dist/{user-CtYY0tp2.mjs → user-BTZ40aq6.mjs} +2 -2
- package/dist/{user-CtYY0tp2.mjs.map → user-BTZ40aq6.mjs.map} +1 -1
- package/dist/{utils-HztC73hq.mjs → utils-BKvNjjhY.mjs} +1 -1
- package/dist/{utils-HztC73hq.mjs.map → utils-BKvNjjhY.mjs.map} +1 -1
- package/dist/{validate-Dd-IUjnZ.mjs → validate-DE_LRwo9.mjs} +2 -2
- package/dist/{validate-Dd-IUjnZ.mjs.map → validate-DE_LRwo9.mjs.map} +1 -1
- package/dist/{validate-DlqdOZXB.d.mts → validate-DUP27OYD.d.mts} +5 -5
- package/dist/{validate-DlqdOZXB.d.mts.map → validate-DUP27OYD.d.mts.map} +1 -1
- package/dist/{validation-D83n7Npi.mjs → validation-BMImFJ11.mjs} +8 -8
- package/dist/{validation-D83n7Npi.mjs.map → validation-BMImFJ11.mjs.map} +1 -1
- package/dist/version-Bii3suaO.mjs +7 -0
- package/dist/{version-ri-sCyAp.mjs.map → version-Bii3suaO.mjs.map} +1 -1
- package/dist/{widgets-CpmZd9Q-.mjs → widgets-D3gJ10xU.mjs} +17 -4
- package/dist/widgets-D3gJ10xU.mjs.map +1 -0
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts → wxr-taxonomies-B2Og_6rU.d.mts} +1 -1
- package/dist/{wxr-taxonomies-BFd0y72_.d.mts.map → wxr-taxonomies-B2Og_6rU.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs → wxr-taxonomies-Cxngsjwo.mjs} +4 -4
- package/dist/{wxr-taxonomies-Df4vxWcU.mjs.map → wxr-taxonomies-Cxngsjwo.mjs.map} +1 -1
- package/dist/{zod-generator-DylzusHh.mjs → zod-generator-BuYSQJB7.mjs} +11 -7
- package/dist/zod-generator-BuYSQJB7.mjs.map +1 -0
- package/package.json +12 -9
- package/src/api/errors.ts +2 -0
- package/src/api/handlers/content.ts +49 -11
- package/src/api/handlers/index.ts +1 -0
- package/src/api/handlers/manifest.ts +161 -12
- package/src/api/handlers/media.ts +30 -0
- package/src/api/handlers/registry.ts +393 -289
- package/src/api/handlers/taxonomies.ts +16 -9
- package/src/api/openapi/document.ts +85 -5
- package/src/api/parse.ts +1 -1
- package/src/api/schemas/auth.ts +4 -4
- package/src/api/schemas/bylines.ts +3 -3
- package/src/api/schemas/comments.ts +1 -1
- package/src/api/schemas/common.ts +3 -2
- package/src/api/schemas/content.ts +78 -22
- package/src/api/schemas/media.ts +52 -0
- package/src/api/schemas/redirects.ts +6 -1
- package/src/api/schemas/schema.ts +4 -0
- package/src/api/schemas/setup.ts +1 -1
- package/src/api/schemas/taxonomies.ts +2 -2
- package/src/api/schemas/users.ts +1 -1
- package/src/api/types.ts +23 -10
- package/src/astro/dev-typegen.ts +35 -0
- package/src/astro/image-endpoint.ts +2 -2
- package/src/astro/integration/dev-typegen.ts +91 -0
- package/src/astro/integration/index.ts +9 -44
- package/src/astro/integration/routes.ts +5 -0
- package/src/astro/integration/vite-config.ts +21 -2
- package/src/astro/middleware.ts +5 -0
- package/src/astro/routes/api/admin/api-tokens/index.ts +4 -1
- package/src/astro/routes/api/admin/oauth-clients/[id].ts +1 -1
- package/src/astro/routes/api/admin/oauth-clients/index.ts +1 -1
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/artifact.ts +3 -7
- package/src/astro/routes/api/admin/plugins/registry/install.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/verify.ts +60 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +8 -2
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -1
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +6 -2
- package/src/astro/routes/api/manifest.ts +1 -1
- package/src/astro/routes/api/media/[id]/replace.ts +114 -0
- package/src/astro/routes/api/media/file/[...key].ts +4 -1
- package/src/astro/routes/api/media/upload-url.ts +8 -4
- package/src/astro/routes/api/media.ts +54 -8
- package/src/astro/routes/api/menus/[name]/items/[id].ts +7 -2
- package/src/astro/routes/api/menus/[name]/items.ts +4 -1
- package/src/astro/routes/api/menus/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/menus/[name]/translations.ts +4 -1
- package/src/astro/routes/api/menus/[name].ts +7 -2
- package/src/astro/routes/api/menus/index.ts +4 -1
- package/src/astro/routes/api/settings/email.ts +1 -1
- package/src/astro/routes/api/settings.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/reorder.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +7 -2
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +4 -1
- package/src/astro/routes/api/taxonomies/[name].ts +7 -2
- package/src/astro/routes/api/taxonomies/index.ts +4 -1
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +5 -2
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +3 -1
- package/src/astro/routes/api/widget-areas/[name].ts +3 -1
- package/src/astro/routes/api/widget-areas/index.ts +3 -1
- package/src/astro/types.ts +23 -5
- package/src/auth/challenge-store.ts +3 -1
- package/src/aws-sdk.d.ts +1 -0
- package/src/cache/chrome-tags.ts +24 -0
- package/src/components/EmDashImage.astro +2 -1
- package/src/components/EmDashMedia.astro +2 -1
- package/src/components/InlinePortableTextEditor.tsx +6 -1
- package/src/components/widgets/Archives.astro +2 -37
- package/src/content/converters/index.ts +2 -0
- package/src/content/converters/mark-safety.ts +1 -0
- package/src/content/converters/portable-text-identity.ts +139 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +202 -69
- package/src/content/converters/prosemirror-to-portable-text.ts +96 -25
- package/src/content/converters/types.ts +1 -0
- package/src/database/migrations/017_authorization_codes.ts +14 -4
- package/src/database/migrations/074_content_deleted_scheduled_index.ts +55 -0
- package/src/database/migrations/runner.ts +3 -1
- package/src/database/repositories/byline.ts +32 -16
- package/src/database/repositories/content.ts +114 -47
- package/src/database/repositories/media-usage.ts +66 -37
- package/src/database/repositories/media.ts +60 -1
- package/src/database/repositories/plugin-storage.ts +74 -9
- package/src/database/repositories/types.ts +8 -7
- package/src/db/adapters.ts +8 -1
- package/src/db/postgres.ts +23 -0
- package/src/emdash-runtime.ts +80 -150
- package/src/fields/boolean.ts +1 -1
- package/src/fields/datetime.ts +1 -1
- package/src/fields/file.ts +1 -1
- package/src/fields/integer.ts +1 -1
- package/src/fields/json.ts +1 -1
- package/src/fields/multiselect.ts +1 -1
- package/src/fields/number.ts +1 -1
- package/src/fields/portable-text.ts +1 -1
- package/src/fields/richtext.ts +1 -1
- package/src/fields/select.ts +1 -1
- package/src/fields/slug.ts +1 -1
- package/src/fields/text.ts +1 -1
- package/src/fields/textarea.ts +1 -1
- package/src/fields/types.ts +2 -2
- package/src/index.ts +25 -3
- package/src/loader.ts +63 -10
- package/src/mcp/server.ts +228 -24
- package/src/media/image-endpoint.ts +5 -2
- package/src/media/normalize.ts +15 -4
- package/src/media/usage/cleanup.ts +9 -8
- package/src/menus/index.ts +16 -0
- package/src/object-cache/index.ts +44 -2
- package/src/plugin-types.ts +18 -1
- package/src/plugins/hooks.ts +4 -1
- package/src/plugins/index.ts +6 -0
- package/src/plugins/manager.ts +2 -1
- package/src/plugins/manifest-schema.ts +1 -1
- package/src/plugins/routes.ts +3 -1
- package/src/plugins/sandbox/hook-result.ts +52 -0
- package/src/plugins/sandbox/index.ts +10 -0
- package/src/plugins/types.ts +6 -0
- package/src/registry/artifact-checksum.ts +15 -0
- package/src/registry/artifact-verification.ts +85 -0
- package/src/registry/authoritative-records.ts +180 -0
- package/src/registry/record-labels.ts +28 -0
- package/src/schema/registry.ts +26 -3
- package/src/schema/zod-generator.ts +16 -13
- package/src/security/ssrf.ts +5 -2
- package/src/settings/index.ts +16 -0
- package/src/storage/local.ts +1 -0
- package/src/storage/s3.ts +2 -0
- package/src/storage/types.ts +2 -0
- package/src/taxonomies/index.ts +40 -20
- package/src/widgets/archives.ts +67 -0
- package/src/widgets/index.ts +16 -0
- package/dist/api-B0w3uBiG.mjs +0 -2269
- package/dist/api-B0w3uBiG.mjs.map +0 -1
- package/dist/byline-Cpnwrje1.mjs.map +0 -1
- package/dist/challenge-store-D5pSY2S1.mjs.map +0 -1
- package/dist/content-CP-SeXNa.mjs.map +0 -1
- package/dist/content-refresh-DLOfIhYc.mjs.map +0 -1
- package/dist/context-BR5hRWiK.mjs.map +0 -1
- package/dist/errors-n2j49uNf.mjs.map +0 -1
- package/dist/index-DWbJrsAg.d.mts.map +0 -1
- package/dist/loader-ZsjE4paL.mjs.map +0 -1
- package/dist/manifest-schema-CUYPfCEH.mjs.map +0 -1
- package/dist/media-BjwNuLEu.mjs.map +0 -1
- package/dist/media-D6SeAfBl.mjs.map +0 -1
- package/dist/menus-CNg0QlDt.mjs.map +0 -1
- package/dist/normalize-CSxdKBVa.mjs.map +0 -1
- package/dist/object-cache-71tPfV4A.mjs.map +0 -1
- package/dist/options-BhZIeFY1.d.mts.map +0 -1
- package/dist/redirects-CRIM55KH.mjs.map +0 -1
- package/dist/registry-BiO5WwPq.mjs +0 -2716
- package/dist/registry-BiO5WwPq.mjs.map +0 -1
- package/dist/registry-Cx-jEJOS.mjs.map +0 -1
- package/dist/relations-BTPM2saV.mjs.map +0 -1
- package/dist/relations-C7B46bcU.d.mts.map +0 -1
- package/dist/runner-77GOZCnH.mjs.map +0 -1
- package/dist/runner-zgqA_CqP.d.mts.map +0 -1
- package/dist/settings-BgN-0DT-.mjs.map +0 -1
- package/dist/taxonomies-CPGxo-bn.mjs.map +0 -1
- package/dist/taxonomies-kmyudNGP.mjs.map +0 -1
- package/dist/types-D6OcIp2P.mjs +0 -3
- package/dist/types-DJQxln7q.d.mts.map +0 -1
- package/dist/types-D_DWe7k9.d.mts.map +0 -1
- package/dist/version-ri-sCyAp.mjs +0 -7
- package/dist/widgets-CpmZd9Q-.mjs.map +0 -1
- package/dist/zod-generator-DylzusHh.mjs.map +0 -1
- /package/dist/{api-tokens-B5NHLNUN.mjs → api-tokens-BfYts-sq.mjs} +0 -0
- /package/dist/{ssrf-BPKzkm6O.mjs → ssrf-Dg3cIT-b.mjs} +0 -0
package/src/mcp/server.ts
CHANGED
|
@@ -21,8 +21,10 @@ import {
|
|
|
21
21
|
contentBylineInputSchema,
|
|
22
22
|
contentSeoInput,
|
|
23
23
|
createCollectionBody,
|
|
24
|
+
createTaxonomyDefBody,
|
|
24
25
|
updateCollectionBody,
|
|
25
26
|
updateFieldBody,
|
|
27
|
+
updateTaxonomyDefBody,
|
|
26
28
|
} from "#api/schemas.js";
|
|
27
29
|
|
|
28
30
|
import type { MediaUsageRepairRequest } from "../api/schemas/media-usage.js";
|
|
@@ -37,8 +39,34 @@ import { decodeBase64, encodeBase64 } from "../utils/base64.js";
|
|
|
37
39
|
const COLLECTION_SLUG_PATTERN = /^[a-z][a-z0-9_]*$/;
|
|
38
40
|
/** http(s) scheme matcher used by `settings_update` URL validation. */
|
|
39
41
|
const HTTP_SCHEME_PATTERN = /^https?:\/\//i;
|
|
42
|
+
/**
|
|
43
|
+
* Shared wording for the `_rev` parameter on write tools. Agents only see the
|
|
44
|
+
* tool schema, so the retry protocol is stated here.
|
|
45
|
+
*/
|
|
46
|
+
const REV_PARAM_DESCRIPTION =
|
|
47
|
+
"Revision token proving you have read the current item. Call content_get " +
|
|
48
|
+
"first and pass back the _rev it returns. If this call fails with CONFLICT " +
|
|
49
|
+
"the item changed in the meantime: call content_get again and retry with " +
|
|
50
|
+
"the new token.";
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Replaces Zod's "expected string, received undefined" for a caller that never
|
|
54
|
+
* read the schema, so the message says where the token comes from.
|
|
55
|
+
*/
|
|
56
|
+
const REV_MISSING_ERROR =
|
|
57
|
+
"_rev is required: call content_get for this item and pass back the _rev it returns.";
|
|
58
|
+
|
|
40
59
|
const TAXONOMY_CURSOR_VERSION = 2;
|
|
41
60
|
const MAX_TAXONOMY_CURSOR_LENGTH = 2048;
|
|
61
|
+
const contentDateTimeInputSchema = z.iso
|
|
62
|
+
.datetime({ offset: true, message: "must be an ISO 8601 datetime" })
|
|
63
|
+
.or(
|
|
64
|
+
z.iso.datetime({
|
|
65
|
+
offset: true,
|
|
66
|
+
precision: -1,
|
|
67
|
+
message: "must be an ISO 8601 datetime",
|
|
68
|
+
}),
|
|
69
|
+
);
|
|
42
70
|
|
|
43
71
|
// ---------------------------------------------------------------------------
|
|
44
72
|
// Shared schemas — kept in sync with `api/schemas/settings.ts` (which the
|
|
@@ -150,6 +178,12 @@ const schemaUpdateCollectionToolSchema = z.object({
|
|
|
150
178
|
commentsAutoApproveUsers: updateCollectionBody.shape.commentsAutoApproveUsers.describe(
|
|
151
179
|
"Whether comments from authenticated users are automatically approved",
|
|
152
180
|
),
|
|
181
|
+
titleField: updateCollectionBody.shape.titleField.describe(
|
|
182
|
+
"Field slug to use as the Title column in admin lists; pass null to fall back to the default",
|
|
183
|
+
),
|
|
184
|
+
dateField: updateCollectionBody.shape.dateField.describe(
|
|
185
|
+
"Datetime field slug to use as the Date column in admin lists; pass null to fall back to the default",
|
|
186
|
+
),
|
|
153
187
|
});
|
|
154
188
|
|
|
155
189
|
const schemaUpdateFieldToolSchema = z.object({
|
|
@@ -617,6 +651,13 @@ function extractContentId(data: unknown): string | undefined {
|
|
|
617
651
|
return typeof item?.id === "string" ? item.id : undefined;
|
|
618
652
|
}
|
|
619
653
|
|
|
654
|
+
/** Extract the `_rev` token from a content handler response. */
|
|
655
|
+
function extractContentRev(data: unknown): string | undefined {
|
|
656
|
+
if (!data || typeof data !== "object") return undefined;
|
|
657
|
+
const rev = (data as Record<string, unknown>)._rev;
|
|
658
|
+
return typeof rev === "string" ? rev : undefined;
|
|
659
|
+
}
|
|
660
|
+
|
|
620
661
|
// ---------------------------------------------------------------------------
|
|
621
662
|
// Server factory
|
|
622
663
|
// ---------------------------------------------------------------------------
|
|
@@ -827,8 +868,9 @@ export function createMcpServer(
|
|
|
827
868
|
title: "Get Content",
|
|
828
869
|
description:
|
|
829
870
|
"Get a single content item by its ID or slug. Returns the full content data " +
|
|
830
|
-
"including all field values, metadata, and a _rev token
|
|
831
|
-
"
|
|
871
|
+
"including all field values, metadata, and a _rev token. content_update, " +
|
|
872
|
+
"content_publish, content_unpublish and content_discard_draft require that " +
|
|
873
|
+
"token, so read the item here before calling them.",
|
|
832
874
|
inputSchema: z.object({
|
|
833
875
|
collection: z.string().describe("Collection slug (e.g. 'posts', 'pages')"),
|
|
834
876
|
id: z.string().describe("Content item ID (ULID) or slug"),
|
|
@@ -995,9 +1037,12 @@ export function createMcpServer(
|
|
|
995
1037
|
"in the 'data' object — unspecified fields are left unchanged. Rich text " +
|
|
996
1038
|
"(portableText) fields accept a Markdown string (recommended, converted " +
|
|
997
1039
|
"automatically); use a Portable Text JSON array only for complex content " +
|
|
998
|
-
"Markdown can't express (custom blocks, embeds).
|
|
999
|
-
"
|
|
1000
|
-
"
|
|
1040
|
+
"Markdown can't express (custom blocks, embeds). Requires the _rev " +
|
|
1041
|
+
"token from content_get, so read the item before updating it: the " +
|
|
1042
|
+
"update fails if the item changed since that read. When status is not " +
|
|
1043
|
+
"set, a change to a published item is staged as a draft, so the " +
|
|
1044
|
+
"response shows the new values while the live version keeps the old " +
|
|
1045
|
+
"ones until content_publish. " +
|
|
1001
1046
|
"`seo` and `bylines` are persisted alongside the field updates in a " +
|
|
1002
1047
|
"single transaction. `publishedAt` requires the content:publish_any " +
|
|
1003
1048
|
"permission and is useful for migrations or correcting historical dates.",
|
|
@@ -1043,16 +1088,12 @@ export function createMcpServer(
|
|
|
1043
1088
|
.describe(
|
|
1044
1089
|
"Replace taxonomy term assignments as { taxonomyName: [termSlug, ...] }. Term slugs are resolved in the entry's locale. Only named taxonomies are touched; other taxonomies are left unchanged. Pass an empty array to clear a taxonomy.",
|
|
1045
1090
|
),
|
|
1046
|
-
publishedAt:
|
|
1047
|
-
.datetime({ offset: true, message: "must be an ISO 8601 datetime" })
|
|
1091
|
+
publishedAt: contentDateTimeInputSchema
|
|
1048
1092
|
.nullish()
|
|
1049
1093
|
.describe(
|
|
1050
1094
|
"Override the publication timestamp (ISO 8601). Requires content:publish_any permission. Pass null to clear. Useful for content migrations.",
|
|
1051
1095
|
),
|
|
1052
|
-
_rev: z
|
|
1053
|
-
.string()
|
|
1054
|
-
.optional()
|
|
1055
|
-
.describe("Revision token from content_get for conflict detection"),
|
|
1096
|
+
_rev: z.string({ error: REV_MISSING_ERROR }).describe(REV_PARAM_DESCRIPTION),
|
|
1056
1097
|
}),
|
|
1057
1098
|
},
|
|
1058
1099
|
async (args, extra) => {
|
|
@@ -1090,6 +1131,7 @@ export function createMcpServer(
|
|
|
1090
1131
|
// Status transitions route through dedicated handlers for proper revision management
|
|
1091
1132
|
if (args.status === "published") {
|
|
1092
1133
|
requireOwnership(extra, ownerId, "content:publish_own", "content:publish_any");
|
|
1134
|
+
let rev: string | undefined = args._rev;
|
|
1093
1135
|
if (
|
|
1094
1136
|
args.data ||
|
|
1095
1137
|
args.slug ||
|
|
@@ -1110,12 +1152,16 @@ export function createMcpServer(
|
|
|
1110
1152
|
_rev: args._rev,
|
|
1111
1153
|
});
|
|
1112
1154
|
if (!updateResult.success) return unwrap(updateResult);
|
|
1155
|
+
rev = extractContentRev(updateResult.data);
|
|
1113
1156
|
}
|
|
1114
|
-
return unwrap(
|
|
1157
|
+
return unwrap(
|
|
1158
|
+
await emdash.handleContentPublish(args.collection, resolvedId, { _rev: rev }),
|
|
1159
|
+
);
|
|
1115
1160
|
}
|
|
1116
1161
|
|
|
1117
1162
|
if (args.status === "draft") {
|
|
1118
1163
|
requireOwnership(extra, ownerId, "content:publish_own", "content:publish_any");
|
|
1164
|
+
let rev: string | undefined = args._rev;
|
|
1119
1165
|
if (
|
|
1120
1166
|
args.data ||
|
|
1121
1167
|
args.slug ||
|
|
@@ -1136,8 +1182,11 @@ export function createMcpServer(
|
|
|
1136
1182
|
_rev: args._rev,
|
|
1137
1183
|
});
|
|
1138
1184
|
if (!updateResult.success) return unwrap(updateResult);
|
|
1185
|
+
rev = extractContentRev(updateResult.data);
|
|
1139
1186
|
}
|
|
1140
|
-
return unwrap(
|
|
1187
|
+
return unwrap(
|
|
1188
|
+
await emdash.handleContentUnpublish(args.collection, resolvedId, { _rev: rev }),
|
|
1189
|
+
);
|
|
1141
1190
|
}
|
|
1142
1191
|
|
|
1143
1192
|
return unwrap(
|
|
@@ -1260,8 +1309,8 @@ export function createMcpServer(
|
|
|
1260
1309
|
inputSchema: z.object({
|
|
1261
1310
|
collection: z.string().describe("Collection slug"),
|
|
1262
1311
|
id: z.string().describe("Content item ID or slug"),
|
|
1263
|
-
|
|
1264
|
-
|
|
1312
|
+
_rev: z.string({ error: REV_MISSING_ERROR }).describe(REV_PARAM_DESCRIPTION),
|
|
1313
|
+
publishedAt: contentDateTimeInputSchema
|
|
1265
1314
|
.optional()
|
|
1266
1315
|
.describe(
|
|
1267
1316
|
"Override publication timestamp (ISO 8601). Requires content:publish_any permission. Useful when importing content with original publish dates.",
|
|
@@ -1297,6 +1346,7 @@ export function createMcpServer(
|
|
|
1297
1346
|
return unwrap(
|
|
1298
1347
|
await emdash.handleContentPublish(args.collection, resolvedId, {
|
|
1299
1348
|
publishedAt: args.publishedAt,
|
|
1349
|
+
_rev: args._rev,
|
|
1300
1350
|
}),
|
|
1301
1351
|
);
|
|
1302
1352
|
},
|
|
@@ -1308,10 +1358,11 @@ export function createMcpServer(
|
|
|
1308
1358
|
title: "Unpublish Content",
|
|
1309
1359
|
description:
|
|
1310
1360
|
"Unpublish a content item, reverting it to draft status. It will no " +
|
|
1311
|
-
"longer be visible on the live site but its content
|
|
1361
|
+
"longer be visible on the live site, but its content and publication date are preserved.",
|
|
1312
1362
|
inputSchema: z.object({
|
|
1313
1363
|
collection: z.string().describe("Collection slug"),
|
|
1314
1364
|
id: z.string().describe("Content item ID or slug"),
|
|
1365
|
+
_rev: z.string({ error: REV_MISSING_ERROR }).describe(REV_PARAM_DESCRIPTION),
|
|
1315
1366
|
}),
|
|
1316
1367
|
},
|
|
1317
1368
|
async (args, extra) => {
|
|
@@ -1332,7 +1383,9 @@ export function createMcpServer(
|
|
|
1332
1383
|
);
|
|
1333
1384
|
|
|
1334
1385
|
const resolvedId = extractContentId(existing.data) ?? args.id;
|
|
1335
|
-
return unwrap(
|
|
1386
|
+
return unwrap(
|
|
1387
|
+
await ec.handleContentUnpublish(args.collection, resolvedId, { _rev: args._rev }),
|
|
1388
|
+
);
|
|
1336
1389
|
},
|
|
1337
1390
|
);
|
|
1338
1391
|
|
|
@@ -1440,6 +1493,7 @@ export function createMcpServer(
|
|
|
1440
1493
|
inputSchema: z.object({
|
|
1441
1494
|
collection: z.string().describe("Collection slug"),
|
|
1442
1495
|
id: z.string().describe("Content item ID or slug"),
|
|
1496
|
+
_rev: z.string({ error: REV_MISSING_ERROR }).describe(REV_PARAM_DESCRIPTION),
|
|
1443
1497
|
}),
|
|
1444
1498
|
annotations: { destructiveHint: true },
|
|
1445
1499
|
},
|
|
@@ -1461,7 +1515,9 @@ export function createMcpServer(
|
|
|
1461
1515
|
);
|
|
1462
1516
|
|
|
1463
1517
|
const resolvedId = extractContentId(existing.data) ?? args.id;
|
|
1464
|
-
return unwrap(
|
|
1518
|
+
return unwrap(
|
|
1519
|
+
await ec.handleContentDiscardDraft(args.collection, resolvedId, { _rev: args._rev }),
|
|
1520
|
+
);
|
|
1465
1521
|
},
|
|
1466
1522
|
);
|
|
1467
1523
|
|
|
@@ -1969,7 +2025,7 @@ export function createMcpServer(
|
|
|
1969
2025
|
.describe("Target collection slug for reference fields"),
|
|
1970
2026
|
rows: z.number().optional().describe("Number of rows for textarea"),
|
|
1971
2027
|
})
|
|
1972
|
-
.
|
|
2028
|
+
.loose()
|
|
1973
2029
|
.optional()
|
|
1974
2030
|
.describe("Widget configuration"),
|
|
1975
2031
|
searchable: z
|
|
@@ -2168,7 +2224,6 @@ export function createMcpServer(
|
|
|
2168
2224
|
.optional()
|
|
2169
2225
|
.describe("Base64-encoded file contents. Provide exactly one of base64 / url."),
|
|
2170
2226
|
url: z
|
|
2171
|
-
.string()
|
|
2172
2227
|
.url()
|
|
2173
2228
|
.optional()
|
|
2174
2229
|
.describe(
|
|
@@ -2423,6 +2478,158 @@ export function createMcpServer(
|
|
|
2423
2478
|
},
|
|
2424
2479
|
);
|
|
2425
2480
|
|
|
2481
|
+
server.registerTool(
|
|
2482
|
+
"taxonomy_get",
|
|
2483
|
+
{
|
|
2484
|
+
title: "Get Taxonomy Definition",
|
|
2485
|
+
description:
|
|
2486
|
+
"Get a single taxonomy definition by name. Taxonomy definitions describe " +
|
|
2487
|
+
"a classification system (e.g. categories or tags), which collections " +
|
|
2488
|
+
"it applies to, and whether it is hierarchical. Pass `locale` to resolve " +
|
|
2489
|
+
"a specific translation; otherwise the lowest matching locale is returned.",
|
|
2490
|
+
inputSchema: z.object({
|
|
2491
|
+
name: z.string().describe("Taxonomy name (e.g. 'categories', 'tags')"),
|
|
2492
|
+
locale: z.string().optional().describe("Locale to resolve the definition for"),
|
|
2493
|
+
}),
|
|
2494
|
+
annotations: { readOnlyHint: true },
|
|
2495
|
+
},
|
|
2496
|
+
async (args, extra) => {
|
|
2497
|
+
requireScope(extra, "content:read");
|
|
2498
|
+
const ec = getEmDash(extra);
|
|
2499
|
+
try {
|
|
2500
|
+
const { handleTaxonomyGet } = await import("../api/handlers/taxonomies.js");
|
|
2501
|
+
return unwrap(await handleTaxonomyGet(ec.db, args.name, { locale: args.locale }));
|
|
2502
|
+
} catch (error) {
|
|
2503
|
+
return respondHandlerError(error, "TAXONOMY_GET_ERROR");
|
|
2504
|
+
}
|
|
2505
|
+
},
|
|
2506
|
+
);
|
|
2507
|
+
|
|
2508
|
+
server.registerTool(
|
|
2509
|
+
"taxonomy_create",
|
|
2510
|
+
{
|
|
2511
|
+
title: "Create Taxonomy Definition",
|
|
2512
|
+
description:
|
|
2513
|
+
"Create a new taxonomy definition. Definitions are per-locale; pass " +
|
|
2514
|
+
"`locale` when the same taxonomy name exists in multiple translations. " +
|
|
2515
|
+
"`collections` names which content types the taxonomy applies to. " +
|
|
2516
|
+
"If `translationOf` is set, the new definition joins the source's " +
|
|
2517
|
+
"translation group and inherits `hierarchical` and `collections` from " +
|
|
2518
|
+
"the source when those fields are omitted.",
|
|
2519
|
+
inputSchema: z.object({
|
|
2520
|
+
name: createTaxonomyDefBody.shape.name.describe(
|
|
2521
|
+
"Taxonomy name (lowercase letters, numbers, underscores)",
|
|
2522
|
+
),
|
|
2523
|
+
label: createTaxonomyDefBody.shape.label.describe("Display name"),
|
|
2524
|
+
labelSingular: createTaxonomyDefBody.shape.labelSingular.describe(
|
|
2525
|
+
"Singular form of the display name",
|
|
2526
|
+
),
|
|
2527
|
+
hierarchical: createTaxonomyDefBody.shape.hierarchical.describe(
|
|
2528
|
+
"Whether the taxonomy supports parent/child terms (defaults to false, or inherited from translationOf)",
|
|
2529
|
+
),
|
|
2530
|
+
collections: createTaxonomyDefBody.shape.collections.describe(
|
|
2531
|
+
"Collection slugs this taxonomy applies to (defaults to [], or inherited from translationOf)",
|
|
2532
|
+
),
|
|
2533
|
+
locale: z.string().optional().describe("Locale for this definition (e.g. 'fr-fr')"),
|
|
2534
|
+
translationOf: z
|
|
2535
|
+
.string()
|
|
2536
|
+
.optional()
|
|
2537
|
+
.describe("Existing taxonomy definition id to create this locale variant from"),
|
|
2538
|
+
}),
|
|
2539
|
+
},
|
|
2540
|
+
async (args, extra) => {
|
|
2541
|
+
requireScope(extra, "taxonomies:manage");
|
|
2542
|
+
requireRole(extra, Role.EDITOR);
|
|
2543
|
+
const ec = getEmDash(extra);
|
|
2544
|
+
try {
|
|
2545
|
+
const { handleTaxonomyCreate } = await import("../api/handlers/taxonomies.js");
|
|
2546
|
+
return unwrap(
|
|
2547
|
+
await handleTaxonomyCreate(ec.db, {
|
|
2548
|
+
name: args.name,
|
|
2549
|
+
label: args.label,
|
|
2550
|
+
labelSingular: args.labelSingular,
|
|
2551
|
+
hierarchical: args.hierarchical,
|
|
2552
|
+
collections: args.collections,
|
|
2553
|
+
locale: args.locale,
|
|
2554
|
+
translationOf: args.translationOf,
|
|
2555
|
+
}),
|
|
2556
|
+
);
|
|
2557
|
+
} catch (error) {
|
|
2558
|
+
return respondHandlerError(error, "TAXONOMY_CREATE_ERROR");
|
|
2559
|
+
}
|
|
2560
|
+
},
|
|
2561
|
+
);
|
|
2562
|
+
|
|
2563
|
+
server.registerTool(
|
|
2564
|
+
"taxonomy_update",
|
|
2565
|
+
{
|
|
2566
|
+
title: "Update Taxonomy Definition",
|
|
2567
|
+
description:
|
|
2568
|
+
"Update an existing taxonomy definition. The taxonomy `name` cannot be " +
|
|
2569
|
+
"changed. Pass `locale` to update a specific translation; otherwise the " +
|
|
2570
|
+
"lowest matching locale is updated. Any field may be omitted to leave it " +
|
|
2571
|
+
"unchanged.",
|
|
2572
|
+
inputSchema: z.object({
|
|
2573
|
+
name: z.string().describe("Taxonomy name to update"),
|
|
2574
|
+
label: updateTaxonomyDefBody.shape.label.describe("New display name"),
|
|
2575
|
+
labelSingular: updateTaxonomyDefBody.shape.labelSingular.describe(
|
|
2576
|
+
"New singular display name; pass null to clear",
|
|
2577
|
+
),
|
|
2578
|
+
hierarchical: updateTaxonomyDefBody.shape.hierarchical.describe(
|
|
2579
|
+
"Whether the taxonomy supports parent/child terms",
|
|
2580
|
+
),
|
|
2581
|
+
collections: updateTaxonomyDefBody.shape.collections.describe(
|
|
2582
|
+
"Collection slugs this taxonomy applies to",
|
|
2583
|
+
),
|
|
2584
|
+
locale: z.string().optional().describe("Locale of the definition to update"),
|
|
2585
|
+
}),
|
|
2586
|
+
},
|
|
2587
|
+
async (args, extra) => {
|
|
2588
|
+
requireScope(extra, "taxonomies:manage");
|
|
2589
|
+
requireRole(extra, Role.EDITOR);
|
|
2590
|
+
const ec = getEmDash(extra);
|
|
2591
|
+
try {
|
|
2592
|
+
const { handleTaxonomyUpdate } = await import("../api/handlers/taxonomies.js");
|
|
2593
|
+
return unwrap(
|
|
2594
|
+
await handleTaxonomyUpdate(ec.db, args.name, {
|
|
2595
|
+
label: args.label,
|
|
2596
|
+
labelSingular: args.labelSingular,
|
|
2597
|
+
hierarchical: args.hierarchical,
|
|
2598
|
+
collections: args.collections,
|
|
2599
|
+
locale: args.locale,
|
|
2600
|
+
}),
|
|
2601
|
+
);
|
|
2602
|
+
} catch (error) {
|
|
2603
|
+
return respondHandlerError(error, "TAXONOMY_UPDATE_ERROR");
|
|
2604
|
+
}
|
|
2605
|
+
},
|
|
2606
|
+
);
|
|
2607
|
+
|
|
2608
|
+
server.registerTool(
|
|
2609
|
+
"taxonomy_delete",
|
|
2610
|
+
{
|
|
2611
|
+
title: "Delete Taxonomy Definition",
|
|
2612
|
+
description:
|
|
2613
|
+
"Delete a taxonomy definition and all of its terms in every locale, " +
|
|
2614
|
+
"along with any content assignments those terms hold. This cannot be undone.",
|
|
2615
|
+
inputSchema: z.object({
|
|
2616
|
+
name: z.string().describe("Taxonomy name to delete"),
|
|
2617
|
+
}),
|
|
2618
|
+
annotations: { destructiveHint: true },
|
|
2619
|
+
},
|
|
2620
|
+
async (args, extra) => {
|
|
2621
|
+
requireScope(extra, "taxonomies:manage");
|
|
2622
|
+
requireRole(extra, Role.EDITOR);
|
|
2623
|
+
const ec = getEmDash(extra);
|
|
2624
|
+
try {
|
|
2625
|
+
const { handleTaxonomyDelete } = await import("../api/handlers/taxonomies.js");
|
|
2626
|
+
return unwrap(await handleTaxonomyDelete(ec.db, args.name));
|
|
2627
|
+
} catch (error) {
|
|
2628
|
+
return respondHandlerError(error, "TAXONOMY_DELETE_ERROR");
|
|
2629
|
+
}
|
|
2630
|
+
},
|
|
2631
|
+
);
|
|
2632
|
+
|
|
2426
2633
|
server.registerTool(
|
|
2427
2634
|
"taxonomy_list_terms",
|
|
2428
2635
|
{
|
|
@@ -3026,10 +3233,7 @@ export function createMcpServer(
|
|
|
3026
3233
|
.describe("Favicon media reference ({ mediaId, alt? })"),
|
|
3027
3234
|
url: z
|
|
3028
3235
|
.union([
|
|
3029
|
-
z
|
|
3030
|
-
.string()
|
|
3031
|
-
.url()
|
|
3032
|
-
.refine((u) => HTTP_SCHEME_PATTERN.test(u), "URL must use http or https"),
|
|
3236
|
+
z.url().refine((u) => HTTP_SCHEME_PATTERN.test(u), "URL must use http or https"),
|
|
3033
3237
|
z.literal(""),
|
|
3034
3238
|
])
|
|
3035
3239
|
.optional()
|
|
@@ -50,9 +50,12 @@ export interface ImageTransformOptions {
|
|
|
50
50
|
quality?: number;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
/** Long-lived
|
|
53
|
+
/** Long-lived cache for content-addressed image URLs. */
|
|
54
54
|
export const IMMUTABLE_IMAGE_CACHE = "public, max-age=31536000, immutable";
|
|
55
55
|
|
|
56
|
+
/** Cache policy for media keys that Replace original may overwrite. */
|
|
57
|
+
export const MUTABLE_MEDIA_CACHE_CONTROL = "public, max-age=0, must-revalidate";
|
|
58
|
+
|
|
56
59
|
/**
|
|
57
60
|
* Raster types safe to render inline. Anything else (SVG, PDF, ...) is served
|
|
58
61
|
* as an attachment so it can't execute as an active document. Mirrors the
|
|
@@ -77,7 +80,7 @@ const SAFE_INLINE_IMAGE_TYPES = new Set([
|
|
|
77
80
|
export function originalMediaHeaders(contentType: string): Record<string, string> {
|
|
78
81
|
return {
|
|
79
82
|
"Content-Type": contentType,
|
|
80
|
-
"Cache-Control":
|
|
83
|
+
"Cache-Control": MUTABLE_MEDIA_CACHE_CONTROL,
|
|
81
84
|
"X-Content-Type-Options": "nosniff",
|
|
82
85
|
"Content-Security-Policy":
|
|
83
86
|
"sandbox; default-src 'none'; img-src 'self'; style-src 'unsafe-inline'",
|
package/src/media/normalize.ts
CHANGED
|
@@ -15,6 +15,16 @@ import type { MediaProvider, MediaProviderItem, MediaValue } from "./types.js";
|
|
|
15
15
|
export const INTERNAL_MEDIA_PREFIX = "/_emdash/api/media/file/";
|
|
16
16
|
const URL_PATTERN = /^https?:\/\//;
|
|
17
17
|
|
|
18
|
+
export function normalizeLegacyExternalMediaValue(value: MediaValue): MediaValue {
|
|
19
|
+
if (value.provider !== "external-url") return value;
|
|
20
|
+
const src = value.src ?? value.previewUrl;
|
|
21
|
+
return {
|
|
22
|
+
...value,
|
|
23
|
+
provider: "external",
|
|
24
|
+
...(src === undefined ? {} : { src }),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
18
28
|
/**
|
|
19
29
|
* Normalize a media field value into a consistent MediaValue shape.
|
|
20
30
|
*
|
|
@@ -41,16 +51,17 @@ export async function normalizeMediaValue(
|
|
|
41
51
|
// Must have at least an id to be a valid media value
|
|
42
52
|
if (!("id" in value) && !("src" in value)) return null;
|
|
43
53
|
|
|
44
|
-
const
|
|
45
|
-
const
|
|
54
|
+
const parsed = normalizeLegacyExternalMediaValue(recordToMediaValue(value));
|
|
55
|
+
const provider = parsed.provider || "local";
|
|
56
|
+
const id = parsed.id;
|
|
46
57
|
|
|
47
58
|
// External URLs — return as-is, no server-side dimension detection
|
|
48
59
|
if (provider === "external") {
|
|
49
|
-
return
|
|
60
|
+
return parsed;
|
|
50
61
|
}
|
|
51
62
|
|
|
52
63
|
// Build the base value from the input
|
|
53
|
-
const result: MediaValue = { ...
|
|
64
|
+
const result: MediaValue = { ...parsed, provider };
|
|
54
65
|
|
|
55
66
|
// For local media, strip `src` — it's derived at display time from storageKey
|
|
56
67
|
if (provider === "local") {
|
|
@@ -81,14 +81,15 @@ export async function cleanupMediaUsage(db: Kysely<Database>): Promise<MediaUsag
|
|
|
81
81
|
);
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
84
|
+
const cutoff = claim.scanBeforeAt;
|
|
85
|
+
const candidates = await repo.findMediaUsageCleanupCandidates({
|
|
86
|
+
cutoff,
|
|
87
|
+
cursor: claim.cursor,
|
|
88
|
+
limit: MEDIA_USAGE_CLEANUP_CANDIDATE_LIMIT,
|
|
89
|
+
cleanupLease: cleanupLease(leaseToken),
|
|
90
|
+
canIssueStatement,
|
|
91
|
+
});
|
|
92
|
+
if (candidates) {
|
|
92
93
|
candidateRows = candidates.length;
|
|
93
94
|
scanHasMore = candidates.length === MEDIA_USAGE_CLEANUP_CANDIDATE_LIMIT;
|
|
94
95
|
|
package/src/menus/index.ts
CHANGED
|
@@ -11,11 +11,13 @@
|
|
|
11
11
|
import type { Kysely } from "kysely";
|
|
12
12
|
import { sql } from "kysely";
|
|
13
13
|
|
|
14
|
+
import { menuTag } from "../cache/chrome-tags.js";
|
|
14
15
|
import type { Database } from "../database/types.js";
|
|
15
16
|
import { validateIdentifier } from "../database/validate.js";
|
|
16
17
|
import { resolveLocale, resolveLocaleChain } from "../i18n/resolve.js";
|
|
17
18
|
import { getDb } from "../loader.js";
|
|
18
19
|
import { cachedQuery, CacheNamespace } from "../object-cache/index.js";
|
|
20
|
+
import type { CacheHint } from "../query.js";
|
|
19
21
|
import { requestCached } from "../request-cache.js";
|
|
20
22
|
import { chunks, SQL_BATCH_SIZE } from "../utils/chunks.js";
|
|
21
23
|
import { sanitizeHref } from "../utils/url.js";
|
|
@@ -126,6 +128,20 @@ export async function getMenusWithDb(
|
|
|
126
128
|
return query.execute();
|
|
127
129
|
}
|
|
128
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Get a menu by name with a Workers edge-cache hint.
|
|
133
|
+
*
|
|
134
|
+
* Use the returned `cacheHint` with `Astro.cache.set()` so pages that render
|
|
135
|
+
* this menu can be purged automatically when the menu is edited.
|
|
136
|
+
*/
|
|
137
|
+
export async function getMenuWithCacheHint(
|
|
138
|
+
name: string,
|
|
139
|
+
options: MenuQueryOptions = {},
|
|
140
|
+
): Promise<{ data: Menu | null; cacheHint: CacheHint }> {
|
|
141
|
+
const data = await getMenu(name, options);
|
|
142
|
+
return { data, cacheHint: { tags: [menuTag(name)] } };
|
|
143
|
+
}
|
|
144
|
+
|
|
129
145
|
/**
|
|
130
146
|
* Build a hierarchical menu tree from a flat list of items. Items are
|
|
131
147
|
* resolved against the given `locale` so references land on the right
|
|
@@ -46,6 +46,8 @@ interface BackendHolder {
|
|
|
46
46
|
backend: ObjectCacheBackend | null;
|
|
47
47
|
/** In-flight initialization promise (dedupes concurrent first calls). */
|
|
48
48
|
initPromise: Promise<ObjectCacheBackend | null> | null;
|
|
49
|
+
/** `Date.now()` when the in-flight initialization started. */
|
|
50
|
+
initPromiseAt?: number;
|
|
49
51
|
config: Required<Pick<ObjectCacheRuntimeConfig, "keyPrefix">> & {
|
|
50
52
|
defaultTtl: number;
|
|
51
53
|
revalidate: number;
|
|
@@ -128,6 +130,18 @@ function raceInFlightEpochRead(
|
|
|
128
130
|
return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));
|
|
129
131
|
}
|
|
130
132
|
|
|
133
|
+
/** Bound a waiter on another request's backend initialization. */
|
|
134
|
+
function raceInFlightBackendInit(
|
|
135
|
+
promise: Promise<ObjectCacheBackend | null>,
|
|
136
|
+
ms: number,
|
|
137
|
+
): Promise<ObjectCacheBackend | null> {
|
|
138
|
+
let timer: ReturnType<typeof setTimeout>;
|
|
139
|
+
const timeout = new Promise<ObjectCacheBackend | null>((resolve) => {
|
|
140
|
+
timer = setTimeout(resolve, Math.max(ms, 1), null);
|
|
141
|
+
});
|
|
142
|
+
return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));
|
|
143
|
+
}
|
|
144
|
+
|
|
131
145
|
const BACKEND_KEY = Symbol.for("emdash:object-cache:backend");
|
|
132
146
|
const EPOCH_KEY = Symbol.for("emdash:object-cache:epochs");
|
|
133
147
|
const PENDING_KEY = Symbol.for("emdash:object-cache:pending-bumps");
|
|
@@ -215,8 +229,15 @@ const contentWritePersist: { pending: boolean } =
|
|
|
215
229
|
*/
|
|
216
230
|
async function getBackend(): Promise<ObjectCacheBackend | null> {
|
|
217
231
|
if (holder.initialized) return holder.backend;
|
|
218
|
-
if (holder.initPromise)
|
|
232
|
+
if (holder.initPromise) {
|
|
233
|
+
const age = Date.now() - (holder.initPromiseAt ?? 0);
|
|
234
|
+
const deadline = epochReadDeadline();
|
|
235
|
+
if (age < deadline) {
|
|
236
|
+
return raceInFlightBackendInit(holder.initPromise, deadline - age);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
219
239
|
|
|
240
|
+
holder.initPromiseAt = Date.now();
|
|
220
241
|
holder.initPromise = (async () => {
|
|
221
242
|
try {
|
|
222
243
|
const mod: {
|
|
@@ -258,10 +279,19 @@ async function getBackend(): Promise<ObjectCacheBackend | null> {
|
|
|
258
279
|
}
|
|
259
280
|
holder.initialized = true;
|
|
260
281
|
holder.initPromise = null;
|
|
282
|
+
holder.initPromiseAt = undefined;
|
|
261
283
|
return holder.backend;
|
|
262
284
|
})();
|
|
263
285
|
|
|
264
|
-
|
|
286
|
+
const started = holder.initPromise;
|
|
287
|
+
after(() =>
|
|
288
|
+
started.then(
|
|
289
|
+
() => undefined,
|
|
290
|
+
() => undefined,
|
|
291
|
+
),
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
return started;
|
|
265
295
|
}
|
|
266
296
|
|
|
267
297
|
/**
|
|
@@ -278,6 +308,7 @@ export function __setObjectCacheBackendForTests(
|
|
|
278
308
|
): void {
|
|
279
309
|
holder.initialized = true;
|
|
280
310
|
holder.initPromise = null;
|
|
311
|
+
holder.initPromiseAt = undefined;
|
|
281
312
|
holder.backend = backend;
|
|
282
313
|
holder.config = { ...holder.config, ...config };
|
|
283
314
|
epochCache.clear();
|
|
@@ -288,6 +319,17 @@ export function __setObjectCacheBackendForTests(
|
|
|
288
319
|
contentWritePersist.pending = false;
|
|
289
320
|
}
|
|
290
321
|
|
|
322
|
+
/** @internal */
|
|
323
|
+
export function __setObjectCacheBackendInitForTests(
|
|
324
|
+
promise: Promise<ObjectCacheBackend | null>,
|
|
325
|
+
startedAt: number,
|
|
326
|
+
): void {
|
|
327
|
+
holder.initialized = false;
|
|
328
|
+
holder.backend = null;
|
|
329
|
+
holder.initPromise = promise;
|
|
330
|
+
holder.initPromiseAt = startedAt;
|
|
331
|
+
}
|
|
332
|
+
|
|
291
333
|
/** Build the backend key for a namespace's epoch anchor. */
|
|
292
334
|
function epochKey(namespace: string): string {
|
|
293
335
|
return `${holder.config.keyPrefix}:epoch:${namespace}`;
|
package/src/plugin-types.ts
CHANGED
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
import type { Permission } from "@emdash-cms/auth";
|
|
42
42
|
import type { ZodType } from "zod";
|
|
43
43
|
|
|
44
|
+
import type { SandboxHookErrorEnvelope } from "./plugins/sandbox/hook-result.js";
|
|
44
45
|
import type {
|
|
45
46
|
CommentAfterCreateEvent,
|
|
46
47
|
CommentAfterCreateHandler,
|
|
@@ -240,12 +241,28 @@ export interface SandboxedMcpTool {
|
|
|
240
241
|
*/
|
|
241
242
|
export interface SandboxedPlugin {
|
|
242
243
|
hooks?: {
|
|
243
|
-
[K in keyof HookHandlers]?:
|
|
244
|
+
[K in keyof HookHandlers]?: K extends "content:beforeSave"
|
|
245
|
+
? SandboxedContentBeforeSaveHandler | SandboxedContentBeforeSaveConfig
|
|
246
|
+
: HookEntry<K>;
|
|
244
247
|
};
|
|
245
248
|
routes?: Record<string, RouteEntry>;
|
|
246
249
|
mcp?: { tools: Record<string, SandboxedMcpTool> };
|
|
247
250
|
}
|
|
248
251
|
|
|
252
|
+
export type SandboxedContentBeforeSaveHandler = (
|
|
253
|
+
event: ContentHookEvent,
|
|
254
|
+
ctx: PluginContext,
|
|
255
|
+
) => Promise<Record<string, unknown> | SandboxHookErrorEnvelope | void>;
|
|
256
|
+
|
|
257
|
+
export interface SandboxedContentBeforeSaveConfig extends Omit<
|
|
258
|
+
HookConfig<"content:beforeSave">,
|
|
259
|
+
"handler"
|
|
260
|
+
> {
|
|
261
|
+
handler: SandboxedContentBeforeSaveHandler;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export type { SandboxHookErrorEnvelope };
|
|
265
|
+
|
|
249
266
|
/**
|
|
250
267
|
* Re-export of event types so plugin authors can reference them
|
|
251
268
|
* explicitly when needed (helper functions, type predicates). Most
|
package/src/plugins/hooks.ts
CHANGED
|
@@ -487,12 +487,14 @@ export class HookPipeline {
|
|
|
487
487
|
|
|
488
488
|
/**
|
|
489
489
|
* Run content:beforeSave hooks
|
|
490
|
-
* Returns modified content from the pipeline
|
|
490
|
+
* Returns modified content from the pipeline. `id` is the existing item's
|
|
491
|
+
* ID when updating.
|
|
491
492
|
*/
|
|
492
493
|
async runContentBeforeSave(
|
|
493
494
|
content: Record<string, unknown>,
|
|
494
495
|
collection: string,
|
|
495
496
|
isNew: boolean,
|
|
497
|
+
id?: string,
|
|
496
498
|
): Promise<{
|
|
497
499
|
content: Record<string, unknown>;
|
|
498
500
|
results: HookResult<Record<string, unknown>>[];
|
|
@@ -508,6 +510,7 @@ export class HookPipeline {
|
|
|
508
510
|
collection,
|
|
509
511
|
isNew,
|
|
510
512
|
};
|
|
513
|
+
if (id !== undefined) event.id = id;
|
|
511
514
|
const ctx = this.getContext(hook.pluginId);
|
|
512
515
|
const start = Date.now();
|
|
513
516
|
|