dineway 0.2.32 → 0.2.34

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 (457) hide show
  1. package/dist/{activity-CfryM8jO.mjs → activity-CZnq5YlZ.mjs} +2 -2
  2. package/dist/{activity-events-BVo9rMUz.mjs → activity-events-D-yGV7cW.mjs} +1 -1
  3. package/dist/{actor-DrJJsvy6.mjs → actor-DxUAJgQX.mjs} +20 -6
  4. package/dist/{adapters-DHt3f2lu.d.mts → adapters-BQ8CQbBm.d.mts} +5 -7
  5. package/dist/after-BVaUn7bK.mjs +24 -0
  6. package/dist/{allowed-origins-DtBQa4JR.mjs → allowed-origins-DV3LWuWW.mjs} +1 -1
  7. package/dist/api/route-utils.d.mts +10 -10
  8. package/dist/api/route-utils.mjs +23 -19
  9. package/dist/api/schemas/index.d.mts +1 -1
  10. package/dist/api/schemas/index.mjs +5 -5
  11. package/dist/{api-DF92r_un.mjs → api-CL4pG2zf.mjs} +55 -1215
  12. package/dist/api-tokens-D5K_Csub.mjs +3 -0
  13. package/dist/{api-tokens-CSomx-l3.mjs → api-tokens-_6tMD1W4.mjs} +1 -1
  14. package/dist/{apply-Bs2jXsms.mjs → apply-CYLUMiZg.mjs} +109 -93
  15. package/dist/astro/index.d.mts +16 -12
  16. package/dist/astro/index.mjs +50 -9
  17. package/dist/astro/middleware/auth.d.mts +9 -9
  18. package/dist/astro/middleware/auth.mjs +29 -8
  19. package/dist/astro/middleware/redirect.mjs +8 -7
  20. package/dist/astro/middleware/request-context.mjs +17 -10
  21. package/dist/astro/middleware/seed.d.mts +1 -1
  22. package/dist/astro/middleware/seed.mjs +93 -71
  23. package/dist/astro/middleware/setup.mjs +1 -1
  24. package/dist/astro/middleware/workers.d.mts +6 -0
  25. package/dist/astro/middleware/workers.mjs +8 -0
  26. package/dist/astro/middleware.mjs +288 -159
  27. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -7
  28. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -7
  29. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  30. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  31. package/dist/astro/routes/api/admin/briefing.mjs +25 -23
  32. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +5 -4
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +11 -10
  34. package/dist/astro/routes/api/admin/byline-fields/index.mjs +11 -10
  35. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +11 -10
  36. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +22 -20
  37. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +22 -20
  38. package/dist/astro/routes/api/admin/bylines/index.mjs +22 -20
  39. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +17 -16
  40. package/dist/astro/routes/api/admin/comments/_id_.mjs +8 -7
  41. package/dist/astro/routes/api/admin/comments/bulk.mjs +14 -13
  42. package/dist/astro/routes/api/admin/comments/counts.mjs +8 -7
  43. package/dist/astro/routes/api/admin/comments/index.mjs +14 -13
  44. package/dist/astro/routes/api/admin/context/_id_/history.mjs +43 -31
  45. package/dist/astro/routes/api/admin/context/_id_/index.mjs +43 -31
  46. package/dist/astro/routes/api/admin/context/_id_/review.mjs +48 -36
  47. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +48 -36
  48. package/dist/astro/routes/api/admin/context/diff.mjs +47 -35
  49. package/dist/astro/routes/api/admin/context/index.mjs +48 -36
  50. package/dist/astro/routes/api/admin/context/stale.mjs +47 -35
  51. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +43 -31
  52. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +47 -35
  53. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +47 -35
  54. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +44 -32
  55. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  56. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +7 -7
  57. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +7 -7
  58. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +72 -66
  59. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +72 -66
  60. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +64 -58
  61. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +71 -65
  62. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +71 -65
  63. package/dist/astro/routes/api/admin/plugins/index.mjs +64 -58
  64. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +64 -58
  66. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +71 -65
  67. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +64 -58
  68. package/dist/astro/routes/api/admin/plugins/updates.mjs +64 -58
  69. package/dist/astro/routes/api/admin/review-requests/_id_/image.mjs +26 -23
  70. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +33 -25
  71. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +56 -43
  72. package/dist/astro/routes/api/admin/review-requests/_id_/revoke.mjs +10 -9
  73. package/dist/astro/routes/api/admin/review-requests/index.mjs +54 -41
  74. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +64 -58
  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 +64 -58
  77. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +20 -12
  78. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
  79. package/dist/astro/routes/api/admin/users/_id_/index.mjs +40 -32
  80. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
  81. package/dist/astro/routes/api/admin/users/index.mjs +7 -7
  82. package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -5
  83. package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
  84. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -12
  85. package/dist/astro/routes/api/auth/invite/index.mjs +9 -9
  86. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -11
  87. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  88. package/dist/astro/routes/api/auth/magic-link/send.mjs +12 -11
  89. package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
  90. package/dist/astro/routes/api/auth/me.mjs +11 -11
  91. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  92. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +5 -4
  93. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +5 -4
  94. package/dist/astro/routes/api/auth/passkey/_id_.mjs +7 -7
  95. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  96. package/dist/astro/routes/api/auth/passkey/options.mjs +14 -13
  97. package/dist/astro/routes/api/auth/passkey/register/options.mjs +11 -11
  98. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +12 -12
  99. package/dist/astro/routes/api/auth/passkey/verify.mjs +12 -12
  100. package/dist/astro/routes/api/auth/setup-token/index.mjs +32 -23
  101. package/dist/astro/routes/api/auth/setup-token/verify.mjs +32 -26
  102. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -12
  103. package/dist/astro/routes/api/auth/signup/request.mjs +12 -11
  104. package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
  105. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +21 -18
  106. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +19 -16
  107. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  108. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +8 -7
  109. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +8 -7
  110. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +8 -7
  111. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +24 -21
  112. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +35 -22
  113. package/dist/astro/routes/api/content/_collection_/_id_/release-readiness.mjs +9 -9
  114. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +8 -7
  115. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  116. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +35 -22
  117. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +23 -19
  118. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  119. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +8 -7
  120. package/dist/astro/routes/api/content/_collection_/_id_.mjs +14 -13
  121. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  122. package/dist/astro/routes/api/content/_collection_/index.mjs +14 -13
  123. package/dist/astro/routes/api/content/_collection_/trash.mjs +8 -8
  124. package/dist/astro/routes/api/dashboard.mjs +16 -11
  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 +25 -24
  129. package/dist/astro/routes/api/import/wordpress/analyze.mjs +12 -11
  130. package/dist/astro/routes/api/import/wordpress/execute.d.mts +9 -9
  131. package/dist/astro/routes/api/import/wordpress/execute.mjs +51 -42
  132. package/dist/astro/routes/api/import/wordpress/media.d.mts +9 -9
  133. package/dist/astro/routes/api/import/wordpress/media.mjs +14 -14
  134. package/dist/astro/routes/api/import/wordpress/prepare.mjs +52 -40
  135. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +10 -10
  136. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +50 -38
  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 +29 -27
  139. package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
  140. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +9 -9
  141. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +56 -47
  142. package/dist/astro/routes/api/integration/artifact.mjs +11 -8
  143. package/dist/astro/routes/api/integration/dispatch.mjs +17 -14
  144. package/dist/astro/routes/api/integrations/_provider_.mjs +11 -8
  145. package/dist/astro/routes/api/integrations/index.mjs +10 -7
  146. package/dist/astro/routes/api/manifest.mjs +5 -5
  147. package/dist/astro/routes/api/mcp.mjs +98 -88
  148. package/dist/astro/routes/api/media/_id_/confirm.mjs +12 -12
  149. package/dist/astro/routes/api/media/_id_.mjs +9 -9
  150. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  151. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  152. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  153. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  154. package/dist/astro/routes/api/media/upload-url.mjs +13 -13
  155. package/dist/astro/routes/api/media.mjs +16 -16
  156. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +48 -36
  157. package/dist/astro/routes/api/menus/_name_/items.mjs +48 -36
  158. package/dist/astro/routes/api/menus/_name_/reorder.mjs +48 -36
  159. package/dist/astro/routes/api/menus/_name_/translations.mjs +48 -36
  160. package/dist/astro/routes/api/menus/_name_.mjs +48 -36
  161. package/dist/astro/routes/api/menus/index.mjs +48 -36
  162. package/dist/astro/routes/api/oauth/authorize.mjs +9 -7
  163. package/dist/astro/routes/api/oauth/device/authorize.mjs +7 -6
  164. package/dist/astro/routes/api/oauth/device/code.mjs +11 -9
  165. package/dist/astro/routes/api/oauth/device/token.mjs +10 -8
  166. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  167. package/dist/astro/routes/api/oauth/token/refresh.mjs +7 -6
  168. package/dist/astro/routes/api/oauth/token/revoke.mjs +7 -6
  169. package/dist/astro/routes/api/oauth/token.mjs +8 -6
  170. package/dist/astro/routes/api/openapi.json.mjs +5 -5
  171. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
  172. package/dist/astro/routes/api/redirects/404s/index.mjs +15 -14
  173. package/dist/astro/routes/api/redirects/404s/summary.mjs +15 -14
  174. package/dist/astro/routes/api/redirects/_id_.mjs +48 -37
  175. package/dist/astro/routes/api/redirects/index.mjs +48 -37
  176. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  177. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  178. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +66 -60
  179. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +66 -60
  180. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +66 -60
  181. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +66 -60
  182. package/dist/astro/routes/api/schema/collections/index.mjs +66 -60
  183. package/dist/astro/routes/api/schema/index.mjs +12 -11
  184. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +64 -58
  185. package/dist/astro/routes/api/schema/orphans/index.mjs +64 -58
  186. package/dist/astro/routes/api/search/enable.mjs +15 -14
  187. package/dist/astro/routes/api/search/index.mjs +14 -13
  188. package/dist/astro/routes/api/search/rebuild.mjs +15 -14
  189. package/dist/astro/routes/api/search/stats.mjs +9 -8
  190. package/dist/astro/routes/api/search/suggest.mjs +14 -13
  191. package/dist/astro/routes/api/sections/_slug_.mjs +48 -36
  192. package/dist/astro/routes/api/sections/index.mjs +48 -36
  193. package/dist/astro/routes/api/settings/email.mjs +5 -5
  194. package/dist/astro/routes/api/settings/reviews.mjs +11 -10
  195. package/dist/astro/routes/api/settings.mjs +48 -36
  196. package/dist/astro/routes/api/setup/admin-verify.mjs +14 -14
  197. package/dist/astro/routes/api/setup/admin.mjs +12 -12
  198. package/dist/astro/routes/api/setup/dev-bypass.mjs +35 -31
  199. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  200. package/dist/astro/routes/api/setup/index.mjs +37 -33
  201. package/dist/astro/routes/api/setup/status.mjs +3 -3
  202. package/dist/astro/routes/api/snapshot.mjs +11 -9
  203. package/dist/astro/routes/api/system/heartbeat.mjs +2 -2
  204. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +51 -39
  205. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +51 -39
  206. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +51 -39
  207. package/dist/astro/routes/api/taxonomies/index.mjs +51 -39
  208. package/dist/astro/routes/api/themes/preview.mjs +8 -6
  209. package/dist/astro/routes/api/typegen.mjs +4 -4
  210. package/dist/astro/routes/api/well-known/auth.mjs +3 -3
  211. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
  212. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
  213. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +47 -35
  214. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +48 -36
  215. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +48 -36
  216. package/dist/astro/routes/api/widget-areas/_name_.mjs +45 -33
  217. package/dist/astro/routes/api/widget-areas/index.mjs +48 -36
  218. package/dist/astro/routes/api/widget-components.mjs +2 -2
  219. package/dist/astro/routes/robots.txt.mjs +11 -10
  220. package/dist/astro/routes/sitemap-_collection_.xml.mjs +20 -18
  221. package/dist/astro/routes/sitemap.xml.mjs +19 -17
  222. package/dist/astro/session-driver.d.mts +1 -1
  223. package/dist/astro/session-driver.mjs +4 -4
  224. package/dist/astro/types.d.mts +13 -13
  225. package/dist/atomic-authority-CnBQJ14T.mjs +33 -0
  226. package/dist/{audit-CYjfxG9i.mjs → audit-F5iWkbcJ.mjs} +11 -4
  227. package/dist/auth/providers/github.d.mts +1 -1
  228. package/dist/auth/providers/google.d.mts +1 -1
  229. package/dist/{auth-control-guard-CITT8ZA_.mjs → auth-control-guard-D4WW-wFF.mjs} +1 -1
  230. package/dist/{authorize-KcI0pAfN.mjs → authorize-EnP57AQl.mjs} +1 -1
  231. package/dist/{briefing-r3hXCDQC.mjs → briefing-BXsVwd4P.mjs} +1 -1
  232. package/dist/{briefing-BgQTljQt.mjs → briefing-CkCi6S-W.mjs} +445 -447
  233. package/dist/{bundle-S6zx-V4D.mjs → bundle-Cgak1zGE.mjs} +3 -3
  234. package/dist/{byline-Ctil4rij.mjs → byline-DEZKlzD9.mjs} +107 -113
  235. package/dist/{byline-fields-QpmruT5r.mjs → byline-fields-BGEIA9dZ.mjs} +3 -3
  236. package/dist/{byline-fields-DNXKWUW9.d.mts → byline-fields-BmkhEDFF.d.mts} +2 -2
  237. package/dist/{byline-fields-DiCyW6eQ.mjs → byline-fields-Qg8TesxL.mjs} +1 -1
  238. package/dist/{byline-registry-rkr73qSE.mjs → byline-registry-CkuVVeJJ.mjs} +46 -76
  239. package/dist/{bylines-BcuBpzVi.mjs → bylines-7BQxRGyG.mjs} +4 -4
  240. package/dist/{bylines-v_ZUQnR-.mjs → bylines-LqNRjma2.mjs} +6 -6
  241. package/dist/{cache-V2BCplaY.mjs → cache-CSTy-R-K.mjs} +2 -2
  242. package/dist/{chunks-CnuL55JE.mjs → chunks-BnG3LPMN.mjs} +1 -1
  243. package/dist/cli/index.mjs +452 -263
  244. package/dist/cli/plugin-kit.d.mts +9 -9
  245. package/dist/cli/plugin-kit.mjs +2 -2
  246. package/dist/client/external-auth-headers.d.mts +1 -1
  247. package/dist/client/index.d.mts +11 -11
  248. package/dist/client/index.mjs +2 -2
  249. package/dist/{client-factory-C-y9VZDX.mjs → client-factory-BLSkgsTg.mjs} +1 -1
  250. package/dist/{comment-_nvJSS-A.mjs → comment-Bi7cJ9SS.mjs} +2 -2
  251. package/dist/{comment-reaction-DhVgJ17S.mjs → comment-reaction-BLqIj5mx.mjs} +1 -1
  252. package/dist/{comments-D4mIDjvA.mjs → comments-Dg_gWBEB.mjs} +1 -1
  253. package/dist/content-De_XeXy_.mjs +1230 -0
  254. package/dist/{content-CVCrcuvD.mjs → content-NobcQti0.mjs} +240 -161
  255. package/dist/{content-refresh-QvBIyb_g.mjs → content-refresh-l4mPoGeX.mjs} +170 -193
  256. package/dist/{context-MftkHbWx.mjs → context-6uqzU-M9.mjs} +95 -77
  257. package/dist/{context-JjKucxBm.mjs → context-B0SG9Xkc.mjs} +2 -2
  258. package/dist/{context-route-helpers-e1APrqSm.mjs → context-route-helpers-C8s26uDT.mjs} +2 -2
  259. package/dist/{cron-mGVPQ5e6.mjs → cron-D7zB6m8i.mjs} +36 -32
  260. package/dist/d1-binding-D6HZa3ks.mjs +8 -0
  261. package/dist/d1-dialect-B1b8cmxX.mjs +48 -0
  262. package/dist/{dashboard-ZJ7sMcBI.mjs → dashboard-B-OybCMw.mjs} +5 -5
  263. package/dist/database/batch.d.mts +20 -0
  264. package/dist/database/batch.mjs +69 -0
  265. package/dist/database/d1/index.d.mts +18 -0
  266. package/dist/database/d1/index.mjs +8 -0
  267. package/dist/db/d1.d.mts +7 -0
  268. package/dist/db/d1.mjs +13 -0
  269. package/dist/db/index.d.mts +4 -4
  270. package/dist/db/index.mjs +10 -7
  271. package/dist/db/libsql.d.mts +1 -1
  272. package/dist/db/libsql.mjs +46 -3
  273. package/dist/db/postgres.d.mts +1 -1
  274. package/dist/db/sqlite.d.mts +1 -1
  275. package/dist/{device-flow-eOcL5m0Q.mjs → device-flow-DhpCzMo0.mjs} +130 -94
  276. package/dist/{dialect-helpers-fk43GbDb.mjs → dialect-helpers-C6xtO-Ui.mjs} +1 -1
  277. package/dist/{discovery-CJkuHGhZ.mjs → discovery-CqXbN0WZ.mjs} +5 -5
  278. package/dist/{enrich-KErvJOuI.mjs → enrich-BjF-J4sF.mjs} +1 -1
  279. package/dist/{evidence-6IUv9ML3.mjs → evidence-xJf8hQgH.mjs} +7 -7
  280. package/dist/{field-defs-cache-CwrIyZFT.mjs → field-defs-cache-BKKFFf_V.mjs} +5 -5
  281. package/dist/{forgeway-account-lYJ8iX3G.mjs → forgeway-account-BeKJlKh1.mjs} +1 -1
  282. package/dist/{fts-manager-DX7ZkrCa.mjs → fts-manager-BeWtB7ZD.mjs} +72 -57
  283. package/dist/{hitl-requests-CmYVunm-.mjs → hitl-requests-evSsel48.mjs} +2 -2
  284. package/dist/{hitl-route-helpers-CRm537zS.mjs → hitl-route-helpers-D2kJSOFX.mjs} +5 -5
  285. package/dist/{import-DqRAgsKr.mjs → import-Jpta-CYE.mjs} +9 -9
  286. package/dist/{index-Co7xtjkd.d.mts → index-CSUSBfdD.d.mts} +7 -4
  287. package/dist/index.d.mts +16 -16
  288. package/dist/index.mjs +104 -96
  289. package/dist/{integration-credentials-qudN6yRr.mjs → integration-credentials-BrQr0fb_.mjs} +2 -2
  290. package/dist/{jsonld-DTd-AVWg.d.mts → jsonld-CqIVIeZK.d.mts} +2 -2
  291. package/dist/{load-fCOciq0Q.mjs → load-Dc5ttyg4.mjs} +1 -1
  292. package/dist/{loader-BDje8ME2.mjs → loader-Cgsx23wU.mjs} +4 -4
  293. package/dist/{manifest-schema-CfKD0thC.mjs → manifest-schema-DG29meRy.mjs} +1 -1
  294. package/dist/{mcp-reviewed-executor-DmhM3Cy6.mjs → mcp-reviewed-executor-DAZL3Ckt.mjs} +7 -7
  295. package/dist/media/image-endpoint.mjs +1 -1
  296. package/dist/media/index.d.mts +1 -1
  297. package/dist/media/index.mjs +2 -2
  298. package/dist/media/local-runtime.d.mts +11 -11
  299. package/dist/media/local-runtime.mjs +3 -3
  300. package/dist/{media-dvRjj4po.mjs → media-3fK0u-bo.mjs} +1 -1
  301. package/dist/{media-allowlist-DaG6lNoy.mjs → media-allowlist-rN4qIF6W.mjs} +1 -1
  302. package/dist/{menus-CpuR4Qkm.mjs → menus-5liJusbp.mjs} +138 -90
  303. package/dist/{menus-CZbz5L_V.mjs → menus-CbR_J8cJ.mjs} +8 -8
  304. package/dist/migrations-CMdxWKx-.mjs +76 -0
  305. package/dist/oauth-authority-CCqo4eBm.mjs +43 -0
  306. package/dist/{oauth-authorization-Jf5e3azH.mjs → oauth-authorization--0UtTZpv.mjs} +89 -98
  307. package/dist/{oauth-clients-tovQ4D4h.mjs → oauth-clients-D4WBYaYW.mjs} +2 -2
  308. package/dist/object-cache/memory.d.mts +1 -1
  309. package/dist/{object-cache-D51qOseS.mjs → object-cache-BGjIlY9s.mjs} +1 -1
  310. package/dist/page/index.d.mts +10 -10
  311. package/dist/page/index.mjs +1 -1
  312. package/dist/{parse-IsGn-5lt.mjs → parse--7nG62_h.mjs} +1 -1
  313. package/dist/plugin-utils.d.mts +9 -9
  314. package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
  315. package/dist/plugins/adapt-sandbox-entry.mjs +1 -1
  316. package/dist/{plugins-DXyLI3Hb.mjs → plugins-DK1wLuao.mjs} +35 -84
  317. package/dist/{policy-950odoX_.mjs → policy-Dej7NJFD.mjs} +2 -2
  318. package/dist/{preview-BXmS1SXL.mjs → preview-q0pkibNO.mjs} +2 -2
  319. package/dist/{provider-loader-DDq7R_RN.d.mts → provider-loader-C0GaLwKB.d.mts} +1 -1
  320. package/dist/{public-url-CT-T1D_w.d.mts → public-url-B9zEdO8p.d.mts} +1 -1
  321. package/dist/{public-url-BQ9vf0AS.d.mts → public-url-BV-YQ_LF.d.mts} +2 -2
  322. package/dist/{publication-authorization-C-vYPGD8.mjs → publication-authorization-BrEZ2TsE.mjs} +459 -33
  323. package/dist/{query-CrW2yI6G.mjs → query-CEn9HXnf.mjs} +15 -15
  324. package/dist/{query-DcB9uGTW.mjs → query-DAS6VbMS.mjs} +4 -4
  325. package/dist/{rate-limit-DEkoxTsP.mjs → rate-limit-Dd1TnzZP.mjs} +2 -2
  326. package/dist/{redirect-DG-o0CKV.mjs → redirect-HLI3wT5Y.mjs} +26 -14
  327. package/dist/{redirects-Bjp4iKJU.mjs → redirects-DmOdfRjI.mjs} +5 -5
  328. package/dist/{redirects-N8gmWhVM.mjs → redirects-UCXyL0lP.mjs} +3 -3
  329. package/dist/{registry-D-IV_h50.mjs → registry-RD9qTnYL.mjs} +183 -186
  330. package/dist/release-BR08Slqf.mjs +5148 -0
  331. package/dist/request-context.d.mts +8 -0
  332. package/dist/{request-meta-BW0the1R.mjs → request-meta-BOcuHAXD.mjs} +1 -1
  333. package/dist/{resolve-pZ4NQM-X.mjs → resolve-C80Pm2DW.mjs} +1 -1
  334. package/dist/{review-payload-f1L4lzQg.mjs → review-payload-DEylbssM.mjs} +52 -4
  335. package/dist/{review-requests-DICrYH2-.mjs → review-requests-BF2eEKr8.mjs} +93 -37
  336. package/dist/{review-requests-BTKfeWlS.mjs → review-requests-CyfWbJ6W.mjs} +2 -2
  337. package/dist/{review-route-helpers-DaZBBps8.mjs → review-route-helpers-lKA-CXms.mjs} +2 -2
  338. package/dist/{revision-De7OmYVD.mjs → revision-090sZyGc.mjs} +28 -22
  339. package/dist/revocation-B7GL5fMl.mjs +53 -0
  340. package/dist/{runner-DJiRFyLI.mjs → runner-CVeq0266.mjs} +594 -491
  341. package/dist/{runner-Dye73myO.d.mts → runner-JnJSGXEB.d.mts} +1 -1
  342. package/dist/{runs-DEujUDOj.mjs → runs-B5BExdKO.mjs} +5 -5
  343. package/dist/runtime-env-CQVAWHzH.mjs +19 -0
  344. package/dist/runtime.d.mts +10 -10
  345. package/dist/runtime.mjs +5 -5
  346. package/dist/schema-DLMkODQc.mjs +8 -0
  347. package/dist/{search-DxUKN9Zz.mjs → search-CRzWNfxX.mjs} +4 -4
  348. package/dist/{secrets-AdCrGg1c.mjs → secrets-Cg0D2gQW.mjs} +10 -11
  349. package/dist/{sections-BPFOEMK6.mjs → sections-BwUjOGqn.mjs} +2 -2
  350. package/dist/seed/index.d.mts +2 -2
  351. package/dist/seed/index.mjs +29 -25
  352. package/dist/seo/index.d.mts +3 -3
  353. package/dist/seo/index.mjs +11 -10
  354. package/dist/{seo-DWHdo5aW.mjs → seo-BOTuCeh-.mjs} +25 -15
  355. package/dist/{seo-GfovzqpU.mjs → seo-B_tBFyud.mjs} +1 -1
  356. package/dist/{service-DbgjHWyW.mjs → service--bQht6oN.mjs} +2 -2
  357. package/dist/{service-BrNKVCjC.mjs → service-DilVsWGD.mjs} +3 -3
  358. package/dist/{session-user-DyqWGIh4.mjs → session-user-DeqTcAmR.mjs} +1 -1
  359. package/dist/{settings-CAsQLi0N.mjs → settings-DFzevIrU.mjs} +8 -8
  360. package/dist/{settings-BKEHw6Bu.mjs → settings-Deqx3Upy.mjs} +2 -2
  361. package/dist/{setup-complete-C8LTo8cO.mjs → setup-complete-BFqudwbW.mjs} +1 -1
  362. package/dist/{site-activity-7oezuHXK.mjs → site-activity-BrN2NviL.mjs} +11 -4
  363. package/dist/{site-context-CA7rbxux.mjs → site-context-vCiDRr4H.mjs} +50 -37
  364. package/dist/{site-url-DoZf_jVj.mjs → site-url-wXFqbm9c.mjs} +1 -1
  365. package/dist/state-jyNZ6-7L.mjs +30 -0
  366. package/dist/storage/local.d.mts +1 -1
  367. package/dist/storage/local.mjs +1 -1
  368. package/dist/storage/s3.d.mts +1 -1
  369. package/dist/storage/s3.mjs +3 -3
  370. package/dist/{store-c4qx3gVh.mjs → store-C1yDxxfv.mjs} +37 -12
  371. package/dist/submission-BsHNfHc7.mjs +155 -0
  372. package/dist/{taxonomies-ALDiRQ84.mjs → taxonomies-4cnTcbD6.mjs} +3 -3
  373. package/dist/{taxonomies-93DV-1QT.mjs → taxonomies-CllxqaH0.mjs} +7 -7
  374. package/dist/{taxonomy-BOBTJ_aE.mjs → taxonomy-DWxxLpp5.mjs} +3 -3
  375. package/dist/{tokens-c-qxNqzC.mjs → tokens-Bjuf1HID.mjs} +1 -1
  376. package/dist/{trusted-proxy-CdEl6g6B.mjs → trusted-proxy-CAW9o4Dw.mjs} +4 -12
  377. package/dist/{types-BRCUO8NR.d.mts → types-7Th6Mwz3.d.mts} +1 -0
  378. package/dist/{types-BpSTdH1H.mjs → types-BqxIv8Il.mjs} +2 -2
  379. package/dist/{types-6KmeXInJ.d.mts → types-CFgTpfPk.d.mts} +1 -1
  380. package/dist/{types-TpXK8km5.d.mts → types-QjOcidFc.d.mts} +300 -172
  381. package/dist/ui/server-runtime.d.mts +13 -13
  382. package/dist/ui/server-runtime.mjs +28 -26
  383. package/dist/{user-D0NJ7gYf.mjs → user-1-YV30lf.mjs} +2 -2
  384. package/dist/{utils-BK2efsHv.mjs → utils-Cglcqpm2.mjs} +2 -2
  385. package/dist/{validate-CDWVODvc.d.mts → validate-A27peRc4.d.mts} +3 -3
  386. package/dist/{validate-C9g9iX3q.mjs → validate-Wl4MSf3V.mjs} +3 -3
  387. package/dist/version-BWxyC5s4.mjs +6 -0
  388. package/dist/{widgets-Cm5Qx2Np.mjs → widgets-Di-6yDH7.mjs} +3 -3
  389. package/dist/{wordpress-slugs-WdPZaVXf.mjs → wordpress-slugs-vOx7R1dM.mjs} +1 -1
  390. package/dist/{worker-D7OccgB8.mjs → worker-RpaMP71d.mjs} +76 -47
  391. package/dist/workers-build-BaQCrSmf.mjs +36 -0
  392. package/dist/{zod-generator-DS5oZNaL.mjs → zod-generator-Cylvl_SM.mjs} +2 -2
  393. package/package.json +35 -9
  394. package/dist/after-BfniwgIf.mjs +0 -9
  395. package/dist/api-tokens-CmT83Bgj.mjs +0 -3
  396. package/dist/db/libsql-http.d.mts +0 -27
  397. package/dist/db/libsql-http.mjs +0 -29
  398. package/dist/libsql-dialect-CANq6UNI.mjs +0 -47
  399. package/dist/oauth-user-lookup-B451pZmd.mjs +0 -25
  400. package/dist/revocation-CkTOhdlw.mjs +0 -42
  401. package/dist/schema-IjuRxkqq.mjs +0 -8
  402. package/dist/submission-C47cHBIg.mjs +0 -67
  403. package/dist/transaction-BGQgnwUi.mjs +0 -28
  404. package/dist/version-9orir5LL.mjs +0 -6
  405. /package/dist/{base64-F8-DUraK.mjs → base64-Cz-aU0X1.mjs} +0 -0
  406. /package/dist/{challenge-store-CYrg4F4t.mjs → challenge-store-D-_-VavY.mjs} +0 -0
  407. /package/dist/{components-DAq_4iPX.mjs → components-BWQUCJEr.mjs} +0 -0
  408. /package/dist/{config-CVssduLe.mjs → config-XW5tMrH8.mjs} +0 -0
  409. /package/dist/{content-index-names-Bbu1FY1r.mjs → content-index-names-CDc2IQIx.mjs} +0 -0
  410. /package/dist/{context-types-CPWAJRs5.mjs → context-types-DqTo6C79.mjs} +0 -0
  411. /package/dist/{default-BeIzUa1e.mjs → default-D9zxuUU7.mjs} +0 -0
  412. /package/dist/{email-console-Bfi_exVg.mjs → email-console-BONByQiC.mjs} +0 -0
  413. /package/dist/{error-DLg1H2LT.mjs → error-Dd8LtpG5.mjs} +0 -0
  414. /package/dist/{escape-C6lkys0j.mjs → escape-BWC4s5bV.mjs} +0 -0
  415. /package/dist/{experimental-workflows-B9x8delL.mjs → experimental-workflows-M5D3RTFo.mjs} +0 -0
  416. /package/dist/{hash-jhbF98tT.mjs → hash-lNx3KJis.mjs} +0 -0
  417. /package/dist/{media-url-CL3NzgLh.mjs → media-url-B4YtTY6c.mjs} +0 -0
  418. /package/dist/{mime-CDTtL7jE.mjs → mime-D_ae-u_U.mjs} +0 -0
  419. /package/dist/{mode-D554vAgH.mjs → mode-CPf_KZ37.mjs} +0 -0
  420. /package/dist/{normalize-Ev3FiBMx.mjs → normalize-5rct_U0I.mjs} +0 -0
  421. /package/dist/{oauth-state-store-Do1a_o3H.mjs → oauth-state-store-CMgcimzA.mjs} +0 -0
  422. /package/dist/{options-1dBRkoCl.mjs → options-BcqHWpc-.mjs} +0 -0
  423. /package/dist/{output-8j9oltTf.mjs → output-BYpiVUBf.mjs} +0 -0
  424. /package/dist/{parser-C9rzPuSZ.mjs → parser-BV0wzQHo.mjs} +0 -0
  425. /package/dist/{passkey-config-CRN44T04.mjs → passkey-config-BG4GO4OO.mjs} +0 -0
  426. /package/dist/{patterns-3XE9bU4r.mjs → patterns-CZ7D4y_R.mjs} +0 -0
  427. /package/dist/{placeholder-D03pGvqM.d.mts → placeholder-BHTaoCYx.d.mts} +0 -0
  428. /package/dist/{portable-text-tIk9_uz_.mjs → portable-text-B9YuySom.mjs} +0 -0
  429. /package/dist/{portable-text-BdRm4uZq.d.mts → portable-text-FKf3IrPz.d.mts} +0 -0
  430. /package/dist/{process-cache-B-L-A9zg.mjs → process-cache-MHM4Sqzs.mjs} +0 -0
  431. /package/dist/{provider-loader-C4i82ll1.mjs → provider-loader-3MY1SjzA.mjs} +0 -0
  432. /package/dist/{public-discovery-CyDzK1-S.mjs → public-discovery-BAbOvKiR.mjs} +0 -0
  433. /package/dist/{public-url-oudwI7K0.mjs → public-url-C7pbmS_7.mjs} +0 -0
  434. /package/dist/{public-url-BVIjzMo3.mjs → public-url-D5Wjq0sy.mjs} +0 -0
  435. /package/dist/{redirect-Dp5u-8dH.mjs → redirect-Bx96u2nS.mjs} +0 -0
  436. /package/dist/{request-cache-BruBnFAR.mjs → request-cache-DPmV5nk4.mjs} +0 -0
  437. /package/dist/{seo-contributions-BAtRDXEQ.mjs → seo-contributions-Dt57p6Sq.mjs} +0 -0
  438. /package/dist/{service-DeX1PRNt.mjs → service-wYQ_ePZ4.mjs} +0 -0
  439. /package/dist/{setup-nonce-D-CEYlw7.mjs → setup-nonce-CAqDUxxU.mjs} +0 -0
  440. /package/dist/{sidecar-client-Bw2C0XTf.mjs → sidecar-client-CnpGTvYq.mjs} +0 -0
  441. /package/dist/{slugify-KSsVD_D3.mjs → slugify-Di8Q_MFq.mjs} +0 -0
  442. /package/dist/{ssrf-C7tTSD1r.mjs → ssrf-LN16WMip.mjs} +0 -0
  443. /package/dist/{stable-hash-DF7R5eN8.mjs → stable-hash-DEtJgcp7.mjs} +0 -0
  444. /package/dist/{status-Bba6RbkS.mjs → status-Bwkeuz8g.mjs} +0 -0
  445. /package/dist/{transport-BddGhTAI.mjs → transport-472KVGBe.mjs} +0 -0
  446. /package/dist/{transport-ktLL9r2O.d.mts → transport-C0jj-Nc8.d.mts} +0 -0
  447. /package/dist/{types-BQZFeZjd.mjs → types-BDq9t5lG.mjs} +0 -0
  448. /package/dist/{types-CKIt_jmM.d.mts → types-Bs-7Geuh.d.mts} +0 -0
  449. /package/dist/{types-CLMOusxP.d.mts → types-CwkJp6zr.d.mts} +0 -0
  450. /package/dist/{types-C0DPvhR5.mjs → types-CyBH89BS.mjs} +0 -0
  451. /package/dist/{types-BbkkkAb6.mjs → types-D17dJRht.mjs} +0 -0
  452. /package/dist/{types--3oJQ0hs.d.mts → types-DTjrkhKU.d.mts} +0 -0
  453. /package/dist/{types-CPaVj_GC.d.mts → types-DkXuBo8k.d.mts} +0 -0
  454. /package/dist/{types-CU3Wn2HC.d.mts → types-b2sq7ZDk.d.mts} +0 -0
  455. /package/dist/{url-C_pLSrGZ.mjs → url-D375-6LM.mjs} +0 -0
  456. /package/dist/{url-Dumsft7G.mjs → url-bv5i4JN0.mjs} +0 -0
  457. /package/dist/{validate-VPnKoIzW.mjs → validate-Co3j6T_K.mjs} +0 -0
@@ -1,4 +1,6 @@
1
1
  import { QueryRecorder } from "./database/instrumentation.mjs";
2
+ import { Kysely, RawBuilder } from "kysely";
3
+ import { RoleLevel } from "@dineway-ai/auth";
2
4
 
3
5
  //#region src/request-context.d.ts
4
6
  /**
@@ -18,6 +20,12 @@ interface RequestMetrics {
18
20
  }
19
21
  declare function createRequestMetrics(start: number): RequestMetrics;
20
22
  interface DinewayRequestContext {
23
+ writePrincipal?: {
24
+ id: string;
25
+ role: RoleLevel;
26
+ };
27
+ /** Native route authorization, rechecked inside the same commit as writes. */
28
+ prepareWriteChecks?: <DB>(db: Kysely<DB>) => Promise<readonly RawBuilder<boolean>[]>;
21
29
  /** Publication notifications are released only after the owning transaction commits. */
22
30
  afterPublicationCommit?: Array<() => void>;
23
31
  /** Whether the current request is in visual editing mode */
@@ -1,4 +1,4 @@
1
- import { n as normalizeTrustedHeaders, t as getTrustedProxyHeaders } from "./trusted-proxy-CdEl6g6B.mjs";
1
+ import { n as normalizeTrustedHeaders, t as getTrustedProxyHeaders } from "./trusted-proxy-CAW9o4Dw.mjs";
2
2
 
3
3
  //#region src/plugins/request-meta.ts
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { n as getI18nConfig, r as isI18nEnabled, t as getFallbackChain } from "./config-CVssduLe.mjs";
2
1
  import { getRequestContext } from "./request-context.mjs";
2
+ import { n as getI18nConfig, r as isI18nEnabled, t as getFallbackChain } from "./config-XW5tMrH8.mjs";
3
3
 
4
4
  //#region src/i18n/resolve.ts
5
5
  /**
@@ -1,5 +1,52 @@
1
- import { n as stableStringify, t as buildStableHash } from "./stable-hash-DF7R5eN8.mjs";
1
+ import { r as encodeBase64, t as decodeBase64 } from "./base64-Cz-aU0X1.mjs";
2
+ import { n as stableStringify, t as buildStableHash } from "./stable-hash-DEtJgcp7.mjs";
2
3
 
4
+ //#region src/api/rev.ts
5
+ /**
6
+ * Generate a _rev token from a content item's version and updatedAt.
7
+ */
8
+ function encodeRev(item) {
9
+ return encodeBase64(`${item.version}:${item.updatedAt}`);
10
+ }
11
+ /**
12
+ * Decode a _rev token into its components.
13
+ * Returns null if the token is malformed.
14
+ */
15
+ function decodeRev(rev) {
16
+ try {
17
+ const decoded = decodeBase64(rev);
18
+ const colonIdx = decoded.indexOf(":");
19
+ if (colonIdx === -1) return null;
20
+ const version = parseInt(decoded.slice(0, colonIdx), 10);
21
+ const updatedAt = decoded.slice(colonIdx + 1);
22
+ if (isNaN(version) || !updatedAt) return null;
23
+ return {
24
+ version,
25
+ updatedAt
26
+ };
27
+ } catch {
28
+ return null;
29
+ }
30
+ }
31
+ /**
32
+ * Validate a _rev token against a content item.
33
+ * Returns null if valid (or if no _rev provided), or an error message if invalid.
34
+ */
35
+ function validateRev(rev, item) {
36
+ if (!rev) return { valid: true };
37
+ const decoded = decodeRev(rev);
38
+ if (!decoded) return {
39
+ valid: false,
40
+ message: "Malformed _rev token"
41
+ };
42
+ if (decoded.version !== item.version || decoded.updatedAt !== item.updatedAt) return {
43
+ valid: false,
44
+ message: "Content has been modified since last read (version conflict)"
45
+ };
46
+ return { valid: true };
47
+ }
48
+
49
+ //#endregion
3
50
  //#region src/site-context/action-hash.ts
4
51
  async function buildStableActionHash(value) {
5
52
  return buildStableHash(value);
@@ -17,6 +64,7 @@ var ReviewPayloadBuilder = class {
17
64
  const compare = await this.loadCompare(input.collection, content.entryId);
18
65
  const live = asRecord(compare.live);
19
66
  const draft = asRecord(compare.draft) ?? content.data;
67
+ const displayTitle = stringOrNull(draft.title) ?? content.displayTitle;
20
68
  const hasChanges = typeof compare.hasChanges === "boolean" ? compare.hasChanges : stableStringify(live) !== stableStringify(draft);
21
69
  const actionHash = await buildStableActionHash({
22
70
  actionType,
@@ -29,7 +77,7 @@ var ReviewPayloadBuilder = class {
29
77
  draft
30
78
  });
31
79
  const scope = `content:${input.collection}:${content.entryId}`;
32
- const summary = input.summary ?? `Review ${actionType} for ${input.collection}/${content.displayTitle ?? content.entryId}`;
80
+ const summary = input.summary ?? `Review ${actionType} for ${input.collection}/${displayTitle ?? content.entryId}`;
33
81
  return {
34
82
  collection: input.collection,
35
83
  entryId: content.entryId,
@@ -56,7 +104,7 @@ var ReviewPayloadBuilder = class {
56
104
  id: content.entryId,
57
105
  slug: content.slug,
58
106
  status: content.status,
59
- title: content.displayTitle,
107
+ title: displayTitle,
60
108
  updatedAt: content.updatedAt
61
109
  },
62
110
  diff: {
@@ -108,4 +156,4 @@ function stringOrNull(value) {
108
156
  }
109
157
 
110
158
  //#endregion
111
- export { buildStableActionHash as n, ReviewPayloadBuilder as t };
159
+ export { validateRev as a, encodeRev as i, buildStableActionHash as n, decodeRev as r, ReviewPayloadBuilder as t };
@@ -1,5 +1,7 @@
1
- import { i as encodeCursor, r as decodeCursor } from "./types-BpSTdH1H.mjs";
2
- import { t as buildStableHash } from "./stable-hash-DF7R5eN8.mjs";
1
+ import { AtomicWriteConflict, atomicBatch, rowUnchanged } from "./database/batch.mjs";
2
+ import { i as encodeCursor, r as decodeCursor } from "./types-BqxIv8Il.mjs";
3
+ import { t as buildStableHash } from "./stable-hash-DEtJgcp7.mjs";
4
+ import { sql } from "kysely";
3
5
  import { ulid } from "ulidx";
4
6
 
5
7
  //#region src/database/repositories/review-requests.ts
@@ -8,15 +10,25 @@ var RejectedReviewContentError = class extends Error {
8
10
  super("This content was rejected. Change the content before approving a new review.");
9
11
  }
10
12
  };
11
- var ReviewRequestRepository = class ReviewRequestRepository {
13
+ const REVIEW_SUPERSESSION_ACTOR = "review-supersession";
14
+ function isSupersededReview(row) {
15
+ return row.resolved_by_actor_type === "system" && row.resolved_by_actor_id === REVIEW_SUPERSESSION_ACTOR;
16
+ }
17
+ var ReviewRequestRepository = class {
12
18
  constructor(db) {
13
19
  this.db = db;
14
20
  }
15
- async create(input) {
21
+ prepareCreate(input) {
16
22
  const id = ulid();
17
- const now = (/* @__PURE__ */ new Date()).toISOString();
18
- await this.db.insertInto("_dineway_review_requests").values(toInsertableReviewRequest(id, input, now)).execute();
19
- const request = await this.findById(id);
23
+ return {
24
+ id,
25
+ statement: this.db.insertInto("_dineway_review_requests").values(toInsertableReviewRequest(id, input, (/* @__PURE__ */ new Date()).toISOString())).compile()
26
+ };
27
+ }
28
+ async create(input) {
29
+ const prepared = this.prepareCreate(input);
30
+ await this.db.executeQuery(prepared.statement);
31
+ const request = await this.findById(prepared.id);
20
32
  if (!request) throw new Error("Failed to create review request");
21
33
  return request;
22
34
  }
@@ -63,38 +75,81 @@ var ReviewRequestRepository = class ReviewRequestRepository {
63
75
  const result = await query.executeTakeFirst();
64
76
  return Number(result?.count ?? 0);
65
77
  }
66
- async resolve(id, input) {
67
- if (!this.db.isTransaction) return this.db.transaction().execute((trx) => new ReviewRequestRepository(trx).resolve(id, input));
68
- if (input.decision === "approved") {
69
- const target = await this.findById(id);
70
- if (!target || target.status !== "pending") return null;
71
- const diff = target.reviewPayload.diff;
72
- if (isRecord(diff) && isRecord(diff.draft)) {
73
- const hash = await buildStableHash(diff.draft);
74
- const rejected = await this.db.selectFrom("_dineway_review_requests").select("review_payload").where("collection", "=", target.collection).where("entry_id", "=", target.entryId).where("status", "=", "rejected").execute();
75
- for (const row of rejected) {
76
- const priorDiff = parseRecord(row.review_payload)?.diff;
77
- if (isRecord(priorDiff) && isRecord(priorDiff.draft) && await buildStableHash(priorDiff.draft) === hash) throw new RejectedReviewContentError();
78
- }
78
+ async rejectionChecks(target) {
79
+ const checks = [];
80
+ const diff = target.reviewPayload.diff;
81
+ if (isRecord(diff) && isRecord(diff.draft)) {
82
+ const hash = await buildStableHash(diff.draft);
83
+ const rejected = await this.db.selectFrom("_dineway_review_requests").select([
84
+ "id",
85
+ "status",
86
+ "review_payload",
87
+ "resolved_by_actor_type",
88
+ "resolved_by_actor_id"
89
+ ]).where("collection", "=", target.collection).where("entry_id", "=", target.entryId).where("status", "=", "rejected").execute();
90
+ checks.push(sql`(SELECT COUNT(*) FROM _dineway_review_requests WHERE collection = ${target.collection} AND entry_id = ${target.entryId} AND status = 'rejected') = ${rejected.length}`, ...rejected.map((rejectedRow) => rowUnchanged("_dineway_review_requests", rejectedRow)));
91
+ for (const rejectedRow of rejected) {
92
+ if (isSupersededReview(rejectedRow)) continue;
93
+ const priorDiff = parseRecord(rejectedRow.review_payload)?.diff;
94
+ if (isRecord(priorDiff) && isRecord(priorDiff.draft) && await buildStableHash(priorDiff.draft) === hash) throw new RejectedReviewContentError();
79
95
  }
80
96
  }
97
+ return checks;
98
+ }
99
+ async prepareCreateApproved(input, resolution) {
100
+ const now = resolution.resolvedAt ?? (/* @__PURE__ */ new Date()).toISOString();
101
+ const row = {
102
+ ...toInsertableReviewRequest(ulid(), input, now),
103
+ status: "approved",
104
+ resolved_by_actor_type: resolution.resolvedByActorType,
105
+ resolved_by_actor_id: resolution.resolvedByActorId,
106
+ resolved_auth_metadata: jsonOrNull(resolution.resolvedAuthMetadata),
107
+ review_note: resolution.reviewNote ?? null,
108
+ resolved_at: now
109
+ };
110
+ const review = rowToReviewRequest(row);
111
+ return {
112
+ review,
113
+ batch: {
114
+ checks: await this.rejectionChecks(review),
115
+ statements: [this.db.insertInto("_dineway_review_requests").values(row).compile()]
116
+ }
117
+ };
118
+ }
119
+ async prepareResolve(id, input) {
120
+ const row = await this.db.selectFrom("_dineway_review_requests").selectAll().where("id", "=", id).executeTakeFirst();
121
+ if (!row || row.status !== "pending" || row.revoked_at) return null;
122
+ const target = rowToReviewRequest(row);
123
+ const checks = [rowUnchanged("_dineway_review_requests", row)];
124
+ if (input.decision === "approved") checks.push(...await this.rejectionChecks(target));
81
125
  const resolvedAt = input.resolvedAt ?? (/* @__PURE__ */ new Date()).toISOString();
82
- const result = await this.db.updateTable("_dineway_review_requests").set({
83
- status: input.decision,
84
- resolved_by_actor_type: input.resolvedByActorType,
85
- resolved_by_actor_id: input.resolvedByActorId,
86
- resolved_auth_metadata: jsonOrNull(input.resolvedAuthMetadata),
87
- review_note: input.reviewNote ?? null,
88
- resolved_at: resolvedAt,
89
- updated_at: resolvedAt
90
- }).where("id", "=", id).where("status", "=", "pending").executeTakeFirst();
91
- if (Number(result.numUpdatedRows ?? 0) === 0) return null;
92
- await this.db.updateTable("_dineway_review_jobs").set({
93
- state: "complete",
94
- release_state: input.decision === "approved" ? "queued" : "none",
95
- reason: input.reviewNote ?? "Resolved by reviewer",
96
- updated_at: resolvedAt
97
- }).where("review_id", "=", id).execute();
126
+ return {
127
+ checks,
128
+ statements: [this.db.updateTable("_dineway_review_requests").set({
129
+ status: input.decision,
130
+ resolved_by_actor_type: input.resolvedByActorType,
131
+ resolved_by_actor_id: input.resolvedByActorId,
132
+ resolved_auth_metadata: jsonOrNull(input.resolvedAuthMetadata),
133
+ review_note: input.reviewNote ?? null,
134
+ resolved_at: resolvedAt,
135
+ updated_at: resolvedAt
136
+ }).where("id", "=", id).where("status", "=", "pending").compile(), this.db.updateTable("_dineway_review_jobs").set({
137
+ state: "complete",
138
+ release_state: input.decision === "approved" ? "queued" : "none",
139
+ reason: input.reviewNote ?? "Resolved by reviewer",
140
+ updated_at: resolvedAt
141
+ }).where("review_id", "=", id).compile()]
142
+ };
143
+ }
144
+ async resolve(id, input) {
145
+ const prepared = await this.prepareResolve(id, input);
146
+ if (!prepared) return null;
147
+ try {
148
+ await atomicBatch(this.db, prepared);
149
+ } catch (error) {
150
+ if (error instanceof AtomicWriteConflict) return null;
151
+ throw error;
152
+ }
98
153
  return this.findById(id);
99
154
  }
100
155
  async findApprovedForTarget(target) {
@@ -138,6 +193,7 @@ var ReviewRequestRepository = class ReviewRequestRepository {
138
193
  function toInsertableReviewRequest(id, input, now) {
139
194
  return {
140
195
  id,
196
+ revoked_at: null,
141
197
  status: "pending",
142
198
  collection: input.collection,
143
199
  entry_id: input.entryId,
@@ -208,4 +264,4 @@ function clampLimit(value) {
208
264
  }
209
265
 
210
266
  //#endregion
211
- export { ReviewRequestRepository as n, RejectedReviewContentError as t };
267
+ export { isSupersededReview as i, RejectedReviewContentError as n, ReviewRequestRepository as r, REVIEW_SUPERSESSION_ACTOR as t };
@@ -1,5 +1,5 @@
1
- import { n as ReviewRequestRepository, t as RejectedReviewContentError } from "./review-requests-DICrYH2-.mjs";
2
- import { n as submitAutomatedReview, t as ReviewSubmissionError } from "./submission-C47cHBIg.mjs";
1
+ import { n as RejectedReviewContentError, r as ReviewRequestRepository } from "./review-requests-BF2eEKr8.mjs";
2
+ import { n as submitAutomatedReview, t as ReviewSubmissionError } from "./submission-BsHNfHc7.mjs";
3
3
 
4
4
  //#region src/api/handlers/review-requests.ts
5
5
  async function handleReviewRequestCreate(db, handlers, input) {
@@ -1,5 +1,5 @@
1
- import { n as resolveActorIdentity } from "./actor-DrJJsvy6.mjs";
2
- import { p as logSiteActivitySafely } from "./activity-events-BVo9rMUz.mjs";
1
+ import { i as resolveActorIdentity } from "./actor-DxUAJgQX.mjs";
2
+ import { p as logSiteActivitySafely } from "./activity-events-D-yGV7cW.mjs";
3
3
 
4
4
  //#region src/api/review-route-helpers.ts
5
5
  function resolveReviewRouteActor(locals) {
@@ -1,4 +1,4 @@
1
- import { t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
1
+ import { t as validateIdentifier } from "./validate-Co3j6T_K.mjs";
2
2
  import { sql } from "kysely";
3
3
  import { monotonicFactory } from "ulidx";
4
4
 
@@ -17,17 +17,26 @@ var RevisionRepository = class {
17
17
  /**
18
18
  * Create a new revision
19
19
  */
20
- async create(input) {
20
+ prepareCreateSnapshot(input) {
21
21
  const id = monotonic();
22
- const row = {
22
+ return {
23
23
  id,
24
- collection: input.collection,
25
- entry_id: input.entryId,
26
- data: JSON.stringify(input.data),
27
- author_id: input.authorId ?? null
24
+ statement: this.db.insertInto("revisions").values({
25
+ id,
26
+ collection: input.collection,
27
+ entry_id: input.entryId,
28
+ data: input.data,
29
+ author_id: input.authorId ?? null
30
+ }).compile()
28
31
  };
29
- await this.db.insertInto("revisions").values(row).execute();
30
- const revision = await this.findById(id);
32
+ }
33
+ async create(input) {
34
+ const prepared = this.prepareCreateSnapshot({
35
+ ...input,
36
+ data: sql`${JSON.stringify(input.data)}`
37
+ });
38
+ await this.db.executeQuery(prepared.statement);
39
+ const revision = await this.findById(prepared.id);
31
40
  if (!revision) throw new Error("Failed to create revision");
32
41
  return revision;
33
42
  }
@@ -75,21 +84,18 @@ var RevisionRepository = class {
75
84
  * referenced by the content entry's live or draft pointers.
76
85
  */
77
86
  async pruneOldRevisions(collection, entryId, keepCount) {
78
- const keep = await this.db.selectFrom("revisions").select("id").where("collection", "=", collection).where("entry_id", "=", entryId).orderBy("created_at", "desc").orderBy("id", "desc").limit(keepCount).execute();
79
- const keepIds = new Set(keep.map((r) => r.id));
80
- if (keepIds.size === 0) return 0;
81
- if (await this.db.selectFrom("_dineway_collections").select("slug").where("slug", "=", collection).executeTakeFirst()) {
87
+ if (keepCount <= 0) return 0;
88
+ const registeredCollection = await this.db.selectFrom("_dineway_collections").select("slug").where("slug", "=", collection).executeTakeFirst();
89
+ const latest = this.db.selectFrom("revisions").select("id").where("collection", "=", collection).where("entry_id", "=", entryId).orderBy("created_at", "desc").orderBy("id", "desc").limit(keepCount);
90
+ let query = this.db.deleteFrom("revisions").where("collection", "=", collection).where("entry_id", "=", entryId).where("id", "not in", latest);
91
+ if (registeredCollection) {
82
92
  validateIdentifier(collection, "collection slug");
83
- const tableName = `ec_${collection}`;
84
- const row = (await sql`
85
- SELECT live_revision_id, draft_revision_id
86
- FROM ${sql.ref(tableName)}
87
- WHERE id = ${entryId}
88
- `.execute(this.db)).rows[0];
89
- if (row?.live_revision_id) keepIds.add(row.live_revision_id);
90
- if (row?.draft_revision_id) keepIds.add(row.draft_revision_id);
93
+ query = query.where(sql`NOT EXISTS (
94
+ SELECT 1 FROM ${sql.table(`ec_${collection}`)} AS content WHERE content.id = ${entryId}
95
+ AND (content.live_revision_id = revisions.id OR content.draft_revision_id = revisions.id)
96
+ )`);
91
97
  }
92
- const result = await this.db.deleteFrom("revisions").where("collection", "=", collection).where("entry_id", "=", entryId).where("id", "not in", [...keepIds]).executeTakeFirst();
98
+ const result = await query.executeTakeFirst();
93
99
  return Number(result.numDeletedRows ?? 0);
94
100
  }
95
101
  /**
@@ -0,0 +1,53 @@
1
+ import { AtomicWriteConflict, atomicBatch, rowUnchanged } from "./database/batch.mjs";
2
+ import { t as SiteActivityRepository } from "./site-activity-BrN2NviL.mjs";
3
+ import { r as ReviewRequestRepository } from "./review-requests-BF2eEKr8.mjs";
4
+ import { sql } from "kysely";
5
+
6
+ //#region src/review-automation/revocation.ts
7
+ async function revokeReview(db, id, actor, reason, sourceType = "api_route") {
8
+ const now = (/* @__PURE__ */ new Date()).toISOString();
9
+ const original = await db.selectFrom("_dineway_review_requests").selectAll().where("id", "=", id).where("status", "=", "approved").where("revoked_at", "is", null).executeTakeFirst();
10
+ if (!original) return null;
11
+ const statements = [
12
+ db.updateTable("_dineway_review_requests").set({
13
+ revoked_at: now,
14
+ updated_at: now
15
+ }).where("id", "=", id).where("status", "=", "approved").where("revoked_at", "is", null).compile(),
16
+ db.updateTable("_dineway_review_jobs").set({
17
+ target_key: `revoked:${id}`,
18
+ release_state: sql`CASE WHEN release_state = 'published' THEN 'published' ELSE 'blocked' END`,
19
+ release_reason: `Approval revoked: ${reason}`,
20
+ updated_at: now
21
+ }).where("review_id", "=", id).compile(),
22
+ db.updateTable("_dineway_content_release_grants").set({
23
+ status: "revoked",
24
+ revoked_at: now,
25
+ revocation_reason: reason,
26
+ updated_at: now
27
+ }).where("editorial_review_request_id", "=", id).where("status", "=", "active").compile()
28
+ ];
29
+ statements.push(new SiteActivityRepository(db).prepareCreate({
30
+ ...actor,
31
+ actionType: "review.revoked",
32
+ subjectType: "review_request",
33
+ subjectId: id,
34
+ scope: original.scope,
35
+ summary: "Revoked editorial approval",
36
+ detail: { reason },
37
+ sourceType,
38
+ sourceName: "review-revoke"
39
+ }).statement);
40
+ try {
41
+ await atomicBatch(db, {
42
+ checks: [rowUnchanged("_dineway_review_requests", original)],
43
+ statements
44
+ });
45
+ } catch (error) {
46
+ if (error instanceof AtomicWriteConflict) return null;
47
+ throw error;
48
+ }
49
+ return new ReviewRequestRepository(db).findById(id);
50
+ }
51
+
52
+ //#endregion
53
+ export { revokeReview as t };