emdash 0.40.0 → 0.41.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.
Files changed (1258) hide show
  1. package/dist/action-token-CbKDcPJi.mjs +26 -0
  2. package/dist/action-token-CbKDcPJi.mjs.map +1 -0
  3. package/dist/activation-PtniBLt9.mjs +382 -0
  4. package/dist/activation-PtniBLt9.mjs.map +1 -0
  5. package/dist/adapters-C_Tf5x90.d.mts +171 -0
  6. package/dist/adapters-C_Tf5x90.d.mts.map +1 -0
  7. package/dist/allowed-origins-U1z4TdEZ.mjs +116 -0
  8. package/dist/allowed-origins-U1z4TdEZ.mjs.map +1 -0
  9. package/dist/api/route-utils.d.mts +4 -4
  10. package/dist/api/route-utils.mjs +46 -45
  11. package/dist/api/route-utils.mjs.map +1 -1
  12. package/dist/api/schemas/index.d.mts +2 -2
  13. package/dist/api/schemas/index.mjs +10 -10
  14. package/dist/api-CXwQkV_m.mjs +5122 -0
  15. package/dist/api-CXwQkV_m.mjs.map +1 -0
  16. package/dist/api-tokens-89WlohEN.mjs +166 -0
  17. package/dist/api-tokens-89WlohEN.mjs.map +1 -0
  18. package/dist/apply-Do3KNnUk.mjs +1659 -0
  19. package/dist/apply-Do3KNnUk.mjs.map +1 -0
  20. package/dist/approvals-CAX9Yw33.mjs +460 -0
  21. package/dist/approvals-CAX9Yw33.mjs.map +1 -0
  22. package/dist/artifact-fetch-B9W4CEST.mjs +659 -0
  23. package/dist/artifact-fetch-B9W4CEST.mjs.map +1 -0
  24. package/dist/astro/index.d.mts +14 -14
  25. package/dist/astro/index.mjs +26 -30
  26. package/dist/astro/index.mjs.map +1 -1
  27. package/dist/astro/middleware/auth.d.mts +12 -12
  28. package/dist/astro/middleware/auth.mjs +10 -10
  29. package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
  30. package/dist/astro/middleware/redirect.mjs +7 -7
  31. package/dist/astro/middleware/request-context.mjs +3 -3
  32. package/dist/astro/middleware/setup.mjs +1 -1
  33. package/dist/astro/middleware.d.mts +12 -12
  34. package/dist/astro/middleware.d.mts.map +1 -1
  35. package/dist/astro/middleware.mjs +110 -106
  36. package/dist/astro/middleware.mjs.map +1 -1
  37. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +14 -14
  38. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +14 -14
  39. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
  40. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  41. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
  42. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +17 -17
  43. package/dist/astro/routes/api/admin/byline-fields/index.mjs +17 -17
  44. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +17 -17
  45. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +23 -23
  46. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +23 -23
  47. package/dist/astro/routes/api/admin/bylines/index.mjs +23 -23
  48. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -18
  49. package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
  50. package/dist/astro/routes/api/admin/comments/bulk.mjs +17 -17
  51. package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
  52. package/dist/astro/routes/api/admin/comments/index.mjs +17 -17
  53. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
  54. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
  55. package/dist/astro/routes/api/admin/media-usage/activation.mjs +20 -20
  56. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +22 -22
  57. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +22 -22
  58. package/dist/astro/routes/api/admin/media-usage/progress.mjs +25 -25
  59. package/dist/astro/routes/api/admin/media-usage/repair.mjs +31 -31
  60. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +22 -22
  61. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +22 -22
  62. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  63. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  64. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
  65. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
  66. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +72 -68
  67. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  68. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
  69. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +71 -67
  70. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  71. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +72 -68
  72. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  73. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +82 -78
  74. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  75. package/dist/astro/routes/api/admin/plugins/index.mjs +72 -68
  76. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  77. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +5 -5
  78. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -67
  79. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  80. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +81 -77
  81. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  82. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -67
  83. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  84. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +72 -68
  85. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  86. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +83 -79
  87. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  88. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
  89. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +74 -70
  90. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  91. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
  92. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +72 -68
  93. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
  94. package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -67
  95. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  96. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
  97. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -67
  98. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  99. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +5 -5
  100. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -67
  101. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  102. package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
  103. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +40 -40
  104. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +40 -40
  105. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +42 -42
  106. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +42 -42
  107. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +42 -42
  108. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +43 -43
  109. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +43 -43
  110. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +42 -42
  111. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +43 -43
  112. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +44 -44
  113. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +42 -42
  114. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +42 -42
  115. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +44 -44
  116. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +42 -42
  117. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +44 -44
  118. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +42 -42
  119. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +42 -42
  120. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +44 -44
  121. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +42 -42
  122. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +42 -42
  123. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +44 -44
  124. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
  125. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  126. package/dist/astro/routes/api/admin/users/_id_/index.mjs +15 -15
  127. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
  128. package/dist/astro/routes/api/admin/users/index.mjs +14 -14
  129. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
  130. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  131. package/dist/astro/routes/api/auth/invite/complete.mjs +18 -18
  132. package/dist/astro/routes/api/auth/invite/index.mjs +16 -16
  133. package/dist/astro/routes/api/auth/invite/register-options.mjs +17 -17
  134. package/dist/astro/routes/api/auth/logout.mjs +5 -5
  135. package/dist/astro/routes/api/auth/magic-link/send.mjs +18 -18
  136. package/dist/astro/routes/api/auth/magic-link/verify.mjs +14 -14
  137. package/dist/astro/routes/api/auth/me.mjs +15 -15
  138. package/dist/astro/routes/api/auth/mode.mjs +5 -5
  139. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  140. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  141. package/dist/astro/routes/api/auth/passkey/_id_.mjs +14 -14
  142. package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
  143. package/dist/astro/routes/api/auth/passkey/options.mjs +19 -19
  144. package/dist/astro/routes/api/auth/passkey/register/options.mjs +17 -17
  145. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +18 -18
  146. package/dist/astro/routes/api/auth/passkey/verify.mjs +18 -18
  147. package/dist/astro/routes/api/auth/signup/complete.mjs +18 -18
  148. package/dist/astro/routes/api/auth/signup/request.mjs +17 -17
  149. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  150. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
  151. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +18 -18
  152. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  153. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +17 -17
  154. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
  155. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +17 -17
  156. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
  157. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +11 -11
  158. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +31 -31
  159. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +17 -17
  160. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +1 -2
  161. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
  162. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +42 -53
  163. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  164. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +34 -29
  165. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  166. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
  167. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  168. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +17 -17
  169. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +25 -24
  170. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  171. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
  172. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +17 -17
  173. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  174. package/dist/astro/routes/api/content/_collection_/_id_.mjs +18 -18
  175. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  176. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  177. package/dist/astro/routes/api/content/_collection_/index.mjs +15 -15
  178. package/dist/astro/routes/api/content/_collection_/trash.mjs +15 -15
  179. package/dist/astro/routes/api/dashboard.mjs +10 -9
  180. package/dist/astro/routes/api/dashboard.mjs.map +1 -1
  181. package/dist/astro/routes/api/dev/emails.mjs +5 -5
  182. package/dist/astro/routes/api/health.mjs +6 -6
  183. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  184. package/dist/astro/routes/api/import/probe.mjs +23 -23
  185. package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
  186. package/dist/astro/routes/api/import/wordpress/execute.d.mts +13 -13
  187. package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -16
  188. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
  189. package/dist/astro/routes/api/import/wordpress/media.mjs +19 -19
  190. package/dist/astro/routes/api/import/wordpress/prepare.mjs +18 -18
  191. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
  192. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +28 -28
  193. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  194. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +23 -23
  195. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
  196. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +34 -34
  197. package/dist/astro/routes/api/manifest.mjs +6 -6
  198. package/dist/astro/routes/api/mcp.mjs +98 -118
  199. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  200. package/dist/astro/routes/api/media/_id_/confirm.mjs +19 -19
  201. package/dist/astro/routes/api/media/_id_/replace.mjs +16 -16
  202. package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
  203. package/dist/astro/routes/api/media/_id_/usage.mjs +33 -33
  204. package/dist/astro/routes/api/media/_id_.mjs +31 -31
  205. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
  206. package/dist/astro/routes/api/media/file/_...key_.mjs +9 -9
  207. package/dist/astro/routes/api/media/folders/_id_.mjs +16 -16
  208. package/dist/astro/routes/api/media/folders/index.mjs +16 -16
  209. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
  210. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
  211. package/dist/astro/routes/api/media/providers/index.mjs +5 -5
  212. package/dist/astro/routes/api/media/upload-url.mjs +18 -18
  213. package/dist/astro/routes/api/media.mjs +35 -35
  214. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +17 -17
  215. package/dist/astro/routes/api/menus/_name_/items.mjs +17 -17
  216. package/dist/astro/routes/api/menus/_name_/reorder.mjs +17 -17
  217. package/dist/astro/routes/api/menus/_name_/translations.mjs +17 -17
  218. package/dist/astro/routes/api/menus/_name_.mjs +17 -17
  219. package/dist/astro/routes/api/menus/index.mjs +17 -17
  220. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  221. package/dist/astro/routes/api/oauth/device/authorize.d.mts +2 -1
  222. package/dist/astro/routes/api/oauth/device/authorize.d.mts.map +1 -1
  223. package/dist/astro/routes/api/oauth/device/authorize.mjs +23 -9
  224. package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -1
  225. package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
  226. package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
  227. package/dist/astro/routes/api/oauth/register.mjs +5 -5
  228. package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
  229. package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
  230. package/dist/astro/routes/api/oauth/token.mjs +8 -8
  231. package/dist/astro/routes/api/openapi.json.mjs +20 -20
  232. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +11 -11
  233. package/dist/astro/routes/api/redirects/404s/index.mjs +19 -19
  234. package/dist/astro/routes/api/redirects/404s/summary.mjs +19 -19
  235. package/dist/astro/routes/api/redirects/_id_.mjs +19 -19
  236. package/dist/astro/routes/api/redirects/index.mjs +19 -19
  237. package/dist/astro/routes/api/relations/_id_/index.mjs +34 -29
  238. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  239. package/dist/astro/routes/api/relations/index.mjs +36 -31
  240. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  241. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
  242. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -5
  243. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +71 -67
  244. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
  245. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +71 -67
  246. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
  247. package/dist/astro/routes/api/schema/block-types/index.mjs +71 -67
  248. package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
  249. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +73 -69
  250. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  251. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +71 -67
  252. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  253. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +71 -67
  254. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  255. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -67
  256. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  257. package/dist/astro/routes/api/schema/collections/index.mjs +71 -67
  258. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  259. package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -67
  260. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  261. package/dist/astro/routes/api/schema/index.mjs +16 -16
  262. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -67
  263. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  264. package/dist/astro/routes/api/schema/orphans/index.mjs +71 -67
  265. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  266. package/dist/astro/routes/api/search/enable.mjs +19 -19
  267. package/dist/astro/routes/api/search/index.mjs +18 -18
  268. package/dist/astro/routes/api/search/rebuild.mjs +19 -19
  269. package/dist/astro/routes/api/search/stats.mjs +9 -9
  270. package/dist/astro/routes/api/search/suggest.mjs +18 -18
  271. package/dist/astro/routes/api/sections/_slug_.mjs +18 -18
  272. package/dist/astro/routes/api/sections/index.mjs +18 -18
  273. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  274. package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
  275. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  276. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  277. package/dist/astro/routes/api/settings/email.mjs +6 -6
  278. package/dist/astro/routes/api/settings.mjs +21 -21
  279. package/dist/astro/routes/api/setup/admin-verify.mjs +19 -19
  280. package/dist/astro/routes/api/setup/admin.mjs +18 -18
  281. package/dist/astro/routes/api/setup/dev-bypass.mjs +45 -39
  282. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  283. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
  284. package/dist/astro/routes/api/setup/index.d.mts.map +1 -1
  285. package/dist/astro/routes/api/setup/index.mjs +80 -49
  286. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  287. package/dist/astro/routes/api/setup/status.mjs +6 -6
  288. package/dist/astro/routes/api/snapshot.mjs +9 -9
  289. package/dist/astro/routes/api/snapshot.mjs.map +1 -1
  290. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +23 -23
  291. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +23 -23
  292. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +23 -23
  293. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +23 -23
  294. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -22
  295. package/dist/astro/routes/api/taxonomies/_name_.mjs +23 -23
  296. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +36 -35
  297. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
  298. package/dist/astro/routes/api/taxonomies/index.mjs +23 -23
  299. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  300. package/dist/astro/routes/api/typegen.mjs +8 -8
  301. package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
  302. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +19 -19
  303. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
  304. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  305. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  306. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  307. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +16 -16
  308. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +19 -19
  309. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +19 -19
  310. package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
  311. package/dist/astro/routes/api/widget-areas/index.mjs +19 -19
  312. package/dist/astro/routes/api/widget-components.mjs +5 -5
  313. package/dist/astro/routes/robots.txt.mjs +6 -6
  314. package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
  315. package/dist/astro/routes/sitemap.xml.mjs +7 -7
  316. package/dist/astro/types.d.mts +28 -18
  317. package/dist/astro/types.d.mts.map +1 -1
  318. package/dist/audit-CrgmE9LE.mjs +127 -0
  319. package/dist/audit-CrgmE9LE.mjs.map +1 -0
  320. package/dist/auth/providers/github.d.mts +1 -1
  321. package/dist/auth/providers/google.d.mts +1 -1
  322. package/dist/authoritative-records-C2YzIdbu.mjs +5172 -0
  323. package/dist/authoritative-records-C2YzIdbu.mjs.map +1 -0
  324. package/dist/authorize-WgdKF8QY.mjs +49 -0
  325. package/dist/authorize-WgdKF8QY.mjs.map +1 -0
  326. package/dist/backup-Ck8_lMO3.mjs +246 -0
  327. package/dist/backup-Ck8_lMO3.mjs.map +1 -0
  328. package/dist/block-types-BQ90asVI.mjs +132 -0
  329. package/dist/block-types-BQ90asVI.mjs.map +1 -0
  330. package/dist/block-values-ACFqgB1D.mjs +175 -0
  331. package/dist/block-values-ACFqgB1D.mjs.map +1 -0
  332. package/dist/bundle-Db1iNMv_.mjs +667 -0
  333. package/dist/bundle-Db1iNMv_.mjs.map +1 -0
  334. package/dist/byline-BayaYGoj.mjs +909 -0
  335. package/dist/byline-BayaYGoj.mjs.map +1 -0
  336. package/dist/byline-fields-B8HH-35f.mjs +254 -0
  337. package/dist/byline-fields-B8HH-35f.mjs.map +1 -0
  338. package/dist/byline-fields-hMPjf6Eu.mjs +123 -0
  339. package/dist/byline-fields-hMPjf6Eu.mjs.map +1 -0
  340. package/dist/byline-registry-B_EK_TQf.mjs +406 -0
  341. package/dist/byline-registry-B_EK_TQf.mjs.map +1 -0
  342. package/dist/bylines-DFAaFXWi.mjs +214 -0
  343. package/dist/bylines-DFAaFXWi.mjs.map +1 -0
  344. package/dist/bylines-DkIxUxmr.mjs +232 -0
  345. package/dist/bylines-DkIxUxmr.mjs.map +1 -0
  346. package/dist/cache-DkvhQ8XE.mjs +108 -0
  347. package/dist/cache-DkvhQ8XE.mjs.map +1 -0
  348. package/dist/canonical-CcSuuTlH.mjs +174 -0
  349. package/dist/canonical-CcSuuTlH.mjs.map +1 -0
  350. package/dist/capture-triggers-DJEoOTOq.mjs +362 -0
  351. package/dist/capture-triggers-DJEoOTOq.mjs.map +1 -0
  352. package/dist/challenge-store-CvBl81AQ.mjs +51 -0
  353. package/dist/challenge-store-CvBl81AQ.mjs.map +1 -0
  354. package/dist/checksum-CClweQzI.mjs +162 -0
  355. package/dist/checksum-CClweQzI.mjs.map +1 -0
  356. package/dist/chrome-tags-D5caJwwp.mjs +24 -0
  357. package/dist/chrome-tags-D5caJwwp.mjs.map +1 -0
  358. package/dist/chunks-DwBaj8aT.mjs +25 -0
  359. package/dist/chunks-DwBaj8aT.mjs.map +1 -0
  360. package/dist/cli/index.mjs +374 -761
  361. package/dist/cli/index.mjs.map +1 -1
  362. package/dist/client/cf-access.d.mts +1 -1
  363. package/dist/client/index.d.mts +18 -18
  364. package/dist/client/index.mjs +2 -2
  365. package/dist/collection-deletion-CLCdXsnV.mjs +436 -0
  366. package/dist/collection-deletion-CLCdXsnV.mjs.map +1 -0
  367. package/dist/collection-deletion-processor-hNw8x01F.mjs +217 -0
  368. package/dist/collection-deletion-processor-hNw8x01F.mjs.map +1 -0
  369. package/dist/collection-slugs-cache-CUuiduLq.mjs +85 -0
  370. package/dist/collection-slugs-cache-CUuiduLq.mjs.map +1 -0
  371. package/dist/comment-D2uvL63j.mjs +313 -0
  372. package/dist/comment-D2uvL63j.mjs.map +1 -0
  373. package/dist/comment-reaction-DevUuzg4.mjs +85 -0
  374. package/dist/comment-reaction-DevUuzg4.mjs.map +1 -0
  375. package/dist/comments-Cq0s7_hO.mjs +195 -0
  376. package/dist/comments-Cq0s7_hO.mjs.map +1 -0
  377. package/dist/comments-M4EDYAHw.mjs +99 -0
  378. package/dist/comments-M4EDYAHw.mjs.map +1 -0
  379. package/dist/components-CuIGwXMs.mjs +108 -0
  380. package/dist/components-CuIGwXMs.mjs.map +1 -0
  381. package/dist/config-52Ea5IWt.d.mts +39 -0
  382. package/dist/config-52Ea5IWt.d.mts.map +1 -0
  383. package/dist/config-CCz3xOLc.mjs +242 -0
  384. package/dist/config-CCz3xOLc.mjs.map +1 -0
  385. package/dist/config-D3d5Qudq.d.mts +6669 -0
  386. package/dist/config-D3d5Qudq.d.mts.map +1 -0
  387. package/dist/content-CbnufDsM.mjs +2018 -0
  388. package/dist/content-CbnufDsM.mjs.map +1 -0
  389. package/dist/content-list-query-D_7B1FE5.d.mts +26 -0
  390. package/dist/content-list-query-D_7B1FE5.d.mts.map +1 -0
  391. package/dist/content-policy-CYu6K1KB.mjs +46 -0
  392. package/dist/content-policy-CYu6K1KB.mjs.map +1 -0
  393. package/dist/content-repair-DlDUgFGp.mjs +442 -0
  394. package/dist/content-repair-DlDUgFGp.mjs.map +1 -0
  395. package/dist/context-CGQLA1-a.mjs +1922 -0
  396. package/dist/context-CGQLA1-a.mjs.map +1 -0
  397. package/dist/cron-c4D5C5Fx.mjs +284 -0
  398. package/dist/cron-c4D5C5Fx.mjs.map +1 -0
  399. package/dist/dashboard-CBq9kmOn.mjs +151 -0
  400. package/dist/dashboard-CBq9kmOn.mjs.map +1 -0
  401. package/dist/db/index.d.mts +3 -3
  402. package/dist/db/index.mjs +1 -1
  403. package/dist/db/libsql-migrations.d.mts +1 -1
  404. package/dist/db/libsql-migrations.mjs +4 -4
  405. package/dist/db/libsql.d.mts +1 -1
  406. package/dist/db/postgres-migrations.d.mts +1 -1
  407. package/dist/db/postgres-migrations.mjs +4 -4
  408. package/dist/db/postgres.d.mts +1 -1
  409. package/dist/db/sqlite-migrations.d.mts +1 -1
  410. package/dist/db/sqlite-migrations.mjs +4 -4
  411. package/dist/db/sqlite.d.mts +1 -1
  412. package/dist/db/sqlite.mjs +1 -1
  413. package/dist/default-DPsys51U.mjs +81 -0
  414. package/dist/default-DPsys51U.mjs.map +1 -0
  415. package/dist/deferred-tasks-CZ7rzBdo.d.mts +9 -0
  416. package/dist/deferred-tasks-CZ7rzBdo.d.mts.map +1 -0
  417. package/dist/dev-typegen-HRxwLRcT.mjs +29 -0
  418. package/dist/dev-typegen-HRxwLRcT.mjs.map +1 -0
  419. package/dist/device-flow-OcSqE9uY.mjs +521 -0
  420. package/dist/device-flow-OcSqE9uY.mjs.map +1 -0
  421. package/dist/digest-DVZ--cE9.mjs +194 -0
  422. package/dist/digest-DVZ--cE9.mjs.map +1 -0
  423. package/dist/direct-executor-DyjAqkpT.mjs +104 -0
  424. package/dist/direct-executor-DyjAqkpT.mjs.map +1 -0
  425. package/dist/dist-FPR93_xf.mjs +810 -0
  426. package/dist/dist-FPR93_xf.mjs.map +1 -0
  427. package/dist/email-console-DyQIgEnz.mjs +50 -0
  428. package/dist/email-console-DyQIgEnz.mjs.map +1 -0
  429. package/dist/email-locale-BYb16rVd.mjs +25 -0
  430. package/dist/email-locale-BYb16rVd.mjs.map +1 -0
  431. package/dist/emdash-runtime-CrzxJFmF.mjs +4214 -0
  432. package/dist/emdash-runtime-CrzxJFmF.mjs.map +1 -0
  433. package/dist/enrich-DBtCncE2.mjs +194 -0
  434. package/dist/enrich-DBtCncE2.mjs.map +1 -0
  435. package/dist/entry-lock-BN5y4YbO.d.mts +4481 -0
  436. package/dist/entry-lock-BN5y4YbO.d.mts.map +1 -0
  437. package/dist/entry-lock-BaRBHCsH.mjs +1173 -0
  438. package/dist/entry-lock-BaRBHCsH.mjs.map +1 -0
  439. package/dist/entry-lock-C6NcnZPV.mjs +163 -0
  440. package/dist/entry-lock-C6NcnZPV.mjs.map +1 -0
  441. package/dist/entry-locks-BTyQLdbC.mjs +167 -0
  442. package/dist/entry-locks-BTyQLdbC.mjs.map +1 -0
  443. package/dist/error-BfsNNrIE.mjs +90 -0
  444. package/dist/error-BfsNNrIE.mjs.map +1 -0
  445. package/dist/errors-BN1QAnEY.mjs +460 -0
  446. package/dist/errors-BN1QAnEY.mjs.map +1 -0
  447. package/dist/errors-Bt3goF8I.mjs +120 -0
  448. package/dist/errors-Bt3goF8I.mjs.map +1 -0
  449. package/dist/escape-BveidMa2.mjs +9 -0
  450. package/dist/escape-BveidMa2.mjs.map +1 -0
  451. package/dist/fence-Bb_IbCxI.mjs +162 -0
  452. package/dist/fence-Bb_IbCxI.mjs.map +1 -0
  453. package/dist/field-defs-cache-CsZctvbu.mjs +77 -0
  454. package/dist/field-defs-cache-CsZctvbu.mjs.map +1 -0
  455. package/dist/field-map-6m9rF49t.mjs +83 -0
  456. package/dist/field-map-6m9rF49t.mjs.map +1 -0
  457. package/dist/focal-point-CZ3d1wK5.mjs +23 -0
  458. package/dist/focal-point-CZ3d1wK5.mjs.map +1 -0
  459. package/dist/fts-manager-CCaZTp8y.mjs +443 -0
  460. package/dist/fts-manager-CCaZTp8y.mjs.map +1 -0
  461. package/dist/gc-xowRjczI.mjs +75 -0
  462. package/dist/gc-xowRjczI.mjs.map +1 -0
  463. package/dist/hash-COVK27Pc.mjs +37 -0
  464. package/dist/hash-COVK27Pc.mjs.map +1 -0
  465. package/dist/hook-result-CYSk0XFe.d.mts +31 -0
  466. package/dist/hook-result-CYSk0XFe.d.mts.map +1 -0
  467. package/dist/hreflang-CChPV7jx.mjs +105 -0
  468. package/dist/hreflang-CChPV7jx.mjs.map +1 -0
  469. package/dist/hreflang-DRslq3QI.d.mts +50 -0
  470. package/dist/hreflang-DRslq3QI.d.mts.map +1 -0
  471. package/dist/http-route-dispatch-CAdp2onn.mjs +339 -0
  472. package/dist/http-route-dispatch-CAdp2onn.mjs.map +1 -0
  473. package/dist/identity-NVTOOQyq.mjs +35 -0
  474. package/dist/identity-NVTOOQyq.mjs.map +1 -0
  475. package/dist/import-wpSO2N0x.mjs +2020 -0
  476. package/dist/import-wpSO2N0x.mjs.map +1 -0
  477. package/dist/index-CDs2wq4X.d.mts +623 -0
  478. package/dist/index-CDs2wq4X.d.mts.map +1 -0
  479. package/dist/index.d.mts +24 -24
  480. package/dist/index.mjs +103 -101
  481. package/dist/install-finalization-D9R9R-W8.mjs +58 -0
  482. package/dist/install-finalization-D9R9R-W8.mjs.map +1 -0
  483. package/dist/keys-Bck6LBfF.mjs +61 -0
  484. package/dist/keys-Bck6LBfF.mjs.map +1 -0
  485. package/dist/kinds-CYmRESWj.mjs +974 -0
  486. package/dist/kinds-CYmRESWj.mjs.map +1 -0
  487. package/dist/lifecycle-C815ZQfV.mjs +25 -0
  488. package/dist/lifecycle-C815ZQfV.mjs.map +1 -0
  489. package/dist/load-D99axixL.mjs +28 -0
  490. package/dist/load-D99axixL.mjs.map +1 -0
  491. package/dist/loader-CrRPfkHS.mjs +1197 -0
  492. package/dist/loader-CrRPfkHS.mjs.map +1 -0
  493. package/dist/loops-DMKlygqX.mjs +203 -0
  494. package/dist/loops-DMKlygqX.mjs.map +1 -0
  495. package/dist/manifest-builder-BQzCHNgB.mjs +189 -0
  496. package/dist/manifest-builder-BQzCHNgB.mjs.map +1 -0
  497. package/dist/manifest-schema-Ci2gmd0u.mjs +492 -0
  498. package/dist/manifest-schema-Ci2gmd0u.mjs.map +1 -0
  499. package/dist/media/image-endpoint.mjs +1 -1
  500. package/dist/media/index.d.mts +1 -1
  501. package/dist/media/index.mjs +4 -4
  502. package/dist/media/local-runtime.d.mts +14 -14
  503. package/dist/media/local-runtime.mjs +6 -6
  504. package/dist/media-BUQePMxP.mjs +373 -0
  505. package/dist/media-BUQePMxP.mjs.map +1 -0
  506. package/dist/media-DH8ibNlY.mjs +294 -0
  507. package/dist/media-DH8ibNlY.mjs.map +1 -0
  508. package/dist/media-OEIQ3bVc.mjs +408 -0
  509. package/dist/media-OEIQ3bVc.mjs.map +1 -0
  510. package/dist/media-allowlist-pYtaBA95.mjs +44 -0
  511. package/dist/media-allowlist-pYtaBA95.mjs.map +1 -0
  512. package/dist/media-folders-Bf8_s4de.mjs +210 -0
  513. package/dist/media-folders-Bf8_s4de.mjs.map +1 -0
  514. package/dist/media-url-C6klEuNd.mjs +43 -0
  515. package/dist/media-url-C6klEuNd.mjs.map +1 -0
  516. package/dist/media-usage-D7Y64m6v.mjs +1629 -0
  517. package/dist/media-usage-D7Y64m6v.mjs.map +1 -0
  518. package/dist/media-usage-activation-DrqbmgLA.mjs +78 -0
  519. package/dist/media-usage-activation-DrqbmgLA.mjs.map +1 -0
  520. package/dist/media-usage-work-DommYhYA.mjs +152 -0
  521. package/dist/media-usage-work-DommYhYA.mjs.map +1 -0
  522. package/dist/media-usage-work-HU63hNDu.mjs +586 -0
  523. package/dist/media-usage-work-HU63hNDu.mjs.map +1 -0
  524. package/dist/menus-BQfusWEC.mjs +3608 -0
  525. package/dist/menus-BQfusWEC.mjs.map +1 -0
  526. package/dist/menus-BtwjQt5s.mjs +753 -0
  527. package/dist/menus-BtwjQt5s.mjs.map +1 -0
  528. package/dist/menus-p_M1V7J_.mjs +139 -0
  529. package/dist/menus-p_M1V7J_.mjs.map +1 -0
  530. package/dist/migrations/index.d.mts +1 -1
  531. package/dist/migrations/index.mjs +3 -3
  532. package/dist/mime-C94qBG-P.mjs +36 -0
  533. package/dist/mime-C94qBG-P.mjs.map +1 -0
  534. package/dist/mode-DpYW3w6U.mjs +23 -0
  535. package/dist/mode-DpYW3w6U.mjs.map +1 -0
  536. package/dist/node-sqlite-compat-pWFw0lcc.mjs +46 -0
  537. package/dist/node-sqlite-compat-pWFw0lcc.mjs.map +1 -0
  538. package/dist/normalize-DduyxBjf.mjs +191 -0
  539. package/dist/normalize-DduyxBjf.mjs.map +1 -0
  540. package/dist/oauth-authorization-DAXsH1H9.mjs +274 -0
  541. package/dist/oauth-authorization-DAXsH1H9.mjs.map +1 -0
  542. package/dist/oauth-clients-DENiDQri.mjs +266 -0
  543. package/dist/oauth-clients-DENiDQri.mjs.map +1 -0
  544. package/dist/oauth-state-store-y8mEYVq9.mjs +50 -0
  545. package/dist/oauth-state-store-y8mEYVq9.mjs.map +1 -0
  546. package/dist/oauth-user-lookup-CtTYAy-O.mjs +26 -0
  547. package/dist/oauth-user-lookup-CtTYAy-O.mjs.map +1 -0
  548. package/dist/object-cache/memory.d.mts +1 -1
  549. package/dist/options-BYa1FgIM.d.mts +81 -0
  550. package/dist/options-BYa1FgIM.d.mts.map +1 -0
  551. package/dist/page/index.d.mts +2 -2
  552. package/dist/page/index.mjs +5 -5
  553. package/dist/parse-CORGGhHf.mjs +81 -0
  554. package/dist/parse-CORGGhHf.mjs.map +1 -0
  555. package/dist/parse-avNM1xWV.d.mts +168 -0
  556. package/dist/parse-avNM1xWV.d.mts.map +1 -0
  557. package/dist/passkey-config-Dih5YeIS.mjs +46 -0
  558. package/dist/passkey-config-Dih5YeIS.mjs.map +1 -0
  559. package/dist/paths-d51RFm8M.mjs +77 -0
  560. package/dist/paths-d51RFm8M.mjs.map +1 -0
  561. package/dist/patterns-CoqlXUvk.mjs +145 -0
  562. package/dist/patterns-CoqlXUvk.mjs.map +1 -0
  563. package/dist/placeholder-D2aksPMF.d.mts +306 -0
  564. package/dist/placeholder-D2aksPMF.d.mts.map +1 -0
  565. package/dist/plan-DqeZKuaR.mjs +135 -0
  566. package/dist/plan-DqeZKuaR.mjs.map +1 -0
  567. package/dist/plugin-test-runtime.d.mts +14 -14
  568. package/dist/plugin-test-runtime.mjs +110 -107
  569. package/dist/plugin-types.d.mts +2 -2
  570. package/dist/plugin-utils.d.mts +12 -12
  571. package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
  572. package/dist/plugins/adapt-sandbox-entry.mjs +3 -3
  573. package/dist/plugins/host.d.mts +5 -5
  574. package/dist/plugins/host.mjs +42 -41
  575. package/dist/plugins-Bb7oqjQA.mjs +277 -0
  576. package/dist/plugins-Bb7oqjQA.mjs.map +1 -0
  577. package/dist/policy-BcEqut3n.mjs +45 -0
  578. package/dist/policy-BcEqut3n.mjs.map +1 -0
  579. package/dist/portable-text-DXE8ymtD.mjs +307 -0
  580. package/dist/portable-text-DXE8ymtD.mjs.map +1 -0
  581. package/dist/preview-DEDWbwA_.mjs +107 -0
  582. package/dist/preview-DEDWbwA_.mjs.map +1 -0
  583. package/dist/protocol-BJbTzvwl.d.mts +61 -0
  584. package/dist/protocol-BJbTzvwl.d.mts.map +1 -0
  585. package/dist/public-submission-D9c9S14m.mjs +250 -0
  586. package/dist/public-submission-D9c9S14m.mjs.map +1 -0
  587. package/dist/public-url-CIRe-2T6.mjs +101 -0
  588. package/dist/public-url-CIRe-2T6.mjs.map +1 -0
  589. package/dist/query-BzifXlPS.mjs +1156 -0
  590. package/dist/query-BzifXlPS.mjs.map +1 -0
  591. package/dist/query-OzMJ6vJP.mjs +41 -0
  592. package/dist/query-OzMJ6vJP.mjs.map +1 -0
  593. package/dist/rate-limit-Csp60Vik.mjs +120 -0
  594. package/dist/rate-limit-Csp60Vik.mjs.map +1 -0
  595. package/dist/receipt-B-aU4hpJ.mjs +43 -0
  596. package/dist/receipt-B-aU4hpJ.mjs.map +1 -0
  597. package/dist/redirect-CDSw1sU3.mjs +17 -0
  598. package/dist/redirect-CDSw1sU3.mjs.map +1 -0
  599. package/dist/redirect-D1ArbO85.mjs +411 -0
  600. package/dist/redirect-D1ArbO85.mjs.map +1 -0
  601. package/dist/redirects-BjTwDTsV.mjs +148 -0
  602. package/dist/redirects-BjTwDTsV.mjs.map +1 -0
  603. package/dist/redirects-Ck50kH3n.mjs +446 -0
  604. package/dist/redirects-Ck50kH3n.mjs.map +1 -0
  605. package/dist/registry/testing.mjs +3 -3
  606. package/dist/registry-CFcNCayZ.mjs +6754 -0
  607. package/dist/registry-CFcNCayZ.mjs.map +1 -0
  608. package/dist/relations-Cfaa1fDl.mjs +776 -0
  609. package/dist/relations-Cfaa1fDl.mjs.map +1 -0
  610. package/dist/request-cache-iHRlHx1d.mjs +104 -0
  611. package/dist/request-cache-iHRlHx1d.mjs.map +1 -0
  612. package/dist/request-context.d.mts +1 -1
  613. package/dist/request-meta-D47mqyev.mjs +141 -0
  614. package/dist/request-meta-D47mqyev.mjs.map +1 -0
  615. package/dist/resolve-BPE8sMvx.mjs +99 -0
  616. package/dist/resolve-BPE8sMvx.mjs.map +1 -0
  617. package/dist/resolve-C0s1E_fH.mjs +199 -0
  618. package/dist/resolve-C0s1E_fH.mjs.map +1 -0
  619. package/dist/revision-j1p4-bOj.mjs +302 -0
  620. package/dist/revision-j1p4-bOj.mjs.map +1 -0
  621. package/dist/route-wire-C9PJV9aL.mjs +197 -0
  622. package/dist/route-wire-C9PJV9aL.mjs.map +1 -0
  623. package/dist/routes-lyYw0mMf.mjs +272 -0
  624. package/dist/routes-lyYw0mMf.mjs.map +1 -0
  625. package/dist/runner-B3eyB9Gb.mjs +6121 -0
  626. package/dist/runner-B3eyB9Gb.mjs.map +1 -0
  627. package/dist/runner-DoYH2Jcu.d.mts +68 -0
  628. package/dist/runner-DoYH2Jcu.d.mts.map +1 -0
  629. package/dist/runtime.d.mts +13 -13
  630. package/dist/runtime.mjs +3 -3
  631. package/dist/schema-BAayK46S.mjs +13 -0
  632. package/dist/schema-BAayK46S.mjs.map +1 -0
  633. package/dist/schema-Gqcl-8G4.mjs +815 -0
  634. package/dist/schema-Gqcl-8G4.mjs.map +1 -0
  635. package/dist/scopes-BqPOKoKf.mjs +34 -0
  636. package/dist/scopes-BqPOKoKf.mjs.map +1 -0
  637. package/dist/search-YJKPIEV6.mjs +448 -0
  638. package/dist/search-YJKPIEV6.mjs.map +1 -0
  639. package/dist/sections-BR_e-wK5.mjs +346 -0
  640. package/dist/sections-BR_e-wK5.mjs.map +1 -0
  641. package/dist/seed/index.d.mts +2 -2
  642. package/dist/seed/index.mjs +37 -31
  643. package/dist/seo/index.d.mts +3 -3
  644. package/dist/seo/index.mjs +22 -21
  645. package/dist/seo/index.mjs.map +1 -1
  646. package/dist/seo-Dsj8hy3j.mjs +114 -0
  647. package/dist/seo-Dsj8hy3j.mjs.map +1 -0
  648. package/dist/seo-XvH4LNNp.mjs +133 -0
  649. package/dist/seo-XvH4LNNp.mjs.map +1 -0
  650. package/dist/service-BsVG05gS.mjs +150 -0
  651. package/dist/service-BsVG05gS.mjs.map +1 -0
  652. package/dist/session-user-DgKbYrlj.mjs +51 -0
  653. package/dist/session-user-DgKbYrlj.mjs.map +1 -0
  654. package/dist/settings-CNPUntkh.mjs +51 -0
  655. package/dist/settings-CNPUntkh.mjs.map +1 -0
  656. package/dist/settings-D5EHi0Tk.mjs +439 -0
  657. package/dist/settings-D5EHi0Tk.mjs.map +1 -0
  658. package/dist/settings-DSfE7wOa.mjs +61 -0
  659. package/dist/settings-DSfE7wOa.mjs.map +1 -0
  660. package/dist/setup-complete-B8W8sJ9v.mjs +26 -0
  661. package/dist/setup-complete-B8W8sJ9v.mjs.map +1 -0
  662. package/dist/setup-nonce-DnSBP260.mjs +25 -0
  663. package/dist/setup-nonce-DnSBP260.mjs.map +1 -0
  664. package/dist/site-settings-NGzdrt7O.mjs +50 -0
  665. package/dist/site-settings-NGzdrt7O.mjs.map +1 -0
  666. package/dist/site-url-D6JB7tLW.mjs +16 -0
  667. package/dist/site-url-D6JB7tLW.mjs.map +1 -0
  668. package/dist/snapshot-CdcwwWAf.mjs +414 -0
  669. package/dist/snapshot-CdcwwWAf.mjs.map +1 -0
  670. package/dist/ssrf-Dv0_tRpo.mjs +406 -0
  671. package/dist/ssrf-Dv0_tRpo.mjs.map +1 -0
  672. package/dist/stage-CUjhED3P.mjs +662 -0
  673. package/dist/stage-CUjhED3P.mjs.map +1 -0
  674. package/dist/staged-C36IWXff.mjs +659 -0
  675. package/dist/staged-C36IWXff.mjs.map +1 -0
  676. package/dist/state-CKouMCSY.mjs +153 -0
  677. package/dist/state-CKouMCSY.mjs.map +1 -0
  678. package/dist/status-lzyj4Uu7.mjs +30 -0
  679. package/dist/status-lzyj4Uu7.mjs.map +1 -0
  680. package/dist/storage/local.d.mts +1 -1
  681. package/dist/storage/local.mjs +1 -1
  682. package/dist/storage/s3.d.mts +1 -1
  683. package/dist/storage/s3.mjs +1 -1
  684. package/dist/storage-query-B-cWcTjJ.d.mts +1594 -0
  685. package/dist/storage-query-B-cWcTjJ.d.mts.map +1 -0
  686. package/dist/tar-DsTXX6ch.mjs +449 -0
  687. package/dist/tar-DsTXX6ch.mjs.map +1 -0
  688. package/dist/target-DLQCwp_Z.mjs +27 -0
  689. package/dist/target-DLQCwp_Z.mjs.map +1 -0
  690. package/dist/taxonomies-BlAjr4BL.mjs +697 -0
  691. package/dist/taxonomies-BlAjr4BL.mjs.map +1 -0
  692. package/dist/taxonomies-Byyo7LOZ.mjs +939 -0
  693. package/dist/taxonomies-Byyo7LOZ.mjs.map +1 -0
  694. package/dist/taxonomy-CKDwM61Y.mjs +525 -0
  695. package/dist/taxonomy-CKDwM61Y.mjs.map +1 -0
  696. package/dist/tokens-BojXlk49.mjs +171 -0
  697. package/dist/tokens-BojXlk49.mjs.map +1 -0
  698. package/dist/transaction-DLPQWik1.mjs +29 -0
  699. package/dist/transaction-DLPQWik1.mjs.map +1 -0
  700. package/dist/transfer-XSTh2BCr.mjs +8706 -0
  701. package/dist/transfer-XSTh2BCr.mjs.map +1 -0
  702. package/dist/transfer-download-DkoCDA9d.mjs +33 -0
  703. package/dist/transfer-download-DkoCDA9d.mjs.map +1 -0
  704. package/dist/transfer-iQ26J-RT.mjs +166 -0
  705. package/dist/transfer-iQ26J-RT.mjs.map +1 -0
  706. package/dist/transformations-C7RQabKQ.mjs +196 -0
  707. package/dist/transformations-C7RQabKQ.mjs.map +1 -0
  708. package/dist/transport-D3RulfD6.mjs +136 -0
  709. package/dist/transport-D3RulfD6.mjs.map +1 -0
  710. package/dist/transport-DhlZlf4D.d.mts +42 -0
  711. package/dist/transport-DhlZlf4D.d.mts.map +1 -0
  712. package/dist/trusted-proxy-B6ECOZJc.mjs +51 -0
  713. package/dist/trusted-proxy-B6ECOZJc.mjs.map +1 -0
  714. package/dist/turnstile-lqUiY7lP.mjs +53 -0
  715. package/dist/turnstile-lqUiY7lP.mjs.map +1 -0
  716. package/dist/types-4Dn9bZhu.mjs +77 -0
  717. package/dist/types-4Dn9bZhu.mjs.map +1 -0
  718. package/dist/types-5LSo7PPx.d.mts +85 -0
  719. package/dist/types-5LSo7PPx.d.mts.map +1 -0
  720. package/dist/types-BQ3hwYJT.d.mts +896 -0
  721. package/dist/types-BQ3hwYJT.d.mts.map +1 -0
  722. package/dist/types-BYEk7qo3.d.mts +198 -0
  723. package/dist/types-BYEk7qo3.d.mts.map +1 -0
  724. package/dist/types-CJKsWVFR.mjs +199 -0
  725. package/dist/types-CJKsWVFR.mjs.map +1 -0
  726. package/dist/types-Ca_w8mmY.d.mts +363 -0
  727. package/dist/types-Ca_w8mmY.d.mts.map +1 -0
  728. package/dist/types-CkE41ZAG.mjs +18 -0
  729. package/dist/types-CkE41ZAG.mjs.map +1 -0
  730. package/dist/types-D0aJW2uR.d.mts +1641 -0
  731. package/dist/types-D0aJW2uR.d.mts.map +1 -0
  732. package/dist/types-DbpN4Qto.d.mts +372 -0
  733. package/dist/types-DbpN4Qto.d.mts.map +1 -0
  734. package/dist/types-ILDI1sdY.mjs +16 -0
  735. package/dist/types-ILDI1sdY.mjs.map +1 -0
  736. package/dist/types-OC5c-edM.mjs +22 -0
  737. package/dist/types-OC5c-edM.mjs.map +1 -0
  738. package/dist/types-aOOxRSx6.mjs +103 -0
  739. package/dist/types-aOOxRSx6.mjs.map +1 -0
  740. package/dist/types-m1WbUffD.d.mts +198 -0
  741. package/dist/types-m1WbUffD.d.mts.map +1 -0
  742. package/dist/types-uxLoPBio.d.mts +124 -0
  743. package/dist/types-uxLoPBio.d.mts.map +1 -0
  744. package/dist/types-we5uR-tV.d.mts +287 -0
  745. package/dist/types-we5uR-tV.d.mts.map +1 -0
  746. package/dist/upload-attempts-DduMy6B0.mjs +32 -0
  747. package/dist/upload-attempts-DduMy6B0.mjs.map +1 -0
  748. package/dist/url-pattern-B3EwxAAk.mjs +33 -0
  749. package/dist/url-pattern-B3EwxAAk.mjs.map +1 -0
  750. package/dist/user-ElwQjTQT.mjs +171 -0
  751. package/dist/user-ElwQjTQT.mjs.map +1 -0
  752. package/dist/utils-BlAXmfOG.mjs +439 -0
  753. package/dist/utils-BlAXmfOG.mjs.map +1 -0
  754. package/dist/validate-CH0X5b2c.d.mts +468 -0
  755. package/dist/validate-CH0X5b2c.d.mts.map +1 -0
  756. package/dist/validate-CfgRpcjA.mjs +492 -0
  757. package/dist/validate-CfgRpcjA.mjs.map +1 -0
  758. package/dist/validation-DvYJtv4k.mjs +218 -0
  759. package/dist/validation-DvYJtv4k.mjs.map +1 -0
  760. package/dist/version-DgYjhTud.mjs +9 -0
  761. package/dist/version-DgYjhTud.mjs.map +1 -0
  762. package/dist/version-Dq71scUb.mjs +7 -0
  763. package/dist/version-Dq71scUb.mjs.map +1 -0
  764. package/dist/widgets-ChFIj0be.mjs +126 -0
  765. package/dist/widgets-ChFIj0be.mjs.map +1 -0
  766. package/dist/wxr-taxonomies-CBZMp2YX.mjs +372 -0
  767. package/dist/wxr-taxonomies-CBZMp2YX.mjs.map +1 -0
  768. package/dist/wxr-taxonomies-DlKDpWN1.d.mts +34 -0
  769. package/dist/wxr-taxonomies-DlKDpWN1.d.mts.map +1 -0
  770. package/dist/zod-generator-DmTKI-Ig.mjs +426 -0
  771. package/dist/zod-generator-DmTKI-Ig.mjs.map +1 -0
  772. package/package.json +7 -6
  773. package/src/api/handlers/content.ts +593 -16
  774. package/src/api/handlers/device-flow.ts +74 -21
  775. package/src/api/handlers/index.ts +1 -0
  776. package/src/api/handlers/manifest.ts +79 -5
  777. package/src/api/handlers/media-upload.ts +17 -71
  778. package/src/api/handlers/media.ts +97 -3
  779. package/src/api/handlers/relations.ts +638 -157
  780. package/src/api/handlers/revision.ts +30 -0
  781. package/src/api/handlers/schema.ts +403 -1
  782. package/src/api/handlers/snapshot.ts +257 -3
  783. package/src/api/handlers/staged-references.ts +142 -0
  784. package/src/api/handlers/validate-references.ts +146 -0
  785. package/src/api/schemas/content.ts +13 -0
  786. package/src/api/schemas/relations.ts +54 -44
  787. package/src/api/schemas/schema.ts +14 -0
  788. package/src/astro/integration/routes.ts +15 -19
  789. package/src/astro/integration/vite-config.ts +10 -4
  790. package/src/astro/middleware.ts +1 -0
  791. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +11 -54
  792. package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
  793. package/src/astro/routes/api/oauth/device/authorize.ts +33 -4
  794. package/src/astro/routes/api/relations/index.ts +4 -4
  795. package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +6 -2
  796. package/src/astro/routes/api/setup/index.ts +66 -23
  797. package/src/astro/routes/api/snapshot.ts +2 -1
  798. package/src/astro/types.ts +10 -0
  799. package/src/cleanup.ts +10 -0
  800. package/src/cli/commands/export-seed.ts +510 -89
  801. package/src/components/Columns.astro +3 -1
  802. package/src/components/Cover.astro +3 -1
  803. package/src/components/WidgetArea.astro +3 -2
  804. package/src/database/migrations/086_relations_structural.ts +197 -0
  805. package/src/database/migrations/087_reference_field_relations.ts +407 -0
  806. package/src/database/migrations/runner.ts +4 -0
  807. package/src/database/reference-backfill.ts +141 -0
  808. package/src/database/repositories/content.ts +43 -8
  809. package/src/database/repositories/media.ts +40 -1
  810. package/src/database/repositories/redirect.ts +17 -34
  811. package/src/database/repositories/relation.ts +620 -208
  812. package/src/database/repositories/revision.ts +16 -0
  813. package/src/database/repositories/types.ts +38 -0
  814. package/src/database/transaction.ts +12 -1
  815. package/src/database/types.ts +14 -5
  816. package/src/emdash-runtime.ts +114 -11
  817. package/src/index.ts +11 -0
  818. package/src/loader.ts +169 -22
  819. package/src/mcp/server.ts +13 -48
  820. package/src/query.ts +455 -25
  821. package/src/references/field-map.ts +115 -0
  822. package/src/references/resolve.ts +160 -0
  823. package/src/references/staged.ts +117 -0
  824. package/src/references/types.ts +16 -0
  825. package/src/registry/artifact-fetch.ts +45 -271
  826. package/src/schema/registry.ts +99 -24
  827. package/src/schema/types.ts +58 -0
  828. package/src/schema/zod-generator.ts +67 -1
  829. package/src/seed/apply.ts +841 -103
  830. package/src/seed/types.ts +36 -2
  831. package/src/seed/validate.ts +78 -2
  832. package/src/transfer/analyze/unique-keys.ts +3 -12
  833. package/src/transfer/analyze/validate.ts +65 -39
  834. package/src/transfer/analyze/values.ts +12 -1
  835. package/src/transfer/export/readers.ts +12 -8
  836. package/src/transfer/format/columns.ts +26 -6
  837. package/src/transfer/format/kinds.ts +21 -5
  838. package/src/transfer/import/context.ts +8 -1
  839. package/src/transfer/ops/package-index.ts +1 -1
  840. package/dist/action-token-DYwe4Pk0.mjs +0 -26
  841. package/dist/action-token-DYwe4Pk0.mjs.map +0 -1
  842. package/dist/activation-LOkDM5WT.mjs +0 -382
  843. package/dist/activation-LOkDM5WT.mjs.map +0 -1
  844. package/dist/adapters-B64LbYcB.d.mts +0 -171
  845. package/dist/adapters-B64LbYcB.d.mts.map +0 -1
  846. package/dist/allowed-origins-CHB8oZNM.mjs +0 -116
  847. package/dist/allowed-origins-CHB8oZNM.mjs.map +0 -1
  848. package/dist/api-cFFZpyS0.mjs +0 -4718
  849. package/dist/api-cFFZpyS0.mjs.map +0 -1
  850. package/dist/api-tokens-s4i4aUp_.mjs +0 -166
  851. package/dist/api-tokens-s4i4aUp_.mjs.map +0 -1
  852. package/dist/apply-CoT603H3.mjs +0 -1163
  853. package/dist/apply-CoT603H3.mjs.map +0 -1
  854. package/dist/approvals-CqMfNxak.mjs +0 -460
  855. package/dist/approvals-CqMfNxak.mjs.map +0 -1
  856. package/dist/artifact-fetch-DZMOGZ3-.mjs +0 -818
  857. package/dist/artifact-fetch-DZMOGZ3-.mjs.map +0 -1
  858. package/dist/astro/routes/api/relations/_id_/translations.d.mts +0 -8
  859. package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +0 -1
  860. package/dist/astro/routes/api/relations/_id_/translations.mjs +0 -47
  861. package/dist/astro/routes/api/relations/_id_/translations.mjs.map +0 -1
  862. package/dist/audit-RfCugiSB.mjs +0 -127
  863. package/dist/audit-RfCugiSB.mjs.map +0 -1
  864. package/dist/authoritative-records-CoJvBXAD.mjs +0 -5172
  865. package/dist/authoritative-records-CoJvBXAD.mjs.map +0 -1
  866. package/dist/authorize-seCifOMJ.mjs +0 -49
  867. package/dist/authorize-seCifOMJ.mjs.map +0 -1
  868. package/dist/backup-CBu0LrXf.mjs +0 -246
  869. package/dist/backup-CBu0LrXf.mjs.map +0 -1
  870. package/dist/block-type-registry-DUI_3KxT.mjs +0 -6709
  871. package/dist/block-type-registry-DUI_3KxT.mjs.map +0 -1
  872. package/dist/block-types-BmZmLmAD.mjs +0 -132
  873. package/dist/block-types-BmZmLmAD.mjs.map +0 -1
  874. package/dist/block-values-C_VIPr5t.mjs +0 -175
  875. package/dist/block-values-C_VIPr5t.mjs.map +0 -1
  876. package/dist/byline-DYmkXqvo.mjs +0 -909
  877. package/dist/byline-DYmkXqvo.mjs.map +0 -1
  878. package/dist/byline-fields-D28AT-Fh.mjs +0 -123
  879. package/dist/byline-fields-D28AT-Fh.mjs.map +0 -1
  880. package/dist/byline-registry-gnKscbQX.mjs +0 -406
  881. package/dist/byline-registry-gnKscbQX.mjs.map +0 -1
  882. package/dist/bylines-BPwJqoYH.mjs +0 -232
  883. package/dist/bylines-BPwJqoYH.mjs.map +0 -1
  884. package/dist/bylines-ukLaYpVZ.mjs +0 -214
  885. package/dist/bylines-ukLaYpVZ.mjs.map +0 -1
  886. package/dist/cache-m7UEkRFV.mjs +0 -108
  887. package/dist/cache-m7UEkRFV.mjs.map +0 -1
  888. package/dist/canonical-YhEQezjg.mjs +0 -174
  889. package/dist/canonical-YhEQezjg.mjs.map +0 -1
  890. package/dist/capture-triggers-kJyl_yyM.mjs +0 -362
  891. package/dist/capture-triggers-kJyl_yyM.mjs.map +0 -1
  892. package/dist/challenge-store-ppU6Uv13.mjs +0 -51
  893. package/dist/challenge-store-ppU6Uv13.mjs.map +0 -1
  894. package/dist/checksum-B2IINIlN.mjs +0 -162
  895. package/dist/checksum-B2IINIlN.mjs.map +0 -1
  896. package/dist/chrome-tags-DApCQSIk.mjs +0 -24
  897. package/dist/chrome-tags-DApCQSIk.mjs.map +0 -1
  898. package/dist/chunks-Dms7Uxbt.mjs +0 -25
  899. package/dist/chunks-Dms7Uxbt.mjs.map +0 -1
  900. package/dist/collection-deletion-BIm28mo3.mjs +0 -436
  901. package/dist/collection-deletion-BIm28mo3.mjs.map +0 -1
  902. package/dist/collection-deletion-processor-Br6rxs3u.mjs +0 -217
  903. package/dist/collection-deletion-processor-Br6rxs3u.mjs.map +0 -1
  904. package/dist/collection-slugs-cache-CjGk__zp.mjs +0 -85
  905. package/dist/collection-slugs-cache-CjGk__zp.mjs.map +0 -1
  906. package/dist/comment-CrBl22OF.mjs +0 -313
  907. package/dist/comment-CrBl22OF.mjs.map +0 -1
  908. package/dist/comment-reaction-JEQ2Fpd8.mjs +0 -85
  909. package/dist/comment-reaction-JEQ2Fpd8.mjs.map +0 -1
  910. package/dist/comments-2ah9du9y.mjs +0 -195
  911. package/dist/comments-2ah9du9y.mjs.map +0 -1
  912. package/dist/comments-fHZ8ON9O.mjs +0 -99
  913. package/dist/comments-fHZ8ON9O.mjs.map +0 -1
  914. package/dist/components-CXbq7CSM.mjs +0 -108
  915. package/dist/components-CXbq7CSM.mjs.map +0 -1
  916. package/dist/config-5ii2haYu.d.mts +0 -6528
  917. package/dist/config-5ii2haYu.d.mts.map +0 -1
  918. package/dist/config-IhybvkIQ.mjs +0 -242
  919. package/dist/config-IhybvkIQ.mjs.map +0 -1
  920. package/dist/config-Py43JK9r.d.mts +0 -39
  921. package/dist/config-Py43JK9r.d.mts.map +0 -1
  922. package/dist/content-DFaIEDj9.mjs +0 -2281
  923. package/dist/content-DFaIEDj9.mjs.map +0 -1
  924. package/dist/content-list-query-Dra4Dalc.d.mts +0 -26
  925. package/dist/content-list-query-Dra4Dalc.d.mts.map +0 -1
  926. package/dist/content-policy-DFNw91-d.mjs +0 -46
  927. package/dist/content-policy-DFNw91-d.mjs.map +0 -1
  928. package/dist/content-repair-Q8IUrpLL.mjs +0 -442
  929. package/dist/content-repair-Q8IUrpLL.mjs.map +0 -1
  930. package/dist/context-BeGccdUX.mjs +0 -1921
  931. package/dist/context-BeGccdUX.mjs.map +0 -1
  932. package/dist/cron-7DCJwPXq.mjs +0 -284
  933. package/dist/cron-7DCJwPXq.mjs.map +0 -1
  934. package/dist/dashboard-DjrB-xxZ.mjs +0 -151
  935. package/dist/dashboard-DjrB-xxZ.mjs.map +0 -1
  936. package/dist/default-DQ6vsviu.mjs +0 -81
  937. package/dist/default-DQ6vsviu.mjs.map +0 -1
  938. package/dist/deferred-tasks-BPxXUB4x.d.mts +0 -9
  939. package/dist/deferred-tasks-BPxXUB4x.d.mts.map +0 -1
  940. package/dist/dev-typegen-CZaPLl3V.mjs +0 -29
  941. package/dist/dev-typegen-CZaPLl3V.mjs.map +0 -1
  942. package/dist/device-flow-CRd6DXmW.mjs +0 -466
  943. package/dist/device-flow-CRd6DXmW.mjs.map +0 -1
  944. package/dist/digest-BarSh-pN.mjs +0 -194
  945. package/dist/digest-BarSh-pN.mjs.map +0 -1
  946. package/dist/direct-executor-BmuFJJZV.mjs +0 -104
  947. package/dist/direct-executor-BmuFJJZV.mjs.map +0 -1
  948. package/dist/dist-BNwANFJR.mjs +0 -810
  949. package/dist/dist-BNwANFJR.mjs.map +0 -1
  950. package/dist/email-console-bJn3ctqA.mjs +0 -50
  951. package/dist/email-console-bJn3ctqA.mjs.map +0 -1
  952. package/dist/email-locale-CN6WAMx0.mjs +0 -25
  953. package/dist/email-locale-CN6WAMx0.mjs.map +0 -1
  954. package/dist/emdash-runtime-DAjghyEG.mjs +0 -4186
  955. package/dist/emdash-runtime-DAjghyEG.mjs.map +0 -1
  956. package/dist/enrich-Dl3kZ-lP.mjs +0 -194
  957. package/dist/enrich-Dl3kZ-lP.mjs.map +0 -1
  958. package/dist/entry-lock-BJYdBfXb.mjs +0 -1097
  959. package/dist/entry-lock-BJYdBfXb.mjs.map +0 -1
  960. package/dist/entry-lock-DHQOxN7R.mjs +0 -163
  961. package/dist/entry-lock-DHQOxN7R.mjs.map +0 -1
  962. package/dist/entry-lock-DVhCt49A.d.mts +0 -4368
  963. package/dist/entry-lock-DVhCt49A.d.mts.map +0 -1
  964. package/dist/entry-locks-D0foLdjQ.mjs +0 -167
  965. package/dist/entry-locks-D0foLdjQ.mjs.map +0 -1
  966. package/dist/error-CfvOHP0M.mjs +0 -90
  967. package/dist/error-CfvOHP0M.mjs.map +0 -1
  968. package/dist/errors-BF0_LFhW.mjs +0 -460
  969. package/dist/errors-BF0_LFhW.mjs.map +0 -1
  970. package/dist/errors-DgE1zJGG.mjs +0 -120
  971. package/dist/errors-DgE1zJGG.mjs.map +0 -1
  972. package/dist/escape-CuaZhZvL.mjs +0 -9
  973. package/dist/escape-CuaZhZvL.mjs.map +0 -1
  974. package/dist/fence-CMDXJYc_.mjs +0 -162
  975. package/dist/fence-CMDXJYc_.mjs.map +0 -1
  976. package/dist/field-defs-cache-HIgBbqZZ.mjs +0 -77
  977. package/dist/field-defs-cache-HIgBbqZZ.mjs.map +0 -1
  978. package/dist/focal-point-Gr34o-4o.mjs +0 -23
  979. package/dist/focal-point-Gr34o-4o.mjs.map +0 -1
  980. package/dist/fts-manager-S-K0laoS.mjs +0 -443
  981. package/dist/fts-manager-S-K0laoS.mjs.map +0 -1
  982. package/dist/gc-DjKY0Ay1.mjs +0 -75
  983. package/dist/gc-DjKY0Ay1.mjs.map +0 -1
  984. package/dist/hash-SDAW6zC-.mjs +0 -37
  985. package/dist/hash-SDAW6zC-.mjs.map +0 -1
  986. package/dist/hook-result-B5bXDgS2.d.mts +0 -31
  987. package/dist/hook-result-B5bXDgS2.d.mts.map +0 -1
  988. package/dist/hreflang-D5uNnsGJ.d.mts +0 -50
  989. package/dist/hreflang-D5uNnsGJ.d.mts.map +0 -1
  990. package/dist/hreflang-DMFBL2eb.mjs +0 -105
  991. package/dist/hreflang-DMFBL2eb.mjs.map +0 -1
  992. package/dist/http-route-dispatch-BitqzwMy.mjs +0 -339
  993. package/dist/http-route-dispatch-BitqzwMy.mjs.map +0 -1
  994. package/dist/identity-IyNWwXr6.mjs +0 -35
  995. package/dist/identity-IyNWwXr6.mjs.map +0 -1
  996. package/dist/import-C3JZplWq.mjs +0 -2020
  997. package/dist/import-C3JZplWq.mjs.map +0 -1
  998. package/dist/index-D-hdtLe8.d.mts +0 -623
  999. package/dist/index-D-hdtLe8.d.mts.map +0 -1
  1000. package/dist/install-finalization-DfM1fj5x.mjs +0 -58
  1001. package/dist/install-finalization-DfM1fj5x.mjs.map +0 -1
  1002. package/dist/keys-yxLm5l35.mjs +0 -61
  1003. package/dist/keys-yxLm5l35.mjs.map +0 -1
  1004. package/dist/kinds-CRu_T5T5.mjs +0 -961
  1005. package/dist/kinds-CRu_T5T5.mjs.map +0 -1
  1006. package/dist/lifecycle-BzeGPeQ-.mjs +0 -25
  1007. package/dist/lifecycle-BzeGPeQ-.mjs.map +0 -1
  1008. package/dist/load-XgJiE6_3.mjs +0 -28
  1009. package/dist/load-XgJiE6_3.mjs.map +0 -1
  1010. package/dist/loader-BzqeR1ZN.mjs +0 -1086
  1011. package/dist/loader-BzqeR1ZN.mjs.map +0 -1
  1012. package/dist/loops-BQSzv5Zn.mjs +0 -203
  1013. package/dist/loops-BQSzv5Zn.mjs.map +0 -1
  1014. package/dist/manifest-builder-B8zR-73J.mjs +0 -189
  1015. package/dist/manifest-builder-B8zR-73J.mjs.map +0 -1
  1016. package/dist/manifest-schema-CY3zng_M.mjs +0 -492
  1017. package/dist/manifest-schema-CY3zng_M.mjs.map +0 -1
  1018. package/dist/media-Pu1L6xir.mjs +0 -408
  1019. package/dist/media-Pu1L6xir.mjs.map +0 -1
  1020. package/dist/media-Qp5S3eH3.mjs +0 -355
  1021. package/dist/media-Qp5S3eH3.mjs.map +0 -1
  1022. package/dist/media-allowlist-BSoa9Vvm.mjs +0 -44
  1023. package/dist/media-allowlist-BSoa9Vvm.mjs.map +0 -1
  1024. package/dist/media-folders-BE0oo2eX.mjs +0 -210
  1025. package/dist/media-folders-BE0oo2eX.mjs.map +0 -1
  1026. package/dist/media-h7tOiDLj.mjs +0 -221
  1027. package/dist/media-h7tOiDLj.mjs.map +0 -1
  1028. package/dist/media-url-jArBpzIG.mjs +0 -43
  1029. package/dist/media-url-jArBpzIG.mjs.map +0 -1
  1030. package/dist/media-usage-My-Vi-ex.mjs +0 -1629
  1031. package/dist/media-usage-My-Vi-ex.mjs.map +0 -1
  1032. package/dist/media-usage-activation-HKp7zk7W.mjs +0 -78
  1033. package/dist/media-usage-activation-HKp7zk7W.mjs.map +0 -1
  1034. package/dist/media-usage-work-C2OZLCAd.mjs +0 -586
  1035. package/dist/media-usage-work-C2OZLCAd.mjs.map +0 -1
  1036. package/dist/media-usage-work-DwUNbgvS.mjs +0 -152
  1037. package/dist/media-usage-work-DwUNbgvS.mjs.map +0 -1
  1038. package/dist/menus-BM7BPLOb.mjs +0 -139
  1039. package/dist/menus-BM7BPLOb.mjs.map +0 -1
  1040. package/dist/menus-ITeAbcIF.mjs +0 -753
  1041. package/dist/menus-ITeAbcIF.mjs.map +0 -1
  1042. package/dist/menus-TsSGmSR4.mjs +0 -3608
  1043. package/dist/menus-TsSGmSR4.mjs.map +0 -1
  1044. package/dist/mime-ChLqYwDk.mjs +0 -36
  1045. package/dist/mime-ChLqYwDk.mjs.map +0 -1
  1046. package/dist/mode-CCuKXUci.mjs +0 -23
  1047. package/dist/mode-CCuKXUci.mjs.map +0 -1
  1048. package/dist/node-sqlite-compat-CONMsl-x.mjs +0 -46
  1049. package/dist/node-sqlite-compat-CONMsl-x.mjs.map +0 -1
  1050. package/dist/normalize-CO2P8-iE.mjs +0 -191
  1051. package/dist/normalize-CO2P8-iE.mjs.map +0 -1
  1052. package/dist/oauth-authorization-DlMIL5_h.mjs +0 -274
  1053. package/dist/oauth-authorization-DlMIL5_h.mjs.map +0 -1
  1054. package/dist/oauth-clients-Djq9r_KP.mjs +0 -266
  1055. package/dist/oauth-clients-Djq9r_KP.mjs.map +0 -1
  1056. package/dist/oauth-state-store-BbjnZXNC.mjs +0 -50
  1057. package/dist/oauth-state-store-BbjnZXNC.mjs.map +0 -1
  1058. package/dist/oauth-user-lookup-vue9a64A.mjs +0 -26
  1059. package/dist/oauth-user-lookup-vue9a64A.mjs.map +0 -1
  1060. package/dist/options-SQCHQCPH.d.mts +0 -81
  1061. package/dist/options-SQCHQCPH.d.mts.map +0 -1
  1062. package/dist/parse-CVgO-Qai.d.mts +0 -168
  1063. package/dist/parse-CVgO-Qai.d.mts.map +0 -1
  1064. package/dist/parse-DY6OD1j_.mjs +0 -81
  1065. package/dist/parse-DY6OD1j_.mjs.map +0 -1
  1066. package/dist/passkey-config-X_H8128a.mjs +0 -46
  1067. package/dist/passkey-config-X_H8128a.mjs.map +0 -1
  1068. package/dist/paths-JxokKIbr.mjs +0 -77
  1069. package/dist/paths-JxokKIbr.mjs.map +0 -1
  1070. package/dist/patterns-BhAvqO0S.mjs +0 -145
  1071. package/dist/patterns-BhAvqO0S.mjs.map +0 -1
  1072. package/dist/placeholder-MSEd8gty.d.mts +0 -306
  1073. package/dist/placeholder-MSEd8gty.d.mts.map +0 -1
  1074. package/dist/plan-xjcWrAah.mjs +0 -135
  1075. package/dist/plan-xjcWrAah.mjs.map +0 -1
  1076. package/dist/plugins-DUXUt8B9.mjs +0 -277
  1077. package/dist/plugins-DUXUt8B9.mjs.map +0 -1
  1078. package/dist/policy-CUvwAARc.mjs +0 -45
  1079. package/dist/policy-CUvwAARc.mjs.map +0 -1
  1080. package/dist/portable-text-5O_ZGUjB.mjs +0 -307
  1081. package/dist/portable-text-5O_ZGUjB.mjs.map +0 -1
  1082. package/dist/preview-CIUcPYr6.mjs +0 -107
  1083. package/dist/preview-CIUcPYr6.mjs.map +0 -1
  1084. package/dist/protocol-B97DZaFr.d.mts +0 -61
  1085. package/dist/protocol-B97DZaFr.d.mts.map +0 -1
  1086. package/dist/public-submission-BFBUrqst.mjs +0 -250
  1087. package/dist/public-submission-BFBUrqst.mjs.map +0 -1
  1088. package/dist/public-url-Bn7U0D7-.mjs +0 -101
  1089. package/dist/public-url-Bn7U0D7-.mjs.map +0 -1
  1090. package/dist/query-B48peoRT.mjs +0 -890
  1091. package/dist/query-B48peoRT.mjs.map +0 -1
  1092. package/dist/query-C4IH0uhR.mjs +0 -41
  1093. package/dist/query-C4IH0uhR.mjs.map +0 -1
  1094. package/dist/rate-limit-BZ6nybgc.mjs +0 -120
  1095. package/dist/rate-limit-BZ6nybgc.mjs.map +0 -1
  1096. package/dist/receipt-B4wJj5Jq.mjs +0 -43
  1097. package/dist/receipt-B4wJj5Jq.mjs.map +0 -1
  1098. package/dist/redirect-Cd1E7VUt.mjs +0 -17
  1099. package/dist/redirect-Cd1E7VUt.mjs.map +0 -1
  1100. package/dist/redirect-iJf5fltD.mjs +0 -415
  1101. package/dist/redirect-iJf5fltD.mjs.map +0 -1
  1102. package/dist/redirects-CYu1u1aK.mjs +0 -446
  1103. package/dist/redirects-CYu1u1aK.mjs.map +0 -1
  1104. package/dist/redirects-Cv9apQKj.mjs +0 -148
  1105. package/dist/redirects-Cv9apQKj.mjs.map +0 -1
  1106. package/dist/relation-M4NUCb0b.mjs +0 -334
  1107. package/dist/relation-M4NUCb0b.mjs.map +0 -1
  1108. package/dist/relations-CCif47Oq.mjs +0 -403
  1109. package/dist/relations-CCif47Oq.mjs.map +0 -1
  1110. package/dist/relations-CK9CYUyr.mjs +0 -310
  1111. package/dist/relations-CK9CYUyr.mjs.map +0 -1
  1112. package/dist/request-cache-DzLYKm_x.mjs +0 -104
  1113. package/dist/request-cache-DzLYKm_x.mjs.map +0 -1
  1114. package/dist/request-meta-sZXt3sRo.mjs +0 -141
  1115. package/dist/request-meta-sZXt3sRo.mjs.map +0 -1
  1116. package/dist/resolve-2WbQsCvT.mjs +0 -199
  1117. package/dist/resolve-2WbQsCvT.mjs.map +0 -1
  1118. package/dist/route-wire--1hLuACz.mjs +0 -197
  1119. package/dist/route-wire--1hLuACz.mjs.map +0 -1
  1120. package/dist/routes-CUsM40Cc.mjs +0 -272
  1121. package/dist/routes-CUsM40Cc.mjs.map +0 -1
  1122. package/dist/runner-1y4J9fJB.mjs +0 -5742
  1123. package/dist/runner-1y4J9fJB.mjs.map +0 -1
  1124. package/dist/runner-D5_LzKXI.d.mts +0 -68
  1125. package/dist/runner-D5_LzKXI.d.mts.map +0 -1
  1126. package/dist/schema-BABiRdsH.mjs +0 -13
  1127. package/dist/schema-BABiRdsH.mjs.map +0 -1
  1128. package/dist/schema-Du3MzCG0.mjs +0 -446
  1129. package/dist/schema-Du3MzCG0.mjs.map +0 -1
  1130. package/dist/scopes-Dbk-ElhT.mjs +0 -34
  1131. package/dist/scopes-Dbk-ElhT.mjs.map +0 -1
  1132. package/dist/search-Bt1PL1jf.mjs +0 -448
  1133. package/dist/search-Bt1PL1jf.mjs.map +0 -1
  1134. package/dist/sections-Ddptx_o9.mjs +0 -346
  1135. package/dist/sections-Ddptx_o9.mjs.map +0 -1
  1136. package/dist/seo-CZT2oLtT.mjs +0 -114
  1137. package/dist/seo-CZT2oLtT.mjs.map +0 -1
  1138. package/dist/seo-D5w3-Azy.mjs +0 -133
  1139. package/dist/seo-D5w3-Azy.mjs.map +0 -1
  1140. package/dist/service-DuykXPyW.mjs +0 -150
  1141. package/dist/service-DuykXPyW.mjs.map +0 -1
  1142. package/dist/session-user-BhaVp8w0.mjs +0 -51
  1143. package/dist/session-user-BhaVp8w0.mjs.map +0 -1
  1144. package/dist/settings-2xNYr90o.mjs +0 -51
  1145. package/dist/settings-2xNYr90o.mjs.map +0 -1
  1146. package/dist/settings-CgjRWGW9.mjs +0 -439
  1147. package/dist/settings-CgjRWGW9.mjs.map +0 -1
  1148. package/dist/settings-DYidIB26.mjs +0 -61
  1149. package/dist/settings-DYidIB26.mjs.map +0 -1
  1150. package/dist/setup-complete-bOogcHWG.mjs +0 -26
  1151. package/dist/setup-complete-bOogcHWG.mjs.map +0 -1
  1152. package/dist/setup-nonce-0EGuKM4s.mjs +0 -25
  1153. package/dist/setup-nonce-0EGuKM4s.mjs.map +0 -1
  1154. package/dist/site-settings-DOgRUoFX.mjs +0 -50
  1155. package/dist/site-settings-DOgRUoFX.mjs.map +0 -1
  1156. package/dist/site-url-BU_bbxwj.mjs +0 -16
  1157. package/dist/site-url-BU_bbxwj.mjs.map +0 -1
  1158. package/dist/snapshot-CugwUqKQ.mjs +0 -237
  1159. package/dist/snapshot-CugwUqKQ.mjs.map +0 -1
  1160. package/dist/ssrf-CJUnJymJ.mjs +0 -406
  1161. package/dist/ssrf-CJUnJymJ.mjs.map +0 -1
  1162. package/dist/stage-DgrBz_du.mjs +0 -662
  1163. package/dist/stage-DgrBz_du.mjs.map +0 -1
  1164. package/dist/state-DDiPySSG.mjs +0 -153
  1165. package/dist/state-DDiPySSG.mjs.map +0 -1
  1166. package/dist/status-DZKIG4a9.mjs +0 -30
  1167. package/dist/status-DZKIG4a9.mjs.map +0 -1
  1168. package/dist/storage-query-Bdv7A62k.d.mts +0 -1576
  1169. package/dist/storage-query-Bdv7A62k.d.mts.map +0 -1
  1170. package/dist/tar-_1AgTYFu.mjs +0 -449
  1171. package/dist/tar-_1AgTYFu.mjs.map +0 -1
  1172. package/dist/target-_7pn2Gbg.mjs +0 -27
  1173. package/dist/target-_7pn2Gbg.mjs.map +0 -1
  1174. package/dist/taxonomies-C1IwNe8Q.mjs +0 -697
  1175. package/dist/taxonomies-C1IwNe8Q.mjs.map +0 -1
  1176. package/dist/taxonomies-C_XMoRcX.mjs +0 -939
  1177. package/dist/taxonomies-C_XMoRcX.mjs.map +0 -1
  1178. package/dist/taxonomy-C3Fu1YeH.mjs +0 -525
  1179. package/dist/taxonomy-C3Fu1YeH.mjs.map +0 -1
  1180. package/dist/tokens-u78jETkX.mjs +0 -171
  1181. package/dist/tokens-u78jETkX.mjs.map +0 -1
  1182. package/dist/transaction-BcJO4Tmc.mjs +0 -29
  1183. package/dist/transaction-BcJO4Tmc.mjs.map +0 -1
  1184. package/dist/transfer-BhUCrgDc.mjs +0 -8675
  1185. package/dist/transfer-BhUCrgDc.mjs.map +0 -1
  1186. package/dist/transfer-DIGvR9Af.mjs +0 -166
  1187. package/dist/transfer-DIGvR9Af.mjs.map +0 -1
  1188. package/dist/transfer-download-Pml7RMio.mjs +0 -33
  1189. package/dist/transfer-download-Pml7RMio.mjs.map +0 -1
  1190. package/dist/transformations-9gfpwY65.mjs +0 -196
  1191. package/dist/transformations-9gfpwY65.mjs.map +0 -1
  1192. package/dist/transport-BIfH7_hx.d.mts +0 -42
  1193. package/dist/transport-BIfH7_hx.d.mts.map +0 -1
  1194. package/dist/transport-DKWIq53q.mjs +0 -136
  1195. package/dist/transport-DKWIq53q.mjs.map +0 -1
  1196. package/dist/trusted-proxy-tKiVtyTD.mjs +0 -51
  1197. package/dist/trusted-proxy-tKiVtyTD.mjs.map +0 -1
  1198. package/dist/turnstile-DpsoyOfg.mjs +0 -53
  1199. package/dist/turnstile-DpsoyOfg.mjs.map +0 -1
  1200. package/dist/types-B4sUC2p1.d.mts +0 -198
  1201. package/dist/types-B4sUC2p1.d.mts.map +0 -1
  1202. package/dist/types-B7Lmsh1E.d.mts +0 -887
  1203. package/dist/types-B7Lmsh1E.d.mts.map +0 -1
  1204. package/dist/types-BZakh7Ym.mjs +0 -22
  1205. package/dist/types-BZakh7Ym.mjs.map +0 -1
  1206. package/dist/types-B_CppEmv.d.mts +0 -264
  1207. package/dist/types-B_CppEmv.d.mts.map +0 -1
  1208. package/dist/types-BcrBrE6-.mjs +0 -159
  1209. package/dist/types-BcrBrE6-.mjs.map +0 -1
  1210. package/dist/types-BkUg2yHx.mjs +0 -92
  1211. package/dist/types-BkUg2yHx.mjs.map +0 -1
  1212. package/dist/types-CAZgq9fO.d.mts +0 -124
  1213. package/dist/types-CAZgq9fO.d.mts.map +0 -1
  1214. package/dist/types-Cd-O03VG.d.mts +0 -363
  1215. package/dist/types-Cd-O03VG.d.mts.map +0 -1
  1216. package/dist/types-Cr-Kg-3D.d.mts +0 -1641
  1217. package/dist/types-Cr-Kg-3D.d.mts.map +0 -1
  1218. package/dist/types-D2fvWd1i.d.mts +0 -359
  1219. package/dist/types-D2fvWd1i.d.mts.map +0 -1
  1220. package/dist/types-D7HUsguf.mjs +0 -77
  1221. package/dist/types-D7HUsguf.mjs.map +0 -1
  1222. package/dist/types-DA1Te3Oy.d.mts +0 -198
  1223. package/dist/types-DA1Te3Oy.d.mts.map +0 -1
  1224. package/dist/types-DhV6Q5bP.mjs +0 -18
  1225. package/dist/types-DhV6Q5bP.mjs.map +0 -1
  1226. package/dist/types-DnnVSl6Y.d.mts +0 -85
  1227. package/dist/types-DnnVSl6Y.d.mts.map +0 -1
  1228. package/dist/types-VT4-BugW.mjs +0 -16
  1229. package/dist/types-VT4-BugW.mjs.map +0 -1
  1230. package/dist/upload-attempts-B68ZGNu9.mjs +0 -32
  1231. package/dist/upload-attempts-B68ZGNu9.mjs.map +0 -1
  1232. package/dist/url-pattern-CCeZMGOh.mjs +0 -33
  1233. package/dist/url-pattern-CCeZMGOh.mjs.map +0 -1
  1234. package/dist/user-DDSL-sGw.mjs +0 -171
  1235. package/dist/user-DDSL-sGw.mjs.map +0 -1
  1236. package/dist/utils-DdhmO9w9.mjs +0 -439
  1237. package/dist/utils-DdhmO9w9.mjs.map +0 -1
  1238. package/dist/validate-CHosPEhs.mjs +0 -453
  1239. package/dist/validate-CHosPEhs.mjs.map +0 -1
  1240. package/dist/validate-CM79QXYE.d.mts +0 -432
  1241. package/dist/validate-CM79QXYE.d.mts.map +0 -1
  1242. package/dist/validation-BFecQczG.mjs +0 -218
  1243. package/dist/validation-BFecQczG.mjs.map +0 -1
  1244. package/dist/version-BRZXVifl.mjs +0 -9
  1245. package/dist/version-BRZXVifl.mjs.map +0 -1
  1246. package/dist/version-DUQDHgrf.mjs +0 -7
  1247. package/dist/version-DUQDHgrf.mjs.map +0 -1
  1248. package/dist/widgets-WdV72brA.mjs +0 -126
  1249. package/dist/widgets-WdV72brA.mjs.map +0 -1
  1250. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts +0 -34
  1251. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts.map +0 -1
  1252. package/dist/wxr-taxonomies-DP6ESgMN.mjs +0 -372
  1253. package/dist/wxr-taxonomies-DP6ESgMN.mjs.map +0 -1
  1254. package/dist/zod-generator-D6uE4WiS.mjs +0 -389
  1255. package/dist/zod-generator-D6uE4WiS.mjs.map +0 -1
  1256. package/src/astro/routes/api/relations/[id]/translations.ts +0 -33
  1257. /package/dist/{api-tokens-CE1ECIg0.mjs → api-tokens-FaG1zPsj.mjs} +0 -0
  1258. /package/dist/{ssrf-DpBH7aOt.mjs → ssrf-DZOt8Qof.mjs} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-deletion-CLCdXsnV.mjs","names":[],"sources":["../src/media/usage/collection-deletion.ts"],"sourcesContent":["import { sql, type Kysely, type RawBuilder, type Selectable, type Transaction } from \"kysely\";\nimport { ulid } from \"ulidx\";\n\nimport { isPostgres } from \"../../database/dialect-helpers.js\";\nimport {\n\tdecodeCursor,\n\tencodeCursor,\n\ttype FindManyResult,\n} from \"../../database/repositories/types.js\";\nimport { withTransaction } from \"../../database/transaction.js\";\nimport type { Database, MediaUsageCollectionDeletionTable } from \"../../database/types.js\";\nimport { validateIdentifier } from \"../../database/validate.js\";\nimport type {\n\tCollectionDeletionGuardInput,\n\tCollectionDeletionGuardResult,\n} from \"../../db/adapters.js\";\nimport { FTSManager } from \"../../search/fts-manager.js\";\nimport { isMissingTableError } from \"../../utils/db-errors.js\";\nimport { verifyMediaUsageCaptureTriggers } from \"./capture-triggers.js\";\n\nconst ACTIVATION_KEY = \"incremental_capture\";\nconst VIRTUAL_DIALECT_ID = \"virtual:emdash/dialect\";\n\nexport type MediaUsageCollectionDeletionState = \"pending\" | \"retry\" | \"leased\" | \"failed\";\nexport type MediaUsageCollectionDeletionPhase =\n\t| \"fence\"\n\t| \"registry\"\n\t| \"table\"\n\t| \"work\"\n\t| \"sources\"\n\t| \"status\"\n\t| \"finalize\";\n\nexport interface MediaUsageCollectionDeletionRecord {\n\tcollectionId: string;\n\tcollectionSlug: string;\n\tforceDelete: boolean;\n\tstate: MediaUsageCollectionDeletionState;\n\tphase: MediaUsageCollectionDeletionPhase;\n\tworkCursor: string | null;\n\tsourceKey: string | null;\n\toccurrenceCursor: 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 MediaUsageCollectionDeletionOperatorItem {\n\tcollectionId: string;\n\tcollectionSlug: string;\n\tstate: MediaUsageCollectionDeletionState;\n\tphase: MediaUsageCollectionDeletionPhase;\n\tattemptCount: number;\n\tnextAttemptAt: string;\n\tleaseExpiresAt: string | null;\n\tlastErrorCode: string | null;\n\tupdatedAt: string;\n}\n\nexport type MediaUsageCollectionDeletionRetryResult =\n\t| { outcome: \"pending\"; changed: boolean; item: MediaUsageCollectionDeletionOperatorItem }\n\t| { outcome: \"lease_active\"; leaseExpiresAt: string }\n\t| { outcome: \"not_found\" }\n\t| { outcome: \"conflict\" };\n\nexport class MediaUsageCollectionDeletionRepository {\n\tconstructor(private db: Kysely<Database>) {}\n\n\tasync createTombstone(input: {\n\t\tcollectionId: string;\n\t\tcollectionSlug: string;\n\t\tforceDelete: boolean;\n\t}): Promise<MediaUsageCollectionDeletionRecord> {\n\t\tassertIdentity(input);\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tawait this.db\n\t\t\t.insertInto(\"_emdash_media_usage_collection_deletions\")\n\t\t\t.values({\n\t\t\t\tcollection_id: input.collectionId,\n\t\t\t\tcollection_slug: input.collectionSlug,\n\t\t\t\tforce_delete: input.forceDelete ? 1 : 0,\n\t\t\t\tstate: \"pending\",\n\t\t\t\tphase: \"fence\",\n\t\t\t\tnext_attempt_at: now,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.onConflict((conflict) => conflict.column(\"collection_id\").doNothing())\n\t\t\t.execute();\n\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions\")\n\t\t\t.selectAll()\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.executeTakeFirstOrThrow();\n\t\tif (\n\t\t\trow.collection_slug !== input.collectionSlug ||\n\t\t\tBoolean(row.force_delete) !== input.forceDelete\n\t\t) {\n\t\t\tthrow new Error(\"Collection deletion tombstone identity conflicts with existing work\");\n\t\t}\n\t\treturn rowToRecord(row);\n\t}\n\n\tasync claim(input: {\n\t\tcollectionId: string;\n\t\tphase: MediaUsageCollectionDeletionPhase;\n\t\tleaseDurationSeconds: number;\n\t}): Promise<(MediaUsageCollectionDeletionRecord & { leaseToken: string }) | null> {\n\t\tif (!input.collectionId || !isPhase(input.phase)) {\n\t\t\tthrow new Error(\"Collection deletion claim requires an exact identity and phase\");\n\t\t}\n\t\tif (!Number.isSafeInteger(input.leaseDurationSeconds) || input.leaseDurationSeconds < 1) {\n\t\t\tthrow new Error(\"Collection deletion lease duration must be a positive whole number\");\n\t\t}\n\t\tconst leaseToken = ulid();\n\t\tconst row = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_collection_deletions\")\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(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"phase\", \"=\", input.phase)\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(\"state\", \"in\", [\"pending\", \"retry\"]),\n\t\t\t\t\t\ttimestampIsDue(this.db, \"next_attempt_at\"),\n\t\t\t\t\t]),\n\t\t\t\t\teb.and([eb(\"state\", \"=\", \"leased\"), timestampIsDue(this.db, \"lease_expires_at\")]),\n\t\t\t\t]),\n\t\t\t)\n\t\t\t.returningAll()\n\t\t\t.executeTakeFirst();\n\t\tif (!row) return null;\n\t\treturn { ...rowToRecord(row), leaseToken };\n\t}\n\n\tasync findBySlug(collectionSlug: string): Promise<MediaUsageCollectionDeletionRecord | null> {\n\t\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\t\ttry {\n\t\t\tconst row = await this.db\n\t\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions\")\n\t\t\t\t.selectAll()\n\t\t\t\t.where(\"collection_slug\", \"=\", collectionSlug)\n\t\t\t\t.executeTakeFirst();\n\t\t\treturn row ? rowToRecord(row) : null;\n\t\t} catch (error) {\n\t\t\tif (isMissingTableError(error)) return null;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync findDue(limit: number): Promise<MediaUsageCollectionDeletionRecord[]> {\n\t\tif (!Number.isSafeInteger(limit) || limit < 1 || limit > 100) {\n\t\t\tthrow new Error(\"Collection deletion candidate limit must be from 1 to 100\");\n\t\t}\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<MediaUsageCollectionDeletionTable>>`\n\t\t\tWITH pending_candidates AS (\n\t\t\t\tSELECT * FROM _emdash_media_usage_collection_deletions\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_collection_deletions\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_collection_deletions\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 hasNonterminal(): Promise<boolean> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions\")\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 findOperatorPage(options: {\n\t\tstate?: MediaUsageCollectionDeletionState;\n\t\tlimit?: number;\n\t\tcursor?: string;\n\t}): Promise<FindManyResult<MediaUsageCollectionDeletionOperatorItem>> {\n\t\tconst state = options.state ?? \"failed\";\n\t\tif (!isState(state)) throw new Error(\"Invalid collection deletion state\");\n\t\tconst limit = options.limit ?? 50;\n\t\tif (!Number.isSafeInteger(limit) || limit < 1 || limit > 100) {\n\t\t\tthrow new Error(\"Collection deletion operator limit must be from 1 to 100\");\n\t\t}\n\t\tconst cursor = options.cursor ? decodeCursor(options.cursor) : null;\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions\")\n\t\t\t.selectAll()\n\t\t\t.where(\"state\", \"=\", state);\n\t\tif (cursor) {\n\t\t\tquery = query.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb(\"updated_at\", \"<\", cursor.orderValue),\n\t\t\t\t\teb.and([eb(\"updated_at\", \"=\", cursor.orderValue), eb(\"collection_id\", \"<\", cursor.id)]),\n\t\t\t\t]),\n\t\t\t);\n\t\t}\n\t\tconst rows = await query\n\t\t\t.orderBy(\"updated_at\", \"desc\")\n\t\t\t.orderBy(\"collection_id\", \"desc\")\n\t\t\t.limit(limit + 1)\n\t\t\t.execute();\n\t\tconst items = rows.slice(0, limit).map(rowToOperatorItem);\n\t\tconst result: FindManyResult<MediaUsageCollectionDeletionOperatorItem> = { items };\n\t\tif (rows.length > limit && items.length > 0) {\n\t\t\tconst last = items.at(-1)!;\n\t\t\tresult.nextCursor = encodeCursor(last.updatedAt, last.collectionId);\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync retryOperatorDeletion(input: {\n\t\tcollectionId: string;\n\t}): Promise<MediaUsageCollectionDeletionRetryResult> {\n\t\tif (!input.collectionId) throw new Error(\"Collection deletion retry requires an ID\");\n\t\tconst observed = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions\")\n\t\t\t.selectAll()\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.executeTakeFirst();\n\t\tif (!observed) return { outcome: \"not_found\" };\n\t\tif (observed.state === \"leased\" && observed.lease_expires_at) {\n\t\t\tconst live = await this.db\n\t\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions\")\n\t\t\t\t.select(\"lease_expires_at\")\n\t\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t\t.where(\"state\", \"=\", \"leased\")\n\t\t\t\t.where(liveLease(this.db))\n\t\t\t\t.executeTakeFirst();\n\t\t\tif (live?.lease_expires_at) {\n\t\t\t\treturn { outcome: \"lease_active\", leaseExpiresAt: live.lease_expires_at };\n\t\t\t}\n\t\t}\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst reopened = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_collection_deletions\")\n\t\t\t.set({\n\t\t\t\tstate: \"pending\",\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(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb(\"state\", \"in\", [\"failed\", \"retry\"]),\n\t\t\t\t\teb.and([eb(\"state\", \"=\", \"leased\"), timestampIsDue(this.db, \"lease_expires_at\")]),\n\t\t\t\t]),\n\t\t\t)\n\t\t\t.returningAll()\n\t\t\t.executeTakeFirst();\n\t\tif (reopened) {\n\t\t\treturn { outcome: \"pending\", changed: true, item: rowToOperatorItem(reopened) };\n\t\t}\n\t\treturn { outcome: \"conflict\" };\n\t}\n\n\tasync checkpoint(input: {\n\t\tcollectionId: string;\n\t\tleaseToken: string;\n\t\tfromPhase: MediaUsageCollectionDeletionPhase;\n\t\ttoPhase: MediaUsageCollectionDeletionPhase;\n\t}): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_collection_deletions\")\n\t\t\t.set({\n\t\t\t\tphase: input.toPhase,\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(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"state\", \"=\", \"leased\")\n\t\t\t.where(\"phase\", \"=\", input.fromPhase)\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 release(input: { collectionId: string; leaseToken: string }): 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_collection_deletions\")\n\t\t\t.set({\n\t\t\t\tstate: \"pending\",\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\tattempt_count: 0,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\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 cancelFence(input: { collectionId: string; leaseToken: string }): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.deleteFrom(\"_emdash_media_usage_collection_deletions\")\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"state\", \"=\", \"leased\")\n\t\t\t.where(\"phase\", \"=\", \"fence\")\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.numDeletedRows ?? 0) === 1;\n\t}\n\n\tasync recordFailure(input: {\n\t\tcollectionId: string;\n\t\tleaseToken: string;\n\t\terrorCode: string;\n\t\tterminal: boolean;\n\t\tretryDelaySeconds: number;\n\t}): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_collection_deletions\")\n\t\t\t.set({\n\t\t\t\tstate: input.terminal ? \"failed\" : \"retry\",\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(\"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 deleteRegistryAndCheckpoint(input: {\n\t\tcollectionId: string;\n\t\tcollectionSlug: string;\n\t\tleaseToken: string;\n\t}): Promise<boolean> {\n\t\treturn withTransaction(this.db, async (trx) => {\n\t\t\tawait trx\n\t\t\t\t.deleteFrom(\"_emdash_collections\")\n\t\t\t\t.where(\"id\", \"=\", input.collectionId)\n\t\t\t\t.where(\"slug\", \"=\", input.collectionSlug)\n\t\t\t\t.where((eb) =>\n\t\t\t\t\teb.exists(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions as deletion\")\n\t\t\t\t\t\t\t.select(\"deletion.collection_id\")\n\t\t\t\t\t\t\t.where(\"deletion.collection_id\", \"=\", input.collectionId)\n\t\t\t\t\t\t\t.where(\"deletion.collection_slug\", \"=\", input.collectionSlug)\n\t\t\t\t\t\t\t.where(\"deletion.state\", \"=\", \"leased\")\n\t\t\t\t\t\t\t.where(\"deletion.phase\", \"=\", \"registry\")\n\t\t\t\t\t\t\t.where(\"deletion.lease_token\", \"=\", input.leaseToken)\n\t\t\t\t\t\t\t.where(liveLease(trx, \"deletion.lease_expires_at\")),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.execute();\n\n\t\t\tconst checkpoint = await trx\n\t\t\t\t.updateTable(\"_emdash_media_usage_collection_deletions\")\n\t\t\t\t.set({ phase: \"table\", updated_at: timestampOffset(trx, 0) })\n\t\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t\t.where(\"collection_slug\", \"=\", input.collectionSlug)\n\t\t\t\t.where(\"state\", \"=\", \"leased\")\n\t\t\t\t.where(\"phase\", \"=\", \"registry\")\n\t\t\t\t.where(\"lease_token\", \"=\", input.leaseToken)\n\t\t\t\t.where(liveLease(trx))\n\t\t\t\t.executeTakeFirst();\n\t\t\treturn Number(checkpoint.numUpdatedRows ?? 0) === 1;\n\t\t});\n\t}\n}\n\nexport type ActivatedCollectionDeletionOutcome =\n\t| \"inactive\"\n\t| \"not_found\"\n\t| \"in_progress\"\n\t| \"advanced\"\n\t| \"deleted\"\n\t| \"has_content\";\n\nexport async function deleteActivatedMediaUsageCollection(\n\tdb: Kysely<Database>,\n\tinput: {\n\t\tcollectionSlug: string;\n\t\tcollectionId?: string;\n\t\tforceDelete: boolean;\n\t},\n\toptions: {\n\t\tfrontPhaseLimit?: number;\n\t\tclaimed?: MediaUsageCollectionDeletionRecord & { leaseToken: string };\n\t} = {},\n): Promise<ActivatedCollectionDeletionOutcome> {\n\tconst frontPhaseLimit = options.frontPhaseLimit ?? 3;\n\tif (!Number.isSafeInteger(frontPhaseLimit) || frontPhaseLimit < 1 || frontPhaseLimit > 3) {\n\t\tthrow new Error(\"Collection deletion front-phase limit must be from 1 to 3\");\n\t}\n\tvalidateIdentifier(input.collectionSlug, \"collection slug\");\n\tconst repository = new MediaUsageCollectionDeletionRepository(db);\n\tlet deletion = await repository.findBySlug(input.collectionSlug);\n\tif (deletion && input.collectionId && deletion.collectionId !== input.collectionId) {\n\t\tthrow new Error(\"Collection deletion tombstone identity conflict\");\n\t}\n\tif (!deletion) {\n\t\tlet activation: { state: string } | undefined;\n\t\ttry {\n\t\t\tactivation = await db\n\t\t\t\t.selectFrom(\"_emdash_media_usage_activation\")\n\t\t\t\t.select(\"state\")\n\t\t\t\t.where(\"task_key\", \"=\", ACTIVATION_KEY)\n\t\t\t\t.executeTakeFirst();\n\t\t} catch (error) {\n\t\t\tif (!isMissingTableError(error)) throw error;\n\t\t}\n\t\tif (!activation || activation.state === \"expanded\") return \"inactive\";\n\t\tif (activation.state !== \"active\") {\n\t\t\tthrow new Error(\"Media usage activation must be active before collection deletion\");\n\t\t}\n\t\tif (!input.collectionId) return \"not_found\";\n\t\tawait assertActivatedCollectionDeletionReady(db, {\n\t\t\tcollectionId: input.collectionId,\n\t\t\tcollectionSlug: input.collectionSlug,\n\t\t});\n\t\tdeletion = await repository.createTombstone({\n\t\t\tcollectionId: input.collectionId,\n\t\t\tcollectionSlug: input.collectionSlug,\n\t\t\tforceDelete: input.forceDelete,\n\t\t});\n\t}\n\n\tif (deletion.phase !== \"fence\" && deletion.phase !== \"registry\" && deletion.phase !== \"table\") {\n\t\treturn \"deleted\";\n\t}\n\tconst claim =\n\t\toptions.claimed ??\n\t\t(await repository.claim({\n\t\t\tcollectionId: deletion.collectionId,\n\t\t\tphase: deletion.phase,\n\t\t\tleaseDurationSeconds: 5 * 60,\n\t\t}));\n\tif (!claim) return \"in_progress\";\n\tif (claim.collectionId !== deletion.collectionId || claim.phase !== deletion.phase) {\n\t\tthrow new Error(\"Collection deletion claim identity conflict\");\n\t}\n\tlet phase = claim.phase;\n\tlet processedFrontPhases = 0;\n\tconst lease = { collectionId: claim.collectionId, leaseToken: claim.leaseToken };\n\n\tif (phase === \"fence\") {\n\t\tconst captureState = await findCollectionCaptureState(db, claim);\n\t\tif (captureState !== \"active\" && captureState !== \"deleting\") {\n\t\t\tthrow new Error(\"Activated collection deletion requires a fenced capture lifecycle\");\n\t\t}\n\t\tif (!(await verifyMediaUsageCaptureTriggers(db, claim))) {\n\t\t\tthrow new Error(\"Activated collection deletion requires the exact capture trigger set\");\n\t\t}\n\t\tif (captureState === \"active\") {\n\t\t\tconst result = await executeCollectionDeletionGuard(db, {\n\t\t\t\taction: \"fence\",\n\t\t\t\tcollectionId: claim.collectionId,\n\t\t\t\tcollectionSlug: claim.collectionSlug,\n\t\t\t\tleaseToken: claim.leaseToken,\n\t\t\t\tforceDelete: claim.forceDelete,\n\t\t\t});\n\t\t\tif (result.outcome === \"has_content\") {\n\t\t\t\tif (!(await repository.cancelFence(lease))) {\n\t\t\t\t\tthrow new Error(\"Collection deletion lost its fence while preserving content\");\n\t\t\t\t}\n\t\t\t\treturn \"has_content\";\n\t\t\t}\n\t\t\tif (result.outcome !== \"fenced\") throw new Error(\"Collection deletion lost its fence\");\n\t\t}\n\t\tif (\n\t\t\t!(await repository.checkpoint({\n\t\t\t\t...lease,\n\t\t\t\tfromPhase: \"fence\",\n\t\t\t\ttoPhase: \"registry\",\n\t\t\t}))\n\t\t) {\n\t\t\tthrow new Error(\"Collection deletion lost its fence checkpoint\");\n\t\t}\n\t\tphase = \"registry\";\n\t\tprocessedFrontPhases++;\n\t\tif (processedFrontPhases >= frontPhaseLimit) {\n\t\t\tif (!(await repository.release(lease)))\n\t\t\t\tthrow new Error(\"Collection deletion lost its handoff\");\n\t\t\treturn \"advanced\";\n\t\t}\n\t}\n\n\tif (phase === \"registry\") {\n\t\tif (\n\t\t\t!(await repository.deleteRegistryAndCheckpoint({\n\t\t\t\t...lease,\n\t\t\t\tcollectionSlug: claim.collectionSlug,\n\t\t\t}))\n\t\t) {\n\t\t\tthrow new Error(\"Collection deletion lost its registry checkpoint\");\n\t\t}\n\t\tphase = \"table\";\n\t\tprocessedFrontPhases++;\n\t\tif (processedFrontPhases >= frontPhaseLimit) {\n\t\t\tif (!(await repository.release(lease)))\n\t\t\t\tthrow new Error(\"Collection deletion lost its handoff\");\n\t\t\treturn \"advanced\";\n\t\t}\n\t}\n\n\tif (phase === \"table\") {\n\t\tconst result = await executeCollectionDeletionGuard(db, {\n\t\t\taction: \"drop\",\n\t\t\tcollectionId: claim.collectionId,\n\t\t\tcollectionSlug: claim.collectionSlug,\n\t\t\tleaseToken: claim.leaseToken,\n\t\t});\n\t\tif (result.outcome !== \"dropped\") throw new Error(\"Collection deletion lost its table fence\");\n\t\tif (\n\t\t\t!(await repository.checkpoint({\n\t\t\t\t...lease,\n\t\t\t\tfromPhase: \"table\",\n\t\t\t\ttoPhase: \"work\",\n\t\t\t}))\n\t\t) {\n\t\t\tthrow new Error(\"Collection deletion lost its table checkpoint\");\n\t\t}\n\t}\n\n\tif (!(await repository.release(lease))) {\n\t\tthrow new Error(\"Collection deletion lost its cleanup handoff\");\n\t}\n\treturn \"deleted\";\n}\n\nexport async function isMediaUsageCollectionSlugDeleting(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n): Promise<boolean> {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\ttry {\n\t\tconst row = await db\n\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions\")\n\t\t\t.select(\"collection_id\")\n\t\t\t.where(\"collection_slug\", \"=\", collectionSlug)\n\t\t\t.executeTakeFirst();\n\t\treturn row !== undefined;\n\t} catch (error) {\n\t\tif (isMissingTableError(error)) return false;\n\t\tthrow error;\n\t}\n}\n\nasync function assertActivatedCollectionDeletionReady(\n\tdb: Kysely<Database>,\n\tidentity: { collectionId: string; collectionSlug: string },\n): Promise<void> {\n\tconst captureState = await findCollectionCaptureState(db, identity);\n\tif (captureState !== \"active\") {\n\t\tthrow new Error(\"Activated collection deletion requires an active capture lifecycle\");\n\t}\n\tif (!(await verifyMediaUsageCaptureTriggers(db, identity))) {\n\t\tthrow new Error(\"Activated collection deletion requires the exact capture trigger set\");\n\t}\n}\n\nasync function findCollectionCaptureState(\n\tdb: Kysely<Database>,\n\tidentity: { collectionId: string; collectionSlug: string },\n): Promise<string | null> {\n\tconst lifecycle = await db\n\t\t.selectFrom(\"_emdash_media_usage_index_status\")\n\t\t.select(\"capture_state\")\n\t\t.where(\"adapter_id\", \"=\", \"content-media\")\n\t\t.where(\"scope_type\", \"=\", \"collection\")\n\t\t.where(\"scope_key\", \"=\", identity.collectionSlug)\n\t\t.where(\"collection_id\", \"=\", identity.collectionId)\n\t\t.executeTakeFirst();\n\treturn lifecycle?.capture_state ?? null;\n}\n\nasync function executeCollectionDeletionGuard(\n\tdb: Kysely<Database>,\n\tinput: CollectionDeletionGuardInput,\n): Promise<CollectionDeletionGuardResult> {\n\tconst executeAdapterGuard = await loadAdapterCollectionDeletionGuard();\n\tif (executeAdapterGuard) {\n\t\tconst { default: config } = await import(\"virtual:emdash/config\");\n\t\treturn executeAdapterGuard(config.database?.config, input);\n\t}\n\treturn executeLocalCollectionDeletionGuard(db, input);\n}\n\nasync function loadAdapterCollectionDeletionGuard(): Promise<\n\timport(\"../../db/adapters.js\").ExecuteCollectionDeletionGuard | undefined\n> {\n\ttry {\n\t\tconst dialect = await import(\"virtual:emdash/dialect\");\n\t\treturn dialect.executeCollectionDeletionGuard;\n\t} catch (error) {\n\t\tif (isVirtualDialectUnavailableError(error)) return undefined;\n\t\tthrow error;\n\t}\n}\n\nexport function isVirtualDialectUnavailableError(error: unknown): boolean {\n\tif (!(error instanceof Error) || !(\"code\" in error)) return false;\n\tif (error.code === \"ERR_MODULE_NOT_FOUND\") return error.message.includes(VIRTUAL_DIALECT_ID);\n\treturn (\n\t\terror.code === \"ERR_UNSUPPORTED_ESM_URL_SCHEME\" &&\n\t\terror.message.includes(\"Received protocol 'virtual:'\")\n\t);\n}\n\nexport async function executeLocalCollectionDeletionGuard(\n\tdb: Kysely<Database>,\n\tinput: CollectionDeletionGuardInput,\n): Promise<CollectionDeletionGuardResult> {\n\tassertGuardInput(input);\n\treturn db.transaction().execute(async (trx) => {\n\t\tif (!(await lockLiveTombstone(trx, input))) return { outcome: \"stale\" };\n\t\tif (input.action === \"fence\") return fenceCollection(trx, input);\n\n\t\tconst fts = new FTSManager(trx);\n\t\tawait fts.dropFtsTable(input.collectionSlug);\n\t\tawait sql`DROP TABLE IF EXISTS ${sql.ref(`ec_${input.collectionSlug}`)}`.execute(trx);\n\t\treturn { outcome: \"dropped\" };\n\t});\n}\n\nasync function fenceCollection(\n\ttrx: Transaction<Database>,\n\tinput: Extract<CollectionDeletionGuardInput, { action: \"fence\" }>,\n): Promise<CollectionDeletionGuardResult> {\n\tconst tableName = `ec_${input.collectionSlug}`;\n\tvalidateIdentifier(tableName, \"content table\");\n\tif (isPostgres(trx)) {\n\t\tawait sql`LOCK TABLE ${sql.ref(tableName)} IN SHARE ROW EXCLUSIVE MODE`.execute(trx);\n\t}\n\n\tif (!input.forceDelete) {\n\t\tconst content = await sql<{ present: number }>`\n\t\t\tSELECT 1 AS present FROM ${sql.ref(tableName)}\n\t\t\tWHERE deleted_at IS NULL\n\t\t\tLIMIT 1\n\t\t`.execute(trx);\n\t\tif (content.rows.length > 0) return { outcome: \"has_content\" };\n\t}\n\n\tconst result = await trx\n\t\t.updateTable(\"_emdash_media_usage_index_status as status\")\n\t\t.set({ capture_state: \"deleting\", updated_at: timestampOffset(trx, 0) })\n\t\t.where(\"status.adapter_id\", \"=\", \"content-media\")\n\t\t.where(\"status.scope_type\", \"=\", \"collection\")\n\t\t.where(\"status.scope_key\", \"=\", input.collectionSlug)\n\t\t.where(\"status.collection_id\", \"=\", input.collectionId)\n\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t.where((eb) =>\n\t\t\teb.exists(\n\t\t\t\teb\n\t\t\t\t\t.selectFrom(\"_emdash_collections as collection\")\n\t\t\t\t\t.select(\"collection.id\")\n\t\t\t\t\t.where(\"collection.id\", \"=\", input.collectionId)\n\t\t\t\t\t.where(\"collection.slug\", \"=\", input.collectionSlug),\n\t\t\t),\n\t\t)\n\t\t.executeTakeFirst();\n\treturn Number(result.numUpdatedRows ?? 0) === 1 ? { outcome: \"fenced\" } : { outcome: \"stale\" };\n}\n\nasync function lockLiveTombstone(\n\ttrx: Transaction<Database>,\n\tinput: CollectionDeletionGuardInput,\n): Promise<boolean> {\n\tconst phase = input.action === \"fence\" ? \"fence\" : \"table\";\n\tif (isPostgres(trx)) {\n\t\tconst row = await trx\n\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions\")\n\t\t\t.select(\"collection_id\")\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"collection_slug\", \"=\", input.collectionSlug)\n\t\t\t.where(\"state\", \"=\", \"leased\")\n\t\t\t.where(\"phase\", \"=\", phase)\n\t\t\t.where(\"lease_token\", \"=\", input.leaseToken)\n\t\t\t.where(liveLease(trx))\n\t\t\t.forUpdate()\n\t\t\t.executeTakeFirst();\n\t\treturn row !== undefined;\n\t}\n\n\tconst locked = await trx\n\t\t.updateTable(\"_emdash_media_usage_collection_deletions\")\n\t\t.set({ updated_at: sql<string>`updated_at` })\n\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t.where(\"collection_slug\", \"=\", input.collectionSlug)\n\t\t.where(\"state\", \"=\", \"leased\")\n\t\t.where(\"phase\", \"=\", phase)\n\t\t.where(\"lease_token\", \"=\", input.leaseToken)\n\t\t.where(liveLease(trx))\n\t\t.executeTakeFirst();\n\treturn Number(locked.numUpdatedRows ?? 0) === 1;\n}\n\nfunction assertIdentity(input: { collectionId: string; collectionSlug: string }): void {\n\tif (!input.collectionId) throw new Error(\"Collection deletion requires a collection ID\");\n\tvalidateIdentifier(input.collectionSlug, \"collection slug\");\n}\n\nfunction assertGuardInput(input: CollectionDeletionGuardInput): void {\n\tassertIdentity(input);\n\tif (!input.leaseToken) throw new Error(\"Collection deletion requires a lease token\");\n}\n\nfunction liveLease(db: Kysely<Database>, column = \"lease_expires_at\"): RawBuilder<boolean> {\n\tconst leaseExpiresAt = sql.ref(column);\n\treturn isPostgres(db)\n\t\t? sql<boolean>`${leaseExpiresAt}::timestamptz > clock_timestamp()`\n\t\t: sql<boolean>`${leaseExpiresAt} > strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n}\n\nfunction timestampIsDue(\n\tdb: Kysely<Database>,\n\tcolumn: \"next_attempt_at\" | \"lease_expires_at\",\n): RawBuilder<boolean> {\n\treturn isPostgres(db)\n\t\t? sql<boolean>`${sql.ref(column)} <= to_char(\n\t\t\tstatement_timestamp() AT TIME ZONE 'UTC',\n\t\t\t'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"'\n\t\t)`\n\t\t: sql<boolean>`${sql.ref(column)} <= 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\nexport function collectionDeletionCurrentTimestamp(db: Kysely<Database>): RawBuilder<string> {\n\treturn timestampOffset(db, 0);\n}\n\nfunction rowToRecord(\n\trow: Selectable<MediaUsageCollectionDeletionTable>,\n): MediaUsageCollectionDeletionRecord {\n\tif (!isState(row.state) || !isPhase(row.phase)) {\n\t\tthrow new Error(\"Invalid media usage collection deletion lifecycle\");\n\t}\n\treturn {\n\t\tcollectionId: row.collection_id,\n\t\tcollectionSlug: row.collection_slug,\n\t\tforceDelete: Boolean(row.force_delete),\n\t\tstate: row.state,\n\t\tphase: row.phase,\n\t\tworkCursor: row.work_cursor,\n\t\tsourceKey: row.source_key,\n\t\toccurrenceCursor: row.occurrence_cursor,\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 rowToOperatorItem(\n\trow: Selectable<MediaUsageCollectionDeletionTable>,\n): MediaUsageCollectionDeletionOperatorItem {\n\tconst deletion = rowToRecord(row);\n\treturn {\n\t\tcollectionId: deletion.collectionId,\n\t\tcollectionSlug: deletion.collectionSlug,\n\t\tstate: deletion.state,\n\t\tphase: deletion.phase,\n\t\tattemptCount: deletion.attemptCount,\n\t\tnextAttemptAt: deletion.nextAttemptAt,\n\t\tleaseExpiresAt: deletion.leaseExpiresAt,\n\t\tlastErrorCode: deletion.lastErrorCode,\n\t\tupdatedAt: deletion.updatedAt,\n\t};\n}\n\nfunction isState(value: string): value is MediaUsageCollectionDeletionState {\n\treturn value === \"pending\" || value === \"retry\" || value === \"leased\" || value === \"failed\";\n}\n\nfunction isPhase(value: string): value is MediaUsageCollectionDeletionPhase {\n\treturn (\n\t\tvalue === \"fence\" ||\n\t\tvalue === \"registry\" ||\n\t\tvalue === \"table\" ||\n\t\tvalue === \"work\" ||\n\t\tvalue === \"sources\" ||\n\t\tvalue === \"status\" ||\n\t\tvalue === \"finalize\"\n\t);\n}\n"],"mappings":"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"}
@@ -0,0 +1,217 @@
1
+ import { u as isPostgres, y as tableExists } from "./dialect-helpers-7_IqPdh9.mjs";
2
+ import { t as withTransaction } from "./transaction-DLPQWik1.mjs";
3
+ import { n as collectionDeletionCurrentTimestamp, r as deleteActivatedMediaUsageCollection, t as MediaUsageCollectionDeletionRepository } from "./collection-deletion-CLCdXsnV.mjs";
4
+ import { sql } from "kysely";
5
+
6
+ //#region src/media/usage/collection-deletion-processor.ts
7
+ const MEDIA_USAGE_COLLECTION_DELETION_LIMITS = Object.freeze({
8
+ candidatesPerTick: 4,
9
+ rowsPerBatch: 50,
10
+ leaseDurationSeconds: 300,
11
+ maxAttempts: 5,
12
+ retryBaseSeconds: 30,
13
+ retryMaxSeconds: 900
14
+ });
15
+ async function processDueMediaUsageCollectionDeletions(db) {
16
+ const repository = new MediaUsageCollectionDeletionRepository(db);
17
+ const candidates = await repository.findDue(MEDIA_USAGE_COLLECTION_DELETION_LIMITS.candidatesPerTick);
18
+ if (candidates.length === 0) return {
19
+ candidateCount: await repository.hasNonterminal() ? 1 : 0,
20
+ claimedCount: 0,
21
+ outcome: "idle"
22
+ };
23
+ let claim = null;
24
+ for (const candidate of candidates) {
25
+ claim = await repository.claim({
26
+ collectionId: candidate.collectionId,
27
+ phase: candidate.phase,
28
+ leaseDurationSeconds: MEDIA_USAGE_COLLECTION_DELETION_LIMITS.leaseDurationSeconds
29
+ });
30
+ if (claim?.leaseToken) break;
31
+ }
32
+ if (!claim?.leaseToken) return {
33
+ candidateCount: candidates.length,
34
+ claimedCount: 0,
35
+ outcome: "claim_lost"
36
+ };
37
+ try {
38
+ const processed = await processClaimedDeletion(db, claim);
39
+ if (!processed.finalized && !processed.released && !await repository.release(claim)) return {
40
+ candidateCount: candidates.length,
41
+ claimedCount: 1,
42
+ outcome: "claim_lost"
43
+ };
44
+ return {
45
+ candidateCount: candidates.length,
46
+ claimedCount: 1,
47
+ outcome: processed.finalized ? "finalized" : "progress"
48
+ };
49
+ } catch (error) {
50
+ const terminal = claim.attemptCount + 1 >= MEDIA_USAGE_COLLECTION_DELETION_LIMITS.maxAttempts;
51
+ if (!await repository.recordFailure({
52
+ collectionId: claim.collectionId,
53
+ leaseToken: claim.leaseToken,
54
+ errorCode: "MEDIA_USAGE_COLLECTION_DELETION_FAILED",
55
+ terminal,
56
+ retryDelaySeconds: retryDelaySeconds(claim.attemptCount)
57
+ })) return {
58
+ candidateCount: candidates.length,
59
+ claimedCount: 1,
60
+ outcome: "claim_lost"
61
+ };
62
+ console.error("[media-usage:collection-deletion] Processing failed:", error);
63
+ return {
64
+ candidateCount: candidates.length,
65
+ claimedCount: 1,
66
+ outcome: terminal ? "failed" : "retry"
67
+ };
68
+ }
69
+ }
70
+ async function processClaimedDeletion(db, claim) {
71
+ if (claim.phase === "fence" || claim.phase === "registry" || claim.phase === "table") {
72
+ await deleteActivatedMediaUsageCollection(db, {
73
+ collectionId: claim.collectionId,
74
+ collectionSlug: claim.collectionSlug,
75
+ forceDelete: claim.forceDelete
76
+ }, {
77
+ frontPhaseLimit: 1,
78
+ claimed: claim
79
+ });
80
+ return {
81
+ finalized: false,
82
+ released: true
83
+ };
84
+ }
85
+ if (claim.phase === "work") await processWorkBatch(db, claim);
86
+ if (claim.phase === "sources") await processSourceBatch(db, claim);
87
+ if (claim.phase === "status") await processStatus(db, claim);
88
+ if (claim.phase === "finalize") {
89
+ await finalizeDeletion(db, claim);
90
+ return {
91
+ finalized: true,
92
+ released: true
93
+ };
94
+ }
95
+ return {
96
+ finalized: false,
97
+ released: false
98
+ };
99
+ }
100
+ async function processWorkBatch(db, claim) {
101
+ await withTransaction(db, async (trx) => {
102
+ const rows = await trx.selectFrom("_emdash_media_usage_work").select("content_id").where("collection_id", "=", claim.collectionId).$if(claim.workCursor !== null, (query) => query.where("content_id", ">", claim.workCursor)).orderBy("content_id", "asc").limit(MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch + 1).execute();
103
+ const batch = rows.slice(0, MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch);
104
+ if (batch.length > 0) await trx.deleteFrom("_emdash_media_usage_work").where("collection_id", "=", claim.collectionId).where("content_id", "in", batch.map((row) => row.content_id)).where(liveLeaseGuard(trx, claim)).execute();
105
+ await updateDeletion(trx, claim, {
106
+ phase: rows.length > MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch ? "work" : "sources",
107
+ work_cursor: rows.length > MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch ? batch.at(-1).content_id : null
108
+ });
109
+ });
110
+ return false;
111
+ }
112
+ async function processSourceBatch(db, claim) {
113
+ await withTransaction(db, async (trx) => {
114
+ let sourceKey = claim.sourceKey;
115
+ if (!sourceKey) {
116
+ const source = await trx.selectFrom("_emdash_media_usage_sources").select("source_key").where("source_type", "=", "content").where("collection_id", "=", claim.collectionId).orderBy("source_key", "asc").limit(1).executeTakeFirst();
117
+ if (!source) {
118
+ await updateDeletion(trx, claim, {
119
+ phase: "status",
120
+ source_key: null,
121
+ occurrence_cursor: null
122
+ });
123
+ return;
124
+ }
125
+ sourceKey = source.source_key;
126
+ await updateDeletion(trx, claim, {
127
+ source_key: sourceKey,
128
+ occurrence_cursor: null
129
+ });
130
+ }
131
+ const occurrences = await trx.selectFrom("_emdash_media_usage").select("id").where("source_key", "=", sourceKey).$if(claim.occurrenceCursor !== null, (query) => query.where("id", ">", claim.occurrenceCursor)).orderBy("id", "asc").limit(MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch + 1).execute();
132
+ const batch = occurrences.slice(0, MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch);
133
+ if (batch.length > 0) await trx.deleteFrom("_emdash_media_usage").where("source_key", "=", sourceKey).where("id", "in", batch.map((row) => row.id)).where(liveLeaseGuard(trx, claim)).execute();
134
+ if (occurrences.length > MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch) {
135
+ await updateDeletion(trx, claim, {
136
+ source_key: sourceKey,
137
+ occurrence_cursor: batch.at(-1).id
138
+ });
139
+ return;
140
+ }
141
+ await trx.deleteFrom("_emdash_media_usage_sources").where("source_key", "=", sourceKey).where("source_type", "=", "content").where("collection_id", "=", claim.collectionId).where(liveLeaseGuard(trx, claim)).execute();
142
+ await updateDeletion(trx, claim, {
143
+ source_key: null,
144
+ occurrence_cursor: null
145
+ });
146
+ });
147
+ return false;
148
+ }
149
+ async function processStatus(db, claim) {
150
+ await withTransaction(db, async (trx) => {
151
+ if (await exactCleanupRowsRemain(trx, claim, false)) throw new Error("Collection deletion cleanup is incomplete");
152
+ await trx.deleteFrom("_emdash_media_usage_reconciliations").where("collection_id", "=", claim.collectionId).where("collection_slug", "=", claim.collectionSlug).where(liveLeaseGuard(trx, claim)).execute();
153
+ await trx.deleteFrom("_emdash_media_usage_index_status").where("adapter_id", "=", "content-media").where("scope_type", "=", "collection").where("scope_key", "=", claim.collectionSlug).where("collection_id", "=", claim.collectionId).where(liveLeaseGuard(trx, claim)).execute();
154
+ await updateDeletion(trx, claim, { phase: "finalize" });
155
+ });
156
+ return false;
157
+ }
158
+ async function finalizeDeletion(db, claim) {
159
+ if (await tableExists(db, `ec_${claim.collectionSlug}`)) throw new Error("Collection table still exists during deletion finalization");
160
+ if (await exactCleanupRowsRemain(db, claim)) throw new Error("Collection deletion is incomplete");
161
+ if (await db.selectFrom("_emdash_collections").select("id").where("id", "=", claim.collectionId).where("slug", "=", claim.collectionSlug).executeTakeFirst()) throw new Error("Collection registry identity still exists");
162
+ const result = await db.deleteFrom("_emdash_media_usage_collection_deletions").where("collection_id", "=", claim.collectionId).where("collection_slug", "=", claim.collectionSlug).where("state", "=", "leased").where("phase", "=", "finalize").where("lease_token", "=", claim.leaseToken).where(liveLeaseGuard(db, claim)).executeTakeFirst();
163
+ if (Number(result.numDeletedRows ?? 0) !== 1) throw new Error("Collection deletion lost finalization");
164
+ return true;
165
+ }
166
+ async function exactCleanupRowsRemain(db, claim, includeStatus = true) {
167
+ const row = (await sql`
168
+ SELECT
169
+ EXISTS (
170
+ SELECT 1 FROM _emdash_media_usage_work
171
+ WHERE collection_id = ${claim.collectionId}
172
+ ) AS work_present,
173
+ EXISTS (
174
+ SELECT 1 FROM _emdash_media_usage_sources
175
+ WHERE source_type = 'content' AND collection_id = ${claim.collectionId}
176
+ ) AS source_present,
177
+ EXISTS (
178
+ SELECT 1 FROM _emdash_media_usage_index_status
179
+ WHERE adapter_id = 'content-media'
180
+ AND scope_type = 'collection'
181
+ AND scope_key = ${claim.collectionSlug}
182
+ AND collection_id = ${claim.collectionId}
183
+ ) AS status_present
184
+ `.execute(db)).rows[0];
185
+ return Boolean(row?.work_present) || Boolean(row?.source_present) || includeStatus && Boolean(row?.status_present);
186
+ }
187
+ async function updateDeletion(db, claim, values) {
188
+ const result = await db.updateTable("_emdash_media_usage_collection_deletions").set({
189
+ ...values,
190
+ attempt_count: 0,
191
+ last_error_code: null,
192
+ updated_at: collectionDeletionCurrentTimestamp(db)
193
+ }).where("collection_id", "=", claim.collectionId).where("state", "=", "leased").where("lease_token", "=", claim.leaseToken).where(liveLeaseGuard(db, claim)).executeTakeFirst();
194
+ if (Number(result.numUpdatedRows ?? 0) !== 1) throw new Error("Collection deletion lease was lost");
195
+ }
196
+ function liveLeaseGuard(db, claim) {
197
+ return isPostgres(db) ? sql`EXISTS (
198
+ SELECT 1 FROM _emdash_media_usage_collection_deletions AS deletion
199
+ WHERE deletion.collection_id = ${claim.collectionId}
200
+ AND deletion.state = 'leased'
201
+ AND deletion.lease_token = ${claim.leaseToken}
202
+ AND deletion.lease_expires_at::timestamptz > clock_timestamp()
203
+ )` : sql`EXISTS (
204
+ SELECT 1 FROM _emdash_media_usage_collection_deletions AS deletion
205
+ WHERE deletion.collection_id = ${claim.collectionId}
206
+ AND deletion.state = 'leased'
207
+ AND deletion.lease_token = ${claim.leaseToken}
208
+ AND deletion.lease_expires_at > strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
209
+ )`;
210
+ }
211
+ function retryDelaySeconds(attemptCount) {
212
+ return Math.min(MEDIA_USAGE_COLLECTION_DELETION_LIMITS.retryMaxSeconds, MEDIA_USAGE_COLLECTION_DELETION_LIMITS.retryBaseSeconds * 2 ** attemptCount);
213
+ }
214
+
215
+ //#endregion
216
+ export { processDueMediaUsageCollectionDeletions as t };
217
+ //# sourceMappingURL=collection-deletion-processor-hNw8x01F.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-deletion-processor-hNw8x01F.mjs","names":[],"sources":["../src/media/usage/collection-deletion-processor.ts"],"sourcesContent":["import { sql, type Kysely, type RawBuilder, type Transaction, type Updateable } from \"kysely\";\n\nimport { isPostgres, tableExists } from \"../../database/dialect-helpers.js\";\nimport { withTransaction } from \"../../database/transaction.js\";\nimport type { Database, MediaUsageCollectionDeletionTable } from \"../../database/types.js\";\nimport {\n\tcollectionDeletionCurrentTimestamp,\n\tdeleteActivatedMediaUsageCollection,\n\tMediaUsageCollectionDeletionRepository,\n\ttype MediaUsageCollectionDeletionRecord,\n} from \"./collection-deletion.js\";\n\nexport const MEDIA_USAGE_COLLECTION_DELETION_LIMITS = Object.freeze({\n\tcandidatesPerTick: 4,\n\trowsPerBatch: 50,\n\tleaseDurationSeconds: 5 * 60,\n\tmaxAttempts: 5,\n\tretryBaseSeconds: 30,\n\tretryMaxSeconds: 15 * 60,\n});\n\nexport interface MediaUsageCollectionDeletionTickResult {\n\tcandidateCount: number;\n\tclaimedCount: number;\n\toutcome: \"idle\" | \"progress\" | \"finalized\" | \"retry\" | \"failed\" | \"claim_lost\";\n}\n\ntype DatabaseExecutor = Kysely<Database> | Transaction<Database>;\n\nexport async function processDueMediaUsageCollectionDeletions(\n\tdb: Kysely<Database>,\n): Promise<MediaUsageCollectionDeletionTickResult> {\n\tconst repository = new MediaUsageCollectionDeletionRepository(db);\n\tconst candidates = await repository.findDue(\n\t\tMEDIA_USAGE_COLLECTION_DELETION_LIMITS.candidatesPerTick,\n\t);\n\tif (candidates.length === 0) {\n\t\treturn {\n\t\t\tcandidateCount: (await repository.hasNonterminal()) ? 1 : 0,\n\t\t\tclaimedCount: 0,\n\t\t\toutcome: \"idle\",\n\t\t};\n\t}\n\n\tlet claim: (MediaUsageCollectionDeletionRecord & { leaseToken: string }) | null = null;\n\tfor (const candidate of candidates) {\n\t\tclaim = await repository.claim({\n\t\t\tcollectionId: candidate.collectionId,\n\t\t\tphase: candidate.phase,\n\t\t\tleaseDurationSeconds: MEDIA_USAGE_COLLECTION_DELETION_LIMITS.leaseDurationSeconds,\n\t\t});\n\t\tif (claim?.leaseToken) break;\n\t}\n\tif (!claim?.leaseToken) {\n\t\treturn { candidateCount: candidates.length, claimedCount: 0, outcome: \"claim_lost\" };\n\t}\n\n\ttry {\n\t\tconst processed = await processClaimedDeletion(db, claim);\n\t\tif (!processed.finalized && !processed.released && !(await repository.release(claim))) {\n\t\t\treturn { candidateCount: candidates.length, claimedCount: 1, outcome: \"claim_lost\" };\n\t\t}\n\t\treturn {\n\t\t\tcandidateCount: candidates.length,\n\t\t\tclaimedCount: 1,\n\t\t\toutcome: processed.finalized ? \"finalized\" : \"progress\",\n\t\t};\n\t} catch (error) {\n\t\tconst terminal = claim.attemptCount + 1 >= MEDIA_USAGE_COLLECTION_DELETION_LIMITS.maxAttempts;\n\t\tconst recorded = await repository.recordFailure({\n\t\t\tcollectionId: claim.collectionId,\n\t\t\tleaseToken: claim.leaseToken,\n\t\t\terrorCode: \"MEDIA_USAGE_COLLECTION_DELETION_FAILED\",\n\t\t\tterminal,\n\t\t\tretryDelaySeconds: retryDelaySeconds(claim.attemptCount),\n\t\t});\n\t\tif (!recorded) {\n\t\t\treturn { candidateCount: candidates.length, claimedCount: 1, outcome: \"claim_lost\" };\n\t\t}\n\t\tconsole.error(\"[media-usage:collection-deletion] Processing failed:\", error);\n\t\treturn {\n\t\t\tcandidateCount: candidates.length,\n\t\t\tclaimedCount: 1,\n\t\t\toutcome: terminal ? \"failed\" : \"retry\",\n\t\t};\n\t}\n}\n\nasync function processClaimedDeletion(\n\tdb: Kysely<Database>,\n\tclaim: MediaUsageCollectionDeletionRecord & { leaseToken: string },\n): Promise<{ finalized: boolean; released: boolean }> {\n\tif (claim.phase === \"fence\" || claim.phase === \"registry\" || claim.phase === \"table\") {\n\t\tawait deleteActivatedMediaUsageCollection(\n\t\t\tdb,\n\t\t\t{\n\t\t\t\tcollectionId: claim.collectionId,\n\t\t\t\tcollectionSlug: claim.collectionSlug,\n\t\t\t\tforceDelete: claim.forceDelete,\n\t\t\t},\n\t\t\t{ frontPhaseLimit: 1, claimed: claim },\n\t\t);\n\t\treturn { finalized: false, released: true };\n\t}\n\tif (claim.phase === \"work\") await processWorkBatch(db, claim);\n\tif (claim.phase === \"sources\") await processSourceBatch(db, claim);\n\tif (claim.phase === \"status\") await processStatus(db, claim);\n\tif (claim.phase === \"finalize\") {\n\t\tawait finalizeDeletion(db, claim);\n\t\treturn { finalized: true, released: true };\n\t}\n\treturn { finalized: false, released: false };\n}\n\nasync function processWorkBatch(\n\tdb: Kysely<Database>,\n\tclaim: MediaUsageCollectionDeletionRecord & { leaseToken: string },\n): Promise<boolean> {\n\tawait withTransaction(db, async (trx) => {\n\t\tconst rows = await trx\n\t\t\t.selectFrom(\"_emdash_media_usage_work\")\n\t\t\t.select(\"content_id\")\n\t\t\t.where(\"collection_id\", \"=\", claim.collectionId)\n\t\t\t.$if(claim.workCursor !== null, (query) => query.where(\"content_id\", \">\", claim.workCursor!))\n\t\t\t.orderBy(\"content_id\", \"asc\")\n\t\t\t.limit(MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch + 1)\n\t\t\t.execute();\n\t\tconst batch = rows.slice(0, MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch);\n\t\tif (batch.length > 0) {\n\t\t\tawait trx\n\t\t\t\t.deleteFrom(\"_emdash_media_usage_work\")\n\t\t\t\t.where(\"collection_id\", \"=\", claim.collectionId)\n\t\t\t\t.where(\n\t\t\t\t\t\"content_id\",\n\t\t\t\t\t\"in\",\n\t\t\t\t\tbatch.map((row) => row.content_id),\n\t\t\t\t)\n\t\t\t\t.where(liveLeaseGuard(trx, claim))\n\t\t\t\t.execute();\n\t\t}\n\t\tawait updateDeletion(trx, claim, {\n\t\t\tphase: rows.length > MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch ? \"work\" : \"sources\",\n\t\t\twork_cursor:\n\t\t\t\trows.length > MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch\n\t\t\t\t\t? batch.at(-1)!.content_id\n\t\t\t\t\t: null,\n\t\t});\n\t});\n\treturn false;\n}\n\nasync function processSourceBatch(\n\tdb: Kysely<Database>,\n\tclaim: MediaUsageCollectionDeletionRecord & { leaseToken: string },\n): Promise<boolean> {\n\tawait withTransaction(db, async (trx) => {\n\t\tlet sourceKey = claim.sourceKey;\n\t\tif (!sourceKey) {\n\t\t\tconst source = await trx\n\t\t\t\t.selectFrom(\"_emdash_media_usage_sources\")\n\t\t\t\t.select(\"source_key\")\n\t\t\t\t.where(\"source_type\", \"=\", \"content\")\n\t\t\t\t.where(\"collection_id\", \"=\", claim.collectionId)\n\t\t\t\t.orderBy(\"source_key\", \"asc\")\n\t\t\t\t.limit(1)\n\t\t\t\t.executeTakeFirst();\n\t\t\tif (!source) {\n\t\t\t\tawait updateDeletion(trx, claim, {\n\t\t\t\t\tphase: \"status\",\n\t\t\t\t\tsource_key: null,\n\t\t\t\t\toccurrence_cursor: null,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsourceKey = source.source_key;\n\t\t\tawait updateDeletion(trx, claim, { source_key: sourceKey, occurrence_cursor: null });\n\t\t}\n\n\t\tconst occurrences = await trx\n\t\t\t.selectFrom(\"_emdash_media_usage\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"source_key\", \"=\", sourceKey)\n\t\t\t.$if(claim.occurrenceCursor !== null, (query) =>\n\t\t\t\tquery.where(\"id\", \">\", claim.occurrenceCursor!),\n\t\t\t)\n\t\t\t.orderBy(\"id\", \"asc\")\n\t\t\t.limit(MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch + 1)\n\t\t\t.execute();\n\t\tconst batch = occurrences.slice(0, MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch);\n\t\tif (batch.length > 0) {\n\t\t\tawait trx\n\t\t\t\t.deleteFrom(\"_emdash_media_usage\")\n\t\t\t\t.where(\"source_key\", \"=\", sourceKey)\n\t\t\t\t.where(\n\t\t\t\t\t\"id\",\n\t\t\t\t\t\"in\",\n\t\t\t\t\tbatch.map((row) => row.id),\n\t\t\t\t)\n\t\t\t\t.where(liveLeaseGuard(trx, claim))\n\t\t\t\t.execute();\n\t\t}\n\t\tif (occurrences.length > MEDIA_USAGE_COLLECTION_DELETION_LIMITS.rowsPerBatch) {\n\t\t\tawait updateDeletion(trx, claim, {\n\t\t\t\tsource_key: sourceKey,\n\t\t\t\toccurrence_cursor: batch.at(-1)!.id,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tawait trx\n\t\t\t.deleteFrom(\"_emdash_media_usage_sources\")\n\t\t\t.where(\"source_key\", \"=\", sourceKey)\n\t\t\t.where(\"source_type\", \"=\", \"content\")\n\t\t\t.where(\"collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(liveLeaseGuard(trx, claim))\n\t\t\t.execute();\n\t\tawait updateDeletion(trx, claim, { source_key: null, occurrence_cursor: null });\n\t});\n\treturn false;\n}\n\nasync function processStatus(\n\tdb: Kysely<Database>,\n\tclaim: MediaUsageCollectionDeletionRecord & { leaseToken: string },\n): Promise<boolean> {\n\tawait withTransaction(db, async (trx) => {\n\t\tif (await exactCleanupRowsRemain(trx, claim, false)) {\n\t\t\tthrow new Error(\"Collection deletion cleanup is incomplete\");\n\t\t}\n\t\tawait trx\n\t\t\t.deleteFrom(\"_emdash_media_usage_reconciliations\")\n\t\t\t.where(\"collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(\"collection_slug\", \"=\", claim.collectionSlug)\n\t\t\t.where(liveLeaseGuard(trx, claim))\n\t\t\t.execute();\n\t\tawait trx\n\t\t\t.deleteFrom(\"_emdash_media_usage_index_status\")\n\t\t\t.where(\"adapter_id\", \"=\", \"content-media\")\n\t\t\t.where(\"scope_type\", \"=\", \"collection\")\n\t\t\t.where(\"scope_key\", \"=\", claim.collectionSlug)\n\t\t\t.where(\"collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(liveLeaseGuard(trx, claim))\n\t\t\t.execute();\n\t\tawait updateDeletion(trx, claim, { phase: \"finalize\" });\n\t});\n\treturn false;\n}\n\nasync function finalizeDeletion(\n\tdb: Kysely<Database>,\n\tclaim: MediaUsageCollectionDeletionRecord & { leaseToken: string },\n): Promise<boolean> {\n\tif (await tableExists(db, `ec_${claim.collectionSlug}`)) {\n\t\tthrow new Error(\"Collection table still exists during deletion finalization\");\n\t}\n\tif (await exactCleanupRowsRemain(db, claim)) throw new Error(\"Collection deletion is incomplete\");\n\tconst registry = await db\n\t\t.selectFrom(\"_emdash_collections\")\n\t\t.select(\"id\")\n\t\t.where(\"id\", \"=\", claim.collectionId)\n\t\t.where(\"slug\", \"=\", claim.collectionSlug)\n\t\t.executeTakeFirst();\n\tif (registry) throw new Error(\"Collection registry identity still exists\");\n\tconst result = await db\n\t\t.deleteFrom(\"_emdash_media_usage_collection_deletions\")\n\t\t.where(\"collection_id\", \"=\", claim.collectionId)\n\t\t.where(\"collection_slug\", \"=\", claim.collectionSlug)\n\t\t.where(\"state\", \"=\", \"leased\")\n\t\t.where(\"phase\", \"=\", \"finalize\")\n\t\t.where(\"lease_token\", \"=\", claim.leaseToken)\n\t\t.where(liveLeaseGuard(db, claim))\n\t\t.executeTakeFirst();\n\tif (Number(result.numDeletedRows ?? 0) !== 1)\n\t\tthrow new Error(\"Collection deletion lost finalization\");\n\treturn true;\n}\n\nasync function exactCleanupRowsRemain(\n\tdb: DatabaseExecutor,\n\tclaim: Pick<MediaUsageCollectionDeletionRecord, \"collectionId\" | \"collectionSlug\">,\n\tincludeStatus = true,\n): Promise<boolean> {\n\tconst result = await sql<{\n\t\twork_present: boolean | number;\n\t\tsource_present: boolean | number;\n\t\tstatus_present: boolean | number;\n\t}>`\n\t\tSELECT\n\t\t\tEXISTS (\n\t\t\t\tSELECT 1 FROM _emdash_media_usage_work\n\t\t\t\tWHERE collection_id = ${claim.collectionId}\n\t\t\t) AS work_present,\n\t\t\tEXISTS (\n\t\t\t\tSELECT 1 FROM _emdash_media_usage_sources\n\t\t\t\tWHERE source_type = 'content' AND collection_id = ${claim.collectionId}\n\t\t\t) AS source_present,\n\t\t\tEXISTS (\n\t\t\t\tSELECT 1 FROM _emdash_media_usage_index_status\n\t\t\t\tWHERE adapter_id = 'content-media'\n\t\t\t\t\tAND scope_type = 'collection'\n\t\t\t\t\tAND scope_key = ${claim.collectionSlug}\n\t\t\t\t\tAND collection_id = ${claim.collectionId}\n\t\t\t) AS status_present\n\t`.execute(db);\n\tconst row = result.rows[0];\n\treturn (\n\t\tBoolean(row?.work_present) ||\n\t\tBoolean(row?.source_present) ||\n\t\t(includeStatus && Boolean(row?.status_present))\n\t);\n}\n\nasync function updateDeletion(\n\tdb: DatabaseExecutor,\n\tclaim: MediaUsageCollectionDeletionRecord & { leaseToken: string },\n\tvalues: Updateable<MediaUsageCollectionDeletionTable>,\n): Promise<void> {\n\tconst result = await db\n\t\t.updateTable(\"_emdash_media_usage_collection_deletions\")\n\t\t.set({\n\t\t\t...values,\n\t\t\tattempt_count: 0,\n\t\t\tlast_error_code: null,\n\t\t\tupdated_at: collectionDeletionCurrentTimestamp(db),\n\t\t})\n\t\t.where(\"collection_id\", \"=\", claim.collectionId)\n\t\t.where(\"state\", \"=\", \"leased\")\n\t\t.where(\"lease_token\", \"=\", claim.leaseToken)\n\t\t.where(liveLeaseGuard(db, claim))\n\t\t.executeTakeFirst();\n\tif (Number(result.numUpdatedRows ?? 0) !== 1)\n\t\tthrow new Error(\"Collection deletion lease was lost\");\n}\n\nfunction liveLeaseGuard(\n\tdb: DatabaseExecutor,\n\tclaim: Pick<MediaUsageCollectionDeletionRecord, \"collectionId\"> & { leaseToken: string },\n): RawBuilder<boolean> {\n\treturn isPostgres(db)\n\t\t? sql<boolean>`EXISTS (\n\t\t\tSELECT 1 FROM _emdash_media_usage_collection_deletions AS deletion\n\t\t\tWHERE deletion.collection_id = ${claim.collectionId}\n\t\t\t\tAND deletion.state = 'leased'\n\t\t\t\tAND deletion.lease_token = ${claim.leaseToken}\n\t\t\t\tAND deletion.lease_expires_at::timestamptz > clock_timestamp()\n\t\t)`\n\t\t: sql<boolean>`EXISTS (\n\t\t\tSELECT 1 FROM _emdash_media_usage_collection_deletions AS deletion\n\t\t\tWHERE deletion.collection_id = ${claim.collectionId}\n\t\t\t\tAND deletion.state = 'leased'\n\t\t\t\tAND deletion.lease_token = ${claim.leaseToken}\n\t\t\t\tAND deletion.lease_expires_at > strftime('%Y-%m-%dT%H:%M:%fZ', 'now')\n\t\t)`;\n}\n\nfunction retryDelaySeconds(attemptCount: number): number {\n\treturn Math.min(\n\t\tMEDIA_USAGE_COLLECTION_DELETION_LIMITS.retryMaxSeconds,\n\t\tMEDIA_USAGE_COLLECTION_DELETION_LIMITS.retryBaseSeconds * 2 ** attemptCount,\n\t);\n}\n"],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { getRequestContext } from "./request-context.mjs";
2
+ import { r as requestCached } from "./request-cache-iHRlHx1d.mjs";
3
+
4
+ //#region src/schema/collection-slugs-cache.ts
5
+ const HOLDER_KEY = Symbol.for("emdash:collection-slugs");
6
+ const g = globalThis;
7
+ const holder = g[HOLDER_KEY] ?? (() => {
8
+ const h = {
9
+ promise: null,
10
+ fetchedAt: 0
11
+ };
12
+ g[HOLDER_KEY] = h;
13
+ return h;
14
+ })();
15
+ const REVALIDATE_WINDOW_MS = 6e4;
16
+ let revalidateWindowMs = REVALIDATE_WINDOW_MS;
17
+ async function fetchSlugs(db) {
18
+ const rows = await db.selectFrom("_emdash_collections").select("slug").execute();
19
+ return new Set(rows.map((row) => row.slug));
20
+ }
21
+ function loadSlugs(db) {
22
+ if (holder.promise) return holder.promise;
23
+ const promise = fetchSlugs(db).catch((error) => {
24
+ if (holder.promise === promise) holder.promise = null;
25
+ throw error;
26
+ });
27
+ holder.promise = promise;
28
+ holder.fetchedAt = Date.now();
29
+ return promise;
30
+ }
31
+ /**
32
+ * Keep only the collections that have a `_emdash_collections` row, i.e. whose
33
+ * `ec_*` table the registry has created. When the filter would drop a
34
+ * collection and the cached set is older than the revalidation window, the
35
+ * set is re-fetched once so a collection created by another isolate becomes
36
+ * visible without waiting for an isolate recycle.
37
+ */
38
+ async function filterToRegisteredCollections(db, collections) {
39
+ if (collections.length === 0) return [];
40
+ if (getRequestContext()?.dbIsIsolated === true) {
41
+ const slugs = await requestCached("collection-slugs", () => fetchSlugs(db));
42
+ return collections.filter((slug) => slugs.has(slug));
43
+ }
44
+ let slugs = await loadSlugs(db);
45
+ let present = collections.filter((slug) => slugs.has(slug));
46
+ if (present.length < collections.length && Date.now() - holder.fetchedAt > revalidateWindowMs) {
47
+ holder.promise = null;
48
+ slugs = await loadSlugs(db);
49
+ present = collections.filter((slug) => slugs.has(slug));
50
+ }
51
+ return present;
52
+ }
53
+ /**
54
+ * Seed the cache with slugs an init-time read already fetched, so the first
55
+ * render on a cold isolate pays no extra query. Called by the runtime's
56
+ * auto-seed gate.
57
+ */
58
+ function primeRegisteredCollections(slugs) {
59
+ holder.promise = Promise.resolve(new Set(slugs));
60
+ holder.fetchedAt = Date.now();
61
+ }
62
+ /**
63
+ * Drop the cached slug set so the next reader re-fetches. Called from every
64
+ * schema-mutation path (`invalidateUrlPatternCache`, `SchemaRegistry`
65
+ * create/delete). Other isolates converge through bounded revalidation.
66
+ */
67
+ function resetRegisteredCollectionsCache() {
68
+ holder.promise = null;
69
+ holder.fetchedAt = 0;
70
+ }
71
+ /**
72
+ * Note that a query hit a missing `ec_*` table despite the slug filter: the
73
+ * cached set is stale (the collection was deleted on another isolate) or the
74
+ * registry has drifted from the physical schema. Drops the cached set at most
75
+ * once per revalidation window, so the delete case converges like the create
76
+ * case while genuine drift costs one slug re-fetch per window instead of one
77
+ * per render.
78
+ */
79
+ function noteStaleRegisteredCollections() {
80
+ if (Date.now() - holder.fetchedAt > revalidateWindowMs) resetRegisteredCollectionsCache();
81
+ }
82
+
83
+ //#endregion
84
+ export { resetRegisteredCollectionsCache as i, noteStaleRegisteredCollections as n, primeRegisteredCollections as r, filterToRegisteredCollections as t };
85
+ //# sourceMappingURL=collection-slugs-cache-CUuiduLq.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-slugs-cache-CUuiduLq.mjs","names":[],"sources":["../src/schema/collection-slugs-cache.ts"],"sourcesContent":["/**\n * Per-isolate cache of registered collection slugs (`_emdash_collections`).\n *\n * Term counting scopes its per-collection UNION to a taxonomy's declared\n * collections, but a declared collection is not necessarily a created one:\n * the migration-seeded defaults declare `posts` whether or not that\n * collection ever exists. Querying optimistically and catching the\n * missing-table error keeps results correct, yet the failed statement itself\n * is logged by the database — on D1 it surfaces as a `no such table` error\n * span per taxonomy per uncached render. Filtering declared collections\n * against the registry up front means the failing statement is never sent.\n *\n * Stored on globalThis behind a Symbol key (same pattern as the taxonomy-defs\n * cache in `taxonomies/index.ts`) so bundler chunk duplication cannot produce\n * two independent caches. The promise is cached, so concurrent cold readers\n * share one in-flight query; a rejection evicts the entry.\n *\n * Freshness:\n * - Primed for free at isolate boot: runtime init's auto-seed gate already\n * reads `_emdash_collections` and hands the slugs to\n * `primeRegisteredCollections`, so cold isolates pay no extra query.\n * - Every schema-mutation path resets it: `invalidateUrlPatternCache()`\n * (admin API, MCP, WordPress import, seed application) and\n * `SchemaRegistry.createCollection`/`deleteCollection` for direct callers.\n * - Creations on *other* isolates surface through bounded revalidation: the\n * set is re-fetched only when the filter would actually drop a declared\n * collection and the cached copy is older than the revalidation window.\n * Sites whose declared collections all exist — the steady state — never\n * revalidate; a site with a genuinely absent collection pays one slug read\n * per window instead of one failing statement per render, and a collection\n * created elsewhere starts counting within the window.\n *\n * Isolated databases bypass the cache (playground / DO preview requests set\n * `requestContext.dbIsIsolated`): they point at a divergent schema, so the\n * slug set is fetched per request instead, deduped by the request cache.\n */\n\nimport type { Kysely } from \"kysely\";\n\nimport type { Database } from \"../database/types.js\";\nimport { requestCached } from \"../request-cache.js\";\nimport { getRequestContext } from \"../request-context.js\";\n\ninterface SlugsHolder {\n\tpromise: Promise<Set<string>> | null;\n\t/** When the cached promise was created; gates bounded revalidation. */\n\tfetchedAt: number;\n}\n\nconst HOLDER_KEY = Symbol.for(\"emdash:collection-slugs\");\nconst g = globalThis as Record<symbol, unknown>;\nconst holder: SlugsHolder =\n\t// eslint-disable-next-line typescript/no-unsafe-type-assertion -- globalThis singleton pattern (see request-cache.ts)\n\t(g[HOLDER_KEY] as SlugsHolder | undefined) ??\n\t(() => {\n\t\tconst h: SlugsHolder = { promise: null, fetchedAt: 0 };\n\t\tg[HOLDER_KEY] = h;\n\t\treturn h;\n\t})();\n\nconst REVALIDATE_WINDOW_MS = 60_000;\nlet revalidateWindowMs = REVALIDATE_WINDOW_MS;\n\nasync function fetchSlugs(db: Kysely<Database>): Promise<Set<string>> {\n\tconst rows = await db.selectFrom(\"_emdash_collections\").select(\"slug\").execute();\n\treturn new Set(rows.map((row) => row.slug));\n}\n\nfunction loadSlugs(db: Kysely<Database>): Promise<Set<string>> {\n\tif (holder.promise) return holder.promise;\n\tconst promise = fetchSlugs(db).catch((error: unknown) => {\n\t\tif (holder.promise === promise) holder.promise = null;\n\t\tthrow error;\n\t});\n\tholder.promise = promise;\n\tholder.fetchedAt = Date.now();\n\treturn promise;\n}\n\n/**\n * Keep only the collections that have a `_emdash_collections` row, i.e. whose\n * `ec_*` table the registry has created. When the filter would drop a\n * collection and the cached set is older than the revalidation window, the\n * set is re-fetched once so a collection created by another isolate becomes\n * visible without waiting for an isolate recycle.\n */\nexport async function filterToRegisteredCollections(\n\tdb: Kysely<Database>,\n\tcollections: readonly string[],\n): Promise<string[]> {\n\tif (collections.length === 0) return [];\n\tif (getRequestContext()?.dbIsIsolated === true) {\n\t\tconst slugs = await requestCached(\"collection-slugs\", () => fetchSlugs(db));\n\t\treturn collections.filter((slug) => slugs.has(slug));\n\t}\n\tlet slugs = await loadSlugs(db);\n\tlet present = collections.filter((slug) => slugs.has(slug));\n\tif (present.length < collections.length && Date.now() - holder.fetchedAt > revalidateWindowMs) {\n\t\tholder.promise = null;\n\t\tslugs = await loadSlugs(db);\n\t\tpresent = collections.filter((slug) => slugs.has(slug));\n\t}\n\treturn present;\n}\n\n/**\n * Seed the cache with slugs an init-time read already fetched, so the first\n * render on a cold isolate pays no extra query. Called by the runtime's\n * auto-seed gate.\n */\nexport function primeRegisteredCollections(slugs: readonly string[]): void {\n\tholder.promise = Promise.resolve(new Set(slugs));\n\tholder.fetchedAt = Date.now();\n}\n\n/**\n * Drop the cached slug set so the next reader re-fetches. Called from every\n * schema-mutation path (`invalidateUrlPatternCache`, `SchemaRegistry`\n * create/delete). Other isolates converge through bounded revalidation.\n */\nexport function resetRegisteredCollectionsCache(): void {\n\tholder.promise = null;\n\tholder.fetchedAt = 0;\n}\n\n/**\n * Note that a query hit a missing `ec_*` table despite the slug filter: the\n * cached set is stale (the collection was deleted on another isolate) or the\n * registry has drifted from the physical schema. Drops the cached set at most\n * once per revalidation window, so the delete case converges like the create\n * case while genuine drift costs one slug re-fetch per window instead of one\n * per render.\n */\nexport function noteStaleRegisteredCollections(): void {\n\tif (Date.now() - holder.fetchedAt > revalidateWindowMs) {\n\t\tresetRegisteredCollectionsCache();\n\t}\n}\n\n/**\n * Test/internal helper: reset the cache and restore the production\n * revalidation window.\n */\nexport function resetRegisteredCollectionsCacheForTests(): void {\n\tresetRegisteredCollectionsCache();\n\trevalidateWindowMs = REVALIDATE_WINDOW_MS;\n}\n\n/**\n * Test-only: shorten the revalidation window so the cross-isolate refresh\n * path can be exercised without waiting out the production window.\n *\n * @internal\n */\nexport function setRegisteredCollectionsRevalidateWindowForTests(ms: number): void {\n\trevalidateWindowMs = ms;\n}\n"],"mappings":";;;;AAiDA,MAAM,aAAa,OAAO,IAAI,0BAA0B;AACxD,MAAM,IAAI;AACV,MAAM,SAEJ,EAAE,sBACI;CACN,MAAM,IAAiB;EAAE,SAAS;EAAM,WAAW;EAAG;AACtD,GAAE,cAAc;AAChB,QAAO;IACJ;AAEL,MAAM,uBAAuB;AAC7B,IAAI,qBAAqB;AAEzB,eAAe,WAAW,IAA4C;CACrE,MAAM,OAAO,MAAM,GAAG,WAAW,sBAAsB,CAAC,OAAO,OAAO,CAAC,SAAS;AAChF,QAAO,IAAI,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC;;AAG5C,SAAS,UAAU,IAA4C;AAC9D,KAAI,OAAO,QAAS,QAAO,OAAO;CAClC,MAAM,UAAU,WAAW,GAAG,CAAC,OAAO,UAAmB;AACxD,MAAI,OAAO,YAAY,QAAS,QAAO,UAAU;AACjD,QAAM;GACL;AACF,QAAO,UAAU;AACjB,QAAO,YAAY,KAAK,KAAK;AAC7B,QAAO;;;;;;;;;AAUR,eAAsB,8BACrB,IACA,aACoB;AACpB,KAAI,YAAY,WAAW,EAAG,QAAO,EAAE;AACvC,KAAI,mBAAmB,EAAE,iBAAiB,MAAM;EAC/C,MAAM,QAAQ,MAAM,cAAc,0BAA0B,WAAW,GAAG,CAAC;AAC3E,SAAO,YAAY,QAAQ,SAAS,MAAM,IAAI,KAAK,CAAC;;CAErD,IAAI,QAAQ,MAAM,UAAU,GAAG;CAC/B,IAAI,UAAU,YAAY,QAAQ,SAAS,MAAM,IAAI,KAAK,CAAC;AAC3D,KAAI,QAAQ,SAAS,YAAY,UAAU,KAAK,KAAK,GAAG,OAAO,YAAY,oBAAoB;AAC9F,SAAO,UAAU;AACjB,UAAQ,MAAM,UAAU,GAAG;AAC3B,YAAU,YAAY,QAAQ,SAAS,MAAM,IAAI,KAAK,CAAC;;AAExD,QAAO;;;;;;;AAQR,SAAgB,2BAA2B,OAAgC;AAC1E,QAAO,UAAU,QAAQ,QAAQ,IAAI,IAAI,MAAM,CAAC;AAChD,QAAO,YAAY,KAAK,KAAK;;;;;;;AAQ9B,SAAgB,kCAAwC;AACvD,QAAO,UAAU;AACjB,QAAO,YAAY;;;;;;;;;;AAWpB,SAAgB,iCAAuC;AACtD,KAAI,KAAK,KAAK,GAAG,OAAO,YAAY,mBACnC,kCAAiC"}