dineway 0.2.39 → 0.2.41

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 (460) hide show
  1. package/dist/{activity-LXZdjKwI.mjs → activity-BuhkMdv8.mjs} +2 -2
  2. package/dist/{activity-events-DoqeOM8x.mjs → activity-events-DkHsy7Y0.mjs} +1 -1
  3. package/dist/{allowed-origins-DiVrMLxh.mjs → allowed-origins-Clitkhiv.mjs} +1 -1
  4. package/dist/api/route-utils.d.mts +15 -12
  5. package/dist/api/route-utils.mjs +27 -20
  6. package/dist/api/schemas/index.d.mts +1 -1
  7. package/dist/api/schemas/index.mjs +10 -5
  8. package/dist/{api-COSxvdOi.mjs → api-CMbsIQ46.mjs} +41 -13
  9. package/dist/{api-tokens-CNHnKO57.mjs → api-tokens-ciHNTdN2.mjs} +1 -1
  10. package/dist/{apply-D4rZHDyg.mjs → apply-B5qoX19G.mjs} +62 -18
  11. package/dist/astro/index.d.mts +16 -13
  12. package/dist/astro/index.mjs +31 -5
  13. package/dist/astro/middleware/auth.d.mts +14 -11
  14. package/dist/astro/middleware/auth.mjs +8 -8
  15. package/dist/astro/middleware/redirect.mjs +10 -6
  16. package/dist/astro/middleware/request-context.mjs +5 -5
  17. package/dist/astro/middleware/seed.d.mts +1 -1
  18. package/dist/astro/middleware/seed.mjs +2 -2
  19. package/dist/astro/middleware/setup.mjs +1 -1
  20. package/dist/astro/middleware.d.mts +2 -2
  21. package/dist/astro/middleware.mjs +266 -176
  22. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +12 -7
  23. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +12 -7
  24. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  25. package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
  26. package/dist/astro/routes/api/admin/briefing.mjs +41 -22
  27. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
  28. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +14 -10
  29. package/dist/astro/routes/api/admin/byline-fields/index.mjs +14 -10
  30. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +14 -10
  31. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +25 -19
  32. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +25 -19
  33. package/dist/astro/routes/api/admin/bylines/index.mjs +25 -19
  34. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +20 -16
  35. package/dist/astro/routes/api/admin/comments/_id_.mjs +10 -7
  36. package/dist/astro/routes/api/admin/comments/bulk.mjs +18 -13
  37. package/dist/astro/routes/api/admin/comments/counts.mjs +10 -7
  38. package/dist/astro/routes/api/admin/comments/index.mjs +18 -13
  39. package/dist/astro/routes/api/admin/context/_id_/history.mjs +51 -39
  40. package/dist/astro/routes/api/admin/context/_id_/index.mjs +51 -39
  41. package/dist/astro/routes/api/admin/context/_id_/review.mjs +57 -44
  42. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +57 -44
  43. package/dist/astro/routes/api/admin/context/diff.mjs +56 -43
  44. package/dist/astro/routes/api/admin/context/index.mjs +57 -44
  45. package/dist/astro/routes/api/admin/context/stale.mjs +56 -43
  46. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +51 -39
  47. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +56 -43
  48. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +56 -43
  49. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +52 -40
  50. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  51. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +7 -7
  52. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +7 -7
  53. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +78 -68
  54. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +78 -68
  55. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +71 -60
  56. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +78 -67
  57. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +78 -67
  58. package/dist/astro/routes/api/admin/plugins/index.mjs +71 -60
  59. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  60. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -60
  61. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +78 -67
  62. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -60
  63. package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -60
  64. package/dist/astro/routes/api/admin/review-requests/_id_/image.mjs +38 -23
  65. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +46 -36
  66. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +63 -52
  67. package/dist/astro/routes/api/admin/review-requests/_id_/revoke.mjs +9 -9
  68. package/dist/astro/routes/api/admin/review-requests/index.mjs +61 -50
  69. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -60
  70. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
  71. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -60
  72. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +1 -1
  73. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
  74. package/dist/astro/routes/api/admin/users/_id_/index.mjs +11 -7
  75. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
  76. package/dist/astro/routes/api/admin/users/index.mjs +12 -7
  77. package/dist/astro/routes/api/auth/dev-bypass.mjs +4 -4
  78. package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
  79. package/dist/astro/routes/api/auth/invite/complete.mjs +17 -12
  80. package/dist/astro/routes/api/auth/invite/index.mjs +14 -9
  81. package/dist/astro/routes/api/auth/invite/register-options.mjs +16 -11
  82. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  83. package/dist/astro/routes/api/auth/magic-link/send.mjs +17 -12
  84. package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
  85. package/dist/astro/routes/api/auth/me.mjs +14 -11
  86. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  87. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  88. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +3 -3
  89. package/dist/astro/routes/api/auth/passkey/_id_.mjs +12 -7
  90. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  91. package/dist/astro/routes/api/auth/passkey/options.mjs +19 -14
  92. package/dist/astro/routes/api/auth/passkey/register/options.mjs +16 -11
  93. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +17 -12
  94. package/dist/astro/routes/api/auth/passkey/verify.mjs +17 -12
  95. package/dist/astro/routes/api/auth/setup-token/index.mjs +6 -6
  96. package/dist/astro/routes/api/auth/setup-token/verify.mjs +2 -2
  97. package/dist/astro/routes/api/auth/signup/complete.mjs +17 -12
  98. package/dist/astro/routes/api/auth/signup/request.mjs +17 -12
  99. package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
  100. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts +14 -11
  101. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +23 -19
  102. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +23 -18
  103. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  104. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +8 -8
  105. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +8 -8
  106. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +8 -8
  107. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +25 -20
  108. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +41 -31
  109. package/dist/astro/routes/api/content/_collection_/_id_/release-readiness.mjs +14 -9
  110. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +8 -8
  111. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  112. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +41 -31
  113. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +30 -20
  114. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  115. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +8 -8
  116. package/dist/astro/routes/api/content/_collection_/_id_.mjs +25 -14
  117. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  118. package/dist/astro/routes/api/content/_collection_/index.mjs +25 -14
  119. package/dist/astro/routes/api/content/_collection_/trash.mjs +13 -8
  120. package/dist/astro/routes/api/dashboard.mjs +21 -13
  121. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  122. package/dist/astro/routes/api/health.mjs +1 -1
  123. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  124. package/dist/astro/routes/api/import/probe.mjs +30 -23
  125. package/dist/astro/routes/api/import/wordpress/analyze.mjs +13 -10
  126. package/dist/astro/routes/api/import/wordpress/execute.d.mts +14 -11
  127. package/dist/astro/routes/api/import/wordpress/execute.mjs +58 -47
  128. package/dist/astro/routes/api/import/wordpress/media.d.mts +14 -11
  129. package/dist/astro/routes/api/import/wordpress/media.mjs +17 -14
  130. package/dist/astro/routes/api/import/wordpress/prepare.mjs +61 -48
  131. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +15 -12
  132. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +58 -45
  133. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  134. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +32 -26
  135. package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
  136. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +14 -11
  137. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +63 -52
  138. package/dist/astro/routes/api/integration/artifact.mjs +9 -9
  139. package/dist/astro/routes/api/integration/dispatch.mjs +14 -14
  140. package/dist/astro/routes/api/integrations/_provider_.mjs +9 -9
  141. package/dist/astro/routes/api/integrations/index.mjs +8 -8
  142. package/dist/astro/routes/api/manifest.mjs +5 -5
  143. package/dist/astro/routes/api/mcp.mjs +141 -93
  144. package/dist/astro/routes/api/media/_id_/confirm.mjs +15 -12
  145. package/dist/astro/routes/api/media/_id_.mjs +14 -9
  146. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  147. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  148. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  149. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  150. package/dist/astro/routes/api/media/upload-url.mjs +16 -13
  151. package/dist/astro/routes/api/media.mjs +19 -16
  152. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +57 -44
  153. package/dist/astro/routes/api/menus/_name_/items.mjs +57 -44
  154. package/dist/astro/routes/api/menus/_name_/reorder.mjs +57 -44
  155. package/dist/astro/routes/api/menus/_name_/translations.mjs +57 -44
  156. package/dist/astro/routes/api/menus/_name_.mjs +57 -44
  157. package/dist/astro/routes/api/menus/index.mjs +57 -44
  158. package/dist/astro/routes/api/oauth/authorize.mjs +7 -7
  159. package/dist/astro/routes/api/oauth/device/authorize.mjs +5 -5
  160. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  161. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  162. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  163. package/dist/astro/routes/api/oauth/token/refresh.mjs +5 -5
  164. package/dist/astro/routes/api/oauth/token/revoke.mjs +5 -5
  165. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  166. package/dist/astro/routes/api/openapi.json.mjs +10 -5
  167. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
  168. package/dist/astro/routes/api/redirects/404s/index.mjs +15 -13
  169. package/dist/astro/routes/api/redirects/404s/summary.mjs +15 -13
  170. package/dist/astro/routes/api/redirects/_id_.mjs +57 -44
  171. package/dist/astro/routes/api/redirects/index.mjs +57 -44
  172. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  173. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  174. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +73 -62
  175. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +73 -62
  176. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +73 -62
  177. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +73 -62
  178. package/dist/astro/routes/api/schema/collections/index.mjs +73 -62
  179. package/dist/astro/routes/api/schema/index.mjs +13 -10
  180. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -60
  181. package/dist/astro/routes/api/schema/orphans/index.mjs +71 -60
  182. package/dist/astro/routes/api/search/enable.mjs +20 -13
  183. package/dist/astro/routes/api/search/index.mjs +19 -12
  184. package/dist/astro/routes/api/search/rebuild.mjs +20 -13
  185. package/dist/astro/routes/api/search/stats.mjs +12 -7
  186. package/dist/astro/routes/api/search/suggest.mjs +19 -12
  187. package/dist/astro/routes/api/sections/_slug_.mjs +57 -44
  188. package/dist/astro/routes/api/sections/index.mjs +57 -44
  189. package/dist/astro/routes/api/settings/email.mjs +5 -5
  190. package/dist/astro/routes/api/settings/reviews.mjs +11 -11
  191. package/dist/astro/routes/api/settings.mjs +57 -44
  192. package/dist/astro/routes/api/setup/admin-verify.mjs +19 -14
  193. package/dist/astro/routes/api/setup/admin.mjs +17 -12
  194. package/dist/astro/routes/api/setup/dev-bypass.mjs +44 -32
  195. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  196. package/dist/astro/routes/api/setup/index.mjs +47 -34
  197. package/dist/astro/routes/api/setup/status.mjs +3 -3
  198. package/dist/astro/routes/api/snapshot.mjs +9 -9
  199. package/dist/astro/routes/api/system/heartbeat.mjs +2 -2
  200. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +60 -47
  201. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +60 -47
  202. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +60 -47
  203. package/dist/astro/routes/api/taxonomies/index.mjs +60 -47
  204. package/dist/astro/routes/api/themes/preview.mjs +7 -7
  205. package/dist/astro/routes/api/typegen.mjs +4 -4
  206. package/dist/astro/routes/api/well-known/auth.mjs +3 -3
  207. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
  208. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
  209. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +56 -43
  210. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +57 -44
  211. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +57 -44
  212. package/dist/astro/routes/api/widget-areas/_name_.mjs +53 -41
  213. package/dist/astro/routes/api/widget-areas/index.mjs +57 -44
  214. package/dist/astro/routes/api/widget-components.mjs +2 -2
  215. package/dist/astro/routes/robots.txt.mjs +14 -9
  216. package/dist/astro/routes/sitemap-_collection_.xml.mjs +20 -16
  217. package/dist/astro/routes/sitemap.xml.mjs +19 -15
  218. package/dist/astro/session-driver.d.mts +1 -1
  219. package/dist/astro/session-driver.mjs +8 -3
  220. package/dist/astro/types.d.mts +21 -14
  221. package/dist/{atomic-authority-CnBQJ14T.mjs → atomic-authority-Bf5QZboB.mjs} +2 -2
  222. package/dist/{audit-Cl495Ze3.mjs → audit-hXJBTPY0.mjs} +1 -1
  223. package/dist/auth/providers/github.d.mts +1 -1
  224. package/dist/auth/providers/google.d.mts +1 -1
  225. package/dist/{auth-control-guard-DbjgJdlo.mjs → auth-control-guard-DpUP6Fs_.mjs} +1 -1
  226. package/dist/{authorize-DDmgmnW-.mjs → authorize-DWNOqMKq.mjs} +1 -1
  227. package/dist/{briefing-DsD-Ouwc.mjs → briefing-BzvBeIJh.mjs} +1 -1
  228. package/dist/{briefing-COw-WcYz.mjs → briefing-DYiV93rg.mjs} +995 -7
  229. package/dist/{bundle-bhiszAui.mjs → bundle-DWn5eFKz.mjs} +2 -2
  230. package/dist/{byline-TYk2kad6.mjs → byline-3qjp1-oa.mjs} +65 -14
  231. package/dist/{byline-fields-CKhPED5o.d.mts → byline-fields-Bne2v0ti.d.mts} +42 -38
  232. package/dist/{byline-fields-BKj5f3Ub.mjs → byline-fields-DRMCc0V_.mjs} +1 -1
  233. package/dist/{byline-fields-DZ46DF10.mjs → byline-fields-wWu2Cb3l.mjs} +3 -3
  234. package/dist/{byline-registry-CJihchD1.mjs → byline-registry-Caj0_gbU.mjs} +1 -1
  235. package/dist/{bylines-6T9iVC9j.mjs → bylines-BSn9O1Wx.mjs} +3 -3
  236. package/dist/{bylines-CvTSCAw9.mjs → bylines-CGuJi-zu.mjs} +5 -5
  237. package/dist/{patterns-Ay-4KImK.mjs → cache-DsEbwFVE.mjs} +51 -1
  238. package/dist/{chunks-C8vSD_5L.mjs → chunks-Bb56aCtB.mjs} +1 -1
  239. package/dist/cli/index.mjs +488 -58
  240. package/dist/cli/plugin-kit.d.mts +14 -11
  241. package/dist/cli/plugin-kit.mjs +2 -2
  242. package/dist/client/external-auth-headers.d.mts +1 -1
  243. package/dist/client/index.d.mts +16 -13
  244. package/dist/client/index.mjs +2 -2
  245. package/dist/{client-factory-C1ZQCMog.mjs → client-factory-BLbm250o.mjs} +1 -1
  246. package/dist/{comment-DAQfUjqt.mjs → comment-BWDG1nQm.mjs} +2 -2
  247. package/dist/{comment-reaction-Dp3G7UZc.mjs → comment-reaction-B7pLTlQ7.mjs} +1 -1
  248. package/dist/{comments-BrvIaRAx.mjs → comments-xkten8nV.mjs} +1 -1
  249. package/dist/config-6R0bchVE.mjs +125 -0
  250. package/dist/{content-CIKsrvU9.mjs → content-BigS8BAv.mjs} +302 -45
  251. package/dist/content-Dr22fzA_.mjs +390 -0
  252. package/dist/{content-refresh-BilzqcLt.mjs → content-refresh-DJuFIqQ4.mjs} +14 -8
  253. package/dist/content-storage/index.d.mts +180 -0
  254. package/dist/content-storage/index.mjs +29 -0
  255. package/dist/content-storage/store.d.mts +3 -0
  256. package/dist/content-storage/store.mjs +5 -0
  257. package/dist/{review-payload-Bap86e75.mjs → content-write-DAZCNKWl.mjs} +838 -131
  258. package/dist/{context-DAs_MZjJ.mjs → context-0806nV9h.mjs} +292 -23
  259. package/dist/{context-DVTvucNb.mjs → context-CCsI5nTK.mjs} +2 -2
  260. package/dist/{context-route-helpers-BP-UJ4u8.mjs → context-route-helpers-TP3EqxRQ.mjs} +2 -2
  261. package/dist/{dashboard-BAjWCGCP.mjs → dashboard-CSrnhBO6.mjs} +4 -4
  262. package/dist/database/batch.d.mts +1 -1
  263. package/dist/database/batch.mjs +1 -1
  264. package/dist/database/d1/index.d.mts +14 -11
  265. package/dist/database/d1/index.mjs +4 -4
  266. package/dist/database/instrumentation.mjs +3 -2
  267. package/dist/db/index.d.mts +3 -3
  268. package/dist/db/index.mjs +1 -1
  269. package/dist/db/libsql.d.mts +1 -1
  270. package/dist/db/postgres.d.mts +1 -1
  271. package/dist/db/sqlite.d.mts +1 -1
  272. package/dist/{device-flow-Dh0rNlh1.mjs → device-flow-SoZh-HvN.mjs} +3 -3
  273. package/dist/{discovery-V0e0Gg8j.mjs → discovery-49qXmdwv.mjs} +4 -4
  274. package/dist/{enrich-B7PIJ8Iy.mjs → enrich-CAMsD1aT.mjs} +1 -1
  275. package/dist/{error-B5a45Tfb.mjs → error-sL4aemcW.mjs} +2 -0
  276. package/dist/{evidence-Vnp_fQbC.mjs → evidence-B3O9_VKm.mjs} +7 -7
  277. package/dist/{field-defs-cache-aXUeXJdC.mjs → field-defs-cache-dn5Tw79A.mjs} +4 -4
  278. package/dist/{fts-manager-BrPpYtK0.mjs → fts-manager-Zu5ITic0.mjs} +1 -1
  279. package/dist/{hitl-requests-BxMMON3s.mjs → hitl-requests-B5vOPseK.mjs} +2 -2
  280. package/dist/{hitl-route-helpers-sdnjpx2k.mjs → hitl-route-helpers-C3icmGdj.mjs} +5 -5
  281. package/dist/hook-events-BQw73jc7.d.mts +32 -0
  282. package/dist/{import-C2-v4FCs.mjs → import-CKnKQj3f.mjs} +9 -9
  283. package/dist/{index-BVGe04wF.d.mts → index-CLj17kW9.d.mts} +12 -5
  284. package/dist/index.d.mts +19 -16
  285. package/dist/index.mjs +107 -98
  286. package/dist/{integration-credentials-DMEXZU2J.mjs → integration-credentials-DpuRw1kx.mjs} +2 -2
  287. package/dist/{jsonld-XWmmAoVo.d.mts → jsonld-CN91qtDw.d.mts} +2 -2
  288. package/dist/{load-DvCVppOF.mjs → load-CiRTddkJ.mjs} +1 -1
  289. package/dist/{loader-Dp6zLmQm.mjs → loader-CCwWFQSh.mjs} +16 -5
  290. package/dist/{manifest-schema-CCvogfrP.mjs → manifest-schema-DaQpgyTB.mjs} +1 -1
  291. package/dist/{mcp-reviewed-executor-B8Gbin3T.mjs → mcp-reviewed-executor-DA6Q9sDc.mjs} +6 -6
  292. package/dist/media/image-endpoint.mjs +1 -1
  293. package/dist/media/index.d.mts +1 -1
  294. package/dist/media/index.mjs +2 -2
  295. package/dist/media/local-runtime.d.mts +16 -13
  296. package/dist/media/local-runtime.mjs +3 -3
  297. package/dist/{media-C5ba8fvI.mjs → media-BjH5OD-A.mjs} +1 -1
  298. package/dist/{media-allowlist-DQvscVkS.mjs → media-allowlist-C8HJ2O61.mjs} +1 -1
  299. package/dist/{menus-CyNpBQrX.mjs → menus-CbBi7Ad7.mjs} +2 -2
  300. package/dist/{menus-w5xwT-f5.mjs → menus-D0c8CeVg.mjs} +7 -7
  301. package/dist/migration-DJuj7ZwN.mjs +526 -0
  302. package/dist/{migrations-CLlX25HO.mjs → migrations-BAjF60cl.mjs} +1 -1
  303. package/dist/{oauth-authorization-CdqJZUMf.mjs → oauth-authorization-CSSRMOKn.mjs} +4 -4
  304. package/dist/{oauth-clients-CHNb9MAZ.mjs → oauth-clients-DX5HIJJv.mjs} +2 -2
  305. package/dist/object-cache/memory.d.mts +1 -1
  306. package/dist/{object-cache-mxCW-Rpt.mjs → object-cache-DyI1SOBK.mjs} +3 -1
  307. package/dist/owned-metadata-BPmUjZqI.mjs +69 -0
  308. package/dist/page/index.d.mts +15 -12
  309. package/dist/page/index.mjs +1 -1
  310. package/dist/{parse-THHCpJLB.mjs → parse-C6kCR1OT.mjs} +1 -1
  311. package/dist/plugin-utils.d.mts +14 -11
  312. package/dist/plugins/adapt-sandbox-entry.d.mts +14 -11
  313. package/dist/plugins/adapt-sandbox-entry.mjs +1 -1
  314. package/dist/{plugins-pfraURNp.mjs → plugins-V0W65r3v.mjs} +16 -962
  315. package/dist/{policy-B6mVa7ib.mjs → policy-DbceGc4P.mjs} +2 -2
  316. package/dist/{preview-Bh7D7F27.mjs → preview-CWiIjMDi.mjs} +2 -2
  317. package/dist/{provider-loader-DT7vQ5FI.d.mts → provider-loader-oLKm1AU8.d.mts} +1 -1
  318. package/dist/{public-url-Ccv0Xmue.d.mts → public-url-CEC1vj02.d.mts} +2 -2
  319. package/dist/{public-url-BvnTaacI.d.mts → public-url-CKrUov8D.d.mts} +1 -1
  320. package/dist/{publication-authorization-B_HJSnzR.mjs → publication-authorization-wMR-tEQ_.mjs} +43 -17
  321. package/dist/{query-xspvw7Ui.mjs → query-DDi367tF.mjs} +14 -14
  322. package/dist/{query-DLeahg3x.mjs → query-DLnnpEuf.mjs} +4 -4
  323. package/dist/{rate-limit-BsBr_U9g.mjs → rate-limit-DeVLLe4z.mjs} +2 -2
  324. package/dist/{redirect-BQFa1THe.mjs → redirect-CJ-FAbNK.mjs} +2 -2
  325. package/dist/{redirects-DJcsgz_X.mjs → redirects-BKi6mek4.mjs} +4 -5
  326. package/dist/{redirects-CVfxefrz.mjs → redirects-I78-ZYLV.mjs} +5 -386
  327. package/dist/{registry-Dclv9iHv.mjs → registry-zXXZezu-.mjs} +7 -7
  328. package/dist/{release-B3Q-9B7N.mjs → release-Cpi0-Bzq.mjs} +173 -22
  329. package/dist/request-context.d.mts +30 -0
  330. package/dist/{request-meta-CjORiJQ_.mjs → request-meta-DZYuLXx_.mjs} +1 -1
  331. package/dist/review-payload-Bhi52CbI.mjs +112 -0
  332. package/dist/{review-requests-CcSUTm_l.mjs → review-requests-C-ScxD9n.mjs} +2 -2
  333. package/dist/{review-requests-CUVn0RBl.mjs → review-requests-DZYM51yI.mjs} +2 -2
  334. package/dist/{review-route-helpers-CKBfGKCi.mjs → review-route-helpers-DXNDyx_q.mjs} +2 -2
  335. package/dist/{revision-W6FDfDqx.mjs → revision-B_HYO2AE.mjs} +42 -7
  336. package/dist/revisions-CQ7rMP5d.mjs +55 -0
  337. package/dist/{revocation-C_ZQvGRT.mjs → revocation-4we8kfBg.mjs} +2 -2
  338. package/dist/{runner-CRU7BXjr.mjs → runner-CuG8o1uW.mjs} +558 -487
  339. package/dist/{runner-SoP1rphP.d.mts → runner-DXQkyPeX.d.mts} +1 -1
  340. package/dist/{runs-BtaAiLTw.mjs → runs-BjgLfqCn.mjs} +5 -5
  341. package/dist/runtime-Bs2JMbb2.d.mts +45 -0
  342. package/dist/runtime-Ch5G-tnG.mjs +400 -0
  343. package/dist/runtime.d.mts +15 -12
  344. package/dist/runtime.mjs +9 -4
  345. package/dist/schema-BA05k0TN.mjs +8 -0
  346. package/dist/{search-BI9uKr7U.mjs → search-DMrzhfx_.mjs} +4 -98
  347. package/dist/{secrets-D_pergcD.mjs → secrets-CIYcw9T9.mjs} +4 -4
  348. package/dist/{sections-BqqYq9RW.mjs → sections-BTrSEhqB.mjs} +2 -2
  349. package/dist/seed/index.d.mts +2 -2
  350. package/dist/seed/index.mjs +38 -26
  351. package/dist/seo/index.d.mts +3 -3
  352. package/dist/seo/index.mjs +12 -9
  353. package/dist/{seo-Bs_DUxJf.mjs → seo-Cv7ud_m2.mjs} +44 -5
  354. package/dist/{seo-B-5PsaJO.mjs → seo-DkjtBh-y.mjs} +1 -1
  355. package/dist/{service-W2xuGLgw.mjs → service-BBJM08uD.mjs} +2 -2
  356. package/dist/{service-B65aJsN7.mjs → service-CkMuD5AE.mjs} +3 -3
  357. package/dist/{settings-DsBzKeUQ.mjs → settings-BUONaNnG.mjs} +7 -7
  358. package/dist/{settings-CyJ2-MKx.mjs → settings-CI-NtWEc.mjs} +2 -2
  359. package/dist/{setup-complete-DeivSVJi.mjs → setup-complete-DoVbVrHx.mjs} +1 -1
  360. package/dist/{site-activity-DU0UPDji.mjs → site-activity-hpfJkmxQ.mjs} +1 -1
  361. package/dist/{site-context-Dic2jHuw.mjs → site-context-BW3GRCJH.mjs} +15 -15
  362. package/dist/{site-url-Tw6CfBB2.mjs → site-url-CYatfe3q.mjs} +1 -1
  363. package/dist/{state-DM7blWfT.mjs → state-CKkqoA6i.mjs} +1 -1
  364. package/dist/storage/local.d.mts +1 -1
  365. package/dist/storage/local.mjs +1 -1
  366. package/dist/storage/s3.d.mts +1 -1
  367. package/dist/storage/s3.mjs +2 -2
  368. package/dist/{store-32e6dfD-.mjs → store-BzaAtszy.mjs} +3 -3
  369. package/dist/submission-DLgjQ_Ew.mjs +205 -0
  370. package/dist/{taxonomies-BFsUR7kc.mjs → taxonomies-C02-Vuh3.mjs} +3 -3
  371. package/dist/{taxonomies-lWGNLKgn.mjs → taxonomies-D5wO9zmB.mjs} +7 -7
  372. package/dist/{taxonomy-DN6i1upz.mjs → taxonomy-BK7JmHlo.mjs} +53 -3
  373. package/dist/terms-EskuqbKE.mjs +104 -0
  374. package/dist/text-extraction-CdqMGYQK.mjs +96 -0
  375. package/dist/{tokens-D-StaTAQ.mjs → tokens-D8HEH277.mjs} +1 -1
  376. package/dist/{trusted-proxy-hYufGFPK.mjs → trusted-proxy-Dg3U9Lrv.mjs} +1 -1
  377. package/dist/{types-RFzE_V1M.mjs → types-BI3ULB3A.mjs} +2 -2
  378. package/dist/{types-CJynaYg1.d.mts → types-C3jUu4Bc.d.mts} +90 -34
  379. package/dist/{types-B--VyN3n.d.mts → types-Dpv_MvwZ.d.mts} +1 -1
  380. package/dist/{types-CgcOeaiQ.d.mts → types-ex-UrNlz.d.mts} +1 -1
  381. package/dist/types-qOEot0UQ.d.mts +83 -0
  382. package/dist/ui/server-runtime.d.mts +18 -15
  383. package/dist/ui/server-runtime.mjs +29 -25
  384. package/dist/{user-Btai9rl3.mjs → user-Bl2_8rhJ.mjs} +2 -2
  385. package/dist/{utils-CYxGuO_P.mjs → utils-CklSLz9F.mjs} +2 -2
  386. package/dist/{validate-C05z0m7M.mjs → validate-C-yk7mmX.mjs} +3 -3
  387. package/dist/{validate-kmN2lS8H.d.mts → validate-DUscf6VG.d.mts} +3 -3
  388. package/dist/version-BlE1LEPb.mjs +6 -0
  389. package/dist/version-store-BXv2D0de.mjs +208 -0
  390. package/dist/version-store-B_THJCc0.d.mts +98 -0
  391. package/dist/{widgets-BOrDZdQ3.mjs → widgets-9xHBhL_L.mjs} +3 -3
  392. package/dist/{wordpress-slugs-ROzITIBK.mjs → wordpress-slugs-yaeD7cxn.mjs} +1 -1
  393. package/dist/{worker-Bg35R37I.mjs → worker-CC_Rt1pB.mjs} +10 -10
  394. package/dist/write-intent-DuHVqks9.mjs +108 -0
  395. package/dist/{zod-generator-DkrWuID7.mjs → zod-generator-B5Pt8fv0.mjs} +2 -2
  396. package/package.json +16 -4
  397. package/dist/cache-B5NSHhxG.mjs +0 -52
  398. package/dist/cron-C7HCJPPl.mjs +0 -271
  399. package/dist/schema-CosVhHJt.mjs +0 -8
  400. package/dist/submission-DJmRejGR.mjs +0 -411
  401. package/dist/version-BnLdwIT1.mjs +0 -6
  402. /package/dist/{actor-DxUAJgQX.mjs → actor-D0AW80ld.mjs} +0 -0
  403. /package/dist/{adapter-symbols-Bq3JsWGM.d.mts → adapter-symbols-B9mi-BUh.d.mts} +0 -0
  404. /package/dist/{adapters-C8nRpUuj.d.mts → adapters-lDnJjNDz.d.mts} +0 -0
  405. /package/dist/{api-tokens-0N3nafqZ.mjs → api-tokens-CdfsE9PL.mjs} +0 -0
  406. /package/dist/{base64-Cz-aU0X1.mjs → base64-qvSs0Gxy.mjs} +0 -0
  407. /package/dist/{challenge-store-BPn3goP9.mjs → challenge-store-7IZ_NqWg.mjs} +0 -0
  408. /package/dist/{components-rFN8NH3N.mjs → components-JA6tFHmE.mjs} +0 -0
  409. /package/dist/{context-types-CPWAJRs5.mjs → context-types-DDIJhGLs.mjs} +0 -0
  410. /package/dist/{default-BS6VQRkB.mjs → default-C2azCFSB.mjs} +0 -0
  411. /package/dist/{email-console-GqK6hgMJ.mjs → email-console-BYQp_5Qr.mjs} +0 -0
  412. /package/dist/{escape-CE7xOWzJ.mjs → escape-4_NNa6GR.mjs} +0 -0
  413. /package/dist/{experimental-workflows-BbxpWwBy.mjs → experimental-workflows-CPNiI2EL.mjs} +0 -0
  414. /package/dist/{forgeway-account-DcTxh3Gw.mjs → forgeway-account-YzraapbX.mjs} +0 -0
  415. /package/dist/{hash-D2Rqd2J2.mjs → hash-qSYPMJ8w.mjs} +0 -0
  416. /package/dist/{media-url-D9kdpoLS.mjs → media-url-D5E1a47B.mjs} +0 -0
  417. /package/dist/{mime-BnVhH671.mjs → mime-FkfazULS.mjs} +0 -0
  418. /package/dist/{mode-D0gePRtf.mjs → mode-C3RI5Z5t.mjs} +0 -0
  419. /package/dist/{normalize-aTwryvvi.mjs → normalize-DrmlLn40.mjs} +0 -0
  420. /package/dist/{oauth-authority-P5YMSk2z.mjs → oauth-authority-DVlLFhsZ.mjs} +0 -0
  421. /package/dist/{oauth-state-store-CMqLdo4I.mjs → oauth-state-store-nf-78RbK.mjs} +0 -0
  422. /package/dist/{options-JiLWB6Bt.mjs → options-yFkLUuTw.mjs} +0 -0
  423. /package/dist/{output-7HDrYTSQ.mjs → output-ljHaxIHX.mjs} +0 -0
  424. /package/dist/{parser-kettsjWc.mjs → parser-CTlxybRo.mjs} +0 -0
  425. /package/dist/{passkey-config-DVzQ3dv3.mjs → passkey-config-BLon3ct9.mjs} +0 -0
  426. /package/dist/{placeholder-DJLP_HY7.d.mts → placeholder-DdZV3I8x.d.mts} +0 -0
  427. /package/dist/{portable-text-tQhvPLf1.mjs → portable-text-CSbRjM-T.mjs} +0 -0
  428. /package/dist/{portable-text-BE7nszX6.d.mts → portable-text-HNmwL-7L.d.mts} +0 -0
  429. /package/dist/{process-cache-C19OA3am.mjs → process-cache-CMy5M80h.mjs} +0 -0
  430. /package/dist/{provider-loader-DERzBMUz.mjs → provider-loader-DlaT1usE.mjs} +0 -0
  431. /package/dist/{public-discovery-BGyhuD5U.mjs → public-discovery-BnqYofSK.mjs} +0 -0
  432. /package/dist/{public-url-DFXUU6Wp.mjs → public-url-BHjYWuaN.mjs} +0 -0
  433. /package/dist/{public-url-sR8SVmTt.mjs → public-url-GQygrYmg.mjs} +0 -0
  434. /package/dist/{redirect-BxacnBYL.mjs → redirect-CokmLN5o.mjs} +0 -0
  435. /package/dist/{request-cache-8_ifFzVw.mjs → request-cache-CizvDoxV.mjs} +0 -0
  436. /package/dist/{resolve-DEKC4qVa.mjs → resolve-BxFGSKYu.mjs} +0 -0
  437. /package/dist/{runtime-env-CPTzh0mZ.mjs → runtime-env-DpYGy4pT.mjs} +0 -0
  438. /package/dist/{scheduled-publish-BxdShRGs.d.mts → scheduled-publish-eCNGpvNm.d.mts} +0 -0
  439. /package/dist/{seo-contributions-LEFs1d7w.mjs → seo-contributions-ZKqrqsdT.mjs} +0 -0
  440. /package/dist/{service-kQ5ljRzX.mjs → service-DeX1PRNt.mjs} +0 -0
  441. /package/dist/{session-user-eweCNKzW.mjs → session-user-D36BRaZY.mjs} +0 -0
  442. /package/dist/{setup-nonce-B6A5Y1ea.mjs → setup-nonce-B9IO7PbK.mjs} +0 -0
  443. /package/dist/{sidecar-client-BwPhhz-F.mjs → sidecar-client-2hx5G46s.mjs} +0 -0
  444. /package/dist/{slugify-kD31VIv2.mjs → slugify-DvoaEPtL.mjs} +0 -0
  445. /package/dist/{ssrf-C9dyjU8O.mjs → ssrf-DcD8vn3E.mjs} +0 -0
  446. /package/dist/{stable-hash-B9Tbb2f_.mjs → stable-hash-9RDJgfif.mjs} +0 -0
  447. /package/dist/{status-Bjf_uSrW.mjs → status-B2xUokyJ.mjs} +0 -0
  448. /package/dist/{transport-BrU1aDY5.mjs → transport-BHYE4pox.mjs} +0 -0
  449. /package/dist/{transport-CZbtxgKZ.d.mts → transport-CVU5rp7W.d.mts} +0 -0
  450. /package/dist/{types-DNBL-4Sn.mjs → types-B3Uq7Czg.mjs} +0 -0
  451. /package/dist/{types-DsJTXStN.d.mts → types-BJztoTbF.d.mts} +0 -0
  452. /package/dist/{types-COvyXIp7.mjs → types-BgUxCuwu.mjs} +0 -0
  453. /package/dist/{types-KFzuijKE.d.mts → types-C0heD9oI.d.mts} +0 -0
  454. /package/dist/{types-B03h5jt_.d.mts → types-DheoByey.d.mts} +0 -0
  455. /package/dist/{types-SlLXjRpg.d.mts → types-I5LHzk_M.d.mts} +0 -0
  456. /package/dist/{types-PLJ9hlhh.mjs → types-Nm0cMxEh.mjs} +0 -0
  457. /package/dist/{types-CtGSEKEJ.d.mts → types-PxxPTFSl.d.mts} +0 -0
  458. /package/dist/{url-DGG3hw_h.mjs → url-Coamqvs4.mjs} +0 -0
  459. /package/dist/{url-DUz3LbCs.mjs → url-dn4mFfCI.mjs} +0 -0
  460. /package/dist/{workers-build-5UQ4j69Q.mjs → workers-build-4926MPc0.mjs} +0 -0
@@ -1,271 +0,0 @@
1
- import { sql } from "kysely";
2
- import { ulid } from "ulidx";
3
- import { Cron } from "croner";
4
-
5
- //#region src/plugins/cron.ts
6
- /**
7
- * Plugin Cron System
8
- *
9
- * Provides scheduled task execution for plugins:
10
- * - CronExecutor: claims overdue tasks, invokes per-plugin cron hook, updates next run.
11
- * - CronAccessImpl: per-plugin API for schedule/cancel/list.
12
- *
13
- */
14
- /** Stale lock threshold in minutes */
15
- const STALE_LOCK_MINUTES = 10;
16
- const MAX_ONESHOT_RETRIES = 5;
17
- /**
18
- * Executes overdue cron tasks.
19
- *
20
- * Called by schedulers (NodeCronScheduler, PiggybackScheduler). Stateless —
21
- * all state lives in the database.
22
- */
23
- var CronExecutor = class {
24
- resolveDb;
25
- constructor(db, invokeCronHook) {
26
- this.invokeCronHook = invokeCronHook;
27
- this.resolveDb = typeof db === "function" ? db : () => db;
28
- }
29
- get db() {
30
- return this.resolveDb();
31
- }
32
- /**
33
- * Process all overdue tasks.
34
- *
35
- * 1. Atomically claim tasks whose next_run_at <= now, status = idle, enabled = 1.
36
- * 2. For each claimed task, invoke the plugin's cron hook.
37
- * 3. On success: compute next_run_at and reset to idle, or delete one-shots.
38
- * 4. On failure: reset to idle (retry on next tick).
39
- */
40
- async tick() {
41
- let processed = 0;
42
- for (let index = 0; index < 10; index++) {
43
- const now = (/* @__PURE__ */ new Date()).toISOString();
44
- const lease = ulid();
45
- const task = (await sql`
46
- UPDATE _dineway_cron_tasks
47
- SET status = 'running', locked_at = ${now}, lease_token = ${lease}
48
- WHERE status = 'idle' AND enabled = 1 AND next_run_at <= ${now} AND id IN (
49
- SELECT id FROM _dineway_cron_tasks
50
- WHERE next_run_at <= ${now}
51
- AND status = 'idle'
52
- AND enabled = 1
53
- ORDER BY next_run_at ASC
54
- LIMIT 1
55
- )
56
- RETURNING id, plugin_id, task_name, schedule, is_oneshot, data, next_run_at
57
- `.execute(this.db)).rows[0];
58
- if (!task) break;
59
- const ownedOccurrence = sql`id = ${task.id} AND status = 'running' AND enabled = 1 AND lease_token = ${lease}
60
- AND schedule = ${task.schedule} AND next_run_at = ${task.next_run_at} AND data IS NOT DISTINCT FROM ${task.data}`;
61
- let parsedData;
62
- if (task.data) try {
63
- parsedData = JSON.parse(task.data);
64
- } catch {
65
- console.error(`[cron] Invalid JSON data for ${task.plugin_id}:${task.task_name}, skipping`);
66
- await sql`
67
- UPDATE _dineway_cron_tasks
68
- SET status = 'failed', enabled = 0, locked_at = NULL, lease_token = NULL
69
- WHERE ${ownedOccurrence}
70
- `.execute(this.db);
71
- continue;
72
- }
73
- const event = {
74
- executionId: `${task.id}:${task.is_oneshot ? task.schedule : task.next_run_at}`,
75
- name: task.task_name,
76
- data: parsedData,
77
- scheduledAt: task.next_run_at
78
- };
79
- let hookFailed = false;
80
- try {
81
- await this.invokeCronHook(task.plugin_id, event);
82
- } catch (error) {
83
- hookFailed = true;
84
- console.error(`[cron] Hook failed for ${task.plugin_id}:${task.task_name}:`, error);
85
- }
86
- if (task.is_oneshot) if (hookFailed) {
87
- const retryMeta = parsedData?.__dineway != null && typeof parsedData.__dineway === "object" ? parsedData.__dineway : void 0;
88
- const rawRetryCount = retryMeta?.retryCount;
89
- const retryCount = typeof rawRetryCount === "number" && Number.isFinite(rawRetryCount) && rawRetryCount > 0 ? Math.floor(rawRetryCount) : 0;
90
- if (retryCount >= MAX_ONESHOT_RETRIES) {
91
- console.error(`[cron] One-shot task ${task.plugin_id}:${task.task_name} exceeded ${MAX_ONESHOT_RETRIES} retries, retaining failed task`);
92
- await sql`
93
- UPDATE _dineway_cron_tasks SET status = 'failed', enabled = 0, locked_at = NULL, lease_token = NULL WHERE ${ownedOccurrence}
94
- `.execute(this.db);
95
- } else {
96
- const backoffMs = 6e4 * Math.pow(2, retryCount);
97
- await sql`
98
- UPDATE _dineway_cron_tasks
99
- SET status = 'idle', locked_at = NULL, lease_token = NULL, next_run_at = ${new Date(Date.now() + backoffMs).toISOString()}, data = ${JSON.stringify({
100
- ...parsedData,
101
- __dineway: {
102
- ...retryMeta,
103
- retryCount: retryCount + 1
104
- }
105
- })}
106
- WHERE ${ownedOccurrence}
107
- `.execute(this.db);
108
- }
109
- } else await sql`
110
- DELETE FROM _dineway_cron_tasks WHERE ${ownedOccurrence}
111
- `.execute(this.db);
112
- else await sql`
113
- UPDATE _dineway_cron_tasks
114
- SET status = 'idle',
115
- locked_at = NULL, lease_token = NULL,
116
- last_run_at = ${now},
117
- next_run_at = ${nextCronTime(task.schedule)}
118
- WHERE ${ownedOccurrence}
119
- `.execute(this.db);
120
- await sql`UPDATE _dineway_cron_tasks SET status = 'idle', locked_at = NULL, lease_token = NULL
121
- WHERE id = ${task.id} AND status = 'running' AND lease_token = ${lease}`.execute(this.db);
122
- processed++;
123
- }
124
- return processed;
125
- }
126
- /**
127
- * Recover tasks stuck in 'running' for more than STALE_LOCK_MINUTES.
128
- * These likely crashed mid-execution.
129
- */
130
- async recoverStaleLocks() {
131
- const result = await sql`
132
- UPDATE _dineway_cron_tasks
133
- SET status = 'idle', locked_at = NULL, lease_token = NULL
134
- WHERE status = 'running'
135
- AND locked_at < ${(/* @__PURE__ */ new Date(Date.now() - STALE_LOCK_MINUTES * 60 * 1e3)).toISOString()}
136
- `.execute(this.db);
137
- return Number(result.numAffectedRows ?? 0);
138
- }
139
- /**
140
- * Get the next due time across all enabled tasks.
141
- * Returns null if no tasks are scheduled.
142
- */
143
- async getNextDueTime() {
144
- return (await sql`
145
- SELECT MIN(next_run_at) as next
146
- FROM _dineway_cron_tasks
147
- WHERE status = 'idle' AND enabled = 1
148
- `.execute(this.db)).rows[0]?.next ?? null;
149
- }
150
- };
151
- /**
152
- * Per-plugin cron API implementation.
153
- * Scoped to a single plugin ID — plugins cannot see or modify other plugins' tasks.
154
- */
155
- var CronAccessImpl = class {
156
- constructor(db, pluginId, reschedule) {
157
- this.db = db;
158
- this.pluginId = pluginId;
159
- this.reschedule = reschedule;
160
- }
161
- async schedule(name, opts) {
162
- validateTaskName(name);
163
- validateSchedule(opts.schedule);
164
- const oneshot = isOneShot(opts.schedule);
165
- const schedule = oneshot ? new Date(opts.schedule).toISOString() : opts.schedule;
166
- const nextRun = oneshot ? schedule : nextCronTime(schedule);
167
- const dataJson = opts.data ? JSON.stringify(opts.data) : null;
168
- await sql`
169
- INSERT INTO _dineway_cron_tasks (id, plugin_id, task_name, schedule, is_oneshot, data, next_run_at, status, enabled)
170
- VALUES (${ulid()}, ${this.pluginId}, ${name}, ${schedule}, ${oneshot ? 1 : 0}, ${dataJson}, ${nextRun}, 'idle', 1)
171
- ON CONFLICT (plugin_id, task_name) DO UPDATE SET
172
- schedule = ${schedule},
173
- is_oneshot = ${oneshot ? 1 : 0},
174
- data = ${dataJson},
175
- next_run_at = ${nextRun},
176
- status = CASE WHEN _dineway_cron_tasks.status = 'running' THEN 'running' ELSE 'idle' END,
177
- locked_at = CASE WHEN _dineway_cron_tasks.status = 'running' THEN _dineway_cron_tasks.locked_at ELSE NULL END,
178
- lease_token = CASE WHEN _dineway_cron_tasks.status = 'running' THEN _dineway_cron_tasks.lease_token ELSE NULL END,
179
- enabled = 1
180
- `.execute(this.db);
181
- this.reschedule();
182
- }
183
- async cancel(name) {
184
- await sql`
185
- DELETE FROM _dineway_cron_tasks
186
- WHERE plugin_id = ${this.pluginId} AND task_name = ${name}
187
- `.execute(this.db);
188
- this.reschedule();
189
- }
190
- async list() {
191
- return (await sql`
192
- SELECT task_name, schedule, next_run_at, last_run_at, status
193
- FROM _dineway_cron_tasks
194
- WHERE plugin_id = ${this.pluginId} AND (enabled = 1 OR status = 'failed')
195
- ORDER BY next_run_at ASC
196
- `.execute(this.db)).rows.map((row) => ({
197
- name: row.task_name,
198
- status: row.status,
199
- schedule: row.schedule,
200
- nextRunAt: row.next_run_at,
201
- lastRunAt: row.last_run_at
202
- }));
203
- }
204
- };
205
- /**
206
- * Enable or disable all cron tasks for a plugin.
207
- * Called by admin disable/enable endpoints and PluginManager lifecycle.
208
- * Gracefully handles the cron table not existing yet (pre-migration).
209
- */
210
- async function setCronTasksEnabled(db, pluginId, enabled) {
211
- try {
212
- await sql`
213
- UPDATE _dineway_cron_tasks
214
- SET enabled = ${enabled ? 1 : 0}
215
- WHERE plugin_id = ${pluginId}
216
- `.execute(db);
217
- } catch {}
218
- }
219
- /**
220
- * Compute the next fire time for a cron expression.
221
- * Supports standard cron (5-field), extended (6-field with seconds), and
222
- * aliases like @daily, @weekly, @hourly, @monthly, @yearly.
223
- */
224
- function nextCronTime(expression) {
225
- const next = new Cron(expression).nextRun();
226
- if (!next) throw new Error(`Invalid cron expression or no future run: "${expression}"`);
227
- return next.toISOString();
228
- }
229
- /**
230
- * Check whether a string is a valid cron expression.
231
- */
232
- function isCronExpression(schedule) {
233
- try {
234
- new Cron(schedule);
235
- return true;
236
- } catch {
237
- return false;
238
- }
239
- }
240
- const ISO_DATETIME = /^\d{4}-\d{2}-\d{2}T/;
241
- /** Croner accepts ISO timestamps too; distinguish those before testing cron patterns. */
242
- function isOneShot(schedule) {
243
- if (ISO_DATETIME.test(schedule)) return !isNaN(Date.parse(schedule));
244
- if (schedule.startsWith("@") || isCronExpression(schedule)) return false;
245
- return !isNaN(Date.parse(schedule));
246
- }
247
- /** Max length for a task name */
248
- const MAX_TASK_NAME_LENGTH = 128;
249
- /** Task name pattern: alphanumeric, dashes, underscores */
250
- const TASK_NAME_RE = /^[a-zA-Z][a-zA-Z0-9_-]*$/;
251
- /**
252
- * Validate a cron task name.
253
- * Must be non-empty, ≤128 chars, alphanumeric with dashes/underscores.
254
- */
255
- function validateTaskName(name) {
256
- if (!name || name.length > MAX_TASK_NAME_LENGTH) throw new Error(`Invalid task name: must be 1-${MAX_TASK_NAME_LENGTH} characters, got ${name.length}`);
257
- if (!TASK_NAME_RE.test(name)) throw new Error(`Invalid task name "${name}": must start with a letter and contain only letters, numbers, dashes, or underscores`);
258
- }
259
- /**
260
- * Validate a schedule string at registration time.
261
- * Must be a valid cron expression or a parseable ISO 8601 datetime.
262
- */
263
- function validateSchedule(schedule) {
264
- if (!schedule || schedule.length > 256) throw new Error(`Invalid schedule: must be 1-256 characters, got ${schedule.length}`);
265
- if (isCronExpression(schedule)) return;
266
- const parsed = Date.parse(schedule);
267
- if (isNaN(parsed)) throw new Error(`Invalid schedule "${schedule}": must be a valid cron expression or ISO 8601 datetime`);
268
- }
269
-
270
- //#endregion
271
- export { CronExecutor as n, setCronTasksEnabled as r, CronAccessImpl as t };
@@ -1,8 +0,0 @@
1
- import { c as __exportAll } from "./runner-CRU7BXjr.mjs";
2
- import { n as SchemaRegistry } from "./registry-Dclv9iHv.mjs";
3
-
4
- //#region src/schema/index.ts
5
- var schema_exports = /* @__PURE__ */ __exportAll({ SchemaRegistry: () => SchemaRegistry });
6
-
7
- //#endregion
8
- export { schema_exports as t };
@@ -1,411 +0,0 @@
1
- import { AtomicWriteConflict, atomicBatch, prepareAtomicChecks, rowUnchanged } from "./database/batch.mjs";
2
- import { r as isI18nEnabled } from "./config-XW5tMrH8.mjs";
3
- import { t as DinewayValidationError } from "./types-RFzE_V1M.mjs";
4
- import { t as contentWriteChecks } from "./atomic-authority-CnBQJ14T.mjs";
5
- import { o as invalidateCollectionCache } from "./object-cache-mxCW-Rpt.mjs";
6
- import { t as RevisionRepository } from "./revision-W6FDfDqx.mjs";
7
- import { t as ContentRepository } from "./content-CIKsrvU9.mjs";
8
- import { t as buildStableHash } from "./stable-hash-B9Tbb2f_.mjs";
9
- import { i as isSupersededReview, r as ReviewRequestRepository, t as REVIEW_SUPERSESSION_ACTOR } from "./review-requests-CUVn0RBl.mjs";
10
- import { t as RedirectRepository } from "./redirect-BQFa1THe.mjs";
11
- import { i as invalidateRedirectCache } from "./cache-B5NSHhxG.mjs";
12
- import { D as validateMediaFields, E as validateContentDataFields, T as prepareNonTranslatableFields, k as encodeRev, r as contentWriteConfiguration, t as ReviewPayloadBuilder } from "./review-payload-Bap86e75.mjs";
13
- import { i as reviewDraft } from "./evidence-Vnp_fQbC.mjs";
14
- import { sql } from "kysely";
15
- import { z } from "zod";
16
-
17
- //#region src/api/handlers/content-write.ts
18
- const fieldData = (data) => Object.fromEntries(Object.entries(data).filter(([key]) => !key.startsWith("_")));
19
- const reviews = /* @__PURE__ */ new WeakMap();
20
- function preparedContentReview(write) {
21
- const stored = reviews.get(write);
22
- if (!stored) throw new DinewayValidationError("Review requires an unmodified prepared content write.");
23
- return structuredClone(stored);
24
- }
25
- /** Prepare a draft or direct backing-row edit without committing site-owned writes separately. */
26
- async function prepareContentWrite(db, collection, input) {
27
- const configuration = await contentWriteConfiguration(db, collection);
28
- const supports = JSON.parse(configuration.row?.supports ?? "[]");
29
- const usesRevisions = Array.isArray(supports) && supports.includes("revisions");
30
- if (input.status !== void 0 && input.status !== "draft") throw new DinewayValidationError("Prepared status changes must use publish or unpublish.");
31
- if (input.publish && input.unpublish) throw new DinewayValidationError("Publish and unpublish cannot be combined.");
32
- const validateData = async (data) => {
33
- const fields = await validateContentDataFields(db, collection, fieldData(data));
34
- if (fields && !fields.success) throw new DinewayValidationError(fields.error.message);
35
- const media = await validateMediaFields(db, collection, fieldData(data));
36
- if (!media.success) throw new DinewayValidationError(media.error.message);
37
- };
38
- if (input.data) await validateData(input.data);
39
- const repo = new ContentRepository(db);
40
- const checks = [...configuration.checks];
41
- const statements = [];
42
- let item;
43
- let previousSlug = null;
44
- let wasPublished = false;
45
- let live = null;
46
- let draft = null;
47
- let now = (/* @__PURE__ */ new Date()).toISOString();
48
- if (input.id) {
49
- const snapshot = await repo.snapshot(collection, input.id);
50
- if (!snapshot) throw new DinewayValidationError("Content item not found.");
51
- if (input.expectedRev !== void 0 && encodeRev(snapshot.item) !== input.expectedRev) throw new AtomicWriteConflict();
52
- previousSlug = snapshot.item.slug;
53
- wasPublished = snapshot.item.status === "published";
54
- item = {
55
- ...snapshot.item,
56
- updatedAt: now,
57
- version: snapshot.item.version + 1
58
- };
59
- checks.push(snapshot.check, ...contentWriteChecks(collection, item.id, "edit"));
60
- for (const [kind, id] of [["live", item.liveRevisionId], ["draft", item.draftRevisionId]]) {
61
- if (!id) continue;
62
- const revision = await db.selectFrom("revisions").selectAll().where("id", "=", id).executeTakeFirst();
63
- if (!revision || revision.collection !== collection || revision.entry_id !== item.id) throw new DinewayValidationError("Content revision is missing or belongs to another entry.");
64
- checks.push(rowUnchanged("revisions", revision));
65
- if (kind === "live") live = JSON.parse(revision.data);
66
- else draft = JSON.parse(revision.data);
67
- }
68
- const stage = input.stageDraft !== false && usesRevisions;
69
- const changedDraft = stage && (Object.keys(input.data ?? {}).length > 0 || input.slug !== void 0);
70
- if (changedDraft) draft = {
71
- ...draft ?? item.data,
72
- ...input.data,
73
- ...input.slug === void 0 ? {} : { _slug: input.slug }
74
- };
75
- if (input.draftData) {
76
- const previous = draft ?? live ?? item.data;
77
- await validateData(Object.fromEntries(Object.entries(input.draftData).filter(([key, value]) => JSON.stringify(previous[key]) !== JSON.stringify(value))));
78
- draft = structuredClone(input.draftData);
79
- }
80
- if (!stage) {
81
- item.data = {
82
- ...item.data,
83
- ...await repo.normalizePreparedData(collection, fieldData(input.data ?? {}))
84
- };
85
- for (const [key, value] of Object.entries(item.data)) if (typeof value === "boolean") item.data[key] = Number(value);
86
- for (const [key, value] of Object.entries(item.data)) if (value === null || value === void 0) delete item.data[key];
87
- if (input.slug !== void 0) item.slug = input.slug;
88
- }
89
- if (!stage && input.slug && previousSlug && input.slug !== previousSlug) statements.push(...new RedirectRepository(db).prepareAutoRedirect(collection, previousSlug, input.slug, item.id, configuration.row?.url_pattern ?? null).statements);
90
- if (!stage && isI18nEnabled() && input.data && item.translationGroup) {
91
- const sync = prepareNonTranslatableFields(db, collection, item.id, item.translationGroup, fieldData(input.data), configuration.fields.filter((field) => field.translatable === 0).map((field) => field.slug));
92
- if (sync) statements.push(sync);
93
- }
94
- if (input.status !== void 0) item.status = input.status;
95
- if (input.authorId !== void 0) item.authorId = input.authorId;
96
- statements.push(repo.prepareUpdate(collection, item.id, {
97
- data: stage ? void 0 : input.data && fieldData(input.data),
98
- slug: stage ? void 0 : input.slug,
99
- status: input.status,
100
- authorId: input.authorId
101
- }, now));
102
- if (changedDraft || input.draftData || input.unpublish && !draft && live) {
103
- draft ??= live;
104
- if (draft) {
105
- const revision = new RevisionRepository(db).prepareCreateSnapshot({
106
- collection,
107
- entryId: item.id,
108
- data: sql`${JSON.stringify(draft)}`,
109
- authorId: input.authorId
110
- });
111
- item.draftRevisionId = revision.id;
112
- statements.push(revision.statement, sql`UPDATE ${sql.table(`ec_${collection}`)} SET draft_revision_id=${revision.id} WHERE id=${item.id}`.compile(db));
113
- }
114
- }
115
- } else {
116
- if (input.expectedRev !== void 0 || input.unpublish) throw new DinewayValidationError("A new draft cannot reference an existing revision.");
117
- const data = fieldData(input.data ?? {});
118
- if (input.draftData) await validateData(input.draftData);
119
- const slugSource = [data.title, data.name].find((value) => typeof value === "string" && value.length > 0);
120
- const slug = input.slug ?? (slugSource ? await repo.generateUniqueSlug(collection, slugSource, input.locale) : void 0);
121
- if (slug) checks.push(sql`NOT EXISTS(SELECT 1 FROM ${sql.table(`ec_${collection}`)} WHERE slug=${slug} ${input.locale ? sql`AND locale=${input.locale}` : sql``})`);
122
- const created = await repo.prepareCreate({
123
- type: collection,
124
- data,
125
- slug,
126
- status: "draft",
127
- authorId: input.authorId,
128
- locale: input.locale
129
- }, { captureDefaults: true });
130
- item = created.item;
131
- now = item.updatedAt;
132
- checks.push(...created.batch.checks ?? []);
133
- statements.push(...created.batch.statements);
134
- if (usesRevisions || input.draftData) {
135
- draft = structuredClone(input.draftData ?? {
136
- ...item.data,
137
- ...Object.fromEntries(Object.entries(input.data ?? {}).filter(([key]) => key.startsWith("_")))
138
- });
139
- const revision = new RevisionRepository(db).prepareCreateSnapshot({
140
- collection,
141
- entryId: item.id,
142
- data: sql`${JSON.stringify(draft)}`,
143
- authorId: input.authorId
144
- });
145
- item.draftRevisionId = revision.id;
146
- statements.push(revision.statement, sql`UPDATE ${sql.table(`ec_${collection}`)} SET draft_revision_id=${revision.id} WHERE id=${item.id}`.compile(db));
147
- }
148
- }
149
- if (input.publish) {
150
- const authority = contentWriteChecks(collection, item.id, "publish");
151
- if (input.id) checks.push(...authority);
152
- else statements.push(...prepareAtomicChecks(db, authority));
153
- const data = draft ?? live ?? item.data;
154
- let revisionId = item.draftRevisionId ?? item.liveRevisionId;
155
- if (!revisionId) {
156
- const revision = new RevisionRepository(db).prepareCreateSnapshot({
157
- collection,
158
- entryId: item.id,
159
- data: sql`${JSON.stringify(data)}`,
160
- authorId: input.authorId
161
- });
162
- revisionId = revision.id;
163
- statements.push(revision.statement);
164
- }
165
- const sync = repo.prepareSyncDataColumns(collection, item.id, data);
166
- if (sync) statements.push(sync);
167
- const slug = typeof data._slug === "string" ? data._slug : item.slug;
168
- if (wasPublished && previousSlug && slug && previousSlug !== slug) statements.push(...new RedirectRepository(db).prepareAutoRedirect(collection, previousSlug, slug, item.id, configuration.row?.url_pattern ?? null).statements);
169
- item = {
170
- ...item,
171
- slug,
172
- status: "published",
173
- liveRevisionId: revisionId,
174
- draftRevisionId: null,
175
- scheduledAt: null,
176
- publishedAt: item.publishedAt ?? now,
177
- updatedAt: now,
178
- data: {
179
- ...item.data,
180
- ...await repo.normalizePreparedData(collection, fieldData(data))
181
- }
182
- };
183
- for (const [key, value] of Object.entries(item.data)) {
184
- if (typeof value === "boolean") item.data[key] = Number(value);
185
- if (value === null || value === void 0) delete item.data[key];
186
- }
187
- statements.push(sql`UPDATE ${sql.table(`ec_${collection}`)} SET slug=${slug},status='published',live_revision_id=${revisionId},draft_revision_id=NULL,scheduled_at=NULL,published_at=${item.publishedAt},updated_at=${now} WHERE id=${item.id}`.compile(db));
188
- live = data;
189
- draft = null;
190
- }
191
- if (input.unpublish) {
192
- checks.push(...contentWriteChecks(collection, item.id, "publish"));
193
- item.liveRevisionId = null;
194
- item.status = "draft";
195
- live = null;
196
- statements.push(sql`UPDATE ${sql.table(`ec_${collection}`)} SET live_revision_id=NULL,status='draft' WHERE id=${item.id}`.compile(db));
197
- }
198
- const prepared = {
199
- id: item.id,
200
- item,
201
- rev: encodeRev(item),
202
- draftData: draft,
203
- batch: {
204
- checks,
205
- statements
206
- },
207
- afterCommit: () => {
208
- invalidateCollectionCache(collection);
209
- if (previousSlug !== item.slug) invalidateRedirectCache();
210
- }
211
- };
212
- reviews.set(prepared, structuredClone({
213
- item,
214
- live,
215
- draft
216
- }));
217
- return prepared;
218
- }
219
-
220
- //#endregion
221
- //#region src/review-automation/submission.ts
222
- var ReviewSubmissionError = class extends Error {
223
- constructor(message, code = "REVIEW_SUBMISSION_INVALID") {
224
- super(message);
225
- this.code = code;
226
- }
227
- };
228
- async function prepareAutomatedReview(db, handlers, input, options = {}) {
229
- const projected = options.draft ? preparedContentReview(options.draft) : null;
230
- if (projected && (projected.item.id !== input.id || projected.item.type !== input.collection)) throw new ReviewSubmissionError("Prepared draft does not match the review target.");
231
- const contentRepo = new ContentRepository(db);
232
- const entry = projected ? projected.item : await contentRepo.findByIdOrSlug(input.collection, input.id);
233
- const snapshot = projected ? {
234
- item: projected.item,
235
- check: sql`true`
236
- } : entry ? await contentRepo.snapshot(input.collection, entry.id) : null;
237
- if (!snapshot) throw new ReviewSubmissionError("The submitted content could not be read.");
238
- const revisionIds = projected ? [] : [snapshot.item.liveRevisionId, snapshot.item.draftRevisionId].filter((id) => id !== null);
239
- const revisions = revisionIds.length ? await db.selectFrom("revisions").selectAll().where("id", "in", revisionIds).execute() : [];
240
- const built = await new ReviewPayloadBuilder(projected ? {
241
- handleContentGet: async () => ({
242
- success: true,
243
- data: {
244
- item: projected.item,
245
- _rev: encodeRev(projected.item)
246
- }
247
- }),
248
- handleContentCompare: async () => ({
249
- success: true,
250
- data: {
251
- live: projected.live,
252
- draft: projected.draft,
253
- hasChanges: projected.item.draftRevisionId !== null && projected.item.draftRevisionId !== projected.item.liveRevisionId
254
- }
255
- })
256
- } : handlers).buildContentReviewPayload(input);
257
- if (input.expectedRev !== void 0 && input.expectedRev !== built.reviewedRev) throw new ReviewSubmissionError("Reload the latest draft before submitting it.", "REVIEW_REVISION_CHANGED");
258
- const contentHash = await buildStableHash(reviewDraft(built));
259
- const targetKey = await buildStableHash({
260
- collection: built.collection,
261
- id: built.entryId,
262
- actionHash: built.actionHash
263
- });
264
- if (built.reviewedRev !== encodeRev(snapshot.item) || built.draftRevisionId !== snapshot.item.draftRevisionId || built.liveRevisionId !== snapshot.item.liveRevisionId) throw new ReviewSubmissionError("The submitted content changed. Review the latest draft.");
265
- const scheduledAt = snapshot.item.scheduledAt;
266
- const checks = [...options.draft?.batch.checks ?? [snapshot.check], ...revisions.map((revision) => rowUnchanged("revisions", revision))];
267
- const projectedGuard = [];
268
- if (projected) {
269
- const future = sql`${rowUnchanged(`ec_${input.collection}`, {
270
- id: projected.item.id,
271
- version: projected.item.version,
272
- updated_at: projected.item.updatedAt,
273
- live_revision_id: projected.item.liveRevisionId,
274
- draft_revision_id: projected.item.draftRevisionId,
275
- status: projected.item.status,
276
- scheduled_at: projected.item.scheduledAt
277
- })} AND ${projected.item.draftRevisionId && projected.draft ? sql`EXISTS(SELECT 1 FROM revisions WHERE id=${projected.item.draftRevisionId} AND collection=${input.collection} AND entry_id=${input.id} AND json(data)=json(${JSON.stringify(projected.draft)}))` : sql`true`}`;
278
- projectedGuard.push(...prepareAtomicChecks(db, [future]));
279
- }
280
- const reviews = new ReviewRequestRepository(db);
281
- const prepareSupersession = async () => {
282
- const statements = [];
283
- if (!input.supersedePending) return {
284
- checks: [],
285
- statements
286
- };
287
- const query = db.selectFrom("_dineway_review_requests").where("collection", "=", built.collection).where("entry_id", "=", built.entryId).where("action_type", "=", built.actionType).where("requested_by_actor_type", "=", input.actor.actorType).where("requested_by_actor_id", "=", input.actor.actorId).where("status", "=", "pending").where("revoked_at", "is", null).where((eb) => eb.or([eb("reviewed_rev", "!=", built.reviewedRev), eb("action_hash", "!=", built.actionHash)]));
288
- const previous = await query.select("id").execute();
289
- const supersessionChecks = [sql`${query.select((eb) => eb.fn.countAll().as("count"))} = ${previous.length}`];
290
- for (const prior of previous) {
291
- const batch = await reviews.prepareResolve(prior.id, {
292
- decision: "rejected",
293
- resolvedByActorType: "system",
294
- resolvedByActorId: REVIEW_SUPERSESSION_ACTOR,
295
- reviewNote: "Superseded by a newer submission. This is not an editorial rejection."
296
- });
297
- if (!batch) throw new AtomicWriteConflict();
298
- supersessionChecks.push(...batch.checks ?? []);
299
- statements.push(...batch.statements);
300
- }
301
- return {
302
- checks: supersessionChecks,
303
- statements
304
- };
305
- };
306
- const reuseReview = async (item) => {
307
- const batch = await prepareSupersession();
308
- return {
309
- id: item.id,
310
- targetKey,
311
- created: false,
312
- batch: {
313
- checks: [
314
- ...checks,
315
- rowUnchanged("_dineway_review_requests", {
316
- id: item.id,
317
- status: item.status,
318
- revoked_at: item.revokedAt ?? null
319
- }),
320
- ...batch.checks
321
- ],
322
- statements: [...projectedGuard, ...batch.statements]
323
- }
324
- };
325
- };
326
- const findExisting = async () => {
327
- const existing = await db.selectFrom("_dineway_review_jobs").select("review_id").where("target_key", "=", targetKey).executeTakeFirst();
328
- if (existing) {
329
- const item = await reviews.findById(existing.review_id);
330
- if (!item || item.status === "rejected" || item.revokedAt) throw new ReviewSubmissionError("Edit the content before submitting a rejected or revoked target again.");
331
- return item;
332
- }
333
- return null;
334
- };
335
- const existingReview = await findExisting();
336
- if (existingReview) return reuseReview(existingReview);
337
- const rejected = await db.selectFrom("_dineway_review_requests").select([
338
- "id",
339
- "status",
340
- "review_payload",
341
- "resolved_by_actor_type",
342
- "resolved_by_actor_id"
343
- ]).where("collection", "=", built.collection).where("entry_id", "=", built.entryId).where("status", "=", "rejected").execute();
344
- checks.push(sql`NOT EXISTS (SELECT 1 FROM _dineway_review_jobs WHERE target_key = ${targetKey})`, sql`(SELECT COUNT(*) FROM _dineway_review_requests WHERE collection = ${built.collection} AND entry_id = ${built.entryId} AND status = 'rejected') = ${rejected.length}`, ...rejected.map((row) => rowUnchanged("_dineway_review_requests", row)));
345
- for (const row of rejected) {
346
- if (isSupersededReview(row)) continue;
347
- if (await buildStableHash(z.object({ diff: z.object({ draft: z.unknown().optional() }).optional() }).parse(JSON.parse(row.review_payload)).diff?.draft) === contentHash) throw new ReviewSubmissionError("This content was rejected. Change it before submitting a new review.");
348
- }
349
- const approved = await reviews.findApprovedForTarget(built);
350
- if (approved) return reuseReview(approved);
351
- const pendingQuery = db.selectFrom("_dineway_review_requests").where("collection", "=", built.collection).where("entry_id", "=", built.entryId).where("action_type", "=", built.actionType).where("reviewed_rev", "=", built.reviewedRev).where("action_hash", "=", built.actionHash).where("status", "=", "pending").where("revoked_at", "is", null);
352
- const pending = await pendingQuery.selectAll().orderBy("created_at").orderBy("id").executeTakeFirst();
353
- checks.push(pending ? rowUnchanged("_dineway_review_requests", pending) : sql`NOT EXISTS ${pendingQuery.select("id")}`);
354
- const prepared = pending ? null : reviews.prepareCreate({
355
- ...built,
356
- riskReason: input.riskReason,
357
- requestedByActorType: input.actor.actorType,
358
- requestedByActorId: input.actor.actorId,
359
- requestedAuthMetadata: input.actor.authMetadata
360
- });
361
- const reviewId = pending?.id ?? prepared.id;
362
- const supersession = await prepareSupersession();
363
- checks.push(...supersession.checks);
364
- const now = (/* @__PURE__ */ new Date()).toISOString();
365
- const job = db.insertInto("_dineway_review_jobs").values({
366
- review_id: reviewId,
367
- target_key: targetKey,
368
- content_hash: contentHash,
369
- state: "queued",
370
- release_state: "none",
371
- evidence_json: null,
372
- reason: "Automated review in progress",
373
- release_reason: null,
374
- scheduled_at: scheduledAt,
375
- created_at: now,
376
- updated_at: now
377
- }).compile();
378
- return {
379
- id: reviewId,
380
- targetKey,
381
- created: !pending,
382
- batch: {
383
- checks,
384
- statements: [
385
- ...projectedGuard,
386
- ...supersession.statements,
387
- ...prepared ? [prepared.statement] : [],
388
- job
389
- ]
390
- }
391
- };
392
- }
393
- async function submitAutomatedReview(db, handlers, input) {
394
- let prepared = await prepareAutomatedReview(db, handlers, input);
395
- try {
396
- await atomicBatch(db, prepared.batch);
397
- } catch (error) {
398
- if (!(error instanceof AtomicWriteConflict)) throw error;
399
- const existing = await prepareAutomatedReview(db, handlers, input);
400
- if (existing.created || existing.targetKey !== prepared.targetKey) throw error;
401
- await atomicBatch(db, existing.batch);
402
- prepared = existing;
403
- }
404
- return {
405
- item: await new ReviewRequestRepository(db).findById(prepared.id),
406
- created: prepared.created
407
- };
408
- }
409
-
410
- //#endregion
411
- export { prepareContentWrite as i, prepareAutomatedReview as n, submitAutomatedReview as r, ReviewSubmissionError as t };