emdash 0.28.1 → 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 (946) hide show
  1. package/dist/{adapters-hUy8vOB-.d.mts → adapters-C0ONzkUP.d.mts} +10 -1
  2. package/dist/adapters-C0ONzkUP.d.mts.map +1 -0
  3. package/dist/{allowed-origins-CRsJ6BPM.mjs → allowed-origins-CCEi9bPI.mjs} +2 -2
  4. package/dist/{allowed-origins-CRsJ6BPM.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 +22 -21
  8. package/dist/api/route-utils.mjs.map +1 -1
  9. package/dist/api/schemas/index.d.mts +2 -2
  10. package/dist/api/schemas/index.mjs +5 -4
  11. package/dist/{api-DxFSorgk.mjs → api-b8WIiGU4.mjs} +306 -154
  12. package/dist/api-b8WIiGU4.mjs.map +1 -0
  13. package/dist/api-tokens-Cvmixds7.mjs +3 -0
  14. package/dist/{api-tokens-DvqeZmVq.mjs → api-tokens-uPt8UDpx.mjs} +2 -2
  15. package/dist/{api-tokens-DvqeZmVq.mjs.map → api-tokens-uPt8UDpx.mjs.map} +1 -1
  16. package/dist/{apply-CDJqIjPU.mjs → apply-CmIJK9j8.mjs} +35 -38
  17. package/dist/apply-CmIJK9j8.mjs.map +1 -0
  18. package/dist/astro/index.d.mts +12 -12
  19. package/dist/astro/index.d.mts.map +1 -1
  20. package/dist/astro/index.mjs +97 -13
  21. package/dist/astro/index.mjs.map +1 -1
  22. package/dist/astro/middleware/auth.d.mts +10 -10
  23. package/dist/astro/middleware/auth.d.mts.map +1 -1
  24. package/dist/astro/middleware/auth.mjs +56 -107
  25. package/dist/astro/middleware/auth.mjs.map +1 -1
  26. package/dist/astro/middleware/redirect.mjs +7 -7
  27. package/dist/astro/middleware/request-context.d.mts +3 -0
  28. package/dist/astro/middleware/request-context.d.mts.map +1 -1
  29. package/dist/astro/middleware/request-context.mjs +258 -31
  30. package/dist/astro/middleware/request-context.mjs.map +1 -1
  31. package/dist/astro/middleware/setup.mjs +1 -1
  32. package/dist/astro/middleware.d.mts +47 -3
  33. package/dist/astro/middleware.d.mts.map +1 -1
  34. package/dist/astro/middleware.mjs +379 -117
  35. package/dist/astro/middleware.mjs.map +1 -1
  36. package/dist/astro/routes/PluginRegistry.d.mts +5 -1
  37. package/dist/astro/routes/PluginRegistry.d.mts.map +1 -1
  38. package/dist/astro/routes/PluginRegistry.mjs +2 -1
  39. package/dist/astro/routes/PluginRegistry.mjs.map +1 -1
  40. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +9 -8
  41. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs.map +1 -1
  42. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +9 -8
  43. package/dist/astro/routes/api/admin/allowed-domains/index.mjs.map +1 -1
  44. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +5 -5
  45. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  46. package/dist/astro/routes/api/admin/api-tokens/index.mjs.map +1 -1
  47. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +6 -6
  48. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +11 -10
  49. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs.map +1 -1
  50. package/dist/astro/routes/api/admin/byline-fields/index.mjs +11 -10
  51. package/dist/astro/routes/api/admin/byline-fields/index.mjs.map +1 -1
  52. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +11 -10
  53. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs.map +1 -1
  54. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +18 -17
  55. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  56. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +19 -24
  57. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -1
  58. package/dist/astro/routes/api/admin/bylines/index.mjs +18 -17
  59. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  60. package/dist/astro/routes/api/admin/comments/_id_/status.d.mts.map +1 -1
  61. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +14 -13
  62. package/dist/astro/routes/api/admin/comments/_id_/status.mjs.map +1 -1
  63. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
  64. package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -10
  65. package/dist/astro/routes/api/admin/comments/bulk.mjs.map +1 -1
  66. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
  67. package/dist/astro/routes/api/admin/comments/index.d.mts.map +1 -1
  68. package/dist/astro/routes/api/admin/comments/index.mjs +11 -10
  69. package/dist/astro/routes/api/admin/comments/index.mjs.map +1 -1
  70. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
  71. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
  72. package/dist/astro/routes/api/admin/media-usage/repair.d.mts +8 -0
  73. package/dist/astro/routes/api/admin/media-usage/repair.d.mts.map +1 -0
  74. package/dist/astro/routes/api/admin/media-usage/repair.mjs +30 -0
  75. package/dist/astro/routes/api/admin/media-usage/repair.mjs.map +1 -0
  76. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +5 -5
  77. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +5 -5
  78. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +44 -41
  79. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  80. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +44 -41
  81. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  82. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +49 -41
  83. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  84. package/dist/astro/routes/api/admin/plugins/_id_/mcp.d.mts +8 -0
  85. package/dist/astro/routes/api/admin/plugins/_id_/mcp.d.mts.map +1 -0
  86. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +39 -0
  87. package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs.map +1 -0
  88. package/dist/astro/routes/api/admin/plugins/_id_/settings.d.mts +9 -0
  89. package/dist/astro/routes/api/admin/plugins/_id_/settings.d.mts.map +1 -0
  90. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +78 -0
  91. package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -0
  92. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +43 -40
  93. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  94. package/dist/astro/routes/api/admin/plugins/_id_/update.d.mts.map +1 -1
  95. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +46 -41
  96. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  97. package/dist/astro/routes/api/admin/plugins/index.mjs +49 -41
  98. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  99. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +4 -4
  100. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +43 -40
  101. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  102. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.d.mts.map +1 -1
  103. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +49 -42
  104. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  105. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +43 -40
  106. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  107. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +43 -40
  108. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
  109. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -1
  110. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +47 -42
  111. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
  112. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +43 -40
  113. package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs.map +1 -1
  114. package/dist/astro/routes/api/admin/plugins/registry/install.d.mts.map +1 -1
  115. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +48 -43
  116. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  117. package/dist/astro/routes/api/admin/plugins/updates.mjs +44 -41
  118. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  119. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +43 -40
  120. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  121. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +4 -4
  122. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +43 -40
  123. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  124. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
  125. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
  126. package/dist/astro/routes/api/admin/users/_id_/index.mjs +10 -9
  127. package/dist/astro/routes/api/admin/users/_id_/index.mjs.map +1 -1
  128. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
  129. package/dist/astro/routes/api/admin/users/index.mjs +9 -8
  130. package/dist/astro/routes/api/admin/users/index.mjs.map +1 -1
  131. package/dist/astro/routes/api/auth/dev-bypass.mjs +7 -7
  132. package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
  133. package/dist/astro/routes/api/auth/invite/complete.mjs +14 -13
  134. package/dist/astro/routes/api/auth/invite/complete.mjs.map +1 -1
  135. package/dist/astro/routes/api/auth/invite/index.mjs +11 -10
  136. package/dist/astro/routes/api/auth/invite/index.mjs.map +1 -1
  137. package/dist/astro/routes/api/auth/invite/register-options.mjs +13 -12
  138. package/dist/astro/routes/api/auth/invite/register-options.mjs.map +1 -1
  139. package/dist/astro/routes/api/auth/logout.mjs +4 -4
  140. package/dist/astro/routes/api/auth/magic-link/send.mjs +13 -12
  141. package/dist/astro/routes/api/auth/magic-link/send.mjs.map +1 -1
  142. package/dist/astro/routes/api/auth/magic-link/verify.mjs +5 -5
  143. package/dist/astro/routes/api/auth/me.mjs +9 -8
  144. package/dist/astro/routes/api/auth/me.mjs.map +1 -1
  145. package/dist/astro/routes/api/auth/mode.d.mts.map +1 -1
  146. package/dist/astro/routes/api/auth/mode.mjs +6 -3
  147. package/dist/astro/routes/api/auth/mode.mjs.map +1 -1
  148. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +16 -6
  149. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
  150. package/dist/astro/routes/api/auth/oauth/_provider_.d.mts.map +1 -1
  151. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +11 -5
  152. package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -1
  153. package/dist/astro/routes/api/auth/passkey/_id_.mjs +8 -7
  154. package/dist/astro/routes/api/auth/passkey/_id_.mjs.map +1 -1
  155. package/dist/astro/routes/api/auth/passkey/index.mjs +3 -3
  156. package/dist/astro/routes/api/auth/passkey/options.mjs +14 -13
  157. package/dist/astro/routes/api/auth/passkey/options.mjs.map +1 -1
  158. package/dist/astro/routes/api/auth/passkey/register/options.mjs +12 -11
  159. package/dist/astro/routes/api/auth/passkey/register/options.mjs.map +1 -1
  160. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +13 -12
  161. package/dist/astro/routes/api/auth/passkey/register/verify.mjs.map +1 -1
  162. package/dist/astro/routes/api/auth/passkey/verify.mjs +13 -12
  163. package/dist/astro/routes/api/auth/passkey/verify.mjs.map +1 -1
  164. package/dist/astro/routes/api/auth/signup/complete.mjs +14 -13
  165. package/dist/astro/routes/api/auth/signup/complete.mjs.map +1 -1
  166. package/dist/astro/routes/api/auth/signup/request.mjs +13 -12
  167. package/dist/astro/routes/api/auth/signup/request.mjs.map +1 -1
  168. package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
  169. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts.map +1 -1
  170. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +70 -14
  171. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs.map +1 -1
  172. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +14 -13
  173. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs.map +1 -1
  174. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
  175. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs.map +1 -1
  176. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +5 -4
  177. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
  178. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -5
  179. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
  180. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
  181. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs.map +1 -1
  182. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +14 -13
  183. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs.map +1 -1
  184. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +10 -8
  185. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  186. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +9 -0
  187. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -0
  188. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +72 -0
  189. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -0
  190. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.d.mts +8 -0
  191. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.d.mts.map +1 -0
  192. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +51 -0
  193. package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -0
  194. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -4
  195. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
  196. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
  197. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs.map +1 -1
  198. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +10 -8
  199. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
  200. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.d.mts.map +1 -1
  201. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +20 -19
  202. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  203. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
  204. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
  205. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +5 -4
  206. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
  207. package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
  208. package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -9
  209. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  210. package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
  211. package/dist/astro/routes/api/content/_collection_/authors.mjs.map +1 -1
  212. package/dist/astro/routes/api/content/_collection_/index.d.mts.map +1 -1
  213. package/dist/astro/routes/api/content/_collection_/index.mjs +12 -10
  214. package/dist/astro/routes/api/content/_collection_/index.mjs.map +1 -1
  215. package/dist/astro/routes/api/content/_collection_/trash.mjs +10 -9
  216. package/dist/astro/routes/api/content/_collection_/trash.mjs.map +1 -1
  217. package/dist/astro/routes/api/dashboard.mjs +8 -8
  218. package/dist/astro/routes/api/dev/emails.mjs +4 -4
  219. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  220. package/dist/astro/routes/api/import/probe.mjs +19 -18
  221. package/dist/astro/routes/api/import/probe.mjs.map +1 -1
  222. package/dist/astro/routes/api/import/wordpress/analyze.mjs +5 -5
  223. package/dist/astro/routes/api/import/wordpress/execute.d.mts +11 -11
  224. package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -16
  225. package/dist/astro/routes/api/import/wordpress/media.d.mts +10 -10
  226. package/dist/astro/routes/api/import/wordpress/media.mjs +12 -11
  227. package/dist/astro/routes/api/import/wordpress/media.mjs.map +1 -1
  228. package/dist/astro/routes/api/import/wordpress/prepare.mjs +12 -11
  229. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  230. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +11 -16
  231. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts.map +1 -1
  232. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +12 -11
  233. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  234. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  235. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +19 -18
  236. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs.map +1 -1
  237. package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
  238. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +11 -11
  239. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +29 -28
  240. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  241. package/dist/astro/routes/api/manifest.mjs +8 -9
  242. package/dist/astro/routes/api/manifest.mjs.map +1 -1
  243. package/dist/astro/routes/api/mcp.d.mts.map +1 -1
  244. package/dist/astro/routes/api/mcp.mjs +165 -52
  245. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  246. package/dist/astro/routes/api/media/_id_/confirm.mjs +10 -9
  247. package/dist/astro/routes/api/media/_id_/confirm.mjs.map +1 -1
  248. package/dist/astro/routes/api/media/_id_/usage.d.mts +8 -0
  249. package/dist/astro/routes/api/media/_id_/usage.d.mts.map +1 -0
  250. package/dist/astro/routes/api/media/_id_/usage.mjs +37 -0
  251. package/dist/astro/routes/api/media/_id_/usage.mjs.map +1 -0
  252. package/dist/astro/routes/api/media/_id_.d.mts.map +1 -1
  253. package/dist/astro/routes/api/media/_id_.mjs +26 -10
  254. package/dist/astro/routes/api/media/_id_.mjs.map +1 -1
  255. package/dist/astro/routes/api/media/file/_...key_.mjs +4 -3
  256. package/dist/astro/routes/api/media/file/_...key_.mjs.map +1 -1
  257. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +4 -4
  258. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +4 -4
  259. package/dist/astro/routes/api/media/providers/index.mjs +4 -4
  260. package/dist/astro/routes/api/media/upload-url.mjs +11 -10
  261. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  262. package/dist/astro/routes/api/media.d.mts.map +1 -1
  263. package/dist/astro/routes/api/media.mjs +34 -14
  264. package/dist/astro/routes/api/media.mjs.map +1 -1
  265. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +10 -9
  266. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs.map +1 -1
  267. package/dist/astro/routes/api/menus/_name_/items.mjs +10 -9
  268. package/dist/astro/routes/api/menus/_name_/items.mjs.map +1 -1
  269. package/dist/astro/routes/api/menus/_name_/reorder.mjs +10 -9
  270. package/dist/astro/routes/api/menus/_name_/reorder.mjs.map +1 -1
  271. package/dist/astro/routes/api/menus/_name_/translations.mjs +10 -9
  272. package/dist/astro/routes/api/menus/_name_/translations.mjs.map +1 -1
  273. package/dist/astro/routes/api/menus/_name_.mjs +10 -9
  274. package/dist/astro/routes/api/menus/_name_.mjs.map +1 -1
  275. package/dist/astro/routes/api/menus/index.mjs +10 -9
  276. package/dist/astro/routes/api/menus/index.mjs.map +1 -1
  277. package/dist/astro/routes/api/oauth/authorize.d.mts.map +1 -1
  278. package/dist/astro/routes/api/oauth/authorize.mjs +7 -8
  279. package/dist/astro/routes/api/oauth/authorize.mjs.map +1 -1
  280. package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -7
  281. package/dist/astro/routes/api/oauth/device/code.mjs +10 -10
  282. package/dist/astro/routes/api/oauth/device/token.mjs +9 -9
  283. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  284. package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -7
  285. package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -7
  286. package/dist/astro/routes/api/oauth/token.mjs +7 -7
  287. package/dist/astro/routes/api/openapi.json.mjs +71 -24
  288. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  289. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.d.mts.map +1 -1
  290. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +20 -32
  291. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs.map +1 -1
  292. package/dist/astro/routes/api/redirects/404s/index.mjs +13 -12
  293. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
  294. package/dist/astro/routes/api/redirects/404s/summary.mjs +13 -12
  295. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
  296. package/dist/astro/routes/api/redirects/_id_.mjs +14 -13
  297. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  298. package/dist/astro/routes/api/redirects/index.mjs +14 -13
  299. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  300. package/dist/astro/routes/api/relations/_id_/index.d.mts +10 -0
  301. package/dist/astro/routes/api/relations/_id_/index.d.mts.map +1 -0
  302. package/dist/astro/routes/api/relations/_id_/index.mjs +70 -0
  303. package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -0
  304. package/dist/astro/routes/api/relations/_id_/translations.d.mts +8 -0
  305. package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +1 -0
  306. package/dist/astro/routes/api/relations/_id_/translations.mjs +34 -0
  307. package/dist/astro/routes/api/relations/_id_/translations.mjs.map +1 -0
  308. package/dist/astro/routes/api/relations/index.d.mts +9 -0
  309. package/dist/astro/routes/api/relations/index.d.mts.map +1 -0
  310. package/dist/astro/routes/api/relations/index.mjs +54 -0
  311. package/dist/astro/routes/api/relations/index.mjs.map +1 -0
  312. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +4 -4
  313. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -4
  314. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs.map +1 -1
  315. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.d.mts.map +1 -1
  316. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +43 -40
  317. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  318. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.d.mts.map +1 -1
  319. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +43 -40
  320. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  321. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +43 -40
  322. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  323. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +43 -40
  324. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  325. package/dist/astro/routes/api/schema/collections/index.mjs +43 -40
  326. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  327. package/dist/astro/routes/api/schema/index.mjs +9 -9
  328. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +43 -40
  329. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  330. package/dist/astro/routes/api/schema/orphans/index.mjs +43 -40
  331. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  332. package/dist/astro/routes/api/search/enable.mjs +13 -12
  333. package/dist/astro/routes/api/search/enable.mjs.map +1 -1
  334. package/dist/astro/routes/api/search/index.mjs +14 -12
  335. package/dist/astro/routes/api/search/index.mjs.map +1 -1
  336. package/dist/astro/routes/api/search/rebuild.mjs +13 -12
  337. package/dist/astro/routes/api/search/rebuild.mjs.map +1 -1
  338. package/dist/astro/routes/api/search/stats.mjs +8 -8
  339. package/dist/astro/routes/api/search/suggest.mjs +12 -11
  340. package/dist/astro/routes/api/search/suggest.mjs.map +1 -1
  341. package/dist/astro/routes/api/sections/_slug_.mjs +12 -11
  342. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  343. package/dist/astro/routes/api/sections/index.mjs +12 -11
  344. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  345. package/dist/astro/routes/api/settings/backups/archives/_name_.d.mts +9 -0
  346. package/dist/astro/routes/api/settings/backups/archives/_name_.d.mts.map +1 -0
  347. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +48 -0
  348. package/dist/astro/routes/api/settings/backups/archives/_name_.mjs.map +1 -0
  349. package/dist/astro/routes/api/settings/backups/archives/index.d.mts +8 -0
  350. package/dist/astro/routes/api/settings/backups/archives/index.d.mts.map +1 -0
  351. package/dist/astro/routes/api/settings/backups/archives/index.mjs +23 -0
  352. package/dist/astro/routes/api/settings/backups/archives/index.mjs.map +1 -0
  353. package/dist/astro/routes/api/settings/backups/export.d.mts +8 -0
  354. package/dist/astro/routes/api/settings/backups/export.d.mts.map +1 -0
  355. package/dist/astro/routes/api/settings/backups/export.mjs +35 -0
  356. package/dist/astro/routes/api/settings/backups/export.mjs.map +1 -0
  357. package/dist/astro/routes/api/settings/backups/index.d.mts +9 -0
  358. package/dist/astro/routes/api/settings/backups/index.d.mts.map +1 -0
  359. package/dist/astro/routes/api/settings/backups/index.mjs +52 -0
  360. package/dist/astro/routes/api/settings/backups/index.mjs.map +1 -0
  361. package/dist/astro/routes/api/settings/email.mjs +6 -6
  362. package/dist/astro/routes/api/settings.mjs +16 -15
  363. package/dist/astro/routes/api/settings.mjs.map +1 -1
  364. package/dist/astro/routes/api/setup/admin-verify.mjs +20 -16
  365. package/dist/astro/routes/api/setup/admin-verify.mjs.map +1 -1
  366. package/dist/astro/routes/api/setup/admin.mjs +19 -15
  367. package/dist/astro/routes/api/setup/admin.mjs.map +1 -1
  368. package/dist/astro/routes/api/setup/dev-bypass.mjs +29 -29
  369. package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
  370. package/dist/astro/routes/api/setup/index.mjs +31 -30
  371. package/dist/astro/routes/api/setup/index.mjs.map +1 -1
  372. package/dist/astro/routes/api/setup/status.mjs +5 -5
  373. package/dist/astro/routes/api/snapshot.mjs +9 -216
  374. package/dist/astro/routes/api/snapshot.mjs.map +1 -1
  375. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +16 -15
  376. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  377. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +16 -15
  378. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  379. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +16 -15
  380. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  381. package/dist/astro/routes/api/taxonomies/index.mjs +16 -15
  382. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  383. package/dist/astro/routes/api/themes/preview.mjs +7 -7
  384. package/dist/astro/routes/api/typegen.mjs +6 -6
  385. package/dist/astro/routes/api/well-known/auth.mjs +2 -2
  386. package/dist/astro/routes/api/well-known/oauth-authorization-server.d.mts.map +1 -1
  387. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +4 -3
  388. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs.map +1 -1
  389. package/dist/astro/routes/api/well-known/oauth-protected-resource.d.mts.map +1 -1
  390. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +4 -3
  391. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs.map +1 -1
  392. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +9 -8
  393. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs.map +1 -1
  394. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +13 -12
  395. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs.map +1 -1
  396. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +13 -12
  397. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs.map +1 -1
  398. package/dist/astro/routes/api/widget-areas/_name_.mjs +8 -8
  399. package/dist/astro/routes/api/widget-areas/index.mjs +13 -12
  400. package/dist/astro/routes/api/widget-areas/index.mjs.map +1 -1
  401. package/dist/astro/routes/api/widget-components.mjs +4 -4
  402. package/dist/astro/routes/robots.txt.mjs +9 -9
  403. package/dist/astro/routes/sitemap-_collection_.xml.mjs +12 -12
  404. package/dist/astro/routes/sitemap.xml.mjs +10 -10
  405. package/dist/astro/types.d.mts +40 -16
  406. package/dist/astro/types.d.mts.map +1 -1
  407. package/dist/auth/providers/github.d.mts +1 -1
  408. package/dist/auth/providers/google.d.mts +1 -1
  409. package/dist/{authorize-Dz88F_Fw.mjs → authorize-WxsiePzy.mjs} +7 -4
  410. package/dist/authorize-WxsiePzy.mjs.map +1 -0
  411. package/dist/backup-S8kFWtwD.mjs +241 -0
  412. package/dist/backup-S8kFWtwD.mjs.map +1 -0
  413. package/dist/{base64-CmWvODNW.mjs → base64-B-PsqheR.mjs} +8 -4
  414. package/dist/base64-B-PsqheR.mjs.map +1 -0
  415. package/dist/{byline-Bm8ZgUP9.mjs → byline-XEjchwzZ.mjs} +8 -8
  416. package/dist/{byline-Bm8ZgUP9.mjs.map → byline-XEjchwzZ.mjs.map} +1 -1
  417. package/dist/{byline-fields-CIx_GuN4.mjs → byline-fields-CdU_LTF1.mjs} +2 -2
  418. package/dist/{byline-fields-CIx_GuN4.mjs.map → byline-fields-CdU_LTF1.mjs.map} +1 -1
  419. package/dist/{byline-registry-BOjqDOim.mjs → byline-registry-BCuOp4UF.mjs} +3 -3
  420. package/dist/{byline-registry-BOjqDOim.mjs.map → byline-registry-BCuOp4UF.mjs.map} +1 -1
  421. package/dist/{bylines-6tm9mgQb.mjs → bylines-BJbT4gKS.mjs} +4 -4
  422. package/dist/{bylines-6tm9mgQb.mjs.map → bylines-BJbT4gKS.mjs.map} +1 -1
  423. package/dist/{bylines-CAZxGSrm.mjs → bylines-czseViYo.mjs} +8 -8
  424. package/dist/{bylines-CAZxGSrm.mjs.map → bylines-czseViYo.mjs.map} +1 -1
  425. package/dist/{cache-CEBAZjir.mjs → cache-CGCd6AVM.mjs} +3 -3
  426. package/dist/{cache-CEBAZjir.mjs.map → cache-CGCd6AVM.mjs.map} +1 -1
  427. package/dist/{challenge-store-anhwVER0.mjs → challenge-store-BFzgFRog.mjs} +1 -1
  428. package/dist/{challenge-store-anhwVER0.mjs.map → challenge-store-BFzgFRog.mjs.map} +1 -1
  429. package/dist/{chunks-B2isWQhr.mjs → chunks-BxXyunY-.mjs} +2 -2
  430. package/dist/{chunks-B2isWQhr.mjs.map → chunks-BxXyunY-.mjs.map} +1 -1
  431. package/dist/cli/index.mjs +142 -35
  432. package/dist/cli/index.mjs.map +1 -1
  433. package/dist/client/cf-access.d.mts +1 -1
  434. package/dist/client/index.d.mts +86 -3
  435. package/dist/client/index.d.mts.map +1 -1
  436. package/dist/client/index.mjs +20 -4
  437. package/dist/client/index.mjs.map +1 -1
  438. package/dist/{comment-CzeatwBV.mjs → comment-DPT0WKyd.mjs} +2 -2
  439. package/dist/{comment-CzeatwBV.mjs.map → comment-DPT0WKyd.mjs.map} +1 -1
  440. package/dist/{comment-reaction-Cj9QJY7I.mjs → comment-reaction-C65MldIB.mjs} +2 -2
  441. package/dist/{comment-reaction-Cj9QJY7I.mjs.map → comment-reaction-C65MldIB.mjs.map} +1 -1
  442. package/dist/{comments-BLE-jv5k.mjs → comments-Bz6sCbgD.mjs} +3 -3
  443. package/dist/{comments-BLE-jv5k.mjs.map → comments-Bz6sCbgD.mjs.map} +1 -1
  444. package/dist/{components-B_sATNUc.mjs → components-DZkL4Fx0.mjs} +1 -1
  445. package/dist/{components-B_sATNUc.mjs.map → components-DZkL4Fx0.mjs.map} +1 -1
  446. package/dist/{content-DhgEth4k.mjs → content-Ci04z2z-.mjs} +227 -34
  447. package/dist/content-Ci04z2z-.mjs.map +1 -0
  448. package/dist/{content-refresh-Br4gMzh8.mjs → content-refresh-D4khvC0R.mjs} +100 -8
  449. package/dist/content-refresh-D4khvC0R.mjs.map +1 -0
  450. package/dist/{context-BRIpHARC.mjs → context-B6hc7zJL.mjs} +156 -76
  451. package/dist/context-B6hc7zJL.mjs.map +1 -0
  452. package/dist/{cron-v4FTEFR_.mjs → cron-BlKIMD_e.mjs} +1 -1
  453. package/dist/{cron-v4FTEFR_.mjs.map → cron-BlKIMD_e.mjs.map} +1 -1
  454. package/dist/{dashboard-EvEKF5en.mjs → dashboard-C5NkXFbi.mjs} +6 -5
  455. package/dist/dashboard-C5NkXFbi.mjs.map +1 -0
  456. package/dist/database/pg-migration-lock.d.mts +21 -0
  457. package/dist/database/pg-migration-lock.d.mts.map +1 -0
  458. package/dist/database/pg-migration-lock.mjs +45 -0
  459. package/dist/database/pg-migration-lock.mjs.map +1 -0
  460. package/dist/db/index.d.mts +3 -3
  461. package/dist/db/index.mjs +2 -2
  462. package/dist/db/index.mjs.map +1 -1
  463. package/dist/db/libsql.d.mts +1 -1
  464. package/dist/db/postgres.d.mts +1 -1
  465. package/dist/db/postgres.d.mts.map +1 -1
  466. package/dist/db/postgres.mjs +2 -8
  467. package/dist/db/postgres.mjs.map +1 -1
  468. package/dist/db/sqlite.d.mts +1 -1
  469. package/dist/{db-errors-CK46D-ly.mjs → db-errors-CcWLaRiR.mjs} +4 -2
  470. package/dist/db-errors-CcWLaRiR.mjs.map +1 -0
  471. package/dist/{default-CM_D83Mg.mjs → default-C4v9KP56.mjs} +1 -1
  472. package/dist/{default-CM_D83Mg.mjs.map → default-C4v9KP56.mjs.map} +1 -1
  473. package/dist/{device-flow-CfGP18Uw.mjs → device-flow-BeA6lUS1.mjs} +6 -7
  474. package/dist/device-flow-BeA6lUS1.mjs.map +1 -0
  475. package/dist/dialect-helpers-HxEQGl_1.mjs +175 -0
  476. package/dist/dialect-helpers-HxEQGl_1.mjs.map +1 -0
  477. package/dist/{email-console-CIf4Lfvv.mjs → email-console-C-9Ng8DM.mjs} +1 -1
  478. package/dist/{email-console-CIf4Lfvv.mjs.map → email-console-C-9Ng8DM.mjs.map} +1 -1
  479. package/dist/{enrich-BQ0mxJRs.mjs → enrich-CFJJgxs_.mjs} +2 -2
  480. package/dist/{enrich-BQ0mxJRs.mjs.map → enrich-CFJJgxs_.mjs.map} +1 -1
  481. package/dist/error-CEGF6UZb.mjs +90 -0
  482. package/dist/error-CEGF6UZb.mjs.map +1 -0
  483. package/dist/{error-CkAseSqZ.mjs → errors-DtEXIQQV.mjs} +24 -84
  484. package/dist/errors-DtEXIQQV.mjs.map +1 -0
  485. package/dist/{escape-DqD0aCKu.mjs → escape-CFedIB1C.mjs} +1 -1
  486. package/dist/{escape-DqD0aCKu.mjs.map → escape-CFedIB1C.mjs.map} +1 -1
  487. package/dist/{field-defs-cache-WUI88LX5.mjs → field-defs-cache-DvmlgP-D.mjs} +5 -5
  488. package/dist/{field-defs-cache-WUI88LX5.mjs.map → field-defs-cache-DvmlgP-D.mjs.map} +1 -1
  489. package/dist/{fts-manager-BbFaF_V8.mjs → fts-manager-DzqIBrrW.mjs} +27 -3
  490. package/dist/{fts-manager-BbFaF_V8.mjs.map → fts-manager-DzqIBrrW.mjs.map} +1 -1
  491. package/dist/{hash-DrvzIXcz.mjs → hash-DFFrkivP.mjs} +1 -1
  492. package/dist/{hash-DrvzIXcz.mjs.map → hash-DFFrkivP.mjs.map} +1 -1
  493. package/dist/hreflang-CIxH_LKz.d.mts +48 -0
  494. package/dist/hreflang-CIxH_LKz.d.mts.map +1 -0
  495. package/dist/hreflang-db2Tpb2o.mjs +102 -0
  496. package/dist/hreflang-db2Tpb2o.mjs.map +1 -0
  497. package/dist/{import-fYLf14Co.mjs → import-Dmkm8S1W.mjs} +6 -6
  498. package/dist/{import-fYLf14Co.mjs.map → import-Dmkm8S1W.mjs.map} +1 -1
  499. package/dist/{index-Bm-Gy8Mh.d.mts → index-BEui-cRd.d.mts} +3 -3
  500. package/dist/{index-Bm-Gy8Mh.d.mts.map → index-BEui-cRd.d.mts.map} +1 -1
  501. package/dist/{index-B9sIxwe4.d.mts → index-wYnC6u4o.d.mts} +881 -22
  502. package/dist/index-wYnC6u4o.d.mts.map +1 -0
  503. package/dist/index.d.mts +19 -19
  504. package/dist/index.mjs +69 -64
  505. package/dist/{init-lock-6b309ZrF.mjs → init-lock-DJkX6Hto.mjs} +1 -1
  506. package/dist/{init-lock-6b309ZrF.mjs.map → init-lock-DJkX6Hto.mjs.map} +1 -1
  507. package/dist/{load-Djn3HWQS.mjs → load-Cx27ki1l.mjs} +2 -2
  508. package/dist/{load-Djn3HWQS.mjs.map → load-Cx27ki1l.mjs.map} +1 -1
  509. package/dist/{loader-CB6YHeul.mjs → loader-Be3ouI5L.mjs} +170 -21
  510. package/dist/loader-Be3ouI5L.mjs.map +1 -0
  511. package/dist/{manifest-schema-BHlgZM1W.mjs → manifest-schema-bCq54i7F.mjs} +18 -2
  512. package/dist/manifest-schema-bCq54i7F.mjs.map +1 -0
  513. package/dist/media/image-endpoint.d.mts +30 -2
  514. package/dist/media/image-endpoint.d.mts.map +1 -1
  515. package/dist/media/image-endpoint.mjs +30 -4
  516. package/dist/media/image-endpoint.mjs.map +1 -1
  517. package/dist/media/index.d.mts +1 -1
  518. package/dist/media/index.mjs +2 -2
  519. package/dist/media/local-runtime.d.mts +12 -12
  520. package/dist/media/local-runtime.mjs +8 -8
  521. package/dist/{media-BrXIaMFN.mjs → media-BjhhENaJ.mjs} +2 -2
  522. package/dist/media-BjhhENaJ.mjs.map +1 -0
  523. package/dist/{media-allowlist-CRHEeJ_i.mjs → media-allowlist-jUppPWFy.mjs} +2 -2
  524. package/dist/{media-allowlist-CRHEeJ_i.mjs.map → media-allowlist-jUppPWFy.mjs.map} +1 -1
  525. package/dist/media-kIV1IxFf.mjs +243 -0
  526. package/dist/media-kIV1IxFf.mjs.map +1 -0
  527. package/dist/media-upload-D2wk3EIt.mjs +145 -0
  528. package/dist/media-upload-D2wk3EIt.mjs.map +1 -0
  529. package/dist/{media-url-CKi5XSw4.mjs → media-url-BCm5vBn6.mjs} +1 -1
  530. package/dist/{media-url-CKi5XSw4.mjs.map → media-url-BCm5vBn6.mjs.map} +1 -1
  531. package/dist/media-usage-CljdO1mc.mjs +554 -0
  532. package/dist/media-usage-CljdO1mc.mjs.map +1 -0
  533. package/dist/{menus-b2T4clbO.mjs → menus-BcyElFtI.mjs} +177 -15
  534. package/dist/menus-BcyElFtI.mjs.map +1 -0
  535. package/dist/{menus-Cfivc2Ad.mjs → menus-CZyG6rvx.mjs} +3 -3
  536. package/dist/{menus-Cfivc2Ad.mjs.map → menus-CZyG6rvx.mjs.map} +1 -1
  537. package/dist/{mime-CCEzze7W.mjs → mime-DfIVjNkr.mjs} +1 -1
  538. package/dist/{mime-CCEzze7W.mjs.map → mime-DfIVjNkr.mjs.map} +1 -1
  539. package/dist/{mode-BM9QgEmt.mjs → mode-fiXRMfeA.mjs} +1 -1
  540. package/dist/{mode-BM9QgEmt.mjs.map → mode-fiXRMfeA.mjs.map} +1 -1
  541. package/dist/{normalize-CeglrBT9.mjs → normalize-C-SHXmra.mjs} +1 -1
  542. package/dist/{normalize-CeglrBT9.mjs.map → normalize-C-SHXmra.mjs.map} +1 -1
  543. package/dist/{oauth-authorization-CXWkIGT4.mjs → oauth-authorization-oqfbBuMH.mjs} +6 -7
  544. package/dist/oauth-authorization-oqfbBuMH.mjs.map +1 -0
  545. package/dist/{oauth-clients-BmTI5rsl.mjs → oauth-clients-BlrUHAsf.mjs} +1 -1
  546. package/dist/{oauth-clients-BmTI5rsl.mjs.map → oauth-clients-BlrUHAsf.mjs.map} +1 -1
  547. package/dist/{oauth-state-store-YLFLcH5F.mjs → oauth-state-store-DnvjRMy6.mjs} +2 -1
  548. package/dist/{oauth-state-store-YLFLcH5F.mjs.map → oauth-state-store-DnvjRMy6.mjs.map} +1 -1
  549. package/dist/{oauth-user-lookup-Bsc_GsX-.mjs → oauth-user-lookup-oUllxvAv.mjs} +1 -1
  550. package/dist/{oauth-user-lookup-Bsc_GsX-.mjs.map → oauth-user-lookup-oUllxvAv.mjs.map} +1 -1
  551. package/dist/object-cache/memory.d.mts +1 -1
  552. package/dist/{options-DTTML-Tx.mjs → options-BlmBHTvX.mjs} +1 -1
  553. package/dist/{options-DTTML-Tx.mjs.map → options-BlmBHTvX.mjs.map} +1 -1
  554. package/dist/{options-iMpRRxIe.d.mts → options-BqMkWfYa.d.mts} +6 -6
  555. package/dist/{options-iMpRRxIe.d.mts.map → options-BqMkWfYa.d.mts.map} +1 -1
  556. package/dist/page/index.d.mts +2 -2
  557. package/dist/page/index.d.mts.map +1 -1
  558. package/dist/page/index.mjs.map +1 -1
  559. package/dist/{parse-GmjecGct.mjs → parse-C_-6klII.mjs} +4 -12
  560. package/dist/{parse-GmjecGct.mjs.map → parse-C_-6klII.mjs.map} +1 -1
  561. package/dist/{passkey-config-De0ahnRg.mjs → passkey-config-C-SKpc0-.mjs} +1 -1
  562. package/dist/{passkey-config-De0ahnRg.mjs.map → passkey-config-C-SKpc0-.mjs.map} +1 -1
  563. package/dist/{patterns-BKmjvM7K.mjs → patterns-CiyXeDgr.mjs} +1 -1
  564. package/dist/{patterns-BKmjvM7K.mjs.map → patterns-CiyXeDgr.mjs.map} +1 -1
  565. package/dist/{placeholder-BSKwzRe4.d.mts → placeholder-Dop47JMM.d.mts} +1 -1
  566. package/dist/{placeholder-BSKwzRe4.d.mts.map → placeholder-Dop47JMM.d.mts.map} +1 -1
  567. package/dist/plugin-types.d.mts +21 -2
  568. package/dist/plugin-types.d.mts.map +1 -1
  569. package/dist/plugin-utils.d.mts +18 -16
  570. package/dist/plugin-utils.d.mts.map +1 -1
  571. package/dist/plugin-utils.mjs +8 -6
  572. package/dist/plugin-utils.mjs.map +1 -1
  573. package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
  574. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  575. package/dist/plugins/adapt-sandbox-entry.mjs +15 -3
  576. package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
  577. package/dist/{portable-text-cCa0cGV6.mjs → portable-text-sDj92Kxv.mjs} +1 -1
  578. package/dist/{portable-text-cCa0cGV6.mjs.map → portable-text-sDj92Kxv.mjs.map} +1 -1
  579. package/dist/{preview-SSXNVPAC.mjs → preview-D4Jnbfx7.mjs} +2 -2
  580. package/dist/{preview-SSXNVPAC.mjs.map → preview-D4Jnbfx7.mjs.map} +1 -1
  581. package/dist/{public-url-Danv47cS.mjs → public-url-DSGTnJFw.mjs} +5 -3
  582. package/dist/public-url-DSGTnJFw.mjs.map +1 -0
  583. package/dist/{query-1Cp6U9oo.mjs → query-DR73ZNfm.mjs} +15 -15
  584. package/dist/query-DR73ZNfm.mjs.map +1 -0
  585. package/dist/{schema-CX9cfNkZ.mjs → query-Di7DOmPV.mjs} +5 -10
  586. package/dist/query-Di7DOmPV.mjs.map +1 -0
  587. package/dist/{rate-limit-C_Lf63Dd.mjs → rate-limit-CMj83JNW.mjs} +2 -2
  588. package/dist/{rate-limit-C_Lf63Dd.mjs.map → rate-limit-CMj83JNW.mjs.map} +1 -1
  589. package/dist/{redirect-CoW3G-0U.mjs → redirect-Botom7X6.mjs} +1 -1
  590. package/dist/{redirect-CoW3G-0U.mjs.map → redirect-Botom7X6.mjs.map} +1 -1
  591. package/dist/{redirect-IyfNirgS.mjs → redirect-CgLPYflR.mjs} +11 -5
  592. package/dist/redirect-CgLPYflR.mjs.map +1 -0
  593. package/dist/{redirects-Bs1g42Ri.mjs → redirects-B7t9bKsL.mjs} +6 -6
  594. package/dist/{redirects-Bs1g42Ri.mjs.map → redirects-B7t9bKsL.mjs.map} +1 -1
  595. package/dist/{redirects-DXEXBAII.mjs → redirects-BBq3n2Rj.mjs} +10 -143
  596. package/dist/redirects-BBq3n2Rj.mjs.map +1 -0
  597. package/dist/{registry-B57vp_X9.mjs → registry-FV15nLge.mjs} +99 -10
  598. package/dist/registry-FV15nLge.mjs.map +1 -0
  599. package/dist/relation-9M9j_UWo.mjs +334 -0
  600. package/dist/relation-9M9j_UWo.mjs.map +1 -0
  601. package/dist/{byline-fields-2Lp5Hbgf.mjs → relations-5_avdrN_.mjs} +60 -4
  602. package/dist/relations-5_avdrN_.mjs.map +1 -0
  603. package/dist/relations-BKvO39-9.mjs +397 -0
  604. package/dist/relations-BKvO39-9.mjs.map +1 -0
  605. package/dist/{byline-fields-CHE8UStY.d.mts → relations-Bh8jlFsU.d.mts} +486 -31
  606. package/dist/relations-Bh8jlFsU.d.mts.map +1 -0
  607. package/dist/{request-cache-KCNHp_RJ.mjs → request-cache-BSUptuJR.mjs} +1 -1
  608. package/dist/{request-cache-KCNHp_RJ.mjs.map → request-cache-BSUptuJR.mjs.map} +1 -1
  609. package/dist/{request-meta-DbvXaAvU.mjs → request-meta-DzXYYI-n.mjs} +2 -2
  610. package/dist/{request-meta-DbvXaAvU.mjs.map → request-meta-DzXYYI-n.mjs.map} +1 -1
  611. package/dist/{resolve-DR3wqMTy.mjs → resolve-Cd9dzclN.mjs} +1 -1
  612. package/dist/{resolve-DR3wqMTy.mjs.map → resolve-Cd9dzclN.mjs.map} +1 -1
  613. package/dist/{runner-DvFWoz8-.d.mts → runner-Dd8m8k9F.d.mts} +8 -2
  614. package/dist/runner-Dd8m8k9F.d.mts.map +1 -0
  615. package/dist/{runner-K8XK101B.mjs → runner-DfnZ5eUr.mjs} +355 -204
  616. package/dist/runner-DfnZ5eUr.mjs.map +1 -0
  617. package/dist/runtime.d.mts +11 -11
  618. package/dist/runtime.mjs +4 -4
  619. package/dist/schema-BXxlHeAf.mjs +9 -0
  620. package/dist/schema-BXxlHeAf.mjs.map +1 -0
  621. package/dist/scopes-Bl4IwHA-.mjs +27 -0
  622. package/dist/scopes-Bl4IwHA-.mjs.map +1 -0
  623. package/dist/{search-DZN2HZ-V.mjs → search-Bff-7jFt.mjs} +62 -12
  624. package/dist/search-Bff-7jFt.mjs.map +1 -0
  625. package/dist/{secrets-kp760LlD.mjs → secrets-CSwQIl4q.mjs} +4 -4
  626. package/dist/{secrets-kp760LlD.mjs.map → secrets-CSwQIl4q.mjs.map} +1 -1
  627. package/dist/{sections-CpF5SaGr.mjs → sections-CwW4s1al.mjs} +3 -3
  628. package/dist/{sections-CpF5SaGr.mjs.map → sections-CwW4s1al.mjs.map} +1 -1
  629. package/dist/seed/index.d.mts +2 -2
  630. package/dist/seed/index.mjs +23 -23
  631. package/dist/seo/index.d.mts +15 -2
  632. package/dist/seo/index.d.mts.map +1 -1
  633. package/dist/seo/index.mjs +22 -5
  634. package/dist/seo/index.mjs.map +1 -1
  635. package/dist/{seo-DXu2UQnC.mjs → seo-2cmFHZns.mjs} +2 -2
  636. package/dist/{seo-DXu2UQnC.mjs.map → seo-2cmFHZns.mjs.map} +1 -1
  637. package/dist/{seo-89-53DDs.mjs → seo-C3GDfT0V.mjs} +1 -1
  638. package/dist/{seo-89-53DDs.mjs.map → seo-C3GDfT0V.mjs.map} +1 -1
  639. package/dist/{service-DQmiBMzt.mjs → service-DkGTWGIi.mjs} +3 -3
  640. package/dist/{service-DQmiBMzt.mjs.map → service-DkGTWGIi.mjs.map} +1 -1
  641. package/dist/{session-user-Cascbax7.mjs → session-user-DbHqKDKe.mjs} +1 -1
  642. package/dist/{session-user-Cascbax7.mjs.map → session-user-DbHqKDKe.mjs.map} +1 -1
  643. package/dist/{settings-rZyHEcNT.mjs → settings-C4s8hFQm.mjs} +3 -3
  644. package/dist/{settings-rZyHEcNT.mjs.map → settings-C4s8hFQm.mjs.map} +1 -1
  645. package/dist/{settings-zhmdKyJQ.mjs → settings-CpA4lQFt.mjs} +6 -6
  646. package/dist/{settings-zhmdKyJQ.mjs.map → settings-CpA4lQFt.mjs.map} +1 -1
  647. package/dist/{setup-complete-Cb3LRyzy.mjs → setup-complete-CdIlqloh.mjs} +2 -2
  648. package/dist/{setup-complete-Cb3LRyzy.mjs.map → setup-complete-CdIlqloh.mjs.map} +1 -1
  649. package/dist/{setup-nonce-Z8x0tHf8.mjs → setup-nonce-DqiIPr-J.mjs} +1 -1
  650. package/dist/{setup-nonce-Z8x0tHf8.mjs.map → setup-nonce-DqiIPr-J.mjs.map} +1 -1
  651. package/dist/{single-flight-cache-BG3B_GhN.mjs → single-flight-cache-C2exrGAi.mjs} +2 -2
  652. package/dist/{single-flight-cache-BG3B_GhN.mjs.map → single-flight-cache-C2exrGAi.mjs.map} +1 -1
  653. package/dist/{site-url-BBfDTgZB.mjs → site-url-NGJT6NTU.mjs} +2 -2
  654. package/dist/{site-url-BBfDTgZB.mjs.map → site-url-NGJT6NTU.mjs.map} +1 -1
  655. package/dist/{slugify-Cce3dTdg.mjs → slugify-C_tqlU4G.mjs} +1 -1
  656. package/dist/{slugify-Cce3dTdg.mjs.map → slugify-C_tqlU4G.mjs.map} +1 -1
  657. package/dist/snapshot-BdpUJKD-.mjs +216 -0
  658. package/dist/snapshot-BdpUJKD-.mjs.map +1 -0
  659. package/dist/{ssrf-1g7usGBg.mjs → ssrf-CviKqWmq.mjs} +1 -1
  660. package/dist/{ssrf-1g7usGBg.mjs.map → ssrf-CviKqWmq.mjs.map} +1 -1
  661. package/dist/state-xxv6ZTMv.mjs +128 -0
  662. package/dist/state-xxv6ZTMv.mjs.map +1 -0
  663. package/dist/{status-CqJQX1QN.mjs → status-COfycGIU.mjs} +1 -1
  664. package/dist/{status-CqJQX1QN.mjs.map → status-COfycGIU.mjs.map} +1 -1
  665. package/dist/storage/local.d.mts +1 -1
  666. package/dist/storage/local.mjs +1 -1
  667. package/dist/storage/s3.d.mts +1 -1
  668. package/dist/storage/s3.mjs +1 -1
  669. package/dist/{taxonomies-Bs13SN-F.mjs → taxonomies-Ce49uIzY.mjs} +13 -9
  670. package/dist/taxonomies-Ce49uIzY.mjs.map +1 -0
  671. package/dist/{taxonomies-kH9ABDUF.mjs → taxonomies-DjSKBZpq.mjs} +115 -36
  672. package/dist/taxonomies-DjSKBZpq.mjs.map +1 -0
  673. package/dist/{taxonomy-BxGxZZdu.mjs → taxonomy-DfVooU4W.mjs} +60 -13
  674. package/dist/taxonomy-DfVooU4W.mjs.map +1 -0
  675. package/dist/{tokens-BGT0TUUo.mjs → tokens-DVltpO2D.mjs} +2 -2
  676. package/dist/{tokens-BGT0TUUo.mjs.map → tokens-DVltpO2D.mjs.map} +1 -1
  677. package/dist/{transaction-qfqpPVpu.mjs → transaction-D0FOsb3X.mjs} +1 -1
  678. package/dist/{transaction-qfqpPVpu.mjs.map → transaction-D0FOsb3X.mjs.map} +1 -1
  679. package/dist/{transport-DPefPMcz.mjs → transport-CKrlqSpD.mjs} +1 -1
  680. package/dist/{transport-DPefPMcz.mjs.map → transport-CKrlqSpD.mjs.map} +1 -1
  681. package/dist/{transport-BMDWHSgZ.d.mts → transport-Vd7VdqHv.d.mts} +1 -1
  682. package/dist/{transport-BMDWHSgZ.d.mts.map → transport-Vd7VdqHv.d.mts.map} +1 -1
  683. package/dist/{trusted-proxy-VTPRiX2s.mjs → trusted-proxy-CwjQj0YG.mjs} +1 -1
  684. package/dist/{trusted-proxy-VTPRiX2s.mjs.map → trusted-proxy-CwjQj0YG.mjs.map} +1 -1
  685. package/dist/{types-CgvhU-hF.d.mts → types-B4vm81VH.d.mts} +1 -1
  686. package/dist/{types-CgvhU-hF.d.mts.map → types-B4vm81VH.d.mts.map} +1 -1
  687. package/dist/{types-ea9sAPck.d.mts → types-B97jg3aW.d.mts} +6 -1
  688. package/dist/{types-ea9sAPck.d.mts.map → types-B97jg3aW.d.mts.map} +1 -1
  689. package/dist/{types-Jo3UYd6b.mjs → types-BD40g7zz.mjs} +1 -1
  690. package/dist/{types-Jo3UYd6b.mjs.map → types-BD40g7zz.mjs.map} +1 -1
  691. package/dist/{types-DmHk7vAt.d.mts → types-BNfPHfay.d.mts} +1 -1
  692. package/dist/{types-DmHk7vAt.d.mts.map → types-BNfPHfay.d.mts.map} +1 -1
  693. package/dist/{types-BcLUUbbR.d.mts → types-BfYUPJdP.d.mts} +11 -3
  694. package/dist/{types-BcLUUbbR.d.mts.map → types-BfYUPJdP.d.mts.map} +1 -1
  695. package/dist/{types-CGbYowGQ.d.mts → types-BvB7gDOD.d.mts} +90 -4
  696. package/dist/types-BvB7gDOD.d.mts.map +1 -0
  697. package/dist/{types-vgEWF18A.d.mts → types-C7U0HlEr.d.mts} +1 -1
  698. package/dist/{types-vgEWF18A.d.mts.map → types-C7U0HlEr.d.mts.map} +1 -1
  699. package/dist/{types-CuW0zWDA.mjs → types-D1iJ3DpO.mjs} +3 -3
  700. package/dist/{types-CuW0zWDA.mjs.map → types-D1iJ3DpO.mjs.map} +1 -1
  701. package/dist/{types-_HFLRzTn.d.mts → types-DPKhI5ib.d.mts} +9 -1
  702. package/dist/types-DPKhI5ib.d.mts.map +1 -0
  703. package/dist/{types-g_aFIdW0.d.mts → types-Kmaxdarz.d.mts} +1 -1
  704. package/dist/{types-g_aFIdW0.d.mts.map → types-Kmaxdarz.d.mts.map} +1 -1
  705. package/dist/{types-ClUkdbWb.d.mts → types-iVeZ5g6N.d.mts} +1 -1
  706. package/dist/{types-ClUkdbWb.d.mts.map → types-iVeZ5g6N.d.mts.map} +1 -1
  707. package/dist/{types-tM44hEcf.mjs → types-o7xo7VgH.mjs} +1 -1
  708. package/dist/{types-tM44hEcf.mjs.map → types-o7xo7VgH.mjs.map} +1 -1
  709. package/dist/{user-BjAOvU3Z.mjs → user-Bh-L1qo6.mjs} +3 -3
  710. package/dist/{user-BjAOvU3Z.mjs.map → user-Bh-L1qo6.mjs.map} +1 -1
  711. package/dist/{utils-BJXElxdw.mjs → utils-BbUgmeZG.mjs} +3 -3
  712. package/dist/{utils-BJXElxdw.mjs.map → utils-BbUgmeZG.mjs.map} +1 -1
  713. package/dist/{validate-Z1b86_3B.d.mts → validate-DULfgpJP.d.mts} +5 -5
  714. package/dist/{validate-Z1b86_3B.d.mts.map → validate-DULfgpJP.d.mts.map} +1 -1
  715. package/dist/{validate-CWSnKVIJ.mjs → validate-V9nCwq_-.mjs} +3 -3
  716. package/dist/{validate-CWSnKVIJ.mjs.map → validate-V9nCwq_-.mjs.map} +1 -1
  717. package/dist/{validation-0l8-RYj4.mjs → validation-BsVUJfsP.mjs} +10 -10
  718. package/dist/{validation-0l8-RYj4.mjs.map → validation-BsVUJfsP.mjs.map} +1 -1
  719. package/dist/version-907opKac.mjs +7 -0
  720. package/dist/{version-qmeO1XZY.mjs.map → version-907opKac.mjs.map} +1 -1
  721. package/dist/{widgets-hWcIicX8.mjs → widgets-DGv1Z04V.mjs} +4 -4
  722. package/dist/{widgets-hWcIicX8.mjs.map → widgets-DGv1Z04V.mjs.map} +1 -1
  723. package/dist/{wxr-taxonomies-0_uxSrmf.d.mts → wxr-taxonomies-B4tMuN5T.d.mts} +1 -1
  724. package/dist/{wxr-taxonomies-0_uxSrmf.d.mts.map → wxr-taxonomies-B4tMuN5T.d.mts.map} +1 -1
  725. package/dist/{wxr-taxonomies-CNFcsNCr.mjs → wxr-taxonomies-Cs1N6O8z.mjs} +4 -4
  726. package/dist/{wxr-taxonomies-CNFcsNCr.mjs.map → wxr-taxonomies-Cs1N6O8z.mjs.map} +1 -1
  727. package/dist/{zod-generator-CacrR-i8.mjs → zod-generator-B5prQ5M4.mjs} +3 -3
  728. package/dist/{zod-generator-CacrR-i8.mjs.map → zod-generator-B5prQ5M4.mjs.map} +1 -1
  729. package/package.json +12 -8
  730. package/src/api/authorize.ts +10 -1
  731. package/src/api/error.ts +5 -5
  732. package/src/api/errors.ts +25 -0
  733. package/src/api/handlers/backup.ts +312 -0
  734. package/src/api/handlers/content.ts +147 -3
  735. package/src/api/handlers/dashboard.ts +2 -0
  736. package/src/api/handlers/device-flow.ts +2 -3
  737. package/src/api/handlers/index.ts +22 -0
  738. package/src/api/handlers/marketplace.ts +38 -0
  739. package/src/api/handlers/media-upload.ts +210 -0
  740. package/src/api/handlers/media-usage.ts +289 -0
  741. package/src/api/handlers/oauth-authorization.ts +2 -6
  742. package/src/api/handlers/plugin-settings.ts +218 -0
  743. package/src/api/handlers/plugins.ts +41 -0
  744. package/src/api/handlers/registry.ts +39 -0
  745. package/src/api/handlers/relations.ts +474 -0
  746. package/src/api/handlers/snapshot.ts +21 -3
  747. package/src/api/handlers/taxonomies.ts +26 -4
  748. package/src/api/handlers/validate-media-fields.ts +1 -1
  749. package/src/api/openapi/document.ts +72 -5
  750. package/src/api/parse.ts +2 -16
  751. package/src/api/public-url.ts +4 -2
  752. package/src/api/schemas/comments.ts +6 -0
  753. package/src/api/schemas/common.ts +6 -2
  754. package/src/api/schemas/content.ts +8 -0
  755. package/src/api/schemas/index.ts +2 -0
  756. package/src/api/schemas/media-usage.ts +120 -0
  757. package/src/api/schemas/media.ts +32 -1
  758. package/src/api/schemas/relations.ts +109 -0
  759. package/src/api/schemas/search.ts +1 -0
  760. package/src/astro/integration/index.ts +39 -0
  761. package/src/astro/integration/routes.ts +40 -0
  762. package/src/astro/integration/runtime.ts +30 -0
  763. package/src/astro/integration/virtual-modules.ts +41 -7
  764. package/src/astro/integration/vite-config.ts +17 -1
  765. package/src/astro/middleware/auth.ts +70 -78
  766. package/src/astro/middleware/csp.ts +5 -2
  767. package/src/astro/middleware/request-context.ts +162 -20
  768. package/src/astro/middleware.ts +108 -40
  769. package/src/astro/public-plugin-api-routes.ts +2 -1
  770. package/src/astro/routes/PluginRegistry.tsx +5 -2
  771. package/src/astro/routes/admin.astro +56 -16
  772. package/src/astro/routes/api/admin/api-tokens/index.ts +2 -2
  773. package/src/astro/routes/api/admin/bylines/[id]/translations.ts +2 -5
  774. package/src/astro/routes/api/admin/comments/[id]/status.ts +1 -2
  775. package/src/astro/routes/api/admin/comments/index.ts +1 -2
  776. package/src/astro/routes/api/admin/media-usage/repair.ts +24 -0
  777. package/src/astro/routes/api/admin/plugins/[id]/index.ts +6 -0
  778. package/src/astro/routes/api/admin/plugins/[id]/mcp.ts +42 -0
  779. package/src/astro/routes/api/admin/plugins/[id]/settings.ts +80 -0
  780. package/src/astro/routes/api/admin/plugins/[id]/update.ts +2 -0
  781. package/src/astro/routes/api/admin/plugins/index.ts +9 -0
  782. package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +2 -0
  783. package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +2 -0
  784. package/src/astro/routes/api/admin/plugins/registry/install.ts +2 -0
  785. package/src/astro/routes/api/admin/plugins/updates.ts +2 -4
  786. package/src/astro/routes/api/auth/mode.ts +6 -14
  787. package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +21 -5
  788. package/src/astro/routes/api/auth/oauth/[provider].ts +24 -7
  789. package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +13 -0
  790. package/src/astro/routes/api/content/[collection]/[id]/compare.ts +3 -4
  791. package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +2 -3
  792. package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +2 -3
  793. package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +3 -4
  794. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +95 -0
  795. package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/parents.ts +47 -0
  796. package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +3 -4
  797. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +4 -6
  798. package/src/astro/routes/api/content/[collection]/[id]/translations.ts +3 -4
  799. package/src/astro/routes/api/content/[collection]/[id].ts +3 -4
  800. package/src/astro/routes/api/content/[collection]/authors.ts +2 -3
  801. package/src/astro/routes/api/content/[collection]/index.ts +6 -8
  802. package/src/astro/routes/api/content/[collection]/trash.ts +2 -3
  803. package/src/astro/routes/api/manifest.ts +2 -9
  804. package/src/astro/routes/api/mcp.ts +2 -1
  805. package/src/astro/routes/api/media/[id]/usage.ts +30 -0
  806. package/src/astro/routes/api/media/[id].ts +17 -6
  807. package/src/astro/routes/api/media/file/[...key].ts +8 -0
  808. package/src/astro/routes/api/media.ts +21 -2
  809. package/src/astro/routes/api/oauth/authorize.ts +2 -6
  810. package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +17 -3
  811. package/src/astro/routes/api/relations/[id]/index.ts +84 -0
  812. package/src/astro/routes/api/relations/[id]/translations.ts +33 -0
  813. package/src/astro/routes/api/relations/index.ts +56 -0
  814. package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +1 -7
  815. package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +1 -2
  816. package/src/astro/routes/api/search/index.ts +2 -0
  817. package/src/astro/routes/api/settings/backups/archives/[name].ts +78 -0
  818. package/src/astro/routes/api/settings/backups/archives/index.ts +33 -0
  819. package/src/astro/routes/api/settings/backups/export.ts +43 -0
  820. package/src/astro/routes/api/settings/backups/index.ts +76 -0
  821. package/src/astro/routes/api/setup/admin-verify.ts +8 -4
  822. package/src/astro/routes/api/setup/admin.ts +11 -4
  823. package/src/astro/routes/api/well-known/oauth-authorization-server.ts +4 -1
  824. package/src/astro/routes/api/well-known/oauth-protected-resource.ts +5 -1
  825. package/src/astro/types.ts +50 -2
  826. package/src/auth/api-tokens.ts +1 -0
  827. package/src/auth/oauth-state-store.ts +3 -0
  828. package/src/auth/providers/github-admin.tsx +5 -6
  829. package/src/auth/providers/google-admin.tsx +5 -6
  830. package/src/auth/scopes.ts +3 -9
  831. package/src/cli/client-factory.ts +0 -1
  832. package/src/cli/commands/bundle-utils.ts +50 -1
  833. package/src/cli/commands/bundle.ts +9 -2
  834. package/src/cli/commands/export-seed.ts +1 -10
  835. package/src/cli/commands/media.ts +127 -0
  836. package/src/client/index.ts +123 -2
  837. package/src/client/transport.ts +1 -1
  838. package/src/comments/service.ts +1 -1
  839. package/src/comments/turnstile.ts +64 -0
  840. package/src/components/BlockquoteGroup.astro +34 -0
  841. package/src/components/CommentForm.astro +12 -5
  842. package/src/components/EmDashHead.astro +31 -9
  843. package/src/components/InlinePortableTextEditor.tsx +88 -33
  844. package/src/components/PortableText.astro +7 -1
  845. package/src/components/index.ts +2 -0
  846. package/src/components/marks/Link.astro +5 -1
  847. package/src/components/portable-text-blockquote-group.ts +68 -0
  848. package/src/content/converters/portable-text-to-prosemirror.ts +32 -1
  849. package/src/database/dialect-helpers.ts +111 -3
  850. package/src/database/migrations/039_fix_fts5_triggers.ts +1 -1
  851. package/src/database/migrations/051_content_taxonomies_denorm.ts +120 -0
  852. package/src/database/migrations/052_media_usage_read_index.ts +26 -0
  853. package/src/database/migrations/053_plugin_mcp_tools.ts +21 -0
  854. package/src/database/migrations/runner.ts +52 -6
  855. package/src/database/pg-migration-lock.ts +72 -0
  856. package/src/database/repositories/audit.ts +2 -1
  857. package/src/database/repositories/comment.ts +1 -1
  858. package/src/database/repositories/content.ts +270 -37
  859. package/src/database/repositories/media-usage.ts +250 -1
  860. package/src/database/repositories/media.ts +1 -1
  861. package/src/database/repositories/plugin-storage.ts +29 -32
  862. package/src/database/repositories/redirect.ts +14 -2
  863. package/src/database/repositories/relation.ts +130 -5
  864. package/src/database/repositories/taxonomy.ts +66 -8
  865. package/src/database/repositories/types.ts +8 -0
  866. package/src/database/types.ts +23 -0
  867. package/src/db/adapters.ts +9 -0
  868. package/src/db/postgres.ts +5 -2
  869. package/src/emdash-runtime.ts +382 -70
  870. package/src/index.ts +6 -2
  871. package/src/loader.ts +293 -32
  872. package/src/mcp/server.ts +251 -8
  873. package/src/media/image-endpoint.ts +38 -2
  874. package/src/page/metadata.ts +27 -0
  875. package/src/plugin-types.ts +19 -0
  876. package/src/plugin-utils.ts +8 -6
  877. package/src/plugins/adapt-sandbox-entry.ts +30 -1
  878. package/src/plugins/context.ts +92 -0
  879. package/src/plugins/define-plugin.ts +17 -0
  880. package/src/plugins/index.ts +4 -0
  881. package/src/plugins/manifest-schema.ts +30 -1
  882. package/src/plugins/routes.ts +27 -1
  883. package/src/plugins/sandbox/runner-options.ts +16 -0
  884. package/src/plugins/sandbox/types.ts +6 -1
  885. package/src/plugins/state.ts +17 -1
  886. package/src/plugins/storage-query.ts +67 -33
  887. package/src/plugins/types.ts +100 -0
  888. package/src/schema/byline-registry.ts +1 -1
  889. package/src/schema/registry.ts +141 -5
  890. package/src/search/fts-manager.ts +34 -0
  891. package/src/search/match.ts +50 -0
  892. package/src/search/query.ts +94 -9
  893. package/src/seed/apply.ts +28 -29
  894. package/src/seo/hreflang.ts +192 -0
  895. package/src/seo/index.ts +22 -4
  896. package/src/storage/types.ts +6 -0
  897. package/src/taxonomies/index.ts +62 -45
  898. package/src/taxonomies/term-counts.ts +117 -0
  899. package/src/utils/base64.ts +7 -2
  900. package/src/utils/db-errors.ts +3 -1
  901. package/src/virtual-modules.d.ts +14 -0
  902. package/src/visual-editing/editable.ts +41 -35
  903. package/src/visual-editing/toolbar-bootstrap.ts +120 -0
  904. package/src/visual-editing/toolbar.ts +47 -1
  905. package/dist/adapters-hUy8vOB-.d.mts.map +0 -1
  906. package/dist/api-DxFSorgk.mjs.map +0 -1
  907. package/dist/api-tokens-DsvvCtdh.mjs +0 -3
  908. package/dist/apply-CDJqIjPU.mjs.map +0 -1
  909. package/dist/authorize-Dz88F_Fw.mjs.map +0 -1
  910. package/dist/base64-CmWvODNW.mjs.map +0 -1
  911. package/dist/byline-fields-2Lp5Hbgf.mjs.map +0 -1
  912. package/dist/byline-fields-CHE8UStY.d.mts.map +0 -1
  913. package/dist/content-DhgEth4k.mjs.map +0 -1
  914. package/dist/content-refresh-Br4gMzh8.mjs.map +0 -1
  915. package/dist/context-BRIpHARC.mjs.map +0 -1
  916. package/dist/dashboard-EvEKF5en.mjs.map +0 -1
  917. package/dist/db-errors-CK46D-ly.mjs.map +0 -1
  918. package/dist/device-flow-CfGP18Uw.mjs.map +0 -1
  919. package/dist/dialect-helpers-DRI5pyY3.mjs +0 -110
  920. package/dist/dialect-helpers-DRI5pyY3.mjs.map +0 -1
  921. package/dist/error-CkAseSqZ.mjs.map +0 -1
  922. package/dist/index-B9sIxwe4.d.mts.map +0 -1
  923. package/dist/loader-CB6YHeul.mjs.map +0 -1
  924. package/dist/manifest-schema-BHlgZM1W.mjs.map +0 -1
  925. package/dist/media-BrXIaMFN.mjs.map +0 -1
  926. package/dist/menus-b2T4clbO.mjs.map +0 -1
  927. package/dist/oauth-authorization-CXWkIGT4.mjs.map +0 -1
  928. package/dist/public-url-Danv47cS.mjs.map +0 -1
  929. package/dist/query-1Cp6U9oo.mjs.map +0 -1
  930. package/dist/redirect-IyfNirgS.mjs.map +0 -1
  931. package/dist/redirects-DXEXBAII.mjs.map +0 -1
  932. package/dist/registry-B57vp_X9.mjs.map +0 -1
  933. package/dist/runner-DvFWoz8-.d.mts.map +0 -1
  934. package/dist/runner-K8XK101B.mjs.map +0 -1
  935. package/dist/scheduled-publish-Drffrf2a.d.mts +0 -11
  936. package/dist/scheduled-publish-Drffrf2a.d.mts.map +0 -1
  937. package/dist/schema-CX9cfNkZ.mjs.map +0 -1
  938. package/dist/search-DZN2HZ-V.mjs.map +0 -1
  939. package/dist/taxonomies-Bs13SN-F.mjs.map +0 -1
  940. package/dist/taxonomies-kH9ABDUF.mjs.map +0 -1
  941. package/dist/taxonomy-BxGxZZdu.mjs.map +0 -1
  942. package/dist/types-CGbYowGQ.d.mts.map +0 -1
  943. package/dist/types-_HFLRzTn.d.mts.map +0 -1
  944. package/dist/version-qmeO1XZY.mjs +0 -7
  945. /package/dist/{ssrf-CmuGgCq3.mjs → ssrf-BB__xfNM.mjs} +0 -0
  946. /package/dist/{types-DROWRxYV.mjs → types-CK0LxPUQ.mjs} +0 -0
@@ -8,37 +8,123 @@
8
8
  * - Preview tokens: _preview query param with signed HMAC token
9
9
  * - Edit mode: emdash-edit-mode cookie (for visual editing)
10
10
  * - Toolbar injection: floating pill for authenticated editors
11
+ * - Client toolbar mode (`toolbar: "client"`): cache-identical HTML with a
12
+ * client-side bootstrap pill and an `_edit` query param for fresh editor
13
+ * renders (Discussion #1742)
11
14
  */
12
15
 
16
+ import type { APIContext } from "astro";
13
17
  import { defineMiddleware } from "astro:middleware";
18
+ // @ts-ignore - virtual module
19
+ import virtualConfig from "virtual:emdash/config";
14
20
 
15
21
  import { resolveSecretsCached } from "#config/secrets.js";
16
22
 
17
23
  import { verifyPreviewToken, parseContentId } from "../../preview/tokens.js";
18
24
  import { getRequestContext, runWithContext } from "../../request-context.js";
25
+ import { EDIT_PARAM, renderToolbarBootstrap } from "../../visual-editing/toolbar-bootstrap.js";
19
26
  import { renderToolbar } from "../../visual-editing/toolbar.js";
20
27
 
28
+ type ToolbarMode = "server" | "client" | false;
29
+
30
+ const toolbarMode: ToolbarMode = virtualConfig?.toolbar ?? "server";
31
+
32
+ /** Astro's route-cache handle. EmDash requires Astro 6+, so it's always present. */
33
+ type RouteCache = APIContext["cache"];
34
+
21
35
  /**
22
- * Inject toolbar HTML into a response if it's an HTML page.
23
- * Returns the original response if not HTML.
36
+ * Opt the current request out of Astro's route cache (e.g. Workers Cache on
37
+ * Cloudflare). `Cache-Control` headers do NOT cover this: the adapter derives
38
+ * the shared-cache TTL from the route-cache options (on Cloudflare via
39
+ * `Cloudflare-CDN-Cache-Control`), so session-specific responses must
40
+ * explicitly disable it or they get stored in the shared cache and served to
41
+ * anonymous visitors without ever invoking the middleware again. With no cache
42
+ * provider configured this is a no-op (`NoopAstroCache`/`DisabledAstroCache`).
24
43
  */
25
- async function injectToolbar(response: Response, toolbarHtml: string): Promise<Response> {
44
+ function optOutOfRouteCache(cache: RouteCache): void {
45
+ cache.set(false);
46
+ }
47
+
48
+ /**
49
+ * Inject HTML before `</body>` if the response is an HTML page with a body
50
+ * end tag. Does not touch cache headers — callers decide whether the result
51
+ * is still shareable. `injected` tells the caller whether anything changed.
52
+ */
53
+ async function injectBeforeBodyEnd(
54
+ response: Response,
55
+ htmlToInject: string,
56
+ ): Promise<{ response: Response; injected: boolean }> {
26
57
  const contentType = response.headers.get("content-type");
27
- if (!contentType?.includes("text/html")) return response;
58
+ if (!contentType?.includes("text/html")) return { response, injected: false };
28
59
 
29
60
  const html = await response.text();
30
- if (!html.includes("</body>")) return new Response(html, response);
61
+ if (!html.includes("</body>")) {
62
+ // Body already consumed — rebuild the response unchanged.
63
+ return { response: new Response(html, response), injected: false };
64
+ }
65
+
66
+ const injected = html.replace("</body>", `${htmlToInject}</body>`);
67
+ return {
68
+ response: new Response(injected, {
69
+ status: response.status,
70
+ headers: response.headers,
71
+ }),
72
+ injected: true,
73
+ };
74
+ }
75
+
76
+ /**
77
+ * Inject toolbar HTML into a response if it's an HTML page.
78
+ * Returns the original response if not HTML.
79
+ */
80
+ async function injectToolbar(
81
+ response: Response,
82
+ toolbarHtml: string,
83
+ routeCache: RouteCache,
84
+ ): Promise<Response> {
85
+ const result = await injectBeforeBodyEnd(response, toolbarHtml);
86
+ if (result.injected) {
87
+ // Toolbar-injected HTML is session-specific (its presence reveals an
88
+ // active editor session); it must never be stored in a shared CDN cache
89
+ // and served to anonymous visitors. Mirrors the preview branch's guard
90
+ // (#1398). `Cache-Control` covers browsers/downstream proxies; the
91
+ // route-cache opt-out covers the shared edge cache, which ignores
92
+ // `Cache-Control`.
93
+ result.response.headers.set("Cache-Control", "private, no-store");
94
+ optOutOfRouteCache(routeCache);
95
+ }
96
+ return result.response;
97
+ }
31
98
 
32
- const injected = html.replace("</body>", `${toolbarHtml}</body>`);
33
- const result = new Response(injected, {
34
- status: response.status,
35
- headers: response.headers,
99
+ /**
100
+ * Inject the client-toolbar bootstrap script. Identical for every visitor, so
101
+ * cache headers and route-cache options are left untouched and the response
102
+ * stays fully shareable.
103
+ */
104
+ async function injectBootstrap(response: Response): Promise<Response> {
105
+ const result = await injectBeforeBodyEnd(response, renderToolbarBootstrap());
106
+ return result.response;
107
+ }
108
+
109
+ /**
110
+ * Redirect an `_edit` URL to its canonical form (same URL without the param).
111
+ * Applied when the requester is not an authenticated editor, so a shared
112
+ * `?_edit` link degrades gracefully for everyone else (Discussion #1742).
113
+ */
114
+ function redirectToCanonical(url: URL): Response {
115
+ const canonical = new URL(url);
116
+ canonical.searchParams.delete(EDIT_PARAM);
117
+ return new Response(null, {
118
+ status: 302,
119
+ headers: {
120
+ Location: canonical.pathname + canonical.search + canonical.hash,
121
+ // Header-following caches (Fastly, Varnish, browsers) must not store
122
+ // the redirect — a cached 302 would bounce editors back to the
123
+ // canonical URL. The route-cache opt-out at the call site covers the
124
+ // Workers Cache, which ignores Cache-Control.
125
+ "Cache-Control": "private, no-store",
126
+ },
36
127
  });
37
- // Toolbar-injected HTML is session-specific (its presence reveals an active
38
- // editor session); it must never be stored in a shared CDN cache and served
39
- // to anonymous visitors. Mirrors the preview branch's guard (#1398).
40
- result.headers.set("Cache-Control", "private, no-store");
41
- return result;
42
128
  }
43
129
 
44
130
  export const onRequest = defineMiddleware(async (context, next) => {
@@ -73,9 +159,30 @@ export const onRequest = defineMiddleware(async (context, next) => {
73
159
  // Fast path: check for CMS signals before doing any work
74
160
  const hasEditCookie = cookies.get("emdash-edit-mode")?.value === "true";
75
161
  const hasPreviewToken = url.searchParams.has("_preview");
162
+ // `_edit` requests a fresh (never cached) editor render; only meaningful in
163
+ // client toolbar mode where public HTML is otherwise identical for everyone.
164
+ const hasEditParam = toolbarMode === "client" && url.searchParams.has(EDIT_PARAM);
165
+
166
+ if (hasEditParam) {
167
+ // `_edit` URLs are their own cache key. Never store them in the route
168
+ // cache — a cached anonymous redirect would bounce editors back to the
169
+ // canonical URL, and a cached editor render must never be shared.
170
+ optOutOfRouteCache(context.cache);
171
+
172
+ // A non-editor (anonymous, logged-out, or insufficient role) opening an
173
+ // `_edit` URL is sent to the canonical URL — shared `?_edit` links
174
+ // degrade gracefully and never prime a cache entry with page content.
175
+ if (!isEditor) {
176
+ return redirectToCanonical(url);
177
+ }
178
+ }
76
179
 
77
- // No CMS signals and not an editor → skip everything (zero overhead)
180
+ // No CMS signals and not an editor → skip everything (zero overhead in
181
+ // server mode; client mode injects the identical-for-everyone bootstrap)
78
182
  if (!hasEditCookie && !hasPreviewToken && !isEditor) {
183
+ if (toolbarMode === "client") {
184
+ return injectBootstrap(await next());
185
+ }
79
186
  return next();
80
187
  }
81
188
 
@@ -86,6 +193,8 @@ export const onRequest = defineMiddleware(async (context, next) => {
86
193
  // eslint-disable-next-line typescript/no-unsafe-type-assertion -- Astro context includes currentLocale when i18n is configured
87
194
  const locale = (context as { currentLocale?: string }).currentLocale;
88
195
 
196
+ const routeCache = context.cache;
197
+
89
198
  // Verify preview token if present.
90
199
  // The preview secret is resolved via `resolveSecretsCached`: env wins,
91
200
  // otherwise a DB-stored value is read (or generated on first need).
@@ -122,32 +231,65 @@ export const onRequest = defineMiddleware(async (context, next) => {
122
231
 
123
232
  // Preview responses must not be cached -- draft content could leak past token expiry.
124
233
  // Clone the response before modifying headers — the original may be immutable.
234
+ // `Cache-Control` only governs browsers/downstream proxies; the shared
235
+ // edge cache follows the route-cache options, so opt out of those too —
236
+ // otherwise the draft response is stored in the shared cache and served
237
+ // on cache hits without token verification until TTL/purge. Opt out for
238
+ // any request carrying a `_preview` param (valid or not): those URLs are
239
+ // per-token, so cached copies are useless at best and drafts at worst.
240
+ if (hasPreviewToken) {
241
+ optOutOfRouteCache(routeCache);
242
+ }
125
243
  if (preview) {
126
244
  response = new Response(response.body, response);
127
245
  response.headers.set("Cache-Control", "private, no-store");
128
246
  }
129
247
 
130
- // Inject toolbar for authenticated editors
131
- if (isEditor) {
248
+ // Inject toolbar for authenticated editors. Preview and edit-mode
249
+ // responses are session-specific (`private, no-store` + route-cache
250
+ // opt-out) in every toolbar mode, so the server toolbar is safe to
251
+ // inject here even in client mode.
252
+ if (isEditor && toolbarMode !== false) {
132
253
  const toolbarHtml = renderToolbar({
133
254
  editMode,
134
255
  isPreview: !!preview,
135
256
  });
136
- return injectToolbar(response, toolbarHtml);
257
+ return injectToolbar(response, toolbarHtml, routeCache);
258
+ }
259
+
260
+ // Stale edit cookie without a session (client mode): still serve the
261
+ // shareable bootstrap variant.
262
+ if (toolbarMode === "client" && !isEditor && !preview) {
263
+ return injectBootstrap(response);
137
264
  }
138
265
 
139
266
  return response;
140
267
  });
141
268
  }
142
269
 
143
- // Editor without CMS signals — no ALS needed, but inject toolbar
270
+ // Editor without preview/edit-mode signals.
144
271
  if (isEditor) {
272
+ if (toolbarMode === false) {
273
+ return next();
274
+ }
275
+
276
+ // Client mode: without the `_edit` param the response must stay
277
+ // byte-identical to the anonymous variant (plus the same bootstrap
278
+ // script), so shared caches serve one entry for everyone. The bootstrap
279
+ // pill is the editor's entry point into the fresh `_edit` render.
280
+ if (toolbarMode === "client" && !hasEditParam) {
281
+ return injectBootstrap(await next());
282
+ }
283
+
284
+ // Server mode, or an `_edit` request in client mode: inject the full
285
+ // toolbar (response becomes `private, no-store` and route-cache
286
+ // opted out).
145
287
  const response = await next();
146
288
  const toolbarHtml = renderToolbar({
147
289
  editMode: false,
148
290
  isPreview: false,
149
291
  });
150
- return injectToolbar(response, toolbarHtml);
292
+ return injectToolbar(response, toolbarHtml, routeCache);
151
293
  }
152
294
 
153
295
  return next();
@@ -47,7 +47,7 @@ import {
47
47
  import { setI18nConfig } from "../i18n/config.js";
48
48
  import type { Database, Storage } from "../index.js";
49
49
  import { createPublicMediaUrlResolver } from "../media/url.js";
50
- import type { SandboxRunner } from "../plugins/sandbox/types.js";
50
+ import type { SandboxRunnerFactory } from "../plugins/sandbox/types.js";
51
51
  import type { ResolvedPlugin } from "../plugins/types.js";
52
52
  import { invalidateUrlPatternCache } from "../query.js";
53
53
  import {
@@ -67,6 +67,9 @@ import { createPublicPluginApiRouteHandler } from "./public-plugin-api-routes.js
67
67
  import { resolveSessionUser } from "./session-user.js";
68
68
  import type { EmDashHandlers } from "./types.js";
69
69
 
70
+ // Public type for withEmDashRuntime() consumers (queue/scheduled handlers).
71
+ export type { EmDashRuntime } from "../emdash-runtime.js";
72
+
70
73
  /**
71
74
  * Runtime init lock reclaim deadline. Must be strictly larger than the db
72
75
  * init deadline: this lock wraps EmDashRuntime.create() → getDatabase() →
@@ -76,6 +79,17 @@ import type { EmDashHandlers } from "./types.js";
76
79
  */
77
80
  const RUNTIME_INIT_DEADLINE_MS = DB_INIT_DEADLINE_MS + 15_000;
78
81
 
82
+ /**
83
+ * Throttle for the anonymous-path runtime-init failure log. While a site is
84
+ * stuck (e.g. a failing migration in its backoff window, #1744) every
85
+ * anonymous request lands in that catch; one line per interval per isolate
86
+ * keeps the failure visible without flooding logs on a busy site. Plain
87
+ * module state (not globalThis): a duplicated SSR chunk just means an extra
88
+ * log line, which is harmless.
89
+ */
90
+ const RUNTIME_INIT_ERROR_LOG_INTERVAL_MS = 30_000;
91
+ let lastRuntimeInitErrorLogAt = 0;
92
+
79
93
  /**
80
94
  * Whether we've verified the database has been set up.
81
95
  * On a fresh deployment the first request may hit a public page, bypassing
@@ -152,8 +166,7 @@ function getConfig(): EmDashConfig | null {
152
166
  }
153
167
  }
154
168
 
155
- // eslint-disable-next-line typescript/no-unsafe-type-assertion -- virtual module import is untyped (@ts-ignore above)
156
- return virtualConfig as EmDashConfig;
169
+ return virtualConfig;
157
170
  }
158
171
  return null;
159
172
  }
@@ -190,19 +203,7 @@ function buildDependencies(config: EmDashConfig): RuntimeDependencies {
190
203
  sandboxEnabled: sandboxModule.sandboxEnabled as boolean,
191
204
  sandboxBypassed: (sandboxModule.sandboxBypassed as boolean) ?? false,
192
205
  sandboxedPluginEntries: (virtualSandboxedPlugins as SandboxedPluginEntry[]) || [],
193
- createSandboxRunner: sandboxModule.createSandboxRunner as
194
- | ((opts: {
195
- db: Kysely<Database>;
196
- mediaStorage?: {
197
- upload(options: {
198
- key: string;
199
- body: Uint8Array;
200
- contentType: string;
201
- }): Promise<unknown>;
202
- delete(key: string): Promise<unknown>;
203
- };
204
- }) => SandboxRunner)
205
- | null,
206
+ createSandboxRunner: sandboxModule.createSandboxRunner as SandboxRunnerFactory | null,
206
207
  mediaProviderEntries: (virtualMediaProviders as MediaProviderEntry[]) || [],
207
208
  };
208
209
  /* eslint-enable typescript-eslint/no-unsafe-type-assertion */
@@ -275,22 +276,81 @@ export async function runScheduledTasks(
275
276
  ): Promise<{ published: PublishedRef[] }> {
276
277
  const config = getConfig();
277
278
  if (!config) return { published: [] };
279
+ return runOutsideRequest(config, (runtime) => runtime.runScheduledTasks(options));
280
+ }
281
+
282
+ /**
283
+ * Run a callback against the EmDash runtime outside any HTTP request — from a
284
+ * Cloudflare Queue consumer, a `scheduled()` handler, or any other
285
+ * platform-event handler that has no request and therefore no `locals.emdash`.
286
+ *
287
+ * Resolves the same cached runtime singleton request handlers use, so hooks,
288
+ * plugin state, and storage all behave exactly as they do during a request.
289
+ * A typical queue consumer finishes a job by calling back into a plugin route:
290
+ *
291
+ * ```ts
292
+ * import { withEmDashRuntime } from "emdash/middleware";
293
+ *
294
+ * async function queue(batch: MessageBatch) {
295
+ * await withEmDashRuntime(async (runtime) => {
296
+ * for (const message of batch.messages) {
297
+ * await runtime.handlePluginApiRoute(
298
+ * "my-plugin",
299
+ * "POST",
300
+ * "/finishJob",
301
+ * new Request("https://internal/", {
302
+ * method: "POST",
303
+ * body: JSON.stringify(message.body),
304
+ * }),
305
+ * );
306
+ * }
307
+ * });
308
+ * }
309
+ * ```
310
+ *
311
+ * Server-only and fully trusted: the callback gets the raw runtime with no
312
+ * auth or CSRF checks, same trust level as plugin cron. Never expose it to
313
+ * user input without validating that input yourself.
314
+ *
315
+ * Throws when EmDash is not configured (no `emdash()` Astro integration).
316
+ */
317
+ export async function withEmDashRuntime<T>(
318
+ run: (runtime: EmDashRuntime) => T | Promise<T>,
319
+ ): Promise<T> {
320
+ const config = getConfig();
321
+ if (!config) {
322
+ throw new Error(
323
+ "EmDash is not configured — withEmDashRuntime() requires the emdash() Astro integration.",
324
+ );
325
+ }
326
+ return runOutsideRequest(config, async (runtime) => run(runtime));
327
+ }
328
+
329
+ /**
330
+ * Shared plumbing for request-free entry points (`runScheduledTasks`,
331
+ * `withEmDashRuntime`): resolve the runtime singleton, then run the callback
332
+ * under an event-scoped db connection when the adapter needs one.
333
+ *
334
+ * Connection-backed adapters (e.g. Postgres over Hyperdrive) cannot reuse
335
+ * the per-isolate singleton from a platform event: its socket belongs to the
336
+ * request that opened it, and workerd rejects cross-event I/O. Open an
337
+ * event-scoped connection and run the callback under it in ALS — the
338
+ * runtime's db getter, the cron executor, and plugin contexts all resolve
339
+ * the connection from ALS — then close it. Gated on the adapter being
340
+ * connection-backed (it exposes `close()`); stateless adapters (D1, Node
341
+ * SQLite) return null or a close-less scope and keep using the singleton.
342
+ */
343
+ async function runOutsideRequest<T>(
344
+ config: EmDashConfig,
345
+ fn: (runtime: EmDashRuntime) => Promise<T>,
346
+ ): Promise<T> {
278
347
  const runtime = await getRuntime(config);
279
348
 
280
- // Connection-backed adapters (e.g. Postgres over Hyperdrive) cannot reuse
281
- // the per-isolate singleton from a Cron Trigger: its socket belongs to the
282
- // request that opened it, and workerd rejects cross-event I/O. Open an
283
- // event-scoped connection for the sweep and run the batch under it in ALS —
284
- // the runtime's db getter, the cron executor, and plugin cron contexts all
285
- // resolve the connection from ALS — then close it. Gated on the adapter
286
- // being connection-backed (it exposes `close()`); stateless adapters (D1,
287
- // Node SQLite) return null or a close-less scope and keep using the
288
- // singleton, so their cron path is unchanged.
289
349
  const scoped = createRequestScopedDb({
290
350
  config: config.database?.config,
291
351
  isAuthenticated: false,
292
- // The sweep publishes and cleans up — a write workload — so a
293
- // connection-backed adapter routes it to the primary.
352
+ // Event handlers publish, clean up, or run jobs — a write workload —
353
+ // so a connection-backed adapter routes them to the primary.
294
354
  isWrite: true,
295
355
  cookies: NOOP_COOKIE_JAR,
296
356
  url: CRON_EVENT_URL,
@@ -298,7 +358,7 @@ export async function runScheduledTasks(
298
358
  if (!scoped?.close) {
299
359
  // Stateless adapter (or no per-request scoping): the singleton is safe
300
360
  // outside a request. Any close-less scope created above is discarded.
301
- return runtime.runScheduledTasks(options);
361
+ return fn(runtime);
302
362
  }
303
363
 
304
364
  const parent = getRequestContext();
@@ -306,19 +366,19 @@ export async function runScheduledTasks(
306
366
  ? { ...parent, db: scoped.db }
307
367
  : { editMode: false, db: scoped.db, metrics: createRequestMetrics(performance.now()) };
308
368
  try {
309
- return await runWithContext(ctx, () => runtime.runScheduledTasks(options));
369
+ return await runWithContext(ctx, () => fn(runtime));
310
370
  } finally {
311
- // Guard both so a throw in teardown can't mask the sweep result or skip
312
- // close() and leak the connection. Mirrors closeSafely() in scoped-db.ts.
371
+ // Guard both so a throw in teardown can't mask the callback result or
372
+ // skip close() and leak the connection. Mirrors closeSafely() in scoped-db.ts.
313
373
  try {
314
374
  scoped.commit();
315
375
  } catch (error) {
316
- console.error("[scheduled] request-scoped db commit failed:", error);
376
+ console.error("[emdash] event-scoped db commit failed:", error);
317
377
  }
318
378
  try {
319
379
  scoped.close();
320
380
  } catch (error) {
321
- console.error("[scheduled] request-scoped db close failed:", error);
381
+ console.error("[emdash] event-scoped db close failed:", error);
322
382
  }
323
383
  }
324
384
  }
@@ -524,11 +584,7 @@ export const onRequest = defineMiddleware(async (context, next) => {
524
584
  try {
525
585
  const { getDb } = await import("../loader.js");
526
586
  const db = await getDb();
527
- await db
528
- .selectFrom("_emdash_migrations" as keyof Database)
529
- .selectAll()
530
- .limit(1)
531
- .execute();
587
+ await db.selectFrom("_emdash_migrations").selectAll().limit(1).execute();
532
588
  markSetupVerified();
533
589
  } catch (error) {
534
590
  // Only a genuinely-missing migrations table means a fresh,
@@ -571,8 +627,15 @@ export const onRequest = defineMiddleware(async (context, next) => {
571
627
  // requests carry no session.
572
628
  storage: runtime.storage,
573
629
  } as EmDashHandlers;
574
- } catch {
575
- // Non-fatal — EmDashHead will fall back to base SEO contributions
630
+ } catch (error) {
631
+ // Non-fatal — EmDashHead falls back to base SEO contributions
632
+ // but log it (throttled): a persistently failing init (e.g. a
633
+ // failing migration, #1744) is otherwise invisible on the
634
+ // anonymous path, silently degrading every public page.
635
+ if (Date.now() - lastRuntimeInitErrorLogAt >= RUNTIME_INIT_ERROR_LOG_INTERVAL_MS) {
636
+ lastRuntimeInitErrorLogAt = Date.now();
637
+ console.error("[emdash] runtime init failed (page renders without CMS data):", error);
638
+ }
576
639
  }
577
640
  timings.push({ name: "rt", dur: performance.now() - t0, desc: "Runtime init" });
578
641
  // Append cold-only sub-phase timings so the breakdown is visible
@@ -721,6 +784,11 @@ export const onRequest = defineMiddleware(async (context, next) => {
721
784
  handlePluginApiRoute: runtime.handlePluginApiRoute.bind(runtime),
722
785
  handlePublicPluginApiRoute: createPublicPluginApiRouteHandler(runtime),
723
786
  getPluginRouteMeta: runtime.getPluginRouteMeta.bind(runtime),
787
+ getPluginMcpTools: runtime.getPluginMcpTools.bind(runtime),
788
+ getEnabledPluginMcpTools: runtime.getEnabledPluginMcpTools.bind(runtime),
789
+ serializePluginMcpConsent: runtime.serializePluginMcpConsent.bind(runtime),
790
+ handlePluginMcpTool: runtime.handlePluginMcpTool.bind(runtime),
791
+ handlePluginMcpDenied: runtime.handlePluginMcpDenied.bind(runtime),
724
792
 
725
793
  // Media provider methods
726
794
  getMediaProvider: runtime.getMediaProvider.bind(runtime),
@@ -1,3 +1,4 @@
1
+ import type { RouteMeta } from "../plugins/routes.js";
1
2
  import type { HandlerResponse } from "./types.js";
2
3
 
3
4
  export type PublicPluginApiRouteHandler = (
@@ -8,7 +9,7 @@ export type PublicPluginApiRouteHandler = (
8
9
  ) => Promise<HandlerResponse>;
9
10
 
10
11
  interface PublicPluginApiRouteRuntime {
11
- getPluginRouteMeta(pluginId: string, path: string): { public: boolean } | null;
12
+ getPluginRouteMeta(pluginId: string, path: string): RouteMeta | null;
12
13
  handlePluginApiRoute(
13
14
  pluginId: string,
14
15
  method: string,
@@ -6,7 +6,7 @@
6
6
  * together with the admin app and available via React context.
7
7
  */
8
8
 
9
- import { AdminApp } from "@emdash-cms/admin";
9
+ import { AdminApp, type AdminBranding } from "@emdash-cms/admin";
10
10
  import type { Messages } from "@lingui/core";
11
11
  // @ts-ignore - virtual module generated by integration
12
12
  import { pluginAdmins } from "virtual:emdash/admin-registry";
@@ -16,13 +16,16 @@ import { authProviders } from "virtual:emdash/auth-providers";
16
16
  interface AdminWrapperProps {
17
17
  locale: string;
18
18
  messages: Messages;
19
+ /** Configured admin white-label branding (logo, site name), read server-side from `admin.astro`. */
20
+ adminBranding?: AdminBranding;
19
21
  }
20
22
 
21
- export default function AdminWrapper({ locale, messages }: AdminWrapperProps) {
23
+ export default function AdminWrapper({ locale, messages, adminBranding }: AdminWrapperProps) {
22
24
  return (
23
25
  <AdminApp
24
26
  pluginAdmins={pluginAdmins}
25
27
  authProviders={authProviders}
28
+ adminBranding={adminBranding}
26
29
  locale={locale}
27
30
  messages={messages}
28
31
  />
@@ -17,6 +17,7 @@ import { Font } from "astro:assets";
17
17
  export const prerender = false;
18
18
 
19
19
  import { resolveLocale, loadMessages, getLocaleDir } from "@emdash-cms/admin/locales";
20
+ import { getSiteSettingsWithDb } from "#settings/index.js";
20
21
 
21
22
  const resolvedLocale = resolveLocale(Astro.request);
22
23
  const resolvedDir = getLocaleDir(resolvedLocale);
@@ -33,17 +34,59 @@ const pageTitle = adminConfig?.siteName ? `${adminConfig.siteName} Admin` : "EmD
33
34
  // via cookie/Accept-Language). API routes already send `private, no-store`
34
35
  // (API_CACHE_HEADERS); this closes the same gap for the admin HTML.
35
36
  Astro.response.headers.set("Cache-Control", "private, no-store");
37
+
38
+ // Favicon precedence: an explicit build-time `admin.favicon` is admin-specific
39
+ // and always wins — in that case the settings read is skipped entirely.
40
+ // Otherwise fall back to the Site Icon configured in Settings → General, so
41
+ // the admin shell is branded like the public site (WordPress-style Site Icon,
42
+ // which also brands wp-admin), and finally the bundled EmDash mark below.
43
+ const emdash = Astro.locals.emdash;
44
+ let siteFavicon: string | undefined;
45
+ let siteFaviconType: string | undefined;
46
+ if (!adminConfig?.favicon && emdash?.db) {
47
+ try {
48
+ const settings = await getSiteSettingsWithDb(emdash.db, emdash.storage ?? null);
49
+ siteFavicon = settings.favicon?.url ?? undefined;
50
+ siteFaviconType = settings.favicon?.contentType ?? undefined;
51
+ } catch {
52
+ // Settings unavailable (e.g. pre-setup) — fall back to the config/default.
53
+ }
54
+ }
55
+ const favicon = adminConfig?.favicon ?? siteFavicon;
56
+ // The media-file URL has no extension, so browsers need the MIME type —
57
+ // Chromium ignores SVG favicons without type="image/svg+xml". Only set for
58
+ // Site Icons; build-time `admin.favicon` strings keep their current behavior.
59
+ const faviconType = adminConfig?.favicon ? undefined : siteFaviconType;
36
60
  ---
37
61
 
38
62
  <!doctype html>
39
- <html lang={resolvedLocale} dir={resolvedDir}>
63
+ <html lang={resolvedLocale} dir={resolvedDir} data-theme="classic">
40
64
  <head>
41
65
  <meta charset="UTF-8" />
42
66
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
67
+ <script is:inline>
68
+ (() => {
69
+ let preference = "system";
70
+
71
+ try {
72
+ const storedPreference = localStorage.getItem("emdash-theme");
73
+ if (storedPreference === "light" || storedPreference === "dark") {
74
+ preference = storedPreference;
75
+ }
76
+ } catch {
77
+ // Storage can be unavailable in privacy-restricted contexts. Use the system theme.
78
+ }
79
+
80
+ const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
81
+ const mode =
82
+ preference === "dark" || (preference === "system" && prefersDark) ? "dark" : "light";
83
+ document.documentElement.setAttribute("data-mode", mode);
84
+ })();
85
+ </script>
43
86
  <link rel="stylesheet" href={adminStylesUrl} />
44
87
  <Font cssVariable="--font-emdash" />
45
- {adminConfig?.favicon ? (
46
- <link rel="icon" href={adminConfig.favicon} />
88
+ {favicon ? (
89
+ <link rel="icon" href={favicon} type={faviconType} />
47
90
  ) : (
48
91
  <link
49
92
  rel="icon"
@@ -61,8 +104,7 @@ Astro.response.headers.set("Cache-Control", "private, no-store");
61
104
  align-items: center;
62
105
  justify-content: center;
63
106
  min-height: 100vh;
64
- color-scheme: light dark;
65
- background: light-dark(hsl(0 0% 100%), hsl(222.2 84% 4.9%));
107
+ background: var(--color-kumo-elevated);
66
108
  }
67
109
  #emdash-boot-loader .loader-inner {
68
110
  text-align: center;
@@ -71,15 +113,8 @@ Astro.response.headers.set("Cache-Control", "private, no-store");
71
113
  width: 24px;
72
114
  height: 24px;
73
115
  margin: 0 auto;
74
- border: 2.5px solid
75
- light-dark(
76
- hsl(215.4 16.3% 46.9% / 0.3),
77
- hsl(215 20.2% 65.1% / 0.3)
78
- );
79
- border-top-color: light-dark(
80
- hsl(215.4 16.3% 46.9%),
81
- hsl(215 20.2% 65.1%)
82
- );
116
+ border: 2.5px solid var(--color-kumo-line);
117
+ border-top-color: var(--text-color-kumo-subtle);
83
118
  border-radius: 50%;
84
119
  animation: emdash-spin 0.8s linear infinite;
85
120
  }
@@ -92,7 +127,7 @@ Astro.response.headers.set("Cache-Control", "private, no-store");
92
127
  sans-serif
93
128
  );
94
129
  font-size: 0.875rem;
95
- color: light-dark(hsl(215.4 16.3% 46.9%), hsl(215 20.2% 65.1%));
130
+ color: var(--text-color-kumo-subtle);
96
131
  }
97
132
  @keyframes emdash-spin {
98
133
  to {
@@ -105,7 +140,12 @@ Astro.response.headers.set("Cache-Control", "private, no-store");
105
140
  <p>{adminConfig?.siteName ? `Loading ${adminConfig.siteName}...` : "Loading EmDash..."}</p>
106
141
  </div>
107
142
  </div>
108
- <AdminWrapper client:only="react" locale={resolvedLocale} messages={messages} />
143
+ <AdminWrapper
144
+ client:only="react"
145
+ locale={resolvedLocale}
146
+ messages={messages}
147
+ adminBranding={{ logo: adminConfig?.logo, siteName: adminConfig?.siteName }}
148
+ />
109
149
  </div>
110
150
  </body>
111
151
  </html>
@@ -12,13 +12,13 @@ import { z } from "zod";
12
12
  import { apiError, handleError, unwrapResult } from "#api/error.js";
13
13
  import { handleApiTokenCreate, handleApiTokenList } from "#api/handlers/api-tokens.js";
14
14
  import { isParseError, parseBody } from "#api/parse.js";
15
- import { VALID_SCOPES } from "#auth/api-tokens.js";
15
+ import { isValidScope } from "#auth/api-tokens.js";
16
16
 
17
17
  export const prerender = false;
18
18
 
19
19
  const createTokenSchema = z.object({
20
20
  name: z.string().min(1).max(100),
21
- scopes: z.array(z.enum(VALID_SCOPES)).min(1),
21
+ scopes: z.array(z.string().refine(isValidScope)).min(1),
22
22
  expiresAt: z.string().datetime().optional(),
23
23
  });
24
24