emdash 0.14.0 → 0.16.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-9DybjTO6.d.mts → adapters-C4yd_UJR.d.mts} +1 -1
- package/dist/{adapters-9DybjTO6.d.mts.map → adapters-C4yd_UJR.d.mts.map} +1 -1
- package/dist/{allowed-origins-CDdG-4Gd.mjs → allowed-origins-D0fFk9a6.mjs} +2 -2
- package/dist/{allowed-origins-CDdG-4Gd.mjs.map → allowed-origins-D0fFk9a6.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +15 -15
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +3 -3
- package/dist/{api-BMLZuwM4.mjs → api-BNKqxyFX.mjs} +560 -56
- package/dist/api-BNKqxyFX.mjs.map +1 -0
- package/dist/{api-tokens-eYymBhIT.mjs → api-tokens-ucpcNXDt.mjs} +2 -2
- package/dist/{api-tokens-eYymBhIT.mjs.map → api-tokens-ucpcNXDt.mjs.map} +1 -1
- package/dist/{apply-v4DBgjPw.mjs → apply-BOPaD-s9.mjs} +17 -17
- package/dist/{apply-v4DBgjPw.mjs.map → apply-BOPaD-s9.mjs.map} +1 -1
- package/dist/astro/index.d.mts +10 -10
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +53 -5
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +9 -9
- package/dist/astro/middleware/auth.mjs +6 -6
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/redirect.mjs +4 -4
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +377 -75
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +5 -5
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
- package/dist/astro/routes/api/admin/bylines/_id_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -17
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts +9 -0
- package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +70 -0
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -0
- package/dist/astro/routes/api/admin/bylines/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +25 -16
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +10 -10
- package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/bulk.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/index.mjs +8 -8
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +33 -32
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +33 -32
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +32 -31
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +32 -31
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +34 -32
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +32 -31
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +32 -31
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +34 -32
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +32 -31
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +59 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +85 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/artifact.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/artifact.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +301 -0
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +51 -32
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +45 -32
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +32 -31
- 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 +3 -3
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +32 -31
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
- package/dist/astro/routes/api/admin/users/index.mjs +5 -5
- package/dist/astro/routes/api/auth/dev-bypass.mjs +5 -5
- package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
- package/dist/astro/routes/api/auth/invite/complete.mjs +9 -9
- package/dist/astro/routes/api/auth/invite/index.mjs +6 -6
- package/dist/astro/routes/api/auth/invite/register-options.mjs +8 -8
- package/dist/astro/routes/api/auth/logout.mjs +3 -3
- package/dist/astro/routes/api/auth/magic-link/send.mjs +8 -8
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
- package/dist/astro/routes/api/auth/me.mjs +5 -5
- package/dist/astro/routes/api/auth/mode.mjs +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +5 -5
- package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/options.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +8 -8
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +9 -9
- package/dist/astro/routes/api/auth/passkey/verify.mjs +9 -9
- package/dist/astro/routes/api/auth/signup/complete.mjs +9 -9
- package/dist/astro/routes/api/auth/signup/request.mjs +8 -8
- package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +3 -3
- 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_/duplicate.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +9 -9
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +10 -9
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/index.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/trash.mjs +6 -6
- package/dist/astro/routes/api/dashboard.mjs +7 -7
- package/dist/astro/routes/api/dev/emails.mjs +3 -3
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +9 -9
- package/dist/astro/routes/api/import/wordpress/execute.mjs +9 -8
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.mjs +8 -8
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +8 -8
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts +11 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs +17 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +9 -9
- 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 +10 -10
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/mcp.mjs +29 -29
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +6 -6
- package/dist/astro/routes/api/media/_id_.mjs +6 -6
- package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
- package/dist/astro/routes/api/media/providers/index.mjs +3 -3
- package/dist/astro/routes/api/media/upload-url.mjs +7 -7
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +8 -8
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_/items.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_/translations.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_.mjs +7 -7
- package/dist/astro/routes/api/menus/index.mjs +7 -7
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
- package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
- package/dist/astro/routes/api/oauth/register.mjs +3 -3
- package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
- package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
- package/dist/astro/routes/api/oauth/token.mjs +6 -6
- package/dist/astro/routes/api/openapi.json.mjs +3 -3
- 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/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +8 -8
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +9 -9
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +9 -9
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +32 -31
- 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 +32 -31
- 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 +32 -31
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +32 -31
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +32 -31
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +6 -6
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +32 -31
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +32 -31
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +9 -9
- package/dist/astro/routes/api/search/index.mjs +8 -8
- package/dist/astro/routes/api/search/rebuild.mjs +9 -9
- package/dist/astro/routes/api/search/stats.mjs +6 -6
- package/dist/astro/routes/api/search/suggest.mjs +8 -8
- package/dist/astro/routes/api/sections/_slug_.mjs +8 -8
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +8 -8
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings.mjs +10 -10
- package/dist/astro/routes/api/setup/admin-verify.mjs +10 -10
- package/dist/astro/routes/api/setup/admin.mjs +9 -9
- package/dist/astro/routes/api/setup/dev-bypass.mjs +22 -22
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +22 -22
- package/dist/astro/routes/api/setup/status.mjs +4 -4
- package/dist/astro/routes/api/snapshot.mjs +6 -6
- package/dist/astro/routes/api/snapshot.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +5 -5
- package/dist/astro/routes/api/typegen.mjs +5 -5
- 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.mjs +6 -6
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +8 -8
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +8 -8
- package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
- package/dist/astro/routes/api/widget-areas/index.mjs +8 -8
- package/dist/astro/routes/api/widget-components.mjs +3 -3
- package/dist/astro/routes/robots.txt.mjs +5 -5
- package/dist/astro/routes/sitemap-_collection_.xml.d.mts.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +58 -13
- package/dist/astro/routes/sitemap-_collection_.xml.mjs.map +1 -1
- package/dist/astro/routes/sitemap.xml.mjs +6 -6
- package/dist/astro/types.d.mts +20 -12
- 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-BlyCH-96.mjs → authorize-Bn4S4DUT.mjs} +2 -2
- package/dist/{authorize-BlyCH-96.mjs.map → authorize-Bn4S4DUT.mjs.map} +1 -1
- package/dist/byline-BDylH_m4.mjs +404 -0
- package/dist/byline-BDylH_m4.mjs.map +1 -0
- package/dist/{bylines-BdUP8NuI.d.mts → bylines-B2_XmnSU.d.mts} +73 -28
- package/dist/bylines-B2_XmnSU.d.mts.map +1 -0
- package/dist/bylines-B7TFEvFf.mjs +118 -0
- package/dist/bylines-B7TFEvFf.mjs.map +1 -0
- package/dist/bylines-n6nykUyI.mjs +174 -0
- package/dist/bylines-n6nykUyI.mjs.map +1 -0
- package/dist/{cache-CXCpjWiL.mjs → cache-BcI1yUjR.mjs} +2 -2
- package/dist/{cache-CXCpjWiL.mjs.map → cache-BcI1yUjR.mjs.map} +1 -1
- package/dist/{challenge-store-CJ0OOHOr.mjs → challenge-store-Dng1SxKT.mjs} +1 -1
- package/dist/{challenge-store-CJ0OOHOr.mjs.map → challenge-store-Dng1SxKT.mjs.map} +1 -1
- package/dist/{chunks-DyGtu1Bv.mjs → chunks-cYG4SnIP.mjs} +2 -2
- package/dist/{chunks-DyGtu1Bv.mjs.map → chunks-cYG4SnIP.mjs.map} +1 -1
- package/dist/cli/index.mjs +68 -30
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.mjs +1 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/{comment-Dd9MI82-.mjs → comment-C76G-9tz.mjs} +2 -2
- package/dist/{comment-Dd9MI82-.mjs.map → comment-C76G-9tz.mjs.map} +1 -1
- package/dist/{comments-koGI0FrK.mjs → comments-CCxFFGY1.mjs} +3 -3
- package/dist/{comments-koGI0FrK.mjs.map → comments-CCxFFGY1.mjs.map} +1 -1
- package/dist/{components-mZem7pbe.mjs → components-Dx3DM0gg.mjs} +1 -1
- package/dist/{components-mZem7pbe.mjs.map → components-Dx3DM0gg.mjs.map} +1 -1
- package/dist/config-CVssduLe.mjs.map +1 -1
- package/dist/{content-D6YG26WG.mjs → content-8voQNTXX.mjs} +3 -3
- package/dist/{content-D6YG26WG.mjs.map → content-8voQNTXX.mjs.map} +1 -1
- package/dist/{context-qF8d3IPR.mjs → context-B7qiYrz2.mjs} +10 -10
- package/dist/context-B7qiYrz2.mjs.map +1 -0
- package/dist/{cron-H8eJ46dv.mjs → cron-Bd3b3iuj.mjs} +1 -1
- package/dist/{cron-H8eJ46dv.mjs.map → cron-Bd3b3iuj.mjs.map} +1 -1
- package/dist/{dashboard-BmWSIUwY.mjs → dashboard-BeaFSPpx.mjs} +4 -4
- package/dist/{dashboard-BmWSIUwY.mjs.map → dashboard-BeaFSPpx.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +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/sqlite.mjs +1 -1
- package/dist/{db-errors-CGN9kJfo.mjs → db-errors-BiYqoX-n.mjs} +14 -2
- package/dist/db-errors-BiYqoX-n.mjs.map +1 -0
- package/dist/{default-Dbs22Gg4.mjs → default-BvTAYCzx.mjs} +1 -1
- package/dist/{default-Dbs22Gg4.mjs.map → default-BvTAYCzx.mjs.map} +1 -1
- package/dist/{device-flow-BqJRxa0Q.mjs → device-flow-B9oG8PwP.mjs} +4 -4
- package/dist/{device-flow-BqJRxa0Q.mjs.map → device-flow-B9oG8PwP.mjs.map} +1 -1
- package/dist/{email-console-Dmp5Q-P2.mjs → email-console-CubRll9q.mjs} +1 -1
- package/dist/email-console-CubRll9q.mjs.map +1 -0
- package/dist/{error-tSQWIl5U.mjs → error-ChfADBuu.mjs} +19 -9
- package/dist/error-ChfADBuu.mjs.map +1 -0
- package/dist/errors-9P_FDrJ_.mjs +17 -0
- package/dist/errors-9P_FDrJ_.mjs.map +1 -0
- package/dist/{escape-B8bdIryO.mjs → escape-Cg6kMELH.mjs} +1 -1
- package/dist/{escape-B8bdIryO.mjs.map → escape-Cg6kMELH.mjs.map} +1 -1
- package/dist/{fts-manager-B633C-kQ.mjs → fts-manager-C_b-4x8u.mjs} +2 -2
- package/dist/{fts-manager-B633C-kQ.mjs.map → fts-manager-C_b-4x8u.mjs.map} +1 -1
- package/dist/{import-CNfLOgDE.mjs → import-DG80rC_I.mjs} +3 -3
- package/dist/{import-CNfLOgDE.mjs.map → import-DG80rC_I.mjs.map} +1 -1
- package/dist/{index-BV8iJ-6s.d.mts → index-BPZFAcgE.d.mts} +384 -123
- package/dist/index-BPZFAcgE.d.mts.map +1 -0
- package/dist/{index-D2gvztOP.d.mts → index-CC42STEm.d.mts} +3 -3
- package/dist/{index-D2gvztOP.d.mts.map → index-CC42STEm.d.mts.map} +1 -1
- package/dist/index.d.mts +17 -17
- package/dist/index.mjs +53 -52
- package/dist/{load-QzYRpVN3.mjs → load-CLFRjk9r.mjs} +2 -2
- package/dist/{load-QzYRpVN3.mjs.map → load-CLFRjk9r.mjs.map} +1 -1
- package/dist/{loader-Cs6-Bqe6.mjs → loader-D-vIJjfY.mjs} +86 -46
- package/dist/loader-D-vIJjfY.mjs.map +1 -0
- package/dist/{manifest-schema-HCtSh4Jq.mjs → manifest-schema-Czqf0TLu.mjs} +1 -1
- package/dist/{manifest-schema-HCtSh4Jq.mjs.map → manifest-schema-Czqf0TLu.mjs.map} +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/local-runtime.d.mts +11 -11
- package/dist/media/local-runtime.mjs +4 -4
- package/dist/{media-Dg7he9uK.mjs → media-CKQd8AYU.mjs} +2 -2
- package/dist/media-CKQd8AYU.mjs.map +1 -0
- package/dist/{media-allowlist-B8EX01DH.mjs → media-allowlist-BNloC69x.mjs} +1 -1
- package/dist/{media-allowlist-B8EX01DH.mjs.map → media-allowlist-BNloC69x.mjs.map} +1 -1
- package/dist/{menus-X4Z-eBA1.mjs → menus-C-nWT5Tu.mjs} +42 -17
- package/dist/menus-C-nWT5Tu.mjs.map +1 -0
- package/dist/{menus-DOzIecHi.mjs → menus-arUNspyU.mjs} +2 -2
- package/dist/menus-arUNspyU.mjs.map +1 -0
- package/dist/mime-KV5TqkMN.mjs.map +1 -1
- package/dist/{mode-DPRPvJYm.mjs → mode-CaaiebZI.mjs} +1 -1
- package/dist/{mode-DPRPvJYm.mjs.map → mode-CaaiebZI.mjs.map} +1 -1
- package/dist/{oauth-authorization-62GmpGIH.mjs → oauth-authorization-CTMeVfvj.mjs} +4 -4
- package/dist/{oauth-authorization-62GmpGIH.mjs.map → oauth-authorization-CTMeVfvj.mjs.map} +1 -1
- package/dist/{oauth-clients-D_B0_-Bz.mjs → oauth-clients-eJCbkVSG.mjs} +1 -1
- package/dist/oauth-clients-eJCbkVSG.mjs.map +1 -0
- package/dist/{oauth-state-store-DpsZViTu.mjs → oauth-state-store-vOSdOeGe.mjs} +1 -1
- package/dist/{oauth-state-store-DpsZViTu.mjs.map → oauth-state-store-vOSdOeGe.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-meyS2oB1.mjs → oauth-user-lookup-3JwsVw6N.mjs} +1 -1
- package/dist/{oauth-user-lookup-meyS2oB1.mjs.map → oauth-user-lookup-3JwsVw6N.mjs.map} +1 -1
- package/dist/options-BL4X94qY.mjs.map +1 -1
- package/dist/{options-Cq64Wx0O.d.mts → options-DhV-gwJb.d.mts} +4 -4
- package/dist/options-DhV-gwJb.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-BFTPon-J.mjs → parse-DHbXfvxO.mjs} +2 -2
- package/dist/{parse-BFTPon-J.mjs.map → parse-DHbXfvxO.mjs.map} +1 -1
- package/dist/{passkey-config-Cg86_ISa.mjs → passkey-config-BloQOT3y.mjs} +1 -1
- package/dist/{passkey-config-Cg86_ISa.mjs.map → passkey-config-BloQOT3y.mjs.map} +1 -1
- package/dist/{placeholder-D3cFCU9y.d.mts → placeholder-KCkkCtgQ.d.mts} +1 -1
- package/dist/{placeholder-D3cFCU9y.d.mts.map → placeholder-KCkkCtgQ.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +1 -1
- package/dist/plugin-utils.d.mts +25 -10
- package/dist/plugin-utils.d.mts.map +1 -1
- package/dist/plugin-utils.mjs +11 -10
- package/dist/plugin-utils.mjs.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.mjs +26 -15
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/{preview-C1LOEbWZ.mjs → preview-D4z0WONU.mjs} +2 -2
- package/dist/{preview-C1LOEbWZ.mjs.map → preview-D4z0WONU.mjs.map} +1 -1
- package/dist/{public-url-CseXl9Fv.mjs → public-url-CUWWFME2.mjs} +1 -1
- package/dist/{public-url-CseXl9Fv.mjs.map → public-url-CUWWFME2.mjs.map} +1 -1
- package/dist/{query-axZmO6Tn.mjs → query-7m6-l0f_.mjs} +27 -17
- package/dist/query-7m6-l0f_.mjs.map +1 -0
- package/dist/{rate-limit-t5CVjCO6.mjs → rate-limit-D8RAXN8b.mjs} +2 -2
- package/dist/{rate-limit-t5CVjCO6.mjs.map → rate-limit-D8RAXN8b.mjs.map} +1 -1
- package/dist/{redirect-DGRsLO2I.mjs → redirect-BINiRYq4.mjs} +1 -1
- package/dist/{redirect-DGRsLO2I.mjs.map → redirect-BINiRYq4.mjs.map} +1 -1
- package/dist/{redirect-DkaDxq8e.mjs → redirect-CjfDGrTd.mjs} +2 -2
- package/dist/{redirect-DkaDxq8e.mjs.map → redirect-CjfDGrTd.mjs.map} +1 -1
- package/dist/{redirects-Dmj6KRU3.mjs → redirects-COMLwsV5.mjs} +19 -5
- package/dist/redirects-COMLwsV5.mjs.map +1 -0
- package/dist/{redirects-D1fdd68T.mjs → redirects-CowoEHdE.mjs} +3 -3
- package/dist/{redirects-D1fdd68T.mjs.map → redirects-CowoEHdE.mjs.map} +1 -1
- package/dist/{registry-BnCeHYsf.mjs → registry-Cyp-dx6J.mjs} +4 -4
- package/dist/{registry-BnCeHYsf.mjs.map → registry-Cyp-dx6J.mjs.map} +1 -1
- package/dist/request-cache-dzCt8TZB.mjs.map +1 -1
- package/dist/request-context.mjs.map +1 -1
- package/dist/{request-meta-CLCwSQOS.mjs → request-meta-C_Cjii-T.mjs} +2 -2
- package/dist/{request-meta-CLCwSQOS.mjs.map → request-meta-C_Cjii-T.mjs.map} +1 -1
- package/dist/resolve-D6sM-SgF.mjs +143 -0
- package/dist/resolve-D6sM-SgF.mjs.map +1 -0
- package/dist/{runner-DcfZewkO.d.mts → runner-DSQBurMS.d.mts} +8 -5
- package/dist/runner-DSQBurMS.d.mts.map +1 -0
- package/dist/{runner-DdnQIwz_.mjs → runner-Drnvs96u.mjs} +491 -188
- package/dist/runner-Drnvs96u.mjs.map +1 -0
- package/dist/runtime.d.mts +10 -10
- package/dist/runtime.mjs +2 -2
- package/dist/{schema-BmqagCwG.mjs → schema-CI9mYPX3.mjs} +4 -4
- package/dist/{schema-BmqagCwG.mjs.map → schema-CI9mYPX3.mjs.map} +1 -1
- package/dist/{search-CPrvO5u8.mjs → search-DKz_mGBP.mjs} +4 -4
- package/dist/{search-CPrvO5u8.mjs.map → search-DKz_mGBP.mjs.map} +1 -1
- package/dist/{secrets-6pgZyq0K.mjs → secrets-rPdhEBkD.mjs} +1 -1
- package/dist/{secrets-6pgZyq0K.mjs.map → secrets-rPdhEBkD.mjs.map} +1 -1
- package/dist/{sections-Cm-zb-gZ.mjs → sections-DBbCDIAT.mjs} +3 -3
- package/dist/{sections-Cm-zb-gZ.mjs.map → sections-DBbCDIAT.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +16 -16
- package/dist/seo/index.d.mts +1 -1
- package/dist/{seo-DRq9-EPP.mjs → seo-BGCyDlkb.mjs} +2 -2
- package/dist/{seo-DRq9-EPP.mjs.map → seo-BGCyDlkb.mjs.map} +1 -1
- package/dist/{seo-BoR4wCUh.mjs → seo-Dq707mNQ.mjs} +5 -3
- package/dist/seo-Dq707mNQ.mjs.map +1 -0
- package/dist/{service-vByySp-2.mjs → service-B0H7U1Y9.mjs} +3 -3
- package/dist/{service-vByySp-2.mjs.map → service-B0H7U1Y9.mjs.map} +1 -1
- package/dist/{settings-xQKsWnzQ.mjs → settings-BSXRtTzk.mjs} +3 -3
- package/dist/settings-BSXRtTzk.mjs.map +1 -0
- package/dist/{settings-CBBj7HUd.mjs → settings-DfwNyQkf.mjs} +3 -3
- package/dist/{settings-CBBj7HUd.mjs.map → settings-DfwNyQkf.mjs.map} +1 -1
- package/dist/{setup-BGAJ2uXs.mjs → setup-Cf_TyOv5.mjs} +2 -2
- package/dist/{setup-BGAJ2uXs.mjs.map → setup-Cf_TyOv5.mjs.map} +1 -1
- package/dist/{setup-complete-C6ZCLhKo.mjs → setup-complete-MzzN9u0b.mjs} +1 -1
- package/dist/{setup-complete-C6ZCLhKo.mjs.map → setup-complete-MzzN9u0b.mjs.map} +1 -1
- package/dist/{setup-nonce-CY1gQiAU.mjs → setup-nonce-DXuriHsg.mjs} +1 -1
- package/dist/{setup-nonce-CY1gQiAU.mjs.map → setup-nonce-DXuriHsg.mjs.map} +1 -1
- package/dist/{site-url-D-M4Fd8O.mjs → site-url-xkhw1tcz.mjs} +1 -1
- package/dist/{site-url-D-M4Fd8O.mjs.map → site-url-xkhw1tcz.mjs.map} +1 -1
- package/dist/{ssrf-DzFN_qV-.mjs → ssrf-MZ-zrG6-.mjs} +1 -1
- package/dist/{ssrf-DzFN_qV-.mjs.map → ssrf-MZ-zrG6-.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/local.mjs.map +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/{taxonomies-Dc0mzlms.mjs → taxonomies-4vx0nmMr.mjs} +4 -4
- package/dist/{taxonomies-Dc0mzlms.mjs.map → taxonomies-4vx0nmMr.mjs.map} +1 -1
- package/dist/{taxonomies-Cn9UpaR2.mjs → taxonomies-CcvrMLbR.mjs} +8 -43
- package/dist/taxonomies-CcvrMLbR.mjs.map +1 -0
- package/dist/{taxonomy-wPfusMK9.mjs → taxonomy-zqGQUqgu.mjs} +3 -3
- package/dist/{taxonomy-wPfusMK9.mjs.map → taxonomy-zqGQUqgu.mjs.map} +1 -1
- package/dist/{tokens-DILYNZMi.mjs → tokens-N8otWMmj.mjs} +1 -1
- package/dist/{tokens-DILYNZMi.mjs.map → tokens-N8otWMmj.mjs.map} +1 -1
- package/dist/{transport-fw-mKJzT.mjs → transport-B6CHddbu.mjs} +1 -1
- package/dist/{transport-fw-mKJzT.mjs.map → transport-B6CHddbu.mjs.map} +1 -1
- package/dist/{transport-GeXlLscf.d.mts → transport-C2MGqtL6.d.mts} +1 -1
- package/dist/{transport-GeXlLscf.d.mts.map → transport-C2MGqtL6.d.mts.map} +1 -1
- package/dist/{trusted-proxy-CJhQIk65.mjs → trusted-proxy-97pajC2f.mjs} +1 -1
- package/dist/{trusted-proxy-CJhQIk65.mjs.map → trusted-proxy-97pajC2f.mjs.map} +1 -1
- package/dist/{types-CwXMEPRr.mjs → types-B0bmgwMG.mjs} +2 -2
- package/dist/types-B0bmgwMG.mjs.map +1 -0
- package/dist/{types-Dz9CGX_d.mjs → types-Cd9UCu3t.mjs} +1 -1
- package/dist/{types-Dz9CGX_d.mjs.map → types-Cd9UCu3t.mjs.map} +1 -1
- package/dist/{types-DmxPPXGf.d.mts → types-CkDSF81F.d.mts} +1 -1
- package/dist/{types-DmxPPXGf.d.mts.map → types-CkDSF81F.d.mts.map} +1 -1
- package/dist/{types-BWhaSS7U.d.mts → types-CpUuGcd5.d.mts} +1 -1
- package/dist/{types-BWhaSS7U.d.mts.map → types-CpUuGcd5.d.mts.map} +1 -1
- package/dist/{types-DFowNO60.d.mts → types-D599-ruj.d.mts} +1 -1
- package/dist/{types-DFowNO60.d.mts.map → types-D599-ruj.d.mts.map} +1 -1
- package/dist/{types-B05e2naf.d.mts → types-DGHWRQgr.d.mts} +3 -3
- package/dist/{types-B05e2naf.d.mts.map → types-DGHWRQgr.d.mts.map} +1 -1
- package/dist/{types-CzvJd1ND.d.mts → types-DaYDYW6g.d.mts} +14 -1
- package/dist/types-DaYDYW6g.d.mts.map +1 -0
- package/dist/{types-C1KKK4VP.d.mts → types-DaqNzqVt.d.mts} +16 -1
- package/dist/{types-C1KKK4VP.d.mts.map → types-DaqNzqVt.d.mts.map} +1 -1
- package/dist/{types-DW1l0gCv.d.mts → types-Dgo6y-Ut.d.mts} +1 -1
- package/dist/{types-DW1l0gCv.d.mts.map → types-Dgo6y-Ut.d.mts.map} +1 -1
- package/dist/{types-Cb2UCDJg.d.mts → types-bYmRn_Uy.d.mts} +1 -1
- package/dist/{types-Cb2UCDJg.d.mts.map → types-bYmRn_Uy.d.mts.map} +1 -1
- package/dist/{user-Dr1bOCqS.mjs → user-hUSOaIJy.mjs} +2 -2
- package/dist/{user-Dr1bOCqS.mjs.map → user-hUSOaIJy.mjs.map} +1 -1
- package/dist/{utils-_F-rWBTN.mjs → utils-C3wTAP-P.mjs} +1 -1
- package/dist/{utils-_F-rWBTN.mjs.map → utils-C3wTAP-P.mjs.map} +1 -1
- package/dist/{validate-BpQGsmd7.d.mts → validate-DQtHw9NT.d.mts} +5 -5
- package/dist/{validate-BpQGsmd7.d.mts.map → validate-DQtHw9NT.d.mts.map} +1 -1
- package/dist/{validate-DlFxcVVK.mjs → validate-IGltez8n.mjs} +2 -2
- package/dist/{validate-DlFxcVVK.mjs.map → validate-IGltez8n.mjs.map} +1 -1
- package/dist/{validation-BiFJqUp5.mjs → validation-Bmymau7y.mjs} +6 -6
- package/dist/{validation-BiFJqUp5.mjs.map → validation-Bmymau7y.mjs.map} +1 -1
- package/dist/version-BTc87L3L.mjs +7 -0
- package/dist/{version-DNmQakZO.mjs.map → version-BTc87L3L.mjs.map} +1 -1
- package/dist/{widgets-B9j_yzlk.mjs → widgets-yHQa4c6c.mjs} +3 -3
- package/dist/widgets-yHQa4c6c.mjs.map +1 -0
- package/dist/{zod-generator-DSyz01KE.mjs → zod-generator-B80aap1J.mjs} +2 -2
- package/dist/{zod-generator-DSyz01KE.mjs.map → zod-generator-B80aap1J.mjs.map} +1 -1
- package/package.json +12 -10
- package/src/api/error.ts +18 -3
- package/src/api/errors.ts +8 -0
- package/src/api/handlers/bylines.ts +161 -0
- package/src/api/handlers/content.ts +125 -43
- package/src/api/handlers/index.ts +8 -0
- package/src/api/handlers/marketplace.ts +27 -5
- package/src/api/handlers/oauth-clients.ts +1 -1
- package/src/api/handlers/registry.ts +622 -5
- package/src/api/handlers/seo.ts +16 -1
- package/src/api/handlers/snapshot.ts +1 -1
- package/src/api/openapi/document.ts +1 -1
- package/src/api/schemas/bylines.ts +46 -0
- package/src/astro/integration/index.ts +27 -1
- package/src/astro/integration/routes.ts +10 -0
- package/src/astro/integration/runtime.ts +20 -1
- package/src/astro/integration/virtual-modules.ts +19 -2
- package/src/astro/integration/vite-config.ts +2 -2
- package/src/astro/middleware/auth.ts +7 -7
- package/src/astro/middleware/request-context.ts +1 -1
- package/src/astro/middleware.ts +35 -20
- package/src/astro/public-plugin-api-routes.ts +41 -0
- package/src/astro/routes/api/admin/bylines/[id]/index.ts +3 -12
- package/src/astro/routes/api/admin/bylines/[id]/translations.ts +99 -0
- package/src/astro/routes/api/admin/bylines/index.ts +22 -11
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +1 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +6 -1
- package/src/astro/routes/api/admin/plugins/registry/[id]/uninstall.ts +51 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +83 -0
- package/src/astro/routes/api/admin/plugins/registry/artifact.ts +388 -0
- package/src/astro/routes/api/admin/plugins/registry/install.ts +7 -1
- package/src/astro/routes/api/admin/plugins/updates.ts +43 -6
- package/src/astro/routes/api/admin/themes/marketplace/index.ts +1 -1
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +2 -2
- package/src/astro/routes/api/auth/oauth/[provider].ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/restore.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +6 -6
- package/src/astro/routes/api/content/[collection]/[id]/translations.ts +1 -1
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id].ts +6 -6
- package/src/astro/routes/api/import/wordpress/execute.ts +1 -1
- package/src/astro/routes/api/import/wordpress/prepare.ts +2 -2
- package/src/astro/routes/api/import/wordpress/rewrite-url-helpers.ts +22 -0
- package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +8 -5
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +2 -2
- package/src/astro/routes/api/media/upload-url.ts +1 -1
- package/src/astro/routes/api/redirects/404s/index.ts +3 -3
- package/src/astro/routes/api/redirects/404s/summary.ts +1 -1
- package/src/astro/routes/api/redirects/[id].ts +3 -3
- package/src/astro/routes/api/redirects/index.ts +2 -2
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +4 -4
- package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +2 -6
- package/src/astro/routes/api/schema/collections/[slug]/fields/reorder.ts +1 -1
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +6 -6
- package/src/astro/routes/api/schema/collections/index.ts +4 -4
- package/src/astro/routes/api/schema/index.ts +1 -1
- package/src/astro/routes/api/schema/orphans/[slug].ts +1 -1
- package/src/astro/routes/api/schema/orphans/index.ts +1 -1
- package/src/astro/routes/api/sections/[slug].ts +3 -3
- package/src/astro/routes/api/sections/index.ts +2 -2
- package/src/astro/routes/sitemap-[collection].xml.ts +114 -14
- package/src/astro/types.ts +18 -0
- package/src/auth/rate-limit.ts +1 -1
- package/src/auth/trusted-proxy.ts +1 -1
- package/src/bylines/index.ts +154 -55
- package/src/cli/commands/init.ts +4 -8
- package/src/client/index.ts +1 -1
- package/src/components/InlinePortableTextEditor.tsx +5 -1
- package/src/components/inline-code-block.tsx +343 -0
- package/src/config/secrets.ts +3 -3
- package/src/content/converters/portable-text-to-prosemirror.ts +35 -11
- package/src/database/connection.ts +3 -10
- package/src/database/errors.ts +14 -0
- package/src/database/index.ts +3 -1
- package/src/database/migrations/006_taxonomy_defs.ts +1 -1
- package/src/database/migrations/014_draft_revisions.ts +6 -6
- package/src/database/migrations/040_byline_i18n.ts +497 -0
- package/src/database/migrations/runner.ts +33 -22
- package/src/database/repositories/audit.ts +2 -2
- package/src/database/repositories/byline.ts +320 -50
- package/src/database/repositories/media.ts +2 -2
- package/src/database/repositories/menu.ts +1 -1
- package/src/database/repositories/options.ts +3 -3
- package/src/database/repositories/plugin-storage.ts +3 -3
- package/src/database/repositories/types.ts +13 -0
- package/src/database/types.ts +15 -0
- package/src/emdash-runtime.ts +493 -20
- package/src/i18n/config.ts +1 -1
- package/src/i18n/resolve.ts +152 -0
- package/src/index.ts +9 -0
- package/src/loader.ts +134 -60
- package/src/mcp/server.ts +3 -3
- package/src/media/mime.ts +1 -1
- package/src/page/absolute-url.ts +1 -1
- package/src/plugin-utils.ts +23 -0
- package/src/plugins/adapt-sandbox-entry.ts +45 -40
- package/src/plugins/email-console.ts +1 -1
- package/src/plugins/index.ts +1 -0
- package/src/plugins/marketplace.ts +1 -1
- package/src/plugins/sandbox/index.ts +1 -0
- package/src/plugins/sandbox/noop.ts +11 -3
- package/src/plugins/sandbox/types.ts +28 -0
- package/src/query.ts +41 -7
- package/src/registry/config.ts +1 -1
- package/src/request-cache.ts +3 -3
- package/src/request-context.ts +1 -1
- package/src/settings/index.ts +4 -4
- package/src/storage/local.ts +1 -1
- package/src/storage/s3.ts +3 -3
- package/src/utils/db-errors.ts +24 -0
- package/src/widgets/index.ts +1 -1
- package/dist/api-BMLZuwM4.mjs.map +0 -1
- package/dist/byline-D09BaS4j.mjs +0 -220
- package/dist/byline-D09BaS4j.mjs.map +0 -1
- package/dist/bylines-BTM2xtP8.mjs +0 -113
- package/dist/bylines-BTM2xtP8.mjs.map +0 -1
- package/dist/bylines-BdUP8NuI.d.mts.map +0 -1
- package/dist/connection-2igzM-AT.mjs +0 -57
- package/dist/connection-2igzM-AT.mjs.map +0 -1
- package/dist/context-qF8d3IPR.mjs.map +0 -1
- package/dist/db-errors-CGN9kJfo.mjs.map +0 -1
- package/dist/email-console-Dmp5Q-P2.mjs.map +0 -1
- package/dist/error-tSQWIl5U.mjs.map +0 -1
- package/dist/index-BV8iJ-6s.d.mts.map +0 -1
- package/dist/loader-Cs6-Bqe6.mjs.map +0 -1
- package/dist/media-Dg7he9uK.mjs.map +0 -1
- package/dist/menus-DOzIecHi.mjs.map +0 -1
- package/dist/menus-X4Z-eBA1.mjs.map +0 -1
- package/dist/oauth-clients-D_B0_-Bz.mjs.map +0 -1
- package/dist/options-Cq64Wx0O.d.mts.map +0 -1
- package/dist/query-axZmO6Tn.mjs.map +0 -1
- package/dist/redirects-Dmj6KRU3.mjs.map +0 -1
- package/dist/runner-DcfZewkO.d.mts.map +0 -1
- package/dist/runner-DdnQIwz_.mjs.map +0 -1
- package/dist/seo-BoR4wCUh.mjs.map +0 -1
- package/dist/settings-xQKsWnzQ.mjs.map +0 -1
- package/dist/taxonomies-Cn9UpaR2.mjs.map +0 -1
- package/dist/types-CwXMEPRr.mjs.map +0 -1
- package/dist/types-CzvJd1ND.d.mts.map +0 -1
- package/dist/version-DNmQakZO.mjs +0 -7
- package/dist/widgets-B9j_yzlk.mjs.map +0 -1
- /package/dist/{api-tokens-D3C9v02m.mjs → api-tokens-iPIHAY8N.mjs} +0 -0
- /package/dist/{ssrf-CTul4uQi.mjs → ssrf-BIcd-aXW.mjs} +0 -0
- /package/dist/{types-Db67HHlU.mjs → types-1NNkmTIn.mjs} +0 -0
|
@@ -1,27 +1,29 @@
|
|
|
1
1
|
import { r as validatePluginIdentifier, t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
|
|
2
|
-
import { r as isI18nEnabled } from "./config-CVssduLe.mjs";
|
|
3
|
-
import { r as RevisionRepository, t as ContentRepository } from "./content-
|
|
2
|
+
import { n as getI18nConfig, r as isI18nEnabled } from "./config-CVssduLe.mjs";
|
|
3
|
+
import { r as RevisionRepository, t as ContentRepository } from "./content-8voQNTXX.mjs";
|
|
4
4
|
import { r as encodeBase64, t as decodeBase64 } from "./base64-CqR-7kqF.mjs";
|
|
5
|
-
import { n as InvalidCursorError, t as EmDashValidationError } from "./types-
|
|
6
|
-
import { t as MediaRepository } from "./media-
|
|
7
|
-
import { t as CommentRepository } from "./comment-
|
|
5
|
+
import { n as InvalidCursorError, t as EmDashValidationError } from "./types-B0bmgwMG.mjs";
|
|
6
|
+
import { t as MediaRepository } from "./media-CKQd8AYU.mjs";
|
|
7
|
+
import { t as CommentRepository } from "./comment-C76G-9tz.mjs";
|
|
8
8
|
import { t as withTransaction } from "./transaction-NQj4VJ7Z.mjs";
|
|
9
|
-
import { t as RedirectRepository } from "./redirect-
|
|
10
|
-
import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-
|
|
11
|
-
import { t as BylineRepository } from "./byline-
|
|
12
|
-
import { t as SeoRepository } from "./seo-
|
|
13
|
-
import { r as invalidateRedirectCache } from "./cache-
|
|
14
|
-
import {
|
|
9
|
+
import { t as RedirectRepository } from "./redirect-CjfDGrTd.mjs";
|
|
10
|
+
import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-cYG4SnIP.mjs";
|
|
11
|
+
import { t as BylineRepository } from "./byline-BDylH_m4.mjs";
|
|
12
|
+
import { t as SeoRepository } from "./seo-BGCyDlkb.mjs";
|
|
13
|
+
import { r as invalidateRedirectCache } from "./cache-BcI1yUjR.mjs";
|
|
14
|
+
import { n as isMissingTableError } from "./db-errors-BiYqoX-n.mjs";
|
|
15
15
|
import { r as parseAllowedMimeTypes, t as matchesMimeAllowlist } from "./mime-KV5TqkMN.mjs";
|
|
16
16
|
import { n as requestCached } from "./request-cache-dzCt8TZB.mjs";
|
|
17
17
|
import { n as hashString } from "./hash-DlUxGhQS.mjs";
|
|
18
|
-
import { n as SchemaRegistry, t as SchemaError } from "./registry-
|
|
19
|
-
import { i as pluginManifestSchema, r as normalizeManifestRoute } from "./manifest-schema-
|
|
20
|
-
import { r as normalizeCapabilities } from "./types-
|
|
21
|
-
import { t as EmDashStorageError } from "./types-
|
|
22
|
-
import { n as resolveAndValidateExternalUrl, t as SsrfError } from "./ssrf-
|
|
18
|
+
import { n as SchemaRegistry, t as SchemaError } from "./registry-Cyp-dx6J.mjs";
|
|
19
|
+
import { i as pluginManifestSchema, r as normalizeManifestRoute } from "./manifest-schema-Czqf0TLu.mjs";
|
|
20
|
+
import { r as normalizeCapabilities } from "./types-1NNkmTIn.mjs";
|
|
21
|
+
import { t as EmDashStorageError } from "./types-Cd9UCu3t.mjs";
|
|
22
|
+
import { n as resolveAndValidateExternalUrl, t as SsrfError } from "./ssrf-MZ-zrG6-.mjs";
|
|
23
23
|
import { sql } from "kysely";
|
|
24
24
|
import { createGzipDecoder, unpackTar } from "modern-tar";
|
|
25
|
+
import { ClientResponseError, ClientValidationError } from "@atcute/client";
|
|
26
|
+
import { checkEnvCompatibility, findSkippedEnvConstraints } from "@emdash-cms/registry-client/env";
|
|
25
27
|
|
|
26
28
|
//#region src/api/rev.ts
|
|
27
29
|
/**
|
|
@@ -195,7 +197,8 @@ async function hydrateSeoMany(db, collection, items, hasSeo) {
|
|
|
195
197
|
}
|
|
196
198
|
async function hydrateBylines(db, collection, item) {
|
|
197
199
|
const bylineRepo = new BylineRepository(db);
|
|
198
|
-
const
|
|
200
|
+
const localeOpt = item.locale ? { locale: item.locale } : void 0;
|
|
201
|
+
const bylines = await bylineRepo.getContentBylines(collection, item.id, localeOpt);
|
|
199
202
|
if (bylines.length > 0) {
|
|
200
203
|
item.bylines = bylines.map((c) => ({
|
|
201
204
|
...c,
|
|
@@ -204,9 +207,13 @@ async function hydrateBylines(db, collection, item) {
|
|
|
204
207
|
item.byline = bylines[0]?.byline ?? null;
|
|
205
208
|
return;
|
|
206
209
|
}
|
|
207
|
-
if (item.primaryBylineId)
|
|
210
|
+
if (item.primaryBylineId) {
|
|
211
|
+
item.bylines = [];
|
|
212
|
+
item.byline = null;
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
208
215
|
if (item.authorId) {
|
|
209
|
-
const fallback = await bylineRepo.findByUserId(item.authorId);
|
|
216
|
+
const fallback = await bylineRepo.findByUserId(item.authorId, localeOpt);
|
|
210
217
|
if (fallback) {
|
|
211
218
|
item.bylines = [{
|
|
212
219
|
byline: fallback,
|
|
@@ -223,18 +230,59 @@ async function hydrateBylines(db, collection, item) {
|
|
|
223
230
|
}
|
|
224
231
|
/**
|
|
225
232
|
* Batch-hydrate bylines for multiple items using two bulk queries instead of N+1.
|
|
233
|
+
*
|
|
234
|
+
* Items may live at different locales (e.g. a list endpoint returning the
|
|
235
|
+
* translations of an entry). Group by `item.locale` and call the strict
|
|
236
|
+
* per-locale repo method once per group so each item resolves against its
|
|
237
|
+
* own locale's byline rows.
|
|
226
238
|
*/
|
|
227
239
|
async function hydrateBylinesMany(db, collection, items) {
|
|
228
240
|
if (items.length === 0) return;
|
|
229
241
|
const bylineRepo = new BylineRepository(db);
|
|
230
|
-
const
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
242
|
+
const localeBuckets = /* @__PURE__ */ new Map();
|
|
243
|
+
for (const item of items) {
|
|
244
|
+
const key = item.locale ?? null;
|
|
245
|
+
const bucket = localeBuckets.get(key);
|
|
246
|
+
if (bucket) bucket.push(item);
|
|
247
|
+
else localeBuckets.set(key, [item]);
|
|
248
|
+
}
|
|
249
|
+
const bylinesByItem = /* @__PURE__ */ new Map();
|
|
250
|
+
const itemsNeedingAuthorCheck = [];
|
|
251
|
+
for (const [locale, bucket] of localeBuckets) {
|
|
252
|
+
const localeOpt = locale ? { locale } : void 0;
|
|
253
|
+
const ids = bucket.map((i) => i.id);
|
|
254
|
+
const credits = await bylineRepo.getContentBylinesMany(collection, ids, localeOpt);
|
|
255
|
+
for (const [id, list] of credits) bylinesByItem.set(id, list);
|
|
256
|
+
for (const item of bucket) {
|
|
257
|
+
if (credits.has(item.id) && credits.get(item.id).length > 0) continue;
|
|
258
|
+
if (item.authorId) itemsNeedingAuthorCheck.push(item);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const fallbackByItem = /* @__PURE__ */ new Map();
|
|
262
|
+
if (itemsNeedingAuthorCheck.length > 0) {
|
|
263
|
+
const authorBuckets = /* @__PURE__ */ new Map();
|
|
264
|
+
for (const item of itemsNeedingAuthorCheck) {
|
|
265
|
+
if (item.primaryBylineId) continue;
|
|
266
|
+
const key = item.locale ?? null;
|
|
267
|
+
const bucket = authorBuckets.get(key);
|
|
268
|
+
if (bucket) bucket.push(item);
|
|
269
|
+
else authorBuckets.set(key, [item]);
|
|
270
|
+
}
|
|
271
|
+
for (const [locale, bucket] of authorBuckets) {
|
|
272
|
+
const localeOpt = locale ? { locale } : void 0;
|
|
273
|
+
const authorIds = bucket.map((i) => i.authorId).filter((id) => id !== null);
|
|
274
|
+
const uniqueAuthorIds = [...new Set(authorIds)];
|
|
275
|
+
if (uniqueAuthorIds.length === 0) continue;
|
|
276
|
+
const authorMap = await bylineRepo.findByUserIds(uniqueAuthorIds, localeOpt);
|
|
277
|
+
for (const item of bucket) {
|
|
278
|
+
if (!item.authorId) continue;
|
|
279
|
+
const f = authorMap.get(item.authorId);
|
|
280
|
+
if (f) fallbackByItem.set(item.id, f);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
236
284
|
for (const item of items) {
|
|
237
|
-
const explicit =
|
|
285
|
+
const explicit = bylinesByItem.get(item.id);
|
|
238
286
|
if (explicit && explicit.length > 0) {
|
|
239
287
|
item.bylines = explicit.map((c) => ({
|
|
240
288
|
...c,
|
|
@@ -243,19 +291,16 @@ async function hydrateBylinesMany(db, collection, items) {
|
|
|
243
291
|
item.byline = explicit[0]?.byline ?? null;
|
|
244
292
|
continue;
|
|
245
293
|
}
|
|
246
|
-
|
|
247
|
-
if (
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
item.byline = fallback;
|
|
257
|
-
continue;
|
|
258
|
-
}
|
|
294
|
+
const fallback = fallbackByItem.get(item.id);
|
|
295
|
+
if (fallback) {
|
|
296
|
+
item.bylines = [{
|
|
297
|
+
byline: fallback,
|
|
298
|
+
sortOrder: 0,
|
|
299
|
+
roleLabel: null,
|
|
300
|
+
source: "inferred"
|
|
301
|
+
}];
|
|
302
|
+
item.byline = fallback;
|
|
303
|
+
continue;
|
|
259
304
|
}
|
|
260
305
|
item.bylines = [];
|
|
261
306
|
item.byline = null;
|
|
@@ -426,10 +471,11 @@ async function handleContentCreate(db, collection, body) {
|
|
|
426
471
|
const item = await withTransaction(db, async (trx) => {
|
|
427
472
|
const repo = new ContentRepository(trx);
|
|
428
473
|
const bylineRepo = new BylineRepository(trx);
|
|
474
|
+
const effectiveLocale = body.locale ?? getI18nConfig()?.defaultLocale;
|
|
429
475
|
let slug = body.slug;
|
|
430
476
|
if (!slug) {
|
|
431
477
|
const slugSource = getSlugSource(body.data);
|
|
432
|
-
if (slugSource) slug = await repo.generateUniqueSlug(collection, slugSource,
|
|
478
|
+
if (slugSource) slug = await repo.generateUniqueSlug(collection, slugSource, effectiveLocale);
|
|
433
479
|
}
|
|
434
480
|
const created = await repo.create({
|
|
435
481
|
type: collection,
|
|
@@ -437,20 +483,22 @@ async function handleContentCreate(db, collection, body) {
|
|
|
437
483
|
data: body.data,
|
|
438
484
|
status: body.status || "draft",
|
|
439
485
|
authorId: body.authorId,
|
|
440
|
-
locale:
|
|
486
|
+
locale: effectiveLocale,
|
|
441
487
|
translationOf: body.translationOf,
|
|
442
488
|
createdAt: body.createdAt,
|
|
443
489
|
publishedAt: body.publishedAt
|
|
444
490
|
});
|
|
445
|
-
if (body.bylines !== void 0)
|
|
446
|
-
await bylineRepo.setContentBylines(collection, created.id, body.bylines);
|
|
447
|
-
created.primaryBylineId = body.bylines[0]?.bylineId ?? null;
|
|
448
|
-
}
|
|
449
|
-
await hydrateBylines(trx, collection, created);
|
|
491
|
+
if (body.bylines !== void 0) created.primaryBylineId = (await bylineRepo.setContentBylines(collection, created.id, body.bylines))[0]?.byline.translationGroup ?? null;
|
|
450
492
|
if (body.translationOf) {
|
|
451
|
-
const { TaxonomyRepository } = await import("./taxonomy-
|
|
493
|
+
const { TaxonomyRepository } = await import("./taxonomy-zqGQUqgu.mjs").then((n) => n.n);
|
|
452
494
|
await new TaxonomyRepository(trx).copyEntryTerms(collection, body.translationOf, created.id);
|
|
495
|
+
if (body.bylines === void 0) {
|
|
496
|
+
await bylineRepo.copyContentBylines(collection, body.translationOf, created.id);
|
|
497
|
+
const source = await repo.findById(collection, body.translationOf);
|
|
498
|
+
if (source) created.primaryBylineId = source.primaryBylineId;
|
|
499
|
+
}
|
|
453
500
|
}
|
|
501
|
+
await hydrateBylines(trx, collection, created);
|
|
454
502
|
if (body.seo && hasSeo) created.seo = await new SeoRepository(trx).upsert(collection, created.id, body.seo);
|
|
455
503
|
else if (hasSeo) created.seo = { ...SEO_DEFAULTS };
|
|
456
504
|
return created;
|
|
@@ -544,10 +592,7 @@ async function handleContentUpdate(db, collection, id, body) {
|
|
|
544
592
|
authorId: body.authorId,
|
|
545
593
|
publishedAt: body.publishedAt
|
|
546
594
|
});
|
|
547
|
-
if (body.bylines !== void 0)
|
|
548
|
-
await bylineRepo.setContentBylines(collection, resolvedId, body.bylines);
|
|
549
|
-
updated.primaryBylineId = body.bylines[0]?.bylineId ?? null;
|
|
550
|
-
}
|
|
595
|
+
if (body.bylines !== void 0) updated.primaryBylineId = (await bylineRepo.setContentBylines(collection, resolvedId, body.bylines))[0]?.byline.translationGroup ?? null;
|
|
551
596
|
if (oldSlug && body.slug) {
|
|
552
597
|
const collectionRow = await trx.selectFrom("_emdash_collections").select("url_pattern").where("slug", "=", collection).executeTakeFirst();
|
|
553
598
|
await new RedirectRepository(trx).createAutoRedirect(collection, oldSlug, body.slug, resolvedId, collectionRow?.url_pattern ?? null);
|
|
@@ -2583,7 +2628,7 @@ async function handleMarketplaceInstall(db, storage, sandboxRunner, marketplaceU
|
|
|
2583
2628
|
message: "Storage is required for marketplace plugin installation"
|
|
2584
2629
|
}
|
|
2585
2630
|
};
|
|
2586
|
-
if (!sandboxRunner || !sandboxRunner.isAvailable()) return {
|
|
2631
|
+
if (!opts?.sandboxBypassed && (!sandboxRunner || !sandboxRunner.isAvailable())) return {
|
|
2587
2632
|
success: false,
|
|
2588
2633
|
error: {
|
|
2589
2634
|
code: "SANDBOX_NOT_AVAILABLE",
|
|
@@ -2715,7 +2760,7 @@ async function handleMarketplaceUpdate(db, storage, sandboxRunner, marketplaceUr
|
|
|
2715
2760
|
message: "Storage is required"
|
|
2716
2761
|
}
|
|
2717
2762
|
};
|
|
2718
|
-
if (!sandboxRunner || !sandboxRunner.isAvailable()) return {
|
|
2763
|
+
if (!opts?.sandboxBypassed && (!sandboxRunner || !sandboxRunner.isAvailable())) return {
|
|
2719
2764
|
success: false,
|
|
2720
2765
|
error: {
|
|
2721
2766
|
code: "SANDBOX_NOT_AVAILABLE",
|
|
@@ -3336,6 +3381,45 @@ async function makeRegistryPluginId(publisherDid, slug) {
|
|
|
3336
3381
|
|
|
3337
3382
|
//#endregion
|
|
3338
3383
|
//#region src/api/handlers/registry.ts
|
|
3384
|
+
/**
|
|
3385
|
+
* Registry plugin install handler.
|
|
3386
|
+
*
|
|
3387
|
+
* Installs a plugin published to the experimental decentralized plugin
|
|
3388
|
+
* registry described in RFC 0001. The install flow:
|
|
3389
|
+
*
|
|
3390
|
+
* 1. Resolve `(handle, slug)` to a publisher DID via the configured
|
|
3391
|
+
* aggregator's `resolvePackage` XRPC.
|
|
3392
|
+
* 2. Look up the requested release (or the policy-filtered latest one)
|
|
3393
|
+
* via `getLatestRelease` / `listReleases`.
|
|
3394
|
+
* 3. Reject the install if the aggregator surfaces a `security:yanked`
|
|
3395
|
+
* hard-enforcement label or the release is below the configured
|
|
3396
|
+
* minimum release age.
|
|
3397
|
+
* 4. Fetch the bundle artifact, walking aggregator mirrors first and
|
|
3398
|
+
* falling back to the publisher-declared URL.
|
|
3399
|
+
* 5. Verify the artifact's multibase checksum against the signed
|
|
3400
|
+
* release record's `artifacts.package.checksum`.
|
|
3401
|
+
* 6. Extract `manifest.json` + `backend.js` + optional `admin.js` from
|
|
3402
|
+
* the gzipped tar bundle.
|
|
3403
|
+
* 7. Store the extracted files in site-local R2 under the
|
|
3404
|
+
* `registry/<plugin-id>/<version>/` prefix.
|
|
3405
|
+
* 8. Write a `plugin_states` row with `source = "registry"` and the
|
|
3406
|
+
* `(publisher_did, slug)` pair so updates can be resolved later.
|
|
3407
|
+
* 9. Sync the runtime so the plugin becomes active immediately.
|
|
3408
|
+
*
|
|
3409
|
+
* Known gaps (tracked separately):
|
|
3410
|
+
*
|
|
3411
|
+
* - The aggregator-supplied records are not yet cryptographically
|
|
3412
|
+
* verified against the publisher's MST signature. The signed bytes
|
|
3413
|
+
* and CIDs are passed through verbatim per the lexicon, but full
|
|
3414
|
+
* PDS-direct verification with proof traversal is follow-up work.
|
|
3415
|
+
* The artifact checksum is verified end-to-end against the value
|
|
3416
|
+
* in the (aggregator-relayed) release record, which is the actual
|
|
3417
|
+
* trust boundary for the bytes that end up in the sandbox.
|
|
3418
|
+
* - `acceptLabelers` is forwarded as-is to the aggregator; this
|
|
3419
|
+
* handler does not independently re-fetch and verify labels from
|
|
3420
|
+
* each labeller's DID. Aggregator label envelope tampering is
|
|
3421
|
+
* mitigated by the artifact checksum but not detected.
|
|
3422
|
+
*/
|
|
3339
3423
|
/** Matches a bare 64-character lowercase/uppercase hex SHA-256 digest. */
|
|
3340
3424
|
const SHA256_HEX_PATTERN = /^[a-f0-9]{64}$/i;
|
|
3341
3425
|
/** Compute the SHA-256 of `bytes` as a lowercase hex string. */
|
|
@@ -3530,7 +3614,7 @@ async function assertSafeArtifactUrl(urlString) {
|
|
|
3530
3614
|
try {
|
|
3531
3615
|
return await resolveAndValidateExternalUrl(url.href);
|
|
3532
3616
|
} catch (err) {
|
|
3533
|
-
if (err instanceof SsrfError) throw new Error(`Artifact URL rejected: ${err.message}
|
|
3617
|
+
if (err instanceof SsrfError) throw new Error(`Artifact URL rejected: ${err.message}`, { cause: err });
|
|
3534
3618
|
throw err;
|
|
3535
3619
|
}
|
|
3536
3620
|
}
|
|
@@ -3642,6 +3726,31 @@ async function fetchArtifact(mirrors, declaredUrl) {
|
|
|
3642
3726
|
}
|
|
3643
3727
|
throw new Error(`Failed to download artifact from any source. Tried:\n ${clientErrors.join("\n ")}`);
|
|
3644
3728
|
}
|
|
3729
|
+
/**
|
|
3730
|
+
* Gate a release's `requires` constraints against the running host
|
|
3731
|
+
* environment. `requires` is the lexicon-`unknown` value off the signed
|
|
3732
|
+
* release record — never trust its shape; `checkEnvCompatibility` guards it.
|
|
3733
|
+
*
|
|
3734
|
+
* Returns `null` when every advertised constraint is satisfied (or there are
|
|
3735
|
+
* none), or a structured `ENV_INCOMPATIBLE` error naming the unsatisfied
|
|
3736
|
+
* constraints and the host versions. The error carries the guarded `requires`
|
|
3737
|
+
* and `host` maps so the admin can render the same mismatch the UI gate shows.
|
|
3738
|
+
*/
|
|
3739
|
+
function assertEnvCompatible(requires, hostEnv) {
|
|
3740
|
+
for (const skipped of findSkippedEnvConstraints(requires, hostEnv)) console.warn(`[registry] env compatibility constraint skipped: ${skipped.key} requires ${skipped.required} but host version is ${skipped.reason}`);
|
|
3741
|
+
const mismatches = checkEnvCompatibility(requires, hostEnv);
|
|
3742
|
+
if (mismatches.length === 0) return null;
|
|
3743
|
+
const guarded = {};
|
|
3744
|
+
for (const m of mismatches) guarded[m.key] = m.required;
|
|
3745
|
+
return {
|
|
3746
|
+
code: "ENV_INCOMPATIBLE",
|
|
3747
|
+
message: `This release is not compatible with the current environment: ${mismatches.map((m) => `${m.key} requires ${m.required} but host is ${m.host}`).join("; ")}.`,
|
|
3748
|
+
details: {
|
|
3749
|
+
requires: guarded,
|
|
3750
|
+
host: hostEnv
|
|
3751
|
+
}
|
|
3752
|
+
};
|
|
3753
|
+
}
|
|
3645
3754
|
async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigInput, input, opts) {
|
|
3646
3755
|
const registryConfig = coerceRegistryConfig(registryConfigInput);
|
|
3647
3756
|
if (!registryConfig) return {
|
|
@@ -3753,6 +3862,13 @@ async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigI
|
|
|
3753
3862
|
message: "This release has been withdrawn (security:yanked label)."
|
|
3754
3863
|
}
|
|
3755
3864
|
};
|
|
3865
|
+
if (opts?.hostEnv) {
|
|
3866
|
+
const envError = assertEnvCompatible(releaseView.release?.requires, opts.hostEnv);
|
|
3867
|
+
if (envError) return {
|
|
3868
|
+
success: false,
|
|
3869
|
+
error: envError
|
|
3870
|
+
};
|
|
3871
|
+
}
|
|
3756
3872
|
const minimumReleaseAge = registryConfig.policy?.minimumReleaseAge;
|
|
3757
3873
|
let minimumReleaseAgeSeconds = 0;
|
|
3758
3874
|
if (minimumReleaseAge !== void 0) try {
|
|
@@ -3918,6 +4034,20 @@ async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigI
|
|
|
3918
4034
|
}
|
|
3919
4035
|
};
|
|
3920
4036
|
} catch (err) {
|
|
4037
|
+
if (err instanceof ClientValidationError) return {
|
|
4038
|
+
success: false,
|
|
4039
|
+
error: {
|
|
4040
|
+
code: "AGGREGATOR_RESPONSE_INVALID",
|
|
4041
|
+
message: `Aggregator returned a response that does not conform to its lexicon (${err.target})`
|
|
4042
|
+
}
|
|
4043
|
+
};
|
|
4044
|
+
if (err instanceof ClientResponseError) return {
|
|
4045
|
+
success: false,
|
|
4046
|
+
error: {
|
|
4047
|
+
code: err.status === 404 ? "AGGREGATOR_NOT_FOUND" : "AGGREGATOR_HTTP_ERROR",
|
|
4048
|
+
message: `Aggregator returned ${err.status}: ${err.error}`
|
|
4049
|
+
}
|
|
4050
|
+
};
|
|
3921
4051
|
if (err instanceof EmDashStorageError) return {
|
|
3922
4052
|
success: false,
|
|
3923
4053
|
error: {
|
|
@@ -3935,7 +4065,381 @@ async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigI
|
|
|
3935
4065
|
};
|
|
3936
4066
|
}
|
|
3937
4067
|
}
|
|
4068
|
+
/**
|
|
4069
|
+
* Uninstall a registry-source plugin. Deletes the R2 bundle under
|
|
4070
|
+
* `registry/<pluginId>/<version>/`, optionally drops the plugin's
|
|
4071
|
+
* `_plugin_storage` rows, and removes the `_plugin_state` row. The
|
|
4072
|
+
* sandbox runtime is reconciled by the route's `syncRegistryPlugins`
|
|
4073
|
+
* call after this returns.
|
|
4074
|
+
*
|
|
4075
|
+
* Refuses to uninstall plugins whose `source` is not `"registry"` to
|
|
4076
|
+
* avoid trashing a marketplace/config plugin that happens to share the
|
|
4077
|
+
* pluginId namespace.
|
|
4078
|
+
*/
|
|
4079
|
+
async function handleRegistryUninstall(db, storage, pluginId, opts) {
|
|
4080
|
+
try {
|
|
4081
|
+
const stateRepo = new PluginStateRepository(db);
|
|
4082
|
+
const existing = await stateRepo.get(pluginId);
|
|
4083
|
+
if (!existing || existing.source !== "registry") return {
|
|
4084
|
+
success: false,
|
|
4085
|
+
error: {
|
|
4086
|
+
code: "NOT_FOUND",
|
|
4087
|
+
message: `No registry plugin found: ${pluginId}`
|
|
4088
|
+
}
|
|
4089
|
+
};
|
|
4090
|
+
const version = existing.version;
|
|
4091
|
+
let dataDeleted = false;
|
|
4092
|
+
if (opts?.deleteData) {
|
|
4093
|
+
await db.deleteFrom("_plugin_storage").where("plugin_id", "=", pluginId).execute();
|
|
4094
|
+
dataDeleted = true;
|
|
4095
|
+
}
|
|
4096
|
+
if (storage) await deleteBundleFromR2(storage, pluginId, version, "registry");
|
|
4097
|
+
await stateRepo.delete(pluginId);
|
|
4098
|
+
return {
|
|
4099
|
+
success: true,
|
|
4100
|
+
data: {
|
|
4101
|
+
pluginId,
|
|
4102
|
+
dataDeleted
|
|
4103
|
+
}
|
|
4104
|
+
};
|
|
4105
|
+
} catch (err) {
|
|
4106
|
+
console.error("[registry-uninstall] Failed:", err);
|
|
4107
|
+
return {
|
|
4108
|
+
success: false,
|
|
4109
|
+
error: {
|
|
4110
|
+
code: "UNINSTALL_FAILED",
|
|
4111
|
+
message: "Failed to uninstall plugin"
|
|
4112
|
+
}
|
|
4113
|
+
};
|
|
4114
|
+
}
|
|
4115
|
+
}
|
|
4116
|
+
/**
|
|
4117
|
+
* Update a registry-source plugin to a newer release. Mirrors
|
|
4118
|
+
* `handleMarketplaceUpdate`: resolves the target version via the aggregator,
|
|
4119
|
+
* re-runs the artifact fetch / checksum / extract pipeline, diffs capabilities
|
|
4120
|
+
* and route visibility against the currently installed bundle, and gates
|
|
4121
|
+
* escalations behind `confirmCapabilityChanges` / `confirmRouteVisibilityChanges`
|
|
4122
|
+
* so the admin re-consents to widened permissions.
|
|
4123
|
+
*
|
|
4124
|
+
* Refuses non-registry sources. Refuses when the stored state row is missing
|
|
4125
|
+
* the `(publisherDid, slug)` it needs to resolve against the aggregator.
|
|
4126
|
+
*/
|
|
4127
|
+
async function handleRegistryUpdate(db, storage, sandboxRunner, registryConfigInput, pluginId, opts) {
|
|
4128
|
+
const registryConfig = coerceRegistryConfig(registryConfigInput);
|
|
4129
|
+
if (!registryConfig) return {
|
|
4130
|
+
success: false,
|
|
4131
|
+
error: {
|
|
4132
|
+
code: "REGISTRY_NOT_CONFIGURED",
|
|
4133
|
+
message: "Registry is not configured"
|
|
4134
|
+
}
|
|
4135
|
+
};
|
|
4136
|
+
if (!storage) return {
|
|
4137
|
+
success: false,
|
|
4138
|
+
error: {
|
|
4139
|
+
code: "STORAGE_NOT_CONFIGURED",
|
|
4140
|
+
message: "Storage is required for registry plugin updates"
|
|
4141
|
+
}
|
|
4142
|
+
};
|
|
4143
|
+
if (!sandboxRunner || !sandboxRunner.isAvailable()) return {
|
|
4144
|
+
success: false,
|
|
4145
|
+
error: {
|
|
4146
|
+
code: "SANDBOX_NOT_AVAILABLE",
|
|
4147
|
+
message: "Sandbox runner is required"
|
|
4148
|
+
}
|
|
4149
|
+
};
|
|
4150
|
+
try {
|
|
4151
|
+
validateAggregatorUrl(registryConfig.aggregatorUrl);
|
|
4152
|
+
} catch (err) {
|
|
4153
|
+
return {
|
|
4154
|
+
success: false,
|
|
4155
|
+
error: {
|
|
4156
|
+
code: "REGISTRY_NOT_CONFIGURED",
|
|
4157
|
+
message: err instanceof Error ? err.message : "Invalid aggregator URL"
|
|
4158
|
+
}
|
|
4159
|
+
};
|
|
4160
|
+
}
|
|
4161
|
+
try {
|
|
4162
|
+
const stateRepo = new PluginStateRepository(db);
|
|
4163
|
+
const existing = await stateRepo.get(pluginId);
|
|
4164
|
+
if (!existing || existing.source !== "registry") return {
|
|
4165
|
+
success: false,
|
|
4166
|
+
error: {
|
|
4167
|
+
code: "NOT_FOUND",
|
|
4168
|
+
message: `No registry plugin found: ${pluginId}`
|
|
4169
|
+
}
|
|
4170
|
+
};
|
|
4171
|
+
if (!existing.registryPublisherDid || !existing.registrySlug) return {
|
|
4172
|
+
success: false,
|
|
4173
|
+
error: {
|
|
4174
|
+
code: "INVALID_STATE",
|
|
4175
|
+
message: `Registry plugin ${pluginId} is missing publisher DID or slug in state`
|
|
4176
|
+
}
|
|
4177
|
+
};
|
|
4178
|
+
const oldVersion = existing.version;
|
|
4179
|
+
const publisherDid = existing.registryPublisherDid;
|
|
4180
|
+
const slug = existing.registrySlug;
|
|
4181
|
+
const { DiscoveryClient } = await import("@emdash-cms/registry-client/discovery");
|
|
4182
|
+
const aggregatorDeadline = Date.now() + AGGREGATOR_TOTAL_BUDGET_MS;
|
|
4183
|
+
const discovery = new DiscoveryClient({
|
|
4184
|
+
aggregatorUrl: registryConfig.aggregatorUrl,
|
|
4185
|
+
acceptLabelers: registryConfig.acceptLabelers,
|
|
4186
|
+
fetch: timedFetch(aggregatorDeadline)
|
|
4187
|
+
});
|
|
4188
|
+
const MAX_LIST_PAGES = 20;
|
|
4189
|
+
const releaseView = await (async () => {
|
|
4190
|
+
if (!opts?.version) return discovery.getLatestRelease({
|
|
4191
|
+
did: publisherDid,
|
|
4192
|
+
package: slug
|
|
4193
|
+
});
|
|
4194
|
+
let cursor;
|
|
4195
|
+
const seenCursors = /* @__PURE__ */ new Set();
|
|
4196
|
+
for (let page = 0; page < MAX_LIST_PAGES; page++) {
|
|
4197
|
+
if (cursor !== void 0) {
|
|
4198
|
+
if (seenCursors.has(cursor)) break;
|
|
4199
|
+
seenCursors.add(cursor);
|
|
4200
|
+
}
|
|
4201
|
+
const result = await discovery.listReleases({
|
|
4202
|
+
did: publisherDid,
|
|
4203
|
+
package: slug,
|
|
4204
|
+
cursor,
|
|
4205
|
+
limit: 50
|
|
4206
|
+
});
|
|
4207
|
+
for (const r of result.releases) if (r.version === opts.version) return r;
|
|
4208
|
+
if (!result.cursor) break;
|
|
4209
|
+
cursor = result.cursor;
|
|
4210
|
+
}
|
|
4211
|
+
})();
|
|
4212
|
+
if (!releaseView) return {
|
|
4213
|
+
success: false,
|
|
4214
|
+
error: {
|
|
4215
|
+
code: "NO_VERSION",
|
|
4216
|
+
message: opts?.version ? `Version ${opts.version} not found for ${publisherDid}/${slug}` : `No installable release found for ${publisherDid}/${slug}`
|
|
4217
|
+
}
|
|
4218
|
+
};
|
|
4219
|
+
const signedRelease = releaseView.release;
|
|
4220
|
+
if (releaseView.did !== publisherDid || releaseView.package !== slug || signedRelease?.package !== slug || opts?.version !== void 0 && releaseView.version !== opts.version || signedRelease?.version !== releaseView.version) return {
|
|
4221
|
+
success: false,
|
|
4222
|
+
error: {
|
|
4223
|
+
code: "AGGREGATOR_IDENTITY_MISMATCH",
|
|
4224
|
+
message: "Aggregator returned a release view that does not match the requested package or version."
|
|
4225
|
+
}
|
|
4226
|
+
};
|
|
4227
|
+
const newVersion = releaseView.version;
|
|
4228
|
+
if (newVersion === oldVersion) return {
|
|
4229
|
+
success: false,
|
|
4230
|
+
error: {
|
|
4231
|
+
code: "ALREADY_UP_TO_DATE",
|
|
4232
|
+
message: "Plugin is already at the requested version"
|
|
4233
|
+
}
|
|
4234
|
+
};
|
|
4235
|
+
if ((releaseView.labels ?? []).some((l) => l.val === "security:yanked")) return {
|
|
4236
|
+
success: false,
|
|
4237
|
+
error: {
|
|
4238
|
+
code: "YANKED",
|
|
4239
|
+
message: "Release has been yanked by a trusted labeller"
|
|
4240
|
+
}
|
|
4241
|
+
};
|
|
4242
|
+
if (opts?.hostEnv) {
|
|
4243
|
+
const envError = assertEnvCompatible(signedRelease.requires, opts.hostEnv);
|
|
4244
|
+
if (envError) return {
|
|
4245
|
+
success: false,
|
|
4246
|
+
error: envError
|
|
4247
|
+
};
|
|
4248
|
+
}
|
|
4249
|
+
const declaredUrl = signedRelease.artifacts?.package?.url;
|
|
4250
|
+
const declaredChecksum = signedRelease.artifacts?.package?.checksum;
|
|
4251
|
+
if (!declaredUrl || !declaredChecksum) return {
|
|
4252
|
+
success: false,
|
|
4253
|
+
error: {
|
|
4254
|
+
code: "INVALID_RELEASE",
|
|
4255
|
+
message: "Release record is missing artifact url or checksum"
|
|
4256
|
+
}
|
|
4257
|
+
};
|
|
4258
|
+
await assertSafeArtifactUrl(declaredUrl);
|
|
4259
|
+
const mirrors = (releaseView.mirrors ?? []).slice(0, MAX_MIRRORS);
|
|
4260
|
+
for (const mirror of mirrors) await assertSafeArtifactUrl(mirror);
|
|
4261
|
+
const artifactBytes = await fetchArtifact(mirrors, declaredUrl);
|
|
4262
|
+
if (!await verifyChecksum(artifactBytes, declaredChecksum)) return {
|
|
4263
|
+
success: false,
|
|
4264
|
+
error: {
|
|
4265
|
+
code: "CHECKSUM_MISMATCH",
|
|
4266
|
+
message: "Artifact bytes do not match the release's published checksum"
|
|
4267
|
+
}
|
|
4268
|
+
};
|
|
4269
|
+
const bundle = await extractBundle(artifactBytes);
|
|
4270
|
+
if (bundle.manifest.version !== newVersion) return {
|
|
4271
|
+
success: false,
|
|
4272
|
+
error: {
|
|
4273
|
+
code: "BUNDLE_VERSION_MISMATCH",
|
|
4274
|
+
message: `Bundle manifest version (${bundle.manifest.version}) does not match release version (${newVersion})`
|
|
4275
|
+
}
|
|
4276
|
+
};
|
|
4277
|
+
if (bundle.manifest.id !== slug) return {
|
|
4278
|
+
success: false,
|
|
4279
|
+
error: {
|
|
4280
|
+
code: "BUNDLE_IDENTITY_MISMATCH",
|
|
4281
|
+
message: `Bundle manifest id (${bundle.manifest.id}) does not match registry slug (${slug})`
|
|
4282
|
+
}
|
|
4283
|
+
};
|
|
4284
|
+
bundle.manifest = {
|
|
4285
|
+
...bundle.manifest,
|
|
4286
|
+
id: pluginId
|
|
4287
|
+
};
|
|
4288
|
+
const oldBundle = await loadBundleFromR2(storage, pluginId, oldVersion, "registry");
|
|
4289
|
+
const capabilityChanges = diffCapabilities(oldBundle?.manifest.capabilities ?? [], bundle.manifest.capabilities);
|
|
4290
|
+
if (capabilityChanges.added.length > 0 && !opts?.confirmCapabilityChanges) return {
|
|
4291
|
+
success: false,
|
|
4292
|
+
error: {
|
|
4293
|
+
code: "CAPABILITY_ESCALATION",
|
|
4294
|
+
message: "Plugin update requires new capabilities",
|
|
4295
|
+
details: { capabilityChanges }
|
|
4296
|
+
}
|
|
4297
|
+
};
|
|
4298
|
+
const routeVisibilityChanges = diffRouteVisibility(oldBundle?.manifest, bundle.manifest);
|
|
4299
|
+
const hasNewPublicRoutes = routeVisibilityChanges.newlyPublic.length > 0;
|
|
4300
|
+
if (hasNewPublicRoutes && !opts?.confirmRouteVisibilityChanges) return {
|
|
4301
|
+
success: false,
|
|
4302
|
+
error: {
|
|
4303
|
+
code: "ROUTE_VISIBILITY_ESCALATION",
|
|
4304
|
+
message: "Plugin update exposes new public (unauthenticated) routes",
|
|
4305
|
+
details: {
|
|
4306
|
+
routeVisibilityChanges,
|
|
4307
|
+
capabilityChanges
|
|
4308
|
+
}
|
|
4309
|
+
}
|
|
4310
|
+
};
|
|
4311
|
+
await storeBundleInR2(storage, pluginId, newVersion, bundle, "registry");
|
|
4312
|
+
await stateRepo.upsert(pluginId, newVersion, "active", {
|
|
4313
|
+
source: "registry",
|
|
4314
|
+
registryPublisherDid: publisherDid,
|
|
4315
|
+
registrySlug: slug,
|
|
4316
|
+
displayName: existing.displayName ?? slug,
|
|
4317
|
+
description: existing.description ?? void 0
|
|
4318
|
+
});
|
|
4319
|
+
deleteBundleFromR2(storage, pluginId, oldVersion, "registry").catch(() => {});
|
|
4320
|
+
return {
|
|
4321
|
+
success: true,
|
|
4322
|
+
data: {
|
|
4323
|
+
pluginId,
|
|
4324
|
+
oldVersion,
|
|
4325
|
+
newVersion,
|
|
4326
|
+
capabilityChanges,
|
|
4327
|
+
routeVisibilityChanges: hasNewPublicRoutes ? routeVisibilityChanges : void 0
|
|
4328
|
+
}
|
|
4329
|
+
};
|
|
4330
|
+
} catch (err) {
|
|
4331
|
+
if (err instanceof ClientValidationError) return {
|
|
4332
|
+
success: false,
|
|
4333
|
+
error: {
|
|
4334
|
+
code: "AGGREGATOR_RESPONSE_INVALID",
|
|
4335
|
+
message: `Aggregator returned a response that does not conform to its lexicon (${err.target})`
|
|
4336
|
+
}
|
|
4337
|
+
};
|
|
4338
|
+
if (err instanceof ClientResponseError) return {
|
|
4339
|
+
success: false,
|
|
4340
|
+
error: {
|
|
4341
|
+
code: err.status === 404 ? "AGGREGATOR_NOT_FOUND" : "AGGREGATOR_HTTP_ERROR",
|
|
4342
|
+
message: `Aggregator returned ${err.status}: ${err.error}`
|
|
4343
|
+
}
|
|
4344
|
+
};
|
|
4345
|
+
if (err instanceof EmDashStorageError) return {
|
|
4346
|
+
success: false,
|
|
4347
|
+
error: {
|
|
4348
|
+
code: err.code ?? "STORAGE_ERROR",
|
|
4349
|
+
message: "Storage error while updating plugin"
|
|
4350
|
+
}
|
|
4351
|
+
};
|
|
4352
|
+
console.error("[registry-update] Failed:", err);
|
|
4353
|
+
return {
|
|
4354
|
+
success: false,
|
|
4355
|
+
error: {
|
|
4356
|
+
code: "UPDATE_FAILED",
|
|
4357
|
+
message: err instanceof Error ? err.message : "Failed to update plugin"
|
|
4358
|
+
}
|
|
4359
|
+
};
|
|
4360
|
+
}
|
|
4361
|
+
}
|
|
4362
|
+
/**
|
|
4363
|
+
* Bulk update check across every installed registry plugin. Queries the
|
|
4364
|
+
* aggregator for each plugin's latest release and reports `hasUpdate`
|
|
4365
|
+
* based on the version comparison. Plugins whose aggregator lookup fails
|
|
4366
|
+
* (unreachable, delisted, malformed) are skipped silently — one bad
|
|
4367
|
+
* publisher must not blank the whole admin Updates list.
|
|
4368
|
+
*/
|
|
4369
|
+
async function handleRegistryUpdateCheck(db, registryConfigInput) {
|
|
4370
|
+
const registryConfig = coerceRegistryConfig(registryConfigInput);
|
|
4371
|
+
if (!registryConfig) return {
|
|
4372
|
+
success: false,
|
|
4373
|
+
error: {
|
|
4374
|
+
code: "REGISTRY_NOT_CONFIGURED",
|
|
4375
|
+
message: "Registry is not configured"
|
|
4376
|
+
}
|
|
4377
|
+
};
|
|
4378
|
+
try {
|
|
4379
|
+
const registryPlugins = await new PluginStateRepository(db).getRegistryPlugins();
|
|
4380
|
+
if (registryPlugins.length === 0) return {
|
|
4381
|
+
success: true,
|
|
4382
|
+
data: { items: [] }
|
|
4383
|
+
};
|
|
4384
|
+
const { DiscoveryClient } = await import("@emdash-cms/registry-client/discovery");
|
|
4385
|
+
const aggregatorDeadline = Date.now() + AGGREGATOR_TOTAL_BUDGET_MS;
|
|
4386
|
+
const discovery = new DiscoveryClient({
|
|
4387
|
+
aggregatorUrl: registryConfig.aggregatorUrl,
|
|
4388
|
+
acceptLabelers: registryConfig.acceptLabelers,
|
|
4389
|
+
fetch: timedFetch(aggregatorDeadline)
|
|
4390
|
+
});
|
|
4391
|
+
const items = [];
|
|
4392
|
+
for (const plugin of registryPlugins) {
|
|
4393
|
+
if (!plugin.registryPublisherDid || !plugin.registrySlug) continue;
|
|
4394
|
+
try {
|
|
4395
|
+
const latest = (await discovery.getLatestRelease({
|
|
4396
|
+
did: plugin.registryPublisherDid,
|
|
4397
|
+
package: plugin.registrySlug
|
|
4398
|
+
})).version;
|
|
4399
|
+
if (!latest) continue;
|
|
4400
|
+
const installed = plugin.version;
|
|
4401
|
+
items.push({
|
|
4402
|
+
pluginId: plugin.pluginId,
|
|
4403
|
+
installed,
|
|
4404
|
+
latest,
|
|
4405
|
+
hasUpdate: latest !== installed,
|
|
4406
|
+
hasCapabilityChanges: false,
|
|
4407
|
+
hasRouteVisibilityChanges: false
|
|
4408
|
+
});
|
|
4409
|
+
} catch (err) {
|
|
4410
|
+
console.warn(`[registry-update-check] Skipped ${plugin.pluginId}:`, err);
|
|
4411
|
+
}
|
|
4412
|
+
}
|
|
4413
|
+
return {
|
|
4414
|
+
success: true,
|
|
4415
|
+
data: { items }
|
|
4416
|
+
};
|
|
4417
|
+
} catch (err) {
|
|
4418
|
+
if (err instanceof ClientValidationError) return {
|
|
4419
|
+
success: false,
|
|
4420
|
+
error: {
|
|
4421
|
+
code: "AGGREGATOR_RESPONSE_INVALID",
|
|
4422
|
+
message: `Aggregator returned a response that does not conform to its lexicon (${err.target})`
|
|
4423
|
+
}
|
|
4424
|
+
};
|
|
4425
|
+
if (err instanceof ClientResponseError) return {
|
|
4426
|
+
success: false,
|
|
4427
|
+
error: {
|
|
4428
|
+
code: err.status === 404 ? "AGGREGATOR_NOT_FOUND" : "AGGREGATOR_HTTP_ERROR",
|
|
4429
|
+
message: `Aggregator returned ${err.status}: ${err.error}`
|
|
4430
|
+
}
|
|
4431
|
+
};
|
|
4432
|
+
console.error("[registry-update-check] Failed:", err);
|
|
4433
|
+
return {
|
|
4434
|
+
success: false,
|
|
4435
|
+
error: {
|
|
4436
|
+
code: "UPDATE_CHECK_FAILED",
|
|
4437
|
+
message: "Failed to check for registry updates"
|
|
4438
|
+
}
|
|
4439
|
+
};
|
|
4440
|
+
}
|
|
4441
|
+
}
|
|
3938
4442
|
|
|
3939
4443
|
//#endregion
|
|
3940
|
-
export {
|
|
3941
|
-
//# sourceMappingURL=api-
|
|
4444
|
+
export { handleContentGetIncludingTrashed as $, handleSchemaFieldCreate as A, handleMediaUpdate as B, handleOrphanedTableList as C, handleSchemaCollectionGet as D, handleSchemaCollectionDelete as E, handleSchemaFieldUpdate as F, handleContentCompare as G, handleRevisionList as H, handleMediaCreate as I, handleContentCreate as J, handleContentCountScheduled as K, handleMediaDelete as L, handleSchemaFieldGet as M, handleSchemaFieldList as N, handleSchemaCollectionList as O, handleSchemaFieldReorder as P, handleContentGet as Q, handleMediaGet as R, PluginStateRepository as S, handleSchemaCollectionCreate as T, handleRevisionRestore as U, handleRevisionGet as V, generateManifest as W, handleContentDiscardDraft as X, handleContentDelete as Y, handleContentDuplicate as Z, loadBundleFromR2 as _, handleRegistryUpdateCheck as a, handleContentSchedule as at, handlePluginGet as b, validateAggregatorUrl as c, handleContentUnschedule as ct, handleMarketplaceSearch as d, handleContentList as et, handleMarketplaceUninstall as f, handleThemeSearch as g, handleThemeGetDetail as h, handleRegistryUpdate as i, handleContentRestore as it, handleSchemaFieldDelete as j, handleSchemaCollectionUpdate as k, handleMarketplaceGetPlugin as l, handleContentUpdate as lt, handleMarketplaceUpdateCheck as m, handleRegistryInstall as n, handleContentPermanentDelete as nt, coerceRegistryConfig as o, handleContentTranslations as ot, handleMarketplaceUpdate as p, handleContentCountTrashed as q, handleRegistryUninstall as r, handleContentPublish as rt, normalizeRegistryConfig as s, handleContentUnpublish as st, assertSafeArtifactUrl as t, handleContentListTrashed as tt, handleMarketplaceInstall as u, validateRev as ut, handlePluginDisable as v, handleOrphanedTableRegister as w, handlePluginList as x, handlePluginEnable as y, handleMediaList as z };
|
|
4445
|
+
//# sourceMappingURL=api-BNKqxyFX.mjs.map
|