emdash 0.32.0 → 0.34.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-C0ONzkUP.d.mts → adapters-34EN2eXO.d.mts} +34 -2
- package/dist/adapters-34EN2eXO.d.mts.map +1 -0
- package/dist/after-CBU2vkoO.mjs +96 -0
- package/dist/after-CBU2vkoO.mjs.map +1 -0
- package/dist/{allowed-origins-CCEi9bPI.mjs → allowed-origins-DW7sYyqg.mjs} +2 -2
- package/dist/{allowed-origins-CCEi9bPI.mjs.map → allowed-origins-DW7sYyqg.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -4
- package/dist/api/route-utils.d.mts.map +1 -1
- package/dist/api/route-utils.mjs +26 -25
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +6 -5
- package/dist/{api-DgPbMlng.mjs → api-DdAsirBe.mjs} +321 -428
- package/dist/api-DdAsirBe.mjs.map +1 -0
- package/dist/{api-tokens-p-iMzvXR.mjs → api-tokens-CFXu8F_2.mjs} +2 -2
- package/dist/{api-tokens-p-iMzvXR.mjs.map → api-tokens-CFXu8F_2.mjs.map} +1 -1
- package/dist/{apply-1_6ra7NP.mjs → apply-D5zfeD09.mjs} +139 -102
- package/dist/apply-D5zfeD09.mjs.map +1 -0
- package/dist/astro/index.d.mts +12 -12
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +103 -35
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +9 -9
- package/dist/astro/middleware/media-usage-write-fence.d.mts +7 -0
- package/dist/astro/middleware/media-usage-write-fence.d.mts.map +1 -0
- package/dist/astro/middleware/media-usage-write-fence.mjs +35 -0
- package/dist/astro/middleware/media-usage-write-fence.mjs.map +1 -0
- package/dist/astro/middleware/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +13 -10
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.mjs +5 -5
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +12 -11
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +1915 -223
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +9 -8
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +9 -8
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +12 -11
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +12 -11
- package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +12 -11
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +20 -20
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +20 -20
- package/dist/astro/routes/api/admin/bylines/index.mjs +20 -20
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -17
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/bulk.mjs +14 -13
- package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/counts.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/index.mjs +14 -13
- package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +36 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +36 -0
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +15 -14
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +37 -0
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.d.mts +8 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +37 -0
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -0
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/_id_/disable.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -47
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -47
- 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 +6 -6
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +55 -46
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +55 -46
- 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 +4 -4
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +55 -46
- 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.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +55 -46
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +56 -47
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +52 -46
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +56 -47
- 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 +4 -4
- 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 +4 -4
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +3 -3
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +10 -9
- package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/index.mjs +9 -8
- package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/dev-bypass.mjs +8 -8
- package/dist/astro/routes/api/auth/invite/accept.mjs +3 -3
- package/dist/astro/routes/api/auth/invite/complete.mjs +14 -13
- package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/index.mjs +12 -11
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +13 -12
- package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/logout.mjs +4 -4
- package/dist/astro/routes/api/auth/magic-link/send.mjs +14 -13
- package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +4 -4
- package/dist/astro/routes/api/auth/me.mjs +10 -9
- package/dist/astro/routes/api/auth/me.mjs.map +1 -1
- package/dist/astro/routes/api/auth/mode.mjs +4 -4
- 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 +9 -8
- package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
- package/dist/astro/routes/api/auth/passkey/options.mjs +15 -14
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +13 -12
- package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +14 -13
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.mjs +14 -13
- package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.mjs +14 -13
- package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/request.mjs +14 -13
- package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/verify.mjs +3 -3
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +20 -19
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +17 -16
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +21 -20
- 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 +21 -20
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +47 -34
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +4 -4
- package/dist/astro/routes/api/content/_collection_/index.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +10 -9
- package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
- package/dist/astro/routes/api/dashboard.mjs +12 -10
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +4 -4
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +22 -20
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +5 -5
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +18 -18
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
- package/dist/astro/routes/api/import/wordpress/media.mjs +14 -12
- package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +13 -12
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +15 -15
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +22 -20
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +32 -31
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +6 -6
- package/dist/astro/routes/api/mcp.d.mts.map +1 -1
- package/dist/astro/routes/api/mcp.mjs +174 -72
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +14 -12
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/upload.mjs +7 -7
- package/dist/astro/routes/api/media/_id_/usage.mjs +17 -16
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +16 -15
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/file/_...key_.mjs +3 -3
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -4
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -4
- package/dist/astro/routes/api/media/providers/index.mjs +4 -4
- package/dist/astro/routes/api/media/upload-url.mjs +11 -10
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +19 -16
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +13 -13
- package/dist/astro/routes/api/menus/_name_/items.mjs +13 -13
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +13 -13
- package/dist/astro/routes/api/menus/_name_/translations.mjs +13 -13
- package/dist/astro/routes/api/menus/_name_.mjs +13 -13
- package/dist/astro/routes/api/menus/index.mjs +13 -13
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -7
- package/dist/astro/routes/api/oauth/device/code.mjs +10 -10
- package/dist/astro/routes/api/oauth/device/token.mjs +9 -9
- package/dist/astro/routes/api/oauth/register.mjs +4 -4
- package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -7
- package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -7
- package/dist/astro/routes/api/oauth/token.mjs +7 -7
- package/dist/astro/routes/api/openapi.json.mjs +183 -6
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +8 -7
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/index.mjs +14 -13
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +14 -13
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +16 -14
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +16 -14
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +21 -20
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +16 -15
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +21 -20
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -5
- 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.d.mts.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.d.mts +8 -0
- package/dist/astro/routes/api/schema/collections/reorder.d.mts.map +1 -0
- package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -0
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -0
- package/dist/astro/routes/api/schema/index.mjs +14 -11
- 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.d.mts +1 -0
- package/dist/astro/routes/api/search/enable.d.mts.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +19 -15
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +13 -13
- package/dist/astro/routes/api/search/rebuild.mjs +15 -15
- package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
- package/dist/astro/routes/api/search/stats.mjs +9 -9
- package/dist/astro/routes/api/search/suggest.mjs +13 -13
- package/dist/astro/routes/api/sections/_slug_.mjs +13 -12
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +13 -12
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +8 -8
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/export.mjs +8 -8
- package/dist/astro/routes/api/settings/backups/index.mjs +9 -9
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +18 -17
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +15 -14
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +14 -13
- package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +34 -32
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
- package/dist/astro/routes/api/setup/index.mjs +36 -34
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +5 -5
- package/dist/astro/routes/api/snapshot.mjs +10 -10
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts +8 -0
- package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +44 -0
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +19 -18
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +19 -18
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +21 -19
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.d.mts +8 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.d.mts.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +46 -0
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_.d.mts +19 -0
- package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -0
- package/dist/astro/routes/api/taxonomies/_name_.mjs +88 -0
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -0
- package/dist/astro/routes/api/taxonomies/index.mjs +19 -18
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +8 -8
- package/dist/astro/routes/api/typegen.mjs +6 -6
- 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 +10 -9
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +13 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +13 -12
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +8 -7
- package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/index.mjs +13 -12
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +4 -4
- package/dist/astro/routes/robots.txt.mjs +11 -10
- package/dist/astro/routes/robots.txt.mjs.map +1 -1
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +14 -14
- package/dist/astro/routes/sitemap.xml.mjs +12 -11
- package/dist/astro/routes/sitemap.xml.mjs.map +1 -1
- package/dist/astro/types.d.mts +41 -17
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{authorize-R5iYYrpa.mjs → authorize-1iFJzPaZ.mjs} +2 -2
- package/dist/{authorize-R5iYYrpa.mjs.map → authorize-1iFJzPaZ.mjs.map} +1 -1
- package/dist/{backup-LpQ1V_sR.mjs → backup-LHjIAVNP.mjs} +5 -5
- package/dist/{backup-LpQ1V_sR.mjs.map → backup-LHjIAVNP.mjs.map} +1 -1
- package/dist/{base64-B-PsqheR.mjs → base64-CvLhUKQv.mjs} +1 -1
- package/dist/{base64-B-PsqheR.mjs.map → base64-CvLhUKQv.mjs.map} +1 -1
- package/dist/bundle-CBEXrBnb.mjs +663 -0
- package/dist/bundle-CBEXrBnb.mjs.map +1 -0
- package/dist/{byline-fields-T9ZLZMxJ.mjs → byline-fields-C5S8wygO.mjs} +2 -2
- package/dist/{byline-fields-T9ZLZMxJ.mjs.map → byline-fields-C5S8wygO.mjs.map} +1 -1
- package/dist/{byline-C5TAqs8N.mjs → byline-pEcoDps8.mjs} +9 -9
- package/dist/{byline-C5TAqs8N.mjs.map → byline-pEcoDps8.mjs.map} +1 -1
- package/dist/{byline-registry-BCuOp4UF.mjs → byline-registry-DDun8sxh.mjs} +4 -4
- package/dist/{byline-registry-BCuOp4UF.mjs.map → byline-registry-DDun8sxh.mjs.map} +1 -1
- package/dist/{bylines-B8-WGdja.mjs → bylines-BWemdX2k.mjs} +8 -8
- package/dist/{bylines-B8-WGdja.mjs.map → bylines-BWemdX2k.mjs.map} +1 -1
- package/dist/{bylines-DGuqBLjV.mjs → bylines-DJfSfXCL.mjs} +5 -5
- package/dist/{bylines-DGuqBLjV.mjs.map → bylines-DJfSfXCL.mjs.map} +1 -1
- package/dist/cache-CBJaDy_E.mjs +108 -0
- package/dist/cache-CBJaDy_E.mjs.map +1 -0
- package/dist/{challenge-store-BFzgFRog.mjs → challenge-store-CZyFVaad.mjs} +1 -1
- package/dist/{challenge-store-BFzgFRog.mjs.map → challenge-store-CZyFVaad.mjs.map} +1 -1
- package/dist/{chunks-D5dlPeRb.mjs → chunks-DfPax1I0.mjs} +2 -2
- package/dist/{chunks-D5dlPeRb.mjs.map → chunks-DfPax1I0.mjs.map} +1 -1
- package/dist/cli/index.mjs +193 -707
- 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 +25 -2
- package/dist/client/index.mjs.map +1 -1
- package/dist/collection-deletion-C8BugSGz.mjs +779 -0
- package/dist/collection-deletion-C8BugSGz.mjs.map +1 -0
- package/dist/{comment-DnTxxVHv.mjs → comment-Dxlep6cE.mjs} +3 -3
- package/dist/{comment-DnTxxVHv.mjs.map → comment-Dxlep6cE.mjs.map} +1 -1
- package/dist/{comment-reaction-BUlUz2bh.mjs → comment-reaction-D6qfHKBc.mjs} +2 -2
- package/dist/{comment-reaction-BUlUz2bh.mjs.map → comment-reaction-D6qfHKBc.mjs.map} +1 -1
- package/dist/{comments-QPKgK3nk.mjs → comments-CTOuhTSX.mjs} +3 -3
- package/dist/{comments-QPKgK3nk.mjs.map → comments-CTOuhTSX.mjs.map} +1 -1
- package/dist/{components-DZkL4Fx0.mjs → components-CQy3lh9x.mjs} +1 -1
- package/dist/{components-DZkL4Fx0.mjs.map → components-CQy3lh9x.mjs.map} +1 -1
- package/dist/{config-DyF3OKg_.mjs → config-C3EBstHi.mjs} +18 -2
- package/dist/config-C3EBstHi.mjs.map +1 -0
- package/dist/{content-CpfKV9QE.mjs → content-BNfwh7xX.mjs} +667 -183
- package/dist/content-BNfwh7xX.mjs.map +1 -0
- package/dist/content-list-query-DhQ84eVV.d.mts +26 -0
- package/dist/content-list-query-DhQ84eVV.d.mts.map +1 -0
- package/dist/content-refresh-DNERP4-f.mjs +2560 -0
- package/dist/content-refresh-DNERP4-f.mjs.map +1 -0
- package/dist/{context-kO4YZB03.mjs → context-DRgOvSnW.mjs} +28 -20
- package/dist/context-DRgOvSnW.mjs.map +1 -0
- package/dist/{cron-BlKIMD_e.mjs → cron-Y9aLtgrA.mjs} +1 -1
- package/dist/{cron-BlKIMD_e.mjs.map → cron-Y9aLtgrA.mjs.map} +1 -1
- package/dist/{dashboard-DoBwPnON.mjs → dashboard-CB8J89rJ.mjs} +45 -11
- package/dist/dashboard-CB8J89rJ.mjs.map +1 -0
- package/dist/db/index.d.mts +4 -4
- package/dist/db/index.mjs +3 -3
- package/dist/db/index.mjs.map +1 -1
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{db-errors-CcWLaRiR.mjs → db-errors-Cl-sKYTm.mjs} +1 -1
- package/dist/{db-errors-CcWLaRiR.mjs.map → db-errors-Cl-sKYTm.mjs.map} +1 -1
- package/dist/{default-C4v9KP56.mjs → default-DdDl3fxv.mjs} +1 -1
- package/dist/{default-C4v9KP56.mjs.map → default-DdDl3fxv.mjs.map} +1 -1
- package/dist/deferred-tasks-BMsa9F64.d.mts +9 -0
- package/dist/deferred-tasks-BMsa9F64.d.mts.map +1 -0
- package/dist/{device-flow-DhUsyJU6.mjs → device-flow-CaioYGK3.mjs} +5 -5
- package/dist/{device-flow-DhUsyJU6.mjs.map → device-flow-CaioYGK3.mjs.map} +1 -1
- package/dist/{dialect-helpers-DFwyWjTM.mjs → dialect-helpers-BSbfaO3F.mjs} +24 -16
- package/dist/dialect-helpers-BSbfaO3F.mjs.map +1 -0
- package/dist/dist-D_6CKR8z.mjs +810 -0
- package/dist/dist-D_6CKR8z.mjs.map +1 -0
- package/dist/{email-console-C-9Ng8DM.mjs → email-console-BHNjIwiB.mjs} +1 -1
- package/dist/{email-console-C-9Ng8DM.mjs.map → email-console-BHNjIwiB.mjs.map} +1 -1
- package/dist/{enrich-CFJJgxs_.mjs → enrich-_ySMEvEE.mjs} +2 -2
- package/dist/{enrich-CFJJgxs_.mjs.map → enrich-_ySMEvEE.mjs.map} +1 -1
- package/dist/{error-DmmN74gW.mjs → error-DupyJZE2.mjs} +3 -3
- package/dist/{error-DmmN74gW.mjs.map → error-DupyJZE2.mjs.map} +1 -1
- package/dist/{errors-DtEXIQQV.mjs → errors-CLUPm7aD.mjs} +15 -2
- package/dist/errors-CLUPm7aD.mjs.map +1 -0
- package/dist/{escape-CdW31WsG.mjs → escape-C_aLKP3H.mjs} +1 -1
- package/dist/{escape-CdW31WsG.mjs.map → escape-C_aLKP3H.mjs.map} +1 -1
- package/dist/{field-defs-cache-QMVnzTH6.mjs → field-defs-cache-hg6QkjV9.mjs} +5 -5
- package/dist/{field-defs-cache-QMVnzTH6.mjs.map → field-defs-cache-hg6QkjV9.mjs.map} +1 -1
- package/dist/{fts-manager-vncsZIJm.mjs → fts-manager-CZ-5dVwJ.mjs} +111 -61
- package/dist/fts-manager-CZ-5dVwJ.mjs.map +1 -0
- package/dist/{hash-Cb7U1b5M.mjs → hash-Cg0TXJPV.mjs} +1 -1
- package/dist/{hash-Cb7U1b5M.mjs.map → hash-Cg0TXJPV.mjs.map} +1 -1
- package/dist/{hreflang-CZbSx6Bg.d.mts → hreflang-D3Uehfv2.d.mts} +2 -2
- package/dist/{hreflang-CZbSx6Bg.d.mts.map → hreflang-D3Uehfv2.d.mts.map} +1 -1
- package/dist/{hreflang-Bg-zMpkr.mjs → hreflang-DNswoYsi.mjs} +7 -7
- package/dist/{hreflang-Bg-zMpkr.mjs.map → hreflang-DNswoYsi.mjs.map} +1 -1
- package/dist/{import-PKhLeXvn.mjs → import-B41u8Rot.mjs} +7 -7
- package/dist/{import-PKhLeXvn.mjs.map → import-B41u8Rot.mjs.map} +1 -1
- package/dist/{index-j9rTh3cp.d.mts → index-C3Y-rsyN.d.mts} +286 -93
- package/dist/index-C3Y-rsyN.d.mts.map +1 -0
- package/dist/{index-BeNto_Vs.d.mts → index-Cof4-Fab.d.mts} +5 -10
- package/dist/index-Cof4-Fab.d.mts.map +1 -0
- package/dist/index.d.mts +20 -19
- package/dist/index.mjs +79 -71
- package/dist/{init-lock-DJkX6Hto.mjs → init-lock-6b309ZrF.mjs} +1 -1
- package/dist/{init-lock-DJkX6Hto.mjs.map → init-lock-6b309ZrF.mjs.map} +1 -1
- package/dist/{load-BwTdWE8B.mjs → load-DmvJrtxS.mjs} +2 -2
- package/dist/{load-BwTdWE8B.mjs.map → load-DmvJrtxS.mjs.map} +1 -1
- package/dist/{loader-C1XOLV5b.mjs → loader-DLBqRiGP.mjs} +120 -64
- package/dist/loader-DLBqRiGP.mjs.map +1 -0
- package/dist/{manifest-schema-bCq54i7F.mjs → manifest-schema-BXbUAHod.mjs} +1 -1
- package/dist/{manifest-schema-bCq54i7F.mjs.map → manifest-schema-BXbUAHod.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 +3 -2
- package/dist/media/index.mjs.map +1 -1
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +10 -9
- package/dist/media/local-runtime.mjs.map +1 -1
- package/dist/{media-DWIzoVFL.mjs → media-BWWWb8kg.mjs} +92 -3
- package/dist/media-BWWWb8kg.mjs.map +1 -0
- package/dist/{media-tQDZEdu7.mjs → media-CzhAn2--.mjs} +2 -2
- package/dist/{media-tQDZEdu7.mjs.map → media-CzhAn2--.mjs.map} +1 -1
- package/dist/{media-allowlist-B7TPD6aq.mjs → media-allowlist-BD6HhgXA.mjs} +14 -3
- package/dist/media-allowlist-BD6HhgXA.mjs.map +1 -0
- package/dist/{media-upload-Bc9Nc5Zf.mjs → media-upload-9yas9zGH.mjs} +11 -9
- package/dist/{media-upload-Bc9Nc5Zf.mjs.map → media-upload-9yas9zGH.mjs.map} +1 -1
- package/dist/{media-url-BCm5vBn6.mjs → media-url-BvoX88FA.mjs} +1 -1
- package/dist/{media-url-BCm5vBn6.mjs.map → media-url-BvoX88FA.mjs.map} +1 -1
- package/dist/{media-usage-DPJcNaAq.mjs → media-usage-De3qvwjc.mjs} +138 -61
- package/dist/media-usage-De3qvwjc.mjs.map +1 -0
- package/dist/media-usage-work-B9Bksh_b.mjs +152 -0
- package/dist/media-usage-work-B9Bksh_b.mjs.map +1 -0
- package/dist/media-usage-work-DrCbqBcl.mjs +424 -0
- package/dist/media-usage-work-DrCbqBcl.mjs.map +1 -0
- package/dist/media-usage-write-fence-aHEgN1zB.mjs +42 -0
- package/dist/media-usage-write-fence-aHEgN1zB.mjs.map +1 -0
- package/dist/{menus-C6qhqP4X.mjs → menus-CC-yn1F9.mjs} +554 -121
- package/dist/menus-CC-yn1F9.mjs.map +1 -0
- package/dist/{menus-BxPLFfIc.mjs → menus-fxvEDYE6.mjs} +5 -5
- package/dist/{menus-BxPLFfIc.mjs.map → menus-fxvEDYE6.mjs.map} +1 -1
- package/dist/{mode-fiXRMfeA.mjs → mode-Bpe-tNNy.mjs} +1 -1
- package/dist/{mode-fiXRMfeA.mjs.map → mode-Bpe-tNNy.mjs.map} +1 -1
- package/dist/{normalize-C-SHXmra.mjs → normalize-Bc-s_r-a.mjs} +1 -1
- package/dist/{normalize-C-SHXmra.mjs.map → normalize-Bc-s_r-a.mjs.map} +1 -1
- package/dist/{oauth-authorization-C9tFinly.mjs → oauth-authorization-BXO1MKej.mjs} +5 -5
- package/dist/{oauth-authorization-C9tFinly.mjs.map → oauth-authorization-BXO1MKej.mjs.map} +1 -1
- package/dist/{oauth-clients-BwTxE1aE.mjs → oauth-clients-C_DNqtRu.mjs} +1 -1
- package/dist/{oauth-clients-BwTxE1aE.mjs.map → oauth-clients-C_DNqtRu.mjs.map} +1 -1
- package/dist/{oauth-state-store-DaRUwPWO.mjs → oauth-state-store-DwAxMtk4.mjs} +1 -1
- package/dist/{oauth-state-store-DaRUwPWO.mjs.map → oauth-state-store-DwAxMtk4.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-CzuzOSlF.mjs → oauth-user-lookup-BxfZizdk.mjs} +1 -1
- package/dist/{oauth-user-lookup-CzuzOSlF.mjs.map → oauth-user-lookup-BxfZizdk.mjs.map} +1 -1
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-Bok5j2ae.mjs → object-cache-71tPfV4A.mjs} +106 -5
- package/dist/object-cache-71tPfV4A.mjs.map +1 -0
- package/dist/{options-BlmBHTvX.mjs → options-CBXIHUoT.mjs} +1 -1
- package/dist/{options-BlmBHTvX.mjs.map → options-CBXIHUoT.mjs.map} +1 -1
- package/dist/{options-aeIs8WFu.d.mts → options-DRe1pIBL.d.mts} +4 -3
- package/dist/options-DRe1pIBL.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-BL49yb9D.mjs → parse-DFbuc-Fh.mjs} +2 -2
- package/dist/{parse-BL49yb9D.mjs.map → parse-DFbuc-Fh.mjs.map} +1 -1
- package/dist/{passkey-config-KMhgFjdQ.mjs → passkey-config-_2GOwwK8.mjs} +1 -1
- package/dist/{passkey-config-KMhgFjdQ.mjs.map → passkey-config-_2GOwwK8.mjs.map} +1 -1
- package/dist/{placeholder-Dxo5Zt58.d.mts → placeholder-CzW7Lshs.d.mts} +1 -1
- package/dist/{placeholder-Dxo5Zt58.d.mts.map → placeholder-CzW7Lshs.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +8 -1
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-utils.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +7 -4
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/{portable-text-CNahFfj6.mjs → portable-text-DhKbDAGr.mjs} +1 -1
- package/dist/{portable-text-CNahFfj6.mjs.map → portable-text-DhKbDAGr.mjs.map} +1 -1
- package/dist/{preview-D4Jnbfx7.mjs → preview-PW-nOnq4.mjs} +2 -2
- package/dist/{preview-D4Jnbfx7.mjs.map → preview-PW-nOnq4.mjs.map} +1 -1
- package/dist/{public-url-DSGTnJFw.mjs → public-url-CWoFhQT8.mjs} +14 -3
- package/dist/public-url-CWoFhQT8.mjs.map +1 -0
- package/dist/{query-DCiXI7OZ.mjs → query-BgjfiLUQ.mjs} +38 -77
- package/dist/query-BgjfiLUQ.mjs.map +1 -0
- package/dist/{query-1xOcEy18.mjs → query-vgZNwIhh.mjs} +4 -4
- package/dist/{query-1xOcEy18.mjs.map → query-vgZNwIhh.mjs.map} +1 -1
- package/dist/{rate-limit-Vkp9gQ1Y.mjs → rate-limit-L5anykgo.mjs} +2 -2
- package/dist/{rate-limit-Vkp9gQ1Y.mjs.map → rate-limit-L5anykgo.mjs.map} +1 -1
- package/dist/{redirect-BJ6d1yHh.mjs → redirect-COsS6SWJ.mjs} +3 -3
- package/dist/{redirect-BJ6d1yHh.mjs.map → redirect-COsS6SWJ.mjs.map} +1 -1
- package/dist/{redirect-CDgfv9vh.mjs → redirect-KBNE3UEs.mjs} +1 -1
- package/dist/{redirect-CDgfv9vh.mjs.map → redirect-KBNE3UEs.mjs.map} +1 -1
- package/dist/{redirects-Cwkq2H-G.mjs → redirects-CufRQt0Q.mjs} +5 -5
- package/dist/{redirects-Cwkq2H-G.mjs.map → redirects-CufRQt0Q.mjs.map} +1 -1
- package/dist/{redirects-BOn2DIUs.mjs → redirects-cV9g7V-0.mjs} +149 -16
- package/dist/redirects-cV9g7V-0.mjs.map +1 -0
- package/dist/registry-C581V4TP.mjs +1275 -0
- package/dist/registry-C581V4TP.mjs.map +1 -0
- package/dist/{relation-DJ5DZh7B.mjs → relation-DtmAQH7s.mjs} +3 -3
- package/dist/{relation-DJ5DZh7B.mjs.map → relation-DtmAQH7s.mjs.map} +1 -1
- package/dist/{relations-C4duJnwI.mjs → relations-BBApI4e2.mjs} +3 -3
- package/dist/{relations-C4duJnwI.mjs.map → relations-BBApI4e2.mjs.map} +1 -1
- package/dist/{relations-DpTjftCl.mjs → relations-DICSyfsh.mjs} +6 -6
- package/dist/{relations-DpTjftCl.mjs.map → relations-DICSyfsh.mjs.map} +1 -1
- package/dist/{relations-DHFQGX0h.d.mts → relations-DItI3MN9.d.mts} +401 -40
- package/dist/relations-DItI3MN9.d.mts.map +1 -0
- package/dist/request-context.d.mts +3 -0
- package/dist/request-context.d.mts.map +1 -1
- package/dist/request-context.mjs.map +1 -1
- package/dist/{request-meta-DzXYYI-n.mjs → request-meta-DgZJh3zG.mjs} +2 -2
- package/dist/{request-meta-DzXYYI-n.mjs.map → request-meta-DgZJh3zG.mjs.map} +1 -1
- package/dist/{resolve-BUvFE0Lr.mjs → resolve-DOhVEvty.mjs} +2 -2
- package/dist/{resolve-BUvFE0Lr.mjs.map → resolve-DOhVEvty.mjs.map} +1 -1
- package/dist/{runner-BsI18UgP.mjs → runner-BiDvq5dv.mjs} +1404 -235
- package/dist/runner-BiDvq5dv.mjs.map +1 -0
- package/dist/{runner-CHdkERbt.d.mts → runner-CgQbELYC.d.mts} +2 -2
- package/dist/{runner-CHdkERbt.d.mts.map → runner-CgQbELYC.d.mts.map} +1 -1
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +5 -4
- package/dist/runtime.mjs.map +1 -1
- package/dist/{schema-eqZhkR0S.mjs → schema-BFyTg38T.mjs} +3 -3
- package/dist/{schema-eqZhkR0S.mjs.map → schema-BFyTg38T.mjs.map} +1 -1
- package/dist/schema-CeQSNwB3.mjs +390 -0
- package/dist/schema-CeQSNwB3.mjs.map +1 -0
- package/dist/{scopes-Be2d8bSb.mjs → scopes-BVeuhGBE.mjs} +3 -3
- package/dist/{scopes-Be2d8bSb.mjs.map → scopes-BVeuhGBE.mjs.map} +1 -1
- package/dist/{search-CeO678cp.mjs → search-BpuPKZb0.mjs} +26 -16
- package/dist/search-BpuPKZb0.mjs.map +1 -0
- package/dist/{secrets-870d-7yA.mjs → secrets-dtYs2hDo.mjs} +5 -5
- package/dist/{secrets-870d-7yA.mjs.map → secrets-dtYs2hDo.mjs.map} +1 -1
- package/dist/{sections-DSuEfirn.mjs → sections-COctk6hf.mjs} +3 -3
- package/dist/{sections-DSuEfirn.mjs.map → sections-COctk6hf.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +28 -26
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +20 -19
- package/dist/seo/index.mjs.map +1 -1
- package/dist/{seo-C3GDfT0V.mjs → seo-AFpVvTqr.mjs} +6 -4
- package/dist/seo-AFpVvTqr.mjs.map +1 -0
- package/dist/{seo-BAPKiED8.mjs → seo-CvDxfvFb.mjs} +3 -3
- package/dist/{seo-BAPKiED8.mjs.map → seo-CvDxfvFb.mjs.map} +1 -1
- package/dist/{service-DyFT-k-R.mjs → service-xMiMSTsR.mjs} +4 -4
- package/dist/{service-DyFT-k-R.mjs.map → service-xMiMSTsR.mjs.map} +1 -1
- package/dist/{session-user-BrK2zz7S.mjs → session-user-BzVemLkw.mjs} +2 -2
- package/dist/{session-user-BrK2zz7S.mjs.map → session-user-BzVemLkw.mjs.map} +1 -1
- package/dist/{settings-DgKouY2S.mjs → settings-B372MV0p.mjs} +7 -7
- package/dist/{settings-DgKouY2S.mjs.map → settings-B372MV0p.mjs.map} +1 -1
- package/dist/{settings-CREKyj8I.mjs → settings-BE9aqn_9.mjs} +3 -3
- package/dist/{settings-CREKyj8I.mjs.map → settings-BE9aqn_9.mjs.map} +1 -1
- package/dist/{setup-complete-L7bMK2VI.mjs → setup-complete-DF7TAfD5.mjs} +2 -2
- package/dist/{setup-complete-L7bMK2VI.mjs.map → setup-complete-DF7TAfD5.mjs.map} +1 -1
- package/dist/{setup-nonce-Ct5tjWcq.mjs → setup-nonce-Do-U_cg9.mjs} +1 -1
- package/dist/{setup-nonce-Ct5tjWcq.mjs.map → setup-nonce-Do-U_cg9.mjs.map} +1 -1
- package/dist/{single-flight-cache-C2exrGAi.mjs → single-flight-cache-B0eLKS6K.mjs} +2 -2
- package/dist/{single-flight-cache-C2exrGAi.mjs.map → single-flight-cache-B0eLKS6K.mjs.map} +1 -1
- package/dist/site-url-Bowsi9T-.mjs +16 -0
- package/dist/site-url-Bowsi9T-.mjs.map +1 -0
- package/dist/slugify-B994zkXC.mjs +17 -0
- package/dist/slugify-B994zkXC.mjs.map +1 -0
- package/dist/{snapshot-BdpUJKD-.mjs → snapshot-B5h6aPMh.mjs} +2 -2
- package/dist/{snapshot-BdpUJKD-.mjs.map → snapshot-B5h6aPMh.mjs.map} +1 -1
- package/dist/{ssrf-CviKqWmq.mjs → ssrf-Cpvg_n3A.mjs} +1 -1
- package/dist/{ssrf-CviKqWmq.mjs.map → ssrf-Cpvg_n3A.mjs.map} +1 -1
- package/dist/{state-xxv6ZTMv.mjs → state-DYwPue40.mjs} +1 -1
- package/dist/{state-xxv6ZTMv.mjs.map → state-DYwPue40.mjs.map} +1 -1
- package/dist/{status-COfycGIU.mjs → status-CWVYpbD8.mjs} +1 -1
- package/dist/{status-COfycGIU.mjs.map → status-CWVYpbD8.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{taxonomies-B61CRSha.mjs → taxonomies-B0o9ExNV.mjs} +85 -75
- package/dist/taxonomies-B0o9ExNV.mjs.map +1 -0
- package/dist/{taxonomies-Dbdki3Un.mjs → taxonomies-Dk3MAklL.mjs} +360 -56
- package/dist/taxonomies-Dk3MAklL.mjs.map +1 -0
- package/dist/taxonomy-CPeM8d2o.mjs +484 -0
- package/dist/taxonomy-CPeM8d2o.mjs.map +1 -0
- package/dist/{tokens-DVltpO2D.mjs → tokens-C39klX8R.mjs} +2 -2
- package/dist/{tokens-DVltpO2D.mjs.map → tokens-C39klX8R.mjs.map} +1 -1
- package/dist/{transaction-D0FOsb3X.mjs → transaction-NQj4VJ7Z.mjs} +1 -1
- package/dist/{transaction-D0FOsb3X.mjs.map → transaction-NQj4VJ7Z.mjs.map} +1 -1
- package/dist/{transport-BWQo0Foy.mjs → transport--CfOflrp.mjs} +1 -1
- package/dist/{transport-BWQo0Foy.mjs.map → transport--CfOflrp.mjs.map} +1 -1
- package/dist/{transport-DokJOScS.d.mts → transport-B_rfeU-a.d.mts} +1 -1
- package/dist/{transport-DokJOScS.d.mts.map → transport-B_rfeU-a.d.mts.map} +1 -1
- package/dist/{trusted-proxy-CwjQj0YG.mjs → trusted-proxy-CEVekpby.mjs} +1 -1
- package/dist/{trusted-proxy-CwjQj0YG.mjs.map → trusted-proxy-CEVekpby.mjs.map} +1 -1
- package/dist/{types-o7xo7VgH.mjs → types-75KIqzL9.mjs} +20 -3
- package/dist/types-75KIqzL9.mjs.map +1 -0
- package/dist/{types-C9P3ysxq.d.mts → types-BPuloofb.d.mts} +1 -1
- package/dist/{types-C9P3ysxq.d.mts.map → types-BPuloofb.d.mts.map} +1 -1
- package/dist/{types-BD40g7zz.mjs → types-BW1syrlw.mjs} +1 -1
- package/dist/{types-BD40g7zz.mjs.map → types-BW1syrlw.mjs.map} +1 -1
- package/dist/{types-jISEalTX.d.mts → types-C3_AbkDP.d.mts} +53 -10
- package/dist/types-C3_AbkDP.d.mts.map +1 -0
- package/dist/{types-84Bque3-.d.mts → types-CAGdePf3.d.mts} +133 -1
- package/dist/types-CAGdePf3.d.mts.map +1 -0
- package/dist/{types-CcSZCcF1.d.mts → types-CFUfyt1s.d.mts} +1 -1
- package/dist/{types-CcSZCcF1.d.mts.map → types-CFUfyt1s.d.mts.map} +1 -1
- package/dist/{types-DQLZ58GV.d.mts → types-CPx2lIGo.d.mts} +1 -1
- package/dist/{types-DQLZ58GV.d.mts.map → types-CPx2lIGo.d.mts.map} +1 -1
- package/dist/{types-XrQQ-Aex.mjs → types-CQPWhPxE.mjs} +15 -11
- package/dist/types-CQPWhPxE.mjs.map +1 -0
- package/dist/{types-BQY7VYw6.d.mts → types-Cs-TFLNf.d.mts} +28 -8
- package/dist/types-Cs-TFLNf.d.mts.map +1 -0
- package/dist/types-CtzytVXn.mjs +18 -0
- package/dist/types-CtzytVXn.mjs.map +1 -0
- package/dist/{types-DqZVPILm.d.mts → types-D4_1Ga4L.d.mts} +44 -5
- package/dist/types-D4_1Ga4L.d.mts.map +1 -0
- package/dist/{types-Dr2GLlwu.d.mts → types-DefV3OiO.d.mts} +1 -1
- package/dist/{types-Dr2GLlwu.d.mts.map → types-DefV3OiO.d.mts.map} +1 -1
- package/dist/{types-DsAMyD_o.d.mts → types-X0MThr7x.d.mts} +1 -1
- package/dist/{types-DsAMyD_o.d.mts.map → types-X0MThr7x.d.mts.map} +1 -1
- package/dist/{upload-attempts-C5yd6Gae.mjs → upload-attempts-hlne3iA1.mjs} +1 -1
- package/dist/{upload-attempts-C5yd6Gae.mjs.map → upload-attempts-hlne3iA1.mjs.map} +1 -1
- package/dist/url-pattern-BHS0V5Ng.mjs +33 -0
- package/dist/url-pattern-BHS0V5Ng.mjs.map +1 -0
- package/dist/{user-BAumEmpA.mjs → user-sHgJ62SP.mjs} +3 -3
- package/dist/{user-BAumEmpA.mjs.map → user-sHgJ62SP.mjs.map} +1 -1
- package/dist/{utils-BbUgmeZG.mjs → utils-D4vD_Y98.mjs} +3 -3
- package/dist/{utils-BbUgmeZG.mjs.map → utils-D4vD_Y98.mjs.map} +1 -1
- package/dist/{validate-Bs_wT2ul.mjs → validate-BkqIG_Uj.mjs} +24 -5
- package/dist/validate-BkqIG_Uj.mjs.map +1 -0
- package/dist/{validate-VPnKoIzW.mjs → validate-BpwoDOgt.mjs} +25 -2
- package/dist/validate-BpwoDOgt.mjs.map +1 -0
- package/dist/{validate-CdYcY-Ln.d.mts → validate-DeGtBN84.d.mts} +25 -7
- package/dist/validate-DeGtBN84.d.mts.map +1 -0
- package/dist/{validation-BngR0nit.mjs → validation-CiJb_X5o.mjs} +14 -13
- package/dist/{validation-BngR0nit.mjs.map → validation-CiJb_X5o.mjs.map} +1 -1
- package/dist/version-x0NjTScG.mjs +7 -0
- package/dist/{version-Bdfb34kk.mjs.map → version-x0NjTScG.mjs.map} +1 -1
- package/dist/{widgets-L-VndTKD.mjs → widgets-Cwzvww0W.mjs} +3 -3
- package/dist/{widgets-L-VndTKD.mjs.map → widgets-Cwzvww0W.mjs.map} +1 -1
- package/dist/{wxr-taxonomies-DueaLFd9.d.mts → wxr-taxonomies-CmC0ZsDr.d.mts} +1 -1
- package/dist/{wxr-taxonomies-DueaLFd9.d.mts.map → wxr-taxonomies-CmC0ZsDr.d.mts.map} +1 -1
- package/dist/{wxr-taxonomies-BexjtNid.mjs → wxr-taxonomies-QZjWxjyk.mjs} +13 -32
- package/dist/{wxr-taxonomies-BexjtNid.mjs.map → wxr-taxonomies-QZjWxjyk.mjs.map} +1 -1
- package/dist/{zod-generator-DMzfga3g.mjs → zod-generator-D11MhxG4.mjs} +53 -6
- package/dist/zod-generator-D11MhxG4.mjs.map +1 -0
- package/package.json +18 -7
- package/src/after.ts +6 -1
- package/src/api/errors.ts +13 -0
- package/src/api/handlers/content.ts +172 -33
- package/src/api/handlers/dashboard.ts +12 -2
- package/src/api/handlers/index.ts +16 -0
- package/src/api/handlers/manifest.ts +2 -0
- package/src/api/handlers/marketplace.ts +14 -0
- package/src/api/handlers/media-allowlist.ts +13 -2
- package/src/api/handlers/media-usage-work.ts +188 -0
- package/src/api/handlers/media-usage.ts +5 -3
- package/src/api/handlers/registry.ts +14 -0
- package/src/api/handlers/revision.ts +19 -5
- package/src/api/handlers/schema.ts +46 -3
- package/src/api/handlers/seo.ts +5 -2
- package/src/api/handlers/snapshot.ts +1 -1
- package/src/api/handlers/taxonomies.ts +446 -83
- package/src/api/media-usage-write-fence.ts +64 -0
- package/src/api/openapi/document.ts +247 -0
- package/src/api/public-url.ts +14 -2
- package/src/api/schemas/common.ts +3 -1
- package/src/api/schemas/content.ts +122 -1
- package/src/api/schemas/media-usage.ts +133 -0
- package/src/api/schemas/schema.ts +91 -3
- package/src/api/schemas/search.ts +2 -0
- package/src/api/schemas/taxonomies.ts +58 -8
- package/src/api/site-url.ts +16 -6
- package/src/api/types.ts +1 -0
- package/src/astro/integration/index.ts +55 -42
- package/src/astro/integration/routes.ts +48 -4
- package/src/astro/integration/runtime.ts +28 -0
- package/src/astro/integration/virtual-modules.ts +27 -1
- package/src/astro/integration/vite-config.ts +16 -1
- package/src/astro/middleware/media-usage-write-fence.ts +30 -0
- package/src/astro/middleware/redirect.ts +14 -12
- package/src/astro/middleware/scoped-db.ts +35 -4
- package/src/astro/middleware.ts +131 -30
- package/src/astro/routes/api/admin/comments/[id]/status.ts +1 -1
- package/src/astro/routes/api/admin/media-usage/collection-deletions/index.ts +22 -0
- package/src/astro/routes/api/admin/media-usage/collection-deletions/retry.ts +22 -0
- package/src/astro/routes/api/admin/media-usage/work/index.ts +26 -0
- package/src/astro/routes/api/admin/media-usage/work/retry.ts +26 -0
- package/src/astro/routes/api/admin/plugins/[id]/disable.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/enable.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +4 -0
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/uninstall.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +4 -0
- package/src/astro/routes/api/admin/plugins/registry/install.ts +4 -0
- package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +2 -2
- package/src/astro/routes/api/auth/invite/index.ts +2 -2
- package/src/astro/routes/api/auth/magic-link/send.ts +2 -2
- package/src/astro/routes/api/auth/signup/request.ts +2 -2
- package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +1 -1
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +67 -31
- package/src/astro/routes/api/import/wordpress/execute.ts +3 -10
- package/src/astro/routes/api/mcp.ts +1 -0
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +7 -1
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +1 -7
- package/src/astro/routes/api/schema/collections/reorder.ts +31 -0
- package/src/astro/routes/api/schema/index.ts +2 -0
- package/src/astro/routes/api/search/enable.ts +5 -1
- package/src/astro/routes/api/search/rebuild.ts +6 -1
- package/src/astro/routes/api/taxonomies/[name]/reorder.ts +41 -0
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +1 -0
- package/src/astro/routes/api/taxonomies/[name]/translations.ts +48 -0
- package/src/astro/routes/api/taxonomies/[name].ts +102 -0
- package/src/astro/types.ts +31 -4
- package/src/cleanup.ts +25 -26
- package/src/cli/commands/dev.ts +13 -3
- package/src/cli/commands/doctor.ts +193 -6
- package/src/cli/commands/export-seed.ts +6 -1
- package/src/cli/index.ts +1 -1
- package/src/client/index.ts +119 -0
- package/src/components/Block.astro +12 -0
- package/src/components/CommentForm.astro +1 -1
- package/src/components/Comments.astro +1 -1
- package/src/components/InlinePortableTextEditor.tsx +260 -32
- package/src/components/OrderedList.astro +14 -0
- package/src/components/PortableText.astro +26 -4
- package/src/components/index.ts +12 -1
- package/src/components/ordered-list.ts +549 -0
- package/src/content/converters/mark-safety.ts +120 -0
- package/src/content/converters/numbered-list.ts +148 -0
- package/src/content/converters/portable-text-to-prosemirror.ts +84 -25
- package/src/content/converters/prosemirror-to-portable-text.ts +35 -14
- package/src/content/converters/types.ts +2 -0
- package/src/content/portable-text-lists.ts +205 -0
- package/src/content-list-query.ts +29 -0
- package/src/database/dialect-helpers.ts +3 -22
- package/src/database/migrations/055_content_translation_group_locale_index.ts +67 -0
- package/src/database/migrations/056_taxonomy_term_sort_order.ts +189 -0
- package/src/database/migrations/057_collection_hidden.ts +24 -0
- package/src/database/migrations/058_collection_sort_order.ts +20 -0
- package/src/database/migrations/059_revision_prune_queue.ts +36 -0
- package/src/database/migrations/060_collection_admin_config.ts +16 -0
- package/src/database/migrations/061_media_usage_cleanup.ts +77 -0
- package/src/database/migrations/062_media_usage_cleanup_fence.ts +295 -0
- package/src/database/migrations/063_media_usage_incremental_work.ts +397 -0
- package/src/database/migrations/064_fts_plain_text.ts +253 -0
- package/src/database/migrations/065_media_usage_collection_deletion.ts +85 -0
- package/src/database/migrations/066_media_usage_reconciliation.ts +115 -0
- package/src/database/migrations/067_indexed_content_fields.ts +39 -0
- package/src/database/migrations/068_content_taxonomy_entry_groups.ts +61 -0
- package/src/database/migrations/069_collection_title_date_fields.ts +45 -0
- package/src/database/migrations/070_collection_routable.ts +18 -0
- package/src/database/migrations/runner.ts +32 -0
- package/src/database/repositories/content.ts +1051 -273
- package/src/database/repositories/media-usage-work.ts +848 -0
- package/src/database/repositories/media-usage.ts +1502 -138
- package/src/database/repositories/revision.ts +98 -22
- package/src/database/repositories/taxonomy.ts +429 -103
- package/src/database/repositories/types.ts +58 -2
- package/src/database/types.ts +147 -17
- package/src/database/validate.ts +39 -0
- package/src/db/adapters.ts +36 -0
- package/src/db/index.ts +3 -0
- package/src/deferred-tasks.ts +71 -0
- package/src/emdash-runtime.ts +493 -110
- package/src/fields/file.ts +7 -4
- package/src/fields/image.ts +8 -1
- package/src/fields/types.ts +18 -5
- package/src/i18n/config.ts +32 -0
- package/src/i18n/repair-locale-casing.ts +0 -14
- package/src/i18n/taxonomy-locale-diagnostic.ts +47 -0
- package/src/import/wxr-taxonomies.ts +7 -47
- package/src/index.ts +27 -2
- package/src/loader.ts +165 -89
- package/src/mcp/server.ts +242 -34
- package/src/media/usage/activation.ts +626 -0
- package/src/media/usage/capture-triggers.ts +543 -0
- package/src/media/usage/cleanup.ts +305 -0
- package/src/media/usage/collection-deletion-processor.ts +356 -0
- package/src/media/usage/collection-deletion.ts +836 -0
- package/src/media/usage/content-fields.ts +40 -3
- package/src/media/usage/content-refresh.ts +356 -47
- package/src/media/usage/content-repair.ts +180 -61
- package/src/media/usage/content-snapshots.ts +85 -105
- package/src/media/usage/gc.ts +50 -0
- package/src/media/usage/projection-fingerprint.ts +129 -0
- package/src/media/usage/reconciliation-processor.ts +372 -0
- package/src/media/usage/reconciliation.ts +1117 -0
- package/src/media/usage/source-key.ts +4 -0
- package/src/media/usage/types.ts +2 -0
- package/src/media/usage/work-processor.ts +248 -0
- package/src/menus/index.ts +246 -141
- package/src/object-cache/index.ts +160 -3
- package/src/plugin-types.ts +8 -0
- package/src/plugins/adapt-sandbox-entry.ts +24 -5
- package/src/plugins/context.ts +24 -7
- package/src/plugins/index.ts +9 -0
- package/src/plugins/routes.ts +77 -1
- package/src/plugins/sandbox/index.ts +10 -1
- package/src/plugins/sandbox/types.ts +78 -1
- package/src/plugins/scheduler/node.ts +13 -1
- package/src/plugins/scheduler/types.ts +2 -0
- package/src/plugins/storage-indexes.ts +50 -11
- package/src/plugins/types.ts +39 -2
- package/src/query.ts +50 -79
- package/src/redirects/cache.ts +79 -19
- package/src/request-context.ts +3 -0
- package/src/scheduled-publish.ts +6 -1
- package/src/scheduler-health.ts +46 -0
- package/src/schema/registry.ts +863 -249
- package/src/schema/types.ts +74 -8
- package/src/schema/url-pattern.ts +33 -0
- package/src/schema/zod-generator.ts +77 -5
- package/src/search/fts-manager.ts +167 -86
- package/src/search/index.ts +2 -0
- package/src/search/query.ts +32 -11
- package/src/search/types.ts +8 -0
- package/src/seed/apply.ts +89 -16
- package/src/seed/types.ts +21 -3
- package/src/seed/validate.ts +52 -2
- package/src/taxonomies/index.ts +88 -82
- package/src/taxonomies/term-counts.ts +23 -12
- package/src/ui-comments.ts +19 -0
- package/src/ui.ts +11 -3
- package/src/utils/slugify.ts +1 -29
- package/src/virtual-modules.d.ts +24 -0
- package/dist/adapters-C0ONzkUP.d.mts.map +0 -1
- package/dist/after-B1IIdH3Y.mjs +0 -29
- package/dist/after-B1IIdH3Y.mjs.map +0 -1
- package/dist/api-DgPbMlng.mjs.map +0 -1
- package/dist/apply-1_6ra7NP.mjs.map +0 -1
- package/dist/cache-B26cufFd.mjs +0 -65
- package/dist/cache-B26cufFd.mjs.map +0 -1
- package/dist/config-DyF3OKg_.mjs.map +0 -1
- package/dist/content-CpfKV9QE.mjs.map +0 -1
- package/dist/content-refresh-DgqUBeTv.mjs +0 -1629
- package/dist/content-refresh-DgqUBeTv.mjs.map +0 -1
- package/dist/context-kO4YZB03.mjs.map +0 -1
- package/dist/dashboard-DoBwPnON.mjs.map +0 -1
- package/dist/dialect-helpers-DFwyWjTM.mjs.map +0 -1
- package/dist/errors-DtEXIQQV.mjs.map +0 -1
- package/dist/fts-manager-vncsZIJm.mjs.map +0 -1
- package/dist/index-BeNto_Vs.d.mts.map +0 -1
- package/dist/index-j9rTh3cp.d.mts.map +0 -1
- package/dist/loader-C1XOLV5b.mjs.map +0 -1
- package/dist/media-DWIzoVFL.mjs.map +0 -1
- package/dist/media-allowlist-B7TPD6aq.mjs.map +0 -1
- package/dist/media-usage-DPJcNaAq.mjs.map +0 -1
- package/dist/menus-C6qhqP4X.mjs.map +0 -1
- package/dist/object-cache-Bok5j2ae.mjs.map +0 -1
- package/dist/options-aeIs8WFu.d.mts.map +0 -1
- package/dist/public-url-DSGTnJFw.mjs.map +0 -1
- package/dist/query-DCiXI7OZ.mjs.map +0 -1
- package/dist/redirects-BOn2DIUs.mjs.map +0 -1
- package/dist/registry-BP1JK2xh.mjs +0 -795
- package/dist/registry-BP1JK2xh.mjs.map +0 -1
- package/dist/relations-DHFQGX0h.d.mts.map +0 -1
- package/dist/runner-BsI18UgP.mjs.map +0 -1
- package/dist/search-CeO678cp.mjs.map +0 -1
- package/dist/seo-C3GDfT0V.mjs.map +0 -1
- package/dist/site-url-8N3kSyVZ.mjs +0 -13
- package/dist/site-url-8N3kSyVZ.mjs.map +0 -1
- package/dist/slugify-C_tqlU4G.mjs +0 -30
- package/dist/slugify-C_tqlU4G.mjs.map +0 -1
- package/dist/taxonomies-B61CRSha.mjs.map +0 -1
- package/dist/taxonomies-Dbdki3Un.mjs.map +0 -1
- package/dist/taxonomy-DvwWAPvA.mjs +0 -304
- package/dist/taxonomy-DvwWAPvA.mjs.map +0 -1
- package/dist/types-84Bque3-.d.mts.map +0 -1
- package/dist/types-BQY7VYw6.d.mts.map +0 -1
- package/dist/types-DqZVPILm.d.mts.map +0 -1
- package/dist/types-XrQQ-Aex.mjs.map +0 -1
- package/dist/types-jISEalTX.d.mts.map +0 -1
- package/dist/types-o7xo7VgH.mjs.map +0 -1
- package/dist/validate-Bs_wT2ul.mjs.map +0 -1
- package/dist/validate-CdYcY-Ln.d.mts.map +0 -1
- package/dist/validate-VPnKoIzW.mjs.map +0 -1
- package/dist/version-Bdfb34kk.mjs +0 -7
- package/dist/zod-generator-DMzfga3g.mjs.map +0 -1
- /package/dist/{api-tokens-CEsW_jCg.mjs → api-tokens-CyTsLszZ.mjs} +0 -0
- /package/dist/{ssrf-BB__xfNM.mjs → ssrf-DpXgKsna.mjs} +0 -0
- /package/dist/{types-CK0LxPUQ.mjs → types-CP1CflWf.mjs} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-refresh-DNERP4-f.mjs","names":["isRecord","isRecord","isRecord","readString"],"sources":["../src/media/usage/projection-fingerprint.ts","../src/database/repositories/media-usage.ts","../src/media/usage/types.ts","../src/media/usage/content-fields.ts","../src/media/usage/extractor.ts","../src/media/usage/source-key.ts","../src/media/usage/content-snapshots.ts","../src/media/usage/content-refresh.ts"],"sourcesContent":["import type {\n\tMediaUsageOccurrenceInput,\n\tMediaUsageSourceInput,\n} from \"../../database/repositories/media-usage.js\";\nimport type { MediaUsageExtractionField } from \"./types.js\";\n\nexport const MEDIA_USAGE_PROJECTION_FINGERPRINT_VERSION = 1;\nconst FINGERPRINT_PREFIX = `media-usage-projection:v${MEDIA_USAGE_PROJECTION_FINGERPRINT_VERSION}:sha256:`;\nconst FINGERPRINT_PATTERN = new RegExp(`^${FINGERPRINT_PREFIX}[a-f0-9]{64}$`);\n\nexport interface MediaUsageProjectionFingerprintInput {\n\tcollectionId: string;\n\tsource: MediaUsageSourceInput;\n\toccurrences: readonly MediaUsageOccurrenceInput[];\n\textractionFields: readonly MediaUsageExtractionField[];\n}\n\nexport interface MediaUsageProjectionFingerprint {\n\tfingerprint: string;\n\tbyteLength: number;\n}\n\nexport async function buildMediaUsageProjectionFingerprint(\n\tinput: MediaUsageProjectionFingerprintInput,\n): Promise<MediaUsageProjectionFingerprint> {\n\tif (!input.collectionId) {\n\t\tthrow new Error(\"Media usage projection fingerprints require a collection identity\");\n\t}\n\tconst canonicalOccurrences = input.occurrences\n\t\t.map((occurrence) => ({\n\t\t\tfieldSlug: occurrence.fieldSlug,\n\t\t\tfieldPath: occurrence.fieldPath,\n\t\t\toccurrenceIndex: occurrence.occurrenceIndex ?? 0,\n\t\t\treferenceType: occurrence.referenceType,\n\t\t\tmediaId: occurrence.mediaId,\n\t\t\tprovider: occurrence.provider,\n\t\t\tproviderAssetId: occurrence.providerAssetId,\n\t\t\tmediaKind: occurrence.mediaKind ?? null,\n\t\t\tmimeType: occurrence.mimeType ?? null,\n\t\t}))\n\t\t.map((occurrence) => ({ occurrence, key: canonicalJson(occurrence) }))\n\t\t.toSorted((a, b) => compareCanonicalStrings(a.key, b.key))\n\t\t.map(({ occurrence }) => occurrence);\n\treturn buildCanonicalSha256Fingerprint(FINGERPRINT_PREFIX, {\n\t\tfingerprintVersion: MEDIA_USAGE_PROJECTION_FINGERPRINT_VERSION,\n\t\tcollectionId: input.collectionId,\n\t\textractionSchema: normalizeExtractionFields(input.extractionFields),\n\t\tsource: {\n\t\t\tsourceKey: input.source.sourceKey,\n\t\t\tsourceType: input.source.sourceType,\n\t\t\tcollectionSlug: input.source.collectionSlug ?? null,\n\t\t\tcontentId: input.source.contentId ?? null,\n\t\t\tsourceVariant: input.source.sourceVariant,\n\t\t\tlocale: input.source.locale ?? null,\n\t\t\ttranslationGroup: input.source.translationGroup ?? null,\n\t\t\tcontentSlug: input.source.contentSlug ?? null,\n\t\t\tcontentTitle: input.source.contentTitle ?? null,\n\t\t\tcontentStatus: input.source.contentStatus ?? null,\n\t\t\tcontentScheduledAt: input.source.contentScheduledAt ?? null,\n\t\t\tcontentDeletedAt: input.source.contentDeletedAt ?? null,\n\t\t\trevisionId: input.source.revisionId ?? null,\n\t\t\tschemaVersion: input.source.schemaVersion ?? 1,\n\t\t\tsourceCompleteness: input.source.sourceCompleteness ?? \"complete\",\n\t\t},\n\t\toccurrences: canonicalOccurrences,\n\t});\n}\n\nexport async function buildCanonicalSha256Fingerprint(\n\tprefix: string,\n\tpayload: unknown,\n): Promise<MediaUsageProjectionFingerprint> {\n\tconst encodedPayload = new TextEncoder().encode(canonicalJson(payload));\n\tconst digest = await crypto.subtle.digest(\"SHA-256\", encodedPayload);\n\tconst hex = Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\n\t\t\"\",\n\t);\n\treturn {\n\t\tfingerprint: `${prefix}${hex}`,\n\t\tbyteLength: encodedPayload.byteLength,\n\t};\n}\n\nfunction normalizeExtractionFields(\n\tfields: readonly MediaUsageExtractionField[],\n): Record<string, unknown>[] {\n\treturn fields\n\t\t.map((field) => {\n\t\t\tif (field.type !== \"repeater\") return { slug: field.slug, type: field.type };\n\t\t\treturn {\n\t\t\t\tslug: field.slug,\n\t\t\t\ttype: field.type,\n\t\t\t\tsubFields: (field.validation?.subFields ?? [])\n\t\t\t\t\t.map((subField) => ({ slug: subField.slug, type: subField.type }))\n\t\t\t\t\t.toSorted((a, b) => compareCanonicalStrings(a.slug, b.slug)),\n\t\t\t};\n\t\t})\n\t\t.toSorted((a, b) => compareCanonicalStrings(String(a.slug), String(b.slug)));\n}\n\nfunction compareCanonicalStrings(a: string, b: string): number {\n\treturn a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport function isMediaUsageProjectionFingerprint(value: string | null | undefined): boolean {\n\treturn typeof value === \"string\" && FINGERPRINT_PATTERN.test(value);\n}\n\nfunction canonicalJson(value: unknown): string {\n\treturn JSON.stringify(canonicalize(value));\n}\n\nfunction canonicalize(value: unknown): unknown {\n\tif (value === undefined) return null;\n\tif (typeof value === \"bigint\") return value.toString();\n\tif (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n\tif (Array.isArray(value)) return value.map((item) => canonicalize(item));\n\tif (!isRecord(value)) return value;\n\n\tconst canonical: Record<string, unknown> = {};\n\tfor (const key of Object.keys(value).toSorted()) {\n\t\tcanonical[key] = canonicalize(value[key]);\n\t}\n\treturn canonical;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import {\n\tsql,\n\ttype ExpressionBuilder,\n\ttype Kysely,\n\ttype RawBuilder,\n\ttype Selectable,\n\ttype Transaction,\n\ttype Updateable,\n} from \"kysely\";\nimport { ulid } from \"ulidx\";\n\nimport { isMediaUsageProjectionFingerprint } from \"../../media/usage/projection-fingerprint.js\";\nimport type { MediaUsageContentSourceVariant } from \"../../media/usage/source-key.js\";\nimport type { MediaKind, MediaUsageReferenceType } from \"../../media/usage/types.js\";\nimport { chunks, SQL_BATCH_SIZE } from \"../../utils/chunks.js\";\nimport { isPostgres } from \"../dialect-helpers.js\";\nimport { withTransaction } from \"../transaction.js\";\nimport type {\n\tDatabase,\n\tMediaUsageIndexStatusTable,\n\tMediaUsageSourceTable,\n\tMediaUsageTable,\n} from \"../types.js\";\nimport { validateIdentifier } from \"../validate.js\";\nimport { decodeCursor, encodeCursor, InvalidCursorError, type FindManyResult } from \"./types.js\";\n\ntype DatabaseExecutor = Kysely<Database> | Transaction<Database>;\ntype MediaUsageSourceNullableStringColumn =\n\t| \"collection_id\"\n\t| \"source_fingerprint\"\n\t| \"source_updated_at\"\n\t| \"revision_id\"\n\t| \"updated_at\"\n\t| \"last_attempted_at\"\n\t| \"last_error_code\";\nconst OCCURRENCE_BIND_COLUMNS = 13;\nexport const MEDIA_USAGE_GENERATION_WRITE_LEASE_MS = 60 * 60 * 1000;\nconst OCCURRENCE_INSERT_BATCH_SIZE = Math.max(\n\t1,\n\tMath.floor(SQL_BATCH_SIZE / OCCURRENCE_BIND_COLUMNS),\n);\n\nfunction cleanupDeleteBatchSize(cleanupLease: MediaUsageCleanupLease | undefined): number {\n\treturn cleanupLease ? SQL_BATCH_SIZE - 3 : SQL_BATCH_SIZE;\n}\n\nfunction canIssueCleanupStatement(canIssueStatement: (() => boolean) | undefined): boolean {\n\treturn canIssueStatement?.() ?? true;\n}\n\nfunction cleanupDurationSeconds(value: number): number {\n\tif (!Number.isSafeInteger(value) || value < 0) {\n\t\tthrow new Error(\"Media usage cleanup duration must be a non-negative whole number of seconds\");\n\t}\n\treturn value;\n}\n\nconst CONTENT_SOURCE_ELIGIBILITY = sql<boolean>`(\n\ts.source_variant = 'draft_overlay'\n\tOR (\n\t\ts.source_variant = 'columns'\n\t\tAND (\n\t\t\ts.content_status = 'published'\n\t\t\tOR NOT EXISTS (\n\t\t\t\tSELECT 1\n\t\t\t\tFROM _emdash_media_usage_sources AS overlay\n\t\t\t\tWHERE overlay.source_type = 'content'\n\t\t\t\t\tAND overlay.collection_slug = s.collection_slug\n\t\t\t\t\tAND overlay.content_id = s.content_id\n\t\t\t\t\tAND overlay.source_variant = 'draft_overlay'\n\t\t\t\t\tAND ${contentSourceMatchesActiveCollection(\"overlay\", \"s.collection_id\")}\n\t\t\t)\n\t\t)\n\t)\n)`;\n\ntype ContentSourceAlias = \"deleted_source\" | \"overlay\" | \"s\" | \"state\";\ntype CurrentCollectionIdReference = \"collection.id\" | \"page.collection_id\" | \"s.collection_id\";\n\nfunction contentSourceMatchesActiveCollection(\n\tsource: ContentSourceAlias,\n\tcurrentCollectionId: CurrentCollectionIdReference,\n): RawBuilder<boolean> {\n\treturn sql<boolean>`(\n\t\tNOT EXISTS (\n\t\t\tSELECT 1\n\t\t\tFROM _emdash_media_usage_activation AS activation\n\t\t\tWHERE activation.task_key = 'incremental_capture'\n\t\t\t\tAND activation.state = 'active'\n\t\t)\n\t\tOR (\n\t\t\t${sql.ref(`${source}.collection_id`)} = ${sql.ref(currentCollectionId)}\n\t\t\tAND ${sql.ref(`${source}.identity_version`)} = 1\n\t\t)\n\t)`;\n}\n\nexport interface MediaUsageSourceInput {\n\tsourceKey: string;\n\tsourceType: string;\n\tcollectionId?: string | null;\n\tcollectionSlug?: string | null;\n\tcontentId?: string | null;\n\tsourceVariant: MediaUsageContentSourceVariant;\n\tlocale?: string | null;\n\ttranslationGroup?: string | null;\n\tcontentSlug?: string | null;\n\tcontentTitle?: string | null;\n\tcontentStatus?: string | null;\n\tcontentScheduledAt?: string | null;\n\tcontentDeletedAt?: string | null;\n\trevisionId?: string | null;\n\tschemaVersion?: number;\n\tsourceUpdatedAt?: string | null;\n\tsourceVersion?: number | null;\n\tsourceFingerprint?: string | null;\n\tidentityVersion?: number | null;\n\tsourceCompleteness?: MediaUsageSourceCompleteness;\n\tlastAttemptedAt?: string | null;\n\tlastErrorCode?: string | null;\n}\n\nexport interface MediaUsageOccurrenceInput {\n\tfieldSlug: string;\n\tfieldPath: string;\n\toccurrenceIndex?: number;\n\treferenceType: MediaUsageReferenceType;\n\tmediaId: string | null;\n\tprovider: string;\n\tproviderAssetId: string;\n\tmediaKind?: MediaKind | null;\n\tmimeType?: string | null;\n}\n\nexport interface MediaUsageSource {\n\tsourceKey: string;\n\tsourceType: string;\n\tcollectionId: string | null;\n\tcollectionSlug: string | null;\n\tcontentId: string | null;\n\tsourceVariant: string;\n\tlocale: string | null;\n\ttranslationGroup: string | null;\n\tcontentSlug: string | null;\n\tcontentTitle: string | null;\n\tcontentStatus: string | null;\n\tcontentScheduledAt: string | null;\n\tcontentDeletedAt: string | null;\n\trevisionId: string | null;\n\tcurrentGeneration: string;\n\tschemaVersion: number;\n\tsourceUpdatedAt: string | null;\n\tsourceVersion: number | null;\n\tsourceFingerprint: string | null;\n\tidentityVersion: number | null;\n\tsourceCompleteness: string;\n\tlastAttemptedAt: string | null;\n\tlastErrorCode: string | null;\n\tindexedAt: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface MediaUsageGuardedReplaceResult {\n\treplaced: boolean;\n\tunchanged: boolean;\n\t/** Populated only when a guarded replacement did not win the current source row. */\n\tsource: MediaUsageSource | null;\n}\n\nexport interface MediaUsageGuardedDeleteResult {\n\tdeleted: boolean;\n\tsource: MediaUsageSource | null;\n}\n\nexport interface MediaUsageGuardedAbsentDeleteResult extends MediaUsageGuardedDeleteResult {\n\tcontentPresent: boolean;\n}\n\nexport interface MediaUsageGuardedAttemptResult {\n\tattempted: boolean;\n\t/** Populated only when a guarded attempted mark did not win the current source row. */\n\tsource: MediaUsageSource | null;\n}\n\nexport interface MediaUsageSourceGenerationDeletionMeasurement {\n\toccurrenceCount: number;\n\toccurrenceBytes: number;\n\texceedsOccurrenceLimit: boolean;\n}\n\nexport interface MediaUsageCleanupCursor {\n\tcreatedAt: string;\n\tid: string;\n}\n\nexport interface MediaUsageCleanupClaim {\n\tleaseToken: string;\n\tcursor: MediaUsageCleanupCursor | null;\n\tclaimedAt: string;\n\tscanBeforeAt: string;\n\tconsecutiveFailures: number;\n}\n\nexport interface MediaUsageCleanupCandidate {\n\tid: string;\n\tsourceKey: string;\n\tgeneration: string;\n\tcreatedAt: string;\n\tcurrentGeneration: string | null;\n\tindexedAt: string | null;\n\twriteLeaseExpiresAt: string | null;\n}\n\nexport interface MediaUsageCleanupLease {\n\tleaseToken: string;\n}\n\nexport interface MediaUsageCleanupDeleteOptions {\n\tcandidateIds?: readonly string[];\n\tcleanupLease?: MediaUsageCleanupLease;\n\tcanIssueStatement?: () => boolean;\n}\n\nexport interface MediaUsageCleanupCompletion {\n\tleaseToken: string;\n\tnextCursor: MediaUsageCleanupCursor | null;\n\tsweepComplete: boolean;\n\tcandidateCount: number;\n\tdeletedOrphans: number;\n\tdeletedStale: number;\n\tdeletedAbandoned: number;\n\tdeletedWriteLeases: number;\n\tbacklogLowerBound: number;\n\tscanHasMore: boolean;\n\tdurationMs: number;\n}\n\nexport interface MediaUsageIndexStatusRepairInput extends MediaUsageIndexStatusIdentity {\n\trunToken: string;\n\tschemaVersion?: number;\n\tstartedAt: string;\n\tupdatedAt?: string;\n}\n\nexport interface MediaUsageIndexStatusFinalizeInput extends MediaUsageIndexStatusIdentity {\n\trunToken: string;\n\tstatus: Exclude<MediaUsageIndexStatusValue, \"never\" | \"running\" | \"stale\">;\n\tschemaVersion?: number;\n\tcompletedAt: string;\n\tindexedSourceCount?: number;\n\tfailedSourceCount?: number;\n\tlastErrorCode?: string | null;\n\tupdatedAt?: string;\n}\n\nexport interface MediaUsageIndexStatusEpochRepairInput extends MediaUsageIndexStatusIdentity {\n\tcollectionId: string;\n\trunToken: string;\n\tschemaVersion: number;\n}\n\nexport interface MediaUsageIndexStatusEpochRepairRun {\n\tchangeEpoch: number | string;\n\tstartedAt: string;\n}\n\nexport interface MediaUsageIndexStatusEpochFinalizeInput extends MediaUsageIndexStatusEpochRepairInput {\n\tstartingEpoch: number | string;\n\tstatus: Exclude<MediaUsageIndexStatusValue, \"never\" | \"running\" | \"stale\">;\n\tindexedSourceCount: number;\n\tfailedSourceCount: number;\n\tlastErrorCode: string | null;\n}\n\nexport interface MediaUsageIncrementalStatusIdentity {\n\tcollectionId: string;\n\tcollectionSlug: string;\n}\n\nexport interface MediaUsageGuardedIndexStatusResult {\n\tfinalized: boolean;\n\tstatus: MediaUsageIndexStatus | null;\n}\n\nexport type MediaUsageSourceCompleteness =\n\t| \"unknown\"\n\t| \"complete\"\n\t| \"partial\"\n\t| \"failed\"\n\t| \"unsupported\";\n\nexport type MediaUsageIndexStatusValue =\n\t| \"never\"\n\t| \"running\"\n\t| \"complete\"\n\t| \"partial\"\n\t| \"failed\"\n\t| \"stale\";\n\nexport interface MediaUsageIndexStatusIdentity {\n\tadapterId: string;\n\tscopeType: string;\n\tscopeKey: string;\n}\n\nexport interface MediaUsageIndexStatusInput extends MediaUsageIndexStatusIdentity {\n\tstatus: MediaUsageIndexStatusValue;\n\tschemaVersion?: number;\n\tstartedAt?: string | null;\n\tcompletedAt?: string | null;\n\tcursor?: string | null;\n\tindexedSourceCount?: number;\n\tfailedSourceCount?: number;\n\tlastErrorCode?: string | null;\n\tupdatedAt?: string;\n}\n\nexport interface MediaUsageIndexStatus extends MediaUsageIndexStatusIdentity {\n\tstatus: string;\n\tschemaVersion: number;\n\tstartedAt: string | null;\n\tcompletedAt: string | null;\n\tcursor: string | null;\n\tindexedSourceCount: number;\n\tfailedSourceCount: number;\n\tlastErrorCode: string | null;\n\tupdatedAt: string;\n}\n\nexport interface FindMediaUsageOptions {\n\tlimit?: number;\n\tcursor?: string;\n}\n\nexport interface MediaUsageCollectionIndexStatusScope {\n\tcollectionSlug: string;\n\tstatus: string | null;\n\tschemaVersion: number | null;\n\treconciliationRequired: boolean;\n}\n\nexport interface MediaUsageEntrySource {\n\tsource: MediaUsageSource;\n\toccurrences: MediaUsageOccurrence[];\n}\n\nexport interface MediaUsageEntryGroup {\n\tcollectionSlug: string;\n\tcontentId: string;\n\tcontentDeletedAt: string | null;\n\tsources: MediaUsageEntrySource[];\n}\n\ninterface MediaUsageSourceRow {\n\tsource_key: string;\n\tsource_type: string;\n\tcollection_id: string | null;\n\tcollection_slug: string | null;\n\tcontent_id: string | null;\n\tsource_variant: string;\n\tlocale: string | null;\n\ttranslation_group: string | null;\n\tcontent_slug: string | null;\n\tcontent_title: string | null;\n\tcontent_status: string | null;\n\tcontent_scheduled_at: string | null;\n\tcontent_deleted_at: string | null;\n\trevision_id: string | null;\n\tcurrent_generation: string;\n\tschema_version: number;\n\tsource_updated_at: string | null;\n\tsource_version: number | null;\n\tsource_fingerprint: string | null;\n\tidentity_version: number | null;\n\tsource_completeness: string;\n\tlast_attempted_at: string | null;\n\tlast_error_code: string | null;\n\tindexed_at: string;\n\tcreated_at: string;\n\tupdated_at: string;\n}\n\nexport interface MediaUsageOccurrence {\n\tid: string;\n\tsourceKey: string;\n\tgeneration: string;\n\tfieldSlug: string;\n\tfieldPath: string;\n\toccurrenceIndex: number;\n\treferenceType: string;\n\tmediaId: string | null;\n\tprovider: string;\n\tproviderAssetId: string;\n\tmediaKind: string | null;\n\tmimeType: string | null;\n\tcreatedAt: string;\n}\n\nexport interface MediaUsageRecord {\n\tsource: MediaUsageSource;\n\toccurrence: MediaUsageOccurrence;\n}\n\ninterface JoinedUsageRow {\n\tsource_key: string;\n\tsource_type: string;\n\tcollection_id: string | null;\n\tcollection_slug: string | null;\n\tcontent_id: string | null;\n\tsource_variant: string;\n\tlocale: string | null;\n\ttranslation_group: string | null;\n\tcontent_slug: string | null;\n\tcontent_title: string | null;\n\tcontent_status: string | null;\n\tcontent_scheduled_at: string | null;\n\tcontent_deleted_at: string | null;\n\trevision_id: string | null;\n\tcurrent_generation: string;\n\tschema_version: number;\n\tsource_updated_at: string | null;\n\tsource_version: number | null;\n\tsource_fingerprint: string | null;\n\tidentity_version: number | null;\n\tsource_completeness: string;\n\tlast_attempted_at: string | null;\n\tlast_error_code: string | null;\n\tindexed_at: string;\n\tsource_created_at: string;\n\tsource_row_updated_at: string;\n\toccurrence_id: string;\n\tgeneration: string;\n\tfield_slug: string;\n\tfield_path: string;\n\toccurrence_index: number;\n\treference_type: string;\n\tmedia_id: string | null;\n\tprovider: string;\n\tprovider_asset_id: string;\n\tmedia_kind: string | null;\n\tmime_type: string | null;\n\toccurrence_created_at: string;\n}\n\ninterface GroupedUsageRow extends JoinedUsageRow {\n\tentry_deleted_at: string | null;\n\thas_more: number;\n}\n\n/** Persistence-only repository for the internal media usage projection tables. */\nexport class MediaUsageRepository {\n\tconstructor(private db: Kysely<Database>) {}\n\n\tasync replaceSource(\n\t\tsource: MediaUsageSourceInput,\n\t\toccurrences: readonly MediaUsageOccurrenceInput[],\n\t): Promise<MediaUsageSource> {\n\t\tconst generation = ulid();\n\n\t\tconst admitted = await this.withGenerationWriteLease(\n\t\t\tsource,\n\t\t\tgeneration,\n\t\t\tasync (leaseToken, now) => {\n\t\t\t\tawait withTransaction(this.db, async (trx) => {\n\t\t\t\t\tif (!(await this.lockCanonicalSourceCollection(trx, source))) {\n\t\t\t\t\t\tthrow new Error(`Media usage collection is no longer current for ${source.sourceKey}`);\n\t\t\t\t\t}\n\t\t\t\t\tawait this.insertOccurrences(trx, source.sourceKey, generation, occurrences, now);\n\t\t\t\t\tconst promoted = await this.upsertSource(trx, source, generation, now, leaseToken);\n\t\t\t\t\tif (!promoted) {\n\t\t\t\t\t\tthrow new Error(`Media usage generation lease expired for ${source.sourceKey}`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t\tif (!admitted) {\n\t\t\tthrow new Error(`Media usage collection is no longer current for ${source.sourceKey}`);\n\t\t}\n\n\t\tconst replaced = await this.findSource(source.sourceKey);\n\t\tif (!replaced) {\n\t\t\tthrow new Error(`Media usage source ${source.sourceKey} was not persisted`);\n\t\t}\n\t\treturn replaced;\n\t}\n\tasync replaceSourceIfCurrent(\n\t\tsource: MediaUsageSourceInput,\n\t\toccurrences: readonly MediaUsageOccurrenceInput[],\n\t\texpectedCurrentGeneration: string | null,\n\t): Promise<MediaUsageGuardedReplaceResult> {\n\t\tif (\n\t\t\texpectedCurrentGeneration !== null &&\n\t\t\t(await this.projectionMatchesCurrentGeneration(source, expectedCurrentGeneration))\n\t\t) {\n\t\t\treturn { replaced: false, unchanged: true, source: null };\n\t\t}\n\t\tconst generation = ulid();\n\t\tlet replaced = false;\n\n\t\tawait this.withGenerationWriteLease(source, generation, async (leaseToken, now) => {\n\t\t\tconst row = this.buildSourceRow(source, generation, now);\n\t\t\tawait withTransaction(this.db, async (trx) => {\n\t\t\t\tif (!(await this.lockCanonicalSourceCollection(trx, source))) return;\n\t\t\t\tawait this.insertOccurrences(trx, source.sourceKey, generation, occurrences, now);\n\t\t\t\tif (expectedCurrentGeneration === null) {\n\t\t\t\t\treplaced = await this.insertSourceIfAbsent(trx, row, leaseToken);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treplaced = await this.updateSourceIfGeneration(\n\t\t\t\t\ttrx,\n\t\t\t\t\trow,\n\t\t\t\t\texpectedCurrentGeneration,\n\t\t\t\t\tleaseToken,\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\treturn {\n\t\t\treplaced,\n\t\t\tunchanged: false,\n\t\t\tsource: replaced ? null : await this.findSource(source.sourceKey),\n\t\t};\n\t}\n\n\tasync findSource(sourceKey: string): Promise<MediaUsageSource | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources\")\n\t\t\t.selectAll()\n\t\t\t.where(\"source_key\", \"=\", sourceKey)\n\t\t\t.executeTakeFirst();\n\n\t\treturn row ? rowToSource(row) : null;\n\t}\n\n\tasync findSources(sourceKeys: readonly string[]): Promise<Map<string, MediaUsageSource>> {\n\t\tconst uniqueSourceKeys = [...new Set(sourceKeys)];\n\t\tconst sources = new Map<string, MediaUsageSource>();\n\t\tif (uniqueSourceKeys.length === 0) return sources;\n\n\t\tfor (const sourceKeyBatch of chunks(uniqueSourceKeys, SQL_BATCH_SIZE)) {\n\t\t\tconst rows = await this.db\n\t\t\t\t.selectFrom(\"_emdash_media_usage_sources\")\n\t\t\t\t.selectAll()\n\t\t\t\t.where(\"source_key\", \"in\", sourceKeyBatch)\n\t\t\t\t.execute();\n\t\t\tfor (const row of rows) {\n\t\t\t\tconst source = rowToSource(row);\n\t\t\t\tsources.set(source.sourceKey, source);\n\t\t\t}\n\t\t}\n\n\t\treturn sources;\n\t}\n\n\tasync measureSourceGenerationDeletion(\n\t\tsourceKey: string,\n\t\tgeneration: string,\n\t\tmaxOccurrences: number,\n\t): Promise<MediaUsageSourceGenerationDeletionMeasurement> {\n\t\tif (!Number.isSafeInteger(maxOccurrences) || maxOccurrences < 0) {\n\t\t\tthrow new Error(\"Media usage deletion measurement requires a non-negative row limit\");\n\t\t}\n\t\tconst payload = sql<string>`\n\t\t\tCOALESCE(field_slug, '') || COALESCE(field_path, '') ||\n\t\t\tCOALESCE(reference_type, '') || COALESCE(media_id, '') ||\n\t\t\tCOALESCE(provider, '') || COALESCE(provider_asset_id, '') ||\n\t\t\tCOALESCE(media_kind, '') || COALESCE(mime_type, '')\n\t\t`;\n\t\tconst occurrenceBytes = isPostgres(this.db)\n\t\t\t? sql<number>`octet_length(${payload})`\n\t\t\t: sql<number>`length(CAST(${payload} AS BLOB))`;\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage\")\n\t\t\t.select(occurrenceBytes.as(\"occurrence_bytes\"))\n\t\t\t.where(\"source_key\", \"=\", sourceKey)\n\t\t\t.where(\"generation\", \"=\", generation)\n\t\t\t.limit(maxOccurrences + 1)\n\t\t\t.execute();\n\n\t\treturn {\n\t\t\toccurrenceCount: rows.length,\n\t\t\toccurrenceBytes: rows.reduce((total, row) => total + Number(row.occurrence_bytes), 0),\n\t\t\texceedsOccurrenceLimit: rows.length > maxOccurrences,\n\t\t};\n\t}\n\n\tasync replaceSourceIfMatching(\n\t\tsource: MediaUsageSourceInput,\n\t\toccurrences: readonly MediaUsageOccurrenceInput[],\n\t\texpectedSource: MediaUsageSource | null,\n\t): Promise<MediaUsageGuardedReplaceResult> {\n\t\tif (\n\t\t\texpectedSource !== null &&\n\t\t\t(await this.projectionMatchesExpectedSource(source, expectedSource))\n\t\t) {\n\t\t\treturn { replaced: false, unchanged: true, source: null };\n\t\t}\n\t\tconst generation = ulid();\n\t\tlet replaced = false;\n\n\t\tawait this.withGenerationWriteLease(source, generation, async (leaseToken, now) => {\n\t\t\tconst row = this.buildSourceRow(source, generation, now);\n\t\t\tawait withTransaction(this.db, async (trx) => {\n\t\t\t\tif (!(await this.lockCanonicalSourceCollection(trx, source))) return;\n\t\t\t\tawait this.insertOccurrences(trx, source.sourceKey, generation, occurrences, now);\n\t\t\t\tif (expectedSource === null) {\n\t\t\t\t\treplaced = await this.insertSourceIfAbsent(trx, row, leaseToken);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treplaced = await this.updateSourceIfMatching(trx, row, expectedSource, leaseToken);\n\t\t\t});\n\t\t});\n\n\t\treturn {\n\t\t\treplaced,\n\t\t\tunchanged: false,\n\t\t\tsource: replaced ? null : await this.findSource(source.sourceKey),\n\t\t};\n\t}\n\n\tasync markSourceAttempted(source: MediaUsageSourceInput): Promise<MediaUsageSource> {\n\t\tif (source.collectionId !== undefined && source.collectionId !== null) {\n\t\t\tconst expectedSource = await this.findSource(source.sourceKey);\n\t\t\tconst result = await this.markSourceAttemptedIfMatching(source, expectedSource);\n\t\t\tif (!result.attempted) {\n\t\t\t\tthrow new Error(`Canonical media usage source ${source.sourceKey} is no longer current`);\n\t\t\t}\n\t\t\tconst attempted = await this.findSource(source.sourceKey);\n\t\t\tif (!attempted) {\n\t\t\t\tthrow new Error(`Media usage source ${source.sourceKey} was not persisted`);\n\t\t\t}\n\t\t\treturn attempted;\n\t\t}\n\n\t\tconst generation = ulid();\n\t\tawait this.withGenerationWriteLease(source, generation, async (leaseToken, now) => {\n\t\t\tconst row = this.buildAttemptedSourceRow(source, generation, now);\n\t\t\tconst updates = this.attemptedSourceUpdateSet(source, row);\n\t\t\tconst result = await this.db\n\t\t\t\t.insertInto(\"_emdash_media_usage_sources\")\n\t\t\t\t.values(row)\n\t\t\t\t.onConflict((oc) => oc.column(\"source_key\").doUpdateSet(updates))\n\t\t\t\t.executeTakeFirst();\n\t\t\tif ((result.numInsertedOrUpdatedRows ?? 0n) <= 0n) {\n\t\t\t\tthrow new Error(`Media usage generation lease expired for ${source.sourceKey}`);\n\t\t\t}\n\t\t});\n\n\t\tconst attempted = await this.findSource(source.sourceKey);\n\t\tif (!attempted) {\n\t\t\tthrow new Error(`Media usage source ${source.sourceKey} was not persisted`);\n\t\t}\n\t\treturn attempted;\n\t}\n\n\tasync markSourceAttemptedIfMatching(\n\t\tsource: MediaUsageSourceInput,\n\t\texpectedSource: MediaUsageSource | null,\n\t): Promise<MediaUsageGuardedAttemptResult> {\n\t\tconst generation = ulid();\n\t\tlet attempted = false;\n\n\t\tif (expectedSource === null) {\n\t\t\tawait this.withGenerationWriteLease(source, generation, async (leaseToken, now) => {\n\t\t\t\tconst row = this.buildAttemptedSourceRow(source, generation, now);\n\t\t\t\tawait withTransaction(this.db, async (trx) => {\n\t\t\t\t\tif (!(await this.lockCanonicalSourceCollection(trx, source))) return;\n\t\t\t\t\tattempted = await this.persistSourceIfWriteLease(\n\t\t\t\t\t\ttrx,\n\t\t\t\t\t\trow,\n\t\t\t\t\t\tleaseToken,\n\t\t\t\t\t\tsql`ON CONFLICT (source_key) DO NOTHING`,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\tconst row = this.buildAttemptedSourceRow(source, generation, new Date().toISOString());\n\t\t\tawait withTransaction(this.db, async (trx) => {\n\t\t\t\tif (!(await this.lockCanonicalSourceCollection(trx, source))) return;\n\t\t\t\tattempted = await this.updateAttemptedSourceIfMatching(trx, source, row, expectedSource);\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tattempted,\n\t\t\tsource: attempted ? null : await this.findSource(source.sourceKey),\n\t\t};\n\t}\n\n\tasync findActiveEntryCountsByMediaIds(mediaIds: readonly string[]): Promise<Map<string, number>> {\n\t\tconst uniqueMediaIds = [...new Set(mediaIds)];\n\t\tconst counts = new Map(uniqueMediaIds.map((mediaId) => [mediaId, 0]));\n\n\t\tfor (const mediaIdBatch of chunks(uniqueMediaIds, SQL_BATCH_SIZE)) {\n\t\t\tconst visibleEntries = this.currentContentMediaUsageBaseQuery()\n\t\t\t\t.select([\n\t\t\t\t\t\"u.media_id as media_id\",\n\t\t\t\t\t\"s.collection_slug as collection_slug\",\n\t\t\t\t\t\"s.content_id as content_id\",\n\t\t\t\t])\n\t\t\t\t.where(\"u.media_id\", \"in\", mediaIdBatch)\n\t\t\t\t.where((eb) =>\n\t\t\t\t\teb.not(\n\t\t\t\t\t\teb.exists(\n\t\t\t\t\t\t\teb\n\t\t\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_sources as deleted_source\")\n\t\t\t\t\t\t\t\t.select(\"deleted_source.source_key\")\n\t\t\t\t\t\t\t\t.where(\"deleted_source.source_type\", \"=\", \"content\")\n\t\t\t\t\t\t\t\t.whereRef(\"deleted_source.collection_slug\", \"=\", \"s.collection_slug\")\n\t\t\t\t\t\t\t\t.whereRef(\"deleted_source.content_id\", \"=\", \"s.content_id\")\n\t\t\t\t\t\t\t\t.where(\"deleted_source.source_variant\", \"in\", [\"columns\", \"draft_overlay\"])\n\t\t\t\t\t\t\t\t.where(contentSourceMatchesActiveCollection(\"deleted_source\", \"collection.id\"))\n\t\t\t\t\t\t\t\t.where(\"deleted_source.content_deleted_at\", \"is not\", null),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.distinct()\n\t\t\t\t.as(\"visible_entries\");\n\n\t\t\tconst rows = await this.db\n\t\t\t\t.selectFrom(visibleEntries)\n\t\t\t\t.select(\"media_id\")\n\t\t\t\t.select((eb) => eb.fn.countAll<number>().as(\"usage_count\"))\n\t\t\t\t.groupBy(\"media_id\")\n\t\t\t\t.execute();\n\n\t\t\tfor (const row of rows) {\n\t\t\t\tif (row.media_id !== null) counts.set(row.media_id, Number(row.usage_count));\n\t\t\t}\n\t\t}\n\n\t\treturn counts;\n\t}\n\n\tasync findCollectionIndexStatusScopes(\n\t\tidentity: Pick<MediaUsageIndexStatusIdentity, \"adapterId\" | \"scopeType\">,\n\t): Promise<MediaUsageCollectionIndexStatusScope[]> {\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_collections as collection\")\n\t\t\t.leftJoin(\"_emdash_media_usage_index_status as status\", (join) =>\n\t\t\t\tjoin\n\t\t\t\t\t.on(\"status.adapter_id\", \"=\", identity.adapterId)\n\t\t\t\t\t.on(\"status.scope_type\", \"=\", identity.scopeType)\n\t\t\t\t\t.onRef(\"status.scope_key\", \"=\", \"collection.slug\"),\n\t\t\t)\n\t\t\t.select([\n\t\t\t\t\"collection.slug as collection_slug\",\n\t\t\t\t\"status.status as status\",\n\t\t\t\t\"status.schema_version as schema_version\",\n\t\t\t\t\"status.reconciliation_required as reconciliation_required\",\n\t\t\t])\n\t\t\t.orderBy(\"collection.slug\", \"asc\")\n\t\t\t.execute();\n\n\t\treturn rows.map((row) => ({\n\t\t\tcollectionSlug: row.collection_slug,\n\t\t\tstatus: row.status,\n\t\t\tschemaVersion: row.schema_version === null ? null : Number(row.schema_version),\n\t\t\treconciliationRequired:\n\t\t\t\trow.reconciliation_required !== null && Number(row.reconciliation_required) !== 0,\n\t\t}));\n\t}\n\n\tasync findCurrentEntryUsagePageByMediaId(\n\t\tmediaId: string,\n\t\toptions: FindMediaUsageOptions = {},\n\t): Promise<FindManyResult<MediaUsageEntryGroup>> {\n\t\tconst requestedLimit = Math.floor(options.limit ?? 50);\n\t\tconst limit = Number.isFinite(requestedLimit) ? Math.min(Math.max(1, requestedLimit), 100) : 50;\n\t\tconst cursor = options.cursor ? decodeCursor(options.cursor) : null;\n\t\tif (cursor && (cursor.orderValue.length === 0 || cursor.id.length === 0)) {\n\t\t\tthrow new InvalidCursorError(options.cursor ?? \"\");\n\t\t}\n\t\tlet matchedGroups = this.currentContentMediaUsageBaseQuery()\n\t\t\t.select([\n\t\t\t\t\"collection.id as collection_id\",\n\t\t\t\t\"s.collection_slug as collection_slug\",\n\t\t\t\t\"s.content_id as content_id\",\n\t\t\t])\n\t\t\t.where(\"u.media_id\", \"=\", mediaId)\n\t\t\t.distinct();\n\t\tif (cursor) {\n\t\t\tmatchedGroups = matchedGroups.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb(\"s.collection_slug\", \">\", cursor.orderValue),\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"s.collection_slug\", \"=\", cursor.orderValue),\n\t\t\t\t\t\teb(\"s.content_id\", \">\", cursor.id),\n\t\t\t\t\t]),\n\t\t\t\t]),\n\t\t\t);\n\t\t}\n\t\tmatchedGroups = matchedGroups\n\t\t\t.orderBy(\"s.collection_slug\", \"asc\")\n\t\t\t.orderBy(\"s.content_id\", \"asc\")\n\t\t\t.limit(limit + 1);\n\n\t\tconst rows: GroupedUsageRow[] = await this.db\n\t\t\t.with(\"matched_groups\", () => matchedGroups)\n\t\t\t.with(\"page_groups\", (db) =>\n\t\t\t\tdb\n\t\t\t\t\t.selectFrom(\"matched_groups\")\n\t\t\t\t\t.selectAll()\n\t\t\t\t\t.orderBy(\"collection_slug\", \"asc\")\n\t\t\t\t\t.orderBy(\"content_id\", \"asc\")\n\t\t\t\t\t.limit(limit),\n\t\t\t)\n\t\t\t.with(\"entry_state\", (db) =>\n\t\t\t\tdb\n\t\t\t\t\t.selectFrom(\"page_groups as page\")\n\t\t\t\t\t.crossJoin(\"_emdash_media_usage_sources as state\")\n\t\t\t\t\t.select([\"page.collection_id\", \"page.collection_slug\", \"page.content_id\"])\n\t\t\t\t\t.select((eb) =>\n\t\t\t\t\t\teb.fn.max<string | null>(\"state.content_deleted_at\").as(\"entry_deleted_at\"),\n\t\t\t\t\t)\n\t\t\t\t\t.whereRef(\"page.collection_slug\", \"=\", \"state.collection_slug\")\n\t\t\t\t\t.whereRef(\"page.content_id\", \"=\", \"state.content_id\")\n\t\t\t\t\t.where(\"state.source_type\", \"=\", \"content\")\n\t\t\t\t\t.where(\"state.source_variant\", \"in\", [\"columns\", \"draft_overlay\"])\n\t\t\t\t\t.where(contentSourceMatchesActiveCollection(\"state\", \"page.collection_id\"))\n\t\t\t\t\t.groupBy([\"page.collection_id\", \"page.collection_slug\", \"page.content_id\"]),\n\t\t\t)\n\t\t\t.selectFrom(\"entry_state as page\")\n\t\t\t.crossJoin(\"_emdash_media_usage_sources as s\")\n\t\t\t.crossJoin(\"_emdash_media_usage as u\")\n\t\t\t.whereRef(\"page.collection_slug\", \"=\", \"s.collection_slug\")\n\t\t\t.whereRef(\"page.content_id\", \"=\", \"s.content_id\")\n\t\t\t.where(contentSourceMatchesActiveCollection(\"s\", \"page.collection_id\"))\n\t\t\t.whereRef(\"s.source_key\", \"=\", \"u.source_key\")\n\t\t\t.whereRef(\"s.current_generation\", \"=\", \"u.generation\")\n\t\t\t.select(currentUsageSelect)\n\t\t\t.select(\"page.entry_deleted_at\")\n\t\t\t.select(\n\t\t\t\tsql<number>`CASE\n\t\t\t\t\tWHEN (SELECT COUNT(*) FROM matched_groups) > ${limit} THEN 1\n\t\t\t\t\tELSE 0\n\t\t\t\tEND`.as(\"has_more\"),\n\t\t\t)\n\t\t\t.where(\"u.media_id\", \"=\", mediaId)\n\t\t\t.where(\"s.source_type\", \"=\", \"content\")\n\t\t\t.where(\"s.collection_slug\", \"is not\", null)\n\t\t\t.where(\"s.content_id\", \"is not\", null)\n\t\t\t.where(\"s.source_variant\", \"in\", [\"columns\", \"draft_overlay\"])\n\t\t\t.where(CONTENT_SOURCE_ELIGIBILITY)\n\t\t\t.orderBy(\"s.collection_slug\", \"asc\")\n\t\t\t.orderBy(\"s.content_id\", \"asc\")\n\t\t\t.orderBy(\"s.source_variant\", \"asc\")\n\t\t\t.orderBy(\"s.source_key\", \"asc\")\n\t\t\t.orderBy(\"u.field_path\", \"asc\")\n\t\t\t.orderBy(\"u.occurrence_index\", \"asc\")\n\t\t\t.orderBy(\"u.id\", \"asc\")\n\t\t\t.execute();\n\n\t\tconst items = groupUsageRows(rows);\n\t\tconst result: FindManyResult<MediaUsageEntryGroup> = { items };\n\t\tif (Number(rows[0]?.has_more ?? 0) === 1 && items.length > 0) {\n\t\t\tconst last = items.at(-1)!;\n\t\t\tresult.nextCursor = encodeCursor(last.collectionSlug, last.contentId);\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync findCurrentUsageByMediaId(mediaId: string): Promise<MediaUsageRecord[]> {\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources as s\")\n\t\t\t.innerJoin(\"_emdash_media_usage as u\", (join) =>\n\t\t\t\tjoin\n\t\t\t\t\t.onRef(\"u.source_key\", \"=\", \"s.source_key\")\n\t\t\t\t\t.onRef(\"u.generation\", \"=\", \"s.current_generation\"),\n\t\t\t)\n\t\t\t.select(currentUsageSelect)\n\t\t\t.where(\"u.media_id\", \"=\", mediaId)\n\t\t\t.orderBy(\"s.source_key\", \"asc\")\n\t\t\t.orderBy(\"u.field_path\", \"asc\")\n\t\t\t.orderBy(\"u.occurrence_index\", \"asc\")\n\t\t\t.execute();\n\n\t\treturn rows.map(rowToUsageRecord);\n\t}\n\n\tasync findCurrentUsageByProviderAsset(\n\t\tprovider: string,\n\t\tproviderAssetId: string,\n\t): Promise<MediaUsageRecord[]> {\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources as s\")\n\t\t\t.innerJoin(\"_emdash_media_usage as u\", (join) =>\n\t\t\t\tjoin\n\t\t\t\t\t.onRef(\"u.source_key\", \"=\", \"s.source_key\")\n\t\t\t\t\t.onRef(\"u.generation\", \"=\", \"s.current_generation\"),\n\t\t\t)\n\t\t\t.select(currentUsageSelect)\n\t\t\t.where(\"u.provider\", \"=\", provider)\n\t\t\t.where(\"u.provider_asset_id\", \"=\", providerAssetId)\n\t\t\t.orderBy(\"s.source_key\", \"asc\")\n\t\t\t.orderBy(\"u.field_path\", \"asc\")\n\t\t\t.orderBy(\"u.occurrence_index\", \"asc\")\n\t\t\t.execute();\n\n\t\treturn rows.map(rowToUsageRecord);\n\t}\n\n\tasync findCurrentUsagePageByMediaId(\n\t\tmediaId: string,\n\t\toptions: FindMediaUsageOptions = {},\n\t): Promise<FindManyResult<MediaUsageRecord>> {\n\t\treturn this.findCurrentUsagePage((query) => query.where(\"u.media_id\", \"=\", mediaId), options);\n\t}\n\n\tasync findCurrentUsagePageByProviderAsset(\n\t\tprovider: string,\n\t\tproviderAssetId: string,\n\t\toptions: FindMediaUsageOptions = {},\n\t): Promise<FindManyResult<MediaUsageRecord>> {\n\t\treturn this.findCurrentUsagePage(\n\t\t\t(query) =>\n\t\t\t\tquery.where(\"u.provider\", \"=\", provider).where(\"u.provider_asset_id\", \"=\", providerAssetId),\n\t\t\toptions,\n\t\t);\n\t}\n\n\tasync deleteSource(sourceKey: string): Promise<number> {\n\t\treturn this.deleteSources([sourceKey]);\n\t}\n\n\tasync deleteSourceIfCurrent(\n\t\tsourceKey: string,\n\t\texpectedCurrentGeneration: string,\n\t): Promise<MediaUsageGuardedDeleteResult> {\n\t\tlet deleted = false;\n\t\tawait withTransaction(this.db, async (trx) => {\n\t\t\tawait this.lockCleanupBeforeSourceDelete(trx);\n\t\t\tconst result = await trx\n\t\t\t\t.deleteFrom(\"_emdash_media_usage_sources\")\n\t\t\t\t.where(\"source_key\", \"=\", sourceKey)\n\t\t\t\t.where(\"current_generation\", \"=\", expectedCurrentGeneration)\n\t\t\t\t.executeTakeFirst();\n\t\t\tdeleted = Number(result.numDeletedRows ?? 0) > 0;\n\t\t\tif (!deleted) return;\n\t\t\tawait this.deleteSourceGenerationOccurrences(trx, sourceKey, expectedCurrentGeneration);\n\t\t});\n\n\t\treturn {\n\t\t\tdeleted,\n\t\t\tsource: await this.findSource(sourceKey),\n\t\t};\n\t}\n\n\tasync deleteSourceIfMatching(\n\t\tsourceKey: string,\n\t\texpectedSource: MediaUsageSource,\n\t): Promise<MediaUsageGuardedDeleteResult> {\n\t\tlet deleted = false;\n\t\tawait withTransaction(this.db, async (trx) => {\n\t\t\tawait this.lockCleanupBeforeSourceDelete(trx);\n\t\t\tconst result = await trx\n\t\t\t\t.deleteFrom(\"_emdash_media_usage_sources\")\n\t\t\t\t.where(\"source_key\", \"=\", sourceKey)\n\t\t\t\t.where(this.sourceMatchExpression(expectedSource))\n\t\t\t\t.where(\n\t\t\t\t\tthis.currentCollectionExists(expectedSource.collectionId, expectedSource.collectionSlug),\n\t\t\t\t)\n\t\t\t\t.executeTakeFirst();\n\t\t\tdeleted = Number(result.numDeletedRows ?? 0) > 0;\n\t\t\tif (!deleted) return;\n\t\t\tawait this.deleteSourceGenerationOccurrences(\n\t\t\t\ttrx,\n\t\t\t\tsourceKey,\n\t\t\t\texpectedSource.currentGeneration,\n\t\t\t);\n\t\t});\n\n\t\treturn {\n\t\t\tdeleted,\n\t\t\tsource: await this.findSource(sourceKey),\n\t\t};\n\t}\n\n\tasync deleteSourceIfMatchingContentAbsent(\n\t\tsourceKey: string,\n\t\texpectedSource: MediaUsageSource,\n\t\tcollectionSlug: string,\n\t\tcontentId: string,\n\t): Promise<MediaUsageGuardedAbsentDeleteResult> {\n\t\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\t\tconst tableName = `ec_${collectionSlug}`;\n\t\tlet deleted = false;\n\t\tawait withTransaction(this.db, async (trx) => {\n\t\t\tawait this.lockCleanupBeforeSourceDelete(trx);\n\t\t\tconst result = await trx\n\t\t\t\t.deleteFrom(\"_emdash_media_usage_sources\")\n\t\t\t\t.where(\"source_key\", \"=\", sourceKey)\n\t\t\t\t.where(this.sourceMatchExpression(expectedSource))\n\t\t\t\t.where(\n\t\t\t\t\tthis.currentCollectionExists(expectedSource.collectionId, expectedSource.collectionSlug),\n\t\t\t\t)\n\t\t\t\t.where(\n\t\t\t\t\tsql<boolean>`NOT EXISTS (SELECT 1 FROM ${sql.ref(tableName)} WHERE id = ${contentId})`,\n\t\t\t\t)\n\t\t\t\t.executeTakeFirst();\n\t\t\tdeleted = Number(result.numDeletedRows ?? 0) > 0;\n\t\t\tif (!deleted) return;\n\t\t\tawait this.deleteSourceGenerationOccurrences(\n\t\t\t\ttrx,\n\t\t\t\tsourceKey,\n\t\t\t\texpectedSource.currentGeneration,\n\t\t\t);\n\t\t});\n\t\tconst contentPresent = deleted ? false : await this.contentRowExists(tableName, contentId);\n\n\t\treturn {\n\t\t\tdeleted,\n\t\t\tcontentPresent,\n\t\t\tsource: deleted || contentPresent ? null : await this.findSource(sourceKey),\n\t\t};\n\t}\n\n\tasync deleteSources(sourceKeys: readonly string[]): Promise<number> {\n\t\treturn this.deleteSourceKeys(sourceKeys);\n\t}\n\n\tasync deleteContentSources(collectionSlug: string, contentId: string): Promise<number> {\n\t\tconst sourceRows = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources\")\n\t\t\t.select(\"source_key\")\n\t\t\t.where(\"source_type\", \"=\", \"content\")\n\t\t\t.where(\"collection_slug\", \"=\", collectionSlug)\n\t\t\t.where(\"content_id\", \"=\", contentId)\n\t\t\t.execute();\n\t\tconst sourceKeys = sourceRows.map((row) => row.source_key);\n\t\treturn this.deleteSourceKeys(sourceKeys);\n\t}\n\n\tasync deleteCollectionSources(collectionSlug: string): Promise<number> {\n\t\tlet deleted = 0;\n\t\twhile (true) {\n\t\t\tconst sourceRows = await this.db\n\t\t\t\t.selectFrom(\"_emdash_media_usage_sources\")\n\t\t\t\t.select(\"source_key\")\n\t\t\t\t.where(\"source_type\", \"=\", \"content\")\n\t\t\t\t.where(\"collection_slug\", \"=\", collectionSlug)\n\t\t\t\t.orderBy(\"source_key\", \"asc\")\n\t\t\t\t.limit(SQL_BATCH_SIZE)\n\t\t\t\t.execute();\n\t\t\tif (sourceRows.length === 0) break;\n\n\t\t\tdeleted += await this.deleteSourceKeys(sourceRows.map((row) => row.source_key));\n\t\t}\n\t\treturn deleted;\n\t}\n\n\tasync findCollectionContentSources(\n\t\tcollectionSlug: string,\n\t\tcollectionId?: string,\n\t): Promise<MediaUsageSource[]> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources\")\n\t\t\t.selectAll()\n\t\t\t.where(\"source_type\", \"=\", \"content\")\n\t\t\t.where(\"collection_slug\", \"=\", collectionSlug)\n\t\t\t.orderBy(\"source_key\", \"asc\");\n\t\tif (collectionId !== undefined) query = query.where(\"collection_id\", \"=\", collectionId);\n\t\tconst rows = await query.execute();\n\t\treturn rows.map((row) => rowToSource(row));\n\t}\n\n\tasync claimMediaUsageCleanup(input: {\n\t\tleaseToken: string;\n\t\tleaseDurationSeconds: number;\n\t\tnextEligibleDelaySeconds: number;\n\t\tsweepSafetyWindowSeconds: number;\n\t}): Promise<MediaUsageCleanupClaim | null> {\n\t\tconst leaseDurationSeconds = cleanupDurationSeconds(input.leaseDurationSeconds);\n\t\tconst nextEligibleDelaySeconds = cleanupDurationSeconds(input.nextEligibleDelaySeconds);\n\t\tconst sweepSafetyWindowSeconds = cleanupDurationSeconds(input.sweepSafetyWindowSeconds);\n\t\tconst claimedAt = this.cleanupTimestampOffset(0);\n\t\tconst leaseExpiresAt = this.cleanupTimestampOffset(leaseDurationSeconds);\n\t\tconst nextEligibleAt = this.cleanupTimestampOffset(nextEligibleDelaySeconds);\n\t\tconst sweepBeforeAt = this.cleanupTimestampOffset(-sweepSafetyWindowSeconds);\n\t\tconst row = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_cleanup\")\n\t\t\t.set({\n\t\t\t\tlease_token: input.leaseToken,\n\t\t\t\tlease_expires_at: leaseExpiresAt,\n\t\t\t\tnext_eligible_at: nextEligibleAt,\n\t\t\t\tlast_started_at: claimedAt,\n\t\t\t\tupdated_at: claimedAt,\n\t\t\t\tscan_before_at: sql<string>`CASE\n\t\t\t\t\tWHEN scan_before_at IS NULL THEN ${sweepBeforeAt}\n\t\t\t\t\tELSE scan_before_at\n\t\t\t\tEND`,\n\t\t\t})\n\t\t\t.where(\"task_key\", \"=\", \"projection_gc\")\n\t\t\t.where(this.cleanupTimestampIsDue(\"next_eligible_at\"))\n\t\t\t.where((eb) =>\n\t\t\t\teb.or([eb(\"lease_token\", \"is\", null), this.cleanupTimestampIsDue(\"lease_expires_at\")]),\n\t\t\t)\n\t\t\t.returning([\n\t\t\t\t\"cursor_created_at\",\n\t\t\t\t\"cursor_id\",\n\t\t\t\t\"last_started_at\",\n\t\t\t\t\"scan_before_at\",\n\t\t\t\t\"consecutive_failures\",\n\t\t\t])\n\t\t\t.executeTakeFirst();\n\t\tif (!row) return null;\n\t\tif (!row.last_started_at || !row.scan_before_at) {\n\t\t\tthrow new Error(\"Media usage cleanup claim did not persist its database timestamps\");\n\t\t}\n\t\treturn {\n\t\t\tleaseToken: input.leaseToken,\n\t\t\tcursor:\n\t\t\t\trow.cursor_created_at && row.cursor_id\n\t\t\t\t\t? { createdAt: row.cursor_created_at, id: row.cursor_id }\n\t\t\t\t\t: null,\n\t\t\tclaimedAt: row.last_started_at,\n\t\t\tscanBeforeAt: row.scan_before_at,\n\t\t\tconsecutiveFailures: row.consecutive_failures,\n\t\t};\n\t}\n\n\tasync findMediaUsageCleanupCandidates(input: {\n\t\tcutoff: string;\n\t\tcursor: MediaUsageCleanupCursor | null;\n\t\tlimit: number;\n\t\tcleanupLease?: MediaUsageCleanupLease;\n\t}): Promise<MediaUsageCleanupCandidate[]> {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"_emdash_media_usage as u\")\n\t\t\t.leftJoin(\"_emdash_media_usage_sources as s\", \"s.source_key\", \"u.source_key\")\n\t\t\t.leftJoin(\"_emdash_media_usage_generation_writes as writer\", (join) =>\n\t\t\t\tjoin\n\t\t\t\t\t.onRef(\"writer.source_key\", \"=\", \"u.source_key\")\n\t\t\t\t\t.onRef(\"writer.generation\", \"=\", \"u.generation\"),\n\t\t\t)\n\t\t\t.select([\n\t\t\t\t\"u.id as id\",\n\t\t\t\t\"u.source_key as source_key\",\n\t\t\t\t\"u.generation as generation\",\n\t\t\t\t\"u.created_at as created_at\",\n\t\t\t\t\"s.current_generation as current_generation\",\n\t\t\t\t\"s.indexed_at as indexed_at\",\n\t\t\t\t\"writer.expires_at as write_lease_expires_at\",\n\t\t\t])\n\t\t\t.where(\"u.created_at\", \"<\", input.cutoff)\n\t\t\t.orderBy(\"u.created_at\", \"asc\")\n\t\t\t.orderBy(\"u.id\", \"asc\")\n\t\t\t.limit(Math.max(0, Math.floor(input.limit)));\n\t\tif (input.cleanupLease) {\n\t\t\tquery = query.where(this.activeCleanupLeaseExpression(input.cleanupLease));\n\t\t}\n\n\t\tif (input.cursor) {\n\t\t\tquery = query.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb(\"u.created_at\", \">\", input.cursor!.createdAt),\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"u.created_at\", \"=\", input.cursor!.createdAt),\n\t\t\t\t\t\teb(\"u.id\", \">\", input.cursor!.id),\n\t\t\t\t\t]),\n\t\t\t\t]),\n\t\t\t);\n\t\t}\n\n\t\tconst rows = await query.execute();\n\t\treturn rows.map((row) => ({\n\t\t\tid: row.id,\n\t\t\tsourceKey: row.source_key,\n\t\t\tgeneration: row.generation,\n\t\t\tcreatedAt: row.created_at,\n\t\t\tcurrentGeneration: row.current_generation,\n\t\t\tindexedAt: row.indexed_at,\n\t\t\twriteLeaseExpiresAt: row.write_lease_expires_at,\n\t\t}));\n\t}\n\n\tasync completeMediaUsageCleanup(input: MediaUsageCleanupCompletion): Promise<boolean> {\n\t\tconst updates = {\n\t\t\tlease_token: null,\n\t\t\tlease_expires_at: null,\n\t\t\tcursor_created_at: input.sweepComplete ? null : (input.nextCursor?.createdAt ?? null),\n\t\t\tcursor_id: input.sweepComplete ? null : (input.nextCursor?.id ?? null),\n\t\t\t...(input.sweepComplete ? { scan_before_at: null } : {}),\n\t\t\tconsecutive_failures: 0,\n\t\t\tlast_completed_at: this.cleanupTimestampOffset(0),\n\t\t\tlast_candidate_count: input.candidateCount,\n\t\t\tlast_deleted_orphans: input.deletedOrphans,\n\t\t\tlast_deleted_stale: input.deletedStale,\n\t\t\tlast_deleted_abandoned: input.deletedAbandoned,\n\t\t\tlast_deleted_write_leases: input.deletedWriteLeases,\n\t\t\tlast_backlog_lower_bound: input.backlogLowerBound,\n\t\t\tlast_scan_has_more: input.scanHasMore ? 1 : 0,\n\t\t\tlast_duration_ms: input.durationMs,\n\t\t\tlast_error_code: null,\n\t\t\tupdated_at: this.cleanupTimestampOffset(0),\n\t\t};\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_cleanup\")\n\t\t\t.set(updates)\n\t\t\t.where(\"task_key\", \"=\", \"projection_gc\")\n\t\t\t.where(\"lease_token\", \"=\", input.leaseToken)\n\t\t\t.where(this.cleanupLeaseExpiryIsInFuture(\"_emdash_media_usage_cleanup.lease_expires_at\"))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) > 0;\n\t}\n\n\tasync failMediaUsageCleanup(input: {\n\t\tleaseToken: string;\n\t\tretryDelaySeconds: number;\n\t\tconsecutiveFailures: number;\n\t\tdurationMs: number;\n\t\terrorCode: string;\n\t}): Promise<boolean> {\n\t\tconst retryDelaySeconds = cleanupDurationSeconds(input.retryDelaySeconds);\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_cleanup\")\n\t\t\t.set({\n\t\t\t\tlease_token: null,\n\t\t\t\tlease_expires_at: null,\n\t\t\t\tnext_eligible_at: this.cleanupTimestampOffset(retryDelaySeconds),\n\t\t\t\tconsecutive_failures: input.consecutiveFailures,\n\t\t\t\tlast_completed_at: this.cleanupTimestampOffset(0),\n\t\t\t\tlast_duration_ms: input.durationMs,\n\t\t\t\tlast_error_code: input.errorCode,\n\t\t\t\tupdated_at: this.cleanupTimestampOffset(0),\n\t\t\t})\n\t\t\t.where(\"task_key\", \"=\", \"projection_gc\")\n\t\t\t.where(\"lease_token\", \"=\", input.leaseToken)\n\t\t\t.where(this.cleanupLeaseExpiryIsInFuture(\"_emdash_media_usage_cleanup.lease_expires_at\"))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) > 0;\n\t}\n\n\tasync deleteOrphanOccurrencesOlderThan(\n\t\tcutoff: string,\n\t\tlimit: number,\n\t\toptions: MediaUsageCleanupDeleteOptions = {},\n\t): Promise<number> {\n\t\tconst batchLimit = Math.floor(limit);\n\t\tif (batchLimit <= 0) return 0;\n\t\tif (options.candidateIds) {\n\t\t\treturn this.deleteOrphanCandidateIds(\n\t\t\t\toptions.candidateIds.slice(0, batchLimit),\n\t\t\t\tcutoff,\n\t\t\t\toptions.cleanupLease,\n\t\t\t\toptions.canIssueStatement,\n\t\t\t);\n\t\t}\n\t\tif (!canIssueCleanupStatement(options.canIssueStatement)) return 0;\n\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"_emdash_media_usage as u\")\n\t\t\t.leftJoin(\"_emdash_media_usage_sources as s\", (join) =>\n\t\t\t\tjoin.onRef(\"s.source_key\", \"=\", \"u.source_key\"),\n\t\t\t)\n\t\t\t.leftJoin(\"_emdash_media_usage_generation_writes as writer\", (join) =>\n\t\t\t\tjoin\n\t\t\t\t\t.onRef(\"writer.source_key\", \"=\", \"u.source_key\")\n\t\t\t\t\t.onRef(\"writer.generation\", \"=\", \"u.generation\"),\n\t\t\t)\n\t\t\t.select(\"u.id\")\n\t\t\t.where(\"s.source_key\", \"is\", null)\n\t\t\t.where(\"u.created_at\", \"<\", cutoff)\n\t\t\t.where(this.noActiveGenerationWriteExpression(\"u\"))\n\t\t\t.orderBy(\"u.created_at\", \"asc\")\n\t\t\t.orderBy(\"u.id\", \"asc\")\n\t\t\t.limit(batchLimit);\n\t\tif (options.cleanupLease) {\n\t\t\tquery = query.where(this.activeCleanupLeaseExpression(options.cleanupLease));\n\t\t}\n\t\tconst rows = await query.execute();\n\n\t\treturn this.deleteOrphanCandidateIds(\n\t\t\trows.map((row) => row.id),\n\t\t\tcutoff,\n\t\t\toptions.cleanupLease,\n\t\t\toptions.canIssueStatement,\n\t\t);\n\t}\n\n\tasync deleteStaleGenerationsOlderThan(\n\t\tcutoff: string,\n\t\tlimit: number,\n\t\toptions: MediaUsageCleanupDeleteOptions = {},\n\t): Promise<number> {\n\t\tconst batchLimit = Math.floor(limit);\n\t\tif (batchLimit <= 0) return 0;\n\t\tif (options.candidateIds) {\n\t\t\treturn this.deleteStaleCandidateIds(\n\t\t\t\toptions.candidateIds.slice(0, batchLimit),\n\t\t\t\tcutoff,\n\t\t\t\toptions.cleanupLease,\n\t\t\t\toptions.canIssueStatement,\n\t\t\t);\n\t\t}\n\t\tif (!canIssueCleanupStatement(options.canIssueStatement)) return 0;\n\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"_emdash_media_usage as u\")\n\t\t\t.innerJoin(\"_emdash_media_usage_sources as s\", (join) =>\n\t\t\t\tjoin.onRef(\"s.source_key\", \"=\", \"u.source_key\"),\n\t\t\t)\n\t\t\t.leftJoin(\"_emdash_media_usage_generation_writes as writer\", (join) =>\n\t\t\t\tjoin\n\t\t\t\t\t.onRef(\"writer.source_key\", \"=\", \"u.source_key\")\n\t\t\t\t\t.onRef(\"writer.generation\", \"=\", \"u.generation\"),\n\t\t\t)\n\t\t\t.select(\"u.id\")\n\t\t\t.where(\"u.created_at\", \"<\", cutoff)\n\t\t\t.whereRef(\"u.generation\", \"!=\", \"s.current_generation\")\n\t\t\t.whereRef(\"u.created_at\", \"<\", \"s.indexed_at\")\n\t\t\t.where(this.noActiveGenerationWriteExpression(\"u\"))\n\t\t\t.orderBy(\"u.created_at\", \"asc\")\n\t\t\t.orderBy(\"u.id\", \"asc\")\n\t\t\t.limit(batchLimit);\n\t\tif (options.cleanupLease) {\n\t\t\tquery = query.where(this.activeCleanupLeaseExpression(options.cleanupLease));\n\t\t}\n\t\tconst rows = await query.execute();\n\n\t\treturn this.deleteStaleCandidateIds(\n\t\t\trows.map((row) => row.id),\n\t\t\tcutoff,\n\t\t\toptions.cleanupLease,\n\t\t\toptions.canIssueStatement,\n\t\t);\n\t}\n\n\tasync deleteAbandonedGenerationsOlderThan(\n\t\tcutoff: string,\n\t\tlimit: number,\n\t\toptions: MediaUsageCleanupDeleteOptions = {},\n\t): Promise<number> {\n\t\tconst batchLimit = Math.floor(limit);\n\t\tif (batchLimit <= 0) return 0;\n\t\tif (options.candidateIds) {\n\t\t\treturn this.deleteAbandonedCandidateIds(\n\t\t\t\toptions.candidateIds.slice(0, batchLimit),\n\t\t\t\tcutoff,\n\t\t\t\toptions.cleanupLease,\n\t\t\t\toptions.canIssueStatement,\n\t\t\t);\n\t\t}\n\t\tif (!canIssueCleanupStatement(options.canIssueStatement)) return 0;\n\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"_emdash_media_usage as u\")\n\t\t\t.innerJoin(\"_emdash_media_usage_sources as s\", (join) =>\n\t\t\t\tjoin.onRef(\"s.source_key\", \"=\", \"u.source_key\"),\n\t\t\t)\n\t\t\t.leftJoin(\"_emdash_media_usage_generation_writes as writer\", (join) =>\n\t\t\t\tjoin\n\t\t\t\t\t.onRef(\"writer.source_key\", \"=\", \"u.source_key\")\n\t\t\t\t\t.onRef(\"writer.generation\", \"=\", \"u.generation\"),\n\t\t\t)\n\t\t\t.select(\"u.id\")\n\t\t\t.where(\"u.created_at\", \"<\", cutoff)\n\t\t\t.whereRef(\"u.generation\", \"!=\", \"s.current_generation\")\n\t\t\t.whereRef(\"u.created_at\", \">=\", \"s.indexed_at\")\n\t\t\t.where(this.noActiveGenerationWriteExpression(\"u\"))\n\t\t\t.orderBy(\"u.created_at\", \"asc\")\n\t\t\t.orderBy(\"u.id\", \"asc\")\n\t\t\t.limit(batchLimit);\n\t\tif (options.cleanupLease) {\n\t\t\tquery = query.where(this.activeCleanupLeaseExpression(options.cleanupLease));\n\t\t}\n\t\tconst rows = await query.execute();\n\n\t\treturn this.deleteAbandonedCandidateIds(\n\t\t\trows.map((row) => row.id),\n\t\t\tcutoff,\n\t\t\toptions.cleanupLease,\n\t\t\toptions.canIssueStatement,\n\t\t);\n\t}\n\n\tasync deleteExpiredGenerationWriteLeases(\n\t\tlimit: number,\n\t\tcleanupLease?: MediaUsageCleanupLease,\n\t\tcanIssueStatement?: () => boolean,\n\t): Promise<number> {\n\t\tconst batchLimit = Math.floor(limit);\n\t\tif (batchLimit <= 0 || !canIssueCleanupStatement(canIssueStatement)) return 0;\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_generation_writes\")\n\t\t\t.select(\"lease_token\")\n\t\t\t.where(this.generationWriteLeaseHasExpired(\"expires_at\"))\n\t\t\t.orderBy(\"expires_at\", \"asc\")\n\t\t\t.orderBy(\"lease_token\", \"asc\")\n\t\t\t.limit(batchLimit);\n\t\tif (cleanupLease) query = query.where(this.activeCleanupLeaseExpression(cleanupLease));\n\t\tconst rows = await query.execute();\n\t\tif (rows.length === 0 || !canIssueCleanupStatement(canIssueStatement)) return 0;\n\t\tlet deleteQuery = this.db\n\t\t\t.deleteFrom(\"_emdash_media_usage_generation_writes\")\n\t\t\t.where(\n\t\t\t\t\"lease_token\",\n\t\t\t\t\"in\",\n\t\t\t\trows.map((row) => row.lease_token),\n\t\t\t)\n\t\t\t.where(this.generationWriteLeaseHasExpired(\"expires_at\"));\n\t\tif (cleanupLease)\n\t\t\tdeleteQuery = deleteQuery.where(this.activeCleanupLeaseExpression(cleanupLease));\n\t\tconst result = await deleteQuery.executeTakeFirst();\n\t\treturn Number(result.numDeletedRows ?? 0);\n\t}\n\n\tasync upsertIndexStatus(input: MediaUsageIndexStatusInput): Promise<MediaUsageIndexStatus> {\n\t\tconst now = input.updatedAt ?? new Date().toISOString();\n\t\tconst row = {\n\t\t\tadapter_id: input.adapterId,\n\t\t\tscope_type: input.scopeType,\n\t\t\tscope_key: input.scopeKey,\n\t\t\tstatus: input.status,\n\t\t\tschema_version: input.schemaVersion ?? 1,\n\t\t\tstarted_at: input.startedAt ?? null,\n\t\t\tcompleted_at: input.completedAt ?? null,\n\t\t\tcursor: input.cursor ?? null,\n\t\t\tindexed_source_count: input.indexedSourceCount ?? 0,\n\t\t\tfailed_source_count: input.failedSourceCount ?? 0,\n\t\t\tlast_error_code: input.lastErrorCode ?? null,\n\t\t\tupdated_at: now,\n\t\t};\n\n\t\tawait this.db\n\t\t\t.insertInto(\"_emdash_media_usage_index_status\")\n\t\t\t.values(row)\n\t\t\t.onConflict((oc) =>\n\t\t\t\toc.columns([\"adapter_id\", \"scope_type\", \"scope_key\"]).doUpdateSet({\n\t\t\t\t\tstatus: row.status,\n\t\t\t\t\tschema_version: row.schema_version,\n\t\t\t\t\tstarted_at: row.started_at,\n\t\t\t\t\tcompleted_at: row.completed_at,\n\t\t\t\t\tcursor: row.cursor,\n\t\t\t\t\tindexed_source_count: row.indexed_source_count,\n\t\t\t\t\tfailed_source_count: row.failed_source_count,\n\t\t\t\t\tlast_error_code: row.last_error_code,\n\t\t\t\t\tupdated_at: row.updated_at,\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.execute();\n\n\t\tconst status = await this.findIndexStatus(input);\n\t\tif (!status) {\n\t\t\tthrow new Error(\n\t\t\t\t`Media usage index status ${input.adapterId}:${input.scopeType}:${input.scopeKey} was not persisted`,\n\t\t\t);\n\t\t}\n\t\treturn status;\n\t}\n\n\tasync invalidateIndexStatusForSchemaChange(collectionSlug: string): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status as status\")\n\t\t\t.set({\n\t\t\t\tchange_epoch: sql<number>`change_epoch + 1`,\n\t\t\t\tstatus: \"stale\",\n\t\t\t\tcompleted_at: null,\n\t\t\t\tcursor: null,\n\t\t\t\tlast_error_code: \"CONTENT_USAGE_STALE\",\n\t\t\t\treconciliation_required: 1,\n\t\t\t\tupdated_at: this.sortableUtcTimestamp(),\n\t\t\t})\n\t\t\t.where(\"status.adapter_id\", \"=\", \"content-media\")\n\t\t\t.where(\"status.scope_type\", \"=\", \"collection\")\n\t\t\t.where(\"status.scope_key\", \"=\", collectionSlug)\n\t\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t\t.where((eb) =>\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"_emdash_collections as collection\")\n\t\t\t\t\t\t.select(\"collection.id\")\n\t\t\t\t\t\t.whereRef(\"collection.id\", \"=\", \"status.collection_id\")\n\t\t\t\t\t\t.whereRef(\"collection.slug\", \"=\", \"status.scope_key\"),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.where(\n\t\t\t\tsql<boolean>`EXISTS (\n\t\t\t\t\tSELECT 1\n\t\t\t\t\tFROM _emdash_media_usage_activation AS activation\n\t\t\t\t\tWHERE activation.task_key = 'incremental_capture'\n\t\t\t\t\t\tAND activation.state = 'active'\n\t\t\t\t)`,\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync beginIndexStatusRepair(\n\t\tinput: MediaUsageIndexStatusRepairInput,\n\t): Promise<MediaUsageIndexStatus> {\n\t\treturn this.upsertIndexStatus({\n\t\t\tadapterId: input.adapterId,\n\t\t\tscopeType: input.scopeType,\n\t\t\tscopeKey: input.scopeKey,\n\t\t\tstatus: \"running\",\n\t\t\tschemaVersion: input.schemaVersion,\n\t\t\tstartedAt: input.startedAt,\n\t\t\tcompletedAt: null,\n\t\t\tcursor: input.runToken,\n\t\t\tindexedSourceCount: 0,\n\t\t\tfailedSourceCount: 0,\n\t\t\tlastErrorCode: null,\n\t\t\tupdatedAt: input.updatedAt,\n\t\t});\n\t}\n\n\tasync finalizeIndexStatusRepairIfRunning(\n\t\tinput: MediaUsageIndexStatusFinalizeInput,\n\t): Promise<MediaUsageGuardedIndexStatusResult> {\n\t\tconst updates: Updateable<MediaUsageIndexStatusTable> = {\n\t\t\tstatus: input.status,\n\t\t\tcompleted_at: input.completedAt,\n\t\t\tcursor: null,\n\t\t\tindexed_source_count: input.indexedSourceCount ?? 0,\n\t\t\tfailed_source_count: input.failedSourceCount ?? 0,\n\t\t\tlast_error_code: input.lastErrorCode ?? null,\n\t\t\tupdated_at: input.updatedAt ?? new Date().toISOString(),\n\t\t};\n\t\tif (input.schemaVersion !== undefined) updates.schema_version = input.schemaVersion;\n\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status\")\n\t\t\t.set(updates)\n\t\t\t.where(\"adapter_id\", \"=\", input.adapterId)\n\t\t\t.where(\"scope_type\", \"=\", input.scopeType)\n\t\t\t.where(\"scope_key\", \"=\", input.scopeKey)\n\t\t\t.where(\"status\", \"=\", \"running\")\n\t\t\t.where(\"cursor\", \"=\", input.runToken)\n\t\t\t.executeTakeFirst();\n\t\tconst finalized = Number(result.numUpdatedRows ?? 0) > 0;\n\n\t\treturn {\n\t\t\tfinalized,\n\t\t\tstatus: await this.findIndexStatus(input),\n\t\t};\n\t}\n\n\tasync beginIndexStatusRepairAtCurrentEpoch(\n\t\tinput: MediaUsageIndexStatusEpochRepairInput,\n\t): Promise<MediaUsageIndexStatusEpochRepairRun | null> {\n\t\tconst now = this.sortableUtcTimestamp();\n\t\tconst row = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status\")\n\t\t\t.set({\n\t\t\t\tstatus: \"running\",\n\t\t\t\tschema_version: input.schemaVersion,\n\t\t\t\tstarted_at: now,\n\t\t\t\tcompleted_at: null,\n\t\t\t\tcursor: input.runToken,\n\t\t\t\tindexed_source_count: 0,\n\t\t\t\tfailed_source_count: 0,\n\t\t\t\tlast_error_code: null,\n\t\t\t\treconciliation_required: 1,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"adapter_id\", \"=\", input.adapterId)\n\t\t\t.where(\"scope_type\", \"=\", input.scopeType)\n\t\t\t.where(\"scope_key\", \"=\", input.scopeKey)\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"capture_state\", \"=\", \"active\")\n\t\t\t.where(\n\t\t\t\tsql<boolean>`EXISTS (\n\t\t\t\t\tSELECT 1\n\t\t\t\t\tFROM _emdash_collections AS collection\n\t\t\t\t\tWHERE collection.id = ${input.collectionId}\n\t\t\t\t\t\tAND collection.slug = ${input.scopeKey}\n\t\t\t\t)`,\n\t\t\t)\n\t\t\t.where(\n\t\t\t\tsql<boolean>`EXISTS (\n\t\t\t\t\tSELECT 1\n\t\t\t\t\tFROM _emdash_media_usage_activation AS activation\n\t\t\t\t\tWHERE activation.task_key = 'incremental_capture'\n\t\t\t\t\t\tAND activation.state = 'active'\n\t\t\t\t)`,\n\t\t\t)\n\t\t\t.returning([\"change_epoch\", \"started_at\"])\n\t\t\t.executeTakeFirst();\n\t\tif (!row?.started_at) return null;\n\t\treturn { changeEpoch: row.change_epoch, startedAt: row.started_at };\n\t}\n\n\tasync finalizeIndexStatusRepairAtEpoch(\n\t\tinput: MediaUsageIndexStatusEpochFinalizeInput,\n\t): Promise<MediaUsageGuardedIndexStatusResult> {\n\t\tconst now = this.sortableUtcTimestamp();\n\t\tconst updates = {\n\t\t\tstatus: input.status,\n\t\t\tschema_version: input.schemaVersion,\n\t\t\tcompleted_at: now,\n\t\t\tcursor: null,\n\t\t\tindexed_source_count: input.indexedSourceCount,\n\t\t\tfailed_source_count: input.failedSourceCount,\n\t\t\tlast_error_code: input.lastErrorCode,\n\t\t\treconciliation_required: input.status === \"complete\" ? 0 : 1,\n\t\t\tupdated_at: now,\n\t\t};\n\n\t\tlet query = this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status\")\n\t\t\t.set(updates)\n\t\t\t.where(\"adapter_id\", \"=\", input.adapterId)\n\t\t\t.where(\"scope_type\", \"=\", input.scopeType)\n\t\t\t.where(\"scope_key\", \"=\", input.scopeKey)\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"status\", \"=\", \"running\")\n\t\t\t.where(\"cursor\", \"=\", input.runToken)\n\t\t\t.where(\"change_epoch\", \"=\", input.startingEpoch)\n\t\t\t.where(\n\t\t\t\tsql<boolean>`EXISTS (\n\t\t\t\t\tSELECT 1\n\t\t\t\t\tFROM _emdash_collections AS collection\n\t\t\t\t\tWHERE collection.id = ${input.collectionId}\n\t\t\t\t\t\tAND collection.slug = ${input.scopeKey}\n\t\t\t\t)`,\n\t\t\t);\n\t\tif (input.status === \"complete\") {\n\t\t\tquery = query.where(\n\t\t\t\tsql<boolean>`NOT EXISTS (\n\t\t\t\t\tSELECT 1\n\t\t\t\t\tFROM _emdash_media_usage_work AS work\n\t\t\t\t\tWHERE work.collection_id = ${input.collectionId}\n\t\t\t\t)`,\n\t\t\t);\n\t\t}\n\t\tconst result = await query.executeTakeFirst();\n\t\tconst finalized = Number(result.numUpdatedRows ?? 0) > 0;\n\n\t\tif (!finalized) {\n\t\t\tawait this.db\n\t\t\t\t.updateTable(\"_emdash_media_usage_index_status\")\n\t\t\t\t.set({\n\t\t\t\t\tstatus: \"stale\",\n\t\t\t\t\tcompleted_at: null,\n\t\t\t\t\tcursor: null,\n\t\t\t\t\tlast_error_code: \"CONTENT_USAGE_REPAIR_CONFLICT\",\n\t\t\t\t\treconciliation_required: 1,\n\t\t\t\t\tupdated_at: this.sortableUtcTimestamp(),\n\t\t\t\t})\n\t\t\t\t.where(\"adapter_id\", \"=\", input.adapterId)\n\t\t\t\t.where(\"scope_type\", \"=\", input.scopeType)\n\t\t\t\t.where(\"scope_key\", \"=\", input.scopeKey)\n\t\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t\t.where(\"status\", \"=\", \"running\")\n\t\t\t\t.where(\"cursor\", \"=\", input.runToken)\n\t\t\t\t.execute();\n\t\t}\n\n\t\treturn {\n\t\t\tfinalized,\n\t\t\tstatus: await this.findIndexStatusForCollection(input, input.collectionId),\n\t\t};\n\t}\n\n\tasync recordIncrementalSuccess(input: MediaUsageIncrementalStatusIdentity): Promise<boolean> {\n\t\tconst observed = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_index_status\")\n\t\t\t.select(\"change_epoch\")\n\t\t\t.where(\"adapter_id\", \"=\", \"content-media\")\n\t\t\t.where(\"scope_type\", \"=\", \"collection\")\n\t\t\t.where(\"scope_key\", \"=\", input.collectionSlug)\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"capture_state\", \"=\", \"active\")\n\t\t\t.where(\n\t\t\t\tsql<boolean>`EXISTS (\n\t\t\t\t\tSELECT 1\n\t\t\t\t\tFROM _emdash_collections AS collection\n\t\t\t\t\tWHERE collection.id = ${input.collectionId}\n\t\t\t\t\t\tAND collection.slug = ${input.collectionSlug}\n\t\t\t\t)`,\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\tif (!observed) return false;\n\n\t\tconst canComplete = sql<boolean>`(\n\t\t\treconciliation_required = 0\n\t\t\tAND status IN ('complete', 'stale', 'partial')\n\t\t\tAND NOT EXISTS (\n\t\t\t\tSELECT 1\n\t\t\t\tFROM _emdash_media_usage_work AS work\n\t\t\t\tWHERE work.collection_id = ${input.collectionId}\n\t\t\t)\n\t\t)`;\n\t\tconst now = this.sortableUtcTimestamp();\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status\")\n\t\t\t.set({\n\t\t\t\tstatus: sql<string>`CASE WHEN ${canComplete} THEN 'complete' ELSE status END`,\n\t\t\t\tcompleted_at: sql<\n\t\t\t\t\tstring | null\n\t\t\t\t>`CASE WHEN ${canComplete} THEN ${now} ELSE completed_at END`,\n\t\t\t\tlast_error_code: sql<\n\t\t\t\t\tstring | null\n\t\t\t\t>`CASE WHEN ${canComplete} THEN NULL ELSE last_error_code END`,\n\t\t\t\tlast_incremental_success_at: now,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"adapter_id\", \"=\", \"content-media\")\n\t\t\t.where(\"scope_type\", \"=\", \"collection\")\n\t\t\t.where(\"scope_key\", \"=\", input.collectionSlug)\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"change_epoch\", \"=\", observed.change_epoch)\n\t\t\t.where(\"capture_state\", \"=\", \"active\")\n\t\t\t.where(\n\t\t\t\tsql<boolean>`EXISTS (\n\t\t\t\t\tSELECT 1\n\t\t\t\t\tFROM _emdash_collections AS collection\n\t\t\t\t\tWHERE collection.id = ${input.collectionId}\n\t\t\t\t\t\tAND collection.slug = ${input.collectionSlug}\n\t\t\t\t)`,\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) > 0;\n\t}\n\n\tasync recordIncrementalFailure(\n\t\tinput: MediaUsageIncrementalStatusIdentity & {\n\t\t\tcontentId: string;\n\t\t\tworkVersion: number | string;\n\t\t\terrorCode: string;\n\t\t},\n\t): Promise<boolean> {\n\t\tconst now = this.sortableUtcTimestamp();\n\t\tconst automaticRunOwnsCoverage = sql<boolean>`EXISTS (\n\t\t\tSELECT 1\n\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\tWHERE reconciliation.collection_id = ${input.collectionId}\n\t\t\t\tAND reconciliation.run_token = cursor\n\t\t)`;\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status\")\n\t\t\t.set({\n\t\t\t\tstatus: sql<string>`CASE\n\t\t\t\t\tWHEN ${automaticRunOwnsCoverage} THEN status\n\t\t\t\t\tWHEN reconciliation_required = 0 THEN 'partial'\n\t\t\t\t\tWHEN status = 'running' THEN 'stale'\n\t\t\t\t\tELSE status\n\t\t\t\tEND`,\n\t\t\t\tcompleted_at: sql<string | null>`CASE\n\t\t\t\t\tWHEN ${automaticRunOwnsCoverage} THEN completed_at\n\t\t\t\t\tWHEN reconciliation_required = 0 OR status = 'running' THEN NULL\n\t\t\t\t\tELSE completed_at\n\t\t\t\tEND`,\n\t\t\t\tcursor: sql<string | null>`CASE\n\t\t\t\t\tWHEN ${automaticRunOwnsCoverage} THEN cursor\n\t\t\t\t\tWHEN status = 'running' THEN NULL\n\t\t\t\t\tELSE cursor\n\t\t\t\tEND`,\n\t\t\t\tlast_error_code: input.errorCode,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"adapter_id\", \"=\", \"content-media\")\n\t\t\t.where(\"scope_type\", \"=\", \"collection\")\n\t\t\t.where(\"scope_key\", \"=\", input.collectionSlug)\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\n\t\t\t\tsql<boolean>`EXISTS (\n\t\t\t\t\tSELECT 1\n\t\t\t\t\tFROM _emdash_media_usage_work AS work\n\t\t\t\t\tWHERE work.collection_id = ${input.collectionId}\n\t\t\t\t\t\tAND work.content_id = ${input.contentId}\n\t\t\t\t\t\tAND work.work_version = ${input.workVersion}\n\t\t\t\t\t\tAND work.state = 'failed'\n\t\t\t\t\t\tAND work.last_error_code = ${input.errorCode}\n\t\t\t\t)`,\n\t\t\t)\n\t\t\t.where(\n\t\t\t\tsql<boolean>`EXISTS (\n\t\t\t\t\tSELECT 1\n\t\t\t\t\tFROM _emdash_collections AS collection\n\t\t\t\t\tWHERE collection.id = ${input.collectionId}\n\t\t\t\t\t\tAND collection.slug = ${input.collectionSlug}\n\t\t\t\t)`,\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) > 0;\n\t}\n\n\tasync findIndexStatus(\n\t\tidentity: MediaUsageIndexStatusIdentity,\n\t): Promise<MediaUsageIndexStatus | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_index_status\")\n\t\t\t.selectAll()\n\t\t\t.where(\"adapter_id\", \"=\", identity.adapterId)\n\t\t\t.where(\"scope_type\", \"=\", identity.scopeType)\n\t\t\t.where(\"scope_key\", \"=\", identity.scopeKey)\n\t\t\t.executeTakeFirst();\n\n\t\treturn row ? rowToIndexStatus(row) : null;\n\t}\n\n\tprivate async findIndexStatusForCollection(\n\t\tidentity: MediaUsageIndexStatusIdentity,\n\t\tcollectionId: string,\n\t): Promise<MediaUsageIndexStatus | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_index_status\")\n\t\t\t.selectAll()\n\t\t\t.where(\"adapter_id\", \"=\", identity.adapterId)\n\t\t\t.where(\"scope_type\", \"=\", identity.scopeType)\n\t\t\t.where(\"scope_key\", \"=\", identity.scopeKey)\n\t\t\t.where(\"collection_id\", \"=\", collectionId)\n\t\t\t.executeTakeFirst();\n\t\treturn row ? rowToIndexStatus(row) : null;\n\t}\n\n\tasync deleteIndexStatus(\n\t\tidentity: MediaUsageIndexStatusIdentity,\n\t\tcollectionId?: string,\n\t): Promise<number> {\n\t\tlet query = this.db\n\t\t\t.deleteFrom(\"_emdash_media_usage_index_status\")\n\t\t\t.where(\"adapter_id\", \"=\", identity.adapterId)\n\t\t\t.where(\"scope_type\", \"=\", identity.scopeType)\n\t\t\t.where(\"scope_key\", \"=\", identity.scopeKey);\n\t\tif (collectionId !== undefined) query = query.where(\"collection_id\", \"=\", collectionId);\n\t\tconst result = await query.executeTakeFirst();\n\t\treturn Number(result.numDeletedRows ?? 0);\n\t}\n\n\tprivate sortableUtcTimestamp(): RawBuilder<string> {\n\t\treturn isPostgres(this.db)\n\t\t\t? sql<string>`to_char(clock_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')`\n\t\t\t: sql<string>`strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n\t}\n\n\tprivate async findCurrentUsagePage(\n\t\tapplyFilter: (\n\t\t\tquery: ReturnType<MediaUsageRepository[\"currentUsageBaseQuery\"]>,\n\t\t) => ReturnType<MediaUsageRepository[\"currentUsageBaseQuery\"]>,\n\t\toptions: FindMediaUsageOptions,\n\t): Promise<FindManyResult<MediaUsageRecord>> {\n\t\tconst limit = Math.min(Math.max(1, options.limit ?? 50), 100);\n\t\tlet query = applyFilter(this.currentUsageBaseQuery())\n\t\t\t.orderBy(\"u.id\", \"asc\")\n\t\t\t.limit(limit + 1);\n\n\t\tif (options.cursor) {\n\t\t\tconst { id } = decodeCursor(options.cursor);\n\t\t\tquery = query.where(\"u.id\", \">\", id);\n\t\t}\n\n\t\tconst rows = await query.execute();\n\t\tconst items = rows.slice(0, limit).map(rowToUsageRecord);\n\t\tconst result: FindManyResult<MediaUsageRecord> = { items };\n\n\t\tif (rows.length > limit && items.length > 0) {\n\t\t\tconst last = items.at(-1)!;\n\t\t\tresult.nextCursor = encodeCursor(last.occurrence.id, last.occurrence.id);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate currentUsageBaseQuery() {\n\t\treturn this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources as s\")\n\t\t\t.innerJoin(\"_emdash_media_usage as u\", (join) =>\n\t\t\t\tjoin\n\t\t\t\t\t.onRef(\"u.source_key\", \"=\", \"s.source_key\")\n\t\t\t\t\t.onRef(\"u.generation\", \"=\", \"s.current_generation\"),\n\t\t\t)\n\t\t\t.select(currentUsageSelect);\n\t}\n\n\tprivate currentContentMediaUsageBaseQuery() {\n\t\treturn this.db\n\t\t\t.selectFrom(\"_emdash_media_usage as u\")\n\t\t\t.crossJoin(\"_emdash_media_usage_sources as s\")\n\t\t\t.innerJoin(\"_emdash_collections as collection\", \"collection.slug\", \"s.collection_slug\")\n\t\t\t.whereRef(\"s.source_key\", \"=\", \"u.source_key\")\n\t\t\t.whereRef(\"s.current_generation\", \"=\", \"u.generation\")\n\t\t\t.where(\"s.source_type\", \"=\", \"content\")\n\t\t\t.where(\"s.collection_slug\", \"is not\", null)\n\t\t\t.where(\"s.content_id\", \"is not\", null)\n\t\t\t.where(\"s.source_variant\", \"in\", [\"columns\", \"draft_overlay\"])\n\t\t\t.where(contentSourceMatchesActiveCollection(\"s\", \"collection.id\"))\n\t\t\t.where(CONTENT_SOURCE_ELIGIBILITY);\n\t}\n\n\tprivate async deleteOrphanCandidateIds(\n\t\tids: readonly string[],\n\t\tcutoff: string,\n\t\tcleanupLease?: MediaUsageCleanupLease,\n\t\tcanIssueStatement?: () => boolean,\n\t): Promise<number> {\n\t\tlet deleted = 0;\n\t\tfor (const idBatch of chunks([...ids], cleanupDeleteBatchSize(cleanupLease))) {\n\t\t\tif (!canIssueCleanupStatement(canIssueStatement)) break;\n\t\t\tif (cleanupLease) {\n\t\t\t\tawait this.markOrphanCandidatesForCleanup(idBatch, cutoff, cleanupLease);\n\t\t\t\tif (!canIssueCleanupStatement(canIssueStatement)) break;\n\t\t\t}\n\t\t\tlet query = this.db\n\t\t\t\t.deleteFrom(\"_emdash_media_usage\")\n\t\t\t\t.where(\"id\", \"in\", idBatch)\n\t\t\t\t.where(\"created_at\", \"<\", cutoff)\n\t\t\t\t.where(\n\t\t\t\t\tsql<boolean>`NOT EXISTS (SELECT 1 FROM _emdash_media_usage_sources source WHERE source.source_key = _emdash_media_usage.source_key)`,\n\t\t\t\t)\n\t\t\t\t.where(this.noActiveGenerationWriteExpression());\n\t\t\tif (cleanupLease) {\n\t\t\t\tquery = query\n\t\t\t\t\t.where(\"cleanup_lease_token\", \"=\", cleanupLease.leaseToken)\n\t\t\t\t\t.where(this.activeCleanupLeaseExpression(cleanupLease));\n\t\t\t}\n\t\t\tconst result = await query.executeTakeFirst();\n\t\t\tdeleted += Number(result.numDeletedRows ?? 0);\n\t\t}\n\t\treturn deleted;\n\t}\n\n\tprivate async deleteStaleCandidateIds(\n\t\tids: readonly string[],\n\t\tcutoff: string,\n\t\tcleanupLease?: MediaUsageCleanupLease,\n\t\tcanIssueStatement?: () => boolean,\n\t): Promise<number> {\n\t\tlet deleted = 0;\n\t\tfor (const idBatch of chunks([...ids], cleanupDeleteBatchSize(cleanupLease))) {\n\t\t\tif (!canIssueCleanupStatement(canIssueStatement)) break;\n\t\t\tif (cleanupLease) {\n\t\t\t\tawait this.markStaleCandidatesForCleanup(idBatch, cutoff, cleanupLease);\n\t\t\t\tif (!canIssueCleanupStatement(canIssueStatement)) break;\n\t\t\t}\n\t\t\tlet query = this.db\n\t\t\t\t.deleteFrom(\"_emdash_media_usage\")\n\t\t\t\t.where(\"id\", \"in\", idBatch)\n\t\t\t\t.where(\"created_at\", \"<\", cutoff)\n\t\t\t\t.where((eb) =>\n\t\t\t\t\teb.exists(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_sources as source\")\n\t\t\t\t\t\t\t.select(\"source.source_key\")\n\t\t\t\t\t\t\t.whereRef(\"source.source_key\", \"=\", \"_emdash_media_usage.source_key\")\n\t\t\t\t\t\t\t.whereRef(\"source.current_generation\", \"!=\", \"_emdash_media_usage.generation\")\n\t\t\t\t\t\t\t.whereRef(\"_emdash_media_usage.created_at\", \"<\", \"source.indexed_at\"),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.where(this.noActiveGenerationWriteExpression());\n\t\t\tif (cleanupLease) {\n\t\t\t\tquery = query\n\t\t\t\t\t.where(\"cleanup_lease_token\", \"=\", cleanupLease.leaseToken)\n\t\t\t\t\t.where(this.activeCleanupLeaseExpression(cleanupLease));\n\t\t\t}\n\t\t\tconst result = await query.executeTakeFirst();\n\t\t\tdeleted += Number(result.numDeletedRows ?? 0);\n\t\t}\n\t\treturn deleted;\n\t}\n\n\tprivate async deleteAbandonedCandidateIds(\n\t\tids: readonly string[],\n\t\tcutoff: string,\n\t\tcleanupLease?: MediaUsageCleanupLease,\n\t\tcanIssueStatement?: () => boolean,\n\t): Promise<number> {\n\t\tlet deleted = 0;\n\t\tfor (const idBatch of chunks([...ids], cleanupDeleteBatchSize(cleanupLease))) {\n\t\t\tif (!canIssueCleanupStatement(canIssueStatement)) break;\n\t\t\tif (cleanupLease) {\n\t\t\t\tawait this.markAbandonedCandidatesForCleanup(idBatch, cutoff, cleanupLease);\n\t\t\t\tif (!canIssueCleanupStatement(canIssueStatement)) break;\n\t\t\t}\n\t\t\tlet query = this.db\n\t\t\t\t.deleteFrom(\"_emdash_media_usage\")\n\t\t\t\t.where(\"id\", \"in\", idBatch)\n\t\t\t\t.where(\"created_at\", \"<\", cutoff)\n\t\t\t\t.where((eb) =>\n\t\t\t\t\teb.exists(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_sources as source\")\n\t\t\t\t\t\t\t.select(\"source.source_key\")\n\t\t\t\t\t\t\t.whereRef(\"source.source_key\", \"=\", \"_emdash_media_usage.source_key\")\n\t\t\t\t\t\t\t.whereRef(\"source.current_generation\", \"!=\", \"_emdash_media_usage.generation\")\n\t\t\t\t\t\t\t.whereRef(\"_emdash_media_usage.created_at\", \">=\", \"source.indexed_at\"),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.where(this.noActiveGenerationWriteExpression());\n\t\t\tif (cleanupLease) {\n\t\t\t\tquery = query\n\t\t\t\t\t.where(\"cleanup_lease_token\", \"=\", cleanupLease.leaseToken)\n\t\t\t\t\t.where(this.activeCleanupLeaseExpression(cleanupLease));\n\t\t\t}\n\t\t\tconst result = await query.executeTakeFirst();\n\t\t\tdeleted += Number(result.numDeletedRows ?? 0);\n\t\t}\n\t\treturn deleted;\n\t}\n\n\tprivate async markOrphanCandidatesForCleanup(\n\t\tids: readonly string[],\n\t\tcutoff: string,\n\t\tcleanupLease: MediaUsageCleanupLease,\n\t): Promise<void> {\n\t\tawait this.db\n\t\t\t.updateTable(\"_emdash_media_usage\")\n\t\t\t.set({ cleanup_lease_token: cleanupLease.leaseToken })\n\t\t\t.where(\"id\", \"in\", ids)\n\t\t\t.where(\"created_at\", \"<\", cutoff)\n\t\t\t.where(\n\t\t\t\tsql<boolean>`NOT EXISTS (SELECT 1 FROM _emdash_media_usage_sources source WHERE source.source_key = _emdash_media_usage.source_key)`,\n\t\t\t)\n\t\t\t.where(this.noActiveGenerationWriteExpression())\n\t\t\t.where(this.activeCleanupLeaseExpression(cleanupLease))\n\t\t\t.execute();\n\t}\n\n\tprivate async markStaleCandidatesForCleanup(\n\t\tids: readonly string[],\n\t\tcutoff: string,\n\t\tcleanupLease: MediaUsageCleanupLease,\n\t): Promise<void> {\n\t\tawait this.db\n\t\t\t.updateTable(\"_emdash_media_usage\")\n\t\t\t.set({ cleanup_lease_token: cleanupLease.leaseToken })\n\t\t\t.where(\"id\", \"in\", ids)\n\t\t\t.where(\"created_at\", \"<\", cutoff)\n\t\t\t.where((eb) =>\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_sources as source\")\n\t\t\t\t\t\t.select(\"source.source_key\")\n\t\t\t\t\t\t.whereRef(\"source.source_key\", \"=\", \"_emdash_media_usage.source_key\")\n\t\t\t\t\t\t.whereRef(\"source.current_generation\", \"!=\", \"_emdash_media_usage.generation\")\n\t\t\t\t\t\t.whereRef(\"_emdash_media_usage.created_at\", \"<\", \"source.indexed_at\"),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.where(this.noActiveGenerationWriteExpression())\n\t\t\t.where(this.activeCleanupLeaseExpression(cleanupLease))\n\t\t\t.execute();\n\t}\n\n\tprivate async markAbandonedCandidatesForCleanup(\n\t\tids: readonly string[],\n\t\tcutoff: string,\n\t\tcleanupLease: MediaUsageCleanupLease,\n\t): Promise<void> {\n\t\tawait this.db\n\t\t\t.updateTable(\"_emdash_media_usage\")\n\t\t\t.set({ cleanup_lease_token: cleanupLease.leaseToken })\n\t\t\t.where(\"id\", \"in\", ids)\n\t\t\t.where(\"created_at\", \"<\", cutoff)\n\t\t\t.where((eb) =>\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_sources as source\")\n\t\t\t\t\t\t.select(\"source.source_key\")\n\t\t\t\t\t\t.whereRef(\"source.source_key\", \"=\", \"_emdash_media_usage.source_key\")\n\t\t\t\t\t\t.whereRef(\"source.current_generation\", \"!=\", \"_emdash_media_usage.generation\")\n\t\t\t\t\t\t.whereRef(\"_emdash_media_usage.created_at\", \">=\", \"source.indexed_at\"),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.where(this.noActiveGenerationWriteExpression())\n\t\t\t.where(this.activeCleanupLeaseExpression(cleanupLease))\n\t\t\t.execute();\n\t}\n\n\tprivate noActiveGenerationWriteExpression(usageTable = \"_emdash_media_usage\") {\n\t\tconst sourceKey = sql.ref(`${usageTable}.source_key`);\n\t\tconst generation = sql.ref(`${usageTable}.generation`);\n\t\treturn sql<boolean>`NOT EXISTS (\n\t\t\t\tSELECT 1\n\t\t\t\tFROM _emdash_media_usage_generation_writes AS writer\n\t\t\t\tWHERE writer.source_key = ${sourceKey}\n\t\t\t\t\tAND writer.generation = ${generation}\n\t\t\t\t\tAND ${this.generationWriteLeaseExpiryIsInFuture(\"writer.expires_at\")}\n\t\t\t)`;\n\t}\n\n\tprivate activeCleanupLeaseExpression(cleanupLease: MediaUsageCleanupLease) {\n\t\tconst rowLock = isPostgres(this.db) ? sql` FOR UPDATE` : sql``;\n\t\treturn sql<boolean>`EXISTS (\n\t\t\t\tSELECT 1\n\t\t\t\tFROM _emdash_media_usage_cleanup AS cleanup\n\t\t\t\tWHERE cleanup.task_key = 'projection_gc'\n\t\t\t\t\tAND cleanup.lease_token = ${cleanupLease.leaseToken}\n\t\t\t\t\tAND ${this.cleanupLeaseExpiryIsInFuture(\"cleanup.lease_expires_at\")}\n\t\t\t\t${rowLock}\n\t\t\t)`;\n\t}\n\n\tprivate cleanupLeaseExpiryIsInFuture(column: string) {\n\t\tconst leaseExpiresAt = sql.ref(column);\n\t\treturn isPostgres(this.db)\n\t\t\t? sql<boolean>`${leaseExpiresAt}::timestamptz > clock_timestamp()`\n\t\t\t: sql<boolean>`${leaseExpiresAt} > strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n\t}\n\n\tprivate cleanupTimestampIsDue(column: string) {\n\t\tconst timestamp = sql.ref(column);\n\t\treturn isPostgres(this.db)\n\t\t\t? sql<boolean>`${timestamp}::timestamptz <= clock_timestamp()`\n\t\t\t: sql<boolean>`${timestamp} <= strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n\t}\n\n\tprivate cleanupTimestampOffset(offsetSeconds: number): RawBuilder<string> {\n\t\tif (isPostgres(this.db)) {\n\t\t\treturn sql<string>`to_char(\n\t\t\t\t(clock_timestamp() AT TIME ZONE 'UTC') + (${offsetSeconds} * INTERVAL '1 second'),\n\t\t\t\t'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"'\n\t\t\t)`;\n\t\t}\n\t\treturn sql<string>`strftime(\n\t\t\t'%Y-%m-%dT%H:%M:%fZ',\n\t\t\t'now',\n\t\t\t${`${offsetSeconds >= 0 ? \"+\" : \"\"}${offsetSeconds} seconds`}\n\t\t)`;\n\t}\n\n\tprivate generationWriteLeaseHasExpired(column: string) {\n\t\tconst leaseExpiresAt = sql.ref(column);\n\t\treturn isPostgres(this.db)\n\t\t\t? sql<boolean>`${leaseExpiresAt}::timestamptz <= clock_timestamp()`\n\t\t\t: sql<boolean>`${leaseExpiresAt} <= strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n\t}\n\n\tprivate async deleteSourceKeys(sourceKeys: readonly string[]): Promise<number> {\n\t\tconst uniqueSourceKeys = [...new Set(sourceKeys)];\n\t\tif (uniqueSourceKeys.length === 0) return 0;\n\n\t\treturn withTransaction(this.db, async (trx) => {\n\t\t\tawait this.lockCleanupBeforeSourceDelete(trx);\n\t\t\tlet deleted = 0;\n\t\t\tfor (const sourceKeyBatch of chunks(uniqueSourceKeys, SQL_BATCH_SIZE)) {\n\t\t\t\tconst result = await trx\n\t\t\t\t\t.deleteFrom(\"_emdash_media_usage_sources\")\n\t\t\t\t\t.where(\"source_key\", \"in\", sourceKeyBatch)\n\t\t\t\t\t.executeTakeFirst();\n\t\t\t\tdeleted += Number(result.numDeletedRows ?? 0);\n\n\t\t\t\tawait trx\n\t\t\t\t\t.updateTable(\"_emdash_media_usage\")\n\t\t\t\t\t.set({ cleanup_lease_token: null })\n\t\t\t\t\t.where(\"source_key\", \"in\", sourceKeyBatch)\n\t\t\t\t\t.execute();\n\t\t\t\tawait trx\n\t\t\t\t\t.deleteFrom(\"_emdash_media_usage\")\n\t\t\t\t\t.where(\"source_key\", \"in\", sourceKeyBatch)\n\t\t\t\t\t.execute();\n\t\t\t}\n\t\t\treturn deleted;\n\t\t});\n\t}\n\n\tprivate async deleteSourceGenerationOccurrences(\n\t\tdb: DatabaseExecutor,\n\t\tsourceKey: string,\n\t\tgeneration: string,\n\t): Promise<void> {\n\t\tawait db\n\t\t\t.updateTable(\"_emdash_media_usage\")\n\t\t\t.set({ cleanup_lease_token: null })\n\t\t\t.where(\"source_key\", \"=\", sourceKey)\n\t\t\t.where(\"generation\", \"=\", generation)\n\t\t\t.execute();\n\t\tawait db\n\t\t\t.deleteFrom(\"_emdash_media_usage\")\n\t\t\t.where(\"source_key\", \"=\", sourceKey)\n\t\t\t.where(\"generation\", \"=\", generation)\n\t\t\t.execute();\n\t}\n\n\tprivate async lockCleanupBeforeSourceDelete(db: DatabaseExecutor): Promise<void> {\n\t\tif (!isPostgres(this.db)) return;\n\t\tawait sql`\n\t\t\tSELECT 1\n\t\t\tFROM _emdash_media_usage_cleanup\n\t\t\tWHERE task_key = 'projection_gc'\n\t\t\tFOR SHARE\n\t\t`.execute(db);\n\t}\n\n\tprivate async insertOccurrences(\n\t\tdb: DatabaseExecutor,\n\t\tsourceKey: string,\n\t\tgeneration: string,\n\t\toccurrences: readonly MediaUsageOccurrenceInput[],\n\t\tnow: string,\n\t): Promise<void> {\n\t\tif (occurrences.length === 0) return;\n\n\t\tconst rows = occurrences.map((occurrence) => ({\n\t\t\tid: ulid(),\n\t\t\tsource_key: sourceKey,\n\t\t\tgeneration,\n\t\t\tfield_slug: occurrence.fieldSlug,\n\t\t\tfield_path: occurrence.fieldPath,\n\t\t\toccurrence_index: occurrence.occurrenceIndex ?? 0,\n\t\t\treference_type: occurrence.referenceType,\n\t\t\tmedia_id: occurrence.mediaId,\n\t\t\tprovider: occurrence.provider,\n\t\t\tprovider_asset_id: occurrence.providerAssetId,\n\t\t\tmedia_kind: occurrence.mediaKind ?? null,\n\t\t\tmime_type: occurrence.mimeType ?? null,\n\t\t\tcreated_at: now,\n\t\t}));\n\n\t\tfor (const rowBatch of chunks(rows, OCCURRENCE_INSERT_BATCH_SIZE)) {\n\t\t\tawait db.insertInto(\"_emdash_media_usage\").values(rowBatch).execute();\n\t\t}\n\t}\n\n\tprivate async lockCanonicalSourceCollection(\n\t\tdb: DatabaseExecutor,\n\t\tsource: MediaUsageSourceInput,\n\t): Promise<boolean> {\n\t\tif (source.collectionId === undefined || source.collectionId === null) return true;\n\t\tif (!source.collectionSlug) return false;\n\t\tif (!isPostgres(this.db)) return true;\n\t\tconst collection = await db\n\t\t\t.selectFrom(\"_emdash_collections\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"id\", \"=\", source.collectionId)\n\t\t\t.where(\"slug\", \"=\", source.collectionSlug)\n\t\t\t.forKeyShare()\n\t\t\t.executeTakeFirst();\n\t\treturn collection !== undefined;\n\t}\n\n\tprivate async upsertSource(\n\t\tdb: DatabaseExecutor,\n\t\tsource: MediaUsageSourceInput,\n\t\tgeneration: string,\n\t\tnow: string,\n\t\tleaseToken: string,\n\t): Promise<boolean> {\n\t\tconst row = this.buildSourceRow(source, generation, now);\n\t\treturn this.persistSourceIfWriteLease(\n\t\t\tdb,\n\t\t\trow,\n\t\t\tleaseToken,\n\t\t\tsql`\n\t\t\t\tON CONFLICT (source_key) DO UPDATE SET\n\t\t\t\t\tsource_type = excluded.source_type,\n\t\t\t\t\tcollection_id = excluded.collection_id,\n\t\t\t\t\tcollection_slug = excluded.collection_slug,\n\t\t\t\t\tcontent_id = excluded.content_id,\n\t\t\t\t\tsource_variant = excluded.source_variant,\n\t\t\t\t\tlocale = excluded.locale,\n\t\t\t\t\ttranslation_group = excluded.translation_group,\n\t\t\t\t\tcontent_slug = excluded.content_slug,\n\t\t\t\t\tcontent_title = excluded.content_title,\n\t\t\t\t\tcontent_status = excluded.content_status,\n\t\t\t\t\tcontent_scheduled_at = excluded.content_scheduled_at,\n\t\t\t\t\tcontent_deleted_at = excluded.content_deleted_at,\n\t\t\t\t\trevision_id = excluded.revision_id,\n\t\t\t\t\tcurrent_generation = excluded.current_generation,\n\t\t\t\t\tschema_version = excluded.schema_version,\n\t\t\t\t\tsource_updated_at = excluded.source_updated_at,\n\t\t\t\t\tsource_version = excluded.source_version,\n\t\t\t\t\tsource_fingerprint = excluded.source_fingerprint,\n\t\t\t\t\tidentity_version = excluded.identity_version,\n\t\t\t\t\tsource_completeness = excluded.source_completeness,\n\t\t\t\t\tlast_attempted_at = excluded.last_attempted_at,\n\t\t\t\t\tlast_error_code = excluded.last_error_code,\n\t\t\t\t\tindexed_at = excluded.indexed_at,\n\t\t\t\t\tupdated_at = excluded.updated_at\n\t\t\t`,\n\t\t);\n\t}\n\n\tprivate async insertSourceIfAbsent(\n\t\tdb: DatabaseExecutor,\n\t\trow: ReturnType<MediaUsageRepository[\"buildSourceRow\"]>,\n\t\tleaseToken: string,\n\t): Promise<boolean> {\n\t\treturn this.persistSourceIfWriteLease(\n\t\t\tdb,\n\t\t\trow,\n\t\t\tleaseToken,\n\t\t\tsql`ON CONFLICT (source_key) DO NOTHING`,\n\t\t);\n\t}\n\n\tprivate async persistSourceIfWriteLease(\n\t\tdb: DatabaseExecutor,\n\t\trow:\n\t\t\t| ReturnType<MediaUsageRepository[\"buildSourceRow\"]>\n\t\t\t| ReturnType<MediaUsageRepository[\"buildAttemptedSourceRow\"]>,\n\t\tleaseToken: string,\n\t\tconflict: RawBuilder<unknown>,\n\t): Promise<boolean> {\n\t\tconst result = await sql`\n\t\t\tINSERT INTO _emdash_media_usage_sources (\n\t\t\t\tsource_key,\n\t\t\t\tsource_type,\n\t\t\t\tcollection_id,\n\t\t\t\tcollection_slug,\n\t\t\t\tcontent_id,\n\t\t\t\tsource_variant,\n\t\t\t\tlocale,\n\t\t\t\ttranslation_group,\n\t\t\t\tcontent_slug,\n\t\t\t\tcontent_title,\n\t\t\t\tcontent_status,\n\t\t\t\tcontent_scheduled_at,\n\t\t\t\tcontent_deleted_at,\n\t\t\t\trevision_id,\n\t\t\t\tcurrent_generation,\n\t\t\t\tschema_version,\n\t\t\t\tsource_updated_at,\n\t\t\t\tsource_version,\n\t\t\t\tsource_fingerprint,\n\t\t\t\tidentity_version,\n\t\t\t\tsource_completeness,\n\t\t\t\tlast_attempted_at,\n\t\t\t\tlast_error_code,\n\t\t\t\tindexed_at,\n\t\t\t\tupdated_at\n\t\t\t)\n\t\t\tSELECT\n\t\t\t\t${row.source_key},\n\t\t\t\t${row.source_type},\n\t\t\t\t${row.collection_id},\n\t\t\t\t${row.collection_slug},\n\t\t\t\t${row.content_id},\n\t\t\t\t${row.source_variant},\n\t\t\t\t${row.locale},\n\t\t\t\t${row.translation_group},\n\t\t\t\t${row.content_slug},\n\t\t\t\t${row.content_title},\n\t\t\t\t${row.content_status},\n\t\t\t\t${row.content_scheduled_at},\n\t\t\t\t${row.content_deleted_at},\n\t\t\t\t${row.revision_id},\n\t\t\t\t${row.current_generation},\n\t\t\t\t${row.schema_version},\n\t\t\t\t${row.source_updated_at},\n\t\t\t\t${row.source_version},\n\t\t\t\t${row.source_fingerprint},\n\t\t\t\t${row.identity_version},\n\t\t\t\t${row.source_completeness},\n\t\t\t\t${row.last_attempted_at},\n\t\t\t\t${row.last_error_code},\n\t\t\t\t${row.indexed_at},\n\t\t\t\t${row.updated_at}\n\t\t\tWHERE EXISTS (\n\t\t\t\tSELECT 1\n\t\t\t\tFROM _emdash_media_usage_generation_writes\n\t\t\t\tWHERE source_key = ${row.source_key}\n\t\t\t\t\tAND generation = ${row.current_generation}\n\t\t\t\t\tAND lease_token = ${leaseToken}\n\t\t\t\t\tAND ${this.generationWriteLeaseExpiryIsInFuture(\"expires_at\")}\n\t\t\t)\n\t\t\tAND ${this.currentCollectionExists(row.collection_id, row.collection_slug)}\n\t\t\tAND ${this.currentCanonicalContentExists(row)}\n\t\t\t${conflict}\n\t\t`.execute(db);\n\t\treturn Number(result.numAffectedRows ?? 0) > 0;\n\t}\n\n\tprivate generationWriteLeaseExpression(\n\t\trow: ReturnType<MediaUsageRepository[\"buildSourceRow\"]>,\n\t\tleaseToken: string,\n\t) {\n\t\treturn (eb: ExpressionBuilder<Database, \"_emdash_media_usage_sources\">) =>\n\t\t\teb.exists(\n\t\t\t\teb\n\t\t\t\t\t.selectFrom(\"_emdash_media_usage_generation_writes\")\n\t\t\t\t\t.select(\"source_key\")\n\t\t\t\t\t.where(\"source_key\", \"=\", row.source_key)\n\t\t\t\t\t.where(\"generation\", \"=\", row.current_generation)\n\t\t\t\t\t.where(\"lease_token\", \"=\", leaseToken)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tthis.generationWriteLeaseExpiryIsInFuture(\n\t\t\t\t\t\t\t\"_emdash_media_usage_generation_writes.expires_at\",\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t);\n\t}\n\n\tprivate generationWriteLeaseExpiryIsInFuture(column: string) {\n\t\tconst leaseExpiresAt = sql.ref(column);\n\t\treturn isPostgres(this.db)\n\t\t\t? sql<boolean>`${leaseExpiresAt}::timestamptz > clock_timestamp()`\n\t\t\t: sql<boolean>`${leaseExpiresAt} > strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n\t}\n\n\tprivate async withGenerationWriteLease(\n\t\tsource: Pick<MediaUsageSourceInput, \"sourceKey\" | \"collectionId\" | \"collectionSlug\">,\n\t\tgeneration: string,\n\t\twrite: (leaseToken: string, startedAt: string) => Promise<void>,\n\t): Promise<boolean> {\n\t\tconst leaseToken = ulid();\n\t\tconst lease = await sql<{ created_at: string }>`\n\t\t\tINSERT INTO _emdash_media_usage_generation_writes (\n\t\t\t\tsource_key, generation, lease_token, expires_at, created_at\n\t\t\t)\n\t\t\tSELECT\n\t\t\t\t${source.sourceKey},\n\t\t\t\t${generation},\n\t\t\t\t${leaseToken},\n\t\t\t\t${this.generationWriteLeaseTimestampOffset(MEDIA_USAGE_GENERATION_WRITE_LEASE_MS / 1000)},\n\t\t\t\t${this.generationWriteLeaseTimestampOffset(0)}\n\t\t\tWHERE ${this.currentCollectionExists(\n\t\t\t\tsource.collectionId ?? null,\n\t\t\t\tsource.collectionSlug ?? null,\n\t\t\t)}\n\t\t\tRETURNING created_at\n\t\t`.execute(this.db);\n\t\tconst owner = lease.rows[0];\n\t\tif (!owner) return false;\n\n\t\ttry {\n\t\t\tawait write(leaseToken, owner.created_at);\n\t\t\treturn true;\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tawait this.db\n\t\t\t\t\t.deleteFrom(\"_emdash_media_usage_generation_writes\")\n\t\t\t\t\t.where(\"source_key\", \"=\", source.sourceKey)\n\t\t\t\t\t.where(\"generation\", \"=\", generation)\n\t\t\t\t\t.where(\"lease_token\", \"=\", leaseToken)\n\t\t\t\t\t.execute();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"[media-usage] Failed to release generation write lease:\", error);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate generationWriteLeaseTimestampOffset(offsetSeconds: number): RawBuilder<string> {\n\t\tif (isPostgres(this.db)) {\n\t\t\treturn sql<string>`to_char(\n\t\t\t\t(clock_timestamp() AT TIME ZONE 'UTC') + (${offsetSeconds} * INTERVAL '1 second'),\n\t\t\t\t'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"'\n\t\t\t)`;\n\t\t}\n\t\treturn sql<string>`strftime(\n\t\t\t'%Y-%m-%dT%H:%M:%fZ',\n\t\t\t'now',\n\t\t\t${`${offsetSeconds >= 0 ? \"+\" : \"\"}${offsetSeconds} seconds`}\n\t\t)`;\n\t}\n\n\tprivate async updateSourceIfGeneration(\n\t\tdb: DatabaseExecutor,\n\t\trow: ReturnType<MediaUsageRepository[\"buildSourceRow\"]>,\n\t\texpectedCurrentGeneration: string,\n\t\tleaseToken: string,\n\t): Promise<boolean> {\n\t\tconst result = await db\n\t\t\t.updateTable(\"_emdash_media_usage_sources\")\n\t\t\t.set(this.sourceUpdateSet(row))\n\t\t\t.where(\"source_key\", \"=\", row.source_key)\n\t\t\t.where(\"current_generation\", \"=\", expectedCurrentGeneration)\n\t\t\t.where(this.generationWriteLeaseExpression(row, leaseToken))\n\t\t\t.where(this.currentCollectionExists(row.collection_id, row.collection_slug))\n\t\t\t.where(this.currentCanonicalContentExists(row))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) > 0;\n\t}\n\n\tprivate async updateSourceIfMatching(\n\t\tdb: DatabaseExecutor,\n\t\trow: ReturnType<MediaUsageRepository[\"buildSourceRow\"]>,\n\t\texpectedSource: MediaUsageSource,\n\t\tleaseToken: string,\n\t): Promise<boolean> {\n\t\tconst result = await db\n\t\t\t.updateTable(\"_emdash_media_usage_sources\")\n\t\t\t.set(this.sourceUpdateSet(row))\n\t\t\t.where(\"source_key\", \"=\", row.source_key)\n\t\t\t.where(this.sourceMatchExpression(expectedSource))\n\t\t\t.where(this.generationWriteLeaseExpression(row, leaseToken))\n\t\t\t.where(this.currentCollectionExists(row.collection_id, row.collection_slug))\n\t\t\t.where(this.currentCanonicalContentExists(row))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) > 0;\n\t}\n\n\tprivate async updateAttemptedSourceIfMatching(\n\t\tdb: DatabaseExecutor,\n\t\tsource: MediaUsageSourceInput,\n\t\trow: ReturnType<MediaUsageRepository[\"buildAttemptedSourceRow\"]>,\n\t\texpectedSource: MediaUsageSource,\n\t): Promise<boolean> {\n\t\tconst result = await db\n\t\t\t.updateTable(\"_emdash_media_usage_sources\")\n\t\t\t.set(this.attemptedSourceUpdateSet(source, row))\n\t\t\t.where(\"source_key\", \"=\", row.source_key)\n\t\t\t.where(this.sourceMatchExpression(expectedSource))\n\t\t\t.where(this.currentCollectionExists(row.collection_id, row.collection_slug))\n\t\t\t.where(this.currentCanonicalContentExists(row))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) > 0;\n\t}\n\n\tprivate sourceMatchExpression(expectedSource: MediaUsageSource) {\n\t\treturn (eb: ExpressionBuilder<Database, \"_emdash_media_usage_sources\">) =>\n\t\t\teb.and([\n\t\t\t\teb(\"current_generation\", \"=\", expectedSource.currentGeneration),\n\t\t\t\teb(\"source_completeness\", \"=\", expectedSource.sourceCompleteness),\n\t\t\t\tthis.nullableStringExpression(eb, \"collection_id\", expectedSource.collectionId),\n\t\t\t\tthis.nullableStringExpression(eb, \"updated_at\", expectedSource.updatedAt),\n\t\t\t\tthis.nullableStringExpression(eb, \"source_fingerprint\", expectedSource.sourceFingerprint),\n\t\t\t\tthis.nullableStringExpression(eb, \"source_updated_at\", expectedSource.sourceUpdatedAt),\n\t\t\t\tthis.nullableNumberExpression(eb, \"source_version\", expectedSource.sourceVersion),\n\t\t\t\tthis.nullableNumberExpression(eb, \"identity_version\", expectedSource.identityVersion),\n\t\t\t\tthis.nullableStringExpression(eb, \"revision_id\", expectedSource.revisionId),\n\t\t\t\tthis.nullableStringExpression(eb, \"last_attempted_at\", expectedSource.lastAttemptedAt),\n\t\t\t\tthis.nullableStringExpression(eb, \"last_error_code\", expectedSource.lastErrorCode),\n\t\t\t]);\n\t}\n\n\tprivate async projectionMatchesCurrentGeneration(\n\t\tsource: MediaUsageSourceInput,\n\t\texpectedCurrentGeneration: string,\n\t): Promise<boolean> {\n\t\tconst fingerprint = source.sourceFingerprint;\n\t\tif (!isMediaUsageProjectionFingerprint(fingerprint)) return false;\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources\")\n\t\t\t.select(\"source_key\")\n\t\t\t.where(\"source_key\", \"=\", source.sourceKey)\n\t\t\t.where(\"current_generation\", \"=\", expectedCurrentGeneration)\n\t\t\t.where(\"source_fingerprint\", \"=\", fingerprint!)\n\t\t\t.where(\"source_completeness\", \"=\", source.sourceCompleteness ?? \"complete\")\n\t\t\t.where(\"last_error_code\", \"is\", null)\n\t\t\t.where(\n\t\t\t\tthis.currentCollectionExists(source.collectionId ?? null, source.collectionSlug ?? null),\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn row !== undefined;\n\t}\n\n\tasync projectionMatchesExpectedSource(\n\t\tsource: MediaUsageSourceInput,\n\t\texpectedSource: MediaUsageSource,\n\t): Promise<boolean> {\n\t\tconst fingerprint = source.sourceFingerprint;\n\t\tif (\n\t\t\t!isMediaUsageProjectionFingerprint(fingerprint) ||\n\t\t\texpectedSource.sourceFingerprint !== fingerprint ||\n\t\t\texpectedSource.sourceCompleteness !== (source.sourceCompleteness ?? \"complete\") ||\n\t\t\texpectedSource.lastErrorCode !== null\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources\")\n\t\t\t.select(\"source_key\")\n\t\t\t.where(\"source_key\", \"=\", source.sourceKey)\n\t\t\t.where(this.sourceMatchExpression(expectedSource))\n\t\t\t.where(\n\t\t\t\tthis.currentCollectionExists(source.collectionId ?? null, source.collectionSlug ?? null),\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn row !== undefined;\n\t}\n\n\tprivate nullableStringExpression(\n\t\teb: ExpressionBuilder<Database, \"_emdash_media_usage_sources\">,\n\t\tcolumn: MediaUsageSourceNullableStringColumn,\n\t\tvalue: string | null,\n\t) {\n\t\treturn value === null ? eb(column, \"is\", null) : eb(column, \"=\", value);\n\t}\n\n\tprivate currentCollectionExists(\n\t\tcollectionId: string | null,\n\t\tcollectionSlug: string | null,\n\t): RawBuilder<boolean> {\n\t\tif (collectionId === null) return sql<boolean>`1 = 1`;\n\t\treturn sql<boolean>`EXISTS (\n\t\t\tSELECT 1\n\t\t\tFROM _emdash_collections\n\t\t\tWHERE id = ${collectionId}\n\t\t\t\tAND slug = ${collectionSlug}\n\t\t)`;\n\t}\n\n\tprivate currentCanonicalContentExists(\n\t\trow:\n\t\t\t| ReturnType<MediaUsageRepository[\"buildSourceRow\"]>\n\t\t\t| ReturnType<MediaUsageRepository[\"buildAttemptedSourceRow\"]>,\n\t): RawBuilder<boolean> {\n\t\tif (row.collection_id === null || row.identity_version !== 1 || row.source_type !== \"content\") {\n\t\t\treturn sql<boolean>`1 = 1`;\n\t\t}\n\t\tif (\n\t\t\t!row.collection_slug ||\n\t\t\t!row.content_id ||\n\t\t\trow.source_version === null ||\n\t\t\trow.source_updated_at === null\n\t\t) {\n\t\t\treturn sql<boolean>`1 = 0`;\n\t\t}\n\t\tvalidateIdentifier(row.collection_slug, \"collection slug\");\n\t\tconst tableName = `ec_${row.collection_slug}`;\n\t\tvalidateIdentifier(tableName, \"content table\");\n\t\tconst revisionColumn =\n\t\t\trow.source_variant === \"columns\"\n\t\t\t\t? \"live_revision_id\"\n\t\t\t\t: row.source_variant === \"draft_overlay\"\n\t\t\t\t\t? \"draft_revision_id\"\n\t\t\t\t\t: null;\n\t\tif (!revisionColumn) return sql<boolean>`1 = 0`;\n\t\tconst revision = sql.ref(`content.${revisionColumn}`);\n\t\tconst revisionMatches =\n\t\t\trow.revision_id === null\n\t\t\t\t? sql<boolean>`${revision} IS NULL`\n\t\t\t\t: sql<boolean>`${revision} = ${row.revision_id}`;\n\t\treturn sql<boolean>`EXISTS (\n\t\t\tSELECT 1\n\t\t\tFROM ${sql.ref(tableName)} AS content\n\t\t\tWHERE content.id = ${row.content_id}\n\t\t\t\tAND content.version = ${row.source_version}\n\t\t\t\tAND content.updated_at = ${row.source_updated_at}\n\t\t\t\tAND ${revisionMatches}\n\t\t)`;\n\t}\n\n\tprivate nullableNumberExpression(\n\t\teb: ExpressionBuilder<Database, \"_emdash_media_usage_sources\">,\n\t\tcolumn: \"source_version\" | \"identity_version\",\n\t\tvalue: number | null,\n\t) {\n\t\treturn value === null ? eb(column, \"is\", null) : eb(column, \"=\", value);\n\t}\n\n\tprivate async contentRowExists(tableName: string, contentId: string): Promise<boolean> {\n\t\tconst result = await sql<{ id: string }>`\n\t\t\tSELECT id\n\t\t\tFROM ${sql.ref(tableName)}\n\t\t\tWHERE id = ${contentId}\n\t\t\tLIMIT 1\n\t\t`.execute(this.db);\n\t\treturn result.rows.length > 0;\n\t}\n\n\tprivate buildSourceRow(source: MediaUsageSourceInput, generation: string, now: string) {\n\t\treturn {\n\t\t\tsource_key: source.sourceKey,\n\t\t\tsource_type: source.sourceType,\n\t\t\tcollection_id: source.collectionId ?? null,\n\t\t\tcollection_slug: source.collectionSlug ?? null,\n\t\t\tcontent_id: source.contentId ?? null,\n\t\t\tsource_variant: source.sourceVariant,\n\t\t\tlocale: source.locale ?? null,\n\t\t\ttranslation_group: source.translationGroup ?? null,\n\t\t\tcontent_slug: source.contentSlug ?? null,\n\t\t\tcontent_title: source.contentTitle ?? null,\n\t\t\tcontent_status: source.contentStatus ?? null,\n\t\t\tcontent_scheduled_at: source.contentScheduledAt ?? null,\n\t\t\tcontent_deleted_at: source.contentDeletedAt ?? null,\n\t\t\trevision_id: source.revisionId ?? null,\n\t\t\tcurrent_generation: generation,\n\t\t\tschema_version: source.schemaVersion ?? 1,\n\t\t\tsource_updated_at: source.sourceUpdatedAt ?? null,\n\t\t\tsource_version: source.sourceVersion ?? null,\n\t\t\tsource_fingerprint: source.sourceFingerprint ?? null,\n\t\t\tidentity_version: source.identityVersion ?? null,\n\t\t\t// Complete means this source was fully refreshed for the extractor's current\n\t\t\t// schema/version coverage, not that every possible reference shape is known.\n\t\t\tsource_completeness: source.sourceCompleteness ?? \"complete\",\n\t\t\tlast_attempted_at: source.lastAttemptedAt ?? now,\n\t\t\tlast_error_code: null,\n\t\t\tindexed_at: now,\n\t\t\tupdated_at: now,\n\t\t};\n\t}\n\n\tprivate buildAttemptedSourceRow(source: MediaUsageSourceInput, generation: string, now: string) {\n\t\treturn {\n\t\t\tsource_key: source.sourceKey,\n\t\t\tsource_type: source.sourceType,\n\t\t\tcollection_id: source.collectionId ?? null,\n\t\t\tcollection_slug: source.collectionSlug ?? null,\n\t\t\tcontent_id: source.contentId ?? null,\n\t\t\tsource_variant: source.sourceVariant,\n\t\t\tlocale: source.locale ?? null,\n\t\t\ttranslation_group: source.translationGroup ?? null,\n\t\t\tcontent_slug: source.contentSlug ?? null,\n\t\t\tcontent_title: source.contentTitle ?? null,\n\t\t\tcontent_status: source.contentStatus ?? null,\n\t\t\tcontent_scheduled_at: source.contentScheduledAt ?? null,\n\t\t\tcontent_deleted_at: source.contentDeletedAt ?? null,\n\t\t\trevision_id: source.revisionId ?? null,\n\t\t\tcurrent_generation: generation,\n\t\t\tschema_version: source.schemaVersion ?? 1,\n\t\t\tsource_updated_at: source.sourceUpdatedAt ?? null,\n\t\t\tsource_version: source.sourceVersion ?? null,\n\t\t\tsource_fingerprint: source.sourceFingerprint ?? null,\n\t\t\tidentity_version: source.identityVersion ?? null,\n\t\t\tsource_completeness:\n\t\t\t\tsource.sourceCompleteness ?? (source.lastErrorCode ? \"failed\" : \"unknown\"),\n\t\t\tlast_attempted_at: source.lastAttemptedAt ?? now,\n\t\t\tlast_error_code: source.lastErrorCode ?? null,\n\t\t\tindexed_at: now,\n\t\t\tupdated_at: now,\n\t\t};\n\t}\n\n\tprivate attemptedSourceUpdateSet(\n\t\tsource: MediaUsageSourceInput,\n\t\trow: ReturnType<MediaUsageRepository[\"buildAttemptedSourceRow\"]>,\n\t): Updateable<MediaUsageSourceTable> {\n\t\tconst updates: Updateable<MediaUsageSourceTable> = {\n\t\t\tsource_type: row.source_type,\n\t\t\tsource_variant: row.source_variant,\n\t\t\tsource_completeness: row.source_completeness,\n\t\t\tlast_attempted_at: row.last_attempted_at,\n\t\t\tlast_error_code: row.last_error_code,\n\t\t\tupdated_at: row.updated_at,\n\t\t};\n\n\t\tif (source.collectionSlug !== undefined) updates.collection_slug = row.collection_slug;\n\t\tif (source.collectionId !== undefined) updates.collection_id = row.collection_id;\n\t\tif (source.contentId !== undefined) updates.content_id = row.content_id;\n\t\tif (source.locale !== undefined) updates.locale = row.locale;\n\t\tif (source.translationGroup !== undefined) updates.translation_group = row.translation_group;\n\t\tif (source.contentSlug !== undefined) updates.content_slug = row.content_slug;\n\t\tif (source.contentTitle !== undefined) updates.content_title = row.content_title;\n\t\tif (source.contentStatus !== undefined) updates.content_status = row.content_status;\n\t\tif (source.contentScheduledAt !== undefined) {\n\t\t\tupdates.content_scheduled_at = row.content_scheduled_at;\n\t\t}\n\t\tif (source.contentDeletedAt !== undefined) updates.content_deleted_at = row.content_deleted_at;\n\t\tif (source.revisionId !== undefined) updates.revision_id = row.revision_id;\n\t\tif (source.schemaVersion !== undefined) updates.schema_version = row.schema_version;\n\t\tif (source.sourceUpdatedAt !== undefined) updates.source_updated_at = row.source_updated_at;\n\t\tif (source.sourceVersion !== undefined) updates.source_version = row.source_version;\n\t\tif (source.sourceFingerprint !== undefined) {\n\t\t\tupdates.source_fingerprint = row.source_fingerprint;\n\t\t}\n\t\tif (source.identityVersion !== undefined) updates.identity_version = row.identity_version;\n\n\t\treturn updates;\n\t}\n\n\tprivate sourceUpdateSet(\n\t\trow: ReturnType<MediaUsageRepository[\"buildSourceRow\"]>,\n\t): Updateable<MediaUsageSourceTable> {\n\t\treturn {\n\t\t\tsource_type: row.source_type,\n\t\t\tcollection_id: row.collection_id,\n\t\t\tcollection_slug: row.collection_slug,\n\t\t\tcontent_id: row.content_id,\n\t\t\tsource_variant: row.source_variant,\n\t\t\tlocale: row.locale,\n\t\t\ttranslation_group: row.translation_group,\n\t\t\tcontent_slug: row.content_slug,\n\t\t\tcontent_title: row.content_title,\n\t\t\tcontent_status: row.content_status,\n\t\t\tcontent_scheduled_at: row.content_scheduled_at,\n\t\t\tcontent_deleted_at: row.content_deleted_at,\n\t\t\trevision_id: row.revision_id,\n\t\t\tcurrent_generation: row.current_generation,\n\t\t\tschema_version: row.schema_version,\n\t\t\tsource_updated_at: row.source_updated_at,\n\t\t\tsource_version: row.source_version,\n\t\t\tsource_fingerprint: row.source_fingerprint,\n\t\t\tidentity_version: row.identity_version,\n\t\t\tsource_completeness: row.source_completeness,\n\t\t\tlast_attempted_at: row.last_attempted_at,\n\t\t\tlast_error_code: row.last_error_code,\n\t\t\tindexed_at: row.indexed_at,\n\t\t\tupdated_at: row.updated_at,\n\t\t};\n\t}\n}\n\nconst currentUsageSelect = [\n\t\"s.source_key as source_key\",\n\t\"s.source_type as source_type\",\n\t\"s.collection_id as collection_id\",\n\t\"s.collection_slug as collection_slug\",\n\t\"s.content_id as content_id\",\n\t\"s.source_variant as source_variant\",\n\t\"s.locale as locale\",\n\t\"s.translation_group as translation_group\",\n\t\"s.content_slug as content_slug\",\n\t\"s.content_title as content_title\",\n\t\"s.content_status as content_status\",\n\t\"s.content_scheduled_at as content_scheduled_at\",\n\t\"s.content_deleted_at as content_deleted_at\",\n\t\"s.revision_id as revision_id\",\n\t\"s.current_generation as current_generation\",\n\t\"s.schema_version as schema_version\",\n\t\"s.source_updated_at as source_updated_at\",\n\t\"s.source_version as source_version\",\n\t\"s.source_fingerprint as source_fingerprint\",\n\t\"s.identity_version as identity_version\",\n\t\"s.source_completeness as source_completeness\",\n\t\"s.last_attempted_at as last_attempted_at\",\n\t\"s.last_error_code as last_error_code\",\n\t\"s.indexed_at as indexed_at\",\n\t\"s.created_at as source_created_at\",\n\t\"s.updated_at as source_row_updated_at\",\n\t\"u.id as occurrence_id\",\n\t\"u.generation as generation\",\n\t\"u.field_slug as field_slug\",\n\t\"u.field_path as field_path\",\n\t\"u.occurrence_index as occurrence_index\",\n\t\"u.reference_type as reference_type\",\n\t\"u.media_id as media_id\",\n\t\"u.provider as provider\",\n\t\"u.provider_asset_id as provider_asset_id\",\n\t\"u.media_kind as media_kind\",\n\t\"u.mime_type as mime_type\",\n\t\"u.created_at as occurrence_created_at\",\n] as const;\n\nfunction groupUsageRows(rows: readonly GroupedUsageRow[]): MediaUsageEntryGroup[] {\n\tconst groups: MediaUsageEntryGroup[] = [];\n\n\tfor (const row of rows) {\n\t\tif (row.collection_slug === null || row.content_id === null) continue;\n\t\tconst record = rowToUsageRecord(row);\n\t\tlet group = groups.at(-1);\n\t\tif (\n\t\t\t!group ||\n\t\t\tgroup.collectionSlug !== row.collection_slug ||\n\t\t\tgroup.contentId !== row.content_id\n\t\t) {\n\t\t\tgroup = {\n\t\t\t\tcollectionSlug: row.collection_slug,\n\t\t\t\tcontentId: row.content_id,\n\t\t\t\tcontentDeletedAt: row.entry_deleted_at,\n\t\t\t\tsources: [],\n\t\t\t};\n\t\t\tgroups.push(group);\n\t\t}\n\n\t\tlet source = group.sources.at(-1);\n\t\tif (!source || source.source.sourceKey !== record.source.sourceKey) {\n\t\t\tsource = { source: record.source, occurrences: [] };\n\t\t\tgroup.sources.push(source);\n\t\t}\n\t\tsource.occurrences.push(record.occurrence);\n\t}\n\n\treturn groups;\n}\n\nfunction rowToSource(row: MediaUsageSourceRow): MediaUsageSource {\n\treturn {\n\t\tsourceKey: row.source_key,\n\t\tsourceType: row.source_type,\n\t\tcollectionId: row.collection_id,\n\t\tcollectionSlug: row.collection_slug,\n\t\tcontentId: row.content_id,\n\t\tsourceVariant: row.source_variant,\n\t\tlocale: row.locale,\n\t\ttranslationGroup: row.translation_group,\n\t\tcontentSlug: row.content_slug,\n\t\tcontentTitle: row.content_title,\n\t\tcontentStatus: row.content_status,\n\t\tcontentScheduledAt: row.content_scheduled_at,\n\t\tcontentDeletedAt: row.content_deleted_at,\n\t\trevisionId: row.revision_id,\n\t\tcurrentGeneration: row.current_generation,\n\t\tschemaVersion: Number(row.schema_version),\n\t\tsourceUpdatedAt: row.source_updated_at,\n\t\tsourceVersion: row.source_version === null ? null : Number(row.source_version),\n\t\tsourceFingerprint: row.source_fingerprint,\n\t\tidentityVersion: row.identity_version === null ? null : Number(row.identity_version),\n\t\tsourceCompleteness: row.source_completeness,\n\t\tlastAttemptedAt: row.last_attempted_at,\n\t\tlastErrorCode: row.last_error_code,\n\t\tindexedAt: row.indexed_at,\n\t\tcreatedAt: row.created_at,\n\t\tupdatedAt: row.updated_at,\n\t};\n}\n\nfunction rowToOccurrence(row: Selectable<MediaUsageTable>): MediaUsageOccurrence {\n\treturn {\n\t\tid: row.id,\n\t\tsourceKey: row.source_key,\n\t\tgeneration: row.generation,\n\t\tfieldSlug: row.field_slug,\n\t\tfieldPath: row.field_path,\n\t\toccurrenceIndex: Number(row.occurrence_index),\n\t\treferenceType: row.reference_type,\n\t\tmediaId: row.media_id,\n\t\tprovider: row.provider,\n\t\tproviderAssetId: row.provider_asset_id,\n\t\tmediaKind: row.media_kind,\n\t\tmimeType: row.mime_type,\n\t\tcreatedAt: row.created_at,\n\t};\n}\n\nfunction rowToUsageRecord(row: JoinedUsageRow): MediaUsageRecord {\n\treturn {\n\t\tsource: rowToSource({\n\t\t\tsource_key: row.source_key,\n\t\t\tsource_type: row.source_type,\n\t\t\tcollection_id: row.collection_id,\n\t\t\tcollection_slug: row.collection_slug,\n\t\t\tcontent_id: row.content_id,\n\t\t\tsource_variant: row.source_variant,\n\t\t\tlocale: row.locale,\n\t\t\ttranslation_group: row.translation_group,\n\t\t\tcontent_slug: row.content_slug,\n\t\t\tcontent_title: row.content_title,\n\t\t\tcontent_status: row.content_status,\n\t\t\tcontent_scheduled_at: row.content_scheduled_at,\n\t\t\tcontent_deleted_at: row.content_deleted_at,\n\t\t\trevision_id: row.revision_id,\n\t\t\tcurrent_generation: row.current_generation,\n\t\t\tschema_version: row.schema_version,\n\t\t\tsource_updated_at: row.source_updated_at,\n\t\t\tsource_version: row.source_version,\n\t\t\tsource_fingerprint: row.source_fingerprint,\n\t\t\tidentity_version: row.identity_version,\n\t\t\tsource_completeness: row.source_completeness,\n\t\t\tlast_attempted_at: row.last_attempted_at,\n\t\t\tlast_error_code: row.last_error_code,\n\t\t\tindexed_at: row.indexed_at,\n\t\t\tcreated_at: row.source_created_at,\n\t\t\tupdated_at: row.source_row_updated_at,\n\t\t}),\n\t\toccurrence: rowToOccurrence({\n\t\t\tid: row.occurrence_id,\n\t\t\tsource_key: row.source_key,\n\t\t\tgeneration: row.generation,\n\t\t\tfield_slug: row.field_slug,\n\t\t\tfield_path: row.field_path,\n\t\t\toccurrence_index: row.occurrence_index,\n\t\t\treference_type: row.reference_type,\n\t\t\tmedia_id: row.media_id,\n\t\t\tprovider: row.provider,\n\t\t\tprovider_asset_id: row.provider_asset_id,\n\t\t\tmedia_kind: row.media_kind,\n\t\t\tmime_type: row.mime_type,\n\t\t\tcreated_at: row.occurrence_created_at,\n\t\t\tcleanup_lease_token: null,\n\t\t}),\n\t};\n}\n\nfunction rowToIndexStatus(row: Selectable<MediaUsageIndexStatusTable>): MediaUsageIndexStatus {\n\treturn {\n\t\tadapterId: row.adapter_id,\n\t\tscopeType: row.scope_type,\n\t\tscopeKey: row.scope_key,\n\t\tstatus: row.status,\n\t\tschemaVersion: Number(row.schema_version),\n\t\tstartedAt: row.started_at,\n\t\tcompletedAt: row.completed_at,\n\t\tcursor: row.cursor,\n\t\tindexedSourceCount: Number(row.indexed_source_count),\n\t\tfailedSourceCount: Number(row.failed_source_count),\n\t\tlastErrorCode: row.last_error_code,\n\t\tupdatedAt: row.updated_at,\n\t};\n}\n","import type { FieldType } from \"../../schema/types.js\";\n\nexport const CONTENT_SOURCE_SCHEMA_VERSION = 1;\n\nexport type MediaKind =\n\t| \"image\"\n\t| \"video\"\n\t| \"audio\"\n\t| \"document\"\n\t| \"archive\"\n\t| \"font\"\n\t| \"text\"\n\t| \"other\";\n\nexport type MediaUsageReferenceType = \"image_field\" | \"file_field\" | \"portable_text_image\";\n\nexport interface MediaUsageExtractionSubField {\n\tslug: string;\n\ttype: FieldType;\n\tlabel?: string;\n}\n\nexport interface MediaUsageExtractionValidation {\n\tsubFields?: readonly MediaUsageExtractionSubField[];\n}\n\nexport interface MediaUsageExtractionField {\n\tslug: string;\n\ttype: FieldType;\n\tvalidation?: MediaUsageExtractionValidation | null;\n}\n\nexport interface ExtractMediaUsageOccurrencesInput {\n\tfields: readonly MediaUsageExtractionField[];\n\tdata: Record<string, unknown>;\n}\n\nexport interface ExtractedMediaUsageOccurrence {\n\tfieldSlug: string;\n\tfieldPath: string;\n\toccurrenceIndex: number;\n\treferenceType: MediaUsageReferenceType;\n\tmediaId: string | null;\n\tprovider: string;\n\tproviderAssetId: string;\n\tmediaKind: MediaKind | null;\n\tmimeType: string | null;\n}\n","import type { Kysely } from \"kysely\";\n\nimport type { Database } from \"../../database/types.js\";\nimport { validateIdentifier } from \"../../database/validate.js\";\nimport { buildCanonicalSha256Fingerprint } from \"./projection-fingerprint.js\";\nimport type { MediaUsageExtractionField, MediaUsageExtractionSubField } from \"./types.js\";\nimport { CONTENT_SOURCE_SCHEMA_VERSION } from \"./types.js\";\n\nexport type ContentMediaUsageField = MediaUsageExtractionField;\n\nexport interface ContentMediaUsageFieldDiscovery {\n\textractionFields: ContentMediaUsageField[];\n\tdisplayFieldSlugs: string[];\n}\n\nexport async function buildContentMediaUsageFieldFingerprint(\n\tdiscovery: ContentMediaUsageFieldDiscovery,\n): Promise<string> {\n\tconst extractionFields = discovery.extractionFields\n\t\t.map((field) => ({\n\t\t\tslug: field.slug,\n\t\t\ttype: field.type,\n\t\t\t...(field.type === \"repeater\"\n\t\t\t\t? {\n\t\t\t\t\t\tsubFields: (field.validation?.subFields ?? [])\n\t\t\t\t\t\t\t.map((subField) => ({ slug: subField.slug, type: subField.type }))\n\t\t\t\t\t\t\t.toSorted(compareFieldIdentity),\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t}))\n\t\t.toSorted(compareFieldIdentity);\n\tconst result = await buildCanonicalSha256Fingerprint(\"media-usage-fields:v1:sha256:\", {\n\t\tfingerprintVersion: 1,\n\t\tcontentSourceSchemaVersion: CONTENT_SOURCE_SCHEMA_VERSION,\n\t\textractionFields,\n\t\tdisplayFieldSlugs: discovery.displayFieldSlugs.toSorted(compareStrings),\n\t});\n\treturn result.fingerprint;\n}\n\nexport class MediaUsageFieldDiscoveryError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic code: \"INVALID_REPEATER_VALIDATION\",\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"MediaUsageFieldDiscoveryError\";\n\t}\n}\n\ninterface FieldDiscoveryRow {\n\tslug: string;\n\ttype: string;\n\tvalidation: string | null;\n}\n\nconst DISPLAY_FIELD_SLUGS = [\"title\", \"name\"] as const;\nconst SUPPORTED_TOP_LEVEL_TYPES = [\"file\", \"image\", \"portableText\"] as const;\n\ntype SupportedTopLevelType = (typeof SUPPORTED_TOP_LEVEL_TYPES)[number];\n\nexport async function loadContentMediaUsageFields(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcollectionId?: string,\n): Promise<ContentMediaUsageFieldDiscovery> {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\n\tlet query = db\n\t\t.selectFrom(\"_emdash_fields\")\n\t\t.innerJoin(\"_emdash_collections\", \"_emdash_collections.id\", \"_emdash_fields.collection_id\")\n\t\t.select([\"_emdash_fields.slug\", \"_emdash_fields.type\", \"_emdash_fields.validation\"])\n\t\t.where(\"_emdash_collections.slug\", \"=\", collectionSlug);\n\tif (collectionId !== undefined) query = query.where(\"_emdash_collections.id\", \"=\", collectionId);\n\tconst rows = await query.execute();\n\n\tconst extractionFields: ContentMediaUsageField[] = [];\n\tconst rowBySlug = new Map<string, FieldDiscoveryRow>();\n\n\tfor (const row of rows) {\n\t\trowBySlug.set(row.slug, row);\n\t\tif (isSupportedTopLevelType(row.type)) {\n\t\t\tvalidateIdentifier(row.slug, \"media usage field slug\");\n\t\t\textractionFields.push({ slug: row.slug, type: row.type });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (row.type === \"repeater\") {\n\t\t\tvalidateIdentifier(row.slug, \"media usage field slug\");\n\t\t\tconst subFields = normalizeRepeaterImageSubFields(row.validation);\n\t\t\tif (subFields.length > 0) {\n\t\t\t\textractionFields.push({\n\t\t\t\t\tslug: row.slug,\n\t\t\t\t\ttype: \"repeater\",\n\t\t\t\t\tvalidation: { subFields },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\textractionFields.sort((a, b) => a.slug.localeCompare(b.slug));\n\n\treturn {\n\t\textractionFields,\n\t\tdisplayFieldSlugs: DISPLAY_FIELD_SLUGS.filter((slug) => {\n\t\t\tif (!rowBySlug.has(slug)) return false;\n\t\t\tvalidateIdentifier(slug, \"media usage display field slug\");\n\t\t\treturn true;\n\t\t}),\n\t};\n}\n\nfunction normalizeRepeaterImageSubFields(\n\trawValidation: string | null,\n): MediaUsageExtractionSubField[] {\n\tconst validation = parseValidation(rawValidation);\n\tif (!isRecord(validation) || !Array.isArray(validation.subFields)) return [];\n\n\tconst subFields: MediaUsageExtractionSubField[] = [];\n\tfor (const subField of validation.subFields) {\n\t\tif (!isRecord(subField) || subField.type !== \"image\") continue;\n\t\tif (typeof subField.slug !== \"string\") continue;\n\t\tvalidateIdentifier(subField.slug, \"media usage repeater sub-field slug\");\n\t\tsubFields.push({ slug: subField.slug, type: \"image\" });\n\t}\n\n\treturn subFields.toSorted((a, b) => a.slug.localeCompare(b.slug));\n}\n\nfunction parseValidation(rawValidation: string | null): unknown {\n\tif (!rawValidation) return null;\n\ttry {\n\t\treturn JSON.parse(rawValidation);\n\t} catch {\n\t\tthrow new MediaUsageFieldDiscoveryError(\n\t\t\t\"Repeater field validation must be valid JSON before media usage can be discovered\",\n\t\t\t\"INVALID_REPEATER_VALIDATION\",\n\t\t);\n\t}\n}\n\nfunction isSupportedTopLevelType(value: string): value is SupportedTopLevelType {\n\treturn (SUPPORTED_TOP_LEVEL_TYPES as readonly string[]).includes(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction compareFieldIdentity(a: { slug: string }, b: { slug: string }): number {\n\treturn compareStrings(a.slug, b.slug);\n}\n\nfunction compareStrings(a: string, b: string): number {\n\treturn a < b ? -1 : a > b ? 1 : 0;\n}\n","import { normalizeMime } from \"../mime.js\";\nimport { INTERNAL_MEDIA_PREFIX } from \"../normalize.js\";\nimport type {\n\tExtractedMediaUsageOccurrence,\n\tExtractMediaUsageOccurrencesInput,\n\tMediaKind,\n\tMediaUsageExtractionSubField,\n\tMediaUsageReferenceType,\n} from \"./types.js\";\n\nconst URL_LIKE_RE = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\ninterface MediaRef {\n\tmediaId: string | null;\n\tprovider: string;\n\tproviderAssetId: string;\n\tmediaKind: MediaKind | null;\n\tmimeType: string | null;\n}\n\ninterface AddOccurrenceInput {\n\tfieldSlug: string;\n\tfieldPath: string;\n\treferenceType: MediaUsageReferenceType;\n\tvalue: unknown;\n\tfallbackKind: MediaKind | null;\n}\n\nexport function extractMediaUsageOccurrences({\n\tfields,\n\tdata,\n}: ExtractMediaUsageOccurrencesInput): ExtractedMediaUsageOccurrence[] {\n\tconst occurrences: ExtractedMediaUsageOccurrence[] = [];\n\tconst seen = new Set<string>();\n\n\tfor (const field of fields) {\n\t\tconst value = data[field.slug];\n\n\t\tif (field.type === \"image\") {\n\t\t\taddOccurrence(occurrences, seen, {\n\t\t\t\tfieldSlug: field.slug,\n\t\t\t\tfieldPath: field.slug,\n\t\t\t\treferenceType: \"image_field\",\n\t\t\t\tvalue,\n\t\t\t\tfallbackKind: \"image\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (field.type === \"file\") {\n\t\t\taddOccurrence(occurrences, seen, {\n\t\t\t\tfieldSlug: field.slug,\n\t\t\t\tfieldPath: field.slug,\n\t\t\t\treferenceType: \"file_field\",\n\t\t\t\tvalue,\n\t\t\t\tfallbackKind: null,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (field.type === \"repeater\") {\n\t\t\textractRepeaterOccurrences(occurrences, seen, field.slug, value, field.validation?.subFields);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (field.type === \"portableText\") {\n\t\t\textractPortableTextOccurrences(occurrences, seen, field.slug, value);\n\t\t}\n\t}\n\n\treturn occurrences;\n}\n\nfunction extractRepeaterOccurrences(\n\toccurrences: ExtractedMediaUsageOccurrence[],\n\tseen: Set<string>,\n\tfieldSlug: string,\n\tvalue: unknown,\n\tsubFields: readonly MediaUsageExtractionSubField[] | undefined,\n): void {\n\tif (!Array.isArray(value) || !Array.isArray(subFields)) return;\n\n\tfor (const [itemIndex, item] of value.entries()) {\n\t\tif (!isRecord(item)) continue;\n\n\t\tfor (const subField of subFields) {\n\t\t\tif (subField.type !== \"image\") continue;\n\n\t\t\taddOccurrence(occurrences, seen, {\n\t\t\t\tfieldSlug,\n\t\t\t\tfieldPath: `${fieldSlug}[${itemIndex}].${subField.slug}`,\n\t\t\t\treferenceType: \"image_field\",\n\t\t\t\tvalue: item[subField.slug],\n\t\t\t\tfallbackKind: \"image\",\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction extractPortableTextOccurrences(\n\toccurrences: ExtractedMediaUsageOccurrence[],\n\tseen: Set<string>,\n\tfieldSlug: string,\n\tvalue: unknown,\n): void {\n\tif (!Array.isArray(value)) return;\n\n\tfor (const [blockIndex, block] of value.entries()) {\n\t\tif (!isRecord(block) || block._type !== \"image\" || !isRecord(block.asset)) continue;\n\n\t\tconst provider = normalizeProvider(block.asset.provider);\n\t\tconst ref = readPortableTextAssetRef(block.asset, provider);\n\t\tif (!ref) continue;\n\n\t\taddRefOccurrence(occurrences, seen, {\n\t\t\tfieldSlug,\n\t\t\tfieldPath: `${fieldSlug}[${blockIndex}].asset.${ref.key}`,\n\t\t\treferenceType: \"portable_text_image\",\n\t\t\tref: buildMediaRef({\n\t\t\t\tid: ref.id,\n\t\t\t\tprovider,\n\t\t\t\tmimeType: normalizeMimeValue(block.asset.mimeType),\n\t\t\t\tfallbackKind: \"image\",\n\t\t\t}),\n\t\t});\n\t}\n}\n\nfunction addOccurrence(\n\toccurrences: ExtractedMediaUsageOccurrence[],\n\tseen: Set<string>,\n\tinput: AddOccurrenceInput,\n): void {\n\tconst ref = readMediaRef(input.value, input.fallbackKind);\n\tif (!ref) return;\n\n\taddRefOccurrence(occurrences, seen, {\n\t\tfieldSlug: input.fieldSlug,\n\t\tfieldPath: input.fieldPath,\n\t\treferenceType: input.referenceType,\n\t\tref,\n\t});\n}\n\nfunction addRefOccurrence(\n\toccurrences: ExtractedMediaUsageOccurrence[],\n\tseen: Set<string>,\n\tinput: {\n\t\tfieldSlug: string;\n\t\tfieldPath: string;\n\t\treferenceType: MediaUsageReferenceType;\n\t\tref: MediaRef | null;\n\t},\n): void {\n\tif (!input.ref) return;\n\n\tconst occurrence: ExtractedMediaUsageOccurrence = {\n\t\tfieldSlug: input.fieldSlug,\n\t\tfieldPath: input.fieldPath,\n\t\toccurrenceIndex: 0,\n\t\treferenceType: input.referenceType,\n\t\tmediaId: input.ref.mediaId,\n\t\tprovider: input.ref.provider,\n\t\tproviderAssetId: input.ref.providerAssetId,\n\t\tmediaKind: input.ref.mediaKind,\n\t\tmimeType: input.ref.mimeType,\n\t};\n\n\tconst key = [\n\t\toccurrence.fieldSlug,\n\t\toccurrence.fieldPath,\n\t\toccurrence.occurrenceIndex,\n\t\toccurrence.referenceType,\n\t\toccurrence.provider,\n\t\toccurrence.providerAssetId,\n\t\toccurrence.mediaId ?? \"\",\n\t].join(\"\\0\");\n\n\tif (seen.has(key)) return;\n\tseen.add(key);\n\toccurrences.push(occurrence);\n}\n\nfunction readMediaRef(value: unknown, fallbackKind: MediaKind | null): MediaRef | null {\n\tif (typeof value === \"string\") {\n\t\tconst id = normalizeLocalMediaId(value);\n\t\treturn id ? buildMediaRef({ id, provider: \"local\", mimeType: null, fallbackKind }) : null;\n\t}\n\n\tif (!isRecord(value)) return null;\n\n\tconst provider = normalizeProvider(value.provider);\n\tconst id = provider === \"local\" ? normalizeLocalMediaId(value.id) : normalizeStableId(value.id);\n\tif (!id) return null;\n\n\treturn buildMediaRef({\n\t\tid,\n\t\tprovider,\n\t\tmimeType: normalizeMimeValue(value.mimeType),\n\t\tfallbackKind,\n\t});\n}\n\nfunction buildMediaRef(input: {\n\tid: string;\n\tprovider: string;\n\tmimeType: string | null;\n\tfallbackKind: MediaKind | null;\n}): MediaRef | null {\n\tconst provider = normalizeProvider(input.provider);\n\tif (provider === \"external\") return null;\n\n\treturn {\n\t\tmediaId: provider === \"local\" ? input.id : null,\n\t\tprovider,\n\t\tproviderAssetId: input.id,\n\t\tmediaKind: mediaKindFromMime(input.mimeType) ?? input.fallbackKind,\n\t\tmimeType: input.mimeType,\n\t};\n}\n\nfunction readPortableTextAssetRef(\n\tasset: Record<string, unknown>,\n\tprovider: string,\n): { key: \"_ref\" | \"id\"; id: string } | null {\n\tconst normalizeId = provider === \"local\" ? normalizeLocalMediaId : normalizeStableId;\n\tconst ref = normalizeId(asset._ref);\n\tif (ref) return { key: \"_ref\", id: ref };\n\n\tconst id = normalizeId(asset.id);\n\tif (id) return { key: \"id\", id };\n\n\treturn null;\n}\n\nfunction normalizeProvider(value: unknown): string {\n\tconst provider = readString(value)?.trim();\n\treturn provider || \"local\";\n}\n\nfunction normalizeLocalMediaId(value: unknown): string | null {\n\tconst id = normalizeStableId(value);\n\tif (!id) return null;\n\treturn id.includes(\"/\") ? null : id;\n}\n\nfunction normalizeStableId(value: unknown): string | null {\n\tif (typeof value !== \"string\") return null;\n\tconst trimmed = value.trim();\n\tif (!trimmed) return null;\n\tif (URL_LIKE_RE.test(trimmed)) return null;\n\tif (trimmed.startsWith(INTERNAL_MEDIA_PREFIX)) return null;\n\treturn trimmed;\n}\n\nfunction normalizeMimeValue(value: unknown): string | null {\n\tif (typeof value !== \"string\") return null;\n\tconst normalized = normalizeMime(value);\n\treturn normalized.includes(\"/\") ? normalized : null;\n}\n\nfunction mediaKindFromMime(mimeType: string | null): MediaKind | null {\n\tif (!mimeType) return null;\n\tif (mimeType.startsWith(\"image/\")) return \"image\";\n\tif (mimeType.startsWith(\"video/\")) return \"video\";\n\tif (mimeType.startsWith(\"audio/\")) return \"audio\";\n\tif (mimeType.startsWith(\"font/\") || mimeType.startsWith(\"application/font-\")) return \"font\";\n\tif (mimeType.startsWith(\"text/\")) return \"text\";\n\tif (isDocumentMime(mimeType)) return \"document\";\n\tif (isArchiveMime(mimeType)) return \"archive\";\n\treturn \"other\";\n}\n\nfunction isDocumentMime(mimeType: string): boolean {\n\treturn (\n\t\tmimeType === \"application/pdf\" ||\n\t\tmimeType === \"application/msword\" ||\n\t\tmimeType === \"application/rtf\" ||\n\t\tmimeType === \"application/vnd.ms-excel\" ||\n\t\tmimeType === \"application/vnd.ms-powerpoint\" ||\n\t\tmimeType.startsWith(\"application/vnd.openxmlformats-officedocument.\")\n\t);\n}\n\nfunction isArchiveMime(mimeType: string): boolean {\n\treturn (\n\t\tmimeType === \"application/zip\" ||\n\t\tmimeType === \"application/gzip\" ||\n\t\tmimeType === \"application/x-tar\" ||\n\t\tmimeType === \"application/x-7z-compressed\" ||\n\t\tmimeType === \"application/x-rar-compressed\" ||\n\t\tmimeType === \"application/vnd.rar\"\n\t);\n}\n\nfunction readString(value: unknown): string | null {\n\treturn typeof value === \"string\" ? value : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","export const MEDIA_USAGE_CONTENT_SOURCE_VARIANTS = [\"columns\", \"draft_overlay\"] as const;\n\nexport type MediaUsageContentSourceVariant = (typeof MEDIA_USAGE_CONTENT_SOURCE_VARIANTS)[number];\n\nexport interface ContentMediaUsageSourceKeyInput {\n\tcollectionId?: string;\n\tcollectionSlug: string;\n\tcontentId: string;\n\tsourceVariant: MediaUsageContentSourceVariant;\n}\n\nexport function isMediaUsageContentSourceVariant(\n\tvalue: unknown,\n): value is MediaUsageContentSourceVariant {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\t(MEDIA_USAGE_CONTENT_SOURCE_VARIANTS as readonly string[]).includes(value)\n\t);\n}\n\nexport function buildContentMediaUsageSourceKey(input: ContentMediaUsageSourceKeyInput): string {\n\tif (input.collectionId) {\n\t\treturn `content:${input.collectionId}:${input.contentId}:${input.sourceVariant}`;\n\t}\n\treturn `content:${input.collectionSlug}:${input.contentId}:${input.sourceVariant}`;\n}\n","import { sql, type Kysely } from \"kysely\";\n\nimport type {\n\tMediaUsageOccurrenceInput,\n\tMediaUsageSourceInput,\n} from \"../../database/repositories/media-usage.js\";\nimport type { Database } from \"../../database/types.js\";\nimport { validateIdentifier } from \"../../database/validate.js\";\nimport {\n\tloadContentMediaUsageFields,\n\ttype ContentMediaUsageField,\n\ttype ContentMediaUsageFieldDiscovery,\n} from \"./content-fields.js\";\nimport { extractMediaUsageOccurrences } from \"./extractor.js\";\nimport { buildMediaUsageProjectionFingerprint } from \"./projection-fingerprint.js\";\nimport {\n\tbuildContentMediaUsageSourceKey,\n\ttype MediaUsageContentSourceVariant,\n} from \"./source-key.js\";\nimport { CONTENT_SOURCE_SCHEMA_VERSION } from \"./types.js\";\n\nexport { CONTENT_SOURCE_SCHEMA_VERSION } from \"./types.js\";\nconst CONTENT_COLLECTION_ID_RESULT = \"__emdash_media_usage_collection_id\";\n\nconst CONTENT_SYSTEM_COLUMNS = [\n\t\"id\",\n\t\"slug\",\n\t\"status\",\n\t\"created_at\",\n\t\"updated_at\",\n\t\"published_at\",\n\t\"scheduled_at\",\n\t\"deleted_at\",\n\t\"version\",\n\t\"live_revision_id\",\n\t\"draft_revision_id\",\n\t\"locale\",\n\t\"translation_group\",\n] as const;\n\nexport type LoadContentMediaUsageSnapshotsResult =\n\t| { success: true; snapshots: ContentMediaUsageSnapshot[] }\n\t| {\n\t\t\tsuccess: false;\n\t\t\terror:\n\t\t\t\t| \"CONTENT_NOT_FOUND\"\n\t\t\t\t| \"DRAFT_REVISION_NOT_FOUND\"\n\t\t\t\t| \"DRAFT_REVISION_MISMATCH\"\n\t\t\t\t| \"DRAFT_REVISION_INVALID\";\n\t\t\tsource?: MediaUsageSourceInput;\n\t\t\tsnapshots?: ContentMediaUsageSnapshot[];\n\t };\n\nexport interface ContentMediaUsageSnapshot {\n\tsource: MediaUsageSourceInput;\n\toccurrences: MediaUsageOccurrenceInput[];\n\tfields: readonly ContentMediaUsageField[];\n\tprojectionByteLength: number;\n}\n\nexport interface LoadContentMediaUsageSnapshotsOptions {\n\tcollectionId?: string;\n\tidentityVersion?: number;\n}\n\nexport async function loadContentMediaUsageSnapshots(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcontentId: string,\n\tfieldDiscovery?: ContentMediaUsageFieldDiscovery,\n\toptions: LoadContentMediaUsageSnapshotsOptions = {},\n): Promise<LoadContentMediaUsageSnapshotsResult> {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\tif (options.identityVersion !== undefined && !options.collectionId) {\n\t\tthrow new Error(\"Canonical media usage snapshots require a collection identity\");\n\t}\n\tconst discovery = fieldDiscovery ?? (await loadContentMediaUsageFields(db, collectionSlug));\n\tconst row = await loadContentRow(\n\t\tdb,\n\t\tcollectionSlug,\n\t\tcontentId,\n\t\t[...discovery.extractionFields.map((field) => field.slug), ...discovery.displayFieldSlugs],\n\t\toptions.collectionId,\n\t);\n\n\tif (!row) return { success: false, error: \"CONTENT_NOT_FOUND\" };\n\tconst collectionId = readString(row[CONTENT_COLLECTION_ID_RESULT]);\n\tif (!collectionId) {\n\t\tthrow new Error(\"Media usage snapshot query did not return a collection identity\");\n\t}\n\n\tconst columnsData = projectData(\n\t\trow,\n\t\tdiscovery.extractionFields.map((field) => field.slug),\n\t);\n\tconst displayData = projectRawData(row, discovery.displayFieldSlugs);\n\tconst occurrences = extractMediaUsageOccurrences({\n\t\tfields: discovery.extractionFields,\n\t\tdata: columnsData,\n\t});\n\tconst columnsRevisionId = readNullableString(row.live_revision_id);\n\tconst columnsSource = buildContentSource({\n\t\tcollectionId: options.collectionId,\n\t\tcollectionSlug,\n\t\tidentityVersion: options.identityVersion,\n\t\trow,\n\t\tdisplayData,\n\t\tsourceVariant: \"columns\",\n\t\trevisionId: columnsRevisionId,\n\t});\n\tconst columnsProjection = await buildMediaUsageProjectionFingerprint({\n\t\tcollectionId,\n\t\tsource: columnsSource,\n\t\toccurrences,\n\t\textractionFields: discovery.extractionFields,\n\t});\n\tcolumnsSource.sourceFingerprint = columnsProjection.fingerprint;\n\tconst snapshots: ContentMediaUsageSnapshot[] = [\n\t\t{\n\t\t\tsource: columnsSource,\n\t\t\toccurrences,\n\t\t\tfields: discovery.extractionFields,\n\t\t\tprojectionByteLength: columnsProjection.byteLength,\n\t\t},\n\t];\n\n\tconst draftRevisionId = readNullableString(row.draft_revision_id);\n\tif (draftRevisionId) {\n\t\tconst attemptedDraftSource = buildContentSource({\n\t\t\tcollectionId: options.collectionId,\n\t\t\tcollectionSlug,\n\t\t\tidentityVersion: options.identityVersion,\n\t\t\trow,\n\t\t\tdisplayData,\n\t\t\tsourceVariant: \"draft_overlay\",\n\t\t\trevisionId: draftRevisionId,\n\t\t});\n\t\tconst revisionResult = await loadRevisionRow(db, draftRevisionId);\n\t\tif (!revisionResult) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"DRAFT_REVISION_NOT_FOUND\",\n\t\t\t\tsource: attemptedDraftSource,\n\t\t\t\tsnapshots,\n\t\t\t};\n\t\t}\n\t\tif (!revisionResult.success) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"DRAFT_REVISION_INVALID\",\n\t\t\t\tsource: attemptedDraftSource,\n\t\t\t\tsnapshots,\n\t\t\t};\n\t\t}\n\t\tconst revision = revisionResult.revision;\n\t\tif (revision.collection !== collectionSlug || revision.entryId !== row.id) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"DRAFT_REVISION_MISMATCH\",\n\t\t\t\tsource: attemptedDraftSource,\n\t\t\t\tsnapshots,\n\t\t\t};\n\t\t}\n\n\t\tconst revisionData = stripRevisionMetadata(revision.data);\n\t\tconst draftOverlayData = { ...columnsData, ...revisionData };\n\t\tconst draftDisplayData = {\n\t\t\t...displayData,\n\t\t\t...projectPresentData(revisionData, discovery.displayFieldSlugs),\n\t\t};\n\t\tconst draftContentSlug =\n\t\t\treadNullableString(revision.data._slug) ?? readNullableString(row.slug);\n\t\tconst draftOccurrences = extractMediaUsageOccurrences({\n\t\t\tfields: discovery.extractionFields,\n\t\t\tdata: draftOverlayData,\n\t\t});\n\t\tconst draftSource = buildContentSource({\n\t\t\tcollectionId: options.collectionId,\n\t\t\tcollectionSlug,\n\t\t\tidentityVersion: options.identityVersion,\n\t\t\trow,\n\t\t\tdisplayData: draftDisplayData,\n\t\t\tsourceVariant: \"draft_overlay\",\n\t\t\trevisionId: draftRevisionId,\n\t\t\tcontentSlug: draftContentSlug,\n\t\t});\n\t\tconst draftProjection = await buildMediaUsageProjectionFingerprint({\n\t\t\tcollectionId,\n\t\t\tsource: draftSource,\n\t\t\toccurrences: draftOccurrences,\n\t\t\textractionFields: discovery.extractionFields,\n\t\t});\n\t\tdraftSource.sourceFingerprint = draftProjection.fingerprint;\n\t\tsnapshots.push({\n\t\t\tsource: draftSource,\n\t\t\toccurrences: draftOccurrences,\n\t\t\tfields: discovery.extractionFields,\n\t\t\tprojectionByteLength: draftProjection.byteLength,\n\t\t});\n\t}\n\n\treturn {\n\t\tsuccess: true,\n\t\tsnapshots,\n\t};\n}\n\ninterface RevisionSnapshotRow {\n\tid: string;\n\tcollection: string;\n\tentryId: string;\n\tdata: Record<string, unknown>;\n}\n\nasync function loadContentRow(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcontentId: string,\n\tfieldSlugs: readonly string[],\n\texpectedCollectionId?: string,\n): Promise<Record<string, unknown> | null> {\n\tconst tableName = getContentTableName(collectionSlug);\n\tconst columns = uniqueColumns([...CONTENT_SYSTEM_COLUMNS, ...fieldSlugs]);\n\tconst columnRefs = columns.map((column) => sql.ref(`content.${column}`));\n\tconst result = await sql<Record<string, unknown>>`\n\t\tSELECT\n\t\t\t${sql.join(columnRefs, sql`, `)},\n\t\t\tcollection.id AS __emdash_media_usage_collection_id\n\t\tFROM ${sql.ref(tableName)} AS content\n\t\tINNER JOIN _emdash_collections AS collection\n\t\t\tON collection.slug = ${collectionSlug}\n\t\t\t${expectedCollectionId ? sql`AND collection.id = ${expectedCollectionId}` : sql``}\n\t\tWHERE content.id = ${contentId}\n\t\tLIMIT 1\n\t`.execute(db);\n\n\treturn result.rows[0] ?? null;\n}\n\nasync function loadRevisionRow(\n\tdb: Kysely<Database>,\n\trevisionId: string,\n): Promise<{ success: true; revision: RevisionSnapshotRow } | { success: false } | null> {\n\tconst row = await db\n\t\t.selectFrom(\"revisions\")\n\t\t.select([\"id\", \"collection\", \"entry_id\", \"data\"])\n\t\t.where(\"id\", \"=\", revisionId)\n\t\t.executeTakeFirst();\n\tif (!row) return null;\n\tconst data = parseRevisionData(row.data);\n\tif (!data) return { success: false };\n\treturn {\n\t\tsuccess: true,\n\t\trevision: {\n\t\t\tid: row.id,\n\t\t\tcollection: row.collection,\n\t\t\tentryId: row.entry_id,\n\t\t\tdata,\n\t\t},\n\t};\n}\n\nfunction buildContentSource(input: {\n\tcollectionId?: string;\n\tcollectionSlug: string;\n\tidentityVersion?: number;\n\trow: Record<string, unknown>;\n\tdisplayData: Record<string, unknown>;\n\tsourceVariant: MediaUsageContentSourceVariant;\n\trevisionId: string | null;\n\tcontentSlug?: string | null;\n}): MediaUsageSourceInput {\n\tconst {\n\t\tcollectionId,\n\t\tcollectionSlug,\n\t\tidentityVersion,\n\t\trow,\n\t\tdisplayData,\n\t\tsourceVariant,\n\t\trevisionId,\n\t} = input;\n\tconst contentId = readString(row.id) ?? \"\";\n\tconst contentSlug = input.contentSlug ?? readNullableString(row.slug);\n\tconst source: MediaUsageSourceInput = {\n\t\tsourceKey: buildContentMediaUsageSourceKey({\n\t\t\tcollectionId,\n\t\t\tcollectionSlug,\n\t\t\tcontentId,\n\t\t\tsourceVariant,\n\t\t}),\n\t\tsourceType: \"content\",\n\t\tcollectionId,\n\t\tcollectionSlug,\n\t\tcontentId,\n\t\tsourceVariant,\n\t\tlocale: readNullableString(row.locale),\n\t\ttranslationGroup: readNullableString(row.translation_group),\n\t\tcontentSlug,\n\t\tcontentTitle: deriveContentTitle(displayData, contentSlug, contentId),\n\t\tcontentStatus: readNullableString(row.status),\n\t\tcontentScheduledAt: readNullableString(row.scheduled_at),\n\t\tcontentDeletedAt: readNullableString(row.deleted_at),\n\t\trevisionId,\n\t\tschemaVersion: CONTENT_SOURCE_SCHEMA_VERSION,\n\t\tsourceUpdatedAt: readNullableString(row.updated_at),\n\t\tsourceVersion: readNumber(row.version),\n\t\tidentityVersion,\n\t};\n\treturn source;\n}\n\nfunction projectData(\n\trow: Record<string, unknown>,\n\tfieldSlugs: readonly string[],\n): Record<string, unknown> {\n\tconst data: Record<string, unknown> = {};\n\tfor (const fieldSlug of fieldSlugs) {\n\t\tdata[fieldSlug] = deserializeValue(row[fieldSlug] ?? null);\n\t}\n\treturn data;\n}\n\nfunction projectRawData(\n\trow: Record<string, unknown>,\n\tfieldSlugs: readonly string[],\n): Record<string, unknown> {\n\tconst data: Record<string, unknown> = {};\n\tfor (const fieldSlug of fieldSlugs) {\n\t\tdata[fieldSlug] = row[fieldSlug] ?? null;\n\t}\n\treturn data;\n}\n\nfunction projectPresentData(\n\trow: Record<string, unknown>,\n\tfieldSlugs: readonly string[],\n): Record<string, unknown> {\n\tconst data: Record<string, unknown> = {};\n\tfor (const fieldSlug of fieldSlugs) {\n\t\tif (Object.hasOwn(row, fieldSlug)) data[fieldSlug] = row[fieldSlug];\n\t}\n\treturn data;\n}\n\nfunction uniqueColumns(columns: readonly string[]): string[] {\n\tconst unique = [...new Set(columns)];\n\tfor (const column of unique) validateIdentifier(column, \"content media usage column\");\n\treturn unique;\n}\n\nfunction getContentTableName(collectionSlug: string): string {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\treturn `ec_${collectionSlug}`;\n}\n\nfunction deserializeValue(value: unknown): unknown {\n\tif (typeof value === \"string\" && (value.startsWith(\"{\") || value.startsWith(\"[\"))) {\n\t\ttry {\n\t\t\treturn JSON.parse(value);\n\t\t} catch {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn value;\n}\n\nfunction parseRevisionData(value: unknown): Record<string, unknown> | null {\n\tif (typeof value === \"string\") {\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(value);\n\t\t\treturn isRecord(parsed) ? parsed : null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\treturn isRecord(value) ? value : null;\n}\n\nfunction stripRevisionMetadata(data: Record<string, unknown>): Record<string, unknown> {\n\tconst stripped: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(data)) {\n\t\tif (!key.startsWith(\"_\")) stripped[key] = value;\n\t}\n\treturn stripped;\n}\n\nfunction deriveContentTitle(\n\tdisplayData: Record<string, unknown>,\n\tcontentSlug: string | null,\n\tcontentId: string,\n): string | null {\n\tfor (const fieldSlug of [\"title\", \"name\"] as const) {\n\t\tconst value = displayData[fieldSlug];\n\t\tif (typeof value === \"string\" && value.trim()) return value;\n\t}\n\treturn contentSlug ?? contentId;\n}\n\nfunction readString(value: unknown): string | null {\n\treturn typeof value === \"string\" ? value : null;\n}\n\nfunction readNullableString(value: unknown): string | null {\n\treturn value === null || value === undefined ? null : readString(value);\n}\n\nfunction readNumber(value: unknown): number | null {\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tif (typeof value === \"bigint\") return Number(value);\n\tif (typeof value === \"string\" && value) {\n\t\tconst parsed = Number(value);\n\t\treturn Number.isFinite(parsed) ? parsed : null;\n\t}\n\treturn null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { sql, type Kysely } from \"kysely\";\n\nimport { tableExists } from \"../../database/dialect-helpers.js\";\nimport {\n\tMediaUsageRepository,\n\ttype MediaUsageSource,\n} from \"../../database/repositories/media-usage.js\";\nimport type { Database } from \"../../database/types.js\";\nimport { validateIdentifier } from \"../../database/validate.js\";\nimport { isI18nEnabled } from \"../../i18n/config.js\";\nimport { loadContentMediaUsageFields } from \"./content-fields.js\";\nimport {\n\tCONTENT_SOURCE_SCHEMA_VERSION,\n\tloadContentMediaUsageSnapshots,\n\ttype ContentMediaUsageSnapshot,\n} from \"./content-snapshots.js\";\nimport {\n\tbuildContentMediaUsageSourceKey,\n\tMEDIA_USAGE_CONTENT_SOURCE_VARIANTS,\n} from \"./source-key.js\";\n\nexport const CONTENT_MEDIA_USAGE_ADAPTER_ID = \"content-media\";\nexport const CONTENT_MEDIA_USAGE_COLLECTION_SCOPE = \"collection\";\n\nconst CONTENT_USAGE_LOCKS_KEY = Symbol.for(\"emdash.mediaUsage.contentLocks\");\nconst CONTENT_USAGE_COLLECTION_LOCKS_KEY = Symbol.for(\"emdash.mediaUsage.collectionLocks\");\nconst CONTENT_USAGE_REFRESH_MAX_ATTEMPTS = 2;\n\nexport const MEDIA_USAGE_PROJECTION_ADMISSION_LIMITS = Object.freeze({\n\tmaxOccurrenceMutationUnitsPerClaim: 12,\n\tmaxProjectionMutationBytesPerClaim: 512 * 1024,\n});\n\nexport interface ContentMediaUsageAdmissionBudget {\n\tremainingOccurrenceMutationUnits: number;\n\tremainingProjectionMutationBytes: number;\n\thasReservedMutation: boolean;\n}\n\nexport type ContentMediaUsageProjectionAdmissionResult =\n\t| {\n\t\t\toutcome: \"admitted\";\n\t\t\tnoOpSourceKeys: ReadonlySet<string>;\n\t\t\tabsentSources: MediaUsageSource[];\n\t\t\toccurrenceMutationUnits: number;\n\t\t\tprojectionMutationBytes: number;\n\t }\n\t| { outcome: \"intrinsic_resource_limit\" }\n\t| { outcome: \"claim_budget_deferred\" };\n\n// These maps only de-dupe usage work inside the current isolate/process. Cross-worker\n// correctness comes from expected-generation guards on repository writes.\n\nexport type ContentMediaUsageRefreshErrorCode =\n\t| \"CONTENT_NOT_FOUND\"\n\t| \"DRAFT_REVISION_NOT_FOUND\"\n\t| \"DRAFT_REVISION_MISMATCH\"\n\t| \"DRAFT_REVISION_INVALID\"\n\t| \"CONTENT_USAGE_REFRESH_ERROR\"\n\t| \"CONTENT_USAGE_DELETE_ERROR\"\n\t| \"CONTENT_USAGE_GENERATION_CONFLICT\"\n\t| \"CONTENT_USAGE_RESOURCE_LIMIT\"\n\t| \"CONTENT_USAGE_STALE\";\n\ninterface ContentMediaUsageRefreshOptions {\n\tcollectionId?: string;\n\tdurableWork?: boolean;\n\tadmissionBudget?: ContentMediaUsageAdmissionBudget;\n}\n\nexport interface ContentMediaUsageRefreshResult {\n\tsuccess: boolean;\n\trefreshedSourceCount: number;\n\tdeletedSourceCount: number;\n\tfailedSourceCount: number;\n\terrorCode?: ContentMediaUsageRefreshErrorCode;\n}\n\nconst ZERO_RESULT: ContentMediaUsageRefreshResult = {\n\tsuccess: true,\n\trefreshedSourceCount: 0,\n\tdeletedSourceCount: 0,\n\tfailedSourceCount: 0,\n};\n\nexport function createContentMediaUsageAdmissionBudget(): ContentMediaUsageAdmissionBudget {\n\treturn {\n\t\tremainingOccurrenceMutationUnits:\n\t\t\tMEDIA_USAGE_PROJECTION_ADMISSION_LIMITS.maxOccurrenceMutationUnitsPerClaim,\n\t\tremainingProjectionMutationBytes:\n\t\t\tMEDIA_USAGE_PROJECTION_ADMISSION_LIMITS.maxProjectionMutationBytesPerClaim,\n\t\thasReservedMutation: false,\n\t};\n}\n\nexport async function planContentMediaUsageProjectionAdmission(\n\trepo: MediaUsageRepository,\n\tsnapshots: readonly ContentMediaUsageSnapshot[],\n\tobservedSources: ReadonlyMap<string, MediaUsageSource>,\n\tcanonicalSourceKeys: readonly string[],\n\tbudget: ContentMediaUsageAdmissionBudget,\n): Promise<ContentMediaUsageProjectionAdmissionResult> {\n\tconst snapshotSourceKeys = new Set(snapshots.map((snapshot) => snapshot.source.sourceKey));\n\tconst absentSources = canonicalSourceKeys\n\t\t.filter((sourceKey) => !snapshotSourceKeys.has(sourceKey))\n\t\t.map((sourceKey) => observedSources.get(sourceKey))\n\t\t.filter((source): source is MediaUsageSource => source !== undefined);\n\tlet deletionOccurrenceUnits = 0;\n\tlet deletionBytes = 0;\n\tfor (const source of absentSources) {\n\t\tconst measurement = await repo.measureSourceGenerationDeletion(\n\t\t\tsource.sourceKey,\n\t\t\tsource.currentGeneration,\n\t\t\tMEDIA_USAGE_PROJECTION_ADMISSION_LIMITS.maxOccurrenceMutationUnitsPerClaim,\n\t\t);\n\t\tif (measurement.exceedsOccurrenceLimit) {\n\t\t\treturn budget.hasReservedMutation\n\t\t\t\t? { outcome: \"claim_budget_deferred\" }\n\t\t\t\t: { outcome: \"intrinsic_resource_limit\" };\n\t\t}\n\t\tdeletionOccurrenceUnits += measurement.occurrenceCount;\n\t\tdeletionBytes += storedMediaUsageSourceByteLength(source) + measurement.occurrenceBytes * 2;\n\t}\n\n\tconst noOpSourceKeys = new Set<string>();\n\tlet cost = projectionAdmissionCost(\n\t\tsnapshots,\n\t\tnoOpSourceKeys,\n\t\tdeletionOccurrenceUnits,\n\t\tdeletionBytes,\n\t);\n\tif (exceedsProjectionAdmissionLimits(cost)) {\n\t\tfor (const snapshot of snapshots) {\n\t\t\tconst expectedSource = observedSources.get(snapshot.source.sourceKey);\n\t\t\tif (\n\t\t\t\texpectedSource &&\n\t\t\t\t(await repo.projectionMatchesExpectedSource(snapshot.source, expectedSource))\n\t\t\t) {\n\t\t\t\tnoOpSourceKeys.add(snapshot.source.sourceKey);\n\t\t\t}\n\t\t}\n\t\tcost = projectionAdmissionCost(\n\t\t\tsnapshots,\n\t\t\tnoOpSourceKeys,\n\t\t\tdeletionOccurrenceUnits,\n\t\t\tdeletionBytes,\n\t\t);\n\t}\n\n\tif (exceedsProjectionAdmissionLimits(cost)) {\n\t\treturn budget.hasReservedMutation\n\t\t\t? { outcome: \"claim_budget_deferred\" }\n\t\t\t: { outcome: \"intrinsic_resource_limit\" };\n\t}\n\tif (\n\t\tcost.occurrenceMutationUnits > budget.remainingOccurrenceMutationUnits ||\n\t\tcost.projectionMutationBytes > budget.remainingProjectionMutationBytes\n\t) {\n\t\treturn { outcome: \"claim_budget_deferred\" };\n\t}\n\n\tbudget.remainingOccurrenceMutationUnits -= cost.occurrenceMutationUnits;\n\tbudget.remainingProjectionMutationBytes -= cost.projectionMutationBytes;\n\tif (cost.occurrenceMutationUnits > 0 || cost.projectionMutationBytes > 0) {\n\t\tbudget.hasReservedMutation = true;\n\t}\n\treturn {\n\t\toutcome: \"admitted\",\n\t\tnoOpSourceKeys,\n\t\tabsentSources,\n\t\t...cost,\n\t};\n}\n\ninterface ProjectionAdmissionCost {\n\toccurrenceMutationUnits: number;\n\tprojectionMutationBytes: number;\n}\n\nfunction projectionAdmissionCost(\n\tsnapshots: readonly ContentMediaUsageSnapshot[],\n\tnoOpSourceKeys: ReadonlySet<string>,\n\tdeletionOccurrenceUnits: number,\n\tdeletionBytes: number,\n): ProjectionAdmissionCost {\n\treturn snapshots.reduce<ProjectionAdmissionCost>(\n\t\t(cost, snapshot) => {\n\t\t\tif (noOpSourceKeys.has(snapshot.source.sourceKey)) return cost;\n\t\t\tcost.occurrenceMutationUnits += snapshot.occurrences.length;\n\t\t\tcost.projectionMutationBytes += snapshot.projectionByteLength;\n\t\t\treturn cost;\n\t\t},\n\t\t{\n\t\t\toccurrenceMutationUnits: deletionOccurrenceUnits,\n\t\t\tprojectionMutationBytes: deletionBytes,\n\t\t},\n\t);\n}\n\nfunction exceedsProjectionAdmissionLimits(cost: ProjectionAdmissionCost): boolean {\n\treturn (\n\t\tcost.occurrenceMutationUnits >\n\t\t\tMEDIA_USAGE_PROJECTION_ADMISSION_LIMITS.maxOccurrenceMutationUnitsPerClaim ||\n\t\tcost.projectionMutationBytes >\n\t\t\tMEDIA_USAGE_PROJECTION_ADMISSION_LIMITS.maxProjectionMutationBytesPerClaim\n\t);\n}\n\nfunction storedMediaUsageSourceByteLength(source: MediaUsageSource): number {\n\treturn new TextEncoder().encode(JSON.stringify(source)).byteLength;\n}\n\nexport async function refreshContentMediaUsage(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcontentId: string,\n): Promise<ContentMediaUsageRefreshResult> {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\treturn withContentUsageCollectionLock(collectionSlug, () =>\n\t\twithContentUsageLock(collectionSlug, contentId, () =>\n\t\t\trefreshContentMediaUsageUnlocked(db, collectionSlug, contentId, {}),\n\t\t),\n\t);\n}\n\nexport async function refreshContentMediaUsageForWork(\n\tdb: Kysely<Database>,\n\tcollectionId: string,\n\tcollectionSlug: string,\n\tcontentId: string,\n): Promise<ContentMediaUsageRefreshResult> {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\tif (!collectionId) throw new Error(\"Durable media usage work requires a collection identity\");\n\treturn withContentUsageCollectionLock(collectionSlug, () =>\n\t\twithContentUsageLock(collectionSlug, contentId, () =>\n\t\t\trefreshContentMediaUsageUnlocked(db, collectionSlug, contentId, {\n\t\t\t\tcollectionId,\n\t\t\t\tdurableWork: true,\n\t\t\t}),\n\t\t),\n\t);\n}\n\nasync function refreshContentMediaUsageUnlocked(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcontentId: string,\n\toptions: ContentMediaUsageRefreshOptions,\n): Promise<ContentMediaUsageRefreshResult> {\n\ttry {\n\t\tlet conflictResult: ContentMediaUsageRefreshResult | null = null;\n\t\tif (options.durableWork) options.admissionBudget = createContentMediaUsageAdmissionBudget();\n\t\tfor (let attempt = 0; attempt < CONTENT_USAGE_REFRESH_MAX_ATTEMPTS; attempt++) {\n\t\t\tconst result = await refreshContentMediaUsageAttempt(db, collectionSlug, contentId, options);\n\t\t\tif (result.errorCode !== \"CONTENT_USAGE_GENERATION_CONFLICT\") return result;\n\t\t\tconflictResult = result;\n\t\t\tif (options.admissionBudget?.hasReservedMutation) break;\n\t\t}\n\n\t\tif (options.durableWork) {\n\t\t\treturn generationConflictResult({\n\t\t\t\trefreshedSourceCount: conflictResult?.refreshedSourceCount ?? 0,\n\t\t\t\tdeletedSourceCount: conflictResult?.deletedSourceCount ?? 0,\n\t\t\t});\n\t\t}\n\t\treturn markGenerationConflict(db, collectionSlug, {\n\t\t\trefreshedSourceCount: conflictResult?.refreshedSourceCount ?? 0,\n\t\t\tdeletedSourceCount: conflictResult?.deletedSourceCount ?? 0,\n\t\t});\n\t} catch (error) {\n\t\tconsole.error(`[media-usage] Failed to refresh ${collectionSlug}/${contentId}:`, error);\n\t\tif (!options.durableWork) {\n\t\t\tawait markContentMediaUsageCollectionStaleSafely(\n\t\t\t\tdb,\n\t\t\t\tcollectionSlug,\n\t\t\t\t\"CONTENT_USAGE_REFRESH_ERROR\",\n\t\t\t);\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\trefreshedSourceCount: 0,\n\t\t\tdeletedSourceCount: 0,\n\t\t\tfailedSourceCount: 0,\n\t\t\terrorCode: \"CONTENT_USAGE_REFRESH_ERROR\",\n\t\t};\n\t}\n}\n\nasync function refreshContentMediaUsageAttempt(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcontentId: string,\n\toptions: ContentMediaUsageRefreshOptions,\n): Promise<ContentMediaUsageRefreshResult> {\n\tconst repo = new MediaUsageRepository(db);\n\tconst canonicalSourceKeys = contentSourceKeys(collectionSlug, contentId, options.collectionId);\n\tconst observedSources = await repo.findSources(canonicalSourceKeys);\n\tconst snapshotsResult = await loadContentMediaUsageSnapshots(\n\t\tdb,\n\t\tcollectionSlug,\n\t\tcontentId,\n\t\tundefined,\n\t\toptions.collectionId ? { collectionId: options.collectionId, identityVersion: 1 } : undefined,\n\t);\n\tif (!snapshotsResult.success) {\n\t\tif (snapshotsResult.error === \"CONTENT_NOT_FOUND\" && options.collectionId) {\n\t\t\tif (!(await contentCollectionExists(db, collectionSlug, options.collectionId))) {\n\t\t\t\treturn generationConflictResult({ refreshedSourceCount: 0, deletedSourceCount: 0 });\n\t\t\t}\n\t\t\tif (!options.admissionBudget)\n\t\t\t\tthrow new Error(\"Durable media usage work requires an admission budget\");\n\t\t\tconst admission = await planContentMediaUsageProjectionAdmission(\n\t\t\t\trepo,\n\t\t\t\t[],\n\t\t\t\tobservedSources,\n\t\t\t\tcanonicalSourceKeys,\n\t\t\t\toptions.admissionBudget,\n\t\t\t);\n\t\t\tif (admission.outcome !== \"admitted\") return admissionFailureResult(admission.outcome);\n\t\t\treturn deleteCanonicalContentSourcesIfAbsent(\n\t\t\t\trepo,\n\t\t\t\tadmission.absentSources,\n\t\t\t\tcollectionSlug,\n\t\t\t\tcontentId,\n\t\t\t);\n\t\t}\n\t\tif (\n\t\t\tsnapshotsResult.error === \"CONTENT_NOT_FOUND\" &&\n\t\t\t!(await contentCollectionExists(db, collectionSlug))\n\t\t) {\n\t\t\tconst deletedSourceCount = await repo.deleteContentSources(collectionSlug, contentId);\n\t\t\treturn { ...ZERO_RESULT, deletedSourceCount };\n\t\t}\n\t\treturn options.durableWork\n\t\t\t? snapshotFailureResult(snapshotsResult)\n\t\t\t: markSnapshotFailure(db, collectionSlug, snapshotsResult);\n\t}\n\n\tif (!(await contentCollectionExists(db, collectionSlug, options.collectionId))) {\n\t\tif (options.collectionId) {\n\t\t\treturn generationConflictResult({ refreshedSourceCount: 0, deletedSourceCount: 0 });\n\t\t}\n\t\tconst deletedSourceCount = await repo.deleteContentSources(collectionSlug, contentId);\n\t\treturn { ...ZERO_RESULT, deletedSourceCount };\n\t}\n\tconst admission = options.admissionBudget\n\t\t? await planContentMediaUsageProjectionAdmission(\n\t\t\t\trepo,\n\t\t\t\tsnapshotsResult.snapshots,\n\t\t\t\tobservedSources,\n\t\t\t\tcanonicalSourceKeys,\n\t\t\t\toptions.admissionBudget,\n\t\t\t)\n\t\t: null;\n\tif (admission && admission.outcome !== \"admitted\") {\n\t\treturn admissionFailureResult(admission.outcome);\n\t}\n\tlet refreshedSourceCount = 0;\n\tfor (const snapshot of snapshotsResult.snapshots) {\n\t\tif (\n\t\t\tadmission?.outcome === \"admitted\" &&\n\t\t\tadmission.noOpSourceKeys.has(snapshot.source.sourceKey)\n\t\t) {\n\t\t\trefreshedSourceCount++;\n\t\t\tcontinue;\n\t\t}\n\t\tconst result = await repo.replaceSourceIfMatching(\n\t\t\tsnapshot.source,\n\t\t\tsnapshot.occurrences,\n\t\t\tobservedSources.get(snapshot.source.sourceKey) ?? null,\n\t\t);\n\t\tif (result.unchanged) {\n\t\t\trefreshedSourceCount++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!result.replaced) {\n\t\t\treturn generationConflictResult({\n\t\t\t\trefreshedSourceCount,\n\t\t\t\tdeletedSourceCount: 0,\n\t\t\t});\n\t\t}\n\t\trefreshedSourceCount++;\n\t}\n\tif (!(await contentCollectionExists(db, collectionSlug, options.collectionId))) {\n\t\tif (options.collectionId) {\n\t\t\treturn generationConflictResult({ refreshedSourceCount, deletedSourceCount: 0 });\n\t\t}\n\t\tconst deletedSourceCount = await repo.deleteContentSources(collectionSlug, contentId);\n\t\treturn { ...ZERO_RESULT, deletedSourceCount };\n\t}\n\n\tconst expectedSourceKeys = new Set(\n\t\tsnapshotsResult.snapshots.map((snapshot) => snapshot.source.sourceKey),\n\t);\n\tconst absentSources =\n\t\tadmission?.outcome === \"admitted\"\n\t\t\t? admission.absentSources\n\t\t\t: canonicalSourceKeys\n\t\t\t\t\t.filter((sourceKey) => !expectedSourceKeys.has(sourceKey))\n\t\t\t\t\t.map((sourceKey) => observedSources.get(sourceKey))\n\t\t\t\t\t.filter((source): source is MediaUsageSource => source !== undefined);\n\tlet deletedSourceCount = 0;\n\tfor (const expectedSource of absentSources) {\n\t\tconst result = await repo.deleteSourceIfMatching(expectedSource.sourceKey, expectedSource);\n\t\tif (result.deleted) {\n\t\t\tdeletedSourceCount++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (result.source) {\n\t\t\treturn generationConflictResult({\n\t\t\t\trefreshedSourceCount,\n\t\t\t\tdeletedSourceCount,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn {\n\t\tsuccess: true,\n\t\trefreshedSourceCount,\n\t\tdeletedSourceCount,\n\t\tfailedSourceCount: 0,\n\t};\n}\n\nfunction contentSourceKeys(\n\tcollectionSlug: string,\n\tcontentId: string,\n\tcollectionId?: string,\n): string[] {\n\treturn MEDIA_USAGE_CONTENT_SOURCE_VARIANTS.map((sourceVariant) =>\n\t\tbuildContentMediaUsageSourceKey({\n\t\t\tcollectionId,\n\t\t\tcollectionSlug,\n\t\t\tcontentId,\n\t\t\tsourceVariant,\n\t\t}),\n\t);\n}\n\nfunction admissionFailureResult(\n\toutcome: \"intrinsic_resource_limit\" | \"claim_budget_deferred\",\n): ContentMediaUsageRefreshResult {\n\treturn {\n\t\t...generationConflictResult({ refreshedSourceCount: 0, deletedSourceCount: 0 }),\n\t\terrorCode:\n\t\t\toutcome === \"intrinsic_resource_limit\"\n\t\t\t\t? \"CONTENT_USAGE_RESOURCE_LIMIT\"\n\t\t\t\t: \"CONTENT_USAGE_GENERATION_CONFLICT\",\n\t};\n}\n\nasync function markGenerationConflict(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcounts: Pick<ContentMediaUsageRefreshResult, \"refreshedSourceCount\" | \"deletedSourceCount\">,\n): Promise<ContentMediaUsageRefreshResult> {\n\tawait markContentMediaUsageCollectionStaleSafely(\n\t\tdb,\n\t\tcollectionSlug,\n\t\t\"CONTENT_USAGE_GENERATION_CONFLICT\",\n\t);\n\treturn {\n\t\tsuccess: false,\n\t\trefreshedSourceCount: counts.refreshedSourceCount,\n\t\tdeletedSourceCount: counts.deletedSourceCount,\n\t\tfailedSourceCount: 0,\n\t\terrorCode: \"CONTENT_USAGE_GENERATION_CONFLICT\",\n\t};\n}\n\nfunction generationConflictResult(\n\tcounts: Pick<ContentMediaUsageRefreshResult, \"refreshedSourceCount\" | \"deletedSourceCount\">,\n): ContentMediaUsageRefreshResult {\n\treturn {\n\t\tsuccess: false,\n\t\trefreshedSourceCount: counts.refreshedSourceCount,\n\t\tdeletedSourceCount: counts.deletedSourceCount,\n\t\tfailedSourceCount: 0,\n\t\terrorCode: \"CONTENT_USAGE_GENERATION_CONFLICT\",\n\t};\n}\n\nasync function contentCollectionExists(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcollectionId?: string,\n): Promise<boolean> {\n\tlet query = db.selectFrom(\"_emdash_collections\").select(\"id\").where(\"slug\", \"=\", collectionSlug);\n\tif (collectionId) query = query.where(\"id\", \"=\", collectionId);\n\tconst row = await query.executeTakeFirst();\n\treturn row !== undefined;\n}\n\nexport async function deleteContentMediaUsage(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcontentId: string,\n): Promise<ContentMediaUsageRefreshResult> {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\treturn withContentUsageCollectionLock(collectionSlug, () =>\n\t\twithContentUsageLock(collectionSlug, contentId, () =>\n\t\t\tdeleteContentMediaUsageUnlocked(db, collectionSlug, contentId),\n\t\t),\n\t);\n}\n\nasync function deleteContentMediaUsageUnlocked(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcontentId: string,\n): Promise<ContentMediaUsageRefreshResult> {\n\ttry {\n\t\tconst deletedSourceCount = await new MediaUsageRepository(db).deleteContentSources(\n\t\t\tcollectionSlug,\n\t\t\tcontentId,\n\t\t);\n\t\treturn { ...ZERO_RESULT, deletedSourceCount };\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`[media-usage] Failed to delete usage for ${collectionSlug}/${contentId}:`,\n\t\t\terror,\n\t\t);\n\t\tawait markContentMediaUsageCollectionStaleSafely(\n\t\t\tdb,\n\t\t\tcollectionSlug,\n\t\t\t\"CONTENT_USAGE_DELETE_ERROR\",\n\t\t);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\trefreshedSourceCount: 0,\n\t\t\tdeletedSourceCount: 0,\n\t\t\tfailedSourceCount: 0,\n\t\t\terrorCode: \"CONTENT_USAGE_DELETE_ERROR\",\n\t\t};\n\t}\n}\n\nexport async function deleteContentMediaUsageCollection(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n): Promise<ContentMediaUsageRefreshResult> {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\treturn withContentUsageCollectionLock(collectionSlug, () =>\n\t\tdeleteContentMediaUsageCollectionUnlocked(db, collectionSlug),\n\t);\n}\n\nasync function deleteContentMediaUsageCollectionUnlocked(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n): Promise<ContentMediaUsageRefreshResult> {\n\ttry {\n\t\tconst repo = new MediaUsageRepository(db);\n\t\tconst deletedSourceCount = await repo.deleteCollectionSources(collectionSlug);\n\t\tawait repo.deleteIndexStatus({\n\t\t\tadapterId: CONTENT_MEDIA_USAGE_ADAPTER_ID,\n\t\t\tscopeType: CONTENT_MEDIA_USAGE_COLLECTION_SCOPE,\n\t\t\tscopeKey: collectionSlug,\n\t\t});\n\t\treturn { ...ZERO_RESULT, deletedSourceCount };\n\t} catch (error) {\n\t\tconsole.error(`[media-usage] Failed to delete usage for collection ${collectionSlug}:`, error);\n\t\ttry {\n\t\t\tawait new MediaUsageRepository(db).deleteIndexStatus({\n\t\t\t\tadapterId: CONTENT_MEDIA_USAGE_ADAPTER_ID,\n\t\t\t\tscopeType: CONTENT_MEDIA_USAGE_COLLECTION_SCOPE,\n\t\t\t\tscopeKey: collectionSlug,\n\t\t\t});\n\t\t} catch (statusError) {\n\t\t\tconsole.error(\n\t\t\t\t`[media-usage] Failed to clear usage status for deleted collection ${collectionSlug}:`,\n\t\t\t\tstatusError,\n\t\t\t);\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\trefreshedSourceCount: 0,\n\t\t\tdeletedSourceCount: 0,\n\t\t\tfailedSourceCount: 0,\n\t\t\terrorCode: \"CONTENT_USAGE_DELETE_ERROR\",\n\t\t};\n\t}\n}\n\nexport async function refreshContentMediaUsageAfterWrite(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcontentId: string,\n): Promise<void> {\n\tconst result = await refreshContentMediaUsage(db, collectionSlug, contentId);\n\tif (!result.success) {\n\t\tconsole.error(\n\t\t\t`[media-usage] Usage refresh for ${collectionSlug}/${contentId} finished with ${result.errorCode}`,\n\t\t);\n\t}\n}\n\nexport async function markContentMediaUsageCollectionStale(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tlastErrorCode: string,\n): Promise<void> {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\tconst repo = new MediaUsageRepository(db);\n\tconst identity = {\n\t\tadapterId: CONTENT_MEDIA_USAGE_ADAPTER_ID,\n\t\tscopeType: CONTENT_MEDIA_USAGE_COLLECTION_SCOPE,\n\t\tscopeKey: collectionSlug,\n\t};\n\tconst existing = await repo.findIndexStatus(identity);\n\tawait repo.upsertIndexStatus({\n\t\t...identity,\n\t\tstatus: \"stale\",\n\t\tschemaVersion: existing?.schemaVersion ?? CONTENT_SOURCE_SCHEMA_VERSION,\n\t\tstartedAt: existing?.startedAt ?? null,\n\t\tcompletedAt: existing?.completedAt ?? null,\n\t\tcursor: existing?.cursor ?? null,\n\t\tindexedSourceCount: existing?.indexedSourceCount ?? 0,\n\t\tfailedSourceCount: existing?.failedSourceCount ?? 0,\n\t\tlastErrorCode,\n\t});\n}\n\nexport async function invalidateContentMediaUsageSchemaChange(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n): Promise<boolean> {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\tif (!(await tableExists(db, \"_emdash_media_usage_activation\"))) return false;\n\tconst activation = await db\n\t\t.selectFrom(\"_emdash_media_usage_activation\")\n\t\t.select(\"state\")\n\t\t.where(\"task_key\", \"=\", \"incremental_capture\")\n\t\t.executeTakeFirst();\n\tif (activation?.state !== \"active\") return false;\n\n\tconst invalidated = await new MediaUsageRepository(db).invalidateIndexStatusForSchemaChange(\n\t\tcollectionSlug,\n\t);\n\tif (!invalidated) {\n\t\tthrow new Error(`Cannot invalidate media usage coverage for collection ${collectionSlug}`);\n\t}\n\treturn true;\n}\n\nexport async function findNonTranslatableSiblingContentIds(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tupdatedContentId: string,\n\ttranslationGroup: string | null | undefined,\n\tupdatedData: Record<string, unknown> | undefined,\n): Promise<string[]> {\n\tif (!isI18nEnabled() || !updatedData || !translationGroup) return [];\n\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\tconst collection = await db\n\t\t.selectFrom(\"_emdash_collections\")\n\t\t.select(\"id\")\n\t\t.where(\"slug\", \"=\", collectionSlug)\n\t\t.executeTakeFirst();\n\tif (!collection) return [];\n\n\tconst fields = await db\n\t\t.selectFrom(\"_emdash_fields\")\n\t\t.select(\"slug\")\n\t\t.where(\"collection_id\", \"=\", collection.id)\n\t\t.where(\"translatable\", \"=\", 0)\n\t\t.execute();\n\n\tconst touchedNonTranslatableSlugs = fields\n\t\t.filter((field) => field.slug in updatedData)\n\t\t.map((field) => field.slug);\n\tif (touchedNonTranslatableSlugs.length === 0) return [];\n\n\tconst usageFields = await loadContentMediaUsageFields(db, collectionSlug);\n\tconst usageRelevantSlugs = new Set([\n\t\t...usageFields.extractionFields.map((field) => field.slug),\n\t\t...usageFields.displayFieldSlugs,\n\t]);\n\tif (!touchedNonTranslatableSlugs.some((slug) => usageRelevantSlugs.has(slug))) return [];\n\n\tconst tableName = `ec_${collectionSlug}`;\n\tconst rows = await sql<{ id: string }>`\n\t\tSELECT id\n\t\tFROM ${sql.ref(tableName)}\n\t\tWHERE translation_group = ${translationGroup}\n\t\tAND id != ${updatedContentId}\n\t\tORDER BY id ASC\n\t`.execute(db);\n\n\treturn rows.rows.map((row) => row.id);\n}\n\nasync function markSnapshotFailure(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tresult: Exclude<Awaited<ReturnType<typeof loadContentMediaUsageSnapshots>>, { success: true }>,\n): Promise<ContentMediaUsageRefreshResult> {\n\tconst repo = new MediaUsageRepository(db);\n\tif (result.source) {\n\t\tawait repo.markSourceAttempted({\n\t\t\t...result.source,\n\t\t\tsourceCompleteness: \"failed\",\n\t\t\tlastErrorCode: result.error,\n\t\t});\n\t}\n\tawait markContentMediaUsageCollectionStale(db, collectionSlug, result.error);\n\treturn {\n\t\tsuccess: false,\n\t\trefreshedSourceCount: 0,\n\t\tdeletedSourceCount: 0,\n\t\tfailedSourceCount: result.source ? 1 : 0,\n\t\terrorCode: result.error,\n\t};\n}\n\nfunction snapshotFailureResult(\n\tresult: Exclude<Awaited<ReturnType<typeof loadContentMediaUsageSnapshots>>, { success: true }>,\n): ContentMediaUsageRefreshResult {\n\treturn {\n\t\tsuccess: false,\n\t\trefreshedSourceCount: 0,\n\t\tdeletedSourceCount: 0,\n\t\tfailedSourceCount: result.source ? 1 : 0,\n\t\terrorCode: result.error,\n\t};\n}\n\nasync function deleteCanonicalContentSourcesIfAbsent(\n\trepo: MediaUsageRepository,\n\tobservedSources: readonly MediaUsageSource[],\n\tcollectionSlug: string,\n\tcontentId: string,\n): Promise<ContentMediaUsageRefreshResult> {\n\tlet deletedSourceCount = 0;\n\tfor (const source of observedSources) {\n\t\tconst result = await repo.deleteSourceIfMatchingContentAbsent(\n\t\t\tsource.sourceKey,\n\t\t\tsource,\n\t\t\tcollectionSlug,\n\t\t\tcontentId,\n\t\t);\n\t\tif (result.deleted) {\n\t\t\tdeletedSourceCount++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (result.contentPresent || result.source) {\n\t\t\treturn generationConflictResult({ refreshedSourceCount: 0, deletedSourceCount });\n\t\t}\n\t}\n\treturn { ...ZERO_RESULT, deletedSourceCount };\n}\n\nexport async function markContentMediaUsageCollectionStaleSafely(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tlastErrorCode: ContentMediaUsageRefreshErrorCode,\n): Promise<boolean> {\n\ttry {\n\t\tawait markContentMediaUsageCollectionStale(db, collectionSlug, lastErrorCode);\n\t\treturn true;\n\t} catch (error) {\n\t\tconsole.error(`[media-usage] Failed to mark ${collectionSlug} stale:`, error);\n\t\treturn false;\n\t}\n}\n\nasync function withContentUsageLock<T>(\n\tcollectionSlug: string,\n\tcontentId: string,\n\tfn: () => Promise<T>,\n): Promise<T> {\n\tconst locks = getContentUsageLocks();\n\tconst lockKey = `${collectionSlug}\\0${contentId}`;\n\tconst previous = locks.get(lockKey) ?? Promise.resolve();\n\tlet releaseCurrent!: () => void;\n\tconst current = new Promise<void>((resolve) => {\n\t\treleaseCurrent = resolve;\n\t});\n\tconst next = previous.catch(() => {}).then(() => current);\n\tlocks.set(lockKey, next);\n\n\ttry {\n\t\tawait previous.catch(() => {});\n\t\treturn await fn();\n\t} finally {\n\t\treleaseCurrent();\n\t\tif (locks.get(lockKey) === next) locks.delete(lockKey);\n\t}\n}\n\nexport async function withContentUsageCollectionLock<T>(\n\tcollectionSlug: string,\n\tfn: () => Promise<T>,\n): Promise<T> {\n\t// Coarse by design: row refreshes and collection source deletes must not interleave.\n\tconst locks = getContentUsageCollectionLocks();\n\tconst previous = locks.get(collectionSlug) ?? Promise.resolve();\n\tlet releaseCurrent!: () => void;\n\tconst current = new Promise<void>((resolve) => {\n\t\treleaseCurrent = resolve;\n\t});\n\tconst next = previous.catch(() => {}).then(() => current);\n\tlocks.set(collectionSlug, next);\n\n\ttry {\n\t\tawait previous.catch(() => {});\n\t\treturn await fn();\n\t} finally {\n\t\treleaseCurrent();\n\t\tif (locks.get(collectionSlug) === next) locks.delete(collectionSlug);\n\t}\n}\n\nfunction getContentUsageLocks(): Map<string, Promise<void>> {\n\tconst global = globalThis as typeof globalThis & Record<symbol, unknown>;\n\tconst existing = global[CONTENT_USAGE_LOCKS_KEY];\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis symbol slot stores only this map\n\tif (existing instanceof Map) return existing as Map<string, Promise<void>>;\n\tconst locks = new Map<string, Promise<void>>();\n\tglobal[CONTENT_USAGE_LOCKS_KEY] = locks;\n\treturn locks;\n}\n\nfunction getContentUsageCollectionLocks(): Map<string, Promise<void>> {\n\tconst global = globalThis as typeof globalThis & Record<symbol, unknown>;\n\tconst existing = global[CONTENT_USAGE_COLLECTION_LOCKS_KEY];\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis symbol slot stores only this map\n\tif (existing instanceof Map) return existing as Map<string, Promise<void>>;\n\tconst locks = new Map<string, Promise<void>>();\n\tglobal[CONTENT_USAGE_COLLECTION_LOCKS_KEY] = locks;\n\treturn locks;\n}\n"],"mappings":"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"}
|