emdash 0.35.0 → 0.36.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/activation-K0kGBWuJ.mjs +382 -0
- package/dist/activation-K0kGBWuJ.mjs.map +1 -0
- package/dist/{adapters-Bb1vG41D.d.mts → adapters-CzL3H752.d.mts} +3 -3
- package/dist/{adapters-Bb1vG41D.d.mts.map → adapters-CzL3H752.d.mts.map} +1 -1
- package/dist/{allowed-origins-DW7sYyqg.mjs → allowed-origins-maylGaHv.mjs} +2 -2
- package/dist/{allowed-origins-DW7sYyqg.mjs.map → allowed-origins-maylGaHv.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +22 -20
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -5
- package/dist/api-B0w3uBiG.mjs +2269 -0
- package/dist/api-B0w3uBiG.mjs.map +1 -0
- package/dist/{api-tokens-KO24G1Fd.mjs → api-tokens-9YrrCoE6.mjs} +2 -2
- package/dist/{api-tokens-KO24G1Fd.mjs.map → api-tokens-9YrrCoE6.mjs.map} +1 -1
- package/dist/{apply-kUDt80-G.mjs → apply-B_VMpJ2P.mjs} +34 -35
- package/dist/{apply-kUDt80-G.mjs.map → apply-B_VMpJ2P.mjs.map} +1 -1
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.mjs +26 -15
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +10 -7
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/media-usage-write-fence.mjs +2 -2
- package/dist/astro/middleware/redirect.mjs +4 -4
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +11 -12
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +168 -1305
- 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.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -9
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -9
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -9
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +15 -15
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +15 -15
- package/dist/astro/routes/api/admin/bylines/index.mjs +15 -15
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +12 -12
- package/dist/astro/routes/api/admin/comments/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/comments/bulk.mjs +9 -9
- package/dist/astro/routes/api/admin/comments/counts.mjs +4 -4
- package/dist/astro/routes/api/admin/comments/index.mjs +9 -9
- 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/media-usage/activation.d.mts +9 -0
- package/dist/astro/routes/api/admin/media-usage/activation.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +46 -0
- package/dist/astro/routes/api/admin/media-usage/activation.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +14 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +14 -13
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/progress.d.mts +9 -0
- package/dist/astro/routes/api/admin/media-usage/progress.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +44 -0
- package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +16 -11
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +14 -13
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +14 -13
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -1
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +3 -3
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +3 -3
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +54 -48
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +54 -48
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +53 -47
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +53 -47
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +52 -46
- 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 +53 -47
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +53 -47
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +54 -48
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +172 -133
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +54 -48
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +52 -46
- 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 +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +52 -46
- 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 +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +7 -7
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
- 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 +11 -11
- package/dist/astro/routes/api/auth/invite/index.mjs +8 -8
- package/dist/astro/routes/api/auth/invite/register-options.mjs +10 -10
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +10 -10
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/me.mjs +19 -9
- package/dist/astro/routes/api/auth/me.mjs.map +1 -1
- package/dist/astro/routes/api/auth/mode.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
- 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 +12 -12
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -11
- package/dist/astro/routes/api/auth/signup/complete.mjs +11 -11
- package/dist/astro/routes/api/auth/signup/request.mjs +10 -10
- 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.mjs +3 -3
- 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 +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +16 -14
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +16 -14
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +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.mjs +3 -3
- 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 +16 -16
- 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 +12 -12
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +11 -11
- 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 +12 -10
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +26 -26
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/mcp.mjs +42 -42
- package/dist/astro/routes/api/media/_id_/confirm.mjs +11 -11
- package/dist/astro/routes/api/media/_id_/upload.mjs +6 -6
- package/dist/astro/routes/api/media/_id_/usage.mjs +18 -13
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +21 -13
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
- package/dist/astro/routes/api/media/folders/_id_.d.mts +10 -0
- package/dist/astro/routes/api/media/folders/_id_.d.mts.map +1 -0
- package/dist/astro/routes/api/media/folders/_id_.mjs +52 -0
- package/dist/astro/routes/api/media/folders/_id_.mjs.map +1 -0
- package/dist/astro/routes/api/media/folders/index.d.mts +9 -0
- package/dist/astro/routes/api/media/folders/index.d.mts.map +1 -0
- package/dist/astro/routes/api/media/folders/index.mjs +41 -0
- package/dist/astro/routes/api/media/folders/index.mjs.map +1 -0
- 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 +9 -9
- package/dist/astro/routes/api/media.d.mts.map +1 -1
- package/dist/astro/routes/api/media.mjs +28 -19
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +8 -8
- package/dist/astro/routes/api/menus/_name_/items.mjs +8 -8
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +8 -8
- package/dist/astro/routes/api/menus/_name_/translations.mjs +8 -8
- package/dist/astro/routes/api/menus/_name_.mjs +8 -8
- package/dist/astro/routes/api/menus/index.mjs +8 -8
- 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 +153 -6
- 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 +10 -10
- package/dist/astro/routes/api/redirects/404s/summary.mjs +10 -10
- package/dist/astro/routes/api/redirects/_id_.mjs +11 -11
- package/dist/astro/routes/api/redirects/index.mjs +11 -11
- package/dist/astro/routes/api/relations/_id_/index.mjs +16 -14
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +11 -9
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +16 -14
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- 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 +52 -46
- 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 +52 -46
- 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 +52 -46
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +52 -46
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +10 -8
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +52 -46
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +52 -46
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- 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 +6 -6
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +5 -5
- package/dist/astro/routes/api/settings/backups/export.mjs +6 -6
- package/dist/astro/routes/api/settings/backups/index.mjs +7 -7
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings.mjs +13 -13
- package/dist/astro/routes/api/setup/admin-verify.mjs +12 -12
- package/dist/astro/routes/api/setup/admin.mjs +11 -11
- package/dist/astro/routes/api/setup/dev-bypass.d.mts.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +34 -27
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +31 -29
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +7 -7
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/_name_.mjs +13 -13
- package/dist/astro/routes/api/taxonomies/index.mjs +13 -13
- package/dist/astro/routes/api/themes/preview.mjs +5 -5
- package/dist/astro/routes/api/typegen.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +2 -2
- 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 +7 -7
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +10 -10
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +10 -10
- package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
- package/dist/astro/routes/api/widget-areas/index.mjs +10 -10
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +6 -6
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
- package/dist/astro/routes/sitemap.xml.mjs +7 -7
- package/dist/astro/types.d.mts +19 -14
- 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-DUElxgOQ.mjs → authorize-ByYs-Uxs.mjs} +2 -2
- package/dist/{authorize-DUElxgOQ.mjs.map → authorize-ByYs-Uxs.mjs.map} +1 -1
- package/dist/{backup-DWYpJlLj.mjs → backup-ChyHfIoX.mjs} +5 -5
- package/dist/{backup-DWYpJlLj.mjs.map → backup-ChyHfIoX.mjs.map} +1 -1
- package/dist/{bundle-vn56sLos.mjs → bundle-DZFhFurR.mjs} +4 -4
- package/dist/{bundle-vn56sLos.mjs.map → bundle-DZFhFurR.mjs.map} +1 -1
- package/dist/{byline-yjvWq4ip.mjs → byline-Cpnwrje1.mjs} +6 -6
- package/dist/{byline-yjvWq4ip.mjs.map → byline-Cpnwrje1.mjs.map} +1 -1
- package/dist/{byline-fields-txaLGoME.mjs → byline-fields-CAyA_Umd.mjs} +2 -2
- package/dist/{byline-fields-txaLGoME.mjs.map → byline-fields-CAyA_Umd.mjs.map} +1 -1
- package/dist/{byline-registry-DDun8sxh.mjs → byline-registry-Bpu9-MVs.mjs} +2 -2
- package/dist/{byline-registry-DDun8sxh.mjs.map → byline-registry-Bpu9-MVs.mjs.map} +1 -1
- package/dist/{bylines-DjXS5p0P.mjs → bylines-BSo9B9RX.mjs} +7 -7
- package/dist/{bylines-DjXS5p0P.mjs.map → bylines-BSo9B9RX.mjs.map} +1 -1
- package/dist/{bylines-Bu7pchQ4.mjs → bylines-CHjvehVX.mjs} +3 -3
- package/dist/{bylines-Bu7pchQ4.mjs.map → bylines-CHjvehVX.mjs.map} +1 -1
- package/dist/{cache-C46-3Irl.mjs → cache-5VirJ2Cn.mjs} +4 -4
- package/dist/{cache-C46-3Irl.mjs.map → cache-5VirJ2Cn.mjs.map} +1 -1
- package/dist/capture-triggers-CNW1q3HK.mjs +362 -0
- package/dist/capture-triggers-CNW1q3HK.mjs.map +1 -0
- package/dist/{challenge-store-SIL5DsF2.mjs → challenge-store-D5pSY2S1.mjs} +1 -1
- package/dist/{challenge-store-SIL5DsF2.mjs.map → challenge-store-D5pSY2S1.mjs.map} +1 -1
- package/dist/{chunks-fiZ8G9RJ.mjs → chunks-bNiX6_DR.mjs} +2 -2
- package/dist/{chunks-fiZ8G9RJ.mjs.map → chunks-bNiX6_DR.mjs.map} +1 -1
- package/dist/cli/index.mjs +36 -52
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +74 -4
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +54 -2
- package/dist/client/index.mjs.map +1 -1
- package/dist/{collection-deletion-DQPvMD8R.mjs → collection-deletion-m_oi2c0N.mjs} +13 -356
- package/dist/collection-deletion-m_oi2c0N.mjs.map +1 -0
- package/dist/{comment-Dxlep6cE.mjs → comment-DhvLEdhQ.mjs} +1 -1
- package/dist/{comment-Dxlep6cE.mjs.map → comment-DhvLEdhQ.mjs.map} +1 -1
- package/dist/{comment-reaction-D-2J84UE.mjs → comment-reaction-CRuItEjt.mjs} +2 -2
- package/dist/{comment-reaction-D-2J84UE.mjs.map → comment-reaction-CRuItEjt.mjs.map} +1 -1
- package/dist/{comments-CTfZtLmM.mjs → comments-CLj4bi8I.mjs} +2 -2
- package/dist/{comments-CTfZtLmM.mjs.map → comments-CLj4bi8I.mjs.map} +1 -1
- package/dist/{components-CQy3lh9x.mjs → components-v4U4DT2y.mjs} +1 -1
- package/dist/{components-CQy3lh9x.mjs.map → components-v4U4DT2y.mjs.map} +1 -1
- package/dist/{config-COQzTe5Q.d.mts → config-DrfghTPe.d.mts} +1 -1
- package/dist/{config-COQzTe5Q.d.mts.map → config-DrfghTPe.d.mts.map} +1 -1
- package/dist/{content-ZHCc1ngN.mjs → content-CP-SeXNa.mjs} +5 -4
- package/dist/content-CP-SeXNa.mjs.map +1 -0
- package/dist/{content-list-query-wJ2WN8Vp.d.mts → content-list-query-BhejKVqb.d.mts} +1 -1
- package/dist/{content-list-query-wJ2WN8Vp.d.mts.map → content-list-query-BhejKVqb.d.mts.map} +1 -1
- package/dist/{content-refresh-B_8SJzuU.mjs → content-refresh-DLOfIhYc.mjs} +1094 -93
- package/dist/content-refresh-DLOfIhYc.mjs.map +1 -0
- package/dist/{media-usage-BZCydfvu.mjs → content-repair-BCxzy0r4.mjs} +5 -196
- package/dist/content-repair-BCxzy0r4.mjs.map +1 -0
- package/dist/{context-ZldbZcle.mjs → context-BR5hRWiK.mjs} +13 -13
- package/dist/{context-ZldbZcle.mjs.map → context-BR5hRWiK.mjs.map} +1 -1
- package/dist/{cron-Y9aLtgrA.mjs → cron-CWfWrWKG.mjs} +1 -1
- package/dist/{cron-Y9aLtgrA.mjs.map → cron-CWfWrWKG.mjs.map} +1 -1
- package/dist/{dashboard-DvHbk_cv.mjs → dashboard-CkIV2rnQ.mjs} +5 -5
- package/dist/{dashboard-DvHbk_cv.mjs.map → dashboard-CkIV2rnQ.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +3 -3
- 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/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 +3 -3
- package/dist/db/sqlite.mjs.map +1 -1
- package/dist/{default-DdDl3fxv.mjs → default-YMEfcQUx.mjs} +1 -1
- package/dist/{default-DdDl3fxv.mjs.map → default-YMEfcQUx.mjs.map} +1 -1
- package/dist/{deferred-tasks-SDWxrgzJ.d.mts → deferred-tasks-DfqxH5Xf.d.mts} +1 -1
- package/dist/{deferred-tasks-SDWxrgzJ.d.mts.map → deferred-tasks-DfqxH5Xf.d.mts.map} +1 -1
- package/dist/{device-flow-C0GdD_z8.mjs → device-flow-CojjSBwb.mjs} +5 -5
- package/dist/{device-flow-C0GdD_z8.mjs.map → device-flow-CojjSBwb.mjs.map} +1 -1
- package/dist/{direct-executor-CDXeJCSs.mjs → direct-executor-BWeWiRYB.mjs} +3 -3
- package/dist/{direct-executor-CDXeJCSs.mjs.map → direct-executor-BWeWiRYB.mjs.map} +1 -1
- package/dist/{dist-D_6CKR8z.mjs → dist-89xCrGqi.mjs} +1 -1
- package/dist/{dist-D_6CKR8z.mjs.map → dist-89xCrGqi.mjs.map} +1 -1
- package/dist/{email-console-BHNjIwiB.mjs → email-console-CEJgR_LB.mjs} +1 -1
- package/dist/{email-console-BHNjIwiB.mjs.map → email-console-CEJgR_LB.mjs.map} +1 -1
- package/dist/{enrich-_ySMEvEE.mjs → enrich-BX0IDp4z.mjs} +3 -3
- package/dist/{enrich-_ySMEvEE.mjs.map → enrich-BX0IDp4z.mjs.map} +1 -1
- package/dist/{error-DupyJZE2.mjs → error-D9w94fjV.mjs} +2 -2
- package/dist/{error-DupyJZE2.mjs.map → error-D9w94fjV.mjs.map} +1 -1
- package/dist/{errors-CLUPm7aD.mjs → errors-n2j49uNf.mjs} +22 -2
- package/dist/errors-n2j49uNf.mjs.map +1 -0
- package/dist/{escape-DUY2r2Zs.mjs → escape-DN4Qmjsl.mjs} +1 -1
- package/dist/{escape-DUY2r2Zs.mjs.map → escape-DN4Qmjsl.mjs.map} +1 -1
- package/dist/{field-defs-cache-BzwBlJrR.mjs → field-defs-cache-Bh4q6oar.mjs} +5 -5
- package/dist/{field-defs-cache-BzwBlJrR.mjs.map → field-defs-cache-Bh4q6oar.mjs.map} +1 -1
- package/dist/focal-point-BeWFo6Xx.mjs +23 -0
- package/dist/focal-point-BeWFo6Xx.mjs.map +1 -0
- package/dist/{fts-manager-DyZEohZC.mjs → fts-manager-BhOdW0bi.mjs} +3 -3
- package/dist/{fts-manager-DyZEohZC.mjs.map → fts-manager-BhOdW0bi.mjs.map} +1 -1
- package/dist/{hash-Cg0TXJPV.mjs → hash-CTcngWvj.mjs} +1 -1
- package/dist/{hash-Cg0TXJPV.mjs.map → hash-CTcngWvj.mjs.map} +1 -1
- package/dist/{hreflang-DwT2E0Sa.d.mts → hreflang-7pTHsLZJ.d.mts} +2 -2
- package/dist/{hreflang-DwT2E0Sa.d.mts.map → hreflang-7pTHsLZJ.d.mts.map} +1 -1
- package/dist/{hreflang-BBe83kKa.mjs → hreflang-Huc6O5wa.mjs} +7 -7
- package/dist/{hreflang-BBe83kKa.mjs.map → hreflang-Huc6O5wa.mjs.map} +1 -1
- package/dist/{identity-Ys6Dlc9C.mjs → identity-DXmb4aVp.mjs} +3 -3
- package/dist/{identity-Ys6Dlc9C.mjs.map → identity-DXmb4aVp.mjs.map} +1 -1
- package/dist/{import-DPkLmeXO.mjs → import-C4_O3KXU.mjs} +5 -5
- package/dist/{import-DPkLmeXO.mjs.map → import-C4_O3KXU.mjs.map} +1 -1
- package/dist/{index-C9KuQyO-.d.mts → index-6bRee8zb.d.mts} +3 -3
- package/dist/{index-C9KuQyO-.d.mts.map → index-6bRee8zb.d.mts.map} +1 -1
- package/dist/{index-BVBZj4-7.d.mts → index-DWbJrsAg.d.mts} +128 -52
- package/dist/index-DWbJrsAg.d.mts.map +1 -0
- package/dist/index.d.mts +21 -21
- package/dist/index.mjs +78 -72
- package/dist/{init-lock-6b309ZrF.mjs → init-lock-DJkX6Hto.mjs} +1 -1
- package/dist/{init-lock-6b309ZrF.mjs.map → init-lock-DJkX6Hto.mjs.map} +1 -1
- package/dist/{load-YJ2xl3ra.mjs → load-Bo7fZAbg.mjs} +2 -2
- package/dist/{load-YJ2xl3ra.mjs.map → load-Bo7fZAbg.mjs.map} +1 -1
- package/dist/{loader-CdG_Ci3H.mjs → loader-ZsjE4paL.mjs} +2 -2
- package/dist/{loader-CdG_Ci3H.mjs.map → loader-ZsjE4paL.mjs.map} +1 -1
- package/dist/{manifest-builder-B252yQUf.mjs → manifest-builder-QXuqvVMP.mjs} +2 -2
- package/dist/{manifest-builder-B252yQUf.mjs.map → manifest-builder-QXuqvVMP.mjs.map} +1 -1
- package/dist/{manifest-schema-BXbUAHod.mjs → manifest-schema-CUYPfCEH.mjs} +1 -1
- package/dist/{manifest-schema-BXbUAHod.mjs.map → manifest-schema-CUYPfCEH.mjs.map} +1 -1
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +13 -3
- package/dist/media/index.mjs.map +1 -1
- package/dist/media/local-runtime.d.mts +14 -12
- package/dist/media/local-runtime.d.mts.map +1 -1
- package/dist/media/local-runtime.mjs +11 -5
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/{media-BWWWb8kg.mjs → media-BjwNuLEu.mjs} +100 -6
- package/dist/media-BjwNuLEu.mjs.map +1 -0
- package/dist/{media-CzhAn2--.mjs → media-D6SeAfBl.mjs} +41 -12
- package/dist/media-D6SeAfBl.mjs.map +1 -0
- package/dist/{media-allowlist-D6x-Us02.mjs → media-allowlist-D35v7bmL.mjs} +3 -2
- package/dist/media-allowlist-D35v7bmL.mjs.map +1 -0
- package/dist/media-folders-D-0CmRZj.mjs +210 -0
- package/dist/media-folders-D-0CmRZj.mjs.map +1 -0
- package/dist/{media-upload-CHBVn6m-.mjs → media-upload-C7bLXGcI.mjs} +9 -9
- package/dist/{media-upload-CHBVn6m-.mjs.map → media-upload-C7bLXGcI.mjs.map} +1 -1
- package/dist/{media-url-BvoX88FA.mjs → media-url-DH7giMx_.mjs} +1 -1
- package/dist/{media-url-BvoX88FA.mjs.map → media-url-DH7giMx_.mjs.map} +1 -1
- package/dist/media-usage-BTRJvS6V.mjs +1833 -0
- package/dist/media-usage-BTRJvS6V.mjs.map +1 -0
- package/dist/media-usage-activation-Dx0kPV6b.mjs +78 -0
- package/dist/media-usage-activation-Dx0kPV6b.mjs.map +1 -0
- package/dist/{media-usage-work-DrCbqBcl.mjs → media-usage-work-C-fhM30c.mjs} +221 -59
- package/dist/media-usage-work-C-fhM30c.mjs.map +1 -0
- package/dist/{media-usage-work-CLo_6tct.mjs → media-usage-work-DWb2XPMI.mjs} +4 -4
- package/dist/{media-usage-work-CLo_6tct.mjs.map → media-usage-work-DWb2XPMI.mjs.map} +1 -1
- package/dist/{media-usage-write-fence-aHEgN1zB.mjs → media-usage-write-fence-BwoJVRDC.mjs} +2 -2
- package/dist/{media-usage-write-fence-aHEgN1zB.mjs.map → media-usage-write-fence-BwoJVRDC.mjs.map} +1 -1
- package/dist/{menus-TCNSd2vp.mjs → menus-CD7EFLwz.mjs} +3 -3
- package/dist/{menus-TCNSd2vp.mjs.map → menus-CD7EFLwz.mjs.map} +1 -1
- package/dist/{menus-DSo5QeW0.mjs → menus-CNg0QlDt.mjs} +42 -26
- package/dist/menus-CNg0QlDt.mjs.map +1 -0
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/{mime-DfIVjNkr.mjs → mime-CUIG6x84.mjs} +1 -1
- package/dist/mime-CUIG6x84.mjs.map +1 -0
- package/dist/{mode-BDoH_WcF.mjs → mode-DaUM_MB2.mjs} +1 -1
- package/dist/{mode-BDoH_WcF.mjs.map → mode-DaUM_MB2.mjs.map} +1 -1
- package/dist/node-sqlite-compat-Udb4Y-rs.mjs +46 -0
- package/dist/node-sqlite-compat-Udb4Y-rs.mjs.map +1 -0
- package/dist/{normalize-Bc-s_r-a.mjs → normalize-CSxdKBVa.mjs} +22 -1
- package/dist/normalize-CSxdKBVa.mjs.map +1 -0
- package/dist/{oauth-authorization-iOikmrJd.mjs → oauth-authorization-Dpsb-fMJ.mjs} +5 -5
- package/dist/{oauth-authorization-iOikmrJd.mjs.map → oauth-authorization-Dpsb-fMJ.mjs.map} +1 -1
- package/dist/{oauth-clients-CvI0nHMJ.mjs → oauth-clients-Bxnoe_67.mjs} +1 -1
- package/dist/{oauth-clients-CvI0nHMJ.mjs.map → oauth-clients-Bxnoe_67.mjs.map} +1 -1
- package/dist/{oauth-state-store-Ba8KZlwW.mjs → oauth-state-store-0C4s0K6w.mjs} +1 -1
- package/dist/{oauth-state-store-Ba8KZlwW.mjs.map → oauth-state-store-0C4s0K6w.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-C5SQwGYC.mjs → oauth-user-lookup-wlGYSeqX.mjs} +1 -1
- package/dist/{oauth-user-lookup-C5SQwGYC.mjs.map → oauth-user-lookup-wlGYSeqX.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{options-CBXIHUoT.mjs → options-BHPeIbBd.mjs} +1 -1
- package/dist/{options-CBXIHUoT.mjs.map → options-BHPeIbBd.mjs.map} +1 -1
- package/dist/{options--hhz-jZ1.d.mts → options-BhZIeFY1.d.mts} +3 -3
- package/dist/{options--hhz-jZ1.d.mts.map → options-BhZIeFY1.d.mts.map} +1 -1
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-DFbuc-Fh.mjs → parse-BRJg1kz8.mjs} +2 -2
- package/dist/{parse-DFbuc-Fh.mjs.map → parse-BRJg1kz8.mjs.map} +1 -1
- package/dist/{passkey-config-DFAmUyuE.mjs → passkey-config-B3P0nHRR.mjs} +1 -1
- package/dist/{passkey-config-DFAmUyuE.mjs.map → passkey-config-B3P0nHRR.mjs.map} +1 -1
- package/dist/{patterns-CiyXeDgr.mjs → patterns-D9iDO3j8.mjs} +1 -1
- package/dist/{patterns-CiyXeDgr.mjs.map → patterns-D9iDO3j8.mjs.map} +1 -1
- package/dist/{placeholder-Dp0K3RkD.d.mts → placeholder-BR4ZhVJl.d.mts} +7 -1
- package/dist/placeholder-BR4ZhVJl.d.mts.map +1 -0
- package/dist/plugin-types.d.mts +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-TluUIxuu.mjs → policy-BVRganJQ.mjs} +2 -2
- package/dist/{policy-TluUIxuu.mjs.map → policy-BVRganJQ.mjs.map} +1 -1
- package/dist/{portable-text-imBW5cHK.mjs → portable-text-C8Tvp4_g.mjs} +1 -1
- package/dist/{portable-text-imBW5cHK.mjs.map → portable-text-C8Tvp4_g.mjs.map} +1 -1
- package/dist/{preview-PW-nOnq4.mjs → preview-dn2dUyM0.mjs} +2 -2
- package/dist/{preview-PW-nOnq4.mjs.map → preview-dn2dUyM0.mjs.map} +1 -1
- package/dist/{protocol-DjsJHTlK.d.mts → protocol-CuBEsqgE.d.mts} +2 -2
- package/dist/{protocol-DjsJHTlK.d.mts.map → protocol-CuBEsqgE.d.mts.map} +1 -1
- package/dist/{public-url-CWoFhQT8.mjs → public-url-DRz_AinV.mjs} +1 -1
- package/dist/{public-url-CWoFhQT8.mjs.map → public-url-DRz_AinV.mjs.map} +1 -1
- package/dist/{query-zTVAR1Sl.mjs → query-D18vTdha.mjs} +14 -14
- package/dist/{query-zTVAR1Sl.mjs.map → query-D18vTdha.mjs.map} +1 -1
- package/dist/{query-BWs7O5Il.mjs → query-tZDEdtCN.mjs} +4 -4
- package/dist/{query-BWs7O5Il.mjs.map → query-tZDEdtCN.mjs.map} +1 -1
- package/dist/{rate-limit-Bx4g9m3p.mjs → rate-limit-on7KPo-v.mjs} +2 -2
- package/dist/{rate-limit-Bx4g9m3p.mjs.map → rate-limit-on7KPo-v.mjs.map} +1 -1
- package/dist/{redirect-COsS6SWJ.mjs → redirect-CZkbozu9.mjs} +2 -2
- package/dist/{redirect-COsS6SWJ.mjs.map → redirect-CZkbozu9.mjs.map} +1 -1
- package/dist/{redirect-BgAOGHDq.mjs → redirect-DrbEmU9a.mjs} +1 -1
- package/dist/{redirect-BgAOGHDq.mjs.map → redirect-DrbEmU9a.mjs.map} +1 -1
- package/dist/{redirects-DyChwDkG.mjs → redirects-BahWiu8Z.mjs} +5 -5
- package/dist/{redirects-DyChwDkG.mjs.map → redirects-BahWiu8Z.mjs.map} +1 -1
- package/dist/{redirects-DTDHWH31.mjs → redirects-CRIM55KH.mjs} +6 -6
- package/dist/{redirects-DTDHWH31.mjs.map → redirects-CRIM55KH.mjs.map} +1 -1
- package/dist/{api-BeBglVxU.mjs → registry-BiO5WwPq.mjs} +483 -2462
- package/dist/registry-BiO5WwPq.mjs.map +1 -0
- package/dist/{registry-Cqa2I749.mjs → registry-Cx-jEJOS.mjs} +9 -123
- package/dist/registry-Cx-jEJOS.mjs.map +1 -0
- package/dist/{relation-BnHB0T4J.mjs → relation-A6wLF_DS.mjs} +2 -2
- package/dist/{relation-BnHB0T4J.mjs.map → relation-A6wLF_DS.mjs.map} +1 -1
- package/dist/{relations-BBApI4e2.mjs → relations-BTPM2saV.mjs} +2 -2
- package/dist/{relations-BBApI4e2.mjs.map → relations-BTPM2saV.mjs.map} +1 -1
- package/dist/{relations-BHo5A8Zf.d.mts → relations-C7B46bcU.d.mts} +192 -33
- package/dist/relations-C7B46bcU.d.mts.map +1 -0
- package/dist/{relations-D5sM5fW0.mjs → relations-Cj5hZ6Zg.mjs} +4 -4
- package/dist/{relations-D5sM5fW0.mjs.map → relations-Cj5hZ6Zg.mjs.map} +1 -1
- package/dist/{request-cache-BSUptuJR.mjs → request-cache-DH9zdCOD.mjs} +1 -1
- package/dist/{request-cache-BSUptuJR.mjs.map → request-cache-DH9zdCOD.mjs.map} +1 -1
- package/dist/request-context.d.mts +1 -1
- package/dist/{request-meta-DgZJh3zG.mjs → request-meta-DRp5ENd_.mjs} +2 -2
- package/dist/{request-meta-DgZJh3zG.mjs.map → request-meta-DRp5ENd_.mjs.map} +1 -1
- package/dist/{resolve-DOhVEvty.mjs → resolve-DxUpTMmE.mjs} +1 -1
- package/dist/{resolve-DOhVEvty.mjs.map → resolve-DxUpTMmE.mjs.map} +1 -1
- package/dist/{runner-C1T11CfC.mjs → runner-77GOZCnH.mjs} +410 -286
- package/dist/runner-77GOZCnH.mjs.map +1 -0
- package/dist/{runner-BYHZn3Jy.d.mts → runner-zgqA_CqP.d.mts} +2 -2
- package/dist/{runner-BYHZn3Jy.d.mts.map → runner-zgqA_CqP.d.mts.map} +1 -1
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +1 -1
- package/dist/{schema-DZ5YVVZj.mjs → schema-BY-oVntF.mjs} +3 -3
- package/dist/{schema-DZ5YVVZj.mjs.map → schema-BY-oVntF.mjs.map} +1 -1
- package/dist/{schema-2AOsSn2v.mjs → schema-Cw9kVK0I.mjs} +35 -5
- package/dist/{schema-2AOsSn2v.mjs.map → schema-Cw9kVK0I.mjs.map} +1 -1
- package/dist/{scopes-8ClPF2bC.mjs → scopes-vMR1uIbt.mjs} +3 -3
- package/dist/{scopes-8ClPF2bC.mjs.map → scopes-vMR1uIbt.mjs.map} +1 -1
- package/dist/{search-u1QYdOCG.mjs → search-CfT3KxO5.mjs} +4 -4
- package/dist/{search-u1QYdOCG.mjs.map → search-CfT3KxO5.mjs.map} +1 -1
- package/dist/{secrets-BEgsAQEU.mjs → secrets-BH2Qow1-.mjs} +3 -3
- package/dist/{secrets-BEgsAQEU.mjs.map → secrets-BH2Qow1-.mjs.map} +1 -1
- package/dist/{sections-DmHviGyM.mjs → sections-DTfjyf1z.mjs} +2 -2
- package/dist/{sections-DmHviGyM.mjs.map → sections-DTfjyf1z.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +24 -22
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +16 -14
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-AFpVvTqr.mjs → seo-BSiTIXzd.mjs} +1 -1
- package/dist/{seo-AFpVvTqr.mjs.map → seo-BSiTIXzd.mjs.map} +1 -1
- package/dist/{seo-Dq4G-RrO.mjs → seo-Cm-dtvgk.mjs} +2 -2
- package/dist/{seo-Dq4G-RrO.mjs.map → seo-Cm-dtvgk.mjs.map} +1 -1
- package/dist/{service-BpArayPr.mjs → service-DYsDHEKe.mjs} +3 -3
- package/dist/{service-BpArayPr.mjs.map → service-DYsDHEKe.mjs.map} +1 -1
- package/dist/{session-user-BEorKVT-.mjs → session-user-CNAfvsdw.mjs} +1 -1
- package/dist/{session-user-BEorKVT-.mjs.map → session-user-CNAfvsdw.mjs.map} +1 -1
- package/dist/{settings-xRdoUZr0.mjs → settings-BgN-0DT-.mjs} +6 -6
- package/dist/{settings-xRdoUZr0.mjs.map → settings-BgN-0DT-.mjs.map} +1 -1
- package/dist/{settings-DE9xtzqd.mjs → settings-DjtkUo__.mjs} +3 -3
- package/dist/{settings-DE9xtzqd.mjs.map → settings-DjtkUo__.mjs.map} +1 -1
- package/dist/{setup-complete-BnT8pq_C.mjs → setup-complete-CcpXaPU7.mjs} +2 -2
- package/dist/{setup-complete-BnT8pq_C.mjs.map → setup-complete-CcpXaPU7.mjs.map} +1 -1
- package/dist/{setup-nonce-CBitf_oQ.mjs → setup-nonce-Reyw30jg.mjs} +1 -1
- package/dist/{setup-nonce-CBitf_oQ.mjs.map → setup-nonce-Reyw30jg.mjs.map} +1 -1
- package/dist/{single-flight-cache-B0eLKS6K.mjs → single-flight-cache-BPuGPdcN.mjs} +2 -2
- package/dist/{single-flight-cache-B0eLKS6K.mjs.map → single-flight-cache-BPuGPdcN.mjs.map} +1 -1
- package/dist/{site-url-DjpIXMXJ.mjs → site-url-Cs_V9n3V.mjs} +3 -3
- package/dist/{site-url-DjpIXMXJ.mjs.map → site-url-Cs_V9n3V.mjs.map} +1 -1
- package/dist/{snapshot-BBlGkb2q.mjs → snapshot-DSB8P7Lm.mjs} +1 -1
- package/dist/{snapshot-BBlGkb2q.mjs.map → snapshot-DSB8P7Lm.mjs.map} +1 -1
- package/dist/{ssrf-Cpvg_n3A.mjs → ssrf-DqebVE34.mjs} +21 -5
- package/dist/{ssrf-Cpvg_n3A.mjs.map → ssrf-DqebVE34.mjs.map} +1 -1
- package/dist/{state-DYwPue40.mjs → state-BJfU9Uzw.mjs} +12 -4
- package/dist/state-BJfU9Uzw.mjs.map +1 -0
- package/dist/{status-CWVYpbD8.mjs → status-DDu8HIQl.mjs} +1 -1
- package/dist/{status-CWVYpbD8.mjs.map → status-DDu8HIQl.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{target-DixqqV5i.mjs → target-D0o26Azo.mjs} +1 -1
- package/dist/{target-DixqqV5i.mjs.map → target-D0o26Azo.mjs.map} +1 -1
- package/dist/{taxonomies-OHUIiIpI.mjs → taxonomies-CPGxo-bn.mjs} +5 -5
- package/dist/{taxonomies-OHUIiIpI.mjs.map → taxonomies-CPGxo-bn.mjs.map} +1 -1
- package/dist/{taxonomies-BlrncHi9.mjs → taxonomies-kmyudNGP.mjs} +7 -7
- package/dist/{taxonomies-BlrncHi9.mjs.map → taxonomies-kmyudNGP.mjs.map} +1 -1
- package/dist/{taxonomy-BqCZ1TdU.mjs → taxonomy-8X09dLN5.mjs} +4 -4
- package/dist/{taxonomy-BqCZ1TdU.mjs.map → taxonomy-8X09dLN5.mjs.map} +1 -1
- package/dist/{tokens-C39klX8R.mjs → tokens-gTS-IVUp.mjs} +1 -1
- package/dist/{tokens-C39klX8R.mjs.map → tokens-gTS-IVUp.mjs.map} +1 -1
- package/dist/{transaction-NQj4VJ7Z.mjs → transaction-0KOpOyMu.mjs} +2 -1
- package/dist/{transaction-NQj4VJ7Z.mjs.map → transaction-0KOpOyMu.mjs.map} +1 -1
- package/dist/{transport-RQE36APG.d.mts → transport-_6R1ub7t.d.mts} +1 -1
- package/dist/{transport-RQE36APG.d.mts.map → transport-_6R1ub7t.d.mts.map} +1 -1
- package/dist/{transport-DBJwa-Si.mjs → transport-fX59xaJz.mjs} +4 -3
- package/dist/{transport-DBJwa-Si.mjs.map → transport-fX59xaJz.mjs.map} +1 -1
- package/dist/{trusted-proxy-CEVekpby.mjs → trusted-proxy-fe6nEgR4.mjs} +1 -1
- package/dist/{trusted-proxy-CEVekpby.mjs.map → trusted-proxy-fe6nEgR4.mjs.map} +1 -1
- package/dist/types-75KIqzL9.mjs.map +1 -1
- package/dist/{types-BW1syrlw.mjs → types-BXUmsINL.mjs} +1 -1
- package/dist/{types-BW1syrlw.mjs.map → types-BXUmsINL.mjs.map} +1 -1
- package/dist/{types-BntycPTF.d.mts → types-Blb-MRC3.d.mts} +1 -1
- package/dist/{types-BntycPTF.d.mts.map → types-Blb-MRC3.d.mts.map} +1 -1
- package/dist/{types-C2pMvO62.d.mts → types-Br-ERaxh.d.mts} +2 -1
- package/dist/types-Br-ERaxh.d.mts.map +1 -0
- package/dist/{types-DWRhk9xZ.d.mts → types-BzBd3PeX.d.mts} +1 -1
- package/dist/{types-DWRhk9xZ.d.mts.map → types-BzBd3PeX.d.mts.map} +1 -1
- package/dist/{types-CXnOzDe1.d.mts → types-CLqvnd05.d.mts} +1 -1
- package/dist/{types-CXnOzDe1.d.mts.map → types-CLqvnd05.d.mts.map} +1 -1
- package/dist/{types-Dfk8KI5R.d.mts → types-D5VVLr7J.d.mts} +1 -1
- package/dist/{types-Dfk8KI5R.d.mts.map → types-D5VVLr7J.d.mts.map} +1 -1
- package/dist/{types-DQIDRKF2.d.mts → types-DHxzBjbD.d.mts} +10 -1
- package/dist/types-DHxzBjbD.d.mts.map +1 -0
- package/dist/{types-DN64_zzZ.d.mts → types-DJQxln7q.d.mts} +3 -3
- package/dist/{types-DN64_zzZ.d.mts.map → types-DJQxln7q.d.mts.map} +1 -1
- package/dist/{types-CtzytVXn.mjs → types-DM3vioBY.mjs} +1 -1
- package/dist/{types-CtzytVXn.mjs.map → types-DM3vioBY.mjs.map} +1 -1
- package/dist/{types-BcqdcT-r.d.mts → types-D_DWe7k9.d.mts} +1 -1
- package/dist/{types-BcqdcT-r.d.mts.map → types-D_DWe7k9.d.mts.map} +1 -1
- package/dist/{types-DrJrVCT1.d.mts → types-Vg6f5i3s.d.mts} +3 -3
- package/dist/{types-DrJrVCT1.d.mts.map → types-Vg6f5i3s.d.mts.map} +1 -1
- package/dist/{upload-attempts-D4FS8LT6.mjs → upload-attempts-CNyGSepg.mjs} +1 -1
- package/dist/{upload-attempts-D4FS8LT6.mjs.map → upload-attempts-CNyGSepg.mjs.map} +1 -1
- package/dist/{url-pattern-BHS0V5Ng.mjs → url-pattern-K-KdXcSe.mjs} +1 -1
- package/dist/{url-pattern-BHS0V5Ng.mjs.map → url-pattern-K-KdXcSe.mjs.map} +1 -1
- package/dist/{user-DJZfUJVE.mjs → user-CtYY0tp2.mjs} +2 -2
- package/dist/{user-DJZfUJVE.mjs.map → user-CtYY0tp2.mjs.map} +1 -1
- package/dist/{utils-D4vD_Y98.mjs → utils-HztC73hq.mjs} +1 -1
- package/dist/{utils-D4vD_Y98.mjs.map → utils-HztC73hq.mjs.map} +1 -1
- package/dist/{validate-BMLBvxOC.mjs → validate-Dd-IUjnZ.mjs} +2 -2
- package/dist/{validate-BMLBvxOC.mjs.map → validate-Dd-IUjnZ.mjs.map} +1 -1
- package/dist/{validate-CTqt5nuE.d.mts → validate-DlqdOZXB.d.mts} +5 -5
- package/dist/{validate-CTqt5nuE.d.mts.map → validate-DlqdOZXB.d.mts.map} +1 -1
- package/dist/{validation-npvENUCB.mjs → validation-D83n7Npi.mjs} +10 -8
- package/dist/{validation-npvENUCB.mjs.map → validation-D83n7Npi.mjs.map} +1 -1
- package/dist/version-ri-sCyAp.mjs +7 -0
- package/dist/{version-DB_fqCSI.mjs.map → version-ri-sCyAp.mjs.map} +1 -1
- package/dist/{widgets-BD3ho7Rq.mjs → widgets-CpmZd9Q-.mjs} +4 -4
- package/dist/{widgets-BD3ho7Rq.mjs.map → widgets-CpmZd9Q-.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-Ca68766D.d.mts → wxr-taxonomies-BFd0y72_.d.mts} +1 -1
- package/dist/{wxr-taxonomies-Ca68766D.d.mts.map → wxr-taxonomies-BFd0y72_.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-B1R3vBoD.mjs → wxr-taxonomies-Df4vxWcU.mjs} +4 -4
- package/dist/{wxr-taxonomies-B1R3vBoD.mjs.map → wxr-taxonomies-Df4vxWcU.mjs.map} +1 -1
- package/dist/{zod-generator-LC-on_Vb.mjs → zod-generator-DylzusHh.mjs} +24 -18
- package/dist/zod-generator-DylzusHh.mjs.map +1 -0
- package/package.json +16 -8
- package/src/api/errors.ts +20 -0
- package/src/api/handlers/index.ts +17 -0
- package/src/api/handlers/media-allowlist.ts +1 -0
- package/src/api/handlers/media-folders.ts +130 -0
- package/src/api/handlers/media-usage-activation.ts +102 -0
- package/src/api/handlers/media-usage.ts +108 -0
- package/src/api/handlers/media.ts +62 -2
- package/src/api/handlers/registry.ts +134 -316
- package/src/api/openapi/document.ts +192 -2
- package/src/api/schemas/media-usage.ts +77 -0
- package/src/api/schemas/media.ts +69 -0
- package/src/astro/integration/routes.ts +18 -0
- package/src/astro/integration/vite-config.ts +2 -7
- package/src/astro/middleware/auth.ts +4 -0
- package/src/astro/middleware.ts +0 -7
- package/src/astro/routes/api/admin/media-usage/activation.ts +42 -0
- package/src/astro/routes/api/admin/media-usage/progress.ts +37 -0
- package/src/astro/routes/api/admin/plugins/registry/artifact.ts +246 -96
- package/src/astro/routes/api/auth/me.ts +14 -2
- package/src/astro/routes/api/media/[id].ts +3 -0
- package/src/astro/routes/api/media/folders/[id].ts +55 -0
- package/src/astro/routes/api/media/folders/index.ts +37 -0
- package/src/astro/routes/api/media.ts +12 -2
- package/src/astro/routes/api/setup/dev-bypass.ts +12 -0
- package/src/astro/types.ts +11 -1
- package/src/client/index.ts +140 -2
- package/src/client/transport.ts +6 -2
- package/src/components/EmDashImage.astro +154 -50
- package/src/components/Gallery.astro +7 -0
- package/src/components/InlinePortableTextEditor.tsx +130 -1
- package/src/components/LiveSearch.astro +23 -0
- package/src/components/inline-code-block.tsx +180 -49
- package/src/content/converters/gallery.ts +2 -0
- package/src/content/converters/types.ts +2 -0
- package/src/database/connection.ts +2 -31
- package/src/database/index.ts +1 -1
- package/src/database/json-recordset.ts +16 -0
- package/src/database/migrations/019_i18n.ts +1 -1
- package/src/database/migrations/071_restore_content_bylines_table.ts +43 -0
- package/src/database/migrations/072_media_folders.ts +72 -0
- package/src/database/migrations/073_media_focal_point.ts +57 -0
- package/src/database/migrations/runner.ts +8 -2
- package/src/database/repositories/content.ts +5 -4
- package/src/database/repositories/media-folders.ts +115 -0
- package/src/database/repositories/media-usage-work.ts +395 -111
- package/src/database/repositories/media-usage.ts +1038 -10
- package/src/database/repositories/media.ts +97 -29
- package/src/database/transaction.ts +1 -0
- package/src/database/types.ts +13 -0
- package/src/db/adapters.ts +2 -2
- package/src/db/node-sqlite-compat.ts +78 -0
- package/src/db/sqlite.ts +3 -3
- package/src/emdash-runtime.ts +110 -105
- package/src/fields/image.ts +7 -1
- package/src/fields/types.ts +6 -2
- package/src/index.ts +5 -0
- package/src/media/focal-point.ts +37 -0
- package/src/media/local-runtime.ts +8 -0
- package/src/media/mime.ts +1 -0
- package/src/media/normalize.ts +10 -0
- package/src/media/types.ts +10 -0
- package/src/media/usage/activation.ts +162 -35
- package/src/media/usage/capture-triggers.ts +19 -3
- package/src/media/usage/collection-deletion-processor.ts +7 -3
- package/src/media/usage/collection-deletion.ts +10 -0
- package/src/media/usage/content-refresh.ts +258 -39
- package/src/media/usage/content-snapshots.ts +128 -31
- package/src/media/usage/extractor.ts +32 -13
- package/src/media/usage/maintenance-engine.ts +166 -0
- package/src/media/usage/reconciliation-processor.ts +106 -29
- package/src/media/usage/reconciliation.ts +90 -7
- package/src/media/usage/work-processor.ts +342 -101
- package/src/plugins/index.ts +1 -0
- package/src/plugins/save-rejection.ts +20 -0
- package/src/plugins/scheduler/node.ts +1 -13
- package/src/plugins/scheduler/types.ts +0 -2
- package/src/plugins/state.ts +13 -3
- package/src/registry/artifact-fetch.ts +530 -0
- package/src/registry/config.ts +24 -6
- package/src/registry/types.ts +12 -15
- package/src/schema/types.ts +1 -0
- package/src/schema/zod-generator.ts +12 -4
- package/src/security/ssrf.ts +21 -2
- package/src/seed/apply.ts +4 -4
- package/src/ui.ts +2 -0
- package/dist/api-BeBglVxU.mjs.map +0 -1
- package/dist/collection-deletion-DQPvMD8R.mjs.map +0 -1
- package/dist/content-ZHCc1ngN.mjs.map +0 -1
- package/dist/content-refresh-B_8SJzuU.mjs.map +0 -1
- package/dist/errors-CLUPm7aD.mjs.map +0 -1
- package/dist/index-BVBZj4-7.d.mts.map +0 -1
- package/dist/media-BWWWb8kg.mjs.map +0 -1
- package/dist/media-CzhAn2--.mjs.map +0 -1
- package/dist/media-allowlist-D6x-Us02.mjs.map +0 -1
- package/dist/media-usage-BZCydfvu.mjs.map +0 -1
- package/dist/media-usage-work-DrCbqBcl.mjs.map +0 -1
- package/dist/menus-DSo5QeW0.mjs.map +0 -1
- package/dist/mime-DfIVjNkr.mjs.map +0 -1
- package/dist/normalize-Bc-s_r-a.mjs.map +0 -1
- package/dist/placeholder-Dp0K3RkD.d.mts.map +0 -1
- package/dist/registry-Cqa2I749.mjs.map +0 -1
- package/dist/relations-BHo5A8Zf.d.mts.map +0 -1
- package/dist/runner-C1T11CfC.mjs.map +0 -1
- package/dist/state-DYwPue40.mjs.map +0 -1
- package/dist/types-C2pMvO62.d.mts.map +0 -1
- package/dist/types-DQIDRKF2.d.mts.map +0 -1
- package/dist/version-DB_fqCSI.mjs +0 -7
- package/dist/zod-generator-LC-on_Vb.mjs.map +0 -1
- /package/dist/{api-tokens-rIXC6LdE.mjs → api-tokens-B5NHLNUN.mjs} +0 -0
- /package/dist/{ssrf-DpXgKsna.mjs → ssrf-BPKzkm6O.mjs} +0 -0
- /package/dist/{types-CP1CflWf.mjs → types-D6OcIp2P.mjs} +0 -0
|
@@ -37,13 +37,7 @@ export function extractMediaUsageOccurrences({
|
|
|
37
37
|
const value = data[field.slug];
|
|
38
38
|
|
|
39
39
|
if (field.type === "image") {
|
|
40
|
-
|
|
41
|
-
fieldSlug: field.slug,
|
|
42
|
-
fieldPath: field.slug,
|
|
43
|
-
referenceType: "image_field",
|
|
44
|
-
value,
|
|
45
|
-
fallbackKind: "image",
|
|
46
|
-
});
|
|
40
|
+
addImageOccurrences(occurrences, seen, field.slug, field.slug, value);
|
|
47
41
|
continue;
|
|
48
42
|
}
|
|
49
43
|
|
|
@@ -86,17 +80,42 @@ function extractRepeaterOccurrences(
|
|
|
86
80
|
for (const subField of subFields) {
|
|
87
81
|
if (subField.type !== "image") continue;
|
|
88
82
|
|
|
89
|
-
|
|
83
|
+
addImageOccurrences(
|
|
84
|
+
occurrences,
|
|
85
|
+
seen,
|
|
90
86
|
fieldSlug,
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
fallbackKind: "image",
|
|
95
|
-
});
|
|
87
|
+
`${fieldSlug}[${itemIndex}].${subField.slug}`,
|
|
88
|
+
item[subField.slug],
|
|
89
|
+
);
|
|
96
90
|
}
|
|
97
91
|
}
|
|
98
92
|
}
|
|
99
93
|
|
|
94
|
+
function addImageOccurrences(
|
|
95
|
+
occurrences: ExtractedMediaUsageOccurrence[],
|
|
96
|
+
seen: Set<string>,
|
|
97
|
+
fieldSlug: string,
|
|
98
|
+
fieldPath: string,
|
|
99
|
+
value: unknown,
|
|
100
|
+
): void {
|
|
101
|
+
addOccurrence(occurrences, seen, {
|
|
102
|
+
fieldSlug,
|
|
103
|
+
fieldPath,
|
|
104
|
+
referenceType: "image_field",
|
|
105
|
+
value,
|
|
106
|
+
fallbackKind: "image",
|
|
107
|
+
});
|
|
108
|
+
if (isRecord(value) && value.darkVariant != null) {
|
|
109
|
+
addOccurrence(occurrences, seen, {
|
|
110
|
+
fieldSlug,
|
|
111
|
+
fieldPath: `${fieldPath}.darkVariant`,
|
|
112
|
+
referenceType: "image_field",
|
|
113
|
+
value: value.darkVariant,
|
|
114
|
+
fallbackKind: "image",
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
100
119
|
function extractPortableTextOccurrences(
|
|
101
120
|
occurrences: ExtractedMediaUsageOccurrence[],
|
|
102
121
|
seen: Set<string>,
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
|
|
3
|
+
import type { Database } from "../../database/types.js";
|
|
4
|
+
import { getRequestContext } from "../../request-context.js";
|
|
5
|
+
import {
|
|
6
|
+
continueMediaUsageActivation,
|
|
7
|
+
MEDIA_USAGE_ACTIVATION_RUNTIME_GENERATION,
|
|
8
|
+
MediaUsageActivationVersionMismatchError,
|
|
9
|
+
} from "./activation.js";
|
|
10
|
+
import { processDueMediaUsageCollectionDeletions } from "./collection-deletion-processor.js";
|
|
11
|
+
import { processDueMediaUsageReconciliationDetailed } from "./reconciliation-processor.js";
|
|
12
|
+
import { MediaUsageReconciliationRepository } from "./reconciliation.js";
|
|
13
|
+
import { processDueMediaUsageWork } from "./work-processor.js";
|
|
14
|
+
|
|
15
|
+
type MediaUsageMaintenanceTaskClass = "entry_work" | "collection_deletion" | "reconciliation";
|
|
16
|
+
|
|
17
|
+
export type MediaUsageMaintenanceContinuation =
|
|
18
|
+
| { kind: "none" }
|
|
19
|
+
| { kind: "immediate" }
|
|
20
|
+
| { kind: "delayed"; delaySeconds: 30 };
|
|
21
|
+
|
|
22
|
+
export interface MediaUsageMaintenanceStepResult {
|
|
23
|
+
state: "inactive" | "idle" | "blocked" | "progress";
|
|
24
|
+
continuation: MediaUsageMaintenanceContinuation;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const MEDIA_USAGE_MAINTENANCE_LIMITS = Object.freeze({
|
|
28
|
+
eventQueryCeiling: 900,
|
|
29
|
+
maxStepQueries: 150,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const TASK_CLASSES: readonly MediaUsageMaintenanceTaskClass[] = [
|
|
33
|
+
"collection_deletion",
|
|
34
|
+
"entry_work",
|
|
35
|
+
"reconciliation",
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
export async function runMediaUsageMaintenanceStep(
|
|
39
|
+
db: Kysely<Database>,
|
|
40
|
+
): Promise<MediaUsageMaintenanceStepResult> {
|
|
41
|
+
const activation = await db
|
|
42
|
+
.selectFrom("_emdash_media_usage_activation")
|
|
43
|
+
.select(["state", "runtime_generation"])
|
|
44
|
+
.where("task_key", "=", "incremental_capture")
|
|
45
|
+
.executeTakeFirst();
|
|
46
|
+
if (
|
|
47
|
+
activation?.state !== "active" ||
|
|
48
|
+
activation.runtime_generation !== MEDIA_USAGE_ACTIVATION_RUNTIME_GENERATION
|
|
49
|
+
) {
|
|
50
|
+
return runActivationStep(db);
|
|
51
|
+
}
|
|
52
|
+
let blocked = false;
|
|
53
|
+
let blockedReconciliation = false;
|
|
54
|
+
let madeProgress = false;
|
|
55
|
+
|
|
56
|
+
for (const taskClass of TASK_CLASSES) {
|
|
57
|
+
const metrics = getRequestContext()?.metrics;
|
|
58
|
+
if (metrics && !canStartMediaUsageMaintenanceStep(metrics)) {
|
|
59
|
+
return madeProgress
|
|
60
|
+
? {
|
|
61
|
+
state: "progress",
|
|
62
|
+
continuation: { kind: "immediate" },
|
|
63
|
+
}
|
|
64
|
+
: {
|
|
65
|
+
state: "blocked",
|
|
66
|
+
continuation: { kind: "immediate" },
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const outcome = await runTaskClass(db, taskClass);
|
|
70
|
+
if (outcome === "inactive") return inactiveResult();
|
|
71
|
+
if (outcome === "progress") madeProgress = true;
|
|
72
|
+
if (outcome === "blocked") {
|
|
73
|
+
blocked = true;
|
|
74
|
+
if (taskClass === "reconciliation") blockedReconciliation = true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (madeProgress) {
|
|
78
|
+
return {
|
|
79
|
+
state: "progress",
|
|
80
|
+
continuation: { kind: "immediate" },
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (
|
|
85
|
+
blockedReconciliation &&
|
|
86
|
+
(await new MediaUsageReconciliationRepository(db).wakeDrainedBarrierCandidate())
|
|
87
|
+
) {
|
|
88
|
+
return {
|
|
89
|
+
state: "progress",
|
|
90
|
+
continuation: { kind: "immediate" },
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (blocked) {
|
|
95
|
+
return {
|
|
96
|
+
state: "blocked",
|
|
97
|
+
continuation: { kind: "delayed", delaySeconds: 30 },
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
state: "idle",
|
|
103
|
+
continuation: { kind: "none" },
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function runActivationStep(db: Kysely<Database>): Promise<MediaUsageMaintenanceStepResult> {
|
|
108
|
+
try {
|
|
109
|
+
const result = await continueMediaUsageActivation(db);
|
|
110
|
+
if (result.outcome === "activating" || result.outcome === "active") {
|
|
111
|
+
return {
|
|
112
|
+
state: "progress",
|
|
113
|
+
continuation: { kind: "immediate" },
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (result.outcome === "lease_active" || result.outcome === "conflict") {
|
|
117
|
+
return {
|
|
118
|
+
state: "blocked",
|
|
119
|
+
continuation: { kind: "delayed", delaySeconds: 30 },
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return inactiveResult();
|
|
123
|
+
} catch (error) {
|
|
124
|
+
if (error instanceof MediaUsageActivationVersionMismatchError) return inactiveResult();
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function runTaskClass(
|
|
130
|
+
db: Kysely<Database>,
|
|
131
|
+
taskClass: MediaUsageMaintenanceTaskClass,
|
|
132
|
+
): Promise<"inactive" | "idle" | "blocked" | "progress"> {
|
|
133
|
+
if (taskClass === "entry_work") {
|
|
134
|
+
const result = await processDueMediaUsageWork(db, {
|
|
135
|
+
activationKnownActive: true,
|
|
136
|
+
});
|
|
137
|
+
if (result.claimedCount > 0) return "progress";
|
|
138
|
+
return result.candidateCount > 0 ? "blocked" : "idle";
|
|
139
|
+
}
|
|
140
|
+
if (taskClass === "collection_deletion") {
|
|
141
|
+
const result = await processDueMediaUsageCollectionDeletions(db);
|
|
142
|
+
if (result.claimedCount > 0) return "progress";
|
|
143
|
+
return result.candidateCount > 0 ? "blocked" : "idle";
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const result = await processDueMediaUsageReconciliationDetailed(db, {
|
|
147
|
+
activationKnownActive: true,
|
|
148
|
+
});
|
|
149
|
+
if (result.outcome === "inactive") return "inactive";
|
|
150
|
+
if (result.consumedUnit) return "progress";
|
|
151
|
+
return result.outcome === "claim_lost" || result.hasDeferredCandidate ? "blocked" : "idle";
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function inactiveResult(): MediaUsageMaintenanceStepResult {
|
|
155
|
+
return {
|
|
156
|
+
state: "inactive",
|
|
157
|
+
continuation: { kind: "none" },
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function canStartMediaUsageMaintenanceStep(metrics: { dbCount: number }): boolean {
|
|
162
|
+
return (
|
|
163
|
+
metrics.dbCount + MEDIA_USAGE_MAINTENANCE_LIMITS.maxStepQueries <=
|
|
164
|
+
MEDIA_USAGE_MAINTENANCE_LIMITS.eventQueryCeiling
|
|
165
|
+
);
|
|
166
|
+
}
|
|
@@ -15,13 +15,13 @@ import { CONTENT_SOURCE_SCHEMA_VERSION } from "./types.js";
|
|
|
15
15
|
|
|
16
16
|
export const MEDIA_USAGE_RECONCILIATION_LIMITS = Object.freeze({
|
|
17
17
|
candidatesPerTick: 4,
|
|
18
|
-
|
|
18
|
+
scanPageSize: 1_000,
|
|
19
|
+
sourcePageSize: 1_000,
|
|
19
20
|
leaseDurationSeconds: 60,
|
|
20
21
|
maxAttempts: 5,
|
|
21
22
|
retryBaseSeconds: 30,
|
|
22
23
|
retryMaxSeconds: 15 * 60,
|
|
23
24
|
retryJitterRatio: 0.25,
|
|
24
|
-
maxQueriesPerTick: 20,
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
export type MediaUsageReconciliationOutcome =
|
|
@@ -34,6 +34,16 @@ export type MediaUsageReconciliationOutcome =
|
|
|
34
34
|
| "retry"
|
|
35
35
|
| "failed";
|
|
36
36
|
|
|
37
|
+
export interface MediaUsageReconciliationDetailedResult {
|
|
38
|
+
outcome: MediaUsageReconciliationOutcome;
|
|
39
|
+
consumedUnit: boolean;
|
|
40
|
+
hasDeferredCandidate: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface ProcessDueMediaUsageReconciliationOptions {
|
|
44
|
+
activationKnownActive?: boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
37
47
|
export type MediaUsageReconciliationScanOutcome =
|
|
38
48
|
| "advanced"
|
|
39
49
|
| "exhausted"
|
|
@@ -43,24 +53,39 @@ export type MediaUsageReconciliationScanOutcome =
|
|
|
43
53
|
export async function processDueMediaUsageReconciliation(
|
|
44
54
|
db: Kysely<Database>,
|
|
45
55
|
): Promise<MediaUsageReconciliationOutcome> {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
56
|
+
return (await processDueMediaUsageReconciliationDetailed(db)).outcome;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function processDueMediaUsageReconciliationDetailed(
|
|
60
|
+
db: Kysely<Database>,
|
|
61
|
+
options: ProcessDueMediaUsageReconciliationOptions = {},
|
|
62
|
+
): Promise<MediaUsageReconciliationDetailedResult> {
|
|
63
|
+
if (!options.activationKnownActive) {
|
|
64
|
+
const activation = await db
|
|
65
|
+
.selectFrom("_emdash_media_usage_activation")
|
|
66
|
+
.select("state")
|
|
67
|
+
.where("task_key", "=", "incremental_capture")
|
|
68
|
+
.executeTakeFirst();
|
|
69
|
+
if (activation?.state !== "active") {
|
|
70
|
+
return { outcome: "inactive", consumedUnit: false, hasDeferredCandidate: false };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
52
73
|
|
|
53
74
|
const reconciliation = new MediaUsageReconciliationRepository(db);
|
|
54
|
-
if (await reconciliation.deleteOneObsolete())
|
|
75
|
+
if (await reconciliation.deleteOneObsolete()) {
|
|
76
|
+
return { outcome: "completed", consumedUnit: true, hasDeferredCandidate: false };
|
|
77
|
+
}
|
|
55
78
|
const [failed] = await reconciliation.findFailed(1);
|
|
56
79
|
if (failed) {
|
|
57
80
|
if (await reconciliation.finishFailedCoverage(failed.collectionId, failed.runToken)) {
|
|
58
|
-
return "failed";
|
|
81
|
+
return { outcome: "failed", consumedUnit: true, hasDeferredCandidate: false };
|
|
82
|
+
}
|
|
83
|
+
if (await reconciliation.resetFailedForNewEpoch(failed)) {
|
|
84
|
+
return { outcome: "advanced", consumedUnit: true, hasDeferredCandidate: false };
|
|
59
85
|
}
|
|
60
|
-
if (await reconciliation.resetFailedForNewEpoch(failed)) return "advanced";
|
|
61
86
|
}
|
|
62
87
|
|
|
63
|
-
await reconciliation.seedNextCandidate();
|
|
88
|
+
const seeded = await reconciliation.seedNextCandidate();
|
|
64
89
|
const candidates = await reconciliation.findDue(
|
|
65
90
|
MEDIA_USAGE_RECONCILIATION_LIMITS.candidatesPerTick,
|
|
66
91
|
);
|
|
@@ -73,10 +98,21 @@ export async function processDueMediaUsageReconciliation(
|
|
|
73
98
|
});
|
|
74
99
|
if (claim) break;
|
|
75
100
|
}
|
|
76
|
-
if (!claim)
|
|
101
|
+
if (!claim) {
|
|
102
|
+
return {
|
|
103
|
+
outcome: candidates.length === 0 ? "not_due" : "claim_lost",
|
|
104
|
+
consumedUnit: seeded,
|
|
105
|
+
hasDeferredCandidate:
|
|
106
|
+
candidates.length === 0 && (await reconciliation.hasDeferredCandidate()),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
77
109
|
|
|
78
110
|
try {
|
|
79
|
-
return
|
|
111
|
+
return {
|
|
112
|
+
outcome: await processClaimedReconciliation(db, claim),
|
|
113
|
+
consumedUnit: true,
|
|
114
|
+
hasDeferredCandidate: false,
|
|
115
|
+
};
|
|
80
116
|
} catch (error) {
|
|
81
117
|
const terminal = claim.attemptCount + 1 >= MEDIA_USAGE_RECONCILIATION_LIMITS.maxAttempts;
|
|
82
118
|
const recorded = await reconciliation.recordFailure({
|
|
@@ -87,10 +123,16 @@ export async function processDueMediaUsageReconciliation(
|
|
|
87
123
|
retryDelaySeconds: retryDelaySeconds(claim.attemptCount),
|
|
88
124
|
terminal,
|
|
89
125
|
});
|
|
90
|
-
if (!recorded)
|
|
126
|
+
if (!recorded) {
|
|
127
|
+
return { outcome: "claim_lost", consumedUnit: true, hasDeferredCandidate: false };
|
|
128
|
+
}
|
|
91
129
|
if (terminal) await reconciliation.finishFailedCoverage(claim.collectionId, claim.runToken);
|
|
92
130
|
console.error("[media-usage:reconciliation] Processing failed:", error);
|
|
93
|
-
return
|
|
131
|
+
return {
|
|
132
|
+
outcome: terminal ? "failed" : "retry",
|
|
133
|
+
consumedUnit: true,
|
|
134
|
+
hasDeferredCandidate: false,
|
|
135
|
+
};
|
|
94
136
|
}
|
|
95
137
|
}
|
|
96
138
|
|
|
@@ -98,9 +140,11 @@ export async function processClaimedMediaUsageReconciliationScan(
|
|
|
98
140
|
db: Kysely<Database>,
|
|
99
141
|
claim: MediaUsageReconciliationClaim,
|
|
100
142
|
options: { releaseOnExhausted?: boolean } = {},
|
|
143
|
+
knownCurrent?: MediaUsageReconciliationRecord,
|
|
101
144
|
): Promise<MediaUsageReconciliationScanOutcome> {
|
|
102
145
|
const reconciliation = new MediaUsageReconciliationRepository(db);
|
|
103
|
-
let current =
|
|
146
|
+
let current =
|
|
147
|
+
knownCurrent ?? (await reconciliation.findByIdentity(claim.collectionId, claim.runToken));
|
|
104
148
|
if (!current || current.leaseToken !== claim.leaseToken || current.phase !== "scan") {
|
|
105
149
|
return "deferred";
|
|
106
150
|
}
|
|
@@ -127,8 +171,15 @@ export async function processClaimedMediaUsageReconciliationScan(
|
|
|
127
171
|
) {
|
|
128
172
|
return "deferred";
|
|
129
173
|
}
|
|
130
|
-
current =
|
|
131
|
-
|
|
174
|
+
current = {
|
|
175
|
+
...current,
|
|
176
|
+
targetEpoch,
|
|
177
|
+
fieldFingerprint,
|
|
178
|
+
scanCursor: null,
|
|
179
|
+
scanUpperId,
|
|
180
|
+
sourceCursor: null,
|
|
181
|
+
sourceUpperKey: null,
|
|
182
|
+
};
|
|
132
183
|
} else {
|
|
133
184
|
fields = await loadContentMediaUsageFields(db, claim.collectionSlug, claim.collectionId);
|
|
134
185
|
fieldFingerprint = await buildContentMediaUsageFieldFingerprint(fields);
|
|
@@ -137,7 +188,10 @@ export async function processClaimedMediaUsageReconciliationScan(
|
|
|
137
188
|
if (current.fieldFingerprint !== fieldFingerprint || current.targetEpoch === null) {
|
|
138
189
|
return "restart_required";
|
|
139
190
|
}
|
|
140
|
-
const contentIds = await reconciliation.findScanPage(
|
|
191
|
+
const contentIds = await reconciliation.findScanPage(
|
|
192
|
+
current,
|
|
193
|
+
MEDIA_USAGE_RECONCILIATION_LIMITS.scanPageSize,
|
|
194
|
+
);
|
|
141
195
|
if (contentIds.length === 0) {
|
|
142
196
|
if (options.releaseOnExhausted ?? true) {
|
|
143
197
|
await reconciliation.release({ ...claim, delaySeconds: 30 });
|
|
@@ -175,23 +229,39 @@ async function processClaimedReconciliation(
|
|
|
175
229
|
claim: MediaUsageReconciliationClaim,
|
|
176
230
|
): Promise<MediaUsageReconciliationOutcome> {
|
|
177
231
|
const reconciliation = new MediaUsageReconciliationRepository(db);
|
|
178
|
-
let current =
|
|
179
|
-
if (!current || current.leaseToken !== claim.leaseToken) return "claim_lost";
|
|
232
|
+
let current: MediaUsageReconciliationRecord = claim;
|
|
180
233
|
if (current.targetEpoch !== null && !(await reconciliation.ownsRun(claim, current.targetEpoch))) {
|
|
181
234
|
return restartReconciliation(db, reconciliation, claim, current);
|
|
182
235
|
}
|
|
236
|
+
if (current.targetEpoch !== null) {
|
|
237
|
+
await new MediaUsageWorkRepository(db).deleteObsoleteReconciliationWork({
|
|
238
|
+
collectionId: claim.collectionId,
|
|
239
|
+
collectionSlug: claim.collectionSlug,
|
|
240
|
+
runToken: claim.runToken,
|
|
241
|
+
leaseToken: claim.leaseToken,
|
|
242
|
+
targetEpoch: current.targetEpoch,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
183
245
|
|
|
184
246
|
if (current.phase === "scan") {
|
|
185
|
-
const outcome = await processClaimedMediaUsageReconciliationScan(
|
|
186
|
-
|
|
187
|
-
|
|
247
|
+
const outcome = await processClaimedMediaUsageReconciliationScan(
|
|
248
|
+
db,
|
|
249
|
+
claim,
|
|
250
|
+
{
|
|
251
|
+
releaseOnExhausted: false,
|
|
252
|
+
},
|
|
253
|
+
current,
|
|
254
|
+
);
|
|
188
255
|
if (outcome === "restart_required") {
|
|
189
256
|
current =
|
|
190
257
|
(await reconciliation.findByIdentity(claim.collectionId, claim.runToken)) ?? current;
|
|
191
258
|
return restartReconciliation(db, reconciliation, claim, current);
|
|
192
259
|
}
|
|
193
260
|
if (outcome !== "exhausted") return outcome;
|
|
194
|
-
current
|
|
261
|
+
if (current.targetEpoch === null || current.fieldFingerprint === null) {
|
|
262
|
+
current =
|
|
263
|
+
(await reconciliation.findByIdentity(claim.collectionId, claim.runToken)) ?? current;
|
|
264
|
+
}
|
|
195
265
|
const barrier = await reconciliation.findWorkBarrier(claim.collectionId);
|
|
196
266
|
if (barrier.state === "failed") {
|
|
197
267
|
return failReconciliation(reconciliation, claim, barrier.errorCode, true);
|
|
@@ -234,9 +304,10 @@ async function processSourcePhase(
|
|
|
234
304
|
|
|
235
305
|
const page = await reconciliation.findSourcePage(
|
|
236
306
|
current,
|
|
237
|
-
MEDIA_USAGE_RECONCILIATION_LIMITS.
|
|
307
|
+
MEDIA_USAGE_RECONCILIATION_LIMITS.sourcePageSize,
|
|
238
308
|
);
|
|
239
309
|
if (page.length > 0) {
|
|
310
|
+
let enqueuedMissingContent = false;
|
|
240
311
|
const malformed = page.some(
|
|
241
312
|
(source) =>
|
|
242
313
|
!source.contentId ||
|
|
@@ -265,6 +336,7 @@ async function processSourcePhase(
|
|
|
265
336
|
phase: "sources",
|
|
266
337
|
contentIds: enqueueIds,
|
|
267
338
|
});
|
|
339
|
+
enqueuedMissingContent = true;
|
|
268
340
|
}
|
|
269
341
|
if (
|
|
270
342
|
!(await reconciliation.checkpointSources({
|
|
@@ -276,8 +348,13 @@ async function processSourcePhase(
|
|
|
276
348
|
) {
|
|
277
349
|
return "claim_lost";
|
|
278
350
|
}
|
|
279
|
-
if (
|
|
280
|
-
|
|
351
|
+
if (
|
|
352
|
+
enqueuedMissingContent ||
|
|
353
|
+
page.length === MEDIA_USAGE_RECONCILIATION_LIMITS.sourcePageSize
|
|
354
|
+
) {
|
|
355
|
+
if (!(await reconciliation.release({ ...claim, delaySeconds: 0 }))) return "claim_lost";
|
|
356
|
+
return "advanced";
|
|
357
|
+
}
|
|
281
358
|
}
|
|
282
359
|
|
|
283
360
|
const barrier = await reconciliation.findWorkBarrier(claim.collectionId);
|
|
@@ -2,6 +2,7 @@ import { sql, type Kysely, type RawBuilder, type Selectable } from "kysely";
|
|
|
2
2
|
import { ulid } from "ulidx";
|
|
3
3
|
|
|
4
4
|
import { isPostgres } from "../../database/dialect-helpers.js";
|
|
5
|
+
import { jsonTextValues } from "../../database/json-recordset.js";
|
|
5
6
|
import type { Database, MediaUsageReconciliationTable } from "../../database/types.js";
|
|
6
7
|
import { validateIdentifier } from "../../database/validate.js";
|
|
7
8
|
|
|
@@ -147,8 +148,8 @@ export class MediaUsageReconciliationRepository {
|
|
|
147
148
|
reconciliation: MediaUsageReconciliationRecord,
|
|
148
149
|
limit: number,
|
|
149
150
|
): Promise<string[]> {
|
|
150
|
-
if (!Number.isSafeInteger(limit) || limit < 1 || limit >
|
|
151
|
-
throw new Error("Reconciliation scan page limit must be from 1 to
|
|
151
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1_000) {
|
|
152
|
+
throw new Error("Reconciliation scan page limit must be from 1 to 1000");
|
|
152
153
|
}
|
|
153
154
|
if (!reconciliation.leaseToken || reconciliation.targetEpoch === null) return [];
|
|
154
155
|
const tableName = contentTableName(reconciliation.collectionSlug);
|
|
@@ -366,8 +367,8 @@ export class MediaUsageReconciliationRepository {
|
|
|
366
367
|
reconciliation: MediaUsageReconciliationRecord,
|
|
367
368
|
limit: number,
|
|
368
369
|
): Promise<MediaUsageReconciliationSourceCandidate[]> {
|
|
369
|
-
if (!Number.isSafeInteger(limit) || limit < 1 || limit >
|
|
370
|
-
throw new Error("Reconciliation source page limit must be from 1 to
|
|
370
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1_000) {
|
|
371
|
+
throw new Error("Reconciliation source page limit must be from 1 to 1000");
|
|
371
372
|
}
|
|
372
373
|
if (!reconciliation.leaseToken || reconciliation.targetEpoch === null) return [];
|
|
373
374
|
let query = this.db
|
|
@@ -400,12 +401,16 @@ export class MediaUsageReconciliationRepository {
|
|
|
400
401
|
): Promise<string[]> {
|
|
401
402
|
const unique = [...new Set(contentIds)];
|
|
402
403
|
if (unique.length === 0) return [];
|
|
403
|
-
if (unique.length >
|
|
404
|
+
if (unique.length > 1_000 || unique.some((contentId) => !contentId)) {
|
|
404
405
|
throw new Error("Reconciliation source page has invalid content identity");
|
|
405
406
|
}
|
|
406
407
|
const tableName = contentTableName(collectionSlug);
|
|
408
|
+
const requested = jsonTextValues(this.db, unique);
|
|
407
409
|
const existing = await sql<{ id: string }>`
|
|
408
|
-
|
|
410
|
+
WITH requested AS (${requested})
|
|
411
|
+
SELECT content.id
|
|
412
|
+
FROM ${sql.ref(tableName)} AS content
|
|
413
|
+
INNER JOIN requested ON requested.value = content.id
|
|
409
414
|
`.execute(this.db);
|
|
410
415
|
const present = new Set(existing.rows.map((row) => row.id));
|
|
411
416
|
return unique.filter((contentId) => !present.has(contentId));
|
|
@@ -482,6 +487,12 @@ export class MediaUsageReconciliationRepository {
|
|
|
482
487
|
.where("status.collection_id", "=", collectionId)
|
|
483
488
|
.where("status.status", "=", "running")
|
|
484
489
|
.where("status.cursor", "=", runToken)
|
|
490
|
+
.where(sql<boolean>`status.change_epoch = (
|
|
491
|
+
SELECT reconciliation.target_epoch
|
|
492
|
+
FROM _emdash_media_usage_reconciliations AS reconciliation
|
|
493
|
+
WHERE reconciliation.collection_id = ${collectionId}
|
|
494
|
+
AND reconciliation.run_token = ${runToken}
|
|
495
|
+
)`)
|
|
485
496
|
.where((eb) =>
|
|
486
497
|
eb.exists(
|
|
487
498
|
eb
|
|
@@ -751,6 +762,70 @@ export class MediaUsageReconciliationRepository {
|
|
|
751
762
|
return result.rows.map(rowToRecord);
|
|
752
763
|
}
|
|
753
764
|
|
|
765
|
+
async hasDeferredCandidate(): Promise<boolean> {
|
|
766
|
+
const row = await this.db
|
|
767
|
+
.selectFrom("_emdash_media_usage_reconciliations")
|
|
768
|
+
.select("collection_id")
|
|
769
|
+
.where("state", "in", ["pending", "retry", "leased"])
|
|
770
|
+
.limit(1)
|
|
771
|
+
.executeTakeFirst();
|
|
772
|
+
return row !== undefined;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
async wakeDrainedBarrierCandidate(): Promise<boolean> {
|
|
776
|
+
const now = timestampOffset(this.db, 0);
|
|
777
|
+
const candidateIsDue = timestampIsDue(this.db, "reconciliation.next_attempt_at");
|
|
778
|
+
const targetIsDue = timestampIsDue(
|
|
779
|
+
this.db,
|
|
780
|
+
"_emdash_media_usage_reconciliations.next_attempt_at",
|
|
781
|
+
);
|
|
782
|
+
const result = await sql<{ collection_id: string }>`
|
|
783
|
+
UPDATE _emdash_media_usage_reconciliations
|
|
784
|
+
SET next_attempt_at = ${now}, updated_at = ${now}
|
|
785
|
+
WHERE collection_id = (
|
|
786
|
+
SELECT reconciliation.collection_id
|
|
787
|
+
FROM _emdash_media_usage_reconciliations AS reconciliation
|
|
788
|
+
INNER JOIN _emdash_media_usage_index_status AS status
|
|
789
|
+
ON status.collection_id = reconciliation.collection_id
|
|
790
|
+
AND status.scope_key = reconciliation.collection_slug
|
|
791
|
+
WHERE reconciliation.state = 'pending'
|
|
792
|
+
AND reconciliation.target_epoch IS NOT NULL
|
|
793
|
+
AND NOT ${candidateIsDue}
|
|
794
|
+
AND status.adapter_id = ${CONTENT_ADAPTER_ID}
|
|
795
|
+
AND status.scope_type = ${COLLECTION_SCOPE}
|
|
796
|
+
AND status.capture_state = 'active'
|
|
797
|
+
AND status.reconciliation_required = 1
|
|
798
|
+
AND status.status = 'running'
|
|
799
|
+
AND status.cursor = reconciliation.run_token
|
|
800
|
+
AND status.change_epoch = reconciliation.target_epoch
|
|
801
|
+
AND NOT EXISTS (
|
|
802
|
+
SELECT 1 FROM _emdash_media_usage_work AS work
|
|
803
|
+
WHERE work.collection_id = reconciliation.collection_id
|
|
804
|
+
)
|
|
805
|
+
AND NOT EXISTS (
|
|
806
|
+
SELECT 1 FROM _emdash_media_usage_collection_deletions AS deletion
|
|
807
|
+
WHERE deletion.collection_id = reconciliation.collection_id
|
|
808
|
+
)
|
|
809
|
+
ORDER BY reconciliation.next_attempt_at, reconciliation.updated_at,
|
|
810
|
+
reconciliation.collection_id
|
|
811
|
+
LIMIT 1
|
|
812
|
+
)
|
|
813
|
+
AND state = 'pending'
|
|
814
|
+
AND NOT ${targetIsDue}
|
|
815
|
+
AND EXISTS (
|
|
816
|
+
SELECT 1 FROM _emdash_media_usage_activation AS activation
|
|
817
|
+
WHERE activation.task_key = ${ACTIVATION_KEY}
|
|
818
|
+
AND activation.state = 'active'
|
|
819
|
+
)
|
|
820
|
+
AND NOT EXISTS (
|
|
821
|
+
SELECT 1 FROM _emdash_media_usage_work AS work
|
|
822
|
+
WHERE work.collection_id = _emdash_media_usage_reconciliations.collection_id
|
|
823
|
+
)
|
|
824
|
+
RETURNING collection_id
|
|
825
|
+
`.execute(this.db);
|
|
826
|
+
return result.rows.length === 1;
|
|
827
|
+
}
|
|
828
|
+
|
|
754
829
|
async findFailed(limit: number): Promise<MediaUsageReconciliationRecord[]> {
|
|
755
830
|
assertLimit(limit);
|
|
756
831
|
const rows = await this.db
|
|
@@ -1005,7 +1080,15 @@ export class MediaUsageReconciliationRepository {
|
|
|
1005
1080
|
.where("status.scope_type", "=", COLLECTION_SCOPE)
|
|
1006
1081
|
.where("status.capture_state", "=", "active")
|
|
1007
1082
|
.where("status.reconciliation_required", "=", 1)
|
|
1008
|
-
.where(
|
|
1083
|
+
.where((status) =>
|
|
1084
|
+
status.or([
|
|
1085
|
+
status("status.cursor", "is", null),
|
|
1086
|
+
status.and([
|
|
1087
|
+
status("status.status", "=", "running"),
|
|
1088
|
+
status("status.cursor", "=", runToken),
|
|
1089
|
+
]),
|
|
1090
|
+
]),
|
|
1091
|
+
)
|
|
1009
1092
|
.where("status.change_epoch", ">", targetEpoch),
|
|
1010
1093
|
),
|
|
1011
1094
|
)
|