emdash 0.40.1 → 0.42.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/action-token-DBki7IT4.mjs +26 -0
- package/dist/action-token-DBki7IT4.mjs.map +1 -0
- package/dist/activation-DDuqAat2.mjs +387 -0
- package/dist/activation-DDuqAat2.mjs.map +1 -0
- package/dist/adapters-BrZxU6vM.d.mts +171 -0
- package/dist/adapters-BrZxU6vM.d.mts.map +1 -0
- package/dist/allowed-origins-CFtudhyw.mjs +116 -0
- package/dist/allowed-origins-CFtudhyw.mjs.map +1 -0
- package/dist/api/route-utils.d.mts +5 -4
- package/dist/api/route-utils.d.mts.map +1 -1
- package/dist/api/route-utils.mjs +52 -46
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +11 -10
- package/dist/api-CFQn8VLR.mjs +4973 -0
- package/dist/api-CFQn8VLR.mjs.map +1 -0
- package/dist/api-tokens-P3mAaQgr.mjs +166 -0
- package/dist/api-tokens-P3mAaQgr.mjs.map +1 -0
- package/dist/apply-C1kq5l7p.mjs +1672 -0
- package/dist/apply-C1kq5l7p.mjs.map +1 -0
- package/dist/approvals-l9sGqPmL.mjs +460 -0
- package/dist/approvals-l9sGqPmL.mjs.map +1 -0
- package/dist/artifact-fetch-CWxyELVI.mjs +659 -0
- package/dist/artifact-fetch-CWxyELVI.mjs.map +1 -0
- package/dist/astro/index.d.mts +14 -14
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +106 -560
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +12 -12
- package/dist/astro/middleware/auth.mjs +10 -10
- package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
- package/dist/astro/middleware/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +19 -9
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.d.mts +2 -1
- package/dist/astro/middleware/request-context.d.mts.map +1 -1
- package/dist/astro/middleware/request-context.mjs +15 -6
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +12 -12
- package/dist/astro/middleware.mjs +114 -107
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +15 -14
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +15 -14
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +18 -17
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +18 -17
- package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +18 -17
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +36 -27
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +32 -26
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +32 -26
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +20 -19
- 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 +19 -18
- 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 +19 -18
- package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/core-update.d.mts +8 -0
- package/dist/astro/routes/api/admin/core-update.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/core-update.mjs +28 -0
- package/dist/astro/routes/api/admin/core-update.mjs.map +1 -0
- 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/activation.mjs +21 -20
- package/dist/astro/routes/api/admin/media-usage/activation.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +23 -22
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +23 -22
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +26 -25
- package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +32 -31
- package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +23 -22
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +23 -22
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -1
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +75 -69
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +74 -68
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +75 -69
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +86 -79
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +75 -69
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +10 -7
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +74 -68
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +85 -78
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +74 -68
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +75 -69
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +87 -80
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +77 -71
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +75 -69
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +74 -68
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +74 -68
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +10 -7
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +74 -68
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +42 -41
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +42 -41
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +45 -44
- package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +45 -44
- package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +45 -44
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs +46 -45
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +46 -45
- package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +46 -45
- package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +46 -45
- package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +44 -43
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs +46 -45
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +16 -15
- 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/index.mjs +15 -14
- package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
- package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/complete.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +23 -19
- package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/index.mjs +17 -16
- package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
- package/dist/astro/routes/api/auth/invite/register-options.mjs +18 -17
- package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/logout.mjs +5 -5
- package/dist/astro/routes/api/auth/magic-link/send.mjs +19 -18
- package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +19 -15
- package/dist/astro/routes/api/auth/magic-link/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/me.mjs +16 -15
- package/dist/astro/routes/api/auth/me.mjs.map +1 -1
- package/dist/astro/routes/api/auth/mode.mjs +5 -5
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +13 -4
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +15 -14
- package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
- package/dist/astro/routes/api/auth/passkey/options.mjs +20 -19
- package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +18 -17
- package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +19 -18
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/passkey/verify.mjs +23 -19
- package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.d.mts.map +1 -1
- package/dist/astro/routes/api/auth/signup/complete.mjs +23 -19
- package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/request.mjs +18 -17
- package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
- package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +20 -19
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +12 -11
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +33 -32
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +1 -2
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +44 -54
- 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 +36 -30
- 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 +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +27 -25
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +18 -17
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +19 -18
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/index.mjs +16 -15
- package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/trash.mjs +16 -15
- package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
- package/dist/astro/routes/api/dashboard.mjs +13 -10
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +5 -5
- package/dist/astro/routes/api/health.mjs +6 -6
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +25 -24
- package/dist/astro/routes/api/import/probe.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +14 -14
- package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
- package/dist/astro/routes/api/import/wordpress/execute.mjs +167 -21
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
- package/dist/astro/routes/api/import/wordpress/media.mjs +20 -19
- package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +19 -18
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +29 -28
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +25 -24
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +36 -35
- 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.mjs +167 -110
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +20 -19
- package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/replace.mjs +17 -16
- package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
- package/dist/astro/routes/api/media/_id_/usage.mjs +34 -33
- package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_.mjs +32 -31
- package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
- package/dist/astro/routes/api/media/file/_...key_.mjs +9 -9
- package/dist/astro/routes/api/media/folders/_id_.mjs +17 -16
- package/dist/astro/routes/api/media/folders/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/media/folders/index.mjs +17 -16
- package/dist/astro/routes/api/media/folders/index.mjs.map +1 -1
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
- package/dist/astro/routes/api/media/providers/index.mjs +5 -5
- package/dist/astro/routes/api/media/upload-url.mjs +19 -18
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +36 -35
- package/dist/astro/routes/api/media.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +19 -18
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/items.mjs +19 -18
- package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +19 -18
- package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_/translations.mjs +19 -18
- package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/menus/_name_.mjs +19 -18
- package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/menus/index.mjs +19 -18
- package/dist/astro/routes/api/menus/index.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.d.mts +2 -1
- package/dist/astro/routes/api/oauth/device/authorize.d.mts.map +1 -1
- package/dist/astro/routes/api/oauth/device/authorize.mjs +23 -9
- package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
- package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
- package/dist/astro/routes/api/oauth/register.d.mts.map +1 -1
- package/dist/astro/routes/api/oauth/register.mjs +15 -7
- package/dist/astro/routes/api/oauth/register.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
- package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
- package/dist/astro/routes/api/oauth/token.mjs +8 -8
- package/dist/astro/routes/api/openapi.json.mjs +21 -20
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +12 -11
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/index.mjs +20 -19
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +20 -19
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +20 -19
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +20 -19
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/_id_/index.mjs +36 -30
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +38 -32
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
- package/dist/astro/routes/api/revisions/_revisionId_/restore.d.mts.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +26 -6
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +74 -68
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +74 -68
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/index.mjs +74 -68
- package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +76 -70
- 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 +74 -68
- 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 +74 -68
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +74 -68
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +74 -68
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +74 -68
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +17 -16
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +74 -68
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +74 -68
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +20 -19
- package/dist/astro/routes/api/search/enable.mjs.map +1 -1
- package/dist/astro/routes/api/search/index.mjs +19 -18
- package/dist/astro/routes/api/search/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/rebuild.mjs +20 -19
- 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 +19 -18
- package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
- package/dist/astro/routes/api/sections/_slug_.mjs +19 -18
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +19 -18
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +23 -22
- package/dist/astro/routes/api/settings.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.d.mts.map +1 -1
- package/dist/astro/routes/api/setup/admin-verify.mjs +26 -24
- package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
- package/dist/astro/routes/api/setup/admin.mjs +19 -18
- package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-bypass.mjs +47 -40
- 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 +52 -45
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +6 -6
- package/dist/astro/routes/api/snapshot.mjs +8 -8
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +24 -23
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +42 -40
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +25 -24
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +6 -6
- package/dist/astro/routes/api/typegen.d.mts.map +1 -1
- package/dist/astro/routes/api/typegen.mjs +8 -39
- package/dist/astro/routes/api/typegen.mjs.map +1 -1
- package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +20 -19
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +17 -16
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +20 -19
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +20 -19
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
- package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
- package/dist/astro/routes/api/widget-areas/index.mjs +20 -19
- package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
- package/dist/astro/routes/api/widget-components.mjs +5 -5
- package/dist/astro/routes/robots.txt.mjs +7 -7
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +10 -10
- package/dist/astro/routes/sitemap.xml.mjs +8 -8
- package/dist/astro/types.d.mts +30 -18
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/audit-BszbE_BP.mjs +127 -0
- package/dist/audit-BszbE_BP.mjs.map +1 -0
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/authoritative-records-dSvXCfzb.mjs +5172 -0
- package/dist/authoritative-records-dSvXCfzb.mjs.map +1 -0
- package/dist/authorize-soZXK7U0.mjs +49 -0
- package/dist/authorize-soZXK7U0.mjs.map +1 -0
- package/dist/backup-DQ3CABsO.mjs +246 -0
- package/dist/backup-DQ3CABsO.mjs.map +1 -0
- package/dist/block-types-DIG_KZwi.mjs +132 -0
- package/dist/block-types-DIG_KZwi.mjs.map +1 -0
- package/dist/block-values-BrTrtA-v.mjs +175 -0
- package/dist/block-values-BrTrtA-v.mjs.map +1 -0
- package/dist/byline-02tu_Uc-.mjs +909 -0
- package/dist/byline-02tu_Uc-.mjs.map +1 -0
- package/dist/byline-fields-B01Txzyx.mjs +123 -0
- package/dist/byline-fields-B01Txzyx.mjs.map +1 -0
- package/dist/byline-fields-DHJs0Mja.mjs +280 -0
- package/dist/byline-fields-DHJs0Mja.mjs.map +1 -0
- package/dist/byline-registry-dvt4N3xV.mjs +406 -0
- package/dist/byline-registry-dvt4N3xV.mjs.map +1 -0
- package/dist/bylines-COTwmMBF.mjs +150 -0
- package/dist/bylines-COTwmMBF.mjs.map +1 -0
- package/dist/bylines-D_S8UKRX.mjs +214 -0
- package/dist/bylines-D_S8UKRX.mjs.map +1 -0
- package/dist/cache-CPanL9IO.mjs +114 -0
- package/dist/cache-CPanL9IO.mjs.map +1 -0
- package/dist/canonical-CAecl1UQ.mjs +174 -0
- package/dist/canonical-CAecl1UQ.mjs.map +1 -0
- package/dist/capture-triggers-CdZfvHtF.mjs +362 -0
- package/dist/capture-triggers-CdZfvHtF.mjs.map +1 -0
- package/dist/challenge-store-CxZxPqaw.mjs +51 -0
- package/dist/challenge-store-CxZxPqaw.mjs.map +1 -0
- package/dist/checksum-DtH6m5uk.mjs +162 -0
- package/dist/checksum-DtH6m5uk.mjs.map +1 -0
- package/dist/chrome-tags-CKELm-bo.mjs +24 -0
- package/dist/chrome-tags-CKELm-bo.mjs.map +1 -0
- package/dist/chunks-DBmkKmBH.mjs +25 -0
- package/dist/chunks-DBmkKmBH.mjs.map +1 -0
- package/dist/cli/index.mjs +380 -1620
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +39 -34
- package/dist/client/index.d.mts.map +1 -1
- package/dist/client/index.mjs +8 -3
- package/dist/client/index.mjs.map +1 -1
- package/dist/collection-deletion-JecE26cS.mjs +436 -0
- package/dist/collection-deletion-JecE26cS.mjs.map +1 -0
- package/dist/collection-deletion-processor-DgCfF3a1.mjs +217 -0
- package/dist/collection-deletion-processor-DgCfF3a1.mjs.map +1 -0
- package/dist/collection-slugs-cache-BNRAPNiu.mjs +85 -0
- package/dist/collection-slugs-cache-BNRAPNiu.mjs.map +1 -0
- package/dist/comment-Cq1UYN8_.mjs +313 -0
- package/dist/comment-Cq1UYN8_.mjs.map +1 -0
- package/dist/comment-reaction-DPeGAfjd.mjs +85 -0
- package/dist/comment-reaction-DPeGAfjd.mjs.map +1 -0
- package/dist/comments-BRtp992B.mjs +99 -0
- package/dist/comments-BRtp992B.mjs.map +1 -0
- package/dist/comments-Bi2j9IoX.mjs +195 -0
- package/dist/comments-Bi2j9IoX.mjs.map +1 -0
- package/dist/components-CQY-Sgm-.mjs +108 -0
- package/dist/components-CQY-Sgm-.mjs.map +1 -0
- package/dist/config-BnuORwSP.mjs +242 -0
- package/dist/config-BnuORwSP.mjs.map +1 -0
- package/dist/config-CDmPF4p7.d.mts +39 -0
- package/dist/config-CDmPF4p7.d.mts.map +1 -0
- package/dist/config-DHsDMpXc.d.mts +6707 -0
- package/dist/config-DHsDMpXc.d.mts.map +1 -0
- package/dist/connection-B9pIasFd.mjs +36 -0
- package/dist/connection-B9pIasFd.mjs.map +1 -0
- package/dist/content-RzEXY3QX.mjs +2020 -0
- package/dist/content-RzEXY3QX.mjs.map +1 -0
- package/dist/content-list-query-CnXfe1Nu.d.mts +26 -0
- package/dist/content-list-query-CnXfe1Nu.d.mts.map +1 -0
- package/dist/content-policy-Dm32n9C6.mjs +46 -0
- package/dist/content-policy-Dm32n9C6.mjs.map +1 -0
- package/dist/content-repair-B-k5JrVN.mjs +442 -0
- package/dist/content-repair-B-k5JrVN.mjs.map +1 -0
- package/dist/context-CtRvoSAj.mjs +2026 -0
- package/dist/context-CtRvoSAj.mjs.map +1 -0
- package/dist/credits-CAFPFhuk.mjs +110 -0
- package/dist/credits-CAFPFhuk.mjs.map +1 -0
- package/dist/cron-xe5XKqA-.mjs +306 -0
- package/dist/cron-xe5XKqA-.mjs.map +1 -0
- package/dist/dashboard-BoV4pwPP.mjs +151 -0
- package/dist/dashboard-BoV4pwPP.mjs.map +1 -0
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +4 -4
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +4 -4
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +4 -4
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/default-DaoYyFRS.mjs +81 -0
- package/dist/default-DaoYyFRS.mjs.map +1 -0
- package/dist/deferred-tasks-OBADxoFf.d.mts +9 -0
- package/dist/deferred-tasks-OBADxoFf.d.mts.map +1 -0
- package/dist/destination-r2zIAZ2S.mjs +18 -0
- package/dist/destination-r2zIAZ2S.mjs.map +1 -0
- package/dist/dev-typegen-8JlYYFno.mjs +29 -0
- package/dist/dev-typegen-8JlYYFno.mjs.map +1 -0
- package/dist/device-flow-CzKi6tID.mjs +521 -0
- package/dist/device-flow-CzKi6tID.mjs.map +1 -0
- package/dist/digest-DiYAoZpf.mjs +194 -0
- package/dist/digest-DiYAoZpf.mjs.map +1 -0
- package/dist/direct-executor-CsEmH_2m.mjs +104 -0
- package/dist/direct-executor-CsEmH_2m.mjs.map +1 -0
- package/dist/dist-Cfu8mMBs.mjs +810 -0
- package/dist/dist-Cfu8mMBs.mjs.map +1 -0
- package/dist/email-console-DmqVF5J_.mjs +50 -0
- package/dist/email-console-DmqVF5J_.mjs.map +1 -0
- package/dist/email-locale-B5OjmAj_.mjs +25 -0
- package/dist/email-locale-B5OjmAj_.mjs.map +1 -0
- package/dist/emdash-runtime-CMdYH2Of.mjs +4229 -0
- package/dist/emdash-runtime-CMdYH2Of.mjs.map +1 -0
- package/dist/enrich-BDdVNeDK.mjs +194 -0
- package/dist/enrich-BDdVNeDK.mjs.map +1 -0
- package/dist/entry-lock-B-1bUDxX.d.mts +4544 -0
- package/dist/entry-lock-B-1bUDxX.d.mts.map +1 -0
- package/dist/entry-lock-B5eaZEZP.mjs +163 -0
- package/dist/entry-lock-B5eaZEZP.mjs.map +1 -0
- package/dist/entry-lock-PP1JCXBB.mjs +1180 -0
- package/dist/entry-lock-PP1JCXBB.mjs.map +1 -0
- package/dist/entry-locks-DJAqVweV.mjs +167 -0
- package/dist/entry-locks-DJAqVweV.mjs.map +1 -0
- package/dist/env-types-BaTCgn-y.mjs +38 -0
- package/dist/env-types-BaTCgn-y.mjs.map +1 -0
- package/dist/error-CEdm_AWU.mjs +90 -0
- package/dist/error-CEdm_AWU.mjs.map +1 -0
- package/dist/errors-CNvATh_7.mjs +469 -0
- package/dist/errors-CNvATh_7.mjs.map +1 -0
- package/dist/errors-CjXd1LgH.mjs +120 -0
- package/dist/errors-CjXd1LgH.mjs.map +1 -0
- package/dist/escape-nJW7dR0s.mjs +9 -0
- package/dist/escape-nJW7dR0s.mjs.map +1 -0
- package/dist/fence-BrnQffdY.mjs +162 -0
- package/dist/fence-BrnQffdY.mjs.map +1 -0
- package/dist/field-defs-cache-DEkFYCDE.mjs +77 -0
- package/dist/field-defs-cache-DEkFYCDE.mjs.map +1 -0
- package/dist/field-map-Cp5hDSRU.mjs +83 -0
- package/dist/field-map-Cp5hDSRU.mjs.map +1 -0
- package/dist/focal-point-JX8kcOTQ.mjs +23 -0
- package/dist/focal-point-JX8kcOTQ.mjs.map +1 -0
- package/dist/fts-manager-DU03MxWu.mjs +443 -0
- package/dist/fts-manager-DU03MxWu.mjs.map +1 -0
- package/dist/gc-Gf9LOF42.mjs +75 -0
- package/dist/gc-Gf9LOF42.mjs.map +1 -0
- package/dist/hash-CY4QdeMJ.mjs +37 -0
- package/dist/hash-CY4QdeMJ.mjs.map +1 -0
- package/dist/hook-result-DjdVwWpw.d.mts +31 -0
- package/dist/hook-result-DjdVwWpw.d.mts.map +1 -0
- package/dist/hreflang-Bq0ahAd4.mjs +105 -0
- package/dist/hreflang-Bq0ahAd4.mjs.map +1 -0
- package/dist/hreflang-C7ETs0Tv.d.mts +50 -0
- package/dist/hreflang-C7ETs0Tv.d.mts.map +1 -0
- package/dist/http-route-dispatch-B2G7_OOm.mjs +339 -0
- package/dist/http-route-dispatch-B2G7_OOm.mjs.map +1 -0
- package/dist/identity-u3KgtUC9.mjs +35 -0
- package/dist/identity-u3KgtUC9.mjs.map +1 -0
- package/dist/import-CzP9ffo0.mjs +2020 -0
- package/dist/import-CzP9ffo0.mjs.map +1 -0
- package/dist/index-D1_ykO2u.d.mts +623 -0
- package/dist/index-D1_ykO2u.d.mts.map +1 -0
- package/dist/index.d.mts +24 -24
- package/dist/index.mjs +108 -102
- package/dist/install-finalization-TbcQozrV.mjs +58 -0
- package/dist/install-finalization-TbcQozrV.mjs.map +1 -0
- package/dist/keys-r08WvAng.mjs +61 -0
- package/dist/keys-r08WvAng.mjs.map +1 -0
- package/dist/kinds-CXY-fwQ6.mjs +974 -0
- package/dist/kinds-CXY-fwQ6.mjs.map +1 -0
- package/dist/lifecycle-CpebZNAA.mjs +25 -0
- package/dist/lifecycle-CpebZNAA.mjs.map +1 -0
- package/dist/load-dHcR5yh9.mjs +28 -0
- package/dist/load-dHcR5yh9.mjs.map +1 -0
- package/dist/loader-B_bcoE1h.mjs +1197 -0
- package/dist/loader-B_bcoE1h.mjs.map +1 -0
- package/dist/loops-Dn1i16FP.mjs +205 -0
- package/dist/loops-Dn1i16FP.mjs.map +1 -0
- package/dist/manifest-builder-D7Y8iirE.mjs +189 -0
- package/dist/manifest-builder-D7Y8iirE.mjs.map +1 -0
- package/dist/manifest-schema-gy37bD_D.mjs +496 -0
- package/dist/manifest-schema-gy37bD_D.mjs.map +1 -0
- package/dist/marketplace-tHWSsCUo.mjs +257 -0
- package/dist/marketplace-tHWSsCUo.mjs.map +1 -0
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +4 -4
- package/dist/media/local-runtime.d.mts +14 -14
- package/dist/media/local-runtime.mjs +7 -7
- package/dist/media-3v7mqAVX.mjs +294 -0
- package/dist/media-3v7mqAVX.mjs.map +1 -0
- package/dist/media-CputjGE1.mjs +373 -0
- package/dist/media-CputjGE1.mjs.map +1 -0
- package/dist/media-D1z_jisb.mjs +408 -0
- package/dist/media-D1z_jisb.mjs.map +1 -0
- package/dist/media-allowlist-D5a4d-RA.mjs +44 -0
- package/dist/media-allowlist-D5a4d-RA.mjs.map +1 -0
- package/dist/media-folders-D2VdVBf6.mjs +210 -0
- package/dist/media-folders-D2VdVBf6.mjs.map +1 -0
- package/dist/media-url-DloW2xrP.mjs +43 -0
- package/dist/media-url-DloW2xrP.mjs.map +1 -0
- package/dist/media-usage-B8q0owWQ.mjs +1629 -0
- package/dist/media-usage-B8q0owWQ.mjs.map +1 -0
- package/dist/media-usage-activation-CQWOOTJi.mjs +78 -0
- package/dist/media-usage-activation-CQWOOTJi.mjs.map +1 -0
- package/dist/media-usage-work-BC0qpkMD.mjs +152 -0
- package/dist/media-usage-work-BC0qpkMD.mjs.map +1 -0
- package/dist/media-usage-work-BlMjwPg8.mjs +586 -0
- package/dist/media-usage-work-BlMjwPg8.mjs.map +1 -0
- package/dist/menus-BQKqf0Up.mjs +92 -0
- package/dist/menus-BQKqf0Up.mjs.map +1 -0
- package/dist/menus-DiuhXKWf.mjs +3646 -0
- package/dist/menus-DiuhXKWf.mjs.map +1 -0
- package/dist/menus-trvc6_fW.mjs +753 -0
- package/dist/menus-trvc6_fW.mjs.map +1 -0
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/mime-IZf-LHIS.mjs +36 -0
- package/dist/mime-IZf-LHIS.mjs.map +1 -0
- package/dist/mode-nh0ppSX5.mjs +23 -0
- package/dist/mode-nh0ppSX5.mjs.map +1 -0
- package/dist/node-sqlite-compat-CDOEcc97.mjs +63 -0
- package/dist/node-sqlite-compat-CDOEcc97.mjs.map +1 -0
- package/dist/normalize-BuWa0lvd.mjs +191 -0
- package/dist/normalize-BuWa0lvd.mjs.map +1 -0
- package/dist/oauth-authorization-BcRdGojQ.mjs +274 -0
- package/dist/oauth-authorization-BcRdGojQ.mjs.map +1 -0
- package/dist/oauth-clients-C-8WDTqj.mjs +266 -0
- package/dist/oauth-clients-C-8WDTqj.mjs.map +1 -0
- package/dist/oauth-state-store-CM5ZEYQS.mjs +50 -0
- package/dist/oauth-state-store-CM5ZEYQS.mjs.map +1 -0
- package/dist/oauth-user-lookup-DrrqvTZC.mjs +26 -0
- package/dist/oauth-user-lookup-DrrqvTZC.mjs.map +1 -0
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/object-cache-Bo6DGaC9.mjs +586 -0
- package/dist/object-cache-Bo6DGaC9.mjs.map +1 -0
- package/dist/options-C2IDQnD2.d.mts +81 -0
- package/dist/options-C2IDQnD2.d.mts.map +1 -0
- package/dist/ownership-DoeAIuTg.mjs +12 -0
- package/dist/ownership-DoeAIuTg.mjs.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.mjs +6 -6
- package/dist/parse-D5Sw9wAI.d.mts +172 -0
- package/dist/parse-D5Sw9wAI.d.mts.map +1 -0
- package/dist/parse-Gt2l4Sld.mjs +81 -0
- package/dist/parse-Gt2l4Sld.mjs.map +1 -0
- package/dist/passkey-config-CkQsrcU-.mjs +46 -0
- package/dist/passkey-config-CkQsrcU-.mjs.map +1 -0
- package/dist/paths-DiENGBx5.mjs +77 -0
- package/dist/paths-DiENGBx5.mjs.map +1 -0
- package/dist/patterns-DyZJ67I7.mjs +140 -0
- package/dist/patterns-DyZJ67I7.mjs.map +1 -0
- package/dist/placeholder-Cq5wLDCX.d.mts +306 -0
- package/dist/placeholder-Cq5wLDCX.d.mts.map +1 -0
- package/dist/plan-BxCS1tl5.mjs +135 -0
- package/dist/plan-BxCS1tl5.mjs.map +1 -0
- package/dist/plugin-test-runtime.d.mts +14 -14
- package/dist/plugin-test-runtime.mjs +115 -108
- package/dist/plugin-types.d.mts +5 -3
- package/dist/plugin-types.d.mts.map +1 -1
- package/dist/plugin-types.mjs.map +1 -1
- package/dist/plugin-utils.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.mjs +48 -10
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/plugins/host.d.mts +6 -6
- package/dist/plugins/host.mjs +49 -43
- package/dist/plugins-BpLkXA1S.mjs +277 -0
- package/dist/plugins-BpLkXA1S.mjs.map +1 -0
- package/dist/policy-C1qpNxrr.mjs +45 -0
- package/dist/policy-C1qpNxrr.mjs.map +1 -0
- package/dist/portable-text-BnRuiR1-.mjs +307 -0
- package/dist/portable-text-BnRuiR1-.mjs.map +1 -0
- package/dist/preview-DU5rwz_m.mjs +107 -0
- package/dist/preview-DU5rwz_m.mjs.map +1 -0
- package/dist/protocol-B9GEhEyi.d.mts +61 -0
- package/dist/protocol-B9GEhEyi.d.mts.map +1 -0
- package/dist/public-submission-yZaTTfsC.mjs +250 -0
- package/dist/public-submission-yZaTTfsC.mjs.map +1 -0
- package/dist/public-url-B5a0QAh6.mjs +101 -0
- package/dist/public-url-B5a0QAh6.mjs.map +1 -0
- package/dist/query-6e2CQxUv.mjs +1161 -0
- package/dist/query-6e2CQxUv.mjs.map +1 -0
- package/dist/query-DC3bv__4.mjs +41 -0
- package/dist/query-DC3bv__4.mjs.map +1 -0
- package/dist/rate-limit-BXx3Ecp9.mjs +120 -0
- package/dist/rate-limit-BXx3Ecp9.mjs.map +1 -0
- package/dist/receipt-q1VK9jhj.mjs +43 -0
- package/dist/receipt-q1VK9jhj.mjs.map +1 -0
- package/dist/redirect-BvFKh8Sz.mjs +416 -0
- package/dist/redirect-BvFKh8Sz.mjs.map +1 -0
- package/dist/redirect-D1AmADlk.mjs +19 -0
- package/dist/redirect-D1AmADlk.mjs.map +1 -0
- package/dist/redirects-CWQMKYOS.mjs +446 -0
- package/dist/redirects-CWQMKYOS.mjs.map +1 -0
- package/dist/redirects-D4EWeXAo.mjs +148 -0
- package/dist/redirects-D4EWeXAo.mjs.map +1 -0
- package/dist/registry/testing.d.mts +16 -4
- package/dist/registry/testing.d.mts.map +1 -1
- package/dist/registry/testing.mjs +20 -10
- package/dist/registry/testing.mjs.map +1 -1
- package/dist/registry-CtHRqVe-.mjs +6771 -0
- package/dist/registry-CtHRqVe-.mjs.map +1 -0
- package/dist/relations-CVI2nbrn.mjs +776 -0
- package/dist/relations-CVI2nbrn.mjs.map +1 -0
- package/dist/request-cache-C4CIo5ad.mjs +104 -0
- package/dist/request-cache-C4CIo5ad.mjs.map +1 -0
- package/dist/request-context.d.mts +9 -1
- package/dist/request-context.d.mts.map +1 -1
- package/dist/request-context.mjs.map +1 -1
- package/dist/request-meta-B6blULFY.mjs +141 -0
- package/dist/request-meta-B6blULFY.mjs.map +1 -0
- package/dist/resolve-Cx0Pwz0-.mjs +100 -0
- package/dist/resolve-Cx0Pwz0-.mjs.map +1 -0
- package/dist/resolve-D-kqyKns.mjs +199 -0
- package/dist/resolve-D-kqyKns.mjs.map +1 -0
- package/dist/revision-CGkQA0e5.mjs +366 -0
- package/dist/revision-CGkQA0e5.mjs.map +1 -0
- package/dist/route-wire-DK600v4u.mjs +197 -0
- package/dist/route-wire-DK600v4u.mjs.map +1 -0
- package/dist/routes-DTduBPzX.mjs +272 -0
- package/dist/routes-DTduBPzX.mjs.map +1 -0
- package/dist/runner-CLpxmhl8.mjs +6197 -0
- package/dist/runner-CLpxmhl8.mjs.map +1 -0
- package/dist/runner-Ji7qyH2A.d.mts +68 -0
- package/dist/runner-Ji7qyH2A.d.mts.map +1 -0
- package/dist/runtime.d.mts +13 -13
- package/dist/runtime.mjs +3 -3
- package/dist/schema/project-env-types.d.mts +12 -0
- package/dist/schema/project-env-types.d.mts.map +1 -0
- package/dist/schema/project-env-types.mjs +86 -0
- package/dist/schema/project-env-types.mjs.map +1 -0
- package/dist/schema-BZPj3kwZ.mjs +13 -0
- package/dist/schema-BZPj3kwZ.mjs.map +1 -0
- package/dist/schema-Berj5VQx.mjs +815 -0
- package/dist/schema-Berj5VQx.mjs.map +1 -0
- package/dist/scopes-C1HJaIyf.mjs +34 -0
- package/dist/scopes-C1HJaIyf.mjs.map +1 -0
- package/dist/search-thYf8j9F.mjs +448 -0
- package/dist/search-thYf8j9F.mjs.map +1 -0
- package/dist/sections-2k1uIgJ0.mjs +346 -0
- package/dist/sections-2k1uIgJ0.mjs.map +1 -0
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +39 -32
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +24 -22
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo-C61bnPuV.mjs +114 -0
- package/dist/seo-C61bnPuV.mjs.map +1 -0
- package/dist/seo-DpYxmGaL.mjs +133 -0
- package/dist/seo-DpYxmGaL.mjs.map +1 -0
- package/dist/service-BFUImckH.mjs +150 -0
- package/dist/service-BFUImckH.mjs.map +1 -0
- package/dist/session-user-DVcHsFD5.mjs +61 -0
- package/dist/session-user-DVcHsFD5.mjs.map +1 -0
- package/dist/settings-B0zQj_Tj.mjs +61 -0
- package/dist/settings-B0zQj_Tj.mjs.map +1 -0
- package/dist/settings-BJjK_X7x.mjs +51 -0
- package/dist/settings-BJjK_X7x.mjs.map +1 -0
- package/dist/settings-BbVRRGDp.mjs +439 -0
- package/dist/settings-BbVRRGDp.mjs.map +1 -0
- package/dist/setup-complete-CuLcTDTU.mjs +65 -0
- package/dist/setup-complete-CuLcTDTU.mjs.map +1 -0
- package/dist/setup-nonce-CAQoY5PC.mjs +25 -0
- package/dist/setup-nonce-CAQoY5PC.mjs.map +1 -0
- package/dist/site-settings-AYFvhwQn.mjs +50 -0
- package/dist/site-settings-AYFvhwQn.mjs.map +1 -0
- package/dist/site-url-Ceq_AUK0.mjs +16 -0
- package/dist/site-url-Ceq_AUK0.mjs.map +1 -0
- package/dist/snapshot-Dzsn3NZa.mjs +414 -0
- package/dist/snapshot-Dzsn3NZa.mjs.map +1 -0
- package/dist/ssrf-DsmvZB80.mjs +406 -0
- package/dist/ssrf-DsmvZB80.mjs.map +1 -0
- package/dist/stage-Cf9PqdUB.mjs +662 -0
- package/dist/stage-Cf9PqdUB.mjs.map +1 -0
- package/dist/staged-Bw5eHbKS.mjs +686 -0
- package/dist/staged-Bw5eHbKS.mjs.map +1 -0
- package/dist/state-kGdOMQRY.mjs +153 -0
- package/dist/state-kGdOMQRY.mjs.map +1 -0
- package/dist/status-D39Fpy8R.mjs +30 -0
- package/dist/status-D39Fpy8R.mjs.map +1 -0
- 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/storage-query-C9bK0Dg6.d.mts +1614 -0
- package/dist/storage-query-C9bK0Dg6.d.mts.map +1 -0
- package/dist/tar-lDI_fzLD.mjs +449 -0
- package/dist/tar-lDI_fzLD.mjs.map +1 -0
- package/dist/target-DOFs5oUC.mjs +27 -0
- package/dist/target-DOFs5oUC.mjs.map +1 -0
- package/dist/taxonomies-DQGomz9p.mjs +939 -0
- package/dist/taxonomies-DQGomz9p.mjs.map +1 -0
- package/dist/taxonomies-DWv-OYT0.mjs +697 -0
- package/dist/taxonomies-DWv-OYT0.mjs.map +1 -0
- package/dist/taxonomy-BesdHIwi.mjs +525 -0
- package/dist/taxonomy-BesdHIwi.mjs.map +1 -0
- package/dist/tokens-BIGxi8sP.mjs +171 -0
- package/dist/tokens-BIGxi8sP.mjs.map +1 -0
- package/dist/transaction-BVYIo_yu.mjs +29 -0
- package/dist/transaction-BVYIo_yu.mjs.map +1 -0
- package/dist/transfer-BtzoaXLk.mjs +166 -0
- package/dist/transfer-BtzoaXLk.mjs.map +1 -0
- package/dist/transfer-DLu_6AXL.mjs +8856 -0
- package/dist/transfer-DLu_6AXL.mjs.map +1 -0
- package/dist/transfer-download-b_PCrqJJ.mjs +33 -0
- package/dist/transfer-download-b_PCrqJJ.mjs.map +1 -0
- package/dist/transformations-DdnpSdeC.mjs +196 -0
- package/dist/transformations-DdnpSdeC.mjs.map +1 -0
- package/dist/transport-flR-Zmds.d.mts +42 -0
- package/dist/transport-flR-Zmds.d.mts.map +1 -0
- package/dist/transport-umzEbgYO.mjs +136 -0
- package/dist/transport-umzEbgYO.mjs.map +1 -0
- package/dist/trusted-proxy-BqfQFs6a.mjs +51 -0
- package/dist/trusted-proxy-BqfQFs6a.mjs.map +1 -0
- package/dist/turnstile-IvQp2uyD.mjs +53 -0
- package/dist/turnstile-IvQp2uyD.mjs.map +1 -0
- package/dist/types-2V_MVPYy.d.mts +125 -0
- package/dist/types-2V_MVPYy.d.mts.map +1 -0
- package/dist/types-B-WCvzdi.d.mts +198 -0
- package/dist/types-B-WCvzdi.d.mts.map +1 -0
- package/dist/types-BGmQ0uXs.mjs +201 -0
- package/dist/types-BGmQ0uXs.mjs.map +1 -0
- package/dist/types-CVsmpTcU.mjs +18 -0
- package/dist/types-CVsmpTcU.mjs.map +1 -0
- package/dist/types-C_V-_vMS.d.mts +198 -0
- package/dist/types-C_V-_vMS.d.mts.map +1 -0
- package/dist/types-CdEMurNh.mjs +77 -0
- package/dist/types-CdEMurNh.mjs.map +1 -0
- package/dist/types-CsmwbOwa.mjs +22 -0
- package/dist/types-CsmwbOwa.mjs.map +1 -0
- package/dist/types-Cw-1it3n.d.mts +287 -0
- package/dist/types-Cw-1it3n.d.mts.map +1 -0
- package/dist/types-D7B20WFC.d.mts +374 -0
- package/dist/types-D7B20WFC.d.mts.map +1 -0
- package/dist/types-DGw8KMX_.mjs +16 -0
- package/dist/types-DGw8KMX_.mjs.map +1 -0
- package/dist/types-DZeDpzMc.d.mts +896 -0
- package/dist/types-DZeDpzMc.d.mts.map +1 -0
- package/dist/types-DuQAIPA-.d.mts +363 -0
- package/dist/types-DuQAIPA-.d.mts.map +1 -0
- package/dist/types-edRPQchz.d.mts +85 -0
- package/dist/types-edRPQchz.d.mts.map +1 -0
- package/dist/types-j6MBDjlZ.mjs +103 -0
- package/dist/types-j6MBDjlZ.mjs.map +1 -0
- package/dist/types-pOLeFKGq.d.mts +1720 -0
- package/dist/types-pOLeFKGq.d.mts.map +1 -0
- package/dist/update-check-CaZyFHZC.mjs +161 -0
- package/dist/update-check-CaZyFHZC.mjs.map +1 -0
- package/dist/upload-attempts-BodUoFBu.mjs +32 -0
- package/dist/upload-attempts-BodUoFBu.mjs.map +1 -0
- package/dist/url-Dn3IStq8.mjs +104 -0
- package/dist/url-Dn3IStq8.mjs.map +1 -0
- package/dist/url-pattern-DGAG6ZP2.mjs +41 -0
- package/dist/url-pattern-DGAG6ZP2.mjs.map +1 -0
- package/dist/user-BOvuF1sQ.mjs +171 -0
- package/dist/user-BOvuF1sQ.mjs.map +1 -0
- package/dist/utils-CoV-PYhg.mjs +439 -0
- package/dist/utils-CoV-PYhg.mjs.map +1 -0
- package/dist/validate-WkjGwBSO.mjs +516 -0
- package/dist/validate-WkjGwBSO.mjs.map +1 -0
- package/dist/validate-dK97qe7F.d.mts +468 -0
- package/dist/validate-dK97qe7F.d.mts.map +1 -0
- package/dist/validation-D-ICq_tY.mjs +219 -0
- package/dist/validation-D-ICq_tY.mjs.map +1 -0
- package/dist/version-DbT04wbH.mjs +9 -0
- package/dist/version-DbT04wbH.mjs.map +1 -0
- package/dist/version-IneBU54o.mjs +7 -0
- package/dist/version-IneBU54o.mjs.map +1 -0
- package/dist/virtual-modules-Brh6mRVe.mjs +516 -0
- package/dist/virtual-modules-Brh6mRVe.mjs.map +1 -0
- package/dist/widgets-D8T0xBYs.mjs +126 -0
- package/dist/widgets-D8T0xBYs.mjs.map +1 -0
- package/dist/wxr-taxonomies-B6iE8m9I.d.mts +34 -0
- package/dist/wxr-taxonomies-B6iE8m9I.d.mts.map +1 -0
- package/dist/wxr-taxonomies-DEzR9N7e.mjs +453 -0
- package/dist/wxr-taxonomies-DEzR9N7e.mjs.map +1 -0
- package/dist/zod-generator-DnfG5sGQ.mjs +424 -0
- package/dist/zod-generator-DnfG5sGQ.mjs.map +1 -0
- package/package.json +15 -15
- package/src/api/errors.ts +11 -0
- package/src/api/handlers/bulk-tag.ts +4 -4
- package/src/api/handlers/content.ts +631 -32
- package/src/api/handlers/device-flow.ts +74 -21
- package/src/api/handlers/index.ts +3 -0
- package/src/api/handlers/manifest.ts +81 -5
- package/src/api/handlers/media-upload.ts +3 -0
- package/src/api/handlers/media.ts +2 -2
- package/src/api/handlers/registry.ts +123 -70
- package/src/api/handlers/relations.ts +638 -157
- package/src/api/handlers/revision.ts +40 -2
- package/src/api/handlers/schema.ts +403 -1
- package/src/api/handlers/staged-references.ts +208 -0
- package/src/api/handlers/update-check.ts +236 -0
- package/src/api/handlers/validate-references.ts +146 -0
- package/src/api/redirect.ts +9 -1
- package/src/api/schemas/content.ts +17 -0
- package/src/api/schemas/import.ts +50 -14
- package/src/api/schemas/relations.ts +54 -44
- package/src/api/schemas/schema.ts +26 -6
- package/src/api/setup-complete.ts +49 -1
- package/src/api/types.ts +4 -0
- package/src/astro/dev-typegen.ts +15 -22
- package/src/astro/integration/dev-typegen.ts +32 -3
- package/src/astro/integration/index.ts +88 -22
- package/src/astro/integration/routes.ts +21 -19
- package/src/astro/integration/runtime.ts +33 -7
- package/src/astro/integration/virtual-modules.ts +1 -0
- package/src/astro/integration/vite-config.ts +16 -8
- package/src/astro/middleware/redirect.ts +15 -2
- package/src/astro/middleware/request-context.ts +13 -6
- package/src/astro/routes/api/admin/bylines/[id]/index.ts +11 -1
- package/src/astro/routes/api/admin/bylines/[id]/translations.ts +7 -1
- package/src/astro/routes/api/admin/bylines/index.ts +6 -1
- package/src/astro/routes/api/admin/core-update.ts +34 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/icon.ts +6 -2
- package/src/astro/routes/api/admin/themes/marketplace/[id]/thumbnail.ts +6 -2
- package/src/astro/routes/api/auth/invite/complete.ts +4 -4
- package/src/astro/routes/api/auth/magic-link/verify.ts +4 -1
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +9 -4
- package/src/astro/routes/api/auth/passkey/verify.ts +4 -4
- package/src/astro/routes/api/auth/signup/complete.ts +4 -4
- package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +11 -54
- package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
- package/src/astro/routes/api/import/wordpress/execute.ts +252 -6
- package/src/astro/routes/api/import/wordpress/prepare.ts +1 -2
- package/src/astro/routes/api/oauth/device/authorize.ts +33 -4
- package/src/astro/routes/api/oauth/register.ts +22 -2
- package/src/astro/routes/api/relations/index.ts +4 -4
- package/src/astro/routes/api/revisions/[revisionId]/restore.ts +17 -1
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +6 -2
- package/src/astro/routes/api/setup/admin-verify.ts +6 -5
- package/src/astro/routes/api/typegen.ts +4 -46
- package/src/astro/session-user.ts +14 -0
- package/src/astro/types.ts +11 -0
- package/src/bylines/credits.ts +149 -0
- package/src/bylines/index.ts +4 -142
- package/src/cli/commands/export-seed.ts +510 -89
- package/src/cli/commands/seed.ts +2 -0
- package/src/cli/credentials.ts +1 -60
- package/src/cli/index.ts +0 -2
- package/src/client/index.ts +8 -2
- package/src/components/Image.astro +24 -13
- package/src/components/InlinePortableTextEditor.tsx +25 -8
- package/src/components/WidgetArea.astro +3 -2
- package/src/content/converters/portable-text-to-prosemirror.ts +23 -17
- package/src/content/converters/prosemirror-to-portable-text.ts +16 -5
- package/src/content/converters/types.ts +1 -0
- package/src/database/content-datetime.ts +111 -23
- package/src/database/migrations/036_i18n_menus_and_taxonomies.ts +132 -92
- package/src/database/migrations/086_relations_structural.ts +197 -0
- package/src/database/migrations/087_reference_field_relations.ts +407 -0
- package/src/database/migrations/088_cron_oneshot_utc.ts +39 -0
- package/src/database/migrations/089_auto_seed_completion.ts +13 -0
- package/src/database/migrations/runner.ts +8 -0
- package/src/database/reference-backfill.ts +141 -0
- package/src/database/repositories/comment.ts +2 -2
- package/src/database/repositories/content.ts +58 -16
- package/src/database/repositories/plugin-storage.ts +1 -1
- package/src/database/repositories/redirect.ts +7 -2
- package/src/database/repositories/relation.ts +622 -210
- package/src/database/repositories/revision.ts +16 -0
- package/src/database/repositories/types.ts +38 -0
- package/src/database/transaction.ts +12 -1
- package/src/database/types.ts +15 -6
- package/src/db/node-sqlite-compat.ts +63 -37
- package/src/emdash-runtime.ts +149 -46
- package/src/import/wxr-taxonomies.ts +163 -88
- package/src/index.ts +20 -0
- package/src/loader.ts +177 -23
- package/src/mcp/server.ts +90 -8
- package/src/media/usage/activation.ts +18 -9
- package/src/migrations/config-loader.ts +5 -0
- package/src/object-cache/index.ts +19 -7
- package/src/object-cache/types.ts +3 -2
- package/src/plugin-types.ts +7 -0
- package/src/plugins/adapt-sandbox-entry.ts +47 -12
- package/src/plugins/byline-access.ts +158 -0
- package/src/plugins/context.ts +7 -1
- package/src/plugins/cron.ts +27 -4
- package/src/plugins/hooks.ts +47 -0
- package/src/plugins/host.ts +1 -0
- package/src/plugins/index.ts +10 -1
- package/src/plugins/manifest-schema.ts +5 -1
- package/src/plugins/marketplace.ts +48 -36
- package/src/plugins/sandbox/proxy.ts +1 -0
- package/src/plugins/types.ts +95 -0
- package/src/query.ts +464 -27
- package/src/redirects/cache.ts +11 -1
- package/src/redirects/destination.ts +20 -0
- package/src/redirects/loops.ts +10 -6
- package/src/redirects/patterns.ts +12 -30
- package/src/references/field-map.ts +115 -0
- package/src/references/resolve.ts +160 -0
- package/src/references/staged.ts +157 -0
- package/src/references/types.ts +16 -0
- package/src/registry/artifact-fetch.ts +45 -271
- package/src/registry/testing.ts +59 -14
- package/src/request-context.ts +8 -0
- package/src/schema/block-type-registry.ts +1 -1
- package/src/schema/env-types.ts +37 -0
- package/src/schema/project-env-types.ts +41 -0
- package/src/schema/registry.ts +132 -26
- package/src/schema/types.ts +63 -0
- package/src/schema/url-pattern.ts +10 -0
- package/src/schema/zod-generator.ts +78 -2
- package/src/seed/apply.ts +553 -63
- package/src/seed/ownership.ts +15 -0
- package/src/seed/types.ts +36 -2
- package/src/seed/validate.ts +123 -4
- package/src/transfer/analyze/unique-keys.ts +3 -12
- package/src/transfer/analyze/validate.ts +178 -40
- package/src/transfer/analyze/values.ts +116 -2
- package/src/transfer/analyze/write-rules.ts +8 -0
- package/src/transfer/export/readers.ts +12 -8
- package/src/transfer/format/columns.ts +26 -6
- package/src/transfer/format/kinds.ts +21 -5
- package/src/transfer/import/context.ts +8 -1
- package/src/transfer/ops/package-index.ts +1 -1
- package/src/utils/url.ts +58 -3
- package/src/virtual-modules.d.ts +3 -0
- package/dist/action-token-DYwe4Pk0.mjs +0 -26
- package/dist/action-token-DYwe4Pk0.mjs.map +0 -1
- package/dist/activation-LOkDM5WT.mjs +0 -382
- package/dist/activation-LOkDM5WT.mjs.map +0 -1
- package/dist/adapters-B64LbYcB.d.mts +0 -171
- package/dist/adapters-B64LbYcB.d.mts.map +0 -1
- package/dist/allowed-origins-CHB8oZNM.mjs +0 -116
- package/dist/allowed-origins-CHB8oZNM.mjs.map +0 -1
- package/dist/api-CuyNEHZG.mjs +0 -4718
- package/dist/api-CuyNEHZG.mjs.map +0 -1
- package/dist/api-tokens-s4i4aUp_.mjs +0 -166
- package/dist/api-tokens-s4i4aUp_.mjs.map +0 -1
- package/dist/apply-npY1TAhG.mjs +0 -1366
- package/dist/apply-npY1TAhG.mjs.map +0 -1
- package/dist/approvals-CqMfNxak.mjs +0 -460
- package/dist/approvals-CqMfNxak.mjs.map +0 -1
- package/dist/artifact-fetch-DZMOGZ3-.mjs +0 -818
- package/dist/artifact-fetch-DZMOGZ3-.mjs.map +0 -1
- package/dist/astro/routes/api/relations/_id_/translations.d.mts +0 -8
- package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +0 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +0 -47
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +0 -1
- package/dist/audit-RfCugiSB.mjs +0 -127
- package/dist/audit-RfCugiSB.mjs.map +0 -1
- package/dist/authoritative-records-CoJvBXAD.mjs +0 -5172
- package/dist/authoritative-records-CoJvBXAD.mjs.map +0 -1
- package/dist/authorize-seCifOMJ.mjs +0 -49
- package/dist/authorize-seCifOMJ.mjs.map +0 -1
- package/dist/backup-BQRj3afm.mjs +0 -246
- package/dist/backup-BQRj3afm.mjs.map +0 -1
- package/dist/block-type-registry-DUI_3KxT.mjs +0 -6709
- package/dist/block-type-registry-DUI_3KxT.mjs.map +0 -1
- package/dist/block-types-BmZmLmAD.mjs +0 -132
- package/dist/block-types-BmZmLmAD.mjs.map +0 -1
- package/dist/block-values-C_VIPr5t.mjs +0 -175
- package/dist/block-values-C_VIPr5t.mjs.map +0 -1
- package/dist/byline-DYmkXqvo.mjs +0 -909
- package/dist/byline-DYmkXqvo.mjs.map +0 -1
- package/dist/byline-fields-D28AT-Fh.mjs +0 -123
- package/dist/byline-fields-D28AT-Fh.mjs.map +0 -1
- package/dist/byline-registry-gnKscbQX.mjs +0 -406
- package/dist/byline-registry-gnKscbQX.mjs.map +0 -1
- package/dist/bylines-BPwJqoYH.mjs +0 -232
- package/dist/bylines-BPwJqoYH.mjs.map +0 -1
- package/dist/bylines-ukLaYpVZ.mjs +0 -214
- package/dist/bylines-ukLaYpVZ.mjs.map +0 -1
- package/dist/cache-m7UEkRFV.mjs +0 -108
- package/dist/cache-m7UEkRFV.mjs.map +0 -1
- package/dist/canonical-YhEQezjg.mjs +0 -174
- package/dist/canonical-YhEQezjg.mjs.map +0 -1
- package/dist/capture-triggers-kJyl_yyM.mjs +0 -362
- package/dist/capture-triggers-kJyl_yyM.mjs.map +0 -1
- package/dist/challenge-store-ppU6Uv13.mjs +0 -51
- package/dist/challenge-store-ppU6Uv13.mjs.map +0 -1
- package/dist/checksum-B2IINIlN.mjs +0 -162
- package/dist/checksum-B2IINIlN.mjs.map +0 -1
- package/dist/chrome-tags-DApCQSIk.mjs +0 -24
- package/dist/chrome-tags-DApCQSIk.mjs.map +0 -1
- package/dist/chunks-Dms7Uxbt.mjs +0 -25
- package/dist/chunks-Dms7Uxbt.mjs.map +0 -1
- package/dist/collection-deletion-BIm28mo3.mjs +0 -436
- package/dist/collection-deletion-BIm28mo3.mjs.map +0 -1
- package/dist/collection-deletion-processor-Br6rxs3u.mjs +0 -217
- package/dist/collection-deletion-processor-Br6rxs3u.mjs.map +0 -1
- package/dist/collection-slugs-cache-CjGk__zp.mjs +0 -85
- package/dist/collection-slugs-cache-CjGk__zp.mjs.map +0 -1
- package/dist/comment-CrBl22OF.mjs +0 -313
- package/dist/comment-CrBl22OF.mjs.map +0 -1
- package/dist/comment-reaction-JEQ2Fpd8.mjs +0 -85
- package/dist/comment-reaction-JEQ2Fpd8.mjs.map +0 -1
- package/dist/comments-2ah9du9y.mjs +0 -195
- package/dist/comments-2ah9du9y.mjs.map +0 -1
- package/dist/comments-fHZ8ON9O.mjs +0 -99
- package/dist/comments-fHZ8ON9O.mjs.map +0 -1
- package/dist/components-CXbq7CSM.mjs +0 -108
- package/dist/components-CXbq7CSM.mjs.map +0 -1
- package/dist/config-BjEm_3xL.d.mts +0 -6537
- package/dist/config-BjEm_3xL.d.mts.map +0 -1
- package/dist/config-IhybvkIQ.mjs +0 -242
- package/dist/config-IhybvkIQ.mjs.map +0 -1
- package/dist/config-Py43JK9r.d.mts +0 -39
- package/dist/config-Py43JK9r.d.mts.map +0 -1
- package/dist/content-DFaIEDj9.mjs +0 -2281
- package/dist/content-DFaIEDj9.mjs.map +0 -1
- package/dist/content-list-query-Dra4Dalc.d.mts +0 -26
- package/dist/content-list-query-Dra4Dalc.d.mts.map +0 -1
- package/dist/content-policy-DFNw91-d.mjs +0 -46
- package/dist/content-policy-DFNw91-d.mjs.map +0 -1
- package/dist/content-repair-Q8IUrpLL.mjs +0 -442
- package/dist/content-repair-Q8IUrpLL.mjs.map +0 -1
- package/dist/context-BV_7t-Ua.mjs +0 -1921
- package/dist/context-BV_7t-Ua.mjs.map +0 -1
- package/dist/cron-7DCJwPXq.mjs +0 -284
- package/dist/cron-7DCJwPXq.mjs.map +0 -1
- package/dist/dashboard-BP-iJqpd.mjs +0 -151
- package/dist/dashboard-BP-iJqpd.mjs.map +0 -1
- package/dist/default-DQ6vsviu.mjs +0 -81
- package/dist/default-DQ6vsviu.mjs.map +0 -1
- package/dist/deferred-tasks-BPxXUB4x.d.mts +0 -9
- package/dist/deferred-tasks-BPxXUB4x.d.mts.map +0 -1
- package/dist/dev-typegen-CZaPLl3V.mjs +0 -29
- package/dist/dev-typegen-CZaPLl3V.mjs.map +0 -1
- package/dist/device-flow-CRd6DXmW.mjs +0 -466
- package/dist/device-flow-CRd6DXmW.mjs.map +0 -1
- package/dist/digest-BarSh-pN.mjs +0 -194
- package/dist/digest-BarSh-pN.mjs.map +0 -1
- package/dist/direct-executor-D2lNadwo.mjs +0 -104
- package/dist/direct-executor-D2lNadwo.mjs.map +0 -1
- package/dist/dist-BNwANFJR.mjs +0 -810
- package/dist/dist-BNwANFJR.mjs.map +0 -1
- package/dist/email-console-bJn3ctqA.mjs +0 -50
- package/dist/email-console-bJn3ctqA.mjs.map +0 -1
- package/dist/email-locale-CN6WAMx0.mjs +0 -25
- package/dist/email-locale-CN6WAMx0.mjs.map +0 -1
- package/dist/emdash-runtime-CtfnZmPi.mjs +0 -4186
- package/dist/emdash-runtime-CtfnZmPi.mjs.map +0 -1
- package/dist/enrich-Dl3kZ-lP.mjs +0 -194
- package/dist/enrich-Dl3kZ-lP.mjs.map +0 -1
- package/dist/entry-lock-BJYdBfXb.mjs +0 -1097
- package/dist/entry-lock-BJYdBfXb.mjs.map +0 -1
- package/dist/entry-lock-Cf5OoIgN.d.mts +0 -4368
- package/dist/entry-lock-Cf5OoIgN.d.mts.map +0 -1
- package/dist/entry-lock-DHQOxN7R.mjs +0 -163
- package/dist/entry-lock-DHQOxN7R.mjs.map +0 -1
- package/dist/entry-locks-D0foLdjQ.mjs +0 -167
- package/dist/entry-locks-D0foLdjQ.mjs.map +0 -1
- package/dist/error-CfvOHP0M.mjs +0 -90
- package/dist/error-CfvOHP0M.mjs.map +0 -1
- package/dist/errors-BF0_LFhW.mjs +0 -460
- package/dist/errors-BF0_LFhW.mjs.map +0 -1
- package/dist/errors-DgE1zJGG.mjs +0 -120
- package/dist/errors-DgE1zJGG.mjs.map +0 -1
- package/dist/escape-CuaZhZvL.mjs +0 -9
- package/dist/escape-CuaZhZvL.mjs.map +0 -1
- package/dist/fence-CMDXJYc_.mjs +0 -162
- package/dist/fence-CMDXJYc_.mjs.map +0 -1
- package/dist/field-defs-cache-HIgBbqZZ.mjs +0 -77
- package/dist/field-defs-cache-HIgBbqZZ.mjs.map +0 -1
- package/dist/focal-point-Gr34o-4o.mjs +0 -23
- package/dist/focal-point-Gr34o-4o.mjs.map +0 -1
- package/dist/fts-manager-S-K0laoS.mjs +0 -443
- package/dist/fts-manager-S-K0laoS.mjs.map +0 -1
- package/dist/gc-DjKY0Ay1.mjs +0 -75
- package/dist/gc-DjKY0Ay1.mjs.map +0 -1
- package/dist/hash-SDAW6zC-.mjs +0 -37
- package/dist/hash-SDAW6zC-.mjs.map +0 -1
- package/dist/hook-result-B5bXDgS2.d.mts +0 -31
- package/dist/hook-result-B5bXDgS2.d.mts.map +0 -1
- package/dist/hreflang-CbVI4paR.mjs +0 -105
- package/dist/hreflang-CbVI4paR.mjs.map +0 -1
- package/dist/hreflang-D5uNnsGJ.d.mts +0 -50
- package/dist/hreflang-D5uNnsGJ.d.mts.map +0 -1
- package/dist/http-route-dispatch-BitqzwMy.mjs +0 -339
- package/dist/http-route-dispatch-BitqzwMy.mjs.map +0 -1
- package/dist/identity-Be5kzutJ.mjs +0 -35
- package/dist/identity-Be5kzutJ.mjs.map +0 -1
- package/dist/import-YzfKCaco.mjs +0 -2020
- package/dist/import-YzfKCaco.mjs.map +0 -1
- package/dist/index-D-hdtLe8.d.mts +0 -623
- package/dist/index-D-hdtLe8.d.mts.map +0 -1
- package/dist/install-finalization-DfM1fj5x.mjs +0 -58
- package/dist/install-finalization-DfM1fj5x.mjs.map +0 -1
- package/dist/keys-yxLm5l35.mjs +0 -61
- package/dist/keys-yxLm5l35.mjs.map +0 -1
- package/dist/kinds-CRu_T5T5.mjs +0 -961
- package/dist/kinds-CRu_T5T5.mjs.map +0 -1
- package/dist/lifecycle-BzeGPeQ-.mjs +0 -25
- package/dist/lifecycle-BzeGPeQ-.mjs.map +0 -1
- package/dist/load-XgJiE6_3.mjs +0 -28
- package/dist/load-XgJiE6_3.mjs.map +0 -1
- package/dist/loader-BzqeR1ZN.mjs +0 -1086
- package/dist/loader-BzqeR1ZN.mjs.map +0 -1
- package/dist/loops-BQSzv5Zn.mjs +0 -203
- package/dist/loops-BQSzv5Zn.mjs.map +0 -1
- package/dist/manifest-builder-BmSAOOEF.mjs +0 -189
- package/dist/manifest-builder-BmSAOOEF.mjs.map +0 -1
- package/dist/manifest-schema-CY3zng_M.mjs +0 -492
- package/dist/manifest-schema-CY3zng_M.mjs.map +0 -1
- package/dist/media-CPXTbb1R.mjs +0 -373
- package/dist/media-CPXTbb1R.mjs.map +0 -1
- package/dist/media-JXRWDhw3.mjs +0 -294
- package/dist/media-JXRWDhw3.mjs.map +0 -1
- package/dist/media-Pu1L6xir.mjs +0 -408
- package/dist/media-Pu1L6xir.mjs.map +0 -1
- package/dist/media-allowlist-BSoa9Vvm.mjs +0 -44
- package/dist/media-allowlist-BSoa9Vvm.mjs.map +0 -1
- package/dist/media-folders-BE0oo2eX.mjs +0 -210
- package/dist/media-folders-BE0oo2eX.mjs.map +0 -1
- package/dist/media-url-jArBpzIG.mjs +0 -43
- package/dist/media-url-jArBpzIG.mjs.map +0 -1
- package/dist/media-usage-De-zeR9E.mjs +0 -1629
- package/dist/media-usage-De-zeR9E.mjs.map +0 -1
- package/dist/media-usage-activation-HKp7zk7W.mjs +0 -78
- package/dist/media-usage-activation-HKp7zk7W.mjs.map +0 -1
- package/dist/media-usage-work-C2OZLCAd.mjs +0 -586
- package/dist/media-usage-work-C2OZLCAd.mjs.map +0 -1
- package/dist/media-usage-work-DwUNbgvS.mjs +0 -152
- package/dist/media-usage-work-DwUNbgvS.mjs.map +0 -1
- package/dist/menus-BM7BPLOb.mjs +0 -139
- package/dist/menus-BM7BPLOb.mjs.map +0 -1
- package/dist/menus-Cm68rsAq.mjs +0 -3608
- package/dist/menus-Cm68rsAq.mjs.map +0 -1
- package/dist/menus-ITeAbcIF.mjs +0 -753
- package/dist/menus-ITeAbcIF.mjs.map +0 -1
- package/dist/mime-ChLqYwDk.mjs +0 -36
- package/dist/mime-ChLqYwDk.mjs.map +0 -1
- package/dist/mode-CCuKXUci.mjs +0 -23
- package/dist/mode-CCuKXUci.mjs.map +0 -1
- package/dist/node-sqlite-compat-CONMsl-x.mjs +0 -46
- package/dist/node-sqlite-compat-CONMsl-x.mjs.map +0 -1
- package/dist/normalize-CO2P8-iE.mjs +0 -191
- package/dist/normalize-CO2P8-iE.mjs.map +0 -1
- package/dist/oauth-authorization-DlMIL5_h.mjs +0 -274
- package/dist/oauth-authorization-DlMIL5_h.mjs.map +0 -1
- package/dist/oauth-clients-Djq9r_KP.mjs +0 -266
- package/dist/oauth-clients-Djq9r_KP.mjs.map +0 -1
- package/dist/oauth-state-store-BbjnZXNC.mjs +0 -50
- package/dist/oauth-state-store-BbjnZXNC.mjs.map +0 -1
- package/dist/oauth-user-lookup-vue9a64A.mjs +0 -26
- package/dist/oauth-user-lookup-vue9a64A.mjs.map +0 -1
- package/dist/object-cache-CqWNY5uP.mjs +0 -582
- package/dist/object-cache-CqWNY5uP.mjs.map +0 -1
- package/dist/options-SQCHQCPH.d.mts +0 -81
- package/dist/options-SQCHQCPH.d.mts.map +0 -1
- package/dist/parse-CVgO-Qai.d.mts +0 -168
- package/dist/parse-CVgO-Qai.d.mts.map +0 -1
- package/dist/parse-DY6OD1j_.mjs +0 -81
- package/dist/parse-DY6OD1j_.mjs.map +0 -1
- package/dist/passkey-config-X_H8128a.mjs +0 -46
- package/dist/passkey-config-X_H8128a.mjs.map +0 -1
- package/dist/paths-JxokKIbr.mjs +0 -77
- package/dist/paths-JxokKIbr.mjs.map +0 -1
- package/dist/patterns-BhAvqO0S.mjs +0 -145
- package/dist/patterns-BhAvqO0S.mjs.map +0 -1
- package/dist/placeholder-MSEd8gty.d.mts +0 -306
- package/dist/placeholder-MSEd8gty.d.mts.map +0 -1
- package/dist/plan-xjcWrAah.mjs +0 -135
- package/dist/plan-xjcWrAah.mjs.map +0 -1
- package/dist/plugins-DUXUt8B9.mjs +0 -277
- package/dist/plugins-DUXUt8B9.mjs.map +0 -1
- package/dist/policy-CUvwAARc.mjs +0 -45
- package/dist/policy-CUvwAARc.mjs.map +0 -1
- package/dist/portable-text-5O_ZGUjB.mjs +0 -307
- package/dist/portable-text-5O_ZGUjB.mjs.map +0 -1
- package/dist/preview-CIUcPYr6.mjs +0 -107
- package/dist/preview-CIUcPYr6.mjs.map +0 -1
- package/dist/protocol-B97DZaFr.d.mts +0 -61
- package/dist/protocol-B97DZaFr.d.mts.map +0 -1
- package/dist/public-submission-BFBUrqst.mjs +0 -250
- package/dist/public-submission-BFBUrqst.mjs.map +0 -1
- package/dist/public-url-Bn7U0D7-.mjs +0 -101
- package/dist/public-url-Bn7U0D7-.mjs.map +0 -1
- package/dist/query-B48peoRT.mjs +0 -890
- package/dist/query-B48peoRT.mjs.map +0 -1
- package/dist/query-C4IH0uhR.mjs +0 -41
- package/dist/query-C4IH0uhR.mjs.map +0 -1
- package/dist/rate-limit-BZ6nybgc.mjs +0 -120
- package/dist/rate-limit-BZ6nybgc.mjs.map +0 -1
- package/dist/receipt-B4wJj5Jq.mjs +0 -43
- package/dist/receipt-B4wJj5Jq.mjs.map +0 -1
- package/dist/redirect-B29UjdUn.mjs +0 -411
- package/dist/redirect-B29UjdUn.mjs.map +0 -1
- package/dist/redirect-Cd1E7VUt.mjs +0 -17
- package/dist/redirect-Cd1E7VUt.mjs.map +0 -1
- package/dist/redirects-Ca2MPfEG.mjs +0 -446
- package/dist/redirects-Ca2MPfEG.mjs.map +0 -1
- package/dist/redirects-Cv9apQKj.mjs +0 -148
- package/dist/redirects-Cv9apQKj.mjs.map +0 -1
- package/dist/relation-M4NUCb0b.mjs +0 -334
- package/dist/relation-M4NUCb0b.mjs.map +0 -1
- package/dist/relations-CCif47Oq.mjs +0 -403
- package/dist/relations-CCif47Oq.mjs.map +0 -1
- package/dist/relations-CK9CYUyr.mjs +0 -310
- package/dist/relations-CK9CYUyr.mjs.map +0 -1
- package/dist/request-cache-DzLYKm_x.mjs +0 -104
- package/dist/request-cache-DzLYKm_x.mjs.map +0 -1
- package/dist/request-meta-sZXt3sRo.mjs +0 -141
- package/dist/request-meta-sZXt3sRo.mjs.map +0 -1
- package/dist/resolve-2WbQsCvT.mjs +0 -199
- package/dist/resolve-2WbQsCvT.mjs.map +0 -1
- package/dist/route-wire--1hLuACz.mjs +0 -197
- package/dist/route-wire--1hLuACz.mjs.map +0 -1
- package/dist/routes-vrR95WR6.mjs +0 -272
- package/dist/routes-vrR95WR6.mjs.map +0 -1
- package/dist/runner-1y4J9fJB.mjs +0 -5742
- package/dist/runner-1y4J9fJB.mjs.map +0 -1
- package/dist/runner-D5_LzKXI.d.mts +0 -68
- package/dist/runner-D5_LzKXI.d.mts.map +0 -1
- package/dist/schema-BABiRdsH.mjs +0 -13
- package/dist/schema-BABiRdsH.mjs.map +0 -1
- package/dist/schema-Du3MzCG0.mjs +0 -446
- package/dist/schema-Du3MzCG0.mjs.map +0 -1
- package/dist/scopes-Dbk-ElhT.mjs +0 -34
- package/dist/scopes-Dbk-ElhT.mjs.map +0 -1
- package/dist/search-Bt1PL1jf.mjs +0 -448
- package/dist/search-Bt1PL1jf.mjs.map +0 -1
- package/dist/sections-Ddptx_o9.mjs +0 -346
- package/dist/sections-Ddptx_o9.mjs.map +0 -1
- package/dist/seo-CZT2oLtT.mjs +0 -114
- package/dist/seo-CZT2oLtT.mjs.map +0 -1
- package/dist/seo-D5w3-Azy.mjs +0 -133
- package/dist/seo-D5w3-Azy.mjs.map +0 -1
- package/dist/service-DuykXPyW.mjs +0 -150
- package/dist/service-DuykXPyW.mjs.map +0 -1
- package/dist/session-user-BhaVp8w0.mjs +0 -51
- package/dist/session-user-BhaVp8w0.mjs.map +0 -1
- package/dist/settings-B4vDl1fK.mjs +0 -439
- package/dist/settings-B4vDl1fK.mjs.map +0 -1
- package/dist/settings-DYidIB26.mjs +0 -61
- package/dist/settings-DYidIB26.mjs.map +0 -1
- package/dist/settings-Dyj6v8C4.mjs +0 -51
- package/dist/settings-Dyj6v8C4.mjs.map +0 -1
- package/dist/setup-complete-bOogcHWG.mjs +0 -26
- package/dist/setup-complete-bOogcHWG.mjs.map +0 -1
- package/dist/setup-nonce-0EGuKM4s.mjs +0 -25
- package/dist/setup-nonce-0EGuKM4s.mjs.map +0 -1
- package/dist/site-settings-DOgRUoFX.mjs +0 -50
- package/dist/site-settings-DOgRUoFX.mjs.map +0 -1
- package/dist/site-url-BU_bbxwj.mjs +0 -16
- package/dist/site-url-BU_bbxwj.mjs.map +0 -1
- package/dist/snapshot-PawoX-WG.mjs +0 -414
- package/dist/snapshot-PawoX-WG.mjs.map +0 -1
- package/dist/ssrf-CJUnJymJ.mjs +0 -406
- package/dist/ssrf-CJUnJymJ.mjs.map +0 -1
- package/dist/stage-DgrBz_du.mjs +0 -662
- package/dist/stage-DgrBz_du.mjs.map +0 -1
- package/dist/state-DDiPySSG.mjs +0 -153
- package/dist/state-DDiPySSG.mjs.map +0 -1
- package/dist/status-DZKIG4a9.mjs +0 -30
- package/dist/status-DZKIG4a9.mjs.map +0 -1
- package/dist/storage-query-FXJH5pI8.d.mts +0 -1581
- package/dist/storage-query-FXJH5pI8.d.mts.map +0 -1
- package/dist/tar-_1AgTYFu.mjs +0 -449
- package/dist/tar-_1AgTYFu.mjs.map +0 -1
- package/dist/target-_7pn2Gbg.mjs +0 -27
- package/dist/target-_7pn2Gbg.mjs.map +0 -1
- package/dist/taxonomies-C1IwNe8Q.mjs +0 -697
- package/dist/taxonomies-C1IwNe8Q.mjs.map +0 -1
- package/dist/taxonomies-C_XMoRcX.mjs +0 -939
- package/dist/taxonomies-C_XMoRcX.mjs.map +0 -1
- package/dist/taxonomy-C3Fu1YeH.mjs +0 -525
- package/dist/taxonomy-C3Fu1YeH.mjs.map +0 -1
- package/dist/tokens-u78jETkX.mjs +0 -171
- package/dist/tokens-u78jETkX.mjs.map +0 -1
- package/dist/transaction-BcJO4Tmc.mjs +0 -29
- package/dist/transaction-BcJO4Tmc.mjs.map +0 -1
- package/dist/transfer-DIGvR9Af.mjs +0 -166
- package/dist/transfer-DIGvR9Af.mjs.map +0 -1
- package/dist/transfer-DgeCvHnj.mjs +0 -8675
- package/dist/transfer-DgeCvHnj.mjs.map +0 -1
- package/dist/transfer-download-Pml7RMio.mjs +0 -33
- package/dist/transfer-download-Pml7RMio.mjs.map +0 -1
- package/dist/transformations-9gfpwY65.mjs +0 -196
- package/dist/transformations-9gfpwY65.mjs.map +0 -1
- package/dist/transport-BIfH7_hx.d.mts +0 -42
- package/dist/transport-BIfH7_hx.d.mts.map +0 -1
- package/dist/transport-DKWIq53q.mjs +0 -136
- package/dist/transport-DKWIq53q.mjs.map +0 -1
- package/dist/trusted-proxy-tKiVtyTD.mjs +0 -51
- package/dist/trusted-proxy-tKiVtyTD.mjs.map +0 -1
- package/dist/turnstile-DpsoyOfg.mjs +0 -53
- package/dist/turnstile-DpsoyOfg.mjs.map +0 -1
- package/dist/types-B4sUC2p1.d.mts +0 -198
- package/dist/types-B4sUC2p1.d.mts.map +0 -1
- package/dist/types-B7Lmsh1E.d.mts +0 -887
- package/dist/types-B7Lmsh1E.d.mts.map +0 -1
- package/dist/types-BZakh7Ym.mjs +0 -22
- package/dist/types-BZakh7Ym.mjs.map +0 -1
- package/dist/types-B_CppEmv.d.mts +0 -264
- package/dist/types-B_CppEmv.d.mts.map +0 -1
- package/dist/types-BcrBrE6-.mjs +0 -159
- package/dist/types-BcrBrE6-.mjs.map +0 -1
- package/dist/types-BkUg2yHx.mjs +0 -92
- package/dist/types-BkUg2yHx.mjs.map +0 -1
- package/dist/types-CAZgq9fO.d.mts +0 -124
- package/dist/types-CAZgq9fO.d.mts.map +0 -1
- package/dist/types-Cd-O03VG.d.mts +0 -363
- package/dist/types-Cd-O03VG.d.mts.map +0 -1
- package/dist/types-Cr-Kg-3D.d.mts +0 -1641
- package/dist/types-Cr-Kg-3D.d.mts.map +0 -1
- package/dist/types-D2fvWd1i.d.mts +0 -359
- package/dist/types-D2fvWd1i.d.mts.map +0 -1
- package/dist/types-D7HUsguf.mjs +0 -77
- package/dist/types-D7HUsguf.mjs.map +0 -1
- package/dist/types-DA1Te3Oy.d.mts +0 -198
- package/dist/types-DA1Te3Oy.d.mts.map +0 -1
- package/dist/types-DhV6Q5bP.mjs +0 -18
- package/dist/types-DhV6Q5bP.mjs.map +0 -1
- package/dist/types-DnnVSl6Y.d.mts +0 -85
- package/dist/types-DnnVSl6Y.d.mts.map +0 -1
- package/dist/types-VT4-BugW.mjs +0 -16
- package/dist/types-VT4-BugW.mjs.map +0 -1
- package/dist/upload-attempts-B68ZGNu9.mjs +0 -32
- package/dist/upload-attempts-B68ZGNu9.mjs.map +0 -1
- package/dist/url-pattern-CCeZMGOh.mjs +0 -33
- package/dist/url-pattern-CCeZMGOh.mjs.map +0 -1
- package/dist/user-DDSL-sGw.mjs +0 -171
- package/dist/user-DDSL-sGw.mjs.map +0 -1
- package/dist/utils-DdhmO9w9.mjs +0 -439
- package/dist/utils-DdhmO9w9.mjs.map +0 -1
- package/dist/validate-CHosPEhs.mjs +0 -453
- package/dist/validate-CHosPEhs.mjs.map +0 -1
- package/dist/validate-CM79QXYE.d.mts +0 -432
- package/dist/validate-CM79QXYE.d.mts.map +0 -1
- package/dist/validation-BFecQczG.mjs +0 -218
- package/dist/validation-BFecQczG.mjs.map +0 -1
- package/dist/version-BRZXVifl.mjs +0 -9
- package/dist/version-BRZXVifl.mjs.map +0 -1
- package/dist/version-DXsxRrob.mjs +0 -7
- package/dist/version-DXsxRrob.mjs.map +0 -1
- package/dist/widgets-WdV72brA.mjs +0 -126
- package/dist/widgets-WdV72brA.mjs.map +0 -1
- package/dist/wxr-taxonomies-BHTdqkmZ.d.mts +0 -34
- package/dist/wxr-taxonomies-BHTdqkmZ.d.mts.map +0 -1
- package/dist/wxr-taxonomies-DP6ESgMN.mjs +0 -372
- package/dist/wxr-taxonomies-DP6ESgMN.mjs.map +0 -1
- package/dist/zod-generator-D6uE4WiS.mjs +0 -389
- package/dist/zod-generator-D6uE4WiS.mjs.map +0 -1
- package/src/astro/routes/api/relations/[id]/translations.ts +0 -33
- package/src/cli/commands/bundle-utils.ts +0 -408
- package/src/cli/commands/bundle.ts +0 -659
- package/src/cli/commands/plugin-init.ts +0 -417
- package/src/cli/commands/plugin-validate.ts +0 -31
- package/src/cli/commands/plugin.ts +0 -33
- package/src/cli/commands/publish.ts +0 -721
- /package/dist/{api-tokens-CE1ECIg0.mjs → api-tokens-BLz2MtQs.mjs} +0 -0
- /package/dist/{ssrf-DpBH7aOt.mjs → ssrf-tA45vIPX.mjs} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media-usage-De-zeR9E.mjs","names":["retryDelaySeconds"],"sources":["../src/media/usage/reconciliation.ts","../src/media/usage/reconciliation-processor.ts","../src/media/usage/work-processor.ts","../src/media/usage/maintenance-engine.ts","../src/api/handlers/media-usage.ts"],"sourcesContent":["import { sql, type Kysely, type RawBuilder, type Selectable } from \"kysely\";\nimport { ulid } from \"ulidx\";\n\nimport { isPostgres } from \"../../database/dialect-helpers.js\";\nimport { jsonTextValues } from \"../../database/json-recordset.js\";\nimport type { Database, MediaUsageReconciliationTable } from \"../../database/types.js\";\nimport { validateIdentifier } from \"../../database/validate.js\";\n\nconst ACTIVATION_KEY = \"incremental_capture\";\nconst CONTENT_ADAPTER_ID = \"content-media\";\nconst COLLECTION_SCOPE = \"collection\";\nconst MAX_CANDIDATES = 100;\nconst MAX_PORTABLE_DURATION_SECONDS = 365 * 24 * 60 * 60;\nconst STABLE_ERROR_CODE_PATTERN = /^[A-Z][A-Z0-9_]{0,63}$/;\n\nexport type MediaUsageReconciliationState = \"pending\" | \"retry\" | \"leased\" | \"failed\";\nexport type MediaUsageReconciliationPhase = \"scan\" | \"sources\";\n\nexport interface MediaUsageReconciliationRecord {\n\tcollectionId: string;\n\tcollectionSlug: string;\n\trunToken: string;\n\ttargetEpoch: number | string | null;\n\tfieldFingerprint: string | null;\n\tstate: MediaUsageReconciliationState;\n\tphase: MediaUsageReconciliationPhase;\n\tscanCursor: string | null;\n\tscanUpperId: string | null;\n\tsourceCursor: string | null;\n\tsourceUpperKey: string | null;\n\tattemptCount: number;\n\tnextAttemptAt: string;\n\tleaseToken: string | null;\n\tleaseExpiresAt: string | null;\n\tlastErrorCode: string | null;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface MediaUsageReconciliationClaim extends MediaUsageReconciliationRecord {\n\tleaseToken: string;\n}\n\nexport interface MediaUsageReconciliationSourceCandidate {\n\tsourceKey: string;\n\tcontentId: string | null;\n\tsourceVariant: string;\n}\n\nexport type MediaUsageReconciliationWorkBarrier =\n\t| { state: \"empty\" }\n\t| { state: \"pending\" }\n\t| { state: \"failed\"; errorCode: string };\n\nexport class MediaUsageReconciliationRepository {\n\tconstructor(private db: Kysely<Database>) {}\n\n\tasync findByIdentity(\n\t\tcollectionId: string,\n\t\trunToken: string,\n\t): Promise<MediaUsageReconciliationRecord | null> {\n\t\tassertIdentity({ collectionId, runToken });\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_reconciliations\")\n\t\t\t.selectAll()\n\t\t\t.where(\"collection_id\", \"=\", collectionId)\n\t\t\t.where(\"run_token\", \"=\", runToken)\n\t\t\t.executeTakeFirst();\n\t\treturn row ? rowToRecord(row) : null;\n\t}\n\n\tasync beginRun(claim: MediaUsageReconciliationClaim): Promise<number | string | null> {\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst sameRun = sql<boolean>`status = 'running' AND cursor = ${claim.runToken}`;\n\t\tconst row = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status as status\")\n\t\t\t.set({\n\t\t\t\tstatus: \"running\",\n\t\t\t\tstarted_at: sql<string | null>`CASE WHEN ${sameRun} THEN started_at ELSE ${now} END`,\n\t\t\t\tcompleted_at: null,\n\t\t\t\tcursor: claim.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\tchange_epoch: sql<number>`CASE WHEN ${sameRun} THEN change_epoch ELSE change_epoch + 1 END`,\n\t\t\t\treconciliation_required: 1,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t.where(\"status.collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(\"status.scope_key\", \"=\", claim.collectionSlug)\n\t\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t\t.where(\"status.reconciliation_required\", \"=\", 1)\n\t\t\t.where((eb) =>\n\t\t\t\teb.or([eb(\"status.status\", \"!=\", \"running\"), eb(\"status.cursor\", \"=\", claim.runToken)]),\n\t\t\t)\n\t\t\t.where(this.liveClaimExists(claim))\n\t\t\t.returning(\"change_epoch\")\n\t\t\t.executeTakeFirst();\n\t\treturn row?.change_epoch ?? null;\n\t}\n\n\tasync findScanUpperId(claim: MediaUsageReconciliationClaim): Promise<string | null> {\n\t\tconst tableName = contentTableName(claim.collectionSlug);\n\t\tconst result = await sql<{ id: string }>`\n\t\t\tSELECT content.id\n\t\t\tFROM ${sql.ref(tableName)} AS content\n\t\t\tWHERE ${this.liveClaimExistsSql(claim)}\n\t\t\tORDER BY content.id DESC\n\t\t\tLIMIT 1\n\t\t`.execute(this.db);\n\t\treturn result.rows[0]?.id ?? null;\n\t}\n\n\tasync initializeScan(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\ttargetEpoch: number | string;\n\t\tfieldFingerprint: string;\n\t\tscanUpperId: string | null;\n\t}): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\ttarget_epoch: input.targetEpoch,\n\t\t\t\tfield_fingerprint: input.fieldFingerprint,\n\t\t\t\tphase: \"scan\",\n\t\t\t\tscan_cursor: null,\n\t\t\t\tscan_upper_id: input.scanUpperId,\n\t\t\t\tsource_cursor: null,\n\t\t\t\tsource_upper_key: null,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t.where(\"reconciliation.target_epoch\", \"is\", null)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.where(this.statusOwnsRun(input.claim, input.targetEpoch))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync findScanPage(\n\t\treconciliation: MediaUsageReconciliationRecord,\n\t\tlimit: number,\n\t): Promise<string[]> {\n\t\tif (!Number.isSafeInteger(limit) || limit < 1 || limit > 1_000) {\n\t\t\tthrow new Error(\"Reconciliation scan page limit must be from 1 to 1000\");\n\t\t}\n\t\tif (!reconciliation.leaseToken || reconciliation.targetEpoch === null) return [];\n\t\tconst tableName = contentTableName(reconciliation.collectionSlug);\n\t\tconst lowerBound = reconciliation.scanCursor\n\t\t\t? sql`AND content.id > ${reconciliation.scanCursor}`\n\t\t\t: sql``;\n\t\tconst upperBound = reconciliation.scanUpperId\n\t\t\t? sql`AND content.id <= ${reconciliation.scanUpperId}`\n\t\t\t: sql`AND 1 = 0`;\n\t\tconst result = await sql<{ id: string }>`\n\t\t\tSELECT content.id\n\t\t\tFROM ${sql.ref(tableName)} AS content\n\t\t\tWHERE 1 = 1\n\t\t\t\t${lowerBound}\n\t\t\t\t${upperBound}\n\t\t\t\tAND ${this.liveClaimExistsSql(reconciliation)}\n\t\t\tORDER BY content.id ASC\n\t\t\tLIMIT ${limit}\n\t\t`.execute(this.db);\n\t\treturn result.rows.map((row) => row.id);\n\t}\n\n\tasync checkpointScan(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\ttargetEpoch: number | string;\n\t\tpreviousCursor: string | null;\n\t\tnextCursor: string;\n\t}): Promise<boolean> {\n\t\tlet query = this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tscan_cursor: input.nextCursor,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t.where(\"reconciliation.target_epoch\", \"=\", input.targetEpoch)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.phase\", \"=\", \"scan\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.where(this.statusOwnsRun(input.claim, input.targetEpoch));\n\t\tquery = input.previousCursor\n\t\t\t? query.where(\"reconciliation.scan_cursor\", \"=\", input.previousCursor)\n\t\t\t: query.where(\"reconciliation.scan_cursor\", \"is\", null);\n\t\tconst result = await query.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync ownsRun(\n\t\tclaim: MediaUsageReconciliationClaim,\n\t\ttargetEpoch: number | string,\n\t): Promise<boolean> {\n\t\tconst result = await sql<{ owned: boolean | number }>`\n\t\t\tSELECT ${this.statusOwnsRun(claim, targetEpoch)} AS owned\n\t\t`.execute(this.db);\n\t\treturn Boolean(result.rows[0]?.owned);\n\t}\n\n\tasync restartRun(\n\t\tclaim: MediaUsageReconciliationClaim,\n\t\tpreviousEpoch: number | string,\n\t): Promise<number | string | null> {\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst interruptedRestart = sql<boolean>`status = 'running'\n\t\t\tAND cursor = ${claim.runToken}\n\t\t\tAND change_epoch > ${previousEpoch}`;\n\t\tconst row = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status as status\")\n\t\t\t.set({\n\t\t\t\tstatus: \"running\",\n\t\t\t\tstarted_at: sql<\n\t\t\t\t\tstring | null\n\t\t\t\t>`CASE WHEN ${interruptedRestart} THEN started_at ELSE ${now} END`,\n\t\t\t\tcompleted_at: null,\n\t\t\t\tcursor: claim.runToken,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tchange_epoch: sql<number>`CASE WHEN ${interruptedRestart} THEN change_epoch ELSE change_epoch + 1 END`,\n\t\t\t\treconciliation_required: 1,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t.where(\"status.collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(\"status.scope_key\", \"=\", claim.collectionSlug)\n\t\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t\t.where(\"status.reconciliation_required\", \"=\", 1)\n\t\t\t.where((eb) =>\n\t\t\t\teb.or([eb(\"status.status\", \"!=\", \"running\"), eb(\"status.cursor\", \"=\", claim.runToken)]),\n\t\t\t)\n\t\t\t.where(this.liveClaimExists(claim))\n\t\t\t.returning(\"change_epoch\")\n\t\t\t.executeTakeFirst();\n\t\treturn row?.change_epoch ?? null;\n\t}\n\n\tasync restartScan(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\tpreviousEpoch: number | string;\n\t\ttargetEpoch: number | string;\n\t\tfieldFingerprint: string;\n\t\tscanUpperId: string | null;\n\t}): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\ttarget_epoch: input.targetEpoch,\n\t\t\t\tfield_fingerprint: input.fieldFingerprint,\n\t\t\t\tphase: \"scan\",\n\t\t\t\tscan_cursor: null,\n\t\t\t\tscan_upper_id: input.scanUpperId,\n\t\t\t\tsource_cursor: null,\n\t\t\t\tsource_upper_key: null,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tnext_attempt_at: timestampOffset(this.db, 0),\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t.where(\"reconciliation.target_epoch\", \"=\", input.previousEpoch)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.where(this.statusOwnsRun(input.claim, input.targetEpoch))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync findWorkBarrier(collectionId: string): Promise<MediaUsageReconciliationWorkBarrier> {\n\t\tif (!collectionId) throw new Error(\"Reconciliation work barrier requires a collection ID\");\n\t\tconst failed = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_work\")\n\t\t\t.select(\"last_error_code\")\n\t\t\t.where(\"collection_id\", \"=\", collectionId)\n\t\t\t.where(\"state\", \"=\", \"failed\")\n\t\t\t.orderBy(\"content_id\")\n\t\t\t.limit(1)\n\t\t\t.executeTakeFirst();\n\t\tif (failed) {\n\t\t\treturn {\n\t\t\t\tstate: \"failed\",\n\t\t\t\terrorCode: failed.last_error_code ?? \"MEDIA_USAGE_PROCESSING_FAILED\",\n\t\t\t};\n\t\t}\n\t\tconst pending = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_work\")\n\t\t\t.select(\"content_id\")\n\t\t\t.where(\"collection_id\", \"=\", collectionId)\n\t\t\t.limit(1)\n\t\t\t.executeTakeFirst();\n\t\treturn pending ? { state: \"pending\" } : { state: \"empty\" };\n\t}\n\n\tasync findSourceUpperKey(\n\t\tclaim: MediaUsageReconciliationClaim,\n\t\ttargetEpoch: number | string,\n\t): Promise<string | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources as source\")\n\t\t\t.select(\"source.source_key\")\n\t\t\t.where(\"source.source_type\", \"=\", \"content\")\n\t\t\t.where(\"source.collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(\"source.identity_version\", \"=\", 1)\n\t\t\t.where(this.liveClaimExists(claim))\n\t\t\t.where(this.statusOwnsRun(claim, targetEpoch))\n\t\t\t.orderBy(\"source.source_key\", \"desc\")\n\t\t\t.limit(1)\n\t\t\t.executeTakeFirst();\n\t\treturn row?.source_key ?? null;\n\t}\n\n\tasync transitionToSources(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\ttargetEpoch: number | string;\n\t\tfieldFingerprint: string;\n\t\tsourceUpperKey: string | null;\n\t}): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tphase: \"sources\",\n\t\t\t\tsource_cursor: null,\n\t\t\t\tsource_upper_key: input.sourceUpperKey,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t.where(\"reconciliation.target_epoch\", \"=\", input.targetEpoch)\n\t\t\t.where(\"reconciliation.field_fingerprint\", \"=\", input.fieldFingerprint)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.phase\", \"=\", \"scan\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.where(this.statusOwnsRun(input.claim, input.targetEpoch))\n\t\t\t.where((eb) =>\n\t\t\t\teb.not(\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_work as work\")\n\t\t\t\t\t\t\t.select(\"work.content_id\")\n\t\t\t\t\t\t\t.where(\"work.collection_id\", \"=\", input.claim.collectionId),\n\t\t\t\t\t),\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 findSourcePage(\n\t\treconciliation: MediaUsageReconciliationRecord,\n\t\tlimit: number,\n\t): Promise<MediaUsageReconciliationSourceCandidate[]> {\n\t\tif (!Number.isSafeInteger(limit) || limit < 1 || limit > 1_000) {\n\t\t\tthrow new Error(\"Reconciliation source page limit must be from 1 to 1000\");\n\t\t}\n\t\tif (!reconciliation.leaseToken || reconciliation.targetEpoch === null) return [];\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources as source\")\n\t\t\t.select([\"source.source_key\", \"source.content_id\", \"source.source_variant\"])\n\t\t\t.where(\"source.source_type\", \"=\", \"content\")\n\t\t\t.where(\"source.collection_id\", \"=\", reconciliation.collectionId)\n\t\t\t.where(\"source.identity_version\", \"=\", 1)\n\t\t\t.where(this.liveClaimExists(reconciliation))\n\t\t\t.where(this.statusOwnsRun(reconciliation, reconciliation.targetEpoch));\n\t\tif (reconciliation.sourceCursor) {\n\t\t\tquery = query.where(\"source.source_key\", \">\", reconciliation.sourceCursor);\n\t\t}\n\t\tif (reconciliation.sourceUpperKey) {\n\t\t\tquery = query.where(\"source.source_key\", \"<=\", reconciliation.sourceUpperKey);\n\t\t} else {\n\t\t\tquery = query.where(sql<boolean>`1 = 0`);\n\t\t}\n\t\tconst rows = await query.orderBy(\"source.source_key\").limit(limit).execute();\n\t\treturn rows.map((row) => ({\n\t\t\tsourceKey: row.source_key,\n\t\t\tcontentId: row.content_id,\n\t\t\tsourceVariant: row.source_variant,\n\t\t}));\n\t}\n\n\tasync findMissingContentIds(\n\t\tcollectionSlug: string,\n\t\tcontentIds: readonly string[],\n\t): Promise<string[]> {\n\t\tconst unique = [...new Set(contentIds)];\n\t\tif (unique.length === 0) return [];\n\t\tif (unique.length > 1_000 || unique.some((contentId) => !contentId)) {\n\t\t\tthrow new Error(\"Reconciliation source page has invalid content identity\");\n\t\t}\n\t\tconst tableName = contentTableName(collectionSlug);\n\t\tconst requested = jsonTextValues(this.db, unique);\n\t\tconst existing = await sql<{ id: string }>`\n\t\t\tWITH requested AS (${requested})\n\t\t\tSELECT content.id\n\t\t\tFROM ${sql.ref(tableName)} AS content\n\t\t\tINNER JOIN requested ON requested.value = content.id\n\t\t`.execute(this.db);\n\t\tconst present = new Set(existing.rows.map((row) => row.id));\n\t\treturn unique.filter((contentId) => !present.has(contentId));\n\t}\n\n\tasync checkpointSources(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\ttargetEpoch: number | string;\n\t\tpreviousCursor: string | null;\n\t\tnextCursor: string;\n\t}): Promise<boolean> {\n\t\tlet query = this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tsource_cursor: input.nextCursor,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t.where(\"reconciliation.target_epoch\", \"=\", input.targetEpoch)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.phase\", \"=\", \"sources\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.where(this.statusOwnsRun(input.claim, input.targetEpoch));\n\t\tquery = input.previousCursor\n\t\t\t? query.where(\"reconciliation.source_cursor\", \"=\", input.previousCursor)\n\t\t\t: query.where(\"reconciliation.source_cursor\", \"is\", null);\n\t\tconst result = await query.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync finishFailedCoverage(collectionId: string, runToken: string): Promise<boolean> {\n\t\tassertIdentity({ collectionId, runToken });\n\t\tconst now = timestampOffset(this.db, 0);\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\tstatus: sql<string>`CASE WHEN EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_sources AS source\n\t\t\t\t\tWHERE source.source_type = 'content'\n\t\t\t\t\t\tAND source.collection_id = ${collectionId}\n\t\t\t\t\t\tAND source.identity_version = 1\n\t\t\t\t\tLIMIT 1\n\t\t\t\t) THEN 'partial' ELSE 'failed' END`,\n\t\t\t\tcompleted_at: null,\n\t\t\t\tcursor: null,\n\t\t\t\tlast_error_code: sql<string>`CASE WHEN (\n\t\t\t\t\tSELECT reconciliation.last_error_code\n\t\t\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\t\t\tWHERE reconciliation.collection_id = ${collectionId}\n\t\t\t\t\t\tAND reconciliation.run_token = ${runToken}\n\t\t\t\t) = 'MEDIA_USAGE_RECONCILIATION_ENTRY_FAILED'\n\t\t\t\tTHEN COALESCE(\n\t\t\t\t\t(SELECT work.last_error_code\n\t\t\t\t\t FROM _emdash_media_usage_work AS work\n\t\t\t\t\t WHERE work.collection_id = ${collectionId} AND work.state = 'failed'\n\t\t\t\t\t ORDER BY work.content_id LIMIT 1),\n\t\t\t\t\t'MEDIA_USAGE_RECONCILIATION_ENTRY_FAILED'\n\t\t\t\t)\n\t\t\t\tELSE (\n\t\t\t\t\tSELECT reconciliation.last_error_code\n\t\t\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\t\t\tWHERE reconciliation.collection_id = ${collectionId}\n\t\t\t\t\t\tAND reconciliation.run_token = ${runToken}\n\t\t\t\t) END`,\n\t\t\t\treconciliation_required: 1,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t.where(\"status.collection_id\", \"=\", collectionId)\n\t\t\t.where(\"status.status\", \"=\", \"running\")\n\t\t\t.where(\"status.cursor\", \"=\", runToken)\n\t\t\t.where(sql<boolean>`status.change_epoch = (\n\t\t\t\tSELECT reconciliation.target_epoch\n\t\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\t\tWHERE reconciliation.collection_id = ${collectionId}\n\t\t\t\t\tAND reconciliation.run_token = ${runToken}\n\t\t\t)`)\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_reconciliations as reconciliation\")\n\t\t\t\t\t\t.select(\"reconciliation.collection_id\")\n\t\t\t\t\t\t.where(\"reconciliation.collection_id\", \"=\", collectionId)\n\t\t\t\t\t\t.where(\"reconciliation.run_token\", \"=\", runToken)\n\t\t\t\t\t\t.where(\"reconciliation.state\", \"=\", \"failed\"),\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 finalizeCoverage(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\ttargetEpoch: number | string;\n\t\tfieldFingerprint: string;\n\t\tschemaVersion: number;\n\t}): Promise<boolean> {\n\t\tconst now = timestampOffset(this.db, 0);\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\tstatus: \"complete\",\n\t\t\t\tschema_version: input.schemaVersion,\n\t\t\t\tcompleted_at: now,\n\t\t\t\tcursor: null,\n\t\t\t\tlast_error_code: null,\n\t\t\t\treconciliation_required: 0,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t.where(\"status.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"status.scope_key\", \"=\", input.claim.collectionSlug)\n\t\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t\t.where(\"status.reconciliation_required\", \"=\", 1)\n\t\t\t.where(\"status.status\", \"=\", \"running\")\n\t\t\t.where(\"status.cursor\", \"=\", input.claim.runToken)\n\t\t\t.where(\"status.change_epoch\", \"=\", input.targetEpoch)\n\t\t\t.where((eb) =>\n\t\t\t\teb.not(\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_work as work\")\n\t\t\t\t\t\t\t.select(\"work.content_id\")\n\t\t\t\t\t\t\t.where(\"work.collection_id\", \"=\", input.claim.collectionId),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\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_reconciliations as reconciliation\")\n\t\t\t\t\t\t.innerJoin(\"_emdash_collections as collection\", (join) =>\n\t\t\t\t\t\t\tjoin\n\t\t\t\t\t\t\t\t.onRef(\"collection.id\", \"=\", \"reconciliation.collection_id\")\n\t\t\t\t\t\t\t\t.onRef(\"collection.slug\", \"=\", \"reconciliation.collection_slug\"),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.select(\"reconciliation.collection_id\")\n\t\t\t\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t\t\t\t.where(\"reconciliation.target_epoch\", \"=\", input.targetEpoch)\n\t\t\t\t\t\t.where(\"reconciliation.field_fingerprint\", \"=\", input.fieldFingerprint)\n\t\t\t\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t\t\t\t.where(\"reconciliation.phase\", \"=\", \"sources\")\n\t\t\t\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t\t\t\t.where(liveLease(this.db, \"reconciliation.lease_expires_at\"))\n\t\t\t\t\t\t.where((inner) =>\n\t\t\t\t\t\t\tinner.not(\n\t\t\t\t\t\t\t\tinner.exists(\n\t\t\t\t\t\t\t\t\tinner\n\t\t\t\t\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions as deletion\")\n\t\t\t\t\t\t\t\t\t\t.select(\"deletion.collection_id\")\n\t\t\t\t\t\t\t\t\t\t.where(\"deletion.collection_id\", \"=\", input.claim.collectionId),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\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_activation as activation\")\n\t\t\t\t\t\t.select(\"activation.task_key\")\n\t\t\t\t\t\t.where(\"activation.task_key\", \"=\", ACTIVATION_KEY)\n\t\t\t\t\t\t.where(\"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 deleteFinalized(claim: MediaUsageReconciliationClaim): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.deleteFrom(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", claim.runToken)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", claim.leaseToken)\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_index_status as status\")\n\t\t\t\t\t\t.select(\"status.collection_id\")\n\t\t\t\t\t\t.where(\"status.collection_id\", \"=\", claim.collectionId)\n\t\t\t\t\t\t.where(\"status.scope_key\", \"=\", claim.collectionSlug)\n\t\t\t\t\t\t.where(\"status.status\", \"=\", \"complete\")\n\t\t\t\t\t\t.where(\"status.reconciliation_required\", \"=\", 0),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numDeletedRows ?? 0) === 1;\n\t}\n\n\tasync deleteOneObsolete(): Promise<boolean> {\n\t\tconst result = await sql<{ collection_id: string }>`\n\t\t\tDELETE FROM _emdash_media_usage_reconciliations\n\t\t\tWHERE (collection_id, run_token) IN (\n\t\t\t\tSELECT reconciliation.collection_id, reconciliation.run_token\n\t\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\t\tINNER JOIN _emdash_media_usage_index_status AS status\n\t\t\t\t\tON status.collection_id = reconciliation.collection_id\n\t\t\t\t\tAND status.scope_key = reconciliation.collection_slug\n\t\t\t\tWHERE status.adapter_id = ${CONTENT_ADAPTER_ID}\n\t\t\t\t\tAND status.scope_type = ${COLLECTION_SCOPE}\n\t\t\t\t\tAND status.reconciliation_required = 0\n\t\t\t\tORDER BY reconciliation.updated_at, reconciliation.collection_id\n\t\t\t\tLIMIT 1\n\t\t\t)\n\t\t\tRETURNING collection_id\n\t\t`.execute(this.db);\n\t\treturn result.rows.length === 1;\n\t}\n\n\tprivate liveClaimExists(\n\t\tclaim: Pick<\n\t\t\tMediaUsageReconciliationRecord,\n\t\t\t\"collectionId\" | \"collectionSlug\" | \"runToken\" | \"leaseToken\"\n\t\t>,\n\t): RawBuilder<boolean> {\n\t\treturn this.liveClaimExistsSql(claim);\n\t}\n\n\tprivate liveClaimExistsSql(\n\t\tclaim: Pick<\n\t\t\tMediaUsageReconciliationRecord,\n\t\t\t\"collectionId\" | \"collectionSlug\" | \"runToken\" | \"leaseToken\"\n\t\t>,\n\t): RawBuilder<boolean> {\n\t\treturn sql<boolean>`EXISTS (\n\t\t\tSELECT 1\n\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\tINNER JOIN _emdash_collections AS collection\n\t\t\t\tON collection.id = reconciliation.collection_id\n\t\t\t\tAND collection.slug = reconciliation.collection_slug\n\t\t\tWHERE reconciliation.collection_id = ${claim.collectionId}\n\t\t\t\tAND reconciliation.collection_slug = ${claim.collectionSlug}\n\t\t\t\tAND reconciliation.run_token = ${claim.runToken}\n\t\t\t\tAND reconciliation.state = 'leased'\n\t\t\t\tAND reconciliation.lease_token = ${claim.leaseToken}\n\t\t\t\tAND ${liveLease(this.db, \"reconciliation.lease_expires_at\")}\n\t\t\t\tAND EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_activation AS activation\n\t\t\t\t\tWHERE activation.task_key = ${ACTIVATION_KEY}\n\t\t\t\t\t\tAND activation.state = 'active'\n\t\t\t\t)\n\t\t\t\tAND NOT EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_collection_deletions AS deletion\n\t\t\t\t\tWHERE deletion.collection_id = reconciliation.collection_id\n\t\t\t\t)\n\t\t)`;\n\t}\n\n\tprivate statusOwnsRun(\n\t\tclaim: Pick<MediaUsageReconciliationRecord, \"collectionId\" | \"collectionSlug\" | \"runToken\">,\n\t\ttargetEpoch: number | string,\n\t): RawBuilder<boolean> {\n\t\treturn sql<boolean>`EXISTS (\n\t\t\tSELECT 1 FROM _emdash_media_usage_index_status AS status\n\t\t\tWHERE status.adapter_id = ${CONTENT_ADAPTER_ID}\n\t\t\t\tAND status.scope_type = ${COLLECTION_SCOPE}\n\t\t\t\tAND status.collection_id = ${claim.collectionId}\n\t\t\t\tAND status.scope_key = ${claim.collectionSlug}\n\t\t\t\tAND status.capture_state = 'active'\n\t\t\t\tAND status.reconciliation_required = 1\n\t\t\t\tAND status.status = 'running'\n\t\t\t\tAND status.cursor = ${claim.runToken}\n\t\t\t\tAND status.change_epoch = ${targetEpoch}\n\t\t)`;\n\t}\n\n\tasync seedNextCandidate(): Promise<boolean> {\n\t\tconst runToken = ulid();\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst result = await sql<{ collection_id: string }>`\n\t\t\tINSERT INTO _emdash_media_usage_reconciliations (\n\t\t\t\tcollection_id,\n\t\t\t\tcollection_slug,\n\t\t\t\trun_token,\n\t\t\t\tnext_attempt_at,\n\t\t\t\tupdated_at\n\t\t\t)\n\t\t\tSELECT status.collection_id, status.scope_key, ${runToken}, ${now}, ${now}\n\t\t\tFROM _emdash_media_usage_index_status AS status\n\t\t\tINNER JOIN _emdash_collections AS collection\n\t\t\t\tON collection.id = status.collection_id\n\t\t\t\tAND collection.slug = status.scope_key\n\t\t\tWHERE status.adapter_id = ${CONTENT_ADAPTER_ID}\n\t\t\t\tAND status.scope_type = ${COLLECTION_SCOPE}\n\t\t\t\tAND status.capture_state = 'active'\n\t\t\t\tAND status.reconciliation_required = 1\n\t\t\t\tAND status.collection_id IS NOT NULL\n\t\t\t\tAND EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_activation AS activation\n\t\t\t\t\tWHERE activation.task_key = ${ACTIVATION_KEY}\n\t\t\t\t\t\tAND activation.state = 'active'\n\t\t\t\t)\n\t\t\t\tAND NOT EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_reconciliations AS existing\n\t\t\t\t\tWHERE existing.collection_id = status.collection_id\n\t\t\t\t)\n\t\t\t\tAND NOT EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_collection_deletions AS deletion\n\t\t\t\t\tWHERE deletion.collection_id = status.collection_id\n\t\t\t\t)\n\t\t\tORDER BY status.collection_id\n\t\t\tLIMIT 1\n\t\t\tON CONFLICT (collection_id) DO NOTHING\n\t\t\tRETURNING collection_id\n\t\t`.execute(this.db);\n\t\treturn result.rows.length === 1;\n\t}\n\n\tasync findDue(limit: number): Promise<MediaUsageReconciliationRecord[]> {\n\t\tassertLimit(limit);\n\t\tconst nextAttemptIsDue = timestampIsDue(this.db, \"next_attempt_at\");\n\t\tconst leaseIsDue = timestampIsDue(this.db, \"lease_expires_at\");\n\t\tconst result = await sql<Selectable<MediaUsageReconciliationTable>>`\n\t\t\tWITH pending_candidates AS (\n\t\t\t\tSELECT * FROM _emdash_media_usage_reconciliations\n\t\t\t\tWHERE state = 'pending' AND ${nextAttemptIsDue}\n\t\t\t\tORDER BY next_attempt_at, updated_at, collection_id\n\t\t\t\tLIMIT ${limit}\n\t\t\t), retry_candidates AS (\n\t\t\t\tSELECT * FROM _emdash_media_usage_reconciliations\n\t\t\t\tWHERE state = 'retry' AND ${nextAttemptIsDue}\n\t\t\t\tORDER BY next_attempt_at, updated_at, collection_id\n\t\t\t\tLIMIT ${limit}\n\t\t\t), leased_candidates AS (\n\t\t\t\tSELECT * FROM _emdash_media_usage_reconciliations\n\t\t\t\tWHERE state = 'leased' AND ${leaseIsDue}\n\t\t\t\tORDER BY lease_expires_at, updated_at, collection_id\n\t\t\t\tLIMIT ${limit}\n\t\t\t), candidates AS (\n\t\t\t\tSELECT * FROM pending_candidates\n\t\t\t\tUNION ALL SELECT * FROM retry_candidates\n\t\t\t\tUNION ALL SELECT * FROM leased_candidates\n\t\t\t)\n\t\t\tSELECT * FROM candidates\n\t\t\tORDER BY CASE WHEN state = 'leased' THEN lease_expires_at ELSE next_attempt_at END,\n\t\t\t\tupdated_at,\n\t\t\t\tcollection_id\n\t\t\tLIMIT ${limit}\n\t\t`.execute(this.db);\n\t\treturn result.rows.map(rowToRecord);\n\t}\n\n\tasync hasDeferredCandidate(): Promise<boolean> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_reconciliations\")\n\t\t\t.select(\"collection_id\")\n\t\t\t.where(\"state\", \"in\", [\"pending\", \"retry\", \"leased\"])\n\t\t\t.limit(1)\n\t\t\t.executeTakeFirst();\n\t\treturn row !== undefined;\n\t}\n\n\tasync wakeDrainedBarrierCandidate(): Promise<boolean> {\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst candidateIsDue = timestampIsDue(this.db, \"reconciliation.next_attempt_at\");\n\t\tconst targetIsDue = timestampIsDue(\n\t\t\tthis.db,\n\t\t\t\"_emdash_media_usage_reconciliations.next_attempt_at\",\n\t\t);\n\t\tconst result = await sql<{ collection_id: string }>`\n\t\t\tUPDATE _emdash_media_usage_reconciliations\n\t\t\tSET next_attempt_at = ${now}, updated_at = ${now}\n\t\t\tWHERE collection_id = (\n\t\t\t\tSELECT reconciliation.collection_id\n\t\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\t\tINNER JOIN _emdash_media_usage_index_status AS status\n\t\t\t\t\tON status.collection_id = reconciliation.collection_id\n\t\t\t\t\tAND status.scope_key = reconciliation.collection_slug\n\t\t\t\tWHERE reconciliation.state = 'pending'\n\t\t\t\t\tAND reconciliation.target_epoch IS NOT NULL\n\t\t\t\t\tAND NOT ${candidateIsDue}\n\t\t\t\t\tAND status.adapter_id = ${CONTENT_ADAPTER_ID}\n\t\t\t\t\tAND status.scope_type = ${COLLECTION_SCOPE}\n\t\t\t\t\tAND status.capture_state = 'active'\n\t\t\t\t\tAND status.reconciliation_required = 1\n\t\t\t\t\tAND status.status = 'running'\n\t\t\t\t\tAND status.cursor = reconciliation.run_token\n\t\t\t\t\tAND status.change_epoch = reconciliation.target_epoch\n\t\t\t\t\tAND NOT EXISTS (\n\t\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_work AS work\n\t\t\t\t\t\tWHERE work.collection_id = reconciliation.collection_id\n\t\t\t\t\t)\n\t\t\t\t\tAND NOT EXISTS (\n\t\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_collection_deletions AS deletion\n\t\t\t\t\t\tWHERE deletion.collection_id = reconciliation.collection_id\n\t\t\t\t\t)\n\t\t\t\tORDER BY reconciliation.next_attempt_at, reconciliation.updated_at,\n\t\t\t\t\treconciliation.collection_id\n\t\t\t\tLIMIT 1\n\t\t\t)\n\t\t\tAND state = 'pending'\n\t\t\tAND NOT ${targetIsDue}\n\t\t\tAND EXISTS (\n\t\t\t\tSELECT 1 FROM _emdash_media_usage_activation AS activation\n\t\t\t\tWHERE activation.task_key = ${ACTIVATION_KEY}\n\t\t\t\t\tAND activation.state = 'active'\n\t\t\t)\n\t\t\tAND NOT EXISTS (\n\t\t\t\tSELECT 1 FROM _emdash_media_usage_work AS work\n\t\t\t\tWHERE work.collection_id = _emdash_media_usage_reconciliations.collection_id\n\t\t\t)\n\t\t\tRETURNING collection_id\n\t\t`.execute(this.db);\n\t\treturn result.rows.length === 1;\n\t}\n\n\tasync findFailed(limit: number): Promise<MediaUsageReconciliationRecord[]> {\n\t\tassertLimit(limit);\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.innerJoin(\"_emdash_media_usage_index_status as status\", (join) =>\n\t\t\t\tjoin\n\t\t\t\t\t.onRef(\"status.collection_id\", \"=\", \"reconciliation.collection_id\")\n\t\t\t\t\t.onRef(\"status.scope_key\", \"=\", \"reconciliation.collection_slug\"),\n\t\t\t)\n\t\t\t.selectAll(\"reconciliation\")\n\t\t\t.where(\"reconciliation.state\", \"=\", \"failed\")\n\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb(\"status.reconciliation_required\", \"=\", 0),\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"status.status\", \"=\", \"running\"),\n\t\t\t\t\t\teb(\"status.cursor\", \"=\", eb.ref(\"reconciliation.run_token\")),\n\t\t\t\t\t]),\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"status.cursor\", \"is\", null),\n\t\t\t\t\t\teb(\"status.change_epoch\", \">\", eb.ref(\"reconciliation.target_epoch\")),\n\t\t\t\t\t]),\n\t\t\t\t]),\n\t\t\t)\n\t\t\t.orderBy(\"reconciliation.updated_at\")\n\t\t\t.orderBy(\"reconciliation.collection_id\")\n\t\t\t.limit(limit)\n\t\t\t.execute();\n\t\treturn rows.map(rowToRecord);\n\t}\n\n\tasync claim(input: {\n\t\tcollectionId: string;\n\t\trunToken: string;\n\t\tleaseDurationSeconds: number;\n\t}): Promise<MediaUsageReconciliationClaim | null> {\n\t\tassertIdentity(input);\n\t\tassertDuration(input.leaseDurationSeconds, \"lease duration\");\n\t\tconst leaseToken = ulid();\n\t\tconst row = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tstate: \"leased\",\n\t\t\t\tlease_token: leaseToken,\n\t\t\t\tlease_expires_at: timestampOffset(this.db, input.leaseDurationSeconds),\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.runToken)\n\t\t\t.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"reconciliation.state\", \"in\", [\"pending\", \"retry\"]),\n\t\t\t\t\t\ttimestampIsDue(this.db, \"reconciliation.next_attempt_at\"),\n\t\t\t\t\t]),\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"reconciliation.state\", \"=\", \"leased\"),\n\t\t\t\t\t\ttimestampIsDue(this.db, \"reconciliation.lease_expires_at\"),\n\t\t\t\t\t]),\n\t\t\t\t]),\n\t\t\t)\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_activation as activation\")\n\t\t\t\t\t\t.select(\"activation.task_key\")\n\t\t\t\t\t\t.where(\"activation.task_key\", \"=\", ACTIVATION_KEY)\n\t\t\t\t\t\t.where(\"activation.state\", \"=\", \"active\"),\n\t\t\t\t),\n\t\t\t)\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_index_status as status\")\n\t\t\t\t\t\t.innerJoin(\"_emdash_collections as collection\", (join) =>\n\t\t\t\t\t\t\tjoin\n\t\t\t\t\t\t\t\t.onRef(\"collection.id\", \"=\", \"status.collection_id\")\n\t\t\t\t\t\t\t\t.onRef(\"collection.slug\", \"=\", \"status.scope_key\"),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.select(\"status.collection_id\")\n\t\t\t\t\t\t.whereRef(\"status.collection_id\", \"=\", \"reconciliation.collection_id\")\n\t\t\t\t\t\t.whereRef(\"status.scope_key\", \"=\", \"reconciliation.collection_slug\")\n\t\t\t\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t\t\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t\t\t\t\t.where(\"status.reconciliation_required\", \"=\", 1),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.where((eb) =>\n\t\t\t\teb.not(\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_collection_deletions as deletion\")\n\t\t\t\t\t\t\t.select(\"deletion.collection_id\")\n\t\t\t\t\t\t\t.whereRef(\"deletion.collection_id\", \"=\", \"reconciliation.collection_id\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.returningAll()\n\t\t\t.executeTakeFirst();\n\t\treturn row\n\t\t\t? ({ ...rowToRecord(row), leaseToken } satisfies MediaUsageReconciliationClaim)\n\t\t\t: null;\n\t}\n\n\tasync release(input: {\n\t\tcollectionId: string;\n\t\trunToken: string;\n\t\tleaseToken: string;\n\t\tdelaySeconds: number;\n\t}): Promise<boolean> {\n\t\tassertLeaseIdentity(input);\n\t\tassertDuration(input.delaySeconds, \"release delay\", true);\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations\")\n\t\t\t.set({\n\t\t\t\tstate: \"pending\",\n\t\t\t\tnext_attempt_at: timestampOffset(this.db, input.delaySeconds),\n\t\t\t\tlease_token: null,\n\t\t\t\tlease_expires_at: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"run_token\", \"=\", input.runToken)\n\t\t\t.where(\"state\", \"=\", \"leased\")\n\t\t\t.where(\"lease_token\", \"=\", input.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync recordFailure(input: {\n\t\tcollectionId: string;\n\t\trunToken: string;\n\t\tleaseToken: string;\n\t\terrorCode: string;\n\t\tretryDelaySeconds: number;\n\t\tterminal: boolean;\n\t}): Promise<boolean> {\n\t\tassertLeaseIdentity(input);\n\t\tif (!STABLE_ERROR_CODE_PATTERN.test(input.errorCode)) {\n\t\t\tthrow new Error(\"Reconciliation failure requires a stable error code\");\n\t\t}\n\t\tassertDuration(input.retryDelaySeconds, \"retry delay\", true);\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations\")\n\t\t\t.set({\n\t\t\t\tstate: input.terminal\n\t\t\t\t\t? \"failed\"\n\t\t\t\t\t: sql<string>`CASE WHEN attempt_count >= 4 THEN 'failed' ELSE 'retry' END`,\n\t\t\t\t...(input.terminal\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttarget_epoch: sql<number | string | null>`COALESCE(\n\t\t\t\t\t\t\t\ttarget_epoch,\n\t\t\t\t\t\t\t\t(SELECT status.change_epoch\n\t\t\t\t\t\t\t\t FROM _emdash_media_usage_index_status AS status\n\t\t\t\t\t\t\t\t WHERE status.adapter_id = ${CONTENT_ADAPTER_ID}\n\t\t\t\t\t\t\t\t\tAND status.scope_type = ${COLLECTION_SCOPE}\n\t\t\t\t\t\t\t\t\tAND status.collection_id = ${input.collectionId}\n\t\t\t\t\t\t\t\t\tAND status.status = 'running'\n\t\t\t\t\t\t\t\t\tAND status.cursor = ${input.runToken})\n\t\t\t\t\t\t\t)`,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\tattempt_count: sql<number>`attempt_count + 1`,\n\t\t\t\tnext_attempt_at: timestampOffset(this.db, input.retryDelaySeconds),\n\t\t\t\tlease_token: null,\n\t\t\t\tlease_expires_at: null,\n\t\t\t\tlast_error_code: input.errorCode,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"run_token\", \"=\", input.runToken)\n\t\t\t.where(\"state\", \"=\", \"leased\")\n\t\t\t.where(\"lease_token\", \"=\", input.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync recordEntryFailure(claim: MediaUsageReconciliationClaim): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tstate: \"failed\",\n\t\t\t\tattempt_count: sql<number>`attempt_count + 1`,\n\t\t\t\tnext_attempt_at: timestampOffset(this.db, 0),\n\t\t\t\tlease_token: null,\n\t\t\t\tlease_expires_at: null,\n\t\t\t\tlast_error_code: \"MEDIA_USAGE_RECONCILIATION_ENTRY_FAILED\",\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", claim.runToken)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\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_work as work\")\n\t\t\t\t\t\t.select(\"work.content_id\")\n\t\t\t\t\t\t.where(\"work.collection_id\", \"=\", claim.collectionId)\n\t\t\t\t\t\t.where(\"work.state\", \"=\", \"failed\"),\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 resetFailedForNewEpoch(\n\t\tobserved: Selectable<MediaUsageReconciliationTable> | MediaUsageReconciliationRecord,\n\t): Promise<boolean> {\n\t\tconst collectionId =\n\t\t\t\"collection_id\" in observed ? observed.collection_id : observed.collectionId;\n\t\tconst runToken = \"run_token\" in observed ? observed.run_token : observed.runToken;\n\t\tconst targetEpoch = \"target_epoch\" in observed ? observed.target_epoch : observed.targetEpoch;\n\t\tif (targetEpoch === null) return false;\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tstate: \"pending\",\n\t\t\t\tphase: \"scan\",\n\t\t\t\ttarget_epoch: null,\n\t\t\t\tfield_fingerprint: null,\n\t\t\t\tscan_cursor: null,\n\t\t\t\tscan_upper_id: null,\n\t\t\t\tsource_cursor: null,\n\t\t\t\tsource_upper_key: null,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tnext_attempt_at: now,\n\t\t\t\tlease_token: null,\n\t\t\t\tlease_expires_at: null,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", runToken)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"failed\")\n\t\t\t.where(\"reconciliation.target_epoch\", \"=\", targetEpoch)\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_index_status as status\")\n\t\t\t\t\t\t.select(\"status.collection_id\")\n\t\t\t\t\t\t.whereRef(\"status.collection_id\", \"=\", \"reconciliation.collection_id\")\n\t\t\t\t\t\t.whereRef(\"status.scope_key\", \"=\", \"reconciliation.collection_slug\")\n\t\t\t\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t\t\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t\t\t\t\t.where(\"status.reconciliation_required\", \"=\", 1)\n\t\t\t\t\t\t.where((status) =>\n\t\t\t\t\t\t\tstatus.or([\n\t\t\t\t\t\t\t\tstatus(\"status.cursor\", \"is\", null),\n\t\t\t\t\t\t\t\tstatus.and([\n\t\t\t\t\t\t\t\t\tstatus(\"status.status\", \"=\", \"running\"),\n\t\t\t\t\t\t\t\t\tstatus(\"status.cursor\", \"=\", runToken),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.where(\"status.change_epoch\", \">\", targetEpoch),\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\nfunction rowToRecord(\n\trow: Selectable<MediaUsageReconciliationTable>,\n): MediaUsageReconciliationRecord {\n\tif (!isState(row.state) || !isPhase(row.phase) || !Number.isSafeInteger(row.attempt_count)) {\n\t\tthrow new Error(\"Invalid media usage reconciliation lifecycle\");\n\t}\n\treturn {\n\t\tcollectionId: row.collection_id,\n\t\tcollectionSlug: row.collection_slug,\n\t\trunToken: row.run_token,\n\t\ttargetEpoch: row.target_epoch,\n\t\tfieldFingerprint: row.field_fingerprint,\n\t\tstate: row.state,\n\t\tphase: row.phase,\n\t\tscanCursor: row.scan_cursor,\n\t\tscanUpperId: row.scan_upper_id,\n\t\tsourceCursor: row.source_cursor,\n\t\tsourceUpperKey: row.source_upper_key,\n\t\tattemptCount: row.attempt_count,\n\t\tnextAttemptAt: row.next_attempt_at,\n\t\tleaseToken: row.lease_token,\n\t\tleaseExpiresAt: row.lease_expires_at,\n\t\tlastErrorCode: row.last_error_code,\n\t\tcreatedAt: row.created_at,\n\t\tupdatedAt: row.updated_at,\n\t};\n}\n\nfunction isState(state: string): state is MediaUsageReconciliationState {\n\treturn state === \"pending\" || state === \"retry\" || state === \"leased\" || state === \"failed\";\n}\n\nfunction isPhase(phase: string): phase is MediaUsageReconciliationPhase {\n\treturn phase === \"scan\" || phase === \"sources\";\n}\n\nfunction assertLimit(limit: number): void {\n\tif (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_CANDIDATES) {\n\t\tthrow new Error(\"Reconciliation candidate limit must be from 1 to 100\");\n\t}\n}\n\nfunction assertIdentity(input: { collectionId: string; runToken: string }): void {\n\tif (!input.collectionId || !input.runToken) {\n\t\tthrow new Error(\"Reconciliation requires an exact collection and run token\");\n\t}\n}\n\nfunction assertLeaseIdentity(input: {\n\tcollectionId: string;\n\trunToken: string;\n\tleaseToken: string;\n}): void {\n\tassertIdentity(input);\n\tif (!input.leaseToken) throw new Error(\"Reconciliation requires a lease token\");\n}\n\nfunction assertDuration(value: number, label: string, allowZero = false): void {\n\tif (\n\t\t!Number.isSafeInteger(value) ||\n\t\tvalue < (allowZero ? 0 : 1) ||\n\t\tvalue > MAX_PORTABLE_DURATION_SECONDS\n\t) {\n\t\tthrow new Error(`Reconciliation ${label} is outside the portable range`);\n\t}\n}\n\nfunction liveLease(db: Kysely<Database>, column = \"lease_expires_at\"): RawBuilder<boolean> {\n\tconst expiry = sql.ref(column);\n\treturn isPostgres(db)\n\t\t? sql<boolean>`${expiry} > to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')`\n\t\t: sql<boolean>`${expiry} > strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n}\n\nfunction timestampIsDue(db: Kysely<Database>, column: string): RawBuilder<boolean> {\n\tconst value = sql.ref(column);\n\treturn isPostgres(db)\n\t\t? sql<boolean>`${value} <= to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')`\n\t\t: sql<boolean>`${value} <= strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n}\n\nfunction timestampOffset(db: Kysely<Database>, offsetSeconds: number): RawBuilder<string> {\n\tif (isPostgres(db)) {\n\t\treturn sql<string>`to_char(\n\t\t\t(clock_timestamp() AT TIME ZONE 'UTC') + (${offsetSeconds} * INTERVAL '1 second'),\n\t\t\t'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"'\n\t\t)`;\n\t}\n\treturn sql<string>`strftime(\n\t\t'%Y-%m-%dT%H:%M:%fZ',\n\t\t'now',\n\t\t${`${offsetSeconds >= 0 ? \"+\" : \"\"}${offsetSeconds} seconds`}\n\t)`;\n}\n\nfunction contentTableName(collectionSlug: string): string {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\tconst tableName = `ec_${collectionSlug}`;\n\tvalidateIdentifier(tableName, \"content table\");\n\treturn tableName;\n}\n","import type { Kysely } from \"kysely\";\n\nimport { MediaUsageWorkRepository } from \"../../database/repositories/media-usage-work.js\";\nimport type { Database } from \"../../database/types.js\";\nimport {\n\tbuildContentMediaUsageFieldFingerprint,\n\tloadContentMediaUsageFields,\n} from \"./content-fields.js\";\nimport {\n\tMediaUsageReconciliationRepository,\n\ttype MediaUsageReconciliationClaim,\n\ttype MediaUsageReconciliationRecord,\n} from \"./reconciliation.js\";\nimport { CONTENT_SOURCE_SCHEMA_VERSION } from \"./types.js\";\n\nexport const MEDIA_USAGE_RECONCILIATION_LIMITS = Object.freeze({\n\tcandidatesPerTick: 4,\n\tscanPageSize: 1_000,\n\tsourcePageSize: 1_000,\n\tleaseDurationSeconds: 60,\n\tmaxAttempts: 5,\n\tretryBaseSeconds: 30,\n\tretryMaxSeconds: 15 * 60,\n\tretryJitterRatio: 0.25,\n});\n\nexport type MediaUsageReconciliationOutcome =\n\t| \"inactive\"\n\t| \"not_due\"\n\t| \"claim_lost\"\n\t| \"advanced\"\n\t| \"deferred\"\n\t| \"completed\"\n\t| \"retry\"\n\t| \"failed\";\n\nexport interface MediaUsageReconciliationDetailedResult {\n\toutcome: MediaUsageReconciliationOutcome;\n\tconsumedUnit: boolean;\n\thasDeferredCandidate: boolean;\n}\n\nexport interface ProcessDueMediaUsageReconciliationOptions {\n\tactivationKnownActive?: boolean;\n}\n\nexport type MediaUsageReconciliationScanOutcome =\n\t| \"advanced\"\n\t| \"exhausted\"\n\t| \"deferred\"\n\t| \"restart_required\";\n\nexport async function processDueMediaUsageReconciliation(\n\tdb: Kysely<Database>,\n): Promise<MediaUsageReconciliationOutcome> {\n\treturn (await processDueMediaUsageReconciliationDetailed(db)).outcome;\n}\n\nexport async function processDueMediaUsageReconciliationDetailed(\n\tdb: Kysely<Database>,\n\toptions: ProcessDueMediaUsageReconciliationOptions = {},\n): Promise<MediaUsageReconciliationDetailedResult> {\n\tif (!options.activationKnownActive) {\n\t\tconst activation = await db\n\t\t\t.selectFrom(\"_emdash_media_usage_activation\")\n\t\t\t.select(\"state\")\n\t\t\t.where(\"task_key\", \"=\", \"incremental_capture\")\n\t\t\t.executeTakeFirst();\n\t\tif (activation?.state !== \"active\") {\n\t\t\treturn { outcome: \"inactive\", consumedUnit: false, hasDeferredCandidate: false };\n\t\t}\n\t}\n\n\tconst reconciliation = new MediaUsageReconciliationRepository(db);\n\tif (await reconciliation.deleteOneObsolete()) {\n\t\treturn { outcome: \"completed\", consumedUnit: true, hasDeferredCandidate: false };\n\t}\n\tconst [failed] = await reconciliation.findFailed(1);\n\tif (failed) {\n\t\tif (await reconciliation.finishFailedCoverage(failed.collectionId, failed.runToken)) {\n\t\t\treturn { outcome: \"failed\", consumedUnit: true, hasDeferredCandidate: false };\n\t\t}\n\t\tif (await reconciliation.resetFailedForNewEpoch(failed)) {\n\t\t\treturn { outcome: \"advanced\", consumedUnit: true, hasDeferredCandidate: false };\n\t\t}\n\t}\n\n\tconst seeded = await reconciliation.seedNextCandidate();\n\tconst candidates = await reconciliation.findDue(\n\t\tMEDIA_USAGE_RECONCILIATION_LIMITS.candidatesPerTick,\n\t);\n\tlet claim: MediaUsageReconciliationClaim | null = null;\n\tfor (const candidate of candidates) {\n\t\tclaim = await reconciliation.claim({\n\t\t\tcollectionId: candidate.collectionId,\n\t\t\trunToken: candidate.runToken,\n\t\t\tleaseDurationSeconds: MEDIA_USAGE_RECONCILIATION_LIMITS.leaseDurationSeconds,\n\t\t});\n\t\tif (claim) break;\n\t}\n\tif (!claim) {\n\t\treturn {\n\t\t\toutcome: candidates.length === 0 ? \"not_due\" : \"claim_lost\",\n\t\t\tconsumedUnit: seeded,\n\t\t\thasDeferredCandidate:\n\t\t\t\tcandidates.length === 0 && (await reconciliation.hasDeferredCandidate()),\n\t\t};\n\t}\n\n\ttry {\n\t\treturn {\n\t\t\toutcome: await processClaimedReconciliation(db, claim),\n\t\t\tconsumedUnit: true,\n\t\t\thasDeferredCandidate: false,\n\t\t};\n\t} catch (error) {\n\t\tconst terminal = claim.attemptCount + 1 >= MEDIA_USAGE_RECONCILIATION_LIMITS.maxAttempts;\n\t\tconst recorded = await reconciliation.recordFailure({\n\t\t\tcollectionId: claim.collectionId,\n\t\t\trunToken: claim.runToken,\n\t\t\tleaseToken: claim.leaseToken,\n\t\t\terrorCode: \"MEDIA_USAGE_RECONCILIATION_FAILED\",\n\t\t\tretryDelaySeconds: retryDelaySeconds(claim.attemptCount),\n\t\t\tterminal,\n\t\t});\n\t\tif (!recorded) {\n\t\t\treturn { outcome: \"claim_lost\", consumedUnit: true, hasDeferredCandidate: false };\n\t\t}\n\t\tif (terminal) await reconciliation.finishFailedCoverage(claim.collectionId, claim.runToken);\n\t\tconsole.error(\"[media-usage:reconciliation] Processing failed:\", error);\n\t\treturn {\n\t\t\toutcome: terminal ? \"failed\" : \"retry\",\n\t\t\tconsumedUnit: true,\n\t\t\thasDeferredCandidate: false,\n\t\t};\n\t}\n}\n\nexport async function processClaimedMediaUsageReconciliationScan(\n\tdb: Kysely<Database>,\n\tclaim: MediaUsageReconciliationClaim,\n\toptions: { releaseOnExhausted?: boolean } = {},\n\tknownCurrent?: MediaUsageReconciliationRecord,\n): Promise<MediaUsageReconciliationScanOutcome> {\n\tconst reconciliation = new MediaUsageReconciliationRepository(db);\n\tlet current =\n\t\tknownCurrent ?? (await reconciliation.findByIdentity(claim.collectionId, claim.runToken));\n\tif (!current || current.leaseToken !== claim.leaseToken || current.phase !== \"scan\") {\n\t\treturn \"deferred\";\n\t}\n\n\tlet fields;\n\tlet fieldFingerprint: string;\n\tif (current.targetEpoch === null) {\n\t\tconst targetEpoch = await reconciliation.beginRun(claim);\n\t\tif (targetEpoch === null) {\n\t\t\tawait reconciliation.release({ ...claim, delaySeconds: 30 });\n\t\t\treturn \"deferred\";\n\t\t}\n\t\tfields = await loadContentMediaUsageFields(db, claim.collectionSlug, claim.collectionId);\n\t\tfieldFingerprint = await buildContentMediaUsageFieldFingerprint(fields);\n\t\tconst scanUpperId =\n\t\t\tfields.extractionFields.length === 0 ? null : await reconciliation.findScanUpperId(claim);\n\t\tif (\n\t\t\t!(await reconciliation.initializeScan({\n\t\t\t\tclaim,\n\t\t\t\ttargetEpoch,\n\t\t\t\tfieldFingerprint,\n\t\t\t\tscanUpperId,\n\t\t\t}))\n\t\t) {\n\t\t\treturn \"deferred\";\n\t\t}\n\t\tcurrent = {\n\t\t\t...current,\n\t\t\ttargetEpoch,\n\t\t\tfieldFingerprint,\n\t\t\tscanCursor: null,\n\t\t\tscanUpperId,\n\t\t\tsourceCursor: null,\n\t\t\tsourceUpperKey: null,\n\t\t};\n\t} else {\n\t\tfields = await loadContentMediaUsageFields(db, claim.collectionSlug, claim.collectionId);\n\t\tfieldFingerprint = await buildContentMediaUsageFieldFingerprint(fields);\n\t}\n\n\tif (current.fieldFingerprint !== fieldFingerprint || current.targetEpoch === null) {\n\t\treturn \"restart_required\";\n\t}\n\tconst contentIds = await reconciliation.findScanPage(\n\t\tcurrent,\n\t\tMEDIA_USAGE_RECONCILIATION_LIMITS.scanPageSize,\n\t);\n\tif (contentIds.length === 0) {\n\t\tif (options.releaseOnExhausted ?? true) {\n\t\t\tawait reconciliation.release({ ...claim, delaySeconds: 30 });\n\t\t}\n\t\treturn \"exhausted\";\n\t}\n\n\tconst work = new MediaUsageWorkRepository(db);\n\tawait work.enqueueReconciliationPage({\n\t\tcollectionId: claim.collectionId,\n\t\tcollectionSlug: claim.collectionSlug,\n\t\trunToken: claim.runToken,\n\t\tleaseToken: claim.leaseToken,\n\t\tchangeEpoch: current.targetEpoch,\n\t\tphase: \"scan\",\n\t\tcontentIds,\n\t});\n\tconst nextCursor = contentIds.at(-1)!;\n\tif (\n\t\t!(await reconciliation.checkpointScan({\n\t\t\tclaim,\n\t\t\ttargetEpoch: current.targetEpoch,\n\t\t\tpreviousCursor: current.scanCursor,\n\t\t\tnextCursor,\n\t\t}))\n\t) {\n\t\treturn \"deferred\";\n\t}\n\tif (!(await reconciliation.release({ ...claim, delaySeconds: 0 }))) return \"deferred\";\n\treturn \"advanced\";\n}\n\nasync function processClaimedReconciliation(\n\tdb: Kysely<Database>,\n\tclaim: MediaUsageReconciliationClaim,\n): Promise<MediaUsageReconciliationOutcome> {\n\tconst reconciliation = new MediaUsageReconciliationRepository(db);\n\tlet current: MediaUsageReconciliationRecord = claim;\n\tif (current.targetEpoch !== null && !(await reconciliation.ownsRun(claim, current.targetEpoch))) {\n\t\treturn restartReconciliation(db, reconciliation, claim, current);\n\t}\n\tif (current.targetEpoch !== null) {\n\t\tawait new MediaUsageWorkRepository(db).deleteObsoleteReconciliationWork({\n\t\t\tcollectionId: claim.collectionId,\n\t\t\tcollectionSlug: claim.collectionSlug,\n\t\t\trunToken: claim.runToken,\n\t\t\tleaseToken: claim.leaseToken,\n\t\t\ttargetEpoch: current.targetEpoch,\n\t\t});\n\t}\n\n\tif (current.phase === \"scan\") {\n\t\tconst outcome = await processClaimedMediaUsageReconciliationScan(\n\t\t\tdb,\n\t\t\tclaim,\n\t\t\t{\n\t\t\t\treleaseOnExhausted: false,\n\t\t\t},\n\t\t\tcurrent,\n\t\t);\n\t\tif (outcome === \"restart_required\") {\n\t\t\tcurrent =\n\t\t\t\t(await reconciliation.findByIdentity(claim.collectionId, claim.runToken)) ?? current;\n\t\t\treturn restartReconciliation(db, reconciliation, claim, current);\n\t\t}\n\t\tif (outcome !== \"exhausted\") return outcome;\n\t\tif (current.targetEpoch === null || current.fieldFingerprint === null) {\n\t\t\tcurrent =\n\t\t\t\t(await reconciliation.findByIdentity(claim.collectionId, claim.runToken)) ?? current;\n\t\t}\n\t\tconst barrier = await reconciliation.findWorkBarrier(claim.collectionId);\n\t\tif (barrier.state === \"failed\") {\n\t\t\treturn failReconciliation(reconciliation, claim, barrier.errorCode, true);\n\t\t}\n\t\tif (barrier.state === \"pending\") {\n\t\t\tawait reconciliation.release({ ...claim, delaySeconds: 30 });\n\t\t\treturn \"deferred\";\n\t\t}\n\t\tif (current.targetEpoch === null || current.fieldFingerprint === null) return \"claim_lost\";\n\t\tconst sourceUpperKey = await reconciliation.findSourceUpperKey(claim, current.targetEpoch);\n\t\tif (\n\t\t\t!(await reconciliation.transitionToSources({\n\t\t\t\tclaim,\n\t\t\t\ttargetEpoch: current.targetEpoch,\n\t\t\t\tfieldFingerprint: current.fieldFingerprint,\n\t\t\t\tsourceUpperKey,\n\t\t\t}))\n\t\t) {\n\t\t\treturn \"claim_lost\";\n\t\t}\n\t\tif (!(await reconciliation.release({ ...claim, delaySeconds: 0 }))) return \"claim_lost\";\n\t\treturn \"advanced\";\n\t}\n\n\treturn processSourcePhase(db, reconciliation, claim, current);\n}\n\nasync function processSourcePhase(\n\tdb: Kysely<Database>,\n\treconciliation: MediaUsageReconciliationRepository,\n\tclaim: MediaUsageReconciliationClaim,\n\tcurrent: MediaUsageReconciliationRecord,\n): Promise<MediaUsageReconciliationOutcome> {\n\tif (current.targetEpoch === null || current.fieldFingerprint === null) return \"claim_lost\";\n\tconst fields = await loadContentMediaUsageFields(db, claim.collectionSlug, claim.collectionId);\n\tconst fieldFingerprint = await buildContentMediaUsageFieldFingerprint(fields);\n\tif (fieldFingerprint !== current.fieldFingerprint) {\n\t\treturn restartReconciliation(db, reconciliation, claim, current, fields, fieldFingerprint);\n\t}\n\n\tconst page = await reconciliation.findSourcePage(\n\t\tcurrent,\n\t\tMEDIA_USAGE_RECONCILIATION_LIMITS.sourcePageSize,\n\t);\n\tif (page.length > 0) {\n\t\tlet enqueuedMissingContent = false;\n\t\tconst malformed = page.some(\n\t\t\t(source) =>\n\t\t\t\t!source.contentId ||\n\t\t\t\t(source.sourceVariant !== \"columns\" && source.sourceVariant !== \"draft_overlay\"),\n\t\t);\n\t\tif (malformed) {\n\t\t\treturn failReconciliation(\n\t\t\t\treconciliation,\n\t\t\t\tclaim,\n\t\t\t\t\"MEDIA_USAGE_RECONCILIATION_INVALID_SOURCE\",\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t\tconst contentIds = [...new Set(page.map((source) => source.contentId!))];\n\t\tconst enqueueIds =\n\t\t\tfields.extractionFields.length === 0\n\t\t\t\t? contentIds\n\t\t\t\t: await reconciliation.findMissingContentIds(claim.collectionSlug, contentIds);\n\t\tif (enqueueIds.length > 0) {\n\t\t\tawait new MediaUsageWorkRepository(db).enqueueReconciliationPage({\n\t\t\t\tcollectionId: claim.collectionId,\n\t\t\t\tcollectionSlug: claim.collectionSlug,\n\t\t\t\trunToken: claim.runToken,\n\t\t\t\tleaseToken: claim.leaseToken,\n\t\t\t\tchangeEpoch: current.targetEpoch,\n\t\t\t\tphase: \"sources\",\n\t\t\t\tcontentIds: enqueueIds,\n\t\t\t});\n\t\t\tenqueuedMissingContent = true;\n\t\t}\n\t\tif (\n\t\t\t!(await reconciliation.checkpointSources({\n\t\t\t\tclaim,\n\t\t\t\ttargetEpoch: current.targetEpoch,\n\t\t\t\tpreviousCursor: current.sourceCursor,\n\t\t\t\tnextCursor: page.at(-1)!.sourceKey,\n\t\t\t}))\n\t\t) {\n\t\t\treturn \"claim_lost\";\n\t\t}\n\t\tif (\n\t\t\tenqueuedMissingContent ||\n\t\t\tpage.length === MEDIA_USAGE_RECONCILIATION_LIMITS.sourcePageSize\n\t\t) {\n\t\t\tif (!(await reconciliation.release({ ...claim, delaySeconds: 0 }))) return \"claim_lost\";\n\t\t\treturn \"advanced\";\n\t\t}\n\t}\n\n\tconst barrier = await reconciliation.findWorkBarrier(claim.collectionId);\n\tif (barrier.state === \"failed\") {\n\t\treturn failReconciliation(reconciliation, claim, barrier.errorCode, true);\n\t}\n\tif (barrier.state === \"pending\") {\n\t\tawait reconciliation.release({ ...claim, delaySeconds: 30 });\n\t\treturn \"deferred\";\n\t}\n\tif (\n\t\t!(await reconciliation.finalizeCoverage({\n\t\t\tclaim,\n\t\t\ttargetEpoch: current.targetEpoch,\n\t\t\tfieldFingerprint,\n\t\t\tschemaVersion: CONTENT_SOURCE_SCHEMA_VERSION,\n\t\t}))\n\t) {\n\t\treturn \"claim_lost\";\n\t}\n\tif (!(await reconciliation.deleteFinalized(claim))) return \"claim_lost\";\n\treturn \"completed\";\n}\n\nasync function restartReconciliation(\n\tdb: Kysely<Database>,\n\treconciliation: MediaUsageReconciliationRepository,\n\tclaim: MediaUsageReconciliationClaim,\n\tcurrent: MediaUsageReconciliationRecord,\n\tfields?: Awaited<ReturnType<typeof loadContentMediaUsageFields>>,\n\tfieldFingerprint?: string,\n): Promise<MediaUsageReconciliationOutcome> {\n\tif (current.targetEpoch === null) return \"claim_lost\";\n\tconst discoveredFields =\n\t\tfields ?? (await loadContentMediaUsageFields(db, claim.collectionSlug, claim.collectionId));\n\tconst fingerprint =\n\t\tfieldFingerprint ?? (await buildContentMediaUsageFieldFingerprint(discoveredFields));\n\tconst targetEpoch = await reconciliation.restartRun(claim, current.targetEpoch);\n\tif (targetEpoch === null) {\n\t\tawait reconciliation.release({ ...claim, delaySeconds: 30 });\n\t\treturn \"deferred\";\n\t}\n\tconst scanUpperId =\n\t\tdiscoveredFields.extractionFields.length === 0\n\t\t\t? null\n\t\t\t: await reconciliation.findScanUpperId(claim);\n\tif (\n\t\t!(await reconciliation.restartScan({\n\t\t\tclaim,\n\t\t\tpreviousEpoch: current.targetEpoch,\n\t\t\ttargetEpoch,\n\t\t\tfieldFingerprint: fingerprint,\n\t\t\tscanUpperId,\n\t\t}))\n\t) {\n\t\treturn \"claim_lost\";\n\t}\n\tif (!(await reconciliation.release({ ...claim, delaySeconds: 0 }))) return \"claim_lost\";\n\treturn \"advanced\";\n}\n\nasync function failReconciliation(\n\treconciliation: MediaUsageReconciliationRepository,\n\tclaim: MediaUsageReconciliationClaim,\n\terrorCode: string,\n\tentryFailure: boolean,\n): Promise<MediaUsageReconciliationOutcome> {\n\tconst recorded = entryFailure\n\t\t? await reconciliation.recordEntryFailure(claim)\n\t\t: await reconciliation.recordFailure({\n\t\t\t\tcollectionId: claim.collectionId,\n\t\t\t\trunToken: claim.runToken,\n\t\t\t\tleaseToken: claim.leaseToken,\n\t\t\t\terrorCode,\n\t\t\t\tretryDelaySeconds: 0,\n\t\t\t\tterminal: true,\n\t\t\t});\n\tif (!recorded) return \"claim_lost\";\n\tawait reconciliation.finishFailedCoverage(claim.collectionId, claim.runToken);\n\treturn \"failed\";\n}\n\nfunction retryDelaySeconds(attemptCount: number): number {\n\tconst exponential = Math.min(\n\t\tMEDIA_USAGE_RECONCILIATION_LIMITS.retryMaxSeconds,\n\t\tMEDIA_USAGE_RECONCILIATION_LIMITS.retryBaseSeconds * 2 ** attemptCount,\n\t);\n\tconst jitter = Math.floor(\n\t\texponential * MEDIA_USAGE_RECONCILIATION_LIMITS.retryJitterRatio * Math.random(),\n\t);\n\treturn Math.min(MEDIA_USAGE_RECONCILIATION_LIMITS.retryMaxSeconds, exponential + jitter);\n}\n","import type { Kysely } from \"kysely\";\n\nimport { isPostgres } from \"../../database/dialect-helpers.js\";\nimport {\n\tMediaUsageWorkRepository,\n\ttype MediaUsageWorkRecord,\n} from \"../../database/repositories/media-usage-work.js\";\nimport { MediaUsageRepository } from \"../../database/repositories/media-usage.js\";\nimport { withTransaction } from \"../../database/transaction.js\";\nimport type { Database } from \"../../database/types.js\";\nimport { getRequestContext } from \"../../request-context.js\";\nimport {\n\tcontentRefreshKey,\n\trefreshContentMediaUsageForWorkBatch,\n\ttype ContentMediaUsageRefreshResult,\n\ttype ContentMediaUsageRefreshErrorCode,\n} from \"./content-refresh.js\";\n\nexport const MEDIA_USAGE_WORK_PROCESSING_LIMITS = Object.freeze({\n\tcandidatesPerTick: 1_000,\n\tleaseDurationSeconds: 20 * 60,\n\tmaxAttempts: 5,\n\tretryBaseSeconds: 30,\n\tretryMaxSeconds: 15 * 60,\n\tretryJitterRatio: 0.25,\n});\n\nexport type MediaUsageWorkProcessingOutcome =\n\t| \"inactive\"\n\t| \"not_due\"\n\t| \"claim_lost\"\n\t| \"completed\"\n\t| \"retry\"\n\t| \"failed\"\n\t| \"superseded\"\n\t| \"obsolete\";\n\nexport interface MediaUsageWorkProcessingResult {\n\toutcome: MediaUsageWorkProcessingOutcome;\n\tclaimed: boolean;\n}\n\nexport interface MediaUsageWorkTickResult {\n\tcandidateCount: number;\n\tclaimedCount: number;\n\tcompletedCount: number;\n\tretryCount: number;\n\tfailedCount: number;\n\tsupersededCount: number;\n\tobsoleteCount: number;\n\tdurationMs: number;\n}\n\nexport interface ProcessDueMediaUsageWorkOptions {\n\tactivationKnownActive?: boolean;\n}\n\nexport async function processMediaUsageWorkAfterWrite(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcontentId: string,\n): Promise<MediaUsageWorkProcessingResult> {\n\tif (!(await isIncrementalCaptureActive(db))) {\n\t\treturn { outcome: \"inactive\", claimed: false };\n\t}\n\n\tawait new MediaUsageRepository(db).recoverIncrementalFinalizations();\n\tconst repo = new MediaUsageWorkRepository(db);\n\tconst work = await repo.findWorkForContent(collectionSlug, contentId);\n\tif (!work) return { outcome: \"not_due\", claimed: false };\n\tconst claimed = await repo.claimWork({\n\t\tcollectionId: work.collectionId,\n\t\tcontentId: work.contentId,\n\t\tworkVersion: work.workVersion,\n\t\tleaseDurationSeconds: MEDIA_USAGE_WORK_PROCESSING_LIMITS.leaseDurationSeconds,\n\t});\n\tif (!claimed) return { outcome: \"claim_lost\", claimed: false };\n\ttry {\n\t\tconst processed = await runClaimedBatch(db, [claimed]);\n\t\treturn processed.get(workResultKey(claimed)) ?? { outcome: \"claim_lost\", claimed: false };\n\t} catch (error) {\n\t\tconst transitioned = await repo.retryClaimedWorkBatch({\n\t\t\twork: [workLease(claimed)],\n\t\t\terrorCode: \"MEDIA_USAGE_PROCESSING_FAILED\",\n\t\t\tretryDelaySeconds: MEDIA_USAGE_WORK_PROCESSING_LIMITS.retryBaseSeconds,\n\t\t\tmaxAttempts: MEDIA_USAGE_WORK_PROCESSING_LIMITS.maxAttempts,\n\t\t});\n\t\tconst outcome = transitioned.get(workIdentityKey(claimed)) ?? \"superseded\";\n\t\tif (outcome === \"failed\") {\n\t\t\tawait new MediaUsageRepository(db).recordIncrementalFailure({\n\t\t\t\tcollectionId: claimed.collectionId,\n\t\t\t\tcollectionSlug: claimed.collectionSlug,\n\t\t\t\tcontentId: claimed.contentId,\n\t\t\t\tworkVersion: claimed.workVersion,\n\t\t\t\terrorCode: \"MEDIA_USAGE_PROCESSING_FAILED\",\n\t\t\t});\n\t\t}\n\t\tconsole.error(\"[media-usage:work] Immediate processing failed:\", error);\n\t\treturn { outcome, claimed: true };\n\t}\n}\n\nexport async function processDueMediaUsageWork(\n\tdb: Kysely<Database>,\n\toptions: ProcessDueMediaUsageWorkOptions = {},\n): Promise<MediaUsageWorkTickResult> {\n\tconst startedAt = Date.now();\n\tconst result: MediaUsageWorkTickResult = {\n\t\tcandidateCount: 0,\n\t\tclaimedCount: 0,\n\t\tcompletedCount: 0,\n\t\tretryCount: 0,\n\t\tfailedCount: 0,\n\t\tsupersededCount: 0,\n\t\tobsoleteCount: 0,\n\t\tdurationMs: 0,\n\t};\n\n\tif (!options.activationKnownActive && !(await isIncrementalCaptureActive(db))) {\n\t\tresult.durationMs = Date.now() - startedAt;\n\t\treturn result;\n\t}\n\n\tawait new MediaUsageRepository(db).recoverIncrementalFinalizations();\n\tconst repo = new MediaUsageWorkRepository(db);\n\tconst candidates = await repo.claimDueWorkBatch({\n\t\tlimit: MEDIA_USAGE_WORK_PROCESSING_LIMITS.candidatesPerTick,\n\t\tleaseDurationSeconds: MEDIA_USAGE_WORK_PROCESSING_LIMITS.leaseDurationSeconds,\n\t});\n\tresult.candidateCount =\n\t\tcandidates.length > 0 || !(await repo.hasNonterminalWork()) ? candidates.length : 1;\n\n\tconst processedBatch = await processClaimedCollections(db, candidates);\n\tfor (const candidate of candidates) {\n\t\tconst processed = processedBatch.get(workResultKey(candidate)) ?? {\n\t\t\toutcome: \"claim_lost\" as const,\n\t\t\tclaimed: false,\n\t\t};\n\t\tif (processed.claimed) result.claimedCount++;\n\t\tif (processed.outcome === \"completed\") result.completedCount++;\n\t\tif (processed.outcome === \"retry\") result.retryCount++;\n\t\tif (processed.outcome === \"failed\") result.failedCount++;\n\t\tif (processed.outcome === \"superseded\") result.supersededCount++;\n\t\tif (processed.outcome === \"obsolete\") result.obsoleteCount++;\n\t}\n\n\tresult.durationMs = Date.now() - startedAt;\n\treturn result;\n}\n\nasync function processClaimedCollections(\n\tdb: Kysely<Database>,\n\tcandidates: readonly MediaUsageWorkRecord[],\n): Promise<Map<string, MediaUsageWorkProcessingResult>> {\n\tconst processed = new Map<string, MediaUsageWorkProcessingResult>();\n\tconst byCollection = new Map<string, MediaUsageWorkRecord[]>();\n\tfor (const candidate of candidates) {\n\t\tconst key = collectionResultKey(candidate);\n\t\tconst collection = byCollection.get(key) ?? [];\n\t\tcollection.push(candidate);\n\t\tbyCollection.set(key, collection);\n\t}\n\tfor (const collection of byCollection.values()) {\n\t\ttry {\n\t\t\tfor (const [key, result] of await runClaimedBatch(db, collection)) {\n\t\t\t\tprocessed.set(key, result);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const [key, result] of await retryFailedClaimedCollection(db, collection)) {\n\t\t\t\tprocessed.set(key, result);\n\t\t\t}\n\t\t\tconsole.error(\"[media-usage:work] Collection processing failed:\", error);\n\t\t}\n\t}\n\treturn processed;\n}\n\nasync function retryFailedClaimedCollection(\n\tdb: Kysely<Database>,\n\tcandidates: readonly MediaUsageWorkRecord[],\n): Promise<Map<string, MediaUsageWorkProcessingResult>> {\n\tconst transitioned = await new MediaUsageWorkRepository(db).retryClaimedWorkBatch({\n\t\twork: candidates.map(workLease),\n\t\terrorCode: \"MEDIA_USAGE_PROCESSING_FAILED\",\n\t\tretryDelaySeconds: MEDIA_USAGE_WORK_PROCESSING_LIMITS.retryBaseSeconds,\n\t\tmaxAttempts: MEDIA_USAGE_WORK_PROCESSING_LIMITS.maxAttempts,\n\t});\n\tconst processed = new Map<string, MediaUsageWorkProcessingResult>();\n\tconst failedCollectionIds = new Set<string>();\n\tfor (const candidate of candidates) {\n\t\tconst state = transitioned.get(workIdentityKey(candidate));\n\t\tif (state === \"failed\") failedCollectionIds.add(candidate.collectionId);\n\t\tprocessed.set(workResultKey(candidate), {\n\t\t\toutcome: state ?? \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t}\n\tawait new MediaUsageRepository(db).recordIncrementalFailuresByCollection({\n\t\tcollectionIds: [...failedCollectionIds],\n\t\terrorCode: \"MEDIA_USAGE_PROCESSING_FAILED\",\n\t});\n\treturn processed;\n}\n\nasync function runClaimedBatch(\n\tdb: Kysely<Database>,\n\tcandidates: readonly MediaUsageWorkRecord[],\n): Promise<Map<string, MediaUsageWorkProcessingResult>> {\n\treturn isPostgres(db)\n\t\t? withTransaction(db, (trx) =>\n\t\t\t\tprocessClaimedBatch(trx, new MediaUsageWorkRepository(trx), candidates),\n\t\t\t)\n\t\t: processClaimedBatch(db, new MediaUsageWorkRepository(db), candidates);\n}\n\nasync function processClaimedBatch(\n\tdb: Kysely<Database>,\n\trepo: MediaUsageWorkRepository,\n\tcandidates: readonly MediaUsageWorkRecord[],\n): Promise<Map<string, MediaUsageWorkProcessingResult>> {\n\tconst results = new Map<string, MediaUsageWorkProcessingResult>();\n\tconst locked = await repo.lockClaimedWorkBatch(candidates.map(workLease));\n\tconst owned: MediaUsageWorkRecord[] = [];\n\tfor (const candidate of candidates) {\n\t\tif (locked.has(workIdentityKey(candidate))) owned.push(candidate);\n\t\telse {\n\t\t\tresults.set(workResultKey(candidate), { outcome: \"superseded\", claimed: true });\n\t\t}\n\t}\n\tconst currentCollections = await findCurrentCollectionIdentities(db, owned);\n\tconst current: MediaUsageWorkRecord[] = [];\n\tconst obsolete: MediaUsageWorkRecord[] = [];\n\tfor (const candidate of owned) {\n\t\tif (currentCollections.has(collectionResultKey(candidate))) current.push(candidate);\n\t\telse obsolete.push(candidate);\n\t}\n\n\tconst obsoleteCompleted = await repo.completeWorkBatch(obsolete.map(workLease));\n\tfor (const candidate of obsolete) {\n\t\tresults.set(workResultKey(candidate), {\n\t\t\toutcome: obsoleteCompleted.has(workIdentityKey(candidate)) ? \"obsolete\" : \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t}\n\tif (current.length === 0) return results;\n\n\tconst refreshes = await refreshContentMediaUsageForWorkBatch(db, current, {\n\t\tshouldContinue: canContinueBulkWork,\n\t});\n\tconst successful: MediaUsageWorkRecord[] = [];\n\tconst unstarted: MediaUsageWorkRecord[] = [];\n\tconst failedRefreshes: Array<{\n\t\tcandidate: MediaUsageWorkRecord;\n\t\trefresh: ContentMediaUsageRefreshResult;\n\t}> = [];\n\tfor (const candidate of current) {\n\t\tconst refresh = refreshes.get(contentRefreshKey(candidate.collectionId, candidate.contentId));\n\t\tif (refresh?.success) successful.push(candidate);\n\t\telse if (!refresh) unstarted.push(candidate);\n\t\telse failedRefreshes.push({ candidate, refresh });\n\t}\n\tconst terminalFailureCollections = new Map<string, Set<string>>();\n\tconst failureGroups = new Map<\n\t\tstring,\n\t\t{\n\t\t\terrorCode: string;\n\t\t\tretryDelaySeconds: number;\n\t\t\tterminal: boolean;\n\t\t\tcandidates: MediaUsageWorkRecord[];\n\t\t}\n\t>();\n\tfor (const failure of failedRefreshes) {\n\t\tconst errorCode = processingErrorCode(failure.refresh.errorCode);\n\t\tconst terminal =\n\t\t\terrorCode === \"MEDIA_USAGE_RESOURCE_LIMIT\" ||\n\t\t\tfailure.candidate.attemptCount + 1 >= MEDIA_USAGE_WORK_PROCESSING_LIMITS.maxAttempts;\n\t\tconst delay = retryDelaySeconds(failure.candidate.attemptCount);\n\t\tconst key = `${errorCode}\\u0000${terminal ? \"terminal\" : String(delay)}`;\n\t\tconst group = failureGroups.get(key) ?? {\n\t\t\terrorCode,\n\t\t\tretryDelaySeconds: delay,\n\t\t\tterminal,\n\t\t\tcandidates: [],\n\t\t};\n\t\tgroup.candidates.push(failure.candidate);\n\t\tfailureGroups.set(key, group);\n\t}\n\tfor (const group of failureGroups.values()) {\n\t\tconst transitioned = await repo.retryClaimedWorkBatch({\n\t\t\twork: group.candidates.map(workLease),\n\t\t\terrorCode: group.errorCode,\n\t\t\tretryDelaySeconds: group.retryDelaySeconds,\n\t\t\tmaxAttempts: group.terminal ? 1 : MEDIA_USAGE_WORK_PROCESSING_LIMITS.maxAttempts,\n\t\t});\n\t\tfor (const candidate of group.candidates) {\n\t\t\tconst state = transitioned.get(workIdentityKey(candidate));\n\t\t\tif (state === \"failed\") {\n\t\t\t\tconst collections = terminalFailureCollections.get(group.errorCode) ?? new Set<string>();\n\t\t\t\tcollections.add(candidate.collectionId);\n\t\t\t\tterminalFailureCollections.set(group.errorCode, collections);\n\t\t\t}\n\t\t\tresults.set(workResultKey(candidate), {\n\t\t\t\toutcome: state ?? \"superseded\",\n\t\t\t\tclaimed: true,\n\t\t\t});\n\t\t}\n\t}\n\tfor (const [errorCode, collectionIds] of terminalFailureCollections) {\n\t\tawait new MediaUsageRepository(db).recordIncrementalFailuresByCollection({\n\t\t\tcollectionIds: [...collectionIds],\n\t\t\terrorCode,\n\t\t});\n\t}\n\tconst released = await repo.releaseClaimedWorkBatch(unstarted.map(workLease));\n\tfor (const candidate of unstarted) {\n\t\tresults.set(workResultKey(candidate), {\n\t\t\toutcome: released.has(workIdentityKey(candidate)) ? \"not_due\" : \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t}\n\n\tconst usage = new MediaUsageRepository(db);\n\tconst successfulByCollection = new Map<string, MediaUsageWorkRecord[]>();\n\tfor (const candidate of successful) {\n\t\tconst key = collectionResultKey(candidate);\n\t\tconst collection = successfulByCollection.get(key) ?? [];\n\t\tcollection.push(candidate);\n\t\tsuccessfulByCollection.set(key, collection);\n\t}\n\tconst readyToComplete: MediaUsageWorkRecord[] = [];\n\tconst deferredCompletion: MediaUsageWorkRecord[] = [];\n\tconst lostFinalization: MediaUsageWorkRecord[] = [];\n\tlet pendingFinalizationQueries = 2;\n\tfor (const collection of successfulByCollection.values()) {\n\t\tconst first = collection[0];\n\t\tif (!first) continue;\n\t\tconst metrics = getRequestContext()?.metrics;\n\t\tif (metrics && metrics.dbCount + pendingFinalizationQueries + 4 > 900) {\n\t\t\tdeferredCompletion.push(...collection);\n\t\t\tcontinue;\n\t\t}\n\t\tconst finalization = await usage.prepareIncrementalFinalization({\n\t\t\tcollectionId: first.collectionId,\n\t\t\tcollectionSlug: first.collectionSlug,\n\t\t});\n\t\tif (finalization.outcome !== \"lost\") {\n\t\t\treadyToComplete.push(...collection);\n\t\t\tpendingFinalizationQueries += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tlostFinalization.push(...collection);\n\t\tpendingFinalizationQueries += 2;\n\t}\n\tconst lostTransitions = await repo.retryClaimedWorkBatch({\n\t\twork: lostFinalization.map(workLease),\n\t\terrorCode: \"MEDIA_USAGE_GENERATION_CONFLICT\",\n\t\tretryDelaySeconds: MEDIA_USAGE_WORK_PROCESSING_LIMITS.retryBaseSeconds,\n\t\tmaxAttempts: MEDIA_USAGE_WORK_PROCESSING_LIMITS.maxAttempts,\n\t});\n\tconst lostFailedCollections = new Set<string>();\n\tfor (const candidate of lostFinalization) {\n\t\tconst state = lostTransitions.get(workIdentityKey(candidate));\n\t\tif (state === \"failed\") lostFailedCollections.add(candidate.collectionId);\n\t\tresults.set(workResultKey(candidate), {\n\t\t\toutcome: state ?? \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t}\n\tawait usage.recordIncrementalFailuresByCollection({\n\t\tcollectionIds: [...lostFailedCollections],\n\t\terrorCode: \"MEDIA_USAGE_GENERATION_CONFLICT\",\n\t});\n\tconst deferred = await repo.releaseClaimedWorkBatch(deferredCompletion.map(workLease));\n\tfor (const candidate of deferredCompletion) {\n\t\tresults.set(workResultKey(candidate), {\n\t\t\toutcome: deferred.has(workIdentityKey(candidate)) ? \"not_due\" : \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t}\n\tconst completed = await repo.completeWorkBatch(readyToComplete.map(workLease));\n\tconst completedCollections = new Map<string, MediaUsageWorkRecord>();\n\tfor (const candidate of readyToComplete) {\n\t\tconst didComplete = completed.has(workIdentityKey(candidate));\n\t\tresults.set(workResultKey(candidate), {\n\t\t\toutcome: didComplete ? \"completed\" : \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t\tif (didComplete) completedCollections.set(collectionResultKey(candidate), candidate);\n\t}\n\tfor (const collection of completedCollections.values()) {\n\t\tawait usage.recordIncrementalSuccess({\n\t\t\tcollectionId: collection.collectionId,\n\t\t\tcollectionSlug: collection.collectionSlug,\n\t\t});\n\t}\n\treturn results;\n}\n\nasync function findCurrentCollectionIdentities(\n\tdb: Kysely<Database>,\n\tcandidates: readonly MediaUsageWorkRecord[],\n): Promise<Set<string>> {\n\tconst identities = new Map(\n\t\tcandidates.map((candidate) => [collectionResultKey(candidate), candidate] as const),\n\t);\n\tconst current = new Set<string>();\n\tfor (const batch of chunkCollectionIds(\n\t\tArray.from(identities.values(), (item) => item.collectionId),\n\t)) {\n\t\tconst rows = await db\n\t\t\t.selectFrom(\"_emdash_collections\")\n\t\t\t.select([\"id\", \"slug\"])\n\t\t\t.where(\"id\", \"in\", batch)\n\t\t\t.execute();\n\t\tfor (const row of rows) current.add(`${row.id}\\u0000${row.slug}`);\n\t}\n\treturn current;\n}\n\nfunction workLease(work: MediaUsageWorkRecord) {\n\tif (!work.leaseToken) throw new Error(\"Claimed media usage work requires a lease token\");\n\treturn {\n\t\tcollectionId: work.collectionId,\n\t\tcontentId: work.contentId,\n\t\tworkVersion: work.workVersion,\n\t\tleaseToken: work.leaseToken,\n\t};\n}\n\nfunction workIdentityKey(work: MediaUsageWorkRecord): string {\n\treturn `${work.collectionId}\\u0000${work.contentId}\\u0000${String(work.workVersion)}`;\n}\n\nfunction workResultKey(work: MediaUsageWorkRecord): string {\n\treturn workIdentityKey(work);\n}\n\nfunction collectionResultKey(work: Pick<MediaUsageWorkRecord, \"collectionId\" | \"collectionSlug\">) {\n\treturn `${work.collectionId}\\u0000${work.collectionSlug}`;\n}\n\nfunction chunkCollectionIds(ids: readonly string[]): string[][] {\n\tconst unique = [...new Set(ids)];\n\tconst batches: string[][] = [];\n\tfor (let index = 0; index < unique.length; index += 50) {\n\t\tbatches.push(unique.slice(index, index + 50));\n\t}\n\treturn batches;\n}\n\nfunction canContinueBulkWork(): boolean {\n\tconst metrics = getRequestContext()?.metrics;\n\treturn !metrics || metrics.dbCount + 150 <= 900;\n}\n\nasync function isIncrementalCaptureActive(db: Kysely<Database>): Promise<boolean> {\n\tconst row = 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\treturn row?.state === \"active\";\n}\n\nfunction retryDelaySeconds(attemptCount: number): number {\n\tconst exponential = Math.min(\n\t\tMEDIA_USAGE_WORK_PROCESSING_LIMITS.retryMaxSeconds,\n\t\tMEDIA_USAGE_WORK_PROCESSING_LIMITS.retryBaseSeconds * 2 ** attemptCount,\n\t);\n\tconst jitter = Math.floor(\n\t\texponential * MEDIA_USAGE_WORK_PROCESSING_LIMITS.retryJitterRatio * Math.random(),\n\t);\n\treturn Math.min(MEDIA_USAGE_WORK_PROCESSING_LIMITS.retryMaxSeconds, exponential + jitter);\n}\n\nfunction processingErrorCode(errorCode: ContentMediaUsageRefreshErrorCode | undefined): string {\n\tif (\n\t\terrorCode === \"DRAFT_REVISION_NOT_FOUND\" ||\n\t\terrorCode === \"DRAFT_REVISION_MISMATCH\" ||\n\t\terrorCode === \"DRAFT_REVISION_INVALID\"\n\t) {\n\t\treturn \"MEDIA_USAGE_SNAPSHOT_FAILED\";\n\t}\n\tif (errorCode === \"CONTENT_USAGE_GENERATION_CONFLICT\") {\n\t\treturn \"MEDIA_USAGE_GENERATION_CONFLICT\";\n\t}\n\tif (errorCode === \"CONTENT_USAGE_RESOURCE_LIMIT\") return \"MEDIA_USAGE_RESOURCE_LIMIT\";\n\treturn \"MEDIA_USAGE_PROCESSING_FAILED\";\n}\n","import type { Kysely } from \"kysely\";\n\nimport type { Database } from \"../../database/types.js\";\nimport { getRequestContext } from \"../../request-context.js\";\nimport {\n\tcontinueMediaUsageActivation,\n\tMEDIA_USAGE_ACTIVATION_RUNTIME_GENERATION,\n\tMediaUsageActivationVersionMismatchError,\n} from \"./activation.js\";\nimport { processDueMediaUsageCollectionDeletions } from \"./collection-deletion-processor.js\";\nimport { processDueMediaUsageReconciliationDetailed } from \"./reconciliation-processor.js\";\nimport { MediaUsageReconciliationRepository } from \"./reconciliation.js\";\nimport { processDueMediaUsageWork } from \"./work-processor.js\";\n\ntype MediaUsageMaintenanceTaskClass = \"entry_work\" | \"collection_deletion\" | \"reconciliation\";\n\nexport type MediaUsageMaintenanceContinuation =\n\t| { kind: \"none\" }\n\t| { kind: \"immediate\" }\n\t| { kind: \"delayed\"; delaySeconds: 30 };\n\nexport interface MediaUsageMaintenanceStepResult {\n\tstate: \"inactive\" | \"idle\" | \"blocked\" | \"progress\";\n\tcontinuation: MediaUsageMaintenanceContinuation;\n}\n\nexport const MEDIA_USAGE_MAINTENANCE_LIMITS = Object.freeze({\n\teventQueryCeiling: 900,\n\tmaxStepQueries: 150,\n});\n\nconst TASK_CLASSES: readonly MediaUsageMaintenanceTaskClass[] = [\n\t\"collection_deletion\",\n\t\"entry_work\",\n\t\"reconciliation\",\n];\n\nexport async function runMediaUsageMaintenanceStep(\n\tdb: Kysely<Database>,\n): Promise<MediaUsageMaintenanceStepResult> {\n\tconst activation = await db\n\t\t.selectFrom(\"_emdash_media_usage_activation\")\n\t\t.select([\"state\", \"runtime_generation\"])\n\t\t.where(\"task_key\", \"=\", \"incremental_capture\")\n\t\t.executeTakeFirst();\n\tif (\n\t\tactivation?.state !== \"active\" ||\n\t\tactivation.runtime_generation !== MEDIA_USAGE_ACTIVATION_RUNTIME_GENERATION\n\t) {\n\t\treturn runActivationStep(db);\n\t}\n\tlet blocked = false;\n\tlet blockedReconciliation = false;\n\tlet madeProgress = false;\n\n\tfor (const taskClass of TASK_CLASSES) {\n\t\tconst metrics = getRequestContext()?.metrics;\n\t\tif (metrics && !canStartMediaUsageMaintenanceStep(metrics)) {\n\t\t\treturn madeProgress\n\t\t\t\t? {\n\t\t\t\t\t\tstate: \"progress\",\n\t\t\t\t\t\tcontinuation: { kind: \"immediate\" },\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tstate: \"blocked\",\n\t\t\t\t\t\tcontinuation: { kind: \"immediate\" },\n\t\t\t\t\t};\n\t\t}\n\t\tconst outcome = await runTaskClass(db, taskClass);\n\t\tif (outcome === \"inactive\") return inactiveResult();\n\t\tif (outcome === \"progress\") madeProgress = true;\n\t\tif (outcome === \"blocked\") {\n\t\t\tblocked = true;\n\t\t\tif (taskClass === \"reconciliation\") blockedReconciliation = true;\n\t\t}\n\t}\n\tif (madeProgress) {\n\t\treturn {\n\t\t\tstate: \"progress\",\n\t\t\tcontinuation: { kind: \"immediate\" },\n\t\t};\n\t}\n\n\tif (\n\t\tblockedReconciliation &&\n\t\t(await new MediaUsageReconciliationRepository(db).wakeDrainedBarrierCandidate())\n\t) {\n\t\treturn {\n\t\t\tstate: \"progress\",\n\t\t\tcontinuation: { kind: \"immediate\" },\n\t\t};\n\t}\n\n\tif (blocked) {\n\t\treturn {\n\t\t\tstate: \"blocked\",\n\t\t\tcontinuation: { kind: \"delayed\", delaySeconds: 30 },\n\t\t};\n\t}\n\n\treturn {\n\t\tstate: \"idle\",\n\t\tcontinuation: { kind: \"none\" },\n\t};\n}\n\nasync function runActivationStep(db: Kysely<Database>): Promise<MediaUsageMaintenanceStepResult> {\n\ttry {\n\t\tconst result = await continueMediaUsageActivation(db);\n\t\tif (result.outcome === \"activating\" || result.outcome === \"active\") {\n\t\t\treturn {\n\t\t\t\tstate: \"progress\",\n\t\t\t\tcontinuation: { kind: \"immediate\" },\n\t\t\t};\n\t\t}\n\t\tif (result.outcome === \"lease_active\" || result.outcome === \"conflict\") {\n\t\t\treturn {\n\t\t\t\tstate: \"blocked\",\n\t\t\t\tcontinuation: { kind: \"delayed\", delaySeconds: 30 },\n\t\t\t};\n\t\t}\n\t\treturn inactiveResult();\n\t} catch (error) {\n\t\tif (error instanceof MediaUsageActivationVersionMismatchError) return inactiveResult();\n\t\tthrow error;\n\t}\n}\n\nasync function runTaskClass(\n\tdb: Kysely<Database>,\n\ttaskClass: MediaUsageMaintenanceTaskClass,\n): Promise<\"inactive\" | \"idle\" | \"blocked\" | \"progress\"> {\n\tif (taskClass === \"entry_work\") {\n\t\tconst result = await processDueMediaUsageWork(db, {\n\t\t\tactivationKnownActive: true,\n\t\t});\n\t\tif (result.claimedCount > 0) return \"progress\";\n\t\treturn result.candidateCount > 0 ? \"blocked\" : \"idle\";\n\t}\n\tif (taskClass === \"collection_deletion\") {\n\t\tconst result = await processDueMediaUsageCollectionDeletions(db);\n\t\tif (result.claimedCount > 0) return \"progress\";\n\t\treturn result.candidateCount > 0 ? \"blocked\" : \"idle\";\n\t}\n\n\tconst result = await processDueMediaUsageReconciliationDetailed(db, {\n\t\tactivationKnownActive: true,\n\t});\n\tif (result.outcome === \"inactive\") return \"inactive\";\n\tif (result.consumedUnit) return \"progress\";\n\treturn result.outcome === \"claim_lost\" || result.hasDeferredCandidate ? \"blocked\" : \"idle\";\n}\n\nfunction inactiveResult(): MediaUsageMaintenanceStepResult {\n\treturn {\n\t\tstate: \"inactive\",\n\t\tcontinuation: { kind: \"none\" },\n\t};\n}\n\nfunction canStartMediaUsageMaintenanceStep(metrics: { dbCount: number }): boolean {\n\treturn (\n\t\tmetrics.dbCount + MEDIA_USAGE_MAINTENANCE_LIMITS.maxStepQueries <=\n\t\tMEDIA_USAGE_MAINTENANCE_LIMITS.eventQueryCeiling\n\t);\n}\n","import type { Kysely } from \"kysely\";\n\nimport {\n\tMediaUsageRepository,\n\ttype MediaUsageCollectionIndexStatusScope,\n\ttype MediaUsageEntryGroup,\n} from \"../../database/repositories/media-usage.js\";\nimport { MediaRepository } from \"../../database/repositories/media.js\";\nimport { InvalidCursorError } from \"../../database/repositories/types.js\";\nimport type { Database } from \"../../database/types.js\";\nimport {\n\tgetMediaUsageActivationStatus,\n\tMediaUsageActivationVersionMismatchError,\n} from \"../../media/usage/activation.js\";\nimport {\n\tCONTENT_MEDIA_USAGE_ADAPTER_ID,\n\tCONTENT_MEDIA_USAGE_COLLECTION_SCOPE,\n} from \"../../media/usage/content-refresh.js\";\nimport {\n\trepairContentMediaUsageAll,\n\trepairContentMediaUsageCollection,\n\ttype ContentMediaUsageRepairAllResult,\n\ttype ContentMediaUsageRepairCollectionResult,\n} from \"../../media/usage/content-repair.js\";\nimport { CONTENT_SOURCE_SCHEMA_VERSION } from \"../../media/usage/content-snapshots.js\";\nimport {\n\trunMediaUsageMaintenanceStep,\n\ttype MediaUsageMaintenanceContinuation,\n} from \"../../media/usage/maintenance-engine.js\";\nimport {\n\tgroupSiteSettingMediaUsage,\n\tMEDIA_USAGE_SITE_SETTING_OPTIONS,\n\ttype MediaUsageSiteSetting,\n} from \"../../media/usage/site-settings.js\";\nimport { ErrorCode } from \"../errors.js\";\nimport type {\n\tMediaUsageCoverage,\n\tMediaUsageCoverageStatus,\n\tMediaUsageDetailsResponse,\n\tMediaUsageEntryDetail,\n\tMediaUsageOccurrenceDetail,\n\tMediaUsageProgress,\n\tMediaUsageProgressAdvanceResponse,\n\tMediaUsageRepairRequest,\n\tMediaUsageRepairResponse,\n\tMediaUsageSiteSettingDetail,\n\tMediaUsageSummary,\n} from \"../schemas/media-usage.js\";\nimport type { ApiResult } from \"../types.js\";\n\nexport type {\n\tMediaUsageCoverage,\n\tMediaUsageCoverageStatus,\n\tMediaUsageDetailsResponse,\n\tMediaUsageEntryDetail,\n\tMediaUsageOccurrenceDetail,\n\tMediaUsageProgress,\n\tMediaUsageProgressAdvanceResponse,\n\tMediaUsageSourceDetail,\n\tMediaUsageRepairRequest,\n\tMediaUsageRepairResponse,\n\tMediaUsageSiteSettingDetail,\n\tMediaUsageSummary,\n} from \"../schemas/media-usage.js\";\n\ntype ContentMediaUsageRepairResult =\n\t| ContentMediaUsageRepairCollectionResult\n\t| ContentMediaUsageRepairAllResult;\n\nexport async function handleMediaUsageProgress(\n\tdb: Kysely<Database>,\n): Promise<ApiResult<MediaUsageProgress>> {\n\ttry {\n\t\tconst progress = await new MediaUsageRepository(db).findCollectionProgress();\n\t\tif (!progress) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_PROGRESS_NOT_ACTIVE,\n\t\t\t\t\tmessage: \"Media Usage is not active\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn { success: true, data: progress };\n\t} catch (error) {\n\t\tif (error instanceof MediaUsageActivationVersionMismatchError) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,\n\t\t\t\t\tmessage: \"Media Usage activation version does not match this runtime\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconsole.error(\"[media-usage] progress read failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_PROGRESS_READ_ERROR,\n\t\t\t\tmessage: \"Failed to read media usage progress\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport async function handleMediaUsageProgressAdvance(\n\tdb: Kysely<Database>,\n): Promise<ApiResult<MediaUsageProgressAdvanceResponse>> {\n\ttry {\n\t\tconst step = await runMediaUsageMaintenanceStep(db);\n\t\tconst activation = await getMediaUsageActivationStatus(db);\n\t\tif (activation.state === \"expanded\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_PROGRESS_NOT_ACTIVE,\n\t\t\t\t\tmessage: \"Media Usage activation has not started\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst progress =\n\t\t\tactivation.state === \"active\"\n\t\t\t\t? await new MediaUsageRepository(db).findCollectionProgress()\n\t\t\t\t: null;\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\tactivation,\n\t\t\t\tprogress,\n\t\t\t\tnextRequestInMs: continuationDelayMs(step.continuation, progress),\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof MediaUsageActivationVersionMismatchError) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,\n\t\t\t\t\tmessage: \"Media Usage activation version does not match this runtime\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconsole.error(\"[media-usage] progress advance failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_PROGRESS_ADVANCE_ERROR,\n\t\t\t\tmessage: \"Failed to advance media usage progress\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nfunction continuationDelayMs(\n\tcontinuation: MediaUsageMaintenanceContinuation,\n\tprogress: MediaUsageProgress | null,\n): 0 | 30_000 | null {\n\tif (progress?.status === \"needs_attention\") return null;\n\tif (continuation.kind === \"immediate\") return 0;\n\tif (continuation.kind === \"delayed\") return 30_000;\n\tif (progress?.status === \"indexing\") return 0;\n\treturn null;\n}\n\nexport function aggregateMediaUsageCoverageStatus(\n\tscopes: readonly MediaUsageCollectionIndexStatusScope[],\n): MediaUsageCoverageStatus {\n\tconst statuses = scopes.map(normalizeMediaUsageCoverageStatus);\n\tif (statuses.every((status) => status === \"complete\")) {\n\t\treturn \"complete\";\n\t}\n\tif (statuses.includes(\"unknown\")) return \"unknown\";\n\tif (statuses.includes(\"running\")) return \"running\";\n\tif (statuses.includes(\"stale\")) return \"stale\";\n\tif (statuses.includes(\"partial\")) return \"partial\";\n\tif (statuses.every((status) => status === \"never\")) return \"never\";\n\tif (statuses.every((status) => status === \"failed\")) return \"failed\";\n\treturn \"partial\";\n}\n\nexport async function handleMediaUsageSummaries(\n\tdb: Kysely<Database>,\n\tmediaIds: readonly string[],\n\toptions: { includeCount: boolean },\n): Promise<ApiResult<Record<string, MediaUsageSummary>>> {\n\tif (mediaIds.length === 0) return { success: true, data: {} };\n\n\ttry {\n\t\tconst repository = new MediaUsageRepository(db);\n\t\tconst { coverage, siteSettings } = await loadMediaUsageCoverage(repository);\n\t\tconst counts =\n\t\t\toptions.includeCount && coverage.status === \"complete\"\n\t\t\t\t? await repository.findActiveEntryCountsByMediaIds(mediaIds)\n\t\t\t\t: null;\n\t\tconst summaries: Record<string, MediaUsageSummary> = {};\n\n\t\tfor (const mediaId of new Set(mediaIds)) {\n\t\t\tsummaries[mediaId] = {\n\t\t\t\tcount: counts\n\t\t\t\t\t? (counts.get(mediaId) ?? 0) + (siteSettings.get(mediaId)?.length ?? 0)\n\t\t\t\t\t: null,\n\t\t\t\tcoverage,\n\t\t\t};\n\t\t}\n\n\t\treturn { success: true, data: summaries };\n\t} catch (error) {\n\t\tconsole.error(\"[media-usage] summary read failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_READ_ERROR,\n\t\t\t\tmessage: \"Failed to read media usage\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport async function handleMediaUsageDetails(\n\tdb: Kysely<Database>,\n\tmediaId: string,\n\toptions: { cursor?: string; limit?: number },\n): Promise<ApiResult<MediaUsageDetailsResponse>> {\n\ttry {\n\t\tconst media = await new MediaRepository(db).findById(mediaId);\n\t\tif (!media) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.NOT_FOUND,\n\t\t\t\t\tmessage: `Media item not found: ${mediaId}`,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst repository = new MediaUsageRepository(db);\n\t\tconst { coverage, siteSettings } = await loadMediaUsageCoverage(repository);\n\t\tconst page = await repository.findCurrentEntryUsagePageByMediaId(mediaId, options);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\titems: page.items.map(toMediaUsageEntryDetail),\n\t\t\t\t...(page.nextCursor ? { nextCursor: page.nextCursor } : {}),\n\t\t\t\tsiteSettings: (siteSettings.get(mediaId) ?? []).map(\n\t\t\t\t\t(setting): MediaUsageSiteSettingDetail => ({ setting }),\n\t\t\t\t),\n\t\t\t\tcoverage,\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof InvalidCursorError) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: { code: ErrorCode.INVALID_CURSOR, message: error.message },\n\t\t\t};\n\t\t}\n\t\tconsole.error(\"[media-usage] detail read failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_READ_ERROR,\n\t\t\t\tmessage: \"Failed to read media usage\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport async function handleMediaUsageRepair(\n\tdb: Kysely<Database>,\n\tinput: MediaUsageRepairRequest,\n): Promise<ApiResult<MediaUsageRepairResponse>> {\n\ttry {\n\t\tlet result: ContentMediaUsageRepairResult;\n\t\tif (input.scope === \"collection\") {\n\t\t\tresult = await repairContentMediaUsageCollection(db, { collectionSlug: input.collection });\n\t\t} else if (input.scope === \"all\") {\n\t\t\tresult = await repairContentMediaUsageAll(db);\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.VALIDATION_ERROR,\n\t\t\t\t\tmessage: \"Invalid media usage repair request\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn { success: true, data: toMediaUsageRepairResponse(result) };\n\t} catch (error) {\n\t\tconsole.error(\"[media-usage] repair failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_REPAIR_ERROR,\n\t\t\t\tmessage: \"Failed to repair media usage\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport function toMediaUsageRepairResponse(\n\tresult: ContentMediaUsageRepairResult,\n): MediaUsageRepairResponse {\n\tconst collections = \"collections\" in result ? result.collections : [result];\n\n\treturn {\n\t\tstatus: result.status,\n\t\tindexedSourceCount: result.indexedSourceCount,\n\t\tfailedSourceCount: result.failedSourceCount,\n\t\tskippedSourceCount: result.skippedSourceCount,\n\t\tdeletedSourceCount: result.deletedSourceCount,\n\t\tcollections: collections.map(toMediaUsageRepairCollectionSummary),\n\t};\n}\n\nfunction toMediaUsageRepairCollectionSummary(result: ContentMediaUsageRepairCollectionResult) {\n\treturn {\n\t\tcollection: result.scope.scopeKey,\n\t\tstatus: result.status,\n\t\tindexedSourceCount: result.indexedSourceCount,\n\t\tfailedSourceCount: result.failedSourceCount,\n\t\tskippedSourceCount: result.skippedSourceCount,\n\t\tdeletedSourceCount: result.deletedSourceCount,\n\t\tlastErrorCode: result.lastErrorCode,\n\t\tstartedAt: result.startedAt,\n\t\tcompletedAt: result.completedAt,\n\t};\n}\n\nfunction normalizeMediaUsageCoverageStatus(\n\tscope: MediaUsageCollectionIndexStatusScope,\n): MediaUsageCoverageStatus {\n\tif (scope.status === null) return \"never\";\n\tif (scope.status === \"complete\") {\n\t\tif (scope.reconciliationRequired) return \"stale\";\n\t\treturn scope.schemaVersion === CONTENT_SOURCE_SCHEMA_VERSION ? \"complete\" : \"stale\";\n\t}\n\tif (\n\t\tscope.status === \"never\" ||\n\t\tscope.status === \"running\" ||\n\t\tscope.status === \"partial\" ||\n\t\tscope.status === \"failed\" ||\n\t\tscope.status === \"stale\"\n\t) {\n\t\treturn scope.status;\n\t}\n\treturn \"unknown\";\n}\n\nasync function loadMediaUsageCoverage(repository: MediaUsageRepository): Promise<{\n\tcoverage: MediaUsageCoverage;\n\tsiteSettings: Map<string, MediaUsageSiteSetting[]>;\n}> {\n\tconst { scopes, options } = await repository.findCoverageWithOptions(\n\t\t{\n\t\t\tadapterId: CONTENT_MEDIA_USAGE_ADAPTER_ID,\n\t\t\tscopeType: CONTENT_MEDIA_USAGE_COLLECTION_SCOPE,\n\t\t},\n\t\tMEDIA_USAGE_SITE_SETTING_OPTIONS,\n\t);\n\treturn {\n\t\tcoverage: {\n\t\t\tscope: \"all_content_collections\",\n\t\t\tstatus: aggregateMediaUsageCoverageStatus(scopes),\n\t\t},\n\t\tsiteSettings: groupSiteSettingMediaUsage(options),\n\t};\n}\n\nfunction toMediaUsageEntryDetail(group: MediaUsageEntryGroup): MediaUsageEntryDetail {\n\tconst preferred =\n\t\tgroup.sources.find(({ source }) => source.sourceVariant === \"draft_overlay\") ??\n\t\tgroup.sources.find(({ source }) => source.sourceVariant === \"columns\");\n\tif (!preferred) {\n\t\tthrow new Error(\"Media usage entry has no supported source\");\n\t}\n\n\treturn {\n\t\tcollection: group.collectionSlug,\n\t\tcontentId: group.contentId,\n\t\ttitle: preferred.source.contentTitle,\n\t\tslug: preferred.source.contentSlug,\n\t\tlocale: preferred.source.locale,\n\t\tstatus: preferred.source.contentStatus,\n\t\tscheduledAt: preferred.source.contentScheduledAt,\n\t\tdeletedAt: group.contentDeletedAt,\n\t\tsources: group.sources.flatMap(({ source, occurrences }) => {\n\t\t\tif (source.sourceVariant !== \"columns\" && source.sourceVariant !== \"draft_overlay\") {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tvariant: source.sourceVariant,\n\t\t\t\t\toccurrences: occurrences.map((occurrence) => ({\n\t\t\t\t\t\tfieldSlug: occurrence.fieldSlug,\n\t\t\t\t\t\tfieldPath: occurrence.fieldPath,\n\t\t\t\t\t\toccurrenceIndex: occurrence.occurrenceIndex,\n\t\t\t\t\t\treferenceType: normalizeMediaUsageReferenceType(occurrence.referenceType),\n\t\t\t\t\t})),\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t};\n}\n\nfunction normalizeMediaUsageReferenceType(\n\treferenceType: string,\n): MediaUsageOccurrenceDetail[\"referenceType\"] {\n\tif (\n\t\treferenceType === \"image_field\" ||\n\t\treferenceType === \"file_field\" ||\n\t\treferenceType === \"portable_text_image\"\n\t) {\n\t\treturn referenceType;\n\t}\n\treturn \"unknown\";\n}\n"],"mappings":"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"}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { n as MediaUsageActivationVersionMismatchError, r as activateMediaUsageCapture, s as getMediaUsageActivationStatus } from "./activation-LOkDM5WT.mjs";
|
|
2
|
-
import { t as ErrorCode } from "./errors-BF0_LFhW.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/api/handlers/media-usage-activation.ts
|
|
5
|
-
async function handleMediaUsageActivationStatus(db) {
|
|
6
|
-
try {
|
|
7
|
-
return {
|
|
8
|
-
success: true,
|
|
9
|
-
data: await getMediaUsageActivationStatus(db)
|
|
10
|
-
};
|
|
11
|
-
} catch (error) {
|
|
12
|
-
if (error instanceof MediaUsageActivationVersionMismatchError) return {
|
|
13
|
-
success: false,
|
|
14
|
-
error: {
|
|
15
|
-
code: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,
|
|
16
|
-
message: "Media usage activation version is incompatible with this runtime"
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
console.error("[media-usage:activation] status read failed:", error);
|
|
20
|
-
return {
|
|
21
|
-
success: false,
|
|
22
|
-
error: {
|
|
23
|
-
code: ErrorCode.MEDIA_USAGE_ACTIVATION_READ_ERROR,
|
|
24
|
-
message: "Failed to read media usage activation status"
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
async function handleMediaUsageActivationAdvance(db, input) {
|
|
30
|
-
try {
|
|
31
|
-
const result = await activateMediaUsageCapture(db, { writersDrained: input.writersDrained });
|
|
32
|
-
if (result.outcome === "lease_active") return {
|
|
33
|
-
success: false,
|
|
34
|
-
error: {
|
|
35
|
-
code: ErrorCode.MEDIA_USAGE_ACTIVATION_BUSY,
|
|
36
|
-
message: "Media usage activation is already in progress",
|
|
37
|
-
details: { leaseExpiresAt: result.leaseExpiresAt }
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
if (result.outcome === "conflict") return {
|
|
41
|
-
success: false,
|
|
42
|
-
error: {
|
|
43
|
-
code: ErrorCode.MEDIA_USAGE_ACTIVATION_CONFLICT,
|
|
44
|
-
message: "Media usage activation ownership changed"
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
const activation = await getMediaUsageActivationStatus(db);
|
|
48
|
-
if (activation.state === "expanded") throw new Error("Media usage activation did not advance");
|
|
49
|
-
return {
|
|
50
|
-
success: true,
|
|
51
|
-
data: {
|
|
52
|
-
outcome: activation.state,
|
|
53
|
-
processedCollections: result.processedCollections,
|
|
54
|
-
activation
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
} catch (error) {
|
|
58
|
-
if (error instanceof MediaUsageActivationVersionMismatchError) return {
|
|
59
|
-
success: false,
|
|
60
|
-
error: {
|
|
61
|
-
code: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,
|
|
62
|
-
message: "Media usage activation version is incompatible with this runtime"
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
console.error("[media-usage:activation] advance failed:", error);
|
|
66
|
-
return {
|
|
67
|
-
success: false,
|
|
68
|
-
error: {
|
|
69
|
-
code: ErrorCode.MEDIA_USAGE_ACTIVATION_ADVANCE_ERROR,
|
|
70
|
-
message: "Failed to advance media usage activation"
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
//#endregion
|
|
77
|
-
export { handleMediaUsageActivationStatus as n, handleMediaUsageActivationAdvance as t };
|
|
78
|
-
//# sourceMappingURL=media-usage-activation-HKp7zk7W.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media-usage-activation-HKp7zk7W.mjs","names":[],"sources":["../src/api/handlers/media-usage-activation.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\n\nimport type { Database } from \"../../database/types.js\";\nimport {\n\tactivateMediaUsageCapture,\n\tgetMediaUsageActivationStatus,\n\tMediaUsageActivationVersionMismatchError,\n} from \"../../media/usage/activation.js\";\nimport { ErrorCode } from \"../errors.js\";\nimport type {\n\tMediaUsageActivationAdvanceRequest,\n\tMediaUsageActivationAdvanceResponse,\n\tMediaUsageActivationStatus,\n} from \"../schemas/media-usage.js\";\nimport type { ApiResult } from \"../types.js\";\n\nexport async function handleMediaUsageActivationStatus(\n\tdb: Kysely<Database>,\n): Promise<ApiResult<MediaUsageActivationStatus>> {\n\ttry {\n\t\treturn { success: true, data: await getMediaUsageActivationStatus(db) };\n\t} catch (error) {\n\t\tif (error instanceof MediaUsageActivationVersionMismatchError) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,\n\t\t\t\t\tmessage: \"Media usage activation version is incompatible with this runtime\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconsole.error(\"[media-usage:activation] status read failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_READ_ERROR,\n\t\t\t\tmessage: \"Failed to read media usage activation status\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport async function handleMediaUsageActivationAdvance(\n\tdb: Kysely<Database>,\n\tinput: MediaUsageActivationAdvanceRequest,\n): Promise<ApiResult<MediaUsageActivationAdvanceResponse>> {\n\ttry {\n\t\tconst result = await activateMediaUsageCapture(db, {\n\t\t\twritersDrained: input.writersDrained,\n\t\t});\n\t\tif (result.outcome === \"lease_active\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_BUSY,\n\t\t\t\t\tmessage: \"Media usage activation is already in progress\",\n\t\t\t\t\tdetails: { leaseExpiresAt: result.leaseExpiresAt },\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tif (result.outcome === \"conflict\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_CONFLICT,\n\t\t\t\t\tmessage: \"Media usage activation ownership changed\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst activation = await getMediaUsageActivationStatus(db);\n\t\tif (activation.state === \"expanded\") {\n\t\t\tthrow new Error(\"Media usage activation did not advance\");\n\t\t}\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\toutcome: activation.state,\n\t\t\t\tprocessedCollections: result.processedCollections,\n\t\t\t\tactivation,\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof MediaUsageActivationVersionMismatchError) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,\n\t\t\t\t\tmessage: \"Media usage activation version is incompatible with this runtime\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconsole.error(\"[media-usage:activation] advance failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_ADVANCE_ERROR,\n\t\t\t\tmessage: \"Failed to advance media usage activation\",\n\t\t\t},\n\t\t};\n\t}\n}\n"],"mappings":";;;;AAgBA,eAAsB,iCACrB,IACiD;AACjD,KAAI;AACH,SAAO;GAAE,SAAS;GAAM,MAAM,MAAM,8BAA8B,GAAG;GAAE;UAC/D,OAAO;AACf,MAAI,iBAAiB,yCACpB,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT;GACD;AAEF,UAAQ,MAAM,gDAAgD,MAAM;AACpE,SAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT;GACD;;;AAIH,eAAsB,kCACrB,IACA,OAC0D;AAC1D,KAAI;EACH,MAAM,SAAS,MAAM,0BAA0B,IAAI,EAClD,gBAAgB,MAAM,gBACtB,CAAC;AACF,MAAI,OAAO,YAAY,eACtB,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT,SAAS,EAAE,gBAAgB,OAAO,gBAAgB;IAClD;GACD;AAEF,MAAI,OAAO,YAAY,WACtB,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT;GACD;EAGF,MAAM,aAAa,MAAM,8BAA8B,GAAG;AAC1D,MAAI,WAAW,UAAU,WACxB,OAAM,IAAI,MAAM,yCAAyC;AAE1D,SAAO;GACN,SAAS;GACT,MAAM;IACL,SAAS,WAAW;IACpB,sBAAsB,OAAO;IAC7B;IACA;GACD;UACO,OAAO;AACf,MAAI,iBAAiB,yCACpB,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT;GACD;AAEF,UAAQ,MAAM,4CAA4C,MAAM;AAChE,SAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT;GACD"}
|