emdash 0.29.0 → 0.30.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 (839) hide show
  1. package/dist/{adapters-DPAkL6QF.d.mts → adapters-C0ONzkUP.d.mts} +10 -1
  2. package/dist/adapters-C0ONzkUP.d.mts.map +1 -0
  3. package/dist/{allowed-origins-FXB-FplB.mjs → allowed-origins-CCEi9bPI.mjs} +2 -2
  4. package/dist/{allowed-origins-FXB-FplB.mjs.map → allowed-origins-CCEi9bPI.mjs.map} +1 -1
  5. package/dist/api/route-utils.d.mts +3 -3
  6. package/dist/api/route-utils.d.mts.map +1 -1
  7. package/dist/api/route-utils.mjs +19 -19
  8. package/dist/api/schemas/index.d.mts +2 -2
  9. package/dist/api/schemas/index.mjs +5 -4
  10. package/dist/{api-DVbHNApo.mjs → api-b8WIiGU4.mjs} +253 -153
  11. package/dist/api-b8WIiGU4.mjs.map +1 -0
  12. package/dist/api-tokens-Cvmixds7.mjs +3 -0
  13. package/dist/{api-tokens-UYBkl17d.mjs → api-tokens-uPt8UDpx.mjs} +2 -2
  14. package/dist/{api-tokens-UYBkl17d.mjs.map → api-tokens-uPt8UDpx.mjs.map} +1 -1
  15. package/dist/{apply-D23iUV4q.mjs → apply-CmIJK9j8.mjs} +34 -37
  16. package/dist/apply-CmIJK9j8.mjs.map +1 -0
  17. package/dist/astro/index.d.mts +12 -13
  18. package/dist/astro/index.d.mts.map +1 -1
  19. package/dist/astro/index.mjs +90 -11
  20. package/dist/astro/index.mjs.map +1 -1
  21. package/dist/astro/middleware/auth.d.mts +10 -11
  22. package/dist/astro/middleware/auth.d.mts.map +1 -1
  23. package/dist/astro/middleware/auth.mjs +56 -107
  24. package/dist/astro/middleware/auth.mjs.map +1 -1
  25. package/dist/astro/middleware/redirect.mjs +7 -7
  26. package/dist/astro/middleware/request-context.mjs +4 -4
  27. package/dist/astro/middleware/request-context.mjs.map +1 -1
  28. package/dist/astro/middleware/setup.mjs +1 -1
  29. package/dist/astro/middleware.d.mts +47 -3
  30. package/dist/astro/middleware.d.mts.map +1 -1
  31. package/dist/astro/middleware.mjs +326 -110
  32. package/dist/astro/middleware.mjs.map +1 -1
  33. package/dist/astro/routes/PluginRegistry.d.mts +5 -1
  34. package/dist/astro/routes/PluginRegistry.d.mts.map +1 -1
  35. package/dist/astro/routes/PluginRegistry.mjs +2 -1
  36. package/dist/astro/routes/PluginRegistry.mjs.map +1 -1
  37. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +9 -8
  38. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
  39. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +9 -8
  40. package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
  41. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +5 -5
  42. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  43. package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
  44. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +5 -5
  45. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +10 -9
  46. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
  47. package/dist/astro/routes/api/admin/byline-fields/index.mjs +10 -9
  48. package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
  49. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +10 -9
  50. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
  51. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +15 -14
  52. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  53. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +16 -21
  54. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  55. package/dist/astro/routes/api/admin/bylines/index.mjs +15 -14
  56. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  57. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +13 -12
  58. package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
  59. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
  60. package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -10
  61. package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
  62. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
  63. package/dist/astro/routes/api/admin/comments/index.mjs +11 -10
  64. package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
  65. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +5 -5
  66. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +4 -4
  67. package/dist/astro/routes/api/admin/media-usage/repair.mjs +12 -10
  68. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -1
  69. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +5 -5
  70. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +5 -5
  71. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +40 -39
  72. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  73. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +40 -39
  74. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  75. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +45 -39
  76. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  77. package/dist/astro/routes/api/admin/plugins/_id_/mcp.d.mts +8 -0
  78. package/dist/astro/routes/api/admin/plugins/_id_/mcp.d.mts.map +1 -0
  79. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +39 -0
  80. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs.map +1 -0
  81. package/dist/astro/routes/api/admin/plugins/_id_/settings.d.mts +9 -0
  82. package/dist/astro/routes/api/admin/plugins/_id_/settings.d.mts.map +1 -0
  83. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +78 -0
  84. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -0
  85. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +39 -38
  86. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  87. package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts.map +1 -1
  88. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +42 -39
  89. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  90. package/dist/astro/routes/api/admin/plugins/index.mjs +45 -39
  91. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  92. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +4 -4
  93. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +39 -38
  94. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  95. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts.map +1 -1
  96. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +45 -40
  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 +39 -38
  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 +39 -38
  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 +43 -40
  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.mjs +39 -38
  106. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  107. package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
  108. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +44 -41
  109. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  110. package/dist/astro/routes/api/admin/plugins/updates.mjs +40 -39
  111. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  112. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +39 -38
  113. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  114. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +4 -4
  115. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +39 -38
  116. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  117. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +4 -4
  118. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  119. package/dist/astro/routes/api/admin/users/_id_/index.mjs +9 -8
  120. package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
  121. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +5 -5
  122. package/dist/astro/routes/api/admin/users/index.mjs +9 -8
  123. package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
  124. package/dist/astro/routes/api/auth/dev-bypass.mjs +7 -7
  125. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  126. package/dist/astro/routes/api/auth/invite/complete.mjs +13 -12
  127. package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
  128. package/dist/astro/routes/api/auth/invite/index.mjs +10 -9
  129. package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
  130. package/dist/astro/routes/api/auth/invite/register-options.mjs +12 -11
  131. package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
  132. package/dist/astro/routes/api/auth/logout.mjs +4 -4
  133. package/dist/astro/routes/api/auth/magic-link/send.mjs +12 -11
  134. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
  135. package/dist/astro/routes/api/auth/magic-link/verify.mjs +5 -5
  136. package/dist/astro/routes/api/auth/me.mjs +9 -8
  137. package/dist/astro/routes/api/auth/me.mjs.map +1 -1
  138. package/dist/astro/routes/api/auth/mode.d.mts.map +1 -1
  139. package/dist/astro/routes/api/auth/mode.mjs +6 -3
  140. package/dist/astro/routes/api/auth/mode.mjs.map +1 -1
  141. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +15 -5
  142. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
  143. package/dist/astro/routes/api/auth/oauth/_provider_.d.mts.map +1 -1
  144. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +11 -5
  145. package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -1
  146. package/dist/astro/routes/api/auth/passkey/_id_.mjs +8 -7
  147. package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
  148. package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
  149. package/dist/astro/routes/api/auth/passkey/options.mjs +13 -12
  150. package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
  151. package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -10
  152. package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
  153. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -11
  154. package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
  155. package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -11
  156. package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
  157. package/dist/astro/routes/api/auth/signup/complete.mjs +13 -12
  158. package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
  159. package/dist/astro/routes/api/auth/signup/request.mjs +12 -11
  160. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
  161. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  162. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +14 -13
  163. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
  164. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +13 -12
  165. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
  166. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  167. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs.map +1 -1
  168. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +5 -4
  169. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
  170. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -5
  171. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
  172. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
  173. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs.map +1 -1
  174. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +13 -12
  175. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  176. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +10 -8
  177. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  178. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
  179. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +20 -19
  180. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
  181. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +18 -17
  182. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
  183. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -4
  184. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
  185. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  186. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs.map +1 -1
  187. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +10 -8
  188. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
  189. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
  190. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +18 -17
  191. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  192. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
  193. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
  194. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +5 -4
  195. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
  196. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  197. package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -9
  198. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  199. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  200. package/dist/astro/routes/api/content/_collection_/authors.mjs.map +1 -1
  201. package/dist/astro/routes/api/content/_collection_/index.d.mts.map +1 -1
  202. package/dist/astro/routes/api/content/_collection_/index.mjs +12 -10
  203. package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
  204. package/dist/astro/routes/api/content/_collection_/trash.mjs +10 -9
  205. package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
  206. package/dist/astro/routes/api/dashboard.mjs +8 -8
  207. package/dist/astro/routes/api/dev/emails.mjs +4 -4
  208. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  209. package/dist/astro/routes/api/import/probe.mjs +17 -16
  210. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  211. package/dist/astro/routes/api/import/wordpress/analyze.mjs +4 -4
  212. package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -12
  213. package/dist/astro/routes/api/import/wordpress/execute.d.mts.map +1 -1
  214. package/dist/astro/routes/api/import/wordpress/execute.mjs +12 -12
  215. package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -11
  216. package/dist/astro/routes/api/import/wordpress/media.d.mts.map +1 -1
  217. package/dist/astro/routes/api/import/wordpress/media.mjs +11 -10
  218. package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
  219. package/dist/astro/routes/api/import/wordpress/prepare.mjs +11 -10
  220. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  221. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -12
  222. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
  223. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +11 -10
  224. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  225. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  226. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +17 -16
  227. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  228. package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
  229. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -12
  230. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts.map +1 -1
  231. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +23 -22
  232. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  233. package/dist/astro/routes/api/manifest.mjs +7 -8
  234. package/dist/astro/routes/api/manifest.mjs.map +1 -1
  235. package/dist/astro/routes/api/mcp.d.mts.map +1 -1
  236. package/dist/astro/routes/api/mcp.mjs +149 -45
  237. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  238. package/dist/astro/routes/api/media/_id_/confirm.mjs +9 -8
  239. package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
  240. package/dist/astro/routes/api/media/_id_/usage.d.mts +8 -0
  241. package/dist/astro/routes/api/media/_id_/usage.d.mts.map +1 -0
  242. package/dist/astro/routes/api/media/_id_/usage.mjs +37 -0
  243. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -0
  244. package/dist/astro/routes/api/media/_id_.d.mts.map +1 -1
  245. package/dist/astro/routes/api/media/_id_.mjs +26 -10
  246. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  247. package/dist/astro/routes/api/media/file/_...key_.mjs +4 -3
  248. package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
  249. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -4
  250. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -4
  251. package/dist/astro/routes/api/media/providers/index.mjs +4 -4
  252. package/dist/astro/routes/api/media/upload-url.mjs +10 -9
  253. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  254. package/dist/astro/routes/api/media.d.mts.map +1 -1
  255. package/dist/astro/routes/api/media.mjs +31 -11
  256. package/dist/astro/routes/api/media.mjs.map +1 -1
  257. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +10 -9
  258. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  259. package/dist/astro/routes/api/menus/_name_/items.mjs +10 -9
  260. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  261. package/dist/astro/routes/api/menus/_name_/reorder.mjs +10 -9
  262. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  263. package/dist/astro/routes/api/menus/_name_/translations.mjs +10 -9
  264. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  265. package/dist/astro/routes/api/menus/_name_.mjs +10 -9
  266. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  267. package/dist/astro/routes/api/menus/index.mjs +10 -9
  268. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  269. package/dist/astro/routes/api/oauth/authorize.d.mts.map +1 -1
  270. package/dist/astro/routes/api/oauth/authorize.mjs +7 -8
  271. package/dist/astro/routes/api/oauth/authorize.mjs.map +1 -1
  272. package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -7
  273. package/dist/astro/routes/api/oauth/device/code.mjs +10 -10
  274. package/dist/astro/routes/api/oauth/device/token.mjs +9 -9
  275. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  276. package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -7
  277. package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -7
  278. package/dist/astro/routes/api/oauth/token.mjs +7 -7
  279. package/dist/astro/routes/api/openapi.json.mjs +52 -24
  280. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  281. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts.map +1 -1
  282. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +20 -32
  283. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
  284. package/dist/astro/routes/api/redirects/404s/index.mjs +12 -11
  285. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
  286. package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -11
  287. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
  288. package/dist/astro/routes/api/redirects/_id_.mjs +13 -12
  289. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  290. package/dist/astro/routes/api/redirects/index.mjs +13 -12
  291. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  292. package/dist/astro/routes/api/relations/_id_/index.mjs +16 -15
  293. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
  294. package/dist/astro/routes/api/relations/_id_/translations.mjs +11 -11
  295. package/dist/astro/routes/api/relations/index.mjs +16 -15
  296. package/dist/astro/routes/api/relations/index.mjs.map +1 -1
  297. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
  298. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -4
  299. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -1
  300. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +39 -38
  301. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  302. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +39 -38
  303. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  304. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +39 -38
  305. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  306. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +39 -38
  307. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  308. package/dist/astro/routes/api/schema/collections/index.mjs +39 -38
  309. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  310. package/dist/astro/routes/api/schema/index.mjs +9 -9
  311. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +39 -38
  312. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  313. package/dist/astro/routes/api/schema/orphans/index.mjs +39 -38
  314. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  315. package/dist/astro/routes/api/search/enable.mjs +13 -12
  316. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  317. package/dist/astro/routes/api/search/index.mjs +12 -11
  318. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  319. package/dist/astro/routes/api/search/rebuild.mjs +13 -12
  320. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  321. package/dist/astro/routes/api/search/stats.mjs +8 -8
  322. package/dist/astro/routes/api/search/suggest.mjs +12 -11
  323. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  324. package/dist/astro/routes/api/sections/_slug_.mjs +12 -11
  325. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  326. package/dist/astro/routes/api/sections/index.mjs +12 -11
  327. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  328. package/dist/astro/routes/api/settings/backups/archives/_name_.d.mts +9 -0
  329. package/dist/astro/routes/api/settings/backups/archives/_name_.d.mts.map +1 -0
  330. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +48 -0
  331. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs.map +1 -0
  332. package/dist/astro/routes/api/settings/backups/archives/index.d.mts +8 -0
  333. package/dist/astro/routes/api/settings/backups/archives/index.d.mts.map +1 -0
  334. package/dist/astro/routes/api/settings/backups/archives/index.mjs +23 -0
  335. package/dist/astro/routes/api/settings/backups/archives/index.mjs.map +1 -0
  336. package/dist/astro/routes/api/settings/backups/export.d.mts +8 -0
  337. package/dist/astro/routes/api/settings/backups/export.d.mts.map +1 -0
  338. package/dist/astro/routes/api/settings/backups/export.mjs +35 -0
  339. package/dist/astro/routes/api/settings/backups/export.mjs.map +1 -0
  340. package/dist/astro/routes/api/settings/backups/index.d.mts +9 -0
  341. package/dist/astro/routes/api/settings/backups/index.d.mts.map +1 -0
  342. package/dist/astro/routes/api/settings/backups/index.mjs +52 -0
  343. package/dist/astro/routes/api/settings/backups/index.mjs.map +1 -0
  344. package/dist/astro/routes/api/settings/email.mjs +5 -5
  345. package/dist/astro/routes/api/settings.mjs +14 -13
  346. package/dist/astro/routes/api/settings.mjs.map +1 -1
  347. package/dist/astro/routes/api/setup/admin-verify.mjs +19 -15
  348. package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
  349. package/dist/astro/routes/api/setup/admin.mjs +18 -14
  350. package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
  351. package/dist/astro/routes/api/setup/dev-bypass.mjs +26 -26
  352. package/dist/astro/routes/api/setup/dev-reset.mjs +3 -3
  353. package/dist/astro/routes/api/setup/index.mjs +28 -27
  354. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  355. package/dist/astro/routes/api/setup/status.mjs +5 -5
  356. package/dist/astro/routes/api/snapshot.mjs +8 -215
  357. package/dist/astro/routes/api/snapshot.mjs.map +1 -1
  358. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +14 -13
  359. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  360. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +14 -13
  361. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  362. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +14 -13
  363. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  364. package/dist/astro/routes/api/taxonomies/index.mjs +14 -13
  365. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  366. package/dist/astro/routes/api/themes/preview.mjs +6 -6
  367. package/dist/astro/routes/api/typegen.mjs +6 -6
  368. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  369. package/dist/astro/routes/api/well-known/oauth-authorization-server.d.mts.map +1 -1
  370. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +4 -3
  371. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs.map +1 -1
  372. package/dist/astro/routes/api/well-known/oauth-protected-resource.d.mts.map +1 -1
  373. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +4 -3
  374. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs.map +1 -1
  375. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +9 -8
  376. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  377. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +12 -11
  378. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  379. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +12 -11
  380. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  381. package/dist/astro/routes/api/widget-areas/_name_.mjs +7 -7
  382. package/dist/astro/routes/api/widget-areas/index.mjs +12 -11
  383. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  384. package/dist/astro/routes/api/widget-components.mjs +4 -4
  385. package/dist/astro/routes/robots.txt.mjs +7 -7
  386. package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
  387. package/dist/astro/routes/sitemap.xml.mjs +8 -8
  388. package/dist/astro/types.d.mts +38 -17
  389. package/dist/astro/types.d.mts.map +1 -1
  390. package/dist/auth/providers/github.d.mts +1 -1
  391. package/dist/auth/providers/google.d.mts +1 -1
  392. package/dist/{authorize-BmCwQCib.mjs → authorize-WxsiePzy.mjs} +7 -4
  393. package/dist/authorize-WxsiePzy.mjs.map +1 -0
  394. package/dist/backup-S8kFWtwD.mjs +241 -0
  395. package/dist/backup-S8kFWtwD.mjs.map +1 -0
  396. package/dist/{base64-C74Msx8h.mjs → base64-B-PsqheR.mjs} +8 -4
  397. package/dist/base64-B-PsqheR.mjs.map +1 -0
  398. package/dist/{byline-BWb5H-65.mjs → byline-XEjchwzZ.mjs} +6 -6
  399. package/dist/{byline-BWb5H-65.mjs.map → byline-XEjchwzZ.mjs.map} +1 -1
  400. package/dist/{byline-fields-DO6bAYK8.mjs → byline-fields-CdU_LTF1.mjs} +1 -1
  401. package/dist/{byline-fields-DO6bAYK8.mjs.map → byline-fields-CdU_LTF1.mjs.map} +1 -1
  402. package/dist/{bylines-BGuKFaBy.mjs → bylines-BJbT4gKS.mjs} +4 -4
  403. package/dist/{bylines-BGuKFaBy.mjs.map → bylines-BJbT4gKS.mjs.map} +1 -1
  404. package/dist/{bylines-CHojDMpj.mjs → bylines-czseViYo.mjs} +6 -6
  405. package/dist/{bylines-CHojDMpj.mjs.map → bylines-czseViYo.mjs.map} +1 -1
  406. package/dist/{cache-BeR7RfN8.mjs → cache-CGCd6AVM.mjs} +2 -2
  407. package/dist/{cache-BeR7RfN8.mjs.map → cache-CGCd6AVM.mjs.map} +1 -1
  408. package/dist/{challenge-store-B426wQ6O.mjs → challenge-store-BFzgFRog.mjs} +1 -1
  409. package/dist/{challenge-store-B426wQ6O.mjs.map → challenge-store-BFzgFRog.mjs.map} +1 -1
  410. package/dist/{chunks-BU5_nrAC.mjs → chunks-BxXyunY-.mjs} +2 -2
  411. package/dist/{chunks-BU5_nrAC.mjs.map → chunks-BxXyunY-.mjs.map} +1 -1
  412. package/dist/cli/index.mjs +138 -31
  413. package/dist/cli/index.mjs.map +1 -1
  414. package/dist/client/cf-access.d.mts +1 -1
  415. package/dist/client/index.d.mts +54 -3
  416. package/dist/client/index.d.mts.map +1 -1
  417. package/dist/client/index.mjs +16 -4
  418. package/dist/client/index.mjs.map +1 -1
  419. package/dist/{comment-SWh31kS0.mjs → comment-DPT0WKyd.mjs} +2 -2
  420. package/dist/{comment-SWh31kS0.mjs.map → comment-DPT0WKyd.mjs.map} +1 -1
  421. package/dist/{comment-reaction-DgcpziXI.mjs → comment-reaction-C65MldIB.mjs} +2 -2
  422. package/dist/{comment-reaction-DgcpziXI.mjs.map → comment-reaction-C65MldIB.mjs.map} +1 -1
  423. package/dist/{comments-kZYGppMS.mjs → comments-Bz6sCbgD.mjs} +3 -3
  424. package/dist/{comments-kZYGppMS.mjs.map → comments-Bz6sCbgD.mjs.map} +1 -1
  425. package/dist/{components-CliOkZAs.mjs → components-DZkL4Fx0.mjs} +1 -1
  426. package/dist/{components-CliOkZAs.mjs.map → components-DZkL4Fx0.mjs.map} +1 -1
  427. package/dist/{content-BO61Sx4j.mjs → content-Ci04z2z-.mjs} +53 -19
  428. package/dist/content-Ci04z2z-.mjs.map +1 -0
  429. package/dist/{content-refresh-BkkApzeS.mjs → content-refresh-D4khvC0R.mjs} +95 -3
  430. package/dist/content-refresh-D4khvC0R.mjs.map +1 -0
  431. package/dist/{context-DtSFYFuS.mjs → context-B6hc7zJL.mjs} +97 -74
  432. package/dist/context-B6hc7zJL.mjs.map +1 -0
  433. package/dist/{cron-YFJ7uNVA.mjs → cron-BlKIMD_e.mjs} +1 -1
  434. package/dist/{cron-YFJ7uNVA.mjs.map → cron-BlKIMD_e.mjs.map} +1 -1
  435. package/dist/{dashboard-xo_gPs_D.mjs → dashboard-C5NkXFbi.mjs} +4 -4
  436. package/dist/{dashboard-xo_gPs_D.mjs.map → dashboard-C5NkXFbi.mjs.map} +1 -1
  437. package/dist/db/index.d.mts +3 -3
  438. package/dist/db/index.mjs +2 -2
  439. package/dist/db/index.mjs.map +1 -1
  440. package/dist/db/libsql.d.mts +1 -1
  441. package/dist/db/postgres.d.mts +1 -1
  442. package/dist/db/sqlite.d.mts +1 -1
  443. package/dist/{db-errors-BKuXh_fi.mjs → db-errors-CcWLaRiR.mjs} +4 -2
  444. package/dist/db-errors-CcWLaRiR.mjs.map +1 -0
  445. package/dist/{default-DY5ovGUG.mjs → default-C4v9KP56.mjs} +1 -1
  446. package/dist/{default-DY5ovGUG.mjs.map → default-C4v9KP56.mjs.map} +1 -1
  447. package/dist/{device-flow-CPXQ_QfW.mjs → device-flow-BeA6lUS1.mjs} +5 -6
  448. package/dist/device-flow-BeA6lUS1.mjs.map +1 -0
  449. package/dist/{dialect-helpers-Cue7QQOR.mjs → dialect-helpers-HxEQGl_1.mjs} +57 -11
  450. package/dist/{dialect-helpers-Cue7QQOR.mjs.map → dialect-helpers-HxEQGl_1.mjs.map} +1 -1
  451. package/dist/{email-console-CjkQc7oY.mjs → email-console-C-9Ng8DM.mjs} +1 -1
  452. package/dist/{email-console-CjkQc7oY.mjs.map → email-console-C-9Ng8DM.mjs.map} +1 -1
  453. package/dist/error-CEGF6UZb.mjs +90 -0
  454. package/dist/error-CEGF6UZb.mjs.map +1 -0
  455. package/dist/{error-CfJMLSkd.mjs → errors-DtEXIQQV.mjs} +15 -84
  456. package/dist/errors-DtEXIQQV.mjs.map +1 -0
  457. package/dist/{escape-r8_GbEU2.mjs → escape-CFedIB1C.mjs} +1 -1
  458. package/dist/{escape-r8_GbEU2.mjs.map → escape-CFedIB1C.mjs.map} +1 -1
  459. package/dist/{field-defs-cache-BVrNCgSj.mjs → field-defs-cache-DvmlgP-D.mjs} +2 -2
  460. package/dist/{field-defs-cache-BVrNCgSj.mjs.map → field-defs-cache-DvmlgP-D.mjs.map} +1 -1
  461. package/dist/{fts-manager-BD9s77qh.mjs → fts-manager-DzqIBrrW.mjs} +3 -3
  462. package/dist/{fts-manager-BD9s77qh.mjs.map → fts-manager-DzqIBrrW.mjs.map} +1 -1
  463. package/dist/{hreflang-CgIxhH4k.d.mts → hreflang-CIxH_LKz.d.mts} +2 -2
  464. package/dist/{hreflang-CgIxhH4k.d.mts.map → hreflang-CIxH_LKz.d.mts.map} +1 -1
  465. package/dist/{hreflang-pAWUiPd_.mjs → hreflang-db2Tpb2o.mjs} +5 -5
  466. package/dist/{hreflang-pAWUiPd_.mjs.map → hreflang-db2Tpb2o.mjs.map} +1 -1
  467. package/dist/{import-2jHtLzsO.mjs → import-Dmkm8S1W.mjs} +4 -4
  468. package/dist/{import-2jHtLzsO.mjs.map → import-Dmkm8S1W.mjs.map} +1 -1
  469. package/dist/{index-DxjWLKGT.d.mts → index-BEui-cRd.d.mts} +3 -3
  470. package/dist/{index-DxjWLKGT.d.mts.map → index-BEui-cRd.d.mts.map} +1 -1
  471. package/dist/{index-BXOCyLj0.d.mts → index-wYnC6u4o.d.mts} +780 -15
  472. package/dist/index-wYnC6u4o.d.mts.map +1 -0
  473. package/dist/index.d.mts +18 -19
  474. package/dist/index.mjs +59 -58
  475. package/dist/{load-DgoWMdRX.mjs → load-Cx27ki1l.mjs} +2 -2
  476. package/dist/{load-DgoWMdRX.mjs.map → load-Cx27ki1l.mjs.map} +1 -1
  477. package/dist/{loader-Rb8QlGZp.mjs → loader-Be3ouI5L.mjs} +170 -6
  478. package/dist/loader-Be3ouI5L.mjs.map +1 -0
  479. package/dist/{manifest-schema-DeGNma2O.mjs → manifest-schema-bCq54i7F.mjs} +16 -2
  480. package/dist/manifest-schema-bCq54i7F.mjs.map +1 -0
  481. package/dist/media/image-endpoint.d.mts +30 -2
  482. package/dist/media/image-endpoint.d.mts.map +1 -1
  483. package/dist/media/image-endpoint.mjs +29 -3
  484. package/dist/media/image-endpoint.mjs.map +1 -1
  485. package/dist/media/index.d.mts +1 -1
  486. package/dist/media/local-runtime.d.mts +12 -13
  487. package/dist/media/local-runtime.d.mts.map +1 -1
  488. package/dist/media/local-runtime.mjs +6 -6
  489. package/dist/{media-D2ZFowpn.mjs → media-BjhhENaJ.mjs} +2 -2
  490. package/dist/{media-D2ZFowpn.mjs.map → media-BjhhENaJ.mjs.map} +1 -1
  491. package/dist/{media-allowlist-Dc05vKtt.mjs → media-allowlist-jUppPWFy.mjs} +1 -1
  492. package/dist/{media-allowlist-Dc05vKtt.mjs.map → media-allowlist-jUppPWFy.mjs.map} +1 -1
  493. package/dist/media-kIV1IxFf.mjs +243 -0
  494. package/dist/media-kIV1IxFf.mjs.map +1 -0
  495. package/dist/media-upload-D2wk3EIt.mjs +145 -0
  496. package/dist/media-upload-D2wk3EIt.mjs.map +1 -0
  497. package/dist/{media-url-DgIEYZr4.mjs → media-url-BCm5vBn6.mjs} +1 -1
  498. package/dist/{media-url-DgIEYZr4.mjs.map → media-url-BCm5vBn6.mjs.map} +1 -1
  499. package/dist/{media-usage-B__v9NMm.mjs → media-usage-CljdO1mc.mjs} +138 -5
  500. package/dist/{media-usage-B__v9NMm.mjs.map → media-usage-CljdO1mc.mjs.map} +1 -1
  501. package/dist/{menus-BtvH7Z7t.mjs → menus-BcyElFtI.mjs} +155 -12
  502. package/dist/menus-BcyElFtI.mjs.map +1 -0
  503. package/dist/{menus-BpfevlJD.mjs → menus-CZyG6rvx.mjs} +2 -2
  504. package/dist/{menus-BpfevlJD.mjs.map → menus-CZyG6rvx.mjs.map} +1 -1
  505. package/dist/{mode-BVnhGZ2o.mjs → mode-fiXRMfeA.mjs} +1 -1
  506. package/dist/{mode-BVnhGZ2o.mjs.map → mode-fiXRMfeA.mjs.map} +1 -1
  507. package/dist/{oauth-authorization-BWqWTHBK.mjs → oauth-authorization-oqfbBuMH.mjs} +5 -6
  508. package/dist/oauth-authorization-oqfbBuMH.mjs.map +1 -0
  509. package/dist/{oauth-clients-43_XADoa.mjs → oauth-clients-BlrUHAsf.mjs} +1 -1
  510. package/dist/{oauth-clients-43_XADoa.mjs.map → oauth-clients-BlrUHAsf.mjs.map} +1 -1
  511. package/dist/{oauth-state-store-BRSUEkmx.mjs → oauth-state-store-DnvjRMy6.mjs} +2 -1
  512. package/dist/{oauth-state-store-BRSUEkmx.mjs.map → oauth-state-store-DnvjRMy6.mjs.map} +1 -1
  513. package/dist/{oauth-user-lookup-Ctgemb0k.mjs → oauth-user-lookup-oUllxvAv.mjs} +1 -1
  514. package/dist/{oauth-user-lookup-Ctgemb0k.mjs.map → oauth-user-lookup-oUllxvAv.mjs.map} +1 -1
  515. package/dist/object-cache/memory.d.mts +1 -1
  516. package/dist/{options-COXGTtqd.d.mts → options-BqMkWfYa.d.mts} +6 -6
  517. package/dist/{options-COXGTtqd.d.mts.map → options-BqMkWfYa.d.mts.map} +1 -1
  518. package/dist/page/index.d.mts +2 -2
  519. package/dist/page/index.d.mts.map +1 -1
  520. package/dist/page/index.mjs.map +1 -1
  521. package/dist/{parse-GLksnn-B.mjs → parse-C_-6klII.mjs} +4 -12
  522. package/dist/{parse-GLksnn-B.mjs.map → parse-C_-6klII.mjs.map} +1 -1
  523. package/dist/{passkey-config-CjA1UbDj.mjs → passkey-config-C-SKpc0-.mjs} +1 -1
  524. package/dist/{passkey-config-CjA1UbDj.mjs.map → passkey-config-C-SKpc0-.mjs.map} +1 -1
  525. package/dist/{placeholder-DR-eeZr-.d.mts → placeholder-Dop47JMM.d.mts} +1 -1
  526. package/dist/{placeholder-DR-eeZr-.d.mts.map → placeholder-Dop47JMM.d.mts.map} +1 -1
  527. package/dist/plugin-types.d.mts +21 -2
  528. package/dist/plugin-types.d.mts.map +1 -1
  529. package/dist/plugin-utils.d.mts +18 -17
  530. package/dist/plugin-utils.d.mts.map +1 -1
  531. package/dist/plugin-utils.mjs +8 -6
  532. package/dist/plugin-utils.mjs.map +1 -1
  533. package/dist/plugins/adapt-sandbox-entry.d.mts +10 -11
  534. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  535. package/dist/plugins/adapt-sandbox-entry.mjs +15 -3
  536. package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
  537. package/dist/{portable-text-BAkgEKcv.mjs → portable-text-sDj92Kxv.mjs} +1 -1
  538. package/dist/{portable-text-BAkgEKcv.mjs.map → portable-text-sDj92Kxv.mjs.map} +1 -1
  539. package/dist/{preview-Rloa09Wp.mjs → preview-D4Jnbfx7.mjs} +2 -2
  540. package/dist/{preview-Rloa09Wp.mjs.map → preview-D4Jnbfx7.mjs.map} +1 -1
  541. package/dist/{public-url-C0cEvrRu.mjs → public-url-DSGTnJFw.mjs} +5 -3
  542. package/dist/public-url-DSGTnJFw.mjs.map +1 -0
  543. package/dist/{query-ZzvXyxWq.mjs → query-DR73ZNfm.mjs} +14 -14
  544. package/dist/{query-ZzvXyxWq.mjs.map → query-DR73ZNfm.mjs.map} +1 -1
  545. package/dist/{query-BxT95opY.mjs → query-Di7DOmPV.mjs} +3 -3
  546. package/dist/{query-BxT95opY.mjs.map → query-Di7DOmPV.mjs.map} +1 -1
  547. package/dist/{rate-limit-Cg4Rvc_-.mjs → rate-limit-CMj83JNW.mjs} +2 -2
  548. package/dist/{rate-limit-Cg4Rvc_-.mjs.map → rate-limit-CMj83JNW.mjs.map} +1 -1
  549. package/dist/{redirect-Ce_6Yb6z.mjs → redirect-Botom7X6.mjs} +1 -1
  550. package/dist/{redirect-Ce_6Yb6z.mjs.map → redirect-Botom7X6.mjs.map} +1 -1
  551. package/dist/{redirect-Ch3E98qZ.mjs → redirect-CgLPYflR.mjs} +10 -4
  552. package/dist/redirect-CgLPYflR.mjs.map +1 -0
  553. package/dist/{redirects-CXmVGRNZ.mjs → redirects-B7t9bKsL.mjs} +4 -4
  554. package/dist/{redirects-CXmVGRNZ.mjs.map → redirects-B7t9bKsL.mjs.map} +1 -1
  555. package/dist/{redirects-CeD7K7EX.mjs → redirects-BBq3n2Rj.mjs} +4 -175
  556. package/dist/redirects-BBq3n2Rj.mjs.map +1 -0
  557. package/dist/{registry-CyIXPi4E.mjs → registry-FV15nLge.mjs} +97 -8
  558. package/dist/registry-FV15nLge.mjs.map +1 -0
  559. package/dist/{relation-Ba68Tm4Z.mjs → relation-9M9j_UWo.mjs} +3 -3
  560. package/dist/{relation-Ba68Tm4Z.mjs.map → relation-9M9j_UWo.mjs.map} +1 -1
  561. package/dist/{relations-BmBmX4Eb.mjs → relations-5_avdrN_.mjs} +2 -2
  562. package/dist/{relations-BmBmX4Eb.mjs.map → relations-5_avdrN_.mjs.map} +1 -1
  563. package/dist/{relations-C8hVyEy0.mjs → relations-BKvO39-9.mjs} +5 -5
  564. package/dist/{relations-C8hVyEy0.mjs.map → relations-BKvO39-9.mjs.map} +1 -1
  565. package/dist/{relations-CbBpoOys.d.mts → relations-Bh8jlFsU.d.mts} +306 -4
  566. package/dist/relations-Bh8jlFsU.d.mts.map +1 -0
  567. package/dist/{request-meta-DCwktC5P.mjs → request-meta-DzXYYI-n.mjs} +2 -2
  568. package/dist/{request-meta-DCwktC5P.mjs.map → request-meta-DzXYYI-n.mjs.map} +1 -1
  569. package/dist/{runner-CiNdIk3y.d.mts → runner-Dd8m8k9F.d.mts} +2 -2
  570. package/dist/{runner-CiNdIk3y.d.mts.map → runner-Dd8m8k9F.d.mts.map} +1 -1
  571. package/dist/{runner-jt65bF7F.mjs → runner-DfnZ5eUr.mjs} +333 -199
  572. package/dist/runner-DfnZ5eUr.mjs.map +1 -0
  573. package/dist/runtime.d.mts +11 -12
  574. package/dist/runtime.d.mts.map +1 -1
  575. package/dist/runtime.mjs +4 -4
  576. package/dist/{schema-DwjufZ1S.mjs → schema-BXxlHeAf.mjs} +3 -3
  577. package/dist/{schema-DwjufZ1S.mjs.map → schema-BXxlHeAf.mjs.map} +1 -1
  578. package/dist/scopes-Bl4IwHA-.mjs +27 -0
  579. package/dist/scopes-Bl4IwHA-.mjs.map +1 -0
  580. package/dist/{search-Cl875CVE.mjs → search-Bff-7jFt.mjs} +5 -5
  581. package/dist/{search-Cl875CVE.mjs.map → search-Bff-7jFt.mjs.map} +1 -1
  582. package/dist/{secrets-CO_bEmII.mjs → secrets-CSwQIl4q.mjs} +3 -3
  583. package/dist/{secrets-CO_bEmII.mjs.map → secrets-CSwQIl4q.mjs.map} +1 -1
  584. package/dist/{sections-DTKzgoiS.mjs → sections-CwW4s1al.mjs} +3 -3
  585. package/dist/{sections-DTKzgoiS.mjs.map → sections-CwW4s1al.mjs.map} +1 -1
  586. package/dist/seed/index.d.mts +2 -2
  587. package/dist/seed/index.mjs +20 -20
  588. package/dist/seo/index.d.mts +14 -3
  589. package/dist/seo/index.d.mts.map +1 -1
  590. package/dist/seo/index.mjs +16 -16
  591. package/dist/seo/index.mjs.map +1 -1
  592. package/dist/{seo-BLm6SXzS.mjs → seo-2cmFHZns.mjs} +2 -2
  593. package/dist/{seo-BLm6SXzS.mjs.map → seo-2cmFHZns.mjs.map} +1 -1
  594. package/dist/{seo-BjrbXAd_.mjs → seo-C3GDfT0V.mjs} +1 -1
  595. package/dist/{seo-BjrbXAd_.mjs.map → seo-C3GDfT0V.mjs.map} +1 -1
  596. package/dist/{service-D6zDmKXy.mjs → service-DkGTWGIi.mjs} +3 -3
  597. package/dist/{service-D6zDmKXy.mjs.map → service-DkGTWGIi.mjs.map} +1 -1
  598. package/dist/{session-user-DoSs6YM8.mjs → session-user-DbHqKDKe.mjs} +1 -1
  599. package/dist/{session-user-DoSs6YM8.mjs.map → session-user-DbHqKDKe.mjs.map} +1 -1
  600. package/dist/{settings-CmS3TwXf.mjs → settings-C4s8hFQm.mjs} +3 -3
  601. package/dist/{settings-CmS3TwXf.mjs.map → settings-C4s8hFQm.mjs.map} +1 -1
  602. package/dist/{settings-BuQYvLfy.mjs → settings-CpA4lQFt.mjs} +4 -4
  603. package/dist/{settings-BuQYvLfy.mjs.map → settings-CpA4lQFt.mjs.map} +1 -1
  604. package/dist/{setup-complete-BPNgLHlU.mjs → setup-complete-CdIlqloh.mjs} +1 -1
  605. package/dist/{setup-complete-BPNgLHlU.mjs.map → setup-complete-CdIlqloh.mjs.map} +1 -1
  606. package/dist/{setup-nonce-DEPZX96T.mjs → setup-nonce-DqiIPr-J.mjs} +1 -1
  607. package/dist/{setup-nonce-DEPZX96T.mjs.map → setup-nonce-DqiIPr-J.mjs.map} +1 -1
  608. package/dist/{single-flight-cache-DEtW-OEG.mjs → single-flight-cache-C2exrGAi.mjs} +1 -1
  609. package/dist/{single-flight-cache-DEtW-OEG.mjs.map → single-flight-cache-C2exrGAi.mjs.map} +1 -1
  610. package/dist/{site-url-CcLy5D5s.mjs → site-url-NGJT6NTU.mjs} +1 -1
  611. package/dist/{site-url-CcLy5D5s.mjs.map → site-url-NGJT6NTU.mjs.map} +1 -1
  612. package/dist/snapshot-BdpUJKD-.mjs +216 -0
  613. package/dist/snapshot-BdpUJKD-.mjs.map +1 -0
  614. package/dist/{ssrf-TrKYJAy0.mjs → ssrf-CviKqWmq.mjs} +1 -1
  615. package/dist/{ssrf-TrKYJAy0.mjs.map → ssrf-CviKqWmq.mjs.map} +1 -1
  616. package/dist/state-xxv6ZTMv.mjs +128 -0
  617. package/dist/state-xxv6ZTMv.mjs.map +1 -0
  618. package/dist/{status-D3Gy1Zc6.mjs → status-COfycGIU.mjs} +1 -1
  619. package/dist/{status-D3Gy1Zc6.mjs.map → status-COfycGIU.mjs.map} +1 -1
  620. package/dist/storage/local.d.mts +1 -1
  621. package/dist/storage/local.mjs +1 -1
  622. package/dist/storage/s3.d.mts +1 -1
  623. package/dist/storage/s3.mjs +1 -1
  624. package/dist/{taxonomies-ClS4RKaZ.mjs → taxonomies-Ce49uIzY.mjs} +4 -4
  625. package/dist/{taxonomies-ClS4RKaZ.mjs.map → taxonomies-Ce49uIzY.mjs.map} +1 -1
  626. package/dist/{taxonomies-pUkuD6nj.mjs → taxonomies-DjSKBZpq.mjs} +7 -7
  627. package/dist/{taxonomies-pUkuD6nj.mjs.map → taxonomies-DjSKBZpq.mjs.map} +1 -1
  628. package/dist/{taxonomy-BkxbUMSw.mjs → taxonomy-DfVooU4W.mjs} +51 -13
  629. package/dist/taxonomy-DfVooU4W.mjs.map +1 -0
  630. package/dist/{tokens-BV6fgl5A.mjs → tokens-DVltpO2D.mjs} +2 -2
  631. package/dist/{tokens-BV6fgl5A.mjs.map → tokens-DVltpO2D.mjs.map} +1 -1
  632. package/dist/{transport-DTFhhPOg.mjs → transport-CKrlqSpD.mjs} +1 -1
  633. package/dist/{transport-DTFhhPOg.mjs.map → transport-CKrlqSpD.mjs.map} +1 -1
  634. package/dist/{transport-DmlmzD2U.d.mts → transport-Vd7VdqHv.d.mts} +1 -1
  635. package/dist/{transport-DmlmzD2U.d.mts.map → transport-Vd7VdqHv.d.mts.map} +1 -1
  636. package/dist/{trusted-proxy-CSgZVESw.mjs → trusted-proxy-CwjQj0YG.mjs} +1 -1
  637. package/dist/{trusted-proxy-CSgZVESw.mjs.map → trusted-proxy-CwjQj0YG.mjs.map} +1 -1
  638. package/dist/{types-B6-N9cBB.d.mts → types-B4vm81VH.d.mts} +1 -1
  639. package/dist/{types-B6-N9cBB.d.mts.map → types-B4vm81VH.d.mts.map} +1 -1
  640. package/dist/{types-Cm4Cz-8M.d.mts → types-B97jg3aW.d.mts} +6 -1
  641. package/dist/{types-Cm4Cz-8M.d.mts.map → types-B97jg3aW.d.mts.map} +1 -1
  642. package/dist/{types-BNZsPL9z.mjs → types-BD40g7zz.mjs} +1 -1
  643. package/dist/{types-BNZsPL9z.mjs.map → types-BD40g7zz.mjs.map} +1 -1
  644. package/dist/{types-QnlQIyPE.d.mts → types-BNfPHfay.d.mts} +1 -1
  645. package/dist/{types-QnlQIyPE.d.mts.map → types-BNfPHfay.d.mts.map} +1 -1
  646. package/dist/{types-DLIrNtv5.d.mts → types-BfYUPJdP.d.mts} +2 -2
  647. package/dist/{types-DLIrNtv5.d.mts.map → types-BfYUPJdP.d.mts.map} +1 -1
  648. package/dist/{types-CtDVagM4.d.mts → types-BvB7gDOD.d.mts} +38 -4
  649. package/dist/types-BvB7gDOD.d.mts.map +1 -0
  650. package/dist/{types-B_pmP7Yq.d.mts → types-C7U0HlEr.d.mts} +1 -1
  651. package/dist/{types-B_pmP7Yq.d.mts.map → types-C7U0HlEr.d.mts.map} +1 -1
  652. package/dist/{types-Ch8pFMEm.mjs → types-D1iJ3DpO.mjs} +3 -3
  653. package/dist/{types-Ch8pFMEm.mjs.map → types-D1iJ3DpO.mjs.map} +1 -1
  654. package/dist/{types-momGysZk.d.mts → types-DPKhI5ib.d.mts} +9 -1
  655. package/dist/types-DPKhI5ib.d.mts.map +1 -0
  656. package/dist/{types-BCVuUPrL.d.mts → types-Kmaxdarz.d.mts} +1 -1
  657. package/dist/{types-BCVuUPrL.d.mts.map → types-Kmaxdarz.d.mts.map} +1 -1
  658. package/dist/{types-qljd1hsL.d.mts → types-iVeZ5g6N.d.mts} +1 -1
  659. package/dist/{types-qljd1hsL.d.mts.map → types-iVeZ5g6N.d.mts.map} +1 -1
  660. package/dist/{user-DTxX_Fha.mjs → user-Bh-L1qo6.mjs} +3 -3
  661. package/dist/{user-DTxX_Fha.mjs.map → user-Bh-L1qo6.mjs.map} +1 -1
  662. package/dist/{utils-Cz8PVrl4.mjs → utils-BbUgmeZG.mjs} +1 -1
  663. package/dist/{utils-Cz8PVrl4.mjs.map → utils-BbUgmeZG.mjs.map} +1 -1
  664. package/dist/{validate-9jLuE301.d.mts → validate-DULfgpJP.d.mts} +5 -5
  665. package/dist/{validate-9jLuE301.d.mts.map → validate-DULfgpJP.d.mts.map} +1 -1
  666. package/dist/{validate-C3CpWlNt.mjs → validate-V9nCwq_-.mjs} +2 -2
  667. package/dist/{validate-C3CpWlNt.mjs.map → validate-V9nCwq_-.mjs.map} +1 -1
  668. package/dist/{validation-DM2K_NJC.mjs → validation-BsVUJfsP.mjs} +10 -10
  669. package/dist/{validation-DM2K_NJC.mjs.map → validation-BsVUJfsP.mjs.map} +1 -1
  670. package/dist/version-907opKac.mjs +7 -0
  671. package/dist/{version-BlIJvNAZ.mjs.map → version-907opKac.mjs.map} +1 -1
  672. package/dist/{widgets-B_X6_UXJ.mjs → widgets-DGv1Z04V.mjs} +3 -3
  673. package/dist/{widgets-B_X6_UXJ.mjs.map → widgets-DGv1Z04V.mjs.map} +1 -1
  674. package/dist/{wxr-taxonomies-tADW4KTa.d.mts → wxr-taxonomies-B4tMuN5T.d.mts} +1 -1
  675. package/dist/{wxr-taxonomies-tADW4KTa.d.mts.map → wxr-taxonomies-B4tMuN5T.d.mts.map} +1 -1
  676. package/dist/{wxr-taxonomies-oNJB2S81.mjs → wxr-taxonomies-Cs1N6O8z.mjs} +3 -3
  677. package/dist/{wxr-taxonomies-oNJB2S81.mjs.map → wxr-taxonomies-Cs1N6O8z.mjs.map} +1 -1
  678. package/dist/{zod-generator-CrfV79De.mjs → zod-generator-B5prQ5M4.mjs} +2 -2
  679. package/dist/{zod-generator-CrfV79De.mjs.map → zod-generator-B5prQ5M4.mjs.map} +1 -1
  680. package/package.json +8 -8
  681. package/src/api/authorize.ts +10 -1
  682. package/src/api/error.ts +5 -5
  683. package/src/api/errors.ts +14 -0
  684. package/src/api/handlers/backup.ts +312 -0
  685. package/src/api/handlers/content.ts +36 -2
  686. package/src/api/handlers/device-flow.ts +2 -3
  687. package/src/api/handlers/index.ts +16 -0
  688. package/src/api/handlers/marketplace.ts +38 -0
  689. package/src/api/handlers/media-upload.ts +210 -0
  690. package/src/api/handlers/media-usage.ts +211 -2
  691. package/src/api/handlers/oauth-authorization.ts +2 -6
  692. package/src/api/handlers/plugin-settings.ts +218 -0
  693. package/src/api/handlers/plugins.ts +41 -0
  694. package/src/api/handlers/registry.ts +39 -0
  695. package/src/api/handlers/snapshot.ts +21 -3
  696. package/src/api/openapi/document.ts +48 -6
  697. package/src/api/parse.ts +1 -15
  698. package/src/api/public-url.ts +4 -2
  699. package/src/api/schemas/common.ts +6 -2
  700. package/src/api/schemas/media-usage.ts +72 -0
  701. package/src/api/schemas/media.ts +32 -1
  702. package/src/astro/integration/index.ts +38 -0
  703. package/src/astro/integration/routes.ts +35 -0
  704. package/src/astro/integration/runtime.ts +6 -0
  705. package/src/astro/integration/virtual-modules.ts +41 -7
  706. package/src/astro/integration/vite-config.ts +17 -1
  707. package/src/astro/middleware/auth.ts +70 -78
  708. package/src/astro/middleware/csp.ts +5 -2
  709. package/src/astro/middleware.ts +86 -31
  710. package/src/astro/public-plugin-api-routes.ts +2 -1
  711. package/src/astro/routes/PluginRegistry.tsx +5 -2
  712. package/src/astro/routes/admin.astro +56 -16
  713. package/src/astro/routes/api/admin/api-tokens/index.ts +2 -2
  714. package/src/astro/routes/api/admin/bylines/[id]/translations.ts +2 -5
  715. package/src/astro/routes/api/admin/plugins/[id]/index.ts +6 -0
  716. package/src/astro/routes/api/admin/plugins/[id]/mcp.ts +42 -0
  717. package/src/astro/routes/api/admin/plugins/[id]/settings.ts +80 -0
  718. package/src/astro/routes/api/admin/plugins/[id]/update.ts +2 -0
  719. package/src/astro/routes/api/admin/plugins/index.ts +9 -0
  720. package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +2 -0
  721. package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +2 -0
  722. package/src/astro/routes/api/admin/plugins/registry/install.ts +2 -0
  723. package/src/astro/routes/api/admin/plugins/updates.ts +2 -4
  724. package/src/astro/routes/api/auth/mode.ts +6 -14
  725. package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +21 -4
  726. package/src/astro/routes/api/auth/oauth/[provider].ts +24 -6
  727. package/src/astro/routes/api/content/[collection]/[id]/compare.ts +3 -4
  728. package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +2 -3
  729. package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +2 -3
  730. package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +3 -4
  731. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +4 -6
  732. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/parents.ts +2 -3
  733. package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +3 -4
  734. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +4 -6
  735. package/src/astro/routes/api/content/[collection]/[id]/translations.ts +3 -4
  736. package/src/astro/routes/api/content/[collection]/[id].ts +3 -4
  737. package/src/astro/routes/api/content/[collection]/authors.ts +2 -3
  738. package/src/astro/routes/api/content/[collection]/index.ts +6 -8
  739. package/src/astro/routes/api/content/[collection]/trash.ts +2 -3
  740. package/src/astro/routes/api/manifest.ts +2 -9
  741. package/src/astro/routes/api/mcp.ts +2 -1
  742. package/src/astro/routes/api/media/[id]/usage.ts +30 -0
  743. package/src/astro/routes/api/media/[id].ts +17 -6
  744. package/src/astro/routes/api/media/file/[...key].ts +8 -0
  745. package/src/astro/routes/api/media.ts +21 -2
  746. package/src/astro/routes/api/oauth/authorize.ts +2 -6
  747. package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +17 -3
  748. package/src/astro/routes/api/settings/backups/archives/[name].ts +78 -0
  749. package/src/astro/routes/api/settings/backups/archives/index.ts +33 -0
  750. package/src/astro/routes/api/settings/backups/export.ts +43 -0
  751. package/src/astro/routes/api/settings/backups/index.ts +76 -0
  752. package/src/astro/routes/api/setup/admin-verify.ts +8 -4
  753. package/src/astro/routes/api/setup/admin.ts +11 -4
  754. package/src/astro/routes/api/well-known/oauth-authorization-server.ts +4 -1
  755. package/src/astro/routes/api/well-known/oauth-protected-resource.ts +5 -1
  756. package/src/astro/types.ts +48 -2
  757. package/src/auth/api-tokens.ts +1 -0
  758. package/src/auth/oauth-state-store.ts +3 -0
  759. package/src/auth/providers/github-admin.tsx +5 -6
  760. package/src/auth/providers/google-admin.tsx +5 -6
  761. package/src/auth/scopes.ts +3 -9
  762. package/src/cli/client-factory.ts +0 -1
  763. package/src/cli/commands/bundle-utils.ts +50 -1
  764. package/src/cli/commands/bundle.ts +9 -2
  765. package/src/cli/commands/media.ts +127 -0
  766. package/src/client/index.ts +84 -2
  767. package/src/client/transport.ts +1 -1
  768. package/src/components/EmDashHead.astro +4 -8
  769. package/src/components/InlinePortableTextEditor.tsx +56 -35
  770. package/src/components/marks/Link.astro +5 -1
  771. package/src/database/dialect-helpers.ts +77 -3
  772. package/src/database/migrations/051_content_taxonomies_denorm.ts +120 -0
  773. package/src/database/migrations/052_media_usage_read_index.ts +26 -0
  774. package/src/database/migrations/053_plugin_mcp_tools.ts +21 -0
  775. package/src/database/migrations/runner.ts +6 -0
  776. package/src/database/repositories/audit.ts +2 -1
  777. package/src/database/repositories/content.ts +98 -16
  778. package/src/database/repositories/media-usage.ts +250 -1
  779. package/src/database/repositories/plugin-storage.ts +29 -32
  780. package/src/database/repositories/redirect.ts +14 -2
  781. package/src/database/repositories/taxonomy.ts +57 -8
  782. package/src/database/types.ts +23 -0
  783. package/src/db/adapters.ts +9 -0
  784. package/src/emdash-runtime.ts +310 -66
  785. package/src/loader.ts +292 -1
  786. package/src/mcp/server.ts +222 -5
  787. package/src/media/image-endpoint.ts +38 -2
  788. package/src/page/metadata.ts +27 -0
  789. package/src/plugin-types.ts +19 -0
  790. package/src/plugin-utils.ts +8 -6
  791. package/src/plugins/adapt-sandbox-entry.ts +30 -1
  792. package/src/plugins/context.ts +7 -0
  793. package/src/plugins/define-plugin.ts +16 -0
  794. package/src/plugins/manifest-schema.ts +28 -1
  795. package/src/plugins/routes.ts +27 -1
  796. package/src/plugins/sandbox/runner-options.ts +16 -0
  797. package/src/plugins/sandbox/types.ts +6 -1
  798. package/src/plugins/state.ts +17 -1
  799. package/src/plugins/storage-query.ts +67 -33
  800. package/src/plugins/types.ts +41 -0
  801. package/src/schema/registry.ts +141 -5
  802. package/src/seed/apply.ts +28 -29
  803. package/src/seo/index.ts +19 -4
  804. package/src/storage/types.ts +6 -0
  805. package/src/utils/base64.ts +7 -2
  806. package/src/utils/db-errors.ts +3 -1
  807. package/src/virtual-modules.d.ts +13 -0
  808. package/src/visual-editing/toolbar.ts +1 -1
  809. package/dist/adapters-DPAkL6QF.d.mts.map +0 -1
  810. package/dist/api-DVbHNApo.mjs.map +0 -1
  811. package/dist/api-tokens-Dk2GrJMY.mjs +0 -3
  812. package/dist/apply-D23iUV4q.mjs.map +0 -1
  813. package/dist/authorize-BmCwQCib.mjs.map +0 -1
  814. package/dist/base64-C74Msx8h.mjs.map +0 -1
  815. package/dist/content-BO61Sx4j.mjs.map +0 -1
  816. package/dist/content-refresh-BkkApzeS.mjs.map +0 -1
  817. package/dist/context-DtSFYFuS.mjs.map +0 -1
  818. package/dist/db-errors-BKuXh_fi.mjs.map +0 -1
  819. package/dist/device-flow-CPXQ_QfW.mjs.map +0 -1
  820. package/dist/error-CfJMLSkd.mjs.map +0 -1
  821. package/dist/index-BXOCyLj0.d.mts.map +0 -1
  822. package/dist/loader-Rb8QlGZp.mjs.map +0 -1
  823. package/dist/manifest-schema-DeGNma2O.mjs.map +0 -1
  824. package/dist/menus-BtvH7Z7t.mjs.map +0 -1
  825. package/dist/oauth-authorization-BWqWTHBK.mjs.map +0 -1
  826. package/dist/public-url-C0cEvrRu.mjs.map +0 -1
  827. package/dist/redirect-Ch3E98qZ.mjs.map +0 -1
  828. package/dist/redirects-CeD7K7EX.mjs.map +0 -1
  829. package/dist/registry-CyIXPi4E.mjs.map +0 -1
  830. package/dist/relations-CbBpoOys.d.mts.map +0 -1
  831. package/dist/runner-jt65bF7F.mjs.map +0 -1
  832. package/dist/scheduled-publish-DlJHGcuL.d.mts +0 -11
  833. package/dist/scheduled-publish-DlJHGcuL.d.mts.map +0 -1
  834. package/dist/taxonomy-BkxbUMSw.mjs.map +0 -1
  835. package/dist/types-CtDVagM4.d.mts.map +0 -1
  836. package/dist/types-momGysZk.d.mts.map +0 -1
  837. package/dist/version-BlIJvNAZ.mjs +0 -7
  838. /package/dist/{ssrf-B5DOv5E5.mjs → ssrf-BB__xfNM.mjs} +0 -0
  839. /package/dist/{types-DeCZBZxn.mjs → types-CK0LxPUQ.mjs} +0 -0
@@ -1,6 +1,6 @@
1
1
  import { MIGRATION_LOCK_BUSY_MESSAGE } from "./database/pg-migration-lock.mjs";
2
2
  import { t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
3
- import { a as currentTimestampValue, i as currentTimestamp, l as listTablesLike, r as columnExists, s as isSqlite, t as binaryType } from "./dialect-helpers-Cue7QQOR.mjs";
3
+ import { a as currentTimestampValue, c as listTablesLike, i as currentTimestamp, r as columnExists, s as isSqlite, t as binaryType } from "./dialect-helpers-HxEQGl_1.mjs";
4
4
  import { n as getI18nConfig } from "./config-CVssduLe.mjs";
5
5
  import { createRequire } from "node:module";
6
6
  import { sql } from "kysely";
@@ -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$48,
29
- up: () => up$48
28
+ down: () => down$51,
29
+ up: () => up$51
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$48(db) {
38
+ async function up$51(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$48(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$48(db) {
58
+ async function down$51(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$48(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$47,
72
- up: () => up$47
71
+ down: () => down$50,
72
+ up: () => up$50
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$47(db) {
78
+ async function up$50(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$47(db) {
82
+ async function down$50(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$46,
90
- up: () => up$46
89
+ down: () => down$49,
90
+ up: () => up$49
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$46(db) {
98
+ async function up$49(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$46(db) {
105
+ async function down$49(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$46(db) {
110
110
  //#endregion
111
111
  //#region src/database/migrations/004_plugins.ts
112
112
  var _004_plugins_exports = /* @__PURE__ */ __exportAll({
113
- down: () => down$45,
114
- up: () => up$45
113
+ down: () => down$48,
114
+ up: () => up$48
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$45(db) {
124
+ async function up$48(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$45(db) {
139
139
  "index_name"
140
140
  ]).execute();
141
141
  }
142
- async function down$45(db) {
142
+ async function down$48(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$45(db) {
148
148
  //#endregion
149
149
  //#region src/database/migrations/005_menus.ts
150
150
  var _005_menus_exports = /* @__PURE__ */ __exportAll({
151
- down: () => down$44,
152
- up: () => up$44
151
+ down: () => down$47,
152
+ up: () => up$47
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$44(db) {
160
+ async function up$47(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$44(db) {
166
+ async function down$47(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$44(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$43,
175
- up: () => up$43
174
+ down: () => down$46,
175
+ up: () => up$46
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$43(db) {
183
+ async function up$46(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$43(db) {
198
198
  collections: JSON.stringify(["posts"])
199
199
  }]).execute();
200
200
  }
201
- async function down$43(db) {
201
+ async function down$46(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$42,
209
- up: () => up$42
208
+ down: () => down$45,
209
+ up: () => up$45
210
210
  });
211
- async function up$42(db) {
211
+ async function up$45(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$42(db) {
216
+ async function down$45(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$42(db) {
221
221
  //#endregion
222
222
  //#region src/database/migrations/008_auth.ts
223
223
  var _008_auth_exports = /* @__PURE__ */ __exportAll({
224
- down: () => down$41,
225
- up: () => up$41
224
+ down: () => down$44,
225
+ up: () => up$44
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$41(db) {
239
+ async function up$44(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$41(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$41(db) {
272
+ async function down$44(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$41(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$40,
306
- up: () => up$40
305
+ down: () => down$43,
306
+ up: () => up$43
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$40(db) {
315
+ async function up$43(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$40(db) {
319
+ async function down$43(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$39,
327
- up: () => up$39
326
+ down: () => down$42,
327
+ up: () => up$42
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$39(db) {
336
+ async function up$42(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$39(db) {
342
+ async function down$42(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$39(db) {
349
349
  //#endregion
350
350
  //#region src/database/migrations/012_search.ts
351
351
  var _012_search_exports = /* @__PURE__ */ __exportAll({
352
- down: () => down$38,
353
- up: () => up$38
352
+ down: () => down$41,
353
+ up: () => up$41
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$38(db) {
361
+ async function up$41(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$38(db) {
365
+ async function down$41(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$38(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$37,
374
- up: () => up$37
373
+ down: () => down$40,
374
+ up: () => up$40
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$37(db) {
383
+ async function up$40(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$37(db) {
395
395
  `.execute(db);
396
396
  }
397
397
  }
398
- async function down$37(db) {
398
+ async function down$40(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$37(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$36,
416
- up: () => up$36
415
+ down: () => down$39,
416
+ up: () => up$39
417
417
  });
418
- async function up$36(db) {
418
+ async function up$39(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$36(db) {
437
437
  `.execute(db);
438
438
  }
439
439
  }
440
- async function down$36(db) {
440
+ async function down$39(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$36(db) {
461
461
  //#endregion
462
462
  //#region src/database/migrations/015_indexes.ts
463
463
  var _015_indexes_exports = /* @__PURE__ */ __exportAll({
464
- down: () => down$35,
465
- up: () => up$35
464
+ down: () => down$38,
465
+ up: () => up$38
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$35(db) {
478
+ async function up$38(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$35(db) {
495
495
  `.execute(db);
496
496
  }
497
497
  }
498
- async function down$35(db) {
498
+ async function down$38(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$35(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$34,
517
- up: () => up$34
516
+ down: () => down$37,
517
+ up: () => up$37
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$34(db) {
535
+ async function up$37(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$34(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$34(db) {
544
+ async function down$37(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$34(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$33,
554
- up: () => up$33
553
+ down: () => down$36,
554
+ up: () => up$36
555
555
  });
556
556
  /**
557
557
  * Authorization codes for OAuth 2.1 Authorization Code + PKCE flow.
@@ -561,20 +561,20 @@ var _017_authorization_codes_exports = /* @__PURE__ */ __exportAll({
561
561
  *
562
562
  * Also adds client_id tracking to oauth_tokens for per-client revocation.
563
563
  */
564
- async function up$33(db) {
564
+ async function up$36(db) {
565
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
566
  await db.schema.createIndex("idx_auth_codes_expires").on("_emdash_authorization_codes").column("expires_at").execute();
567
567
  await sql`ALTER TABLE _emdash_oauth_tokens ADD COLUMN client_id TEXT`.execute(db);
568
568
  }
569
- async function down$33(db) {
569
+ async function down$36(db) {
570
570
  await db.schema.dropTable("_emdash_authorization_codes").execute();
571
571
  }
572
572
 
573
573
  //#endregion
574
574
  //#region src/database/migrations/018_seo.ts
575
575
  var _018_seo_exports = /* @__PURE__ */ __exportAll({
576
- down: () => down$32,
577
- up: () => up$32
576
+ down: () => down$35,
577
+ up: () => up$35
578
578
  });
579
579
  /**
580
580
  * Migration: SEO support
@@ -587,7 +587,7 @@ var _018_seo_exports = /* @__PURE__ */ __exportAll({
587
587
  * need it. The `has_seo` flag controls whether the admin shows SEO fields
588
588
  * and whether the collection's content appears in sitemaps.
589
589
  */
590
- async function up$32(db) {
590
+ async function up$35(db) {
591
591
  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
592
  await sql`
593
593
  CREATE INDEX idx_emdash_seo_collection
@@ -598,7 +598,7 @@ async function up$32(db) {
598
598
  ADD COLUMN has_seo INTEGER NOT NULL DEFAULT 0
599
599
  `.execute(db);
600
600
  }
601
- async function down$32(db) {
601
+ async function down$35(db) {
602
602
  await sql`DROP TABLE IF EXISTS _emdash_seo`.execute(db);
603
603
  await sql`
604
604
  ALTER TABLE _emdash_collections
@@ -609,8 +609,8 @@ async function down$32(db) {
609
609
  //#endregion
610
610
  //#region src/database/migrations/019_i18n.ts
611
611
  var _019_i18n_exports = /* @__PURE__ */ __exportAll({
612
- down: () => down$31,
613
- up: () => up$31
612
+ down: () => down$34,
613
+ up: () => up$34
614
614
  });
615
615
  /**
616
616
  * Quote an identifier for use in raw SQL. Escapes embedded double-quotes
@@ -723,7 +723,7 @@ async function upPostgres$1(db) {
723
723
  ADD COLUMN translatable INTEGER NOT NULL DEFAULT 1
724
724
  `.execute(db);
725
725
  }
726
- async function up$31(db) {
726
+ async function up$34(db) {
727
727
  if (!isSqlite(db)) return upPostgres$1(db);
728
728
  const orphanedTmps = await listTablesLike(db, "ec_%_i18n_tmp");
729
729
  for (const tmpName of orphanedTmps) {
@@ -840,7 +840,7 @@ async function downPostgres(db) {
840
840
  await sql`ALTER TABLE ${sql.ref(t)} DROP COLUMN translation_group`.execute(db);
841
841
  }
842
842
  }
843
- async function down$31(db) {
843
+ async function down$34(db) {
844
844
  if (!isSqlite(db)) return downPostgres(db);
845
845
  await sql`
846
846
  ALTER TABLE _emdash_fields
@@ -947,8 +947,8 @@ async function down$31(db) {
947
947
  //#endregion
948
948
  //#region src/database/migrations/020_collection_url_pattern.ts
949
949
  var _020_collection_url_pattern_exports = /* @__PURE__ */ __exportAll({
950
- down: () => down$30,
951
- up: () => up$30
950
+ down: () => down$33,
951
+ up: () => up$33
952
952
  });
953
953
  /**
954
954
  * Migration: URL pattern for collections
@@ -957,13 +957,13 @@ var _020_collection_url_pattern_exports = /* @__PURE__ */ __exportAll({
957
957
  * can declare its own URL structure (e.g. "/{slug}" for pages, "/blog/{slug}"
958
958
  * for posts). Used for menu URL resolution, sitemaps, and path-based lookups.
959
959
  */
960
- async function up$30(db) {
960
+ async function up$33(db) {
961
961
  await sql`
962
962
  ALTER TABLE _emdash_collections
963
963
  ADD COLUMN url_pattern TEXT
964
964
  `.execute(db);
965
965
  }
966
- async function down$30(db) {
966
+ async function down$33(db) {
967
967
  await sql`
968
968
  ALTER TABLE _emdash_collections
969
969
  DROP COLUMN url_pattern
@@ -973,8 +973,8 @@ async function down$30(db) {
973
973
  //#endregion
974
974
  //#region src/database/migrations/021_remove_section_categories.ts
975
975
  var _021_remove_section_categories_exports = /* @__PURE__ */ __exportAll({
976
- down: () => down$29,
977
- up: () => up$29
976
+ down: () => down$32,
977
+ up: () => up$32
978
978
  });
979
979
  /**
980
980
  * Migration: Remove section categories
@@ -983,12 +983,12 @@ var _021_remove_section_categories_exports = /* @__PURE__ */ __exportAll({
983
983
  * Rather than building the missing UI for a feature with very little need at this stage,
984
984
  * we're removing the feature entirely.
985
985
  */
986
- async function up$29(db) {
986
+ async function up$32(db) {
987
987
  await db.schema.dropIndex("idx_sections_category").ifExists().execute();
988
988
  await db.schema.alterTable("_emdash_sections").dropColumn("category_id").execute();
989
989
  await db.schema.dropTable("_emdash_section_categories").execute();
990
990
  }
991
- async function down$29(db) {
991
+ async function down$32(db) {
992
992
  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
993
  await db.schema.alterTable("_emdash_sections").addColumn("category_id", "text", (col) => col.references("_emdash_section_categories.id").onDelete("set null")).execute();
994
994
  await db.schema.createIndex("idx_sections_category").on("_emdash_sections").columns(["category_id"]).execute();
@@ -997,8 +997,8 @@ async function down$29(db) {
997
997
  //#endregion
998
998
  //#region src/database/migrations/022_marketplace_plugin_state.ts
999
999
  var _022_marketplace_plugin_state_exports = /* @__PURE__ */ __exportAll({
1000
- down: () => down$28,
1001
- up: () => up$28
1000
+ down: () => down$31,
1001
+ up: () => up$31
1002
1002
  });
1003
1003
  /**
1004
1004
  * Migration: Add marketplace fields to _plugin_state
@@ -1007,7 +1007,7 @@ var _022_marketplace_plugin_state_exports = /* @__PURE__ */ __exportAll({
1007
1007
  * whether a plugin was installed from config or marketplace,
1008
1008
  * and which marketplace version is installed.
1009
1009
  */
1010
- async function up$28(db) {
1010
+ async function up$31(db) {
1011
1011
  await sql`
1012
1012
  ALTER TABLE _plugin_state
1013
1013
  ADD COLUMN source TEXT NOT NULL DEFAULT 'config'
@@ -1022,7 +1022,7 @@ async function up$28(db) {
1022
1022
  WHERE source = 'marketplace'
1023
1023
  `.execute(db);
1024
1024
  }
1025
- async function down$28(db) {
1025
+ async function down$31(db) {
1026
1026
  await sql`
1027
1027
  DROP INDEX IF EXISTS idx_plugin_state_source
1028
1028
  `.execute(db);
@@ -1039,8 +1039,8 @@ async function down$28(db) {
1039
1039
  //#endregion
1040
1040
  //#region src/database/migrations/023_plugin_metadata.ts
1041
1041
  var _023_plugin_metadata_exports = /* @__PURE__ */ __exportAll({
1042
- down: () => down$27,
1043
- up: () => up$27
1042
+ down: () => down$30,
1043
+ up: () => up$30
1044
1044
  });
1045
1045
  /**
1046
1046
  * Migration: Add display metadata to _plugin_state
@@ -1049,7 +1049,7 @@ var _023_plugin_metadata_exports = /* @__PURE__ */ __exportAll({
1049
1049
  * so the admin UI can show meaningful info without re-fetching
1050
1050
  * from the marketplace on every page load.
1051
1051
  */
1052
- async function up$27(db) {
1052
+ async function up$30(db) {
1053
1053
  await sql`
1054
1054
  ALTER TABLE _plugin_state
1055
1055
  ADD COLUMN display_name TEXT
@@ -1059,7 +1059,7 @@ async function up$27(db) {
1059
1059
  ADD COLUMN description TEXT
1060
1060
  `.execute(db);
1061
1061
  }
1062
- async function down$27(db) {
1062
+ async function down$30(db) {
1063
1063
  await sql`
1064
1064
  ALTER TABLE _plugin_state
1065
1065
  DROP COLUMN description
@@ -1073,8 +1073,8 @@ async function down$27(db) {
1073
1073
  //#endregion
1074
1074
  //#region src/database/migrations/024_media_placeholders.ts
1075
1075
  var _024_media_placeholders_exports = /* @__PURE__ */ __exportAll({
1076
- down: () => down$26,
1077
- up: () => up$26
1076
+ down: () => down$29,
1077
+ up: () => up$29
1078
1078
  });
1079
1079
  /**
1080
1080
  * Migration: Add placeholder columns to media table
@@ -1082,7 +1082,7 @@ var _024_media_placeholders_exports = /* @__PURE__ */ __exportAll({
1082
1082
  * Stores blurhash and dominant_color for LQIP (Low Quality Image Placeholder)
1083
1083
  * support. Generated at upload time from image pixel data.
1084
1084
  */
1085
- async function up$26(db) {
1085
+ async function up$29(db) {
1086
1086
  await sql`
1087
1087
  ALTER TABLE media
1088
1088
  ADD COLUMN blurhash TEXT
@@ -1092,7 +1092,7 @@ async function up$26(db) {
1092
1092
  ADD COLUMN dominant_color TEXT
1093
1093
  `.execute(db);
1094
1094
  }
1095
- async function down$26(db) {
1095
+ async function down$29(db) {
1096
1096
  await sql`
1097
1097
  ALTER TABLE media
1098
1098
  DROP COLUMN dominant_color
@@ -1106,8 +1106,8 @@ async function down$26(db) {
1106
1106
  //#endregion
1107
1107
  //#region src/database/migrations/025_oauth_clients.ts
1108
1108
  var _025_oauth_clients_exports = /* @__PURE__ */ __exportAll({
1109
- down: () => down$25,
1110
- up: () => up$25
1109
+ down: () => down$28,
1110
+ up: () => up$28
1111
1111
  });
1112
1112
  /**
1113
1113
  * Migration: Create OAuth clients table
@@ -1118,18 +1118,18 @@ var _025_oauth_clients_exports = /* @__PURE__ */ __exportAll({
1118
1118
  * Each client has a set of pre-registered redirect URIs (JSON array).
1119
1119
  * The authorize endpoint rejects any redirect_uri not in the client's list.
1120
1120
  */
1121
- async function up$25(db) {
1121
+ async function up$28(db) {
1122
1122
  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
1123
  }
1124
- async function down$25(db) {
1124
+ async function down$28(db) {
1125
1125
  await db.schema.dropTable("_emdash_oauth_clients").execute();
1126
1126
  }
1127
1127
 
1128
1128
  //#endregion
1129
1129
  //#region src/database/migrations/026_cron_tasks.ts
1130
1130
  var _026_cron_tasks_exports = /* @__PURE__ */ __exportAll({
1131
- down: () => down$24,
1132
- up: () => up$24
1131
+ down: () => down$27,
1132
+ up: () => up$27
1133
1133
  });
1134
1134
  /**
1135
1135
  * Migration: Create cron tasks table for plugin scheduled tasks.
@@ -1140,7 +1140,7 @@ var _026_cron_tasks_exports = /* @__PURE__ */ __exportAll({
1140
1140
  * The `next_run_at` + `status` + `enabled` index drives the "find overdue
1141
1141
  * tasks" query used by CronExecutor.tick().
1142
1142
  */
1143
- async function up$24(db) {
1143
+ async function up$27(db) {
1144
1144
  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
1145
  await db.schema.createIndex("idx_cron_tasks_due").on("_emdash_cron_tasks").columns([
1146
1146
  "enabled",
@@ -1149,17 +1149,17 @@ async function up$24(db) {
1149
1149
  ]).execute();
1150
1150
  await db.schema.createIndex("idx_cron_tasks_plugin").on("_emdash_cron_tasks").column("plugin_id").execute();
1151
1151
  }
1152
- async function down$24(db) {
1152
+ async function down$27(db) {
1153
1153
  await db.schema.dropTable("_emdash_cron_tasks").execute();
1154
1154
  }
1155
1155
 
1156
1156
  //#endregion
1157
1157
  //#region src/database/migrations/027_comments.ts
1158
1158
  var _027_comments_exports = /* @__PURE__ */ __exportAll({
1159
- down: () => down$23,
1160
- up: () => up$23
1159
+ down: () => down$26,
1160
+ up: () => up$26
1161
1161
  });
1162
- async function up$23(db) {
1162
+ async function up$26(db) {
1163
1163
  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
1164
  await db.schema.createIndex("idx_comments_content").on("_emdash_comments").columns([
1165
1165
  "collection",
@@ -1175,30 +1175,30 @@ async function up$23(db) {
1175
1175
  await db.schema.alterTable("_emdash_collections").addColumn("comments_closed_after_days", "integer", (col) => col.defaultTo(90)).execute();
1176
1176
  await db.schema.alterTable("_emdash_collections").addColumn("comments_auto_approve_users", "integer", (col) => col.defaultTo(1)).execute();
1177
1177
  }
1178
- async function down$23(db) {
1178
+ async function down$26(db) {
1179
1179
  await db.schema.dropTable("_emdash_comments").execute();
1180
1180
  }
1181
1181
 
1182
1182
  //#endregion
1183
1183
  //#region src/database/migrations/028_drop_author_url.ts
1184
1184
  var _028_drop_author_url_exports = /* @__PURE__ */ __exportAll({
1185
- down: () => down$22,
1186
- up: () => up$22
1185
+ down: () => down$25,
1186
+ up: () => up$25
1187
1187
  });
1188
- async function up$22(db) {
1188
+ async function up$25(db) {
1189
1189
  await sql`ALTER TABLE _emdash_comments DROP COLUMN author_url`.execute(db);
1190
1190
  }
1191
- async function down$22(db) {
1191
+ async function down$25(db) {
1192
1192
  await db.schema.alterTable("_emdash_comments").addColumn("author_url", "text").execute();
1193
1193
  }
1194
1194
 
1195
1195
  //#endregion
1196
1196
  //#region src/database/migrations/029_redirects.ts
1197
1197
  var _029_redirects_exports = /* @__PURE__ */ __exportAll({
1198
- down: () => down$21,
1199
- up: () => up$21
1198
+ down: () => down$24,
1199
+ up: () => up$24
1200
1200
  });
1201
- async function up$21(db) {
1201
+ async function up$24(db) {
1202
1202
  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
1203
  await db.schema.createIndex("idx_redirects_source").on("_emdash_redirects").column("source").execute();
1204
1204
  await db.schema.createIndex("idx_redirects_enabled").on("_emdash_redirects").column("enabled").execute();
@@ -1207,7 +1207,7 @@ async function up$21(db) {
1207
1207
  await db.schema.createIndex("idx_404_log_path").on("_emdash_404_log").column("path").execute();
1208
1208
  await db.schema.createIndex("idx_404_log_created").on("_emdash_404_log").column("created_at").execute();
1209
1209
  }
1210
- async function down$21(db) {
1210
+ async function down$24(db) {
1211
1211
  await db.schema.dropTable("_emdash_404_log").execute();
1212
1212
  await db.schema.dropTable("_emdash_redirects").execute();
1213
1213
  }
@@ -1215,8 +1215,8 @@ async function down$21(db) {
1215
1215
  //#endregion
1216
1216
  //#region src/database/migrations/030_widen_scheduled_index.ts
1217
1217
  var _030_widen_scheduled_index_exports = /* @__PURE__ */ __exportAll({
1218
- down: () => down$20,
1219
- up: () => up$20
1218
+ down: () => down$23,
1219
+ up: () => up$23
1220
1220
  });
1221
1221
  /**
1222
1222
  * Migration: Widen scheduled publishing index
@@ -1225,7 +1225,7 @@ var _030_widen_scheduled_index_exports = /* @__PURE__ */ __exportAll({
1225
1225
  * Published posts can now have scheduled draft changes, so widen the
1226
1226
  * index to cover all rows where scheduled_at IS NOT NULL.
1227
1227
  */
1228
- async function up$20(db) {
1228
+ async function up$23(db) {
1229
1229
  const tableNames = await listTablesLike(db, "ec_%");
1230
1230
  for (const tableName of tableNames) {
1231
1231
  const table = { name: tableName };
@@ -1239,7 +1239,7 @@ async function up$20(db) {
1239
1239
  `.execute(db);
1240
1240
  }
1241
1241
  }
1242
- async function down$20(db) {
1242
+ async function down$23(db) {
1243
1243
  const tableNames = await listTablesLike(db, "ec_%");
1244
1244
  for (const tableName of tableNames) {
1245
1245
  const table = { name: tableName };
@@ -1257,10 +1257,10 @@ async function down$20(db) {
1257
1257
  //#endregion
1258
1258
  //#region src/database/migrations/031_bylines.ts
1259
1259
  var _031_bylines_exports = /* @__PURE__ */ __exportAll({
1260
- down: () => down$19,
1261
- up: () => up$19
1260
+ down: () => down$22,
1261
+ up: () => up$22
1262
1262
  });
1263
- async function up$19(db) {
1263
+ async function up$22(db) {
1264
1264
  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
1265
  await sql`
1266
1266
  CREATE UNIQUE INDEX ${sql.ref("idx_bylines_user_id_unique")}
@@ -1292,7 +1292,7 @@ async function up$19(db) {
1292
1292
  `.execute(db);
1293
1293
  }
1294
1294
  }
1295
- async function down$19(db) {
1295
+ async function down$22(db) {
1296
1296
  const tableNames = await listTablesLike(db, "ec_%");
1297
1297
  for (const tableName of tableNames) {
1298
1298
  await sql`
@@ -1310,8 +1310,8 @@ async function down$19(db) {
1310
1310
  //#endregion
1311
1311
  //#region src/database/migrations/032_rate_limits.ts
1312
1312
  var _032_rate_limits_exports = /* @__PURE__ */ __exportAll({
1313
- down: () => down$18,
1314
- up: () => up$18
1313
+ down: () => down$21,
1314
+ up: () => up$21
1315
1315
  });
1316
1316
  /**
1317
1317
  * Migration: Rate limits table + device code polling tracking.
@@ -1322,12 +1322,12 @@ var _032_rate_limits_exports = /* @__PURE__ */ __exportAll({
1322
1322
  * 2. Add last_polled_at column to _emdash_device_codes for
1323
1323
  * RFC 8628 slow_down enforcement.
1324
1324
  */
1325
- async function up$18(db) {
1325
+ async function up$21(db) {
1326
1326
  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
1327
  await db.schema.createIndex("idx_rate_limits_window").on("_emdash_rate_limits").column("window").execute();
1328
1328
  await db.schema.alterTable("_emdash_device_codes").addColumn("last_polled_at", "text").execute();
1329
1329
  }
1330
- async function down$18(db) {
1330
+ async function down$21(db) {
1331
1331
  await db.schema.dropTable("_emdash_rate_limits").execute();
1332
1332
  await db.schema.alterTable("_emdash_device_codes").dropColumn("last_polled_at").execute();
1333
1333
  }
@@ -1335,8 +1335,8 @@ async function down$18(db) {
1335
1335
  //#endregion
1336
1336
  //#region src/database/migrations/033_optimize_content_indexes.ts
1337
1337
  var _033_optimize_content_indexes_exports = /* @__PURE__ */ __exportAll({
1338
- down: () => down$17,
1339
- up: () => up$17
1338
+ down: () => down$20,
1339
+ up: () => up$20
1340
1340
  });
1341
1341
  /**
1342
1342
  * Migration: Optimize content table indexes for D1 performance
@@ -1349,7 +1349,7 @@ var _033_optimize_content_indexes_exports = /* @__PURE__ */ __exportAll({
1349
1349
  *
1350
1350
  * Impact: Reduces D1 row reads by 90%+ for admin panel operations.
1351
1351
  */
1352
- async function up$17(db) {
1352
+ async function up$20(db) {
1353
1353
  const tableNames = await listTablesLike(db, "ec_%");
1354
1354
  for (const tableName of tableNames) {
1355
1355
  const table = { name: tableName };
@@ -1391,7 +1391,7 @@ async function up$17(db) {
1391
1391
  WHERE status = 'trash'
1392
1392
  `.execute(db);
1393
1393
  }
1394
- async function down$17(db) {
1394
+ async function down$20(db) {
1395
1395
  const tableNames = await listTablesLike(db, "ec_%");
1396
1396
  for (const tableName of tableNames) {
1397
1397
  const table = { name: tableName };
@@ -1424,10 +1424,10 @@ async function down$17(db) {
1424
1424
  //#endregion
1425
1425
  //#region src/database/migrations/034_published_at_index.ts
1426
1426
  var _034_published_at_index_exports = /* @__PURE__ */ __exportAll({
1427
- down: () => down$16,
1428
- up: () => up$16
1427
+ down: () => down$19,
1428
+ up: () => up$19
1429
1429
  });
1430
- async function up$16(db) {
1430
+ async function up$19(db) {
1431
1431
  const tableNames = await listTablesLike(db, "ec_%");
1432
1432
  for (const tableName of tableNames) {
1433
1433
  const table = { name: tableName };
@@ -1437,7 +1437,7 @@ async function up$16(db) {
1437
1437
  `.execute(db);
1438
1438
  }
1439
1439
  }
1440
- async function down$16(db) {
1440
+ async function down$19(db) {
1441
1441
  const tableNames = await listTablesLike(db, "ec_%");
1442
1442
  for (const tableName of tableNames) {
1443
1443
  const table = { name: tableName };
@@ -1448,8 +1448,8 @@ async function down$16(db) {
1448
1448
  //#endregion
1449
1449
  //#region src/database/migrations/035_bounded_404_log.ts
1450
1450
  var _035_bounded_404_log_exports = /* @__PURE__ */ __exportAll({
1451
- down: () => down$15,
1452
- up: () => up$15
1451
+ down: () => down$18,
1452
+ up: () => up$18
1453
1453
  });
1454
1454
  /**
1455
1455
  * Migration: Bounded 404 logging
@@ -1467,7 +1467,7 @@ var _035_bounded_404_log_exports = /* @__PURE__ */ __exportAll({
1467
1467
  * path and summing hits
1468
1468
  * - Adds a UNIQUE index on `path` so upsert semantics work
1469
1469
  */
1470
- async function up$15(db) {
1470
+ async function up$18(db) {
1471
1471
  const hitsExists = await columnExists(db, "_emdash_404_log", "hits");
1472
1472
  if (!hitsExists) await db.schema.alterTable("_emdash_404_log").addColumn("hits", "integer", (col) => col.notNull().defaultTo(1)).execute();
1473
1473
  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 +1516,7 @@ async function up$15(db) {
1516
1516
  await db.schema.dropIndex("idx_404_log_path").ifExists().execute();
1517
1517
  await db.schema.createIndex("idx_404_log_last_seen").ifNotExists().on("_emdash_404_log").column("last_seen_at").execute();
1518
1518
  }
1519
- async function down$15(db) {
1519
+ async function down$18(db) {
1520
1520
  await db.schema.dropIndex("idx_404_log_last_seen").ifExists().execute();
1521
1521
  await db.schema.dropIndex("idx_404_log_path_unique").ifExists().execute();
1522
1522
  await db.schema.createIndex("idx_404_log_path").ifNotExists().on("_emdash_404_log").column("path").execute();
@@ -1527,8 +1527,8 @@ async function down$15(db) {
1527
1527
  //#endregion
1528
1528
  //#region src/database/migrations/036_i18n_menus_and_taxonomies.ts
1529
1529
  var _036_i18n_menus_and_taxonomies_exports = /* @__PURE__ */ __exportAll({
1530
- down: () => down$14,
1531
- up: () => up$14
1530
+ down: () => down$17,
1531
+ up: () => up$17
1532
1532
  });
1533
1533
  /**
1534
1534
  * i18n for menus + taxonomies. Adds `locale` + `translation_group` to system
@@ -1539,7 +1539,7 @@ var _036_i18n_menus_and_taxonomies_exports = /* @__PURE__ */ __exportAll({
1539
1539
  function getDefaultLocale$1() {
1540
1540
  return getI18nConfig()?.defaultLocale ?? "en";
1541
1541
  }
1542
- async function up$14(db) {
1542
+ async function up$17(db) {
1543
1543
  const defaultLocale = getDefaultLocale$1();
1544
1544
  if (isSqlite(db)) {
1545
1545
  await rebuildContentTaxonomies(db);
@@ -1754,7 +1754,7 @@ async function assertSingleLocale$1(db, defaultLocale) {
1754
1754
  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
1755
  }
1756
1756
  }
1757
- async function down$14(db) {
1757
+ async function down$17(db) {
1758
1758
  const defaultLocale = getDefaultLocale$1();
1759
1759
  await assertSingleLocale$1(db, defaultLocale);
1760
1760
  await assertContentTaxonomiesResolve(db, defaultLocale);
@@ -1852,21 +1852,21 @@ async function rebuildTaxonomyDefsDown(db) {
1852
1852
  //#endregion
1853
1853
  //#region src/database/migrations/037_credential_algorithm.ts
1854
1854
  var _037_credential_algorithm_exports = /* @__PURE__ */ __exportAll({
1855
- down: () => down$13,
1856
- up: () => up$13
1855
+ down: () => down$16,
1856
+ up: () => up$16
1857
1857
  });
1858
- async function up$13(db) {
1858
+ async function up$16(db) {
1859
1859
  if (!await columnExists(db, "credentials", "algorithm")) await db.schema.alterTable("credentials").addColumn("algorithm", "integer", (col) => col.notNull().defaultTo(-7)).execute();
1860
1860
  }
1861
- async function down$13(db) {
1861
+ async function down$16(db) {
1862
1862
  if (await columnExists(db, "credentials", "algorithm")) await db.schema.alterTable("credentials").dropColumn("algorithm").execute();
1863
1863
  }
1864
1864
 
1865
1865
  //#endregion
1866
1866
  //#region src/database/migrations/038_registry_plugin_state.ts
1867
1867
  var _038_registry_plugin_state_exports = /* @__PURE__ */ __exportAll({
1868
- down: () => down$12,
1869
- up: () => up$12
1868
+ down: () => down$15,
1869
+ up: () => up$15
1870
1870
  });
1871
1871
  /**
1872
1872
  * Migration: Add registry fields to _plugin_state
@@ -1894,7 +1894,7 @@ var _038_registry_plugin_state_exports = /* @__PURE__ */ __exportAll({
1894
1894
  * checks before adding to keep the migration safe under partial
1895
1895
  * re-application. The same pattern is used in 019_i18n.ts.
1896
1896
  */
1897
- async function up$12(db) {
1897
+ async function up$15(db) {
1898
1898
  if (isSqlite(db)) await upSqlite(db);
1899
1899
  else await upPostgres(db);
1900
1900
  }
@@ -1937,7 +1937,7 @@ async function upPostgres(db) {
1937
1937
  WHERE source = 'registry'
1938
1938
  `.execute(db);
1939
1939
  }
1940
- async function down$12(db) {
1940
+ async function down$15(db) {
1941
1941
  await sql`
1942
1942
  DROP INDEX IF EXISTS idx_plugin_state_registry
1943
1943
  `.execute(db);
@@ -1954,10 +1954,10 @@ async function down$12(db) {
1954
1954
  //#endregion
1955
1955
  //#region src/database/migrations/039_fix_fts5_triggers.ts
1956
1956
  var _039_fix_fts5_triggers_exports = /* @__PURE__ */ __exportAll({
1957
- down: () => down$11,
1958
- up: () => up$11
1957
+ down: () => down$14,
1958
+ up: () => up$14
1959
1959
  });
1960
- async function up$11(db) {
1960
+ async function up$14(db) {
1961
1961
  if (!isSqlite(db)) return;
1962
1962
  const collections = await sql`
1963
1963
  SELECT slug, search_config FROM _emdash_collections
@@ -1991,7 +1991,7 @@ async function up$11(db) {
1991
1991
  * at runtime, not by this migration, so leaving them in their
1992
1992
  * corruption-safe state on rollback is correct.
1993
1993
  */
1994
- async function down$11(_db) {}
1994
+ async function down$14(_db) {}
1995
1995
  function isSearchEnabled(searchConfig) {
1996
1996
  if (!searchConfig) return false;
1997
1997
  try {
@@ -2083,8 +2083,8 @@ async function dropFtsObjects(db, collectionSlug) {
2083
2083
  //#endregion
2084
2084
  //#region src/database/migrations/040_byline_i18n.ts
2085
2085
  var _040_byline_i18n_exports = /* @__PURE__ */ __exportAll({
2086
- down: () => down$10,
2087
- up: () => up$10
2086
+ down: () => down$13,
2087
+ up: () => up$13
2088
2088
  });
2089
2089
  /**
2090
2090
  * i18n for bylines. Adds `locale` + `translation_group` to `_emdash_bylines`
@@ -2112,7 +2112,7 @@ var _040_byline_i18n_exports = /* @__PURE__ */ __exportAll({
2112
2112
  function getDefaultLocale() {
2113
2113
  return getI18nConfig()?.defaultLocale ?? "en";
2114
2114
  }
2115
- async function up$10(db) {
2115
+ async function up$13(db) {
2116
2116
  const defaultLocale = getDefaultLocale();
2117
2117
  if (isSqlite(db)) {
2118
2118
  await rebuildContentBylines(db);
@@ -2269,7 +2269,7 @@ async function assertSingleLocale(db, defaultLocale) {
2269
2269
  const count = Number(result.rows[0]?.count ?? 0);
2270
2270
  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
2271
  }
2272
- async function down$10(db) {
2272
+ async function down$13(db) {
2273
2273
  const defaultLocale = getDefaultLocale();
2274
2274
  await assertSingleLocale(db, defaultLocale);
2275
2275
  await assertContentBylinesResolve(db, defaultLocale);
@@ -2388,8 +2388,8 @@ async function restoreContentBylinesFk(db) {
2388
2388
  //#endregion
2389
2389
  //#region src/database/migrations/041_content_locale_list_index.ts
2390
2390
  var _041_content_locale_list_index_exports = /* @__PURE__ */ __exportAll({
2391
- down: () => down$9,
2392
- up: () => up$9
2391
+ down: () => down$12,
2392
+ up: () => up$12
2393
2393
  });
2394
2394
  /**
2395
2395
  * Migration: locale-aware composite indexes for content list queries.
@@ -2409,7 +2409,7 @@ var _041_content_locale_list_index_exports = /* @__PURE__ */ __exportAll({
2409
2409
  * slugs as short as 40 chars, making both names truncate to the same string.
2410
2410
  * Keep these identical to the names in `schema/registry.ts`.
2411
2411
  */
2412
- async function up$9(db) {
2412
+ async function up$12(db) {
2413
2413
  const tableNames = await listTablesLike(db, "ec_%");
2414
2414
  for (const tableName of tableNames) {
2415
2415
  await sql`
@@ -2422,7 +2422,7 @@ async function up$9(db) {
2422
2422
  `.execute(db);
2423
2423
  }
2424
2424
  }
2425
- async function down$9(db) {
2425
+ async function down$12(db) {
2426
2426
  const tableNames = await listTablesLike(db, "ec_%");
2427
2427
  for (const tableName of tableNames) {
2428
2428
  await sql`DROP INDEX IF EXISTS ${sql.ref(`idx_${tableName}_loc_upd`)}`.execute(db);
@@ -2433,8 +2433,8 @@ async function down$9(db) {
2433
2433
  //#endregion
2434
2434
  //#region src/database/migrations/042_byline_fields.ts
2435
2435
  var _042_byline_fields_exports = /* @__PURE__ */ __exportAll({
2436
- down: () => down$8,
2437
- up: () => up$8
2436
+ down: () => down$11,
2437
+ up: () => up$11
2438
2438
  });
2439
2439
  /**
2440
2440
  * Byline custom fields (Discussion #1174). Adds three tables and a
@@ -2479,7 +2479,7 @@ var _042_byline_fields_exports = /* @__PURE__ */ __exportAll({
2479
2479
  * reference it. If `down()` runs after a partial `up()`, missing tables
2480
2480
  * are tolerated (`DROP TABLE IF EXISTS`).
2481
2481
  */
2482
- async function up$8(db) {
2482
+ async function up$11(db) {
2483
2483
  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
2484
  await db.schema.createIndex("idx__emdash_byline_fields_sort_order").ifNotExists().on("_emdash_byline_fields").column("sort_order").execute();
2485
2485
  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 +2502,7 @@ async function up$8(db) {
2502
2502
  * `up()` (only one or two tables landed) still settles the database back
2503
2503
  * to its pre-042 state.
2504
2504
  */
2505
- async function down$8(db) {
2505
+ async function down$11(db) {
2506
2506
  await db.schema.dropTable("_emdash_byline_field_group_values").ifExists().execute();
2507
2507
  await db.schema.dropTable("_emdash_byline_field_values").ifExists().execute();
2508
2508
  await db.schema.dropTable("_emdash_byline_fields").ifExists().execute();
@@ -2512,8 +2512,8 @@ async function down$8(db) {
2512
2512
  //#endregion
2513
2513
  //#region src/database/migrations/043_content_references.ts
2514
2514
  var _043_content_references_exports = /* @__PURE__ */ __exportAll({
2515
- down: () => down$7,
2516
- up: () => up$7
2515
+ down: () => down$10,
2516
+ up: () => up$10
2517
2517
  });
2518
2518
  /**
2519
2519
  * Content references.
@@ -2533,7 +2533,7 @@ var _043_content_references_exports = /* @__PURE__ */ __exportAll({
2533
2533
  * race-recovery path) re-applies cleanly — including any indexes that landed in
2534
2534
  * the failed pass after their table.
2535
2535
  */
2536
- async function up$7(db) {
2536
+ async function up$10(db) {
2537
2537
  const defaultLocale = getI18nConfig()?.defaultLocale ?? "en";
2538
2538
  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
2539
  await db.schema.createIndex("idx__emdash_relations_locale").ifNotExists().on("_emdash_relations").column("locale").execute();
@@ -2554,7 +2554,7 @@ async function up$7(db) {
2554
2554
  await db.schema.createIndex("idx__emdash_content_references_child").ifNotExists().on("_emdash_content_references").columns(["child_group", "relation_group"]).execute();
2555
2555
  await db.schema.createIndex("idx__emdash_content_references_relation").ifNotExists().on("_emdash_content_references").column("relation_group").execute();
2556
2556
  }
2557
- async function down$7(db) {
2557
+ async function down$10(db) {
2558
2558
  await db.schema.dropTable("_emdash_content_references").ifExists().execute();
2559
2559
  await db.schema.dropTable("_emdash_relations").ifExists().execute();
2560
2560
  }
@@ -2562,8 +2562,8 @@ async function down$7(db) {
2562
2562
  //#endregion
2563
2563
  //#region src/database/migrations/044_comment_reactions.ts
2564
2564
  var _044_comment_reactions_exports = /* @__PURE__ */ __exportAll({
2565
- down: () => down$6,
2566
- up: () => up$6
2565
+ down: () => down$9,
2566
+ up: () => up$9
2567
2567
  });
2568
2568
  /**
2569
2569
  * Comment reactions (Tier 1 of the best-in-class comments RFC).
@@ -2575,7 +2575,7 @@ var _044_comment_reactions_exports = /* @__PURE__ */ __exportAll({
2575
2575
  *
2576
2576
  * Additive and backward-compatible: a new table, no change to existing schema.
2577
2577
  */
2578
- async function up$6(db) {
2578
+ async function up$9(db) {
2579
2579
  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
2580
  await db.schema.createIndex("idx_comment_reactions_unique").ifNotExists().on("_emdash_comment_reactions").columns([
2581
2581
  "comment_id",
@@ -2585,15 +2585,15 @@ async function up$6(db) {
2585
2585
  await db.schema.createIndex("idx_comment_reactions_comment").ifNotExists().on("_emdash_comment_reactions").column("comment_id").execute();
2586
2586
  await db.schema.createIndex("idx_comment_reactions_voter").ifNotExists().on("_emdash_comment_reactions").columns(["voter_hash", "created_at"]).execute();
2587
2587
  }
2588
- async function down$6(db) {
2588
+ async function down$9(db) {
2589
2589
  await db.schema.dropTable("_emdash_comment_reactions").execute();
2590
2590
  }
2591
2591
 
2592
2592
  //#endregion
2593
2593
  //#region src/database/migrations/045_taxonomy_parent_group.ts
2594
2594
  var _045_taxonomy_parent_group_exports = /* @__PURE__ */ __exportAll({
2595
- down: () => down$5,
2596
- up: () => up$5
2595
+ down: () => down$8,
2596
+ up: () => up$8
2597
2597
  });
2598
2598
  /**
2599
2599
  * Store the parent's `translation_group` in `taxonomies.parent_id` instead of a
@@ -2623,7 +2623,7 @@ var _045_taxonomy_parent_group_exports = /* @__PURE__ */ __exportAll({
2623
2623
  * Dialect-independent: the correlated-subquery `UPDATE` runs on SQLite (incl.
2624
2624
  * D1) and Postgres alike.
2625
2625
  */
2626
- async function up$5(db) {
2626
+ async function up$8(db) {
2627
2627
  await sql`
2628
2628
  UPDATE taxonomies
2629
2629
  SET parent_id = (
@@ -2645,7 +2645,7 @@ async function up$5(db) {
2645
2645
  * locale (the pre-migration shape). Rows with no same-locale parent are left as
2646
2646
  * they are rather than nulled, so a rollback never silently detaches a subtree.
2647
2647
  */
2648
- async function down$5(db) {
2648
+ async function down$8(db) {
2649
2649
  await sql`
2650
2650
  UPDATE taxonomies
2651
2651
  SET parent_id = COALESCE(
@@ -2663,8 +2663,8 @@ async function down$5(db) {
2663
2663
  //#endregion
2664
2664
  //#region src/database/migrations/046_media_usage_index.ts
2665
2665
  var _046_media_usage_index_exports = /* @__PURE__ */ __exportAll({
2666
- down: () => down$4,
2667
- up: () => up$4
2666
+ down: () => down$7,
2667
+ up: () => up$7
2668
2668
  });
2669
2669
  /**
2670
2670
  * Internal media usage projection tables.
@@ -2673,7 +2673,7 @@ var _046_media_usage_index_exports = /* @__PURE__ */ __exportAll({
2673
2673
  * imports, and no content-table scans. Production rows are introduced by later
2674
2674
  * phases once the central snapshot/indexer path is reviewed.
2675
2675
  */
2676
- async function up$4(db) {
2676
+ async function up$7(db) {
2677
2677
  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
2678
  await db.schema.createIndex("idx__emdash_media_usage_sources_content").ifNotExists().on("_emdash_media_usage_sources").columns([
2679
2679
  "source_type",
@@ -2695,7 +2695,7 @@ async function up$4(db) {
2695
2695
  await db.schema.createIndex("idx__emdash_media_usage_provider_asset").ifNotExists().on("_emdash_media_usage").columns(["provider", "provider_asset_id"]).execute();
2696
2696
  await db.schema.createIndex("idx__emdash_media_usage_source_generation").ifNotExists().on("_emdash_media_usage").columns(["source_key", "generation"]).execute();
2697
2697
  }
2698
- async function down$4(db) {
2698
+ async function down$7(db) {
2699
2699
  await db.schema.dropTable("_emdash_media_usage").ifExists().execute();
2700
2700
  await db.schema.dropTable("_emdash_media_usage_sources").ifExists().execute();
2701
2701
  }
@@ -2703,8 +2703,8 @@ async function down$4(db) {
2703
2703
  //#endregion
2704
2704
  //#region src/database/migrations/047_restore_taxonomy_parent_index.ts
2705
2705
  var _047_restore_taxonomy_parent_index_exports = /* @__PURE__ */ __exportAll({
2706
- down: () => down$3,
2707
- up: () => up$3
2706
+ down: () => down$6,
2707
+ up: () => up$6
2708
2708
  });
2709
2709
  /**
2710
2710
  * Restore `idx_taxonomies_parent` on `taxonomies(parent_id)` (#1665).
@@ -2721,18 +2721,18 @@ var _047_restore_taxonomy_parent_index_exports = /* @__PURE__ */ __exportAll({
2721
2721
  * index here. Fresh installs also get it in 036's rebuild for parity with the
2722
2722
  * other rebuilt tables, making this a no-op for them.
2723
2723
  */
2724
- async function up$3(db) {
2724
+ async function up$6(db) {
2725
2725
  await db.schema.createIndex("idx_taxonomies_parent").ifNotExists().on("taxonomies").column("parent_id").execute();
2726
2726
  }
2727
- async function down$3(db) {
2727
+ async function down$6(db) {
2728
2728
  await db.schema.dropIndex("idx_taxonomies_parent").ifExists().execute();
2729
2729
  }
2730
2730
 
2731
2731
  //#endregion
2732
2732
  //#region src/database/migrations/048_restore_content_taxonomies_term_index.ts
2733
2733
  var _048_restore_content_taxonomies_term_index_exports = /* @__PURE__ */ __exportAll({
2734
- down: () => down$2,
2735
- up: () => up$2
2734
+ down: () => down$5,
2735
+ up: () => up$5
2736
2736
  });
2737
2737
  /**
2738
2738
  * Restore `idx_content_taxonomies_term` on `content_taxonomies(taxonomy_id)` (#1701).
@@ -2752,18 +2752,18 @@ var _048_restore_content_taxonomies_term_index_exports = /* @__PURE__ */ __expor
2752
2752
  *
2753
2753
  * Forward-only.
2754
2754
  */
2755
- async function up$2(db) {
2755
+ async function up$5(db) {
2756
2756
  await db.schema.createIndex("idx_content_taxonomies_term").ifNotExists().on("content_taxonomies").column("taxonomy_id").execute();
2757
2757
  }
2758
- async function down$2(db) {
2758
+ async function down$5(db) {
2759
2759
  await db.schema.dropIndex("idx_content_taxonomies_term").ifExists().execute();
2760
2760
  }
2761
2761
 
2762
2762
  //#endregion
2763
2763
  //#region src/database/migrations/049_taxonomies_name_locale_index.ts
2764
2764
  var _049_taxonomies_name_locale_index_exports = /* @__PURE__ */ __exportAll({
2765
- down: () => down$1,
2766
- up: () => up$1
2765
+ down: () => down$4,
2766
+ up: () => up$4
2767
2767
  });
2768
2768
  /**
2769
2769
  * Add composite `idx_taxonomies_name_locale` on `taxonomies(name, locale)` (#1723).
@@ -2784,11 +2784,11 @@ var _049_taxonomies_name_locale_index_exports = /* @__PURE__ */ __exportAll({
2784
2784
  * by the new composite's prefix. Create-before-drop keeps name lookups indexed
2785
2785
  * at every point. Both statements are idempotent so a partial apply can retry.
2786
2786
  */
2787
- async function up$1(db) {
2787
+ async function up$4(db) {
2788
2788
  await db.schema.createIndex("idx_taxonomies_name_locale").ifNotExists().on("taxonomies").columns(["name", "locale"]).execute();
2789
2789
  await db.schema.dropIndex("idx_taxonomies_name").ifExists().execute();
2790
2790
  }
2791
- async function down$1(db) {
2791
+ async function down$4(db) {
2792
2792
  await db.schema.createIndex("idx_taxonomies_name").ifNotExists().on("taxonomies").column("name").execute();
2793
2793
  await db.schema.dropIndex("idx_taxonomies_name_locale").ifExists().execute();
2794
2794
  }
@@ -2796,8 +2796,8 @@ async function down$1(db) {
2796
2796
  //#endregion
2797
2797
  //#region src/database/migrations/050_media_usage_index_status.ts
2798
2798
  var _050_media_usage_index_status_exports = /* @__PURE__ */ __exportAll({
2799
- down: () => down,
2800
- up: () => up
2799
+ down: () => down$3,
2800
+ up: () => up$3
2801
2801
  });
2802
2802
  const SOURCE_TABLE = "_emdash_media_usage_sources";
2803
2803
  const DUPLICATE_COLUMN_RE = /(?:duplicate column|column .* already exists|already exists.*column)/i;
@@ -2808,7 +2808,7 @@ const DUPLICATE_COLUMN_RE = /(?:duplicate column|column .* already exists|alread
2808
2808
  * tracking for later reference-index reconciliation. No content scans, no
2809
2809
  * runtime imports, and no backfill.
2810
2810
  */
2811
- async function up(db) {
2811
+ async function up$3(db) {
2812
2812
  await addSourceMetadataColumns(db);
2813
2813
  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
2814
  "adapter_id",
@@ -2823,7 +2823,7 @@ async function up(db) {
2823
2823
  await db.schema.createIndex("idx__emdash_media_usage_sources_fingerprint").ifNotExists().on("_emdash_media_usage_sources").column("source_fingerprint").execute();
2824
2824
  await db.schema.createIndex("idx__emdash_media_usage_index_status_status").ifNotExists().on("_emdash_media_usage_index_status").columns(["adapter_id", "status"]).execute();
2825
2825
  }
2826
- async function down(db) {
2826
+ async function down$3(db) {
2827
2827
  await db.schema.dropIndex("idx__emdash_media_usage_index_status_status").ifExists().execute();
2828
2828
  await db.schema.dropIndex("idx__emdash_media_usage_sources_fingerprint").ifExists().execute();
2829
2829
  await db.schema.dropIndex("idx__emdash_media_usage_sources_completeness").ifExists().execute();
@@ -2876,6 +2876,137 @@ async function dropSourceMetadataColumns(db) {
2876
2876
  ]) if (await columnExists(db, SOURCE_TABLE, columnName)) await db.schema.alterTable(SOURCE_TABLE).dropColumn(columnName).execute();
2877
2877
  }
2878
2878
 
2879
+ //#endregion
2880
+ //#region src/database/migrations/051_content_taxonomies_denorm.ts
2881
+ var _051_content_taxonomies_denorm_exports = /* @__PURE__ */ __exportAll({
2882
+ down: () => down$2,
2883
+ up: () => up$2
2884
+ });
2885
+ /**
2886
+ * Denormalize the filter + sort columns from `ec_*` onto `content_taxonomies`
2887
+ * and mirror `ec_*`'s composite sort indexes onto the pivot (#1834).
2888
+ *
2889
+ * A taxonomy-filtered listing used to apply the term filter as a correlated
2890
+ * `EXISTS` on `SELECT * FROM ec_<collection> … ORDER BY … LIMIT ?`. The pivot
2891
+ * carried only `(collection, entry_id, taxonomy_id)`, so the filter
2892
+ * (`deleted_at`, `status`, `locale`) and the sort (`published_at`/`created_at`)
2893
+ * could only be evaluated on the `ec_*` row. On stats-blind SQLite/D1 a
2894
+ * selective term never fills the `LIMIT`, so the query walked the whole
2895
+ * collection (~75k D1 rows read for a one-row page).
2896
+ *
2897
+ * Copying those columns onto the pivot and indexing them keyed by
2898
+ * `(taxonomy_id, collection, …)` lets the loader seek the term and walk a
2899
+ * sort-ordered pivot index, short-circuiting on `LIMIT`, then touch `ec_*` only
2900
+ * by primary key to hydrate the page.
2901
+ *
2902
+ * The columns are advisory (D1 has no transactions; the write-path re-stamp is
2903
+ * non-atomic), so the read path re-checks the real predicates on the joined
2904
+ * `ec_*` row — see loader.ts. `updated_at` is deliberately not denormalized: it
2905
+ * moves on every edit and is seldom a public sort, so its write cost outweighs
2906
+ * its read value; `updated_at`-sorted taxonomy listings temp-sort instead.
2907
+ *
2908
+ * Order matters: add the columns, backfill, THEN build the indexes so each
2909
+ * index is built once over populated data rather than maintained through the
2910
+ * backfill `UPDATE`.
2911
+ *
2912
+ * Forward-only.
2913
+ */
2914
+ const DENORM_COLUMNS = [
2915
+ "status",
2916
+ "scheduled_at",
2917
+ "deleted_at",
2918
+ "locale",
2919
+ "published_at",
2920
+ "created_at"
2921
+ ];
2922
+ const INDEXES = [
2923
+ {
2924
+ name: "idx_content_taxonomies_pub",
2925
+ columns: "taxonomy_id, collection, deleted_at, published_at DESC, entry_id DESC"
2926
+ },
2927
+ {
2928
+ name: "idx_content_taxonomies_crt",
2929
+ columns: "taxonomy_id, collection, deleted_at, created_at DESC, entry_id DESC"
2930
+ },
2931
+ {
2932
+ name: "idx_content_taxonomies_loc_pub",
2933
+ columns: "taxonomy_id, collection, deleted_at, locale, published_at DESC, entry_id DESC"
2934
+ },
2935
+ {
2936
+ name: "idx_content_taxonomies_loc_crt",
2937
+ columns: "taxonomy_id, collection, deleted_at, locale, created_at DESC, entry_id DESC"
2938
+ }
2939
+ ];
2940
+ async function up$2(db) {
2941
+ for (const column of DENORM_COLUMNS) {
2942
+ if (await columnExists(db, "content_taxonomies", column)) continue;
2943
+ await sql`
2944
+ ALTER TABLE content_taxonomies ADD COLUMN ${sql.ref(column)} TEXT
2945
+ `.execute(db);
2946
+ }
2947
+ const tableNames = await listTablesLike(db, "ec_%");
2948
+ for (const tableName of tableNames) {
2949
+ validateIdentifier(tableName, "content table name");
2950
+ const slug = tableName.slice(3);
2951
+ await sql`
2952
+ UPDATE content_taxonomies
2953
+ SET (status, scheduled_at, deleted_at, locale, published_at, created_at) = (
2954
+ SELECT status, scheduled_at, deleted_at, locale, published_at, created_at
2955
+ FROM ${sql.ref(tableName)}
2956
+ WHERE ${sql.ref(tableName)}.id = content_taxonomies.entry_id
2957
+ )
2958
+ WHERE collection = ${slug}
2959
+ `.execute(db);
2960
+ }
2961
+ for (const index of INDEXES) await sql`
2962
+ CREATE INDEX IF NOT EXISTS ${sql.ref(index.name)}
2963
+ ON content_taxonomies (${sql.raw(index.columns)})
2964
+ `.execute(db);
2965
+ }
2966
+ async function down$2(db) {
2967
+ for (const index of INDEXES) await sql`DROP INDEX IF EXISTS ${sql.ref(index.name)}`.execute(db);
2968
+ for (const column of DENORM_COLUMNS) await sql`
2969
+ ALTER TABLE content_taxonomies DROP COLUMN ${sql.ref(column)}
2970
+ `.execute(db);
2971
+ }
2972
+
2973
+ //#endregion
2974
+ //#region src/database/migrations/052_media_usage_read_index.ts
2975
+ var _052_media_usage_read_index_exports = /* @__PURE__ */ __exportAll({
2976
+ down: () => down$1,
2977
+ up: () => up$1
2978
+ });
2979
+ const OLD_INDEX = "idx__emdash_media_usage_media_id";
2980
+ const READ_INDEX = "idx__emdash_media_usage_media_source_generation";
2981
+ async function up$1(db) {
2982
+ await db.schema.createIndex(READ_INDEX).ifNotExists().on("_emdash_media_usage").columns([
2983
+ "media_id",
2984
+ "source_key",
2985
+ "generation"
2986
+ ]).execute();
2987
+ await db.schema.dropIndex(OLD_INDEX).ifExists().execute();
2988
+ }
2989
+ async function down$1(db) {
2990
+ await db.schema.createIndex(OLD_INDEX).ifNotExists().on("_emdash_media_usage").column("media_id").execute();
2991
+ await db.schema.dropIndex(READ_INDEX).ifExists().execute();
2992
+ }
2993
+
2994
+ //#endregion
2995
+ //#region src/database/migrations/053_plugin_mcp_tools.ts
2996
+ var _053_plugin_mcp_tools_exports = /* @__PURE__ */ __exportAll({
2997
+ down: () => down,
2998
+ up: () => up
2999
+ });
3000
+ /** Persist explicit per-plugin MCP enablement and the declaration consented to by an admin. */
3001
+ async function up(db) {
3002
+ 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
+ if (!await columnExists(db, "_plugin_state", "mcp_tools_consent")) await db.schema.alterTable("_plugin_state").addColumn("mcp_tools_consent", "text").execute();
3004
+ }
3005
+ async function down(db) {
3006
+ await db.schema.alterTable("_plugin_state").dropColumn("mcp_tools_consent").execute();
3007
+ await db.schema.alterTable("_plugin_state").dropColumn("mcp_tools_enabled").execute();
3008
+ }
3009
+
2879
3010
  //#endregion
2880
3011
  //#region src/database/migrations/runner.ts
2881
3012
  const MIGRATIONS = Object.freeze({
@@ -2927,7 +3058,10 @@ const MIGRATIONS = Object.freeze({
2927
3058
  "047_restore_taxonomy_parent_index": _047_restore_taxonomy_parent_index_exports,
2928
3059
  "048_restore_content_taxonomies_term_index": _048_restore_content_taxonomies_term_index_exports,
2929
3060
  "049_taxonomies_name_locale_index": _049_taxonomies_name_locale_index_exports,
2930
- "050_media_usage_index_status": _050_media_usage_index_status_exports
3061
+ "050_media_usage_index_status": _050_media_usage_index_status_exports,
3062
+ "051_content_taxonomies_denorm": _051_content_taxonomies_denorm_exports,
3063
+ "052_media_usage_read_index": _052_media_usage_read_index_exports,
3064
+ "053_plugin_mcp_tools": _053_plugin_mcp_tools_exports
2931
3065
  });
2932
3066
  /** Total number of registered migrations. Exported for use in tests. */
2933
3067
  const MIGRATION_COUNT = Object.keys(MIGRATIONS).length;
@@ -3141,4 +3275,4 @@ async function rollbackMigration(db, options) {
3141
3275
 
3142
3276
  //#endregion
3143
3277
  export { runMigrations as a, rollbackMigration as i, MIGRATION_RACE_WAIT_MS as n, __exportAll as o, getMigrationStatus as r, ConcurrentMigrationTimeoutError as t };
3144
- //# sourceMappingURL=runner-jt65bF7F.mjs.map
3278
+ //# sourceMappingURL=runner-DfnZ5eUr.mjs.map