dineway 0.1.49 → 0.2.1

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 (434) hide show
  1. package/dist/activity-DUaz_w7p.mjs +79 -0
  2. package/dist/{activity-events-CwM7yxPW.mjs → activity-events-CJDvE2uc.mjs} +5 -113
  3. package/dist/actor-0QJ1Gbtf.mjs +37 -0
  4. package/dist/after-BfniwgIf.mjs +9 -0
  5. package/dist/{allowed-origins-CyGnbgBd.mjs → allowed-origins--OwHHiY8.mjs} +1 -1
  6. package/dist/api/route-utils.d.mts +9 -10
  7. package/dist/api/route-utils.mjs +16 -13
  8. package/dist/api/schemas/index.d.mts +2 -2
  9. package/dist/api/schemas/index.mjs +5 -4
  10. package/dist/{api-BMIxRIEN.mjs → api-B4PHIF4V.mjs} +93 -41
  11. package/dist/{api-tokens-DtvdtIkm.mjs → api-tokens-tbK_sORH.mjs} +6 -2
  12. package/dist/{apply-D_RlTYtC.mjs → apply-DjTqq6Ae.mjs} +117 -77
  13. package/dist/astro/image-endpoint.d.mts +7 -0
  14. package/dist/astro/image-endpoint.mjs +54 -0
  15. package/dist/astro/index.d.mts +34 -11
  16. package/dist/astro/index.mjs +163 -24
  17. package/dist/astro/integration/shims/use-sync-external-store-with-selector.js +71 -0
  18. package/dist/astro/integration/shims/use-sync-external-store.js +1 -0
  19. package/dist/astro/middleware/auth.d.mts +8 -18
  20. package/dist/astro/middleware/auth.mjs +42 -24
  21. package/dist/astro/middleware/redirect.mjs +13 -4
  22. package/dist/astro/middleware/request-context.mjs +8 -5
  23. package/dist/astro/middleware/seed.d.mts +1 -1
  24. package/dist/astro/middleware/seed.mjs +2 -2
  25. package/dist/astro/middleware/setup.mjs +1 -1
  26. package/dist/astro/middleware.mjs +389 -206
  27. package/dist/astro/routes/admin.astro +6 -1
  28. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -6
  29. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -6
  30. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  31. package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
  32. package/dist/astro/routes/api/admin/briefing.mjs +21 -17
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
  34. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -8
  35. package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -8
  36. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -8
  37. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -14
  38. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -14
  39. package/dist/astro/routes/api/admin/bylines/index.mjs +17 -14
  40. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +14 -12
  41. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -5
  42. package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -9
  43. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -5
  44. package/dist/astro/routes/api/admin/comments/index.mjs +11 -9
  45. package/dist/astro/routes/api/admin/context/_id_/history.mjs +27 -24
  46. package/dist/astro/routes/api/admin/context/_id_/index.mjs +27 -24
  47. package/dist/astro/routes/api/admin/context/_id_/review.mjs +32 -28
  48. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +32 -28
  49. package/dist/astro/routes/api/admin/context/diff.mjs +31 -27
  50. package/dist/astro/routes/api/admin/context/index.mjs +32 -28
  51. package/dist/astro/routes/api/admin/context/stale.mjs +31 -27
  52. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +27 -24
  53. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +31 -27
  54. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +31 -27
  55. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +28 -25
  56. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  57. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  58. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  59. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -51
  60. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -51
  61. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -43
  62. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +54 -49
  63. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +53 -48
  64. package/dist/astro/routes/api/admin/plugins/index.mjs +47 -43
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  66. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +46 -42
  67. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +53 -48
  68. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +46 -42
  69. package/dist/astro/routes/api/admin/plugins/updates.mjs +46 -42
  70. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +5 -5
  71. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +32 -63
  72. package/dist/astro/routes/api/admin/review-requests/index.d.mts +2 -1
  73. package/dist/astro/routes/api/admin/review-requests/index.mjs +58 -10
  74. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +46 -42
  75. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
  76. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +46 -42
  77. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
  78. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  79. package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -7
  80. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
  81. package/dist/astro/routes/api/admin/users/index.mjs +7 -6
  82. package/dist/astro/routes/api/auth/dev-bypass.mjs +4 -4
  83. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  84. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -11
  85. package/dist/astro/routes/api/auth/invite/index.mjs +9 -8
  86. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -10
  87. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  88. package/dist/astro/routes/api/auth/magic-link/send.mjs +11 -10
  89. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  90. package/dist/astro/routes/api/auth/me.mjs +9 -8
  91. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  92. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  93. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  94. package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -5
  95. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  96. package/dist/astro/routes/api/auth/passkey/options.mjs +12 -11
  97. package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -9
  98. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -10
  99. package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -10
  100. package/dist/astro/routes/api/auth/setup-token/index.mjs +5 -5
  101. package/dist/astro/routes/api/auth/setup-token/verify.mjs +2 -2
  102. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -11
  103. package/dist/astro/routes/api/auth/signup/request.mjs +11 -10
  104. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  105. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +15 -13
  106. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts +8 -0
  107. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +160 -0
  108. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  109. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +6 -5
  110. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -5
  111. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +6 -5
  112. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -10
  113. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +49 -20
  114. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +6 -5
  115. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  116. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +67 -32
  117. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +16 -14
  118. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  119. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +6 -5
  120. package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -9
  121. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  122. package/dist/astro/routes/api/content/_collection_/index.mjs +11 -9
  123. package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -6
  124. package/dist/astro/routes/api/dashboard.mjs +9 -8
  125. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  126. package/dist/astro/routes/api/health.mjs +1 -1
  127. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  128. package/dist/astro/routes/api/import/probe.mjs +22 -10
  129. package/dist/astro/routes/api/import/wordpress/analyze.mjs +9 -6
  130. package/dist/astro/routes/api/import/wordpress/execute.d.mts +18 -1
  131. package/dist/astro/routes/api/import/wordpress/execute.mjs +85 -37
  132. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -1
  133. package/dist/astro/routes/api/import/wordpress/media.mjs +20 -14
  134. package/dist/astro/routes/api/import/wordpress/prepare.mjs +36 -32
  135. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +17 -1
  136. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +121 -100
  137. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  138. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +24 -12
  139. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +55 -2
  140. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +284 -55
  141. package/dist/astro/routes/api/manifest.mjs +14 -5
  142. package/dist/astro/routes/api/mcp.mjs +753 -170
  143. package/dist/astro/routes/api/media/_id_/confirm.mjs +38 -10
  144. package/dist/astro/routes/api/media/_id_.mjs +11 -7
  145. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  146. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  147. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  148. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  149. package/dist/astro/routes/api/media/upload-url.mjs +11 -10
  150. package/dist/astro/routes/api/media.mjs +28 -35
  151. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +32 -28
  152. package/dist/astro/routes/api/menus/_name_/items.mjs +32 -28
  153. package/dist/astro/routes/api/menus/_name_/reorder.mjs +32 -28
  154. package/dist/astro/routes/api/menus/_name_/translations.mjs +32 -28
  155. package/dist/astro/routes/api/menus/_name_.mjs +32 -28
  156. package/dist/astro/routes/api/menus/index.mjs +32 -28
  157. package/dist/astro/routes/api/oauth/authorize.mjs +7 -7
  158. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  159. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  160. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  161. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  162. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  163. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  164. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  165. package/dist/astro/routes/api/openapi.json.mjs +4 -3
  166. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +46 -31
  167. package/dist/astro/routes/api/redirects/404s/index.mjs +11 -10
  168. package/dist/astro/routes/api/redirects/404s/summary.mjs +11 -10
  169. package/dist/astro/routes/api/redirects/_id_.mjs +33 -29
  170. package/dist/astro/routes/api/redirects/index.mjs +33 -29
  171. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  172. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  173. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +48 -43
  174. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +48 -43
  175. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +48 -43
  176. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +48 -43
  177. package/dist/astro/routes/api/schema/collections/index.mjs +48 -43
  178. package/dist/astro/routes/api/schema/index.mjs +14 -15
  179. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +46 -42
  180. package/dist/astro/routes/api/schema/orphans/index.mjs +46 -42
  181. package/dist/astro/routes/api/search/enable.mjs +11 -10
  182. package/dist/astro/routes/api/search/index.mjs +10 -9
  183. package/dist/astro/routes/api/search/rebuild.mjs +11 -10
  184. package/dist/astro/routes/api/search/stats.mjs +6 -6
  185. package/dist/astro/routes/api/search/suggest.mjs +10 -9
  186. package/dist/astro/routes/api/sections/_slug_.mjs +32 -28
  187. package/dist/astro/routes/api/sections/index.mjs +32 -28
  188. package/dist/astro/routes/api/settings/email.mjs +4 -4
  189. package/dist/astro/routes/api/settings.mjs +32 -28
  190. package/dist/astro/routes/api/setup/admin-verify.mjs +14 -13
  191. package/dist/astro/routes/api/setup/admin.mjs +12 -11
  192. package/dist/astro/routes/api/setup/dev-bypass.mjs +31 -25
  193. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  194. package/dist/astro/routes/api/setup/index.mjs +29 -25
  195. package/dist/astro/routes/api/setup/status.mjs +3 -3
  196. package/dist/astro/routes/api/snapshot.mjs +8 -7
  197. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +35 -31
  198. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +35 -31
  199. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +35 -31
  200. package/dist/astro/routes/api/taxonomies/index.mjs +35 -31
  201. package/dist/astro/routes/api/themes/preview.mjs +5 -5
  202. package/dist/astro/routes/api/typegen.mjs +4 -4
  203. package/dist/astro/routes/api/well-known/auth.mjs +3 -3
  204. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
  205. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
  206. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +31 -27
  207. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +32 -28
  208. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +32 -28
  209. package/dist/astro/routes/api/widget-areas/_name_.mjs +29 -26
  210. package/dist/astro/routes/api/widget-areas/index.mjs +32 -28
  211. package/dist/astro/routes/api/widget-components.mjs +2 -2
  212. package/dist/astro/routes/robots.txt.mjs +8 -7
  213. package/dist/astro/routes/sitemap-_collection_.xml.mjs +23 -14
  214. package/dist/astro/routes/sitemap.xml.mjs +9 -8
  215. package/dist/astro/session-driver.d.mts +1 -1
  216. package/dist/astro/session-driver.mjs +2 -2
  217. package/dist/astro/types.d.mts +22 -13
  218. package/dist/{audit-BeNsSyfU.mjs → audit-B2pRxZ20.mjs} +1 -1
  219. package/dist/auth/providers/github.d.mts +1 -1
  220. package/dist/auth/providers/google.d.mts +1 -1
  221. package/dist/{auth-control-guard-Dr14I98m.mjs → auth-control-guard-D71jourk.mjs} +1 -1
  222. package/dist/{authorize-BLO0m7fW.mjs → authorize-ZXPGPwKn.mjs} +1 -1
  223. package/dist/{briefing-CkTee1ex.mjs → briefing-0rf-su3-.mjs} +90 -28
  224. package/dist/{briefing-DJX6irto.mjs → briefing-kRhegBoF.mjs} +2 -1
  225. package/dist/bundle-CEcdUa1s.mjs +602 -0
  226. package/dist/{byline-BVC1lV6G.mjs → byline-7xR185Ly.mjs} +30 -62
  227. package/dist/{byline-fields-Cj39WhXC.mjs → byline-fields-BKzA0fJU.mjs} +1 -1
  228. package/dist/{byline-fields-uJlygdzM.d.mts → byline-fields-Ckeqd1OY.d.mts} +88 -35
  229. package/dist/{byline-fields-cNrLJVRs.mjs → byline-fields-WN7RQT4q.mjs} +10 -4
  230. package/dist/{byline-registry-4v6tXMNX.mjs → byline-registry-Ba54M74c.mjs} +2 -2
  231. package/dist/{bylines-LN9XISRo.mjs → bylines-C-EL6dh3.mjs} +9 -3
  232. package/dist/{bylines-DwokOFj6.mjs → bylines-CmZFCMr0.mjs} +5 -5
  233. package/dist/{cache-Bac05gBd.mjs → cache-DkVCKGio.mjs} +2 -2
  234. package/dist/{chunks-CuUt7K50.mjs → chunks-ChGNDY8r.mjs} +1 -1
  235. package/dist/cli/index.d.mts +29 -1
  236. package/dist/cli/index.mjs +1466 -1763
  237. package/dist/cli/plugin-kit.d.mts +75 -0
  238. package/dist/cli/plugin-kit.mjs +4 -0
  239. package/dist/client/external-auth-headers.d.mts +1 -1
  240. package/dist/client/index.d.mts +27 -52
  241. package/dist/client/index.mjs +34 -6
  242. package/dist/client-factory-BDD9azPJ.mjs +233 -0
  243. package/dist/{comment-Beue8-15.mjs → comment-DFALgsJD.mjs} +13 -3
  244. package/dist/comment-reaction-C37bf99u.mjs +58 -0
  245. package/dist/{comments-DcjFIfqX.mjs → comments-B3NwDBxl.mjs} +1 -1
  246. package/dist/{content-CBxYGWfL.mjs → content-DJcAYFhz.mjs} +51 -34
  247. package/dist/content-refresh-B4ZCmxgd.mjs +1576 -0
  248. package/dist/{context-Df1xVYyr.mjs → context-DnpXcp6Y.mjs} +2 -2
  249. package/dist/{context-CQVNZaR8.mjs → context-fSCYLL3c.mjs} +125 -53
  250. package/dist/{context-route-helpers-B9wj8Rmh.mjs → context-route-helpers-CI8XzcsK.mjs} +2 -1
  251. package/dist/{cron-DxCAU_Sn.mjs → cron-B1SL_lsb.mjs} +7 -3
  252. package/dist/{dashboard-B7ZUNuyF.mjs → dashboard-D0nj5oWg.mjs} +4 -4
  253. package/dist/db/index.d.mts +3 -3
  254. package/dist/db/index.mjs +1 -1
  255. package/dist/db/libsql.d.mts +1 -1
  256. package/dist/db/postgres.d.mts +1 -1
  257. package/dist/db/sqlite.d.mts +1 -1
  258. package/dist/{device-flow-BZVGftqi.mjs → device-flow-BJe6VEhP.mjs} +5 -5
  259. package/dist/{placeholder-d54Qr_7n.mjs → enrich-Ck9tfMqe.mjs} +36 -9
  260. package/dist/{error-DCSuUAZW.mjs → error-CSVaQNZy.mjs} +5 -0
  261. package/dist/{experimental-workflows-CSMffP6q.mjs → experimental-workflows-GVhUgzEs.mjs} +1 -1
  262. package/dist/field-defs-cache-DL-T2XVS.mjs +49 -0
  263. package/dist/forgeway-seo-client-G5ddhVHd.mjs +456 -0
  264. package/dist/{fts-manager-B5l_qwrA.mjs → fts-manager-ewTGohf4.mjs} +1 -1
  265. package/dist/{hitl-requests-7NlzVeUA.mjs → hitl-requests-DEFj8e6u.mjs} +2 -2
  266. package/dist/{hitl-route-helpers-k---_H3-.mjs → hitl-route-helpers-C23JHaWz.mjs} +5 -4
  267. package/dist/import-CXXL5pip.mjs +1354 -0
  268. package/dist/index-DcnOCD1e.d.mts +375 -0
  269. package/dist/index.d.mts +15 -16
  270. package/dist/index.mjs +85 -70
  271. package/dist/{jsonld-DZ67souc.d.mts → jsonld-DzKbhRZ4.d.mts} +8 -4
  272. package/dist/{load-D9OiGr2m.mjs → load-CFtJRT3c.mjs} +1 -1
  273. package/dist/{loader--GOYux8M.mjs → loader-aWkkc1_o.mjs} +117 -31
  274. package/dist/{manifest-schema-qh2P7RDX.mjs → manifest-schema-uA6pRFXi.mjs} +38 -1
  275. package/dist/mcp-reviewed-executor-Dn52L_yY.mjs +558 -0
  276. package/dist/media/image-endpoint.d.mts +32 -0
  277. package/dist/media/image-endpoint.mjs +111 -0
  278. package/dist/media/index.d.mts +27 -2
  279. package/dist/media/index.mjs +5 -3
  280. package/dist/media/local-runtime.d.mts +15 -11
  281. package/dist/media/local-runtime.mjs +9 -7
  282. package/dist/{media-CbKyYukG.mjs → media-CVMOoywq.mjs} +3 -1
  283. package/dist/{media-allowlist-BYxJIcTO.mjs → media-allowlist-zDNJmXCo.mjs} +1 -1
  284. package/dist/media-url-BdoLPvg8.mjs +20 -0
  285. package/dist/{menus-C7F0sCrC.mjs → menus-CCG2z5um.mjs} +80 -15
  286. package/dist/{menus-BZbXf-ej.mjs → menus-CmyIkRG5.mjs} +19 -5
  287. package/dist/{normalize-ByemhhfW.mjs → normalize-Cyt7JdF7.mjs} +8 -1
  288. package/dist/{oauth-authorization-DF-LCsIA.mjs → oauth-authorization-B9H7X85L.mjs} +5 -5
  289. package/dist/{oauth-clients-Du-V0fEm.mjs → oauth-clients-Dwl32-Uj.mjs} +2 -2
  290. package/dist/object-cache/memory.d.mts +14 -0
  291. package/dist/object-cache/memory.mjs +55 -0
  292. package/dist/object-cache-D51qOseS.mjs +419 -0
  293. package/dist/output-DhBe5_Pi.mjs +68 -0
  294. package/dist/page/index.d.mts +10 -3
  295. package/dist/page/index.mjs +2 -2
  296. package/dist/{parse-CneSgl7-.mjs → parse-i15EFSAE.mjs} +1 -1
  297. package/dist/{parser-DxfsARXL.mjs → parser-06LLLL4E.mjs} +151 -9
  298. package/dist/{placeholder-CXfoCtCd.d.mts → placeholder-DkWkXfDI.d.mts} +12 -4
  299. package/dist/plugin-utils.d.mts +8 -9
  300. package/dist/plugins/adapt-sandbox-entry.d.mts +8 -9
  301. package/dist/plugins/adapt-sandbox-entry.mjs +13 -2
  302. package/dist/{plugins-DzfqRREq.mjs → plugins-CPA2PtfY.mjs} +919 -66
  303. package/dist/{transport-LSdZVXHF.mjs → portable-text-BASHceim.mjs} +1 -134
  304. package/dist/portable-text-E79LyjGo.d.mts +45 -0
  305. package/dist/{preview-C-3YTX2U.mjs → preview-BjedZm8G.mjs} +4 -3
  306. package/dist/process-cache-CCDgti7j.mjs +106 -0
  307. package/dist/project-env-DKibmuP8.mjs +95 -0
  308. package/dist/{provider-loader-9it4vd6L.d.mts → provider-loader-DC2JdWeO.d.mts} +1 -1
  309. package/dist/{public-url-B4xV4rGa.d.mts → public-url-DQJCnYi9.d.mts} +1 -1
  310. package/dist/publication-authorization-RKiHXKtq.mjs +985 -0
  311. package/dist/{query-CZ3TH_Uu.mjs → query-C2U5u5_p.mjs} +11 -6
  312. package/dist/{query-Ds0EnMFX.mjs → query-DEv5x6yB.mjs} +281 -76
  313. package/dist/{rate-limit-i0G3IAOX.mjs → rate-limit-DglsAJSw.mjs} +2 -2
  314. package/dist/{redirect-CEACczxo.mjs → redirect-ubhEqQCQ.mjs} +2 -2
  315. package/dist/{redirects-ocRJmQHP.mjs → redirects-Bhpm8bRe.mjs} +35 -19
  316. package/dist/{redirects-DYj1yPxs.mjs → redirects-xs2yahLq.mjs} +47 -24
  317. package/dist/{registry-D7HACema.mjs → registry-BYYyb2tF.mjs} +148 -81
  318. package/dist/request-context.d.mts +2 -0
  319. package/dist/{request-meta-DAb6xaP9.mjs → request-meta-CFe1tW2M.mjs} +1 -1
  320. package/dist/review-payload-BysRWpxS.mjs +111 -0
  321. package/dist/{review-requests-BW2NxY-l.mjs → review-requests-CTWGnWUt.mjs} +1 -1
  322. package/dist/review-requests-D42VEP1l.mjs +142 -0
  323. package/dist/review-route-helpers-C31vO6SI.mjs +41 -0
  324. package/dist/runner-BgmttQmD.mjs +7444 -0
  325. package/dist/{runner-09sTqtv0.d.mts → runner-D6hzs8L9.d.mts} +1 -1
  326. package/dist/runtime.d.mts +9 -10
  327. package/dist/runtime.mjs +3 -3
  328. package/dist/schema-DUtnZxjZ.mjs +8 -0
  329. package/dist/{search-Gdrqj582.mjs → search-DUKgZUlm.mjs} +5 -3
  330. package/dist/{secrets-CeGpBFV2.mjs → secrets-ZV5rd8yV.mjs} +14 -11
  331. package/dist/{sections-BOjU13Y-.mjs → sections-DvFgsnda.mjs} +2 -2
  332. package/dist/seed/index.d.mts +2 -2
  333. package/dist/seed/index.mjs +21 -18
  334. package/dist/seo/index.d.mts +1 -1
  335. package/dist/seo/index.mjs +3 -12
  336. package/dist/{seo-5lJOtB5J.mjs → seo-BLszyJxd.mjs} +22 -4
  337. package/dist/{seo-CLj8lS7Q.mjs → seo-BU8MLCS9.mjs} +5 -2
  338. package/dist/{seo-contributions-CqVvReEj.mjs → seo-contributions-GnCuL1ML.mjs} +11 -3
  339. package/dist/{service-jGlhrICs.mjs → service-FL3fB0Rx.mjs} +2 -2
  340. package/dist/session-user-Ct6GBLvn.mjs +22 -0
  341. package/dist/{settings-CUXOxzsT.mjs → settings-BECcAIRH.mjs} +28 -55
  342. package/dist/{settings-DlBsT2VS.mjs → settings-EzADu-dd.mjs} +2 -2
  343. package/dist/{setup-complete-BRrdPYjZ.mjs → setup-complete-Da0axZEE.mjs} +1 -1
  344. package/dist/{site-activity-DONFrMBJ.mjs → site-activity-h8smOlYI.mjs} +1 -1
  345. package/dist/{site-context-C8Az_P_I.mjs → site-context-B8T1kpUP.mjs} +337 -530
  346. package/dist/{site-url-DIMD68go.mjs → site-url-DJEid0ml.mjs} +1 -1
  347. package/dist/stable-hash-DshcXvRE.mjs +19 -0
  348. package/dist/status-NqWOSFAD.mjs +21 -0
  349. package/dist/storage/local.d.mts +1 -1
  350. package/dist/storage/local.mjs +1 -1
  351. package/dist/storage/s3.d.mts +1 -1
  352. package/dist/storage/s3.mjs +1 -1
  353. package/dist/{taxonomies-D9Sw4wWM.mjs → taxonomies-BiM9NtgW.mjs} +36 -29
  354. package/dist/taxonomies-DSnY5nOa.mjs +443 -0
  355. package/dist/{taxonomy-B169Nm6B.mjs → taxonomy-0k_vRVsD.mjs} +44 -9
  356. package/dist/transport-C46KHLMP.mjs +134 -0
  357. package/dist/types-A8fPOJnl.mjs +69 -0
  358. package/dist/types-BLQCz46p.d.mts +118 -0
  359. package/dist/{types-CwawBUTa.d.mts → types-B_FlxIIl.d.mts} +4 -1
  360. package/dist/{types-CSgR9nQB.mjs → types-ChxYDRvx.mjs} +1 -1
  361. package/dist/{types-GaCtZ1k9.d.mts → types-Cw0PeCT_.d.mts} +18 -0
  362. package/dist/types-DuQn1G7-.d.mts +2973 -0
  363. package/dist/{runtime-C4-2lSFg.d.mts → types-DwoUifGE.d.mts} +5668 -3000
  364. package/dist/{types-DRIKLmJI.d.mts → types-opjX_kz6.d.mts} +17 -2
  365. package/dist/ui/server-runtime.d.mts +13 -15
  366. package/dist/ui/server-runtime.mjs +24 -20
  367. package/dist/url-guoXQQcV.mjs +33 -0
  368. package/dist/{user-DTLoZs16.mjs → user-BH-n01y3.mjs} +2 -2
  369. package/dist/{utils-B8hBJ9Oz.mjs → utils-D1SrKGtP.mjs} +129 -7
  370. package/dist/{validate-DzjCdy6v.d.mts → validate-CbVFoJgc.d.mts} +65 -8
  371. package/dist/{validate-DWmPO6oj.mjs → validate-D1HL-oLR.mjs} +11 -6
  372. package/dist/version-C3iVRuaF.mjs +6 -0
  373. package/dist/{widgets-BpJ8EpPd.mjs → widgets-BZrLrNgS.mjs} +46 -43
  374. package/dist/{wordpress-slugs-DHNR9LpG.mjs → wordpress-slugs-C3PWcowq.mjs} +1 -1
  375. package/dist/{zod-generator-K91-g665.mjs → zod-generator-C7AsLpSB.mjs} +42 -14
  376. package/package.json +38 -8
  377. package/src/components/Block.astro +50 -0
  378. package/src/components/Comments.astro +143 -1
  379. package/src/components/DinewayHead.astro +19 -2
  380. package/src/components/DinewayImage.astro +66 -33
  381. package/src/components/DinewayMedia.astro +1 -2
  382. package/src/components/Image.astro +85 -40
  383. package/src/components/InlinePortableTextEditor.tsx +12 -2
  384. package/src/components/JsonLdScript.astro +9 -0
  385. package/src/components/LiveSearch.astro +40 -4
  386. package/src/components/index.ts +4 -0
  387. package/src/components/live-search-routing.ts +30 -0
  388. package/src/components/portable-text-text-align.ts +15 -0
  389. package/src/ui.ts +2 -0
  390. package/dist/entity-aliases-4y93Yjuc.mjs +0 -51
  391. package/dist/import-4YBXbDkI.mjs +0 -684
  392. package/dist/index-CZiWCQDp.d.mts +0 -227
  393. package/dist/review-requests-Qum4713s.mjs +0 -79
  394. package/dist/runner-DzIpHGND.mjs +0 -2836
  395. package/dist/schema-Bsi-VpYv.mjs +0 -8
  396. package/dist/taxonomies-CZ-_DitR.mjs +0 -327
  397. package/dist/types-CuJOqHfM.d.mts +0 -758
  398. package/dist/types-DSPGWjxO.d.mts +0 -1247
  399. package/dist/types-nP9vGUFq.d.mts +0 -56
  400. package/dist/version-C4gfn0PJ.mjs +0 -6
  401. /package/dist/{adapters-OQCImOL7.d.mts → adapters-BiRymx02.d.mts} +0 -0
  402. /package/dist/{api-tokens-CYUoFGo7.mjs → api-tokens-Ypaly90d.mjs} +0 -0
  403. /package/dist/{challenge-store-DFxX0_15.mjs → challenge-store-D5pSY2S1.mjs} +0 -0
  404. /package/dist/{components--pg6zBvu.mjs → components-DImzlLhb.mjs} +0 -0
  405. /package/dist/{context-types-r8oFvyOq.mjs → context-types-eBuMDAg-.mjs} +0 -0
  406. /package/dist/{default-B6iaLvP7.mjs → default-D4Vygcy_.mjs} +0 -0
  407. /package/dist/{email-console-BOVqIYpB.mjs → email-console-Bp0r68iF.mjs} +0 -0
  408. /package/dist/{escape-BDgouFFY.mjs → escape-DN4Qmjsl.mjs} +0 -0
  409. /package/dist/{hash-BPmX6P8I.mjs → hash-mxxx2oPW.mjs} +0 -0
  410. /package/dist/{mime-CbKsKDCB.mjs → mime-C0vOHFm7.mjs} +0 -0
  411. /package/dist/{mode-CZqCF9dZ.mjs → mode-C8yZnIlR.mjs} +0 -0
  412. /package/dist/{oauth-state-store-qncPB_IU.mjs → oauth-state-store-CndT35iw.mjs} +0 -0
  413. /package/dist/{oauth-user-lookup-BFjWF8wK.mjs → oauth-user-lookup-CMehAaKs.mjs} +0 -0
  414. /package/dist/{options-LsPjZlqD.mjs → options-DQPTH5n0.mjs} +0 -0
  415. /package/dist/{passkey-config-DzHQK90v.mjs → passkey-config-NYukYGed.mjs} +0 -0
  416. /package/dist/{patterns-DKAX6oqN.mjs → patterns-CoqlXUvk.mjs} +0 -0
  417. /package/dist/{provider-loader-DzUxejk7.mjs → provider-loader-BtfrrzfD.mjs} +0 -0
  418. /package/dist/{public-url-B_m9IwdV.mjs → public-url-Cp6hyjVR.mjs} +0 -0
  419. /package/dist/{redirect-BjIBtDWY.mjs → redirect-DrbEmU9a.mjs} +0 -0
  420. /package/dist/{request-cache-ho99schz.mjs → request-cache-CBFjCwSt.mjs} +0 -0
  421. /package/dist/{resolve-DTuDyYKs.mjs → resolve-DE71WcL9.mjs} +0 -0
  422. /package/dist/{setup-nonce-pyGfc9hV.mjs → setup-nonce-BtkKnvxQ.mjs} +0 -0
  423. /package/dist/{sidecar-client-mJxwayYN.mjs → sidecar-client-Ctzfyyp-.mjs} +0 -0
  424. /package/dist/{slugify-BqebcqBg.mjs → slugify-KSsVD_D3.mjs} +0 -0
  425. /package/dist/{ssrf-DiKqWd3N.mjs → ssrf-FJqwQzj4.mjs} +0 -0
  426. /package/dist/{tokens-SLmgowfd.mjs → tokens-BDQU29Vd.mjs} +0 -0
  427. /package/dist/{transaction-CFLhEOuH.mjs → transaction-0LEAAy8R.mjs} +0 -0
  428. /package/dist/{transport-BnsNxh2l.d.mts → transport-D9pKAzFP.d.mts} +0 -0
  429. /package/dist/{trusted-proxy-BgIIcbsN.mjs → trusted-proxy-Dm7Mxvt6.mjs} +0 -0
  430. /package/dist/{types-CJ8DkL0q.mjs → types-B7TDDFMG.mjs} +0 -0
  431. /package/dist/{types-Dryvv7LH.d.mts → types-g0zMtraY.d.mts} +0 -0
  432. /package/dist/{types-Cg276-3z.mjs → types-mVVgRPaU.mjs} +0 -0
  433. /package/dist/{types-DZpT-PnG.d.mts → types-wFu80FrO.d.mts} +0 -0
  434. /package/dist/{url-w7Mp5qAD.mjs → url-EMAguGVk.mjs} +0 -0
@@ -1,5 +1,5 @@
1
- import { a as ContextRepository, i as parseSiteBriefingScope, n as SiteBriefingError } from "./briefing-CkTee1ex.mjs";
2
- import { b as toPublicContextEntry, x as toPublicContextEntryPage, y as toPublicContextDiff } from "./site-context-C8Az_P_I.mjs";
1
+ import { _ as toPublicContextDiff, v as toPublicContextEntry, y as toPublicContextEntryPage } from "./site-context-B8T1kpUP.mjs";
2
+ import { a as ContextRepository, i as parseSiteBriefingScope, n as SiteBriefingError } from "./briefing-0rf-su3-.mjs";
3
3
 
4
4
  //#region src/api/handlers/context.ts
5
5
  async function handleContextEntryList(db, input = {}) {
@@ -1,14 +1,16 @@
1
1
  import { n as validateJsonFieldName } from "./validate-VPnKoIzW.mjs";
2
2
  import { c as jsonExtractExpr } from "./dialect-helpers-fk43GbDb.mjs";
3
- import { i as encodeCursor, r as decodeCursor } from "./types-CSgR9nQB.mjs";
4
- import { t as ContentRepository } from "./content-CBxYGWfL.mjs";
5
- import { t as MediaRepository } from "./media-CbKyYukG.mjs";
6
- import { t as UserRepository } from "./user-DTLoZs16.mjs";
7
- import { t as OptionsRepository } from "./options-LsPjZlqD.mjs";
8
- import { t as withTransaction } from "./transaction-CFLhEOuH.mjs";
9
- import { t as SeoRepository } from "./seo-CLj8lS7Q.mjs";
10
- import { a as validateExternalUrl, i as stripCredentialHeaders, t as SsrfError } from "./ssrf-DiKqWd3N.mjs";
11
- import { t as CronAccessImpl } from "./cron-DxCAU_Sn.mjs";
3
+ import { i as encodeCursor, r as decodeCursor } from "./types-ChxYDRvx.mjs";
4
+ import { t as ContentRepository } from "./content-DJcAYFhz.mjs";
5
+ import { t as MediaRepository } from "./media-CVMOoywq.mjs";
6
+ import { t as UserRepository } from "./user-BH-n01y3.mjs";
7
+ import { t as OptionsRepository } from "./options-DQPTH5n0.mjs";
8
+ import { t as withTransaction } from "./transaction-0LEAAy8R.mjs";
9
+ import { t as enrichImageMetadata } from "./enrich-Ck9tfMqe.mjs";
10
+ import { t as SeoRepository } from "./seo-BU8MLCS9.mjs";
11
+ import { a as markContentMediaUsageCollectionStaleSafely } from "./content-refresh-B4ZCmxgd.mjs";
12
+ import { a as validateExternalUrl, i as stripCredentialHeaders, t as SsrfError } from "./ssrf-FJqwQzj4.mjs";
13
+ import { t as CronAccessImpl } from "./cron-B1SL_lsb.mjs";
12
14
  import { sql } from "kysely";
13
15
  import { ulid } from "ulidx";
14
16
 
@@ -486,37 +488,58 @@ function createContentAccessWithWrite(db) {
486
488
  ...createContentAccess(db),
487
489
  async create(collection, data) {
488
490
  const { fields, seo } = splitSeoFromInput(data);
489
- return withTransaction(db, async (trx) => {
490
- const trxContentRepo = new ContentRepository(trx);
491
- const trxSeoRepo = new SeoRepository(trx);
492
- const hasSeo = await assertSeoEnabled(trxSeoRepo, collection, seo);
493
- const item = await trxContentRepo.create({
494
- type: collection,
495
- data: fields
491
+ let contentMutated = false;
492
+ try {
493
+ const created = await withTransaction(db, async (trx) => {
494
+ const trxContentRepo = new ContentRepository(trx);
495
+ const trxSeoRepo = new SeoRepository(trx);
496
+ const hasSeo = await assertSeoEnabled(trxSeoRepo, collection, seo);
497
+ const item = await trxContentRepo.create({
498
+ type: collection,
499
+ data: fields
500
+ });
501
+ contentMutated = true;
502
+ const result = toPluginContentItem(item);
503
+ if (hasSeo) result.seo = seo !== void 0 ? await trxSeoRepo.upsert(collection, item.id, seo) : await trxSeoRepo.get(collection, item.id);
504
+ return result;
496
505
  });
497
- const result = toPluginContentItem(item);
498
- if (hasSeo) result.seo = seo !== void 0 ? await trxSeoRepo.upsert(collection, item.id, seo) : await trxSeoRepo.get(collection, item.id);
499
- return result;
500
- });
506
+ await markContentMediaUsageCollectionStaleSafely(db, collection, "CONTENT_USAGE_STALE");
507
+ return created;
508
+ } catch (error) {
509
+ if (contentMutated) await markContentMediaUsageCollectionStaleSafely(db, collection, "CONTENT_USAGE_STALE");
510
+ throw error;
511
+ }
501
512
  },
502
513
  async update(collection, id, data) {
503
514
  const { fields, seo } = splitSeoFromInput(data);
504
- return withTransaction(db, async (trx) => {
505
- const trxContentRepo = new ContentRepository(trx);
506
- const trxSeoRepo = new SeoRepository(trx);
507
- const hasSeo = await assertSeoEnabled(trxSeoRepo, collection, seo);
508
- const item = Object.keys(fields).length > 0 ? await trxContentRepo.update(collection, id, { data: fields }) : await (async () => {
509
- const existing = await trxContentRepo.findById(collection, id);
510
- if (!existing) throw new Error("Content not found");
511
- return existing;
512
- })();
513
- const result = toPluginContentItem(item);
514
- if (hasSeo) result.seo = seo !== void 0 ? await trxSeoRepo.upsert(collection, item.id, seo) : await trxSeoRepo.get(collection, item.id);
515
- return result;
516
- });
515
+ const hasFieldUpdates = Object.keys(fields).length > 0;
516
+ let contentMutated = false;
517
+ try {
518
+ const updated = await withTransaction(db, async (trx) => {
519
+ const trxContentRepo = new ContentRepository(trx);
520
+ const trxSeoRepo = new SeoRepository(trx);
521
+ const hasSeo = await assertSeoEnabled(trxSeoRepo, collection, seo);
522
+ const item = hasFieldUpdates ? await trxContentRepo.update(collection, id, { data: fields }) : await (async () => {
523
+ const existing = await trxContentRepo.findById(collection, id);
524
+ if (!existing) throw new Error("Content not found");
525
+ return existing;
526
+ })();
527
+ if (hasFieldUpdates) contentMutated = true;
528
+ const result = toPluginContentItem(item);
529
+ if (hasSeo) result.seo = seo !== void 0 ? await trxSeoRepo.upsert(collection, item.id, seo) : await trxSeoRepo.get(collection, item.id);
530
+ return result;
531
+ });
532
+ if (hasFieldUpdates) await markContentMediaUsageCollectionStaleSafely(db, collection, "CONTENT_USAGE_STALE");
533
+ return updated;
534
+ } catch (error) {
535
+ if (contentMutated) await markContentMediaUsageCollectionStaleSafely(db, collection, "CONTENT_USAGE_STALE");
536
+ throw error;
537
+ }
517
538
  },
518
539
  async delete(collection, id) {
519
- return new ContentRepository(db).delete(collection, id);
540
+ const deleted = await new ContentRepository(db).delete(collection, id);
541
+ if (deleted) await markContentMediaUsageCollectionStaleSafely(db, collection, "CONTENT_USAGE_STALE");
542
+ return deleted;
520
543
  }
521
544
  };
522
545
  }
@@ -561,13 +584,38 @@ function createMediaAccess(db) {
561
584
  }
562
585
  /**
563
586
  * Create full media access with write operations.
564
- * If storage is not provided, upload() will throw at call time.
587
+ *
588
+ * `getUploadUrlFn` is optional. When it is omitted and storage is configured,
589
+ * `getUploadUrl()` is derived from storage by creating a pending media row and
590
+ * signed upload URL, matching the REST signed-upload path. `upload()` only
591
+ * needs storage. If storage is not provided, both throw at call time.
565
592
  */
566
593
  function createMediaAccessWithWrite(db, getUploadUrlFn, storage) {
567
594
  const mediaRepo = new MediaRepository(db);
595
+ const readAccess = createMediaAccess(db);
596
+ const getUploadUrl = getUploadUrlFn ?? (async (filename, contentType) => {
597
+ if (!storage) throw new Error("Media getUploadUrl() requires a storage backend. Configure storage in PluginContextFactoryOptions.");
598
+ const basename = filename.split("/").pop() ?? filename;
599
+ const dotIdx = basename.lastIndexOf(".");
600
+ const ext = dotIdx > 0 ? basename.slice(dotIdx).toLowerCase() : "";
601
+ const storageKey = `${ulid()}${ext}`;
602
+ const media = await mediaRepo.createPending({
603
+ filename: basename,
604
+ mimeType: contentType,
605
+ storageKey
606
+ });
607
+ return {
608
+ uploadUrl: (await storage.getSignedUploadUrl({
609
+ key: storageKey,
610
+ contentType,
611
+ expiresIn: 3600
612
+ })).url,
613
+ mediaId: media.id
614
+ };
615
+ });
568
616
  return {
569
- ...createMediaAccess(db),
570
- getUploadUrl: getUploadUrlFn,
617
+ ...readAccess,
618
+ getUploadUrl,
571
619
  async upload(filename, contentType, bytes) {
572
620
  if (!storage) throw new Error("Media upload() requires a storage backend. Configure storage in PluginContextFactoryOptions.");
573
621
  const keyPrefix = ulid();
@@ -579,6 +627,7 @@ function createMediaAccessWithWrite(db, getUploadUrlFn, storage) {
579
627
  body: new Uint8Array(bytes),
580
628
  contentType
581
629
  });
630
+ const enriched = await enrichImageMetadata(new Uint8Array(bytes), contentType);
582
631
  let media;
583
632
  try {
584
633
  media = await mediaRepo.create({
@@ -586,7 +635,11 @@ function createMediaAccessWithWrite(db, getUploadUrlFn, storage) {
586
635
  mimeType: contentType,
587
636
  size: bytes.byteLength,
588
637
  storageKey,
589
- status: "ready"
638
+ status: "ready",
639
+ width: enriched.width,
640
+ height: enriched.height,
641
+ blurhash: enriched.blurhash,
642
+ dominantColor: enriched.dominantColor
590
643
  });
591
644
  } catch (error) {
592
645
  try {
@@ -650,13 +703,13 @@ function createHttpAccess(pluginId, allowedHosts) {
650
703
  * No host validation, but applies SSRF protection on redirect targets to
651
704
  * prevent plugins from being tricked into reaching internal services.
652
705
  */
653
- function createUnrestrictedHttpAccess(pluginId) {
706
+ function createUnrestrictedHttpAccess(pluginId, options = {}) {
654
707
  return { async fetch(url, init) {
655
708
  let currentUrl = url;
656
709
  let currentInit = init;
657
710
  for (let i = 0; i <= MAX_PLUGIN_REDIRECTS; i++) {
658
711
  try {
659
- validateExternalUrl(currentUrl);
712
+ if (!isAllowedDevelopmentLoopback(currentUrl, options.allowDevelopmentLoopback)) validateExternalUrl(currentUrl);
660
713
  } catch (e) {
661
714
  const msg = e instanceof SsrfError ? e.message : "SSRF validation failed";
662
715
  throw new Error(`Plugin "${pluginId}": blocked fetch to "${new URL(currentUrl).hostname}": ${msg}`, { cause: e });
@@ -675,6 +728,17 @@ function createUnrestrictedHttpAccess(pluginId) {
675
728
  throw new Error(`Plugin "${pluginId}": too many redirects (max ${MAX_PLUGIN_REDIRECTS})`);
676
729
  } };
677
730
  }
731
+ function isAllowedDevelopmentLoopback(url, capability = false) {
732
+ if (!capability || process.env.NODE_ENV !== "development") return false;
733
+ let parsed;
734
+ try {
735
+ parsed = new URL(url);
736
+ } catch {
737
+ return false;
738
+ }
739
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return false;
740
+ return parsed.hostname === "127.0.0.1" || parsed.hostname === "[::1]";
741
+ }
678
742
  /**
679
743
  * Create logger for a plugin
680
744
  */
@@ -774,17 +838,17 @@ function createUserAccess(db) {
774
838
  * Factory for creating plugin contexts
775
839
  */
776
840
  var PluginContextFactory = class {
777
- optionsRepo;
778
- db;
841
+ resolveDb;
779
842
  storage;
780
843
  getUploadUrl;
781
844
  site;
782
845
  urlHelper;
783
846
  cronReschedule;
784
847
  emailPipeline;
848
+ warnedMissingMediaBackend = /* @__PURE__ */ new Set();
785
849
  constructor(options) {
786
- this.db = options.db;
787
- this.optionsRepo = new OptionsRepository(options.db);
850
+ const fixedDb = options.db;
851
+ this.resolveDb = options.getDb ?? (() => fixedDb);
788
852
  this.storage = options.storage;
789
853
  this.getUploadUrl = options.getUploadUrl;
790
854
  this.site = createSiteInfo(options.siteInfo ?? {});
@@ -797,22 +861,30 @@ var PluginContextFactory = class {
797
861
  */
798
862
  createContext(plugin) {
799
863
  const capabilities = new Set(plugin.capabilities);
800
- const kv = createKVAccess(this.optionsRepo, plugin.id);
864
+ const db = this.resolveDb();
865
+ const kv = createKVAccess(new OptionsRepository(db), plugin.id);
801
866
  const log = createLogAccess(plugin.id);
802
- const storage = createStorageAccess(this.db, plugin.id, plugin.storage);
867
+ const storage = createStorageAccess(db, plugin.id, plugin.storage);
803
868
  let content;
804
- if (capabilities.has("content:write")) content = createContentAccessWithWrite(this.db);
805
- else if (capabilities.has("content:read")) content = createContentAccess(this.db);
869
+ if (capabilities.has("content:write")) content = createContentAccessWithWrite(db);
870
+ else if (capabilities.has("content:read")) content = createContentAccess(db);
806
871
  let media;
807
- if (capabilities.has("media:write") && this.getUploadUrl) media = createMediaAccessWithWrite(this.db, this.getUploadUrl, this.storage);
808
- else if (capabilities.has("media:read")) media = createMediaAccess(this.db);
872
+ if (capabilities.has("media:write")) if (this.getUploadUrl || this.storage) media = createMediaAccessWithWrite(db, this.getUploadUrl, this.storage);
873
+ else {
874
+ if (!this.warnedMissingMediaBackend.has(plugin.id)) {
875
+ this.warnedMissingMediaBackend.add(plugin.id);
876
+ log.warn("declares the media:write capability but no storage backend is configured; upload() is unavailable.");
877
+ }
878
+ if (capabilities.has("media:read")) media = createMediaAccess(db);
879
+ }
880
+ else if (capabilities.has("media:read")) media = createMediaAccess(db);
809
881
  let http;
810
- if (capabilities.has("network:request:unrestricted")) http = createUnrestrictedHttpAccess(plugin.id);
882
+ if (capabilities.has("network:request:unrestricted")) http = createUnrestrictedHttpAccess(plugin.id, { allowDevelopmentLoopback: capabilities.has("network:request:development-loopback") });
811
883
  else if (capabilities.has("network:request")) http = createHttpAccess(plugin.id, plugin.allowedHosts);
812
884
  let users;
813
- if (capabilities.has("users:read")) users = createUserAccess(this.db);
885
+ if (capabilities.has("users:read")) users = createUserAccess(db);
814
886
  let cron;
815
- if (this.cronReschedule) cron = new CronAccessImpl(this.db, plugin.id, this.cronReschedule);
887
+ if (this.cronReschedule) cron = new CronAccessImpl(db, plugin.id, this.cronReschedule);
816
888
  let email;
817
889
  if (capabilities.has("email:send") && this.emailPipeline?.isAvailable()) {
818
890
  const pipeline = this.emailPipeline;
@@ -1,4 +1,5 @@
1
- import { T as resolveActorIdentity, p as logSiteActivitySafely } from "./activity-events-CwM7yxPW.mjs";
1
+ import { n as resolveActorIdentity } from "./actor-0QJ1Gbtf.mjs";
2
+ import { p as logSiteActivitySafely } from "./activity-events-CJDvE2uc.mjs";
2
3
 
3
4
  //#region src/api/context-route-helpers.ts
4
5
  function resolveContextRouteActor(locals) {
@@ -17,13 +17,17 @@ const MAX_ONESHOT_RETRIES = 5;
17
17
  /**
18
18
  * Executes overdue cron tasks.
19
19
  *
20
- * Called by platform-specific schedulers (NodeCronScheduler, DinewayScheduler DO,
21
- * PiggybackScheduler). Stateless — all state lives in the database.
20
+ * Called by schedulers (NodeCronScheduler, PiggybackScheduler). Stateless —
21
+ * all state lives in the database.
22
22
  */
23
23
  var CronExecutor = class {
24
+ resolveDb;
24
25
  constructor(db, invokeCronHook) {
25
- this.db = db;
26
26
  this.invokeCronHook = invokeCronHook;
27
+ this.resolveDb = typeof db === "function" ? db : () => db;
28
+ }
29
+ get db() {
30
+ return this.resolveDb();
27
31
  }
28
32
  /**
29
33
  * Process all overdue tasks.
@@ -1,8 +1,8 @@
1
1
  import { t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
2
- import { t as ContentRepository } from "./content-CBxYGWfL.mjs";
3
- import { t as MediaRepository } from "./media-CbKyYukG.mjs";
4
- import { t as UserRepository } from "./user-DTLoZs16.mjs";
5
- import { t as ReviewRequestRepository } from "./review-requests-BW2NxY-l.mjs";
2
+ import { t as ContentRepository } from "./content-DJcAYFhz.mjs";
3
+ import { t as MediaRepository } from "./media-CVMOoywq.mjs";
4
+ import { t as UserRepository } from "./user-BH-n01y3.mjs";
5
+ import { t as ReviewRequestRepository } from "./review-requests-CTWGnWUt.mjs";
6
6
  import { sql } from "kysely";
7
7
 
8
8
  //#region src/api/handlers/dashboard.ts
@@ -1,4 +1,4 @@
1
- import "../types-CuJOqHfM.mjs";
2
- import { a as SqliteConfig, c as sqlite, i as PostgresConfig, n as DatabaseDialectType, o as libsql, r as LibsqlConfig, s as postgres, t as DatabaseDescriptor } from "../adapters-OQCImOL7.mjs";
3
- import { i as runMigrations, n as getMigrationStatus, r as rollbackMigration, t as MigrationStatus } from "../runner-09sTqtv0.mjs";
1
+ import "../types-DuQn1G7-.mjs";
2
+ import { i as runMigrations, n as getMigrationStatus, r as rollbackMigration, t as MigrationStatus } from "../runner-D6hzs8L9.mjs";
3
+ import { a as SqliteConfig, c as sqlite, i as PostgresConfig, n as DatabaseDialectType, o as libsql, r as LibsqlConfig, s as postgres, t as DatabaseDescriptor } from "../adapters-BiRymx02.mjs";
4
4
  export { type DatabaseDescriptor, type DatabaseDialectType, type LibsqlConfig, type MigrationStatus, type PostgresConfig, type SqliteConfig, getMigrationStatus, libsql, postgres, rollbackMigration, runMigrations, sqlite };
package/dist/db/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { i as runMigrations, n as getMigrationStatus, r as rollbackMigration } from "../runner-DzIpHGND.mjs";
1
+ import { i as runMigrations, n as getMigrationStatus, r as rollbackMigration } from "../runner-BgmttQmD.mjs";
2
2
  import "../dialect-helpers-fk43GbDb.mjs";
3
3
 
4
4
  //#region src/db/adapters.ts
@@ -1,4 +1,4 @@
1
- import { r as LibsqlConfig } from "../adapters-OQCImOL7.mjs";
1
+ import { r as LibsqlConfig } from "../adapters-BiRymx02.mjs";
2
2
  import { Dialect } from "kysely";
3
3
 
4
4
  //#region src/db/libsql.d.ts
@@ -1,4 +1,4 @@
1
- import { i as PostgresConfig } from "../adapters-OQCImOL7.mjs";
1
+ import { i as PostgresConfig } from "../adapters-BiRymx02.mjs";
2
2
  import { PostgresDialect } from "kysely";
3
3
 
4
4
  //#region src/db/postgres.d.ts
@@ -1,4 +1,4 @@
1
- import { a as SqliteConfig } from "../adapters-OQCImOL7.mjs";
1
+ import { a as SqliteConfig } from "../adapters-BiRymx02.mjs";
2
2
  import { Dialect } from "kysely";
3
3
 
4
4
  //#region src/db/sqlite.d.ts
@@ -1,8 +1,8 @@
1
- import { t as withTransaction } from "./transaction-CFLhEOuH.mjs";
2
- import { a as filterExperimentalSiteContextWorkflowScopes, i as experimentalSiteContextWorkflowsEnabled, o as getExperimentalSiteContextWorkflowScopesDisabledMessage, r as disabledExperimentalSiteContextWorkflowScopes } from "./experimental-workflows-CSMffP6q.mjs";
3
- import { a as hashApiToken, n as TOKEN_PREFIXES, r as generatePrefixedToken, t as ALL_VALID_SCOPES } from "./api-tokens-CYUoFGo7.mjs";
4
- import { o as lookupOAuthClient } from "./oauth-clients-Du-V0fEm.mjs";
5
- import { t as lookupUserRoleAndStatus } from "./oauth-user-lookup-BFjWF8wK.mjs";
1
+ import { t as withTransaction } from "./transaction-0LEAAy8R.mjs";
2
+ import { a as hashApiToken, n as TOKEN_PREFIXES, r as generatePrefixedToken, t as ALL_VALID_SCOPES } from "./api-tokens-Ypaly90d.mjs";
3
+ import { a as filterExperimentalSiteContextWorkflowScopes, i as experimentalSiteContextWorkflowsEnabled, o as getExperimentalSiteContextWorkflowScopesDisabledMessage, r as disabledExperimentalSiteContextWorkflowScopes } from "./experimental-workflows-GVhUgzEs.mjs";
4
+ import { o as lookupOAuthClient } from "./oauth-clients-Dwl32-Uj.mjs";
5
+ import { t as lookupUserRoleAndStatus } from "./oauth-user-lookup-CMehAaKs.mjs";
6
6
  import { clampScopes } from "@dineway-ai/auth";
7
7
  import { generateCodeVerifier } from "arctic";
8
8
 
@@ -1,3 +1,4 @@
1
+ import { n as normalizeMime } from "./mime-C0vOHFm7.mjs";
1
2
  import { encode } from "blurhash";
2
3
  import { imageSize } from "image-size";
3
4
 
@@ -67,8 +68,9 @@ function extractDominantColor(data, width, height) {
67
68
  }
68
69
  /**
69
70
  * Read image dimensions from headers without decoding pixel data.
71
+ * Returns null when the header cannot be parsed.
70
72
  */
71
- function getImageDimensions(buffer) {
73
+ function readDimensions(buffer) {
72
74
  try {
73
75
  const result = imageSize(buffer);
74
76
  if (result.width != null && result.height != null) return {
@@ -84,17 +86,18 @@ function getImageDimensions(buffer) {
84
86
  * Generate blurhash and dominant color from an image buffer.
85
87
  * Returns null for non-image MIME types or on failure.
86
88
  *
87
- * @param dimensions - Optional pre-known dimensions. Used as a fallback when
88
- * image-size cannot parse the buffer (e.g. truncated headers). When the
89
- * decoded size (width * height * 4) exceeds MAX_DECODED_BYTES, placeholder
90
- * generation is skipped to avoid OOM on memory-constrained runtimes.
89
+ * @param dimensions - Optional pre-known dimensions. When present they are
90
+ * trusted as bounds for the buffer that will be decoded; otherwise dimensions
91
+ * are read from this buffer's header. Generation is skipped when no dimensions
92
+ * are available or when the decoded size exceeds MAX_DECODED_BYTES.
91
93
  */
92
94
  async function generatePlaceholder(buffer, mimeType, dimensions) {
93
- const format = SUPPORTED_TYPES[mimeType];
95
+ const format = SUPPORTED_TYPES[normalizeMime(mimeType)];
94
96
  if (!format) return null;
95
97
  try {
96
- const dims = getImageDimensions(buffer) ?? dimensions;
97
- if (dims && dims.width * dims.height * 4 > MAX_DECODED_BYTES) return null;
98
+ const dims = dimensions ?? readDimensions(buffer);
99
+ if (!dims) return null;
100
+ if (dims.width * dims.height * 4 > MAX_DECODED_BYTES) return null;
98
101
  const { width, height, data } = format === "jpeg" ? await decodeJpeg(buffer) : await decodePng(buffer);
99
102
  if (width === 0 || height === 0) return null;
100
103
  let encodePixels;
@@ -139,4 +142,28 @@ function downsample(src, srcW, srcH, dstW, dstH) {
139
142
  }
140
143
 
141
144
  //#endregion
142
- export { generatePlaceholder as t };
145
+ //#region src/media/enrich.ts
146
+ /**
147
+ * Image Metadata Enrichment
148
+ *
149
+ * Derives dimensions and LQIP placeholders from image bytes. Server-side media
150
+ * creation paths share this helper so direct uploads, signed upload confirms,
151
+ * imports, and plugin uploads store consistent image metadata.
152
+ */
153
+ async function enrichImageMetadata(bytes, contentType, opts) {
154
+ const normalizedContentType = normalizeMime(contentType);
155
+ if (!normalizedContentType.startsWith("image/")) return {};
156
+ const headerDims = readDimensions(bytes) ?? void 0;
157
+ const recordDims = opts?.knownDimensions ?? headerDims;
158
+ const override = opts?.placeholder;
159
+ const placeholder = await generatePlaceholder(override ? override.bytes : bytes, override ? normalizeMime(override.contentType) : normalizedContentType, override ? void 0 : headerDims);
160
+ return {
161
+ width: recordDims?.width,
162
+ height: recordDims?.height,
163
+ blurhash: placeholder?.blurhash,
164
+ dominantColor: placeholder?.dominantColor
165
+ };
166
+ }
167
+
168
+ //#endregion
169
+ export { generatePlaceholder as n, enrichImageMetadata as t };
@@ -61,6 +61,7 @@ const ErrorCode = {
61
61
  URL_PATTERN_EXISTS: "URL_PATTERN_EXISTS",
62
62
  TABLE_NOT_FOUND: "TABLE_NOT_FOUND",
63
63
  FIELD_EXISTS: "FIELD_EXISTS",
64
+ FIELD_TYPE_COLUMN_CHANGE: "FIELD_TYPE_COLUMN_CHANGE",
64
65
  RESERVED_SLUG: "RESERVED_SLUG",
65
66
  INVALID_SLUG: "INVALID_SLUG",
66
67
  INVALID_URL_PATTERN: "INVALID_URL_PATTERN",
@@ -98,6 +99,9 @@ const ErrorCode = {
98
99
  COMMENTS_DISABLED: "COMMENTS_DISABLED",
99
100
  COMMENTS_CLOSED: "COMMENTS_CLOSED",
100
101
  COMMENT_REJECTED: "COMMENT_REJECTED",
102
+ COMMENT_NOT_APPROVED: "COMMENT_NOT_APPROVED",
103
+ REACTION_TOGGLE_ERROR: "REACTION_TOGGLE_ERROR",
104
+ REACTION_COUNTS_ERROR: "REACTION_COUNTS_ERROR",
101
105
  ACCOUNT_DISABLED: "ACCOUNT_DISABLED",
102
106
  ADMIN_EXISTS: "ADMIN_EXISTS",
103
107
  SETUP_COMPLETE: "SETUP_COMPLETE",
@@ -309,6 +313,7 @@ function mapErrorStatus(code) {
309
313
  case ErrorCode.COMMENTS_DISABLED:
310
314
  case ErrorCode.COMMENTS_CLOSED:
311
315
  case ErrorCode.COMMENT_REJECTED:
316
+ case ErrorCode.COMMENT_NOT_APPROVED:
312
317
  case ErrorCode.DOMAIN_NOT_ALLOWED:
313
318
  case ErrorCode.INSUFFICIENT_ROLE:
314
319
  case ErrorCode.CAPABILITY_ESCALATION:
@@ -1,6 +1,6 @@
1
1
  //#region src/site-context/experimental-workflows.ts
2
2
  const EXPERIMENTAL_SITE_CONTEXT_WORKFLOWS_ENV = "DINEWAY_EXPERIMENTAL_SITE_CONTEXT_WORKFLOWS";
3
- const EXPERIMENTAL_SITE_CONTEXT_WORKFLOW_SCOPES = new Set(["workflow:read", "workflow:write"]);
3
+ const EXPERIMENTAL_SITE_CONTEXT_WORKFLOW_SCOPES = /* @__PURE__ */ new Set();
4
4
  var ExperimentalSiteContextWorkflowDisabledError = class extends Error {
5
5
  code = "EXPERIMENTAL_SITE_CONTEXT_WORKFLOW_DISABLED";
6
6
  constructor(message = getExperimentalSiteContextWorkflowsDisabledMessage()) {
@@ -0,0 +1,49 @@
1
+ import { a as __exportAll } from "./runner-BgmttQmD.mjs";
2
+ import { getRequestContext } from "./request-context.mjs";
3
+ import { t as after } from "./after-BfniwgIf.mjs";
4
+ import { r as requestCached } from "./request-cache-CBFjCwSt.mjs";
5
+ import { n as BylineSchemaRegistry } from "./byline-registry-Ba54M74c.mjs";
6
+ import { n as invalidateProcessCache, r as processCachedAsync, t as createProcessCache } from "./process-cache-CCDgti7j.mjs";
7
+
8
+ //#region src/bylines/field-defs-cache.ts
9
+ var field_defs_cache_exports = /* @__PURE__ */ __exportAll({ getBylineFieldDefs: () => getBylineFieldDefs });
10
+ const HOLDER_KEY = Symbol.for("dineway:byline-field-defs");
11
+ const REQUEST_CACHE_KEY_VERSION = "byline-fields-version";
12
+ const REQUEST_CACHE_KEY_DEFS_PREFIX = "byline-field-defs:";
13
+ function getHolder() {
14
+ const existing = Reflect.get(globalThis, HOLDER_KEY);
15
+ if (isFieldDefsHolder(existing)) return existing;
16
+ const holder = {
17
+ cache: createProcessCache(),
18
+ cachedVersion: -1
19
+ };
20
+ Reflect.set(globalThis, HOLDER_KEY, holder);
21
+ return holder;
22
+ }
23
+ function isFieldDefsHolder(value) {
24
+ if (value && typeof value === "object" && "cache" in value && "cachedVersion" in value) {
25
+ const cache = value.cache;
26
+ return typeof value.cachedVersion === "number" && !!cache && typeof cache === "object" && "lock" in cache;
27
+ }
28
+ return false;
29
+ }
30
+ const holder = getHolder();
31
+ async function getBylineFieldsVersion(db) {
32
+ return requestCached(REQUEST_CACHE_KEY_VERSION, () => new BylineSchemaRegistry(db).getVersion());
33
+ }
34
+ async function getBylineFieldDefs(db) {
35
+ const hasDbOverride = !!getRequestContext()?.db;
36
+ const version = await getBylineFieldsVersion(db);
37
+ const dirty = version % 2 !== 0;
38
+ return requestCached(`${REQUEST_CACHE_KEY_DEFS_PREFIX}${version}`, async () => {
39
+ if (hasDbOverride || dirty) return new BylineSchemaRegistry(db).listFields();
40
+ if (holder.cachedVersion !== version) {
41
+ invalidateProcessCache(holder.cache);
42
+ holder.cachedVersion = version;
43
+ }
44
+ return processCachedAsync(holder.cache, () => new BylineSchemaRegistry(db).listFields(), { anchor: (promise) => after(() => promise) });
45
+ });
46
+ }
47
+
48
+ //#endregion
49
+ export { getBylineFieldDefs as n, field_defs_cache_exports as t };