emdash 0.13.0 → 0.15.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 (605) hide show
  1. package/dist/{adapters-9DybjTO6.d.mts → adapters-C4yd_UJR.d.mts} +1 -1
  2. package/dist/{adapters-9DybjTO6.d.mts.map → adapters-C4yd_UJR.d.mts.map} +1 -1
  3. package/dist/{allowed-origins-CDdG-4Gd.mjs → allowed-origins-D0fFk9a6.mjs} +2 -2
  4. package/dist/{allowed-origins-CDdG-4Gd.mjs.map → allowed-origins-D0fFk9a6.mjs.map} +1 -1
  5. package/dist/api/route-utils.d.mts +3 -3
  6. package/dist/api/route-utils.mjs +15 -15
  7. package/dist/api/schemas/index.d.mts +2 -2
  8. package/dist/api/schemas/index.mjs +3 -3
  9. package/dist/{api-ayIQ7rIe.mjs → api-CLwG_3dh.mjs} +523 -59
  10. package/dist/api-CLwG_3dh.mjs.map +1 -0
  11. package/dist/{api-tokens-eYymBhIT.mjs → api-tokens-ucpcNXDt.mjs} +2 -2
  12. package/dist/{api-tokens-eYymBhIT.mjs.map → api-tokens-ucpcNXDt.mjs.map} +1 -1
  13. package/dist/{apply-v4DBgjPw.mjs → apply-wJhM_bwU.mjs} +17 -17
  14. package/dist/{apply-v4DBgjPw.mjs.map → apply-wJhM_bwU.mjs.map} +1 -1
  15. package/dist/astro/index.d.mts +10 -10
  16. package/dist/astro/index.mjs +21 -5
  17. package/dist/astro/index.mjs.map +1 -1
  18. package/dist/astro/middleware/auth.d.mts +9 -9
  19. package/dist/astro/middleware/auth.mjs +6 -6
  20. package/dist/astro/middleware/auth.mjs.map +1 -1
  21. package/dist/astro/middleware/redirect.mjs +4 -4
  22. package/dist/astro/middleware/request-context.mjs +2 -2
  23. package/dist/astro/middleware/request-context.mjs.map +1 -1
  24. package/dist/astro/middleware/setup.mjs +1 -1
  25. package/dist/astro/middleware.d.mts.map +1 -1
  26. package/dist/astro/middleware.mjs +353 -71
  27. package/dist/astro/middleware.mjs.map +1 -1
  28. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +5 -5
  29. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +5 -5
  30. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  31. package/dist/astro/routes/api/admin/api-tokens/index.mjs +5 -5
  32. package/dist/astro/routes/api/admin/bylines/_id_/index.d.mts.map +1 -1
  33. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -17
  34. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
  35. package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts +9 -0
  36. package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts.map +1 -0
  37. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +70 -0
  38. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -0
  39. package/dist/astro/routes/api/admin/bylines/index.d.mts.map +1 -1
  40. package/dist/astro/routes/api/admin/bylines/index.mjs +25 -16
  41. package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
  42. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +10 -10
  43. package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
  44. package/dist/astro/routes/api/admin/comments/bulk.mjs +8 -8
  45. package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
  46. package/dist/astro/routes/api/admin/comments/index.mjs +8 -8
  47. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
  48. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  49. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
  50. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
  51. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +32 -31
  52. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
  53. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +32 -31
  54. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
  55. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +31 -30
  56. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
  57. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +31 -30
  58. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
  59. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +33 -31
  60. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
  61. package/dist/astro/routes/api/admin/plugins/index.mjs +31 -30
  62. package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
  63. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
  64. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +31 -30
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
  66. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +33 -31
  67. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
  68. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +31 -30
  69. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
  70. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts +8 -0
  71. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts.map +1 -0
  72. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +59 -0
  73. package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -0
  74. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts +8 -0
  75. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -0
  76. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +72 -0
  77. package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -0
  78. package/dist/astro/routes/api/admin/plugins/registry/install.mjs +31 -30
  79. package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
  80. package/dist/astro/routes/api/admin/plugins/updates.d.mts.map +1 -1
  81. package/dist/astro/routes/api/admin/plugins/updates.mjs +44 -31
  82. package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
  83. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +31 -30
  84. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
  85. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +3 -3
  86. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +31 -30
  87. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
  88. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
  89. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  90. package/dist/astro/routes/api/admin/users/_id_/index.mjs +5 -5
  91. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
  92. package/dist/astro/routes/api/admin/users/index.mjs +5 -5
  93. package/dist/astro/routes/api/auth/dev-bypass.mjs +5 -5
  94. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  95. package/dist/astro/routes/api/auth/invite/complete.mjs +9 -9
  96. package/dist/astro/routes/api/auth/invite/index.mjs +6 -6
  97. package/dist/astro/routes/api/auth/invite/register-options.mjs +8 -8
  98. package/dist/astro/routes/api/auth/logout.mjs +3 -3
  99. package/dist/astro/routes/api/auth/magic-link/send.mjs +8 -8
  100. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  101. package/dist/astro/routes/api/auth/me.mjs +5 -5
  102. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  103. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  104. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs.map +1 -1
  105. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  106. package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -1
  107. package/dist/astro/routes/api/auth/passkey/_id_.mjs +5 -5
  108. package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
  109. package/dist/astro/routes/api/auth/passkey/options.mjs +10 -10
  110. package/dist/astro/routes/api/auth/passkey/register/options.mjs +8 -8
  111. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +9 -9
  112. package/dist/astro/routes/api/auth/passkey/verify.mjs +9 -9
  113. package/dist/astro/routes/api/auth/signup/complete.mjs +9 -9
  114. package/dist/astro/routes/api/auth/signup/request.mjs +8 -8
  115. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  116. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +11 -11
  117. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
  118. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +3 -3
  119. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
  120. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
  121. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
  122. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
  123. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +9 -9
  124. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +6 -6
  125. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
  126. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
  127. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
  128. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
  129. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +6 -6
  130. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
  131. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +10 -9
  132. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
  133. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
  134. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
  135. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +3 -3
  136. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
  137. package/dist/astro/routes/api/content/_collection_/_id_.mjs +6 -6
  138. package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
  139. package/dist/astro/routes/api/content/_collection_/index.mjs +6 -6
  140. package/dist/astro/routes/api/content/_collection_/trash.mjs +6 -6
  141. package/dist/astro/routes/api/dashboard.mjs +7 -7
  142. package/dist/astro/routes/api/dev/emails.mjs +3 -3
  143. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  144. package/dist/astro/routes/api/import/probe.mjs +10 -10
  145. package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
  146. package/dist/astro/routes/api/import/wordpress/execute.d.mts +9 -9
  147. package/dist/astro/routes/api/import/wordpress/execute.mjs +9 -8
  148. package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
  149. package/dist/astro/routes/api/import/wordpress/media.mjs +8 -8
  150. package/dist/astro/routes/api/import/wordpress/prepare.mjs +8 -8
  151. package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
  152. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +7 -7
  153. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
  154. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  155. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +10 -10
  156. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +1 -1
  157. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +11 -11
  158. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
  159. package/dist/astro/routes/api/manifest.mjs +4 -4
  160. package/dist/astro/routes/api/mcp.mjs +29 -29
  161. package/dist/astro/routes/api/mcp.mjs.map +1 -1
  162. package/dist/astro/routes/api/media/_id_/confirm.mjs +6 -6
  163. package/dist/astro/routes/api/media/_id_.mjs +6 -6
  164. package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
  165. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
  166. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
  167. package/dist/astro/routes/api/media/providers/index.mjs +3 -3
  168. package/dist/astro/routes/api/media/upload-url.mjs +7 -7
  169. package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
  170. package/dist/astro/routes/api/media.mjs +8 -8
  171. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +7 -7
  172. package/dist/astro/routes/api/menus/_name_/items.mjs +7 -7
  173. package/dist/astro/routes/api/menus/_name_/reorder.mjs +7 -7
  174. package/dist/astro/routes/api/menus/_name_/translations.mjs +7 -7
  175. package/dist/astro/routes/api/menus/_name_.mjs +7 -7
  176. package/dist/astro/routes/api/menus/index.mjs +7 -7
  177. package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
  178. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  179. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  180. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  181. package/dist/astro/routes/api/oauth/register.mjs +3 -3
  182. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  183. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  184. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  185. package/dist/astro/routes/api/openapi.json.mjs +3 -3
  186. package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
  187. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
  188. package/dist/astro/routes/api/redirects/404s/index.mjs +8 -8
  189. package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
  190. package/dist/astro/routes/api/redirects/404s/summary.mjs +8 -8
  191. package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
  192. package/dist/astro/routes/api/redirects/_id_.mjs +9 -9
  193. package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
  194. package/dist/astro/routes/api/redirects/index.mjs +9 -9
  195. package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
  196. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
  197. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
  198. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +31 -30
  199. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
  200. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +31 -30
  201. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
  202. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +31 -30
  203. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
  204. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +31 -30
  205. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
  206. package/dist/astro/routes/api/schema/collections/index.mjs +31 -30
  207. package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
  208. package/dist/astro/routes/api/schema/index.mjs +6 -6
  209. package/dist/astro/routes/api/schema/index.mjs.map +1 -1
  210. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +31 -30
  211. package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
  212. package/dist/astro/routes/api/schema/orphans/index.mjs +31 -30
  213. package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
  214. package/dist/astro/routes/api/search/enable.mjs +9 -9
  215. package/dist/astro/routes/api/search/index.mjs +8 -8
  216. package/dist/astro/routes/api/search/rebuild.mjs +9 -9
  217. package/dist/astro/routes/api/search/stats.mjs +6 -6
  218. package/dist/astro/routes/api/search/suggest.mjs +8 -8
  219. package/dist/astro/routes/api/sections/_slug_.mjs +8 -8
  220. package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
  221. package/dist/astro/routes/api/sections/index.mjs +8 -8
  222. package/dist/astro/routes/api/sections/index.mjs.map +1 -1
  223. package/dist/astro/routes/api/settings/email.mjs +4 -4
  224. package/dist/astro/routes/api/settings.mjs +10 -10
  225. package/dist/astro/routes/api/setup/admin-verify.mjs +10 -10
  226. package/dist/astro/routes/api/setup/admin.mjs +9 -9
  227. package/dist/astro/routes/api/setup/dev-bypass.mjs +22 -22
  228. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  229. package/dist/astro/routes/api/setup/index.mjs +22 -22
  230. package/dist/astro/routes/api/setup/status.mjs +4 -4
  231. package/dist/astro/routes/api/snapshot.mjs +5 -5
  232. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +11 -10
  233. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
  234. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +11 -10
  235. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
  236. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +11 -10
  237. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
  238. package/dist/astro/routes/api/taxonomies/index.mjs +11 -10
  239. package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
  240. package/dist/astro/routes/api/themes/preview.mjs +5 -5
  241. package/dist/astro/routes/api/typegen.mjs +5 -5
  242. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  243. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
  244. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
  245. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +6 -6
  246. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +8 -8
  247. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +8 -8
  248. package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
  249. package/dist/astro/routes/api/widget-areas/index.mjs +8 -8
  250. package/dist/astro/routes/api/widget-components.mjs +3 -3
  251. package/dist/astro/routes/robots.txt.mjs +5 -5
  252. package/dist/astro/routes/sitemap-_collection_.xml.mjs +4 -4
  253. package/dist/astro/routes/sitemap.xml.mjs +5 -5
  254. package/dist/astro/types.d.mts +13 -12
  255. package/dist/astro/types.d.mts.map +1 -1
  256. package/dist/auth/providers/github.d.mts +1 -1
  257. package/dist/auth/providers/google.d.mts +1 -1
  258. package/dist/{authorize-BlyCH-96.mjs → authorize-Bkwe8kuL.mjs} +2 -2
  259. package/dist/{authorize-BlyCH-96.mjs.map → authorize-Bkwe8kuL.mjs.map} +1 -1
  260. package/dist/byline-CTaWkMh5.mjs +404 -0
  261. package/dist/byline-CTaWkMh5.mjs.map +1 -0
  262. package/dist/bylines-BYHWU3T7.mjs +174 -0
  263. package/dist/bylines-BYHWU3T7.mjs.map +1 -0
  264. package/dist/{bylines-C6eYUWlZ.d.mts → bylines-DtDRNF1n.d.mts} +63 -18
  265. package/dist/bylines-DtDRNF1n.d.mts.map +1 -0
  266. package/dist/bylines-H0Xh5TMy.mjs +118 -0
  267. package/dist/bylines-H0Xh5TMy.mjs.map +1 -0
  268. package/dist/{cache-CXCpjWiL.mjs → cache-CNk1jIxp.mjs} +2 -2
  269. package/dist/{cache-CXCpjWiL.mjs.map → cache-CNk1jIxp.mjs.map} +1 -1
  270. package/dist/{challenge-store-CJ0OOHOr.mjs → challenge-store-Dng1SxKT.mjs} +1 -1
  271. package/dist/{challenge-store-CJ0OOHOr.mjs.map → challenge-store-Dng1SxKT.mjs.map} +1 -1
  272. package/dist/{chunks-DyGtu1Bv.mjs → chunks-BkfVdD-3.mjs} +2 -2
  273. package/dist/{chunks-DyGtu1Bv.mjs.map → chunks-BkfVdD-3.mjs.map} +1 -1
  274. package/dist/cli/index.mjs +21 -29
  275. package/dist/cli/index.mjs.map +1 -1
  276. package/dist/client/cf-access.d.mts +1 -1
  277. package/dist/client/index.d.mts +1 -1
  278. package/dist/client/index.mjs +1 -1
  279. package/dist/client/index.mjs.map +1 -1
  280. package/dist/{comment-Dd9MI82-.mjs → comment-_yzlBYPx.mjs} +2 -2
  281. package/dist/{comment-Dd9MI82-.mjs.map → comment-_yzlBYPx.mjs.map} +1 -1
  282. package/dist/{comments-koGI0FrK.mjs → comments-DxID-rsd.mjs} +3 -3
  283. package/dist/{comments-koGI0FrK.mjs.map → comments-DxID-rsd.mjs.map} +1 -1
  284. package/dist/{components-mZem7pbe.mjs → components-Dx3DM0gg.mjs} +1 -1
  285. package/dist/{components-mZem7pbe.mjs.map → components-Dx3DM0gg.mjs.map} +1 -1
  286. package/dist/config-CVssduLe.mjs.map +1 -1
  287. package/dist/{content-D6YG26WG.mjs → content-C0ooIs-f.mjs} +3 -3
  288. package/dist/{content-D6YG26WG.mjs.map → content-C0ooIs-f.mjs.map} +1 -1
  289. package/dist/{context-qF8d3IPR.mjs → context-sAnCaUIR.mjs} +10 -10
  290. package/dist/context-sAnCaUIR.mjs.map +1 -0
  291. package/dist/{cron-H8eJ46dv.mjs → cron-Bd3b3iuj.mjs} +1 -1
  292. package/dist/{cron-H8eJ46dv.mjs.map → cron-Bd3b3iuj.mjs.map} +1 -1
  293. package/dist/{dashboard-BmWSIUwY.mjs → dashboard-Cqw3ay2X.mjs} +4 -4
  294. package/dist/{dashboard-BmWSIUwY.mjs.map → dashboard-Cqw3ay2X.mjs.map} +1 -1
  295. package/dist/db/index.d.mts +3 -3
  296. package/dist/db/index.mjs +1 -1
  297. package/dist/db/libsql.d.mts +1 -1
  298. package/dist/db/postgres.d.mts +1 -1
  299. package/dist/db/sqlite.d.mts +1 -1
  300. package/dist/{default-Dbs22Gg4.mjs → default-BvTAYCzx.mjs} +1 -1
  301. package/dist/{default-Dbs22Gg4.mjs.map → default-BvTAYCzx.mjs.map} +1 -1
  302. package/dist/{device-flow-BqJRxa0Q.mjs → device-flow-B9oG8PwP.mjs} +4 -4
  303. package/dist/{device-flow-BqJRxa0Q.mjs.map → device-flow-B9oG8PwP.mjs.map} +1 -1
  304. package/dist/{email-console-Dmp5Q-P2.mjs → email-console-CubRll9q.mjs} +1 -1
  305. package/dist/email-console-CubRll9q.mjs.map +1 -0
  306. package/dist/{error-tSQWIl5U.mjs → error-CPh_8eLq.mjs} +16 -8
  307. package/dist/error-CPh_8eLq.mjs.map +1 -0
  308. package/dist/{escape-B8bdIryO.mjs → escape-Cg6kMELH.mjs} +1 -1
  309. package/dist/{escape-B8bdIryO.mjs.map → escape-Cg6kMELH.mjs.map} +1 -1
  310. package/dist/{fts-manager-B633C-kQ.mjs → fts-manager-Mnrtn-r2.mjs} +2 -2
  311. package/dist/{fts-manager-B633C-kQ.mjs.map → fts-manager-Mnrtn-r2.mjs.map} +1 -1
  312. package/dist/{import-CNfLOgDE.mjs → import-DG80rC_I.mjs} +3 -3
  313. package/dist/{import-CNfLOgDE.mjs.map → import-DG80rC_I.mjs.map} +1 -1
  314. package/dist/{index-UmOMt9T-.d.mts → index-Bv1Wf1zB.d.mts} +235 -18
  315. package/dist/index-Bv1Wf1zB.d.mts.map +1 -0
  316. package/dist/{index-D2gvztOP.d.mts → index-CC42STEm.d.mts} +3 -3
  317. package/dist/{index-D2gvztOP.d.mts.map → index-CC42STEm.d.mts.map} +1 -1
  318. package/dist/index.d.mts +17 -17
  319. package/dist/index.mjs +50 -49
  320. package/dist/{load-QzYRpVN3.mjs → load-DmXNVhst.mjs} +2 -2
  321. package/dist/{load-QzYRpVN3.mjs.map → load-DmXNVhst.mjs.map} +1 -1
  322. package/dist/{loader-Cs6-Bqe6.mjs → loader-Chm5h7Gr.mjs} +3 -3
  323. package/dist/loader-Chm5h7Gr.mjs.map +1 -0
  324. package/dist/{manifest-schema-HCtSh4Jq.mjs → manifest-schema-Czqf0TLu.mjs} +1 -1
  325. package/dist/{manifest-schema-HCtSh4Jq.mjs.map → manifest-schema-Czqf0TLu.mjs.map} +1 -1
  326. package/dist/media/index.d.mts +1 -1
  327. package/dist/media/local-runtime.d.mts +11 -11
  328. package/dist/media/local-runtime.mjs +4 -4
  329. package/dist/{media-allowlist-B8EX01DH.mjs → media-allowlist-BNloC69x.mjs} +1 -1
  330. package/dist/{media-allowlist-B8EX01DH.mjs.map → media-allowlist-BNloC69x.mjs.map} +1 -1
  331. package/dist/{media-Dg7he9uK.mjs → media-oqRcNiQf.mjs} +2 -2
  332. package/dist/media-oqRcNiQf.mjs.map +1 -0
  333. package/dist/{menus-DOzIecHi.mjs → menus-Bjf5R1Qq.mjs} +2 -2
  334. package/dist/menus-Bjf5R1Qq.mjs.map +1 -0
  335. package/dist/{menus-X4Z-eBA1.mjs → menus-C75SSmRy.mjs} +30 -11
  336. package/dist/menus-C75SSmRy.mjs.map +1 -0
  337. package/dist/mime-KV5TqkMN.mjs.map +1 -1
  338. package/dist/{mode-DPRPvJYm.mjs → mode-CaaiebZI.mjs} +1 -1
  339. package/dist/{mode-DPRPvJYm.mjs.map → mode-CaaiebZI.mjs.map} +1 -1
  340. package/dist/{oauth-authorization-62GmpGIH.mjs → oauth-authorization-CTMeVfvj.mjs} +4 -4
  341. package/dist/{oauth-authorization-62GmpGIH.mjs.map → oauth-authorization-CTMeVfvj.mjs.map} +1 -1
  342. package/dist/{oauth-clients-D_B0_-Bz.mjs → oauth-clients-eJCbkVSG.mjs} +1 -1
  343. package/dist/oauth-clients-eJCbkVSG.mjs.map +1 -0
  344. package/dist/{oauth-state-store-DpsZViTu.mjs → oauth-state-store-vOSdOeGe.mjs} +1 -1
  345. package/dist/{oauth-state-store-DpsZViTu.mjs.map → oauth-state-store-vOSdOeGe.mjs.map} +1 -1
  346. package/dist/{oauth-user-lookup-meyS2oB1.mjs → oauth-user-lookup-3JwsVw6N.mjs} +1 -1
  347. package/dist/{oauth-user-lookup-meyS2oB1.mjs.map → oauth-user-lookup-3JwsVw6N.mjs.map} +1 -1
  348. package/dist/options-BL4X94qY.mjs.map +1 -1
  349. package/dist/{options-Cq64Wx0O.d.mts → options-DhV-gwJb.d.mts} +4 -4
  350. package/dist/options-DhV-gwJb.d.mts.map +1 -0
  351. package/dist/page/index.d.mts +2 -2
  352. package/dist/{parse-BFTPon-J.mjs → parse-3-caTKgt.mjs} +2 -2
  353. package/dist/{parse-BFTPon-J.mjs.map → parse-3-caTKgt.mjs.map} +1 -1
  354. package/dist/{passkey-config-Cg86_ISa.mjs → passkey-config-BloQOT3y.mjs} +1 -1
  355. package/dist/{passkey-config-Cg86_ISa.mjs.map → passkey-config-BloQOT3y.mjs.map} +1 -1
  356. package/dist/{placeholder-D3cFCU9y.d.mts → placeholder-KCkkCtgQ.d.mts} +1 -1
  357. package/dist/{placeholder-D3cFCU9y.d.mts.map → placeholder-KCkkCtgQ.d.mts.map} +1 -1
  358. package/dist/plugin-types.d.mts +1 -1
  359. package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
  360. package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
  361. package/dist/plugins/adapt-sandbox-entry.mjs +26 -15
  362. package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
  363. package/dist/{preview-C1LOEbWZ.mjs → preview-D4z0WONU.mjs} +2 -2
  364. package/dist/{preview-C1LOEbWZ.mjs.map → preview-D4z0WONU.mjs.map} +1 -1
  365. package/dist/{public-url-CseXl9Fv.mjs → public-url-CUWWFME2.mjs} +1 -1
  366. package/dist/{public-url-CseXl9Fv.mjs.map → public-url-CUWWFME2.mjs.map} +1 -1
  367. package/dist/{query-axZmO6Tn.mjs → query-BJn8TOPk.mjs} +16 -13
  368. package/dist/{query-axZmO6Tn.mjs.map → query-BJn8TOPk.mjs.map} +1 -1
  369. package/dist/{rate-limit-t5CVjCO6.mjs → rate-limit-D_-gAeJ0.mjs} +2 -2
  370. package/dist/{rate-limit-t5CVjCO6.mjs.map → rate-limit-D_-gAeJ0.mjs.map} +1 -1
  371. package/dist/{redirect-DGRsLO2I.mjs → redirect-BINiRYq4.mjs} +1 -1
  372. package/dist/{redirect-DGRsLO2I.mjs.map → redirect-BINiRYq4.mjs.map} +1 -1
  373. package/dist/{redirect-DkaDxq8e.mjs → redirect-CNv4mHX2.mjs} +2 -2
  374. package/dist/{redirect-DkaDxq8e.mjs.map → redirect-CNv4mHX2.mjs.map} +1 -1
  375. package/dist/{redirects-D1fdd68T.mjs → redirects-B-CUZ1Xh.mjs} +3 -3
  376. package/dist/{redirects-D1fdd68T.mjs.map → redirects-B-CUZ1Xh.mjs.map} +1 -1
  377. package/dist/{redirects-Dmj6KRU3.mjs → redirects-COMLwsV5.mjs} +19 -5
  378. package/dist/redirects-COMLwsV5.mjs.map +1 -0
  379. package/dist/{registry-BnCeHYsf.mjs → registry-DqrAQDXH.mjs} +4 -4
  380. package/dist/{registry-BnCeHYsf.mjs.map → registry-DqrAQDXH.mjs.map} +1 -1
  381. package/dist/request-cache-dzCt8TZB.mjs.map +1 -1
  382. package/dist/request-context.mjs.map +1 -1
  383. package/dist/{request-meta-CLCwSQOS.mjs → request-meta-C_Cjii-T.mjs} +2 -2
  384. package/dist/{request-meta-CLCwSQOS.mjs.map → request-meta-C_Cjii-T.mjs.map} +1 -1
  385. package/dist/resolve-Cj98DuqN.mjs +39 -0
  386. package/dist/resolve-Cj98DuqN.mjs.map +1 -0
  387. package/dist/{runner-DdnQIwz_.mjs → runner-CGlojznK.mjs} +472 -165
  388. package/dist/runner-CGlojznK.mjs.map +1 -0
  389. package/dist/{runner-DcfZewkO.d.mts → runner-CNHRo1mT.d.mts} +2 -2
  390. package/dist/{runner-DcfZewkO.d.mts.map → runner-CNHRo1mT.d.mts.map} +1 -1
  391. package/dist/runtime.d.mts +10 -10
  392. package/dist/runtime.mjs +2 -2
  393. package/dist/{schema-BmqagCwG.mjs → schema-Djdlfi5G.mjs} +4 -4
  394. package/dist/{schema-BmqagCwG.mjs.map → schema-Djdlfi5G.mjs.map} +1 -1
  395. package/dist/{search-CPrvO5u8.mjs → search-By-NN3da.mjs} +4 -4
  396. package/dist/{search-CPrvO5u8.mjs.map → search-By-NN3da.mjs.map} +1 -1
  397. package/dist/{secrets-6pgZyq0K.mjs → secrets-rPdhEBkD.mjs} +1 -1
  398. package/dist/{secrets-6pgZyq0K.mjs.map → secrets-rPdhEBkD.mjs.map} +1 -1
  399. package/dist/{sections-Cm-zb-gZ.mjs → sections-DcBIlOq1.mjs} +3 -3
  400. package/dist/{sections-Cm-zb-gZ.mjs.map → sections-DcBIlOq1.mjs.map} +1 -1
  401. package/dist/seed/index.d.mts +2 -2
  402. package/dist/seed/index.mjs +16 -16
  403. package/dist/seo/index.d.mts +1 -1
  404. package/dist/{seo-DRq9-EPP.mjs → seo-bjDoq9Eg.mjs} +2 -2
  405. package/dist/{seo-DRq9-EPP.mjs.map → seo-bjDoq9Eg.mjs.map} +1 -1
  406. package/dist/{service-vByySp-2.mjs → service-BuuTdGAT.mjs} +3 -3
  407. package/dist/{service-vByySp-2.mjs.map → service-BuuTdGAT.mjs.map} +1 -1
  408. package/dist/{settings-CBBj7HUd.mjs → settings-CJnKiWuR.mjs} +3 -3
  409. package/dist/{settings-CBBj7HUd.mjs.map → settings-CJnKiWuR.mjs.map} +1 -1
  410. package/dist/{settings-xQKsWnzQ.mjs → settings-hcubRfkr.mjs} +3 -3
  411. package/dist/settings-hcubRfkr.mjs.map +1 -0
  412. package/dist/{setup-BGAJ2uXs.mjs → setup-Cf_TyOv5.mjs} +2 -2
  413. package/dist/{setup-BGAJ2uXs.mjs.map → setup-Cf_TyOv5.mjs.map} +1 -1
  414. package/dist/{setup-complete-C6ZCLhKo.mjs → setup-complete-MzzN9u0b.mjs} +1 -1
  415. package/dist/{setup-complete-C6ZCLhKo.mjs.map → setup-complete-MzzN9u0b.mjs.map} +1 -1
  416. package/dist/{setup-nonce-CY1gQiAU.mjs → setup-nonce-DXuriHsg.mjs} +1 -1
  417. package/dist/{setup-nonce-CY1gQiAU.mjs.map → setup-nonce-DXuriHsg.mjs.map} +1 -1
  418. package/dist/{site-url-D-M4Fd8O.mjs → site-url-xkhw1tcz.mjs} +1 -1
  419. package/dist/{site-url-D-M4Fd8O.mjs.map → site-url-xkhw1tcz.mjs.map} +1 -1
  420. package/dist/{ssrf-DzFN_qV-.mjs → ssrf-MZ-zrG6-.mjs} +1 -1
  421. package/dist/{ssrf-DzFN_qV-.mjs.map → ssrf-MZ-zrG6-.mjs.map} +1 -1
  422. package/dist/storage/local.d.mts +1 -1
  423. package/dist/storage/local.mjs +1 -1
  424. package/dist/storage/local.mjs.map +1 -1
  425. package/dist/storage/s3.d.mts +1 -1
  426. package/dist/storage/s3.mjs +1 -1
  427. package/dist/storage/s3.mjs.map +1 -1
  428. package/dist/{taxonomies-Dc0mzlms.mjs → taxonomies-CLs9HPE2.mjs} +4 -4
  429. package/dist/{taxonomies-Dc0mzlms.mjs.map → taxonomies-CLs9HPE2.mjs.map} +1 -1
  430. package/dist/{taxonomies-Cn9UpaR2.mjs → taxonomies-WamPVA2x.mjs} +7 -42
  431. package/dist/taxonomies-WamPVA2x.mjs.map +1 -0
  432. package/dist/{taxonomy-wPfusMK9.mjs → taxonomy-D4Uc2LsZ.mjs} +3 -3
  433. package/dist/{taxonomy-wPfusMK9.mjs.map → taxonomy-D4Uc2LsZ.mjs.map} +1 -1
  434. package/dist/{tokens-DILYNZMi.mjs → tokens-N8otWMmj.mjs} +1 -1
  435. package/dist/{tokens-DILYNZMi.mjs.map → tokens-N8otWMmj.mjs.map} +1 -1
  436. package/dist/{transport-fw-mKJzT.mjs → transport-B6CHddbu.mjs} +1 -1
  437. package/dist/{transport-fw-mKJzT.mjs.map → transport-B6CHddbu.mjs.map} +1 -1
  438. package/dist/{transport-GeXlLscf.d.mts → transport-DOxLfUir.d.mts} +1 -1
  439. package/dist/{transport-GeXlLscf.d.mts.map → transport-DOxLfUir.d.mts.map} +1 -1
  440. package/dist/{trusted-proxy-CJhQIk65.mjs → trusted-proxy-97pajC2f.mjs} +1 -1
  441. package/dist/{trusted-proxy-CJhQIk65.mjs.map → trusted-proxy-97pajC2f.mjs.map} +1 -1
  442. package/dist/{types-CwXMEPRr.mjs → types-ByV5sgsv.mjs} +2 -2
  443. package/dist/types-ByV5sgsv.mjs.map +1 -0
  444. package/dist/{types-Dz9CGX_d.mjs → types-Cd9UCu3t.mjs} +1 -1
  445. package/dist/{types-Dz9CGX_d.mjs.map → types-Cd9UCu3t.mjs.map} +1 -1
  446. package/dist/{types-DmxPPXGf.d.mts → types-CkDSF81F.d.mts} +1 -1
  447. package/dist/{types-DmxPPXGf.d.mts.map → types-CkDSF81F.d.mts.map} +1 -1
  448. package/dist/{types-BWhaSS7U.d.mts → types-CpUuGcd5.d.mts} +1 -1
  449. package/dist/{types-BWhaSS7U.d.mts.map → types-CpUuGcd5.d.mts.map} +1 -1
  450. package/dist/{types-DFowNO60.d.mts → types-D599-ruj.d.mts} +1 -1
  451. package/dist/{types-DFowNO60.d.mts.map → types-D599-ruj.d.mts.map} +1 -1
  452. package/dist/{types-B05e2naf.d.mts → types-DGHWRQgr.d.mts} +3 -3
  453. package/dist/{types-B05e2naf.d.mts.map → types-DGHWRQgr.d.mts.map} +1 -1
  454. package/dist/{types-CzvJd1ND.d.mts → types-DaYDYW6g.d.mts} +14 -1
  455. package/dist/types-DaYDYW6g.d.mts.map +1 -0
  456. package/dist/{types-C1KKK4VP.d.mts → types-DaqNzqVt.d.mts} +16 -1
  457. package/dist/{types-C1KKK4VP.d.mts.map → types-DaqNzqVt.d.mts.map} +1 -1
  458. package/dist/{types-DW1l0gCv.d.mts → types-Dgo6y-Ut.d.mts} +1 -1
  459. package/dist/{types-DW1l0gCv.d.mts.map → types-Dgo6y-Ut.d.mts.map} +1 -1
  460. package/dist/{types-Cb2UCDJg.d.mts → types-bYmRn_Uy.d.mts} +1 -1
  461. package/dist/{types-Cb2UCDJg.d.mts.map → types-bYmRn_Uy.d.mts.map} +1 -1
  462. package/dist/{user-Dr1bOCqS.mjs → user-D3BD5zdT.mjs} +2 -2
  463. package/dist/{user-Dr1bOCqS.mjs.map → user-D3BD5zdT.mjs.map} +1 -1
  464. package/dist/{utils-_F-rWBTN.mjs → utils-C3wTAP-P.mjs} +1 -1
  465. package/dist/{utils-_F-rWBTN.mjs.map → utils-C3wTAP-P.mjs.map} +1 -1
  466. package/dist/{validate-BpQGsmd7.d.mts → validate-DQtHw9NT.d.mts} +5 -5
  467. package/dist/{validate-BpQGsmd7.d.mts.map → validate-DQtHw9NT.d.mts.map} +1 -1
  468. package/dist/{validate-DlFxcVVK.mjs → validate-mz87i8_1.mjs} +2 -2
  469. package/dist/{validate-DlFxcVVK.mjs.map → validate-mz87i8_1.mjs.map} +1 -1
  470. package/dist/{validation-BiFJqUp5.mjs → validation-DKHhXjPr.mjs} +5 -5
  471. package/dist/{validation-BiFJqUp5.mjs.map → validation-DKHhXjPr.mjs.map} +1 -1
  472. package/dist/version-Ct7C6RSo.mjs +7 -0
  473. package/dist/{version-Dw7Z5PVU.mjs.map → version-Ct7C6RSo.mjs.map} +1 -1
  474. package/dist/{widgets-B9j_yzlk.mjs → widgets-lShIQXU5.mjs} +3 -3
  475. package/dist/widgets-lShIQXU5.mjs.map +1 -0
  476. package/dist/{zod-generator-DSyz01KE.mjs → zod-generator-dvxgmd1M.mjs} +2 -2
  477. package/dist/{zod-generator-DSyz01KE.mjs.map → zod-generator-dvxgmd1M.mjs.map} +1 -1
  478. package/package.json +10 -8
  479. package/src/api/error.ts +18 -3
  480. package/src/api/errors.ts +6 -0
  481. package/src/api/handlers/bylines.ts +161 -0
  482. package/src/api/handlers/content.ts +125 -43
  483. package/src/api/handlers/index.ts +6 -0
  484. package/src/api/handlers/marketplace.ts +27 -5
  485. package/src/api/handlers/oauth-clients.ts +1 -1
  486. package/src/api/handlers/registry.ts +568 -22
  487. package/src/api/openapi/document.ts +1 -1
  488. package/src/api/schemas/bylines.ts +46 -0
  489. package/src/astro/integration/index.ts +1 -1
  490. package/src/astro/integration/routes.ts +5 -0
  491. package/src/astro/integration/runtime.ts +12 -1
  492. package/src/astro/integration/virtual-modules.ts +19 -2
  493. package/src/astro/integration/vite-config.ts +2 -2
  494. package/src/astro/middleware/auth.ts +7 -7
  495. package/src/astro/middleware/request-context.ts +1 -1
  496. package/src/astro/middleware.ts +31 -20
  497. package/src/astro/routes/api/admin/bylines/[id]/index.ts +3 -12
  498. package/src/astro/routes/api/admin/bylines/[id]/translations.ts +99 -0
  499. package/src/astro/routes/api/admin/bylines/index.ts +22 -11
  500. package/src/astro/routes/api/admin/plugins/[id]/update.ts +1 -0
  501. package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +6 -1
  502. package/src/astro/routes/api/admin/plugins/registry/[id]/uninstall.ts +51 -0
  503. package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +79 -0
  504. package/src/astro/routes/api/admin/plugins/updates.ts +43 -6
  505. package/src/astro/routes/api/admin/themes/marketplace/index.ts +1 -1
  506. package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +2 -2
  507. package/src/astro/routes/api/auth/oauth/[provider].ts +2 -2
  508. package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +2 -2
  509. package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +2 -2
  510. package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -2
  511. package/src/astro/routes/api/content/[collection]/[id]/restore.ts +2 -2
  512. package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +2 -2
  513. package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +6 -6
  514. package/src/astro/routes/api/content/[collection]/[id]/translations.ts +1 -1
  515. package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +2 -2
  516. package/src/astro/routes/api/content/[collection]/[id].ts +6 -6
  517. package/src/astro/routes/api/import/wordpress/execute.ts +1 -1
  518. package/src/astro/routes/api/import/wordpress/prepare.ts +2 -2
  519. package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +3 -3
  520. package/src/astro/routes/api/import/wordpress-plugin/execute.ts +2 -2
  521. package/src/astro/routes/api/media/upload-url.ts +1 -1
  522. package/src/astro/routes/api/redirects/404s/index.ts +3 -3
  523. package/src/astro/routes/api/redirects/404s/summary.ts +1 -1
  524. package/src/astro/routes/api/redirects/[id].ts +3 -3
  525. package/src/astro/routes/api/redirects/index.ts +2 -2
  526. package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +4 -4
  527. package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +2 -6
  528. package/src/astro/routes/api/schema/collections/[slug]/fields/reorder.ts +1 -1
  529. package/src/astro/routes/api/schema/collections/[slug]/index.ts +6 -6
  530. package/src/astro/routes/api/schema/collections/index.ts +4 -4
  531. package/src/astro/routes/api/schema/index.ts +1 -1
  532. package/src/astro/routes/api/schema/orphans/[slug].ts +1 -1
  533. package/src/astro/routes/api/schema/orphans/index.ts +1 -1
  534. package/src/astro/routes/api/sections/[slug].ts +3 -3
  535. package/src/astro/routes/api/sections/index.ts +2 -2
  536. package/src/astro/types.ts +4 -0
  537. package/src/auth/rate-limit.ts +1 -1
  538. package/src/auth/trusted-proxy.ts +1 -1
  539. package/src/bylines/index.ts +154 -55
  540. package/src/cli/commands/init.ts +4 -8
  541. package/src/client/index.ts +1 -1
  542. package/src/components/InlinePortableTextEditor.tsx +5 -1
  543. package/src/components/inline-code-block.tsx +343 -0
  544. package/src/config/secrets.ts +3 -3
  545. package/src/database/migrations/006_taxonomy_defs.ts +1 -1
  546. package/src/database/migrations/014_draft_revisions.ts +6 -6
  547. package/src/database/migrations/040_byline_i18n.ts +497 -0
  548. package/src/database/migrations/runner.ts +4 -1
  549. package/src/database/repositories/audit.ts +2 -2
  550. package/src/database/repositories/byline.ts +320 -50
  551. package/src/database/repositories/media.ts +2 -2
  552. package/src/database/repositories/menu.ts +1 -1
  553. package/src/database/repositories/options.ts +3 -3
  554. package/src/database/repositories/plugin-storage.ts +3 -3
  555. package/src/database/repositories/types.ts +13 -0
  556. package/src/database/types.ts +15 -0
  557. package/src/emdash-runtime.ts +492 -20
  558. package/src/i18n/config.ts +1 -1
  559. package/src/index.ts +7 -0
  560. package/src/loader.ts +1 -1
  561. package/src/mcp/server.ts +3 -3
  562. package/src/media/mime.ts +1 -1
  563. package/src/page/absolute-url.ts +1 -1
  564. package/src/plugins/adapt-sandbox-entry.ts +45 -40
  565. package/src/plugins/email-console.ts +1 -1
  566. package/src/plugins/index.ts +1 -0
  567. package/src/plugins/marketplace.ts +1 -1
  568. package/src/plugins/sandbox/index.ts +1 -0
  569. package/src/plugins/sandbox/noop.ts +11 -3
  570. package/src/plugins/sandbox/types.ts +28 -0
  571. package/src/query.ts +17 -2
  572. package/src/registry/config.ts +1 -1
  573. package/src/request-cache.ts +3 -3
  574. package/src/request-context.ts +1 -1
  575. package/src/settings/index.ts +4 -4
  576. package/src/storage/local.ts +1 -1
  577. package/src/storage/s3.ts +3 -3
  578. package/src/widgets/index.ts +1 -1
  579. package/dist/api-ayIQ7rIe.mjs.map +0 -1
  580. package/dist/byline-D09BaS4j.mjs +0 -220
  581. package/dist/byline-D09BaS4j.mjs.map +0 -1
  582. package/dist/bylines-BTM2xtP8.mjs +0 -113
  583. package/dist/bylines-BTM2xtP8.mjs.map +0 -1
  584. package/dist/bylines-C6eYUWlZ.d.mts.map +0 -1
  585. package/dist/context-qF8d3IPR.mjs.map +0 -1
  586. package/dist/email-console-Dmp5Q-P2.mjs.map +0 -1
  587. package/dist/error-tSQWIl5U.mjs.map +0 -1
  588. package/dist/index-UmOMt9T-.d.mts.map +0 -1
  589. package/dist/loader-Cs6-Bqe6.mjs.map +0 -1
  590. package/dist/media-Dg7he9uK.mjs.map +0 -1
  591. package/dist/menus-DOzIecHi.mjs.map +0 -1
  592. package/dist/menus-X4Z-eBA1.mjs.map +0 -1
  593. package/dist/oauth-clients-D_B0_-Bz.mjs.map +0 -1
  594. package/dist/options-Cq64Wx0O.d.mts.map +0 -1
  595. package/dist/redirects-Dmj6KRU3.mjs.map +0 -1
  596. package/dist/runner-DdnQIwz_.mjs.map +0 -1
  597. package/dist/settings-xQKsWnzQ.mjs.map +0 -1
  598. package/dist/taxonomies-Cn9UpaR2.mjs.map +0 -1
  599. package/dist/types-CwXMEPRr.mjs.map +0 -1
  600. package/dist/types-CzvJd1ND.d.mts.map +0 -1
  601. package/dist/version-Dw7Z5PVU.mjs +0 -7
  602. package/dist/widgets-B9j_yzlk.mjs.map +0 -1
  603. /package/dist/{api-tokens-D3C9v02m.mjs → api-tokens-iPIHAY8N.mjs} +0 -0
  604. /package/dist/{ssrf-CTul4uQi.mjs → ssrf-BIcd-aXW.mjs} +0 -0
  605. /package/dist/{types-Db67HHlU.mjs → types-1NNkmTIn.mjs} +0 -0
@@ -1,27 +1,28 @@
1
1
  import { r as validatePluginIdentifier, t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
2
- import { r as isI18nEnabled } from "./config-CVssduLe.mjs";
3
- import { r as RevisionRepository, t as ContentRepository } from "./content-D6YG26WG.mjs";
2
+ import { n as getI18nConfig, r as isI18nEnabled } from "./config-CVssduLe.mjs";
3
+ import { r as RevisionRepository, t as ContentRepository } from "./content-C0ooIs-f.mjs";
4
4
  import { r as encodeBase64, t as decodeBase64 } from "./base64-CqR-7kqF.mjs";
5
- import { n as InvalidCursorError, t as EmDashValidationError } from "./types-CwXMEPRr.mjs";
6
- import { t as MediaRepository } from "./media-Dg7he9uK.mjs";
7
- import { t as CommentRepository } from "./comment-Dd9MI82-.mjs";
5
+ import { n as InvalidCursorError, t as EmDashValidationError } from "./types-ByV5sgsv.mjs";
6
+ import { t as MediaRepository } from "./media-oqRcNiQf.mjs";
7
+ import { t as CommentRepository } from "./comment-_yzlBYPx.mjs";
8
8
  import { t as withTransaction } from "./transaction-NQj4VJ7Z.mjs";
9
- import { t as RedirectRepository } from "./redirect-DkaDxq8e.mjs";
10
- import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-DyGtu1Bv.mjs";
11
- import { t as BylineRepository } from "./byline-D09BaS4j.mjs";
12
- import { t as SeoRepository } from "./seo-DRq9-EPP.mjs";
13
- import { r as invalidateRedirectCache } from "./cache-CXCpjWiL.mjs";
9
+ import { t as RedirectRepository } from "./redirect-CNv4mHX2.mjs";
10
+ import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-BkfVdD-3.mjs";
11
+ import { t as BylineRepository } from "./byline-CTaWkMh5.mjs";
12
+ import { t as SeoRepository } from "./seo-bjDoq9Eg.mjs";
13
+ import { r as invalidateRedirectCache } from "./cache-CNk1jIxp.mjs";
14
14
  import { t as isMissingTableError } from "./db-errors-CGN9kJfo.mjs";
15
15
  import { r as parseAllowedMimeTypes, t as matchesMimeAllowlist } from "./mime-KV5TqkMN.mjs";
16
16
  import { n as requestCached } from "./request-cache-dzCt8TZB.mjs";
17
17
  import { n as hashString } from "./hash-DlUxGhQS.mjs";
18
- import { n as SchemaRegistry, t as SchemaError } from "./registry-BnCeHYsf.mjs";
19
- import { i as pluginManifestSchema, r as normalizeManifestRoute } from "./manifest-schema-HCtSh4Jq.mjs";
20
- import { r as normalizeCapabilities } from "./types-Db67HHlU.mjs";
21
- import { t as EmDashStorageError } from "./types-Dz9CGX_d.mjs";
22
- import { n as resolveAndValidateExternalUrl, t as SsrfError } from "./ssrf-DzFN_qV-.mjs";
18
+ import { n as SchemaRegistry, t as SchemaError } from "./registry-DqrAQDXH.mjs";
19
+ import { i as pluginManifestSchema, r as normalizeManifestRoute } from "./manifest-schema-Czqf0TLu.mjs";
20
+ import { r as normalizeCapabilities } from "./types-1NNkmTIn.mjs";
21
+ import { t as EmDashStorageError } from "./types-Cd9UCu3t.mjs";
22
+ import { n as resolveAndValidateExternalUrl, t as SsrfError } from "./ssrf-MZ-zrG6-.mjs";
23
23
  import { sql } from "kysely";
24
24
  import { createGzipDecoder, unpackTar } from "modern-tar";
25
+ import { ClientResponseError, ClientValidationError } from "@atcute/client";
25
26
 
26
27
  //#region src/api/rev.ts
27
28
  /**
@@ -195,7 +196,8 @@ async function hydrateSeoMany(db, collection, items, hasSeo) {
195
196
  }
196
197
  async function hydrateBylines(db, collection, item) {
197
198
  const bylineRepo = new BylineRepository(db);
198
- const bylines = await bylineRepo.getContentBylines(collection, item.id);
199
+ const localeOpt = item.locale ? { locale: item.locale } : void 0;
200
+ const bylines = await bylineRepo.getContentBylines(collection, item.id, localeOpt);
199
201
  if (bylines.length > 0) {
200
202
  item.bylines = bylines.map((c) => ({
201
203
  ...c,
@@ -204,9 +206,13 @@ async function hydrateBylines(db, collection, item) {
204
206
  item.byline = bylines[0]?.byline ?? null;
205
207
  return;
206
208
  }
207
- if (item.primaryBylineId) item.primaryBylineId = null;
209
+ if (item.primaryBylineId) {
210
+ item.bylines = [];
211
+ item.byline = null;
212
+ return;
213
+ }
208
214
  if (item.authorId) {
209
- const fallback = await bylineRepo.findByUserId(item.authorId);
215
+ const fallback = await bylineRepo.findByUserId(item.authorId, localeOpt);
210
216
  if (fallback) {
211
217
  item.bylines = [{
212
218
  byline: fallback,
@@ -223,18 +229,59 @@ async function hydrateBylines(db, collection, item) {
223
229
  }
224
230
  /**
225
231
  * Batch-hydrate bylines for multiple items using two bulk queries instead of N+1.
232
+ *
233
+ * Items may live at different locales (e.g. a list endpoint returning the
234
+ * translations of an entry). Group by `item.locale` and call the strict
235
+ * per-locale repo method once per group so each item resolves against its
236
+ * own locale's byline rows.
226
237
  */
227
238
  async function hydrateBylinesMany(db, collection, items) {
228
239
  if (items.length === 0) return;
229
240
  const bylineRepo = new BylineRepository(db);
230
- const contentIds = items.map((i) => i.id);
231
- const bylinesMap = await bylineRepo.getContentBylinesMany(collection, contentIds);
232
- const fallbackAuthorIds = [];
233
- for (const item of items) if (!bylinesMap.has(item.id) && item.authorId) fallbackAuthorIds.push(item.authorId);
234
- const uniqueAuthorIds = [...new Set(fallbackAuthorIds)];
235
- const authorBylineMap = await bylineRepo.findByUserIds(uniqueAuthorIds);
241
+ const localeBuckets = /* @__PURE__ */ new Map();
236
242
  for (const item of items) {
237
- const explicit = bylinesMap.get(item.id);
243
+ const key = item.locale ?? null;
244
+ const bucket = localeBuckets.get(key);
245
+ if (bucket) bucket.push(item);
246
+ else localeBuckets.set(key, [item]);
247
+ }
248
+ const bylinesByItem = /* @__PURE__ */ new Map();
249
+ const itemsNeedingAuthorCheck = [];
250
+ for (const [locale, bucket] of localeBuckets) {
251
+ const localeOpt = locale ? { locale } : void 0;
252
+ const ids = bucket.map((i) => i.id);
253
+ const credits = await bylineRepo.getContentBylinesMany(collection, ids, localeOpt);
254
+ for (const [id, list] of credits) bylinesByItem.set(id, list);
255
+ for (const item of bucket) {
256
+ if (credits.has(item.id) && credits.get(item.id).length > 0) continue;
257
+ if (item.authorId) itemsNeedingAuthorCheck.push(item);
258
+ }
259
+ }
260
+ const fallbackByItem = /* @__PURE__ */ new Map();
261
+ if (itemsNeedingAuthorCheck.length > 0) {
262
+ const authorBuckets = /* @__PURE__ */ new Map();
263
+ for (const item of itemsNeedingAuthorCheck) {
264
+ if (item.primaryBylineId) continue;
265
+ const key = item.locale ?? null;
266
+ const bucket = authorBuckets.get(key);
267
+ if (bucket) bucket.push(item);
268
+ else authorBuckets.set(key, [item]);
269
+ }
270
+ for (const [locale, bucket] of authorBuckets) {
271
+ const localeOpt = locale ? { locale } : void 0;
272
+ const authorIds = bucket.map((i) => i.authorId).filter((id) => id !== null);
273
+ const uniqueAuthorIds = [...new Set(authorIds)];
274
+ if (uniqueAuthorIds.length === 0) continue;
275
+ const authorMap = await bylineRepo.findByUserIds(uniqueAuthorIds, localeOpt);
276
+ for (const item of bucket) {
277
+ if (!item.authorId) continue;
278
+ const f = authorMap.get(item.authorId);
279
+ if (f) fallbackByItem.set(item.id, f);
280
+ }
281
+ }
282
+ }
283
+ for (const item of items) {
284
+ const explicit = bylinesByItem.get(item.id);
238
285
  if (explicit && explicit.length > 0) {
239
286
  item.bylines = explicit.map((c) => ({
240
287
  ...c,
@@ -243,19 +290,16 @@ async function hydrateBylinesMany(db, collection, items) {
243
290
  item.byline = explicit[0]?.byline ?? null;
244
291
  continue;
245
292
  }
246
- if (item.primaryBylineId) item.primaryBylineId = null;
247
- if (item.authorId) {
248
- const fallback = authorBylineMap.get(item.authorId);
249
- if (fallback) {
250
- item.bylines = [{
251
- byline: fallback,
252
- sortOrder: 0,
253
- roleLabel: null,
254
- source: "inferred"
255
- }];
256
- item.byline = fallback;
257
- continue;
258
- }
293
+ const fallback = fallbackByItem.get(item.id);
294
+ if (fallback) {
295
+ item.bylines = [{
296
+ byline: fallback,
297
+ sortOrder: 0,
298
+ roleLabel: null,
299
+ source: "inferred"
300
+ }];
301
+ item.byline = fallback;
302
+ continue;
259
303
  }
260
304
  item.bylines = [];
261
305
  item.byline = null;
@@ -426,10 +470,11 @@ async function handleContentCreate(db, collection, body) {
426
470
  const item = await withTransaction(db, async (trx) => {
427
471
  const repo = new ContentRepository(trx);
428
472
  const bylineRepo = new BylineRepository(trx);
473
+ const effectiveLocale = body.locale ?? getI18nConfig()?.defaultLocale;
429
474
  let slug = body.slug;
430
475
  if (!slug) {
431
476
  const slugSource = getSlugSource(body.data);
432
- if (slugSource) slug = await repo.generateUniqueSlug(collection, slugSource, body.locale);
477
+ if (slugSource) slug = await repo.generateUniqueSlug(collection, slugSource, effectiveLocale);
433
478
  }
434
479
  const created = await repo.create({
435
480
  type: collection,
@@ -437,20 +482,22 @@ async function handleContentCreate(db, collection, body) {
437
482
  data: body.data,
438
483
  status: body.status || "draft",
439
484
  authorId: body.authorId,
440
- locale: body.locale,
485
+ locale: effectiveLocale,
441
486
  translationOf: body.translationOf,
442
487
  createdAt: body.createdAt,
443
488
  publishedAt: body.publishedAt
444
489
  });
445
- if (body.bylines !== void 0) {
446
- await bylineRepo.setContentBylines(collection, created.id, body.bylines);
447
- created.primaryBylineId = body.bylines[0]?.bylineId ?? null;
448
- }
449
- await hydrateBylines(trx, collection, created);
490
+ if (body.bylines !== void 0) created.primaryBylineId = (await bylineRepo.setContentBylines(collection, created.id, body.bylines))[0]?.byline.translationGroup ?? null;
450
491
  if (body.translationOf) {
451
- const { TaxonomyRepository } = await import("./taxonomy-wPfusMK9.mjs").then((n) => n.n);
492
+ const { TaxonomyRepository } = await import("./taxonomy-D4Uc2LsZ.mjs").then((n) => n.n);
452
493
  await new TaxonomyRepository(trx).copyEntryTerms(collection, body.translationOf, created.id);
494
+ if (body.bylines === void 0) {
495
+ await bylineRepo.copyContentBylines(collection, body.translationOf, created.id);
496
+ const source = await repo.findById(collection, body.translationOf);
497
+ if (source) created.primaryBylineId = source.primaryBylineId;
498
+ }
453
499
  }
500
+ await hydrateBylines(trx, collection, created);
454
501
  if (body.seo && hasSeo) created.seo = await new SeoRepository(trx).upsert(collection, created.id, body.seo);
455
502
  else if (hasSeo) created.seo = { ...SEO_DEFAULTS };
456
503
  return created;
@@ -544,10 +591,7 @@ async function handleContentUpdate(db, collection, id, body) {
544
591
  authorId: body.authorId,
545
592
  publishedAt: body.publishedAt
546
593
  });
547
- if (body.bylines !== void 0) {
548
- await bylineRepo.setContentBylines(collection, resolvedId, body.bylines);
549
- updated.primaryBylineId = body.bylines[0]?.bylineId ?? null;
550
- }
594
+ if (body.bylines !== void 0) updated.primaryBylineId = (await bylineRepo.setContentBylines(collection, resolvedId, body.bylines))[0]?.byline.translationGroup ?? null;
551
595
  if (oldSlug && body.slug) {
552
596
  const collectionRow = await trx.selectFrom("_emdash_collections").select("url_pattern").where("slug", "=", collection).executeTakeFirst();
553
597
  await new RedirectRepository(trx).createAutoRedirect(collection, oldSlug, body.slug, resolvedId, collectionRow?.url_pattern ?? null);
@@ -2583,7 +2627,7 @@ async function handleMarketplaceInstall(db, storage, sandboxRunner, marketplaceU
2583
2627
  message: "Storage is required for marketplace plugin installation"
2584
2628
  }
2585
2629
  };
2586
- if (!sandboxRunner || !sandboxRunner.isAvailable()) return {
2630
+ if (!opts?.sandboxBypassed && (!sandboxRunner || !sandboxRunner.isAvailable())) return {
2587
2631
  success: false,
2588
2632
  error: {
2589
2633
  code: "SANDBOX_NOT_AVAILABLE",
@@ -2715,7 +2759,7 @@ async function handleMarketplaceUpdate(db, storage, sandboxRunner, marketplaceUr
2715
2759
  message: "Storage is required"
2716
2760
  }
2717
2761
  };
2718
- if (!sandboxRunner || !sandboxRunner.isAvailable()) return {
2762
+ if (!opts?.sandboxBypassed && (!sandboxRunner || !sandboxRunner.isAvailable())) return {
2719
2763
  success: false,
2720
2764
  error: {
2721
2765
  code: "SANDBOX_NOT_AVAILABLE",
@@ -3336,6 +3380,45 @@ async function makeRegistryPluginId(publisherDid, slug) {
3336
3380
 
3337
3381
  //#endregion
3338
3382
  //#region src/api/handlers/registry.ts
3383
+ /**
3384
+ * Registry plugin install handler.
3385
+ *
3386
+ * Installs a plugin published to the experimental decentralized plugin
3387
+ * registry described in RFC 0001. The install flow:
3388
+ *
3389
+ * 1. Resolve `(handle, slug)` to a publisher DID via the configured
3390
+ * aggregator's `resolvePackage` XRPC.
3391
+ * 2. Look up the requested release (or the policy-filtered latest one)
3392
+ * via `getLatestRelease` / `listReleases`.
3393
+ * 3. Reject the install if the aggregator surfaces a `security:yanked`
3394
+ * hard-enforcement label or the release is below the configured
3395
+ * minimum release age.
3396
+ * 4. Fetch the bundle artifact, walking aggregator mirrors first and
3397
+ * falling back to the publisher-declared URL.
3398
+ * 5. Verify the artifact's multibase checksum against the signed
3399
+ * release record's `artifacts.package.checksum`.
3400
+ * 6. Extract `manifest.json` + `backend.js` + optional `admin.js` from
3401
+ * the gzipped tar bundle.
3402
+ * 7. Store the extracted files in site-local R2 under the
3403
+ * `registry/<plugin-id>/<version>/` prefix.
3404
+ * 8. Write a `plugin_states` row with `source = "registry"` and the
3405
+ * `(publisher_did, slug)` pair so updates can be resolved later.
3406
+ * 9. Sync the runtime so the plugin becomes active immediately.
3407
+ *
3408
+ * Known gaps (tracked separately):
3409
+ *
3410
+ * - The aggregator-supplied records are not yet cryptographically
3411
+ * verified against the publisher's MST signature. The signed bytes
3412
+ * and CIDs are passed through verbatim per the lexicon, but full
3413
+ * PDS-direct verification with proof traversal is follow-up work.
3414
+ * The artifact checksum is verified end-to-end against the value
3415
+ * in the (aggregator-relayed) release record, which is the actual
3416
+ * trust boundary for the bytes that end up in the sandbox.
3417
+ * - `acceptLabelers` is forwarded as-is to the aggregator; this
3418
+ * handler does not independently re-fetch and verify labels from
3419
+ * each labeller's DID. Aggregator label envelope tampering is
3420
+ * mitigated by the artifact checksum but not detected.
3421
+ */
3339
3422
  /** Matches a bare 64-character lowercase/uppercase hex SHA-256 digest. */
3340
3423
  const SHA256_HEX_PATTERN = /^[a-f0-9]{64}$/i;
3341
3424
  /** Compute the SHA-256 of `bytes` as a lowercase hex string. */
@@ -3530,7 +3613,7 @@ async function assertSafeArtifactUrl(urlString) {
3530
3613
  try {
3531
3614
  return await resolveAndValidateExternalUrl(url.href);
3532
3615
  } catch (err) {
3533
- if (err instanceof SsrfError) throw new Error(`Artifact URL rejected: ${err.message}`);
3616
+ if (err instanceof SsrfError) throw new Error(`Artifact URL rejected: ${err.message}`, { cause: err });
3534
3617
  throw err;
3535
3618
  }
3536
3619
  }
@@ -3817,8 +3900,8 @@ async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigI
3817
3900
  };
3818
3901
  }
3819
3902
  const release = releaseView.release;
3820
- const declaredUrl = release.artifacts?.package?.url;
3821
- const declaredChecksum = release.artifacts?.package?.checksum;
3903
+ const declaredUrl = release?.artifacts?.package?.url;
3904
+ const declaredChecksum = release?.artifacts?.package?.checksum;
3822
3905
  if (!declaredUrl || !declaredChecksum) return {
3823
3906
  success: false,
3824
3907
  error: {
@@ -3887,8 +3970,8 @@ async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigI
3887
3970
  try {
3888
3971
  await stateRepo.upsert(pluginId, version, "active", {
3889
3972
  source: "registry",
3890
- displayName: profile.name ?? slug,
3891
- description: profile.description ?? void 0,
3973
+ displayName: profile?.name ?? slug,
3974
+ description: profile?.description ?? void 0,
3892
3975
  registryPublisherDid: publisherDid,
3893
3976
  registrySlug: slug
3894
3977
  });
@@ -3918,6 +4001,20 @@ async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigI
3918
4001
  }
3919
4002
  };
3920
4003
  } catch (err) {
4004
+ if (err instanceof ClientValidationError) return {
4005
+ success: false,
4006
+ error: {
4007
+ code: "AGGREGATOR_RESPONSE_INVALID",
4008
+ message: `Aggregator returned a response that does not conform to its lexicon (${err.target})`
4009
+ }
4010
+ };
4011
+ if (err instanceof ClientResponseError) return {
4012
+ success: false,
4013
+ error: {
4014
+ code: err.status === 404 ? "AGGREGATOR_NOT_FOUND" : "AGGREGATOR_HTTP_ERROR",
4015
+ message: `Aggregator returned ${err.status}: ${err.error}`
4016
+ }
4017
+ };
3921
4018
  if (err instanceof EmDashStorageError) return {
3922
4019
  success: false,
3923
4020
  error: {
@@ -3935,7 +4032,374 @@ async function handleRegistryInstall(db, storage, sandboxRunner, registryConfigI
3935
4032
  };
3936
4033
  }
3937
4034
  }
4035
+ /**
4036
+ * Uninstall a registry-source plugin. Deletes the R2 bundle under
4037
+ * `registry/<pluginId>/<version>/`, optionally drops the plugin's
4038
+ * `_plugin_storage` rows, and removes the `_plugin_state` row. The
4039
+ * sandbox runtime is reconciled by the route's `syncRegistryPlugins`
4040
+ * call after this returns.
4041
+ *
4042
+ * Refuses to uninstall plugins whose `source` is not `"registry"` to
4043
+ * avoid trashing a marketplace/config plugin that happens to share the
4044
+ * pluginId namespace.
4045
+ */
4046
+ async function handleRegistryUninstall(db, storage, pluginId, opts) {
4047
+ try {
4048
+ const stateRepo = new PluginStateRepository(db);
4049
+ const existing = await stateRepo.get(pluginId);
4050
+ if (!existing || existing.source !== "registry") return {
4051
+ success: false,
4052
+ error: {
4053
+ code: "NOT_FOUND",
4054
+ message: `No registry plugin found: ${pluginId}`
4055
+ }
4056
+ };
4057
+ const version = existing.version;
4058
+ let dataDeleted = false;
4059
+ if (opts?.deleteData) {
4060
+ await db.deleteFrom("_plugin_storage").where("plugin_id", "=", pluginId).execute();
4061
+ dataDeleted = true;
4062
+ }
4063
+ if (storage) await deleteBundleFromR2(storage, pluginId, version, "registry");
4064
+ await stateRepo.delete(pluginId);
4065
+ return {
4066
+ success: true,
4067
+ data: {
4068
+ pluginId,
4069
+ dataDeleted
4070
+ }
4071
+ };
4072
+ } catch (err) {
4073
+ console.error("[registry-uninstall] Failed:", err);
4074
+ return {
4075
+ success: false,
4076
+ error: {
4077
+ code: "UNINSTALL_FAILED",
4078
+ message: "Failed to uninstall plugin"
4079
+ }
4080
+ };
4081
+ }
4082
+ }
4083
+ /**
4084
+ * Update a registry-source plugin to a newer release. Mirrors
4085
+ * `handleMarketplaceUpdate`: resolves the target version via the aggregator,
4086
+ * re-runs the artifact fetch / checksum / extract pipeline, diffs capabilities
4087
+ * and route visibility against the currently installed bundle, and gates
4088
+ * escalations behind `confirmCapabilityChanges` / `confirmRouteVisibilityChanges`
4089
+ * so the admin re-consents to widened permissions.
4090
+ *
4091
+ * Refuses non-registry sources. Refuses when the stored state row is missing
4092
+ * the `(publisherDid, slug)` it needs to resolve against the aggregator.
4093
+ */
4094
+ async function handleRegistryUpdate(db, storage, sandboxRunner, registryConfigInput, pluginId, opts) {
4095
+ const registryConfig = coerceRegistryConfig(registryConfigInput);
4096
+ if (!registryConfig) return {
4097
+ success: false,
4098
+ error: {
4099
+ code: "REGISTRY_NOT_CONFIGURED",
4100
+ message: "Registry is not configured"
4101
+ }
4102
+ };
4103
+ if (!storage) return {
4104
+ success: false,
4105
+ error: {
4106
+ code: "STORAGE_NOT_CONFIGURED",
4107
+ message: "Storage is required for registry plugin updates"
4108
+ }
4109
+ };
4110
+ if (!sandboxRunner || !sandboxRunner.isAvailable()) return {
4111
+ success: false,
4112
+ error: {
4113
+ code: "SANDBOX_NOT_AVAILABLE",
4114
+ message: "Sandbox runner is required"
4115
+ }
4116
+ };
4117
+ try {
4118
+ validateAggregatorUrl(registryConfig.aggregatorUrl);
4119
+ } catch (err) {
4120
+ return {
4121
+ success: false,
4122
+ error: {
4123
+ code: "REGISTRY_NOT_CONFIGURED",
4124
+ message: err instanceof Error ? err.message : "Invalid aggregator URL"
4125
+ }
4126
+ };
4127
+ }
4128
+ try {
4129
+ const stateRepo = new PluginStateRepository(db);
4130
+ const existing = await stateRepo.get(pluginId);
4131
+ if (!existing || existing.source !== "registry") return {
4132
+ success: false,
4133
+ error: {
4134
+ code: "NOT_FOUND",
4135
+ message: `No registry plugin found: ${pluginId}`
4136
+ }
4137
+ };
4138
+ if (!existing.registryPublisherDid || !existing.registrySlug) return {
4139
+ success: false,
4140
+ error: {
4141
+ code: "INVALID_STATE",
4142
+ message: `Registry plugin ${pluginId} is missing publisher DID or slug in state`
4143
+ }
4144
+ };
4145
+ const oldVersion = existing.version;
4146
+ const publisherDid = existing.registryPublisherDid;
4147
+ const slug = existing.registrySlug;
4148
+ const { DiscoveryClient } = await import("@emdash-cms/registry-client/discovery");
4149
+ const aggregatorDeadline = Date.now() + AGGREGATOR_TOTAL_BUDGET_MS;
4150
+ const discovery = new DiscoveryClient({
4151
+ aggregatorUrl: registryConfig.aggregatorUrl,
4152
+ acceptLabelers: registryConfig.acceptLabelers,
4153
+ fetch: timedFetch(aggregatorDeadline)
4154
+ });
4155
+ const MAX_LIST_PAGES = 20;
4156
+ const releaseView = await (async () => {
4157
+ if (!opts?.version) return discovery.getLatestRelease({
4158
+ did: publisherDid,
4159
+ package: slug
4160
+ });
4161
+ let cursor;
4162
+ const seenCursors = /* @__PURE__ */ new Set();
4163
+ for (let page = 0; page < MAX_LIST_PAGES; page++) {
4164
+ if (cursor !== void 0) {
4165
+ if (seenCursors.has(cursor)) break;
4166
+ seenCursors.add(cursor);
4167
+ }
4168
+ const result = await discovery.listReleases({
4169
+ did: publisherDid,
4170
+ package: slug,
4171
+ cursor,
4172
+ limit: 50
4173
+ });
4174
+ for (const r of result.releases) if (r.version === opts.version) return r;
4175
+ if (!result.cursor) break;
4176
+ cursor = result.cursor;
4177
+ }
4178
+ })();
4179
+ if (!releaseView) return {
4180
+ success: false,
4181
+ error: {
4182
+ code: "NO_VERSION",
4183
+ message: opts?.version ? `Version ${opts.version} not found for ${publisherDid}/${slug}` : `No installable release found for ${publisherDid}/${slug}`
4184
+ }
4185
+ };
4186
+ const signedRelease = releaseView.release;
4187
+ if (releaseView.did !== publisherDid || releaseView.package !== slug || signedRelease?.package !== slug || opts?.version !== void 0 && releaseView.version !== opts.version || signedRelease?.version !== releaseView.version) return {
4188
+ success: false,
4189
+ error: {
4190
+ code: "AGGREGATOR_IDENTITY_MISMATCH",
4191
+ message: "Aggregator returned a release view that does not match the requested package or version."
4192
+ }
4193
+ };
4194
+ const newVersion = releaseView.version;
4195
+ if (newVersion === oldVersion) return {
4196
+ success: false,
4197
+ error: {
4198
+ code: "ALREADY_UP_TO_DATE",
4199
+ message: "Plugin is already at the requested version"
4200
+ }
4201
+ };
4202
+ if ((releaseView.labels ?? []).some((l) => l.val === "security:yanked")) return {
4203
+ success: false,
4204
+ error: {
4205
+ code: "YANKED",
4206
+ message: "Release has been yanked by a trusted labeller"
4207
+ }
4208
+ };
4209
+ const declaredUrl = signedRelease.artifacts?.package?.url;
4210
+ const declaredChecksum = signedRelease.artifacts?.package?.checksum;
4211
+ if (!declaredUrl || !declaredChecksum) return {
4212
+ success: false,
4213
+ error: {
4214
+ code: "INVALID_RELEASE",
4215
+ message: "Release record is missing artifact url or checksum"
4216
+ }
4217
+ };
4218
+ await assertSafeArtifactUrl(declaredUrl);
4219
+ const mirrors = (releaseView.mirrors ?? []).slice(0, MAX_MIRRORS);
4220
+ for (const mirror of mirrors) await assertSafeArtifactUrl(mirror);
4221
+ const artifactBytes = await fetchArtifact(mirrors, declaredUrl);
4222
+ if (!await verifyChecksum(artifactBytes, declaredChecksum)) return {
4223
+ success: false,
4224
+ error: {
4225
+ code: "CHECKSUM_MISMATCH",
4226
+ message: "Artifact bytes do not match the release's published checksum"
4227
+ }
4228
+ };
4229
+ const bundle = await extractBundle(artifactBytes);
4230
+ if (bundle.manifest.version !== newVersion) return {
4231
+ success: false,
4232
+ error: {
4233
+ code: "BUNDLE_VERSION_MISMATCH",
4234
+ message: `Bundle manifest version (${bundle.manifest.version}) does not match release version (${newVersion})`
4235
+ }
4236
+ };
4237
+ if (bundle.manifest.id !== slug) return {
4238
+ success: false,
4239
+ error: {
4240
+ code: "BUNDLE_IDENTITY_MISMATCH",
4241
+ message: `Bundle manifest id (${bundle.manifest.id}) does not match registry slug (${slug})`
4242
+ }
4243
+ };
4244
+ bundle.manifest = {
4245
+ ...bundle.manifest,
4246
+ id: pluginId
4247
+ };
4248
+ const oldBundle = await loadBundleFromR2(storage, pluginId, oldVersion, "registry");
4249
+ const capabilityChanges = diffCapabilities(oldBundle?.manifest.capabilities ?? [], bundle.manifest.capabilities);
4250
+ if (capabilityChanges.added.length > 0 && !opts?.confirmCapabilityChanges) return {
4251
+ success: false,
4252
+ error: {
4253
+ code: "CAPABILITY_ESCALATION",
4254
+ message: "Plugin update requires new capabilities",
4255
+ details: { capabilityChanges }
4256
+ }
4257
+ };
4258
+ const routeVisibilityChanges = diffRouteVisibility(oldBundle?.manifest, bundle.manifest);
4259
+ const hasNewPublicRoutes = routeVisibilityChanges.newlyPublic.length > 0;
4260
+ if (hasNewPublicRoutes && !opts?.confirmRouteVisibilityChanges) return {
4261
+ success: false,
4262
+ error: {
4263
+ code: "ROUTE_VISIBILITY_ESCALATION",
4264
+ message: "Plugin update exposes new public (unauthenticated) routes",
4265
+ details: {
4266
+ routeVisibilityChanges,
4267
+ capabilityChanges
4268
+ }
4269
+ }
4270
+ };
4271
+ await storeBundleInR2(storage, pluginId, newVersion, bundle, "registry");
4272
+ await stateRepo.upsert(pluginId, newVersion, "active", {
4273
+ source: "registry",
4274
+ registryPublisherDid: publisherDid,
4275
+ registrySlug: slug,
4276
+ displayName: existing.displayName ?? slug,
4277
+ description: existing.description ?? void 0
4278
+ });
4279
+ deleteBundleFromR2(storage, pluginId, oldVersion, "registry").catch(() => {});
4280
+ return {
4281
+ success: true,
4282
+ data: {
4283
+ pluginId,
4284
+ oldVersion,
4285
+ newVersion,
4286
+ capabilityChanges,
4287
+ routeVisibilityChanges: hasNewPublicRoutes ? routeVisibilityChanges : void 0
4288
+ }
4289
+ };
4290
+ } catch (err) {
4291
+ if (err instanceof ClientValidationError) return {
4292
+ success: false,
4293
+ error: {
4294
+ code: "AGGREGATOR_RESPONSE_INVALID",
4295
+ message: `Aggregator returned a response that does not conform to its lexicon (${err.target})`
4296
+ }
4297
+ };
4298
+ if (err instanceof ClientResponseError) return {
4299
+ success: false,
4300
+ error: {
4301
+ code: err.status === 404 ? "AGGREGATOR_NOT_FOUND" : "AGGREGATOR_HTTP_ERROR",
4302
+ message: `Aggregator returned ${err.status}: ${err.error}`
4303
+ }
4304
+ };
4305
+ if (err instanceof EmDashStorageError) return {
4306
+ success: false,
4307
+ error: {
4308
+ code: err.code ?? "STORAGE_ERROR",
4309
+ message: "Storage error while updating plugin"
4310
+ }
4311
+ };
4312
+ console.error("[registry-update] Failed:", err);
4313
+ return {
4314
+ success: false,
4315
+ error: {
4316
+ code: "UPDATE_FAILED",
4317
+ message: err instanceof Error ? err.message : "Failed to update plugin"
4318
+ }
4319
+ };
4320
+ }
4321
+ }
4322
+ /**
4323
+ * Bulk update check across every installed registry plugin. Queries the
4324
+ * aggregator for each plugin's latest release and reports `hasUpdate`
4325
+ * based on the version comparison. Plugins whose aggregator lookup fails
4326
+ * (unreachable, delisted, malformed) are skipped silently — one bad
4327
+ * publisher must not blank the whole admin Updates list.
4328
+ */
4329
+ async function handleRegistryUpdateCheck(db, registryConfigInput) {
4330
+ const registryConfig = coerceRegistryConfig(registryConfigInput);
4331
+ if (!registryConfig) return {
4332
+ success: false,
4333
+ error: {
4334
+ code: "REGISTRY_NOT_CONFIGURED",
4335
+ message: "Registry is not configured"
4336
+ }
4337
+ };
4338
+ try {
4339
+ const registryPlugins = await new PluginStateRepository(db).getRegistryPlugins();
4340
+ if (registryPlugins.length === 0) return {
4341
+ success: true,
4342
+ data: { items: [] }
4343
+ };
4344
+ const { DiscoveryClient } = await import("@emdash-cms/registry-client/discovery");
4345
+ const aggregatorDeadline = Date.now() + AGGREGATOR_TOTAL_BUDGET_MS;
4346
+ const discovery = new DiscoveryClient({
4347
+ aggregatorUrl: registryConfig.aggregatorUrl,
4348
+ acceptLabelers: registryConfig.acceptLabelers,
4349
+ fetch: timedFetch(aggregatorDeadline)
4350
+ });
4351
+ const items = [];
4352
+ for (const plugin of registryPlugins) {
4353
+ if (!plugin.registryPublisherDid || !plugin.registrySlug) continue;
4354
+ try {
4355
+ const latest = (await discovery.getLatestRelease({
4356
+ did: plugin.registryPublisherDid,
4357
+ package: plugin.registrySlug
4358
+ })).version;
4359
+ if (!latest) continue;
4360
+ const installed = plugin.version;
4361
+ items.push({
4362
+ pluginId: plugin.pluginId,
4363
+ installed,
4364
+ latest,
4365
+ hasUpdate: latest !== installed,
4366
+ hasCapabilityChanges: false,
4367
+ hasRouteVisibilityChanges: false
4368
+ });
4369
+ } catch (err) {
4370
+ console.warn(`[registry-update-check] Skipped ${plugin.pluginId}:`, err);
4371
+ }
4372
+ }
4373
+ return {
4374
+ success: true,
4375
+ data: { items }
4376
+ };
4377
+ } catch (err) {
4378
+ if (err instanceof ClientValidationError) return {
4379
+ success: false,
4380
+ error: {
4381
+ code: "AGGREGATOR_RESPONSE_INVALID",
4382
+ message: `Aggregator returned a response that does not conform to its lexicon (${err.target})`
4383
+ }
4384
+ };
4385
+ if (err instanceof ClientResponseError) return {
4386
+ success: false,
4387
+ error: {
4388
+ code: err.status === 404 ? "AGGREGATOR_NOT_FOUND" : "AGGREGATOR_HTTP_ERROR",
4389
+ message: `Aggregator returned ${err.status}: ${err.error}`
4390
+ }
4391
+ };
4392
+ console.error("[registry-update-check] Failed:", err);
4393
+ return {
4394
+ success: false,
4395
+ error: {
4396
+ code: "UPDATE_CHECK_FAILED",
4397
+ message: "Failed to check for registry updates"
4398
+ }
4399
+ };
4400
+ }
4401
+ }
3938
4402
 
3939
4403
  //#endregion
3940
- export { handleContentSchedule as $, handleMediaCreate as A, handleContentCountScheduled as B, handleSchemaCollectionUpdate as C, handleSchemaFieldList as D, handleSchemaFieldGet as E, handleRevisionGet as F, handleContentDuplicate as G, handleContentCreate as H, handleRevisionList as I, handleContentList as J, handleContentGet as K, handleRevisionRestore as L, handleMediaGet as M, handleMediaList as N, handleSchemaFieldReorder as O, handleMediaUpdate as P, handleContentRestore as Q, generateManifest as R, handleSchemaCollectionList as S, handleSchemaFieldDelete as T, handleContentDelete as U, handleContentCountTrashed as V, handleContentDiscardDraft as W, handleContentPermanentDelete as X, handleContentListTrashed as Y, handleContentPublish as Z, handleOrphanedTableList as _, handleMarketplaceSearch as a, handleSchemaCollectionDelete as b, handleMarketplaceUpdateCheck as c, loadBundleFromR2 as d, handleContentTranslations as et, handlePluginDisable as f, PluginStateRepository as g, handlePluginList as h, handleMarketplaceInstall as i, validateRev as it, handleMediaDelete as j, handleSchemaFieldUpdate as k, handleThemeGetDetail as l, handlePluginGet as m, normalizeRegistryConfig as n, handleContentUnschedule as nt, handleMarketplaceUninstall as o, handlePluginEnable as p, handleContentGetIncludingTrashed as q, handleMarketplaceGetPlugin as r, handleContentUpdate as rt, handleMarketplaceUpdate as s, handleRegistryInstall as t, handleContentUnpublish as tt, handleThemeSearch as u, handleOrphanedTableRegister as v, handleSchemaFieldCreate as w, handleSchemaCollectionGet as x, handleSchemaCollectionCreate as y, handleContentCompare as z };
3941
- //# sourceMappingURL=api-ayIQ7rIe.mjs.map
4404
+ export { handleContentPermanentDelete as $, handleSchemaFieldList as A, handleRevisionRestore as B, handleSchemaCollectionDelete as C, handleSchemaFieldCreate as D, handleSchemaCollectionUpdate as E, handleMediaGet as F, handleContentCreate as G, handleContentCompare as H, handleMediaList as I, handleContentDuplicate as J, handleContentDelete as K, handleMediaUpdate as L, handleSchemaFieldUpdate as M, handleMediaCreate as N, handleSchemaFieldDelete as O, handleMediaDelete as P, handleContentListTrashed as Q, handleRevisionGet as R, handleSchemaCollectionCreate as S, handleSchemaCollectionList as T, handleContentCountScheduled as U, generateManifest as V, handleContentCountTrashed as W, handleContentGetIncludingTrashed as X, handleContentGet as Y, handleContentList as Z, handlePluginGet as _, normalizeRegistryConfig as a, handleContentUnschedule as at, handleOrphanedTableList as b, handleMarketplaceSearch as c, handleMarketplaceUpdateCheck as d, handleContentPublish as et, handleThemeGetDetail as f, handlePluginEnable as g, handlePluginDisable as h, handleRegistryUpdateCheck as i, handleContentUnpublish as it, handleSchemaFieldReorder as j, handleSchemaFieldGet as k, handleMarketplaceUninstall as l, loadBundleFromR2 as m, handleRegistryUninstall as n, handleContentSchedule as nt, handleMarketplaceGetPlugin as o, handleContentUpdate as ot, handleThemeSearch as p, handleContentDiscardDraft as q, handleRegistryUpdate as r, handleContentTranslations as rt, handleMarketplaceInstall as s, validateRev as st, handleRegistryInstall as t, handleContentRestore as tt, handleMarketplaceUpdate as u, handlePluginList as v, handleSchemaCollectionGet as w, handleOrphanedTableRegister as x, PluginStateRepository as y, handleRevisionList as z };
4405
+ //# sourceMappingURL=api-CLwG_3dh.mjs.map