dineway 0.2.40 → 0.2.42

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-B4zstd2d.mjs → allowed-origins-DASdFW-l.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-CQishNjZ.mjs → api-BBXfpMJw.mjs} +41 -13
  9. package/dist/{api-tokens-CNHnKO57.mjs → api-tokens-ciHNTdN2.mjs} +1 -1
  10. package/dist/{apply-D4rZHDyg.mjs → apply-CZDKUvZ4.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-BShyAm_Z.mjs} +1 -1
  228. package/dist/{briefing-COw-WcYz.mjs → briefing-CaeEFvkD.mjs} +995 -7
  229. package/dist/{bundle-bhiszAui.mjs → bundle-DWn5eFKz.mjs} +2 -2
  230. package/dist/{byline-fields-D-b9CWux.d.mts → byline-fields-B7pQ3LMi.d.mts} +14 -10
  231. package/dist/{byline-fields-BKj5f3Ub.mjs → byline-fields-DRMCc0V_.mjs} +1 -1
  232. package/dist/{byline-fields-DZ46DF10.mjs → byline-fields-wWu2Cb3l.mjs} +3 -3
  233. package/dist/{byline-registry-CJihchD1.mjs → byline-registry-Caj0_gbU.mjs} +1 -1
  234. package/dist/{byline-TYk2kad6.mjs → byline-uuVB2B3E.mjs} +65 -14
  235. package/dist/{bylines-6T9iVC9j.mjs → bylines-PLlsL31L.mjs} +3 -3
  236. package/dist/{bylines-CvTSCAw9.mjs → bylines-XGlNK0Lo.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 +486 -48
  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-BNeuaVCS.mjs} +302 -45
  251. package/dist/content-Dr22fzA_.mjs +390 -0
  252. package/dist/{content-refresh-BilzqcLt.mjs → content-refresh-D7wpVFJ_.mjs} +14 -8
  253. package/dist/content-storage/index.d.mts +193 -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-43KZZ7dz.mjs} +838 -131
  258. package/dist/{context-DAs_MZjJ.mjs → context-Cjz0y4Al.mjs} +292 -23
  259. package/dist/{context-DVTvucNb.mjs → context-DuYXPlfZ.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-BquGX1ue.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-BwCZFUXm.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-1Gr8TlTf.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-Bdab4DhO.mjs} +2 -2
  280. package/dist/{hitl-route-helpers-sdnjpx2k.mjs → hitl-route-helpers-DGMLQajA.mjs} +5 -5
  281. package/dist/hook-events-BQw73jc7.d.mts +32 -0
  282. package/dist/{import-C2-v4FCs.mjs → import-DJFlvQey.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-wRF85RXo.d.mts → jsonld-CPijKSUe.d.mts} +2 -2
  288. package/dist/{load-DvCVppOF.mjs → load-CiRTddkJ.mjs} +1 -1
  289. package/dist/{loader-Dp6zLmQm.mjs → loader-Bq1aW12P.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-DtTnFcqC.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-w5xwT-f5.mjs → menus-BXkfzNR1.mjs} +7 -7
  300. package/dist/{menus-CyNpBQrX.mjs → menus-CbBi7Ad7.mjs} +2 -2
  301. package/dist/migration-D9OY6vI9.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-C99DzQuq.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-LtyuDuIb.mjs} +16 -962
  315. package/dist/{policy-D2USlibj.mjs → policy-Drg5yr1-.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-CG5YbNqB.d.mts → public-url-cMnsBUZB.d.mts} +1 -1
  320. package/dist/{publication-authorization-B_HJSnzR.mjs → publication-authorization-CJ4Jr5Hg.mjs} +43 -17
  321. package/dist/{query-xspvw7Ui.mjs → query-CLWTwcTr.mjs} +14 -14
  322. package/dist/{query-DLeahg3x.mjs → query-CP9M8xxX.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-B-HULaJI.mjs} +7 -7
  328. package/dist/{release-Da2UFygt.mjs → release-D615eKav.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-CGQ1u7uY.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-DlxUfOD5.mjs} +42 -7
  336. package/dist/revisions-qNkae-Dq.mjs +57 -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-DVeOJpqA.mjs +8 -0
  346. package/dist/{search-BI9uKr7U.mjs → search-zMoM2_uq.mjs} +4 -98
  347. package/dist/{secrets-D_pergcD.mjs → secrets-CIYcw9T9.mjs} +4 -4
  348. package/dist/{sections-BqqYq9RW.mjs → sections-BtO0Zdv5.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-B-5PsaJO.mjs → seo-DwcULb78.mjs} +1 -1
  354. package/dist/{seo-Bs_DUxJf.mjs → seo-uliFa7s-.mjs} +44 -5
  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-CyJ2-MKx.mjs → settings-D31Y4msD.mjs} +2 -2
  358. package/dist/{settings-DsBzKeUQ.mjs → settings-DDOB3gW1.mjs} +7 -7
  359. package/dist/{setup-complete-t9yamqBb.mjs → setup-complete-5GxB7hiF.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-D3AmDdpQ.mjs} +15 -15
  362. package/dist/{site-url-Tw6CfBB2.mjs → site-url-CYatfe3q.mjs} +1 -1
  363. package/dist/{state-jx6Yiwsm.mjs → state-ClG1I4wl.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-DgLES24O.mjs +205 -0
  370. package/dist/{taxonomies-BFsUR7kc.mjs → taxonomies-B4hE8Yb3.mjs} +3 -3
  371. package/dist/{taxonomies-lWGNLKgn.mjs → taxonomies-BI26Bk-M.mjs} +7 -7
  372. package/dist/{taxonomy-DN6i1upz.mjs → taxonomy-B8w8F2Cs.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-D5JfvPvx.d.mts → types-0gRlZbhN.d.mts} +88 -32
  378. package/dist/{types-RFzE_V1M.mjs → types-BI3ULB3A.mjs} +2 -2
  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-Co258u70.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-B99mnftw.mjs} +3 -3
  392. package/dist/{wordpress-slugs-ROzITIBK.mjs → wordpress-slugs-yaeD7cxn.mjs} +1 -1
  393. package/dist/{worker-CKU70ODm.mjs → worker-DdI-KtvF.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-CISd4wX_.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-DFGsDtCj.mjs → challenge-store-Dq5HiMO3.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-7N-3srH-.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-BJwb_MgK.mjs → mode-B_m1BGFh.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-B1GiXeT8.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-BE7nszX6.d.mts → portable-text-HNmwL-7L.d.mts} +0 -0
  428. /package/dist/{portable-text-tQhvPLf1.mjs → portable-text-p0Ojfpfo.mjs} +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-B8yYh0g5.mjs → session-user-B0XMp1GC.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-BK_me2MZ.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-BkmPhclj.mjs → workers-build-XNBt1wGF.mjs} +0 -0
@@ -1,10 +1,10 @@
1
- import { c as __exportAll } from "./runner-CRU7BXjr.mjs";
1
+ import { c as __exportAll } from "./runner-CuG8o1uW.mjs";
2
2
  import { getRequestContext } from "./request-context.mjs";
3
- import { a as resetTaxonomyNamesCache, o as isMissingTableError, r as getDb } from "./loader-Dp6zLmQm.mjs";
4
- import { d as invalidateTaxonomyObjectCache, f as isObjectCacheActive, n as cachedQuery, t as CacheNamespace } from "./object-cache-mxCW-Rpt.mjs";
5
- import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-C8vSD_5L.mjs";
6
- import { i as setRequestCacheEntry, n as peekRequestCache, r as requestCached } from "./request-cache-8_ifFzVw.mjs";
7
- import { n as resolveLocaleChain, t as resolveLocale } from "./resolve-DEKC4qVa.mjs";
3
+ import { a as resetTaxonomyNamesCache, o as isMissingTableError, r as getDb } from "./loader-Bq1aW12P.mjs";
4
+ import { i as setRequestCacheEntry, n as peekRequestCache, r as requestCached } from "./request-cache-CizvDoxV.mjs";
5
+ import { d as invalidateTaxonomyObjectCache, f as isObjectCacheActive, n as cachedQuery, t as CacheNamespace } from "./object-cache-DyI1SOBK.mjs";
6
+ import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-Bb56aCtB.mjs";
7
+ import { n as resolveLocaleChain, t as resolveLocale } from "./resolve-BxFGSKYu.mjs";
8
8
 
9
9
  //#region src/taxonomies/index.ts
10
10
  /**
@@ -393,7 +393,7 @@ function primeFoldedEntryTerms(collection, perEntry, options = {}) {
393
393
  * Get entries by term.
394
394
  */
395
395
  async function getEntriesByTerm(collection, taxonomyName, termSlug, options = {}) {
396
- const { getDinewayCollection } = await import("./query-xspvw7Ui.mjs").then((n) => n.o);
396
+ const { getDinewayCollection } = await import("./query-CLWTwcTr.mjs").then((n) => n.o);
397
397
  const queryOptions = { where: { [taxonomyName]: termSlug } };
398
398
  if (options.locale !== void 0) queryOptions.locale = options.locale;
399
399
  const { entries } = await getDinewayCollection(collection, queryOptions);
@@ -1,5 +1,9 @@
1
- import { c as __exportAll } from "./runner-CRU7BXjr.mjs";
2
- import { d as invalidateTaxonomyObjectCache } from "./object-cache-mxCW-Rpt.mjs";
1
+ import { c as __exportAll } from "./runner-CuG8o1uW.mjs";
2
+ import { atomicBatch } from "./database/batch.mjs";
3
+ import { r as getContentStorage } from "./runtime-Ch5G-tnG.mjs";
4
+ import { d as invalidateTaxonomyObjectCache } from "./object-cache-DyI1SOBK.mjs";
5
+ import { r as snapshotContentTermChanges } from "./terms-EskuqbKE.mjs";
6
+ import { sql } from "kysely";
3
7
  import { ulid } from "ulidx";
4
8
 
5
9
  //#region src/database/repositories/taxonomy.ts
@@ -120,9 +124,30 @@ var TaxonomyRepository = class {
120
124
  if (deleted) invalidateTaxonomyObjectCache();
121
125
  return deleted;
122
126
  }
127
+ async writeRoutedTerms(collection, entryId, terms, checks = []) {
128
+ const { prepareContentWrite } = await import("./content-write-43KZZ7dz.mjs").then((n) => n.t);
129
+ const prepared = await prepareContentWrite(this.db, collection, {
130
+ id: entryId,
131
+ terms,
132
+ stageDraft: false
133
+ });
134
+ await atomicBatch(this.db, {
135
+ checks: [...prepared.batch.checks ?? [], ...checks],
136
+ statements: prepared.batch.statements
137
+ });
138
+ prepared.afterCommit();
139
+ invalidateTaxonomyObjectCache();
140
+ }
123
141
  async attachToEntry(collection, entryId, taxonomyId) {
124
142
  const group = await this.resolveTranslationGroup(taxonomyId);
125
143
  if (!group) return;
144
+ if (getContentStorage(this.db, collection)) {
145
+ const source = await snapshotContentTermChanges(this.db, collection, entryId);
146
+ const term = (await this.findTranslations(group))[0];
147
+ if (!term || source.changes[term.name]?.includes(group)) return;
148
+ await this.writeRoutedTerms(collection, entryId, { [term.name]: [...source.changes[term.name] ?? [], group] }, source.checks);
149
+ return;
150
+ }
126
151
  const row = {
127
152
  collection,
128
153
  entry_id: entryId,
@@ -134,6 +159,13 @@ var TaxonomyRepository = class {
134
159
  async detachFromEntry(collection, entryId, taxonomyId) {
135
160
  const group = await this.resolveTranslationGroup(taxonomyId);
136
161
  if (!group) return;
162
+ if (getContentStorage(this.db, collection)) {
163
+ const source = await snapshotContentTermChanges(this.db, collection, entryId);
164
+ const term = (await this.findTranslations(group))[0];
165
+ if (!term || !source.changes[term.name]?.includes(group)) return;
166
+ await this.writeRoutedTerms(collection, entryId, { [term.name]: source.changes[term.name].filter((id) => id !== group) }, source.checks);
167
+ return;
168
+ }
137
169
  await this.db.deleteFrom("content_taxonomies").where("collection", "=", collection).where("entry_id", "=", entryId).where("taxonomy_id", "=", group).execute();
138
170
  invalidateTaxonomyObjectCache();
139
171
  }
@@ -153,6 +185,10 @@ var TaxonomyRepository = class {
153
185
  * Term ids OR translation_groups are accepted and normalised to groups.
154
186
  */
155
187
  async setTermsForEntry(collection, entryId, taxonomyName, termIds) {
188
+ if (getContentStorage(this.db, collection)) {
189
+ await this.writeRoutedTerms(collection, entryId, { [taxonomyName]: termIds });
190
+ return;
191
+ }
156
192
  const groups = [];
157
193
  for (const id of termIds) {
158
194
  const group = await this.resolveTranslationGroup(id);
@@ -172,6 +208,12 @@ var TaxonomyRepository = class {
172
208
  if (toRemove.length > 0 || toAdd.length > 0) invalidateTaxonomyObjectCache();
173
209
  }
174
210
  async clearEntryTerms(collection, entryId) {
211
+ if (getContentStorage(this.db, collection) && (await sql`SELECT id FROM ${sql.table(`ec_${collection}`)} WHERE id=${entryId}`.execute(this.db)).rows.length) {
212
+ const source = await snapshotContentTermChanges(this.db, collection, entryId);
213
+ const count = Object.values(source.changes).reduce((sum, ids) => sum + ids.length, 0);
214
+ if (count) await this.writeRoutedTerms(collection, entryId, Object.fromEntries(Object.keys(source.changes).map((name) => [name, []])), source.checks);
215
+ return count;
216
+ }
175
217
  const result = await this.db.deleteFrom("content_taxonomies").where("collection", "=", collection).where("entry_id", "=", entryId).executeTakeFirst();
176
218
  const removed = Number(result.numDeletedRows ?? 0);
177
219
  if (removed > 0) invalidateTaxonomyObjectCache();
@@ -183,6 +225,14 @@ var TaxonomyRepository = class {
183
225
  * source's term assignments. Safe to call when the source has no terms.
184
226
  */
185
227
  async copyEntryTerms(collection, sourceEntryId, targetEntryId) {
228
+ if (getContentStorage(this.db, collection)) {
229
+ const source = await snapshotContentTermChanges(this.db, collection, sourceEntryId);
230
+ const target = await snapshotContentTermChanges(this.db, collection, targetEntryId);
231
+ const changed = Object.entries(source.changes).filter(([name, ids]) => ids.some((id) => !target.changes[name]?.includes(id)));
232
+ if (!changed.length) return;
233
+ await this.writeRoutedTerms(collection, targetEntryId, Object.fromEntries(changed.map(([name, ids]) => [name, [...new Set([...target.changes[name] ?? [], ...ids])]])), [...source.checks, ...target.checks]);
234
+ return;
235
+ }
186
236
  const rows = await this.db.selectFrom("content_taxonomies").select(["taxonomy_id"]).where("collection", "=", collection).where("entry_id", "=", sourceEntryId).execute();
187
237
  if (rows.length === 0) return;
188
238
  await this.db.insertInto("content_taxonomies").values(rows.map((r) => ({
@@ -226,7 +276,7 @@ var TaxonomyRepository = class {
226
276
  */
227
277
  async countEntriesForTerms(translationGroups) {
228
278
  if (translationGroups.length === 0) return /* @__PURE__ */ new Map();
229
- const { chunks, SQL_BATCH_SIZE } = await import("./chunks-C8vSD_5L.mjs").then((n) => n.r);
279
+ const { chunks, SQL_BATCH_SIZE } = await import("./chunks-Bb56aCtB.mjs").then((n) => n.r);
230
280
  const counts = /* @__PURE__ */ new Map();
231
281
  for (const chunk of chunks(translationGroups, SQL_BATCH_SIZE)) {
232
282
  const rows = await this.db.selectFrom("content_taxonomies").select(["taxonomy_id", (eb) => eb.fn.count("entry_id").as("count")]).where("taxonomy_id", "in", chunk).groupBy("taxonomy_id").execute();
@@ -0,0 +1,104 @@
1
+ import { rowUnchanged } from "./database/batch.mjs";
2
+ import { t as DinewayValidationError } from "./types-BI3ULB3A.mjs";
3
+ import { sql } from "kysely";
4
+ import { z } from "zod";
5
+
6
+ //#region src/content-storage/terms.ts
7
+ const contentTermChangesSchema = z.record(z.string().regex(/^[a-z][a-z0-9_]{0,62}$/), z.array(z.string().min(1).max(128)).max(100));
8
+ async function snapshotContentTermChanges(db, collection, entryId) {
9
+ const rows = await db.selectFrom("content_taxonomies").selectAll().where("collection", "=", collection).where("entry_id", "=", entryId).execute();
10
+ const checks = [...rows.map((row) => rowUnchanged("content_taxonomies", row)), sql`(SELECT COUNT(*) FROM content_taxonomies WHERE collection = ${collection} AND entry_id = ${entryId}) = ${rows.length}`];
11
+ const changes = {};
12
+ for (const row of rows) {
13
+ const term = await db.selectFrom("taxonomies").selectAll().where("translation_group", "=", row.taxonomy_id).orderBy("locale").executeTakeFirst();
14
+ if (!term) throw new DinewayValidationError("An assigned term is missing.");
15
+ checks.push(rowUnchanged("taxonomies", term));
16
+ (changes[term.name] ??= []).push(row.taxonomy_id);
17
+ }
18
+ return {
19
+ changes,
20
+ checks
21
+ };
22
+ }
23
+ /** Prepare assignments together with content, so partition resolution sees the submitted terms. */
24
+ async function prepareContentTerms(db, collection, entryId, input, locale) {
25
+ const changes = contentTermChangesSchema.parse(input);
26
+ const checks = [];
27
+ const statements = [];
28
+ const replaced = [];
29
+ const assignments = [];
30
+ for (const [name, ids] of Object.entries(changes)) {
31
+ const definitions = await db.selectFrom("_dineway_taxonomy_defs").selectAll().where("name", "=", name).execute();
32
+ if (!definitions.some((definition) => definition.collections === null || z.array(z.string()).parse(JSON.parse(definition.collections)).includes(collection))) throw new DinewayValidationError(`Taxonomy ${name} is not assigned to ${collection}.`);
33
+ checks.push(...definitions.map((definition) => rowUnchanged("_dineway_taxonomy_defs", definition)));
34
+ const groups = /* @__PURE__ */ new Set();
35
+ for (const id of new Set(ids)) {
36
+ const rows = await db.selectFrom("taxonomies").selectAll().where("name", "=", name).where((eb) => eb.or([eb("id", "=", id), eb("translation_group", "=", id)])).execute();
37
+ const term = rows.find((row) => row.locale === locale) ?? rows.find((row) => row.id === id);
38
+ if (!term?.translation_group) throw new DinewayValidationError(`Term ${id} is unavailable in taxonomy ${name}.`);
39
+ checks.push(rowUnchanged("taxonomies", term));
40
+ groups.add(term.translation_group);
41
+ }
42
+ const current = await db.selectFrom("content_taxonomies").selectAll().where("collection", "=", collection).where("entry_id", "=", entryId).where("taxonomy_id", "in", db.selectFrom("taxonomies").select("translation_group").where("name", "=", name)).execute();
43
+ replaced.push(...current.map((row) => row.taxonomy_id));
44
+ assignments.push(...groups);
45
+ checks.push(...current.map((row) => rowUnchanged("content_taxonomies", row)), sql`(SELECT COUNT(*) FROM content_taxonomies WHERE collection = ${collection} AND entry_id = ${entryId} AND taxonomy_id IN (SELECT translation_group FROM taxonomies WHERE name = ${name})) = ${current.length}`);
46
+ statements.push(db.deleteFrom("content_taxonomies").where("collection", "=", collection).where("entry_id", "=", entryId).where("taxonomy_id", "in", db.selectFrom("taxonomies").select("translation_group").where("name", "=", name)).compile());
47
+ for (const group of groups) statements.push(db.insertInto("content_taxonomies").values({
48
+ collection,
49
+ entry_id: entryId,
50
+ taxonomy_id: group
51
+ }).onConflict((oc) => oc.doNothing()).compile());
52
+ }
53
+ return {
54
+ checks,
55
+ statements,
56
+ replaced,
57
+ assignments
58
+ };
59
+ }
60
+ async function snapshotPartitionTerms(db, collection, entryId, name, locale, selected) {
61
+ const checks = [];
62
+ const assignments = await db.selectFrom("content_taxonomies").selectAll().where("collection", "=", collection).where("entry_id", "=", entryId).execute();
63
+ checks.push(...assignments.map((row) => rowUnchanged("content_taxonomies", row)), sql`(SELECT COUNT(*) FROM content_taxonomies WHERE collection = ${collection} AND entry_id = ${entryId}) = ${assignments.length}`);
64
+ const ids = selected ?? assignments.map((row) => row.taxonomy_id);
65
+ const terms = [];
66
+ const seen = /* @__PURE__ */ new Set();
67
+ const ancestors = /* @__PURE__ */ new Set();
68
+ const visit = async (id, isSelected) => {
69
+ const rows = await db.selectFrom("taxonomies").selectAll().where("name", "=", name).where((eb) => eb.or([eb("id", "=", id), eb("translation_group", "=", id)])).execute();
70
+ const term = rows.find((row) => row.locale === locale) ?? rows.find((row) => row.id === id) ?? rows.toSorted((a, b) => a.locale.localeCompare(b.locale))[0];
71
+ if (!term?.translation_group) {
72
+ if (selected) throw new DinewayValidationError(`Partition term ${id} is missing from ${name}.`);
73
+ return;
74
+ }
75
+ if (ancestors.has(term.id)) throw new DinewayValidationError("Partition taxonomy contains a parent cycle.");
76
+ if (seen.has(term.id)) {
77
+ if (isSelected) terms.find((value) => value.id === term.id).selected = true;
78
+ return;
79
+ }
80
+ if (seen.size >= 100) throw new DinewayValidationError("Partition taxonomy exceeds 100 terms and ancestors.");
81
+ seen.add(term.id);
82
+ checks.push(rowUnchanged("taxonomies", term));
83
+ terms.push({
84
+ id: term.id,
85
+ group: term.translation_group,
86
+ name: term.name,
87
+ slug: term.slug,
88
+ parentId: term.parent_id,
89
+ selected: isSelected,
90
+ data: term.data ? z.record(z.string(), z.json()).parse(JSON.parse(term.data)) : null
91
+ });
92
+ ancestors.add(term.id);
93
+ if (term.parent_id) await visit(term.parent_id, false);
94
+ ancestors.delete(term.id);
95
+ };
96
+ for (const id of [...ids].toSorted()) await visit(id, true);
97
+ return {
98
+ terms,
99
+ checks
100
+ };
101
+ }
102
+
103
+ //#endregion
104
+ export { snapshotPartitionTerms as i, prepareContentTerms as n, snapshotContentTermChanges as r, contentTermChangesSchema as t };
@@ -0,0 +1,96 @@
1
+ import { toPlainText } from "@portabletext/toolkit";
2
+
3
+ //#region src/search/text-extraction.ts
4
+ /**
5
+ * Text Extraction
6
+ *
7
+ * Extracts plain text from Portable Text blocks for FTS indexing.
8
+ * Uses @portabletext/toolkit as base with extensions for custom block types.
9
+ */
10
+ /**
11
+ * Validate that a value looks like a Portable Text block array.
12
+ * Each element must have at least a `_type` string property.
13
+ */
14
+ function isPortableTextArray(value) {
15
+ return value.every((item) => typeof item === "object" && item !== null && "_type" in item && typeof item._type === "string");
16
+ }
17
+ /**
18
+ * Extract additional text from custom block types that toPlainText doesn't handle
19
+ */
20
+ function extractCustomBlockText(block) {
21
+ if (block._type === "code" && "code" in block && typeof block.code === "string") return block.code;
22
+ if (block._type === "image") {
23
+ const parts = [];
24
+ if ("alt" in block && typeof block.alt === "string" && block.alt) parts.push(block.alt);
25
+ if ("caption" in block && typeof block.caption === "string" && block.caption) parts.push(block.caption);
26
+ return parts.join(" ");
27
+ }
28
+ return "";
29
+ }
30
+ /**
31
+ * Extract plain text from Portable Text blocks
32
+ *
33
+ * Uses @portabletext/toolkit's toPlainText for standard blocks,
34
+ * plus extracts text from custom block types (code, images with alt/caption).
35
+ *
36
+ * @param blocks - Array of Portable Text blocks (or a JSON string)
37
+ * @returns Plain text content
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const text = extractPlainText([
42
+ * {
43
+ * _type: "block",
44
+ * _key: "abc",
45
+ * children: [{ _type: "span", _key: "s1", text: "Hello World" }]
46
+ * }
47
+ * ]);
48
+ * // Returns: "Hello World"
49
+ * ```
50
+ */
51
+ function extractPlainText(blocks) {
52
+ if (!blocks) return "";
53
+ let parsedBlocks;
54
+ if (typeof blocks === "string") try {
55
+ parsedBlocks = JSON.parse(blocks);
56
+ } catch {
57
+ return blocks;
58
+ }
59
+ else parsedBlocks = blocks;
60
+ if (!Array.isArray(parsedBlocks)) return "";
61
+ return [toPlainText(parsedBlocks.map((b) => {
62
+ const obj = { _type: b._type };
63
+ for (const [key, val] of Object.entries(b)) obj[key] = val;
64
+ return obj;
65
+ })), ...parsedBlocks.map(extractCustomBlockText).filter((text) => text.length > 0)].filter((t) => t.length > 0).join("\n");
66
+ }
67
+ /**
68
+ * Extract searchable text from a content entry
69
+ *
70
+ * Extracts text from specified fields, handling both plain text and Portable Text.
71
+ *
72
+ * @param entry - Content entry data
73
+ * @param fields - Field names to extract text from
74
+ * @returns Object mapping field names to extracted text
75
+ */
76
+ function extractSearchableFields(entry, fields) {
77
+ const result = {};
78
+ for (const field of fields) {
79
+ const value = entry[field];
80
+ if (value === null || value === void 0) {
81
+ result[field] = "";
82
+ continue;
83
+ }
84
+ if (typeof value === "string") if (value.startsWith("[")) result[field] = extractPlainText(value);
85
+ else result[field] = value;
86
+ else if (Array.isArray(value)) if (isPortableTextArray(value)) result[field] = extractPlainText(value);
87
+ else result[field] = JSON.stringify(value);
88
+ else if (typeof value === "object") result[field] = JSON.stringify(value);
89
+ else if (typeof value === "number" || typeof value === "boolean") result[field] = `${value}`;
90
+ else result[field] = "";
91
+ }
92
+ return result;
93
+ }
94
+
95
+ //#endregion
96
+ export { extractSearchableFields as n, extractPlainText as t };
@@ -1,4 +1,4 @@
1
- import { i as encodeBase64url, n as decodeBase64url } from "./base64-Cz-aU0X1.mjs";
1
+ import { i as encodeBase64url, n as decodeBase64url } from "./base64-qvSs0Gxy.mjs";
2
2
 
3
3
  //#region src/preview/tokens.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { t as readRuntimeEnv } from "./runtime-env-CPTzh0mZ.mjs";
1
+ import { t as readRuntimeEnv } from "./runtime-env-DpYGy4pT.mjs";
2
2
 
3
3
  //#region src/auth/trusted-proxy.ts
4
4
  /**
@@ -1,21 +1,24 @@
1
- import { _ as UpdateCollectionInput, d as FieldType, f as FieldValidation, i as CollectionWithFields, o as CreateCollectionInput, s as CreateFieldInput, t as Collection, u as Field, v as UpdateFieldInput } from "./types-SlLXjRpg.mjs";
2
- import { f as UpdateContentInput, i as ContentItem$1, l as FindManyOptions, o as ContentSeoInput, r as ContentDateField, s as CreateContentInput, t as BylineSummary, u as FindManyResult } from "./types-CgcOeaiQ.mjs";
3
- import { Ot as ReviewJobTable, t as Database } from "./types-B--VyN3n.mjs";
4
- import { _ as MediaValue, f as MediaProvider, m as MediaProviderDescriptor, p as MediaProviderCapabilities } from "./placeholder-DJLP_HY7.mjs";
1
+ import { _ as UpdateCollectionInput, d as FieldType, f as FieldValidation, i as CollectionWithFields, o as CreateCollectionInput, s as CreateFieldInput, t as Collection, u as Field, v as UpdateFieldInput } from "./types-I5LHzk_M.mjs";
2
+ import { f as UpdateContentInput, i as ContentItem$1, l as FindManyOptions, o as ContentSeoInput, r as ContentDateField, s as CreateContentInput, t as BylineSummary, u as FindManyResult } from "./types-ex-UrNlz.mjs";
3
+ import { kt as ReviewJobTable, n as Database } from "./types-Dpv_MvwZ.mjs";
4
+ import { _ as MediaValue, f as MediaProvider, m as MediaProviderDescriptor, p as MediaProviderCapabilities } from "./placeholder-DdZV3I8x.mjs";
5
5
  import { AtomicBatch } from "./database/batch.mjs";
6
- import { D as ContentBylineInput } from "./index-BVGe04wF.mjs";
7
- import { r as AuthProviderDescriptor, t as AuthDescriptor } from "./types-B03h5jt_.mjs";
8
- import { t as DatabaseDescriptor } from "./adapters-C8nRpUuj.mjs";
9
- import { r as ObjectCacheDescriptor } from "./types-CtGSEKEJ.mjs";
6
+ import { D as ContentBylineInput } from "./index-CLj17kW9.mjs";
7
+ import { s as ContentStorageConfig } from "./types-qOEot0UQ.mjs";
8
+ import { r as AuthProviderDescriptor, t as AuthDescriptor } from "./types-DheoByey.mjs";
9
+ import { t as DatabaseDescriptor } from "./adapters-lDnJjNDz.mjs";
10
+ import { r as ObjectCacheDescriptor } from "./types-PxxPTFSl.mjs";
11
+ import { t as ContentStorageRuntime } from "./runtime-Bs2JMbb2.mjs";
12
+ import { n as ContentStorageHookName, r as ContentStorageHookTarget, t as ContentStorageHookEvent } from "./hook-events-BQw73jc7.mjs";
10
13
  import { ServerTimingMetric } from "./database/instrumentation.mjs";
11
- import { d as Storage } from "./types-KFzuijKE.mjs";
12
- import { t as PublishedRef } from "./scheduled-publish-BxdShRGs.mjs";
13
- import { C as SiteSettingKey, w as SiteSettings } from "./validate-kmN2lS8H.mjs";
14
+ import { d as Storage } from "./types-C0heD9oI.mjs";
15
+ import { t as PublishedRef } from "./scheduled-publish-eCNGpvNm.mjs";
16
+ import { C as SiteSettingKey, w as SiteSettings } from "./validate-DUscf6VG.mjs";
14
17
  import { DinewayManifest, HandlerResponse } from "./astro/types.mjs";
15
18
  import * as kysely from "kysely";
16
- import { CompiledQuery, Dialect, Kysely, Migration, RawBuilder, Transaction } from "kysely";
17
- import { Permission, RoleLevel } from "@dineway-ai/auth";
19
+ import { CompiledQuery, Dialect, Kysely, Migration, RawBuilder, Selectable, Transaction } from "kysely";
18
20
  import { z } from "zod";
21
+ import { Permission, RoleLevel } from "@dineway-ai/auth";
19
22
  import { z as z$1 } from "astro/zod";
20
23
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
21
24
  import "@forgeway/sdk";
@@ -542,13 +545,20 @@ declare function dinewayLoader(): LiveLoader<EntryData, EntryFilter, CollectionF
542
545
  */
543
546
  declare class ContentRepository {
544
547
  private db;
545
- constructor(db: Kysely<Database>);
548
+ private options;
549
+ constructor(db: Kysely<Database>, options?: {
550
+ prepareIndexWrites?: boolean;
551
+ });
552
+ private assertIndexWrite;
553
+ private writeChecks;
546
554
  normalizePreparedData(type: string, data: Record<string, unknown>): Promise<Record<string, unknown>>;
547
555
  /**
548
556
  * Create a new content item
549
557
  */
550
558
  prepareCreate(input: CreateContentInput, options?: {
551
559
  captureDefaults?: boolean;
560
+ id?: string;
561
+ now?: string;
552
562
  }): Promise<{
553
563
  id: string;
554
564
  batch: AtomicBatch;
@@ -628,6 +638,8 @@ declare class ContentRepository {
628
638
  */
629
639
  prepareDelete(type: string, id: string): AtomicBatch;
630
640
  delete(type: string, id: string): Promise<boolean>;
641
+ /** Compose a routed soft delete with primary business writes without dropping its event. */
642
+ prepareSoftDelete(type: string, id: string): Promise<AtomicBatch>;
631
643
  /**
632
644
  * Restore content from trash
633
645
  */
@@ -636,6 +648,7 @@ declare class ContentRepository {
636
648
  * Permanently delete a soft-deleted content row.
637
649
  */
638
650
  permanentDelete(type: string, id: string): Promise<boolean>;
651
+ preparePermanentDelete(type: string, id: string): Promise<AtomicBatch | null>;
639
652
  /**
640
653
  * Find trashed content items
641
654
  */
@@ -910,12 +923,19 @@ interface CreateRevisionInput {
910
923
  */
911
924
  declare class RevisionRepository {
912
925
  private db;
913
- constructor(db: Kysely<Database>);
926
+ private options;
927
+ constructor(db: Kysely<Database>, options?: {
928
+ prepareIndexWrites?: boolean;
929
+ });
930
+ private assertIndexWrite;
914
931
  /**
915
932
  * Create a new revision
916
933
  */
917
934
  prepareCreateSnapshot(input: Omit<CreateRevisionInput, "data"> & {
918
935
  data: RawBuilder<string>;
936
+ }, options?: {
937
+ id?: string;
938
+ createdAt?: string;
919
939
  }): {
920
940
  id: string;
921
941
  statement: kysely.CompiledQuery<kysely.InsertResult>;
@@ -1385,15 +1405,28 @@ declare function portableText(options?: {
1385
1405
  required?: boolean;
1386
1406
  }): FieldDefinition<PortableTextBlock$1[] | undefined>;
1387
1407
  //#endregion
1408
+ //#region src/content-storage/terms.d.ts
1409
+ declare const contentTermChangesSchema: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>;
1410
+ type ContentTermChanges = z.infer<typeof contentTermChangesSchema>;
1411
+ //#endregion
1388
1412
  //#region src/api/handlers/content-write.d.ts
1389
1413
  interface ContentWriteInput$1 {
1414
+ /** Reuse this identity when retrying an identical save after an unknown outcome. */
1415
+ operationId?: string;
1416
+ bylines?: ContentBylineInput[];
1417
+ seo?: ContentSeoInput;
1390
1418
  id?: string;
1391
1419
  data?: Record<string, unknown>;
1392
1420
  draftData?: Record<string, unknown>;
1421
+ terms?: ContentTermChanges;
1393
1422
  slug?: string;
1394
1423
  status?: "draft";
1395
- authorId?: string;
1424
+ authorId?: string | null;
1396
1425
  locale?: string;
1426
+ translationOf?: string;
1427
+ createdAt?: string | null;
1428
+ publishedAt?: string | null;
1429
+ reuseDraftRevision?: boolean;
1397
1430
  expectedRev?: string;
1398
1431
  stageDraft?: boolean;
1399
1432
  unpublish?: boolean;
@@ -1512,7 +1545,9 @@ declare function handleContentGetIncludingTrashed(db: Kysely<Database>, collecti
1512
1545
  * API returns a validation error rather than silently dropping it.
1513
1546
  */
1514
1547
  declare function handleContentCreate(db: Kysely<Database>, collection: string, body: {
1548
+ operationId?: string;
1515
1549
  data: Record<string, unknown>;
1550
+ terms?: ContentTermChanges;
1516
1551
  slug?: string;
1517
1552
  status?: string;
1518
1553
  authorId?: string;
@@ -1531,7 +1566,9 @@ declare function handleContentCreate(db: Kysely<Database>, collection: string, b
1531
1566
  * Content + SEO writes are wrapped in a transaction for atomicity.
1532
1567
  */
1533
1568
  declare function handleContentUpdate(db: Kysely<Database>, collection: string, id: string, body: {
1569
+ operationId?: string;
1534
1570
  data?: Record<string, unknown>;
1571
+ terms?: ContentTermChanges;
1535
1572
  slug?: string;
1536
1573
  status?: string;
1537
1574
  authorId?: string | null;
@@ -1829,6 +1866,8 @@ interface DinewayConfig {
1829
1866
  * ```
1830
1867
  */
1831
1868
  database?: DatabaseDescriptor;
1869
+ /** Optional Content type routing. Unconfigured types remain in the primary database. */
1870
+ contentStorage?: ContentStorageConfig;
1832
1871
  /**
1833
1872
  * Storage configuration (for media)
1834
1873
  */
@@ -2488,6 +2527,9 @@ declare class HookPipeline {
2488
2527
  * should only run via invokeExclusiveHook(), not in the regular pipeline.
2489
2528
  */
2490
2529
  private getTypedHooks;
2530
+ assertContentStorageHooks(): void;
2531
+ contentStorageTargets(names: readonly ContentStorageHookName[]): ContentStorageHookTarget[];
2532
+ deliverContentStorageHook(target: ContentStorageHookTarget, event: ContentStorageHookEvent): Promise<void>;
2491
2533
  /**
2492
2534
  * Register all hooks from plugins.
2493
2535
  *
@@ -2980,6 +3022,7 @@ interface MediaProviderContext {
2980
3022
  */
2981
3023
  interface RuntimeDependencies {
2982
3024
  config: DinewayConfig;
3025
+ contentStorageRuntime?: ContentStorageRuntime | null;
2983
3026
  plugins: ResolvedPlugin[];
2984
3027
  createDialect: (config: any) => Dialect;
2985
3028
  createCoalescingDialect?: (config: any) => Dialect;
@@ -3180,7 +3223,9 @@ declare class DinewayRuntime {
3180
3223
  handleContentGet(collection: string, id: string, locale?: string): Promise<ApiResult<ContentResponse>>;
3181
3224
  handleContentGetIncludingTrashed(collection: string, id: string, locale?: string): Promise<ApiResult<ContentResponse>>;
3182
3225
  handleContentCreate(collection: string, body: {
3226
+ operationId?: string;
3183
3227
  data: Record<string, unknown>;
3228
+ terms?: Record<string, string[]>;
3184
3229
  slug?: string;
3185
3230
  status?: string;
3186
3231
  authorId?: string;
@@ -3192,7 +3237,9 @@ declare class DinewayRuntime {
3192
3237
  translationOf?: string;
3193
3238
  }): Promise<ApiResult<ContentResponse>>;
3194
3239
  handleContentUpdate(collection: string, id: string, body: {
3240
+ operationId?: string;
3195
3241
  data?: Record<string, unknown>;
3242
+ terms?: Record<string, string[]>;
3196
3243
  slug?: string;
3197
3244
  status?: string;
3198
3245
  authorId?: string | null;
@@ -3342,6 +3389,7 @@ declare class DinewayRuntime {
3342
3389
  private runSandboxedBeforeSave;
3343
3390
  private runSandboxedBeforeDelete;
3344
3391
  private previousContentForNotification;
3392
+ private drainContentHooks;
3345
3393
  private runAfterSaveHooks;
3346
3394
  private runAfterDeleteHooks;
3347
3395
  private runAfterPublishHooks;
@@ -5027,19 +5075,19 @@ declare const pluginManifestSchema: z.ZodObject<{
5027
5075
  uniqueIndexes: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
5028
5076
  }, z.core.$strip>>;
5029
5077
  hooks: z.ZodArray<z.ZodUnion<readonly [z.ZodEnum<{
5030
- "plugin:install": "plugin:install";
5031
- "plugin:activate": "plugin:activate";
5032
- "plugin:deactivate": "plugin:deactivate";
5033
- "plugin:uninstall": "plugin:uninstall";
5034
- "content:beforeSave": "content:beforeSave";
5035
5078
  "content:afterSave": "content:afterSave";
5036
- "content:beforeDelete": "content:beforeDelete";
5037
- "content:afterDelete": "content:afterDelete";
5038
5079
  "content:afterPublish": "content:afterPublish";
5039
5080
  "content:afterUnpublish": "content:afterUnpublish";
5081
+ "content:afterDelete": "content:afterDelete";
5040
5082
  "content:afterRestore": "content:afterRestore";
5041
5083
  "content:afterSchedule": "content:afterSchedule";
5042
5084
  "content:afterUnschedule": "content:afterUnschedule";
5085
+ "plugin:install": "plugin:install";
5086
+ "plugin:activate": "plugin:activate";
5087
+ "plugin:deactivate": "plugin:deactivate";
5088
+ "plugin:uninstall": "plugin:uninstall";
5089
+ "content:beforeSave": "content:beforeSave";
5090
+ "content:beforeDelete": "content:beforeDelete";
5043
5091
  "media:beforeUpload": "media:beforeUpload";
5044
5092
  "media:afterUpload": "media:afterUpload";
5045
5093
  cron: "cron";
@@ -5054,19 +5102,19 @@ declare const pluginManifestSchema: z.ZodObject<{
5054
5102
  "page:fragments": "page:fragments";
5055
5103
  }>, z.ZodObject<{
5056
5104
  name: z.ZodEnum<{
5057
- "plugin:install": "plugin:install";
5058
- "plugin:activate": "plugin:activate";
5059
- "plugin:deactivate": "plugin:deactivate";
5060
- "plugin:uninstall": "plugin:uninstall";
5061
- "content:beforeSave": "content:beforeSave";
5062
5105
  "content:afterSave": "content:afterSave";
5063
- "content:beforeDelete": "content:beforeDelete";
5064
- "content:afterDelete": "content:afterDelete";
5065
5106
  "content:afterPublish": "content:afterPublish";
5066
5107
  "content:afterUnpublish": "content:afterUnpublish";
5108
+ "content:afterDelete": "content:afterDelete";
5067
5109
  "content:afterRestore": "content:afterRestore";
5068
5110
  "content:afterSchedule": "content:afterSchedule";
5069
5111
  "content:afterUnschedule": "content:afterUnschedule";
5112
+ "plugin:install": "plugin:install";
5113
+ "plugin:activate": "plugin:activate";
5114
+ "plugin:deactivate": "plugin:deactivate";
5115
+ "plugin:uninstall": "plugin:uninstall";
5116
+ "content:beforeSave": "content:beforeSave";
5117
+ "content:beforeDelete": "content:beforeDelete";
5070
5118
  "media:beforeUpload": "media:beforeUpload";
5071
5119
  "media:afterUpload": "media:afterUpload";
5072
5120
  cron: "cron";
@@ -5159,9 +5207,9 @@ declare const pluginManifestSchema: z.ZodObject<{
5159
5207
  json: "json";
5160
5208
  slug: "slug";
5161
5209
  image: "image";
5162
- datetime: "datetime";
5163
5210
  text: "text";
5164
5211
  integer: "integer";
5212
+ datetime: "datetime";
5165
5213
  select: "select";
5166
5214
  multiSelect: "multiSelect";
5167
5215
  portableText: "portableText";
@@ -7086,7 +7134,9 @@ interface StorageCollection<T = unknown> {
7086
7134
  putMany(items: Array<{
7087
7135
  id: string;
7088
7136
  data: T;
7089
- }>): Promise<void>;
7137
+ }>, options?: {
7138
+ ifAbsent?: boolean;
7139
+ }): Promise<void>;
7090
7140
  deleteMany(ids: string[]): Promise<number>;
7091
7141
  query(options?: QueryOptions): Promise<PaginatedResult<{
7092
7142
  id: string;
@@ -7559,6 +7609,8 @@ type CommentAfterModerateHandler = (event: CommentAfterModerateEvent, ctx: Plugi
7559
7609
  * Hook configuration
7560
7610
  */
7561
7611
  interface HookConfig<THandler> {
7612
+ /** Required for durable delivery of routed content events; deduplicate with event.idempotencyKey. */
7613
+ idempotent?: boolean;
7562
7614
  /** Explicit ordering - lower numbers run first (default: 100) */
7563
7615
  priority?: number;
7564
7616
  /** Max execution time in ms (default: 5000) */
@@ -7580,6 +7632,7 @@ interface HookConfig<THandler> {
7580
7632
  * Content hook event
7581
7633
  */
7582
7634
  interface ContentHookEvent {
7635
+ idempotencyKey?: string;
7583
7636
  /** Persisted item before a successful mutation; absent for creations and before hooks. */
7584
7637
  previousContent?: Record<string, unknown>;
7585
7638
  content: Record<string, unknown>;
@@ -7590,6 +7643,7 @@ interface ContentHookEvent {
7590
7643
  * Content delete hook event
7591
7644
  */
7592
7645
  interface ContentDeleteEvent {
7646
+ idempotencyKey?: string;
7593
7647
  /** Persisted item before a successful mutation; absent for creations and before hooks. */
7594
7648
  previousContent?: Record<string, unknown>;
7595
7649
  id: string;
@@ -7600,6 +7654,7 @@ interface ContentDeleteEvent {
7600
7654
  * Content state change hook event.
7601
7655
  */
7602
7656
  interface ContentStateChangeEvent {
7657
+ idempotencyKey?: string;
7603
7658
  /** Persisted item before a successful mutation; absent for creations and before hooks. */
7604
7659
  previousContent?: Record<string, unknown>;
7605
7660
  content: Record<string, unknown>;
@@ -7852,6 +7907,7 @@ interface ManifestRouteEntry {
7852
7907
  * Resolved hook with normalized config
7853
7908
  */
7854
7909
  interface ResolvedHook<THandler> {
7910
+ idempotent?: boolean;
7855
7911
  priority: number;
7856
7912
  timeout: number;
7857
7913
  dependencies: string[];