emdash 0.35.0 → 0.37.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 (971) hide show
  1. package/dist/activation-K0kGBWuJ.mjs +382 -0
  2. package/dist/activation-K0kGBWuJ.mjs.map +1 -0
  3. package/dist/{adapters-Bb1vG41D.d.mts → adapters-BDQwg236.d.mts} +6 -4
  4. package/dist/{adapters-Bb1vG41D.d.mts.map → adapters-BDQwg236.d.mts.map} +1 -1
  5. package/dist/{allowed-origins-DW7sYyqg.mjs → allowed-origins-BGglilcs.mjs} +2 -2
  6. package/dist/{allowed-origins-DW7sYyqg.mjs.map → allowed-origins-BGglilcs.mjs.map} +1 -1
  7. package/dist/api/route-utils.d.mts +3 -3
  8. package/dist/api/route-utils.mjs +23 -21
  9. package/dist/api/route-utils.mjs.map +1 -1
  10. package/dist/api/schemas/index.d.mts +2 -2
  11. package/dist/api/schemas/index.mjs +5 -5
  12. package/dist/api-Dz6rgoa3.mjs +10040 -0
  13. package/dist/api-Dz6rgoa3.mjs.map +1 -0
  14. package/dist/{api-tokens-KO24G1Fd.mjs → api-tokens-BSsQACNe.mjs} +2 -2
  15. package/dist/{api-tokens-KO24G1Fd.mjs.map → api-tokens-BSsQACNe.mjs.map} +1 -1
  16. package/dist/{apply-kUDt80-G.mjs → apply-B4SIOxR1.mjs} +34 -35
  17. package/dist/{apply-kUDt80-G.mjs.map → apply-B4SIOxR1.mjs.map} +1 -1
  18. package/dist/astro/image-endpoint.mjs +2 -2
  19. package/dist/astro/image-endpoint.mjs.map +1 -1
  20. package/dist/astro/index.d.mts +12 -12
  21. package/dist/astro/index.d.mts.map +1 -1
  22. package/dist/astro/index.mjs +128 -44
  23. package/dist/astro/index.mjs.map +1 -1
  24. package/dist/astro/middleware/auth.d.mts +10 -10
  25. package/dist/astro/middleware/auth.d.mts.map +1 -1
  26. package/dist/astro/middleware/auth.mjs +10 -7
  27. package/dist/astro/middleware/auth.mjs.map +1 -1
  28. package/dist/astro/middleware/media-usage-write-fence.mjs +2 -2
  29. package/dist/astro/middleware/redirect.mjs +4 -4
  30. package/dist/astro/middleware/request-context.mjs +3 -3
  31. package/dist/astro/middleware/setup.mjs +1 -1
  32. package/dist/astro/middleware.d.mts +11 -12
  33. package/dist/astro/middleware.d.mts.map +1 -1
  34. package/dist/astro/middleware.mjs +237 -1412
  35. package/dist/astro/middleware.mjs.map +1 -1
  36. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +6 -6
  37. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +6 -6
  38. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +3 -3
  39. package/dist/astro/routes/api/admin/api-tokens/index.d.mts.map +1 -1
  40. package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
  41. package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
  42. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
  43. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -9
  44. package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -9
  45. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -9
  46. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +16 -16
  47. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +16 -16
  48. package/dist/astro/routes/api/admin/bylines/index.mjs +16 -16
  49. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +13 -13
  50. package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
  51. package/dist/astro/routes/api/admin/comments/bulk.mjs +10 -10
  52. package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
  53. package/dist/astro/routes/api/admin/comments/index.mjs +10 -10
  54. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
  55. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  56. package/dist/astro/routes/api/admin/media-usage/activation.d.mts +9 -0
  57. package/dist/astro/routes/api/admin/media-usage/activation.d.mts.map +1 -0
  58. package/dist/astro/routes/api/admin/media-usage/activation.mjs +46 -0
  59. package/dist/astro/routes/api/admin/media-usage/activation.mjs.map +1 -0
  60. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +14 -13
  61. package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs.map +1 -1
  62. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +14 -13
  63. package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs.map +1 -1
  64. package/dist/astro/routes/api/admin/media-usage/progress.d.mts +9 -0
  65. package/dist/astro/routes/api/admin/media-usage/progress.d.mts.map +1 -0
  66. package/dist/astro/routes/api/admin/media-usage/progress.mjs +44 -0
  67. package/dist/astro/routes/api/admin/media-usage/progress.mjs.map +1 -0
  68. package/dist/astro/routes/api/admin/media-usage/repair.mjs +16 -11
  69. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  70. package/dist/astro/routes/api/admin/media-usage/work/index.mjs +14 -13
  71. package/dist/astro/routes/api/admin/media-usage/work/index.mjs.map +1 -1
  72. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +14 -13
  73. package/dist/astro/routes/api/admin/media-usage/work/retry.mjs.map +1 -1
  74. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
  75. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs.map +1 -1
  76. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
  77. package/dist/astro/routes/api/admin/oauth-clients/index.mjs.map +1 -1
  78. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +55 -49
  79. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  80. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +55 -49
  81. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  82. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +53 -47
  83. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  84. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +4 -4
  85. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +53 -47
  86. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
  87. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +54 -48
  88. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  89. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +54 -48
  90. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  91. package/dist/astro/routes/api/admin/plugins/index.mjs +53 -47
  92. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  93. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  94. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +53 -47
  95. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  96. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +54 -48
  97. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  98. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +53 -47
  99. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  100. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +54 -48
  101. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  102. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -1
  103. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +60 -50
  104. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  105. package/dist/astro/routes/api/admin/plugins/registry/artifact.d.mts.map +1 -1
  106. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +179 -139
  107. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  108. package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
  109. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +61 -51
  110. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  111. package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts +8 -0
  112. package/dist/astro/routes/api/admin/plugins/registry/verify.d.mts.map +1 -0
  113. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +93 -0
  114. package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -0
  115. package/dist/astro/routes/api/admin/plugins/updates.mjs +53 -47
  116. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  117. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +53 -47
  118. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  119. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
  120. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +53 -47
  121. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  122. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
  123. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
  124. package/dist/astro/routes/api/admin/users/_id_/index.mjs +7 -7
  125. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
  126. package/dist/astro/routes/api/admin/users/index.mjs +6 -6
  127. package/dist/astro/routes/api/auth/dev-bypass.mjs +3 -3
  128. package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
  129. package/dist/astro/routes/api/auth/invite/complete.mjs +11 -11
  130. package/dist/astro/routes/api/auth/invite/index.mjs +8 -8
  131. package/dist/astro/routes/api/auth/invite/register-options.mjs +10 -10
  132. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  133. package/dist/astro/routes/api/auth/magic-link/send.mjs +10 -10
  134. package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
  135. package/dist/astro/routes/api/auth/me.d.mts.map +1 -1
  136. package/dist/astro/routes/api/auth/me.mjs +19 -9
  137. package/dist/astro/routes/api/auth/me.mjs.map +1 -1
  138. package/dist/astro/routes/api/auth/mode.mjs +2 -2
  139. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +4 -4
  140. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  141. package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -6
  142. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  143. package/dist/astro/routes/api/auth/passkey/options.mjs +12 -12
  144. package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -10
  145. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -11
  146. package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -11
  147. package/dist/astro/routes/api/auth/signup/complete.mjs +11 -11
  148. package/dist/astro/routes/api/auth/signup/request.mjs +10 -10
  149. package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
  150. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +14 -14
  151. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +13 -13
  152. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  153. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.d.mts.map +1 -1
  154. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +14 -5
  155. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
  156. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
  157. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +2 -2
  158. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -11
  159. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +13 -10
  160. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  161. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +17 -15
  162. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  163. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +17 -15
  164. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  165. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
  166. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  167. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +8 -8
  168. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +14 -14
  169. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  170. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.d.mts.map +1 -1
  171. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +14 -5
  172. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
  173. package/dist/astro/routes/api/content/_collection_/_id_.mjs +8 -8
  174. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  175. package/dist/astro/routes/api/content/_collection_/index.mjs +8 -8
  176. package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -7
  177. package/dist/astro/routes/api/dashboard.mjs +8 -8
  178. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  179. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  180. package/dist/astro/routes/api/import/probe.mjs +17 -17
  181. package/dist/astro/routes/api/import/wordpress/analyze.mjs +2 -2
  182. package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
  183. package/dist/astro/routes/api/import/wordpress/execute.mjs +13 -13
  184. package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
  185. package/dist/astro/routes/api/import/wordpress/media.mjs +11 -11
  186. package/dist/astro/routes/api/import/wordpress/prepare.mjs +9 -9
  187. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -11
  188. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +12 -10
  189. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  190. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  191. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +17 -17
  192. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
  193. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +27 -27
  194. package/dist/astro/routes/api/manifest.mjs +4 -4
  195. package/dist/astro/routes/api/manifest.mjs.map +1 -1
  196. package/dist/astro/routes/api/mcp.mjs +188 -65
  197. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  198. package/dist/astro/routes/api/media/_id_/confirm.mjs +11 -11
  199. package/dist/astro/routes/api/media/_id_/replace.d.mts +8 -0
  200. package/dist/astro/routes/api/media/_id_/replace.d.mts.map +1 -0
  201. package/dist/astro/routes/api/media/_id_/replace.mjs +91 -0
  202. package/dist/astro/routes/api/media/_id_/replace.mjs.map +1 -0
  203. package/dist/astro/routes/api/media/_id_/upload.mjs +6 -6
  204. package/dist/astro/routes/api/media/_id_/usage.mjs +18 -13
  205. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -1
  206. package/dist/astro/routes/api/media/_id_.d.mts.map +1 -1
  207. package/dist/astro/routes/api/media/_id_.mjs +21 -13
  208. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  209. package/dist/astro/routes/api/media/file/_...key_.d.mts.map +1 -1
  210. package/dist/astro/routes/api/media/file/_...key_.mjs +3 -2
  211. package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
  212. package/dist/astro/routes/api/media/folders/_id_.d.mts +10 -0
  213. package/dist/astro/routes/api/media/folders/_id_.d.mts.map +1 -0
  214. package/dist/astro/routes/api/media/folders/_id_.mjs +52 -0
  215. package/dist/astro/routes/api/media/folders/_id_.mjs.map +1 -0
  216. package/dist/astro/routes/api/media/folders/index.d.mts +9 -0
  217. package/dist/astro/routes/api/media/folders/index.d.mts.map +1 -0
  218. package/dist/astro/routes/api/media/folders/index.mjs +41 -0
  219. package/dist/astro/routes/api/media/folders/index.mjs.map +1 -0
  220. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  221. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  222. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  223. package/dist/astro/routes/api/media/upload-url.mjs +16 -14
  224. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  225. package/dist/astro/routes/api/media.d.mts.map +1 -1
  226. package/dist/astro/routes/api/media.mjs +59 -27
  227. package/dist/astro/routes/api/media.mjs.map +1 -1
  228. package/dist/astro/routes/api/menus/_name_/items/_id_.d.mts.map +1 -1
  229. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +20 -13
  230. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  231. package/dist/astro/routes/api/menus/_name_/items.d.mts.map +1 -1
  232. package/dist/astro/routes/api/menus/_name_/items.mjs +15 -11
  233. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  234. package/dist/astro/routes/api/menus/_name_/reorder.d.mts.map +1 -1
  235. package/dist/astro/routes/api/menus/_name_/reorder.mjs +15 -11
  236. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  237. package/dist/astro/routes/api/menus/_name_/translations.d.mts.map +1 -1
  238. package/dist/astro/routes/api/menus/_name_/translations.mjs +16 -12
  239. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  240. package/dist/astro/routes/api/menus/_name_.d.mts.map +1 -1
  241. package/dist/astro/routes/api/menus/_name_.mjs +21 -14
  242. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  243. package/dist/astro/routes/api/menus/index.d.mts.map +1 -1
  244. package/dist/astro/routes/api/menus/index.mjs +15 -11
  245. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  246. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  247. package/dist/astro/routes/api/oauth/device/authorize.mjs +5 -5
  248. package/dist/astro/routes/api/oauth/device/code.mjs +8 -8
  249. package/dist/astro/routes/api/oauth/device/token.mjs +7 -7
  250. package/dist/astro/routes/api/oauth/register.mjs +2 -2
  251. package/dist/astro/routes/api/oauth/token/refresh.mjs +5 -5
  252. package/dist/astro/routes/api/oauth/token/revoke.mjs +5 -5
  253. package/dist/astro/routes/api/oauth/token.mjs +5 -5
  254. package/dist/astro/routes/api/openapi.json.mjs +253 -40
  255. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  256. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
  257. package/dist/astro/routes/api/redirects/404s/index.mjs +10 -10
  258. package/dist/astro/routes/api/redirects/404s/summary.mjs +10 -10
  259. package/dist/astro/routes/api/redirects/_id_.mjs +11 -11
  260. package/dist/astro/routes/api/redirects/index.mjs +11 -11
  261. package/dist/astro/routes/api/relations/_id_/index.mjs +17 -15
  262. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  263. package/dist/astro/routes/api/relations/_id_/translations.mjs +12 -10
  264. package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -1
  265. package/dist/astro/routes/api/relations/index.mjs +17 -15
  266. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  267. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  268. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
  269. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +53 -47
  270. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  271. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +53 -47
  272. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  273. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +53 -47
  274. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  275. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +53 -47
  276. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  277. package/dist/astro/routes/api/schema/collections/index.mjs +53 -47
  278. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  279. package/dist/astro/routes/api/schema/collections/reorder.mjs +53 -47
  280. package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
  281. package/dist/astro/routes/api/schema/index.mjs +10 -8
  282. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  283. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +53 -47
  284. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  285. package/dist/astro/routes/api/schema/orphans/index.mjs +53 -47
  286. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  287. package/dist/astro/routes/api/search/enable.mjs +10 -10
  288. package/dist/astro/routes/api/search/index.mjs +9 -9
  289. package/dist/astro/routes/api/search/rebuild.mjs +10 -10
  290. package/dist/astro/routes/api/search/stats.mjs +5 -5
  291. package/dist/astro/routes/api/search/suggest.mjs +9 -9
  292. package/dist/astro/routes/api/sections/_slug_.mjs +9 -9
  293. package/dist/astro/routes/api/sections/index.mjs +9 -9
  294. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +6 -6
  295. package/dist/astro/routes/api/settings/backups/archives/index.mjs +5 -5
  296. package/dist/astro/routes/api/settings/backups/export.mjs +6 -6
  297. package/dist/astro/routes/api/settings/backups/index.mjs +7 -7
  298. package/dist/astro/routes/api/settings/email.mjs +5 -5
  299. package/dist/astro/routes/api/settings/email.mjs.map +1 -1
  300. package/dist/astro/routes/api/settings.d.mts.map +1 -1
  301. package/dist/astro/routes/api/settings.mjs +20 -16
  302. package/dist/astro/routes/api/settings.mjs.map +1 -1
  303. package/dist/astro/routes/api/setup/admin-verify.mjs +12 -12
  304. package/dist/astro/routes/api/setup/admin.mjs +11 -11
  305. package/dist/astro/routes/api/setup/dev-bypass.d.mts.map +1 -1
  306. package/dist/astro/routes/api/setup/dev-bypass.mjs +35 -28
  307. package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
  308. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  309. package/dist/astro/routes/api/setup/index.mjs +32 -30
  310. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  311. package/dist/astro/routes/api/setup/status.mjs +3 -3
  312. package/dist/astro/routes/api/snapshot.mjs +7 -7
  313. package/dist/astro/routes/api/taxonomies/_name_/reorder.d.mts.map +1 -1
  314. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +20 -16
  315. package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs.map +1 -1
  316. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts.map +1 -1
  317. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +21 -17
  318. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  319. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.d.mts.map +1 -1
  320. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +25 -18
  321. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  322. package/dist/astro/routes/api/taxonomies/_name_/terms/index.d.mts.map +1 -1
  323. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +20 -16
  324. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  325. package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +14 -14
  326. package/dist/astro/routes/api/taxonomies/_name_.d.mts.map +1 -1
  327. package/dist/astro/routes/api/taxonomies/_name_.mjs +26 -19
  328. package/dist/astro/routes/api/taxonomies/_name_.mjs.map +1 -1
  329. package/dist/astro/routes/api/taxonomies/index.d.mts.map +1 -1
  330. package/dist/astro/routes/api/taxonomies/index.mjs +20 -16
  331. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  332. package/dist/astro/routes/api/themes/preview.mjs +5 -5
  333. package/dist/astro/routes/api/typegen.mjs +4 -4
  334. package/dist/astro/routes/api/well-known/auth.mjs +2 -2
  335. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  336. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  337. package/dist/astro/routes/api/widget-areas/_name_/reorder.d.mts.map +1 -1
  338. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +10 -8
  339. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  340. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.d.mts.map +1 -1
  341. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +17 -13
  342. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  343. package/dist/astro/routes/api/widget-areas/_name_/widgets.d.mts.map +1 -1
  344. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +15 -12
  345. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  346. package/dist/astro/routes/api/widget-areas/_name_.d.mts.map +1 -1
  347. package/dist/astro/routes/api/widget-areas/_name_.mjs +8 -6
  348. package/dist/astro/routes/api/widget-areas/_name_.mjs.map +1 -1
  349. package/dist/astro/routes/api/widget-areas/index.d.mts.map +1 -1
  350. package/dist/astro/routes/api/widget-areas/index.mjs +15 -12
  351. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  352. package/dist/astro/routes/api/widget-components.mjs +2 -2
  353. package/dist/astro/routes/robots.txt.mjs +7 -7
  354. package/dist/astro/routes/sitemap-_collection_.xml.mjs +10 -10
  355. package/dist/astro/routes/sitemap.xml.mjs +8 -8
  356. package/dist/astro/types.d.mts +37 -17
  357. package/dist/astro/types.d.mts.map +1 -1
  358. package/dist/auth/providers/github.d.mts +1 -1
  359. package/dist/auth/providers/google.d.mts +1 -1
  360. package/dist/{authorize-DUElxgOQ.mjs → authorize-Bkf_UHhD.mjs} +2 -2
  361. package/dist/{authorize-DUElxgOQ.mjs.map → authorize-Bkf_UHhD.mjs.map} +1 -1
  362. package/dist/{backup-DWYpJlLj.mjs → backup-rwVAl9NI.mjs} +5 -5
  363. package/dist/{backup-DWYpJlLj.mjs.map → backup-rwVAl9NI.mjs.map} +1 -1
  364. package/dist/{bundle-vn56sLos.mjs → bundle-C8S2Zl6U.mjs} +4 -4
  365. package/dist/{bundle-vn56sLos.mjs.map → bundle-C8S2Zl6U.mjs.map} +1 -1
  366. package/dist/{byline-yjvWq4ip.mjs → byline-DuhF7NWl.mjs} +27 -14
  367. package/dist/byline-DuhF7NWl.mjs.map +1 -0
  368. package/dist/{byline-fields-txaLGoME.mjs → byline-fields-BovY4KYM.mjs} +2 -2
  369. package/dist/{byline-fields-txaLGoME.mjs.map → byline-fields-BovY4KYM.mjs.map} +1 -1
  370. package/dist/{byline-registry-DDun8sxh.mjs → byline-registry-Bpu9-MVs.mjs} +2 -2
  371. package/dist/{byline-registry-DDun8sxh.mjs.map → byline-registry-Bpu9-MVs.mjs.map} +1 -1
  372. package/dist/{bylines-DjXS5p0P.mjs → bylines-CJ5nd6Lw.mjs} +7 -7
  373. package/dist/{bylines-DjXS5p0P.mjs.map → bylines-CJ5nd6Lw.mjs.map} +1 -1
  374. package/dist/{bylines-Bu7pchQ4.mjs → bylines-RwBAeOF1.mjs} +3 -3
  375. package/dist/{bylines-Bu7pchQ4.mjs.map → bylines-RwBAeOF1.mjs.map} +1 -1
  376. package/dist/{cache-C46-3Irl.mjs → cache-BF5Kvn59.mjs} +4 -4
  377. package/dist/{cache-C46-3Irl.mjs.map → cache-BF5Kvn59.mjs.map} +1 -1
  378. package/dist/capture-triggers-CNW1q3HK.mjs +362 -0
  379. package/dist/capture-triggers-CNW1q3HK.mjs.map +1 -0
  380. package/dist/{challenge-store-SIL5DsF2.mjs → challenge-store-DQN_Yrck.mjs} +5 -3
  381. package/dist/challenge-store-DQN_Yrck.mjs.map +1 -0
  382. package/dist/chrome-tags-D8fiZG94.mjs +24 -0
  383. package/dist/chrome-tags-D8fiZG94.mjs.map +1 -0
  384. package/dist/{chunks-fiZ8G9RJ.mjs → chunks-C4szrD8o.mjs} +2 -2
  385. package/dist/{chunks-fiZ8G9RJ.mjs.map → chunks-C4szrD8o.mjs.map} +1 -1
  386. package/dist/cli/index.mjs +37 -53
  387. package/dist/cli/index.mjs.map +1 -1
  388. package/dist/client/cf-access.d.mts +1 -1
  389. package/dist/client/index.d.mts +74 -4
  390. package/dist/client/index.d.mts.map +1 -1
  391. package/dist/client/index.mjs +54 -2
  392. package/dist/client/index.mjs.map +1 -1
  393. package/dist/{collection-deletion-DQPvMD8R.mjs → collection-deletion-Bj07NHbj.mjs} +13 -356
  394. package/dist/collection-deletion-Bj07NHbj.mjs.map +1 -0
  395. package/dist/{comment-reaction-D-2J84UE.mjs → comment-reaction-BhrvSHml.mjs} +2 -2
  396. package/dist/{comment-reaction-D-2J84UE.mjs.map → comment-reaction-BhrvSHml.mjs.map} +1 -1
  397. package/dist/{comment-Dxlep6cE.mjs → comment-vxOzWbZN.mjs} +2 -2
  398. package/dist/{comment-Dxlep6cE.mjs.map → comment-vxOzWbZN.mjs.map} +1 -1
  399. package/dist/{comments-CTfZtLmM.mjs → comments-Ct4ensnf.mjs} +2 -2
  400. package/dist/{comments-CTfZtLmM.mjs.map → comments-Ct4ensnf.mjs.map} +1 -1
  401. package/dist/{components-CQy3lh9x.mjs → components-DJbo1z0S.mjs} +1 -1
  402. package/dist/{components-CQy3lh9x.mjs.map → components-DJbo1z0S.mjs.map} +1 -1
  403. package/dist/{config-COQzTe5Q.d.mts → config-B9eZ340f.d.mts} +1 -1
  404. package/dist/{config-COQzTe5Q.d.mts.map → config-B9eZ340f.d.mts.map} +1 -1
  405. package/dist/config-it29yDLA.mjs +1163 -0
  406. package/dist/config-it29yDLA.mjs.map +1 -0
  407. package/dist/{content-ZHCc1ngN.mjs → content-DjvM0T92.mjs} +86 -45
  408. package/dist/content-DjvM0T92.mjs.map +1 -0
  409. package/dist/{content-list-query-wJ2WN8Vp.d.mts → content-list-query-Btqd4uV2.d.mts} +1 -1
  410. package/dist/{content-list-query-wJ2WN8Vp.d.mts.map → content-list-query-Btqd4uV2.d.mts.map} +1 -1
  411. package/dist/{content-refresh-B_8SJzuU.mjs → content-refresh-Bwp-8yGy.mjs} +1139 -111
  412. package/dist/content-refresh-Bwp-8yGy.mjs.map +1 -0
  413. package/dist/{media-usage-BZCydfvu.mjs → content-repair-Czdp7jz5.mjs} +5 -196
  414. package/dist/content-repair-Czdp7jz5.mjs.map +1 -0
  415. package/dist/{context-ZldbZcle.mjs → context-CX6gxOLW.mjs} +55 -20
  416. package/dist/context-CX6gxOLW.mjs.map +1 -0
  417. package/dist/{cron-Y9aLtgrA.mjs → cron-C6o7VppJ.mjs} +1 -1
  418. package/dist/{cron-Y9aLtgrA.mjs.map → cron-C6o7VppJ.mjs.map} +1 -1
  419. package/dist/{dashboard-DvHbk_cv.mjs → dashboard-C2kTeeRI.mjs} +5 -5
  420. package/dist/{dashboard-DvHbk_cv.mjs.map → dashboard-C2kTeeRI.mjs.map} +1 -1
  421. package/dist/db/index.d.mts +3 -3
  422. package/dist/db/index.mjs +3 -3
  423. package/dist/db/index.mjs.map +1 -1
  424. package/dist/db/libsql-migrations.d.mts +1 -1
  425. package/dist/db/libsql-migrations.mjs +4 -4
  426. package/dist/db/libsql.d.mts +1 -1
  427. package/dist/db/postgres-migrations.d.mts +1 -1
  428. package/dist/db/postgres-migrations.mjs +4 -4
  429. package/dist/db/postgres.d.mts +1 -1
  430. package/dist/db/postgres.d.mts.map +1 -1
  431. package/dist/db/postgres.mjs +19 -3
  432. package/dist/db/postgres.mjs.map +1 -1
  433. package/dist/db/sqlite-migrations.d.mts +1 -1
  434. package/dist/db/sqlite-migrations.mjs +4 -4
  435. package/dist/db/sqlite.d.mts +1 -1
  436. package/dist/db/sqlite.mjs +3 -3
  437. package/dist/db/sqlite.mjs.map +1 -1
  438. package/dist/{default-DdDl3fxv.mjs → default-Clra32mw.mjs} +1 -1
  439. package/dist/{default-DdDl3fxv.mjs.map → default-Clra32mw.mjs.map} +1 -1
  440. package/dist/{deferred-tasks-SDWxrgzJ.d.mts → deferred-tasks-CvDETTJO.d.mts} +1 -1
  441. package/dist/{deferred-tasks-SDWxrgzJ.d.mts.map → deferred-tasks-CvDETTJO.d.mts.map} +1 -1
  442. package/dist/dev-typegen-DzOPfsNj.mjs +29 -0
  443. package/dist/dev-typegen-DzOPfsNj.mjs.map +1 -0
  444. package/dist/{device-flow-C0GdD_z8.mjs → device-flow-D2oCWvLJ.mjs} +5 -5
  445. package/dist/{device-flow-C0GdD_z8.mjs.map → device-flow-D2oCWvLJ.mjs.map} +1 -1
  446. package/dist/{direct-executor-CDXeJCSs.mjs → direct-executor-Bfa5_ToE.mjs} +3 -3
  447. package/dist/{direct-executor-CDXeJCSs.mjs.map → direct-executor-Bfa5_ToE.mjs.map} +1 -1
  448. package/dist/{dist-D_6CKR8z.mjs → dist-89xCrGqi.mjs} +1 -1
  449. package/dist/{dist-D_6CKR8z.mjs.map → dist-89xCrGqi.mjs.map} +1 -1
  450. package/dist/{email-console-BHNjIwiB.mjs → email-console-Dzb6uGYa.mjs} +1 -1
  451. package/dist/{email-console-BHNjIwiB.mjs.map → email-console-Dzb6uGYa.mjs.map} +1 -1
  452. package/dist/{enrich-_ySMEvEE.mjs → enrich-BX0IDp4z.mjs} +3 -3
  453. package/dist/{enrich-_ySMEvEE.mjs.map → enrich-BX0IDp4z.mjs.map} +1 -1
  454. package/dist/{error-DupyJZE2.mjs → error-DFrQjppn.mjs} +2 -2
  455. package/dist/{error-DupyJZE2.mjs.map → error-DFrQjppn.mjs.map} +1 -1
  456. package/dist/{errors-CLUPm7aD.mjs → errors-DsVoDUjJ.mjs} +24 -2
  457. package/dist/errors-DsVoDUjJ.mjs.map +1 -0
  458. package/dist/{escape-DUY2r2Zs.mjs → escape-HmHTC1Is.mjs} +1 -1
  459. package/dist/{escape-DUY2r2Zs.mjs.map → escape-HmHTC1Is.mjs.map} +1 -1
  460. package/dist/{field-defs-cache-BzwBlJrR.mjs → field-defs-cache-BM4SIRqH.mjs} +5 -5
  461. package/dist/{field-defs-cache-BzwBlJrR.mjs.map → field-defs-cache-BM4SIRqH.mjs.map} +1 -1
  462. package/dist/focal-point-BeWFo6Xx.mjs +23 -0
  463. package/dist/focal-point-BeWFo6Xx.mjs.map +1 -0
  464. package/dist/{fts-manager-DyZEohZC.mjs → fts-manager-Do1BlW2r.mjs} +3 -3
  465. package/dist/{fts-manager-DyZEohZC.mjs.map → fts-manager-Do1BlW2r.mjs.map} +1 -1
  466. package/dist/{hash-Cg0TXJPV.mjs → hash-3JJPlHF2.mjs} +1 -1
  467. package/dist/{hash-Cg0TXJPV.mjs.map → hash-3JJPlHF2.mjs.map} +1 -1
  468. package/dist/hook-result-DCh2WUpe.d.mts +31 -0
  469. package/dist/hook-result-DCh2WUpe.d.mts.map +1 -0
  470. package/dist/{hreflang-DwT2E0Sa.d.mts → hreflang-B6hbAuuO.d.mts} +2 -2
  471. package/dist/{hreflang-DwT2E0Sa.d.mts.map → hreflang-B6hbAuuO.d.mts.map} +1 -1
  472. package/dist/{hreflang-BBe83kKa.mjs → hreflang-DQbPZliA.mjs} +7 -7
  473. package/dist/{hreflang-BBe83kKa.mjs.map → hreflang-DQbPZliA.mjs.map} +1 -1
  474. package/dist/{identity-Ys6Dlc9C.mjs → identity-DksvEazf.mjs} +3 -3
  475. package/dist/{identity-Ys6Dlc9C.mjs.map → identity-DksvEazf.mjs.map} +1 -1
  476. package/dist/{import-DPkLmeXO.mjs → import-CJpaBBBT.mjs} +6 -6
  477. package/dist/{import-DPkLmeXO.mjs.map → import-CJpaBBBT.mjs.map} +1 -1
  478. package/dist/{index-BVBZj4-7.d.mts → index-BJNMCWmu.d.mts} +267 -82
  479. package/dist/index-BJNMCWmu.d.mts.map +1 -0
  480. package/dist/{index-C9KuQyO-.d.mts → index-Du8K7bWa.d.mts} +3 -3
  481. package/dist/{index-C9KuQyO-.d.mts.map → index-Du8K7bWa.d.mts.map} +1 -1
  482. package/dist/index.d.mts +22 -21
  483. package/dist/index.mjs +79 -73
  484. package/dist/{init-lock-6b309ZrF.mjs → init-lock-DJkX6Hto.mjs} +1 -1
  485. package/dist/{init-lock-6b309ZrF.mjs.map → init-lock-DJkX6Hto.mjs.map} +1 -1
  486. package/dist/{load-YJ2xl3ra.mjs → load-CawHjTOH.mjs} +2 -2
  487. package/dist/{load-YJ2xl3ra.mjs.map → load-CawHjTOH.mjs.map} +1 -1
  488. package/dist/{loader-CdG_Ci3H.mjs → loader-Z8vl7zTq.mjs} +48 -13
  489. package/dist/loader-Z8vl7zTq.mjs.map +1 -0
  490. package/dist/{manifest-builder-B252yQUf.mjs → manifest-builder-COtzuca2.mjs} +2 -2
  491. package/dist/{manifest-builder-B252yQUf.mjs.map → manifest-builder-COtzuca2.mjs.map} +1 -1
  492. package/dist/{manifest-schema-BXbUAHod.mjs → manifest-schema-BNWwR8Vd.mjs} +5 -5
  493. package/dist/manifest-schema-BNWwR8Vd.mjs.map +1 -0
  494. package/dist/media/image-endpoint.d.mts +4 -2
  495. package/dist/media/image-endpoint.d.mts.map +1 -1
  496. package/dist/media/image-endpoint.mjs +6 -4
  497. package/dist/media/image-endpoint.mjs.map +1 -1
  498. package/dist/media/index.d.mts +1 -1
  499. package/dist/media/index.mjs +13 -3
  500. package/dist/media/index.mjs.map +1 -1
  501. package/dist/media/local-runtime.d.mts +14 -12
  502. package/dist/media/local-runtime.d.mts.map +1 -1
  503. package/dist/media/local-runtime.mjs +12 -6
  504. package/dist/media/local-runtime.mjs.map +1 -1
  505. package/dist/{media-CzhAn2--.mjs → media-BBm8Wg3f.mjs} +69 -12
  506. package/dist/media-BBm8Wg3f.mjs.map +1 -0
  507. package/dist/{media-BWWWb8kg.mjs → media-BHjus86Y.mjs} +133 -9
  508. package/dist/media-BHjus86Y.mjs.map +1 -0
  509. package/dist/{media-allowlist-D6x-Us02.mjs → media-allowlist-CoTBWoDp.mjs} +3 -2
  510. package/dist/media-allowlist-CoTBWoDp.mjs.map +1 -0
  511. package/dist/media-folders-BGkATs8n.mjs +210 -0
  512. package/dist/media-folders-BGkATs8n.mjs.map +1 -0
  513. package/dist/{media-upload-CHBVn6m-.mjs → media-upload-BCidR-EY.mjs} +9 -9
  514. package/dist/{media-upload-CHBVn6m-.mjs.map → media-upload-BCidR-EY.mjs.map} +1 -1
  515. package/dist/{media-url-BvoX88FA.mjs → media-url-DHoPr0hq.mjs} +1 -1
  516. package/dist/{media-url-BvoX88FA.mjs.map → media-url-DHoPr0hq.mjs.map} +1 -1
  517. package/dist/media-usage-CdY5jhSR.mjs +1833 -0
  518. package/dist/media-usage-CdY5jhSR.mjs.map +1 -0
  519. package/dist/media-usage-activation-BgeMtK5C.mjs +78 -0
  520. package/dist/media-usage-activation-BgeMtK5C.mjs.map +1 -0
  521. package/dist/{media-usage-work-CLo_6tct.mjs → media-usage-work-CnGCdHxx.mjs} +4 -4
  522. package/dist/{media-usage-work-CLo_6tct.mjs.map → media-usage-work-CnGCdHxx.mjs.map} +1 -1
  523. package/dist/{media-usage-work-DrCbqBcl.mjs → media-usage-work-D6D9sMCA.mjs} +221 -59
  524. package/dist/media-usage-work-D6D9sMCA.mjs.map +1 -0
  525. package/dist/{media-usage-write-fence-aHEgN1zB.mjs → media-usage-write-fence-hjeD4u7s.mjs} +2 -2
  526. package/dist/{media-usage-write-fence-aHEgN1zB.mjs.map → media-usage-write-fence-hjeD4u7s.mjs.map} +1 -1
  527. package/dist/{menus-DSo5QeW0.mjs → menus-6qSwTNxG.mjs} +375 -107
  528. package/dist/menus-6qSwTNxG.mjs.map +1 -0
  529. package/dist/{menus-TCNSd2vp.mjs → menus-uvPLXMZf.mjs} +4 -4
  530. package/dist/{menus-TCNSd2vp.mjs.map → menus-uvPLXMZf.mjs.map} +1 -1
  531. package/dist/migrations/index.d.mts +1 -1
  532. package/dist/migrations/index.mjs +3 -3
  533. package/dist/{mime-DfIVjNkr.mjs → mime-CUIG6x84.mjs} +1 -1
  534. package/dist/mime-CUIG6x84.mjs.map +1 -0
  535. package/dist/{mode-BDoH_WcF.mjs → mode-DN_WneRx.mjs} +1 -1
  536. package/dist/{mode-BDoH_WcF.mjs.map → mode-DN_WneRx.mjs.map} +1 -1
  537. package/dist/node-sqlite-compat-BuJXIeMz.mjs +46 -0
  538. package/dist/node-sqlite-compat-BuJXIeMz.mjs.map +1 -0
  539. package/dist/{normalize-Bc-s_r-a.mjs → normalize-C2xNjTSG.mjs} +36 -5
  540. package/dist/normalize-C2xNjTSG.mjs.map +1 -0
  541. package/dist/{oauth-authorization-iOikmrJd.mjs → oauth-authorization-Dj6Kwc21.mjs} +5 -5
  542. package/dist/{oauth-authorization-iOikmrJd.mjs.map → oauth-authorization-Dj6Kwc21.mjs.map} +1 -1
  543. package/dist/{oauth-clients-CvI0nHMJ.mjs → oauth-clients-FD7I0J8m.mjs} +1 -1
  544. package/dist/{oauth-clients-CvI0nHMJ.mjs.map → oauth-clients-FD7I0J8m.mjs.map} +1 -1
  545. package/dist/{oauth-state-store-Ba8KZlwW.mjs → oauth-state-store-DkmDOmHs.mjs} +1 -1
  546. package/dist/{oauth-state-store-Ba8KZlwW.mjs.map → oauth-state-store-DkmDOmHs.mjs.map} +1 -1
  547. package/dist/{oauth-user-lookup-C5SQwGYC.mjs → oauth-user-lookup-CvIwGpYd.mjs} +1 -1
  548. package/dist/{oauth-user-lookup-C5SQwGYC.mjs.map → oauth-user-lookup-CvIwGpYd.mjs.map} +1 -1
  549. package/dist/object-cache/memory.d.mts +1 -1
  550. package/dist/{object-cache-71tPfV4A.mjs → object-cache-DVKnyOfy.mjs} +19 -3
  551. package/dist/object-cache-DVKnyOfy.mjs.map +1 -0
  552. package/dist/{options-CBXIHUoT.mjs → options-BHPeIbBd.mjs} +1 -1
  553. package/dist/{options-CBXIHUoT.mjs.map → options-BHPeIbBd.mjs.map} +1 -1
  554. package/dist/{options--hhz-jZ1.d.mts → options-CYb4y7hM.d.mts} +24 -11
  555. package/dist/options-CYb4y7hM.d.mts.map +1 -0
  556. package/dist/page/index.d.mts +2 -2
  557. package/dist/{parse-DFbuc-Fh.mjs → parse-Ckpg-Qfp.mjs} +2 -2
  558. package/dist/{parse-DFbuc-Fh.mjs.map → parse-Ckpg-Qfp.mjs.map} +1 -1
  559. package/dist/{passkey-config-DFAmUyuE.mjs → passkey-config-O_lj3y0k.mjs} +1 -1
  560. package/dist/{passkey-config-DFAmUyuE.mjs.map → passkey-config-O_lj3y0k.mjs.map} +1 -1
  561. package/dist/{patterns-CiyXeDgr.mjs → patterns-D9iDO3j8.mjs} +1 -1
  562. package/dist/{patterns-CiyXeDgr.mjs.map → patterns-D9iDO3j8.mjs.map} +1 -1
  563. package/dist/{placeholder-Dp0K3RkD.d.mts → placeholder-4X9BrRrp.d.mts} +7 -1
  564. package/dist/placeholder-4X9BrRrp.d.mts.map +1 -0
  565. package/dist/plugin-types.d.mts +8 -3
  566. package/dist/plugin-types.d.mts.map +1 -1
  567. package/dist/plugin-utils.d.mts +10 -10
  568. package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
  569. package/dist/plugins/adapt-sandbox-entry.mjs +2 -2
  570. package/dist/{policy-TluUIxuu.mjs → policy-Dhtwntrt.mjs} +2 -2
  571. package/dist/{policy-TluUIxuu.mjs.map → policy-Dhtwntrt.mjs.map} +1 -1
  572. package/dist/{portable-text-imBW5cHK.mjs → portable-text-U85hOafW.mjs} +1 -1
  573. package/dist/{portable-text-imBW5cHK.mjs.map → portable-text-U85hOafW.mjs.map} +1 -1
  574. package/dist/{preview-PW-nOnq4.mjs → preview-B_vJLvf8.mjs} +2 -2
  575. package/dist/{preview-PW-nOnq4.mjs.map → preview-B_vJLvf8.mjs.map} +1 -1
  576. package/dist/{protocol-DjsJHTlK.d.mts → protocol-JdD2YhY9.d.mts} +2 -2
  577. package/dist/{protocol-DjsJHTlK.d.mts.map → protocol-JdD2YhY9.d.mts.map} +1 -1
  578. package/dist/{public-url-CWoFhQT8.mjs → public-url-CarhZJgf.mjs} +1 -1
  579. package/dist/{public-url-CWoFhQT8.mjs.map → public-url-CarhZJgf.mjs.map} +1 -1
  580. package/dist/{query-zTVAR1Sl.mjs → query-BZKZcG5b.mjs} +15 -15
  581. package/dist/{query-zTVAR1Sl.mjs.map → query-BZKZcG5b.mjs.map} +1 -1
  582. package/dist/{query-BWs7O5Il.mjs → query-BndaFxxp.mjs} +5 -5
  583. package/dist/{query-BWs7O5Il.mjs.map → query-BndaFxxp.mjs.map} +1 -1
  584. package/dist/{rate-limit-Bx4g9m3p.mjs → rate-limit-BZmATC6W.mjs} +2 -2
  585. package/dist/{rate-limit-Bx4g9m3p.mjs.map → rate-limit-BZmATC6W.mjs.map} +1 -1
  586. package/dist/{redirect-COsS6SWJ.mjs → redirect-CZkbozu9.mjs} +2 -2
  587. package/dist/{redirect-COsS6SWJ.mjs.map → redirect-CZkbozu9.mjs.map} +1 -1
  588. package/dist/{redirect-BgAOGHDq.mjs → redirect-CzqnLxK-.mjs} +1 -1
  589. package/dist/{redirect-BgAOGHDq.mjs.map → redirect-CzqnLxK-.mjs.map} +1 -1
  590. package/dist/{redirects-DTDHWH31.mjs → redirects-BLNOWQTn.mjs} +64 -29
  591. package/dist/redirects-BLNOWQTn.mjs.map +1 -0
  592. package/dist/{redirects-DyChwDkG.mjs → redirects-CqzNM0KM.mjs} +5 -5
  593. package/dist/{redirects-DyChwDkG.mjs.map → redirects-CqzNM0KM.mjs.map} +1 -1
  594. package/dist/{registry-Cqa2I749.mjs → registry-AZAsRsor.mjs} +30 -126
  595. package/dist/registry-AZAsRsor.mjs.map +1 -0
  596. package/dist/{relation-BnHB0T4J.mjs → relation-04DfKRTO.mjs} +2 -2
  597. package/dist/{relation-BnHB0T4J.mjs.map → relation-04DfKRTO.mjs.map} +1 -1
  598. package/dist/{relations-BBApI4e2.mjs → relations-C4htk5sb.mjs} +7 -7
  599. package/dist/relations-C4htk5sb.mjs.map +1 -0
  600. package/dist/{relations-D5sM5fW0.mjs → relations-CcFwDJdJ.mjs} +4 -4
  601. package/dist/{relations-D5sM5fW0.mjs.map → relations-CcFwDJdJ.mjs.map} +1 -1
  602. package/dist/{relations-BHo5A8Zf.d.mts → relations-DnRK4YIT.d.mts} +347 -54
  603. package/dist/relations-DnRK4YIT.d.mts.map +1 -0
  604. package/dist/{request-cache-BSUptuJR.mjs → request-cache-DH9zdCOD.mjs} +1 -1
  605. package/dist/{request-cache-BSUptuJR.mjs.map → request-cache-DH9zdCOD.mjs.map} +1 -1
  606. package/dist/request-context.d.mts +1 -1
  607. package/dist/{request-meta-DgZJh3zG.mjs → request-meta-DYxLlnmz.mjs} +2 -2
  608. package/dist/{request-meta-DgZJh3zG.mjs.map → request-meta-DYxLlnmz.mjs.map} +1 -1
  609. package/dist/{resolve-DOhVEvty.mjs → resolve-prZ3mP7l.mjs} +1 -1
  610. package/dist/{resolve-DOhVEvty.mjs.map → resolve-prZ3mP7l.mjs.map} +1 -1
  611. package/dist/{runner-C1T11CfC.mjs → runner-BLIDKpmA.mjs} +471 -290
  612. package/dist/runner-BLIDKpmA.mjs.map +1 -0
  613. package/dist/{runner-BYHZn3Jy.d.mts → runner-YKfIMnaF.d.mts} +3 -2
  614. package/dist/runner-YKfIMnaF.d.mts.map +1 -0
  615. package/dist/runtime.d.mts +11 -11
  616. package/dist/runtime.mjs +1 -1
  617. package/dist/{schema-DZ5YVVZj.mjs → schema-CGnBeLiW.mjs} +3 -3
  618. package/dist/{schema-DZ5YVVZj.mjs.map → schema-CGnBeLiW.mjs.map} +1 -1
  619. package/dist/{schema-2AOsSn2v.mjs → schema-DYr-Vd-L.mjs} +36 -6
  620. package/dist/{schema-2AOsSn2v.mjs.map → schema-DYr-Vd-L.mjs.map} +1 -1
  621. package/dist/{scopes-8ClPF2bC.mjs → scopes-BhWvBavj.mjs} +3 -3
  622. package/dist/{scopes-8ClPF2bC.mjs.map → scopes-BhWvBavj.mjs.map} +1 -1
  623. package/dist/{search-u1QYdOCG.mjs → search-C-qDk4kx.mjs} +4 -4
  624. package/dist/{search-u1QYdOCG.mjs.map → search-C-qDk4kx.mjs.map} +1 -1
  625. package/dist/{secrets-BEgsAQEU.mjs → secrets-rEtHt-6z.mjs} +3 -3
  626. package/dist/{secrets-BEgsAQEU.mjs.map → secrets-rEtHt-6z.mjs.map} +1 -1
  627. package/dist/{sections-DmHviGyM.mjs → sections-B_nYvlwn.mjs} +2 -2
  628. package/dist/{sections-DmHviGyM.mjs.map → sections-B_nYvlwn.mjs.map} +1 -1
  629. package/dist/seed/index.d.mts +2 -2
  630. package/dist/seed/index.mjs +25 -23
  631. package/dist/seo/index.d.mts +3 -3
  632. package/dist/seo/index.mjs +17 -15
  633. package/dist/seo/index.mjs.map +1 -1
  634. package/dist/{seo-Dq4G-RrO.mjs → seo-926NRIgt.mjs} +3 -3
  635. package/dist/{seo-Dq4G-RrO.mjs.map → seo-926NRIgt.mjs.map} +1 -1
  636. package/dist/{seo-AFpVvTqr.mjs → seo-CVWkdv6x.mjs} +1 -1
  637. package/dist/{seo-AFpVvTqr.mjs.map → seo-CVWkdv6x.mjs.map} +1 -1
  638. package/dist/{service-BpArayPr.mjs → service-CJl3ZAYs.mjs} +3 -3
  639. package/dist/{service-BpArayPr.mjs.map → service-CJl3ZAYs.mjs.map} +1 -1
  640. package/dist/{session-user-BEorKVT-.mjs → session-user-BlMgqCHS.mjs} +1 -1
  641. package/dist/{session-user-BEorKVT-.mjs.map → session-user-BlMgqCHS.mjs.map} +1 -1
  642. package/dist/{settings-xRdoUZr0.mjs → settings--wobrkkC.mjs} +21 -8
  643. package/dist/settings--wobrkkC.mjs.map +1 -0
  644. package/dist/{settings-DE9xtzqd.mjs → settings-Cwm6o2jY.mjs} +3 -3
  645. package/dist/{settings-DE9xtzqd.mjs.map → settings-Cwm6o2jY.mjs.map} +1 -1
  646. package/dist/{setup-complete-BnT8pq_C.mjs → setup-complete-DQbClIN2.mjs} +2 -2
  647. package/dist/{setup-complete-BnT8pq_C.mjs.map → setup-complete-DQbClIN2.mjs.map} +1 -1
  648. package/dist/{setup-nonce-CBitf_oQ.mjs → setup-nonce-DZCFS2sn.mjs} +1 -1
  649. package/dist/{setup-nonce-CBitf_oQ.mjs.map → setup-nonce-DZCFS2sn.mjs.map} +1 -1
  650. package/dist/{single-flight-cache-B0eLKS6K.mjs → single-flight-cache-BPuGPdcN.mjs} +2 -2
  651. package/dist/{single-flight-cache-B0eLKS6K.mjs.map → single-flight-cache-BPuGPdcN.mjs.map} +1 -1
  652. package/dist/{site-url-DjpIXMXJ.mjs → site-url-BrxA_E9H.mjs} +3 -3
  653. package/dist/{site-url-DjpIXMXJ.mjs.map → site-url-BrxA_E9H.mjs.map} +1 -1
  654. package/dist/{snapshot-BBlGkb2q.mjs → snapshot--OCDTqdb.mjs} +1 -1
  655. package/dist/{snapshot-BBlGkb2q.mjs.map → snapshot--OCDTqdb.mjs.map} +1 -1
  656. package/dist/{ssrf-Cpvg_n3A.mjs → ssrf-5sIM5jzl.mjs} +23 -6
  657. package/dist/{ssrf-Cpvg_n3A.mjs.map → ssrf-5sIM5jzl.mjs.map} +1 -1
  658. package/dist/{state-DYwPue40.mjs → state-BpFVsJZB.mjs} +12 -4
  659. package/dist/state-BpFVsJZB.mjs.map +1 -0
  660. package/dist/{status-CWVYpbD8.mjs → status-B777-dXz.mjs} +1 -1
  661. package/dist/{status-CWVYpbD8.mjs.map → status-B777-dXz.mjs.map} +1 -1
  662. package/dist/storage/local.d.mts +2 -1
  663. package/dist/storage/local.d.mts.map +1 -1
  664. package/dist/storage/local.mjs +1 -1
  665. package/dist/storage/local.mjs.map +1 -1
  666. package/dist/storage/s3.d.mts +2 -1
  667. package/dist/storage/s3.d.mts.map +1 -1
  668. package/dist/storage/s3.mjs +3 -2
  669. package/dist/storage/s3.mjs.map +1 -1
  670. package/dist/{target-DixqqV5i.mjs → target-BmR0iTwz.mjs} +1 -1
  671. package/dist/{target-DixqqV5i.mjs.map → target-BmR0iTwz.mjs.map} +1 -1
  672. package/dist/{taxonomies-OHUIiIpI.mjs → taxonomies-DkAkMupr.mjs} +17 -14
  673. package/dist/taxonomies-DkAkMupr.mjs.map +1 -0
  674. package/dist/{taxonomies-BlrncHi9.mjs → taxonomies-Wfy_Lg12.mjs} +43 -17
  675. package/dist/taxonomies-Wfy_Lg12.mjs.map +1 -0
  676. package/dist/{taxonomy-BqCZ1TdU.mjs → taxonomy-tJepplLL.mjs} +5 -5
  677. package/dist/{taxonomy-BqCZ1TdU.mjs.map → taxonomy-tJepplLL.mjs.map} +1 -1
  678. package/dist/{tokens-C39klX8R.mjs → tokens-BCO1oruF.mjs} +1 -1
  679. package/dist/{tokens-C39klX8R.mjs.map → tokens-BCO1oruF.mjs.map} +1 -1
  680. package/dist/{transaction-NQj4VJ7Z.mjs → transaction-0KOpOyMu.mjs} +2 -1
  681. package/dist/{transaction-NQj4VJ7Z.mjs.map → transaction-0KOpOyMu.mjs.map} +1 -1
  682. package/dist/{transport-DBJwa-Si.mjs → transport-Dr3qtwXC.mjs} +4 -3
  683. package/dist/{transport-DBJwa-Si.mjs.map → transport-Dr3qtwXC.mjs.map} +1 -1
  684. package/dist/{transport-RQE36APG.d.mts → transport-xh6YKW2G.d.mts} +1 -1
  685. package/dist/{transport-RQE36APG.d.mts.map → transport-xh6YKW2G.d.mts.map} +1 -1
  686. package/dist/{trusted-proxy-CEVekpby.mjs → trusted-proxy-BR5F1Otp.mjs} +1 -1
  687. package/dist/{trusted-proxy-CEVekpby.mjs.map → trusted-proxy-BR5F1Otp.mjs.map} +1 -1
  688. package/dist/{types-BW1syrlw.mjs → types-3qNFPlci.mjs} +1 -1
  689. package/dist/{types-BW1syrlw.mjs.map → types-3qNFPlci.mjs.map} +1 -1
  690. package/dist/types-75KIqzL9.mjs.map +1 -1
  691. package/dist/{types-DrJrVCT1.d.mts → types-B6GrPic4.d.mts} +9 -3
  692. package/dist/{types-DrJrVCT1.d.mts.map → types-B6GrPic4.d.mts.map} +1 -1
  693. package/dist/{types-DN64_zzZ.d.mts → types-BuHW4xDE.d.mts} +11 -10
  694. package/dist/types-BuHW4xDE.d.mts.map +1 -0
  695. package/dist/{types-DWRhk9xZ.d.mts → types-C00oyCZp.d.mts} +1 -1
  696. package/dist/{types-DWRhk9xZ.d.mts.map → types-C00oyCZp.d.mts.map} +1 -1
  697. package/dist/{types-BntycPTF.d.mts → types-CDtkNSFQ.d.mts} +1 -1
  698. package/dist/{types-BntycPTF.d.mts.map → types-CDtkNSFQ.d.mts.map} +1 -1
  699. package/dist/{types-Dfk8KI5R.d.mts → types-CPeXo1wF.d.mts} +1 -1
  700. package/dist/{types-Dfk8KI5R.d.mts.map → types-CPeXo1wF.d.mts.map} +1 -1
  701. package/dist/types-CQPWhPxE.mjs.map +1 -1
  702. package/dist/{types-BcqdcT-r.d.mts → types-CXFkwEGC.d.mts} +3 -2
  703. package/dist/types-CXFkwEGC.d.mts.map +1 -0
  704. package/dist/{types-CtzytVXn.mjs → types-DM3vioBY.mjs} +1 -1
  705. package/dist/{types-CtzytVXn.mjs.map → types-DM3vioBY.mjs.map} +1 -1
  706. package/dist/{types-CXnOzDe1.d.mts → types-DczELMop.d.mts} +1 -1
  707. package/dist/{types-CXnOzDe1.d.mts.map → types-DczELMop.d.mts.map} +1 -1
  708. package/dist/types-DfuTR6dL.mjs +3 -0
  709. package/dist/{types-DQIDRKF2.d.mts → types-FV23hEoW.d.mts} +10 -1
  710. package/dist/types-FV23hEoW.d.mts.map +1 -0
  711. package/dist/{types-C2pMvO62.d.mts → types-xDMtUFnO.d.mts} +2 -1
  712. package/dist/types-xDMtUFnO.d.mts.map +1 -0
  713. package/dist/{upload-attempts-D4FS8LT6.mjs → upload-attempts-BsqoQ1fn.mjs} +1 -1
  714. package/dist/{upload-attempts-D4FS8LT6.mjs.map → upload-attempts-BsqoQ1fn.mjs.map} +1 -1
  715. package/dist/{url-pattern-BHS0V5Ng.mjs → url-pattern-D4c2czpJ.mjs} +1 -1
  716. package/dist/{url-pattern-BHS0V5Ng.mjs.map → url-pattern-D4c2czpJ.mjs.map} +1 -1
  717. package/dist/{user-DJZfUJVE.mjs → user-BTZ40aq6.mjs} +2 -2
  718. package/dist/{user-DJZfUJVE.mjs.map → user-BTZ40aq6.mjs.map} +1 -1
  719. package/dist/{utils-D4vD_Y98.mjs → utils-BKvNjjhY.mjs} +1 -1
  720. package/dist/{utils-D4vD_Y98.mjs.map → utils-BKvNjjhY.mjs.map} +1 -1
  721. package/dist/{validate-BMLBvxOC.mjs → validate-DE_LRwo9.mjs} +2 -2
  722. package/dist/{validate-BMLBvxOC.mjs.map → validate-DE_LRwo9.mjs.map} +1 -1
  723. package/dist/{validate-CTqt5nuE.d.mts → validate-DUP27OYD.d.mts} +5 -5
  724. package/dist/{validate-CTqt5nuE.d.mts.map → validate-DUP27OYD.d.mts.map} +1 -1
  725. package/dist/{validation-npvENUCB.mjs → validation-BMImFJ11.mjs} +10 -8
  726. package/dist/{validation-npvENUCB.mjs.map → validation-BMImFJ11.mjs.map} +1 -1
  727. package/dist/version-Bii3suaO.mjs +7 -0
  728. package/dist/{version-DB_fqCSI.mjs.map → version-Bii3suaO.mjs.map} +1 -1
  729. package/dist/{widgets-BD3ho7Rq.mjs → widgets-D3gJ10xU.mjs} +18 -5
  730. package/dist/widgets-D3gJ10xU.mjs.map +1 -0
  731. package/dist/{wxr-taxonomies-Ca68766D.d.mts → wxr-taxonomies-B2Og_6rU.d.mts} +1 -1
  732. package/dist/{wxr-taxonomies-Ca68766D.d.mts.map → wxr-taxonomies-B2Og_6rU.d.mts.map} +1 -1
  733. package/dist/{wxr-taxonomies-B1R3vBoD.mjs → wxr-taxonomies-Cxngsjwo.mjs} +4 -4
  734. package/dist/{wxr-taxonomies-B1R3vBoD.mjs.map → wxr-taxonomies-Cxngsjwo.mjs.map} +1 -1
  735. package/dist/{zod-generator-LC-on_Vb.mjs → zod-generator-BuYSQJB7.mjs} +32 -22
  736. package/dist/zod-generator-BuYSQJB7.mjs.map +1 -0
  737. package/package.json +20 -9
  738. package/src/api/errors.ts +22 -0
  739. package/src/api/handlers/content.ts +49 -11
  740. package/src/api/handlers/index.ts +18 -0
  741. package/src/api/handlers/manifest.ts +161 -12
  742. package/src/api/handlers/media-allowlist.ts +1 -0
  743. package/src/api/handlers/media-folders.ts +130 -0
  744. package/src/api/handlers/media-usage-activation.ts +102 -0
  745. package/src/api/handlers/media-usage.ts +108 -0
  746. package/src/api/handlers/media.ts +92 -2
  747. package/src/api/handlers/registry.ts +483 -561
  748. package/src/api/handlers/taxonomies.ts +16 -9
  749. package/src/api/openapi/document.ts +277 -7
  750. package/src/api/parse.ts +1 -1
  751. package/src/api/schemas/auth.ts +4 -4
  752. package/src/api/schemas/bylines.ts +3 -3
  753. package/src/api/schemas/comments.ts +1 -1
  754. package/src/api/schemas/common.ts +3 -2
  755. package/src/api/schemas/content.ts +78 -22
  756. package/src/api/schemas/media-usage.ts +77 -0
  757. package/src/api/schemas/media.ts +121 -0
  758. package/src/api/schemas/redirects.ts +6 -1
  759. package/src/api/schemas/schema.ts +4 -0
  760. package/src/api/schemas/setup.ts +1 -1
  761. package/src/api/schemas/taxonomies.ts +2 -2
  762. package/src/api/schemas/users.ts +1 -1
  763. package/src/api/types.ts +23 -10
  764. package/src/astro/dev-typegen.ts +35 -0
  765. package/src/astro/image-endpoint.ts +2 -2
  766. package/src/astro/integration/dev-typegen.ts +91 -0
  767. package/src/astro/integration/index.ts +9 -44
  768. package/src/astro/integration/routes.ts +23 -0
  769. package/src/astro/integration/vite-config.ts +23 -9
  770. package/src/astro/middleware/auth.ts +4 -0
  771. package/src/astro/middleware.ts +5 -7
  772. package/src/astro/routes/api/admin/api-tokens/index.ts +4 -1
  773. package/src/astro/routes/api/admin/media-usage/activation.ts +42 -0
  774. package/src/astro/routes/api/admin/media-usage/progress.ts +37 -0
  775. package/src/astro/routes/api/admin/oauth-clients/[id].ts +1 -1
  776. package/src/astro/routes/api/admin/oauth-clients/index.ts +1 -1
  777. package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +4 -0
  778. package/src/astro/routes/api/admin/plugins/registry/artifact.ts +247 -101
  779. package/src/astro/routes/api/admin/plugins/registry/install.ts +4 -0
  780. package/src/astro/routes/api/admin/plugins/registry/verify.ts +60 -0
  781. package/src/astro/routes/api/auth/me.ts +14 -2
  782. package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +8 -2
  783. package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -1
  784. package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +6 -2
  785. package/src/astro/routes/api/manifest.ts +1 -1
  786. package/src/astro/routes/api/media/[id]/replace.ts +114 -0
  787. package/src/astro/routes/api/media/[id].ts +3 -0
  788. package/src/astro/routes/api/media/file/[...key].ts +4 -1
  789. package/src/astro/routes/api/media/folders/[id].ts +55 -0
  790. package/src/astro/routes/api/media/folders/index.ts +37 -0
  791. package/src/astro/routes/api/media/upload-url.ts +8 -4
  792. package/src/astro/routes/api/media.ts +66 -10
  793. package/src/astro/routes/api/menus/[name]/items/[id].ts +7 -2
  794. package/src/astro/routes/api/menus/[name]/items.ts +4 -1
  795. package/src/astro/routes/api/menus/[name]/reorder.ts +4 -1
  796. package/src/astro/routes/api/menus/[name]/translations.ts +4 -1
  797. package/src/astro/routes/api/menus/[name].ts +7 -2
  798. package/src/astro/routes/api/menus/index.ts +4 -1
  799. package/src/astro/routes/api/settings/email.ts +1 -1
  800. package/src/astro/routes/api/settings.ts +4 -1
  801. package/src/astro/routes/api/setup/dev-bypass.ts +12 -0
  802. package/src/astro/routes/api/taxonomies/[name]/reorder.ts +4 -1
  803. package/src/astro/routes/api/taxonomies/[name]/terms/[slug]/translations.ts +4 -1
  804. package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +7 -2
  805. package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +4 -1
  806. package/src/astro/routes/api/taxonomies/[name].ts +7 -2
  807. package/src/astro/routes/api/taxonomies/index.ts +4 -1
  808. package/src/astro/routes/api/widget-areas/[name]/reorder.ts +3 -1
  809. package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +5 -2
  810. package/src/astro/routes/api/widget-areas/[name]/widgets.ts +3 -1
  811. package/src/astro/routes/api/widget-areas/[name].ts +3 -1
  812. package/src/astro/routes/api/widget-areas/index.ts +3 -1
  813. package/src/astro/types.ts +34 -6
  814. package/src/auth/challenge-store.ts +3 -1
  815. package/src/aws-sdk.d.ts +1 -0
  816. package/src/cache/chrome-tags.ts +24 -0
  817. package/src/client/index.ts +140 -2
  818. package/src/client/transport.ts +6 -2
  819. package/src/components/EmDashImage.astro +156 -51
  820. package/src/components/EmDashMedia.astro +2 -1
  821. package/src/components/Gallery.astro +7 -0
  822. package/src/components/InlinePortableTextEditor.tsx +136 -2
  823. package/src/components/LiveSearch.astro +23 -0
  824. package/src/components/inline-code-block.tsx +180 -49
  825. package/src/components/widgets/Archives.astro +2 -37
  826. package/src/content/converters/gallery.ts +2 -0
  827. package/src/content/converters/index.ts +2 -0
  828. package/src/content/converters/mark-safety.ts +1 -0
  829. package/src/content/converters/portable-text-identity.ts +139 -0
  830. package/src/content/converters/portable-text-to-prosemirror.ts +202 -69
  831. package/src/content/converters/prosemirror-to-portable-text.ts +96 -25
  832. package/src/content/converters/types.ts +3 -0
  833. package/src/database/connection.ts +2 -31
  834. package/src/database/index.ts +1 -1
  835. package/src/database/json-recordset.ts +16 -0
  836. package/src/database/migrations/017_authorization_codes.ts +14 -4
  837. package/src/database/migrations/019_i18n.ts +1 -1
  838. package/src/database/migrations/071_restore_content_bylines_table.ts +43 -0
  839. package/src/database/migrations/072_media_folders.ts +72 -0
  840. package/src/database/migrations/073_media_focal_point.ts +57 -0
  841. package/src/database/migrations/074_content_deleted_scheduled_index.ts +55 -0
  842. package/src/database/migrations/runner.ts +11 -3
  843. package/src/database/repositories/byline.ts +32 -16
  844. package/src/database/repositories/content.ts +119 -51
  845. package/src/database/repositories/media-folders.ts +115 -0
  846. package/src/database/repositories/media-usage-work.ts +395 -111
  847. package/src/database/repositories/media-usage.ts +1104 -47
  848. package/src/database/repositories/media.ts +156 -29
  849. package/src/database/repositories/plugin-storage.ts +74 -9
  850. package/src/database/repositories/types.ts +8 -7
  851. package/src/database/transaction.ts +1 -0
  852. package/src/database/types.ts +13 -0
  853. package/src/db/adapters.ts +10 -3
  854. package/src/db/node-sqlite-compat.ts +78 -0
  855. package/src/db/postgres.ts +23 -0
  856. package/src/db/sqlite.ts +3 -3
  857. package/src/emdash-runtime.ts +186 -251
  858. package/src/fields/boolean.ts +1 -1
  859. package/src/fields/datetime.ts +1 -1
  860. package/src/fields/file.ts +1 -1
  861. package/src/fields/image.ts +7 -1
  862. package/src/fields/integer.ts +1 -1
  863. package/src/fields/json.ts +1 -1
  864. package/src/fields/multiselect.ts +1 -1
  865. package/src/fields/number.ts +1 -1
  866. package/src/fields/portable-text.ts +1 -1
  867. package/src/fields/richtext.ts +1 -1
  868. package/src/fields/select.ts +1 -1
  869. package/src/fields/slug.ts +1 -1
  870. package/src/fields/text.ts +1 -1
  871. package/src/fields/textarea.ts +1 -1
  872. package/src/fields/types.ts +8 -4
  873. package/src/index.ts +30 -3
  874. package/src/loader.ts +63 -10
  875. package/src/mcp/server.ts +228 -24
  876. package/src/media/focal-point.ts +37 -0
  877. package/src/media/image-endpoint.ts +5 -2
  878. package/src/media/local-runtime.ts +8 -0
  879. package/src/media/mime.ts +1 -0
  880. package/src/media/normalize.ts +25 -4
  881. package/src/media/types.ts +10 -0
  882. package/src/media/usage/activation.ts +162 -35
  883. package/src/media/usage/capture-triggers.ts +19 -3
  884. package/src/media/usage/cleanup.ts +9 -8
  885. package/src/media/usage/collection-deletion-processor.ts +7 -3
  886. package/src/media/usage/collection-deletion.ts +10 -0
  887. package/src/media/usage/content-refresh.ts +258 -39
  888. package/src/media/usage/content-snapshots.ts +128 -31
  889. package/src/media/usage/extractor.ts +32 -13
  890. package/src/media/usage/maintenance-engine.ts +166 -0
  891. package/src/media/usage/reconciliation-processor.ts +106 -29
  892. package/src/media/usage/reconciliation.ts +90 -7
  893. package/src/media/usage/work-processor.ts +342 -101
  894. package/src/menus/index.ts +16 -0
  895. package/src/object-cache/index.ts +44 -2
  896. package/src/plugin-types.ts +18 -1
  897. package/src/plugins/hooks.ts +4 -1
  898. package/src/plugins/index.ts +7 -0
  899. package/src/plugins/manager.ts +2 -1
  900. package/src/plugins/manifest-schema.ts +1 -1
  901. package/src/plugins/routes.ts +3 -1
  902. package/src/plugins/sandbox/hook-result.ts +52 -0
  903. package/src/plugins/sandbox/index.ts +10 -0
  904. package/src/plugins/save-rejection.ts +20 -0
  905. package/src/plugins/scheduler/node.ts +1 -13
  906. package/src/plugins/scheduler/types.ts +0 -2
  907. package/src/plugins/state.ts +13 -3
  908. package/src/plugins/types.ts +6 -0
  909. package/src/registry/artifact-checksum.ts +15 -0
  910. package/src/registry/artifact-fetch.ts +530 -0
  911. package/src/registry/artifact-verification.ts +85 -0
  912. package/src/registry/authoritative-records.ts +180 -0
  913. package/src/registry/config.ts +24 -6
  914. package/src/registry/record-labels.ts +28 -0
  915. package/src/registry/types.ts +12 -15
  916. package/src/schema/registry.ts +26 -3
  917. package/src/schema/types.ts +1 -0
  918. package/src/schema/zod-generator.ts +28 -17
  919. package/src/security/ssrf.ts +26 -4
  920. package/src/seed/apply.ts +4 -4
  921. package/src/settings/index.ts +16 -0
  922. package/src/storage/local.ts +1 -0
  923. package/src/storage/s3.ts +2 -0
  924. package/src/storage/types.ts +2 -0
  925. package/src/taxonomies/index.ts +40 -20
  926. package/src/ui.ts +2 -0
  927. package/src/widgets/archives.ts +67 -0
  928. package/src/widgets/index.ts +16 -0
  929. package/dist/api-BeBglVxU.mjs +0 -4695
  930. package/dist/api-BeBglVxU.mjs.map +0 -1
  931. package/dist/byline-yjvWq4ip.mjs.map +0 -1
  932. package/dist/challenge-store-SIL5DsF2.mjs.map +0 -1
  933. package/dist/collection-deletion-DQPvMD8R.mjs.map +0 -1
  934. package/dist/content-ZHCc1ngN.mjs.map +0 -1
  935. package/dist/content-refresh-B_8SJzuU.mjs.map +0 -1
  936. package/dist/context-ZldbZcle.mjs.map +0 -1
  937. package/dist/errors-CLUPm7aD.mjs.map +0 -1
  938. package/dist/index-BVBZj4-7.d.mts.map +0 -1
  939. package/dist/loader-CdG_Ci3H.mjs.map +0 -1
  940. package/dist/manifest-schema-BXbUAHod.mjs.map +0 -1
  941. package/dist/media-BWWWb8kg.mjs.map +0 -1
  942. package/dist/media-CzhAn2--.mjs.map +0 -1
  943. package/dist/media-allowlist-D6x-Us02.mjs.map +0 -1
  944. package/dist/media-usage-BZCydfvu.mjs.map +0 -1
  945. package/dist/media-usage-work-DrCbqBcl.mjs.map +0 -1
  946. package/dist/menus-DSo5QeW0.mjs.map +0 -1
  947. package/dist/mime-DfIVjNkr.mjs.map +0 -1
  948. package/dist/normalize-Bc-s_r-a.mjs.map +0 -1
  949. package/dist/object-cache-71tPfV4A.mjs.map +0 -1
  950. package/dist/options--hhz-jZ1.d.mts.map +0 -1
  951. package/dist/placeholder-Dp0K3RkD.d.mts.map +0 -1
  952. package/dist/redirects-DTDHWH31.mjs.map +0 -1
  953. package/dist/registry-Cqa2I749.mjs.map +0 -1
  954. package/dist/relations-BBApI4e2.mjs.map +0 -1
  955. package/dist/relations-BHo5A8Zf.d.mts.map +0 -1
  956. package/dist/runner-BYHZn3Jy.d.mts.map +0 -1
  957. package/dist/runner-C1T11CfC.mjs.map +0 -1
  958. package/dist/settings-xRdoUZr0.mjs.map +0 -1
  959. package/dist/state-DYwPue40.mjs.map +0 -1
  960. package/dist/taxonomies-BlrncHi9.mjs.map +0 -1
  961. package/dist/taxonomies-OHUIiIpI.mjs.map +0 -1
  962. package/dist/types-BcqdcT-r.d.mts.map +0 -1
  963. package/dist/types-C2pMvO62.d.mts.map +0 -1
  964. package/dist/types-CP1CflWf.mjs +0 -3
  965. package/dist/types-DN64_zzZ.d.mts.map +0 -1
  966. package/dist/types-DQIDRKF2.d.mts.map +0 -1
  967. package/dist/version-DB_fqCSI.mjs +0 -7
  968. package/dist/widgets-BD3ho7Rq.mjs.map +0 -1
  969. package/dist/zod-generator-LC-on_Vb.mjs.map +0 -1
  970. /package/dist/{api-tokens-rIXC6LdE.mjs → api-tokens-BfYts-sq.mjs} +0 -0
  971. /package/dist/{ssrf-DpXgKsna.mjs → ssrf-Dg3cIT-b.mjs} +0 -0
@@ -25,8 +25,8 @@ var __exportAll = (all, no_symbols) => {
25
25
  //#endregion
26
26
  //#region src/database/migrations/001_initial.ts
27
27
  var _001_initial_exports = /* @__PURE__ */ __exportAll({
28
- down: () => down$68,
29
- up: () => up$68
28
+ down: () => down$72,
29
+ up: () => up$72
30
30
  });
31
31
  /**
32
32
  * Initial schema migration
@@ -35,7 +35,7 @@ var _001_initial_exports = /* @__PURE__ */ __exportAll({
35
35
  * by the SchemaRegistry when collections are added via the admin UI.
36
36
  * This migration only creates system tables.
37
37
  */
38
- async function up$68(db) {
38
+ async function up$72(db) {
39
39
  await db.schema.createTable("revisions").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("collection", "text", (col) => col.notNull()).addColumn("entry_id", "text", (col) => col.notNull()).addColumn("data", "text", (col) => col.notNull()).addColumn("author_id", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
40
40
  await db.schema.createIndex("idx_revisions_entry").ifNotExists().on("revisions").columns(["collection", "entry_id"]).execute();
41
41
  await db.schema.createTable("taxonomies").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull()).addColumn("slug", "text", (col) => col.notNull()).addColumn("label", "text", (col) => col.notNull()).addColumn("parent_id", "text").addColumn("data", "text").addUniqueConstraint("taxonomies_name_slug_unique", ["name", "slug"]).addForeignKeyConstraint("taxonomies_parent_fk", ["parent_id"], "taxonomies", ["id"], (cb) => cb.onDelete("set null")).execute();
@@ -55,7 +55,7 @@ async function up$68(db) {
55
55
  await db.schema.createIndex("idx_audit_action").ifNotExists().on("audit_logs").column("action").execute();
56
56
  await db.schema.createIndex("idx_audit_timestamp").ifNotExists().on("audit_logs").column("timestamp").execute();
57
57
  }
58
- async function down$68(db) {
58
+ async function down$72(db) {
59
59
  await db.schema.dropTable("audit_logs").execute();
60
60
  await db.schema.dropTable("options").execute();
61
61
  await db.schema.dropTable("users").execute();
@@ -68,26 +68,26 @@ async function down$68(db) {
68
68
  //#endregion
69
69
  //#region src/database/migrations/002_media_status.ts
70
70
  var _002_media_status_exports = /* @__PURE__ */ __exportAll({
71
- down: () => down$67,
72
- up: () => up$67
71
+ down: () => down$71,
72
+ up: () => up$71
73
73
  });
74
74
  /**
75
75
  * Add status column to media table for tracking upload state.
76
76
  * Status values: 'pending' | 'ready' | 'failed'
77
77
  */
78
- async function up$67(db) {
78
+ async function up$71(db) {
79
79
  await db.schema.alterTable("media").addColumn("status", "text", (col) => col.notNull().defaultTo("ready")).execute();
80
80
  await db.schema.createIndex("idx_media_status").on("media").column("status").execute();
81
81
  }
82
- async function down$67(db) {
82
+ async function down$71(db) {
83
83
  await db.schema.dropIndex("idx_media_status").execute();
84
84
  }
85
85
 
86
86
  //#endregion
87
87
  //#region src/database/migrations/003_schema_registry.ts
88
88
  var _003_schema_registry_exports = /* @__PURE__ */ __exportAll({
89
- down: () => down$66,
90
- up: () => up$66
89
+ down: () => down$70,
90
+ up: () => up$70
91
91
  });
92
92
  /**
93
93
  * Migration: Schema Registry Tables
@@ -95,14 +95,14 @@ var _003_schema_registry_exports = /* @__PURE__ */ __exportAll({
95
95
  * Creates the schema registry tables that store collection and field definitions.
96
96
  * This enables dynamic schema management where D1 is the source of truth.
97
97
  */
98
- async function up$66(db) {
98
+ async function up$70(db) {
99
99
  await db.schema.createTable("_emdash_collections").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("label_singular", "text").addColumn("description", "text").addColumn("icon", "text").addColumn("supports", "text").addColumn("source", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
100
100
  await db.schema.createTable("_emdash_fields").addColumn("id", "text", (col) => col.primaryKey()).addColumn("collection_id", "text", (col) => col.notNull()).addColumn("slug", "text", (col) => col.notNull()).addColumn("label", "text", (col) => col.notNull()).addColumn("type", "text", (col) => col.notNull()).addColumn("column_type", "text", (col) => col.notNull()).addColumn("required", "integer", (col) => col.defaultTo(0)).addColumn("unique", "integer", (col) => col.defaultTo(0)).addColumn("default_value", "text").addColumn("validation", "text").addColumn("widget", "text").addColumn("options", "text").addColumn("sort_order", "integer", (col) => col.defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("fields_collection_fk", ["collection_id"], "_emdash_collections", ["id"], (cb) => cb.onDelete("cascade")).execute();
101
101
  await db.schema.createIndex("idx_fields_collection_slug").on("_emdash_fields").columns(["collection_id", "slug"]).unique().execute();
102
102
  await db.schema.createIndex("idx_fields_collection").on("_emdash_fields").column("collection_id").execute();
103
103
  await db.schema.createIndex("idx_fields_sort").on("_emdash_fields").columns(["collection_id", "sort_order"]).execute();
104
104
  }
105
- async function down$66(db) {
105
+ async function down$70(db) {
106
106
  await db.schema.dropTable("_emdash_fields").execute();
107
107
  await db.schema.dropTable("_emdash_collections").execute();
108
108
  }
@@ -110,8 +110,8 @@ async function down$66(db) {
110
110
  //#endregion
111
111
  //#region src/database/migrations/004_plugins.ts
112
112
  var _004_plugins_exports = /* @__PURE__ */ __exportAll({
113
- down: () => down$65,
114
- up: () => up$65
113
+ down: () => down$69,
114
+ up: () => up$69
115
115
  });
116
116
  /**
117
117
  * Migration: Plugin System Tables
@@ -121,7 +121,7 @@ var _004_plugins_exports = /* @__PURE__ */ __exportAll({
121
121
  *
122
122
  * @see PLUGIN-SYSTEM.md § Plugin Storage
123
123
  */
124
- async function up$65(db) {
124
+ async function up$69(db) {
125
125
  await db.schema.createTable("_plugin_storage").addColumn("plugin_id", "text", (col) => col.notNull()).addColumn("collection", "text", (col) => col.notNull()).addColumn("id", "text", (col) => col.notNull()).addColumn("data", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addPrimaryKeyConstraint("pk_plugin_storage", [
126
126
  "plugin_id",
127
127
  "collection",
@@ -139,7 +139,7 @@ async function up$65(db) {
139
139
  "index_name"
140
140
  ]).execute();
141
141
  }
142
- async function down$65(db) {
142
+ async function down$69(db) {
143
143
  await db.schema.dropTable("_plugin_indexes").execute();
144
144
  await db.schema.dropTable("_plugin_state").execute();
145
145
  await db.schema.dropTable("_plugin_storage").execute();
@@ -148,8 +148,8 @@ async function down$65(db) {
148
148
  //#endregion
149
149
  //#region src/database/migrations/005_menus.ts
150
150
  var _005_menus_exports = /* @__PURE__ */ __exportAll({
151
- down: () => down$64,
152
- up: () => up$64
151
+ down: () => down$68,
152
+ up: () => up$68
153
153
  });
154
154
  /**
155
155
  * Navigation Menus migration
@@ -157,13 +157,13 @@ var _005_menus_exports = /* @__PURE__ */ __exportAll({
157
157
  * Creates tables for admin-editable navigation menus.
158
158
  * Menu items can reference content entries, taxonomy terms, or custom URLs.
159
159
  */
160
- async function up$64(db) {
160
+ async function up$68(db) {
161
161
  await db.schema.createTable("_emdash_menus").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
162
162
  await db.schema.createTable("_emdash_menu_items").addColumn("id", "text", (col) => col.primaryKey()).addColumn("menu_id", "text", (col) => col.notNull()).addColumn("parent_id", "text").addColumn("sort_order", "integer", (col) => col.notNull().defaultTo(0)).addColumn("type", "text", (col) => col.notNull()).addColumn("reference_collection", "text").addColumn("reference_id", "text").addColumn("custom_url", "text").addColumn("label", "text", (col) => col.notNull()).addColumn("title_attr", "text").addColumn("target", "text").addColumn("css_classes", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("menu_items_menu_fk", ["menu_id"], "_emdash_menus", ["id"], (cb) => cb.onDelete("cascade")).addForeignKeyConstraint("menu_items_parent_fk", ["parent_id"], "_emdash_menu_items", ["id"], (cb) => cb.onDelete("cascade")).execute();
163
163
  await db.schema.createIndex("idx_menu_items_menu").on("_emdash_menu_items").columns(["menu_id", "sort_order"]).execute();
164
164
  await db.schema.createIndex("idx_menu_items_parent").on("_emdash_menu_items").column("parent_id").execute();
165
165
  }
166
- async function down$64(db) {
166
+ async function down$68(db) {
167
167
  await db.schema.dropTable("_emdash_menu_items").execute();
168
168
  await db.schema.dropTable("_emdash_menus").execute();
169
169
  }
@@ -171,8 +171,8 @@ async function down$64(db) {
171
171
  //#endregion
172
172
  //#region src/database/migrations/006_taxonomy_defs.ts
173
173
  var _006_taxonomy_defs_exports = /* @__PURE__ */ __exportAll({
174
- down: () => down$63,
175
- up: () => up$63
174
+ down: () => down$67,
175
+ up: () => up$67
176
176
  });
177
177
  /**
178
178
  * Taxonomy definitions migration
@@ -180,7 +180,7 @@ var _006_taxonomy_defs_exports = /* @__PURE__ */ __exportAll({
180
180
  * Adds _emdash_taxonomy_defs table to store taxonomy definitions (category, tag, custom)
181
181
  * and seeds default category and tag taxonomies.
182
182
  */
183
- async function up$63(db) {
183
+ async function up$67(db) {
184
184
  await db.schema.createTable("_emdash_taxonomy_defs").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("label_singular", "text").addColumn("hierarchical", "integer", (col) => col.defaultTo(0)).addColumn("collections", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
185
185
  await db.insertInto("_emdash_taxonomy_defs").values([{
186
186
  id: "taxdef_category",
@@ -198,22 +198,22 @@ async function up$63(db) {
198
198
  collections: JSON.stringify(["posts"])
199
199
  }]).execute();
200
200
  }
201
- async function down$63(db) {
201
+ async function down$67(db) {
202
202
  await db.schema.dropTable("_emdash_taxonomy_defs").execute();
203
203
  }
204
204
 
205
205
  //#endregion
206
206
  //#region src/database/migrations/007_widgets.ts
207
207
  var _007_widgets_exports = /* @__PURE__ */ __exportAll({
208
- down: () => down$62,
209
- up: () => up$62
208
+ down: () => down$66,
209
+ up: () => up$66
210
210
  });
211
- async function up$62(db) {
211
+ async function up$66(db) {
212
212
  await db.schema.createTable("_emdash_widget_areas").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("description", "text").addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
213
213
  await db.schema.createTable("_emdash_widgets").addColumn("id", "text", (col) => col.primaryKey()).addColumn("area_id", "text", (col) => col.notNull().references("_emdash_widget_areas.id").onDelete("cascade")).addColumn("sort_order", "integer", (col) => col.notNull().defaultTo(0)).addColumn("type", "text", (col) => col.notNull()).addColumn("title", "text").addColumn("content", "text").addColumn("menu_name", "text").addColumn("component_id", "text").addColumn("component_props", "text").addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
214
214
  await db.schema.createIndex("idx_widgets_area").on("_emdash_widgets").columns(["area_id", "sort_order"]).execute();
215
215
  }
216
- async function down$62(db) {
216
+ async function down$66(db) {
217
217
  await db.schema.dropTable("_emdash_widgets").execute();
218
218
  await db.schema.dropTable("_emdash_widget_areas").execute();
219
219
  }
@@ -221,8 +221,8 @@ async function down$62(db) {
221
221
  //#endregion
222
222
  //#region src/database/migrations/008_auth.ts
223
223
  var _008_auth_exports = /* @__PURE__ */ __exportAll({
224
- down: () => down$61,
225
- up: () => up$61
224
+ down: () => down$65,
225
+ up: () => up$65
226
226
  });
227
227
  /**
228
228
  * Auth migration - passkey-first authentication
@@ -236,7 +236,7 @@ var _008_auth_exports = /* @__PURE__ */ __exportAll({
236
236
  * - Creates oauth_accounts table (external provider links)
237
237
  * - Creates allowed_domains table (self-signup)
238
238
  */
239
- async function up$61(db) {
239
+ async function up$65(db) {
240
240
  await db.schema.createTable("users_new").addColumn("id", "text", (col) => col.primaryKey()).addColumn("email", "text", (col) => col.notNull().unique()).addColumn("name", "text").addColumn("avatar_url", "text").addColumn("role", "integer", (col) => col.notNull().defaultTo(10)).addColumn("email_verified", "integer", (col) => col.notNull().defaultTo(0)).addColumn("data", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
241
241
  await sql`
242
242
  INSERT INTO users_new (id, email, name, role, data, created_at, updated_at)
@@ -269,7 +269,7 @@ async function up$61(db) {
269
269
  await db.schema.createTable("auth_challenges").addColumn("challenge", "text", (col) => col.primaryKey()).addColumn("type", "text", (col) => col.notNull()).addColumn("user_id", "text").addColumn("data", "text").addColumn("expires_at", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
270
270
  await db.schema.createIndex("idx_auth_challenges_expires").on("auth_challenges").column("expires_at").execute();
271
271
  }
272
- async function down$61(db) {
272
+ async function down$65(db) {
273
273
  await db.schema.dropTable("auth_challenges").execute();
274
274
  await db.schema.dropTable("allowed_domains").execute();
275
275
  await db.schema.dropTable("oauth_accounts").execute();
@@ -302,8 +302,8 @@ async function down$61(db) {
302
302
  //#endregion
303
303
  //#region src/database/migrations/009_user_disabled.ts
304
304
  var _009_user_disabled_exports = /* @__PURE__ */ __exportAll({
305
- down: () => down$60,
306
- up: () => up$60
305
+ down: () => down$64,
306
+ up: () => up$64
307
307
  });
308
308
  /**
309
309
  * User disabled column - for soft-disabling users
@@ -312,19 +312,19 @@ var _009_user_disabled_exports = /* @__PURE__ */ __exportAll({
312
312
  * - Adds disabled column to users table (INTEGER, default 0)
313
313
  * - Disabled users cannot log in
314
314
  */
315
- async function up$60(db) {
315
+ async function up$64(db) {
316
316
  await sql`ALTER TABLE users ADD COLUMN disabled INTEGER NOT NULL DEFAULT 0`.execute(db);
317
317
  await db.schema.createIndex("idx_users_disabled").on("users").column("disabled").execute();
318
318
  }
319
- async function down$60(db) {
319
+ async function down$64(db) {
320
320
  await db.schema.dropIndex("idx_users_disabled").execute();
321
321
  }
322
322
 
323
323
  //#endregion
324
324
  //#region src/database/migrations/011_sections.ts
325
325
  var _011_sections_exports = /* @__PURE__ */ __exportAll({
326
- down: () => down$59,
327
- up: () => up$59
326
+ down: () => down$63,
327
+ up: () => up$63
328
328
  });
329
329
  /**
330
330
  * Migration: Add sections tables and performance indexes
@@ -333,13 +333,13 @@ var _011_sections_exports = /* @__PURE__ */ __exportAll({
333
333
  * They provide a library of pre-built page sections (heroes, CTAs, testimonials, etc.)
334
334
  * that content authors can browse and insert with a single click.
335
335
  */
336
- async function up$59(db) {
336
+ async function up$63(db) {
337
337
  await db.schema.createTable("_emdash_section_categories").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("sort_order", "integer", (col) => col.defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
338
338
  await db.schema.createTable("_emdash_sections").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("title", "text", (col) => col.notNull()).addColumn("description", "text").addColumn("category_id", "text", (col) => col.references("_emdash_section_categories.id").onDelete("set null")).addColumn("keywords", "text").addColumn("content", "text", (col) => col.notNull()).addColumn("preview_media_id", "text").addColumn("source", "text", (col) => col.notNull().defaultTo("user")).addColumn("theme_id", "text").addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).addColumn("updated_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
339
339
  await db.schema.createIndex("idx_sections_category").on("_emdash_sections").columns(["category_id"]).execute();
340
340
  await db.schema.createIndex("idx_sections_source").on("_emdash_sections").columns(["source"]).execute();
341
341
  }
342
- async function down$59(db) {
342
+ async function down$63(db) {
343
343
  await db.schema.dropIndex("idx_sections_source").execute();
344
344
  await db.schema.dropIndex("idx_sections_category").execute();
345
345
  await db.schema.dropTable("_emdash_sections").execute();
@@ -349,8 +349,8 @@ async function down$59(db) {
349
349
  //#endregion
350
350
  //#region src/database/migrations/012_search.ts
351
351
  var _012_search_exports = /* @__PURE__ */ __exportAll({
352
- down: () => down$58,
353
- up: () => up$58
352
+ down: () => down$62,
353
+ up: () => up$62
354
354
  });
355
355
  /**
356
356
  * Migration: Search Support
@@ -358,11 +358,11 @@ var _012_search_exports = /* @__PURE__ */ __exportAll({
358
358
  * Adds search configuration to collections and searchable flag to fields.
359
359
  * FTS5 tables are created dynamically when search is enabled for a collection.
360
360
  */
361
- async function up$58(db) {
361
+ async function up$62(db) {
362
362
  await db.schema.alterTable("_emdash_collections").addColumn("search_config", "text").execute();
363
363
  await db.schema.alterTable("_emdash_fields").addColumn("searchable", "integer", (col) => col.defaultTo(0)).execute();
364
364
  }
365
- async function down$58(db) {
365
+ async function down$62(db) {
366
366
  await db.schema.alterTable("_emdash_fields").dropColumn("searchable").execute();
367
367
  await db.schema.alterTable("_emdash_collections").dropColumn("search_config").execute();
368
368
  }
@@ -370,8 +370,8 @@ async function down$58(db) {
370
370
  //#endregion
371
371
  //#region src/database/migrations/013_scheduled_publishing.ts
372
372
  var _013_scheduled_publishing_exports = /* @__PURE__ */ __exportAll({
373
- down: () => down$57,
374
- up: () => up$57
373
+ down: () => down$61,
374
+ up: () => up$61
375
375
  });
376
376
  /**
377
377
  * Migration: Add scheduled publishing support
@@ -380,7 +380,7 @@ var _013_scheduled_publishing_exports = /* @__PURE__ */ __exportAll({
380
380
  * When scheduled_at is set and status is 'scheduled', the content
381
381
  * will be auto-published when the scheduled time is reached.
382
382
  */
383
- async function up$57(db) {
383
+ async function up$61(db) {
384
384
  const tableNames = await listTablesLike(db, "ec_%");
385
385
  for (const tableName of tableNames) {
386
386
  const table = { name: tableName };
@@ -395,7 +395,7 @@ async function up$57(db) {
395
395
  `.execute(db);
396
396
  }
397
397
  }
398
- async function down$57(db) {
398
+ async function down$61(db) {
399
399
  const tableNames = await listTablesLike(db, "ec_%");
400
400
  for (const tableName of tableNames) {
401
401
  const table = { name: tableName };
@@ -412,10 +412,10 @@ async function down$57(db) {
412
412
  //#endregion
413
413
  //#region src/database/migrations/014_draft_revisions.ts
414
414
  var _014_draft_revisions_exports = /* @__PURE__ */ __exportAll({
415
- down: () => down$56,
416
- up: () => up$56
415
+ down: () => down$60,
416
+ up: () => up$60
417
417
  });
418
- async function up$56(db) {
418
+ async function up$60(db) {
419
419
  const tables = await db.selectFrom("_emdash_collections").select("slug").execute();
420
420
  for (const row of tables) {
421
421
  const tableName = `ec_${row.slug}`;
@@ -437,7 +437,7 @@ async function up$56(db) {
437
437
  `.execute(db);
438
438
  }
439
439
  }
440
- async function down$56(db) {
440
+ async function down$60(db) {
441
441
  const tables = await db.selectFrom("_emdash_collections").select("slug").execute();
442
442
  for (const row of tables) {
443
443
  const tableName = `ec_${row.slug}`;
@@ -461,8 +461,8 @@ async function down$56(db) {
461
461
  //#endregion
462
462
  //#region src/database/migrations/015_indexes.ts
463
463
  var _015_indexes_exports = /* @__PURE__ */ __exportAll({
464
- down: () => down$55,
465
- up: () => up$55
464
+ down: () => down$59,
465
+ up: () => up$59
466
466
  });
467
467
  /**
468
468
  * Add performance indexes for common query patterns.
@@ -475,7 +475,7 @@ var _015_indexes_exports = /* @__PURE__ */ __exportAll({
475
475
  * 5. Retroactive author_id + updated_at on existing ec_* content tables
476
476
  * (new tables get these from createContentTable() in registry.ts)
477
477
  */
478
- async function up$55(db) {
478
+ async function up$59(db) {
479
479
  await db.schema.createIndex("idx_media_mime_type").on("media").column("mime_type").execute();
480
480
  await db.schema.createIndex("idx_media_filename").on("media").column("filename").execute();
481
481
  await db.schema.createIndex("idx_media_created_at").on("media").column("created_at").execute();
@@ -495,7 +495,7 @@ async function up$55(db) {
495
495
  `.execute(db);
496
496
  }
497
497
  }
498
- async function down$55(db) {
498
+ async function down$59(db) {
499
499
  const tableNames = await listTablesLike(db, "ec_%");
500
500
  for (const tableName of tableNames) {
501
501
  const table = { name: tableName };
@@ -513,8 +513,8 @@ async function down$55(db) {
513
513
  //#endregion
514
514
  //#region src/database/migrations/016_api_tokens.ts
515
515
  var _016_api_tokens_exports = /* @__PURE__ */ __exportAll({
516
- down: () => down$54,
517
- up: () => up$54
516
+ down: () => down$58,
517
+ up: () => up$58
518
518
  });
519
519
  /**
520
520
  * API token tables for programmatic access.
@@ -532,7 +532,7 @@ var _016_api_tokens_exports = /* @__PURE__ */ __exportAll({
532
532
  * top. Without these guards, the retry crashed with `table ... already
533
533
  * exists` and blocked every subsequent boot of the Worker.
534
534
  */
535
- async function up$54(db) {
535
+ async function up$58(db) {
536
536
  await db.schema.createTable("_emdash_api_tokens").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull()).addColumn("token_hash", "text", (col) => col.notNull().unique()).addColumn("prefix", "text", (col) => col.notNull()).addColumn("user_id", "text", (col) => col.notNull()).addColumn("scopes", "text", (col) => col.notNull()).addColumn("expires_at", "text").addColumn("last_used_at", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("api_tokens_user_fk", ["user_id"], "users", ["id"], (cb) => cb.onDelete("cascade")).execute();
537
537
  await db.schema.createIndex("idx_api_tokens_token_hash").ifNotExists().on("_emdash_api_tokens").column("token_hash").execute();
538
538
  await db.schema.createIndex("idx_api_tokens_user_id").ifNotExists().on("_emdash_api_tokens").column("user_id").execute();
@@ -541,7 +541,7 @@ async function up$54(db) {
541
541
  await db.schema.createIndex("idx_oauth_tokens_expires").ifNotExists().on("_emdash_oauth_tokens").column("expires_at").execute();
542
542
  await db.schema.createTable("_emdash_device_codes").ifNotExists().addColumn("device_code", "text", (col) => col.primaryKey()).addColumn("user_code", "text", (col) => col.notNull().unique()).addColumn("scopes", "text", (col) => col.notNull()).addColumn("user_id", "text").addColumn("status", "text", (col) => col.notNull().defaultTo("pending")).addColumn("expires_at", "text", (col) => col.notNull()).addColumn("interval", "integer", (col) => col.notNull().defaultTo(5)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
543
543
  }
544
- async function down$54(db) {
544
+ async function down$58(db) {
545
545
  await db.schema.dropTable("_emdash_device_codes").ifExists().execute();
546
546
  await db.schema.dropTable("_emdash_oauth_tokens").ifExists().execute();
547
547
  await db.schema.dropTable("_emdash_api_tokens").ifExists().execute();
@@ -550,8 +550,8 @@ async function down$54(db) {
550
550
  //#endregion
551
551
  //#region src/database/migrations/017_authorization_codes.ts
552
552
  var _017_authorization_codes_exports = /* @__PURE__ */ __exportAll({
553
- down: () => down$53,
554
- up: () => up$53
553
+ down: () => down$57,
554
+ up: () => up$57
555
555
  });
556
556
  /**
557
557
  * Authorization codes for OAuth 2.1 Authorization Code + PKCE flow.
@@ -560,21 +560,28 @@ var _017_authorization_codes_exports = /* @__PURE__ */ __exportAll({
560
560
  * via the standard OAuth authorization code grant.
561
561
  *
562
562
  * Also adds client_id tracking to oauth_tokens for per-client revocation.
563
+ *
564
+ * Every statement is guarded so the migration can restart after any one of
565
+ * them has committed. D1 commits each DDL statement on its own and the
566
+ * migrator records the migration only once `up` returns, so an interrupted
567
+ * run leaves the table created and the migration pending; an unguarded
568
+ * `CREATE TABLE` then fails on every retry and the database never finishes
569
+ * migrating.
563
570
  */
564
- async function up$53(db) {
565
- await db.schema.createTable("_emdash_authorization_codes").addColumn("code_hash", "text", (col) => col.primaryKey()).addColumn("client_id", "text", (col) => col.notNull()).addColumn("redirect_uri", "text", (col) => col.notNull()).addColumn("user_id", "text", (col) => col.notNull()).addColumn("scopes", "text", (col) => col.notNull()).addColumn("code_challenge", "text", (col) => col.notNull()).addColumn("code_challenge_method", "text", (col) => col.notNull().defaultTo("S256")).addColumn("resource", "text").addColumn("expires_at", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("auth_codes_user_fk", ["user_id"], "users", ["id"], (cb) => cb.onDelete("cascade")).execute();
566
- await db.schema.createIndex("idx_auth_codes_expires").on("_emdash_authorization_codes").column("expires_at").execute();
567
- await sql`ALTER TABLE _emdash_oauth_tokens ADD COLUMN client_id TEXT`.execute(db);
571
+ async function up$57(db) {
572
+ await db.schema.createTable("_emdash_authorization_codes").ifNotExists().addColumn("code_hash", "text", (col) => col.primaryKey()).addColumn("client_id", "text", (col) => col.notNull()).addColumn("redirect_uri", "text", (col) => col.notNull()).addColumn("user_id", "text", (col) => col.notNull()).addColumn("scopes", "text", (col) => col.notNull()).addColumn("code_challenge", "text", (col) => col.notNull()).addColumn("code_challenge_method", "text", (col) => col.notNull().defaultTo("S256")).addColumn("resource", "text").addColumn("expires_at", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("auth_codes_user_fk", ["user_id"], "users", ["id"], (cb) => cb.onDelete("cascade")).execute();
573
+ await db.schema.createIndex("idx_auth_codes_expires").ifNotExists().on("_emdash_authorization_codes").column("expires_at").execute();
574
+ if (!await columnExists(db, "_emdash_oauth_tokens", "client_id")) await db.schema.alterTable("_emdash_oauth_tokens").addColumn("client_id", "text").execute();
568
575
  }
569
- async function down$53(db) {
570
- await db.schema.dropTable("_emdash_authorization_codes").execute();
576
+ async function down$57(db) {
577
+ await db.schema.dropTable("_emdash_authorization_codes").ifExists().execute();
571
578
  }
572
579
 
573
580
  //#endregion
574
581
  //#region src/database/migrations/018_seo.ts
575
582
  var _018_seo_exports = /* @__PURE__ */ __exportAll({
576
- down: () => down$52,
577
- up: () => up$52
583
+ down: () => down$56,
584
+ up: () => up$56
578
585
  });
579
586
  /**
580
587
  * Migration: SEO support
@@ -587,7 +594,7 @@ var _018_seo_exports = /* @__PURE__ */ __exportAll({
587
594
  * need it. The `has_seo` flag controls whether the admin shows SEO fields
588
595
  * and whether the collection's content appears in sitemaps.
589
596
  */
590
- async function up$52(db) {
597
+ async function up$56(db) {
591
598
  await db.schema.createTable("_emdash_seo").addColumn("collection", "text", (col) => col.notNull()).addColumn("content_id", "text", (col) => col.notNull()).addColumn("seo_title", "text").addColumn("seo_description", "text").addColumn("seo_image", "text").addColumn("seo_canonical", "text").addColumn("seo_no_index", "integer", (col) => col.notNull().defaultTo(0)).addColumn("created_at", "text", (col) => col.notNull().defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.notNull().defaultTo(currentTimestamp(db))).addPrimaryKeyConstraint("_emdash_seo_pk", ["collection", "content_id"]).execute();
592
599
  await sql`
593
600
  CREATE INDEX idx_emdash_seo_collection
@@ -598,7 +605,7 @@ async function up$52(db) {
598
605
  ADD COLUMN has_seo INTEGER NOT NULL DEFAULT 0
599
606
  `.execute(db);
600
607
  }
601
- async function down$52(db) {
608
+ async function down$56(db) {
602
609
  await sql`DROP TABLE IF EXISTS _emdash_seo`.execute(db);
603
610
  await sql`
604
611
  ALTER TABLE _emdash_collections
@@ -609,8 +616,8 @@ async function down$52(db) {
609
616
  //#endregion
610
617
  //#region src/database/migrations/019_i18n.ts
611
618
  var _019_i18n_exports = /* @__PURE__ */ __exportAll({
612
- down: () => down$51,
613
- up: () => up$51
619
+ down: () => down$55,
620
+ up: () => up$55
614
621
  });
615
622
  /**
616
623
  * Quote an identifier for use in raw SQL. Escapes embedded double-quotes
@@ -723,7 +730,7 @@ async function upPostgres$1(db) {
723
730
  ADD COLUMN translatable INTEGER NOT NULL DEFAULT 1
724
731
  `.execute(db);
725
732
  }
726
- async function up$51(db) {
733
+ async function up$55(db) {
727
734
  if (!isSqlite(db)) return upPostgres$1(db);
728
735
  const orphanedTmps = await listTablesLike(db, "ec_%_i18n_tmp");
729
736
  for (const tmpName of orphanedTmps) {
@@ -840,7 +847,7 @@ async function downPostgres(db) {
840
847
  await sql`ALTER TABLE ${sql.ref(t)} DROP COLUMN translation_group`.execute(db);
841
848
  }
842
849
  }
843
- async function down$51(db) {
850
+ async function down$55(db) {
844
851
  if (!isSqlite(db)) return downPostgres(db);
845
852
  await sql`
846
853
  ALTER TABLE _emdash_fields
@@ -947,8 +954,8 @@ async function down$51(db) {
947
954
  //#endregion
948
955
  //#region src/database/migrations/020_collection_url_pattern.ts
949
956
  var _020_collection_url_pattern_exports = /* @__PURE__ */ __exportAll({
950
- down: () => down$50,
951
- up: () => up$50
957
+ down: () => down$54,
958
+ up: () => up$54
952
959
  });
953
960
  /**
954
961
  * Migration: URL pattern for collections
@@ -957,13 +964,13 @@ var _020_collection_url_pattern_exports = /* @__PURE__ */ __exportAll({
957
964
  * can declare its own URL structure (e.g. "/{slug}" for pages, "/blog/{slug}"
958
965
  * for posts). Used for menu URL resolution, sitemaps, and path-based lookups.
959
966
  */
960
- async function up$50(db) {
967
+ async function up$54(db) {
961
968
  await sql`
962
969
  ALTER TABLE _emdash_collections
963
970
  ADD COLUMN url_pattern TEXT
964
971
  `.execute(db);
965
972
  }
966
- async function down$50(db) {
973
+ async function down$54(db) {
967
974
  await sql`
968
975
  ALTER TABLE _emdash_collections
969
976
  DROP COLUMN url_pattern
@@ -973,8 +980,8 @@ async function down$50(db) {
973
980
  //#endregion
974
981
  //#region src/database/migrations/021_remove_section_categories.ts
975
982
  var _021_remove_section_categories_exports = /* @__PURE__ */ __exportAll({
976
- down: () => down$49,
977
- up: () => up$49
983
+ down: () => down$53,
984
+ up: () => up$53
978
985
  });
979
986
  /**
980
987
  * Migration: Remove section categories
@@ -983,12 +990,12 @@ var _021_remove_section_categories_exports = /* @__PURE__ */ __exportAll({
983
990
  * Rather than building the missing UI for a feature with very little need at this stage,
984
991
  * we're removing the feature entirely.
985
992
  */
986
- async function up$49(db) {
993
+ async function up$53(db) {
987
994
  await db.schema.dropIndex("idx_sections_category").ifExists().execute();
988
995
  await db.schema.alterTable("_emdash_sections").dropColumn("category_id").execute();
989
996
  await db.schema.dropTable("_emdash_section_categories").execute();
990
997
  }
991
- async function down$49(db) {
998
+ async function down$53(db) {
992
999
  await db.schema.createTable("_emdash_section_categories").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("sort_order", "integer", (col) => col.defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
993
1000
  await db.schema.alterTable("_emdash_sections").addColumn("category_id", "text", (col) => col.references("_emdash_section_categories.id").onDelete("set null")).execute();
994
1001
  await db.schema.createIndex("idx_sections_category").on("_emdash_sections").columns(["category_id"]).execute();
@@ -997,8 +1004,8 @@ async function down$49(db) {
997
1004
  //#endregion
998
1005
  //#region src/database/migrations/022_marketplace_plugin_state.ts
999
1006
  var _022_marketplace_plugin_state_exports = /* @__PURE__ */ __exportAll({
1000
- down: () => down$48,
1001
- up: () => up$48
1007
+ down: () => down$52,
1008
+ up: () => up$52
1002
1009
  });
1003
1010
  /**
1004
1011
  * Migration: Add marketplace fields to _plugin_state
@@ -1007,7 +1014,7 @@ var _022_marketplace_plugin_state_exports = /* @__PURE__ */ __exportAll({
1007
1014
  * whether a plugin was installed from config or marketplace,
1008
1015
  * and which marketplace version is installed.
1009
1016
  */
1010
- async function up$48(db) {
1017
+ async function up$52(db) {
1011
1018
  await sql`
1012
1019
  ALTER TABLE _plugin_state
1013
1020
  ADD COLUMN source TEXT NOT NULL DEFAULT 'config'
@@ -1022,7 +1029,7 @@ async function up$48(db) {
1022
1029
  WHERE source = 'marketplace'
1023
1030
  `.execute(db);
1024
1031
  }
1025
- async function down$48(db) {
1032
+ async function down$52(db) {
1026
1033
  await sql`
1027
1034
  DROP INDEX IF EXISTS idx_plugin_state_source
1028
1035
  `.execute(db);
@@ -1039,8 +1046,8 @@ async function down$48(db) {
1039
1046
  //#endregion
1040
1047
  //#region src/database/migrations/023_plugin_metadata.ts
1041
1048
  var _023_plugin_metadata_exports = /* @__PURE__ */ __exportAll({
1042
- down: () => down$47,
1043
- up: () => up$47
1049
+ down: () => down$51,
1050
+ up: () => up$51
1044
1051
  });
1045
1052
  /**
1046
1053
  * Migration: Add display metadata to _plugin_state
@@ -1049,7 +1056,7 @@ var _023_plugin_metadata_exports = /* @__PURE__ */ __exportAll({
1049
1056
  * so the admin UI can show meaningful info without re-fetching
1050
1057
  * from the marketplace on every page load.
1051
1058
  */
1052
- async function up$47(db) {
1059
+ async function up$51(db) {
1053
1060
  await sql`
1054
1061
  ALTER TABLE _plugin_state
1055
1062
  ADD COLUMN display_name TEXT
@@ -1059,7 +1066,7 @@ async function up$47(db) {
1059
1066
  ADD COLUMN description TEXT
1060
1067
  `.execute(db);
1061
1068
  }
1062
- async function down$47(db) {
1069
+ async function down$51(db) {
1063
1070
  await sql`
1064
1071
  ALTER TABLE _plugin_state
1065
1072
  DROP COLUMN description
@@ -1073,8 +1080,8 @@ async function down$47(db) {
1073
1080
  //#endregion
1074
1081
  //#region src/database/migrations/024_media_placeholders.ts
1075
1082
  var _024_media_placeholders_exports = /* @__PURE__ */ __exportAll({
1076
- down: () => down$46,
1077
- up: () => up$46
1083
+ down: () => down$50,
1084
+ up: () => up$50
1078
1085
  });
1079
1086
  /**
1080
1087
  * Migration: Add placeholder columns to media table
@@ -1082,7 +1089,7 @@ var _024_media_placeholders_exports = /* @__PURE__ */ __exportAll({
1082
1089
  * Stores blurhash and dominant_color for LQIP (Low Quality Image Placeholder)
1083
1090
  * support. Generated at upload time from image pixel data.
1084
1091
  */
1085
- async function up$46(db) {
1092
+ async function up$50(db) {
1086
1093
  await sql`
1087
1094
  ALTER TABLE media
1088
1095
  ADD COLUMN blurhash TEXT
@@ -1092,7 +1099,7 @@ async function up$46(db) {
1092
1099
  ADD COLUMN dominant_color TEXT
1093
1100
  `.execute(db);
1094
1101
  }
1095
- async function down$46(db) {
1102
+ async function down$50(db) {
1096
1103
  await sql`
1097
1104
  ALTER TABLE media
1098
1105
  DROP COLUMN dominant_color
@@ -1106,8 +1113,8 @@ async function down$46(db) {
1106
1113
  //#endregion
1107
1114
  //#region src/database/migrations/025_oauth_clients.ts
1108
1115
  var _025_oauth_clients_exports = /* @__PURE__ */ __exportAll({
1109
- down: () => down$45,
1110
- up: () => up$45
1116
+ down: () => down$49,
1117
+ up: () => up$49
1111
1118
  });
1112
1119
  /**
1113
1120
  * Migration: Create OAuth clients table
@@ -1118,18 +1125,18 @@ var _025_oauth_clients_exports = /* @__PURE__ */ __exportAll({
1118
1125
  * Each client has a set of pre-registered redirect URIs (JSON array).
1119
1126
  * The authorize endpoint rejects any redirect_uri not in the client's list.
1120
1127
  */
1121
- async function up$45(db) {
1128
+ async function up$49(db) {
1122
1129
  await db.schema.createTable("_emdash_oauth_clients").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull()).addColumn("redirect_uris", "text", (col) => col.notNull()).addColumn("scopes", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
1123
1130
  }
1124
- async function down$45(db) {
1131
+ async function down$49(db) {
1125
1132
  await db.schema.dropTable("_emdash_oauth_clients").execute();
1126
1133
  }
1127
1134
 
1128
1135
  //#endregion
1129
1136
  //#region src/database/migrations/026_cron_tasks.ts
1130
1137
  var _026_cron_tasks_exports = /* @__PURE__ */ __exportAll({
1131
- down: () => down$44,
1132
- up: () => up$44
1138
+ down: () => down$48,
1139
+ up: () => up$48
1133
1140
  });
1134
1141
  /**
1135
1142
  * Migration: Create cron tasks table for plugin scheduled tasks.
@@ -1140,7 +1147,7 @@ var _026_cron_tasks_exports = /* @__PURE__ */ __exportAll({
1140
1147
  * The `next_run_at` + `status` + `enabled` index drives the "find overdue
1141
1148
  * tasks" query used by CronExecutor.tick().
1142
1149
  */
1143
- async function up$44(db) {
1150
+ async function up$48(db) {
1144
1151
  await db.schema.createTable("_emdash_cron_tasks").addColumn("id", "text", (col) => col.primaryKey()).addColumn("plugin_id", "text", (col) => col.notNull()).addColumn("task_name", "text", (col) => col.notNull()).addColumn("schedule", "text", (col) => col.notNull()).addColumn("is_oneshot", "integer", (col) => col.notNull().defaultTo(0)).addColumn("data", "text").addColumn("next_run_at", "text", (col) => col.notNull()).addColumn("last_run_at", "text").addColumn("status", "text", (col) => col.notNull().defaultTo("idle")).addColumn("locked_at", "text").addColumn("enabled", "integer", (col) => col.notNull().defaultTo(1)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addUniqueConstraint("uq_cron_tasks_plugin_task", ["plugin_id", "task_name"]).execute();
1145
1152
  await db.schema.createIndex("idx_cron_tasks_due").on("_emdash_cron_tasks").columns([
1146
1153
  "enabled",
@@ -1149,17 +1156,17 @@ async function up$44(db) {
1149
1156
  ]).execute();
1150
1157
  await db.schema.createIndex("idx_cron_tasks_plugin").on("_emdash_cron_tasks").column("plugin_id").execute();
1151
1158
  }
1152
- async function down$44(db) {
1159
+ async function down$48(db) {
1153
1160
  await db.schema.dropTable("_emdash_cron_tasks").execute();
1154
1161
  }
1155
1162
 
1156
1163
  //#endregion
1157
1164
  //#region src/database/migrations/027_comments.ts
1158
1165
  var _027_comments_exports = /* @__PURE__ */ __exportAll({
1159
- down: () => down$43,
1160
- up: () => up$43
1166
+ down: () => down$47,
1167
+ up: () => up$47
1161
1168
  });
1162
- async function up$43(db) {
1169
+ async function up$47(db) {
1163
1170
  await db.schema.createTable("_emdash_comments").addColumn("id", "text", (col) => col.primaryKey()).addColumn("collection", "text", (col) => col.notNull()).addColumn("content_id", "text", (col) => col.notNull()).addColumn("parent_id", "text", (col) => col.references("_emdash_comments.id").onDelete("cascade")).addColumn("author_name", "text", (col) => col.notNull()).addColumn("author_email", "text", (col) => col.notNull()).addColumn("author_url", "text").addColumn("author_user_id", "text", (col) => col.references("users.id").onDelete("set null")).addColumn("body", "text", (col) => col.notNull()).addColumn("status", "text", (col) => col.notNull().defaultTo("pending")).addColumn("ip_hash", "text").addColumn("user_agent", "text").addColumn("moderation_metadata", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
1164
1171
  await db.schema.createIndex("idx_comments_content").on("_emdash_comments").columns([
1165
1172
  "collection",
@@ -1175,30 +1182,30 @@ async function up$43(db) {
1175
1182
  await db.schema.alterTable("_emdash_collections").addColumn("comments_closed_after_days", "integer", (col) => col.defaultTo(90)).execute();
1176
1183
  await db.schema.alterTable("_emdash_collections").addColumn("comments_auto_approve_users", "integer", (col) => col.defaultTo(1)).execute();
1177
1184
  }
1178
- async function down$43(db) {
1185
+ async function down$47(db) {
1179
1186
  await db.schema.dropTable("_emdash_comments").execute();
1180
1187
  }
1181
1188
 
1182
1189
  //#endregion
1183
1190
  //#region src/database/migrations/028_drop_author_url.ts
1184
1191
  var _028_drop_author_url_exports = /* @__PURE__ */ __exportAll({
1185
- down: () => down$42,
1186
- up: () => up$42
1192
+ down: () => down$46,
1193
+ up: () => up$46
1187
1194
  });
1188
- async function up$42(db) {
1195
+ async function up$46(db) {
1189
1196
  await sql`ALTER TABLE _emdash_comments DROP COLUMN author_url`.execute(db);
1190
1197
  }
1191
- async function down$42(db) {
1198
+ async function down$46(db) {
1192
1199
  await db.schema.alterTable("_emdash_comments").addColumn("author_url", "text").execute();
1193
1200
  }
1194
1201
 
1195
1202
  //#endregion
1196
1203
  //#region src/database/migrations/029_redirects.ts
1197
1204
  var _029_redirects_exports = /* @__PURE__ */ __exportAll({
1198
- down: () => down$41,
1199
- up: () => up$41
1205
+ down: () => down$45,
1206
+ up: () => up$45
1200
1207
  });
1201
- async function up$41(db) {
1208
+ async function up$45(db) {
1202
1209
  await db.schema.createTable("_emdash_redirects").addColumn("id", "text", (col) => col.primaryKey()).addColumn("source", "text", (col) => col.notNull()).addColumn("destination", "text", (col) => col.notNull()).addColumn("type", "integer", (col) => col.notNull().defaultTo(301)).addColumn("is_pattern", "integer", (col) => col.notNull().defaultTo(0)).addColumn("enabled", "integer", (col) => col.notNull().defaultTo(1)).addColumn("hits", "integer", (col) => col.notNull().defaultTo(0)).addColumn("last_hit_at", "text").addColumn("group_name", "text").addColumn("auto", "integer", (col) => col.notNull().defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
1203
1210
  await db.schema.createIndex("idx_redirects_source").on("_emdash_redirects").column("source").execute();
1204
1211
  await db.schema.createIndex("idx_redirects_enabled").on("_emdash_redirects").column("enabled").execute();
@@ -1207,7 +1214,7 @@ async function up$41(db) {
1207
1214
  await db.schema.createIndex("idx_404_log_path").on("_emdash_404_log").column("path").execute();
1208
1215
  await db.schema.createIndex("idx_404_log_created").on("_emdash_404_log").column("created_at").execute();
1209
1216
  }
1210
- async function down$41(db) {
1217
+ async function down$45(db) {
1211
1218
  await db.schema.dropTable("_emdash_404_log").execute();
1212
1219
  await db.schema.dropTable("_emdash_redirects").execute();
1213
1220
  }
@@ -1215,8 +1222,8 @@ async function down$41(db) {
1215
1222
  //#endregion
1216
1223
  //#region src/database/migrations/030_widen_scheduled_index.ts
1217
1224
  var _030_widen_scheduled_index_exports = /* @__PURE__ */ __exportAll({
1218
- down: () => down$40,
1219
- up: () => up$40
1225
+ down: () => down$44,
1226
+ up: () => up$44
1220
1227
  });
1221
1228
  /**
1222
1229
  * Migration: Widen scheduled publishing index
@@ -1225,7 +1232,7 @@ var _030_widen_scheduled_index_exports = /* @__PURE__ */ __exportAll({
1225
1232
  * Published posts can now have scheduled draft changes, so widen the
1226
1233
  * index to cover all rows where scheduled_at IS NOT NULL.
1227
1234
  */
1228
- async function up$40(db) {
1235
+ async function up$44(db) {
1229
1236
  const tableNames = await listTablesLike(db, "ec_%");
1230
1237
  for (const tableName of tableNames) {
1231
1238
  const table = { name: tableName };
@@ -1239,7 +1246,7 @@ async function up$40(db) {
1239
1246
  `.execute(db);
1240
1247
  }
1241
1248
  }
1242
- async function down$40(db) {
1249
+ async function down$44(db) {
1243
1250
  const tableNames = await listTablesLike(db, "ec_%");
1244
1251
  for (const tableName of tableNames) {
1245
1252
  const table = { name: tableName };
@@ -1257,10 +1264,10 @@ async function down$40(db) {
1257
1264
  //#endregion
1258
1265
  //#region src/database/migrations/031_bylines.ts
1259
1266
  var _031_bylines_exports = /* @__PURE__ */ __exportAll({
1260
- down: () => down$39,
1261
- up: () => up$39
1267
+ down: () => down$43,
1268
+ up: () => up$43
1262
1269
  });
1263
- async function up$39(db) {
1270
+ async function up$43(db) {
1264
1271
  await db.schema.createTable("_emdash_bylines").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("display_name", "text", (col) => col.notNull()).addColumn("bio", "text").addColumn("avatar_media_id", "text", (col) => col.references("media.id").onDelete("set null")).addColumn("website_url", "text").addColumn("user_id", "text", (col) => col.references("users.id").onDelete("set null")).addColumn("is_guest", "integer", (col) => col.notNull().defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
1265
1272
  await sql`
1266
1273
  CREATE UNIQUE INDEX ${sql.ref("idx_bylines_user_id_unique")}
@@ -1292,7 +1299,7 @@ async function up$39(db) {
1292
1299
  `.execute(db);
1293
1300
  }
1294
1301
  }
1295
- async function down$39(db) {
1302
+ async function down$43(db) {
1296
1303
  const tableNames = await listTablesLike(db, "ec_%");
1297
1304
  for (const tableName of tableNames) {
1298
1305
  await sql`
@@ -1310,8 +1317,8 @@ async function down$39(db) {
1310
1317
  //#endregion
1311
1318
  //#region src/database/migrations/032_rate_limits.ts
1312
1319
  var _032_rate_limits_exports = /* @__PURE__ */ __exportAll({
1313
- down: () => down$38,
1314
- up: () => up$38
1320
+ down: () => down$42,
1321
+ up: () => up$42
1315
1322
  });
1316
1323
  /**
1317
1324
  * Migration: Rate limits table + device code polling tracking.
@@ -1322,12 +1329,12 @@ var _032_rate_limits_exports = /* @__PURE__ */ __exportAll({
1322
1329
  * 2. Add last_polled_at column to _emdash_device_codes for
1323
1330
  * RFC 8628 slow_down enforcement.
1324
1331
  */
1325
- async function up$38(db) {
1332
+ async function up$42(db) {
1326
1333
  await db.schema.createTable("_emdash_rate_limits").addColumn("key", "text", (col) => col.notNull()).addColumn("window", "text", (col) => col.notNull()).addColumn("count", "integer", (col) => col.notNull().defaultTo(1)).addPrimaryKeyConstraint("pk_rate_limits", ["key", "window"]).execute();
1327
1334
  await db.schema.createIndex("idx_rate_limits_window").on("_emdash_rate_limits").column("window").execute();
1328
1335
  await db.schema.alterTable("_emdash_device_codes").addColumn("last_polled_at", "text").execute();
1329
1336
  }
1330
- async function down$38(db) {
1337
+ async function down$42(db) {
1331
1338
  await db.schema.dropTable("_emdash_rate_limits").execute();
1332
1339
  await db.schema.alterTable("_emdash_device_codes").dropColumn("last_polled_at").execute();
1333
1340
  }
@@ -1335,8 +1342,8 @@ async function down$38(db) {
1335
1342
  //#endregion
1336
1343
  //#region src/database/migrations/033_optimize_content_indexes.ts
1337
1344
  var _033_optimize_content_indexes_exports = /* @__PURE__ */ __exportAll({
1338
- down: () => down$37,
1339
- up: () => up$37
1345
+ down: () => down$41,
1346
+ up: () => up$41
1340
1347
  });
1341
1348
  /**
1342
1349
  * Migration: Optimize content table indexes for D1 performance
@@ -1349,7 +1356,7 @@ var _033_optimize_content_indexes_exports = /* @__PURE__ */ __exportAll({
1349
1356
  *
1350
1357
  * Impact: Reduces D1 row reads by 90%+ for admin panel operations.
1351
1358
  */
1352
- async function up$37(db) {
1359
+ async function up$41(db) {
1353
1360
  const tableNames = await listTablesLike(db, "ec_%");
1354
1361
  for (const tableName of tableNames) {
1355
1362
  const table = { name: tableName };
@@ -1391,7 +1398,7 @@ async function up$37(db) {
1391
1398
  WHERE status = 'trash'
1392
1399
  `.execute(db);
1393
1400
  }
1394
- async function down$37(db) {
1401
+ async function down$41(db) {
1395
1402
  const tableNames = await listTablesLike(db, "ec_%");
1396
1403
  for (const tableName of tableNames) {
1397
1404
  const table = { name: tableName };
@@ -1424,10 +1431,10 @@ async function down$37(db) {
1424
1431
  //#endregion
1425
1432
  //#region src/database/migrations/034_published_at_index.ts
1426
1433
  var _034_published_at_index_exports = /* @__PURE__ */ __exportAll({
1427
- down: () => down$36,
1428
- up: () => up$36
1434
+ down: () => down$40,
1435
+ up: () => up$40
1429
1436
  });
1430
- async function up$36(db) {
1437
+ async function up$40(db) {
1431
1438
  const tableNames = await listTablesLike(db, "ec_%");
1432
1439
  for (const tableName of tableNames) {
1433
1440
  const table = { name: tableName };
@@ -1437,7 +1444,7 @@ async function up$36(db) {
1437
1444
  `.execute(db);
1438
1445
  }
1439
1446
  }
1440
- async function down$36(db) {
1447
+ async function down$40(db) {
1441
1448
  const tableNames = await listTablesLike(db, "ec_%");
1442
1449
  for (const tableName of tableNames) {
1443
1450
  const table = { name: tableName };
@@ -1448,8 +1455,8 @@ async function down$36(db) {
1448
1455
  //#endregion
1449
1456
  //#region src/database/migrations/035_bounded_404_log.ts
1450
1457
  var _035_bounded_404_log_exports = /* @__PURE__ */ __exportAll({
1451
- down: () => down$35,
1452
- up: () => up$35
1458
+ down: () => down$39,
1459
+ up: () => up$39
1453
1460
  });
1454
1461
  /**
1455
1462
  * Migration: Bounded 404 logging
@@ -1467,7 +1474,7 @@ var _035_bounded_404_log_exports = /* @__PURE__ */ __exportAll({
1467
1474
  * path and summing hits
1468
1475
  * - Adds a UNIQUE index on `path` so upsert semantics work
1469
1476
  */
1470
- async function up$35(db) {
1477
+ async function up$39(db) {
1471
1478
  const hitsExists = await columnExists(db, "_emdash_404_log", "hits");
1472
1479
  if (!hitsExists) await db.schema.alterTable("_emdash_404_log").addColumn("hits", "integer", (col) => col.notNull().defaultTo(1)).execute();
1473
1480
  if (!await columnExists(db, "_emdash_404_log", "last_seen_at")) await db.schema.alterTable("_emdash_404_log").addColumn("last_seen_at", "text").execute();
@@ -1516,7 +1523,7 @@ async function up$35(db) {
1516
1523
  await db.schema.dropIndex("idx_404_log_path").ifExists().execute();
1517
1524
  await db.schema.createIndex("idx_404_log_last_seen").ifNotExists().on("_emdash_404_log").column("last_seen_at").execute();
1518
1525
  }
1519
- async function down$35(db) {
1526
+ async function down$39(db) {
1520
1527
  await db.schema.dropIndex("idx_404_log_last_seen").ifExists().execute();
1521
1528
  await db.schema.dropIndex("idx_404_log_path_unique").ifExists().execute();
1522
1529
  await db.schema.createIndex("idx_404_log_path").ifNotExists().on("_emdash_404_log").column("path").execute();
@@ -1527,8 +1534,8 @@ async function down$35(db) {
1527
1534
  //#endregion
1528
1535
  //#region src/database/migrations/036_i18n_menus_and_taxonomies.ts
1529
1536
  var _036_i18n_menus_and_taxonomies_exports = /* @__PURE__ */ __exportAll({
1530
- down: () => down$34,
1531
- up: () => up$34
1537
+ down: () => down$38,
1538
+ up: () => up$38
1532
1539
  });
1533
1540
  /**
1534
1541
  * i18n for menus + taxonomies. Adds `locale` + `translation_group` to system
@@ -1539,7 +1546,7 @@ var _036_i18n_menus_and_taxonomies_exports = /* @__PURE__ */ __exportAll({
1539
1546
  function getDefaultLocale$1() {
1540
1547
  return getI18nConfig()?.defaultLocale ?? "en";
1541
1548
  }
1542
- async function up$34(db) {
1549
+ async function up$38(db) {
1543
1550
  const defaultLocale = getDefaultLocale$1();
1544
1551
  if (isSqlite(db)) {
1545
1552
  await rebuildContentTaxonomies(db);
@@ -1754,7 +1761,7 @@ async function assertSingleLocale$1(db, defaultLocale) {
1754
1761
  if (count > 0) throw new Error(`Cannot revert migration 036_i18n_menus_and_taxonomies: ${count} row(s) in "${table}" use a non-default locale (defaultLocale="${defaultLocale}"). Reverting would drop them silently. Export translations first (or delete them) and re-run the rollback. See packages/core/src/database/migrations/036_i18n_menus_and_taxonomies.ts.`);
1755
1762
  }
1756
1763
  }
1757
- async function down$34(db) {
1764
+ async function down$38(db) {
1758
1765
  const defaultLocale = getDefaultLocale$1();
1759
1766
  await assertSingleLocale$1(db, defaultLocale);
1760
1767
  await assertContentTaxonomiesResolve(db, defaultLocale);
@@ -1852,21 +1859,21 @@ async function rebuildTaxonomyDefsDown(db) {
1852
1859
  //#endregion
1853
1860
  //#region src/database/migrations/037_credential_algorithm.ts
1854
1861
  var _037_credential_algorithm_exports = /* @__PURE__ */ __exportAll({
1855
- down: () => down$33,
1856
- up: () => up$33
1862
+ down: () => down$37,
1863
+ up: () => up$37
1857
1864
  });
1858
- async function up$33(db) {
1865
+ async function up$37(db) {
1859
1866
  if (!await columnExists(db, "credentials", "algorithm")) await db.schema.alterTable("credentials").addColumn("algorithm", "integer", (col) => col.notNull().defaultTo(-7)).execute();
1860
1867
  }
1861
- async function down$33(db) {
1868
+ async function down$37(db) {
1862
1869
  if (await columnExists(db, "credentials", "algorithm")) await db.schema.alterTable("credentials").dropColumn("algorithm").execute();
1863
1870
  }
1864
1871
 
1865
1872
  //#endregion
1866
1873
  //#region src/database/migrations/038_registry_plugin_state.ts
1867
1874
  var _038_registry_plugin_state_exports = /* @__PURE__ */ __exportAll({
1868
- down: () => down$32,
1869
- up: () => up$32
1875
+ down: () => down$36,
1876
+ up: () => up$36
1870
1877
  });
1871
1878
  /**
1872
1879
  * Migration: Add registry fields to _plugin_state
@@ -1894,7 +1901,7 @@ var _038_registry_plugin_state_exports = /* @__PURE__ */ __exportAll({
1894
1901
  * checks before adding to keep the migration safe under partial
1895
1902
  * re-application. The same pattern is used in 019_i18n.ts.
1896
1903
  */
1897
- async function up$32(db) {
1904
+ async function up$36(db) {
1898
1905
  if (isSqlite(db)) await upSqlite(db);
1899
1906
  else await upPostgres(db);
1900
1907
  }
@@ -1937,7 +1944,7 @@ async function upPostgres(db) {
1937
1944
  WHERE source = 'registry'
1938
1945
  `.execute(db);
1939
1946
  }
1940
- async function down$32(db) {
1947
+ async function down$36(db) {
1941
1948
  await sql`
1942
1949
  DROP INDEX IF EXISTS idx_plugin_state_registry
1943
1950
  `.execute(db);
@@ -1954,10 +1961,10 @@ async function down$32(db) {
1954
1961
  //#endregion
1955
1962
  //#region src/database/migrations/039_fix_fts5_triggers.ts
1956
1963
  var _039_fix_fts5_triggers_exports = /* @__PURE__ */ __exportAll({
1957
- down: () => down$31,
1958
- up: () => up$31
1964
+ down: () => down$35,
1965
+ up: () => up$35
1959
1966
  });
1960
- async function up$31(db) {
1967
+ async function up$35(db) {
1961
1968
  if (!isSqlite(db)) return;
1962
1969
  const collections = await sql`
1963
1970
  SELECT slug, search_config FROM _emdash_collections
@@ -1991,7 +1998,7 @@ async function up$31(db) {
1991
1998
  * at runtime, not by this migration, so leaving them in their
1992
1999
  * corruption-safe state on rollback is correct.
1993
2000
  */
1994
- async function down$31(_db) {}
2001
+ async function down$35(_db) {}
1995
2002
  function isSearchEnabled$1(searchConfig) {
1996
2003
  if (!searchConfig) return false;
1997
2004
  try {
@@ -2083,8 +2090,8 @@ async function dropFtsObjects(db, collectionSlug) {
2083
2090
  //#endregion
2084
2091
  //#region src/database/migrations/040_byline_i18n.ts
2085
2092
  var _040_byline_i18n_exports = /* @__PURE__ */ __exportAll({
2086
- down: () => down$30,
2087
- up: () => up$30
2093
+ down: () => down$34,
2094
+ up: () => up$34
2088
2095
  });
2089
2096
  /**
2090
2097
  * i18n for bylines. Adds `locale` + `translation_group` to `_emdash_bylines`
@@ -2112,7 +2119,7 @@ var _040_byline_i18n_exports = /* @__PURE__ */ __exportAll({
2112
2119
  function getDefaultLocale() {
2113
2120
  return getI18nConfig()?.defaultLocale ?? "en";
2114
2121
  }
2115
- async function up$30(db) {
2122
+ async function up$34(db) {
2116
2123
  const defaultLocale = getDefaultLocale();
2117
2124
  if (isSqlite(db)) {
2118
2125
  await rebuildContentBylines(db);
@@ -2269,7 +2276,7 @@ async function assertSingleLocale(db, defaultLocale) {
2269
2276
  const count = Number(result.rows[0]?.count ?? 0);
2270
2277
  if (count > 0) throw new Error(`Cannot revert migration 040_byline_i18n: ${count} row(s) in "_emdash_bylines" use a non-default locale (defaultLocale="${defaultLocale}"). Reverting would drop them silently. Export translations first (or delete them) and re-run the rollback. See packages/core/src/database/migrations/040_byline_i18n.ts.`);
2271
2278
  }
2272
- async function down$30(db) {
2279
+ async function down$34(db) {
2273
2280
  const defaultLocale = getDefaultLocale();
2274
2281
  await assertSingleLocale(db, defaultLocale);
2275
2282
  await assertContentBylinesResolve(db, defaultLocale);
@@ -2388,8 +2395,8 @@ async function restoreContentBylinesFk(db) {
2388
2395
  //#endregion
2389
2396
  //#region src/database/migrations/041_content_locale_list_index.ts
2390
2397
  var _041_content_locale_list_index_exports = /* @__PURE__ */ __exportAll({
2391
- down: () => down$29,
2392
- up: () => up$29
2398
+ down: () => down$33,
2399
+ up: () => up$33
2393
2400
  });
2394
2401
  /**
2395
2402
  * Migration: locale-aware composite indexes for content list queries.
@@ -2409,7 +2416,7 @@ var _041_content_locale_list_index_exports = /* @__PURE__ */ __exportAll({
2409
2416
  * slugs as short as 40 chars, making both names truncate to the same string.
2410
2417
  * Keep these identical to the names in `schema/registry.ts`.
2411
2418
  */
2412
- async function up$29(db) {
2419
+ async function up$33(db) {
2413
2420
  const tableNames = await listTablesLike(db, "ec_%");
2414
2421
  for (const tableName of tableNames) {
2415
2422
  await sql`
@@ -2422,7 +2429,7 @@ async function up$29(db) {
2422
2429
  `.execute(db);
2423
2430
  }
2424
2431
  }
2425
- async function down$29(db) {
2432
+ async function down$33(db) {
2426
2433
  const tableNames = await listTablesLike(db, "ec_%");
2427
2434
  for (const tableName of tableNames) {
2428
2435
  await sql`DROP INDEX IF EXISTS ${sql.ref(`idx_${tableName}_loc_upd`)}`.execute(db);
@@ -2433,8 +2440,8 @@ async function down$29(db) {
2433
2440
  //#endregion
2434
2441
  //#region src/database/migrations/042_byline_fields.ts
2435
2442
  var _042_byline_fields_exports = /* @__PURE__ */ __exportAll({
2436
- down: () => down$28,
2437
- up: () => up$28
2443
+ down: () => down$32,
2444
+ up: () => up$32
2438
2445
  });
2439
2446
  /**
2440
2447
  * Byline custom fields (Discussion #1174). Adds three tables and a
@@ -2479,7 +2486,7 @@ var _042_byline_fields_exports = /* @__PURE__ */ __exportAll({
2479
2486
  * reference it. If `down()` runs after a partial `up()`, missing tables
2480
2487
  * are tolerated (`DROP TABLE IF EXISTS`).
2481
2488
  */
2482
- async function up$28(db) {
2489
+ async function up$32(db) {
2483
2490
  await db.schema.createTable("_emdash_byline_fields").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("type", "text", (col) => col.notNull()).addColumn("required", "integer", (col) => col.notNull().defaultTo(0)).addColumn("translatable", "integer", (col) => col.notNull().defaultTo(1)).addColumn("validation", "text").addColumn("sort_order", "integer", (col) => col.notNull().defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
2484
2491
  await db.schema.createIndex("idx__emdash_byline_fields_sort_order").ifNotExists().on("_emdash_byline_fields").column("sort_order").execute();
2485
2492
  await db.schema.createTable("_emdash_byline_field_values").ifNotExists().addColumn("byline_id", "text", (col) => col.notNull().references("_emdash_bylines.id").onDelete("cascade")).addColumn("field_id", "text", (col) => col.notNull().references("_emdash_byline_fields.id").onDelete("cascade")).addColumn("value", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addPrimaryKeyConstraint("_emdash_byline_field_values_pk", ["byline_id", "field_id"]).execute();
@@ -2502,7 +2509,7 @@ async function up$28(db) {
2502
2509
  * `up()` (only one or two tables landed) still settles the database back
2503
2510
  * to its pre-042 state.
2504
2511
  */
2505
- async function down$28(db) {
2512
+ async function down$32(db) {
2506
2513
  await db.schema.dropTable("_emdash_byline_field_group_values").ifExists().execute();
2507
2514
  await db.schema.dropTable("_emdash_byline_field_values").ifExists().execute();
2508
2515
  await db.schema.dropTable("_emdash_byline_fields").ifExists().execute();
@@ -2512,8 +2519,8 @@ async function down$28(db) {
2512
2519
  //#endregion
2513
2520
  //#region src/database/migrations/043_content_references.ts
2514
2521
  var _043_content_references_exports = /* @__PURE__ */ __exportAll({
2515
- down: () => down$27,
2516
- up: () => up$27
2522
+ down: () => down$31,
2523
+ up: () => up$31
2517
2524
  });
2518
2525
  /**
2519
2526
  * Content references.
@@ -2533,7 +2540,7 @@ var _043_content_references_exports = /* @__PURE__ */ __exportAll({
2533
2540
  * race-recovery path) re-applies cleanly — including any indexes that landed in
2534
2541
  * the failed pass after their table.
2535
2542
  */
2536
- async function up$27(db) {
2543
+ async function up$31(db) {
2537
2544
  const defaultLocale = getI18nConfig()?.defaultLocale ?? "en";
2538
2545
  await db.schema.createTable("_emdash_relations").ifNotExists().addColumn("id", "text", (c) => c.primaryKey()).addColumn("name", "text", (c) => c.notNull()).addColumn("parent_collection", "text", (c) => c.notNull()).addColumn("child_collection", "text", (c) => c.notNull()).addColumn("parent_label", "text", (c) => c.notNull()).addColumn("child_label", "text", (c) => c.notNull()).addColumn("locale", "text", (c) => c.notNull().defaultTo(defaultLocale)).addColumn("translation_group", "text", (c) => c.notNull()).addColumn("created_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addUniqueConstraint("_emdash_relations_name_locale_unique", ["name", "locale"]).execute();
2539
2546
  await db.schema.createIndex("idx__emdash_relations_locale").ifNotExists().on("_emdash_relations").column("locale").execute();
@@ -2554,7 +2561,7 @@ async function up$27(db) {
2554
2561
  await db.schema.createIndex("idx__emdash_content_references_child").ifNotExists().on("_emdash_content_references").columns(["child_group", "relation_group"]).execute();
2555
2562
  await db.schema.createIndex("idx__emdash_content_references_relation").ifNotExists().on("_emdash_content_references").column("relation_group").execute();
2556
2563
  }
2557
- async function down$27(db) {
2564
+ async function down$31(db) {
2558
2565
  await db.schema.dropTable("_emdash_content_references").ifExists().execute();
2559
2566
  await db.schema.dropTable("_emdash_relations").ifExists().execute();
2560
2567
  }
@@ -2562,8 +2569,8 @@ async function down$27(db) {
2562
2569
  //#endregion
2563
2570
  //#region src/database/migrations/044_comment_reactions.ts
2564
2571
  var _044_comment_reactions_exports = /* @__PURE__ */ __exportAll({
2565
- down: () => down$26,
2566
- up: () => up$26
2572
+ down: () => down$30,
2573
+ up: () => up$30
2567
2574
  });
2568
2575
  /**
2569
2576
  * Comment reactions (Tier 1 of the best-in-class comments RFC).
@@ -2575,7 +2582,7 @@ var _044_comment_reactions_exports = /* @__PURE__ */ __exportAll({
2575
2582
  *
2576
2583
  * Additive and backward-compatible: a new table, no change to existing schema.
2577
2584
  */
2578
- async function up$26(db) {
2585
+ async function up$30(db) {
2579
2586
  await db.schema.createTable("_emdash_comment_reactions").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("comment_id", "text", (col) => col.notNull().references("_emdash_comments.id").onDelete("cascade")).addColumn("reaction", "text", (col) => col.notNull().defaultTo("like")).addColumn("voter_hash", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
2580
2587
  await db.schema.createIndex("idx_comment_reactions_unique").ifNotExists().on("_emdash_comment_reactions").columns([
2581
2588
  "comment_id",
@@ -2585,15 +2592,15 @@ async function up$26(db) {
2585
2592
  await db.schema.createIndex("idx_comment_reactions_comment").ifNotExists().on("_emdash_comment_reactions").column("comment_id").execute();
2586
2593
  await db.schema.createIndex("idx_comment_reactions_voter").ifNotExists().on("_emdash_comment_reactions").columns(["voter_hash", "created_at"]).execute();
2587
2594
  }
2588
- async function down$26(db) {
2595
+ async function down$30(db) {
2589
2596
  await db.schema.dropTable("_emdash_comment_reactions").execute();
2590
2597
  }
2591
2598
 
2592
2599
  //#endregion
2593
2600
  //#region src/database/migrations/045_taxonomy_parent_group.ts
2594
2601
  var _045_taxonomy_parent_group_exports = /* @__PURE__ */ __exportAll({
2595
- down: () => down$25,
2596
- up: () => up$25
2602
+ down: () => down$29,
2603
+ up: () => up$29
2597
2604
  });
2598
2605
  /**
2599
2606
  * Store the parent's `translation_group` in `taxonomies.parent_id` instead of a
@@ -2623,7 +2630,7 @@ var _045_taxonomy_parent_group_exports = /* @__PURE__ */ __exportAll({
2623
2630
  * Dialect-independent: the correlated-subquery `UPDATE` runs on SQLite (incl.
2624
2631
  * D1) and Postgres alike.
2625
2632
  */
2626
- async function up$25(db) {
2633
+ async function up$29(db) {
2627
2634
  await sql`
2628
2635
  UPDATE taxonomies
2629
2636
  SET parent_id = (
@@ -2645,7 +2652,7 @@ async function up$25(db) {
2645
2652
  * locale (the pre-migration shape). Rows with no same-locale parent are left as
2646
2653
  * they are rather than nulled, so a rollback never silently detaches a subtree.
2647
2654
  */
2648
- async function down$25(db) {
2655
+ async function down$29(db) {
2649
2656
  await sql`
2650
2657
  UPDATE taxonomies
2651
2658
  SET parent_id = COALESCE(
@@ -2663,8 +2670,8 @@ async function down$25(db) {
2663
2670
  //#endregion
2664
2671
  //#region src/database/migrations/046_media_usage_index.ts
2665
2672
  var _046_media_usage_index_exports = /* @__PURE__ */ __exportAll({
2666
- down: () => down$24,
2667
- up: () => up$24
2673
+ down: () => down$28,
2674
+ up: () => up$28
2668
2675
  });
2669
2676
  /**
2670
2677
  * Internal media usage projection tables.
@@ -2673,7 +2680,7 @@ var _046_media_usage_index_exports = /* @__PURE__ */ __exportAll({
2673
2680
  * imports, and no content-table scans. Production rows are introduced by later
2674
2681
  * phases once the central snapshot/indexer path is reviewed.
2675
2682
  */
2676
- async function up$24(db) {
2683
+ async function up$28(db) {
2677
2684
  await db.schema.createTable("_emdash_media_usage_sources").ifNotExists().addColumn("source_key", "text", (c) => c.primaryKey()).addColumn("source_type", "text", (c) => c.notNull()).addColumn("collection_slug", "text").addColumn("content_id", "text").addColumn("source_variant", "text", (c) => c.notNull()).addColumn("locale", "text").addColumn("translation_group", "text").addColumn("content_slug", "text").addColumn("content_title", "text").addColumn("content_status", "text").addColumn("content_scheduled_at", "text").addColumn("content_deleted_at", "text").addColumn("revision_id", "text").addColumn("current_generation", "text", (c) => c.notNull()).addColumn("schema_version", "integer", (c) => c.notNull().defaultTo(1)).addColumn("indexed_at", "text", (c) => c.notNull().defaultTo(currentTimestamp(db))).addColumn("created_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (c) => c.defaultTo(currentTimestamp(db))).execute();
2678
2685
  await db.schema.createIndex("idx__emdash_media_usage_sources_content").ifNotExists().on("_emdash_media_usage_sources").columns([
2679
2686
  "source_type",
@@ -2695,7 +2702,7 @@ async function up$24(db) {
2695
2702
  await db.schema.createIndex("idx__emdash_media_usage_provider_asset").ifNotExists().on("_emdash_media_usage").columns(["provider", "provider_asset_id"]).execute();
2696
2703
  await db.schema.createIndex("idx__emdash_media_usage_source_generation").ifNotExists().on("_emdash_media_usage").columns(["source_key", "generation"]).execute();
2697
2704
  }
2698
- async function down$24(db) {
2705
+ async function down$28(db) {
2699
2706
  await db.schema.dropTable("_emdash_media_usage").ifExists().execute();
2700
2707
  await db.schema.dropTable("_emdash_media_usage_sources").ifExists().execute();
2701
2708
  }
@@ -2703,8 +2710,8 @@ async function down$24(db) {
2703
2710
  //#endregion
2704
2711
  //#region src/database/migrations/047_restore_taxonomy_parent_index.ts
2705
2712
  var _047_restore_taxonomy_parent_index_exports = /* @__PURE__ */ __exportAll({
2706
- down: () => down$23,
2707
- up: () => up$23
2713
+ down: () => down$27,
2714
+ up: () => up$27
2708
2715
  });
2709
2716
  /**
2710
2717
  * Restore `idx_taxonomies_parent` on `taxonomies(parent_id)` (#1665).
@@ -2721,18 +2728,18 @@ var _047_restore_taxonomy_parent_index_exports = /* @__PURE__ */ __exportAll({
2721
2728
  * index here. Fresh installs also get it in 036's rebuild for parity with the
2722
2729
  * other rebuilt tables, making this a no-op for them.
2723
2730
  */
2724
- async function up$23(db) {
2731
+ async function up$27(db) {
2725
2732
  await db.schema.createIndex("idx_taxonomies_parent").ifNotExists().on("taxonomies").column("parent_id").execute();
2726
2733
  }
2727
- async function down$23(db) {
2734
+ async function down$27(db) {
2728
2735
  await db.schema.dropIndex("idx_taxonomies_parent").ifExists().execute();
2729
2736
  }
2730
2737
 
2731
2738
  //#endregion
2732
2739
  //#region src/database/migrations/048_restore_content_taxonomies_term_index.ts
2733
2740
  var _048_restore_content_taxonomies_term_index_exports = /* @__PURE__ */ __exportAll({
2734
- down: () => down$22,
2735
- up: () => up$22
2741
+ down: () => down$26,
2742
+ up: () => up$26
2736
2743
  });
2737
2744
  /**
2738
2745
  * Restore `idx_content_taxonomies_term` on `content_taxonomies(taxonomy_id)` (#1701).
@@ -2752,18 +2759,18 @@ var _048_restore_content_taxonomies_term_index_exports = /* @__PURE__ */ __expor
2752
2759
  *
2753
2760
  * Forward-only.
2754
2761
  */
2755
- async function up$22(db) {
2762
+ async function up$26(db) {
2756
2763
  await db.schema.createIndex("idx_content_taxonomies_term").ifNotExists().on("content_taxonomies").column("taxonomy_id").execute();
2757
2764
  }
2758
- async function down$22(db) {
2765
+ async function down$26(db) {
2759
2766
  await db.schema.dropIndex("idx_content_taxonomies_term").ifExists().execute();
2760
2767
  }
2761
2768
 
2762
2769
  //#endregion
2763
2770
  //#region src/database/migrations/049_taxonomies_name_locale_index.ts
2764
2771
  var _049_taxonomies_name_locale_index_exports = /* @__PURE__ */ __exportAll({
2765
- down: () => down$21,
2766
- up: () => up$21
2772
+ down: () => down$25,
2773
+ up: () => up$25
2767
2774
  });
2768
2775
  /**
2769
2776
  * Add composite `idx_taxonomies_name_locale` on `taxonomies(name, locale)` (#1723).
@@ -2784,11 +2791,11 @@ var _049_taxonomies_name_locale_index_exports = /* @__PURE__ */ __exportAll({
2784
2791
  * by the new composite's prefix. Create-before-drop keeps name lookups indexed
2785
2792
  * at every point. Both statements are idempotent so a partial apply can retry.
2786
2793
  */
2787
- async function up$21(db) {
2794
+ async function up$25(db) {
2788
2795
  await db.schema.createIndex("idx_taxonomies_name_locale").ifNotExists().on("taxonomies").columns(["name", "locale"]).execute();
2789
2796
  await db.schema.dropIndex("idx_taxonomies_name").ifExists().execute();
2790
2797
  }
2791
- async function down$21(db) {
2798
+ async function down$25(db) {
2792
2799
  await db.schema.createIndex("idx_taxonomies_name").ifNotExists().on("taxonomies").column("name").execute();
2793
2800
  await db.schema.dropIndex("idx_taxonomies_name_locale").ifExists().execute();
2794
2801
  }
@@ -2796,11 +2803,11 @@ async function down$21(db) {
2796
2803
  //#endregion
2797
2804
  //#region src/database/migrations/050_media_usage_index_status.ts
2798
2805
  var _050_media_usage_index_status_exports = /* @__PURE__ */ __exportAll({
2799
- down: () => down$20,
2800
- up: () => up$20
2806
+ down: () => down$24,
2807
+ up: () => up$24
2801
2808
  });
2802
2809
  const SOURCE_TABLE = "_emdash_media_usage_sources";
2803
- const DUPLICATE_COLUMN_RE$1 = /(?:duplicate column|column .* already exists|already exists.*column)/i;
2810
+ const DUPLICATE_COLUMN_RE$3 = /(?:duplicate column|column .* already exists|already exists.*column)/i;
2804
2811
  /**
2805
2812
  * Media usage index metadata.
2806
2813
  *
@@ -2808,7 +2815,7 @@ const DUPLICATE_COLUMN_RE$1 = /(?:duplicate column|column .* already exists|alre
2808
2815
  * tracking for later reference-index reconciliation. No content scans, no
2809
2816
  * runtime imports, and no backfill.
2810
2817
  */
2811
- async function up$20(db) {
2818
+ async function up$24(db) {
2812
2819
  await addSourceMetadataColumns(db);
2813
2820
  await db.schema.createTable("_emdash_media_usage_index_status").ifNotExists().addColumn("adapter_id", "text", (c) => c.notNull()).addColumn("scope_type", "text", (c) => c.notNull()).addColumn("scope_key", "text", (c) => c.notNull()).addColumn("status", "text", (c) => c.notNull()).addColumn("schema_version", "integer", (c) => c.notNull().defaultTo(1)).addColumn("started_at", "text").addColumn("completed_at", "text").addColumn("cursor", "text").addColumn("indexed_source_count", "integer", (c) => c.notNull().defaultTo(0)).addColumn("failed_source_count", "integer", (c) => c.notNull().defaultTo(0)).addColumn("last_error_code", "text").addColumn("updated_at", "text", (c) => c.notNull().defaultTo(currentTimestamp(db))).addPrimaryKeyConstraint("_emdash_media_usage_index_status_pk", [
2814
2821
  "adapter_id",
@@ -2823,7 +2830,7 @@ async function up$20(db) {
2823
2830
  await db.schema.createIndex("idx__emdash_media_usage_sources_fingerprint").ifNotExists().on("_emdash_media_usage_sources").column("source_fingerprint").execute();
2824
2831
  await db.schema.createIndex("idx__emdash_media_usage_index_status_status").ifNotExists().on("_emdash_media_usage_index_status").columns(["adapter_id", "status"]).execute();
2825
2832
  }
2826
- async function down$20(db) {
2833
+ async function down$24(db) {
2827
2834
  await db.schema.dropIndex("idx__emdash_media_usage_index_status_status").ifExists().execute();
2828
2835
  await db.schema.dropIndex("idx__emdash_media_usage_sources_fingerprint").ifExists().execute();
2829
2836
  await db.schema.dropIndex("idx__emdash_media_usage_sources_completeness").ifExists().execute();
@@ -2843,17 +2850,17 @@ async function addColumnIfMissing$1(db, columnName, addColumn) {
2843
2850
  try {
2844
2851
  await addColumn();
2845
2852
  } catch (error) {
2846
- if (DUPLICATE_COLUMN_RE$1.test(deepErrorMessage$2(error))) {
2853
+ if (DUPLICATE_COLUMN_RE$3.test(deepErrorMessage$4(error))) {
2847
2854
  if (await columnExists(db, SOURCE_TABLE, columnName)) return;
2848
2855
  }
2849
2856
  throw error;
2850
2857
  }
2851
2858
  }
2852
- function deepErrorMessage$2(error) {
2859
+ function deepErrorMessage$4(error) {
2853
2860
  if (error instanceof Error) {
2854
2861
  const own = error.message ?? "";
2855
2862
  if (error.cause) {
2856
- const causeMessage = deepErrorMessage$2(error.cause);
2863
+ const causeMessage = deepErrorMessage$4(error.cause);
2857
2864
  return own ? `${own}: ${causeMessage}` : causeMessage;
2858
2865
  }
2859
2866
  return own;
@@ -2879,8 +2886,8 @@ async function dropSourceMetadataColumns(db) {
2879
2886
  //#endregion
2880
2887
  //#region src/database/migrations/051_content_taxonomies_denorm.ts
2881
2888
  var _051_content_taxonomies_denorm_exports = /* @__PURE__ */ __exportAll({
2882
- down: () => down$19,
2883
- up: () => up$19
2889
+ down: () => down$23,
2890
+ up: () => up$23
2884
2891
  });
2885
2892
  /**
2886
2893
  * Denormalize the filter + sort columns from `ec_*` onto `content_taxonomies`
@@ -2937,7 +2944,7 @@ const INDEXES = [
2937
2944
  columns: "taxonomy_id, collection, deleted_at, locale, created_at DESC, entry_id DESC"
2938
2945
  }
2939
2946
  ];
2940
- async function up$19(db) {
2947
+ async function up$23(db) {
2941
2948
  for (const column of DENORM_COLUMNS) {
2942
2949
  if (await columnExists(db, "content_taxonomies", column)) continue;
2943
2950
  await sql`
@@ -2963,7 +2970,7 @@ async function up$19(db) {
2963
2970
  ON content_taxonomies (${sql.raw(index.columns)})
2964
2971
  `.execute(db);
2965
2972
  }
2966
- async function down$19(db) {
2973
+ async function down$23(db) {
2967
2974
  for (const index of INDEXES) await sql`DROP INDEX IF EXISTS ${sql.ref(index.name)}`.execute(db);
2968
2975
  for (const column of DENORM_COLUMNS) await sql`
2969
2976
  ALTER TABLE content_taxonomies DROP COLUMN ${sql.ref(column)}
@@ -2973,12 +2980,12 @@ async function down$19(db) {
2973
2980
  //#endregion
2974
2981
  //#region src/database/migrations/052_media_usage_read_index.ts
2975
2982
  var _052_media_usage_read_index_exports = /* @__PURE__ */ __exportAll({
2976
- down: () => down$18,
2977
- up: () => up$18
2983
+ down: () => down$22,
2984
+ up: () => up$22
2978
2985
  });
2979
2986
  const OLD_INDEX = "idx__emdash_media_usage_media_id";
2980
2987
  const READ_INDEX = "idx__emdash_media_usage_media_source_generation";
2981
- async function up$18(db) {
2988
+ async function up$22(db) {
2982
2989
  await db.schema.createIndex(READ_INDEX).ifNotExists().on("_emdash_media_usage").columns([
2983
2990
  "media_id",
2984
2991
  "source_key",
@@ -2986,7 +2993,7 @@ async function up$18(db) {
2986
2993
  ]).execute();
2987
2994
  await db.schema.dropIndex(OLD_INDEX).ifExists().execute();
2988
2995
  }
2989
- async function down$18(db) {
2996
+ async function down$22(db) {
2990
2997
  await db.schema.createIndex(OLD_INDEX).ifNotExists().on("_emdash_media_usage").column("media_id").execute();
2991
2998
  await db.schema.dropIndex(READ_INDEX).ifExists().execute();
2992
2999
  }
@@ -2994,15 +3001,15 @@ async function down$18(db) {
2994
3001
  //#endregion
2995
3002
  //#region src/database/migrations/053_plugin_mcp_tools.ts
2996
3003
  var _053_plugin_mcp_tools_exports = /* @__PURE__ */ __exportAll({
2997
- down: () => down$17,
2998
- up: () => up$17
3004
+ down: () => down$21,
3005
+ up: () => up$21
2999
3006
  });
3000
3007
  /** Persist explicit per-plugin MCP enablement and the declaration consented to by an admin. */
3001
- async function up$17(db) {
3008
+ async function up$21(db) {
3002
3009
  if (!await columnExists(db, "_plugin_state", "mcp_tools_enabled")) await db.schema.alterTable("_plugin_state").addColumn("mcp_tools_enabled", "integer", (col) => col.notNull().defaultTo(0)).execute();
3003
3010
  if (!await columnExists(db, "_plugin_state", "mcp_tools_consent")) await db.schema.alterTable("_plugin_state").addColumn("mcp_tools_consent", "text").execute();
3004
3011
  }
3005
- async function down$17(db) {
3012
+ async function down$21(db) {
3006
3013
  await db.schema.alterTable("_plugin_state").dropColumn("mcp_tools_consent").execute();
3007
3014
  await db.schema.alterTable("_plugin_state").dropColumn("mcp_tools_enabled").execute();
3008
3015
  }
@@ -3010,16 +3017,16 @@ async function down$17(db) {
3010
3017
  //#endregion
3011
3018
  //#region src/database/migrations/054_media_upload_attempts.ts
3012
3019
  var _054_media_upload_attempts_exports = /* @__PURE__ */ __exportAll({
3013
- down: () => down$16,
3014
- up: () => up$16
3020
+ down: () => down$20,
3021
+ up: () => up$20
3015
3022
  });
3016
- async function up$16(db) {
3023
+ async function up$20(db) {
3017
3024
  await db.schema.createTable("_emdash_media_upload_attempts").ifNotExists().addColumn("storage_key", "text", (col) => col.primaryKey()).addColumn("media_id", "text", (col) => col.notNull()).addColumn("status", "text", (col) => col.notNull().defaultTo("active")).addColumn("created_at", "text", (col) => col.notNull().defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.notNull().defaultTo(currentTimestamp(db))).execute();
3018
3025
  await db.schema.createIndex("idx_media_upload_attempts_media_id").ifNotExists().on("_emdash_media_upload_attempts").column("media_id").execute();
3019
3026
  await db.schema.createIndex("idx_media_upload_attempts_status_created_at").ifNotExists().on("_emdash_media_upload_attempts").columns(["status", "created_at"]).execute();
3020
3027
  await db.schema.createIndex("idx_media_storage_key").ifNotExists().on("media").column("storage_key").execute();
3021
3028
  }
3022
- async function down$16(db) {
3029
+ async function down$20(db) {
3023
3030
  await db.schema.dropIndex("idx_media_storage_key").ifExists().execute();
3024
3031
  await db.schema.dropTable("_emdash_media_upload_attempts").ifExists().execute();
3025
3032
  }
@@ -3027,8 +3034,8 @@ async function down$16(db) {
3027
3034
  //#endregion
3028
3035
  //#region src/database/migrations/055_content_translation_group_locale_index.ts
3029
3036
  var _055_content_translation_group_locale_index_exports = /* @__PURE__ */ __exportAll({
3030
- down: () => down$15,
3031
- up: () => up$15
3037
+ down: () => down$19,
3038
+ up: () => up$19
3032
3039
  });
3033
3040
  /**
3034
3041
  * Migration: replace the single-column content `translation_group` index with
@@ -3058,7 +3065,7 @@ var _055_content_translation_group_locale_index_exports = /* @__PURE__ */ __expo
3058
3065
  * and the longer forms truncate to the same value for long collection slugs.
3059
3066
  * Keep these identical to the names in `schema/registry.ts`.
3060
3067
  */
3061
- async function up$15(db) {
3068
+ async function up$19(db) {
3062
3069
  const tableNames = await listTablesLike(db, "ec_%");
3063
3070
  for (const tableName of tableNames) {
3064
3071
  await sql`
@@ -3072,7 +3079,7 @@ async function up$15(db) {
3072
3079
  await sql`DROP INDEX IF EXISTS ${sql.ref(`idx_${tableName}_translation_group`)}`.execute(db);
3073
3080
  }
3074
3081
  }
3075
- async function down$15(db) {
3082
+ async function down$19(db) {
3076
3083
  const tableNames = await listTablesLike(db, "ec_%");
3077
3084
  for (const tableName of tableNames) {
3078
3085
  await sql`
@@ -3087,8 +3094,8 @@ async function down$15(db) {
3087
3094
  //#endregion
3088
3095
  //#region src/database/migrations/056_taxonomy_term_sort_order.ts
3089
3096
  var _056_taxonomy_term_sort_order_exports = /* @__PURE__ */ __exportAll({
3090
- down: () => down$14,
3091
- up: () => up$14
3097
+ down: () => down$18,
3098
+ up: () => up$18
3092
3099
  });
3093
3100
  /**
3094
3101
  * Add `taxonomies.sort_order` and mint a position for every existing term.
@@ -3116,7 +3123,7 @@ var _056_taxonomy_term_sort_order_exports = /* @__PURE__ */ __exportAll({
3116
3123
  * Worker gets on the free plan before the migration finishes.
3117
3124
  */
3118
3125
  const GROUPS_PER_UPDATE = 32;
3119
- async function up$14(db) {
3126
+ async function up$18(db) {
3120
3127
  const fresh = !await columnExists(db, "taxonomies", "sort_order");
3121
3128
  if (fresh) await db.schema.alterTable("taxonomies").addColumn("sort_order", "integer", (col) => col.notNull().defaultTo(0)).execute();
3122
3129
  await sql`UPDATE taxonomies SET translation_group = id WHERE translation_group IS NULL`.execute(db);
@@ -3215,15 +3222,15 @@ async function applyByGroup(db, column, values) {
3215
3222
  `.execute(db);
3216
3223
  }
3217
3224
  }
3218
- async function down$14(db) {
3225
+ async function down$18(db) {
3219
3226
  if (await columnExists(db, "taxonomies", "sort_order")) await db.schema.alterTable("taxonomies").dropColumn("sort_order").execute();
3220
3227
  }
3221
3228
 
3222
3229
  //#endregion
3223
3230
  //#region src/database/migrations/057_collection_hidden.ts
3224
3231
  var _057_collection_hidden_exports = /* @__PURE__ */ __exportAll({
3225
- down: () => down$13,
3226
- up: () => up$13
3232
+ down: () => down$17,
3233
+ up: () => up$17
3227
3234
  });
3228
3235
  /**
3229
3236
  * Migration: hide a collection from the admin sidebar.
@@ -3233,18 +3240,18 @@ var _057_collection_hidden_exports = /* @__PURE__ */ __exportAll({
3233
3240
  * URLs) — only its auto-generated sidebar entry is omitted, so plugins that
3234
3241
  * own a collection end to end can steer editors to their own admin UI.
3235
3242
  */
3236
- async function up$13(db) {
3243
+ async function up$17(db) {
3237
3244
  if (!await columnExists(db, "_emdash_collections", "hidden")) await db.schema.alterTable("_emdash_collections").addColumn("hidden", "integer", (col) => col.notNull().defaultTo(0)).execute();
3238
3245
  }
3239
- async function down$13(db) {
3246
+ async function down$17(db) {
3240
3247
  await db.schema.alterTable("_emdash_collections").dropColumn("hidden").execute();
3241
3248
  }
3242
3249
 
3243
3250
  //#endregion
3244
3251
  //#region src/database/migrations/058_collection_sort_order.ts
3245
3252
  var _058_collection_sort_order_exports = /* @__PURE__ */ __exportAll({
3246
- down: () => down$12,
3247
- up: () => up$12
3253
+ down: () => down$16,
3254
+ up: () => up$16
3248
3255
  });
3249
3256
  /**
3250
3257
  * Migration: explicit collection order in the admin sidebar.
@@ -3253,21 +3260,21 @@ var _058_collection_sort_order_exports = /* @__PURE__ */ __exportAll({
3253
3260
  * explicit position: those collections sort after the ordered ones, keeping
3254
3261
  * the alphabetical-by-slug order.
3255
3262
  */
3256
- async function up$12(db) {
3263
+ async function up$16(db) {
3257
3264
  if (!await columnExists(db, "_emdash_collections", "sort_order")) await db.schema.alterTable("_emdash_collections").addColumn("sort_order", "integer").execute();
3258
3265
  }
3259
- async function down$12(db) {
3266
+ async function down$16(db) {
3260
3267
  await db.schema.alterTable("_emdash_collections").dropColumn("sort_order").execute();
3261
3268
  }
3262
3269
 
3263
3270
  //#endregion
3264
3271
  //#region src/database/migrations/059_revision_prune_queue.ts
3265
3272
  var _059_revision_prune_queue_exports = /* @__PURE__ */ __exportAll({
3266
- down: () => down$11,
3267
- up: () => up$11
3273
+ down: () => down$15,
3274
+ up: () => up$15
3268
3275
  });
3269
3276
  const REVISION_KEEP_COUNT = 50;
3270
- async function up$11(db) {
3277
+ async function up$15(db) {
3271
3278
  await db.schema.createTable("_emdash_revision_prune_queue").ifNotExists().addColumn("collection", "text", (column) => column.notNull()).addColumn("entry_id", "text", (column) => column.notNull()).addColumn("revision_id", "text", (column) => column.notNull()).addPrimaryKeyConstraint("revision_prune_queue_pk", ["collection", "entry_id"]).execute();
3272
3279
  await db.schema.createIndex("idx_revision_prune_queue_revision_id").ifNotExists().on("_emdash_revision_prune_queue").column("revision_id").execute();
3273
3280
  await sql`
@@ -3281,33 +3288,33 @@ async function up$11(db) {
3281
3288
  DO UPDATE SET revision_id = excluded.revision_id
3282
3289
  `.execute(db);
3283
3290
  }
3284
- async function down$11(db) {
3291
+ async function down$15(db) {
3285
3292
  await db.schema.dropTable("_emdash_revision_prune_queue").ifExists().execute();
3286
3293
  }
3287
3294
 
3288
3295
  //#endregion
3289
3296
  //#region src/database/migrations/060_collection_admin_config.ts
3290
3297
  var _060_collection_admin_config_exports = /* @__PURE__ */ __exportAll({
3291
- down: () => down$10,
3292
- up: () => up$10
3298
+ down: () => down$14,
3299
+ up: () => up$14
3293
3300
  });
3294
3301
  /** Persist collection-level admin presentation options. */
3295
- async function up$10(db) {
3302
+ async function up$14(db) {
3296
3303
  if (!await columnExists(db, "_emdash_collections", "admin_config")) await db.schema.alterTable("_emdash_collections").addColumn("admin_config", "text").execute();
3297
3304
  }
3298
- async function down$10(db) {
3305
+ async function down$14(db) {
3299
3306
  if (await columnExists(db, "_emdash_collections", "admin_config")) await db.schema.alterTable("_emdash_collections").dropColumn("admin_config").execute();
3300
3307
  }
3301
3308
 
3302
3309
  //#endregion
3303
3310
  //#region src/database/migrations/061_media_usage_cleanup.ts
3304
3311
  var _061_media_usage_cleanup_exports = /* @__PURE__ */ __exportAll({
3305
- down: () => down$9,
3306
- up: () => up$9
3312
+ down: () => down$13,
3313
+ up: () => up$13
3307
3314
  });
3308
3315
  const CLEANUP_TASK_KEY = "projection_gc";
3309
3316
  const INITIAL_ELIGIBLE_AT = "1970-01-01T00:00:00.000Z";
3310
- async function up$9(db) {
3317
+ async function up$13(db) {
3311
3318
  await db.schema.createIndex("idx__emdash_media_usage_cleanup_scan").ifNotExists().on("_emdash_media_usage").columns([
3312
3319
  "created_at",
3313
3320
  "id",
@@ -3323,7 +3330,7 @@ async function up$9(db) {
3323
3330
  ON CONFLICT (task_key) DO NOTHING
3324
3331
  `.execute(db);
3325
3332
  }
3326
- async function down$9(db) {
3333
+ async function down$13(db) {
3327
3334
  await db.schema.dropIndex("idx__emdash_media_usage_generation_writes_expiry").ifExists().execute();
3328
3335
  await db.schema.dropTable("_emdash_media_usage_generation_writes").ifExists().execute();
3329
3336
  await db.schema.dropTable("_emdash_media_usage_cleanup").ifExists().execute();
@@ -3333,10 +3340,10 @@ async function down$9(db) {
3333
3340
  //#endregion
3334
3341
  //#region src/database/migrations/062_media_usage_cleanup_fence.ts
3335
3342
  var _062_media_usage_cleanup_fence_exports = /* @__PURE__ */ __exportAll({
3336
- down: () => down$8,
3337
- up: () => up$8
3343
+ down: () => down$12,
3344
+ up: () => up$12
3338
3345
  });
3339
- async function up$8(db) {
3346
+ async function up$12(db) {
3340
3347
  if (!await columnExists(db, "_emdash_media_usage", "cleanup_lease_token")) await db.schema.alterTable("_emdash_media_usage").addColumn("cleanup_lease_token", "text").execute();
3341
3348
  await db.schema.createTable("_emdash_media_usage_cleanup_fence").ifNotExists().addColumn("task_key", "text", (c) => c.primaryKey()).addColumn("generation_floor", "text", (c) => c.notNull()).addColumn("updated_at", "text", (c) => c.notNull().defaultTo(currentTimestamp(db))).execute();
3342
3349
  if (isPostgres(db)) {
@@ -3518,7 +3525,7 @@ async function up$8(db) {
3518
3525
  END
3519
3526
  `).execute(db);
3520
3527
  }
3521
- async function down$8(db) {
3528
+ async function down$12(db) {
3522
3529
  if (isPostgres(db)) {
3523
3530
  await sql.raw("DROP TRIGGER IF EXISTS emdash_media_usage_record_cleanup_fence ON _emdash_media_usage").execute(db);
3524
3531
  await sql.raw("DROP TRIGGER IF EXISTS emdash_media_usage_fence_source_generation_update ON _emdash_media_usage_sources").execute(db);
@@ -3541,14 +3548,14 @@ async function down$8(db) {
3541
3548
  //#endregion
3542
3549
  //#region src/database/migrations/063_media_usage_incremental_work.ts
3543
3550
  var _063_media_usage_incremental_work_exports = /* @__PURE__ */ __exportAll({
3544
- down: () => down$7,
3545
- up: () => up$7
3551
+ down: () => down$11,
3552
+ up: () => up$11
3546
3553
  });
3547
3554
  const ACTIVATION_KEY$1 = "incremental_capture";
3548
3555
  const CONTENT_ADAPTER_ID = "content-media";
3549
3556
  const COLLECTION_SCOPE = "collection";
3550
- const DUPLICATE_COLUMN_RE = /(?:duplicate column|column .* already exists|already exists.*column)/i;
3551
- async function up$7(db) {
3557
+ const DUPLICATE_COLUMN_RE$2 = /(?:duplicate column|column .* already exists|already exists.*column)/i;
3558
+ async function up$11(db) {
3552
3559
  await db.schema.createTable("_emdash_media_usage_activation").ifNotExists().addColumn("task_key", "text", (column) => column.primaryKey()).addColumn("state", "text", (column) => column.notNull().defaultTo("expanded")).addColumn("runtime_generation", "integer", (column) => column.notNull().defaultTo(1)).addColumn("collection_cursor", "text").addColumn("drain_confirmed_at", "text").addColumn("lease_token", "text").addColumn("lease_expires_at", "text").addColumn("attempt_count", "integer", (column) => column.notNull().defaultTo(0)).addColumn("last_attempted_at", "text").addColumn("last_error_code", "text").addColumn("activated_at", "text").addColumn("created_at", "text", (column) => column.notNull().defaultTo(sortableUtcTimestamp$2(db))).addColumn("updated_at", "text", (column) => column.notNull().defaultTo(sortableUtcTimestamp$2(db))).execute();
3553
3560
  await sql`
3554
3561
  INSERT INTO _emdash_media_usage_activation (task_key, state)
@@ -3645,7 +3652,7 @@ async function up$7(db) {
3645
3652
  )
3646
3653
  `.execute(db);
3647
3654
  }
3648
- async function down$7(db) {
3655
+ async function down$11(db) {
3649
3656
  await assertRollbackIsEmptyAndInactive(db);
3650
3657
  await db.schema.dropIndex("idx__emdash_media_usage_sources_identity").ifExists().execute();
3651
3658
  await db.schema.dropIndex("idx__emdash_media_usage_status_collection").ifExists().execute();
@@ -3762,7 +3769,7 @@ async function addColumnIfMissing(db, tableName, columnName, addColumn) {
3762
3769
  try {
3763
3770
  await addColumn();
3764
3771
  } catch (error) {
3765
- if (DUPLICATE_COLUMN_RE.test(deepErrorMessage$1(error))) {
3772
+ if (DUPLICATE_COLUMN_RE$2.test(deepErrorMessage$3(error))) {
3766
3773
  if (await columnExists(db, tableName, columnName)) return;
3767
3774
  }
3768
3775
  throw error;
@@ -3772,11 +3779,11 @@ function sortableUtcTimestamp$2(db) {
3772
3779
  if (isPostgres(db)) return sql`to_char(clock_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')`;
3773
3780
  return sql`(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`;
3774
3781
  }
3775
- function deepErrorMessage$1(error) {
3782
+ function deepErrorMessage$3(error) {
3776
3783
  if (error instanceof Error) {
3777
3784
  const own = error.message ?? "";
3778
3785
  if (error.cause) {
3779
- const causeMessage = deepErrorMessage$1(error.cause);
3786
+ const causeMessage = deepErrorMessage$3(error.cause);
3780
3787
  return own ? `${own}: ${causeMessage}` : causeMessage;
3781
3788
  }
3782
3789
  return own;
@@ -3792,10 +3799,10 @@ function deepErrorMessage$1(error) {
3792
3799
  //#endregion
3793
3800
  //#region src/database/migrations/064_fts_plain_text.ts
3794
3801
  var _064_fts_plain_text_exports = /* @__PURE__ */ __exportAll({
3795
- down: () => down$6,
3796
- up: () => up$6
3802
+ down: () => down$10,
3803
+ up: () => up$10
3797
3804
  });
3798
- async function up$6(db) {
3805
+ async function up$10(db) {
3799
3806
  if (!isSqlite(db)) return;
3800
3807
  const collections = await sql`
3801
3808
  SELECT slug, search_config FROM _emdash_collections
@@ -3819,7 +3826,7 @@ async function up$6(db) {
3819
3826
  * at runtime and the self-contained shape remains fully functional for
3820
3827
  * older code paths that only MATCH and join on id.
3821
3828
  */
3822
- async function down$6(_db) {}
3829
+ async function down$10(_db) {}
3823
3830
  function isSearchEnabled(searchConfig) {
3824
3831
  if (!searchConfig) return false;
3825
3832
  try {
@@ -3942,10 +3949,10 @@ async function rebuildIndex(db, collectionSlug, fields, tokenizer) {
3942
3949
  //#endregion
3943
3950
  //#region src/database/migrations/065_media_usage_collection_deletion.ts
3944
3951
  var _065_media_usage_collection_deletion_exports = /* @__PURE__ */ __exportAll({
3945
- down: () => down$5,
3946
- up: () => up$5
3952
+ down: () => down$9,
3953
+ up: () => up$9
3947
3954
  });
3948
- async function up$5(db) {
3955
+ async function up$9(db) {
3949
3956
  await db.schema.createTable("_emdash_media_usage_collection_deletions").ifNotExists().addColumn("collection_id", "text", (column) => column.notNull().primaryKey()).addColumn("collection_slug", "text", (column) => column.notNull().unique()).addColumn("force_delete", "integer", (column) => column.notNull()).addColumn("state", "text", (column) => column.notNull().defaultTo("pending")).addColumn("phase", "text", (column) => column.notNull().defaultTo("fence")).addColumn("work_cursor", "text").addColumn("source_key", "text").addColumn("occurrence_cursor", "text").addColumn("attempt_count", "integer", (column) => column.notNull().defaultTo(0)).addColumn("next_attempt_at", "text", (column) => column.notNull()).addColumn("lease_token", "text").addColumn("lease_expires_at", "text").addColumn("last_error_code", "text").addColumn("created_at", "text", (column) => column.notNull().defaultTo(sortableUtcTimestamp$1(db))).addColumn("updated_at", "text", (column) => column.notNull().defaultTo(sortableUtcTimestamp$1(db))).execute();
3950
3957
  await db.schema.createIndex("idx__emdash_media_usage_collection_deletions_due").ifNotExists().on("_emdash_media_usage_collection_deletions").columns([
3951
3958
  "state",
@@ -3971,7 +3978,7 @@ async function up$5(db) {
3971
3978
  ]).execute();
3972
3979
  await db.schema.createIndex("idx__emdash_media_usage_source_cursor").ifNotExists().on("_emdash_media_usage").columns(["source_key", "id"]).execute();
3973
3980
  }
3974
- async function down$5(db) {
3981
+ async function down$9(db) {
3975
3982
  if ((await sql`
3976
3983
  SELECT 1 AS present
3977
3984
  FROM _emdash_media_usage_collection_deletions
@@ -3989,11 +3996,11 @@ function sortableUtcTimestamp$1(db) {
3989
3996
  //#endregion
3990
3997
  //#region src/database/migrations/066_media_usage_reconciliation.ts
3991
3998
  var _066_media_usage_reconciliation_exports = /* @__PURE__ */ __exportAll({
3992
- down: () => down$4,
3993
- up: () => up$4
3999
+ down: () => down$8,
4000
+ up: () => up$8
3994
4001
  });
3995
4002
  const ACTIVATION_KEY = "incremental_capture";
3996
- async function up$4(db) {
4003
+ async function up$8(db) {
3997
4004
  await db.schema.createTable("_emdash_media_usage_reconciliations").ifNotExists().addColumn("collection_id", "text", (column) => column.notNull().primaryKey()).addColumn("collection_slug", "text", (column) => column.notNull()).addColumn("run_token", "text", (column) => column.notNull()).addColumn("target_epoch", "bigint").addColumn("field_fingerprint", "text").addColumn("state", "text", (column) => column.notNull().defaultTo("pending")).addColumn("phase", "text", (column) => column.notNull().defaultTo("scan")).addColumn("scan_cursor", "text").addColumn("scan_upper_id", "text").addColumn("source_cursor", "text").addColumn("source_upper_key", "text").addColumn("attempt_count", "integer", (column) => column.notNull().defaultTo(0)).addColumn("next_attempt_at", "text", (column) => column.notNull()).addColumn("lease_token", "text").addColumn("lease_expires_at", "text").addColumn("last_error_code", "text").addColumn("created_at", "text", (column) => column.notNull().defaultTo(sortableUtcTimestamp(db))).addColumn("updated_at", "text", (column) => column.notNull().defaultTo(sortableUtcTimestamp(db))).execute();
3998
4005
  await db.schema.createIndex("idx__emdash_media_usage_reconciliations_due").ifNotExists().on("_emdash_media_usage_reconciliations").columns([
3999
4006
  "state",
@@ -4021,7 +4028,7 @@ async function up$4(db) {
4021
4028
  ]).execute();
4022
4029
  if (!await columnExists(db, "_emdash_media_usage_activation", "media_usage_maintenance_turn")) await db.schema.alterTable("_emdash_media_usage_activation").addColumn("media_usage_maintenance_turn", "integer", (column) => column.notNull().defaultTo(2)).execute();
4023
4030
  }
4024
- async function down$4(db) {
4031
+ async function down$8(db) {
4025
4032
  if (await tableExists(db, "_emdash_media_usage_reconciliations")) {
4026
4033
  if ((await sql`
4027
4034
  SELECT 1 AS present
@@ -4049,15 +4056,15 @@ function sortableUtcTimestamp(db) {
4049
4056
  //#endregion
4050
4057
  //#region src/database/migrations/067_indexed_content_fields.ts
4051
4058
  var _067_indexed_content_fields_exports = /* @__PURE__ */ __exportAll({
4052
- down: () => down$3,
4053
- up: () => up$3
4059
+ down: () => down$7,
4060
+ up: () => up$7
4054
4061
  });
4055
4062
  const FIELD_ID_PATTERN = /^[0-9A-Z]{26}$/;
4056
4063
  /** Mark custom fields whose structured list queries are backed by a physical index. */
4057
- async function up$3(db) {
4064
+ async function up$7(db) {
4058
4065
  if (!await columnExists(db, "_emdash_fields", "indexed")) await db.schema.alterTable("_emdash_fields").addColumn("indexed", "integer", (column) => column.notNull().defaultTo(0)).execute();
4059
4066
  }
4060
- async function down$3(db) {
4067
+ async function down$7(db) {
4061
4068
  if (!await columnExists(db, "_emdash_fields", "indexed")) return;
4062
4069
  const indexedFields = await sql`
4063
4070
  SELECT id FROM _emdash_fields WHERE indexed = 1
@@ -4077,8 +4084,8 @@ async function down$3(db) {
4077
4084
  //#endregion
4078
4085
  //#region src/database/migrations/068_content_taxonomy_entry_groups.ts
4079
4086
  var _068_content_taxonomy_entry_groups_exports = /* @__PURE__ */ __exportAll({
4080
- down: () => down$2,
4081
- up: () => up$2
4087
+ down: () => down$6,
4088
+ up: () => up$6
4082
4089
  });
4083
4090
  const LEGACY_DENORM_INDEXES = [
4084
4091
  "idx_content_taxonomies_pub",
@@ -4092,7 +4099,7 @@ const LEGACY_DENORM_INDEXES = [
4092
4099
  * and term group. Rows whose content table or content entry no longer exists
4093
4100
  * are left untouched.
4094
4101
  */
4095
- async function up$2(db) {
4102
+ async function up$6(db) {
4096
4103
  const tableNames = await listTablesLike(db, "ec_%");
4097
4104
  for (const tableName of tableNames) {
4098
4105
  validateIdentifier(tableName, "content table name");
@@ -4124,13 +4131,13 @@ async function up$2(db) {
4124
4131
  ]).execute();
4125
4132
  }
4126
4133
  /** The collapsed per-locale rows cannot be reconstructed. */
4127
- async function down$2(_db) {}
4134
+ async function down$6(_db) {}
4128
4135
 
4129
4136
  //#endregion
4130
4137
  //#region src/database/migrations/069_collection_title_date_fields.ts
4131
4138
  var _069_collection_title_date_fields_exports = /* @__PURE__ */ __exportAll({
4132
- down: () => down$1,
4133
- up: () => up$1
4139
+ down: () => down$5,
4140
+ up: () => up$5
4134
4141
  });
4135
4142
  /**
4136
4143
  * Migration: configurable title and date fields for collections
@@ -4143,7 +4150,7 @@ var _069_collection_title_date_fields_exports = /* @__PURE__ */ __exportAll({
4143
4150
  * Column adds/drops are guarded by `columnExists`: D1 has no transactions, so a
4144
4151
  * migration can partially apply without being recorded and later re-run.
4145
4152
  */
4146
- async function up$1(db) {
4153
+ async function up$5(db) {
4147
4154
  if (!await columnExists(db, "_emdash_collections", "title_field")) await sql`
4148
4155
  ALTER TABLE _emdash_collections
4149
4156
  ADD COLUMN title_field TEXT
@@ -4153,7 +4160,7 @@ async function up$1(db) {
4153
4160
  ADD COLUMN date_field TEXT
4154
4161
  `.execute(db);
4155
4162
  }
4156
- async function down$1(db) {
4163
+ async function down$5(db) {
4157
4164
  if (await columnExists(db, "_emdash_collections", "date_field")) await sql`
4158
4165
  ALTER TABLE _emdash_collections
4159
4166
  DROP COLUMN date_field
@@ -4167,14 +4174,184 @@ async function down$1(db) {
4167
4174
  //#endregion
4168
4175
  //#region src/database/migrations/070_collection_routable.ts
4169
4176
  var _070_collection_routable_exports = /* @__PURE__ */ __exportAll({
4177
+ down: () => down$4,
4178
+ up: () => up$4
4179
+ });
4180
+ async function up$4(db) {
4181
+ if (!await columnExists(db, "_emdash_collections", "routable")) await db.schema.alterTable("_emdash_collections").addColumn("routable", "integer", (col) => col.notNull().defaultTo(1)).execute();
4182
+ }
4183
+ async function down$4(db) {
4184
+ if (await columnExists(db, "_emdash_collections", "routable")) await db.schema.alterTable("_emdash_collections").dropColumn("routable").execute();
4185
+ }
4186
+
4187
+ //#endregion
4188
+ //#region src/database/migrations/071_restore_content_bylines_table.ts
4189
+ var _071_restore_content_bylines_table_exports = /* @__PURE__ */ __exportAll({
4190
+ down: () => down$3,
4191
+ up: () => up$3
4192
+ });
4193
+ /**
4194
+ * Restore `_emdash_content_bylines` where migration 040's SQLite rebuild
4195
+ * stopped between dropping the old table and renaming the staged copy.
4196
+ *
4197
+ * 040 guards its rebuild on `PRAGMA foreign_key_list`, which returns no rows
4198
+ * for a missing table, so a retry after that partial run skips the rename and
4199
+ * leaves `_emdash_content_bylines_new` behind with the credits inside. The
4200
+ * indexes went with the dropped table.
4201
+ *
4202
+ * The Postgres path of 040 alters the table in place, so this is a no-op there.
4203
+ */
4204
+ async function up$3(db) {
4205
+ if (!isSqlite(db)) return;
4206
+ if (!await tableExists(db, "_emdash_content_bylines")) {
4207
+ if (!await tableExists(db, "_emdash_content_bylines_new")) return;
4208
+ await sql`ALTER TABLE _emdash_content_bylines_new RENAME TO _emdash_content_bylines`.execute(db);
4209
+ }
4210
+ await db.schema.createIndex("idx_content_bylines_content").ifNotExists().on("_emdash_content_bylines").columns([
4211
+ "collection_slug",
4212
+ "content_id",
4213
+ "sort_order"
4214
+ ]).execute();
4215
+ await db.schema.createIndex("idx_content_bylines_byline").ifNotExists().on("_emdash_content_bylines").column("byline_id").execute();
4216
+ }
4217
+ async function down$3(_db) {}
4218
+
4219
+ //#endregion
4220
+ //#region src/database/migrations/072_media_folders.ts
4221
+ var _072_media_folders_exports = /* @__PURE__ */ __exportAll({
4222
+ down: () => down$2,
4223
+ up: () => up$2
4224
+ });
4225
+ const DUPLICATE_COLUMN_RE$1 = /(?:duplicate column|column .* already exists|already exists.*column)/i;
4226
+ async function up$2(db) {
4227
+ await db.schema.createTable("media_folders").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull()).addColumn("name_key", "text", (col) => col.notNull().unique()).execute();
4228
+ await addFolderColumnIfMissing(db, () => db.schema.alterTable("media").addColumn("folder_id", "text", (col) => col.references("media_folders.id").onDelete("set null")).execute());
4229
+ await db.schema.createIndex("idx_media_folder_id").ifNotExists().on("media").column("folder_id").execute();
4230
+ }
4231
+ async function down$2(db) {
4232
+ await db.schema.dropIndex("idx_media_folder_id").ifExists().execute();
4233
+ if (await columnExists(db, "media", "folder_id")) await db.schema.alterTable("media").dropColumn("folder_id").execute();
4234
+ await db.schema.dropTable("media_folders").ifExists().execute();
4235
+ }
4236
+ async function addFolderColumnIfMissing(db, addColumn) {
4237
+ if (await columnExists(db, "media", "folder_id")) return;
4238
+ try {
4239
+ await addColumn();
4240
+ } catch (error) {
4241
+ if (DUPLICATE_COLUMN_RE$1.test(deepErrorMessage$2(error))) {
4242
+ if (await columnExists(db, "media", "folder_id")) return;
4243
+ }
4244
+ throw error;
4245
+ }
4246
+ }
4247
+ function deepErrorMessage$2(error) {
4248
+ if (error instanceof Error) {
4249
+ const own = error.message ?? "";
4250
+ if (error.cause) {
4251
+ const causeMessage = deepErrorMessage$2(error.cause);
4252
+ return own ? `${own}: ${causeMessage}` : causeMessage;
4253
+ }
4254
+ return own;
4255
+ }
4256
+ if (typeof error === "string") return error;
4257
+ try {
4258
+ return JSON.stringify(error);
4259
+ } catch {
4260
+ return String(error);
4261
+ }
4262
+ }
4263
+
4264
+ //#endregion
4265
+ //#region src/database/migrations/073_media_focal_point.ts
4266
+ var _073_media_focal_point_exports = /* @__PURE__ */ __exportAll({
4267
+ addFocalColumnIfMissing: () => addFocalColumnIfMissing,
4268
+ down: () => down$1,
4269
+ up: () => up$1
4270
+ });
4271
+ const DUPLICATE_COLUMN_RE = /(?:duplicate column|column .* already exists|already exists.*column)/i;
4272
+ async function up$1(db) {
4273
+ await addFocalColumnIfMissing(db, "focal_x", () => db.schema.alterTable("media").addColumn("focal_x", "real").execute());
4274
+ await addFocalColumnIfMissing(db, "focal_y", () => db.schema.alterTable("media").addColumn("focal_y", "real").execute());
4275
+ }
4276
+ async function down$1(db) {
4277
+ if (await columnExists(db, "media", "focal_y")) await db.schema.alterTable("media").dropColumn("focal_y").execute();
4278
+ if (await columnExists(db, "media", "focal_x")) await db.schema.alterTable("media").dropColumn("focal_x").execute();
4279
+ }
4280
+ async function addFocalColumnIfMissing(db, column, addColumn) {
4281
+ if (await columnExists(db, "media", column)) return;
4282
+ try {
4283
+ await addColumn();
4284
+ } catch (error) {
4285
+ if (DUPLICATE_COLUMN_RE.test(deepErrorMessage$1(error))) {
4286
+ if (await columnExists(db, "media", column)) return;
4287
+ }
4288
+ throw error;
4289
+ }
4290
+ }
4291
+ function deepErrorMessage$1(error) {
4292
+ if (error instanceof Error) {
4293
+ const own = error.message ?? "";
4294
+ if (error.cause) {
4295
+ const causeMessage = deepErrorMessage$1(error.cause);
4296
+ return own ? `${own}: ${causeMessage}` : causeMessage;
4297
+ }
4298
+ return own;
4299
+ }
4300
+ if (typeof error === "string") return error;
4301
+ try {
4302
+ return JSON.stringify(error);
4303
+ } catch {
4304
+ return String(error);
4305
+ }
4306
+ }
4307
+
4308
+ //#endregion
4309
+ //#region src/database/migrations/074_content_deleted_scheduled_index.ts
4310
+ var _074_content_deleted_scheduled_index_exports = /* @__PURE__ */ __exportAll({
4170
4311
  down: () => down,
4171
4312
  up: () => up
4172
4313
  });
4314
+ /**
4315
+ * Migration: replace the single-column partial `scheduled_at` index on content
4316
+ * tables with a `(deleted_at, scheduled_at)` composite.
4317
+ *
4318
+ * The scheduled-publishing sweep filters `scheduled_at` by range and
4319
+ * `deleted_at IS NULL`, ordered by `scheduled_at`. A `scheduled_at`-only index
4320
+ * cannot satisfy the soft-delete term, so a stats-blind planner seeks a
4321
+ * `deleted_at`-leading composite instead and reads every live row. Leading with
4322
+ * `deleted_at` lets one index serve the equality, the range, and the ORDER BY.
4323
+ * D1 never has `sqlite_stat1`, so the index shape is the only lever.
4324
+ *
4325
+ * The partial predicate from migration 030 is kept so the index stays
4326
+ * proportional to scheduled content rather than to the table.
4327
+ *
4328
+ * Forward-only and idempotent (`IF NOT EXISTS`).
4329
+ *
4330
+ * The short `del_sched` suffix keeps the name inside Postgres's 63-byte
4331
+ * identifier limit for long collection slugs. Keep it identical to the name in
4332
+ * `schema/registry.ts`.
4333
+ */
4173
4334
  async function up(db) {
4174
- if (!await columnExists(db, "_emdash_collections", "routable")) await db.schema.alterTable("_emdash_collections").addColumn("routable", "integer", (col) => col.notNull().defaultTo(1)).execute();
4335
+ const tableNames = await listTablesLike(db, "ec_%");
4336
+ for (const tableName of tableNames) {
4337
+ await sql`
4338
+ CREATE INDEX IF NOT EXISTS ${sql.ref(`idx_${tableName}_del_sched`)}
4339
+ ON ${sql.ref(tableName)} (deleted_at, scheduled_at)
4340
+ WHERE scheduled_at IS NOT NULL
4341
+ `.execute(db);
4342
+ await sql`DROP INDEX IF EXISTS ${sql.ref(`idx_${tableName}_scheduled`)}`.execute(db);
4343
+ }
4175
4344
  }
4176
4345
  async function down(db) {
4177
- if (await columnExists(db, "_emdash_collections", "routable")) await db.schema.alterTable("_emdash_collections").dropColumn("routable").execute();
4346
+ const tableNames = await listTablesLike(db, "ec_%");
4347
+ for (const tableName of tableNames) {
4348
+ await sql`
4349
+ CREATE INDEX IF NOT EXISTS ${sql.ref(`idx_${tableName}_scheduled`)}
4350
+ ON ${sql.ref(tableName)} (scheduled_at)
4351
+ WHERE scheduled_at IS NOT NULL
4352
+ `.execute(db);
4353
+ await sql`DROP INDEX IF EXISTS ${sql.ref(`idx_${tableName}_del_sched`)}`.execute(db);
4354
+ }
4178
4355
  }
4179
4356
 
4180
4357
  //#endregion
@@ -4248,7 +4425,11 @@ const MIGRATIONS = Object.freeze({
4248
4425
  "067_indexed_content_fields": _067_indexed_content_fields_exports,
4249
4426
  "068_content_taxonomy_entry_groups": _068_content_taxonomy_entry_groups_exports,
4250
4427
  "069_collection_title_date_fields": _069_collection_title_date_fields_exports,
4251
- "070_collection_routable": _070_collection_routable_exports
4428
+ "070_collection_routable": _070_collection_routable_exports,
4429
+ "071_restore_content_bylines_table": _071_restore_content_bylines_table_exports,
4430
+ "072_media_folders": _072_media_folders_exports,
4431
+ "073_media_focal_point": _073_media_focal_point_exports,
4432
+ "074_content_deleted_scheduled_index": _074_content_deleted_scheduled_index_exports
4252
4433
  });
4253
4434
  /** Ordered names from the statically registered migration set. */
4254
4435
  const MIGRATION_NAMES = Object.freeze(Object.keys(MIGRATIONS));
@@ -4319,7 +4500,7 @@ function escapeRegExp(value) {
4319
4500
  *
4320
4501
  * We match on the table name (not the full error text) because different
4321
4502
  * SQLite drivers phrase the message differently
4322
- * (`UNIQUE constraint failed: _emdash_migrations.name` for better-sqlite3,
4503
+ * (`UNIQUE constraint failed: _emdash_migrations.name` for file-backed SQLite,
4323
4504
  * `D1_ERROR: UNIQUE constraint failed: _emdash_migrations.name: SQLITE_CONSTRAINT`
4324
4505
  * for D1, etc.). The pattern is built from `MIGRATION_TABLE` so a rename
4325
4506
  * cannot silently disable race detection.
@@ -4338,7 +4519,7 @@ const MIGRATION_RACE_POLL_MS = 100;
4338
4519
  * Pattern used to detect "table does not exist" errors across the dialects
4339
4520
  * EmDash supports. The phrasing differs by driver:
4340
4521
  *
4341
- * - better-sqlite3: `no such table: _emdash_migrations`
4522
+ * - SQLite: `no such table: _emdash_migrations`
4342
4523
  * - D1: `D1_ERROR: no such table: _emdash_migrations: SQLITE_ERROR`
4343
4524
  * - PostgreSQL: `relation "_emdash_migrations" does not exist`
4344
4525
  * (also occasionally `table "_emdash_migrations" does not exist`)
@@ -4492,4 +4673,4 @@ async function rollbackMigration(db, options) {
4492
4673
 
4493
4674
  //#endregion
4494
4675
  export { getMigrationStatus as a, __exportAll as c, getExactMigrationStatus as i, MIGRATION_NAMES as n, rollbackMigration as o, MIGRATION_RACE_WAIT_MS as r, runMigrations as s, ConcurrentMigrationTimeoutError as t };
4495
- //# sourceMappingURL=runner-C1T11CfC.mjs.map
4676
+ //# sourceMappingURL=runner-BLIDKpmA.mjs.map