emdash 0.39.1 → 0.40.1

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