emdash 0.39.1 → 0.40.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 (1649) hide show
  1. package/dist/action-token-DYwe4Pk0.mjs +26 -0
  2. package/dist/action-token-DYwe4Pk0.mjs.map +1 -0
  3. package/dist/activation-LOkDM5WT.mjs +382 -0
  4. package/dist/activation-LOkDM5WT.mjs.map +1 -0
  5. package/dist/adapters-B64LbYcB.d.mts +171 -0
  6. package/dist/adapters-B64LbYcB.d.mts.map +1 -0
  7. package/dist/allowed-origins-CHB8oZNM.mjs +116 -0
  8. package/dist/allowed-origins-CHB8oZNM.mjs.map +1 -0
  9. package/dist/api/route-utils.d.mts +4 -4
  10. package/dist/api/route-utils.mjs +49 -40
  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 +11 -7
  14. package/dist/api-cFFZpyS0.mjs +4718 -0
  15. package/dist/api-cFFZpyS0.mjs.map +1 -0
  16. package/dist/api-tokens-CE1ECIg0.mjs +3 -0
  17. package/dist/api-tokens-s4i4aUp_.mjs +166 -0
  18. package/dist/api-tokens-s4i4aUp_.mjs.map +1 -0
  19. package/dist/apply-CoT603H3.mjs +1163 -0
  20. package/dist/apply-CoT603H3.mjs.map +1 -0
  21. package/dist/approvals-CqMfNxak.mjs +460 -0
  22. package/dist/approvals-CqMfNxak.mjs.map +1 -0
  23. package/dist/artifact-fetch-DZMOGZ3-.mjs +818 -0
  24. package/dist/artifact-fetch-DZMOGZ3-.mjs.map +1 -0
  25. package/dist/astro/index.d.mts +14 -14
  26. package/dist/astro/index.mjs +62 -12
  27. package/dist/astro/index.mjs.map +1 -1
  28. package/dist/astro/middleware/auth.d.mts +14 -12
  29. package/dist/astro/middleware/auth.d.mts.map +1 -1
  30. package/dist/astro/middleware/auth.mjs +26 -11
  31. package/dist/astro/middleware/auth.mjs.map +1 -1
  32. package/dist/astro/middleware/media-usage-write-fence.d.mts +9 -1
  33. package/dist/astro/middleware/media-usage-write-fence.d.mts.map +1 -1
  34. package/dist/astro/middleware/media-usage-write-fence.mjs +95 -13
  35. package/dist/astro/middleware/media-usage-write-fence.mjs.map +1 -1
  36. package/dist/astro/middleware/redirect.mjs +8 -8
  37. package/dist/astro/middleware/request-context.d.mts.map +1 -1
  38. package/dist/astro/middleware/request-context.mjs +145 -47
  39. package/dist/astro/middleware/request-context.mjs.map +1 -1
  40. package/dist/astro/middleware/setup.mjs +1 -1
  41. package/dist/astro/middleware.d.mts +12 -12
  42. package/dist/astro/middleware.d.mts.map +1 -1
  43. package/dist/astro/middleware.mjs +129 -123
  44. package/dist/astro/middleware.mjs.map +1 -1
  45. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +14 -8
  46. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
  47. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +14 -8
  48. package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
  49. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +5 -3
  50. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs.map +1 -1
  51. package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -4
  52. package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
  53. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -4
  54. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs.map +1 -1
  55. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +17 -11
  56. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
  57. package/dist/astro/routes/api/admin/byline-fields/index.mjs +17 -11
  58. package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
  59. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +17 -11
  60. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
  61. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +25 -19
  62. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  63. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +25 -19
  64. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  65. package/dist/astro/routes/api/admin/bylines/index.mjs +25 -19
  66. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  67. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +19 -13
  68. package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
  69. package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -5
  70. package/dist/astro/routes/api/admin/comments/_id_.mjs.map +1 -1
  71. package/dist/astro/routes/api/admin/comments/bulk.mjs +18 -12
  72. package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
  73. package/dist/astro/routes/api/admin/comments/counts.mjs +7 -5
  74. package/dist/astro/routes/api/admin/comments/counts.mjs.map +1 -1
  75. package/dist/astro/routes/api/admin/comments/index.mjs +18 -12
  76. package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
  77. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -4
  78. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs.map +1 -1
  79. package/dist/astro/routes/api/admin/hooks/exclusive/index.d.mts.map +1 -1
  80. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -6
  81. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs.map +1 -1
  82. package/dist/astro/routes/api/admin/media-usage/activation.mjs +21 -15
  83. package/dist/astro/routes/api/admin/media-usage/activation.mjs.map +1 -1
  84. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +23 -17
  85. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -1
  86. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +23 -17
  87. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -1
  88. package/dist/astro/routes/api/admin/media-usage/progress.mjs +26 -15
  89. package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
  90. package/dist/astro/routes/api/admin/media-usage/repair.mjs +32 -19
  91. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  92. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +23 -17
  93. package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -1
  94. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +23 -17
  95. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -1
  96. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +5 -3
  97. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs.map +1 -1
  98. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +5 -3
  99. package/dist/astro/routes/api/admin/oauth-clients/index.mjs.map +1 -1
  100. package/dist/astro/routes/api/admin/plugins/_id_/disable.d.mts.map +1 -1
  101. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +10 -8
  102. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  103. package/dist/astro/routes/api/admin/plugins/_id_/enable.d.mts.map +1 -1
  104. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +10 -8
  105. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  106. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +72 -62
  107. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  108. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +6 -4
  109. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs.map +1 -1
  110. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +71 -61
  111. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  112. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.d.mts.map +1 -1
  113. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +74 -64
  114. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  115. package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts.map +1 -1
  116. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +84 -74
  117. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  118. package/dist/astro/routes/api/admin/plugins/index.mjs +72 -62
  119. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  120. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +4 -2
  121. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs.map +1 -1
  122. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -61
  123. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  124. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts.map +1 -1
  125. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +83 -73
  126. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  127. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -61
  128. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  129. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts.map +1 -1
  130. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +74 -64
  131. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  132. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +85 -75
  133. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  134. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +8 -6
  135. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  136. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +76 -66
  137. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  138. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.d.mts +8 -0
  139. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.d.mts.map +1 -0
  140. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +221 -0
  141. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs.map +1 -0
  142. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +72 -62
  143. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
  144. package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -61
  145. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  146. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -4
  147. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs.map +1 -1
  148. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -61
  149. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  150. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +4 -2
  151. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs.map +1 -1
  152. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -61
  153. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  154. package/dist/astro/routes/api/admin/transfer/_...path_.d.mts +12 -0
  155. package/dist/astro/routes/api/admin/transfer/_...path_.d.mts.map +1 -0
  156. package/dist/astro/routes/api/admin/transfer/_...path_.mjs +144 -0
  157. package/dist/astro/routes/api/admin/transfer/_...path_.mjs.map +1 -0
  158. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.d.mts +8 -0
  159. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.d.mts.map +1 -0
  160. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +68 -0
  161. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs.map +1 -0
  162. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.d.mts +8 -0
  163. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.d.mts.map +1 -0
  164. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +68 -0
  165. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -0
  166. package/dist/astro/routes/api/admin/transfer/approvals/index.d.mts +8 -0
  167. package/dist/astro/routes/api/admin/transfer/approvals/index.d.mts.map +1 -0
  168. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +67 -0
  169. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -0
  170. package/dist/astro/routes/api/admin/transfer/capabilities.d.mts +8 -0
  171. package/dist/astro/routes/api/admin/transfer/capabilities.d.mts.map +1 -0
  172. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +70 -0
  173. package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -0
  174. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.d.mts +8 -0
  175. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.d.mts.map +1 -0
  176. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +67 -0
  177. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs.map +1 -0
  178. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.d.mts +8 -0
  179. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.d.mts.map +1 -0
  180. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +70 -0
  181. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs.map +1 -0
  182. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.d.mts +8 -0
  183. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.d.mts.map +1 -0
  184. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +69 -0
  185. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs.map +1 -0
  186. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.d.mts +8 -0
  187. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.d.mts.map +1 -0
  188. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +66 -0
  189. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs.map +1 -0
  190. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.d.mts +8 -0
  191. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.d.mts.map +1 -0
  192. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +69 -0
  193. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -0
  194. package/dist/astro/routes/api/admin/transfer/exports/index.d.mts +9 -0
  195. package/dist/astro/routes/api/admin/transfer/exports/index.d.mts.map +1 -0
  196. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +91 -0
  197. package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -0
  198. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.d.mts +8 -0
  199. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.d.mts.map +1 -0
  200. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +66 -0
  201. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs.map +1 -0
  202. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.d.mts +8 -0
  203. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.d.mts.map +1 -0
  204. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +70 -0
  205. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs.map +1 -0
  206. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.d.mts +8 -0
  207. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.d.mts.map +1 -0
  208. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +78 -0
  209. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs.map +1 -0
  210. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.d.mts +8 -0
  211. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.d.mts.map +1 -0
  212. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +66 -0
  213. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs.map +1 -0
  214. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.d.mts +8 -0
  215. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.d.mts.map +1 -0
  216. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +77 -0
  217. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs.map +1 -0
  218. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.d.mts +8 -0
  219. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.d.mts.map +1 -0
  220. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +77 -0
  221. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs.map +1 -0
  222. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.d.mts +8 -0
  223. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.d.mts.map +1 -0
  224. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +66 -0
  225. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs.map +1 -0
  226. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.d.mts +8 -0
  227. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.d.mts.map +1 -0
  228. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +70 -0
  229. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs.map +1 -0
  230. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.d.mts +8 -0
  231. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.d.mts.map +1 -0
  232. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +67 -0
  233. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs.map +1 -0
  234. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.d.mts +8 -0
  235. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.d.mts.map +1 -0
  236. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +66 -0
  237. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -0
  238. package/dist/astro/routes/api/admin/transfer/imports/index.d.mts +9 -0
  239. package/dist/astro/routes/api/admin/transfer/imports/index.d.mts.map +1 -0
  240. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +99 -0
  241. package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -0
  242. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -1
  243. package/dist/astro/routes/api/admin/users/_id_/disable.mjs.map +1 -1
  244. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +3 -1
  245. package/dist/astro/routes/api/admin/users/_id_/enable.mjs.map +1 -1
  246. package/dist/astro/routes/api/admin/users/_id_/index.mjs +14 -8
  247. package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
  248. package/dist/astro/routes/api/admin/users/_id_/send-recovery.d.mts.map +1 -1
  249. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +16 -6
  250. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs.map +1 -1
  251. package/dist/astro/routes/api/admin/users/index.mjs +14 -8
  252. package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
  253. package/dist/astro/routes/api/auth/dev-bypass.mjs +5 -3
  254. package/dist/astro/routes/api/auth/dev-bypass.mjs.map +1 -1
  255. package/dist/astro/routes/api/auth/invite/accept.mjs +3 -1
  256. package/dist/astro/routes/api/auth/invite/accept.mjs.map +1 -1
  257. package/dist/astro/routes/api/auth/invite/complete.mjs +19 -13
  258. package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
  259. package/dist/astro/routes/api/auth/invite/index.d.mts.map +1 -1
  260. package/dist/astro/routes/api/auth/invite/index.mjs +24 -12
  261. package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
  262. package/dist/astro/routes/api/auth/invite/register-options.mjs +18 -12
  263. package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
  264. package/dist/astro/routes/api/auth/logout.mjs +4 -2
  265. package/dist/astro/routes/api/auth/logout.mjs.map +1 -1
  266. package/dist/astro/routes/api/auth/magic-link/send.d.mts.map +1 -1
  267. package/dist/astro/routes/api/auth/magic-link/send.mjs +29 -15
  268. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
  269. package/dist/astro/routes/api/auth/magic-link/verify.d.mts +2 -1
  270. package/dist/astro/routes/api/auth/magic-link/verify.d.mts.map +1 -1
  271. package/dist/astro/routes/api/auth/magic-link/verify.mjs +37 -17
  272. package/dist/astro/routes/api/auth/magic-link/verify.mjs.map +1 -1
  273. package/dist/astro/routes/api/auth/me.mjs +15 -9
  274. package/dist/astro/routes/api/auth/me.mjs.map +1 -1
  275. package/dist/astro/routes/api/auth/mode.mjs +4 -2
  276. package/dist/astro/routes/api/auth/mode.mjs.map +1 -1
  277. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
  278. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  279. package/dist/astro/routes/api/auth/passkey/_id_.mjs +14 -8
  280. package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
  281. package/dist/astro/routes/api/auth/passkey/index.mjs +3 -1
  282. package/dist/astro/routes/api/auth/passkey/index.mjs.map +1 -1
  283. package/dist/astro/routes/api/auth/passkey/options.d.mts.map +1 -1
  284. package/dist/astro/routes/api/auth/passkey/options.mjs +21 -24
  285. package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
  286. package/dist/astro/routes/api/auth/passkey/register/options.mjs +18 -12
  287. package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
  288. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +19 -13
  289. package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
  290. package/dist/astro/routes/api/auth/passkey/verify.mjs +19 -13
  291. package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
  292. package/dist/astro/routes/api/auth/signup/complete.mjs +19 -13
  293. package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
  294. package/dist/astro/routes/api/auth/signup/request.mjs +18 -12
  295. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
  296. package/dist/astro/routes/api/auth/signup/verify.mjs +3 -1
  297. package/dist/astro/routes/api/auth/signup/verify.mjs.map +1 -1
  298. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +14 -11
  299. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
  300. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +21 -15
  301. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
  302. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +4 -2
  303. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs.map +1 -1
  304. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +18 -13
  305. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
  306. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +4 -3
  307. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
  308. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +18 -13
  309. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -1
  310. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +4 -2
  311. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs.map +1 -1
  312. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +10 -8
  313. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs.map +1 -1
  314. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.d.mts.map +1 -1
  315. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +68 -16
  316. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  317. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +18 -13
  318. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  319. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +31 -22
  320. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  321. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +31 -22
  322. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  323. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +4 -3
  324. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
  325. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +4 -2
  326. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs.map +1 -1
  327. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +18 -13
  328. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
  329. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
  330. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +38 -19
  331. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  332. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +4 -2
  333. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
  334. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +18 -13
  335. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
  336. package/dist/astro/routes/api/content/_collection_/_id_.mjs +18 -13
  337. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  338. package/dist/astro/routes/api/content/_collection_/authors.mjs +4 -2
  339. package/dist/astro/routes/api/content/_collection_/authors.mjs.map +1 -1
  340. package/dist/astro/routes/api/content/_collection_/index.mjs +15 -10
  341. package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
  342. package/dist/astro/routes/api/content/_collection_/trash.mjs +15 -9
  343. package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
  344. package/dist/astro/routes/api/dashboard.mjs +11 -9
  345. package/dist/astro/routes/api/dashboard.mjs.map +1 -1
  346. package/dist/astro/routes/api/dev/emails.mjs +4 -2
  347. package/dist/astro/routes/api/dev/emails.mjs.map +1 -1
  348. package/dist/astro/routes/api/health.mjs +5 -3
  349. package/dist/astro/routes/api/health.mjs.map +1 -1
  350. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  351. package/dist/astro/routes/api/import/probe.mjs +27 -21
  352. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  353. package/dist/astro/routes/api/import/wordpress/analyze.mjs +5 -3
  354. package/dist/astro/routes/api/import/wordpress/analyze.mjs.map +1 -1
  355. package/dist/astro/routes/api/import/wordpress/execute.d.mts +13 -13
  356. package/dist/astro/routes/api/import/wordpress/execute.mjs +18 -16
  357. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  358. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
  359. package/dist/astro/routes/api/import/wordpress/media.mjs +19 -13
  360. package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
  361. package/dist/astro/routes/api/import/wordpress/prepare.mjs +18 -12
  362. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  363. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts +5 -1
  364. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts.map +1 -1
  365. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs +4 -2
  366. package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs.map +1 -1
  367. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
  368. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +29 -15
  369. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  370. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  371. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +27 -21
  372. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  373. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
  374. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +38 -32
  375. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  376. package/dist/astro/routes/api/manifest.mjs +6 -4
  377. package/dist/astro/routes/api/manifest.mjs.map +1 -1
  378. package/dist/astro/routes/api/mcp.d.mts.map +1 -1
  379. package/dist/astro/routes/api/mcp.mjs +717 -67
  380. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  381. package/dist/astro/routes/api/media/_id_/confirm.mjs +19 -13
  382. package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
  383. package/dist/astro/routes/api/media/_id_/replace.mjs +16 -10
  384. package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -1
  385. package/dist/astro/routes/api/media/_id_/upload.mjs +8 -6
  386. package/dist/astro/routes/api/media/_id_/upload.mjs.map +1 -1
  387. package/dist/astro/routes/api/media/_id_/usage.mjs +34 -21
  388. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
  389. package/dist/astro/routes/api/media/_id_.d.mts.map +1 -1
  390. package/dist/astro/routes/api/media/_id_.mjs +37 -26
  391. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  392. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +5 -3
  393. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs.map +1 -1
  394. package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
  395. package/dist/astro/routes/api/media/file/_...key_.mjs +31 -2
  396. package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
  397. package/dist/astro/routes/api/media/folders/_id_.mjs +16 -10
  398. package/dist/astro/routes/api/media/folders/_id_.mjs.map +1 -1
  399. package/dist/astro/routes/api/media/folders/index.mjs +16 -10
  400. package/dist/astro/routes/api/media/folders/index.mjs.map +1 -1
  401. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -2
  402. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs.map +1 -1
  403. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -2
  404. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs.map +1 -1
  405. package/dist/astro/routes/api/media/providers/index.mjs +4 -2
  406. package/dist/astro/routes/api/media/providers/index.mjs.map +1 -1
  407. package/dist/astro/routes/api/media/upload-url.mjs +18 -12
  408. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  409. package/dist/astro/routes/api/media.mjs +36 -24
  410. package/dist/astro/routes/api/media.mjs.map +1 -1
  411. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +18 -12
  412. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  413. package/dist/astro/routes/api/menus/_name_/items.mjs +18 -12
  414. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  415. package/dist/astro/routes/api/menus/_name_/reorder.mjs +18 -12
  416. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  417. package/dist/astro/routes/api/menus/_name_/translations.mjs +18 -12
  418. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  419. package/dist/astro/routes/api/menus/_name_.mjs +18 -12
  420. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  421. package/dist/astro/routes/api/menus/index.mjs +18 -12
  422. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  423. package/dist/astro/routes/api/oauth/authorize.d.mts.map +1 -1
  424. package/dist/astro/routes/api/oauth/authorize.mjs +9 -6
  425. package/dist/astro/routes/api/oauth/authorize.mjs.map +1 -1
  426. package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -5
  427. package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -1
  428. package/dist/astro/routes/api/oauth/device/code.mjs +10 -8
  429. package/dist/astro/routes/api/oauth/device/code.mjs.map +1 -1
  430. package/dist/astro/routes/api/oauth/device/token.mjs +9 -7
  431. package/dist/astro/routes/api/oauth/device/token.mjs.map +1 -1
  432. package/dist/astro/routes/api/oauth/register.mjs +4 -2
  433. package/dist/astro/routes/api/oauth/register.mjs.map +1 -1
  434. package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -5
  435. package/dist/astro/routes/api/oauth/token/refresh.mjs.map +1 -1
  436. package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -5
  437. package/dist/astro/routes/api/oauth/token/revoke.mjs.map +1 -1
  438. package/dist/astro/routes/api/oauth/token.mjs +7 -5
  439. package/dist/astro/routes/api/oauth/token.mjs.map +1 -1
  440. package/dist/astro/routes/api/openapi.json.mjs +497 -12
  441. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  442. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +10 -8
  443. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
  444. package/dist/astro/routes/api/redirects/404s/index.mjs +21 -15
  445. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
  446. package/dist/astro/routes/api/redirects/404s/summary.mjs +21 -15
  447. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
  448. package/dist/astro/routes/api/redirects/_id_.mjs +21 -15
  449. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  450. package/dist/astro/routes/api/redirects/index.mjs +21 -15
  451. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  452. package/dist/astro/routes/api/relations/_id_/index.mjs +31 -22
  453. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  454. package/dist/astro/routes/api/relations/_id_/translations.mjs +21 -16
  455. package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
  456. package/dist/astro/routes/api/relations/index.mjs +31 -22
  457. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  458. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -2
  459. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs.map +1 -1
  460. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +4 -3
  461. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -1
  462. package/dist/astro/routes/api/schema/block-types/_slug_/index.d.mts +9 -0
  463. package/dist/astro/routes/api/schema/block-types/_slug_/index.d.mts.map +1 -0
  464. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +102 -0
  465. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -0
  466. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.d.mts +8 -0
  467. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.d.mts.map +1 -0
  468. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +96 -0
  469. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -0
  470. package/dist/astro/routes/api/schema/block-types/index.d.mts +9 -0
  471. package/dist/astro/routes/api/schema/block-types/index.d.mts.map +1 -0
  472. package/dist/astro/routes/api/schema/block-types/index.mjs +102 -0
  473. package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -0
  474. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +71 -61
  475. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  476. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +71 -61
  477. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  478. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +71 -61
  479. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  480. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -61
  481. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  482. package/dist/astro/routes/api/schema/collections/index.mjs +71 -61
  483. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  484. package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -61
  485. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  486. package/dist/astro/routes/api/schema/index.mjs +17 -14
  487. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  488. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -61
  489. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  490. package/dist/astro/routes/api/schema/orphans/index.mjs +71 -61
  491. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  492. package/dist/astro/routes/api/search/enable.mjs +20 -14
  493. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  494. package/dist/astro/routes/api/search/index.mjs +19 -13
  495. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  496. package/dist/astro/routes/api/search/rebuild.mjs +20 -14
  497. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  498. package/dist/astro/routes/api/search/stats.mjs +10 -8
  499. package/dist/astro/routes/api/search/stats.mjs.map +1 -1
  500. package/dist/astro/routes/api/search/suggest.mjs +19 -13
  501. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  502. package/dist/astro/routes/api/sections/_slug_.mjs +19 -13
  503. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  504. package/dist/astro/routes/api/sections/index.mjs +19 -13
  505. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  506. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +8 -7
  507. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs.map +1 -1
  508. package/dist/astro/routes/api/settings/backups/archives/index.mjs +8 -6
  509. package/dist/astro/routes/api/settings/backups/archives/index.mjs.map +1 -1
  510. package/dist/astro/routes/api/settings/backups/export.mjs +8 -7
  511. package/dist/astro/routes/api/settings/backups/export.mjs.map +1 -1
  512. package/dist/astro/routes/api/settings/backups/index.mjs +9 -8
  513. package/dist/astro/routes/api/settings/backups/index.mjs.map +1 -1
  514. package/dist/astro/routes/api/settings/email.mjs +6 -4
  515. package/dist/astro/routes/api/settings/email.mjs.map +1 -1
  516. package/dist/astro/routes/api/settings.mjs +25 -19
  517. package/dist/astro/routes/api/settings.mjs.map +1 -1
  518. package/dist/astro/routes/api/setup/admin-verify.mjs +20 -14
  519. package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
  520. package/dist/astro/routes/api/setup/admin.mjs +19 -13
  521. package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
  522. package/dist/astro/routes/api/setup/dev-bypass.mjs +43 -37
  523. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  524. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -2
  525. package/dist/astro/routes/api/setup/dev-reset.mjs.map +1 -1
  526. package/dist/astro/routes/api/setup/index.mjs +48 -38
  527. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  528. package/dist/astro/routes/api/setup/status.mjs +5 -3
  529. package/dist/astro/routes/api/setup/status.mjs.map +1 -1
  530. package/dist/astro/routes/api/snapshot.mjs +10 -8
  531. package/dist/astro/routes/api/snapshot.mjs.map +1 -1
  532. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +25 -19
  533. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
  534. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +25 -19
  535. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  536. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +25 -19
  537. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  538. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +25 -19
  539. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  540. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +24 -18
  541. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
  542. package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -19
  543. package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
  544. package/dist/astro/routes/api/taxonomies/bulk-tag.d.mts +8 -0
  545. package/dist/astro/routes/api/taxonomies/bulk-tag.d.mts.map +1 -0
  546. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +295 -0
  547. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -0
  548. package/dist/astro/routes/api/taxonomies/index.mjs +25 -19
  549. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  550. package/dist/astro/routes/api/themes/preview.mjs +7 -5
  551. package/dist/astro/routes/api/themes/preview.mjs.map +1 -1
  552. package/dist/astro/routes/api/typegen.d.mts.map +1 -1
  553. package/dist/astro/routes/api/typegen.mjs +12 -9
  554. package/dist/astro/routes/api/typegen.mjs.map +1 -1
  555. package/dist/astro/routes/api/visual-editing/action-token.mjs +7 -5
  556. package/dist/astro/routes/api/visual-editing/action-token.mjs.map +1 -1
  557. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +22 -16
  558. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs.map +1 -1
  559. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +3 -1
  560. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs.map +1 -1
  561. package/dist/astro/routes/api/well-known/auth.mjs +2 -2
  562. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  563. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  564. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +16 -10
  565. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  566. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +20 -14
  567. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  568. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +20 -14
  569. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  570. package/dist/astro/routes/api/widget-areas/_name_.mjs +10 -8
  571. package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
  572. package/dist/astro/routes/api/widget-areas/index.mjs +20 -14
  573. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  574. package/dist/astro/routes/api/widget-components.mjs +4 -2
  575. package/dist/astro/routes/api/widget-components.mjs.map +1 -1
  576. package/dist/astro/routes/robots.txt.mjs +10 -10
  577. package/dist/astro/routes/sitemap-_collection_.xml.mjs +13 -13
  578. package/dist/astro/routes/sitemap.xml.mjs +11 -11
  579. package/dist/astro/types.d.mts +21 -17
  580. package/dist/astro/types.d.mts.map +1 -1
  581. package/dist/audit-RfCugiSB.mjs +127 -0
  582. package/dist/audit-RfCugiSB.mjs.map +1 -0
  583. package/dist/auth/providers/github.d.mts +1 -1
  584. package/dist/auth/providers/google.d.mts +1 -1
  585. package/dist/authoritative-records-CoJvBXAD.mjs +5172 -0
  586. package/dist/authoritative-records-CoJvBXAD.mjs.map +1 -0
  587. package/dist/authorize-seCifOMJ.mjs +49 -0
  588. package/dist/authorize-seCifOMJ.mjs.map +1 -0
  589. package/dist/backup-CBu0LrXf.mjs +246 -0
  590. package/dist/backup-CBu0LrXf.mjs.map +1 -0
  591. package/dist/block-type-registry-DUI_3KxT.mjs +6709 -0
  592. package/dist/block-type-registry-DUI_3KxT.mjs.map +1 -0
  593. package/dist/block-types-BmZmLmAD.mjs +132 -0
  594. package/dist/block-types-BmZmLmAD.mjs.map +1 -0
  595. package/dist/block-values-C_VIPr5t.mjs +175 -0
  596. package/dist/block-values-C_VIPr5t.mjs.map +1 -0
  597. package/dist/byline-DYmkXqvo.mjs +909 -0
  598. package/dist/byline-DYmkXqvo.mjs.map +1 -0
  599. package/dist/byline-fields-D28AT-Fh.mjs +123 -0
  600. package/dist/byline-fields-D28AT-Fh.mjs.map +1 -0
  601. package/dist/byline-registry-gnKscbQX.mjs +406 -0
  602. package/dist/byline-registry-gnKscbQX.mjs.map +1 -0
  603. package/dist/bylines-BPwJqoYH.mjs +232 -0
  604. package/dist/bylines-BPwJqoYH.mjs.map +1 -0
  605. package/dist/bylines-ukLaYpVZ.mjs +214 -0
  606. package/dist/bylines-ukLaYpVZ.mjs.map +1 -0
  607. package/dist/cache-m7UEkRFV.mjs +108 -0
  608. package/dist/cache-m7UEkRFV.mjs.map +1 -0
  609. package/dist/canonical-YhEQezjg.mjs +174 -0
  610. package/dist/canonical-YhEQezjg.mjs.map +1 -0
  611. package/dist/capture-triggers-kJyl_yyM.mjs +362 -0
  612. package/dist/capture-triggers-kJyl_yyM.mjs.map +1 -0
  613. package/dist/challenge-store-ppU6Uv13.mjs +51 -0
  614. package/dist/challenge-store-ppU6Uv13.mjs.map +1 -0
  615. package/dist/checksum-B2IINIlN.mjs +162 -0
  616. package/dist/checksum-B2IINIlN.mjs.map +1 -0
  617. package/dist/chrome-tags-DApCQSIk.mjs +24 -0
  618. package/dist/chrome-tags-DApCQSIk.mjs.map +1 -0
  619. package/dist/chunks-Dms7Uxbt.mjs +25 -0
  620. package/dist/chunks-Dms7Uxbt.mjs.map +1 -0
  621. package/dist/cli/index.mjs +1471 -56
  622. package/dist/cli/index.mjs.map +1 -1
  623. package/dist/client/cf-access.d.mts +1 -1
  624. package/dist/client/index.d.mts +1050 -4
  625. package/dist/client/index.d.mts.map +1 -1
  626. package/dist/client/index.mjs +193 -11
  627. package/dist/client/index.mjs.map +1 -1
  628. package/dist/collection-deletion-BIm28mo3.mjs +436 -0
  629. package/dist/collection-deletion-BIm28mo3.mjs.map +1 -0
  630. package/dist/collection-deletion-processor-Br6rxs3u.mjs +217 -0
  631. package/dist/collection-deletion-processor-Br6rxs3u.mjs.map +1 -0
  632. package/dist/collection-slugs-cache-CjGk__zp.mjs +85 -0
  633. package/dist/collection-slugs-cache-CjGk__zp.mjs.map +1 -0
  634. package/dist/comment-CrBl22OF.mjs +313 -0
  635. package/dist/comment-CrBl22OF.mjs.map +1 -0
  636. package/dist/comment-reaction-JEQ2Fpd8.mjs +85 -0
  637. package/dist/comment-reaction-JEQ2Fpd8.mjs.map +1 -0
  638. package/dist/comments-2ah9du9y.mjs +195 -0
  639. package/dist/comments-2ah9du9y.mjs.map +1 -0
  640. package/dist/comments-fHZ8ON9O.mjs +99 -0
  641. package/dist/comments-fHZ8ON9O.mjs.map +1 -0
  642. package/dist/components-CXbq7CSM.mjs +108 -0
  643. package/dist/components-CXbq7CSM.mjs.map +1 -0
  644. package/dist/config-5ii2haYu.d.mts +6528 -0
  645. package/dist/config-5ii2haYu.d.mts.map +1 -0
  646. package/dist/config-CvmjJcVw.mjs +73 -0
  647. package/dist/config-CvmjJcVw.mjs.map +1 -0
  648. package/dist/config-IhybvkIQ.mjs +242 -0
  649. package/dist/config-IhybvkIQ.mjs.map +1 -0
  650. package/dist/config-Py43JK9r.d.mts +39 -0
  651. package/dist/config-Py43JK9r.d.mts.map +1 -0
  652. package/dist/content-DFaIEDj9.mjs +2281 -0
  653. package/dist/content-DFaIEDj9.mjs.map +1 -0
  654. package/dist/content-list-query-Dra4Dalc.d.mts +26 -0
  655. package/dist/content-list-query-Dra4Dalc.d.mts.map +1 -0
  656. package/dist/content-policy-DFNw91-d.mjs +46 -0
  657. package/dist/content-policy-DFNw91-d.mjs.map +1 -0
  658. package/dist/content-repair-Q8IUrpLL.mjs +442 -0
  659. package/dist/content-repair-Q8IUrpLL.mjs.map +1 -0
  660. package/dist/context-BeGccdUX.mjs +1921 -0
  661. package/dist/context-BeGccdUX.mjs.map +1 -0
  662. package/dist/cron-7DCJwPXq.mjs +284 -0
  663. package/dist/cron-7DCJwPXq.mjs.map +1 -0
  664. package/dist/dashboard-DjrB-xxZ.mjs +151 -0
  665. package/dist/dashboard-DjrB-xxZ.mjs.map +1 -0
  666. package/dist/db/index.d.mts +3 -3
  667. package/dist/db/index.mjs +3 -3
  668. package/dist/db/libsql-migrations.d.mts +1 -1
  669. package/dist/db/libsql-migrations.mjs +6 -6
  670. package/dist/db/libsql.d.mts +1 -1
  671. package/dist/db/postgres-migrations.d.mts +1 -1
  672. package/dist/db/postgres-migrations.mjs +6 -6
  673. package/dist/db/postgres.d.mts +1 -1
  674. package/dist/db/sqlite-migrations.d.mts +1 -1
  675. package/dist/db/sqlite-migrations.mjs +6 -6
  676. package/dist/db/sqlite.d.mts +1 -1
  677. package/dist/db/sqlite.mjs +2 -2
  678. package/dist/db/sqlite.mjs.map +1 -1
  679. package/dist/default-DQ6vsviu.mjs +81 -0
  680. package/dist/default-DQ6vsviu.mjs.map +1 -0
  681. package/dist/deferred-tasks-BPxXUB4x.d.mts +9 -0
  682. package/dist/deferred-tasks-BPxXUB4x.d.mts.map +1 -0
  683. package/dist/device-flow-CRd6DXmW.mjs +466 -0
  684. package/dist/device-flow-CRd6DXmW.mjs.map +1 -0
  685. package/dist/dialect-helpers-7_IqPdh9.mjs +307 -0
  686. package/dist/dialect-helpers-7_IqPdh9.mjs.map +1 -0
  687. package/dist/digest-BarSh-pN.mjs +194 -0
  688. package/dist/digest-BarSh-pN.mjs.map +1 -0
  689. package/dist/direct-executor-BmuFJJZV.mjs +104 -0
  690. package/dist/direct-executor-BmuFJJZV.mjs.map +1 -0
  691. package/dist/dist-BNwANFJR.mjs +810 -0
  692. package/dist/dist-BNwANFJR.mjs.map +1 -0
  693. package/dist/email-console-bJn3ctqA.mjs +50 -0
  694. package/dist/email-console-bJn3ctqA.mjs.map +1 -0
  695. package/dist/email-locale-CN6WAMx0.mjs +25 -0
  696. package/dist/email-locale-CN6WAMx0.mjs.map +1 -0
  697. package/dist/emdash-runtime-DAjghyEG.mjs +4186 -0
  698. package/dist/emdash-runtime-DAjghyEG.mjs.map +1 -0
  699. package/dist/enrich-Dl3kZ-lP.mjs +194 -0
  700. package/dist/enrich-Dl3kZ-lP.mjs.map +1 -0
  701. package/dist/entry-lock-BJYdBfXb.mjs +1097 -0
  702. package/dist/entry-lock-BJYdBfXb.mjs.map +1 -0
  703. package/dist/entry-lock-DHQOxN7R.mjs +163 -0
  704. package/dist/entry-lock-DHQOxN7R.mjs.map +1 -0
  705. package/dist/entry-lock-DVhCt49A.d.mts +4368 -0
  706. package/dist/entry-lock-DVhCt49A.d.mts.map +1 -0
  707. package/dist/entry-locks-D0foLdjQ.mjs +167 -0
  708. package/dist/entry-locks-D0foLdjQ.mjs.map +1 -0
  709. package/dist/error-CfvOHP0M.mjs +90 -0
  710. package/dist/error-CfvOHP0M.mjs.map +1 -0
  711. package/dist/errors-BF0_LFhW.mjs +460 -0
  712. package/dist/errors-BF0_LFhW.mjs.map +1 -0
  713. package/dist/errors-DgE1zJGG.mjs +120 -0
  714. package/dist/errors-DgE1zJGG.mjs.map +1 -0
  715. package/dist/escape-CuaZhZvL.mjs +9 -0
  716. package/dist/escape-CuaZhZvL.mjs.map +1 -0
  717. package/dist/fence-CMDXJYc_.mjs +162 -0
  718. package/dist/fence-CMDXJYc_.mjs.map +1 -0
  719. package/dist/field-defs-cache-HIgBbqZZ.mjs +77 -0
  720. package/dist/field-defs-cache-HIgBbqZZ.mjs.map +1 -0
  721. package/dist/fts-manager-S-K0laoS.mjs +443 -0
  722. package/dist/fts-manager-S-K0laoS.mjs.map +1 -0
  723. package/dist/gc-DjKY0Ay1.mjs +75 -0
  724. package/dist/gc-DjKY0Ay1.mjs.map +1 -0
  725. package/dist/hash-SDAW6zC-.mjs +37 -0
  726. package/dist/hash-SDAW6zC-.mjs.map +1 -0
  727. package/dist/hook-result-B5bXDgS2.d.mts +31 -0
  728. package/dist/hook-result-B5bXDgS2.d.mts.map +1 -0
  729. package/dist/hreflang-D5uNnsGJ.d.mts +50 -0
  730. package/dist/hreflang-D5uNnsGJ.d.mts.map +1 -0
  731. package/dist/hreflang-DMFBL2eb.mjs +105 -0
  732. package/dist/hreflang-DMFBL2eb.mjs.map +1 -0
  733. package/dist/http-route-dispatch-BitqzwMy.mjs +339 -0
  734. package/dist/http-route-dispatch-BitqzwMy.mjs.map +1 -0
  735. package/dist/identity-IyNWwXr6.mjs +35 -0
  736. package/dist/identity-IyNWwXr6.mjs.map +1 -0
  737. package/dist/import-C3JZplWq.mjs +2020 -0
  738. package/dist/import-C3JZplWq.mjs.map +1 -0
  739. package/dist/index-D-hdtLe8.d.mts +623 -0
  740. package/dist/index-D-hdtLe8.d.mts.map +1 -0
  741. package/dist/index.d.mts +24 -24
  742. package/dist/index.mjs +105 -93
  743. package/dist/install-finalization-DfM1fj5x.mjs +58 -0
  744. package/dist/install-finalization-DfM1fj5x.mjs.map +1 -0
  745. package/dist/keys-yxLm5l35.mjs +61 -0
  746. package/dist/keys-yxLm5l35.mjs.map +1 -0
  747. package/dist/kinds-CRu_T5T5.mjs +961 -0
  748. package/dist/kinds-CRu_T5T5.mjs.map +1 -0
  749. package/dist/lifecycle-BzeGPeQ-.mjs +25 -0
  750. package/dist/lifecycle-BzeGPeQ-.mjs.map +1 -0
  751. package/dist/load-XgJiE6_3.mjs +28 -0
  752. package/dist/load-XgJiE6_3.mjs.map +1 -0
  753. package/dist/loader-BzqeR1ZN.mjs +1086 -0
  754. package/dist/loader-BzqeR1ZN.mjs.map +1 -0
  755. package/dist/loops-BQSzv5Zn.mjs +203 -0
  756. package/dist/loops-BQSzv5Zn.mjs.map +1 -0
  757. package/dist/manifest-builder-B8zR-73J.mjs +189 -0
  758. package/dist/manifest-builder-B8zR-73J.mjs.map +1 -0
  759. package/dist/manifest-schema-CY3zng_M.mjs +492 -0
  760. package/dist/manifest-schema-CY3zng_M.mjs.map +1 -0
  761. package/dist/media/image-endpoint.mjs +1 -1
  762. package/dist/media/index.d.mts +1 -1
  763. package/dist/media/index.mjs +3 -3
  764. package/dist/media/local-runtime.d.mts +14 -14
  765. package/dist/media/local-runtime.d.mts.map +1 -1
  766. package/dist/media/local-runtime.mjs +15 -16
  767. package/dist/media/local-runtime.mjs.map +1 -1
  768. package/dist/media-Pu1L6xir.mjs +408 -0
  769. package/dist/media-Pu1L6xir.mjs.map +1 -0
  770. package/dist/media-Qp5S3eH3.mjs +355 -0
  771. package/dist/media-Qp5S3eH3.mjs.map +1 -0
  772. package/dist/media-allowlist-BSoa9Vvm.mjs +44 -0
  773. package/dist/media-allowlist-BSoa9Vvm.mjs.map +1 -0
  774. package/dist/media-folders-BE0oo2eX.mjs +210 -0
  775. package/dist/media-folders-BE0oo2eX.mjs.map +1 -0
  776. package/dist/media-h7tOiDLj.mjs +221 -0
  777. package/dist/media-h7tOiDLj.mjs.map +1 -0
  778. package/dist/media-url-jArBpzIG.mjs +43 -0
  779. package/dist/media-url-jArBpzIG.mjs.map +1 -0
  780. package/dist/media-usage-My-Vi-ex.mjs +1629 -0
  781. package/dist/media-usage-My-Vi-ex.mjs.map +1 -0
  782. package/dist/media-usage-activation-HKp7zk7W.mjs +78 -0
  783. package/dist/media-usage-activation-HKp7zk7W.mjs.map +1 -0
  784. package/dist/media-usage-work-C2OZLCAd.mjs +586 -0
  785. package/dist/media-usage-work-C2OZLCAd.mjs.map +1 -0
  786. package/dist/media-usage-work-DwUNbgvS.mjs +152 -0
  787. package/dist/media-usage-work-DwUNbgvS.mjs.map +1 -0
  788. package/dist/menus-BM7BPLOb.mjs +139 -0
  789. package/dist/menus-BM7BPLOb.mjs.map +1 -0
  790. package/dist/menus-ITeAbcIF.mjs +753 -0
  791. package/dist/menus-ITeAbcIF.mjs.map +1 -0
  792. package/dist/menus-TsSGmSR4.mjs +3608 -0
  793. package/dist/menus-TsSGmSR4.mjs.map +1 -0
  794. package/dist/migrations/index.d.mts +1 -1
  795. package/dist/migrations/index.mjs +5 -5
  796. package/dist/mime-ChLqYwDk.mjs +36 -0
  797. package/dist/mime-ChLqYwDk.mjs.map +1 -0
  798. package/dist/mode-CCuKXUci.mjs +23 -0
  799. package/dist/mode-CCuKXUci.mjs.map +1 -0
  800. package/dist/node-sqlite-compat-CONMsl-x.mjs +46 -0
  801. package/dist/node-sqlite-compat-CONMsl-x.mjs.map +1 -0
  802. package/dist/normalize-CO2P8-iE.mjs +191 -0
  803. package/dist/normalize-CO2P8-iE.mjs.map +1 -0
  804. package/dist/oauth-authorization-DlMIL5_h.mjs +274 -0
  805. package/dist/oauth-authorization-DlMIL5_h.mjs.map +1 -0
  806. package/dist/oauth-clients-Djq9r_KP.mjs +266 -0
  807. package/dist/oauth-clients-Djq9r_KP.mjs.map +1 -0
  808. package/dist/oauth-state-store-BbjnZXNC.mjs +50 -0
  809. package/dist/oauth-state-store-BbjnZXNC.mjs.map +1 -0
  810. package/dist/oauth-user-lookup-vue9a64A.mjs +26 -0
  811. package/dist/oauth-user-lookup-vue9a64A.mjs.map +1 -0
  812. package/dist/object-cache/memory.d.mts +1 -1
  813. package/dist/object-cache-CqWNY5uP.mjs +582 -0
  814. package/dist/object-cache-CqWNY5uP.mjs.map +1 -0
  815. package/dist/options-DhrI7eMv.mjs +208 -0
  816. package/dist/options-DhrI7eMv.mjs.map +1 -0
  817. package/dist/options-SQCHQCPH.d.mts +81 -0
  818. package/dist/options-SQCHQCPH.d.mts.map +1 -0
  819. package/dist/page/index.d.mts +2 -2
  820. package/dist/page/index.mjs +9 -9
  821. package/dist/parse-CVgO-Qai.d.mts +168 -0
  822. package/dist/parse-CVgO-Qai.d.mts.map +1 -0
  823. package/dist/parse-DY6OD1j_.mjs +81 -0
  824. package/dist/parse-DY6OD1j_.mjs.map +1 -0
  825. package/dist/passkey-config-X_H8128a.mjs +46 -0
  826. package/dist/passkey-config-X_H8128a.mjs.map +1 -0
  827. package/dist/paths-JxokKIbr.mjs +77 -0
  828. package/dist/paths-JxokKIbr.mjs.map +1 -0
  829. package/dist/patterns-BhAvqO0S.mjs +145 -0
  830. package/dist/patterns-BhAvqO0S.mjs.map +1 -0
  831. package/dist/placeholder-MSEd8gty.d.mts +306 -0
  832. package/dist/placeholder-MSEd8gty.d.mts.map +1 -0
  833. package/dist/plan-xjcWrAah.mjs +135 -0
  834. package/dist/plan-xjcWrAah.mjs.map +1 -0
  835. package/dist/plugin-test-runtime.d.mts +38 -15
  836. package/dist/plugin-test-runtime.d.mts.map +1 -1
  837. package/dist/plugin-test-runtime.mjs +112 -100
  838. package/dist/plugin-types.d.mts +2 -2
  839. package/dist/plugin-utils.d.mts +12 -12
  840. package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
  841. package/dist/plugins/adapt-sandbox-entry.mjs +3 -3
  842. package/dist/plugins/host.d.mts +5 -5
  843. package/dist/plugins/host.mjs +45 -37
  844. package/dist/plugins-DUXUt8B9.mjs +277 -0
  845. package/dist/plugins-DUXUt8B9.mjs.map +1 -0
  846. package/dist/policy-CUvwAARc.mjs +45 -0
  847. package/dist/policy-CUvwAARc.mjs.map +1 -0
  848. package/dist/portable-text-5O_ZGUjB.mjs +307 -0
  849. package/dist/portable-text-5O_ZGUjB.mjs.map +1 -0
  850. package/dist/preview-CIUcPYr6.mjs +107 -0
  851. package/dist/preview-CIUcPYr6.mjs.map +1 -0
  852. package/dist/protocol-B97DZaFr.d.mts +61 -0
  853. package/dist/protocol-B97DZaFr.d.mts.map +1 -0
  854. package/dist/public-submission-BFBUrqst.mjs +250 -0
  855. package/dist/public-submission-BFBUrqst.mjs.map +1 -0
  856. package/dist/public-url-Bn7U0D7-.mjs +101 -0
  857. package/dist/public-url-Bn7U0D7-.mjs.map +1 -0
  858. package/dist/query-B48peoRT.mjs +890 -0
  859. package/dist/query-B48peoRT.mjs.map +1 -0
  860. package/dist/query-C4IH0uhR.mjs +41 -0
  861. package/dist/query-C4IH0uhR.mjs.map +1 -0
  862. package/dist/rate-limit-BZ6nybgc.mjs +120 -0
  863. package/dist/rate-limit-BZ6nybgc.mjs.map +1 -0
  864. package/dist/receipt-B4wJj5Jq.mjs +43 -0
  865. package/dist/receipt-B4wJj5Jq.mjs.map +1 -0
  866. package/dist/redirect-Cd1E7VUt.mjs +17 -0
  867. package/dist/redirect-Cd1E7VUt.mjs.map +1 -0
  868. package/dist/redirect-iJf5fltD.mjs +415 -0
  869. package/dist/redirect-iJf5fltD.mjs.map +1 -0
  870. package/dist/redirects-CYu1u1aK.mjs +446 -0
  871. package/dist/redirects-CYu1u1aK.mjs.map +1 -0
  872. package/dist/redirects-Cv9apQKj.mjs +148 -0
  873. package/dist/redirects-Cv9apQKj.mjs.map +1 -0
  874. package/dist/registry/testing.mjs +3 -3
  875. package/dist/relation-M4NUCb0b.mjs +334 -0
  876. package/dist/relation-M4NUCb0b.mjs.map +1 -0
  877. package/dist/relations-CCif47Oq.mjs +403 -0
  878. package/dist/relations-CCif47Oq.mjs.map +1 -0
  879. package/dist/relations-CK9CYUyr.mjs +310 -0
  880. package/dist/relations-CK9CYUyr.mjs.map +1 -0
  881. package/dist/request-cache-DzLYKm_x.mjs +104 -0
  882. package/dist/request-cache-DzLYKm_x.mjs.map +1 -0
  883. package/dist/request-context.d.mts +1 -1
  884. package/dist/request-meta-sZXt3sRo.mjs +141 -0
  885. package/dist/request-meta-sZXt3sRo.mjs.map +1 -0
  886. package/dist/resolve-2WbQsCvT.mjs +199 -0
  887. package/dist/resolve-2WbQsCvT.mjs.map +1 -0
  888. package/dist/route-wire--1hLuACz.mjs +197 -0
  889. package/dist/route-wire--1hLuACz.mjs.map +1 -0
  890. package/dist/routes-CUsM40Cc.mjs +272 -0
  891. package/dist/routes-CUsM40Cc.mjs.map +1 -0
  892. package/dist/runner-1y4J9fJB.mjs +5742 -0
  893. package/dist/runner-1y4J9fJB.mjs.map +1 -0
  894. package/dist/runner-D5_LzKXI.d.mts +68 -0
  895. package/dist/runner-D5_LzKXI.d.mts.map +1 -0
  896. package/dist/runtime.d.mts +13 -13
  897. package/dist/runtime.mjs +4 -4
  898. package/dist/schema-BABiRdsH.mjs +13 -0
  899. package/dist/schema-BABiRdsH.mjs.map +1 -0
  900. package/dist/schema-Du3MzCG0.mjs +446 -0
  901. package/dist/schema-Du3MzCG0.mjs.map +1 -0
  902. package/dist/scopes-Dbk-ElhT.mjs +34 -0
  903. package/dist/scopes-Dbk-ElhT.mjs.map +1 -0
  904. package/dist/search-Bt1PL1jf.mjs +448 -0
  905. package/dist/search-Bt1PL1jf.mjs.map +1 -0
  906. package/dist/secrets-CIi0nFiR.mjs +341 -0
  907. package/dist/secrets-CIi0nFiR.mjs.map +1 -0
  908. package/dist/sections-Ddptx_o9.mjs +346 -0
  909. package/dist/sections-Ddptx_o9.mjs.map +1 -0
  910. package/dist/seed/index.d.mts +2 -2
  911. package/dist/seed/index.mjs +35 -30
  912. package/dist/seo/index.d.mts +3 -3
  913. package/dist/seo/index.mjs +25 -21
  914. package/dist/seo/index.mjs.map +1 -1
  915. package/dist/seo-CZT2oLtT.mjs +114 -0
  916. package/dist/seo-CZT2oLtT.mjs.map +1 -0
  917. package/dist/seo-D5w3-Azy.mjs +133 -0
  918. package/dist/seo-D5w3-Azy.mjs.map +1 -0
  919. package/dist/service-DuykXPyW.mjs +150 -0
  920. package/dist/service-DuykXPyW.mjs.map +1 -0
  921. package/dist/session-user-BhaVp8w0.mjs +51 -0
  922. package/dist/session-user-BhaVp8w0.mjs.map +1 -0
  923. package/dist/settings-2xNYr90o.mjs +51 -0
  924. package/dist/settings-2xNYr90o.mjs.map +1 -0
  925. package/dist/settings-CgjRWGW9.mjs +439 -0
  926. package/dist/settings-CgjRWGW9.mjs.map +1 -0
  927. package/dist/settings-DYidIB26.mjs +61 -0
  928. package/dist/settings-DYidIB26.mjs.map +1 -0
  929. package/dist/setup-complete-bOogcHWG.mjs +26 -0
  930. package/dist/setup-complete-bOogcHWG.mjs.map +1 -0
  931. package/dist/setup-nonce-0EGuKM4s.mjs +25 -0
  932. package/dist/setup-nonce-0EGuKM4s.mjs.map +1 -0
  933. package/dist/site-settings-DOgRUoFX.mjs +50 -0
  934. package/dist/site-settings-DOgRUoFX.mjs.map +1 -0
  935. package/dist/site-url-BU_bbxwj.mjs +16 -0
  936. package/dist/site-url-BU_bbxwj.mjs.map +1 -0
  937. package/dist/snapshot-CugwUqKQ.mjs +237 -0
  938. package/dist/snapshot-CugwUqKQ.mjs.map +1 -0
  939. package/dist/ssrf-CJUnJymJ.mjs +406 -0
  940. package/dist/ssrf-CJUnJymJ.mjs.map +1 -0
  941. package/dist/stage-DgrBz_du.mjs +662 -0
  942. package/dist/stage-DgrBz_du.mjs.map +1 -0
  943. package/dist/state-DDiPySSG.mjs +153 -0
  944. package/dist/state-DDiPySSG.mjs.map +1 -0
  945. package/dist/status-DZKIG4a9.mjs +30 -0
  946. package/dist/status-DZKIG4a9.mjs.map +1 -0
  947. package/dist/storage/local.d.mts +1 -1
  948. package/dist/storage/local.mjs +1 -1
  949. package/dist/storage/s3.d.mts +1 -1
  950. package/dist/storage/s3.mjs +1 -1
  951. package/dist/storage-query-Bdv7A62k.d.mts +1576 -0
  952. package/dist/storage-query-Bdv7A62k.d.mts.map +1 -0
  953. package/dist/tar-_1AgTYFu.mjs +449 -0
  954. package/dist/tar-_1AgTYFu.mjs.map +1 -0
  955. package/dist/target-_7pn2Gbg.mjs +27 -0
  956. package/dist/target-_7pn2Gbg.mjs.map +1 -0
  957. package/dist/taxonomies-C1IwNe8Q.mjs +697 -0
  958. package/dist/taxonomies-C1IwNe8Q.mjs.map +1 -0
  959. package/dist/taxonomies-C_XMoRcX.mjs +939 -0
  960. package/dist/taxonomies-C_XMoRcX.mjs.map +1 -0
  961. package/dist/taxonomy-C3Fu1YeH.mjs +525 -0
  962. package/dist/taxonomy-C3Fu1YeH.mjs.map +1 -0
  963. package/dist/tokens-u78jETkX.mjs +171 -0
  964. package/dist/tokens-u78jETkX.mjs.map +1 -0
  965. package/dist/transfer-BhUCrgDc.mjs +8675 -0
  966. package/dist/transfer-BhUCrgDc.mjs.map +1 -0
  967. package/dist/transfer-DIGvR9Af.mjs +166 -0
  968. package/dist/transfer-DIGvR9Af.mjs.map +1 -0
  969. package/dist/transfer-download-Pml7RMio.mjs +33 -0
  970. package/dist/transfer-download-Pml7RMio.mjs.map +1 -0
  971. package/dist/transformations-9gfpwY65.mjs +196 -0
  972. package/dist/transformations-9gfpwY65.mjs.map +1 -0
  973. package/dist/transport-BIfH7_hx.d.mts +42 -0
  974. package/dist/transport-BIfH7_hx.d.mts.map +1 -0
  975. package/dist/transport-DKWIq53q.mjs +136 -0
  976. package/dist/transport-DKWIq53q.mjs.map +1 -0
  977. package/dist/trusted-proxy-tKiVtyTD.mjs +51 -0
  978. package/dist/trusted-proxy-tKiVtyTD.mjs.map +1 -0
  979. package/dist/turnstile-DpsoyOfg.mjs +53 -0
  980. package/dist/turnstile-DpsoyOfg.mjs.map +1 -0
  981. package/dist/types-B4sUC2p1.d.mts +198 -0
  982. package/dist/types-B4sUC2p1.d.mts.map +1 -0
  983. package/dist/types-B7Lmsh1E.d.mts +887 -0
  984. package/dist/types-B7Lmsh1E.d.mts.map +1 -0
  985. package/dist/types-BZakh7Ym.mjs +22 -0
  986. package/dist/types-BZakh7Ym.mjs.map +1 -0
  987. package/dist/types-B_CppEmv.d.mts +264 -0
  988. package/dist/types-B_CppEmv.d.mts.map +1 -0
  989. package/dist/types-BcrBrE6-.mjs +159 -0
  990. package/dist/types-BcrBrE6-.mjs.map +1 -0
  991. package/dist/types-CAZgq9fO.d.mts +124 -0
  992. package/dist/types-CAZgq9fO.d.mts.map +1 -0
  993. package/dist/types-Cd-O03VG.d.mts +363 -0
  994. package/dist/types-Cd-O03VG.d.mts.map +1 -0
  995. package/dist/types-Cr-Kg-3D.d.mts +1641 -0
  996. package/dist/types-Cr-Kg-3D.d.mts.map +1 -0
  997. package/dist/types-D2fvWd1i.d.mts +359 -0
  998. package/dist/types-D2fvWd1i.d.mts.map +1 -0
  999. package/dist/types-D7HUsguf.mjs +77 -0
  1000. package/dist/types-D7HUsguf.mjs.map +1 -0
  1001. package/dist/types-DA1Te3Oy.d.mts +198 -0
  1002. package/dist/types-DA1Te3Oy.d.mts.map +1 -0
  1003. package/dist/types-DhV6Q5bP.mjs +18 -0
  1004. package/dist/types-DhV6Q5bP.mjs.map +1 -0
  1005. package/dist/types-DnnVSl6Y.d.mts +85 -0
  1006. package/dist/types-DnnVSl6Y.d.mts.map +1 -0
  1007. package/dist/types-VT4-BugW.mjs +16 -0
  1008. package/dist/types-VT4-BugW.mjs.map +1 -0
  1009. package/dist/upload-attempts-B68ZGNu9.mjs +32 -0
  1010. package/dist/upload-attempts-B68ZGNu9.mjs.map +1 -0
  1011. package/dist/url-pattern-CCeZMGOh.mjs +33 -0
  1012. package/dist/url-pattern-CCeZMGOh.mjs.map +1 -0
  1013. package/dist/user-DDSL-sGw.mjs +171 -0
  1014. package/dist/user-DDSL-sGw.mjs.map +1 -0
  1015. package/dist/utils-DdhmO9w9.mjs +439 -0
  1016. package/dist/utils-DdhmO9w9.mjs.map +1 -0
  1017. package/dist/validate-CHosPEhs.mjs +453 -0
  1018. package/dist/validate-CHosPEhs.mjs.map +1 -0
  1019. package/dist/validate-CM79QXYE.d.mts +432 -0
  1020. package/dist/validate-CM79QXYE.d.mts.map +1 -0
  1021. package/dist/validation-BFecQczG.mjs +218 -0
  1022. package/dist/validation-BFecQczG.mjs.map +1 -0
  1023. package/dist/version-BRZXVifl.mjs +9 -0
  1024. package/dist/version-BRZXVifl.mjs.map +1 -0
  1025. package/dist/version-DUQDHgrf.mjs +7 -0
  1026. package/dist/version-DUQDHgrf.mjs.map +1 -0
  1027. package/dist/widgets-WdV72brA.mjs +126 -0
  1028. package/dist/widgets-WdV72brA.mjs.map +1 -0
  1029. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts +34 -0
  1030. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts.map +1 -0
  1031. package/dist/wxr-taxonomies-DP6ESgMN.mjs +372 -0
  1032. package/dist/wxr-taxonomies-DP6ESgMN.mjs.map +1 -0
  1033. package/dist/zod-generator-D6uE4WiS.mjs +389 -0
  1034. package/dist/zod-generator-D6uE4WiS.mjs.map +1 -0
  1035. package/package.json +6 -5
  1036. package/src/api/authorize.ts +17 -0
  1037. package/src/api/email-locale.ts +24 -0
  1038. package/src/api/errors.ts +16 -0
  1039. package/src/api/handlers/api-tokens.ts +18 -3
  1040. package/src/api/handlers/block-types.ts +129 -0
  1041. package/src/api/handlers/bulk-tag.ts +309 -0
  1042. package/src/api/handlers/comments.ts +0 -28
  1043. package/src/api/handlers/index.ts +10 -0
  1044. package/src/api/handlers/manifest.ts +8 -1
  1045. package/src/api/handlers/marketplace.ts +22 -16
  1046. package/src/api/handlers/media-usage.ts +31 -12
  1047. package/src/api/handlers/media.ts +19 -14
  1048. package/src/api/handlers/schema.ts +33 -8
  1049. package/src/api/handlers/settings.ts +2 -2
  1050. package/src/api/handlers/snapshot.ts +4 -0
  1051. package/src/api/handlers/taxonomies.ts +132 -83
  1052. package/src/api/handlers/transfer.ts +1347 -0
  1053. package/src/api/handlers/validate-media-fields.ts +124 -12
  1054. package/src/api/media-usage-write-fence.ts +5 -26
  1055. package/src/api/openapi/document.ts +614 -5
  1056. package/src/api/schemas/auth.ts +7 -1
  1057. package/src/api/schemas/common.ts +5 -0
  1058. package/src/api/schemas/content.ts +20 -1
  1059. package/src/api/schemas/media-usage.ts +11 -0
  1060. package/src/api/schemas/menus.ts +1 -1
  1061. package/src/api/schemas/schema.ts +117 -0
  1062. package/src/api/schemas/settings.ts +3 -3
  1063. package/src/api/schemas/taxonomies.ts +18 -0
  1064. package/src/api/schemas/transfer.ts +249 -0
  1065. package/src/api/transfer-download.ts +36 -0
  1066. package/src/api/types.ts +3 -0
  1067. package/src/astro/integration/routes.ts +31 -0
  1068. package/src/astro/integration/vite-config.ts +26 -0
  1069. package/src/astro/middleware/auth.ts +30 -7
  1070. package/src/astro/middleware/media-usage-write-fence.ts +106 -11
  1071. package/src/astro/middleware/request-context.ts +16 -2
  1072. package/src/astro/middleware.ts +38 -18
  1073. package/src/astro/routes/admin.astro +3 -1
  1074. package/src/astro/routes/api/admin/hooks/exclusive/index.ts +1 -5
  1075. package/src/astro/routes/api/admin/plugins/[id]/disable.ts +4 -3
  1076. package/src/astro/routes/api/admin/plugins/[id]/enable.ts +4 -3
  1077. package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +4 -3
  1078. package/src/astro/routes/api/admin/plugins/[id]/update.ts +4 -3
  1079. package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +4 -3
  1080. package/src/astro/routes/api/admin/plugins/registry/[id]/uninstall.ts +4 -3
  1081. package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +3 -3
  1082. package/src/astro/routes/api/admin/plugins/registry/install.ts +3 -3
  1083. package/src/astro/routes/api/admin/plugins/registry/publisher-handle.ts +59 -0
  1084. package/src/astro/routes/api/admin/transfer/[...path].ts +143 -0
  1085. package/src/astro/routes/api/admin/transfer/approvals/[id]/approve.ts +35 -0
  1086. package/src/astro/routes/api/admin/transfer/approvals/[id]/deny.ts +35 -0
  1087. package/src/astro/routes/api/admin/transfer/approvals/index.ts +33 -0
  1088. package/src/astro/routes/api/admin/transfer/capabilities.ts +36 -0
  1089. package/src/astro/routes/api/admin/transfer/exports/[id]/advance.ts +34 -0
  1090. package/src/astro/routes/api/admin/transfer/exports/[id]/archive.ts +35 -0
  1091. package/src/astro/routes/api/admin/transfer/exports/[id]/files/[...path].ts +40 -0
  1092. package/src/astro/routes/api/admin/transfer/exports/[id]/index.ts +25 -0
  1093. package/src/astro/routes/api/admin/transfer/exports/[id]/manifest.ts +38 -0
  1094. package/src/astro/routes/api/admin/transfer/exports/index.ts +64 -0
  1095. package/src/astro/routes/api/admin/transfer/imports/[id]/abandon.ts +28 -0
  1096. package/src/astro/routes/api/admin/transfer/imports/[id]/advance.ts +37 -0
  1097. package/src/astro/routes/api/admin/transfer/imports/[id]/analyze.ts +51 -0
  1098. package/src/astro/routes/api/admin/transfer/imports/[id]/cancel.ts +27 -0
  1099. package/src/astro/routes/api/admin/transfer/imports/[id]/execute.ts +48 -0
  1100. package/src/astro/routes/api/admin/transfer/imports/[id]/files/[...path].ts +54 -0
  1101. package/src/astro/routes/api/admin/transfer/imports/[id]/index.ts +25 -0
  1102. package/src/astro/routes/api/admin/transfer/imports/[id]/missing.ts +34 -0
  1103. package/src/astro/routes/api/admin/transfer/imports/[id]/plan.ts +29 -0
  1104. package/src/astro/routes/api/admin/transfer/imports/[id]/receipt.ts +25 -0
  1105. package/src/astro/routes/api/admin/transfer/imports/index.ts +85 -0
  1106. package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +9 -1
  1107. package/src/astro/routes/api/auth/invite/index.ts +15 -1
  1108. package/src/astro/routes/api/auth/magic-link/send.ts +9 -1
  1109. package/src/astro/routes/api/auth/magic-link/verify.ts +37 -39
  1110. package/src/astro/routes/api/auth/passkey/options.ts +2 -21
  1111. package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +64 -13
  1112. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +16 -1
  1113. package/src/astro/routes/api/import/wordpress/rewrite-url-helpers.ts +11 -4
  1114. package/src/astro/routes/api/mcp.ts +1 -0
  1115. package/src/astro/routes/api/media/[id].ts +5 -15
  1116. package/src/astro/routes/api/media/file/[...key].ts +30 -5
  1117. package/src/astro/routes/api/oauth/authorize.ts +4 -0
  1118. package/src/astro/routes/api/schema/block-types/[slug]/index.ts +29 -0
  1119. package/src/astro/routes/api/schema/block-types/[slug]/versions/[version]/activate.ts +31 -0
  1120. package/src/astro/routes/api/schema/block-types/index.ts +29 -0
  1121. package/src/astro/routes/api/taxonomies/bulk-tag.ts +29 -0
  1122. package/src/astro/routes/api/typegen.ts +8 -4
  1123. package/src/astro/types.ts +4 -0
  1124. package/src/auth/api-tokens.ts +1 -0
  1125. package/src/auth/rate-limit.ts +2 -1
  1126. package/src/auth/scopes.ts +11 -0
  1127. package/src/cleanup.ts +14 -0
  1128. package/src/cli/client-factory.ts +6 -1
  1129. package/src/cli/commands/export-seed.ts +41 -15
  1130. package/src/cli/commands/seed.ts +6 -2
  1131. package/src/cli/commands/site.ts +556 -0
  1132. package/src/cli/index.ts +2 -0
  1133. package/src/cli/site/archive.ts +273 -0
  1134. package/src/cli/site/export.ts +311 -0
  1135. package/src/cli/site/import.ts +815 -0
  1136. package/src/cli/site/shared.ts +241 -0
  1137. package/src/client/index.ts +414 -11
  1138. package/src/client/portable-text.ts +41 -0
  1139. package/src/comments/public-submission.ts +19 -11
  1140. package/src/components/Blocks.astro +46 -0
  1141. package/src/components/Gallery.astro +2 -1
  1142. package/src/components/Image.astro +51 -6
  1143. package/src/components/InlinePortableTextEditor.tsx +28 -18
  1144. package/src/components/blocks.ts +44 -0
  1145. package/src/components/index.ts +14 -4
  1146. package/src/content/converters/gallery.ts +54 -16
  1147. package/src/content/converters/image-link.ts +27 -0
  1148. package/src/content/converters/index.ts +1 -0
  1149. package/src/content/converters/portable-text-to-prosemirror.ts +10 -7
  1150. package/src/content/converters/prosemirror-to-portable-text.ts +14 -0
  1151. package/src/content/converters/types.ts +17 -0
  1152. package/src/database/content-datetime.ts +19 -2
  1153. package/src/database/migrations/035_bounded_404_log.ts +28 -39
  1154. package/src/database/migrations/083_block_types.ts +58 -0
  1155. package/src/database/migrations/084_site_transfer.ts +264 -0
  1156. package/src/database/migrations/085_taxonomy_def_groups.ts +155 -0
  1157. package/src/database/migrations/runner.ts +6 -0
  1158. package/src/database/repositories/audit.ts +10 -1
  1159. package/src/database/repositories/byline.ts +4 -1
  1160. package/src/database/repositories/content.ts +83 -11
  1161. package/src/database/repositories/media-usage.ts +43 -13
  1162. package/src/database/repositories/media.ts +32 -1
  1163. package/src/database/repositories/options.ts +12 -0
  1164. package/src/database/repositories/revision.ts +6 -3
  1165. package/src/database/repositories/taxonomy-def.ts +126 -0
  1166. package/src/database/repositories/taxonomy.ts +65 -26
  1167. package/src/database/types.ts +133 -1
  1168. package/src/db/sqlite.ts +1 -1
  1169. package/src/emdash-runtime.ts +287 -51
  1170. package/src/import/utils.ts +8 -1
  1171. package/src/import/wxr-taxonomies.ts +11 -67
  1172. package/src/index.ts +26 -1
  1173. package/src/loader.ts +9 -5
  1174. package/src/mcp/server.ts +521 -29
  1175. package/src/mcp/transfer.ts +569 -0
  1176. package/src/media/local-runtime.ts +5 -18
  1177. package/src/media/upload-attempts.ts +5 -0
  1178. package/src/media/url.ts +15 -0
  1179. package/src/media/usage/content-fields.ts +69 -5
  1180. package/src/media/usage/content-refresh.ts +13 -66
  1181. package/src/media/usage/content-repair.ts +10 -2
  1182. package/src/media/usage/extractor.ts +74 -3
  1183. package/src/media/usage/projection-fingerprint.ts +14 -0
  1184. package/src/media/usage/schema-invalidation.ts +72 -0
  1185. package/src/media/usage/site-settings.ts +52 -0
  1186. package/src/media/usage/types.ts +2 -0
  1187. package/src/object-cache/index.ts +69 -4
  1188. package/src/plugin-test-runtime.ts +1 -0
  1189. package/src/plugins/context.ts +104 -56
  1190. package/src/plugins/cron.ts +6 -4
  1191. package/src/plugins/define-plugin.ts +11 -1
  1192. package/src/plugins/email-console.ts +2 -0
  1193. package/src/plugins/email.ts +16 -0
  1194. package/src/plugins/hooks.ts +33 -9
  1195. package/src/plugins/manifest-schema.ts +1 -0
  1196. package/src/plugins/route-error.ts +57 -0
  1197. package/src/plugins/routes.ts +5 -60
  1198. package/src/plugins/sandbox/types.ts +22 -2
  1199. package/src/plugins/types.ts +4 -0
  1200. package/src/registry/artifact-fetch.ts +17 -4
  1201. package/src/registry/publisher-handle.ts +273 -0
  1202. package/src/schema/block-type-contract.ts +478 -0
  1203. package/src/schema/block-type-registry.ts +689 -0
  1204. package/src/schema/block-types.ts +110 -0
  1205. package/src/schema/block-values.ts +293 -0
  1206. package/src/schema/byline-registry.ts +1 -1
  1207. package/src/schema/index.ts +28 -0
  1208. package/src/schema/registry.ts +462 -12
  1209. package/src/schema/types.ts +12 -1
  1210. package/src/schema/zod-generator.ts +92 -9
  1211. package/src/search/fts-manager.ts +40 -0
  1212. package/src/seed/apply.ts +173 -49
  1213. package/src/seed/types.ts +23 -3
  1214. package/src/seed/validate.ts +131 -7
  1215. package/src/settings/index.ts +32 -9
  1216. package/src/settings/types.ts +15 -0
  1217. package/src/taxonomies/index.ts +72 -83
  1218. package/src/transfer/analyze/index.ts +45 -0
  1219. package/src/transfer/analyze/issues.ts +55 -0
  1220. package/src/transfer/analyze/plan.ts +327 -0
  1221. package/src/transfer/analyze/read.ts +134 -0
  1222. package/src/transfer/analyze/step.ts +551 -0
  1223. package/src/transfer/analyze/target.ts +269 -0
  1224. package/src/transfer/analyze/unique-keys.ts +228 -0
  1225. package/src/transfer/analyze/validate.ts +1412 -0
  1226. package/src/transfer/analyze/values.ts +227 -0
  1227. package/src/transfer/analyze/write-rules.ts +196 -0
  1228. package/src/transfer/audit.ts +38 -0
  1229. package/src/transfer/auth.ts +25 -0
  1230. package/src/transfer/container/tar.ts +242 -0
  1231. package/src/transfer/domain.ts +248 -0
  1232. package/src/transfer/errors.ts +134 -0
  1233. package/src/transfer/export/exporter.ts +1067 -0
  1234. package/src/transfer/export/fence.ts +84 -0
  1235. package/src/transfer/export/media.ts +165 -0
  1236. package/src/transfer/export/readers.ts +1164 -0
  1237. package/src/transfer/export/verify.ts +677 -0
  1238. package/src/transfer/fence.ts +193 -0
  1239. package/src/transfer/format/canonical.ts +151 -0
  1240. package/src/transfer/format/column-codec.ts +275 -0
  1241. package/src/transfer/format/columns.ts +707 -0
  1242. package/src/transfer/format/digest.ts +287 -0
  1243. package/src/transfer/format/features.ts +91 -0
  1244. package/src/transfer/format/issues.ts +39 -0
  1245. package/src/transfer/format/kinds.ts +936 -0
  1246. package/src/transfer/format/limits.ts +87 -0
  1247. package/src/transfer/format/manifest.ts +297 -0
  1248. package/src/transfer/format/media-refs.ts +716 -0
  1249. package/src/transfer/format/paths.ts +73 -0
  1250. package/src/transfer/format/plan.ts +162 -0
  1251. package/src/transfer/format/receipt.ts +43 -0
  1252. package/src/transfer/format/records.ts +127 -0
  1253. package/src/transfer/format/settings.ts +94 -0
  1254. package/src/transfer/format/transformations.ts +260 -0
  1255. package/src/transfer/format/version.ts +9 -0
  1256. package/src/transfer/gc.ts +103 -0
  1257. package/src/transfer/import/advance.ts +522 -0
  1258. package/src/transfer/import/context.ts +281 -0
  1259. package/src/transfer/import/entries.ts +186 -0
  1260. package/src/transfer/import/ids.ts +40 -0
  1261. package/src/transfer/import/index.ts +15 -0
  1262. package/src/transfer/import/media.ts +141 -0
  1263. package/src/transfer/import/rebuild.ts +300 -0
  1264. package/src/transfer/import/rows.ts +114 -0
  1265. package/src/transfer/import/scaffold.ts +221 -0
  1266. package/src/transfer/import/sql.ts +134 -0
  1267. package/src/transfer/import/stages.ts +329 -0
  1268. package/src/transfer/import/writers.ts +370 -0
  1269. package/src/transfer/index.ts +472 -0
  1270. package/src/transfer/ops/approvals.ts +359 -0
  1271. package/src/transfer/ops/budget.ts +82 -0
  1272. package/src/transfer/ops/collation.ts +21 -0
  1273. package/src/transfer/ops/identity-map.ts +142 -0
  1274. package/src/transfer/ops/media-blobs.ts +135 -0
  1275. package/src/transfer/ops/operations.ts +842 -0
  1276. package/src/transfer/ops/package-index.ts +159 -0
  1277. package/src/transfer/ops/staged-files.ts +231 -0
  1278. package/src/transfer/ops/states.ts +265 -0
  1279. package/src/transfer/ops/time.ts +54 -0
  1280. package/src/transfer/schema-importer.ts +34 -0
  1281. package/src/transfer/site-id.ts +30 -0
  1282. package/src/transfer/staging/assembler.ts +217 -0
  1283. package/src/transfer/staging/keys.ts +94 -0
  1284. package/src/transfer/staging/package.ts +229 -0
  1285. package/src/transfer/staging/stage.ts +231 -0
  1286. package/src/ui.ts +19 -0
  1287. package/src/visual-editing/toolbar.ts +125 -37
  1288. package/dist/action-token-On1sot_c.mjs +0 -26
  1289. package/dist/action-token-On1sot_c.mjs.map +0 -1
  1290. package/dist/activation-CaMfdBt1.mjs +0 -382
  1291. package/dist/activation-CaMfdBt1.mjs.map +0 -1
  1292. package/dist/adapters-Cq10K4_c.d.mts +0 -171
  1293. package/dist/adapters-Cq10K4_c.d.mts.map +0 -1
  1294. package/dist/allowed-origins-1Sa-2wZK.mjs +0 -116
  1295. package/dist/allowed-origins-1Sa-2wZK.mjs.map +0 -1
  1296. package/dist/api-BB5BoQbN.mjs +0 -4831
  1297. package/dist/api-BB5BoQbN.mjs.map +0 -1
  1298. package/dist/api-tokens-BIXItFKV.mjs +0 -163
  1299. package/dist/api-tokens-BIXItFKV.mjs.map +0 -1
  1300. package/dist/api-tokens-DS1VzN7_.mjs +0 -3
  1301. package/dist/apply-CsKm_5S5.mjs +0 -1005
  1302. package/dist/apply-CsKm_5S5.mjs.map +0 -1
  1303. package/dist/artifact-fetch-COiMhVgk.mjs +0 -813
  1304. package/dist/artifact-fetch-COiMhVgk.mjs.map +0 -1
  1305. package/dist/authoritative-records-DbqshfKD.mjs +0 -5172
  1306. package/dist/authoritative-records-DbqshfKD.mjs.map +0 -1
  1307. package/dist/authorize-BXpfMpp0.mjs +0 -40
  1308. package/dist/authorize-BXpfMpp0.mjs.map +0 -1
  1309. package/dist/backup-B4tByjBb.mjs +0 -246
  1310. package/dist/backup-B4tByjBb.mjs.map +0 -1
  1311. package/dist/byline-C8ndlnP0.mjs +0 -906
  1312. package/dist/byline-C8ndlnP0.mjs.map +0 -1
  1313. package/dist/byline-fields-CsrdvaLV.mjs +0 -123
  1314. package/dist/byline-fields-CsrdvaLV.mjs.map +0 -1
  1315. package/dist/byline-registry-D6lWzXk6.mjs +0 -406
  1316. package/dist/byline-registry-D6lWzXk6.mjs.map +0 -1
  1317. package/dist/bylines-CHP44GkL.mjs +0 -232
  1318. package/dist/bylines-CHP44GkL.mjs.map +0 -1
  1319. package/dist/bylines-DxjM4Usz.mjs +0 -214
  1320. package/dist/bylines-DxjM4Usz.mjs.map +0 -1
  1321. package/dist/cache-BByLKGPu.mjs +0 -108
  1322. package/dist/cache-BByLKGPu.mjs.map +0 -1
  1323. package/dist/capture-triggers-gxQxnxrJ.mjs +0 -362
  1324. package/dist/capture-triggers-gxQxnxrJ.mjs.map +0 -1
  1325. package/dist/challenge-store-CkRdSdd8.mjs +0 -51
  1326. package/dist/challenge-store-CkRdSdd8.mjs.map +0 -1
  1327. package/dist/checksum-Bsi2D9M1.mjs +0 -162
  1328. package/dist/checksum-Bsi2D9M1.mjs.map +0 -1
  1329. package/dist/chrome-tags-D7LGB91U.mjs +0 -24
  1330. package/dist/chrome-tags-D7LGB91U.mjs.map +0 -1
  1331. package/dist/chunks-DUK-cWXi.mjs +0 -25
  1332. package/dist/chunks-DUK-cWXi.mjs.map +0 -1
  1333. package/dist/collection-deletion-C-yQB9fq.mjs +0 -436
  1334. package/dist/collection-deletion-C-yQB9fq.mjs.map +0 -1
  1335. package/dist/collection-slugs-cache-D9auiKmI.mjs +0 -85
  1336. package/dist/collection-slugs-cache-D9auiKmI.mjs.map +0 -1
  1337. package/dist/comment-DcT8qdPK.mjs +0 -313
  1338. package/dist/comment-DcT8qdPK.mjs.map +0 -1
  1339. package/dist/comment-reaction-B6KHCLYK.mjs +0 -85
  1340. package/dist/comment-reaction-B6KHCLYK.mjs.map +0 -1
  1341. package/dist/comments-B67VRNGw.mjs +0 -204
  1342. package/dist/comments-B67VRNGw.mjs.map +0 -1
  1343. package/dist/comments-BVzzt6x5.mjs +0 -99
  1344. package/dist/comments-BVzzt6x5.mjs.map +0 -1
  1345. package/dist/components-DIl9Qzh6.mjs +0 -108
  1346. package/dist/components-DIl9Qzh6.mjs.map +0 -1
  1347. package/dist/config-B2acLeC5.mjs +0 -242
  1348. package/dist/config-B2acLeC5.mjs.map +0 -1
  1349. package/dist/config-CGVeT8Hc.mjs +0 -73
  1350. package/dist/config-CGVeT8Hc.mjs.map +0 -1
  1351. package/dist/config-Cw1Xz_Br.d.mts +0 -6387
  1352. package/dist/config-Cw1Xz_Br.d.mts.map +0 -1
  1353. package/dist/config-D3HhLON3.d.mts +0 -39
  1354. package/dist/config-D3HhLON3.d.mts.map +0 -1
  1355. package/dist/content-C0Hl3ktM.mjs +0 -2216
  1356. package/dist/content-C0Hl3ktM.mjs.map +0 -1
  1357. package/dist/content-list-query-CbPdzsna.d.mts +0 -26
  1358. package/dist/content-list-query-CbPdzsna.d.mts.map +0 -1
  1359. package/dist/content-policy-CM4skrNi.mjs +0 -46
  1360. package/dist/content-policy-CM4skrNi.mjs.map +0 -1
  1361. package/dist/content-refresh-iRBhQHr5.mjs +0 -3599
  1362. package/dist/content-refresh-iRBhQHr5.mjs.map +0 -1
  1363. package/dist/content-repair-8uHRIJkd.mjs +0 -440
  1364. package/dist/content-repair-8uHRIJkd.mjs.map +0 -1
  1365. package/dist/context-DJP3aNeR.mjs +0 -1835
  1366. package/dist/context-DJP3aNeR.mjs.map +0 -1
  1367. package/dist/cron-BcR3RN4K.mjs +0 -282
  1368. package/dist/cron-BcR3RN4K.mjs.map +0 -1
  1369. package/dist/dashboard-B0s6QKgi.mjs +0 -151
  1370. package/dist/dashboard-B0s6QKgi.mjs.map +0 -1
  1371. package/dist/default-BtlxWgh9.mjs +0 -81
  1372. package/dist/default-BtlxWgh9.mjs.map +0 -1
  1373. package/dist/deferred-tasks-Ba9fphlE.d.mts +0 -9
  1374. package/dist/deferred-tasks-Ba9fphlE.d.mts.map +0 -1
  1375. package/dist/device-flow-3E5l0fpH.mjs +0 -466
  1376. package/dist/device-flow-3E5l0fpH.mjs.map +0 -1
  1377. package/dist/dialect-helpers-CtYdsX4W.mjs +0 -307
  1378. package/dist/dialect-helpers-CtYdsX4W.mjs.map +0 -1
  1379. package/dist/direct-executor-CDr1quOq.mjs +0 -104
  1380. package/dist/direct-executor-CDr1quOq.mjs.map +0 -1
  1381. package/dist/dist-2hDLsLeq.mjs +0 -810
  1382. package/dist/dist-2hDLsLeq.mjs.map +0 -1
  1383. package/dist/email-console-gc-E3Eqj.mjs +0 -50
  1384. package/dist/email-console-gc-E3Eqj.mjs.map +0 -1
  1385. package/dist/emdash-runtime-CxxL05Z0.mjs +0 -4041
  1386. package/dist/emdash-runtime-CxxL05Z0.mjs.map +0 -1
  1387. package/dist/enrich-C2Mk0lwE.mjs +0 -194
  1388. package/dist/enrich-C2Mk0lwE.mjs.map +0 -1
  1389. package/dist/entry-lock-CwWdnFyR.mjs +0 -1520
  1390. package/dist/entry-lock-CwWdnFyR.mjs.map +0 -1
  1391. package/dist/entry-lock-D9rnj2Lu.mjs +0 -163
  1392. package/dist/entry-lock-D9rnj2Lu.mjs.map +0 -1
  1393. package/dist/entry-lock-DqkvBC6L.d.mts +0 -3503
  1394. package/dist/entry-lock-DqkvBC6L.d.mts.map +0 -1
  1395. package/dist/entry-locks-CO_KaoU5.mjs +0 -167
  1396. package/dist/entry-locks-CO_KaoU5.mjs.map +0 -1
  1397. package/dist/error-CCTCskie.mjs +0 -90
  1398. package/dist/error-CCTCskie.mjs.map +0 -1
  1399. package/dist/errors-W3PA8HqB.mjs +0 -447
  1400. package/dist/errors-W3PA8HqB.mjs.map +0 -1
  1401. package/dist/escape-DN4Qmjsl.mjs +0 -9
  1402. package/dist/escape-DN4Qmjsl.mjs.map +0 -1
  1403. package/dist/field-defs-cache-Db0pJgqn.mjs +0 -77
  1404. package/dist/field-defs-cache-Db0pJgqn.mjs.map +0 -1
  1405. package/dist/fts-manager-CjX0e5BR.mjs +0 -413
  1406. package/dist/fts-manager-CjX0e5BR.mjs.map +0 -1
  1407. package/dist/hash-CLVFzWvx.mjs +0 -37
  1408. package/dist/hash-CLVFzWvx.mjs.map +0 -1
  1409. package/dist/hook-result-KY1jq21o.d.mts +0 -31
  1410. package/dist/hook-result-KY1jq21o.d.mts.map +0 -1
  1411. package/dist/hreflang-BgS2FqhH.d.mts +0 -50
  1412. package/dist/hreflang-BgS2FqhH.d.mts.map +0 -1
  1413. package/dist/hreflang-DOQeTXpg.mjs +0 -105
  1414. package/dist/hreflang-DOQeTXpg.mjs.map +0 -1
  1415. package/dist/http-route-dispatch-MCVKiQCl.mjs +0 -339
  1416. package/dist/http-route-dispatch-MCVKiQCl.mjs.map +0 -1
  1417. package/dist/identity-vFbpuwfY.mjs +0 -35
  1418. package/dist/identity-vFbpuwfY.mjs.map +0 -1
  1419. package/dist/import-got6I69S.mjs +0 -2020
  1420. package/dist/import-got6I69S.mjs.map +0 -1
  1421. package/dist/index-CDwKDkTq.d.mts +0 -623
  1422. package/dist/index-CDwKDkTq.d.mts.map +0 -1
  1423. package/dist/install-finalization-5Os-QZ-2.mjs +0 -58
  1424. package/dist/install-finalization-5Os-QZ-2.mjs.map +0 -1
  1425. package/dist/lifecycle-7e-Lt_kX.mjs +0 -25
  1426. package/dist/lifecycle-7e-Lt_kX.mjs.map +0 -1
  1427. package/dist/load-C56XiwbV.mjs +0 -28
  1428. package/dist/load-C56XiwbV.mjs.map +0 -1
  1429. package/dist/loader-xhNQiT9T.mjs +0 -1004
  1430. package/dist/loader-xhNQiT9T.mjs.map +0 -1
  1431. package/dist/manifest-builder-Bz3nxVET.mjs +0 -189
  1432. package/dist/manifest-builder-Bz3nxVET.mjs.map +0 -1
  1433. package/dist/manifest-schema-Bkh8SeHd.mjs +0 -491
  1434. package/dist/manifest-schema-Bkh8SeHd.mjs.map +0 -1
  1435. package/dist/media-TBlKCwo7.mjs +0 -334
  1436. package/dist/media-TBlKCwo7.mjs.map +0 -1
  1437. package/dist/media-allowlist-s60eAIf6.mjs +0 -44
  1438. package/dist/media-allowlist-s60eAIf6.mjs.map +0 -1
  1439. package/dist/media-folders-ClIRLUQv.mjs +0 -210
  1440. package/dist/media-folders-ClIRLUQv.mjs.map +0 -1
  1441. package/dist/media-url-DY_ijO3B.mjs +0 -43
  1442. package/dist/media-url-DY_ijO3B.mjs.map +0 -1
  1443. package/dist/media-usage-Bd9rFPKN.mjs +0 -1833
  1444. package/dist/media-usage-Bd9rFPKN.mjs.map +0 -1
  1445. package/dist/media-usage-activation-CAhmb14O.mjs +0 -78
  1446. package/dist/media-usage-activation-CAhmb14O.mjs.map +0 -1
  1447. package/dist/media-usage-work-BPlRMOJv.mjs +0 -152
  1448. package/dist/media-usage-work-BPlRMOJv.mjs.map +0 -1
  1449. package/dist/media-usage-work-Cu5DqewW.mjs +0 -586
  1450. package/dist/media-usage-work-Cu5DqewW.mjs.map +0 -1
  1451. package/dist/media-usage-write-fence-DW5oHT7q.mjs +0 -42
  1452. package/dist/media-usage-write-fence-DW5oHT7q.mjs.map +0 -1
  1453. package/dist/menus-BUQdvXep.mjs +0 -3732
  1454. package/dist/menus-BUQdvXep.mjs.map +0 -1
  1455. package/dist/menus-DgSUodmF.mjs +0 -753
  1456. package/dist/menus-DgSUodmF.mjs.map +0 -1
  1457. package/dist/mime-CCYRC4r1.mjs +0 -36
  1458. package/dist/mime-CCYRC4r1.mjs.map +0 -1
  1459. package/dist/mode-CkmOhFqj.mjs +0 -23
  1460. package/dist/mode-CkmOhFqj.mjs.map +0 -1
  1461. package/dist/node-sqlite-compat-vpVaILnb.mjs +0 -46
  1462. package/dist/node-sqlite-compat-vpVaILnb.mjs.map +0 -1
  1463. package/dist/normalize-dChXQjwS.mjs +0 -191
  1464. package/dist/normalize-dChXQjwS.mjs.map +0 -1
  1465. package/dist/oauth-authorization-DZ-R-hmx.mjs +0 -274
  1466. package/dist/oauth-authorization-DZ-R-hmx.mjs.map +0 -1
  1467. package/dist/oauth-clients-BMPA8vjl.mjs +0 -266
  1468. package/dist/oauth-clients-BMPA8vjl.mjs.map +0 -1
  1469. package/dist/oauth-state-store-0gIdb48-.mjs +0 -50
  1470. package/dist/oauth-state-store-0gIdb48-.mjs.map +0 -1
  1471. package/dist/oauth-user-lookup-ChVW4UWu.mjs +0 -26
  1472. package/dist/oauth-user-lookup-ChVW4UWu.mjs.map +0 -1
  1473. package/dist/object-cache-DlSVbn5Y.mjs +0 -534
  1474. package/dist/object-cache-DlSVbn5Y.mjs.map +0 -1
  1475. package/dist/options-D5WcorD5.mjs +0 -200
  1476. package/dist/options-D5WcorD5.mjs.map +0 -1
  1477. package/dist/options-DAknChnw.d.mts +0 -77
  1478. package/dist/options-DAknChnw.d.mts.map +0 -1
  1479. package/dist/parse-Cr379Av9.mjs +0 -81
  1480. package/dist/parse-Cr379Av9.mjs.map +0 -1
  1481. package/dist/parse-tj9XLNO_.d.mts +0 -165
  1482. package/dist/parse-tj9XLNO_.d.mts.map +0 -1
  1483. package/dist/passkey-config-BD-wMaCf.mjs +0 -46
  1484. package/dist/passkey-config-BD-wMaCf.mjs.map +0 -1
  1485. package/dist/patterns-Do3iqi7N.mjs +0 -145
  1486. package/dist/patterns-Do3iqi7N.mjs.map +0 -1
  1487. package/dist/placeholder-CubPFn_L.d.mts +0 -306
  1488. package/dist/placeholder-CubPFn_L.d.mts.map +0 -1
  1489. package/dist/plugins-DHurtdXQ.mjs +0 -277
  1490. package/dist/plugins-DHurtdXQ.mjs.map +0 -1
  1491. package/dist/policy-pL9QLKZm.mjs +0 -45
  1492. package/dist/policy-pL9QLKZm.mjs.map +0 -1
  1493. package/dist/portable-text-oAwodbPS.mjs +0 -286
  1494. package/dist/portable-text-oAwodbPS.mjs.map +0 -1
  1495. package/dist/preview-Cup2bj8c.mjs +0 -107
  1496. package/dist/preview-Cup2bj8c.mjs.map +0 -1
  1497. package/dist/protocol-C1CNiKX4.d.mts +0 -61
  1498. package/dist/protocol-C1CNiKX4.d.mts.map +0 -1
  1499. package/dist/public-submission-Cs-pFMQK.mjs +0 -245
  1500. package/dist/public-submission-Cs-pFMQK.mjs.map +0 -1
  1501. package/dist/public-url-BWVHsfQv.mjs +0 -101
  1502. package/dist/public-url-BWVHsfQv.mjs.map +0 -1
  1503. package/dist/query-CxnFU6sz.mjs +0 -890
  1504. package/dist/query-CxnFU6sz.mjs.map +0 -1
  1505. package/dist/query-sgHYEgBW.mjs +0 -41
  1506. package/dist/query-sgHYEgBW.mjs.map +0 -1
  1507. package/dist/rate-limit-CqJn-w4h.mjs +0 -120
  1508. package/dist/rate-limit-CqJn-w4h.mjs.map +0 -1
  1509. package/dist/redirect-BrChFPIu.mjs +0 -17
  1510. package/dist/redirect-BrChFPIu.mjs.map +0 -1
  1511. package/dist/redirect-D2Yo-b6S.mjs +0 -415
  1512. package/dist/redirect-D2Yo-b6S.mjs.map +0 -1
  1513. package/dist/redirects-BCiTaIQ-.mjs +0 -146
  1514. package/dist/redirects-BCiTaIQ-.mjs.map +0 -1
  1515. package/dist/redirects-CAoL3r26.mjs +0 -644
  1516. package/dist/redirects-CAoL3r26.mjs.map +0 -1
  1517. package/dist/registry-xKzE-_m5.mjs +0 -1222
  1518. package/dist/registry-xKzE-_m5.mjs.map +0 -1
  1519. package/dist/relation-ClsWcYg2.mjs +0 -334
  1520. package/dist/relation-ClsWcYg2.mjs.map +0 -1
  1521. package/dist/relations-B4w-G5U9.mjs +0 -309
  1522. package/dist/relations-B4w-G5U9.mjs.map +0 -1
  1523. package/dist/relations-C3Td_mct.mjs +0 -403
  1524. package/dist/relations-C3Td_mct.mjs.map +0 -1
  1525. package/dist/request-cache-DaMhSQdx.mjs +0 -104
  1526. package/dist/request-cache-DaMhSQdx.mjs.map +0 -1
  1527. package/dist/request-meta-C8yl_sIs.mjs +0 -141
  1528. package/dist/request-meta-C8yl_sIs.mjs.map +0 -1
  1529. package/dist/resolve-BJIS8wKr.mjs +0 -199
  1530. package/dist/resolve-BJIS8wKr.mjs.map +0 -1
  1531. package/dist/route-wire-D66L2oaZ.mjs +0 -197
  1532. package/dist/route-wire-D66L2oaZ.mjs.map +0 -1
  1533. package/dist/routes-CWzxcZpn.mjs +0 -321
  1534. package/dist/routes-CWzxcZpn.mjs.map +0 -1
  1535. package/dist/runner-3gfxRsJG.d.mts +0 -68
  1536. package/dist/runner-3gfxRsJG.d.mts.map +0 -1
  1537. package/dist/runner-CIltKk4i.mjs +0 -5502
  1538. package/dist/runner-CIltKk4i.mjs.map +0 -1
  1539. package/dist/schema-DQIE9Htn.mjs +0 -420
  1540. package/dist/schema-DQIE9Htn.mjs.map +0 -1
  1541. package/dist/schema-ILPFMPW3.mjs +0 -9
  1542. package/dist/schema-ILPFMPW3.mjs.map +0 -1
  1543. package/dist/scopes-Bn8_rCSt.mjs +0 -27
  1544. package/dist/scopes-Bn8_rCSt.mjs.map +0 -1
  1545. package/dist/search-D6muneha.mjs +0 -448
  1546. package/dist/search-D6muneha.mjs.map +0 -1
  1547. package/dist/secrets-DNgVgz_e.mjs +0 -341
  1548. package/dist/secrets-DNgVgz_e.mjs.map +0 -1
  1549. package/dist/sections-BPCEGYWd.mjs +0 -346
  1550. package/dist/sections-BPCEGYWd.mjs.map +0 -1
  1551. package/dist/seo-BtU70b7l.mjs +0 -114
  1552. package/dist/seo-BtU70b7l.mjs.map +0 -1
  1553. package/dist/seo-rCk6pDwT.mjs +0 -133
  1554. package/dist/seo-rCk6pDwT.mjs.map +0 -1
  1555. package/dist/service-Bpy5iTX0.mjs +0 -150
  1556. package/dist/service-Bpy5iTX0.mjs.map +0 -1
  1557. package/dist/session-user-BQeS2Mrb.mjs +0 -51
  1558. package/dist/session-user-BQeS2Mrb.mjs.map +0 -1
  1559. package/dist/settings-CsoLiwpL.mjs +0 -420
  1560. package/dist/settings-CsoLiwpL.mjs.map +0 -1
  1561. package/dist/settings-DCnWtfSZ.mjs +0 -51
  1562. package/dist/settings-DCnWtfSZ.mjs.map +0 -1
  1563. package/dist/setup-complete-BrZaXpVV.mjs +0 -26
  1564. package/dist/setup-complete-BrZaXpVV.mjs.map +0 -1
  1565. package/dist/setup-nonce-Cb9-884O.mjs +0 -25
  1566. package/dist/setup-nonce-Cb9-884O.mjs.map +0 -1
  1567. package/dist/site-url-DjhYCaep.mjs +0 -16
  1568. package/dist/site-url-DjhYCaep.mjs.map +0 -1
  1569. package/dist/snapshot-C32Xuv3o.mjs +0 -233
  1570. package/dist/snapshot-C32Xuv3o.mjs.map +0 -1
  1571. package/dist/ssrf-Co1GGFZz.mjs +0 -406
  1572. package/dist/ssrf-Co1GGFZz.mjs.map +0 -1
  1573. package/dist/state-C7gCoiHr.mjs +0 -153
  1574. package/dist/state-C7gCoiHr.mjs.map +0 -1
  1575. package/dist/status-DLoBmcDz.mjs +0 -30
  1576. package/dist/status-DLoBmcDz.mjs.map +0 -1
  1577. package/dist/storage-query-CPctdMKX.d.mts +0 -1519
  1578. package/dist/storage-query-CPctdMKX.d.mts.map +0 -1
  1579. package/dist/target-CUKlGrXb.mjs +0 -27
  1580. package/dist/target-CUKlGrXb.mjs.map +0 -1
  1581. package/dist/taxonomies-Bs5dJVDJ.mjs +0 -899
  1582. package/dist/taxonomies-Bs5dJVDJ.mjs.map +0 -1
  1583. package/dist/taxonomies-DjGU22ur.mjs +0 -707
  1584. package/dist/taxonomies-DjGU22ur.mjs.map +0 -1
  1585. package/dist/taxonomy-c1Q8PMFF.mjs +0 -508
  1586. package/dist/taxonomy-c1Q8PMFF.mjs.map +0 -1
  1587. package/dist/tokens-Ns02GAma.mjs +0 -171
  1588. package/dist/tokens-Ns02GAma.mjs.map +0 -1
  1589. package/dist/transport-B8P1xsqk.mjs +0 -136
  1590. package/dist/transport-B8P1xsqk.mjs.map +0 -1
  1591. package/dist/transport-BLHZZcD_.d.mts +0 -42
  1592. package/dist/transport-BLHZZcD_.d.mts.map +0 -1
  1593. package/dist/trusted-proxy-Cg7SuD15.mjs +0 -51
  1594. package/dist/trusted-proxy-Cg7SuD15.mjs.map +0 -1
  1595. package/dist/turnstile-DWCSh_Qc.mjs +0 -53
  1596. package/dist/turnstile-DWCSh_Qc.mjs.map +0 -1
  1597. package/dist/types-B3RkqvDW.mjs +0 -156
  1598. package/dist/types-B3RkqvDW.mjs.map +0 -1
  1599. package/dist/types-BtuppOTV.mjs +0 -16
  1600. package/dist/types-BtuppOTV.mjs.map +0 -1
  1601. package/dist/types-CCR3ivXE.d.mts +0 -363
  1602. package/dist/types-CCR3ivXE.d.mts.map +0 -1
  1603. package/dist/types-CSHgU_-_.mjs +0 -18
  1604. package/dist/types-CSHgU_-_.mjs.map +0 -1
  1605. package/dist/types-CbwqGOXm.d.mts +0 -766
  1606. package/dist/types-CbwqGOXm.d.mts.map +0 -1
  1607. package/dist/types-D4RGIc2I.d.mts +0 -198
  1608. package/dist/types-D4RGIc2I.d.mts.map +0 -1
  1609. package/dist/types-DEHidMEk.d.mts +0 -1637
  1610. package/dist/types-DEHidMEk.d.mts.map +0 -1
  1611. package/dist/types-DQeU2SR7.d.mts +0 -279
  1612. package/dist/types-DQeU2SR7.d.mts.map +0 -1
  1613. package/dist/types-DxQWoQLA.d.mts +0 -264
  1614. package/dist/types-DxQWoQLA.d.mts.map +0 -1
  1615. package/dist/types-FBBnGZ2Y.d.mts +0 -198
  1616. package/dist/types-FBBnGZ2Y.d.mts.map +0 -1
  1617. package/dist/types-ZCnlropY.mjs +0 -69
  1618. package/dist/types-ZCnlropY.mjs.map +0 -1
  1619. package/dist/types-_Qtyawiy.d.mts +0 -124
  1620. package/dist/types-_Qtyawiy.d.mts.map +0 -1
  1621. package/dist/types-gC6FAoa_.d.mts +0 -75
  1622. package/dist/types-gC6FAoa_.d.mts.map +0 -1
  1623. package/dist/types-k--LneIF.mjs +0 -22
  1624. package/dist/types-k--LneIF.mjs.map +0 -1
  1625. package/dist/upload-attempts-2xdnoKGe.mjs +0 -27
  1626. package/dist/upload-attempts-2xdnoKGe.mjs.map +0 -1
  1627. package/dist/url-pattern-3m3reMzr.mjs +0 -33
  1628. package/dist/url-pattern-3m3reMzr.mjs.map +0 -1
  1629. package/dist/user-2R1gceFl.mjs +0 -171
  1630. package/dist/user-2R1gceFl.mjs.map +0 -1
  1631. package/dist/utils-CC2oNGV8.mjs +0 -435
  1632. package/dist/utils-CC2oNGV8.mjs.map +0 -1
  1633. package/dist/validate-CaFSi_Wa.mjs +0 -384
  1634. package/dist/validate-CaFSi_Wa.mjs.map +0 -1
  1635. package/dist/validate-CyQ7I3xF.d.mts +0 -410
  1636. package/dist/validate-CyQ7I3xF.d.mts.map +0 -1
  1637. package/dist/validation-nsX2uixg.mjs +0 -216
  1638. package/dist/validation-nsX2uixg.mjs.map +0 -1
  1639. package/dist/version-DGh4SL8e.mjs +0 -7
  1640. package/dist/version-DGh4SL8e.mjs.map +0 -1
  1641. package/dist/widgets-B7ued6f5.mjs +0 -126
  1642. package/dist/widgets-B7ued6f5.mjs.map +0 -1
  1643. package/dist/wxr-taxonomies-BtH3jYSg.mjs +0 -406
  1644. package/dist/wxr-taxonomies-BtH3jYSg.mjs.map +0 -1
  1645. package/dist/wxr-taxonomies-DU2ZSiGc.d.mts +0 -34
  1646. package/dist/wxr-taxonomies-DU2ZSiGc.d.mts.map +0 -1
  1647. package/dist/zod-generator-DuBjYyrI.mjs +0 -329
  1648. package/dist/zod-generator-DuBjYyrI.mjs.map +0 -1
  1649. /package/dist/{ssrf-BRpTDMV6.mjs → ssrf-DpBH7aOt.mjs} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-usage-My-Vi-ex.mjs","names":["retryDelaySeconds"],"sources":["../src/media/usage/reconciliation.ts","../src/media/usage/reconciliation-processor.ts","../src/media/usage/work-processor.ts","../src/media/usage/maintenance-engine.ts","../src/api/handlers/media-usage.ts"],"sourcesContent":["import { sql, type Kysely, type RawBuilder, type Selectable } from \"kysely\";\nimport { ulid } from \"ulidx\";\n\nimport { isPostgres } from \"../../database/dialect-helpers.js\";\nimport { jsonTextValues } from \"../../database/json-recordset.js\";\nimport type { Database, MediaUsageReconciliationTable } from \"../../database/types.js\";\nimport { validateIdentifier } from \"../../database/validate.js\";\n\nconst ACTIVATION_KEY = \"incremental_capture\";\nconst CONTENT_ADAPTER_ID = \"content-media\";\nconst COLLECTION_SCOPE = \"collection\";\nconst MAX_CANDIDATES = 100;\nconst MAX_PORTABLE_DURATION_SECONDS = 365 * 24 * 60 * 60;\nconst STABLE_ERROR_CODE_PATTERN = /^[A-Z][A-Z0-9_]{0,63}$/;\n\nexport type MediaUsageReconciliationState = \"pending\" | \"retry\" | \"leased\" | \"failed\";\nexport type MediaUsageReconciliationPhase = \"scan\" | \"sources\";\n\nexport interface MediaUsageReconciliationRecord {\n\tcollectionId: string;\n\tcollectionSlug: string;\n\trunToken: string;\n\ttargetEpoch: number | string | null;\n\tfieldFingerprint: string | null;\n\tstate: MediaUsageReconciliationState;\n\tphase: MediaUsageReconciliationPhase;\n\tscanCursor: string | null;\n\tscanUpperId: string | null;\n\tsourceCursor: string | null;\n\tsourceUpperKey: string | null;\n\tattemptCount: number;\n\tnextAttemptAt: string;\n\tleaseToken: string | null;\n\tleaseExpiresAt: string | null;\n\tlastErrorCode: string | null;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface MediaUsageReconciliationClaim extends MediaUsageReconciliationRecord {\n\tleaseToken: string;\n}\n\nexport interface MediaUsageReconciliationSourceCandidate {\n\tsourceKey: string;\n\tcontentId: string | null;\n\tsourceVariant: string;\n}\n\nexport type MediaUsageReconciliationWorkBarrier =\n\t| { state: \"empty\" }\n\t| { state: \"pending\" }\n\t| { state: \"failed\"; errorCode: string };\n\nexport class MediaUsageReconciliationRepository {\n\tconstructor(private db: Kysely<Database>) {}\n\n\tasync findByIdentity(\n\t\tcollectionId: string,\n\t\trunToken: string,\n\t): Promise<MediaUsageReconciliationRecord | null> {\n\t\tassertIdentity({ collectionId, runToken });\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_reconciliations\")\n\t\t\t.selectAll()\n\t\t\t.where(\"collection_id\", \"=\", collectionId)\n\t\t\t.where(\"run_token\", \"=\", runToken)\n\t\t\t.executeTakeFirst();\n\t\treturn row ? rowToRecord(row) : null;\n\t}\n\n\tasync beginRun(claim: MediaUsageReconciliationClaim): Promise<number | string | null> {\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst sameRun = sql<boolean>`status = 'running' AND cursor = ${claim.runToken}`;\n\t\tconst row = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status as status\")\n\t\t\t.set({\n\t\t\t\tstatus: \"running\",\n\t\t\t\tstarted_at: sql<string | null>`CASE WHEN ${sameRun} THEN started_at ELSE ${now} END`,\n\t\t\t\tcompleted_at: null,\n\t\t\t\tcursor: claim.runToken,\n\t\t\t\tindexed_source_count: 0,\n\t\t\t\tfailed_source_count: 0,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tchange_epoch: sql<number>`CASE WHEN ${sameRun} THEN change_epoch ELSE change_epoch + 1 END`,\n\t\t\t\treconciliation_required: 1,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t.where(\"status.collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(\"status.scope_key\", \"=\", claim.collectionSlug)\n\t\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t\t.where(\"status.reconciliation_required\", \"=\", 1)\n\t\t\t.where((eb) =>\n\t\t\t\teb.or([eb(\"status.status\", \"!=\", \"running\"), eb(\"status.cursor\", \"=\", claim.runToken)]),\n\t\t\t)\n\t\t\t.where(this.liveClaimExists(claim))\n\t\t\t.returning(\"change_epoch\")\n\t\t\t.executeTakeFirst();\n\t\treturn row?.change_epoch ?? null;\n\t}\n\n\tasync findScanUpperId(claim: MediaUsageReconciliationClaim): Promise<string | null> {\n\t\tconst tableName = contentTableName(claim.collectionSlug);\n\t\tconst result = await sql<{ id: string }>`\n\t\t\tSELECT content.id\n\t\t\tFROM ${sql.ref(tableName)} AS content\n\t\t\tWHERE ${this.liveClaimExistsSql(claim)}\n\t\t\tORDER BY content.id DESC\n\t\t\tLIMIT 1\n\t\t`.execute(this.db);\n\t\treturn result.rows[0]?.id ?? null;\n\t}\n\n\tasync initializeScan(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\ttargetEpoch: number | string;\n\t\tfieldFingerprint: string;\n\t\tscanUpperId: string | null;\n\t}): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\ttarget_epoch: input.targetEpoch,\n\t\t\t\tfield_fingerprint: input.fieldFingerprint,\n\t\t\t\tphase: \"scan\",\n\t\t\t\tscan_cursor: null,\n\t\t\t\tscan_upper_id: input.scanUpperId,\n\t\t\t\tsource_cursor: null,\n\t\t\t\tsource_upper_key: null,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t.where(\"reconciliation.target_epoch\", \"is\", null)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.where(this.statusOwnsRun(input.claim, input.targetEpoch))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync findScanPage(\n\t\treconciliation: MediaUsageReconciliationRecord,\n\t\tlimit: number,\n\t): Promise<string[]> {\n\t\tif (!Number.isSafeInteger(limit) || limit < 1 || limit > 1_000) {\n\t\t\tthrow new Error(\"Reconciliation scan page limit must be from 1 to 1000\");\n\t\t}\n\t\tif (!reconciliation.leaseToken || reconciliation.targetEpoch === null) return [];\n\t\tconst tableName = contentTableName(reconciliation.collectionSlug);\n\t\tconst lowerBound = reconciliation.scanCursor\n\t\t\t? sql`AND content.id > ${reconciliation.scanCursor}`\n\t\t\t: sql``;\n\t\tconst upperBound = reconciliation.scanUpperId\n\t\t\t? sql`AND content.id <= ${reconciliation.scanUpperId}`\n\t\t\t: sql`AND 1 = 0`;\n\t\tconst result = await sql<{ id: string }>`\n\t\t\tSELECT content.id\n\t\t\tFROM ${sql.ref(tableName)} AS content\n\t\t\tWHERE 1 = 1\n\t\t\t\t${lowerBound}\n\t\t\t\t${upperBound}\n\t\t\t\tAND ${this.liveClaimExistsSql(reconciliation)}\n\t\t\tORDER BY content.id ASC\n\t\t\tLIMIT ${limit}\n\t\t`.execute(this.db);\n\t\treturn result.rows.map((row) => row.id);\n\t}\n\n\tasync checkpointScan(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\ttargetEpoch: number | string;\n\t\tpreviousCursor: string | null;\n\t\tnextCursor: string;\n\t}): Promise<boolean> {\n\t\tlet query = this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tscan_cursor: input.nextCursor,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t.where(\"reconciliation.target_epoch\", \"=\", input.targetEpoch)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.phase\", \"=\", \"scan\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.where(this.statusOwnsRun(input.claim, input.targetEpoch));\n\t\tquery = input.previousCursor\n\t\t\t? query.where(\"reconciliation.scan_cursor\", \"=\", input.previousCursor)\n\t\t\t: query.where(\"reconciliation.scan_cursor\", \"is\", null);\n\t\tconst result = await query.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync ownsRun(\n\t\tclaim: MediaUsageReconciliationClaim,\n\t\ttargetEpoch: number | string,\n\t): Promise<boolean> {\n\t\tconst result = await sql<{ owned: boolean | number }>`\n\t\t\tSELECT ${this.statusOwnsRun(claim, targetEpoch)} AS owned\n\t\t`.execute(this.db);\n\t\treturn Boolean(result.rows[0]?.owned);\n\t}\n\n\tasync restartRun(\n\t\tclaim: MediaUsageReconciliationClaim,\n\t\tpreviousEpoch: number | string,\n\t): Promise<number | string | null> {\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst interruptedRestart = sql<boolean>`status = 'running'\n\t\t\tAND cursor = ${claim.runToken}\n\t\t\tAND change_epoch > ${previousEpoch}`;\n\t\tconst row = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status as status\")\n\t\t\t.set({\n\t\t\t\tstatus: \"running\",\n\t\t\t\tstarted_at: sql<\n\t\t\t\t\tstring | null\n\t\t\t\t>`CASE WHEN ${interruptedRestart} THEN started_at ELSE ${now} END`,\n\t\t\t\tcompleted_at: null,\n\t\t\t\tcursor: claim.runToken,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tchange_epoch: sql<number>`CASE WHEN ${interruptedRestart} THEN change_epoch ELSE change_epoch + 1 END`,\n\t\t\t\treconciliation_required: 1,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t.where(\"status.collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(\"status.scope_key\", \"=\", claim.collectionSlug)\n\t\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t\t.where(\"status.reconciliation_required\", \"=\", 1)\n\t\t\t.where((eb) =>\n\t\t\t\teb.or([eb(\"status.status\", \"!=\", \"running\"), eb(\"status.cursor\", \"=\", claim.runToken)]),\n\t\t\t)\n\t\t\t.where(this.liveClaimExists(claim))\n\t\t\t.returning(\"change_epoch\")\n\t\t\t.executeTakeFirst();\n\t\treturn row?.change_epoch ?? null;\n\t}\n\n\tasync restartScan(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\tpreviousEpoch: number | string;\n\t\ttargetEpoch: number | string;\n\t\tfieldFingerprint: string;\n\t\tscanUpperId: string | null;\n\t}): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\ttarget_epoch: input.targetEpoch,\n\t\t\t\tfield_fingerprint: input.fieldFingerprint,\n\t\t\t\tphase: \"scan\",\n\t\t\t\tscan_cursor: null,\n\t\t\t\tscan_upper_id: input.scanUpperId,\n\t\t\t\tsource_cursor: null,\n\t\t\t\tsource_upper_key: null,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tnext_attempt_at: timestampOffset(this.db, 0),\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t.where(\"reconciliation.target_epoch\", \"=\", input.previousEpoch)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.where(this.statusOwnsRun(input.claim, input.targetEpoch))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync findWorkBarrier(collectionId: string): Promise<MediaUsageReconciliationWorkBarrier> {\n\t\tif (!collectionId) throw new Error(\"Reconciliation work barrier requires a collection ID\");\n\t\tconst failed = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_work\")\n\t\t\t.select(\"last_error_code\")\n\t\t\t.where(\"collection_id\", \"=\", collectionId)\n\t\t\t.where(\"state\", \"=\", \"failed\")\n\t\t\t.orderBy(\"content_id\")\n\t\t\t.limit(1)\n\t\t\t.executeTakeFirst();\n\t\tif (failed) {\n\t\t\treturn {\n\t\t\t\tstate: \"failed\",\n\t\t\t\terrorCode: failed.last_error_code ?? \"MEDIA_USAGE_PROCESSING_FAILED\",\n\t\t\t};\n\t\t}\n\t\tconst pending = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_work\")\n\t\t\t.select(\"content_id\")\n\t\t\t.where(\"collection_id\", \"=\", collectionId)\n\t\t\t.limit(1)\n\t\t\t.executeTakeFirst();\n\t\treturn pending ? { state: \"pending\" } : { state: \"empty\" };\n\t}\n\n\tasync findSourceUpperKey(\n\t\tclaim: MediaUsageReconciliationClaim,\n\t\ttargetEpoch: number | string,\n\t): Promise<string | null> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources as source\")\n\t\t\t.select(\"source.source_key\")\n\t\t\t.where(\"source.source_type\", \"=\", \"content\")\n\t\t\t.where(\"source.collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(\"source.identity_version\", \"=\", 1)\n\t\t\t.where(this.liveClaimExists(claim))\n\t\t\t.where(this.statusOwnsRun(claim, targetEpoch))\n\t\t\t.orderBy(\"source.source_key\", \"desc\")\n\t\t\t.limit(1)\n\t\t\t.executeTakeFirst();\n\t\treturn row?.source_key ?? null;\n\t}\n\n\tasync transitionToSources(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\ttargetEpoch: number | string;\n\t\tfieldFingerprint: string;\n\t\tsourceUpperKey: string | null;\n\t}): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tphase: \"sources\",\n\t\t\t\tsource_cursor: null,\n\t\t\t\tsource_upper_key: input.sourceUpperKey,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t.where(\"reconciliation.target_epoch\", \"=\", input.targetEpoch)\n\t\t\t.where(\"reconciliation.field_fingerprint\", \"=\", input.fieldFingerprint)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.phase\", \"=\", \"scan\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.where(this.statusOwnsRun(input.claim, input.targetEpoch))\n\t\t\t.where((eb) =>\n\t\t\t\teb.not(\n\t\t\t\t\teb.exists(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_work as work\")\n\t\t\t\t\t\t\t.select(\"work.content_id\")\n\t\t\t\t\t\t\t.where(\"work.collection_id\", \"=\", input.claim.collectionId),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync findSourcePage(\n\t\treconciliation: MediaUsageReconciliationRecord,\n\t\tlimit: number,\n\t): Promise<MediaUsageReconciliationSourceCandidate[]> {\n\t\tif (!Number.isSafeInteger(limit) || limit < 1 || limit > 1_000) {\n\t\t\tthrow new Error(\"Reconciliation source page limit must be from 1 to 1000\");\n\t\t}\n\t\tif (!reconciliation.leaseToken || reconciliation.targetEpoch === null) return [];\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_sources as source\")\n\t\t\t.select([\"source.source_key\", \"source.content_id\", \"source.source_variant\"])\n\t\t\t.where(\"source.source_type\", \"=\", \"content\")\n\t\t\t.where(\"source.collection_id\", \"=\", reconciliation.collectionId)\n\t\t\t.where(\"source.identity_version\", \"=\", 1)\n\t\t\t.where(this.liveClaimExists(reconciliation))\n\t\t\t.where(this.statusOwnsRun(reconciliation, reconciliation.targetEpoch));\n\t\tif (reconciliation.sourceCursor) {\n\t\t\tquery = query.where(\"source.source_key\", \">\", reconciliation.sourceCursor);\n\t\t}\n\t\tif (reconciliation.sourceUpperKey) {\n\t\t\tquery = query.where(\"source.source_key\", \"<=\", reconciliation.sourceUpperKey);\n\t\t} else {\n\t\t\tquery = query.where(sql<boolean>`1 = 0`);\n\t\t}\n\t\tconst rows = await query.orderBy(\"source.source_key\").limit(limit).execute();\n\t\treturn rows.map((row) => ({\n\t\t\tsourceKey: row.source_key,\n\t\t\tcontentId: row.content_id,\n\t\t\tsourceVariant: row.source_variant,\n\t\t}));\n\t}\n\n\tasync findMissingContentIds(\n\t\tcollectionSlug: string,\n\t\tcontentIds: readonly string[],\n\t): Promise<string[]> {\n\t\tconst unique = [...new Set(contentIds)];\n\t\tif (unique.length === 0) return [];\n\t\tif (unique.length > 1_000 || unique.some((contentId) => !contentId)) {\n\t\t\tthrow new Error(\"Reconciliation source page has invalid content identity\");\n\t\t}\n\t\tconst tableName = contentTableName(collectionSlug);\n\t\tconst requested = jsonTextValues(this.db, unique);\n\t\tconst existing = await sql<{ id: string }>`\n\t\t\tWITH requested AS (${requested})\n\t\t\tSELECT content.id\n\t\t\tFROM ${sql.ref(tableName)} AS content\n\t\t\tINNER JOIN requested ON requested.value = content.id\n\t\t`.execute(this.db);\n\t\tconst present = new Set(existing.rows.map((row) => row.id));\n\t\treturn unique.filter((contentId) => !present.has(contentId));\n\t}\n\n\tasync checkpointSources(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\ttargetEpoch: number | string;\n\t\tpreviousCursor: string | null;\n\t\tnextCursor: string;\n\t}): Promise<boolean> {\n\t\tlet query = this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tsource_cursor: input.nextCursor,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t.where(\"reconciliation.target_epoch\", \"=\", input.targetEpoch)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.phase\", \"=\", \"sources\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.where(this.statusOwnsRun(input.claim, input.targetEpoch));\n\t\tquery = input.previousCursor\n\t\t\t? query.where(\"reconciliation.source_cursor\", \"=\", input.previousCursor)\n\t\t\t: query.where(\"reconciliation.source_cursor\", \"is\", null);\n\t\tconst result = await query.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync finishFailedCoverage(collectionId: string, runToken: string): Promise<boolean> {\n\t\tassertIdentity({ collectionId, runToken });\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status as status\")\n\t\t\t.set({\n\t\t\t\tstatus: sql<string>`CASE WHEN EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_sources AS source\n\t\t\t\t\tWHERE source.source_type = 'content'\n\t\t\t\t\t\tAND source.collection_id = ${collectionId}\n\t\t\t\t\t\tAND source.identity_version = 1\n\t\t\t\t\tLIMIT 1\n\t\t\t\t) THEN 'partial' ELSE 'failed' END`,\n\t\t\t\tcompleted_at: null,\n\t\t\t\tcursor: null,\n\t\t\t\tlast_error_code: sql<string>`CASE WHEN (\n\t\t\t\t\tSELECT reconciliation.last_error_code\n\t\t\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\t\t\tWHERE reconciliation.collection_id = ${collectionId}\n\t\t\t\t\t\tAND reconciliation.run_token = ${runToken}\n\t\t\t\t) = 'MEDIA_USAGE_RECONCILIATION_ENTRY_FAILED'\n\t\t\t\tTHEN COALESCE(\n\t\t\t\t\t(SELECT work.last_error_code\n\t\t\t\t\t FROM _emdash_media_usage_work AS work\n\t\t\t\t\t WHERE work.collection_id = ${collectionId} AND work.state = 'failed'\n\t\t\t\t\t ORDER BY work.content_id LIMIT 1),\n\t\t\t\t\t'MEDIA_USAGE_RECONCILIATION_ENTRY_FAILED'\n\t\t\t\t)\n\t\t\t\tELSE (\n\t\t\t\t\tSELECT reconciliation.last_error_code\n\t\t\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\t\t\tWHERE reconciliation.collection_id = ${collectionId}\n\t\t\t\t\t\tAND reconciliation.run_token = ${runToken}\n\t\t\t\t) END`,\n\t\t\t\treconciliation_required: 1,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t.where(\"status.collection_id\", \"=\", collectionId)\n\t\t\t.where(\"status.status\", \"=\", \"running\")\n\t\t\t.where(\"status.cursor\", \"=\", runToken)\n\t\t\t.where(sql<boolean>`status.change_epoch = (\n\t\t\t\tSELECT reconciliation.target_epoch\n\t\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\t\tWHERE reconciliation.collection_id = ${collectionId}\n\t\t\t\t\tAND reconciliation.run_token = ${runToken}\n\t\t\t)`)\n\t\t\t.where((eb) =>\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t\t\t\t.select(\"reconciliation.collection_id\")\n\t\t\t\t\t\t.where(\"reconciliation.collection_id\", \"=\", collectionId)\n\t\t\t\t\t\t.where(\"reconciliation.run_token\", \"=\", runToken)\n\t\t\t\t\t\t.where(\"reconciliation.state\", \"=\", \"failed\"),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync finalizeCoverage(input: {\n\t\tclaim: MediaUsageReconciliationClaim;\n\t\ttargetEpoch: number | string;\n\t\tfieldFingerprint: string;\n\t\tschemaVersion: number;\n\t}): Promise<boolean> {\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_index_status as status\")\n\t\t\t.set({\n\t\t\t\tstatus: \"complete\",\n\t\t\t\tschema_version: input.schemaVersion,\n\t\t\t\tcompleted_at: now,\n\t\t\t\tcursor: null,\n\t\t\t\tlast_error_code: null,\n\t\t\t\treconciliation_required: 0,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t.where(\"status.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t.where(\"status.scope_key\", \"=\", input.claim.collectionSlug)\n\t\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t\t.where(\"status.reconciliation_required\", \"=\", 1)\n\t\t\t.where(\"status.status\", \"=\", \"running\")\n\t\t\t.where(\"status.cursor\", \"=\", input.claim.runToken)\n\t\t\t.where(\"status.change_epoch\", \"=\", input.targetEpoch)\n\t\t\t.where((eb) =>\n\t\t\t\teb.not(\n\t\t\t\t\teb.exists(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_work as work\")\n\t\t\t\t\t\t\t.select(\"work.content_id\")\n\t\t\t\t\t\t\t.where(\"work.collection_id\", \"=\", input.claim.collectionId),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.where((eb) =>\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t\t\t\t.innerJoin(\"_emdash_collections as collection\", (join) =>\n\t\t\t\t\t\t\tjoin\n\t\t\t\t\t\t\t\t.onRef(\"collection.id\", \"=\", \"reconciliation.collection_id\")\n\t\t\t\t\t\t\t\t.onRef(\"collection.slug\", \"=\", \"reconciliation.collection_slug\"),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.select(\"reconciliation.collection_id\")\n\t\t\t\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.claim.collectionId)\n\t\t\t\t\t\t.where(\"reconciliation.run_token\", \"=\", input.claim.runToken)\n\t\t\t\t\t\t.where(\"reconciliation.target_epoch\", \"=\", input.targetEpoch)\n\t\t\t\t\t\t.where(\"reconciliation.field_fingerprint\", \"=\", input.fieldFingerprint)\n\t\t\t\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t\t\t\t.where(\"reconciliation.phase\", \"=\", \"sources\")\n\t\t\t\t\t\t.where(\"reconciliation.lease_token\", \"=\", input.claim.leaseToken)\n\t\t\t\t\t\t.where(liveLease(this.db, \"reconciliation.lease_expires_at\"))\n\t\t\t\t\t\t.where((inner) =>\n\t\t\t\t\t\t\tinner.not(\n\t\t\t\t\t\t\t\tinner.exists(\n\t\t\t\t\t\t\t\t\tinner\n\t\t\t\t\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions as deletion\")\n\t\t\t\t\t\t\t\t\t\t.select(\"deletion.collection_id\")\n\t\t\t\t\t\t\t\t\t\t.where(\"deletion.collection_id\", \"=\", input.claim.collectionId),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.where((eb) =>\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_activation as activation\")\n\t\t\t\t\t\t.select(\"activation.task_key\")\n\t\t\t\t\t\t.where(\"activation.task_key\", \"=\", ACTIVATION_KEY)\n\t\t\t\t\t\t.where(\"activation.state\", \"=\", \"active\"),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync deleteFinalized(claim: MediaUsageReconciliationClaim): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.deleteFrom(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", claim.runToken)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", claim.leaseToken)\n\t\t\t.where((eb) =>\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_index_status as status\")\n\t\t\t\t\t\t.select(\"status.collection_id\")\n\t\t\t\t\t\t.where(\"status.collection_id\", \"=\", claim.collectionId)\n\t\t\t\t\t\t.where(\"status.scope_key\", \"=\", claim.collectionSlug)\n\t\t\t\t\t\t.where(\"status.status\", \"=\", \"complete\")\n\t\t\t\t\t\t.where(\"status.reconciliation_required\", \"=\", 0),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numDeletedRows ?? 0) === 1;\n\t}\n\n\tasync deleteOneObsolete(): Promise<boolean> {\n\t\tconst result = await sql<{ collection_id: string }>`\n\t\t\tDELETE FROM _emdash_media_usage_reconciliations\n\t\t\tWHERE (collection_id, run_token) IN (\n\t\t\t\tSELECT reconciliation.collection_id, reconciliation.run_token\n\t\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\t\tINNER JOIN _emdash_media_usage_index_status AS status\n\t\t\t\t\tON status.collection_id = reconciliation.collection_id\n\t\t\t\t\tAND status.scope_key = reconciliation.collection_slug\n\t\t\t\tWHERE status.adapter_id = ${CONTENT_ADAPTER_ID}\n\t\t\t\t\tAND status.scope_type = ${COLLECTION_SCOPE}\n\t\t\t\t\tAND status.reconciliation_required = 0\n\t\t\t\tORDER BY reconciliation.updated_at, reconciliation.collection_id\n\t\t\t\tLIMIT 1\n\t\t\t)\n\t\t\tRETURNING collection_id\n\t\t`.execute(this.db);\n\t\treturn result.rows.length === 1;\n\t}\n\n\tprivate liveClaimExists(\n\t\tclaim: Pick<\n\t\t\tMediaUsageReconciliationRecord,\n\t\t\t\"collectionId\" | \"collectionSlug\" | \"runToken\" | \"leaseToken\"\n\t\t>,\n\t): RawBuilder<boolean> {\n\t\treturn this.liveClaimExistsSql(claim);\n\t}\n\n\tprivate liveClaimExistsSql(\n\t\tclaim: Pick<\n\t\t\tMediaUsageReconciliationRecord,\n\t\t\t\"collectionId\" | \"collectionSlug\" | \"runToken\" | \"leaseToken\"\n\t\t>,\n\t): RawBuilder<boolean> {\n\t\treturn sql<boolean>`EXISTS (\n\t\t\tSELECT 1\n\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\tINNER JOIN _emdash_collections AS collection\n\t\t\t\tON collection.id = reconciliation.collection_id\n\t\t\t\tAND collection.slug = reconciliation.collection_slug\n\t\t\tWHERE reconciliation.collection_id = ${claim.collectionId}\n\t\t\t\tAND reconciliation.collection_slug = ${claim.collectionSlug}\n\t\t\t\tAND reconciliation.run_token = ${claim.runToken}\n\t\t\t\tAND reconciliation.state = 'leased'\n\t\t\t\tAND reconciliation.lease_token = ${claim.leaseToken}\n\t\t\t\tAND ${liveLease(this.db, \"reconciliation.lease_expires_at\")}\n\t\t\t\tAND EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_activation AS activation\n\t\t\t\t\tWHERE activation.task_key = ${ACTIVATION_KEY}\n\t\t\t\t\t\tAND activation.state = 'active'\n\t\t\t\t)\n\t\t\t\tAND NOT EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_collection_deletions AS deletion\n\t\t\t\t\tWHERE deletion.collection_id = reconciliation.collection_id\n\t\t\t\t)\n\t\t)`;\n\t}\n\n\tprivate statusOwnsRun(\n\t\tclaim: Pick<MediaUsageReconciliationRecord, \"collectionId\" | \"collectionSlug\" | \"runToken\">,\n\t\ttargetEpoch: number | string,\n\t): RawBuilder<boolean> {\n\t\treturn sql<boolean>`EXISTS (\n\t\t\tSELECT 1 FROM _emdash_media_usage_index_status AS status\n\t\t\tWHERE status.adapter_id = ${CONTENT_ADAPTER_ID}\n\t\t\t\tAND status.scope_type = ${COLLECTION_SCOPE}\n\t\t\t\tAND status.collection_id = ${claim.collectionId}\n\t\t\t\tAND status.scope_key = ${claim.collectionSlug}\n\t\t\t\tAND status.capture_state = 'active'\n\t\t\t\tAND status.reconciliation_required = 1\n\t\t\t\tAND status.status = 'running'\n\t\t\t\tAND status.cursor = ${claim.runToken}\n\t\t\t\tAND status.change_epoch = ${targetEpoch}\n\t\t)`;\n\t}\n\n\tasync seedNextCandidate(): Promise<boolean> {\n\t\tconst runToken = ulid();\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst result = await sql<{ collection_id: string }>`\n\t\t\tINSERT INTO _emdash_media_usage_reconciliations (\n\t\t\t\tcollection_id,\n\t\t\t\tcollection_slug,\n\t\t\t\trun_token,\n\t\t\t\tnext_attempt_at,\n\t\t\t\tupdated_at\n\t\t\t)\n\t\t\tSELECT status.collection_id, status.scope_key, ${runToken}, ${now}, ${now}\n\t\t\tFROM _emdash_media_usage_index_status AS status\n\t\t\tINNER JOIN _emdash_collections AS collection\n\t\t\t\tON collection.id = status.collection_id\n\t\t\t\tAND collection.slug = status.scope_key\n\t\t\tWHERE status.adapter_id = ${CONTENT_ADAPTER_ID}\n\t\t\t\tAND status.scope_type = ${COLLECTION_SCOPE}\n\t\t\t\tAND status.capture_state = 'active'\n\t\t\t\tAND status.reconciliation_required = 1\n\t\t\t\tAND status.collection_id IS NOT NULL\n\t\t\t\tAND EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_activation AS activation\n\t\t\t\t\tWHERE activation.task_key = ${ACTIVATION_KEY}\n\t\t\t\t\t\tAND activation.state = 'active'\n\t\t\t\t)\n\t\t\t\tAND NOT EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_reconciliations AS existing\n\t\t\t\t\tWHERE existing.collection_id = status.collection_id\n\t\t\t\t)\n\t\t\t\tAND NOT EXISTS (\n\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_collection_deletions AS deletion\n\t\t\t\t\tWHERE deletion.collection_id = status.collection_id\n\t\t\t\t)\n\t\t\tORDER BY status.collection_id\n\t\t\tLIMIT 1\n\t\t\tON CONFLICT (collection_id) DO NOTHING\n\t\t\tRETURNING collection_id\n\t\t`.execute(this.db);\n\t\treturn result.rows.length === 1;\n\t}\n\n\tasync findDue(limit: number): Promise<MediaUsageReconciliationRecord[]> {\n\t\tassertLimit(limit);\n\t\tconst nextAttemptIsDue = timestampIsDue(this.db, \"next_attempt_at\");\n\t\tconst leaseIsDue = timestampIsDue(this.db, \"lease_expires_at\");\n\t\tconst result = await sql<Selectable<MediaUsageReconciliationTable>>`\n\t\t\tWITH pending_candidates AS (\n\t\t\t\tSELECT * FROM _emdash_media_usage_reconciliations\n\t\t\t\tWHERE state = 'pending' AND ${nextAttemptIsDue}\n\t\t\t\tORDER BY next_attempt_at, updated_at, collection_id\n\t\t\t\tLIMIT ${limit}\n\t\t\t), retry_candidates AS (\n\t\t\t\tSELECT * FROM _emdash_media_usage_reconciliations\n\t\t\t\tWHERE state = 'retry' AND ${nextAttemptIsDue}\n\t\t\t\tORDER BY next_attempt_at, updated_at, collection_id\n\t\t\t\tLIMIT ${limit}\n\t\t\t), leased_candidates AS (\n\t\t\t\tSELECT * FROM _emdash_media_usage_reconciliations\n\t\t\t\tWHERE state = 'leased' AND ${leaseIsDue}\n\t\t\t\tORDER BY lease_expires_at, updated_at, collection_id\n\t\t\t\tLIMIT ${limit}\n\t\t\t), candidates AS (\n\t\t\t\tSELECT * FROM pending_candidates\n\t\t\t\tUNION ALL SELECT * FROM retry_candidates\n\t\t\t\tUNION ALL SELECT * FROM leased_candidates\n\t\t\t)\n\t\t\tSELECT * FROM candidates\n\t\t\tORDER BY CASE WHEN state = 'leased' THEN lease_expires_at ELSE next_attempt_at END,\n\t\t\t\tupdated_at,\n\t\t\t\tcollection_id\n\t\t\tLIMIT ${limit}\n\t\t`.execute(this.db);\n\t\treturn result.rows.map(rowToRecord);\n\t}\n\n\tasync hasDeferredCandidate(): Promise<boolean> {\n\t\tconst row = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_reconciliations\")\n\t\t\t.select(\"collection_id\")\n\t\t\t.where(\"state\", \"in\", [\"pending\", \"retry\", \"leased\"])\n\t\t\t.limit(1)\n\t\t\t.executeTakeFirst();\n\t\treturn row !== undefined;\n\t}\n\n\tasync wakeDrainedBarrierCandidate(): Promise<boolean> {\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst candidateIsDue = timestampIsDue(this.db, \"reconciliation.next_attempt_at\");\n\t\tconst targetIsDue = timestampIsDue(\n\t\t\tthis.db,\n\t\t\t\"_emdash_media_usage_reconciliations.next_attempt_at\",\n\t\t);\n\t\tconst result = await sql<{ collection_id: string }>`\n\t\t\tUPDATE _emdash_media_usage_reconciliations\n\t\t\tSET next_attempt_at = ${now}, updated_at = ${now}\n\t\t\tWHERE collection_id = (\n\t\t\t\tSELECT reconciliation.collection_id\n\t\t\t\tFROM _emdash_media_usage_reconciliations AS reconciliation\n\t\t\t\tINNER JOIN _emdash_media_usage_index_status AS status\n\t\t\t\t\tON status.collection_id = reconciliation.collection_id\n\t\t\t\t\tAND status.scope_key = reconciliation.collection_slug\n\t\t\t\tWHERE reconciliation.state = 'pending'\n\t\t\t\t\tAND reconciliation.target_epoch IS NOT NULL\n\t\t\t\t\tAND NOT ${candidateIsDue}\n\t\t\t\t\tAND status.adapter_id = ${CONTENT_ADAPTER_ID}\n\t\t\t\t\tAND status.scope_type = ${COLLECTION_SCOPE}\n\t\t\t\t\tAND status.capture_state = 'active'\n\t\t\t\t\tAND status.reconciliation_required = 1\n\t\t\t\t\tAND status.status = 'running'\n\t\t\t\t\tAND status.cursor = reconciliation.run_token\n\t\t\t\t\tAND status.change_epoch = reconciliation.target_epoch\n\t\t\t\t\tAND NOT EXISTS (\n\t\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_work AS work\n\t\t\t\t\t\tWHERE work.collection_id = reconciliation.collection_id\n\t\t\t\t\t)\n\t\t\t\t\tAND NOT EXISTS (\n\t\t\t\t\t\tSELECT 1 FROM _emdash_media_usage_collection_deletions AS deletion\n\t\t\t\t\t\tWHERE deletion.collection_id = reconciliation.collection_id\n\t\t\t\t\t)\n\t\t\t\tORDER BY reconciliation.next_attempt_at, reconciliation.updated_at,\n\t\t\t\t\treconciliation.collection_id\n\t\t\t\tLIMIT 1\n\t\t\t)\n\t\t\tAND state = 'pending'\n\t\t\tAND NOT ${targetIsDue}\n\t\t\tAND EXISTS (\n\t\t\t\tSELECT 1 FROM _emdash_media_usage_activation AS activation\n\t\t\t\tWHERE activation.task_key = ${ACTIVATION_KEY}\n\t\t\t\t\tAND activation.state = 'active'\n\t\t\t)\n\t\t\tAND NOT EXISTS (\n\t\t\t\tSELECT 1 FROM _emdash_media_usage_work AS work\n\t\t\t\tWHERE work.collection_id = _emdash_media_usage_reconciliations.collection_id\n\t\t\t)\n\t\t\tRETURNING collection_id\n\t\t`.execute(this.db);\n\t\treturn result.rows.length === 1;\n\t}\n\n\tasync findFailed(limit: number): Promise<MediaUsageReconciliationRecord[]> {\n\t\tassertLimit(limit);\n\t\tconst rows = await this.db\n\t\t\t.selectFrom(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.innerJoin(\"_emdash_media_usage_index_status as status\", (join) =>\n\t\t\t\tjoin\n\t\t\t\t\t.onRef(\"status.collection_id\", \"=\", \"reconciliation.collection_id\")\n\t\t\t\t\t.onRef(\"status.scope_key\", \"=\", \"reconciliation.collection_slug\"),\n\t\t\t)\n\t\t\t.selectAll(\"reconciliation\")\n\t\t\t.where(\"reconciliation.state\", \"=\", \"failed\")\n\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb(\"status.reconciliation_required\", \"=\", 0),\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"status.status\", \"=\", \"running\"),\n\t\t\t\t\t\teb(\"status.cursor\", \"=\", eb.ref(\"reconciliation.run_token\")),\n\t\t\t\t\t]),\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"status.cursor\", \"is\", null),\n\t\t\t\t\t\teb(\"status.change_epoch\", \">\", eb.ref(\"reconciliation.target_epoch\")),\n\t\t\t\t\t]),\n\t\t\t\t]),\n\t\t\t)\n\t\t\t.orderBy(\"reconciliation.updated_at\")\n\t\t\t.orderBy(\"reconciliation.collection_id\")\n\t\t\t.limit(limit)\n\t\t\t.execute();\n\t\treturn rows.map(rowToRecord);\n\t}\n\n\tasync claim(input: {\n\t\tcollectionId: string;\n\t\trunToken: string;\n\t\tleaseDurationSeconds: number;\n\t}): Promise<MediaUsageReconciliationClaim | null> {\n\t\tassertIdentity(input);\n\t\tassertDuration(input.leaseDurationSeconds, \"lease duration\");\n\t\tconst leaseToken = ulid();\n\t\tconst row = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tstate: \"leased\",\n\t\t\t\tlease_token: leaseToken,\n\t\t\t\tlease_expires_at: timestampOffset(this.db, input.leaseDurationSeconds),\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", input.runToken)\n\t\t\t.where((eb) =>\n\t\t\t\teb.or([\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"reconciliation.state\", \"in\", [\"pending\", \"retry\"]),\n\t\t\t\t\t\ttimestampIsDue(this.db, \"reconciliation.next_attempt_at\"),\n\t\t\t\t\t]),\n\t\t\t\t\teb.and([\n\t\t\t\t\t\teb(\"reconciliation.state\", \"=\", \"leased\"),\n\t\t\t\t\t\ttimestampIsDue(this.db, \"reconciliation.lease_expires_at\"),\n\t\t\t\t\t]),\n\t\t\t\t]),\n\t\t\t)\n\t\t\t.where((eb) =>\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_activation as activation\")\n\t\t\t\t\t\t.select(\"activation.task_key\")\n\t\t\t\t\t\t.where(\"activation.task_key\", \"=\", ACTIVATION_KEY)\n\t\t\t\t\t\t.where(\"activation.state\", \"=\", \"active\"),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.where((eb) =>\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_index_status as status\")\n\t\t\t\t\t\t.innerJoin(\"_emdash_collections as collection\", (join) =>\n\t\t\t\t\t\t\tjoin\n\t\t\t\t\t\t\t\t.onRef(\"collection.id\", \"=\", \"status.collection_id\")\n\t\t\t\t\t\t\t\t.onRef(\"collection.slug\", \"=\", \"status.scope_key\"),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.select(\"status.collection_id\")\n\t\t\t\t\t\t.whereRef(\"status.collection_id\", \"=\", \"reconciliation.collection_id\")\n\t\t\t\t\t\t.whereRef(\"status.scope_key\", \"=\", \"reconciliation.collection_slug\")\n\t\t\t\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t\t\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t\t\t\t\t.where(\"status.reconciliation_required\", \"=\", 1),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.where((eb) =>\n\t\t\t\teb.not(\n\t\t\t\t\teb.exists(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_collection_deletions as deletion\")\n\t\t\t\t\t\t\t.select(\"deletion.collection_id\")\n\t\t\t\t\t\t\t.whereRef(\"deletion.collection_id\", \"=\", \"reconciliation.collection_id\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.returningAll()\n\t\t\t.executeTakeFirst();\n\t\treturn row\n\t\t\t? ({ ...rowToRecord(row), leaseToken } satisfies MediaUsageReconciliationClaim)\n\t\t\t: null;\n\t}\n\n\tasync release(input: {\n\t\tcollectionId: string;\n\t\trunToken: string;\n\t\tleaseToken: string;\n\t\tdelaySeconds: number;\n\t}): Promise<boolean> {\n\t\tassertLeaseIdentity(input);\n\t\tassertDuration(input.delaySeconds, \"release delay\", true);\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations\")\n\t\t\t.set({\n\t\t\t\tstate: \"pending\",\n\t\t\t\tnext_attempt_at: timestampOffset(this.db, input.delaySeconds),\n\t\t\t\tlease_token: null,\n\t\t\t\tlease_expires_at: null,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"run_token\", \"=\", input.runToken)\n\t\t\t.where(\"state\", \"=\", \"leased\")\n\t\t\t.where(\"lease_token\", \"=\", input.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync recordFailure(input: {\n\t\tcollectionId: string;\n\t\trunToken: string;\n\t\tleaseToken: string;\n\t\terrorCode: string;\n\t\tretryDelaySeconds: number;\n\t\tterminal: boolean;\n\t}): Promise<boolean> {\n\t\tassertLeaseIdentity(input);\n\t\tif (!STABLE_ERROR_CODE_PATTERN.test(input.errorCode)) {\n\t\t\tthrow new Error(\"Reconciliation failure requires a stable error code\");\n\t\t}\n\t\tassertDuration(input.retryDelaySeconds, \"retry delay\", true);\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations\")\n\t\t\t.set({\n\t\t\t\tstate: input.terminal\n\t\t\t\t\t? \"failed\"\n\t\t\t\t\t: sql<string>`CASE WHEN attempt_count >= 4 THEN 'failed' ELSE 'retry' END`,\n\t\t\t\t...(input.terminal\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttarget_epoch: sql<number | string | null>`COALESCE(\n\t\t\t\t\t\t\t\ttarget_epoch,\n\t\t\t\t\t\t\t\t(SELECT status.change_epoch\n\t\t\t\t\t\t\t\t FROM _emdash_media_usage_index_status AS status\n\t\t\t\t\t\t\t\t WHERE status.adapter_id = ${CONTENT_ADAPTER_ID}\n\t\t\t\t\t\t\t\t\tAND status.scope_type = ${COLLECTION_SCOPE}\n\t\t\t\t\t\t\t\t\tAND status.collection_id = ${input.collectionId}\n\t\t\t\t\t\t\t\t\tAND status.status = 'running'\n\t\t\t\t\t\t\t\t\tAND status.cursor = ${input.runToken})\n\t\t\t\t\t\t\t)`,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\tattempt_count: sql<number>`attempt_count + 1`,\n\t\t\t\tnext_attempt_at: timestampOffset(this.db, input.retryDelaySeconds),\n\t\t\t\tlease_token: null,\n\t\t\t\tlease_expires_at: null,\n\t\t\t\tlast_error_code: input.errorCode,\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"collection_id\", \"=\", input.collectionId)\n\t\t\t.where(\"run_token\", \"=\", input.runToken)\n\t\t\t.where(\"state\", \"=\", \"leased\")\n\t\t\t.where(\"lease_token\", \"=\", input.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync recordEntryFailure(claim: MediaUsageReconciliationClaim): Promise<boolean> {\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tstate: \"failed\",\n\t\t\t\tattempt_count: sql<number>`attempt_count + 1`,\n\t\t\t\tnext_attempt_at: timestampOffset(this.db, 0),\n\t\t\t\tlease_token: null,\n\t\t\t\tlease_expires_at: null,\n\t\t\t\tlast_error_code: \"MEDIA_USAGE_RECONCILIATION_ENTRY_FAILED\",\n\t\t\t\tupdated_at: timestampOffset(this.db, 0),\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", claim.collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", claim.runToken)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"leased\")\n\t\t\t.where(\"reconciliation.lease_token\", \"=\", claim.leaseToken)\n\t\t\t.where(liveLease(this.db))\n\t\t\t.where((eb) =>\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_work as work\")\n\t\t\t\t\t\t.select(\"work.content_id\")\n\t\t\t\t\t\t.where(\"work.collection_id\", \"=\", claim.collectionId)\n\t\t\t\t\t\t.where(\"work.state\", \"=\", \"failed\"),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n\n\tasync resetFailedForNewEpoch(\n\t\tobserved: Selectable<MediaUsageReconciliationTable> | MediaUsageReconciliationRecord,\n\t): Promise<boolean> {\n\t\tconst collectionId =\n\t\t\t\"collection_id\" in observed ? observed.collection_id : observed.collectionId;\n\t\tconst runToken = \"run_token\" in observed ? observed.run_token : observed.runToken;\n\t\tconst targetEpoch = \"target_epoch\" in observed ? observed.target_epoch : observed.targetEpoch;\n\t\tif (targetEpoch === null) return false;\n\t\tconst now = timestampOffset(this.db, 0);\n\t\tconst result = await this.db\n\t\t\t.updateTable(\"_emdash_media_usage_reconciliations as reconciliation\")\n\t\t\t.set({\n\t\t\t\tstate: \"pending\",\n\t\t\t\tphase: \"scan\",\n\t\t\t\ttarget_epoch: null,\n\t\t\t\tfield_fingerprint: null,\n\t\t\t\tscan_cursor: null,\n\t\t\t\tscan_upper_id: null,\n\t\t\t\tsource_cursor: null,\n\t\t\t\tsource_upper_key: null,\n\t\t\t\tattempt_count: 0,\n\t\t\t\tnext_attempt_at: now,\n\t\t\t\tlease_token: null,\n\t\t\t\tlease_expires_at: null,\n\t\t\t\tlast_error_code: null,\n\t\t\t\tupdated_at: now,\n\t\t\t})\n\t\t\t.where(\"reconciliation.collection_id\", \"=\", collectionId)\n\t\t\t.where(\"reconciliation.run_token\", \"=\", runToken)\n\t\t\t.where(\"reconciliation.state\", \"=\", \"failed\")\n\t\t\t.where(\"reconciliation.target_epoch\", \"=\", targetEpoch)\n\t\t\t.where((eb) =>\n\t\t\t\teb.exists(\n\t\t\t\t\teb\n\t\t\t\t\t\t.selectFrom(\"_emdash_media_usage_index_status as status\")\n\t\t\t\t\t\t.select(\"status.collection_id\")\n\t\t\t\t\t\t.whereRef(\"status.collection_id\", \"=\", \"reconciliation.collection_id\")\n\t\t\t\t\t\t.whereRef(\"status.scope_key\", \"=\", \"reconciliation.collection_slug\")\n\t\t\t\t\t\t.where(\"status.adapter_id\", \"=\", CONTENT_ADAPTER_ID)\n\t\t\t\t\t\t.where(\"status.scope_type\", \"=\", COLLECTION_SCOPE)\n\t\t\t\t\t\t.where(\"status.capture_state\", \"=\", \"active\")\n\t\t\t\t\t\t.where(\"status.reconciliation_required\", \"=\", 1)\n\t\t\t\t\t\t.where((status) =>\n\t\t\t\t\t\t\tstatus.or([\n\t\t\t\t\t\t\t\tstatus(\"status.cursor\", \"is\", null),\n\t\t\t\t\t\t\t\tstatus.and([\n\t\t\t\t\t\t\t\t\tstatus(\"status.status\", \"=\", \"running\"),\n\t\t\t\t\t\t\t\t\tstatus(\"status.cursor\", \"=\", runToken),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.where(\"status.change_epoch\", \">\", targetEpoch),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.executeTakeFirst();\n\t\treturn Number(result.numUpdatedRows ?? 0) === 1;\n\t}\n}\n\nfunction rowToRecord(\n\trow: Selectable<MediaUsageReconciliationTable>,\n): MediaUsageReconciliationRecord {\n\tif (!isState(row.state) || !isPhase(row.phase) || !Number.isSafeInteger(row.attempt_count)) {\n\t\tthrow new Error(\"Invalid media usage reconciliation lifecycle\");\n\t}\n\treturn {\n\t\tcollectionId: row.collection_id,\n\t\tcollectionSlug: row.collection_slug,\n\t\trunToken: row.run_token,\n\t\ttargetEpoch: row.target_epoch,\n\t\tfieldFingerprint: row.field_fingerprint,\n\t\tstate: row.state,\n\t\tphase: row.phase,\n\t\tscanCursor: row.scan_cursor,\n\t\tscanUpperId: row.scan_upper_id,\n\t\tsourceCursor: row.source_cursor,\n\t\tsourceUpperKey: row.source_upper_key,\n\t\tattemptCount: row.attempt_count,\n\t\tnextAttemptAt: row.next_attempt_at,\n\t\tleaseToken: row.lease_token,\n\t\tleaseExpiresAt: row.lease_expires_at,\n\t\tlastErrorCode: row.last_error_code,\n\t\tcreatedAt: row.created_at,\n\t\tupdatedAt: row.updated_at,\n\t};\n}\n\nfunction isState(state: string): state is MediaUsageReconciliationState {\n\treturn state === \"pending\" || state === \"retry\" || state === \"leased\" || state === \"failed\";\n}\n\nfunction isPhase(phase: string): phase is MediaUsageReconciliationPhase {\n\treturn phase === \"scan\" || phase === \"sources\";\n}\n\nfunction assertLimit(limit: number): void {\n\tif (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_CANDIDATES) {\n\t\tthrow new Error(\"Reconciliation candidate limit must be from 1 to 100\");\n\t}\n}\n\nfunction assertIdentity(input: { collectionId: string; runToken: string }): void {\n\tif (!input.collectionId || !input.runToken) {\n\t\tthrow new Error(\"Reconciliation requires an exact collection and run token\");\n\t}\n}\n\nfunction assertLeaseIdentity(input: {\n\tcollectionId: string;\n\trunToken: string;\n\tleaseToken: string;\n}): void {\n\tassertIdentity(input);\n\tif (!input.leaseToken) throw new Error(\"Reconciliation requires a lease token\");\n}\n\nfunction assertDuration(value: number, label: string, allowZero = false): void {\n\tif (\n\t\t!Number.isSafeInteger(value) ||\n\t\tvalue < (allowZero ? 0 : 1) ||\n\t\tvalue > MAX_PORTABLE_DURATION_SECONDS\n\t) {\n\t\tthrow new Error(`Reconciliation ${label} is outside the portable range`);\n\t}\n}\n\nfunction liveLease(db: Kysely<Database>, column = \"lease_expires_at\"): RawBuilder<boolean> {\n\tconst expiry = sql.ref(column);\n\treturn isPostgres(db)\n\t\t? sql<boolean>`${expiry} > to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')`\n\t\t: sql<boolean>`${expiry} > strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n}\n\nfunction timestampIsDue(db: Kysely<Database>, column: string): RawBuilder<boolean> {\n\tconst value = sql.ref(column);\n\treturn isPostgres(db)\n\t\t? sql<boolean>`${value} <= to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')`\n\t\t: sql<boolean>`${value} <= strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n}\n\nfunction timestampOffset(db: Kysely<Database>, offsetSeconds: number): RawBuilder<string> {\n\tif (isPostgres(db)) {\n\t\treturn sql<string>`to_char(\n\t\t\t(clock_timestamp() AT TIME ZONE 'UTC') + (${offsetSeconds} * INTERVAL '1 second'),\n\t\t\t'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"'\n\t\t)`;\n\t}\n\treturn sql<string>`strftime(\n\t\t'%Y-%m-%dT%H:%M:%fZ',\n\t\t'now',\n\t\t${`${offsetSeconds >= 0 ? \"+\" : \"\"}${offsetSeconds} seconds`}\n\t)`;\n}\n\nfunction contentTableName(collectionSlug: string): string {\n\tvalidateIdentifier(collectionSlug, \"collection slug\");\n\tconst tableName = `ec_${collectionSlug}`;\n\tvalidateIdentifier(tableName, \"content table\");\n\treturn tableName;\n}\n","import type { Kysely } from \"kysely\";\n\nimport { MediaUsageWorkRepository } from \"../../database/repositories/media-usage-work.js\";\nimport type { Database } from \"../../database/types.js\";\nimport {\n\tbuildContentMediaUsageFieldFingerprint,\n\tloadContentMediaUsageFields,\n} from \"./content-fields.js\";\nimport {\n\tMediaUsageReconciliationRepository,\n\ttype MediaUsageReconciliationClaim,\n\ttype MediaUsageReconciliationRecord,\n} from \"./reconciliation.js\";\nimport { CONTENT_SOURCE_SCHEMA_VERSION } from \"./types.js\";\n\nexport const MEDIA_USAGE_RECONCILIATION_LIMITS = Object.freeze({\n\tcandidatesPerTick: 4,\n\tscanPageSize: 1_000,\n\tsourcePageSize: 1_000,\n\tleaseDurationSeconds: 60,\n\tmaxAttempts: 5,\n\tretryBaseSeconds: 30,\n\tretryMaxSeconds: 15 * 60,\n\tretryJitterRatio: 0.25,\n});\n\nexport type MediaUsageReconciliationOutcome =\n\t| \"inactive\"\n\t| \"not_due\"\n\t| \"claim_lost\"\n\t| \"advanced\"\n\t| \"deferred\"\n\t| \"completed\"\n\t| \"retry\"\n\t| \"failed\";\n\nexport interface MediaUsageReconciliationDetailedResult {\n\toutcome: MediaUsageReconciliationOutcome;\n\tconsumedUnit: boolean;\n\thasDeferredCandidate: boolean;\n}\n\nexport interface ProcessDueMediaUsageReconciliationOptions {\n\tactivationKnownActive?: boolean;\n}\n\nexport type MediaUsageReconciliationScanOutcome =\n\t| \"advanced\"\n\t| \"exhausted\"\n\t| \"deferred\"\n\t| \"restart_required\";\n\nexport async function processDueMediaUsageReconciliation(\n\tdb: Kysely<Database>,\n): Promise<MediaUsageReconciliationOutcome> {\n\treturn (await processDueMediaUsageReconciliationDetailed(db)).outcome;\n}\n\nexport async function processDueMediaUsageReconciliationDetailed(\n\tdb: Kysely<Database>,\n\toptions: ProcessDueMediaUsageReconciliationOptions = {},\n): Promise<MediaUsageReconciliationDetailedResult> {\n\tif (!options.activationKnownActive) {\n\t\tconst activation = await db\n\t\t\t.selectFrom(\"_emdash_media_usage_activation\")\n\t\t\t.select(\"state\")\n\t\t\t.where(\"task_key\", \"=\", \"incremental_capture\")\n\t\t\t.executeTakeFirst();\n\t\tif (activation?.state !== \"active\") {\n\t\t\treturn { outcome: \"inactive\", consumedUnit: false, hasDeferredCandidate: false };\n\t\t}\n\t}\n\n\tconst reconciliation = new MediaUsageReconciliationRepository(db);\n\tif (await reconciliation.deleteOneObsolete()) {\n\t\treturn { outcome: \"completed\", consumedUnit: true, hasDeferredCandidate: false };\n\t}\n\tconst [failed] = await reconciliation.findFailed(1);\n\tif (failed) {\n\t\tif (await reconciliation.finishFailedCoverage(failed.collectionId, failed.runToken)) {\n\t\t\treturn { outcome: \"failed\", consumedUnit: true, hasDeferredCandidate: false };\n\t\t}\n\t\tif (await reconciliation.resetFailedForNewEpoch(failed)) {\n\t\t\treturn { outcome: \"advanced\", consumedUnit: true, hasDeferredCandidate: false };\n\t\t}\n\t}\n\n\tconst seeded = await reconciliation.seedNextCandidate();\n\tconst candidates = await reconciliation.findDue(\n\t\tMEDIA_USAGE_RECONCILIATION_LIMITS.candidatesPerTick,\n\t);\n\tlet claim: MediaUsageReconciliationClaim | null = null;\n\tfor (const candidate of candidates) {\n\t\tclaim = await reconciliation.claim({\n\t\t\tcollectionId: candidate.collectionId,\n\t\t\trunToken: candidate.runToken,\n\t\t\tleaseDurationSeconds: MEDIA_USAGE_RECONCILIATION_LIMITS.leaseDurationSeconds,\n\t\t});\n\t\tif (claim) break;\n\t}\n\tif (!claim) {\n\t\treturn {\n\t\t\toutcome: candidates.length === 0 ? \"not_due\" : \"claim_lost\",\n\t\t\tconsumedUnit: seeded,\n\t\t\thasDeferredCandidate:\n\t\t\t\tcandidates.length === 0 && (await reconciliation.hasDeferredCandidate()),\n\t\t};\n\t}\n\n\ttry {\n\t\treturn {\n\t\t\toutcome: await processClaimedReconciliation(db, claim),\n\t\t\tconsumedUnit: true,\n\t\t\thasDeferredCandidate: false,\n\t\t};\n\t} catch (error) {\n\t\tconst terminal = claim.attemptCount + 1 >= MEDIA_USAGE_RECONCILIATION_LIMITS.maxAttempts;\n\t\tconst recorded = await reconciliation.recordFailure({\n\t\t\tcollectionId: claim.collectionId,\n\t\t\trunToken: claim.runToken,\n\t\t\tleaseToken: claim.leaseToken,\n\t\t\terrorCode: \"MEDIA_USAGE_RECONCILIATION_FAILED\",\n\t\t\tretryDelaySeconds: retryDelaySeconds(claim.attemptCount),\n\t\t\tterminal,\n\t\t});\n\t\tif (!recorded) {\n\t\t\treturn { outcome: \"claim_lost\", consumedUnit: true, hasDeferredCandidate: false };\n\t\t}\n\t\tif (terminal) await reconciliation.finishFailedCoverage(claim.collectionId, claim.runToken);\n\t\tconsole.error(\"[media-usage:reconciliation] Processing failed:\", error);\n\t\treturn {\n\t\t\toutcome: terminal ? \"failed\" : \"retry\",\n\t\t\tconsumedUnit: true,\n\t\t\thasDeferredCandidate: false,\n\t\t};\n\t}\n}\n\nexport async function processClaimedMediaUsageReconciliationScan(\n\tdb: Kysely<Database>,\n\tclaim: MediaUsageReconciliationClaim,\n\toptions: { releaseOnExhausted?: boolean } = {},\n\tknownCurrent?: MediaUsageReconciliationRecord,\n): Promise<MediaUsageReconciliationScanOutcome> {\n\tconst reconciliation = new MediaUsageReconciliationRepository(db);\n\tlet current =\n\t\tknownCurrent ?? (await reconciliation.findByIdentity(claim.collectionId, claim.runToken));\n\tif (!current || current.leaseToken !== claim.leaseToken || current.phase !== \"scan\") {\n\t\treturn \"deferred\";\n\t}\n\n\tlet fields;\n\tlet fieldFingerprint: string;\n\tif (current.targetEpoch === null) {\n\t\tconst targetEpoch = await reconciliation.beginRun(claim);\n\t\tif (targetEpoch === null) {\n\t\t\tawait reconciliation.release({ ...claim, delaySeconds: 30 });\n\t\t\treturn \"deferred\";\n\t\t}\n\t\tfields = await loadContentMediaUsageFields(db, claim.collectionSlug, claim.collectionId);\n\t\tfieldFingerprint = await buildContentMediaUsageFieldFingerprint(fields);\n\t\tconst scanUpperId =\n\t\t\tfields.extractionFields.length === 0 ? null : await reconciliation.findScanUpperId(claim);\n\t\tif (\n\t\t\t!(await reconciliation.initializeScan({\n\t\t\t\tclaim,\n\t\t\t\ttargetEpoch,\n\t\t\t\tfieldFingerprint,\n\t\t\t\tscanUpperId,\n\t\t\t}))\n\t\t) {\n\t\t\treturn \"deferred\";\n\t\t}\n\t\tcurrent = {\n\t\t\t...current,\n\t\t\ttargetEpoch,\n\t\t\tfieldFingerprint,\n\t\t\tscanCursor: null,\n\t\t\tscanUpperId,\n\t\t\tsourceCursor: null,\n\t\t\tsourceUpperKey: null,\n\t\t};\n\t} else {\n\t\tfields = await loadContentMediaUsageFields(db, claim.collectionSlug, claim.collectionId);\n\t\tfieldFingerprint = await buildContentMediaUsageFieldFingerprint(fields);\n\t}\n\n\tif (current.fieldFingerprint !== fieldFingerprint || current.targetEpoch === null) {\n\t\treturn \"restart_required\";\n\t}\n\tconst contentIds = await reconciliation.findScanPage(\n\t\tcurrent,\n\t\tMEDIA_USAGE_RECONCILIATION_LIMITS.scanPageSize,\n\t);\n\tif (contentIds.length === 0) {\n\t\tif (options.releaseOnExhausted ?? true) {\n\t\t\tawait reconciliation.release({ ...claim, delaySeconds: 30 });\n\t\t}\n\t\treturn \"exhausted\";\n\t}\n\n\tconst work = new MediaUsageWorkRepository(db);\n\tawait work.enqueueReconciliationPage({\n\t\tcollectionId: claim.collectionId,\n\t\tcollectionSlug: claim.collectionSlug,\n\t\trunToken: claim.runToken,\n\t\tleaseToken: claim.leaseToken,\n\t\tchangeEpoch: current.targetEpoch,\n\t\tphase: \"scan\",\n\t\tcontentIds,\n\t});\n\tconst nextCursor = contentIds.at(-1)!;\n\tif (\n\t\t!(await reconciliation.checkpointScan({\n\t\t\tclaim,\n\t\t\ttargetEpoch: current.targetEpoch,\n\t\t\tpreviousCursor: current.scanCursor,\n\t\t\tnextCursor,\n\t\t}))\n\t) {\n\t\treturn \"deferred\";\n\t}\n\tif (!(await reconciliation.release({ ...claim, delaySeconds: 0 }))) return \"deferred\";\n\treturn \"advanced\";\n}\n\nasync function processClaimedReconciliation(\n\tdb: Kysely<Database>,\n\tclaim: MediaUsageReconciliationClaim,\n): Promise<MediaUsageReconciliationOutcome> {\n\tconst reconciliation = new MediaUsageReconciliationRepository(db);\n\tlet current: MediaUsageReconciliationRecord = claim;\n\tif (current.targetEpoch !== null && !(await reconciliation.ownsRun(claim, current.targetEpoch))) {\n\t\treturn restartReconciliation(db, reconciliation, claim, current);\n\t}\n\tif (current.targetEpoch !== null) {\n\t\tawait new MediaUsageWorkRepository(db).deleteObsoleteReconciliationWork({\n\t\t\tcollectionId: claim.collectionId,\n\t\t\tcollectionSlug: claim.collectionSlug,\n\t\t\trunToken: claim.runToken,\n\t\t\tleaseToken: claim.leaseToken,\n\t\t\ttargetEpoch: current.targetEpoch,\n\t\t});\n\t}\n\n\tif (current.phase === \"scan\") {\n\t\tconst outcome = await processClaimedMediaUsageReconciliationScan(\n\t\t\tdb,\n\t\t\tclaim,\n\t\t\t{\n\t\t\t\treleaseOnExhausted: false,\n\t\t\t},\n\t\t\tcurrent,\n\t\t);\n\t\tif (outcome === \"restart_required\") {\n\t\t\tcurrent =\n\t\t\t\t(await reconciliation.findByIdentity(claim.collectionId, claim.runToken)) ?? current;\n\t\t\treturn restartReconciliation(db, reconciliation, claim, current);\n\t\t}\n\t\tif (outcome !== \"exhausted\") return outcome;\n\t\tif (current.targetEpoch === null || current.fieldFingerprint === null) {\n\t\t\tcurrent =\n\t\t\t\t(await reconciliation.findByIdentity(claim.collectionId, claim.runToken)) ?? current;\n\t\t}\n\t\tconst barrier = await reconciliation.findWorkBarrier(claim.collectionId);\n\t\tif (barrier.state === \"failed\") {\n\t\t\treturn failReconciliation(reconciliation, claim, barrier.errorCode, true);\n\t\t}\n\t\tif (barrier.state === \"pending\") {\n\t\t\tawait reconciliation.release({ ...claim, delaySeconds: 30 });\n\t\t\treturn \"deferred\";\n\t\t}\n\t\tif (current.targetEpoch === null || current.fieldFingerprint === null) return \"claim_lost\";\n\t\tconst sourceUpperKey = await reconciliation.findSourceUpperKey(claim, current.targetEpoch);\n\t\tif (\n\t\t\t!(await reconciliation.transitionToSources({\n\t\t\t\tclaim,\n\t\t\t\ttargetEpoch: current.targetEpoch,\n\t\t\t\tfieldFingerprint: current.fieldFingerprint,\n\t\t\t\tsourceUpperKey,\n\t\t\t}))\n\t\t) {\n\t\t\treturn \"claim_lost\";\n\t\t}\n\t\tif (!(await reconciliation.release({ ...claim, delaySeconds: 0 }))) return \"claim_lost\";\n\t\treturn \"advanced\";\n\t}\n\n\treturn processSourcePhase(db, reconciliation, claim, current);\n}\n\nasync function processSourcePhase(\n\tdb: Kysely<Database>,\n\treconciliation: MediaUsageReconciliationRepository,\n\tclaim: MediaUsageReconciliationClaim,\n\tcurrent: MediaUsageReconciliationRecord,\n): Promise<MediaUsageReconciliationOutcome> {\n\tif (current.targetEpoch === null || current.fieldFingerprint === null) return \"claim_lost\";\n\tconst fields = await loadContentMediaUsageFields(db, claim.collectionSlug, claim.collectionId);\n\tconst fieldFingerprint = await buildContentMediaUsageFieldFingerprint(fields);\n\tif (fieldFingerprint !== current.fieldFingerprint) {\n\t\treturn restartReconciliation(db, reconciliation, claim, current, fields, fieldFingerprint);\n\t}\n\n\tconst page = await reconciliation.findSourcePage(\n\t\tcurrent,\n\t\tMEDIA_USAGE_RECONCILIATION_LIMITS.sourcePageSize,\n\t);\n\tif (page.length > 0) {\n\t\tlet enqueuedMissingContent = false;\n\t\tconst malformed = page.some(\n\t\t\t(source) =>\n\t\t\t\t!source.contentId ||\n\t\t\t\t(source.sourceVariant !== \"columns\" && source.sourceVariant !== \"draft_overlay\"),\n\t\t);\n\t\tif (malformed) {\n\t\t\treturn failReconciliation(\n\t\t\t\treconciliation,\n\t\t\t\tclaim,\n\t\t\t\t\"MEDIA_USAGE_RECONCILIATION_INVALID_SOURCE\",\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t\tconst contentIds = [...new Set(page.map((source) => source.contentId!))];\n\t\tconst enqueueIds =\n\t\t\tfields.extractionFields.length === 0\n\t\t\t\t? contentIds\n\t\t\t\t: await reconciliation.findMissingContentIds(claim.collectionSlug, contentIds);\n\t\tif (enqueueIds.length > 0) {\n\t\t\tawait new MediaUsageWorkRepository(db).enqueueReconciliationPage({\n\t\t\t\tcollectionId: claim.collectionId,\n\t\t\t\tcollectionSlug: claim.collectionSlug,\n\t\t\t\trunToken: claim.runToken,\n\t\t\t\tleaseToken: claim.leaseToken,\n\t\t\t\tchangeEpoch: current.targetEpoch,\n\t\t\t\tphase: \"sources\",\n\t\t\t\tcontentIds: enqueueIds,\n\t\t\t});\n\t\t\tenqueuedMissingContent = true;\n\t\t}\n\t\tif (\n\t\t\t!(await reconciliation.checkpointSources({\n\t\t\t\tclaim,\n\t\t\t\ttargetEpoch: current.targetEpoch,\n\t\t\t\tpreviousCursor: current.sourceCursor,\n\t\t\t\tnextCursor: page.at(-1)!.sourceKey,\n\t\t\t}))\n\t\t) {\n\t\t\treturn \"claim_lost\";\n\t\t}\n\t\tif (\n\t\t\tenqueuedMissingContent ||\n\t\t\tpage.length === MEDIA_USAGE_RECONCILIATION_LIMITS.sourcePageSize\n\t\t) {\n\t\t\tif (!(await reconciliation.release({ ...claim, delaySeconds: 0 }))) return \"claim_lost\";\n\t\t\treturn \"advanced\";\n\t\t}\n\t}\n\n\tconst barrier = await reconciliation.findWorkBarrier(claim.collectionId);\n\tif (barrier.state === \"failed\") {\n\t\treturn failReconciliation(reconciliation, claim, barrier.errorCode, true);\n\t}\n\tif (barrier.state === \"pending\") {\n\t\tawait reconciliation.release({ ...claim, delaySeconds: 30 });\n\t\treturn \"deferred\";\n\t}\n\tif (\n\t\t!(await reconciliation.finalizeCoverage({\n\t\t\tclaim,\n\t\t\ttargetEpoch: current.targetEpoch,\n\t\t\tfieldFingerprint,\n\t\t\tschemaVersion: CONTENT_SOURCE_SCHEMA_VERSION,\n\t\t}))\n\t) {\n\t\treturn \"claim_lost\";\n\t}\n\tif (!(await reconciliation.deleteFinalized(claim))) return \"claim_lost\";\n\treturn \"completed\";\n}\n\nasync function restartReconciliation(\n\tdb: Kysely<Database>,\n\treconciliation: MediaUsageReconciliationRepository,\n\tclaim: MediaUsageReconciliationClaim,\n\tcurrent: MediaUsageReconciliationRecord,\n\tfields?: Awaited<ReturnType<typeof loadContentMediaUsageFields>>,\n\tfieldFingerprint?: string,\n): Promise<MediaUsageReconciliationOutcome> {\n\tif (current.targetEpoch === null) return \"claim_lost\";\n\tconst discoveredFields =\n\t\tfields ?? (await loadContentMediaUsageFields(db, claim.collectionSlug, claim.collectionId));\n\tconst fingerprint =\n\t\tfieldFingerprint ?? (await buildContentMediaUsageFieldFingerprint(discoveredFields));\n\tconst targetEpoch = await reconciliation.restartRun(claim, current.targetEpoch);\n\tif (targetEpoch === null) {\n\t\tawait reconciliation.release({ ...claim, delaySeconds: 30 });\n\t\treturn \"deferred\";\n\t}\n\tconst scanUpperId =\n\t\tdiscoveredFields.extractionFields.length === 0\n\t\t\t? null\n\t\t\t: await reconciliation.findScanUpperId(claim);\n\tif (\n\t\t!(await reconciliation.restartScan({\n\t\t\tclaim,\n\t\t\tpreviousEpoch: current.targetEpoch,\n\t\t\ttargetEpoch,\n\t\t\tfieldFingerprint: fingerprint,\n\t\t\tscanUpperId,\n\t\t}))\n\t) {\n\t\treturn \"claim_lost\";\n\t}\n\tif (!(await reconciliation.release({ ...claim, delaySeconds: 0 }))) return \"claim_lost\";\n\treturn \"advanced\";\n}\n\nasync function failReconciliation(\n\treconciliation: MediaUsageReconciliationRepository,\n\tclaim: MediaUsageReconciliationClaim,\n\terrorCode: string,\n\tentryFailure: boolean,\n): Promise<MediaUsageReconciliationOutcome> {\n\tconst recorded = entryFailure\n\t\t? await reconciliation.recordEntryFailure(claim)\n\t\t: await reconciliation.recordFailure({\n\t\t\t\tcollectionId: claim.collectionId,\n\t\t\t\trunToken: claim.runToken,\n\t\t\t\tleaseToken: claim.leaseToken,\n\t\t\t\terrorCode,\n\t\t\t\tretryDelaySeconds: 0,\n\t\t\t\tterminal: true,\n\t\t\t});\n\tif (!recorded) return \"claim_lost\";\n\tawait reconciliation.finishFailedCoverage(claim.collectionId, claim.runToken);\n\treturn \"failed\";\n}\n\nfunction retryDelaySeconds(attemptCount: number): number {\n\tconst exponential = Math.min(\n\t\tMEDIA_USAGE_RECONCILIATION_LIMITS.retryMaxSeconds,\n\t\tMEDIA_USAGE_RECONCILIATION_LIMITS.retryBaseSeconds * 2 ** attemptCount,\n\t);\n\tconst jitter = Math.floor(\n\t\texponential * MEDIA_USAGE_RECONCILIATION_LIMITS.retryJitterRatio * Math.random(),\n\t);\n\treturn Math.min(MEDIA_USAGE_RECONCILIATION_LIMITS.retryMaxSeconds, exponential + jitter);\n}\n","import type { Kysely } from \"kysely\";\n\nimport { isPostgres } from \"../../database/dialect-helpers.js\";\nimport {\n\tMediaUsageWorkRepository,\n\ttype MediaUsageWorkRecord,\n} from \"../../database/repositories/media-usage-work.js\";\nimport { MediaUsageRepository } from \"../../database/repositories/media-usage.js\";\nimport { withTransaction } from \"../../database/transaction.js\";\nimport type { Database } from \"../../database/types.js\";\nimport { getRequestContext } from \"../../request-context.js\";\nimport {\n\tcontentRefreshKey,\n\trefreshContentMediaUsageForWorkBatch,\n\ttype ContentMediaUsageRefreshResult,\n\ttype ContentMediaUsageRefreshErrorCode,\n} from \"./content-refresh.js\";\n\nexport const MEDIA_USAGE_WORK_PROCESSING_LIMITS = Object.freeze({\n\tcandidatesPerTick: 1_000,\n\tleaseDurationSeconds: 20 * 60,\n\tmaxAttempts: 5,\n\tretryBaseSeconds: 30,\n\tretryMaxSeconds: 15 * 60,\n\tretryJitterRatio: 0.25,\n});\n\nexport type MediaUsageWorkProcessingOutcome =\n\t| \"inactive\"\n\t| \"not_due\"\n\t| \"claim_lost\"\n\t| \"completed\"\n\t| \"retry\"\n\t| \"failed\"\n\t| \"superseded\"\n\t| \"obsolete\";\n\nexport interface MediaUsageWorkProcessingResult {\n\toutcome: MediaUsageWorkProcessingOutcome;\n\tclaimed: boolean;\n}\n\nexport interface MediaUsageWorkTickResult {\n\tcandidateCount: number;\n\tclaimedCount: number;\n\tcompletedCount: number;\n\tretryCount: number;\n\tfailedCount: number;\n\tsupersededCount: number;\n\tobsoleteCount: number;\n\tdurationMs: number;\n}\n\nexport interface ProcessDueMediaUsageWorkOptions {\n\tactivationKnownActive?: boolean;\n}\n\nexport async function processMediaUsageWorkAfterWrite(\n\tdb: Kysely<Database>,\n\tcollectionSlug: string,\n\tcontentId: string,\n): Promise<MediaUsageWorkProcessingResult> {\n\tif (!(await isIncrementalCaptureActive(db))) {\n\t\treturn { outcome: \"inactive\", claimed: false };\n\t}\n\n\tawait new MediaUsageRepository(db).recoverIncrementalFinalizations();\n\tconst repo = new MediaUsageWorkRepository(db);\n\tconst work = await repo.findWorkForContent(collectionSlug, contentId);\n\tif (!work) return { outcome: \"not_due\", claimed: false };\n\tconst claimed = await repo.claimWork({\n\t\tcollectionId: work.collectionId,\n\t\tcontentId: work.contentId,\n\t\tworkVersion: work.workVersion,\n\t\tleaseDurationSeconds: MEDIA_USAGE_WORK_PROCESSING_LIMITS.leaseDurationSeconds,\n\t});\n\tif (!claimed) return { outcome: \"claim_lost\", claimed: false };\n\ttry {\n\t\tconst processed = await runClaimedBatch(db, [claimed]);\n\t\treturn processed.get(workResultKey(claimed)) ?? { outcome: \"claim_lost\", claimed: false };\n\t} catch (error) {\n\t\tconst transitioned = await repo.retryClaimedWorkBatch({\n\t\t\twork: [workLease(claimed)],\n\t\t\terrorCode: \"MEDIA_USAGE_PROCESSING_FAILED\",\n\t\t\tretryDelaySeconds: MEDIA_USAGE_WORK_PROCESSING_LIMITS.retryBaseSeconds,\n\t\t\tmaxAttempts: MEDIA_USAGE_WORK_PROCESSING_LIMITS.maxAttempts,\n\t\t});\n\t\tconst outcome = transitioned.get(workIdentityKey(claimed)) ?? \"superseded\";\n\t\tif (outcome === \"failed\") {\n\t\t\tawait new MediaUsageRepository(db).recordIncrementalFailure({\n\t\t\t\tcollectionId: claimed.collectionId,\n\t\t\t\tcollectionSlug: claimed.collectionSlug,\n\t\t\t\tcontentId: claimed.contentId,\n\t\t\t\tworkVersion: claimed.workVersion,\n\t\t\t\terrorCode: \"MEDIA_USAGE_PROCESSING_FAILED\",\n\t\t\t});\n\t\t}\n\t\tconsole.error(\"[media-usage:work] Immediate processing failed:\", error);\n\t\treturn { outcome, claimed: true };\n\t}\n}\n\nexport async function processDueMediaUsageWork(\n\tdb: Kysely<Database>,\n\toptions: ProcessDueMediaUsageWorkOptions = {},\n): Promise<MediaUsageWorkTickResult> {\n\tconst startedAt = Date.now();\n\tconst result: MediaUsageWorkTickResult = {\n\t\tcandidateCount: 0,\n\t\tclaimedCount: 0,\n\t\tcompletedCount: 0,\n\t\tretryCount: 0,\n\t\tfailedCount: 0,\n\t\tsupersededCount: 0,\n\t\tobsoleteCount: 0,\n\t\tdurationMs: 0,\n\t};\n\n\tif (!options.activationKnownActive && !(await isIncrementalCaptureActive(db))) {\n\t\tresult.durationMs = Date.now() - startedAt;\n\t\treturn result;\n\t}\n\n\tawait new MediaUsageRepository(db).recoverIncrementalFinalizations();\n\tconst repo = new MediaUsageWorkRepository(db);\n\tconst candidates = await repo.claimDueWorkBatch({\n\t\tlimit: MEDIA_USAGE_WORK_PROCESSING_LIMITS.candidatesPerTick,\n\t\tleaseDurationSeconds: MEDIA_USAGE_WORK_PROCESSING_LIMITS.leaseDurationSeconds,\n\t});\n\tresult.candidateCount =\n\t\tcandidates.length > 0 || !(await repo.hasNonterminalWork()) ? candidates.length : 1;\n\n\tconst processedBatch = await processClaimedCollections(db, candidates);\n\tfor (const candidate of candidates) {\n\t\tconst processed = processedBatch.get(workResultKey(candidate)) ?? {\n\t\t\toutcome: \"claim_lost\" as const,\n\t\t\tclaimed: false,\n\t\t};\n\t\tif (processed.claimed) result.claimedCount++;\n\t\tif (processed.outcome === \"completed\") result.completedCount++;\n\t\tif (processed.outcome === \"retry\") result.retryCount++;\n\t\tif (processed.outcome === \"failed\") result.failedCount++;\n\t\tif (processed.outcome === \"superseded\") result.supersededCount++;\n\t\tif (processed.outcome === \"obsolete\") result.obsoleteCount++;\n\t}\n\n\tresult.durationMs = Date.now() - startedAt;\n\treturn result;\n}\n\nasync function processClaimedCollections(\n\tdb: Kysely<Database>,\n\tcandidates: readonly MediaUsageWorkRecord[],\n): Promise<Map<string, MediaUsageWorkProcessingResult>> {\n\tconst processed = new Map<string, MediaUsageWorkProcessingResult>();\n\tconst byCollection = new Map<string, MediaUsageWorkRecord[]>();\n\tfor (const candidate of candidates) {\n\t\tconst key = collectionResultKey(candidate);\n\t\tconst collection = byCollection.get(key) ?? [];\n\t\tcollection.push(candidate);\n\t\tbyCollection.set(key, collection);\n\t}\n\tfor (const collection of byCollection.values()) {\n\t\ttry {\n\t\t\tfor (const [key, result] of await runClaimedBatch(db, collection)) {\n\t\t\t\tprocessed.set(key, result);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const [key, result] of await retryFailedClaimedCollection(db, collection)) {\n\t\t\t\tprocessed.set(key, result);\n\t\t\t}\n\t\t\tconsole.error(\"[media-usage:work] Collection processing failed:\", error);\n\t\t}\n\t}\n\treturn processed;\n}\n\nasync function retryFailedClaimedCollection(\n\tdb: Kysely<Database>,\n\tcandidates: readonly MediaUsageWorkRecord[],\n): Promise<Map<string, MediaUsageWorkProcessingResult>> {\n\tconst transitioned = await new MediaUsageWorkRepository(db).retryClaimedWorkBatch({\n\t\twork: candidates.map(workLease),\n\t\terrorCode: \"MEDIA_USAGE_PROCESSING_FAILED\",\n\t\tretryDelaySeconds: MEDIA_USAGE_WORK_PROCESSING_LIMITS.retryBaseSeconds,\n\t\tmaxAttempts: MEDIA_USAGE_WORK_PROCESSING_LIMITS.maxAttempts,\n\t});\n\tconst processed = new Map<string, MediaUsageWorkProcessingResult>();\n\tconst failedCollectionIds = new Set<string>();\n\tfor (const candidate of candidates) {\n\t\tconst state = transitioned.get(workIdentityKey(candidate));\n\t\tif (state === \"failed\") failedCollectionIds.add(candidate.collectionId);\n\t\tprocessed.set(workResultKey(candidate), {\n\t\t\toutcome: state ?? \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t}\n\tawait new MediaUsageRepository(db).recordIncrementalFailuresByCollection({\n\t\tcollectionIds: [...failedCollectionIds],\n\t\terrorCode: \"MEDIA_USAGE_PROCESSING_FAILED\",\n\t});\n\treturn processed;\n}\n\nasync function runClaimedBatch(\n\tdb: Kysely<Database>,\n\tcandidates: readonly MediaUsageWorkRecord[],\n): Promise<Map<string, MediaUsageWorkProcessingResult>> {\n\treturn isPostgres(db)\n\t\t? withTransaction(db, (trx) =>\n\t\t\t\tprocessClaimedBatch(trx, new MediaUsageWorkRepository(trx), candidates),\n\t\t\t)\n\t\t: processClaimedBatch(db, new MediaUsageWorkRepository(db), candidates);\n}\n\nasync function processClaimedBatch(\n\tdb: Kysely<Database>,\n\trepo: MediaUsageWorkRepository,\n\tcandidates: readonly MediaUsageWorkRecord[],\n): Promise<Map<string, MediaUsageWorkProcessingResult>> {\n\tconst results = new Map<string, MediaUsageWorkProcessingResult>();\n\tconst locked = await repo.lockClaimedWorkBatch(candidates.map(workLease));\n\tconst owned: MediaUsageWorkRecord[] = [];\n\tfor (const candidate of candidates) {\n\t\tif (locked.has(workIdentityKey(candidate))) owned.push(candidate);\n\t\telse {\n\t\t\tresults.set(workResultKey(candidate), { outcome: \"superseded\", claimed: true });\n\t\t}\n\t}\n\tconst currentCollections = await findCurrentCollectionIdentities(db, owned);\n\tconst current: MediaUsageWorkRecord[] = [];\n\tconst obsolete: MediaUsageWorkRecord[] = [];\n\tfor (const candidate of owned) {\n\t\tif (currentCollections.has(collectionResultKey(candidate))) current.push(candidate);\n\t\telse obsolete.push(candidate);\n\t}\n\n\tconst obsoleteCompleted = await repo.completeWorkBatch(obsolete.map(workLease));\n\tfor (const candidate of obsolete) {\n\t\tresults.set(workResultKey(candidate), {\n\t\t\toutcome: obsoleteCompleted.has(workIdentityKey(candidate)) ? \"obsolete\" : \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t}\n\tif (current.length === 0) return results;\n\n\tconst refreshes = await refreshContentMediaUsageForWorkBatch(db, current, {\n\t\tshouldContinue: canContinueBulkWork,\n\t});\n\tconst successful: MediaUsageWorkRecord[] = [];\n\tconst unstarted: MediaUsageWorkRecord[] = [];\n\tconst failedRefreshes: Array<{\n\t\tcandidate: MediaUsageWorkRecord;\n\t\trefresh: ContentMediaUsageRefreshResult;\n\t}> = [];\n\tfor (const candidate of current) {\n\t\tconst refresh = refreshes.get(contentRefreshKey(candidate.collectionId, candidate.contentId));\n\t\tif (refresh?.success) successful.push(candidate);\n\t\telse if (!refresh) unstarted.push(candidate);\n\t\telse failedRefreshes.push({ candidate, refresh });\n\t}\n\tconst terminalFailureCollections = new Map<string, Set<string>>();\n\tconst failureGroups = new Map<\n\t\tstring,\n\t\t{\n\t\t\terrorCode: string;\n\t\t\tretryDelaySeconds: number;\n\t\t\tterminal: boolean;\n\t\t\tcandidates: MediaUsageWorkRecord[];\n\t\t}\n\t>();\n\tfor (const failure of failedRefreshes) {\n\t\tconst errorCode = processingErrorCode(failure.refresh.errorCode);\n\t\tconst terminal =\n\t\t\terrorCode === \"MEDIA_USAGE_RESOURCE_LIMIT\" ||\n\t\t\tfailure.candidate.attemptCount + 1 >= MEDIA_USAGE_WORK_PROCESSING_LIMITS.maxAttempts;\n\t\tconst delay = retryDelaySeconds(failure.candidate.attemptCount);\n\t\tconst key = `${errorCode}\\u0000${terminal ? \"terminal\" : String(delay)}`;\n\t\tconst group = failureGroups.get(key) ?? {\n\t\t\terrorCode,\n\t\t\tretryDelaySeconds: delay,\n\t\t\tterminal,\n\t\t\tcandidates: [],\n\t\t};\n\t\tgroup.candidates.push(failure.candidate);\n\t\tfailureGroups.set(key, group);\n\t}\n\tfor (const group of failureGroups.values()) {\n\t\tconst transitioned = await repo.retryClaimedWorkBatch({\n\t\t\twork: group.candidates.map(workLease),\n\t\t\terrorCode: group.errorCode,\n\t\t\tretryDelaySeconds: group.retryDelaySeconds,\n\t\t\tmaxAttempts: group.terminal ? 1 : MEDIA_USAGE_WORK_PROCESSING_LIMITS.maxAttempts,\n\t\t});\n\t\tfor (const candidate of group.candidates) {\n\t\t\tconst state = transitioned.get(workIdentityKey(candidate));\n\t\t\tif (state === \"failed\") {\n\t\t\t\tconst collections = terminalFailureCollections.get(group.errorCode) ?? new Set<string>();\n\t\t\t\tcollections.add(candidate.collectionId);\n\t\t\t\tterminalFailureCollections.set(group.errorCode, collections);\n\t\t\t}\n\t\t\tresults.set(workResultKey(candidate), {\n\t\t\t\toutcome: state ?? \"superseded\",\n\t\t\t\tclaimed: true,\n\t\t\t});\n\t\t}\n\t}\n\tfor (const [errorCode, collectionIds] of terminalFailureCollections) {\n\t\tawait new MediaUsageRepository(db).recordIncrementalFailuresByCollection({\n\t\t\tcollectionIds: [...collectionIds],\n\t\t\terrorCode,\n\t\t});\n\t}\n\tconst released = await repo.releaseClaimedWorkBatch(unstarted.map(workLease));\n\tfor (const candidate of unstarted) {\n\t\tresults.set(workResultKey(candidate), {\n\t\t\toutcome: released.has(workIdentityKey(candidate)) ? \"not_due\" : \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t}\n\n\tconst usage = new MediaUsageRepository(db);\n\tconst successfulByCollection = new Map<string, MediaUsageWorkRecord[]>();\n\tfor (const candidate of successful) {\n\t\tconst key = collectionResultKey(candidate);\n\t\tconst collection = successfulByCollection.get(key) ?? [];\n\t\tcollection.push(candidate);\n\t\tsuccessfulByCollection.set(key, collection);\n\t}\n\tconst readyToComplete: MediaUsageWorkRecord[] = [];\n\tconst deferredCompletion: MediaUsageWorkRecord[] = [];\n\tconst lostFinalization: MediaUsageWorkRecord[] = [];\n\tlet pendingFinalizationQueries = 2;\n\tfor (const collection of successfulByCollection.values()) {\n\t\tconst first = collection[0];\n\t\tif (!first) continue;\n\t\tconst metrics = getRequestContext()?.metrics;\n\t\tif (metrics && metrics.dbCount + pendingFinalizationQueries + 4 > 900) {\n\t\t\tdeferredCompletion.push(...collection);\n\t\t\tcontinue;\n\t\t}\n\t\tconst finalization = await usage.prepareIncrementalFinalization({\n\t\t\tcollectionId: first.collectionId,\n\t\t\tcollectionSlug: first.collectionSlug,\n\t\t});\n\t\tif (finalization.outcome !== \"lost\") {\n\t\t\treadyToComplete.push(...collection);\n\t\t\tpendingFinalizationQueries += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tlostFinalization.push(...collection);\n\t\tpendingFinalizationQueries += 2;\n\t}\n\tconst lostTransitions = await repo.retryClaimedWorkBatch({\n\t\twork: lostFinalization.map(workLease),\n\t\terrorCode: \"MEDIA_USAGE_GENERATION_CONFLICT\",\n\t\tretryDelaySeconds: MEDIA_USAGE_WORK_PROCESSING_LIMITS.retryBaseSeconds,\n\t\tmaxAttempts: MEDIA_USAGE_WORK_PROCESSING_LIMITS.maxAttempts,\n\t});\n\tconst lostFailedCollections = new Set<string>();\n\tfor (const candidate of lostFinalization) {\n\t\tconst state = lostTransitions.get(workIdentityKey(candidate));\n\t\tif (state === \"failed\") lostFailedCollections.add(candidate.collectionId);\n\t\tresults.set(workResultKey(candidate), {\n\t\t\toutcome: state ?? \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t}\n\tawait usage.recordIncrementalFailuresByCollection({\n\t\tcollectionIds: [...lostFailedCollections],\n\t\terrorCode: \"MEDIA_USAGE_GENERATION_CONFLICT\",\n\t});\n\tconst deferred = await repo.releaseClaimedWorkBatch(deferredCompletion.map(workLease));\n\tfor (const candidate of deferredCompletion) {\n\t\tresults.set(workResultKey(candidate), {\n\t\t\toutcome: deferred.has(workIdentityKey(candidate)) ? \"not_due\" : \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t}\n\tconst completed = await repo.completeWorkBatch(readyToComplete.map(workLease));\n\tconst completedCollections = new Map<string, MediaUsageWorkRecord>();\n\tfor (const candidate of readyToComplete) {\n\t\tconst didComplete = completed.has(workIdentityKey(candidate));\n\t\tresults.set(workResultKey(candidate), {\n\t\t\toutcome: didComplete ? \"completed\" : \"superseded\",\n\t\t\tclaimed: true,\n\t\t});\n\t\tif (didComplete) completedCollections.set(collectionResultKey(candidate), candidate);\n\t}\n\tfor (const collection of completedCollections.values()) {\n\t\tawait usage.recordIncrementalSuccess({\n\t\t\tcollectionId: collection.collectionId,\n\t\t\tcollectionSlug: collection.collectionSlug,\n\t\t});\n\t}\n\treturn results;\n}\n\nasync function findCurrentCollectionIdentities(\n\tdb: Kysely<Database>,\n\tcandidates: readonly MediaUsageWorkRecord[],\n): Promise<Set<string>> {\n\tconst identities = new Map(\n\t\tcandidates.map((candidate) => [collectionResultKey(candidate), candidate] as const),\n\t);\n\tconst current = new Set<string>();\n\tfor (const batch of chunkCollectionIds(\n\t\tArray.from(identities.values(), (item) => item.collectionId),\n\t)) {\n\t\tconst rows = await db\n\t\t\t.selectFrom(\"_emdash_collections\")\n\t\t\t.select([\"id\", \"slug\"])\n\t\t\t.where(\"id\", \"in\", batch)\n\t\t\t.execute();\n\t\tfor (const row of rows) current.add(`${row.id}\\u0000${row.slug}`);\n\t}\n\treturn current;\n}\n\nfunction workLease(work: MediaUsageWorkRecord) {\n\tif (!work.leaseToken) throw new Error(\"Claimed media usage work requires a lease token\");\n\treturn {\n\t\tcollectionId: work.collectionId,\n\t\tcontentId: work.contentId,\n\t\tworkVersion: work.workVersion,\n\t\tleaseToken: work.leaseToken,\n\t};\n}\n\nfunction workIdentityKey(work: MediaUsageWorkRecord): string {\n\treturn `${work.collectionId}\\u0000${work.contentId}\\u0000${String(work.workVersion)}`;\n}\n\nfunction workResultKey(work: MediaUsageWorkRecord): string {\n\treturn workIdentityKey(work);\n}\n\nfunction collectionResultKey(work: Pick<MediaUsageWorkRecord, \"collectionId\" | \"collectionSlug\">) {\n\treturn `${work.collectionId}\\u0000${work.collectionSlug}`;\n}\n\nfunction chunkCollectionIds(ids: readonly string[]): string[][] {\n\tconst unique = [...new Set(ids)];\n\tconst batches: string[][] = [];\n\tfor (let index = 0; index < unique.length; index += 50) {\n\t\tbatches.push(unique.slice(index, index + 50));\n\t}\n\treturn batches;\n}\n\nfunction canContinueBulkWork(): boolean {\n\tconst metrics = getRequestContext()?.metrics;\n\treturn !metrics || metrics.dbCount + 150 <= 900;\n}\n\nasync function isIncrementalCaptureActive(db: Kysely<Database>): Promise<boolean> {\n\tconst row = await db\n\t\t.selectFrom(\"_emdash_media_usage_activation\")\n\t\t.select(\"state\")\n\t\t.where(\"task_key\", \"=\", \"incremental_capture\")\n\t\t.executeTakeFirst();\n\treturn row?.state === \"active\";\n}\n\nfunction retryDelaySeconds(attemptCount: number): number {\n\tconst exponential = Math.min(\n\t\tMEDIA_USAGE_WORK_PROCESSING_LIMITS.retryMaxSeconds,\n\t\tMEDIA_USAGE_WORK_PROCESSING_LIMITS.retryBaseSeconds * 2 ** attemptCount,\n\t);\n\tconst jitter = Math.floor(\n\t\texponential * MEDIA_USAGE_WORK_PROCESSING_LIMITS.retryJitterRatio * Math.random(),\n\t);\n\treturn Math.min(MEDIA_USAGE_WORK_PROCESSING_LIMITS.retryMaxSeconds, exponential + jitter);\n}\n\nfunction processingErrorCode(errorCode: ContentMediaUsageRefreshErrorCode | undefined): string {\n\tif (\n\t\terrorCode === \"DRAFT_REVISION_NOT_FOUND\" ||\n\t\terrorCode === \"DRAFT_REVISION_MISMATCH\" ||\n\t\terrorCode === \"DRAFT_REVISION_INVALID\"\n\t) {\n\t\treturn \"MEDIA_USAGE_SNAPSHOT_FAILED\";\n\t}\n\tif (errorCode === \"CONTENT_USAGE_GENERATION_CONFLICT\") {\n\t\treturn \"MEDIA_USAGE_GENERATION_CONFLICT\";\n\t}\n\tif (errorCode === \"CONTENT_USAGE_RESOURCE_LIMIT\") return \"MEDIA_USAGE_RESOURCE_LIMIT\";\n\treturn \"MEDIA_USAGE_PROCESSING_FAILED\";\n}\n","import type { Kysely } from \"kysely\";\n\nimport type { Database } from \"../../database/types.js\";\nimport { getRequestContext } from \"../../request-context.js\";\nimport {\n\tcontinueMediaUsageActivation,\n\tMEDIA_USAGE_ACTIVATION_RUNTIME_GENERATION,\n\tMediaUsageActivationVersionMismatchError,\n} from \"./activation.js\";\nimport { processDueMediaUsageCollectionDeletions } from \"./collection-deletion-processor.js\";\nimport { processDueMediaUsageReconciliationDetailed } from \"./reconciliation-processor.js\";\nimport { MediaUsageReconciliationRepository } from \"./reconciliation.js\";\nimport { processDueMediaUsageWork } from \"./work-processor.js\";\n\ntype MediaUsageMaintenanceTaskClass = \"entry_work\" | \"collection_deletion\" | \"reconciliation\";\n\nexport type MediaUsageMaintenanceContinuation =\n\t| { kind: \"none\" }\n\t| { kind: \"immediate\" }\n\t| { kind: \"delayed\"; delaySeconds: 30 };\n\nexport interface MediaUsageMaintenanceStepResult {\n\tstate: \"inactive\" | \"idle\" | \"blocked\" | \"progress\";\n\tcontinuation: MediaUsageMaintenanceContinuation;\n}\n\nexport const MEDIA_USAGE_MAINTENANCE_LIMITS = Object.freeze({\n\teventQueryCeiling: 900,\n\tmaxStepQueries: 150,\n});\n\nconst TASK_CLASSES: readonly MediaUsageMaintenanceTaskClass[] = [\n\t\"collection_deletion\",\n\t\"entry_work\",\n\t\"reconciliation\",\n];\n\nexport async function runMediaUsageMaintenanceStep(\n\tdb: Kysely<Database>,\n): Promise<MediaUsageMaintenanceStepResult> {\n\tconst activation = await db\n\t\t.selectFrom(\"_emdash_media_usage_activation\")\n\t\t.select([\"state\", \"runtime_generation\"])\n\t\t.where(\"task_key\", \"=\", \"incremental_capture\")\n\t\t.executeTakeFirst();\n\tif (\n\t\tactivation?.state !== \"active\" ||\n\t\tactivation.runtime_generation !== MEDIA_USAGE_ACTIVATION_RUNTIME_GENERATION\n\t) {\n\t\treturn runActivationStep(db);\n\t}\n\tlet blocked = false;\n\tlet blockedReconciliation = false;\n\tlet madeProgress = false;\n\n\tfor (const taskClass of TASK_CLASSES) {\n\t\tconst metrics = getRequestContext()?.metrics;\n\t\tif (metrics && !canStartMediaUsageMaintenanceStep(metrics)) {\n\t\t\treturn madeProgress\n\t\t\t\t? {\n\t\t\t\t\t\tstate: \"progress\",\n\t\t\t\t\t\tcontinuation: { kind: \"immediate\" },\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tstate: \"blocked\",\n\t\t\t\t\t\tcontinuation: { kind: \"immediate\" },\n\t\t\t\t\t};\n\t\t}\n\t\tconst outcome = await runTaskClass(db, taskClass);\n\t\tif (outcome === \"inactive\") return inactiveResult();\n\t\tif (outcome === \"progress\") madeProgress = true;\n\t\tif (outcome === \"blocked\") {\n\t\t\tblocked = true;\n\t\t\tif (taskClass === \"reconciliation\") blockedReconciliation = true;\n\t\t}\n\t}\n\tif (madeProgress) {\n\t\treturn {\n\t\t\tstate: \"progress\",\n\t\t\tcontinuation: { kind: \"immediate\" },\n\t\t};\n\t}\n\n\tif (\n\t\tblockedReconciliation &&\n\t\t(await new MediaUsageReconciliationRepository(db).wakeDrainedBarrierCandidate())\n\t) {\n\t\treturn {\n\t\t\tstate: \"progress\",\n\t\t\tcontinuation: { kind: \"immediate\" },\n\t\t};\n\t}\n\n\tif (blocked) {\n\t\treturn {\n\t\t\tstate: \"blocked\",\n\t\t\tcontinuation: { kind: \"delayed\", delaySeconds: 30 },\n\t\t};\n\t}\n\n\treturn {\n\t\tstate: \"idle\",\n\t\tcontinuation: { kind: \"none\" },\n\t};\n}\n\nasync function runActivationStep(db: Kysely<Database>): Promise<MediaUsageMaintenanceStepResult> {\n\ttry {\n\t\tconst result = await continueMediaUsageActivation(db);\n\t\tif (result.outcome === \"activating\" || result.outcome === \"active\") {\n\t\t\treturn {\n\t\t\t\tstate: \"progress\",\n\t\t\t\tcontinuation: { kind: \"immediate\" },\n\t\t\t};\n\t\t}\n\t\tif (result.outcome === \"lease_active\" || result.outcome === \"conflict\") {\n\t\t\treturn {\n\t\t\t\tstate: \"blocked\",\n\t\t\t\tcontinuation: { kind: \"delayed\", delaySeconds: 30 },\n\t\t\t};\n\t\t}\n\t\treturn inactiveResult();\n\t} catch (error) {\n\t\tif (error instanceof MediaUsageActivationVersionMismatchError) return inactiveResult();\n\t\tthrow error;\n\t}\n}\n\nasync function runTaskClass(\n\tdb: Kysely<Database>,\n\ttaskClass: MediaUsageMaintenanceTaskClass,\n): Promise<\"inactive\" | \"idle\" | \"blocked\" | \"progress\"> {\n\tif (taskClass === \"entry_work\") {\n\t\tconst result = await processDueMediaUsageWork(db, {\n\t\t\tactivationKnownActive: true,\n\t\t});\n\t\tif (result.claimedCount > 0) return \"progress\";\n\t\treturn result.candidateCount > 0 ? \"blocked\" : \"idle\";\n\t}\n\tif (taskClass === \"collection_deletion\") {\n\t\tconst result = await processDueMediaUsageCollectionDeletions(db);\n\t\tif (result.claimedCount > 0) return \"progress\";\n\t\treturn result.candidateCount > 0 ? \"blocked\" : \"idle\";\n\t}\n\n\tconst result = await processDueMediaUsageReconciliationDetailed(db, {\n\t\tactivationKnownActive: true,\n\t});\n\tif (result.outcome === \"inactive\") return \"inactive\";\n\tif (result.consumedUnit) return \"progress\";\n\treturn result.outcome === \"claim_lost\" || result.hasDeferredCandidate ? \"blocked\" : \"idle\";\n}\n\nfunction inactiveResult(): MediaUsageMaintenanceStepResult {\n\treturn {\n\t\tstate: \"inactive\",\n\t\tcontinuation: { kind: \"none\" },\n\t};\n}\n\nfunction canStartMediaUsageMaintenanceStep(metrics: { dbCount: number }): boolean {\n\treturn (\n\t\tmetrics.dbCount + MEDIA_USAGE_MAINTENANCE_LIMITS.maxStepQueries <=\n\t\tMEDIA_USAGE_MAINTENANCE_LIMITS.eventQueryCeiling\n\t);\n}\n","import type { Kysely } from \"kysely\";\n\nimport {\n\tMediaUsageRepository,\n\ttype MediaUsageCollectionIndexStatusScope,\n\ttype MediaUsageEntryGroup,\n} from \"../../database/repositories/media-usage.js\";\nimport { MediaRepository } from \"../../database/repositories/media.js\";\nimport { InvalidCursorError } from \"../../database/repositories/types.js\";\nimport type { Database } from \"../../database/types.js\";\nimport {\n\tgetMediaUsageActivationStatus,\n\tMediaUsageActivationVersionMismatchError,\n} from \"../../media/usage/activation.js\";\nimport {\n\tCONTENT_MEDIA_USAGE_ADAPTER_ID,\n\tCONTENT_MEDIA_USAGE_COLLECTION_SCOPE,\n} from \"../../media/usage/content-refresh.js\";\nimport {\n\trepairContentMediaUsageAll,\n\trepairContentMediaUsageCollection,\n\ttype ContentMediaUsageRepairAllResult,\n\ttype ContentMediaUsageRepairCollectionResult,\n} from \"../../media/usage/content-repair.js\";\nimport { CONTENT_SOURCE_SCHEMA_VERSION } from \"../../media/usage/content-snapshots.js\";\nimport {\n\trunMediaUsageMaintenanceStep,\n\ttype MediaUsageMaintenanceContinuation,\n} from \"../../media/usage/maintenance-engine.js\";\nimport {\n\tgroupSiteSettingMediaUsage,\n\tMEDIA_USAGE_SITE_SETTING_OPTIONS,\n\ttype MediaUsageSiteSetting,\n} from \"../../media/usage/site-settings.js\";\nimport { ErrorCode } from \"../errors.js\";\nimport type {\n\tMediaUsageCoverage,\n\tMediaUsageCoverageStatus,\n\tMediaUsageDetailsResponse,\n\tMediaUsageEntryDetail,\n\tMediaUsageOccurrenceDetail,\n\tMediaUsageProgress,\n\tMediaUsageProgressAdvanceResponse,\n\tMediaUsageRepairRequest,\n\tMediaUsageRepairResponse,\n\tMediaUsageSiteSettingDetail,\n\tMediaUsageSummary,\n} from \"../schemas/media-usage.js\";\nimport type { ApiResult } from \"../types.js\";\n\nexport type {\n\tMediaUsageCoverage,\n\tMediaUsageCoverageStatus,\n\tMediaUsageDetailsResponse,\n\tMediaUsageEntryDetail,\n\tMediaUsageOccurrenceDetail,\n\tMediaUsageProgress,\n\tMediaUsageProgressAdvanceResponse,\n\tMediaUsageSourceDetail,\n\tMediaUsageRepairRequest,\n\tMediaUsageRepairResponse,\n\tMediaUsageSiteSettingDetail,\n\tMediaUsageSummary,\n} from \"../schemas/media-usage.js\";\n\ntype ContentMediaUsageRepairResult =\n\t| ContentMediaUsageRepairCollectionResult\n\t| ContentMediaUsageRepairAllResult;\n\nexport async function handleMediaUsageProgress(\n\tdb: Kysely<Database>,\n): Promise<ApiResult<MediaUsageProgress>> {\n\ttry {\n\t\tconst progress = await new MediaUsageRepository(db).findCollectionProgress();\n\t\tif (!progress) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_PROGRESS_NOT_ACTIVE,\n\t\t\t\t\tmessage: \"Media Usage is not active\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn { success: true, data: progress };\n\t} catch (error) {\n\t\tif (error instanceof MediaUsageActivationVersionMismatchError) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,\n\t\t\t\t\tmessage: \"Media Usage activation version does not match this runtime\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconsole.error(\"[media-usage] progress read failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_PROGRESS_READ_ERROR,\n\t\t\t\tmessage: \"Failed to read media usage progress\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport async function handleMediaUsageProgressAdvance(\n\tdb: Kysely<Database>,\n): Promise<ApiResult<MediaUsageProgressAdvanceResponse>> {\n\ttry {\n\t\tconst step = await runMediaUsageMaintenanceStep(db);\n\t\tconst activation = await getMediaUsageActivationStatus(db);\n\t\tif (activation.state === \"expanded\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_PROGRESS_NOT_ACTIVE,\n\t\t\t\t\tmessage: \"Media Usage activation has not started\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst progress =\n\t\t\tactivation.state === \"active\"\n\t\t\t\t? await new MediaUsageRepository(db).findCollectionProgress()\n\t\t\t\t: null;\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\tactivation,\n\t\t\t\tprogress,\n\t\t\t\tnextRequestInMs: continuationDelayMs(step.continuation, progress),\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof MediaUsageActivationVersionMismatchError) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,\n\t\t\t\t\tmessage: \"Media Usage activation version does not match this runtime\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconsole.error(\"[media-usage] progress advance failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_PROGRESS_ADVANCE_ERROR,\n\t\t\t\tmessage: \"Failed to advance media usage progress\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nfunction continuationDelayMs(\n\tcontinuation: MediaUsageMaintenanceContinuation,\n\tprogress: MediaUsageProgress | null,\n): 0 | 30_000 | null {\n\tif (progress?.status === \"needs_attention\") return null;\n\tif (continuation.kind === \"immediate\") return 0;\n\tif (continuation.kind === \"delayed\") return 30_000;\n\tif (progress?.status === \"indexing\") return 0;\n\treturn null;\n}\n\nexport function aggregateMediaUsageCoverageStatus(\n\tscopes: readonly MediaUsageCollectionIndexStatusScope[],\n): MediaUsageCoverageStatus {\n\tconst statuses = scopes.map(normalizeMediaUsageCoverageStatus);\n\tif (statuses.every((status) => status === \"complete\")) {\n\t\treturn \"complete\";\n\t}\n\tif (statuses.includes(\"unknown\")) return \"unknown\";\n\tif (statuses.includes(\"running\")) return \"running\";\n\tif (statuses.includes(\"stale\")) return \"stale\";\n\tif (statuses.includes(\"partial\")) return \"partial\";\n\tif (statuses.every((status) => status === \"never\")) return \"never\";\n\tif (statuses.every((status) => status === \"failed\")) return \"failed\";\n\treturn \"partial\";\n}\n\nexport async function handleMediaUsageSummaries(\n\tdb: Kysely<Database>,\n\tmediaIds: readonly string[],\n\toptions: { includeCount: boolean },\n): Promise<ApiResult<Record<string, MediaUsageSummary>>> {\n\tif (mediaIds.length === 0) return { success: true, data: {} };\n\n\ttry {\n\t\tconst repository = new MediaUsageRepository(db);\n\t\tconst { coverage, siteSettings } = await loadMediaUsageCoverage(repository);\n\t\tconst counts =\n\t\t\toptions.includeCount && coverage.status === \"complete\"\n\t\t\t\t? await repository.findActiveEntryCountsByMediaIds(mediaIds)\n\t\t\t\t: null;\n\t\tconst summaries: Record<string, MediaUsageSummary> = {};\n\n\t\tfor (const mediaId of new Set(mediaIds)) {\n\t\t\tsummaries[mediaId] = {\n\t\t\t\tcount: counts\n\t\t\t\t\t? (counts.get(mediaId) ?? 0) + (siteSettings.get(mediaId)?.length ?? 0)\n\t\t\t\t\t: null,\n\t\t\t\tcoverage,\n\t\t\t};\n\t\t}\n\n\t\treturn { success: true, data: summaries };\n\t} catch (error) {\n\t\tconsole.error(\"[media-usage] summary read failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_READ_ERROR,\n\t\t\t\tmessage: \"Failed to read media usage\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport async function handleMediaUsageDetails(\n\tdb: Kysely<Database>,\n\tmediaId: string,\n\toptions: { cursor?: string; limit?: number },\n): Promise<ApiResult<MediaUsageDetailsResponse>> {\n\ttry {\n\t\tconst media = await new MediaRepository(db).findById(mediaId);\n\t\tif (!media) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.NOT_FOUND,\n\t\t\t\t\tmessage: `Media item not found: ${mediaId}`,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst repository = new MediaUsageRepository(db);\n\t\tconst { coverage, siteSettings } = await loadMediaUsageCoverage(repository);\n\t\tconst page = await repository.findCurrentEntryUsagePageByMediaId(mediaId, options);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\titems: page.items.map(toMediaUsageEntryDetail),\n\t\t\t\t...(page.nextCursor ? { nextCursor: page.nextCursor } : {}),\n\t\t\t\tsiteSettings: (siteSettings.get(mediaId) ?? []).map(\n\t\t\t\t\t(setting): MediaUsageSiteSettingDetail => ({ setting }),\n\t\t\t\t),\n\t\t\t\tcoverage,\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof InvalidCursorError) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: { code: ErrorCode.INVALID_CURSOR, message: error.message },\n\t\t\t};\n\t\t}\n\t\tconsole.error(\"[media-usage] detail read failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_READ_ERROR,\n\t\t\t\tmessage: \"Failed to read media usage\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport async function handleMediaUsageRepair(\n\tdb: Kysely<Database>,\n\tinput: MediaUsageRepairRequest,\n): Promise<ApiResult<MediaUsageRepairResponse>> {\n\ttry {\n\t\tlet result: ContentMediaUsageRepairResult;\n\t\tif (input.scope === \"collection\") {\n\t\t\tresult = await repairContentMediaUsageCollection(db, { collectionSlug: input.collection });\n\t\t} else if (input.scope === \"all\") {\n\t\t\tresult = await repairContentMediaUsageAll(db);\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.VALIDATION_ERROR,\n\t\t\t\t\tmessage: \"Invalid media usage repair request\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn { success: true, data: toMediaUsageRepairResponse(result) };\n\t} catch (error) {\n\t\tconsole.error(\"[media-usage] repair failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_REPAIR_ERROR,\n\t\t\t\tmessage: \"Failed to repair media usage\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport function toMediaUsageRepairResponse(\n\tresult: ContentMediaUsageRepairResult,\n): MediaUsageRepairResponse {\n\tconst collections = \"collections\" in result ? result.collections : [result];\n\n\treturn {\n\t\tstatus: result.status,\n\t\tindexedSourceCount: result.indexedSourceCount,\n\t\tfailedSourceCount: result.failedSourceCount,\n\t\tskippedSourceCount: result.skippedSourceCount,\n\t\tdeletedSourceCount: result.deletedSourceCount,\n\t\tcollections: collections.map(toMediaUsageRepairCollectionSummary),\n\t};\n}\n\nfunction toMediaUsageRepairCollectionSummary(result: ContentMediaUsageRepairCollectionResult) {\n\treturn {\n\t\tcollection: result.scope.scopeKey,\n\t\tstatus: result.status,\n\t\tindexedSourceCount: result.indexedSourceCount,\n\t\tfailedSourceCount: result.failedSourceCount,\n\t\tskippedSourceCount: result.skippedSourceCount,\n\t\tdeletedSourceCount: result.deletedSourceCount,\n\t\tlastErrorCode: result.lastErrorCode,\n\t\tstartedAt: result.startedAt,\n\t\tcompletedAt: result.completedAt,\n\t};\n}\n\nfunction normalizeMediaUsageCoverageStatus(\n\tscope: MediaUsageCollectionIndexStatusScope,\n): MediaUsageCoverageStatus {\n\tif (scope.status === null) return \"never\";\n\tif (scope.status === \"complete\") {\n\t\tif (scope.reconciliationRequired) return \"stale\";\n\t\treturn scope.schemaVersion === CONTENT_SOURCE_SCHEMA_VERSION ? \"complete\" : \"stale\";\n\t}\n\tif (\n\t\tscope.status === \"never\" ||\n\t\tscope.status === \"running\" ||\n\t\tscope.status === \"partial\" ||\n\t\tscope.status === \"failed\" ||\n\t\tscope.status === \"stale\"\n\t) {\n\t\treturn scope.status;\n\t}\n\treturn \"unknown\";\n}\n\nasync function loadMediaUsageCoverage(repository: MediaUsageRepository): Promise<{\n\tcoverage: MediaUsageCoverage;\n\tsiteSettings: Map<string, MediaUsageSiteSetting[]>;\n}> {\n\tconst { scopes, options } = await repository.findCoverageWithOptions(\n\t\t{\n\t\t\tadapterId: CONTENT_MEDIA_USAGE_ADAPTER_ID,\n\t\t\tscopeType: CONTENT_MEDIA_USAGE_COLLECTION_SCOPE,\n\t\t},\n\t\tMEDIA_USAGE_SITE_SETTING_OPTIONS,\n\t);\n\treturn {\n\t\tcoverage: {\n\t\t\tscope: \"all_content_collections\",\n\t\t\tstatus: aggregateMediaUsageCoverageStatus(scopes),\n\t\t},\n\t\tsiteSettings: groupSiteSettingMediaUsage(options),\n\t};\n}\n\nfunction toMediaUsageEntryDetail(group: MediaUsageEntryGroup): MediaUsageEntryDetail {\n\tconst preferred =\n\t\tgroup.sources.find(({ source }) => source.sourceVariant === \"draft_overlay\") ??\n\t\tgroup.sources.find(({ source }) => source.sourceVariant === \"columns\");\n\tif (!preferred) {\n\t\tthrow new Error(\"Media usage entry has no supported source\");\n\t}\n\n\treturn {\n\t\tcollection: group.collectionSlug,\n\t\tcontentId: group.contentId,\n\t\ttitle: preferred.source.contentTitle,\n\t\tslug: preferred.source.contentSlug,\n\t\tlocale: preferred.source.locale,\n\t\tstatus: preferred.source.contentStatus,\n\t\tscheduledAt: preferred.source.contentScheduledAt,\n\t\tdeletedAt: group.contentDeletedAt,\n\t\tsources: group.sources.flatMap(({ source, occurrences }) => {\n\t\t\tif (source.sourceVariant !== \"columns\" && source.sourceVariant !== \"draft_overlay\") {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tvariant: source.sourceVariant,\n\t\t\t\t\toccurrences: occurrences.map((occurrence) => ({\n\t\t\t\t\t\tfieldSlug: occurrence.fieldSlug,\n\t\t\t\t\t\tfieldPath: occurrence.fieldPath,\n\t\t\t\t\t\toccurrenceIndex: occurrence.occurrenceIndex,\n\t\t\t\t\t\treferenceType: normalizeMediaUsageReferenceType(occurrence.referenceType),\n\t\t\t\t\t})),\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t};\n}\n\nfunction normalizeMediaUsageReferenceType(\n\treferenceType: string,\n): MediaUsageOccurrenceDetail[\"referenceType\"] {\n\tif (\n\t\treferenceType === \"image_field\" ||\n\t\treferenceType === \"file_field\" ||\n\t\treferenceType === \"portable_text_image\"\n\t) {\n\t\treturn referenceType;\n\t}\n\treturn \"unknown\";\n}\n"],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { n as MediaUsageActivationVersionMismatchError, r as activateMediaUsageCapture, s as getMediaUsageActivationStatus } from "./activation-LOkDM5WT.mjs";
2
+ import { t as ErrorCode } from "./errors-BF0_LFhW.mjs";
3
+
4
+ //#region src/api/handlers/media-usage-activation.ts
5
+ async function handleMediaUsageActivationStatus(db) {
6
+ try {
7
+ return {
8
+ success: true,
9
+ data: await getMediaUsageActivationStatus(db)
10
+ };
11
+ } catch (error) {
12
+ if (error instanceof MediaUsageActivationVersionMismatchError) return {
13
+ success: false,
14
+ error: {
15
+ code: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,
16
+ message: "Media usage activation version is incompatible with this runtime"
17
+ }
18
+ };
19
+ console.error("[media-usage:activation] status read failed:", error);
20
+ return {
21
+ success: false,
22
+ error: {
23
+ code: ErrorCode.MEDIA_USAGE_ACTIVATION_READ_ERROR,
24
+ message: "Failed to read media usage activation status"
25
+ }
26
+ };
27
+ }
28
+ }
29
+ async function handleMediaUsageActivationAdvance(db, input) {
30
+ try {
31
+ const result = await activateMediaUsageCapture(db, { writersDrained: input.writersDrained });
32
+ if (result.outcome === "lease_active") return {
33
+ success: false,
34
+ error: {
35
+ code: ErrorCode.MEDIA_USAGE_ACTIVATION_BUSY,
36
+ message: "Media usage activation is already in progress",
37
+ details: { leaseExpiresAt: result.leaseExpiresAt }
38
+ }
39
+ };
40
+ if (result.outcome === "conflict") return {
41
+ success: false,
42
+ error: {
43
+ code: ErrorCode.MEDIA_USAGE_ACTIVATION_CONFLICT,
44
+ message: "Media usage activation ownership changed"
45
+ }
46
+ };
47
+ const activation = await getMediaUsageActivationStatus(db);
48
+ if (activation.state === "expanded") throw new Error("Media usage activation did not advance");
49
+ return {
50
+ success: true,
51
+ data: {
52
+ outcome: activation.state,
53
+ processedCollections: result.processedCollections,
54
+ activation
55
+ }
56
+ };
57
+ } catch (error) {
58
+ if (error instanceof MediaUsageActivationVersionMismatchError) return {
59
+ success: false,
60
+ error: {
61
+ code: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,
62
+ message: "Media usage activation version is incompatible with this runtime"
63
+ }
64
+ };
65
+ console.error("[media-usage:activation] advance failed:", error);
66
+ return {
67
+ success: false,
68
+ error: {
69
+ code: ErrorCode.MEDIA_USAGE_ACTIVATION_ADVANCE_ERROR,
70
+ message: "Failed to advance media usage activation"
71
+ }
72
+ };
73
+ }
74
+ }
75
+
76
+ //#endregion
77
+ export { handleMediaUsageActivationStatus as n, handleMediaUsageActivationAdvance as t };
78
+ //# sourceMappingURL=media-usage-activation-HKp7zk7W.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-usage-activation-HKp7zk7W.mjs","names":[],"sources":["../src/api/handlers/media-usage-activation.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\n\nimport type { Database } from \"../../database/types.js\";\nimport {\n\tactivateMediaUsageCapture,\n\tgetMediaUsageActivationStatus,\n\tMediaUsageActivationVersionMismatchError,\n} from \"../../media/usage/activation.js\";\nimport { ErrorCode } from \"../errors.js\";\nimport type {\n\tMediaUsageActivationAdvanceRequest,\n\tMediaUsageActivationAdvanceResponse,\n\tMediaUsageActivationStatus,\n} from \"../schemas/media-usage.js\";\nimport type { ApiResult } from \"../types.js\";\n\nexport async function handleMediaUsageActivationStatus(\n\tdb: Kysely<Database>,\n): Promise<ApiResult<MediaUsageActivationStatus>> {\n\ttry {\n\t\treturn { success: true, data: await getMediaUsageActivationStatus(db) };\n\t} catch (error) {\n\t\tif (error instanceof MediaUsageActivationVersionMismatchError) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,\n\t\t\t\t\tmessage: \"Media usage activation version is incompatible with this runtime\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconsole.error(\"[media-usage:activation] status read failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_READ_ERROR,\n\t\t\t\tmessage: \"Failed to read media usage activation status\",\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport async function handleMediaUsageActivationAdvance(\n\tdb: Kysely<Database>,\n\tinput: MediaUsageActivationAdvanceRequest,\n): Promise<ApiResult<MediaUsageActivationAdvanceResponse>> {\n\ttry {\n\t\tconst result = await activateMediaUsageCapture(db, {\n\t\t\twritersDrained: input.writersDrained,\n\t\t});\n\t\tif (result.outcome === \"lease_active\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_BUSY,\n\t\t\t\t\tmessage: \"Media usage activation is already in progress\",\n\t\t\t\t\tdetails: { leaseExpiresAt: result.leaseExpiresAt },\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tif (result.outcome === \"conflict\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_CONFLICT,\n\t\t\t\t\tmessage: \"Media usage activation ownership changed\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst activation = await getMediaUsageActivationStatus(db);\n\t\tif (activation.state === \"expanded\") {\n\t\t\tthrow new Error(\"Media usage activation did not advance\");\n\t\t}\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: {\n\t\t\t\toutcome: activation.state,\n\t\t\t\tprocessedCollections: result.processedCollections,\n\t\t\t\tactivation,\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof MediaUsageActivationVersionMismatchError) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_VERSION_MISMATCH,\n\t\t\t\t\tmessage: \"Media usage activation version is incompatible with this runtime\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconsole.error(\"[media-usage:activation] advance failed:\", error);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: ErrorCode.MEDIA_USAGE_ACTIVATION_ADVANCE_ERROR,\n\t\t\t\tmessage: \"Failed to advance media usage activation\",\n\t\t\t},\n\t\t};\n\t}\n}\n"],"mappings":";;;;AAgBA,eAAsB,iCACrB,IACiD;AACjD,KAAI;AACH,SAAO;GAAE,SAAS;GAAM,MAAM,MAAM,8BAA8B,GAAG;GAAE;UAC/D,OAAO;AACf,MAAI,iBAAiB,yCACpB,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT;GACD;AAEF,UAAQ,MAAM,gDAAgD,MAAM;AACpE,SAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT;GACD;;;AAIH,eAAsB,kCACrB,IACA,OAC0D;AAC1D,KAAI;EACH,MAAM,SAAS,MAAM,0BAA0B,IAAI,EAClD,gBAAgB,MAAM,gBACtB,CAAC;AACF,MAAI,OAAO,YAAY,eACtB,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT,SAAS,EAAE,gBAAgB,OAAO,gBAAgB;IAClD;GACD;AAEF,MAAI,OAAO,YAAY,WACtB,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT;GACD;EAGF,MAAM,aAAa,MAAM,8BAA8B,GAAG;AAC1D,MAAI,WAAW,UAAU,WACxB,OAAM,IAAI,MAAM,yCAAyC;AAE1D,SAAO;GACN,SAAS;GACT,MAAM;IACL,SAAS,WAAW;IACpB,sBAAsB,OAAO;IAC7B;IACA;GACD;UACO,OAAO;AACf,MAAI,iBAAiB,yCACpB,QAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT;GACD;AAEF,UAAQ,MAAM,4CAA4C,MAAM;AAChE,SAAO;GACN,SAAS;GACT,OAAO;IACN,MAAM,UAAU;IAChB,SAAS;IACT;GACD"}