dineway 0.2.46 → 0.2.48

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 (247) hide show
  1. package/dist/api/route-utils.d.mts +5 -5
  2. package/dist/api/route-utils.mjs +12 -12
  3. package/dist/api/schemas/index.d.mts +1 -1
  4. package/dist/api/schemas/index.mjs +4 -4
  5. package/dist/{api-BSmjb74C.mjs → api-p58_ypd8.mjs} +9 -9
  6. package/dist/{apply-Caad3Uh7.mjs → apply-BlVVbjbz.mjs} +15 -15
  7. package/dist/astro/index.d.mts +4 -4
  8. package/dist/astro/index.mjs +5 -5
  9. package/dist/astro/middleware/auth.d.mts +4 -4
  10. package/dist/astro/middleware/auth.mjs +2 -2
  11. package/dist/astro/middleware/redirect.mjs +4 -4
  12. package/dist/astro/middleware/setup.mjs +1 -1
  13. package/dist/astro/middleware.mjs +63 -63
  14. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +4 -4
  15. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +4 -4
  16. package/dist/astro/routes/api/admin/briefing.mjs +20 -20
  17. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +4 -4
  18. package/dist/astro/routes/api/admin/byline-fields/index.mjs +4 -4
  19. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +4 -4
  20. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +12 -12
  21. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +12 -12
  22. package/dist/astro/routes/api/admin/bylines/index.mjs +12 -12
  23. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +10 -10
  24. package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
  25. package/dist/astro/routes/api/admin/comments/bulk.mjs +9 -9
  26. package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
  27. package/dist/astro/routes/api/admin/comments/index.mjs +9 -9
  28. package/dist/astro/routes/api/admin/context/_id_/history.mjs +25 -25
  29. package/dist/astro/routes/api/admin/context/_id_/index.mjs +25 -25
  30. package/dist/astro/routes/api/admin/context/_id_/review.mjs +28 -28
  31. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +28 -28
  32. package/dist/astro/routes/api/admin/context/diff.mjs +28 -28
  33. package/dist/astro/routes/api/admin/context/index.mjs +28 -28
  34. package/dist/astro/routes/api/admin/context/stale.mjs +28 -28
  35. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +26 -26
  36. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +29 -29
  37. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +29 -29
  38. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +25 -25
  39. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +43 -43
  40. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +43 -43
  41. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +39 -39
  42. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +43 -43
  43. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +43 -43
  44. package/dist/astro/routes/api/admin/plugins/index.mjs +39 -39
  45. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +39 -39
  46. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +43 -43
  47. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +39 -39
  48. package/dist/astro/routes/api/admin/plugins/updates.mjs +39 -39
  49. package/dist/astro/routes/api/admin/review-requests/_id_/image.mjs +16 -16
  50. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +22 -22
  51. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +32 -32
  52. package/dist/astro/routes/api/admin/review-requests/index.mjs +30 -30
  53. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +39 -39
  54. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +39 -39
  55. package/dist/astro/routes/api/admin/users/_id_/index.mjs +4 -4
  56. package/dist/astro/routes/api/admin/users/index.mjs +4 -4
  57. package/dist/astro/routes/api/auth/invite/complete.mjs +6 -6
  58. package/dist/astro/routes/api/auth/invite/index.mjs +4 -4
  59. package/dist/astro/routes/api/auth/invite/register-options.mjs +5 -5
  60. package/dist/astro/routes/api/auth/magic-link/send.mjs +4 -4
  61. package/dist/astro/routes/api/auth/me.mjs +4 -4
  62. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  63. package/dist/astro/routes/api/auth/passkey/_id_.mjs +4 -4
  64. package/dist/astro/routes/api/auth/passkey/options.mjs +5 -5
  65. package/dist/astro/routes/api/auth/passkey/register/options.mjs +5 -5
  66. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +6 -6
  67. package/dist/astro/routes/api/auth/passkey/verify.mjs +6 -6
  68. package/dist/astro/routes/api/auth/signup/complete.mjs +6 -6
  69. package/dist/astro/routes/api/auth/signup/request.mjs +4 -4
  70. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts +4 -4
  71. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +10 -10
  72. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +9 -9
  73. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +10 -10
  74. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +19 -19
  75. package/dist/astro/routes/api/content/_collection_/_id_/release-readiness.mjs +4 -4
  76. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +19 -19
  77. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +15 -15
  78. package/dist/astro/routes/api/content/_collection_/_id_.mjs +8 -8
  79. package/dist/astro/routes/api/content/_collection_/index.mjs +8 -8
  80. package/dist/astro/routes/api/content/_collection_/trash.mjs +4 -4
  81. package/dist/astro/routes/api/dashboard.mjs +9 -9
  82. package/dist/astro/routes/api/health.mjs +1 -1
  83. package/dist/astro/routes/api/import/probe.mjs +13 -13
  84. package/dist/astro/routes/api/import/wordpress/analyze.mjs +5 -5
  85. package/dist/astro/routes/api/import/wordpress/execute.d.mts +4 -4
  86. package/dist/astro/routes/api/import/wordpress/execute.mjs +28 -28
  87. package/dist/astro/routes/api/import/wordpress/media.d.mts +4 -4
  88. package/dist/astro/routes/api/import/wordpress/media.mjs +4 -4
  89. package/dist/astro/routes/api/import/wordpress/prepare.mjs +29 -29
  90. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +4 -4
  91. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +29 -29
  92. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +15 -15
  93. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +4 -4
  94. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +32 -32
  95. package/dist/astro/routes/api/manifest.mjs +2 -2
  96. package/dist/astro/routes/api/mcp.mjs +64 -64
  97. package/dist/astro/routes/api/media/_id_/confirm.mjs +4 -4
  98. package/dist/astro/routes/api/media/_id_.mjs +4 -4
  99. package/dist/astro/routes/api/media/upload-url.mjs +4 -4
  100. package/dist/astro/routes/api/media.mjs +4 -4
  101. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +29 -29
  102. package/dist/astro/routes/api/menus/_name_/items.mjs +29 -29
  103. package/dist/astro/routes/api/menus/_name_/reorder.mjs +29 -29
  104. package/dist/astro/routes/api/menus/_name_/translations.mjs +29 -29
  105. package/dist/astro/routes/api/menus/_name_.mjs +29 -29
  106. package/dist/astro/routes/api/menus/index.mjs +29 -29
  107. package/dist/astro/routes/api/openapi.json.mjs +4 -4
  108. package/dist/astro/routes/api/redirects/404s/index.mjs +4 -4
  109. package/dist/astro/routes/api/redirects/404s/summary.mjs +4 -4
  110. package/dist/astro/routes/api/redirects/_id_.mjs +28 -28
  111. package/dist/astro/routes/api/redirects/index.mjs +28 -28
  112. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +39 -39
  113. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +39 -39
  114. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +39 -39
  115. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +39 -39
  116. package/dist/astro/routes/api/schema/collections/index.mjs +39 -39
  117. package/dist/astro/routes/api/schema/index.mjs +5 -5
  118. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +39 -39
  119. package/dist/astro/routes/api/schema/orphans/index.mjs +39 -39
  120. package/dist/astro/routes/api/search/enable.mjs +9 -9
  121. package/dist/astro/routes/api/search/index.mjs +9 -9
  122. package/dist/astro/routes/api/search/rebuild.mjs +9 -9
  123. package/dist/astro/routes/api/search/stats.mjs +5 -5
  124. package/dist/astro/routes/api/search/suggest.mjs +9 -9
  125. package/dist/astro/routes/api/sections/_slug_.mjs +29 -29
  126. package/dist/astro/routes/api/sections/index.mjs +29 -29
  127. package/dist/astro/routes/api/settings/reviews.mjs +1 -1
  128. package/dist/astro/routes/api/settings.mjs +29 -29
  129. package/dist/astro/routes/api/setup/admin-verify.mjs +7 -7
  130. package/dist/astro/routes/api/setup/admin.mjs +5 -5
  131. package/dist/astro/routes/api/setup/dev-bypass.mjs +19 -19
  132. package/dist/astro/routes/api/setup/index.mjs +23 -23
  133. package/dist/astro/routes/api/setup/status.mjs +1 -1
  134. package/dist/astro/routes/api/snapshot.mjs +1 -1
  135. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +31 -31
  136. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +31 -31
  137. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +31 -31
  138. package/dist/astro/routes/api/taxonomies/index.mjs +31 -31
  139. package/dist/astro/routes/api/typegen.mjs +2 -2
  140. package/dist/astro/routes/api/well-known/auth.mjs +2 -2
  141. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +28 -28
  142. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +29 -29
  143. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +29 -29
  144. package/dist/astro/routes/api/widget-areas/_name_.mjs +26 -26
  145. package/dist/astro/routes/api/widget-areas/index.mjs +29 -29
  146. package/dist/astro/routes/robots.txt.mjs +6 -6
  147. package/dist/astro/routes/sitemap-_collection_.xml.mjs +10 -10
  148. package/dist/astro/routes/sitemap.xml.mjs +10 -10
  149. package/dist/astro/session-driver.mjs +4 -4
  150. package/dist/astro/types.d.mts +4 -4
  151. package/dist/{briefing-CbsLoDJS.mjs → briefing-BAtarnPm.mjs} +1 -1
  152. package/dist/{briefing-yQgD73g4.mjs → briefing-DoFv4isE.mjs} +5 -5
  153. package/dist/{byline-BS25s1R-.mjs → byline-CYc3Hn1i.mjs} +5 -5
  154. package/dist/{byline-fields-D6EXp7_j.d.mts → byline-fields-B117F62r.d.mts} +23 -23
  155. package/dist/{byline-fields-Bnw5NflJ.mjs → byline-fields-BHVmleIi.mjs} +1 -1
  156. package/dist/{bylines-CLBeFLdo.mjs → bylines-DGdYDqGq.mjs} +1 -1
  157. package/dist/{bylines-ZRvo3-j0.mjs → bylines-DrSccNgg.mjs} +3 -3
  158. package/dist/cli/index.mjs +47 -33
  159. package/dist/cli/plugin-kit.d.mts +4 -4
  160. package/dist/client/index.d.mts +4 -4
  161. package/dist/{comment-BTt78k0n.mjs → comment-BnrzhX9M.mjs} +1 -1
  162. package/dist/{comments-Do2zF3as.mjs → comments-B4Tym6oF.mjs} +1 -1
  163. package/dist/{config---A7Bg68.mjs → config-BhQacL9l.mjs} +2 -1
  164. package/dist/{content-BZBomTNV.mjs → content-CIWw08LO.mjs} +5 -5
  165. package/dist/{content-C8i4DyTt.mjs → content-CghEEm3k.mjs} +1 -1
  166. package/dist/{content-refresh-DbGFLB3p.mjs → content-refresh-lqCnhHGP.mjs} +2 -2
  167. package/dist/content-storage/index.d.mts +25 -4
  168. package/dist/content-storage/index.mjs +16 -16
  169. package/dist/content-storage/store.d.mts +3 -3
  170. package/dist/content-storage/store.mjs +3 -3
  171. package/dist/{content-write-Bt_eiX9o.mjs → content-write-BjTJiZhK.mjs} +74 -18
  172. package/dist/{context-RtLnM2-Z.mjs → context-PK-5ygok.mjs} +4 -4
  173. package/dist/{context-VxiTIEQa.mjs → context-caX3OQVz.mjs} +2 -2
  174. package/dist/{dashboard-C_x53TcC.mjs → dashboard-DBHqEUXC.mjs} +1 -1
  175. package/dist/database/d1/index.d.mts +4 -4
  176. package/dist/database/d1/index.mjs +2 -2
  177. package/dist/{discovery-DNwLsQqJ.mjs → discovery-DLzhlF9z.mjs} +1 -1
  178. package/dist/{evidence-D3Tqm_ik.mjs → evidence-CG6khLd9.mjs} +2 -2
  179. package/dist/{hitl-requests-ysSO7eqS.mjs → hitl-requests-SRfiaD3V.mjs} +1 -1
  180. package/dist/{hitl-route-helpers-BLJYI67Y.mjs → hitl-route-helpers-B0h7RXw1.mjs} +1 -1
  181. package/dist/{import-BkBVo6UM.mjs → import-DpVbSU4T.mjs} +3 -3
  182. package/dist/index.d.mts +4 -4
  183. package/dist/index.mjs +51 -51
  184. package/dist/{jsonld-BObNyc22.d.mts → jsonld-DaZdgstn.d.mts} +1 -1
  185. package/dist/{loader--zFg6meV.mjs → loader-CrVkVaD6.mjs} +7 -2
  186. package/dist/{mcp-reviewed-executor-CiuVfiL_.mjs → mcp-reviewed-executor-C93EXLSQ.mjs} +2 -2
  187. package/dist/media/local-runtime.d.mts +4 -4
  188. package/dist/{menus-Dq323Wka.mjs → menus-DRpTzW6g.mjs} +3 -3
  189. package/dist/{menus-BoNLPIAK.mjs → menus-X0eJuILT.mjs} +1 -1
  190. package/dist/{object-cache-Ue6kAfzf.mjs → object-cache-DRx6IjWR.mjs} +1 -1
  191. package/dist/{owned-metadata-bXhDX1WW.mjs → owned-metadata-DFODPEuj.mjs} +1 -1
  192. package/dist/page/index.d.mts +5 -5
  193. package/dist/plugin-utils.d.mts +4 -4
  194. package/dist/plugins/adapt-sandbox-entry.d.mts +4 -4
  195. package/dist/{plugins-C10hTI65.mjs → plugins-D4TRcqTV.mjs} +2 -2
  196. package/dist/{public-url-JnHtmWfz.d.mts → public-url-b6l0vmiE.d.mts} +1 -1
  197. package/dist/{publication-authorization-DBNXaGgH.mjs → publication-authorization-C2X-Qj7L.mjs} +4 -4
  198. package/dist/{query-5edkcMYz.mjs → query-BTXfe7AE.mjs} +3 -3
  199. package/dist/{query-CNXVFYWz.mjs → query-BfIz2W0n.mjs} +10 -10
  200. package/dist/{redirects-BwnvcNyN.mjs → redirects-DAKRmX6R.mjs} +1 -1
  201. package/dist/{registry-DEKqjKIM.mjs → registry-CdeSHG0k.mjs} +1 -1
  202. package/dist/{release-CIYyinzY.mjs → release-Bk-UaI2C.mjs} +1 -1
  203. package/dist/request-context.d.mts +1 -11
  204. package/dist/{migration-BhVzGnj0.mjs → retention-gks1TiDo.mjs} +100 -10
  205. package/dist/{review-requests-B7UdAl1r.mjs → review-requests-05w-uj_e.mjs} +1 -1
  206. package/dist/{revision-BtgwJxxa.mjs → revision-DX_AHhhE.mjs} +2 -2
  207. package/dist/{revisions-CQZI886L.mjs → revisions-DG2-WBDb.mjs} +2 -2
  208. package/dist/{runtime-ecsN2xL9.d.mts → runtime-BEiDcRPk.d.mts} +1 -1
  209. package/dist/{runtime-BLoyGKUx.mjs → runtime-CeGWfwh3.mjs} +76 -59
  210. package/dist/runtime.d.mts +4 -4
  211. package/dist/runtime.mjs +4 -4
  212. package/dist/{schema-DIXUswIX.mjs → schema-fU3y2MMH.mjs} +1 -1
  213. package/dist/{search-TXLzVROW.mjs → search-kRXT1_11.mjs} +1 -1
  214. package/dist/{sections-zaZhTZqa.mjs → sections-DzoY2Hvx.mjs} +1 -1
  215. package/dist/seed/index.mjs +19 -19
  216. package/dist/seo/index.mjs +6 -6
  217. package/dist/{seo-BQ7R2a1z.mjs → seo-DYjDvLHM.mjs} +5 -5
  218. package/dist/{seo-DdczIQvk.mjs → seo-DuHOFc2a.mjs} +1 -1
  219. package/dist/{service-CUlcOLZj.mjs → service-DlJ5BeF2.mjs} +2 -2
  220. package/dist/{settings-CoCGUtE6.mjs → settings-BU33hxhH.mjs} +1 -1
  221. package/dist/{settings-Bc2eQPR6.mjs → settings-opr6BnNM.mjs} +2 -2
  222. package/dist/{site-context-DkxgOnQl.mjs → site-context-94-KanDT.mjs} +6 -6
  223. package/dist/{submission-BNP2Sc3O.mjs → submission-_6ZXKy3N.mjs} +5 -5
  224. package/dist/{taxonomies-CVe1PGaO.mjs → taxonomies--FALWfoI.mjs} +3 -3
  225. package/dist/{taxonomies-zgZ2HG_z.mjs → taxonomies-DgiHNOZJ.mjs} +2 -2
  226. package/dist/{taxonomy-CcyZD5jQ.mjs → taxonomy-CKv3RKf1.mjs} +9 -8
  227. package/dist/{terms-EskuqbKE.mjs → terms-D4OJs0Zh.mjs} +3 -0
  228. package/dist/{types-CeFGasN8.d.mts → types-BafdCfKt.d.mts} +1 -0
  229. package/dist/{types-jtUocGnQ.d.mts → types-CTbitmIM.d.mts} +6 -4
  230. package/dist/ui/server-runtime.d.mts +6 -6
  231. package/dist/ui/server-runtime.mjs +14 -14
  232. package/dist/version-Bkbf_9nG.mjs +6 -0
  233. package/dist/{version-store-B6i81L9W.d.mts → version-store-BLGuq3wB.d.mts} +2 -37
  234. package/dist/{version-store-DyYULGd3.mjs → version-store-xhBmPoC-.mjs} +3 -11
  235. package/dist/{widgets-CJBk8bm7.mjs → widgets-hPqK6Aut.mjs} +1 -1
  236. package/dist/{worker-D82vT5OV.mjs → worker-CMiDP358.mjs} +4 -4
  237. package/dist/{write-intent-CjTERf3N.mjs → write-intent-ChTUctBF.mjs} +5 -5
  238. package/package.json +3 -3
  239. package/dist/version-BJwTlK4L.mjs +0 -6
  240. /package/dist/{allowed-origins-SQbPK6WG.mjs → allowed-origins-CQyKpMbJ.mjs} +0 -0
  241. /package/dist/{challenge-store-7IZ_NqWg.mjs → challenge-store-BImHCJvl.mjs} +0 -0
  242. /package/dist/{mode-C3RI5Z5t.mjs → mode-BoM5FjH7.mjs} +0 -0
  243. /package/dist/{policy-DbceGc4P.mjs → policy-BL8yj6uD.mjs} +0 -0
  244. /package/dist/{session-user-D36BRaZY.mjs → session-user-j7I8GMvK.mjs} +0 -0
  245. /package/dist/{setup-complete-eTV6C0-E.mjs → setup-complete-Cn-Ho9RX.mjs} +0 -0
  246. /package/dist/{state-CKkqoA6i.mjs → state-LzJZ7qpq.mjs} +0 -0
  247. /package/dist/{workers-build-4926MPc0.mjs → workers-build-Bd4w1aw9.mjs} +0 -0
@@ -1,27 +1,78 @@
1
1
  import { atomicBatch, rowUnchanged } from "./database/batch.mjs";
2
- import { a as validateContentStorage, i as resolveContentPartition, n as contentDigest, o as ContentStorageError, t as canonicalContentJson } from "./config---A7Bg68.mjs";
3
- import { b as prepareContentChangeJournal, d as prepareContentProjection, h as cancelContentMigration, l as assertContentIndexFields, r as getContentStorage, u as contentProjectionValues, v as readContentPartitionRoute, y as contentChangeSequence } from "./runtime-BLoyGKUx.mjs";
4
- import { n as readRevisionDataBatch, r as storedRevisionIndex } from "./revisions-CQZI886L.mjs";
5
- import { t as ContentRepository } from "./content-BZBomTNV.mjs";
6
- import { o as invalidateCollectionCache } from "./object-cache-Ue6kAfzf.mjs";
7
- import { i as contentWriteConfiguration, k as snapshotPartitionDependencies } from "./content-write-Bt_eiX9o.mjs";
8
- import { o as contentVersionSchema } from "./version-store-DyYULGd3.mjs";
9
- import { a as contentItemSchema } from "./content-C8i4DyTt.mjs";
2
+ import { a as validateContentStorage, i as resolveContentPartition, n as contentDigest, o as ContentStorageError, t as canonicalContentJson } from "./config-BhQacL9l.mjs";
3
+ import { _ as prepareContentProjection, b as contentChangeSequence, d as cancelContentMigration, g as contentProjectionValues, h as assertContentIndexFields, i as getContentStorage, m as readContentPartitionRoute, x as prepareContentChangeJournal } from "./runtime-CeGWfwh3.mjs";
4
+ import { n as readRevisionDataBatch, r as storedRevisionIndex } from "./revisions-DG2-WBDb.mjs";
5
+ import { t as ContentRepository } from "./content-CIWw08LO.mjs";
6
+ import { o as invalidateCollectionCache } from "./object-cache-DRx6IjWR.mjs";
7
+ import { i as contentWriteConfiguration, k as snapshotPartitionDependencies } from "./content-write-BjTJiZhK.mjs";
8
+ import { a as contentVersionSchema } from "./version-store-xhBmPoC-.mjs";
9
+ import { a as contentItemSchema } from "./content-CghEEm3k.mjs";
10
10
  import { sql } from "kysely";
11
11
  import { z } from "zod";
12
12
 
13
13
  //#region src/content-storage/config-migration.ts
14
+ function referenceLayout(config) {
15
+ return Object.fromEntries(Object.entries(config.rules).map(([collection, rule]) => {
16
+ const key = rule.partitionBy;
17
+ if (!("references" in key) || !key.references) return [collection, rule];
18
+ const references = Object.fromEntries(Object.entries(key.references).map(([name, reference]) => {
19
+ const { fields: _fields, ...dependency } = reference;
20
+ return [name, dependency];
21
+ }));
22
+ return [collection, {
23
+ ...rule,
24
+ partitionBy: {
25
+ ...key,
26
+ references
27
+ }
28
+ }];
29
+ }));
30
+ }
31
+ function dataLayout(config) {
32
+ return canonicalContentJson({
33
+ version: config.version,
34
+ rules: referenceLayout(config),
35
+ stores: Object.fromEntries(Object.entries(config.stores).map(([name, { provider, identity }]) => [name, {
36
+ provider,
37
+ identity
38
+ }]))
39
+ });
40
+ }
41
+ /** Explicitly stage compatible bindings or a resolver input projection with the same routing contract. */
42
+ async function stageContentStorageBindings(db, previous, next) {
43
+ validateContentStorage(previous);
44
+ validateContentStorage(next);
45
+ if (dataLayout(previous) !== dataLayout(next)) throw new ContentStorageError("INVALID_CONFIG", "Changing database bindings must preserve the Content type rules, physical stores and routing version.");
46
+ const before = await contentDigest(previous), after = await contentDigest(next);
47
+ await atomicBatch(db, {
48
+ checks: [
49
+ sql`EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='active' AND version=${previous.version} AND digest IN (${before},${after}))`,
50
+ sql`NOT EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='bindings' AND digest<>${after})`,
51
+ ...canonicalContentJson(previous.rules) === canonicalContentJson(next.rules) ? [] : [sql`NOT EXISTS (SELECT 1 FROM _dineway_content_partitions WHERE state<>'active')`, sql`NOT EXISTS (SELECT 1 FROM _dineway_content_operations WHERE state='pending')`]
52
+ ],
53
+ statements: [sql`INSERT INTO _dineway_content_storage_config (id,version,digest) SELECT 'bindings',version,${after} FROM _dineway_content_storage_config WHERE id='active' AND digest<>${after} ON CONFLICT(id) DO NOTHING`.compile(db)]
54
+ });
55
+ }
14
56
  /** Explicit deployment step. Mapping changes retain the source until its data migration completes. */
15
57
  async function migrateContentStorageConfig(db, previous, next) {
16
58
  validateContentStorage(previous);
17
59
  validateContentStorage(next);
18
60
  await assertContentIndexFields(db, next);
19
- if (previous.version === next.version) throw new ContentStorageError("INVALID_CONFIG", "A routing configuration change requires a new version.");
61
+ if (previous.version === next.version) {
62
+ await stageContentStorageBindings(db, previous, next);
63
+ const before = await contentDigest(previous), after = await contentDigest(next);
64
+ await atomicBatch(db, {
65
+ checks: [sql`EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='active' AND version=${next.version} AND (digest=${after} OR (digest=${before} AND EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='bindings' AND digest=${after}))))`],
66
+ statements: [sql`UPDATE _dineway_content_storage_config SET digest=${after} WHERE id='active'`.compile(db), sql`DELETE FROM _dineway_content_storage_config WHERE id='bindings' AND digest=${after}`.compile(db)]
67
+ });
68
+ return;
69
+ }
20
70
  const oldDigest = await contentDigest(previous);
21
71
  const digest = await contentDigest(next);
22
72
  const installed = (await sql`SELECT version,digest FROM _dineway_content_storage_config WHERE id='active'`.execute(db)).rows[0];
23
73
  if (installed?.version === next.version && installed.digest === digest) return;
24
74
  const checks = [
75
+ sql`NOT EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='bindings')`,
25
76
  sql`NOT EXISTS (SELECT 1 FROM _dineway_content_hook_deliveries WHERE delivered_at IS NULL)`,
26
77
  sql`EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='active' AND version=${previous.version} AND digest=${oldDigest})`,
27
78
  sql`NOT EXISTS (SELECT 1 FROM _dineway_content_partitions WHERE state<>'active')`
@@ -564,4 +615,43 @@ async function rollbackContentMigration(db, migration, archive) {
564
615
  }
565
616
 
566
617
  //#endregion
567
- export { verifyContentMigration as a, captureContentMigrationSnapshot as c, stageContentMigrationEntry as i, contentMigrationSnapshotSchema as l, completeContentMigration as n, verifyContentMigrationPage as o, rollbackContentMigration as r, bootstrapContentDirectoryPage as s, activateContentMigrationEntry as t, migrateContentStorageConfig as u };
618
+ //#region src/content-storage/retention.ts
619
+ /** Read-only inventory. A page is an observation, never a deletion authorization. */
620
+ async function inventoryContentVersions(primary, physical, store, collection, after = 0, limit = 50, now = /* @__PURE__ */ new Date()) {
621
+ if (!Number.isSafeInteger(after) || after < 0 || !Number.isInteger(limit) || limit < 1 || limit > 100) throw new ContentStorageError("INVALID_CONFIG", "Select a valid version inventory page.");
622
+ if (!(await sql`SELECT physical_schema FROM _dineway_content_store_collections WHERE collection=${collection}`.execute(physical)).rows[0]) throw new ContentStorageError("INVALID_CONFIG", "Unknown physical content type.");
623
+ const sizes = [...(await sql`SELECT name FROM pragma_table_info(${"ec_" + collection})`.execute(physical)).rows.map(({ name }) => sql`coalesce(length(CAST(${sql.ref("c." + name)} AS BLOB)),0)`), ...[
624
+ "collection",
625
+ "entry_id",
626
+ "version",
627
+ "operation_id",
628
+ "digest",
629
+ "command",
630
+ "data",
631
+ "created_at"
632
+ ].map((key) => sql`length(CAST(${sql.ref("v." + key)} AS BLOB))`)];
633
+ const groups = Array.from({ length: Math.ceil(sizes.length / 12) }, (_, i) => sql`(${sql.join(sizes.slice(i * 12, i * 12 + 12), sql` + `)})`);
634
+ const rows = (await sql`SELECT v.rowid AS cursor,v.entry_id,v.version,json_extract(v.command,'$.partition') AS partition,v.created_at,
635
+ ${sql.join(groups, sql` + `)} AS payload_bytes FROM _dineway_content_versions v
636
+ JOIN ${sql.table("ec_" + collection)} c ON c.id=v.entry_id AND c._dineway_storage_version=v.version
637
+ WHERE v.collection=${collection} AND v.rowid>${after} ORDER BY v.rowid LIMIT ${limit}`.execute(physical)).rows;
638
+ const cutoff = (/* @__PURE__ */ new Date(now.getTime() - 7 * 864e5)).toISOString();
639
+ return {
640
+ store,
641
+ collection,
642
+ versions: (await sql`
643
+ WITH candidate AS (SELECT value AS v FROM json_each(${JSON.stringify(rows)})),
644
+ page AS (SELECT json_extract(v,'$.cursor') AS cursor,json_extract(v,'$.entry_id') AS entry_id,json_extract(v,'$.version') AS version,
645
+ json_extract(v,'$.partition') AS partition,json_extract(v,'$.created_at') AS created_at,json_extract(v,'$.payload_bytes') AS payload_bytes FROM candidate)
646
+ SELECT p.*,CASE WHEN EXISTS(SELECT 1 FROM _dineway_content_locations l WHERE l.collection=${collection} AND l.entry_id=p.entry_id AND l.store=${store} AND l.version=p.version)
647
+ OR EXISTS(SELECT 1 FROM revisions r WHERE r.collection=${collection} AND r.entry_id=p.entry_id AND json_extract(r.data,'$.__dineway_content_storage__.store')=${store} AND json_extract(r.data,'$.__dineway_content_storage__.version')=p.version) THEN 'referenced'
648
+ WHEN p.created_at>=${cutoff} OR EXISTS(SELECT 1 FROM _dineway_content_changes j WHERE j.collection=${collection} AND j.entry_id=p.entry_id AND j.changed_at>=${cutoff})
649
+ OR EXISTS(SELECT 1 FROM _dineway_content_operations o WHERE o.collection=${collection} AND o.entry_id=p.entry_id AND o.state='pending')
650
+ OR EXISTS(SELECT 1 FROM _dineway_content_migrations m WHERE m.collection=${collection} AND m.partition=p.partition AND (m.state NOT IN ('complete','cancelled') OR m.retain_until>=${now.toISOString()} OR m.updated_at>=${cutoff}))
651
+ THEN 'retained' ELSE 'review' END AS disposition FROM page p ORDER BY p.cursor`.execute(primary)).rows,
652
+ nextCursor: rows.length === limit ? rows.at(-1).cursor : null
653
+ };
654
+ }
655
+
656
+ //#endregion
657
+ export { stageContentMigrationEntry as a, bootstrapContentDirectoryPage as c, migrateContentStorageConfig as d, stageContentStorageBindings as f, rollbackContentMigration as i, captureContentMigrationSnapshot as l, activateContentMigrationEntry as n, verifyContentMigration as o, completeContentMigration as r, verifyContentMigrationPage as s, inventoryContentVersions as t, contentMigrationSnapshotSchema as u };
@@ -1,5 +1,5 @@
1
1
  import { n as RejectedReviewContentError, r as ReviewRequestRepository } from "./review-requests-DZYM51yI.mjs";
2
- import { r as submitAutomatedReview, t as ReviewSubmissionError } from "./submission-BNP2Sc3O.mjs";
2
+ import { r as submitAutomatedReview, t as ReviewSubmissionError } from "./submission-_6ZXKy3N.mjs";
3
3
 
4
4
  //#region src/api/handlers/review-requests.ts
5
5
  async function handleReviewRequestCreate(db, handlers, input) {
@@ -1,7 +1,7 @@
1
1
  import { atomicBatch } from "./database/batch.mjs";
2
2
  import { t as validateIdentifier } from "./validate-Co3j6T_K.mjs";
3
- import { g as contentPartitionWritable, r as getContentStorage } from "./runtime-BLoyGKUx.mjs";
4
- import { n as readRevisionDataBatch, t as readRevisionData } from "./revisions-CQZI886L.mjs";
3
+ import { f as contentPartitionWritable, i as getContentStorage } from "./runtime-CeGWfwh3.mjs";
4
+ import { n as readRevisionDataBatch, t as readRevisionData } from "./revisions-DG2-WBDb.mjs";
5
5
  import { t as DinewayValidationError } from "./types-BI3ULB3A.mjs";
6
6
  import { sql } from "kysely";
7
7
  import { monotonicFactory } from "ulidx";
@@ -1,5 +1,5 @@
1
- import { o as ContentStorageError } from "./config---A7Bg68.mjs";
2
- import { r as getContentStorage } from "./runtime-BLoyGKUx.mjs";
1
+ import { o as ContentStorageError } from "./config-BhQacL9l.mjs";
2
+ import { i as getContentStorage } from "./runtime-CeGWfwh3.mjs";
3
3
  import { z } from "zod";
4
4
 
5
5
  //#region src/content-storage/revisions.ts
@@ -1,5 +1,5 @@
1
1
  import { AtomicBatch } from "./database/batch.mjs";
2
- import { a as ContentStorageActivation, d as ContentStore, p as PreparedContentVersion, r as ContentPartitionResolver, s as ContentStorageConfig, t as ContentLocation } from "./types-CeFGasN8.mjs";
2
+ import { a as ContentStorageActivation, d as ContentStore, p as PreparedContentVersion, r as ContentPartitionResolver, s as ContentStorageConfig, t as ContentLocation } from "./types-BafdCfKt.mjs";
3
3
  import { n as ContentStorageHookName, r as ContentStorageHookTarget } from "./hook-events-lN-kz-4_.mjs";
4
4
  import { Kysely } from "kysely";
5
5
 
@@ -1,6 +1,6 @@
1
1
  import { getRequestContext } from "./request-context.mjs";
2
2
  import { atomicBatch, rowUnchanged } from "./database/batch.mjs";
3
- import { a as validateContentStorage, i as resolveContentPartition, n as contentDigest, o as ContentStorageError, s as ContentStorageReplay, t as canonicalContentJson } from "./config---A7Bg68.mjs";
3
+ import { a as validateContentStorage, i as resolveContentPartition, n as contentDigest, o as ContentStorageError, s as ContentStorageReplay, t as canonicalContentJson } from "./config-BhQacL9l.mjs";
4
4
  import { sql } from "kysely";
5
5
  import { toPlainText } from "@portabletext/toolkit";
6
6
 
@@ -56,59 +56,6 @@ function contentChangeSequence(collection, entryId) {
56
56
  return sql`(SELECT COALESCE(MAX(sequence),0) FROM _dineway_content_changes WHERE collection=${collection} AND entry_id=${entryId})`;
57
57
  }
58
58
 
59
- //#endregion
60
- //#region src/content-storage/routing.ts
61
- const MIGRATION_ID = /^[a-zA-Z0-9_-]{1,128}$/;
62
- async function readContentPartitionRoute(db, collection, partition) {
63
- const row = (await sql`SELECT * FROM _dineway_content_partitions WHERE collection = ${collection} AND partition = ${partition}`.execute(db)).rows[0];
64
- if (!row) throw new ContentStorageError("ROUTE_CHANGED", "The content partition has not been installed.");
65
- return {
66
- route: row,
67
- check: rowUnchanged("_dineway_content_partitions", { ...row })
68
- };
69
- }
70
- /** Also fences metadata-only operations, such as trash, scheduling and review activation. */
71
- function contentPartitionWritable(collection, id) {
72
- return sql`NOT EXISTS (SELECT 1 FROM _dineway_content_locations l JOIN _dineway_content_partitions p ON p.collection = l.collection AND p.partition = l.partition WHERE l.collection = ${collection} AND l.entry_id = ${id} AND p.state = 'frozen')`;
73
- }
74
- /** Starts copying while the partition remains writable on its current store. */
75
- async function beginContentMigration(db, config, migration) {
76
- if (!MIGRATION_ID.test(migration.id)) throw new ContentStorageError("CONFLICT", "A stable migration identifier is required.");
77
- const current = await readContentPartitionRoute(db, migration.collection, migration.partition);
78
- if (current.route.migration_id === migration.id && current.route.state !== "active") return current.route;
79
- const target = config.rules[migration.collection]?.stores[migration.partition];
80
- if (!target || current.route.store === target || current.route.state !== "active" || current.route.migration_id) throw new ContentStorageError("CONFLICT", "The partition cannot start this migration.");
81
- await atomicBatch(db, {
82
- checks: [current.check, sql`EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='active' AND version=${config.version} AND digest=${await contentDigest(config)})`],
83
- statements: [sql`INSERT INTO _dineway_content_migrations (id, collection, partition, source_store, target_store, routing_version, state, created_at, updated_at, retain_until) VALUES (${migration.id}, ${migration.collection}, ${migration.partition}, ${current.route.store}, ${target}, ${config.version}, 'copying', ${(/* @__PURE__ */ new Date()).toISOString()}, ${(/* @__PURE__ */ new Date()).toISOString()}, ${new Date(Date.now() + 7 * 864e5).toISOString()})`.compile(db), sql`UPDATE _dineway_content_partitions SET state='copying', migration_id=${migration.id}, target_store=${target}, epoch=epoch+1, updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE collection=${migration.collection} AND partition=${migration.partition}`.compile(db)]
84
- });
85
- return (await readContentPartitionRoute(db, migration.collection, migration.partition)).route;
86
- }
87
- /** Epoch fencing makes all previously prepared writes fail before primary activation. */
88
- async function freezeContentPartition(db, migration) {
89
- const current = await readContentPartitionRoute(db, migration.collection, migration.partition);
90
- if (current.route.migration_id !== migration.id || !["copying", "frozen"].includes(current.route.state)) throw new ContentStorageError("CONFLICT", "The migration does not own this partition.");
91
- if (current.route.state === "frozen") return current.route;
92
- await atomicBatch(db, {
93
- checks: [current.check, sql`NOT EXISTS (SELECT 1 FROM ${sql.table(`ec_${migration.collection}`)} c WHERE NOT EXISTS (SELECT 1 FROM _dineway_content_locations l WHERE l.collection=${migration.collection} AND l.entry_id=c.id))`],
94
- statements: [
95
- sql`UPDATE _dineway_content_migrations SET state='frozen', updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE id=${migration.id}`.compile(db),
96
- sql`UPDATE _dineway_content_partitions SET state='frozen', epoch=epoch+1, updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE collection=${migration.collection} AND partition=${migration.partition}`.compile(db),
97
- sql`UPDATE _dineway_content_operations SET state='aborted', updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE collection=${migration.collection} AND state='pending' AND json_extract(command, '$.partition')=${migration.partition}`.compile(db)
98
- ]
99
- });
100
- return (await readContentPartitionRoute(db, migration.collection, migration.partition)).route;
101
- }
102
- /** Resume the old store only while every entry still points to it. */
103
- async function cancelContentMigration(db, migration) {
104
- const current = await readContentPartitionRoute(db, migration.collection, migration.partition);
105
- if (current.route.migration_id !== migration.id || current.route.state === "active") throw new ContentStorageError("CONFLICT", "The migration does not own this partition.");
106
- await atomicBatch(db, {
107
- checks: [current.check, sql`NOT EXISTS (SELECT 1 FROM _dineway_content_locations WHERE collection=${migration.collection} AND partition=${migration.partition} AND store<>${current.route.store})`],
108
- statements: [sql`UPDATE _dineway_content_migrations SET state='cancelled', updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE id=${migration.id}`.compile(db), sql`UPDATE _dineway_content_partitions SET state='active', migration_id=NULL, epoch=epoch+1, updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE collection=${migration.collection} AND partition=${migration.partition}`.compile(db)]
109
- });
110
- }
111
-
112
59
  //#endregion
113
60
  //#region src/search/text-extraction.ts
114
61
  /**
@@ -246,6 +193,59 @@ function prepareContentProjection(db, collection, item, fields, create, full = f
246
193
  return create ? sql`INSERT INTO ${sql.table(`ec_${collection}`)} (${sql.join(columns.map((column) => sql.ref(column)))}) VALUES (${sql.join(columns.map((column) => values[column] === null ? sql`NULL` : sql`${values[column]}`))})`.compile(db) : sql`UPDATE ${sql.table(`ec_${collection}`)} SET ${sql.join(columns.filter((column) => column !== "id").map((column) => sql`${sql.ref(column)} = ${values[column] === null ? sql`NULL` : sql`${values[column]}`} `))} WHERE id = ${item.id}`.compile(db);
247
194
  }
248
195
 
196
+ //#endregion
197
+ //#region src/content-storage/routing.ts
198
+ const MIGRATION_ID = /^[a-zA-Z0-9_-]{1,128}$/;
199
+ async function readContentPartitionRoute(db, collection, partition) {
200
+ const row = (await sql`SELECT * FROM _dineway_content_partitions WHERE collection = ${collection} AND partition = ${partition}`.execute(db)).rows[0];
201
+ if (!row) throw new ContentStorageError("ROUTE_CHANGED", "The content partition has not been installed.");
202
+ return {
203
+ route: row,
204
+ check: rowUnchanged("_dineway_content_partitions", { ...row })
205
+ };
206
+ }
207
+ /** Also fences metadata-only operations, such as trash, scheduling and review activation. */
208
+ function contentPartitionWritable(collection, id) {
209
+ return sql`NOT EXISTS (SELECT 1 FROM _dineway_content_locations l JOIN _dineway_content_partitions p ON p.collection = l.collection AND p.partition = l.partition WHERE l.collection = ${collection} AND l.entry_id = ${id} AND p.state = 'frozen')`;
210
+ }
211
+ /** Starts copying while the partition remains writable on its current store. */
212
+ async function beginContentMigration(db, config, migration) {
213
+ if (!MIGRATION_ID.test(migration.id)) throw new ContentStorageError("CONFLICT", "A stable migration identifier is required.");
214
+ const current = await readContentPartitionRoute(db, migration.collection, migration.partition);
215
+ if (current.route.migration_id === migration.id && current.route.state !== "active") return current.route;
216
+ const target = config.rules[migration.collection]?.stores[migration.partition];
217
+ if (!target || current.route.store === target || current.route.state !== "active" || current.route.migration_id) throw new ContentStorageError("CONFLICT", "The partition cannot start this migration.");
218
+ await atomicBatch(db, {
219
+ checks: [current.check, sql`EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id IN ('active','bindings') AND version=${config.version} AND digest=${await contentDigest(config)})`],
220
+ statements: [sql`INSERT INTO _dineway_content_migrations (id, collection, partition, source_store, target_store, routing_version, state, created_at, updated_at, retain_until) VALUES (${migration.id}, ${migration.collection}, ${migration.partition}, ${current.route.store}, ${target}, ${config.version}, 'copying', ${(/* @__PURE__ */ new Date()).toISOString()}, ${(/* @__PURE__ */ new Date()).toISOString()}, ${new Date(Date.now() + 7 * 864e5).toISOString()})`.compile(db), sql`UPDATE _dineway_content_partitions SET state='copying', migration_id=${migration.id}, target_store=${target}, epoch=epoch+1, updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE collection=${migration.collection} AND partition=${migration.partition}`.compile(db)]
221
+ });
222
+ return (await readContentPartitionRoute(db, migration.collection, migration.partition)).route;
223
+ }
224
+ /** Epoch fencing makes all previously prepared writes fail before primary activation. */
225
+ async function freezeContentPartition(db, migration) {
226
+ const current = await readContentPartitionRoute(db, migration.collection, migration.partition);
227
+ if (current.route.migration_id !== migration.id || !["copying", "frozen"].includes(current.route.state)) throw new ContentStorageError("CONFLICT", "The migration does not own this partition.");
228
+ if (current.route.state === "frozen") return current.route;
229
+ await atomicBatch(db, {
230
+ checks: [current.check, sql`NOT EXISTS (SELECT 1 FROM ${sql.table(`ec_${migration.collection}`)} c WHERE NOT EXISTS (SELECT 1 FROM _dineway_content_locations l WHERE l.collection=${migration.collection} AND l.entry_id=c.id))`],
231
+ statements: [
232
+ sql`UPDATE _dineway_content_migrations SET state='frozen', updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE id=${migration.id}`.compile(db),
233
+ sql`UPDATE _dineway_content_partitions SET state='frozen', epoch=epoch+1, updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE collection=${migration.collection} AND partition=${migration.partition}`.compile(db),
234
+ sql`UPDATE _dineway_content_operations SET state='aborted', updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE collection=${migration.collection} AND state='pending' AND json_extract(command, '$.partition')=${migration.partition}`.compile(db)
235
+ ]
236
+ });
237
+ return (await readContentPartitionRoute(db, migration.collection, migration.partition)).route;
238
+ }
239
+ /** Resume the old store only while every entry still points to it. */
240
+ async function cancelContentMigration(db, migration) {
241
+ const current = await readContentPartitionRoute(db, migration.collection, migration.partition);
242
+ if (current.route.migration_id !== migration.id || current.route.state === "active") throw new ContentStorageError("CONFLICT", "The migration does not own this partition.");
243
+ await atomicBatch(db, {
244
+ checks: [current.check, sql`NOT EXISTS (SELECT 1 FROM _dineway_content_locations WHERE collection=${migration.collection} AND partition=${migration.partition} AND store<>${current.route.store})`],
245
+ statements: [sql`UPDATE _dineway_content_migrations SET state='cancelled', updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE id=${migration.id}`.compile(db), sql`UPDATE _dineway_content_partitions SET state='active', migration_id=NULL, epoch=epoch+1, updated_at=${(/* @__PURE__ */ new Date()).toISOString()} WHERE collection=${migration.collection} AND partition=${migration.partition}`.compile(db)]
246
+ });
247
+ }
248
+
249
249
  //#endregion
250
250
  //#region src/content-storage/coordinator.ts
251
251
  const locationKey = (location) => JSON.stringify([
@@ -367,7 +367,7 @@ var ContentStorageCoordinator = class {
367
367
  const serialized = canonicalContentJson(command);
368
368
  const existing = await this.operation(command.operationId);
369
369
  if (existing && existing.command !== serialized) throw new ContentStorageError("CONFLICT", "An operation identifier cannot be reused for different content or authority.");
370
- const routeCheck = sql`(${partition.check}) AND EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id = 'active' AND version = ${this.config.version} AND digest = ${await this.configDigest})`;
370
+ const routeCheck = sql`(${partition.check}) AND EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id IN ('active','bindings') AND version = ${this.config.version} AND digest = ${await this.configDigest})`;
371
371
  const authority = await activation.authorize(command);
372
372
  if (existing?.state === "committed") {
373
373
  await atomicBatch(this.db, {
@@ -491,9 +491,11 @@ function contentStorageCacheScope() {
491
491
  });
492
492
  }
493
493
  async function assertContentStorageConfiguration(db, config) {
494
- const row = (await sql`SELECT version, digest FROM _dineway_content_storage_config WHERE id = 'active'`.execute(db)).rows[0];
495
- if (!config && !row) return;
496
- if (!config || !row || row.version !== config.version || row.digest !== await contentDigest(config)) throw new ContentStorageError("UNAVAILABLE", "Content routing configuration does not match the installed database configuration. Apply the explicit content storage migration before serving requests.");
494
+ const { rows } = await sql`SELECT id,version,digest FROM _dineway_content_storage_config WHERE id IN ('active','bindings')`.execute(db);
495
+ const digest = config && await contentDigest(config);
496
+ const active = rows.find((row) => row.id === "active");
497
+ if (!config && !rows.length) return;
498
+ if (!config || active?.version !== config.version || !rows.some((row) => row.version === config.version && row.digest === digest)) throw new ContentStorageError("UNAVAILABLE", "Content routing configuration does not match the installed database configuration. Apply the explicit content storage migration before serving requests.");
497
499
  }
498
500
  function getContentStorageRuntime(db) {
499
501
  const context = getRequestContext();
@@ -523,6 +525,17 @@ function getContentStorage(db, collection) {
523
525
  coordinator: new ContentStorageCoordinator(db, runtime.config, stores, runtime.resolvers)
524
526
  };
525
527
  }
528
+ /** Predicates run on the primary index before stored bodies are hydrated. */
529
+ async function assertContentQueryFields(db, collection, fields) {
530
+ const rule = getContentStorageRuntime(db)?.config.rules[collection];
531
+ if (!rule) return;
532
+ const candidates = [...new Set(fields)].filter((field) => !CONTENT_SYSTEM_FIELDS.has(field) && !rule.indexFields?.includes(field));
533
+ if (!candidates.length) return;
534
+ const { rows } = await sql`SELECT f.slug FROM _dineway_fields f JOIN _dineway_collections c ON c.id=f.collection_id
535
+ WHERE c.slug=${collection} AND f.column_type='JSON' AND coalesce(f."unique",0)=0 AND coalesce(f.searchable,0)=0
536
+ AND f.slug IN (SELECT value FROM json_each(${JSON.stringify(candidates)})) LIMIT 1`.execute(db);
537
+ if (rows[0]) throw new ContentStorageError("INVALID_CONFIG", `Querying ${collection}.${rows[0].slug} requires a primary index field.`);
538
+ }
526
539
  /** Resolve a bounded primary-index page in bulk, retaining the selected metadata and order. */
527
540
  async function hydrateContentRows(db, collection, rows, fields, publicLoaderRead = false) {
528
541
  const storage = getContentStorage(db, collection);
@@ -532,6 +545,10 @@ async function hydrateContentRows(db, collection, rows, fields, publicLoaderRead
532
545
  const locations = [];
533
546
  for (let offset = 0; offset < ids.length; offset += 80) {
534
547
  const result = await sql`SELECT l.collection, l.entry_id, l.store, l.partition, l.routing_version, l.version, l.digest, c.version AS _entry_version, c.updated_at AS _entry_updated_at, c.status AS _entry_status, c.deleted_at AS _entry_deleted_at FROM _dineway_content_locations l JOIN ${sql.table(`ec_${collection}`)} c ON c.id = l.entry_id WHERE l.collection = ${collection} AND l.entry_id IN (${sql.join(ids.slice(offset, offset + 80))})`.execute(db);
548
+ if (result.rows.length !== ids.slice(offset, offset + 80).length) {
549
+ const { rows: routed } = await sql`SELECT 1 FROM _dineway_content_partitions WHERE collection=${collection} AND (store<>'primary' OR state='frozen') LIMIT 1`.execute(db);
550
+ if (routed.length) throw new ContentStorageError("UNAVAILABLE", "The content directory is missing a routed entry. Verify its location before retrying.");
551
+ }
535
552
  for (const location of result.rows) {
536
553
  const previous = byId.get(location.entry_id);
537
554
  if (previous.version !== location._entry_version || [
@@ -597,4 +614,4 @@ async function hydrateContentRows(db, collection, rows, fields, publicLoaderRead
597
614
  }
598
615
 
599
616
  //#endregion
600
- export { freezeContentPartition as _, hydrateContentRows as a, prepareContentChangeJournal as b, installContentStorageConfig as c, prepareContentProjection as d, extractPlainText as f, contentPartitionWritable as g, cancelContentMigration as h, getContentStorageRuntime as i, assertContentIndexFields as l, beginContentMigration as m, contentStorageCacheScope as n, registerContentStorage as o, extractSearchableFields as p, getContentStorage as r, ContentStorageCoordinator as s, assertContentStorageConfiguration as t, contentProjectionValues as u, readContentPartitionRoute as v, contentChangeSequence as y };
617
+ export { prepareContentProjection as _, getContentStorageRuntime as a, contentChangeSequence as b, ContentStorageCoordinator as c, cancelContentMigration as d, contentPartitionWritable as f, contentProjectionValues as g, assertContentIndexFields as h, getContentStorage as i, installContentStorageConfig as l, readContentPartitionRoute as m, assertContentStorageConfiguration as n, hydrateContentRows as o, freezeContentPartition as p, contentStorageCacheScope as r, registerContentStorage as s, assertContentQueryFields as t, beginContentMigration as u, extractPlainText as v, prepareContentChangeJournal as x, extractSearchableFields as y };
@@ -1,16 +1,16 @@
1
- import { $s as getDb, Js as EntryData, Qs as dinewayLoader, Ys as EntryFilter, qs as CollectionFilter } from "./types-jtUocGnQ.mjs";
1
+ import { $s as getDb, Js as EntryData, Qs as dinewayLoader, Ys as EntryFilter, qs as CollectionFilter } from "./types-CTbitmIM.mjs";
2
2
  import "./types-CG9uGPBL.mjs";
3
3
  import "./runner-DlkOiguI.mjs";
4
4
  import "./index-_fCUsJx9.mjs";
5
- import "./types-CeFGasN8.mjs";
5
+ import "./types-BafdCfKt.mjs";
6
6
  import "./types-DLwh1QkC.mjs";
7
7
  import "./adapters-cL325h6c.mjs";
8
- import "./runtime-ecsN2xL9.mjs";
8
+ import "./runtime-BEiDcRPk.mjs";
9
9
  import "./hook-events-lN-kz-4_.mjs";
10
10
  import "./scheduled-publish-7kZkKw7t.mjs";
11
11
  import "./public-url-CvNSyMJJ.mjs";
12
12
  import "./validate-CleBZbkv.mjs";
13
- import "./byline-fields-D6EXp7_j.mjs";
13
+ import "./byline-fields-B117F62r.mjs";
14
14
  import { withPrimaryDatabase } from "./request-context.mjs";
15
15
  import "./types-BuplUVZ4.mjs";
16
16
  import { t as getMediaProvider } from "./provider-loader-Dl8SscrT.mjs";
package/dist/runtime.mjs CHANGED
@@ -1,13 +1,13 @@
1
1
  import { withPrimaryDatabase } from "./request-context.mjs";
2
2
  import "./d1-binding-DrLMBUxu.mjs";
3
3
  import "./dialect-helpers-C6xtO-Ui.mjs";
4
- import "./config---A7Bg68.mjs";
5
- import "./runtime-BLoyGKUx.mjs";
6
- import "./revisions-CQZI886L.mjs";
4
+ import "./config-BhQacL9l.mjs";
5
+ import "./runtime-CeGWfwh3.mjs";
6
+ import "./revisions-DG2-WBDb.mjs";
7
7
  import "./runtime-env-DpYGy4pT.mjs";
8
8
  import "./base64-qvSs0Gxy.mjs";
9
9
  import "./types-BI3ULB3A.mjs";
10
- import { n as dinewayLoader, r as getDb } from "./loader--zFg6meV.mjs";
10
+ import { n as dinewayLoader, r as getDb } from "./loader-CrVkVaD6.mjs";
11
11
  import { t as getMediaProvider } from "./provider-loader-BWu5kGxR.mjs";
12
12
 
13
13
  export { dinewayLoader, getDb, getMediaProvider, withPrimaryDatabase };
@@ -1,5 +1,5 @@
1
1
  import { c as __exportAll } from "./runner-CuG8o1uW.mjs";
2
- import { n as SchemaRegistry } from "./registry-DEKqjKIM.mjs";
2
+ import { n as SchemaRegistry } from "./registry-CdeSHG0k.mjs";
3
3
 
4
4
  //#region src/schema/index.ts
5
5
  var schema_exports = /* @__PURE__ */ __exportAll({ SchemaRegistry: () => SchemaRegistry });
@@ -1,6 +1,6 @@
1
1
  import { c as __exportAll } from "./runner-CuG8o1uW.mjs";
2
2
  import { t as validateIdentifier } from "./validate-Co3j6T_K.mjs";
3
- import { r as getDb } from "./loader--zFg6meV.mjs";
3
+ import { r as getDb } from "./loader-CrVkVaD6.mjs";
4
4
  import { t as FTSManager } from "./fts-manager-BHwhq1lC.mjs";
5
5
  import { sql } from "kysely";
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { i as encodeCursor, r as decodeCursor } from "./types-BI3ULB3A.mjs";
2
- import { r as getDb } from "./loader--zFg6meV.mjs";
2
+ import { r as getDb } from "./loader-CrVkVaD6.mjs";
3
3
  import { ulid } from "ulidx";
4
4
 
5
5
  //#region src/sections/index.ts
@@ -1,40 +1,40 @@
1
1
  import "../d1-binding-DrLMBUxu.mjs";
2
2
  import "../dialect-helpers-C6xtO-Ui.mjs";
3
- import "../config---A7Bg68.mjs";
4
- import "../runtime-BLoyGKUx.mjs";
5
- import "../revisions-CQZI886L.mjs";
3
+ import "../config-BhQacL9l.mjs";
4
+ import "../runtime-CeGWfwh3.mjs";
5
+ import "../revisions-DG2-WBDb.mjs";
6
6
  import "../runtime-env-DpYGy4pT.mjs";
7
7
  import "../base64-qvSs0Gxy.mjs";
8
8
  import "../types-BI3ULB3A.mjs";
9
- import "../loader--zFg6meV.mjs";
9
+ import "../loader-CrVkVaD6.mjs";
10
10
  import "../actor-D0AW80ld.mjs";
11
11
  import "../atomic-authority-Bf5QZboB.mjs";
12
- import "../content-BZBomTNV.mjs";
12
+ import "../content-CIWw08LO.mjs";
13
13
  import "../request-cache-CizvDoxV.mjs";
14
14
  import "../byline-registry-Caj0_gbU.mjs";
15
15
  import "../field-defs-cache-dn5Tw79A.mjs";
16
- import "../object-cache-Ue6kAfzf.mjs";
17
- import "../byline-BS25s1R-.mjs";
18
- import "../owned-metadata-bXhDX1WW.mjs";
19
- import "../revision-BtgwJxxa.mjs";
16
+ import "../object-cache-DRx6IjWR.mjs";
17
+ import "../byline-CYc3Hn1i.mjs";
18
+ import "../owned-metadata-DFODPEuj.mjs";
19
+ import "../revision-DX_AHhhE.mjs";
20
20
  import "../media-BjH5OD-A.mjs";
21
21
  import "../user-Bl2_8rhJ.mjs";
22
- import "../terms-EskuqbKE.mjs";
23
- import "../taxonomy-CcyZD5jQ.mjs";
22
+ import "../terms-D4OJs0Zh.mjs";
23
+ import "../taxonomy-CKv3RKf1.mjs";
24
24
  import "../options-yFkLUuTw.mjs";
25
25
  import "../redirect-CJ-FAbNK.mjs";
26
- import "../content-write-Bt_eiX9o.mjs";
27
- import "../version-store-DyYULGd3.mjs";
28
- import "../write-intent-CjTERf3N.mjs";
29
- import "../seo-BQ7R2a1z.mjs";
30
- import "../content-refresh-DbGFLB3p.mjs";
26
+ import "../content-write-BjTJiZhK.mjs";
27
+ import "../version-store-xhBmPoC-.mjs";
28
+ import "../write-intent-ChTUctBF.mjs";
29
+ import "../seo-DYjDvLHM.mjs";
30
+ import "../content-refresh-lqCnhHGP.mjs";
31
31
  import "../ssrf-C7tTSD1r.mjs";
32
32
  import "../fts-manager-BHwhq1lC.mjs";
33
33
  import "../public-discovery-CGRirTJH.mjs";
34
- import "../registry-DEKqjKIM.mjs";
35
- import "../settings-Bc2eQPR6.mjs";
34
+ import "../registry-CdeSHG0k.mjs";
35
+ import "../settings-opr6BnNM.mjs";
36
36
  import { t as validateSeed } from "../validate-WOW5vZz_.mjs";
37
- import { t as applySeed } from "../apply-Caad3Uh7.mjs";
37
+ import { t as applySeed } from "../apply-BlVVbjbz.mjs";
38
38
  import { t as defaultSeed } from "../default-BxRRjN_x.mjs";
39
39
  import { n as loadUserSeed, t as loadSeed } from "../load-XTcFS1Dp.mjs";
40
40
 
@@ -1,15 +1,15 @@
1
1
  import "../d1-binding-DrLMBUxu.mjs";
2
2
  import "../dialect-helpers-C6xtO-Ui.mjs";
3
- import "../config---A7Bg68.mjs";
4
- import "../runtime-BLoyGKUx.mjs";
5
- import "../revisions-CQZI886L.mjs";
3
+ import "../config-BhQacL9l.mjs";
4
+ import "../runtime-CeGWfwh3.mjs";
5
+ import "../revisions-DG2-WBDb.mjs";
6
6
  import "../base64-qvSs0Gxy.mjs";
7
7
  import "../types-BI3ULB3A.mjs";
8
- import "../content-refresh-DbGFLB3p.mjs";
8
+ import "../content-refresh-lqCnhHGP.mjs";
9
9
  import "../fts-manager-BHwhq1lC.mjs";
10
10
  import { i as satisfiesPublicDiscoveryRules } from "../public-discovery-CGRirTJH.mjs";
11
- import "../registry-DEKqjKIM.mjs";
12
- import { n as resolveCanonicalUrl, t as listPublicContent } from "../discovery-DNwLsQqJ.mjs";
11
+ import "../registry-CdeSHG0k.mjs";
12
+ import { n as resolveCanonicalUrl, t as listPublicContent } from "../discovery-DLzhlF9z.mjs";
13
13
  import { t as resolveContentUrl } from "../public-url-NCefkiXz.mjs";
14
14
  import { t as buildSeoImageUrl } from "../media-url-VHHHoHGL.mjs";
15
15
 
@@ -1,6 +1,6 @@
1
1
  import { atomicBatch } from "./database/batch.mjs";
2
- import { r as getContentStorage } from "./runtime-BLoyGKUx.mjs";
3
- import { o as invalidateCollectionCache } from "./object-cache-Ue6kAfzf.mjs";
2
+ import { i as getContentStorage } from "./runtime-CeGWfwh3.mjs";
3
+ import { o as invalidateCollectionCache } from "./object-cache-DRx6IjWR.mjs";
4
4
  import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-Bb56aCtB.mjs";
5
5
  import { sql } from "kysely";
6
6
 
@@ -108,7 +108,7 @@ var SeoRepository = class {
108
108
  }
109
109
  async upsert(collection, contentId, input) {
110
110
  if (getContentStorage(this.db, collection)) {
111
- const { prepareContentWrite } = await import("./content-write-Bt_eiX9o.mjs").then((n) => n.t);
111
+ const { prepareContentWrite } = await import("./content-write-BjTJiZhK.mjs").then((n) => n.t);
112
112
  const write = await prepareContentWrite(this.db, collection, {
113
113
  id: contentId,
114
114
  seo: input,
@@ -153,8 +153,8 @@ var SeoRepository = class {
153
153
  }
154
154
  async copyForDuplicate(collection, sourceId, targetId) {
155
155
  if (getContentStorage(this.db, collection)) {
156
- const { snapshotOwnedContentMetadata } = await import("./owned-metadata-bXhDX1WW.mjs").then((n) => n.n);
157
- const { prepareContentWrite } = await import("./content-write-Bt_eiX9o.mjs").then((n) => n.t);
156
+ const { snapshotOwnedContentMetadata } = await import("./owned-metadata-DFODPEuj.mjs").then((n) => n.n);
157
+ const { prepareContentWrite } = await import("./content-write-BjTJiZhK.mjs").then((n) => n.t);
158
158
  const source = await snapshotOwnedContentMetadata(this.db, collection, sourceId);
159
159
  const seo = await this.get(collection, sourceId);
160
160
  const write = await prepareContentWrite(this.db, collection, {
@@ -1,4 +1,4 @@
1
- import { t as listPublicContent } from "./discovery-DNwLsQqJ.mjs";
1
+ import { t as listPublicContent } from "./discovery-DLzhlF9z.mjs";
2
2
 
3
3
  //#region src/api/handlers/seo.ts
4
4
  /** Internal XML batch, not an unbounded public JSON list endpoint. */
@@ -1,6 +1,6 @@
1
1
  import { t as validateIdentifier } from "./validate-Co3j6T_K.mjs";
2
- import { s as invalidateCommentObjectCache } from "./object-cache-Ue6kAfzf.mjs";
3
- import { t as CommentRepository } from "./comment-BTt78k0n.mjs";
2
+ import { s as invalidateCommentObjectCache } from "./object-cache-DRx6IjWR.mjs";
3
+ import { t as CommentRepository } from "./comment-BnrzhX9M.mjs";
4
4
  import { t as escapeHtml } from "./escape-BfbDyuQ-.mjs";
5
5
  import { sql } from "kysely";
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { c as __exportAll } from "./runner-CuG8o1uW.mjs";
2
- import { a as getSiteSettingsWithDb, s as setSiteSettings } from "./settings-Bc2eQPR6.mjs";
2
+ import { a as getSiteSettingsWithDb, s as setSiteSettings } from "./settings-opr6BnNM.mjs";
3
3
 
4
4
  //#region src/api/handlers/settings.ts
5
5
  var settings_exports = /* @__PURE__ */ __exportAll({
@@ -1,9 +1,9 @@
1
1
  import { getRequestContext } from "./request-context.mjs";
2
2
  import { after } from "./after.mjs";
3
- import { r as getDb } from "./loader--zFg6meV.mjs";
3
+ import { r as getDb } from "./loader-CrVkVaD6.mjs";
4
4
  import { n as peekRequestCache, r as requestCached } from "./request-cache-CizvDoxV.mjs";
5
5
  import { n as invalidateProcessCache, r as processCachedAsync, t as createProcessCache } from "./process-cache-CMy5M80h.mjs";
6
- import { l as invalidateObjectCache, n as cachedQuery, t as CacheNamespace } from "./object-cache-Ue6kAfzf.mjs";
6
+ import { l as invalidateObjectCache, n as cachedQuery, t as CacheNamespace } from "./object-cache-DRx6IjWR.mjs";
7
7
  import { t as MediaRepository } from "./media-BjH5OD-A.mjs";
8
8
  import { t as OptionsRepository } from "./options-yFkLUuTw.mjs";
9
9
  import { i as resolvePublicMediaUrl } from "./url-RhtABurq.mjs";
@@ -1,20 +1,20 @@
1
1
  import { atomicBatch, rowUnchanged } from "./database/batch.mjs";
2
2
  import { t as validateIdentifier } from "./validate-Co3j6T_K.mjs";
3
3
  import { i as encodeCursor, r as decodeCursor } from "./types-BI3ULB3A.mjs";
4
- import { t as ContentRepository } from "./content-BZBomTNV.mjs";
4
+ import { t as ContentRepository } from "./content-CIWw08LO.mjs";
5
5
  import { t as SiteActivityRepository } from "./site-activity-hpfJkmxQ.mjs";
6
6
  import { r as ReviewRequestRepository } from "./review-requests-DZYM51yI.mjs";
7
- import { o as HitlRequestRepository } from "./publication-authorization-DBNXaGgH.mjs";
7
+ import { o as HitlRequestRepository } from "./publication-authorization-C2X-Qj7L.mjs";
8
8
  import { l as isPattern } from "./cache-DsEbwFVE.mjs";
9
9
  import { n as buildStableActionHash, t as ReviewPayloadBuilder } from "./review-payload-mDJIgcFy.mjs";
10
- import { i as parseSiteBriefingScope, l as handlePluginList, m as ContextRepository } from "./briefing-yQgD73g4.mjs";
10
+ import { i as parseSiteBriefingScope, l as handlePluginList, m as ContextRepository } from "./briefing-DoFv4isE.mjs";
11
11
  import { t as FTSManager } from "./fts-manager-BHwhq1lC.mjs";
12
- import { n as SchemaRegistry } from "./registry-DEKqjKIM.mjs";
13
- import { a as getSiteSettingsWithDb } from "./settings-Bc2eQPR6.mjs";
12
+ import { n as SchemaRegistry } from "./registry-CdeSHG0k.mjs";
13
+ import { a as getSiteSettingsWithDb } from "./settings-opr6BnNM.mjs";
14
14
  import { n as assertExperimentalSiteContextWorkflowsEnabled } from "./experimental-workflows-BtKXzyIH.mjs";
15
15
  import { m as normalizeUrl } from "./utils-WY63JOPB.mjs";
16
16
  import { t as sanitizeWordPressImportSlug } from "./wordpress-slugs-qNcYNJGj.mjs";
17
- import { a as searchCollection } from "./search-TXLzVROW.mjs";
17
+ import { a as searchCollection } from "./search-kRXT1_11.mjs";
18
18
  import { sql } from "kysely";
19
19
  import { ulid } from "ulidx";
20
20
  import { Role } from "@dineway-ai/auth";