emdash 0.40.1 → 0.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1515) hide show
  1. package/dist/action-token-DBki7IT4.mjs +26 -0
  2. package/dist/action-token-DBki7IT4.mjs.map +1 -0
  3. package/dist/activation-DDuqAat2.mjs +387 -0
  4. package/dist/activation-DDuqAat2.mjs.map +1 -0
  5. package/dist/adapters-BrZxU6vM.d.mts +171 -0
  6. package/dist/adapters-BrZxU6vM.d.mts.map +1 -0
  7. package/dist/allowed-origins-CFtudhyw.mjs +116 -0
  8. package/dist/allowed-origins-CFtudhyw.mjs.map +1 -0
  9. package/dist/api/route-utils.d.mts +5 -4
  10. package/dist/api/route-utils.d.mts.map +1 -1
  11. package/dist/api/route-utils.mjs +52 -46
  12. package/dist/api/route-utils.mjs.map +1 -1
  13. package/dist/api/schemas/index.d.mts +2 -2
  14. package/dist/api/schemas/index.mjs +11 -10
  15. package/dist/api-CFQn8VLR.mjs +4973 -0
  16. package/dist/api-CFQn8VLR.mjs.map +1 -0
  17. package/dist/api-tokens-P3mAaQgr.mjs +166 -0
  18. package/dist/api-tokens-P3mAaQgr.mjs.map +1 -0
  19. package/dist/apply-C1kq5l7p.mjs +1672 -0
  20. package/dist/apply-C1kq5l7p.mjs.map +1 -0
  21. package/dist/approvals-l9sGqPmL.mjs +460 -0
  22. package/dist/approvals-l9sGqPmL.mjs.map +1 -0
  23. package/dist/artifact-fetch-CWxyELVI.mjs +659 -0
  24. package/dist/artifact-fetch-CWxyELVI.mjs.map +1 -0
  25. package/dist/astro/index.d.mts +14 -14
  26. package/dist/astro/index.d.mts.map +1 -1
  27. package/dist/astro/index.mjs +106 -560
  28. package/dist/astro/index.mjs.map +1 -1
  29. package/dist/astro/middleware/auth.d.mts +12 -12
  30. package/dist/astro/middleware/auth.mjs +10 -10
  31. package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
  32. package/dist/astro/middleware/redirect.d.mts.map +1 -1
  33. package/dist/astro/middleware/redirect.mjs +19 -9
  34. package/dist/astro/middleware/redirect.mjs.map +1 -1
  35. package/dist/astro/middleware/request-context.d.mts +2 -1
  36. package/dist/astro/middleware/request-context.d.mts.map +1 -1
  37. package/dist/astro/middleware/request-context.mjs +15 -6
  38. package/dist/astro/middleware/request-context.mjs.map +1 -1
  39. package/dist/astro/middleware/setup.mjs +1 -1
  40. package/dist/astro/middleware.d.mts +12 -12
  41. package/dist/astro/middleware.mjs +114 -107
  42. package/dist/astro/middleware.mjs.map +1 -1
  43. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +15 -14
  44. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
  45. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +15 -14
  46. package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
  47. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
  48. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  49. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
  50. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +18 -17
  51. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
  52. package/dist/astro/routes/api/admin/byline-fields/index.mjs +18 -17
  53. package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
  54. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +18 -17
  55. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
  56. package/dist/astro/routes/api/admin/bylines/_id_/index.d.mts.map +1 -1
  57. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +36 -27
  58. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  59. package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts.map +1 -1
  60. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +32 -26
  61. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  62. package/dist/astro/routes/api/admin/bylines/index.d.mts.map +1 -1
  63. package/dist/astro/routes/api/admin/bylines/index.mjs +32 -26
  64. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  65. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +20 -19
  66. package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
  67. package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -8
  68. package/dist/astro/routes/api/admin/comments/bulk.mjs +19 -18
  69. package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
  70. package/dist/astro/routes/api/admin/comments/counts.mjs +8 -8
  71. package/dist/astro/routes/api/admin/comments/index.mjs +19 -18
  72. package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
  73. package/dist/astro/routes/api/admin/core-update.d.mts +8 -0
  74. package/dist/astro/routes/api/admin/core-update.d.mts.map +1 -0
  75. package/dist/astro/routes/api/admin/core-update.mjs +28 -0
  76. package/dist/astro/routes/api/admin/core-update.mjs.map +1 -0
  77. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
  78. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
  79. package/dist/astro/routes/api/admin/media-usage/activation.mjs +21 -20
  80. package/dist/astro/routes/api/admin/media-usage/activation.mjs.map +1 -1
  81. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +23 -22
  82. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -1
  83. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +23 -22
  84. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -1
  85. package/dist/astro/routes/api/admin/media-usage/progress.mjs +26 -25
  86. package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -1
  87. package/dist/astro/routes/api/admin/media-usage/repair.mjs +32 -31
  88. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  89. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +23 -22
  90. package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -1
  91. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +23 -22
  92. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -1
  93. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  94. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  95. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
  96. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
  97. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +75 -69
  98. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  99. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
  100. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +74 -68
  101. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  102. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +75 -69
  103. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  104. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +86 -79
  105. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  106. package/dist/astro/routes/api/admin/plugins/index.mjs +75 -69
  107. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  108. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.d.mts.map +1 -1
  109. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +10 -7
  110. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs.map +1 -1
  111. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +74 -68
  112. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  113. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +85 -78
  114. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  115. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +74 -68
  116. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  117. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +75 -69
  118. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  119. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +87 -80
  120. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  121. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
  122. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +77 -71
  123. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  124. package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
  125. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +75 -69
  126. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
  127. package/dist/astro/routes/api/admin/plugins/updates.mjs +74 -68
  128. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  129. package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
  130. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +74 -68
  131. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  132. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.d.mts.map +1 -1
  133. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +10 -7
  134. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs.map +1 -1
  135. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +74 -68
  136. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  137. package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
  138. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +42 -41
  139. package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs.map +1 -1
  140. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +42 -41
  141. package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs.map +1 -1
  142. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +44 -43
  143. package/dist/astro/routes/api/admin/transfer/approvals/index.mjs.map +1 -1
  144. package/dist/astro/routes/api/admin/transfer/capabilities.mjs +44 -43
  145. package/dist/astro/routes/api/admin/transfer/capabilities.mjs.map +1 -1
  146. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +44 -43
  147. package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs.map +1 -1
  148. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +45 -44
  149. package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs.map +1 -1
  150. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +45 -44
  151. package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs.map +1 -1
  152. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +44 -43
  153. package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs.map +1 -1
  154. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +45 -44
  155. package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs.map +1 -1
  156. package/dist/astro/routes/api/admin/transfer/exports/index.mjs +46 -45
  157. package/dist/astro/routes/api/admin/transfer/exports/index.mjs.map +1 -1
  158. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +44 -43
  159. package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs.map +1 -1
  160. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +44 -43
  161. package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs.map +1 -1
  162. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +46 -45
  163. package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs.map +1 -1
  164. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +44 -43
  165. package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs.map +1 -1
  166. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +46 -45
  167. package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs.map +1 -1
  168. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +44 -43
  169. package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs.map +1 -1
  170. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +44 -43
  171. package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs.map +1 -1
  172. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +46 -45
  173. package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs.map +1 -1
  174. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +44 -43
  175. package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs.map +1 -1
  176. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +44 -43
  177. package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs.map +1 -1
  178. package/dist/astro/routes/api/admin/transfer/imports/index.mjs +46 -45
  179. package/dist/astro/routes/api/admin/transfer/imports/index.mjs.map +1 -1
  180. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
  181. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  182. package/dist/astro/routes/api/admin/users/_id_/index.mjs +16 -15
  183. package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
  184. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
  185. package/dist/astro/routes/api/admin/users/index.mjs +15 -14
  186. package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
  187. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
  188. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  189. package/dist/astro/routes/api/auth/invite/complete.d.mts.map +1 -1
  190. package/dist/astro/routes/api/auth/invite/complete.mjs +23 -19
  191. package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
  192. package/dist/astro/routes/api/auth/invite/index.mjs +17 -16
  193. package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
  194. package/dist/astro/routes/api/auth/invite/register-options.mjs +18 -17
  195. package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
  196. package/dist/astro/routes/api/auth/logout.mjs +5 -5
  197. package/dist/astro/routes/api/auth/magic-link/send.mjs +19 -18
  198. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
  199. package/dist/astro/routes/api/auth/magic-link/verify.d.mts.map +1 -1
  200. package/dist/astro/routes/api/auth/magic-link/verify.mjs +19 -15
  201. package/dist/astro/routes/api/auth/magic-link/verify.mjs.map +1 -1
  202. package/dist/astro/routes/api/auth/me.mjs +16 -15
  203. package/dist/astro/routes/api/auth/me.mjs.map +1 -1
  204. package/dist/astro/routes/api/auth/mode.mjs +5 -5
  205. package/dist/astro/routes/api/auth/oauth/_provider_/callback.d.mts.map +1 -1
  206. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +13 -4
  207. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
  208. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  209. package/dist/astro/routes/api/auth/passkey/_id_.mjs +15 -14
  210. package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
  211. package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
  212. package/dist/astro/routes/api/auth/passkey/options.mjs +20 -19
  213. package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
  214. package/dist/astro/routes/api/auth/passkey/register/options.mjs +18 -17
  215. package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
  216. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +19 -18
  217. package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
  218. package/dist/astro/routes/api/auth/passkey/verify.d.mts.map +1 -1
  219. package/dist/astro/routes/api/auth/passkey/verify.mjs +23 -19
  220. package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
  221. package/dist/astro/routes/api/auth/signup/complete.d.mts.map +1 -1
  222. package/dist/astro/routes/api/auth/signup/complete.mjs +23 -19
  223. package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
  224. package/dist/astro/routes/api/auth/signup/request.mjs +18 -17
  225. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
  226. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  227. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +13 -13
  228. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +20 -19
  229. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
  230. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  231. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +18 -17
  232. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
  233. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
  234. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +18 -17
  235. package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs.map +1 -1
  236. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
  237. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +12 -11
  238. package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs.map +1 -1
  239. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +33 -32
  240. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  241. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +18 -17
  242. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  243. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +1 -2
  244. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
  245. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +44 -54
  246. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  247. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +36 -30
  248. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  249. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
  250. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  251. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +18 -17
  252. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
  253. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +27 -25
  254. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  255. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
  256. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +18 -17
  257. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
  258. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  259. package/dist/astro/routes/api/content/_collection_/_id_.mjs +19 -18
  260. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  261. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  262. package/dist/astro/routes/api/content/_collection_/index.mjs +16 -15
  263. package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
  264. package/dist/astro/routes/api/content/_collection_/trash.mjs +16 -15
  265. package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
  266. package/dist/astro/routes/api/dashboard.mjs +13 -10
  267. package/dist/astro/routes/api/dashboard.mjs.map +1 -1
  268. package/dist/astro/routes/api/dev/emails.mjs +5 -5
  269. package/dist/astro/routes/api/health.mjs +6 -6
  270. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  271. package/dist/astro/routes/api/import/probe.mjs +25 -24
  272. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  273. package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
  274. package/dist/astro/routes/api/import/wordpress/execute.d.mts +14 -14
  275. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
  276. package/dist/astro/routes/api/import/wordpress/execute.mjs +167 -21
  277. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  278. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
  279. package/dist/astro/routes/api/import/wordpress/media.mjs +20 -19
  280. package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
  281. package/dist/astro/routes/api/import/wordpress/prepare.mjs +19 -18
  282. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  283. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
  284. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +29 -28
  285. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  286. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  287. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +25 -24
  288. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  289. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
  290. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +36 -35
  291. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  292. package/dist/astro/routes/api/manifest.mjs +6 -6
  293. package/dist/astro/routes/api/mcp.mjs +167 -110
  294. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  295. package/dist/astro/routes/api/media/_id_/confirm.mjs +20 -19
  296. package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
  297. package/dist/astro/routes/api/media/_id_/replace.mjs +17 -16
  298. package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -1
  299. package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
  300. package/dist/astro/routes/api/media/_id_/usage.mjs +34 -33
  301. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
  302. package/dist/astro/routes/api/media/_id_.mjs +32 -31
  303. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  304. package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
  305. package/dist/astro/routes/api/media/file/_...key_.mjs +9 -9
  306. package/dist/astro/routes/api/media/folders/_id_.mjs +17 -16
  307. package/dist/astro/routes/api/media/folders/_id_.mjs.map +1 -1
  308. package/dist/astro/routes/api/media/folders/index.mjs +17 -16
  309. package/dist/astro/routes/api/media/folders/index.mjs.map +1 -1
  310. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
  311. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
  312. package/dist/astro/routes/api/media/providers/index.mjs +5 -5
  313. package/dist/astro/routes/api/media/upload-url.mjs +19 -18
  314. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  315. package/dist/astro/routes/api/media.mjs +36 -35
  316. package/dist/astro/routes/api/media.mjs.map +1 -1
  317. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +19 -18
  318. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  319. package/dist/astro/routes/api/menus/_name_/items.mjs +19 -18
  320. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  321. package/dist/astro/routes/api/menus/_name_/reorder.mjs +19 -18
  322. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  323. package/dist/astro/routes/api/menus/_name_/translations.mjs +19 -18
  324. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  325. package/dist/astro/routes/api/menus/_name_.mjs +19 -18
  326. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  327. package/dist/astro/routes/api/menus/index.mjs +19 -18
  328. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  329. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  330. package/dist/astro/routes/api/oauth/device/authorize.d.mts +2 -1
  331. package/dist/astro/routes/api/oauth/device/authorize.d.mts.map +1 -1
  332. package/dist/astro/routes/api/oauth/device/authorize.mjs +23 -9
  333. package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -1
  334. package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
  335. package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
  336. package/dist/astro/routes/api/oauth/register.d.mts.map +1 -1
  337. package/dist/astro/routes/api/oauth/register.mjs +15 -7
  338. package/dist/astro/routes/api/oauth/register.mjs.map +1 -1
  339. package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
  340. package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
  341. package/dist/astro/routes/api/oauth/token.mjs +8 -8
  342. package/dist/astro/routes/api/openapi.json.mjs +21 -20
  343. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  344. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +12 -11
  345. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
  346. package/dist/astro/routes/api/redirects/404s/index.mjs +20 -19
  347. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
  348. package/dist/astro/routes/api/redirects/404s/summary.mjs +20 -19
  349. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
  350. package/dist/astro/routes/api/redirects/_id_.mjs +20 -19
  351. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  352. package/dist/astro/routes/api/redirects/index.mjs +20 -19
  353. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  354. package/dist/astro/routes/api/relations/_id_/index.mjs +36 -30
  355. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  356. package/dist/astro/routes/api/relations/index.mjs +38 -32
  357. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  358. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
  359. package/dist/astro/routes/api/revisions/_revisionId_/restore.d.mts.map +1 -1
  360. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +26 -6
  361. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -1
  362. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +74 -68
  363. package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
  364. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +74 -68
  365. package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
  366. package/dist/astro/routes/api/schema/block-types/index.mjs +74 -68
  367. package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
  368. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +76 -70
  369. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  370. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +74 -68
  371. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  372. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +74 -68
  373. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  374. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +74 -68
  375. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  376. package/dist/astro/routes/api/schema/collections/index.mjs +74 -68
  377. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  378. package/dist/astro/routes/api/schema/collections/reorder.mjs +74 -68
  379. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  380. package/dist/astro/routes/api/schema/index.mjs +17 -16
  381. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  382. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +74 -68
  383. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  384. package/dist/astro/routes/api/schema/orphans/index.mjs +74 -68
  385. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  386. package/dist/astro/routes/api/search/enable.mjs +20 -19
  387. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  388. package/dist/astro/routes/api/search/index.mjs +19 -18
  389. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  390. package/dist/astro/routes/api/search/rebuild.mjs +20 -19
  391. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  392. package/dist/astro/routes/api/search/stats.mjs +9 -9
  393. package/dist/astro/routes/api/search/suggest.mjs +19 -18
  394. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  395. package/dist/astro/routes/api/sections/_slug_.mjs +19 -18
  396. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  397. package/dist/astro/routes/api/sections/index.mjs +19 -18
  398. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  399. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
  400. package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
  401. package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
  402. package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
  403. package/dist/astro/routes/api/settings/email.mjs +6 -6
  404. package/dist/astro/routes/api/settings.mjs +23 -22
  405. package/dist/astro/routes/api/settings.mjs.map +1 -1
  406. package/dist/astro/routes/api/setup/admin-verify.d.mts.map +1 -1
  407. package/dist/astro/routes/api/setup/admin-verify.mjs +26 -24
  408. package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
  409. package/dist/astro/routes/api/setup/admin.mjs +19 -18
  410. package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
  411. package/dist/astro/routes/api/setup/dev-bypass.mjs +47 -40
  412. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  413. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
  414. package/dist/astro/routes/api/setup/index.mjs +52 -45
  415. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  416. package/dist/astro/routes/api/setup/status.mjs +6 -6
  417. package/dist/astro/routes/api/snapshot.mjs +8 -8
  418. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +25 -24
  419. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
  420. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +25 -24
  421. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  422. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +25 -24
  423. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  424. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +25 -24
  425. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  426. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +24 -23
  427. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs.map +1 -1
  428. package/dist/astro/routes/api/taxonomies/_name_.mjs +25 -24
  429. package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
  430. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +42 -40
  431. package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
  432. package/dist/astro/routes/api/taxonomies/index.mjs +25 -24
  433. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  434. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  435. package/dist/astro/routes/api/typegen.d.mts.map +1 -1
  436. package/dist/astro/routes/api/typegen.mjs +8 -39
  437. package/dist/astro/routes/api/typegen.mjs.map +1 -1
  438. package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
  439. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +20 -19
  440. package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs.map +1 -1
  441. package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
  442. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  443. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  444. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  445. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +17 -16
  446. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  447. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +20 -19
  448. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  449. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +20 -19
  450. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  451. package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
  452. package/dist/astro/routes/api/widget-areas/index.mjs +20 -19
  453. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  454. package/dist/astro/routes/api/widget-components.mjs +5 -5
  455. package/dist/astro/routes/robots.txt.mjs +7 -7
  456. package/dist/astro/routes/sitemap-_collection_.xml.mjs +10 -10
  457. package/dist/astro/routes/sitemap.xml.mjs +8 -8
  458. package/dist/astro/types.d.mts +30 -18
  459. package/dist/astro/types.d.mts.map +1 -1
  460. package/dist/audit-BszbE_BP.mjs +127 -0
  461. package/dist/audit-BszbE_BP.mjs.map +1 -0
  462. package/dist/auth/providers/github.d.mts +1 -1
  463. package/dist/auth/providers/google.d.mts +1 -1
  464. package/dist/authoritative-records-dSvXCfzb.mjs +5172 -0
  465. package/dist/authoritative-records-dSvXCfzb.mjs.map +1 -0
  466. package/dist/authorize-soZXK7U0.mjs +49 -0
  467. package/dist/authorize-soZXK7U0.mjs.map +1 -0
  468. package/dist/backup-DQ3CABsO.mjs +246 -0
  469. package/dist/backup-DQ3CABsO.mjs.map +1 -0
  470. package/dist/block-types-DIG_KZwi.mjs +132 -0
  471. package/dist/block-types-DIG_KZwi.mjs.map +1 -0
  472. package/dist/block-values-BrTrtA-v.mjs +175 -0
  473. package/dist/block-values-BrTrtA-v.mjs.map +1 -0
  474. package/dist/byline-02tu_Uc-.mjs +909 -0
  475. package/dist/byline-02tu_Uc-.mjs.map +1 -0
  476. package/dist/byline-fields-B01Txzyx.mjs +123 -0
  477. package/dist/byline-fields-B01Txzyx.mjs.map +1 -0
  478. package/dist/byline-fields-DHJs0Mja.mjs +280 -0
  479. package/dist/byline-fields-DHJs0Mja.mjs.map +1 -0
  480. package/dist/byline-registry-dvt4N3xV.mjs +406 -0
  481. package/dist/byline-registry-dvt4N3xV.mjs.map +1 -0
  482. package/dist/bylines-COTwmMBF.mjs +150 -0
  483. package/dist/bylines-COTwmMBF.mjs.map +1 -0
  484. package/dist/bylines-D_S8UKRX.mjs +214 -0
  485. package/dist/bylines-D_S8UKRX.mjs.map +1 -0
  486. package/dist/cache-CPanL9IO.mjs +114 -0
  487. package/dist/cache-CPanL9IO.mjs.map +1 -0
  488. package/dist/canonical-CAecl1UQ.mjs +174 -0
  489. package/dist/canonical-CAecl1UQ.mjs.map +1 -0
  490. package/dist/capture-triggers-CdZfvHtF.mjs +362 -0
  491. package/dist/capture-triggers-CdZfvHtF.mjs.map +1 -0
  492. package/dist/challenge-store-CxZxPqaw.mjs +51 -0
  493. package/dist/challenge-store-CxZxPqaw.mjs.map +1 -0
  494. package/dist/checksum-DtH6m5uk.mjs +162 -0
  495. package/dist/checksum-DtH6m5uk.mjs.map +1 -0
  496. package/dist/chrome-tags-CKELm-bo.mjs +24 -0
  497. package/dist/chrome-tags-CKELm-bo.mjs.map +1 -0
  498. package/dist/chunks-DBmkKmBH.mjs +25 -0
  499. package/dist/chunks-DBmkKmBH.mjs.map +1 -0
  500. package/dist/cli/index.mjs +380 -1620
  501. package/dist/cli/index.mjs.map +1 -1
  502. package/dist/client/cf-access.d.mts +1 -1
  503. package/dist/client/index.d.mts +39 -34
  504. package/dist/client/index.d.mts.map +1 -1
  505. package/dist/client/index.mjs +8 -3
  506. package/dist/client/index.mjs.map +1 -1
  507. package/dist/collection-deletion-JecE26cS.mjs +436 -0
  508. package/dist/collection-deletion-JecE26cS.mjs.map +1 -0
  509. package/dist/collection-deletion-processor-DgCfF3a1.mjs +217 -0
  510. package/dist/collection-deletion-processor-DgCfF3a1.mjs.map +1 -0
  511. package/dist/collection-slugs-cache-BNRAPNiu.mjs +85 -0
  512. package/dist/collection-slugs-cache-BNRAPNiu.mjs.map +1 -0
  513. package/dist/comment-Cq1UYN8_.mjs +313 -0
  514. package/dist/comment-Cq1UYN8_.mjs.map +1 -0
  515. package/dist/comment-reaction-DPeGAfjd.mjs +85 -0
  516. package/dist/comment-reaction-DPeGAfjd.mjs.map +1 -0
  517. package/dist/comments-BRtp992B.mjs +99 -0
  518. package/dist/comments-BRtp992B.mjs.map +1 -0
  519. package/dist/comments-Bi2j9IoX.mjs +195 -0
  520. package/dist/comments-Bi2j9IoX.mjs.map +1 -0
  521. package/dist/components-CQY-Sgm-.mjs +108 -0
  522. package/dist/components-CQY-Sgm-.mjs.map +1 -0
  523. package/dist/config-BnuORwSP.mjs +242 -0
  524. package/dist/config-BnuORwSP.mjs.map +1 -0
  525. package/dist/config-CDmPF4p7.d.mts +39 -0
  526. package/dist/config-CDmPF4p7.d.mts.map +1 -0
  527. package/dist/config-DHsDMpXc.d.mts +6707 -0
  528. package/dist/config-DHsDMpXc.d.mts.map +1 -0
  529. package/dist/connection-B9pIasFd.mjs +36 -0
  530. package/dist/connection-B9pIasFd.mjs.map +1 -0
  531. package/dist/content-RzEXY3QX.mjs +2020 -0
  532. package/dist/content-RzEXY3QX.mjs.map +1 -0
  533. package/dist/content-list-query-CnXfe1Nu.d.mts +26 -0
  534. package/dist/content-list-query-CnXfe1Nu.d.mts.map +1 -0
  535. package/dist/content-policy-Dm32n9C6.mjs +46 -0
  536. package/dist/content-policy-Dm32n9C6.mjs.map +1 -0
  537. package/dist/content-repair-B-k5JrVN.mjs +442 -0
  538. package/dist/content-repair-B-k5JrVN.mjs.map +1 -0
  539. package/dist/context-CtRvoSAj.mjs +2026 -0
  540. package/dist/context-CtRvoSAj.mjs.map +1 -0
  541. package/dist/credits-CAFPFhuk.mjs +110 -0
  542. package/dist/credits-CAFPFhuk.mjs.map +1 -0
  543. package/dist/cron-xe5XKqA-.mjs +306 -0
  544. package/dist/cron-xe5XKqA-.mjs.map +1 -0
  545. package/dist/dashboard-BoV4pwPP.mjs +151 -0
  546. package/dist/dashboard-BoV4pwPP.mjs.map +1 -0
  547. package/dist/db/index.d.mts +3 -3
  548. package/dist/db/index.mjs +1 -1
  549. package/dist/db/libsql-migrations.d.mts +1 -1
  550. package/dist/db/libsql-migrations.mjs +4 -4
  551. package/dist/db/libsql.d.mts +1 -1
  552. package/dist/db/postgres-migrations.d.mts +1 -1
  553. package/dist/db/postgres-migrations.mjs +4 -4
  554. package/dist/db/postgres.d.mts +1 -1
  555. package/dist/db/sqlite-migrations.d.mts +1 -1
  556. package/dist/db/sqlite-migrations.mjs +4 -4
  557. package/dist/db/sqlite.d.mts +1 -1
  558. package/dist/db/sqlite.mjs +1 -1
  559. package/dist/default-DaoYyFRS.mjs +81 -0
  560. package/dist/default-DaoYyFRS.mjs.map +1 -0
  561. package/dist/deferred-tasks-OBADxoFf.d.mts +9 -0
  562. package/dist/deferred-tasks-OBADxoFf.d.mts.map +1 -0
  563. package/dist/destination-r2zIAZ2S.mjs +18 -0
  564. package/dist/destination-r2zIAZ2S.mjs.map +1 -0
  565. package/dist/dev-typegen-8JlYYFno.mjs +29 -0
  566. package/dist/dev-typegen-8JlYYFno.mjs.map +1 -0
  567. package/dist/device-flow-CzKi6tID.mjs +521 -0
  568. package/dist/device-flow-CzKi6tID.mjs.map +1 -0
  569. package/dist/digest-DiYAoZpf.mjs +194 -0
  570. package/dist/digest-DiYAoZpf.mjs.map +1 -0
  571. package/dist/direct-executor-CsEmH_2m.mjs +104 -0
  572. package/dist/direct-executor-CsEmH_2m.mjs.map +1 -0
  573. package/dist/dist-Cfu8mMBs.mjs +810 -0
  574. package/dist/dist-Cfu8mMBs.mjs.map +1 -0
  575. package/dist/email-console-DmqVF5J_.mjs +50 -0
  576. package/dist/email-console-DmqVF5J_.mjs.map +1 -0
  577. package/dist/email-locale-B5OjmAj_.mjs +25 -0
  578. package/dist/email-locale-B5OjmAj_.mjs.map +1 -0
  579. package/dist/emdash-runtime-CMdYH2Of.mjs +4229 -0
  580. package/dist/emdash-runtime-CMdYH2Of.mjs.map +1 -0
  581. package/dist/enrich-BDdVNeDK.mjs +194 -0
  582. package/dist/enrich-BDdVNeDK.mjs.map +1 -0
  583. package/dist/entry-lock-B-1bUDxX.d.mts +4544 -0
  584. package/dist/entry-lock-B-1bUDxX.d.mts.map +1 -0
  585. package/dist/entry-lock-B5eaZEZP.mjs +163 -0
  586. package/dist/entry-lock-B5eaZEZP.mjs.map +1 -0
  587. package/dist/entry-lock-PP1JCXBB.mjs +1180 -0
  588. package/dist/entry-lock-PP1JCXBB.mjs.map +1 -0
  589. package/dist/entry-locks-DJAqVweV.mjs +167 -0
  590. package/dist/entry-locks-DJAqVweV.mjs.map +1 -0
  591. package/dist/env-types-BaTCgn-y.mjs +38 -0
  592. package/dist/env-types-BaTCgn-y.mjs.map +1 -0
  593. package/dist/error-CEdm_AWU.mjs +90 -0
  594. package/dist/error-CEdm_AWU.mjs.map +1 -0
  595. package/dist/errors-CNvATh_7.mjs +469 -0
  596. package/dist/errors-CNvATh_7.mjs.map +1 -0
  597. package/dist/errors-CjXd1LgH.mjs +120 -0
  598. package/dist/errors-CjXd1LgH.mjs.map +1 -0
  599. package/dist/escape-nJW7dR0s.mjs +9 -0
  600. package/dist/escape-nJW7dR0s.mjs.map +1 -0
  601. package/dist/fence-BrnQffdY.mjs +162 -0
  602. package/dist/fence-BrnQffdY.mjs.map +1 -0
  603. package/dist/field-defs-cache-DEkFYCDE.mjs +77 -0
  604. package/dist/field-defs-cache-DEkFYCDE.mjs.map +1 -0
  605. package/dist/field-map-Cp5hDSRU.mjs +83 -0
  606. package/dist/field-map-Cp5hDSRU.mjs.map +1 -0
  607. package/dist/focal-point-JX8kcOTQ.mjs +23 -0
  608. package/dist/focal-point-JX8kcOTQ.mjs.map +1 -0
  609. package/dist/fts-manager-DU03MxWu.mjs +443 -0
  610. package/dist/fts-manager-DU03MxWu.mjs.map +1 -0
  611. package/dist/gc-Gf9LOF42.mjs +75 -0
  612. package/dist/gc-Gf9LOF42.mjs.map +1 -0
  613. package/dist/hash-CY4QdeMJ.mjs +37 -0
  614. package/dist/hash-CY4QdeMJ.mjs.map +1 -0
  615. package/dist/hook-result-DjdVwWpw.d.mts +31 -0
  616. package/dist/hook-result-DjdVwWpw.d.mts.map +1 -0
  617. package/dist/hreflang-Bq0ahAd4.mjs +105 -0
  618. package/dist/hreflang-Bq0ahAd4.mjs.map +1 -0
  619. package/dist/hreflang-C7ETs0Tv.d.mts +50 -0
  620. package/dist/hreflang-C7ETs0Tv.d.mts.map +1 -0
  621. package/dist/http-route-dispatch-B2G7_OOm.mjs +339 -0
  622. package/dist/http-route-dispatch-B2G7_OOm.mjs.map +1 -0
  623. package/dist/identity-u3KgtUC9.mjs +35 -0
  624. package/dist/identity-u3KgtUC9.mjs.map +1 -0
  625. package/dist/import-CzP9ffo0.mjs +2020 -0
  626. package/dist/import-CzP9ffo0.mjs.map +1 -0
  627. package/dist/index-D1_ykO2u.d.mts +623 -0
  628. package/dist/index-D1_ykO2u.d.mts.map +1 -0
  629. package/dist/index.d.mts +24 -24
  630. package/dist/index.mjs +108 -102
  631. package/dist/install-finalization-TbcQozrV.mjs +58 -0
  632. package/dist/install-finalization-TbcQozrV.mjs.map +1 -0
  633. package/dist/keys-r08WvAng.mjs +61 -0
  634. package/dist/keys-r08WvAng.mjs.map +1 -0
  635. package/dist/kinds-CXY-fwQ6.mjs +974 -0
  636. package/dist/kinds-CXY-fwQ6.mjs.map +1 -0
  637. package/dist/lifecycle-CpebZNAA.mjs +25 -0
  638. package/dist/lifecycle-CpebZNAA.mjs.map +1 -0
  639. package/dist/load-dHcR5yh9.mjs +28 -0
  640. package/dist/load-dHcR5yh9.mjs.map +1 -0
  641. package/dist/loader-B_bcoE1h.mjs +1197 -0
  642. package/dist/loader-B_bcoE1h.mjs.map +1 -0
  643. package/dist/loops-Dn1i16FP.mjs +205 -0
  644. package/dist/loops-Dn1i16FP.mjs.map +1 -0
  645. package/dist/manifest-builder-D7Y8iirE.mjs +189 -0
  646. package/dist/manifest-builder-D7Y8iirE.mjs.map +1 -0
  647. package/dist/manifest-schema-gy37bD_D.mjs +496 -0
  648. package/dist/manifest-schema-gy37bD_D.mjs.map +1 -0
  649. package/dist/marketplace-tHWSsCUo.mjs +257 -0
  650. package/dist/marketplace-tHWSsCUo.mjs.map +1 -0
  651. package/dist/media/image-endpoint.mjs +1 -1
  652. package/dist/media/index.d.mts +1 -1
  653. package/dist/media/index.mjs +4 -4
  654. package/dist/media/local-runtime.d.mts +14 -14
  655. package/dist/media/local-runtime.mjs +7 -7
  656. package/dist/media-3v7mqAVX.mjs +294 -0
  657. package/dist/media-3v7mqAVX.mjs.map +1 -0
  658. package/dist/media-CputjGE1.mjs +373 -0
  659. package/dist/media-CputjGE1.mjs.map +1 -0
  660. package/dist/media-D1z_jisb.mjs +408 -0
  661. package/dist/media-D1z_jisb.mjs.map +1 -0
  662. package/dist/media-allowlist-D5a4d-RA.mjs +44 -0
  663. package/dist/media-allowlist-D5a4d-RA.mjs.map +1 -0
  664. package/dist/media-folders-D2VdVBf6.mjs +210 -0
  665. package/dist/media-folders-D2VdVBf6.mjs.map +1 -0
  666. package/dist/media-url-DloW2xrP.mjs +43 -0
  667. package/dist/media-url-DloW2xrP.mjs.map +1 -0
  668. package/dist/media-usage-B8q0owWQ.mjs +1629 -0
  669. package/dist/media-usage-B8q0owWQ.mjs.map +1 -0
  670. package/dist/media-usage-activation-CQWOOTJi.mjs +78 -0
  671. package/dist/media-usage-activation-CQWOOTJi.mjs.map +1 -0
  672. package/dist/media-usage-work-BC0qpkMD.mjs +152 -0
  673. package/dist/media-usage-work-BC0qpkMD.mjs.map +1 -0
  674. package/dist/media-usage-work-BlMjwPg8.mjs +586 -0
  675. package/dist/media-usage-work-BlMjwPg8.mjs.map +1 -0
  676. package/dist/menus-BQKqf0Up.mjs +92 -0
  677. package/dist/menus-BQKqf0Up.mjs.map +1 -0
  678. package/dist/menus-DiuhXKWf.mjs +3646 -0
  679. package/dist/menus-DiuhXKWf.mjs.map +1 -0
  680. package/dist/menus-trvc6_fW.mjs +753 -0
  681. package/dist/menus-trvc6_fW.mjs.map +1 -0
  682. package/dist/migrations/index.d.mts +1 -1
  683. package/dist/migrations/index.mjs +3 -3
  684. package/dist/mime-IZf-LHIS.mjs +36 -0
  685. package/dist/mime-IZf-LHIS.mjs.map +1 -0
  686. package/dist/mode-nh0ppSX5.mjs +23 -0
  687. package/dist/mode-nh0ppSX5.mjs.map +1 -0
  688. package/dist/node-sqlite-compat-CDOEcc97.mjs +63 -0
  689. package/dist/node-sqlite-compat-CDOEcc97.mjs.map +1 -0
  690. package/dist/normalize-BuWa0lvd.mjs +191 -0
  691. package/dist/normalize-BuWa0lvd.mjs.map +1 -0
  692. package/dist/oauth-authorization-BcRdGojQ.mjs +274 -0
  693. package/dist/oauth-authorization-BcRdGojQ.mjs.map +1 -0
  694. package/dist/oauth-clients-C-8WDTqj.mjs +266 -0
  695. package/dist/oauth-clients-C-8WDTqj.mjs.map +1 -0
  696. package/dist/oauth-state-store-CM5ZEYQS.mjs +50 -0
  697. package/dist/oauth-state-store-CM5ZEYQS.mjs.map +1 -0
  698. package/dist/oauth-user-lookup-DrrqvTZC.mjs +26 -0
  699. package/dist/oauth-user-lookup-DrrqvTZC.mjs.map +1 -0
  700. package/dist/object-cache/memory.d.mts +1 -1
  701. package/dist/object-cache-Bo6DGaC9.mjs +586 -0
  702. package/dist/object-cache-Bo6DGaC9.mjs.map +1 -0
  703. package/dist/options-C2IDQnD2.d.mts +81 -0
  704. package/dist/options-C2IDQnD2.d.mts.map +1 -0
  705. package/dist/ownership-DoeAIuTg.mjs +12 -0
  706. package/dist/ownership-DoeAIuTg.mjs.map +1 -0
  707. package/dist/page/index.d.mts +2 -2
  708. package/dist/page/index.mjs +6 -6
  709. package/dist/parse-D5Sw9wAI.d.mts +172 -0
  710. package/dist/parse-D5Sw9wAI.d.mts.map +1 -0
  711. package/dist/parse-Gt2l4Sld.mjs +81 -0
  712. package/dist/parse-Gt2l4Sld.mjs.map +1 -0
  713. package/dist/passkey-config-CkQsrcU-.mjs +46 -0
  714. package/dist/passkey-config-CkQsrcU-.mjs.map +1 -0
  715. package/dist/paths-DiENGBx5.mjs +77 -0
  716. package/dist/paths-DiENGBx5.mjs.map +1 -0
  717. package/dist/patterns-DyZJ67I7.mjs +140 -0
  718. package/dist/patterns-DyZJ67I7.mjs.map +1 -0
  719. package/dist/placeholder-Cq5wLDCX.d.mts +306 -0
  720. package/dist/placeholder-Cq5wLDCX.d.mts.map +1 -0
  721. package/dist/plan-BxCS1tl5.mjs +135 -0
  722. package/dist/plan-BxCS1tl5.mjs.map +1 -0
  723. package/dist/plugin-test-runtime.d.mts +14 -14
  724. package/dist/plugin-test-runtime.mjs +115 -108
  725. package/dist/plugin-types.d.mts +5 -3
  726. package/dist/plugin-types.d.mts.map +1 -1
  727. package/dist/plugin-types.mjs.map +1 -1
  728. package/dist/plugin-utils.d.mts +12 -12
  729. package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
  730. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  731. package/dist/plugins/adapt-sandbox-entry.mjs +48 -10
  732. package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
  733. package/dist/plugins/host.d.mts +6 -6
  734. package/dist/plugins/host.mjs +49 -43
  735. package/dist/plugins-BpLkXA1S.mjs +277 -0
  736. package/dist/plugins-BpLkXA1S.mjs.map +1 -0
  737. package/dist/policy-C1qpNxrr.mjs +45 -0
  738. package/dist/policy-C1qpNxrr.mjs.map +1 -0
  739. package/dist/portable-text-BnRuiR1-.mjs +307 -0
  740. package/dist/portable-text-BnRuiR1-.mjs.map +1 -0
  741. package/dist/preview-DU5rwz_m.mjs +107 -0
  742. package/dist/preview-DU5rwz_m.mjs.map +1 -0
  743. package/dist/protocol-B9GEhEyi.d.mts +61 -0
  744. package/dist/protocol-B9GEhEyi.d.mts.map +1 -0
  745. package/dist/public-submission-yZaTTfsC.mjs +250 -0
  746. package/dist/public-submission-yZaTTfsC.mjs.map +1 -0
  747. package/dist/public-url-B5a0QAh6.mjs +101 -0
  748. package/dist/public-url-B5a0QAh6.mjs.map +1 -0
  749. package/dist/query-6e2CQxUv.mjs +1161 -0
  750. package/dist/query-6e2CQxUv.mjs.map +1 -0
  751. package/dist/query-DC3bv__4.mjs +41 -0
  752. package/dist/query-DC3bv__4.mjs.map +1 -0
  753. package/dist/rate-limit-BXx3Ecp9.mjs +120 -0
  754. package/dist/rate-limit-BXx3Ecp9.mjs.map +1 -0
  755. package/dist/receipt-q1VK9jhj.mjs +43 -0
  756. package/dist/receipt-q1VK9jhj.mjs.map +1 -0
  757. package/dist/redirect-BvFKh8Sz.mjs +416 -0
  758. package/dist/redirect-BvFKh8Sz.mjs.map +1 -0
  759. package/dist/redirect-D1AmADlk.mjs +19 -0
  760. package/dist/redirect-D1AmADlk.mjs.map +1 -0
  761. package/dist/redirects-CWQMKYOS.mjs +446 -0
  762. package/dist/redirects-CWQMKYOS.mjs.map +1 -0
  763. package/dist/redirects-D4EWeXAo.mjs +148 -0
  764. package/dist/redirects-D4EWeXAo.mjs.map +1 -0
  765. package/dist/registry/testing.d.mts +16 -4
  766. package/dist/registry/testing.d.mts.map +1 -1
  767. package/dist/registry/testing.mjs +20 -10
  768. package/dist/registry/testing.mjs.map +1 -1
  769. package/dist/registry-CtHRqVe-.mjs +6771 -0
  770. package/dist/registry-CtHRqVe-.mjs.map +1 -0
  771. package/dist/relations-CVI2nbrn.mjs +776 -0
  772. package/dist/relations-CVI2nbrn.mjs.map +1 -0
  773. package/dist/request-cache-C4CIo5ad.mjs +104 -0
  774. package/dist/request-cache-C4CIo5ad.mjs.map +1 -0
  775. package/dist/request-context.d.mts +9 -1
  776. package/dist/request-context.d.mts.map +1 -1
  777. package/dist/request-context.mjs.map +1 -1
  778. package/dist/request-meta-B6blULFY.mjs +141 -0
  779. package/dist/request-meta-B6blULFY.mjs.map +1 -0
  780. package/dist/resolve-Cx0Pwz0-.mjs +100 -0
  781. package/dist/resolve-Cx0Pwz0-.mjs.map +1 -0
  782. package/dist/resolve-D-kqyKns.mjs +199 -0
  783. package/dist/resolve-D-kqyKns.mjs.map +1 -0
  784. package/dist/revision-CGkQA0e5.mjs +366 -0
  785. package/dist/revision-CGkQA0e5.mjs.map +1 -0
  786. package/dist/route-wire-DK600v4u.mjs +197 -0
  787. package/dist/route-wire-DK600v4u.mjs.map +1 -0
  788. package/dist/routes-DTduBPzX.mjs +272 -0
  789. package/dist/routes-DTduBPzX.mjs.map +1 -0
  790. package/dist/runner-CLpxmhl8.mjs +6197 -0
  791. package/dist/runner-CLpxmhl8.mjs.map +1 -0
  792. package/dist/runner-Ji7qyH2A.d.mts +68 -0
  793. package/dist/runner-Ji7qyH2A.d.mts.map +1 -0
  794. package/dist/runtime.d.mts +13 -13
  795. package/dist/runtime.mjs +3 -3
  796. package/dist/schema/project-env-types.d.mts +12 -0
  797. package/dist/schema/project-env-types.d.mts.map +1 -0
  798. package/dist/schema/project-env-types.mjs +86 -0
  799. package/dist/schema/project-env-types.mjs.map +1 -0
  800. package/dist/schema-BZPj3kwZ.mjs +13 -0
  801. package/dist/schema-BZPj3kwZ.mjs.map +1 -0
  802. package/dist/schema-Berj5VQx.mjs +815 -0
  803. package/dist/schema-Berj5VQx.mjs.map +1 -0
  804. package/dist/scopes-C1HJaIyf.mjs +34 -0
  805. package/dist/scopes-C1HJaIyf.mjs.map +1 -0
  806. package/dist/search-thYf8j9F.mjs +448 -0
  807. package/dist/search-thYf8j9F.mjs.map +1 -0
  808. package/dist/sections-2k1uIgJ0.mjs +346 -0
  809. package/dist/sections-2k1uIgJ0.mjs.map +1 -0
  810. package/dist/seed/index.d.mts +2 -2
  811. package/dist/seed/index.mjs +39 -32
  812. package/dist/seo/index.d.mts +3 -3
  813. package/dist/seo/index.mjs +24 -22
  814. package/dist/seo/index.mjs.map +1 -1
  815. package/dist/seo-C61bnPuV.mjs +114 -0
  816. package/dist/seo-C61bnPuV.mjs.map +1 -0
  817. package/dist/seo-DpYxmGaL.mjs +133 -0
  818. package/dist/seo-DpYxmGaL.mjs.map +1 -0
  819. package/dist/service-BFUImckH.mjs +150 -0
  820. package/dist/service-BFUImckH.mjs.map +1 -0
  821. package/dist/session-user-DVcHsFD5.mjs +61 -0
  822. package/dist/session-user-DVcHsFD5.mjs.map +1 -0
  823. package/dist/settings-B0zQj_Tj.mjs +61 -0
  824. package/dist/settings-B0zQj_Tj.mjs.map +1 -0
  825. package/dist/settings-BJjK_X7x.mjs +51 -0
  826. package/dist/settings-BJjK_X7x.mjs.map +1 -0
  827. package/dist/settings-BbVRRGDp.mjs +439 -0
  828. package/dist/settings-BbVRRGDp.mjs.map +1 -0
  829. package/dist/setup-complete-CuLcTDTU.mjs +65 -0
  830. package/dist/setup-complete-CuLcTDTU.mjs.map +1 -0
  831. package/dist/setup-nonce-CAQoY5PC.mjs +25 -0
  832. package/dist/setup-nonce-CAQoY5PC.mjs.map +1 -0
  833. package/dist/site-settings-AYFvhwQn.mjs +50 -0
  834. package/dist/site-settings-AYFvhwQn.mjs.map +1 -0
  835. package/dist/site-url-Ceq_AUK0.mjs +16 -0
  836. package/dist/site-url-Ceq_AUK0.mjs.map +1 -0
  837. package/dist/snapshot-Dzsn3NZa.mjs +414 -0
  838. package/dist/snapshot-Dzsn3NZa.mjs.map +1 -0
  839. package/dist/ssrf-DsmvZB80.mjs +406 -0
  840. package/dist/ssrf-DsmvZB80.mjs.map +1 -0
  841. package/dist/stage-Cf9PqdUB.mjs +662 -0
  842. package/dist/stage-Cf9PqdUB.mjs.map +1 -0
  843. package/dist/staged-Bw5eHbKS.mjs +686 -0
  844. package/dist/staged-Bw5eHbKS.mjs.map +1 -0
  845. package/dist/state-kGdOMQRY.mjs +153 -0
  846. package/dist/state-kGdOMQRY.mjs.map +1 -0
  847. package/dist/status-D39Fpy8R.mjs +30 -0
  848. package/dist/status-D39Fpy8R.mjs.map +1 -0
  849. package/dist/storage/local.d.mts +1 -1
  850. package/dist/storage/local.mjs +1 -1
  851. package/dist/storage/s3.d.mts +1 -1
  852. package/dist/storage/s3.mjs +1 -1
  853. package/dist/storage-query-C9bK0Dg6.d.mts +1614 -0
  854. package/dist/storage-query-C9bK0Dg6.d.mts.map +1 -0
  855. package/dist/tar-lDI_fzLD.mjs +449 -0
  856. package/dist/tar-lDI_fzLD.mjs.map +1 -0
  857. package/dist/target-DOFs5oUC.mjs +27 -0
  858. package/dist/target-DOFs5oUC.mjs.map +1 -0
  859. package/dist/taxonomies-DQGomz9p.mjs +939 -0
  860. package/dist/taxonomies-DQGomz9p.mjs.map +1 -0
  861. package/dist/taxonomies-DWv-OYT0.mjs +697 -0
  862. package/dist/taxonomies-DWv-OYT0.mjs.map +1 -0
  863. package/dist/taxonomy-BesdHIwi.mjs +525 -0
  864. package/dist/taxonomy-BesdHIwi.mjs.map +1 -0
  865. package/dist/tokens-BIGxi8sP.mjs +171 -0
  866. package/dist/tokens-BIGxi8sP.mjs.map +1 -0
  867. package/dist/transaction-BVYIo_yu.mjs +29 -0
  868. package/dist/transaction-BVYIo_yu.mjs.map +1 -0
  869. package/dist/transfer-BtzoaXLk.mjs +166 -0
  870. package/dist/transfer-BtzoaXLk.mjs.map +1 -0
  871. package/dist/transfer-DLu_6AXL.mjs +8856 -0
  872. package/dist/transfer-DLu_6AXL.mjs.map +1 -0
  873. package/dist/transfer-download-b_PCrqJJ.mjs +33 -0
  874. package/dist/transfer-download-b_PCrqJJ.mjs.map +1 -0
  875. package/dist/transformations-DdnpSdeC.mjs +196 -0
  876. package/dist/transformations-DdnpSdeC.mjs.map +1 -0
  877. package/dist/transport-flR-Zmds.d.mts +42 -0
  878. package/dist/transport-flR-Zmds.d.mts.map +1 -0
  879. package/dist/transport-umzEbgYO.mjs +136 -0
  880. package/dist/transport-umzEbgYO.mjs.map +1 -0
  881. package/dist/trusted-proxy-BqfQFs6a.mjs +51 -0
  882. package/dist/trusted-proxy-BqfQFs6a.mjs.map +1 -0
  883. package/dist/turnstile-IvQp2uyD.mjs +53 -0
  884. package/dist/turnstile-IvQp2uyD.mjs.map +1 -0
  885. package/dist/types-2V_MVPYy.d.mts +125 -0
  886. package/dist/types-2V_MVPYy.d.mts.map +1 -0
  887. package/dist/types-B-WCvzdi.d.mts +198 -0
  888. package/dist/types-B-WCvzdi.d.mts.map +1 -0
  889. package/dist/types-BGmQ0uXs.mjs +201 -0
  890. package/dist/types-BGmQ0uXs.mjs.map +1 -0
  891. package/dist/types-CVsmpTcU.mjs +18 -0
  892. package/dist/types-CVsmpTcU.mjs.map +1 -0
  893. package/dist/types-C_V-_vMS.d.mts +198 -0
  894. package/dist/types-C_V-_vMS.d.mts.map +1 -0
  895. package/dist/types-CdEMurNh.mjs +77 -0
  896. package/dist/types-CdEMurNh.mjs.map +1 -0
  897. package/dist/types-CsmwbOwa.mjs +22 -0
  898. package/dist/types-CsmwbOwa.mjs.map +1 -0
  899. package/dist/types-Cw-1it3n.d.mts +287 -0
  900. package/dist/types-Cw-1it3n.d.mts.map +1 -0
  901. package/dist/types-D7B20WFC.d.mts +374 -0
  902. package/dist/types-D7B20WFC.d.mts.map +1 -0
  903. package/dist/types-DGw8KMX_.mjs +16 -0
  904. package/dist/types-DGw8KMX_.mjs.map +1 -0
  905. package/dist/types-DZeDpzMc.d.mts +896 -0
  906. package/dist/types-DZeDpzMc.d.mts.map +1 -0
  907. package/dist/types-DuQAIPA-.d.mts +363 -0
  908. package/dist/types-DuQAIPA-.d.mts.map +1 -0
  909. package/dist/types-edRPQchz.d.mts +85 -0
  910. package/dist/types-edRPQchz.d.mts.map +1 -0
  911. package/dist/types-j6MBDjlZ.mjs +103 -0
  912. package/dist/types-j6MBDjlZ.mjs.map +1 -0
  913. package/dist/types-pOLeFKGq.d.mts +1720 -0
  914. package/dist/types-pOLeFKGq.d.mts.map +1 -0
  915. package/dist/update-check-CaZyFHZC.mjs +161 -0
  916. package/dist/update-check-CaZyFHZC.mjs.map +1 -0
  917. package/dist/upload-attempts-BodUoFBu.mjs +32 -0
  918. package/dist/upload-attempts-BodUoFBu.mjs.map +1 -0
  919. package/dist/url-Dn3IStq8.mjs +104 -0
  920. package/dist/url-Dn3IStq8.mjs.map +1 -0
  921. package/dist/url-pattern-DGAG6ZP2.mjs +41 -0
  922. package/dist/url-pattern-DGAG6ZP2.mjs.map +1 -0
  923. package/dist/user-BOvuF1sQ.mjs +171 -0
  924. package/dist/user-BOvuF1sQ.mjs.map +1 -0
  925. package/dist/utils-CoV-PYhg.mjs +439 -0
  926. package/dist/utils-CoV-PYhg.mjs.map +1 -0
  927. package/dist/validate-WkjGwBSO.mjs +516 -0
  928. package/dist/validate-WkjGwBSO.mjs.map +1 -0
  929. package/dist/validate-dK97qe7F.d.mts +468 -0
  930. package/dist/validate-dK97qe7F.d.mts.map +1 -0
  931. package/dist/validation-D-ICq_tY.mjs +219 -0
  932. package/dist/validation-D-ICq_tY.mjs.map +1 -0
  933. package/dist/version-DbT04wbH.mjs +9 -0
  934. package/dist/version-DbT04wbH.mjs.map +1 -0
  935. package/dist/version-IneBU54o.mjs +7 -0
  936. package/dist/version-IneBU54o.mjs.map +1 -0
  937. package/dist/virtual-modules-Brh6mRVe.mjs +516 -0
  938. package/dist/virtual-modules-Brh6mRVe.mjs.map +1 -0
  939. package/dist/widgets-D8T0xBYs.mjs +126 -0
  940. package/dist/widgets-D8T0xBYs.mjs.map +1 -0
  941. package/dist/wxr-taxonomies-B6iE8m9I.d.mts +34 -0
  942. package/dist/wxr-taxonomies-B6iE8m9I.d.mts.map +1 -0
  943. package/dist/wxr-taxonomies-DEzR9N7e.mjs +453 -0
  944. package/dist/wxr-taxonomies-DEzR9N7e.mjs.map +1 -0
  945. package/dist/zod-generator-DnfG5sGQ.mjs +424 -0
  946. package/dist/zod-generator-DnfG5sGQ.mjs.map +1 -0
  947. package/package.json +15 -15
  948. package/src/api/errors.ts +11 -0
  949. package/src/api/handlers/bulk-tag.ts +4 -4
  950. package/src/api/handlers/content.ts +631 -32
  951. package/src/api/handlers/device-flow.ts +74 -21
  952. package/src/api/handlers/index.ts +3 -0
  953. package/src/api/handlers/manifest.ts +81 -5
  954. package/src/api/handlers/media-upload.ts +3 -0
  955. package/src/api/handlers/media.ts +2 -2
  956. package/src/api/handlers/registry.ts +123 -70
  957. package/src/api/handlers/relations.ts +638 -157
  958. package/src/api/handlers/revision.ts +40 -2
  959. package/src/api/handlers/schema.ts +403 -1
  960. package/src/api/handlers/staged-references.ts +208 -0
  961. package/src/api/handlers/update-check.ts +236 -0
  962. package/src/api/handlers/validate-references.ts +146 -0
  963. package/src/api/redirect.ts +9 -1
  964. package/src/api/schemas/content.ts +17 -0
  965. package/src/api/schemas/import.ts +50 -14
  966. package/src/api/schemas/relations.ts +54 -44
  967. package/src/api/schemas/schema.ts +26 -6
  968. package/src/api/setup-complete.ts +49 -1
  969. package/src/api/types.ts +4 -0
  970. package/src/astro/dev-typegen.ts +15 -22
  971. package/src/astro/integration/dev-typegen.ts +32 -3
  972. package/src/astro/integration/index.ts +88 -22
  973. package/src/astro/integration/routes.ts +21 -19
  974. package/src/astro/integration/runtime.ts +33 -7
  975. package/src/astro/integration/virtual-modules.ts +1 -0
  976. package/src/astro/integration/vite-config.ts +16 -8
  977. package/src/astro/middleware/redirect.ts +15 -2
  978. package/src/astro/middleware/request-context.ts +13 -6
  979. package/src/astro/routes/api/admin/bylines/[id]/index.ts +11 -1
  980. package/src/astro/routes/api/admin/bylines/[id]/translations.ts +7 -1
  981. package/src/astro/routes/api/admin/bylines/index.ts +6 -1
  982. package/src/astro/routes/api/admin/core-update.ts +34 -0
  983. package/src/astro/routes/api/admin/plugins/marketplace/[id]/icon.ts +6 -2
  984. package/src/astro/routes/api/admin/themes/marketplace/[id]/thumbnail.ts +6 -2
  985. package/src/astro/routes/api/auth/invite/complete.ts +4 -4
  986. package/src/astro/routes/api/auth/magic-link/verify.ts +4 -1
  987. package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +9 -4
  988. package/src/astro/routes/api/auth/passkey/verify.ts +4 -4
  989. package/src/astro/routes/api/auth/signup/complete.ts +4 -4
  990. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +11 -54
  991. package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
  992. package/src/astro/routes/api/import/wordpress/execute.ts +252 -6
  993. package/src/astro/routes/api/import/wordpress/prepare.ts +1 -2
  994. package/src/astro/routes/api/oauth/device/authorize.ts +33 -4
  995. package/src/astro/routes/api/oauth/register.ts +22 -2
  996. package/src/astro/routes/api/relations/index.ts +4 -4
  997. package/src/astro/routes/api/revisions/[revisionId]/restore.ts +17 -1
  998. package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +6 -2
  999. package/src/astro/routes/api/setup/admin-verify.ts +6 -5
  1000. package/src/astro/routes/api/typegen.ts +4 -46
  1001. package/src/astro/session-user.ts +14 -0
  1002. package/src/astro/types.ts +11 -0
  1003. package/src/bylines/credits.ts +149 -0
  1004. package/src/bylines/index.ts +4 -142
  1005. package/src/cli/commands/export-seed.ts +510 -89
  1006. package/src/cli/commands/seed.ts +2 -0
  1007. package/src/cli/credentials.ts +1 -60
  1008. package/src/cli/index.ts +0 -2
  1009. package/src/client/index.ts +8 -2
  1010. package/src/components/Image.astro +24 -13
  1011. package/src/components/InlinePortableTextEditor.tsx +25 -8
  1012. package/src/components/WidgetArea.astro +3 -2
  1013. package/src/content/converters/portable-text-to-prosemirror.ts +23 -17
  1014. package/src/content/converters/prosemirror-to-portable-text.ts +16 -5
  1015. package/src/content/converters/types.ts +1 -0
  1016. package/src/database/content-datetime.ts +111 -23
  1017. package/src/database/migrations/036_i18n_menus_and_taxonomies.ts +132 -92
  1018. package/src/database/migrations/086_relations_structural.ts +197 -0
  1019. package/src/database/migrations/087_reference_field_relations.ts +407 -0
  1020. package/src/database/migrations/088_cron_oneshot_utc.ts +39 -0
  1021. package/src/database/migrations/089_auto_seed_completion.ts +13 -0
  1022. package/src/database/migrations/runner.ts +8 -0
  1023. package/src/database/reference-backfill.ts +141 -0
  1024. package/src/database/repositories/comment.ts +2 -2
  1025. package/src/database/repositories/content.ts +58 -16
  1026. package/src/database/repositories/plugin-storage.ts +1 -1
  1027. package/src/database/repositories/redirect.ts +7 -2
  1028. package/src/database/repositories/relation.ts +622 -210
  1029. package/src/database/repositories/revision.ts +16 -0
  1030. package/src/database/repositories/types.ts +38 -0
  1031. package/src/database/transaction.ts +12 -1
  1032. package/src/database/types.ts +15 -6
  1033. package/src/db/node-sqlite-compat.ts +63 -37
  1034. package/src/emdash-runtime.ts +149 -46
  1035. package/src/import/wxr-taxonomies.ts +163 -88
  1036. package/src/index.ts +20 -0
  1037. package/src/loader.ts +177 -23
  1038. package/src/mcp/server.ts +90 -8
  1039. package/src/media/usage/activation.ts +18 -9
  1040. package/src/migrations/config-loader.ts +5 -0
  1041. package/src/object-cache/index.ts +19 -7
  1042. package/src/object-cache/types.ts +3 -2
  1043. package/src/plugin-types.ts +7 -0
  1044. package/src/plugins/adapt-sandbox-entry.ts +47 -12
  1045. package/src/plugins/byline-access.ts +158 -0
  1046. package/src/plugins/context.ts +7 -1
  1047. package/src/plugins/cron.ts +27 -4
  1048. package/src/plugins/hooks.ts +47 -0
  1049. package/src/plugins/host.ts +1 -0
  1050. package/src/plugins/index.ts +10 -1
  1051. package/src/plugins/manifest-schema.ts +5 -1
  1052. package/src/plugins/marketplace.ts +48 -36
  1053. package/src/plugins/sandbox/proxy.ts +1 -0
  1054. package/src/plugins/types.ts +95 -0
  1055. package/src/query.ts +464 -27
  1056. package/src/redirects/cache.ts +11 -1
  1057. package/src/redirects/destination.ts +20 -0
  1058. package/src/redirects/loops.ts +10 -6
  1059. package/src/redirects/patterns.ts +12 -30
  1060. package/src/references/field-map.ts +115 -0
  1061. package/src/references/resolve.ts +160 -0
  1062. package/src/references/staged.ts +157 -0
  1063. package/src/references/types.ts +16 -0
  1064. package/src/registry/artifact-fetch.ts +45 -271
  1065. package/src/registry/testing.ts +59 -14
  1066. package/src/request-context.ts +8 -0
  1067. package/src/schema/block-type-registry.ts +1 -1
  1068. package/src/schema/env-types.ts +37 -0
  1069. package/src/schema/project-env-types.ts +41 -0
  1070. package/src/schema/registry.ts +132 -26
  1071. package/src/schema/types.ts +63 -0
  1072. package/src/schema/url-pattern.ts +10 -0
  1073. package/src/schema/zod-generator.ts +78 -2
  1074. package/src/seed/apply.ts +553 -63
  1075. package/src/seed/ownership.ts +15 -0
  1076. package/src/seed/types.ts +36 -2
  1077. package/src/seed/validate.ts +123 -4
  1078. package/src/transfer/analyze/unique-keys.ts +3 -12
  1079. package/src/transfer/analyze/validate.ts +178 -40
  1080. package/src/transfer/analyze/values.ts +116 -2
  1081. package/src/transfer/analyze/write-rules.ts +8 -0
  1082. package/src/transfer/export/readers.ts +12 -8
  1083. package/src/transfer/format/columns.ts +26 -6
  1084. package/src/transfer/format/kinds.ts +21 -5
  1085. package/src/transfer/import/context.ts +8 -1
  1086. package/src/transfer/ops/package-index.ts +1 -1
  1087. package/src/utils/url.ts +58 -3
  1088. package/src/virtual-modules.d.ts +3 -0
  1089. package/dist/action-token-DYwe4Pk0.mjs +0 -26
  1090. package/dist/action-token-DYwe4Pk0.mjs.map +0 -1
  1091. package/dist/activation-LOkDM5WT.mjs +0 -382
  1092. package/dist/activation-LOkDM5WT.mjs.map +0 -1
  1093. package/dist/adapters-B64LbYcB.d.mts +0 -171
  1094. package/dist/adapters-B64LbYcB.d.mts.map +0 -1
  1095. package/dist/allowed-origins-CHB8oZNM.mjs +0 -116
  1096. package/dist/allowed-origins-CHB8oZNM.mjs.map +0 -1
  1097. package/dist/api-CuyNEHZG.mjs +0 -4718
  1098. package/dist/api-CuyNEHZG.mjs.map +0 -1
  1099. package/dist/api-tokens-s4i4aUp_.mjs +0 -166
  1100. package/dist/api-tokens-s4i4aUp_.mjs.map +0 -1
  1101. package/dist/apply-npY1TAhG.mjs +0 -1366
  1102. package/dist/apply-npY1TAhG.mjs.map +0 -1
  1103. package/dist/approvals-CqMfNxak.mjs +0 -460
  1104. package/dist/approvals-CqMfNxak.mjs.map +0 -1
  1105. package/dist/artifact-fetch-DZMOGZ3-.mjs +0 -818
  1106. package/dist/artifact-fetch-DZMOGZ3-.mjs.map +0 -1
  1107. package/dist/astro/routes/api/relations/_id_/translations.d.mts +0 -8
  1108. package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +0 -1
  1109. package/dist/astro/routes/api/relations/_id_/translations.mjs +0 -47
  1110. package/dist/astro/routes/api/relations/_id_/translations.mjs.map +0 -1
  1111. package/dist/audit-RfCugiSB.mjs +0 -127
  1112. package/dist/audit-RfCugiSB.mjs.map +0 -1
  1113. package/dist/authoritative-records-CoJvBXAD.mjs +0 -5172
  1114. package/dist/authoritative-records-CoJvBXAD.mjs.map +0 -1
  1115. package/dist/authorize-seCifOMJ.mjs +0 -49
  1116. package/dist/authorize-seCifOMJ.mjs.map +0 -1
  1117. package/dist/backup-BQRj3afm.mjs +0 -246
  1118. package/dist/backup-BQRj3afm.mjs.map +0 -1
  1119. package/dist/block-type-registry-DUI_3KxT.mjs +0 -6709
  1120. package/dist/block-type-registry-DUI_3KxT.mjs.map +0 -1
  1121. package/dist/block-types-BmZmLmAD.mjs +0 -132
  1122. package/dist/block-types-BmZmLmAD.mjs.map +0 -1
  1123. package/dist/block-values-C_VIPr5t.mjs +0 -175
  1124. package/dist/block-values-C_VIPr5t.mjs.map +0 -1
  1125. package/dist/byline-DYmkXqvo.mjs +0 -909
  1126. package/dist/byline-DYmkXqvo.mjs.map +0 -1
  1127. package/dist/byline-fields-D28AT-Fh.mjs +0 -123
  1128. package/dist/byline-fields-D28AT-Fh.mjs.map +0 -1
  1129. package/dist/byline-registry-gnKscbQX.mjs +0 -406
  1130. package/dist/byline-registry-gnKscbQX.mjs.map +0 -1
  1131. package/dist/bylines-BPwJqoYH.mjs +0 -232
  1132. package/dist/bylines-BPwJqoYH.mjs.map +0 -1
  1133. package/dist/bylines-ukLaYpVZ.mjs +0 -214
  1134. package/dist/bylines-ukLaYpVZ.mjs.map +0 -1
  1135. package/dist/cache-m7UEkRFV.mjs +0 -108
  1136. package/dist/cache-m7UEkRFV.mjs.map +0 -1
  1137. package/dist/canonical-YhEQezjg.mjs +0 -174
  1138. package/dist/canonical-YhEQezjg.mjs.map +0 -1
  1139. package/dist/capture-triggers-kJyl_yyM.mjs +0 -362
  1140. package/dist/capture-triggers-kJyl_yyM.mjs.map +0 -1
  1141. package/dist/challenge-store-ppU6Uv13.mjs +0 -51
  1142. package/dist/challenge-store-ppU6Uv13.mjs.map +0 -1
  1143. package/dist/checksum-B2IINIlN.mjs +0 -162
  1144. package/dist/checksum-B2IINIlN.mjs.map +0 -1
  1145. package/dist/chrome-tags-DApCQSIk.mjs +0 -24
  1146. package/dist/chrome-tags-DApCQSIk.mjs.map +0 -1
  1147. package/dist/chunks-Dms7Uxbt.mjs +0 -25
  1148. package/dist/chunks-Dms7Uxbt.mjs.map +0 -1
  1149. package/dist/collection-deletion-BIm28mo3.mjs +0 -436
  1150. package/dist/collection-deletion-BIm28mo3.mjs.map +0 -1
  1151. package/dist/collection-deletion-processor-Br6rxs3u.mjs +0 -217
  1152. package/dist/collection-deletion-processor-Br6rxs3u.mjs.map +0 -1
  1153. package/dist/collection-slugs-cache-CjGk__zp.mjs +0 -85
  1154. package/dist/collection-slugs-cache-CjGk__zp.mjs.map +0 -1
  1155. package/dist/comment-CrBl22OF.mjs +0 -313
  1156. package/dist/comment-CrBl22OF.mjs.map +0 -1
  1157. package/dist/comment-reaction-JEQ2Fpd8.mjs +0 -85
  1158. package/dist/comment-reaction-JEQ2Fpd8.mjs.map +0 -1
  1159. package/dist/comments-2ah9du9y.mjs +0 -195
  1160. package/dist/comments-2ah9du9y.mjs.map +0 -1
  1161. package/dist/comments-fHZ8ON9O.mjs +0 -99
  1162. package/dist/comments-fHZ8ON9O.mjs.map +0 -1
  1163. package/dist/components-CXbq7CSM.mjs +0 -108
  1164. package/dist/components-CXbq7CSM.mjs.map +0 -1
  1165. package/dist/config-BjEm_3xL.d.mts +0 -6537
  1166. package/dist/config-BjEm_3xL.d.mts.map +0 -1
  1167. package/dist/config-IhybvkIQ.mjs +0 -242
  1168. package/dist/config-IhybvkIQ.mjs.map +0 -1
  1169. package/dist/config-Py43JK9r.d.mts +0 -39
  1170. package/dist/config-Py43JK9r.d.mts.map +0 -1
  1171. package/dist/content-DFaIEDj9.mjs +0 -2281
  1172. package/dist/content-DFaIEDj9.mjs.map +0 -1
  1173. package/dist/content-list-query-Dra4Dalc.d.mts +0 -26
  1174. package/dist/content-list-query-Dra4Dalc.d.mts.map +0 -1
  1175. package/dist/content-policy-DFNw91-d.mjs +0 -46
  1176. package/dist/content-policy-DFNw91-d.mjs.map +0 -1
  1177. package/dist/content-repair-Q8IUrpLL.mjs +0 -442
  1178. package/dist/content-repair-Q8IUrpLL.mjs.map +0 -1
  1179. package/dist/context-BV_7t-Ua.mjs +0 -1921
  1180. package/dist/context-BV_7t-Ua.mjs.map +0 -1
  1181. package/dist/cron-7DCJwPXq.mjs +0 -284
  1182. package/dist/cron-7DCJwPXq.mjs.map +0 -1
  1183. package/dist/dashboard-BP-iJqpd.mjs +0 -151
  1184. package/dist/dashboard-BP-iJqpd.mjs.map +0 -1
  1185. package/dist/default-DQ6vsviu.mjs +0 -81
  1186. package/dist/default-DQ6vsviu.mjs.map +0 -1
  1187. package/dist/deferred-tasks-BPxXUB4x.d.mts +0 -9
  1188. package/dist/deferred-tasks-BPxXUB4x.d.mts.map +0 -1
  1189. package/dist/dev-typegen-CZaPLl3V.mjs +0 -29
  1190. package/dist/dev-typegen-CZaPLl3V.mjs.map +0 -1
  1191. package/dist/device-flow-CRd6DXmW.mjs +0 -466
  1192. package/dist/device-flow-CRd6DXmW.mjs.map +0 -1
  1193. package/dist/digest-BarSh-pN.mjs +0 -194
  1194. package/dist/digest-BarSh-pN.mjs.map +0 -1
  1195. package/dist/direct-executor-D2lNadwo.mjs +0 -104
  1196. package/dist/direct-executor-D2lNadwo.mjs.map +0 -1
  1197. package/dist/dist-BNwANFJR.mjs +0 -810
  1198. package/dist/dist-BNwANFJR.mjs.map +0 -1
  1199. package/dist/email-console-bJn3ctqA.mjs +0 -50
  1200. package/dist/email-console-bJn3ctqA.mjs.map +0 -1
  1201. package/dist/email-locale-CN6WAMx0.mjs +0 -25
  1202. package/dist/email-locale-CN6WAMx0.mjs.map +0 -1
  1203. package/dist/emdash-runtime-CtfnZmPi.mjs +0 -4186
  1204. package/dist/emdash-runtime-CtfnZmPi.mjs.map +0 -1
  1205. package/dist/enrich-Dl3kZ-lP.mjs +0 -194
  1206. package/dist/enrich-Dl3kZ-lP.mjs.map +0 -1
  1207. package/dist/entry-lock-BJYdBfXb.mjs +0 -1097
  1208. package/dist/entry-lock-BJYdBfXb.mjs.map +0 -1
  1209. package/dist/entry-lock-Cf5OoIgN.d.mts +0 -4368
  1210. package/dist/entry-lock-Cf5OoIgN.d.mts.map +0 -1
  1211. package/dist/entry-lock-DHQOxN7R.mjs +0 -163
  1212. package/dist/entry-lock-DHQOxN7R.mjs.map +0 -1
  1213. package/dist/entry-locks-D0foLdjQ.mjs +0 -167
  1214. package/dist/entry-locks-D0foLdjQ.mjs.map +0 -1
  1215. package/dist/error-CfvOHP0M.mjs +0 -90
  1216. package/dist/error-CfvOHP0M.mjs.map +0 -1
  1217. package/dist/errors-BF0_LFhW.mjs +0 -460
  1218. package/dist/errors-BF0_LFhW.mjs.map +0 -1
  1219. package/dist/errors-DgE1zJGG.mjs +0 -120
  1220. package/dist/errors-DgE1zJGG.mjs.map +0 -1
  1221. package/dist/escape-CuaZhZvL.mjs +0 -9
  1222. package/dist/escape-CuaZhZvL.mjs.map +0 -1
  1223. package/dist/fence-CMDXJYc_.mjs +0 -162
  1224. package/dist/fence-CMDXJYc_.mjs.map +0 -1
  1225. package/dist/field-defs-cache-HIgBbqZZ.mjs +0 -77
  1226. package/dist/field-defs-cache-HIgBbqZZ.mjs.map +0 -1
  1227. package/dist/focal-point-Gr34o-4o.mjs +0 -23
  1228. package/dist/focal-point-Gr34o-4o.mjs.map +0 -1
  1229. package/dist/fts-manager-S-K0laoS.mjs +0 -443
  1230. package/dist/fts-manager-S-K0laoS.mjs.map +0 -1
  1231. package/dist/gc-DjKY0Ay1.mjs +0 -75
  1232. package/dist/gc-DjKY0Ay1.mjs.map +0 -1
  1233. package/dist/hash-SDAW6zC-.mjs +0 -37
  1234. package/dist/hash-SDAW6zC-.mjs.map +0 -1
  1235. package/dist/hook-result-B5bXDgS2.d.mts +0 -31
  1236. package/dist/hook-result-B5bXDgS2.d.mts.map +0 -1
  1237. package/dist/hreflang-CbVI4paR.mjs +0 -105
  1238. package/dist/hreflang-CbVI4paR.mjs.map +0 -1
  1239. package/dist/hreflang-D5uNnsGJ.d.mts +0 -50
  1240. package/dist/hreflang-D5uNnsGJ.d.mts.map +0 -1
  1241. package/dist/http-route-dispatch-BitqzwMy.mjs +0 -339
  1242. package/dist/http-route-dispatch-BitqzwMy.mjs.map +0 -1
  1243. package/dist/identity-Be5kzutJ.mjs +0 -35
  1244. package/dist/identity-Be5kzutJ.mjs.map +0 -1
  1245. package/dist/import-YzfKCaco.mjs +0 -2020
  1246. package/dist/import-YzfKCaco.mjs.map +0 -1
  1247. package/dist/index-D-hdtLe8.d.mts +0 -623
  1248. package/dist/index-D-hdtLe8.d.mts.map +0 -1
  1249. package/dist/install-finalization-DfM1fj5x.mjs +0 -58
  1250. package/dist/install-finalization-DfM1fj5x.mjs.map +0 -1
  1251. package/dist/keys-yxLm5l35.mjs +0 -61
  1252. package/dist/keys-yxLm5l35.mjs.map +0 -1
  1253. package/dist/kinds-CRu_T5T5.mjs +0 -961
  1254. package/dist/kinds-CRu_T5T5.mjs.map +0 -1
  1255. package/dist/lifecycle-BzeGPeQ-.mjs +0 -25
  1256. package/dist/lifecycle-BzeGPeQ-.mjs.map +0 -1
  1257. package/dist/load-XgJiE6_3.mjs +0 -28
  1258. package/dist/load-XgJiE6_3.mjs.map +0 -1
  1259. package/dist/loader-BzqeR1ZN.mjs +0 -1086
  1260. package/dist/loader-BzqeR1ZN.mjs.map +0 -1
  1261. package/dist/loops-BQSzv5Zn.mjs +0 -203
  1262. package/dist/loops-BQSzv5Zn.mjs.map +0 -1
  1263. package/dist/manifest-builder-BmSAOOEF.mjs +0 -189
  1264. package/dist/manifest-builder-BmSAOOEF.mjs.map +0 -1
  1265. package/dist/manifest-schema-CY3zng_M.mjs +0 -492
  1266. package/dist/manifest-schema-CY3zng_M.mjs.map +0 -1
  1267. package/dist/media-CPXTbb1R.mjs +0 -373
  1268. package/dist/media-CPXTbb1R.mjs.map +0 -1
  1269. package/dist/media-JXRWDhw3.mjs +0 -294
  1270. package/dist/media-JXRWDhw3.mjs.map +0 -1
  1271. package/dist/media-Pu1L6xir.mjs +0 -408
  1272. package/dist/media-Pu1L6xir.mjs.map +0 -1
  1273. package/dist/media-allowlist-BSoa9Vvm.mjs +0 -44
  1274. package/dist/media-allowlist-BSoa9Vvm.mjs.map +0 -1
  1275. package/dist/media-folders-BE0oo2eX.mjs +0 -210
  1276. package/dist/media-folders-BE0oo2eX.mjs.map +0 -1
  1277. package/dist/media-url-jArBpzIG.mjs +0 -43
  1278. package/dist/media-url-jArBpzIG.mjs.map +0 -1
  1279. package/dist/media-usage-De-zeR9E.mjs +0 -1629
  1280. package/dist/media-usage-De-zeR9E.mjs.map +0 -1
  1281. package/dist/media-usage-activation-HKp7zk7W.mjs +0 -78
  1282. package/dist/media-usage-activation-HKp7zk7W.mjs.map +0 -1
  1283. package/dist/media-usage-work-C2OZLCAd.mjs +0 -586
  1284. package/dist/media-usage-work-C2OZLCAd.mjs.map +0 -1
  1285. package/dist/media-usage-work-DwUNbgvS.mjs +0 -152
  1286. package/dist/media-usage-work-DwUNbgvS.mjs.map +0 -1
  1287. package/dist/menus-BM7BPLOb.mjs +0 -139
  1288. package/dist/menus-BM7BPLOb.mjs.map +0 -1
  1289. package/dist/menus-Cm68rsAq.mjs +0 -3608
  1290. package/dist/menus-Cm68rsAq.mjs.map +0 -1
  1291. package/dist/menus-ITeAbcIF.mjs +0 -753
  1292. package/dist/menus-ITeAbcIF.mjs.map +0 -1
  1293. package/dist/mime-ChLqYwDk.mjs +0 -36
  1294. package/dist/mime-ChLqYwDk.mjs.map +0 -1
  1295. package/dist/mode-CCuKXUci.mjs +0 -23
  1296. package/dist/mode-CCuKXUci.mjs.map +0 -1
  1297. package/dist/node-sqlite-compat-CONMsl-x.mjs +0 -46
  1298. package/dist/node-sqlite-compat-CONMsl-x.mjs.map +0 -1
  1299. package/dist/normalize-CO2P8-iE.mjs +0 -191
  1300. package/dist/normalize-CO2P8-iE.mjs.map +0 -1
  1301. package/dist/oauth-authorization-DlMIL5_h.mjs +0 -274
  1302. package/dist/oauth-authorization-DlMIL5_h.mjs.map +0 -1
  1303. package/dist/oauth-clients-Djq9r_KP.mjs +0 -266
  1304. package/dist/oauth-clients-Djq9r_KP.mjs.map +0 -1
  1305. package/dist/oauth-state-store-BbjnZXNC.mjs +0 -50
  1306. package/dist/oauth-state-store-BbjnZXNC.mjs.map +0 -1
  1307. package/dist/oauth-user-lookup-vue9a64A.mjs +0 -26
  1308. package/dist/oauth-user-lookup-vue9a64A.mjs.map +0 -1
  1309. package/dist/object-cache-CqWNY5uP.mjs +0 -582
  1310. package/dist/object-cache-CqWNY5uP.mjs.map +0 -1
  1311. package/dist/options-SQCHQCPH.d.mts +0 -81
  1312. package/dist/options-SQCHQCPH.d.mts.map +0 -1
  1313. package/dist/parse-CVgO-Qai.d.mts +0 -168
  1314. package/dist/parse-CVgO-Qai.d.mts.map +0 -1
  1315. package/dist/parse-DY6OD1j_.mjs +0 -81
  1316. package/dist/parse-DY6OD1j_.mjs.map +0 -1
  1317. package/dist/passkey-config-X_H8128a.mjs +0 -46
  1318. package/dist/passkey-config-X_H8128a.mjs.map +0 -1
  1319. package/dist/paths-JxokKIbr.mjs +0 -77
  1320. package/dist/paths-JxokKIbr.mjs.map +0 -1
  1321. package/dist/patterns-BhAvqO0S.mjs +0 -145
  1322. package/dist/patterns-BhAvqO0S.mjs.map +0 -1
  1323. package/dist/placeholder-MSEd8gty.d.mts +0 -306
  1324. package/dist/placeholder-MSEd8gty.d.mts.map +0 -1
  1325. package/dist/plan-xjcWrAah.mjs +0 -135
  1326. package/dist/plan-xjcWrAah.mjs.map +0 -1
  1327. package/dist/plugins-DUXUt8B9.mjs +0 -277
  1328. package/dist/plugins-DUXUt8B9.mjs.map +0 -1
  1329. package/dist/policy-CUvwAARc.mjs +0 -45
  1330. package/dist/policy-CUvwAARc.mjs.map +0 -1
  1331. package/dist/portable-text-5O_ZGUjB.mjs +0 -307
  1332. package/dist/portable-text-5O_ZGUjB.mjs.map +0 -1
  1333. package/dist/preview-CIUcPYr6.mjs +0 -107
  1334. package/dist/preview-CIUcPYr6.mjs.map +0 -1
  1335. package/dist/protocol-B97DZaFr.d.mts +0 -61
  1336. package/dist/protocol-B97DZaFr.d.mts.map +0 -1
  1337. package/dist/public-submission-BFBUrqst.mjs +0 -250
  1338. package/dist/public-submission-BFBUrqst.mjs.map +0 -1
  1339. package/dist/public-url-Bn7U0D7-.mjs +0 -101
  1340. package/dist/public-url-Bn7U0D7-.mjs.map +0 -1
  1341. package/dist/query-B48peoRT.mjs +0 -890
  1342. package/dist/query-B48peoRT.mjs.map +0 -1
  1343. package/dist/query-C4IH0uhR.mjs +0 -41
  1344. package/dist/query-C4IH0uhR.mjs.map +0 -1
  1345. package/dist/rate-limit-BZ6nybgc.mjs +0 -120
  1346. package/dist/rate-limit-BZ6nybgc.mjs.map +0 -1
  1347. package/dist/receipt-B4wJj5Jq.mjs +0 -43
  1348. package/dist/receipt-B4wJj5Jq.mjs.map +0 -1
  1349. package/dist/redirect-B29UjdUn.mjs +0 -411
  1350. package/dist/redirect-B29UjdUn.mjs.map +0 -1
  1351. package/dist/redirect-Cd1E7VUt.mjs +0 -17
  1352. package/dist/redirect-Cd1E7VUt.mjs.map +0 -1
  1353. package/dist/redirects-Ca2MPfEG.mjs +0 -446
  1354. package/dist/redirects-Ca2MPfEG.mjs.map +0 -1
  1355. package/dist/redirects-Cv9apQKj.mjs +0 -148
  1356. package/dist/redirects-Cv9apQKj.mjs.map +0 -1
  1357. package/dist/relation-M4NUCb0b.mjs +0 -334
  1358. package/dist/relation-M4NUCb0b.mjs.map +0 -1
  1359. package/dist/relations-CCif47Oq.mjs +0 -403
  1360. package/dist/relations-CCif47Oq.mjs.map +0 -1
  1361. package/dist/relations-CK9CYUyr.mjs +0 -310
  1362. package/dist/relations-CK9CYUyr.mjs.map +0 -1
  1363. package/dist/request-cache-DzLYKm_x.mjs +0 -104
  1364. package/dist/request-cache-DzLYKm_x.mjs.map +0 -1
  1365. package/dist/request-meta-sZXt3sRo.mjs +0 -141
  1366. package/dist/request-meta-sZXt3sRo.mjs.map +0 -1
  1367. package/dist/resolve-2WbQsCvT.mjs +0 -199
  1368. package/dist/resolve-2WbQsCvT.mjs.map +0 -1
  1369. package/dist/route-wire--1hLuACz.mjs +0 -197
  1370. package/dist/route-wire--1hLuACz.mjs.map +0 -1
  1371. package/dist/routes-vrR95WR6.mjs +0 -272
  1372. package/dist/routes-vrR95WR6.mjs.map +0 -1
  1373. package/dist/runner-1y4J9fJB.mjs +0 -5742
  1374. package/dist/runner-1y4J9fJB.mjs.map +0 -1
  1375. package/dist/runner-D5_LzKXI.d.mts +0 -68
  1376. package/dist/runner-D5_LzKXI.d.mts.map +0 -1
  1377. package/dist/schema-BABiRdsH.mjs +0 -13
  1378. package/dist/schema-BABiRdsH.mjs.map +0 -1
  1379. package/dist/schema-Du3MzCG0.mjs +0 -446
  1380. package/dist/schema-Du3MzCG0.mjs.map +0 -1
  1381. package/dist/scopes-Dbk-ElhT.mjs +0 -34
  1382. package/dist/scopes-Dbk-ElhT.mjs.map +0 -1
  1383. package/dist/search-Bt1PL1jf.mjs +0 -448
  1384. package/dist/search-Bt1PL1jf.mjs.map +0 -1
  1385. package/dist/sections-Ddptx_o9.mjs +0 -346
  1386. package/dist/sections-Ddptx_o9.mjs.map +0 -1
  1387. package/dist/seo-CZT2oLtT.mjs +0 -114
  1388. package/dist/seo-CZT2oLtT.mjs.map +0 -1
  1389. package/dist/seo-D5w3-Azy.mjs +0 -133
  1390. package/dist/seo-D5w3-Azy.mjs.map +0 -1
  1391. package/dist/service-DuykXPyW.mjs +0 -150
  1392. package/dist/service-DuykXPyW.mjs.map +0 -1
  1393. package/dist/session-user-BhaVp8w0.mjs +0 -51
  1394. package/dist/session-user-BhaVp8w0.mjs.map +0 -1
  1395. package/dist/settings-B4vDl1fK.mjs +0 -439
  1396. package/dist/settings-B4vDl1fK.mjs.map +0 -1
  1397. package/dist/settings-DYidIB26.mjs +0 -61
  1398. package/dist/settings-DYidIB26.mjs.map +0 -1
  1399. package/dist/settings-Dyj6v8C4.mjs +0 -51
  1400. package/dist/settings-Dyj6v8C4.mjs.map +0 -1
  1401. package/dist/setup-complete-bOogcHWG.mjs +0 -26
  1402. package/dist/setup-complete-bOogcHWG.mjs.map +0 -1
  1403. package/dist/setup-nonce-0EGuKM4s.mjs +0 -25
  1404. package/dist/setup-nonce-0EGuKM4s.mjs.map +0 -1
  1405. package/dist/site-settings-DOgRUoFX.mjs +0 -50
  1406. package/dist/site-settings-DOgRUoFX.mjs.map +0 -1
  1407. package/dist/site-url-BU_bbxwj.mjs +0 -16
  1408. package/dist/site-url-BU_bbxwj.mjs.map +0 -1
  1409. package/dist/snapshot-PawoX-WG.mjs +0 -414
  1410. package/dist/snapshot-PawoX-WG.mjs.map +0 -1
  1411. package/dist/ssrf-CJUnJymJ.mjs +0 -406
  1412. package/dist/ssrf-CJUnJymJ.mjs.map +0 -1
  1413. package/dist/stage-DgrBz_du.mjs +0 -662
  1414. package/dist/stage-DgrBz_du.mjs.map +0 -1
  1415. package/dist/state-DDiPySSG.mjs +0 -153
  1416. package/dist/state-DDiPySSG.mjs.map +0 -1
  1417. package/dist/status-DZKIG4a9.mjs +0 -30
  1418. package/dist/status-DZKIG4a9.mjs.map +0 -1
  1419. package/dist/storage-query-FXJH5pI8.d.mts +0 -1581
  1420. package/dist/storage-query-FXJH5pI8.d.mts.map +0 -1
  1421. package/dist/tar-_1AgTYFu.mjs +0 -449
  1422. package/dist/tar-_1AgTYFu.mjs.map +0 -1
  1423. package/dist/target-_7pn2Gbg.mjs +0 -27
  1424. package/dist/target-_7pn2Gbg.mjs.map +0 -1
  1425. package/dist/taxonomies-C1IwNe8Q.mjs +0 -697
  1426. package/dist/taxonomies-C1IwNe8Q.mjs.map +0 -1
  1427. package/dist/taxonomies-C_XMoRcX.mjs +0 -939
  1428. package/dist/taxonomies-C_XMoRcX.mjs.map +0 -1
  1429. package/dist/taxonomy-C3Fu1YeH.mjs +0 -525
  1430. package/dist/taxonomy-C3Fu1YeH.mjs.map +0 -1
  1431. package/dist/tokens-u78jETkX.mjs +0 -171
  1432. package/dist/tokens-u78jETkX.mjs.map +0 -1
  1433. package/dist/transaction-BcJO4Tmc.mjs +0 -29
  1434. package/dist/transaction-BcJO4Tmc.mjs.map +0 -1
  1435. package/dist/transfer-DIGvR9Af.mjs +0 -166
  1436. package/dist/transfer-DIGvR9Af.mjs.map +0 -1
  1437. package/dist/transfer-DgeCvHnj.mjs +0 -8675
  1438. package/dist/transfer-DgeCvHnj.mjs.map +0 -1
  1439. package/dist/transfer-download-Pml7RMio.mjs +0 -33
  1440. package/dist/transfer-download-Pml7RMio.mjs.map +0 -1
  1441. package/dist/transformations-9gfpwY65.mjs +0 -196
  1442. package/dist/transformations-9gfpwY65.mjs.map +0 -1
  1443. package/dist/transport-BIfH7_hx.d.mts +0 -42
  1444. package/dist/transport-BIfH7_hx.d.mts.map +0 -1
  1445. package/dist/transport-DKWIq53q.mjs +0 -136
  1446. package/dist/transport-DKWIq53q.mjs.map +0 -1
  1447. package/dist/trusted-proxy-tKiVtyTD.mjs +0 -51
  1448. package/dist/trusted-proxy-tKiVtyTD.mjs.map +0 -1
  1449. package/dist/turnstile-DpsoyOfg.mjs +0 -53
  1450. package/dist/turnstile-DpsoyOfg.mjs.map +0 -1
  1451. package/dist/types-B4sUC2p1.d.mts +0 -198
  1452. package/dist/types-B4sUC2p1.d.mts.map +0 -1
  1453. package/dist/types-B7Lmsh1E.d.mts +0 -887
  1454. package/dist/types-B7Lmsh1E.d.mts.map +0 -1
  1455. package/dist/types-BZakh7Ym.mjs +0 -22
  1456. package/dist/types-BZakh7Ym.mjs.map +0 -1
  1457. package/dist/types-B_CppEmv.d.mts +0 -264
  1458. package/dist/types-B_CppEmv.d.mts.map +0 -1
  1459. package/dist/types-BcrBrE6-.mjs +0 -159
  1460. package/dist/types-BcrBrE6-.mjs.map +0 -1
  1461. package/dist/types-BkUg2yHx.mjs +0 -92
  1462. package/dist/types-BkUg2yHx.mjs.map +0 -1
  1463. package/dist/types-CAZgq9fO.d.mts +0 -124
  1464. package/dist/types-CAZgq9fO.d.mts.map +0 -1
  1465. package/dist/types-Cd-O03VG.d.mts +0 -363
  1466. package/dist/types-Cd-O03VG.d.mts.map +0 -1
  1467. package/dist/types-Cr-Kg-3D.d.mts +0 -1641
  1468. package/dist/types-Cr-Kg-3D.d.mts.map +0 -1
  1469. package/dist/types-D2fvWd1i.d.mts +0 -359
  1470. package/dist/types-D2fvWd1i.d.mts.map +0 -1
  1471. package/dist/types-D7HUsguf.mjs +0 -77
  1472. package/dist/types-D7HUsguf.mjs.map +0 -1
  1473. package/dist/types-DA1Te3Oy.d.mts +0 -198
  1474. package/dist/types-DA1Te3Oy.d.mts.map +0 -1
  1475. package/dist/types-DhV6Q5bP.mjs +0 -18
  1476. package/dist/types-DhV6Q5bP.mjs.map +0 -1
  1477. package/dist/types-DnnVSl6Y.d.mts +0 -85
  1478. package/dist/types-DnnVSl6Y.d.mts.map +0 -1
  1479. package/dist/types-VT4-BugW.mjs +0 -16
  1480. package/dist/types-VT4-BugW.mjs.map +0 -1
  1481. package/dist/upload-attempts-B68ZGNu9.mjs +0 -32
  1482. package/dist/upload-attempts-B68ZGNu9.mjs.map +0 -1
  1483. package/dist/url-pattern-CCeZMGOh.mjs +0 -33
  1484. package/dist/url-pattern-CCeZMGOh.mjs.map +0 -1
  1485. package/dist/user-DDSL-sGw.mjs +0 -171
  1486. package/dist/user-DDSL-sGw.mjs.map +0 -1
  1487. package/dist/utils-DdhmO9w9.mjs +0 -439
  1488. package/dist/utils-DdhmO9w9.mjs.map +0 -1
  1489. package/dist/validate-CHosPEhs.mjs +0 -453
  1490. package/dist/validate-CHosPEhs.mjs.map +0 -1
  1491. package/dist/validate-CM79QXYE.d.mts +0 -432
  1492. package/dist/validate-CM79QXYE.d.mts.map +0 -1
  1493. package/dist/validation-BFecQczG.mjs +0 -218
  1494. package/dist/validation-BFecQczG.mjs.map +0 -1
  1495. package/dist/version-BRZXVifl.mjs +0 -9
  1496. package/dist/version-BRZXVifl.mjs.map +0 -1
  1497. package/dist/version-DXsxRrob.mjs +0 -7
  1498. package/dist/version-DXsxRrob.mjs.map +0 -1
  1499. package/dist/widgets-WdV72brA.mjs +0 -126
  1500. package/dist/widgets-WdV72brA.mjs.map +0 -1
  1501. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts +0 -34
  1502. package/dist/wxr-taxonomies-BHTdqkmZ.d.mts.map +0 -1
  1503. package/dist/wxr-taxonomies-DP6ESgMN.mjs +0 -372
  1504. package/dist/wxr-taxonomies-DP6ESgMN.mjs.map +0 -1
  1505. package/dist/zod-generator-D6uE4WiS.mjs +0 -389
  1506. package/dist/zod-generator-D6uE4WiS.mjs.map +0 -1
  1507. package/src/astro/routes/api/relations/[id]/translations.ts +0 -33
  1508. package/src/cli/commands/bundle-utils.ts +0 -408
  1509. package/src/cli/commands/bundle.ts +0 -659
  1510. package/src/cli/commands/plugin-init.ts +0 -417
  1511. package/src/cli/commands/plugin-validate.ts +0 -31
  1512. package/src/cli/commands/plugin.ts +0 -33
  1513. package/src/cli/commands/publish.ts +0 -721
  1514. /package/dist/{api-tokens-CE1ECIg0.mjs → api-tokens-BLz2MtQs.mjs} +0 -0
  1515. /package/dist/{ssrf-DpBH7aOt.mjs → ssrf-tA45vIPX.mjs} +0 -0
@@ -1,1629 +0,0 @@
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