dineway 0.2.46 → 0.2.47

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 (193) hide show
  1. package/dist/api/route-utils.d.mts +3 -3
  2. package/dist/api/route-utils.mjs +10 -10
  3. package/dist/api/schemas/index.d.mts +1 -1
  4. package/dist/{api-BSmjb74C.mjs → api-CJ_MN3ZM.mjs} +9 -9
  5. package/dist/{apply-Caad3Uh7.mjs → apply-AOuBTila.mjs} +14 -14
  6. package/dist/astro/index.d.mts +2 -2
  7. package/dist/astro/index.mjs +2 -2
  8. package/dist/astro/middleware/auth.d.mts +2 -2
  9. package/dist/astro/middleware/redirect.mjs +3 -3
  10. package/dist/astro/middleware.mjs +53 -53
  11. package/dist/astro/routes/api/admin/briefing.mjs +15 -15
  12. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +7 -7
  13. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +7 -7
  14. package/dist/astro/routes/api/admin/bylines/index.mjs +7 -7
  15. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +5 -5
  16. package/dist/astro/routes/api/admin/comments/_id_.mjs +4 -4
  17. package/dist/astro/routes/api/admin/comments/bulk.mjs +4 -4
  18. package/dist/astro/routes/api/admin/comments/counts.mjs +4 -4
  19. package/dist/astro/routes/api/admin/comments/index.mjs +4 -4
  20. package/dist/astro/routes/api/admin/context/_id_/history.mjs +23 -23
  21. package/dist/astro/routes/api/admin/context/_id_/index.mjs +23 -23
  22. package/dist/astro/routes/api/admin/context/_id_/review.mjs +23 -23
  23. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +23 -23
  24. package/dist/astro/routes/api/admin/context/diff.mjs +23 -23
  25. package/dist/astro/routes/api/admin/context/index.mjs +23 -23
  26. package/dist/astro/routes/api/admin/context/stale.mjs +23 -23
  27. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +24 -24
  28. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +24 -24
  29. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +24 -24
  30. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +23 -23
  31. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +38 -38
  32. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +38 -38
  33. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +34 -34
  34. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +38 -38
  35. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +38 -38
  36. package/dist/astro/routes/api/admin/plugins/index.mjs +34 -34
  37. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +34 -34
  38. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +38 -38
  39. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +34 -34
  40. package/dist/astro/routes/api/admin/plugins/updates.mjs +34 -34
  41. package/dist/astro/routes/api/admin/review-requests/_id_/image.mjs +15 -15
  42. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +20 -20
  43. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +26 -26
  44. package/dist/astro/routes/api/admin/review-requests/index.mjs +25 -25
  45. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +34 -34
  46. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +34 -34
  47. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts +2 -2
  48. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +5 -5
  49. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +4 -4
  50. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +5 -5
  51. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +14 -14
  52. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +14 -14
  53. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +10 -10
  54. package/dist/astro/routes/api/content/_collection_/_id_.mjs +3 -3
  55. package/dist/astro/routes/api/content/_collection_/index.mjs +3 -3
  56. package/dist/astro/routes/api/dashboard.mjs +8 -8
  57. package/dist/astro/routes/api/health.mjs +1 -1
  58. package/dist/astro/routes/api/import/probe.mjs +8 -8
  59. package/dist/astro/routes/api/import/wordpress/analyze.mjs +4 -4
  60. package/dist/astro/routes/api/import/wordpress/execute.d.mts +2 -2
  61. package/dist/astro/routes/api/import/wordpress/execute.mjs +26 -26
  62. package/dist/astro/routes/api/import/wordpress/media.d.mts +2 -2
  63. package/dist/astro/routes/api/import/wordpress/prepare.mjs +24 -24
  64. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +2 -2
  65. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +24 -24
  66. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +10 -10
  67. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +2 -2
  68. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +27 -27
  69. package/dist/astro/routes/api/manifest.mjs +1 -1
  70. package/dist/astro/routes/api/mcp.mjs +58 -58
  71. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +24 -24
  72. package/dist/astro/routes/api/menus/_name_/items.mjs +24 -24
  73. package/dist/astro/routes/api/menus/_name_/reorder.mjs +24 -24
  74. package/dist/astro/routes/api/menus/_name_/translations.mjs +24 -24
  75. package/dist/astro/routes/api/menus/_name_.mjs +24 -24
  76. package/dist/astro/routes/api/menus/index.mjs +24 -24
  77. package/dist/astro/routes/api/openapi.json.mjs +1 -1
  78. package/dist/astro/routes/api/redirects/_id_.mjs +23 -23
  79. package/dist/astro/routes/api/redirects/index.mjs +23 -23
  80. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +34 -34
  81. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +34 -34
  82. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +34 -34
  83. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +34 -34
  84. package/dist/astro/routes/api/schema/collections/index.mjs +34 -34
  85. package/dist/astro/routes/api/schema/index.mjs +4 -4
  86. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +34 -34
  87. package/dist/astro/routes/api/schema/orphans/index.mjs +34 -34
  88. package/dist/astro/routes/api/search/enable.mjs +4 -4
  89. package/dist/astro/routes/api/search/index.mjs +4 -4
  90. package/dist/astro/routes/api/search/rebuild.mjs +4 -4
  91. package/dist/astro/routes/api/search/stats.mjs +4 -4
  92. package/dist/astro/routes/api/search/suggest.mjs +4 -4
  93. package/dist/astro/routes/api/sections/_slug_.mjs +24 -24
  94. package/dist/astro/routes/api/sections/index.mjs +24 -24
  95. package/dist/astro/routes/api/settings.mjs +24 -24
  96. package/dist/astro/routes/api/setup/dev-bypass.mjs +17 -17
  97. package/dist/astro/routes/api/setup/index.mjs +17 -17
  98. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +26 -26
  99. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +26 -26
  100. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +26 -26
  101. package/dist/astro/routes/api/taxonomies/index.mjs +26 -26
  102. package/dist/astro/routes/api/typegen.mjs +2 -2
  103. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  104. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +23 -23
  105. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +24 -24
  106. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +24 -24
  107. package/dist/astro/routes/api/widget-areas/_name_.mjs +24 -24
  108. package/dist/astro/routes/api/widget-areas/index.mjs +24 -24
  109. package/dist/astro/routes/robots.txt.mjs +5 -5
  110. package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
  111. package/dist/astro/routes/sitemap.xml.mjs +9 -9
  112. package/dist/astro/session-driver.mjs +3 -3
  113. package/dist/astro/types.d.mts +2 -2
  114. package/dist/{briefing-CbsLoDJS.mjs → briefing-8OgwfN-y.mjs} +1 -1
  115. package/dist/{briefing-yQgD73g4.mjs → briefing-CQk5h4t6.mjs} +5 -5
  116. package/dist/{byline-BS25s1R-.mjs → byline-DGTZqRM0.mjs} +5 -5
  117. package/dist/{byline-fields-D6EXp7_j.d.mts → byline-fields-DvYufwxE.d.mts} +28 -28
  118. package/dist/{bylines-ZRvo3-j0.mjs → bylines-BO0rdeMa.mjs} +3 -3
  119. package/dist/{bylines-CLBeFLdo.mjs → bylines-D27pVrb-.mjs} +1 -1
  120. package/dist/cli/index.mjs +33 -27
  121. package/dist/cli/plugin-kit.d.mts +2 -2
  122. package/dist/client/index.d.mts +2 -2
  123. package/dist/{comment-BTt78k0n.mjs → comment--XUWDcJD.mjs} +1 -1
  124. package/dist/{comments-Do2zF3as.mjs → comments-1RMjBvK3.mjs} +1 -1
  125. package/dist/{content-BZBomTNV.mjs → content-rb8lZEfT.mjs} +4 -4
  126. package/dist/{content-refresh-DbGFLB3p.mjs → content-refresh-Dl938dTm.mjs} +2 -2
  127. package/dist/content-storage/index.d.mts +4 -2
  128. package/dist/content-storage/index.mjs +13 -13
  129. package/dist/content-storage/store.d.mts +2 -2
  130. package/dist/content-storage/store.mjs +2 -2
  131. package/dist/{content-write-Bt_eiX9o.mjs → content-write-DPszY76R.mjs} +10 -10
  132. package/dist/{context-RtLnM2-Z.mjs → context-BrzB9nTR.mjs} +4 -4
  133. package/dist/{context-VxiTIEQa.mjs → context-I9mz_9uB.mjs} +2 -2
  134. package/dist/{dashboard-C_x53TcC.mjs → dashboard-CZtacCz9.mjs} +1 -1
  135. package/dist/database/d1/index.d.mts +2 -2
  136. package/dist/{discovery-DNwLsQqJ.mjs → discovery-BjyZQy47.mjs} +1 -1
  137. package/dist/{evidence-D3Tqm_ik.mjs → evidence-DE40B1zz.mjs} +2 -2
  138. package/dist/{hitl-requests-ysSO7eqS.mjs → hitl-requests-DsLqU9VX.mjs} +1 -1
  139. package/dist/{hitl-route-helpers-BLJYI67Y.mjs → hitl-route-helpers-BVgtDm47.mjs} +1 -1
  140. package/dist/{import-BkBVo6UM.mjs → import-DrzBQKha.mjs} +3 -3
  141. package/dist/index.d.mts +2 -2
  142. package/dist/index.mjs +46 -46
  143. package/dist/{jsonld-BObNyc22.d.mts → jsonld-Qr9dwCK4.d.mts} +1 -1
  144. package/dist/{loader--zFg6meV.mjs → loader-Q07mEStb.mjs} +2 -2
  145. package/dist/{mcp-reviewed-executor-CiuVfiL_.mjs → mcp-reviewed-executor-mRdtNIf1.mjs} +2 -2
  146. package/dist/media/local-runtime.d.mts +2 -2
  147. package/dist/{menus-Dq323Wka.mjs → menus-Coq8FLPj.mjs} +3 -3
  148. package/dist/{menus-BoNLPIAK.mjs → menus-DDxZ0JiZ.mjs} +1 -1
  149. package/dist/{migration-BhVzGnj0.mjs → migration-B7DanZKm.mjs} +38 -8
  150. package/dist/{object-cache-Ue6kAfzf.mjs → object-cache-DeIkrWmq.mjs} +1 -1
  151. package/dist/{owned-metadata-bXhDX1WW.mjs → owned-metadata-LUF0xC0h.mjs} +1 -1
  152. package/dist/page/index.d.mts +3 -3
  153. package/dist/plugin-utils.d.mts +2 -2
  154. package/dist/plugins/adapt-sandbox-entry.d.mts +2 -2
  155. package/dist/{plugins-C10hTI65.mjs → plugins-Dh2fBfX7.mjs} +2 -2
  156. package/dist/{public-url-JnHtmWfz.d.mts → public-url-C60HX3NR.d.mts} +1 -1
  157. package/dist/{publication-authorization-DBNXaGgH.mjs → publication-authorization-e0sPJ9OP.mjs} +4 -4
  158. package/dist/{query-CNXVFYWz.mjs → query-BvYbhblK.mjs} +10 -10
  159. package/dist/{query-5edkcMYz.mjs → query-CyzBZrWv.mjs} +3 -3
  160. package/dist/{registry-DEKqjKIM.mjs → registry-BpNZLrXn.mjs} +1 -1
  161. package/dist/request-context.d.mts +1 -11
  162. package/dist/{review-requests-B7UdAl1r.mjs → review-requests-R9L2Aubm.mjs} +1 -1
  163. package/dist/{revision-BtgwJxxa.mjs → revision-DfrRhPgw.mjs} +2 -2
  164. package/dist/{revisions-CQZI886L.mjs → revisions-DnV1P4O5.mjs} +1 -1
  165. package/dist/{runtime-BLoyGKUx.mjs → runtime-CmupMaEb.mjs} +60 -58
  166. package/dist/runtime.d.mts +2 -2
  167. package/dist/runtime.mjs +3 -3
  168. package/dist/{schema-DIXUswIX.mjs → schema-siddXiB9.mjs} +1 -1
  169. package/dist/{search-TXLzVROW.mjs → search-giRjxqrh.mjs} +1 -1
  170. package/dist/{sections-zaZhTZqa.mjs → sections-DqBH0bCm.mjs} +1 -1
  171. package/dist/seed/index.mjs +17 -17
  172. package/dist/seo/index.mjs +5 -5
  173. package/dist/{seo-DdczIQvk.mjs → seo-Dsh31oy8.mjs} +1 -1
  174. package/dist/{seo-BQ7R2a1z.mjs → seo-TWEsRapq.mjs} +5 -5
  175. package/dist/{service-CUlcOLZj.mjs → service-CFLkZn2S.mjs} +2 -2
  176. package/dist/{settings-CoCGUtE6.mjs → settings-ByRmK-Mg.mjs} +1 -1
  177. package/dist/{settings-Bc2eQPR6.mjs → settings-Dn4XvS7H.mjs} +2 -2
  178. package/dist/{site-context-DkxgOnQl.mjs → site-context-CHfuvD9v.mjs} +6 -6
  179. package/dist/{submission-BNP2Sc3O.mjs → submission-C_DNrA5y.mjs} +4 -4
  180. package/dist/{taxonomies-CVe1PGaO.mjs → taxonomies-BCuDkFFS.mjs} +3 -3
  181. package/dist/{taxonomies-zgZ2HG_z.mjs → taxonomies-PWPhdhgN.mjs} +2 -2
  182. package/dist/{taxonomy-CcyZD5jQ.mjs → taxonomy-YxipNvfL.mjs} +3 -3
  183. package/dist/{types-jtUocGnQ.d.mts → types-1NHQF2Yh.d.mts} +2 -2
  184. package/dist/ui/server-runtime.d.mts +4 -4
  185. package/dist/ui/server-runtime.mjs +13 -13
  186. package/dist/version-DkCuTQ-N.mjs +6 -0
  187. package/dist/{version-store-DyYULGd3.mjs → version-store-B2n_Gfkq.mjs} +2 -10
  188. package/dist/{version-store-B6i81L9W.d.mts → version-store-mMm7pcYK.d.mts} +1 -36
  189. package/dist/{widgets-CJBk8bm7.mjs → widgets-C_9KBEwT.mjs} +1 -1
  190. package/dist/{worker-D82vT5OV.mjs → worker-Dl9S5-Tl.mjs} +3 -3
  191. package/dist/{write-intent-CjTERf3N.mjs → write-intent-4Q8sNg11.mjs} +2 -2
  192. package/package.json +3 -3
  193. package/dist/version-BJwTlK4L.mjs +0 -6
@@ -1,27 +1,57 @@
1
1
  import { atomicBatch, rowUnchanged } from "./database/batch.mjs";
2
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";
3
+ import { b as prepareContentChangeJournal, g as prepareContentProjection, h as contentProjectionValues, m as assertContentIndexFields, p as readContentPartitionRoute, r as getContentStorage, u as cancelContentMigration, y as contentChangeSequence } from "./runtime-CmupMaEb.mjs";
4
+ import { n as readRevisionDataBatch, r as storedRevisionIndex } from "./revisions-DnV1P4O5.mjs";
5
+ import { t as ContentRepository } from "./content-rb8lZEfT.mjs";
6
+ import { o as invalidateCollectionCache } from "./object-cache-DeIkrWmq.mjs";
7
+ import { i as contentWriteConfiguration, k as snapshotPartitionDependencies } from "./content-write-DPszY76R.mjs";
8
+ import { a as contentVersionSchema } from "./version-store-B2n_Gfkq.mjs";
9
9
  import { a as contentItemSchema } from "./content-C8i4DyTt.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 dataLayout(config) {
15
+ return canonicalContentJson({
16
+ version: config.version,
17
+ rules: config.rules,
18
+ stores: Object.fromEntries(Object.entries(config.stores).map(([name, { provider, identity }]) => [name, {
19
+ provider,
20
+ identity
21
+ }]))
22
+ });
23
+ }
24
+ /** Allow old and new application versions to overlap when only the bindings change. */
25
+ async function stageContentStorageBindings(db, previous, next) {
26
+ validateContentStorage(previous);
27
+ validateContentStorage(next);
28
+ if (dataLayout(previous) !== dataLayout(next)) throw new ContentStorageError("INVALID_CONFIG", "Changing database bindings must preserve the Content type rules, physical stores and routing version.");
29
+ const before = await contentDigest(previous), after = await contentDigest(next);
30
+ await atomicBatch(db, {
31
+ checks: [sql`EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='active' AND version=${previous.version} AND digest IN (${before},${after}))`, sql`NOT EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='bindings' AND digest<>${after})`],
32
+ 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)]
33
+ });
34
+ }
14
35
  /** Explicit deployment step. Mapping changes retain the source until its data migration completes. */
15
36
  async function migrateContentStorageConfig(db, previous, next) {
16
37
  validateContentStorage(previous);
17
38
  validateContentStorage(next);
18
39
  await assertContentIndexFields(db, next);
19
- if (previous.version === next.version) throw new ContentStorageError("INVALID_CONFIG", "A routing configuration change requires a new version.");
40
+ if (previous.version === next.version) {
41
+ await stageContentStorageBindings(db, previous, next);
42
+ const before = await contentDigest(previous), after = await contentDigest(next);
43
+ await atomicBatch(db, {
44
+ 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}))))`],
45
+ 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)]
46
+ });
47
+ return;
48
+ }
20
49
  const oldDigest = await contentDigest(previous);
21
50
  const digest = await contentDigest(next);
22
51
  const installed = (await sql`SELECT version,digest FROM _dineway_content_storage_config WHERE id='active'`.execute(db)).rows[0];
23
52
  if (installed?.version === next.version && installed.digest === digest) return;
24
53
  const checks = [
54
+ sql`NOT EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='bindings')`,
25
55
  sql`NOT EXISTS (SELECT 1 FROM _dineway_content_hook_deliveries WHERE delivered_at IS NULL)`,
26
56
  sql`EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='active' AND version=${previous.version} AND digest=${oldDigest})`,
27
57
  sql`NOT EXISTS (SELECT 1 FROM _dineway_content_partitions WHERE state<>'active')`
@@ -564,4 +594,4 @@ async function rollbackContentMigration(db, migration, archive) {
564
594
  }
565
595
 
566
596
  //#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 };
597
+ export { verifyContentMigration as a, captureContentMigrationSnapshot as c, stageContentStorageBindings as d, stageContentMigrationEntry as i, contentMigrationSnapshotSchema as l, completeContentMigration as n, verifyContentMigrationPage as o, rollbackContentMigration as r, bootstrapContentDirectoryPage as s, activateContentMigrationEntry as t, migrateContentStorageConfig as u };
@@ -1,6 +1,6 @@
1
1
  import { getRequestContext } from "./request-context.mjs";
2
2
  import { after } from "./after.mjs";
3
- import { n as contentStorageCacheScope } from "./runtime-BLoyGKUx.mjs";
3
+ import { n as contentStorageCacheScope } from "./runtime-CmupMaEb.mjs";
4
4
 
5
5
  //#region src/object-cache/codec.ts
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { c as __exportAll } from "./runner-CuG8o1uW.mjs";
2
2
  import { rowUnchanged } from "./database/batch.mjs";
3
- import { t as BylineRepository } from "./byline-BS25s1R-.mjs";
3
+ import { t as BylineRepository } from "./byline-DGTZqRM0.mjs";
4
4
  import { sql } from "kysely";
5
5
 
6
6
  //#region src/content-storage/owned-metadata.ts
@@ -1,4 +1,4 @@
1
- import { Dt as PublicPageSchema, Et as PublicPageImage, F as PageMetadataContribution, M as PageFragmentContribution, Ot as PublicSchemaNode, Tt as PublicPageContext } from "../types-jtUocGnQ.mjs";
1
+ import { Dt as PublicPageSchema, Et as PublicPageImage, F as PageMetadataContribution, M as PageFragmentContribution, Ot as PublicSchemaNode, Tt as PublicPageContext } from "../types-1NHQF2Yh.mjs";
2
2
  import "../types-CG9uGPBL.mjs";
3
3
  import "../runner-DlkOiguI.mjs";
4
4
  import "../index-_fCUsJx9.mjs";
@@ -10,9 +10,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-DvYufwxE.mjs";
14
14
  import "../types-BuplUVZ4.mjs";
15
- import { _ as CreatePublicPageContextInput, a as generateSiteSeoContributions, c as ResolvedPageMetadata, d as renderPageMetadata, f as resolvePageMetadata, g as resolvePageImage, h as imageMetadataContributions, i as generateBaseSeoContributions, l as createSha256CspHash, m as mergePageSchema, n as buildWebSiteJsonLd, o as renderFragments, p as safeJsonLdSerialize, r as cleanJsonLd, s as resolveFragments, t as buildBlogPostingJsonLd, u as escapeHtmlAttr, v as createPublicPageContext } from "../jsonld-BObNyc22.mjs";
15
+ import { _ as CreatePublicPageContextInput, a as generateSiteSeoContributions, c as ResolvedPageMetadata, d as renderPageMetadata, f as resolvePageMetadata, g as resolvePageImage, h as imageMetadataContributions, i as generateBaseSeoContributions, l as createSha256CspHash, m as mergePageSchema, n as buildWebSiteJsonLd, o as renderFragments, p as safeJsonLdSerialize, r as cleanJsonLd, s as resolveFragments, t as buildBlogPostingJsonLd, u as escapeHtmlAttr, v as createPublicPageContext } from "../jsonld-Qr9dwCK4.mjs";
16
16
 
17
17
  //#region src/page/index.d.ts
18
18
  /**
@@ -1,4 +1,4 @@
1
- import "./types-jtUocGnQ.mjs";
1
+ import "./types-1NHQF2Yh.mjs";
2
2
  import "./types-CG9uGPBL.mjs";
3
3
  import "./runner-DlkOiguI.mjs";
4
4
  import "./index-_fCUsJx9.mjs";
@@ -10,7 +10,7 @@ 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-DvYufwxE.mjs";
14
14
  import "./types-BuplUVZ4.mjs";
15
15
  import { DinewayHandlers } from "./astro/types.mjs";
16
16
 
@@ -1,4 +1,4 @@
1
- import { At as ResolvedPlugin, It as StandardPluginDefinition, ko as PluginDescriptor } from "../types-jtUocGnQ.mjs";
1
+ import { At as ResolvedPlugin, It as StandardPluginDefinition, ko as PluginDescriptor } from "../types-1NHQF2Yh.mjs";
2
2
  import "../types-CG9uGPBL.mjs";
3
3
  import "../runner-DlkOiguI.mjs";
4
4
  import "../index-_fCUsJx9.mjs";
@@ -10,7 +10,7 @@ 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-DvYufwxE.mjs";
14
14
  import "../types-BuplUVZ4.mjs";
15
15
 
16
16
  //#region src/plugins/adapt-sandbox-entry.d.ts
@@ -3,8 +3,8 @@ import { t as readRuntimeEnv } from "./runtime-env-DpYGy4pT.mjs";
3
3
  import { i as encodeBase64url, n as decodeBase64url } from "./base64-qvSs0Gxy.mjs";
4
4
  import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-Bb56aCtB.mjs";
5
5
  import { t as OptionsRepository } from "./options-yFkLUuTw.mjs";
6
- import { a as setCronTasksEnabled, n as createPluginContext, t as PluginContextFactory } from "./context-RtLnM2-Z.mjs";
7
- import { d as HookPipeline, p as resolveExclusiveHooks } from "./briefing-yQgD73g4.mjs";
6
+ import { a as setCronTasksEnabled, n as createPluginContext, t as PluginContextFactory } from "./context-BrzB9nTR.mjs";
7
+ import { d as HookPipeline, p as resolveExclusiveHooks } from "./briefing-CQk5h4t6.mjs";
8
8
  import { i as parseEncryptionKeys, t as DinewaySecretsError } from "./secrets-D52WNV_c.mjs";
9
9
  import { t as extractRequestMeta } from "./request-meta-DOBXMRX0.mjs";
10
10
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -1,4 +1,4 @@
1
- import { Oo as DinewayConfig } from "./types-jtUocGnQ.mjs";
1
+ import { Oo as DinewayConfig } from "./types-1NHQF2Yh.mjs";
2
2
 
3
3
  //#region src/api/public-url.d.ts
4
4
  /**
@@ -2,15 +2,15 @@ import { AtomicWriteConflict, atomicBatch, isD1Database, rowUnchanged } from "./
2
2
  import { r as currentIsoTimestampValue } from "./dialect-helpers-C6xtO-Ui.mjs";
3
3
  import { i as encodeCursor, r as decodeCursor } from "./types-BI3ULB3A.mjs";
4
4
  import { r as getOAuthTokenHash, t as SYSTEM_ACTOR_ID } from "./actor-D0AW80ld.mjs";
5
- import { r as prepareContentLifecycleEvents, t as ContentRepository } from "./content-BZBomTNV.mjs";
6
- import { o as invalidateCollectionCache } from "./object-cache-Ue6kAfzf.mjs";
5
+ import { r as prepareContentLifecycleEvents, t as ContentRepository } from "./content-rb8lZEfT.mjs";
6
+ import { o as invalidateCollectionCache } from "./object-cache-DeIkrWmq.mjs";
7
7
  import { t as SiteActivityRepository } from "./site-activity-hpfJkmxQ.mjs";
8
8
  import { n as stableStringify } from "./stable-hash-9RDJgfif.mjs";
9
9
  import { r as ReviewRequestRepository } from "./review-requests-DZYM51yI.mjs";
10
10
  import { i as invalidateRedirectCache } from "./cache-DsEbwFVE.mjs";
11
- import { T as prepareContentPublication } from "./content-write-Bt_eiX9o.mjs";
11
+ import { T as prepareContentPublication } from "./content-write-DPszY76R.mjs";
12
12
  import { n as buildStableActionHash, t as ReviewPayloadBuilder } from "./review-payload-mDJIgcFy.mjs";
13
- import { a as getSiteSettingsWithDb } from "./settings-Bc2eQPR6.mjs";
13
+ import { a as getSiteSettingsWithDb } from "./settings-Dn4XvS7H.mjs";
14
14
  import { n as redactActivityRecord } from "./activity-lyE6xCrf.mjs";
15
15
  import { sql } from "kysely";
16
16
  import { ulid } from "ulidx";
@@ -2,9 +2,9 @@ import { c as __exportAll } from "./runner-CuG8o1uW.mjs";
2
2
  import { getRequestContext } from "./request-context.mjs";
3
3
  import { n as getI18nConfig, r as isI18nEnabled, t as getFallbackChain } from "./config-XW5tMrH8.mjs";
4
4
  import { i as encodeCursor } from "./types-BI3ULB3A.mjs";
5
- import { o as isMissingTableError, s as takeLiveCollectionMeta, t as CURSOR_RAW_VALUES } from "./loader--zFg6meV.mjs";
5
+ import { o as isMissingTableError, s as takeLiveCollectionMeta, t as CURSOR_RAW_VALUES } from "./loader-Q07mEStb.mjs";
6
6
  import { r as requestCached } from "./request-cache-CizvDoxV.mjs";
7
- import { i as contentNamespaces, n as cachedQuery, u as invalidateSchemaObjectCache } from "./object-cache-Ue6kAfzf.mjs";
7
+ import { i as contentNamespaces, n as cachedQuery, u as invalidateSchemaObjectCache } from "./object-cache-DeIkrWmq.mjs";
8
8
 
9
9
  //#region src/visual-editing/editable.ts
10
10
  /**
@@ -597,7 +597,7 @@ async function hydrateEntryBylines(type, entries) {
597
597
  let needsQueryPath = parsed.some((item) => item.credits.length === 0 && (dataStr(item.data, "authorId") !== "" || dataStr(item.data, "primaryBylineId") !== ""));
598
598
  let hasCustomFields = false;
599
599
  if (!needsQueryPath) try {
600
- const { getDb } = await import("./loader--zFg6meV.mjs").then((n) => n.i);
600
+ const { getDb } = await import("./loader-Q07mEStb.mjs").then((n) => n.i);
601
601
  const db = await getDb();
602
602
  const { getBylineFieldDefs } = await import("./field-defs-cache-dn5Tw79A.mjs").then((n) => n.t);
603
603
  hasCustomFields = (await getBylineFieldDefs(db)).length > 0;
@@ -613,7 +613,7 @@ async function hydrateEntryBylines(type, entries) {
613
613
  }
614
614
  }
615
615
  try {
616
- const { getBylinesForEntries } = await import("./bylines-ZRvo3-j0.mjs").then((n) => n.t);
616
+ const { getBylinesForEntries } = await import("./bylines-BO0rdeMa.mjs").then((n) => n.t);
617
617
  const refs = entries.map((entry) => {
618
618
  const data = entryData(entry);
619
619
  const id = dataStr(data, "id");
@@ -671,12 +671,12 @@ async function hydrateEntryTerms(type, entries, locale) {
671
671
  byTaxonomy: grouped
672
672
  });
673
673
  }
674
- const { primeFoldedEntryTerms } = await import("./taxonomies-CVe1PGaO.mjs").then((n) => n.u);
674
+ const { primeFoldedEntryTerms } = await import("./taxonomies-BCuDkFFS.mjs").then((n) => n.u);
675
675
  primeFoldedEntryTerms(type, perEntry, { locale });
676
676
  return;
677
677
  }
678
678
  try {
679
- const { getAllTermsForEntries } = await import("./taxonomies-CVe1PGaO.mjs").then((n) => n.u);
679
+ const { getAllTermsForEntries } = await import("./taxonomies-BCuDkFFS.mjs").then((n) => n.u);
680
680
  const ids = entries.map((entry) => dataStr(entryData(entry), "id")).filter(Boolean);
681
681
  if (ids.length === 0) return;
682
682
  const termsMap = await getAllTermsForEntries(type, ids, { locale });
@@ -710,9 +710,9 @@ async function hydrateEntryTerms(type, entries, locale) {
710
710
  */
711
711
  async function getTranslations(type, id) {
712
712
  try {
713
- const db = (await import("./loader--zFg6meV.mjs").then((n) => n.i)).getDb;
713
+ const db = (await import("./loader-Q07mEStb.mjs").then((n) => n.i)).getDb;
714
714
  const dbInstance = await db();
715
- const { ContentRepository } = await import("./content-BZBomTNV.mjs").then((n) => n.n);
715
+ const { ContentRepository } = await import("./content-rb8lZEfT.mjs").then((n) => n.n);
716
716
  const repo = new ContentRepository(dbInstance);
717
717
  const item = await repo.findByIdOrSlug(type, id);
718
718
  if (!item) return {
@@ -780,8 +780,8 @@ async function resolveDinewayPath(path) {
780
780
  const hasDbOverride = !!getRequestContext()?.db && getRequestContext()?.dbIsIsolated !== false;
781
781
  let patterns = !hasDbOverride ? cachedUrlPatterns : null;
782
782
  if (!patterns) {
783
- const { getDb } = await import("./loader--zFg6meV.mjs").then((n) => n.i);
784
- const { SchemaRegistry } = await import("./registry-DEKqjKIM.mjs").then((n) => n.r);
783
+ const { getDb } = await import("./loader-Q07mEStb.mjs").then((n) => n.i);
784
+ const { SchemaRegistry } = await import("./registry-BpNZLrXn.mjs").then((n) => n.r);
785
785
  patterns = (await new SchemaRegistry(await getDb()).listCollections()).filter((collection) => collection.urlPattern).map((collection) => {
786
786
  const { regex, paramNames } = patternToRegex(collection.urlPattern);
787
787
  return {
@@ -1,7 +1,7 @@
1
- import { r as getDb } from "./loader--zFg6meV.mjs";
1
+ import { r as getDb } from "./loader-Q07mEStb.mjs";
2
2
  import { r as requestCached } from "./request-cache-CizvDoxV.mjs";
3
- import { n as cachedQuery, t as CacheNamespace } from "./object-cache-Ue6kAfzf.mjs";
4
- import { n as SchemaRegistry } from "./registry-DEKqjKIM.mjs";
3
+ import { n as cachedQuery, t as CacheNamespace } from "./object-cache-DeIkrWmq.mjs";
4
+ import { n as SchemaRegistry } from "./registry-BpNZLrXn.mjs";
5
5
 
6
6
  //#region src/schema/query.ts
7
7
  /**
@@ -6,7 +6,7 @@ import { n as contentLocaleUpdatedIndexName, t as contentLocaleCreatedIndexName
6
6
  import { a as RESERVED_COLLECTION_SLUGS, o as RESERVED_FIELD_SLUGS, r as FIELD_TYPE_TO_COLUMN } from "./types-BgUxCuwu.mjs";
7
7
  import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-Bb56aCtB.mjs";
8
8
  import { t as buildStableHash } from "./stable-hash-9RDJgfif.mjs";
9
- import { a as markContentMediaUsageCollectionStaleSafely, n as deleteContentMediaUsageCollection } from "./content-refresh-DbGFLB3p.mjs";
9
+ import { a as markContentMediaUsageCollectionStaleSafely, n as deleteContentMediaUsageCollection } from "./content-refresh-Dl938dTm.mjs";
10
10
  import { r as parseSearchConfig, t as FTSManager } from "./fts-manager-BHwhq1lC.mjs";
11
11
  import { t as parsePublicDiscoveryRules } from "./public-discovery-CGRirTJH.mjs";
12
12
  import { sql } from "kysely";
@@ -21,17 +21,7 @@ interface RequestMetrics {
21
21
  rowsRead: number;
22
22
  rowsWritten: number;
23
23
  };
24
- contentStores?: {
25
- calls: number;
26
- queueMs: number;
27
- totalMs: number;
28
- serviceMs: number;
29
- databaseMs: number;
30
- sqlMs: number;
31
- statements: number;
32
- rowsRead: number;
33
- rowsWritten: number;
34
- };
24
+ contentStores?: RequestMetrics["d1"];
35
25
  dbCount: number;
36
26
  dbTotalMs: number;
37
27
  dbFirstOffset: number | null;
@@ -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-C_DNrA5y.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 { d as contentPartitionWritable, r as getContentStorage } from "./runtime-CmupMaEb.mjs";
4
+ import { n as readRevisionDataBatch, t as readRevisionData } from "./revisions-DnV1P4O5.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
1
  import { o as ContentStorageError } from "./config---A7Bg68.mjs";
2
- import { r as getContentStorage } from "./runtime-BLoyGKUx.mjs";
2
+ import { r as getContentStorage } from "./runtime-CmupMaEb.mjs";
3
3
  import { z } from "zod";
4
4
 
5
5
  //#region src/content-storage/revisions.ts
@@ -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();
@@ -597,4 +599,4 @@ async function hydrateContentRows(db, collection, rows, fields, publicLoaderRead
597
599
  }
598
600
 
599
601
  //#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 };
602
+ export { extractPlainText as _, hydrateContentRows as a, prepareContentChangeJournal as b, installContentStorageConfig as c, contentPartitionWritable as d, freezeContentPartition as f, prepareContentProjection as g, contentProjectionValues as h, getContentStorageRuntime as i, beginContentMigration as l, assertContentIndexFields as m, contentStorageCacheScope as n, registerContentStorage as o, readContentPartitionRoute as p, getContentStorage as r, ContentStorageCoordinator as s, assertContentStorageConfiguration as t, cancelContentMigration as u, extractSearchableFields as v, contentChangeSequence as y };
@@ -1,4 +1,4 @@
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-1NHQF2Yh.mjs";
2
2
  import "./types-CG9uGPBL.mjs";
3
3
  import "./runner-DlkOiguI.mjs";
4
4
  import "./index-_fCUsJx9.mjs";
@@ -10,7 +10,7 @@ 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-DvYufwxE.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
@@ -2,12 +2,12 @@ import { withPrimaryDatabase } from "./request-context.mjs";
2
2
  import "./d1-binding-DrLMBUxu.mjs";
3
3
  import "./dialect-helpers-C6xtO-Ui.mjs";
4
4
  import "./config---A7Bg68.mjs";
5
- import "./runtime-BLoyGKUx.mjs";
6
- import "./revisions-CQZI886L.mjs";
5
+ import "./runtime-CmupMaEb.mjs";
6
+ import "./revisions-DnV1P4O5.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-Q07mEStb.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-BpNZLrXn.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-Q07mEStb.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-Q07mEStb.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
3
  import "../config---A7Bg68.mjs";
4
- import "../runtime-BLoyGKUx.mjs";
5
- import "../revisions-CQZI886L.mjs";
4
+ import "../runtime-CmupMaEb.mjs";
5
+ import "../revisions-DnV1P4O5.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-Q07mEStb.mjs";
10
10
  import "../actor-D0AW80ld.mjs";
11
11
  import "../atomic-authority-Bf5QZboB.mjs";
12
- import "../content-BZBomTNV.mjs";
12
+ import "../content-rb8lZEfT.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-DeIkrWmq.mjs";
17
+ import "../byline-DGTZqRM0.mjs";
18
+ import "../owned-metadata-LUF0xC0h.mjs";
19
+ import "../revision-DfrRhPgw.mjs";
20
20
  import "../media-BjH5OD-A.mjs";
21
21
  import "../user-Bl2_8rhJ.mjs";
22
22
  import "../terms-EskuqbKE.mjs";
23
- import "../taxonomy-CcyZD5jQ.mjs";
23
+ import "../taxonomy-YxipNvfL.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-DPszY76R.mjs";
27
+ import "../version-store-B2n_Gfkq.mjs";
28
+ import "../write-intent-4Q8sNg11.mjs";
29
+ import "../seo-TWEsRapq.mjs";
30
+ import "../content-refresh-Dl938dTm.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-BpNZLrXn.mjs";
35
+ import "../settings-Dn4XvS7H.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-AOuBTila.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