@elytracms/studio 0.0.91 → 0.0.93

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 (353) hide show
  1. package/convex/asset-alt-migration.test.ts +127 -0
  2. package/convex/asset-replace.test.ts +168 -0
  3. package/convex/asset-revalidate.test.ts +6 -6
  4. package/convex/assets.ts +41 -5
  5. package/convex/cms.ts +537 -177
  6. package/convex/contract-parity.test.ts +173 -19
  7. package/convex/delivery.ts +26 -13
  8. package/convex/document-revalidate.test.ts +17 -16
  9. package/convex/orphan-hydration.test.ts +116 -0
  10. package/convex/presence-cost.test.ts +89 -0
  11. package/convex/rail-write-parity.test.ts +17 -14
  12. package/convex/referenceMaintenance.ts +15 -15
  13. package/convex/schema.ts +70 -5
  14. package/convex/triggers.ts +21 -8
  15. package/convex/write-limits.ts +1 -1
  16. package/dist/components/ai/ai-chat-panel.js +33 -22
  17. package/dist/components/ai/ai-chat-panel.js.map +1 -1
  18. package/dist/components/ai/proposal-card.js +2 -1
  19. package/dist/components/ai/proposal-card.js.map +1 -1
  20. package/dist/components/ai/translate-document-action.d.ts +8 -2
  21. package/dist/components/ai/translate-document-action.js.map +1 -1
  22. package/dist/components/ai/translate-document-dialog.d.ts +1 -1
  23. package/dist/components/ai/translate-document-dialog.js +14 -8
  24. package/dist/components/ai/translate-document-dialog.js.map +1 -1
  25. package/dist/components/ai/translate-skipped.d.ts +19 -0
  26. package/dist/components/ai/translate-skipped.js +46 -0
  27. package/dist/components/ai/translate-skipped.js.map +1 -0
  28. package/dist/components/app-views/default-modules.d.ts +23 -6
  29. package/dist/components/app-views/default-modules.js +33 -14
  30. package/dist/components/app-views/default-modules.js.map +1 -1
  31. package/dist/components/assets/asset-detail.js +18 -8
  32. package/dist/components/assets/asset-detail.js.map +1 -1
  33. package/dist/components/assets/asset-metadata.d.ts +15 -4
  34. package/dist/components/assets/asset-metadata.js +15 -2
  35. package/dist/components/assets/asset-metadata.js.map +1 -1
  36. package/dist/components/assets/asset-search.js +4 -1
  37. package/dist/components/assets/asset-search.js.map +1 -1
  38. package/dist/components/assets/asset-selection.d.ts +0 -8
  39. package/dist/components/assets/asset-selection.js +4 -23
  40. package/dist/components/assets/asset-selection.js.map +1 -1
  41. package/dist/components/assets/asset-thumb.js +3 -2
  42. package/dist/components/assets/asset-thumb.js.map +1 -1
  43. package/dist/components/assets/assets-collection-view-source.d.ts +3 -3
  44. package/dist/components/assets/assets-collection-view-source.js +9 -5
  45. package/dist/components/assets/assets-collection-view-source.js.map +1 -1
  46. package/dist/components/assets/assets-store.d.ts +14 -0
  47. package/dist/components/assets/assets-store.js +23 -1
  48. package/dist/components/assets/assets-store.js.map +1 -1
  49. package/dist/components/assets/replace-file.d.ts +22 -0
  50. package/dist/components/assets/replace-file.js +59 -0
  51. package/dist/components/assets/replace-file.js.map +1 -0
  52. package/dist/components/builder/blocks-model.d.ts +14 -26
  53. package/dist/components/builder/blocks-model.js +35 -41
  54. package/dist/components/builder/blocks-model.js.map +1 -1
  55. package/dist/components/builder/blocks-panel.d.ts +7 -3
  56. package/dist/components/builder/blocks-panel.js +6 -5
  57. package/dist/components/builder/blocks-panel.js.map +1 -1
  58. package/dist/components/builder/builder-store.d.ts +126 -30
  59. package/dist/components/builder/builder-store.js +169 -67
  60. package/dist/components/builder/builder-store.js.map +1 -1
  61. package/dist/components/builder/canvas-body.d.ts +30 -0
  62. package/dist/components/builder/canvas-body.js +38 -0
  63. package/dist/components/builder/canvas-body.js.map +1 -0
  64. package/dist/components/builder/canvas-chrome-css.js +7 -0
  65. package/dist/components/builder/canvas-chrome-css.js.map +1 -1
  66. package/dist/components/builder/canvas-dnd.d.ts +7 -7
  67. package/dist/components/builder/canvas-dnd.js +5 -5
  68. package/dist/components/builder/canvas-dnd.js.map +1 -1
  69. package/dist/components/builder/canvas-render-context.d.ts +30 -22
  70. package/dist/components/builder/canvas-render-context.js +44 -44
  71. package/dist/components/builder/canvas-render-context.js.map +1 -1
  72. package/dist/components/builder/canvas-runs.d.ts +45 -0
  73. package/dist/components/builder/canvas-runs.js +51 -0
  74. package/dist/components/builder/canvas-runs.js.map +1 -0
  75. package/dist/components/builder/canvas.d.ts +5 -4
  76. package/dist/components/builder/canvas.js +34 -6
  77. package/dist/components/builder/canvas.js.map +1 -1
  78. package/dist/components/builder/clipboard-actions.d.ts +15 -0
  79. package/dist/components/builder/clipboard-actions.js +50 -13
  80. package/dist/components/builder/clipboard-actions.js.map +1 -1
  81. package/dist/components/builder/composition-field-editor.d.ts +10 -16
  82. package/dist/components/builder/composition-field-editor.js +30 -40
  83. package/dist/components/builder/composition-field-editor.js.map +1 -1
  84. package/dist/components/builder/composition-patches.d.ts +7 -0
  85. package/dist/components/builder/composition-patches.js +256 -0
  86. package/dist/components/builder/composition-patches.js.map +1 -0
  87. package/dist/components/builder/delete-key.d.ts +5 -0
  88. package/dist/components/builder/delete-key.js +4 -0
  89. package/dist/components/builder/delete-key.js.map +1 -1
  90. package/dist/components/builder/insert-context.d.ts +17 -25
  91. package/dist/components/builder/insert-context.js +45 -92
  92. package/dist/components/builder/insert-context.js.map +1 -1
  93. package/dist/components/builder/page-tree.d.ts +3 -3
  94. package/dist/components/builder/page-tree.js +3 -3
  95. package/dist/components/builder/page-tree.js.map +1 -1
  96. package/dist/components/builder/placement-refusal.d.ts +18 -0
  97. package/dist/components/builder/placement-refusal.js +46 -0
  98. package/dist/components/builder/placement-refusal.js.map +1 -0
  99. package/dist/components/builder/property-inspector.js +4 -0
  100. package/dist/components/builder/property-inspector.js.map +1 -1
  101. package/dist/components/builder/reuse-context.js +65 -26
  102. package/dist/components/builder/reuse-context.js.map +1 -1
  103. package/dist/components/builder/reuse.d.ts +79 -8
  104. package/dist/components/builder/reuse.js +71 -23
  105. package/dist/components/builder/reuse.js.map +1 -1
  106. package/dist/components/builder/run-inspector.d.ts +11 -0
  107. package/dist/components/builder/run-inspector.js +33 -0
  108. package/dist/components/builder/run-inspector.js.map +1 -0
  109. package/dist/components/cms/asset-field.d.ts +38 -1
  110. package/dist/components/cms/asset-field.js +182 -58
  111. package/dist/components/cms/asset-field.js.map +1 -1
  112. package/dist/components/cms/asset-picker-core.d.ts +16 -0
  113. package/dist/components/cms/asset-picker-core.js +20 -0
  114. package/dist/components/cms/asset-picker-core.js.map +1 -1
  115. package/dist/components/cms/asset-picker.js +12 -18
  116. package/dist/components/cms/asset-picker.js.map +1 -1
  117. package/dist/components/cms/bulk-actions.d.ts +4 -20
  118. package/dist/components/cms/bulk-actions.js +3 -24
  119. package/dist/components/cms/bulk-actions.js.map +1 -1
  120. package/dist/components/cms/cell-edit.d.ts +5 -5
  121. package/dist/components/cms/cell-edit.js.map +1 -1
  122. package/dist/components/cms/cell.js.map +1 -1
  123. package/dist/components/cms/cms-store.d.ts +87 -45
  124. package/dist/components/cms/cms-store.js +347 -203
  125. package/dist/components/cms/cms-store.js.map +1 -1
  126. package/dist/components/cms/collection-table.js +7 -2
  127. package/dist/components/cms/collection-table.js.map +1 -1
  128. package/dist/components/cms/commit-policy.d.ts +24 -0
  129. package/dist/components/cms/commit-policy.js +37 -0
  130. package/dist/components/cms/commit-policy.js.map +1 -0
  131. package/dist/components/cms/detail-editor.js +83 -137
  132. package/dist/components/cms/detail-editor.js.map +1 -1
  133. package/dist/components/cms/document-diff-view.d.ts +3 -1
  134. package/dist/components/cms/document-diff-view.js +12 -7
  135. package/dist/components/cms/document-diff-view.js.map +1 -1
  136. package/dist/components/cms/draft-commit.d.ts +70 -0
  137. package/dist/components/cms/draft-commit.js +82 -0
  138. package/dist/components/cms/draft-commit.js.map +1 -0
  139. package/dist/components/cms/duplicate-document.d.ts +11 -13
  140. package/dist/components/cms/duplicate-document.js +26 -34
  141. package/dist/components/cms/duplicate-document.js.map +1 -1
  142. package/dist/components/cms/field-anchors.d.ts +7 -4
  143. package/dist/components/cms/field-anchors.js +9 -7
  144. package/dist/components/cms/field-anchors.js.map +1 -1
  145. package/dist/components/cms/field-collaboration.d.ts +47 -0
  146. package/dist/components/cms/field-collaboration.js +87 -0
  147. package/dist/components/cms/field-collaboration.js.map +1 -0
  148. package/dist/components/cms/field-control-lib.d.ts +22 -1
  149. package/dist/components/cms/field-control-lib.js +33 -4
  150. package/dist/components/cms/field-control-lib.js.map +1 -1
  151. package/dist/components/cms/field-control.js +17 -14
  152. package/dist/components/cms/field-control.js.map +1 -1
  153. package/dist/components/cms/gate-validation.d.ts +21 -30
  154. package/dist/components/cms/gate-validation.js +11 -22
  155. package/dist/components/cms/gate-validation.js.map +1 -1
  156. package/dist/components/cms/object-array-field.js +4 -4
  157. package/dist/components/cms/object-array-field.js.map +1 -1
  158. package/dist/components/cms/prop-fields.d.ts +7 -2
  159. package/dist/components/cms/prop-fields.js +13 -6
  160. package/dist/components/cms/prop-fields.js.map +1 -1
  161. package/dist/components/cms/reference-confirm.js +10 -4
  162. package/dist/components/cms/reference-confirm.js.map +1 -1
  163. package/dist/components/cms/rich-text/embed-picker.d.ts +1 -1
  164. package/dist/components/cms/rich-text/embed-picker.js.map +1 -1
  165. package/dist/components/cms/rich-text/insert.d.ts +20 -9
  166. package/dist/components/cms/rich-text/insert.js +25 -17
  167. package/dist/components/cms/rich-text/insert.js.map +1 -1
  168. package/dist/components/cms/use-document-draft.d.ts +96 -0
  169. package/dist/components/cms/use-document-draft.js +283 -0
  170. package/dist/components/cms/use-document-draft.js.map +1 -0
  171. package/dist/components/cms/use-document-versions.js +2 -2
  172. package/dist/components/cms/use-document-versions.js.map +1 -1
  173. package/dist/components/cms/use-live-url.d.ts +6 -12
  174. package/dist/components/cms/use-live-url.js +16 -15
  175. package/dist/components/cms/use-live-url.js.map +1 -1
  176. package/dist/components/cms/use-publish-controller.d.ts +13 -18
  177. package/dist/components/cms/use-publish-controller.js +24 -41
  178. package/dist/components/cms/use-publish-controller.js.map +1 -1
  179. package/dist/components/cms/use-published-perspective.d.ts +2 -3
  180. package/dist/components/cms/use-published-perspective.js +4 -3
  181. package/dist/components/cms/use-published-perspective.js.map +1 -1
  182. package/dist/components/cms/versions-pane.js +8 -1
  183. package/dist/components/cms/versions-pane.js.map +1 -1
  184. package/dist/components/collection-view/cms-collection-view-source.js +24 -7
  185. package/dist/components/collection-view/cms-collection-view-source.js.map +1 -1
  186. package/dist/components/components/transfer-dialog.js +28 -23
  187. package/dist/components/components/transfer-dialog.js.map +1 -1
  188. package/dist/components/components/transfer.d.ts +31 -21
  189. package/dist/components/components/transfer.js +49 -35
  190. package/dist/components/components/transfer.js.map +1 -1
  191. package/dist/components/project-list.js.map +1 -1
  192. package/dist/components/project-session.d.ts +6 -3
  193. package/dist/components/project-session.js +14 -8
  194. package/dist/components/project-session.js.map +1 -1
  195. package/dist/components/project-switcher.js.map +1 -1
  196. package/dist/components/rail-view-source.js +2 -1
  197. package/dist/components/rail-view-source.js.map +1 -1
  198. package/dist/components/section-nav.js +1 -1
  199. package/dist/components/section-nav.js.map +1 -1
  200. package/dist/lib/ai/apply-content.js +56 -116
  201. package/dist/lib/ai/apply-content.js.map +1 -1
  202. package/dist/lib/ai/chat-context.d.ts +8 -0
  203. package/dist/lib/ai/chat-context.js +37 -6
  204. package/dist/lib/ai/chat-context.js.map +1 -1
  205. package/dist/lib/ai/chat-state.d.ts +14 -1
  206. package/dist/lib/ai/chat-state.js.map +1 -1
  207. package/dist/lib/ai/constraints.d.ts +20 -5
  208. package/dist/lib/ai/constraints.js +125 -33
  209. package/dist/lib/ai/constraints.js.map +1 -1
  210. package/dist/lib/ai/fake-provider.d.ts +16 -3
  211. package/dist/lib/ai/fake-provider.js +22 -6
  212. package/dist/lib/ai/fake-provider.js.map +1 -1
  213. package/dist/lib/ai/index.d.ts +2 -0
  214. package/dist/lib/ai/index.js +2 -0
  215. package/dist/lib/ai/index.js.map +1 -1
  216. package/dist/lib/ai/leash.d.ts +34 -0
  217. package/dist/lib/ai/leash.js +28 -0
  218. package/dist/lib/ai/leash.js.map +1 -0
  219. package/dist/lib/ai/provenance.d.ts +1 -1
  220. package/dist/lib/ai/provenance.js.map +1 -1
  221. package/dist/lib/ai/rich-text-input.d.ts +8 -8
  222. package/dist/lib/ai/rich-text-input.js +2 -1
  223. package/dist/lib/ai/rich-text-input.js.map +1 -1
  224. package/dist/lib/ai/rich-text-translate.d.ts +27 -4
  225. package/dist/lib/ai/rich-text-translate.js +28 -10
  226. package/dist/lib/ai/rich-text-translate.js.map +1 -1
  227. package/dist/lib/ai/shape.d.ts +13 -13
  228. package/dist/lib/ai/shape.js +69 -93
  229. package/dist/lib/ai/shape.js.map +1 -1
  230. package/dist/lib/ai/tools.d.ts +36 -41
  231. package/dist/lib/ai/tools.js +85 -87
  232. package/dist/lib/ai/tools.js.map +1 -1
  233. package/dist/lib/ai/translate-document.d.ts +39 -5
  234. package/dist/lib/ai/translate-document.js +160 -51
  235. package/dist/lib/ai/translate-document.js.map +1 -1
  236. package/dist/lib/ai/types.d.ts +34 -23
  237. package/dist/lib/ai/types.js.map +1 -1
  238. package/dist/lib/ai/update-fields.d.ts +21 -12
  239. package/dist/lib/ai/update-fields.js +118 -177
  240. package/dist/lib/ai/update-fields.js.map +1 -1
  241. package/dist/lib/ai/writer-form.d.ts +116 -0
  242. package/dist/lib/ai/writer-form.js +429 -0
  243. package/dist/lib/ai/writer-form.js.map +1 -0
  244. package/dist/lib/ai-current-document.d.ts +11 -11
  245. package/dist/lib/ai-current-document.js +4 -4
  246. package/dist/lib/ai-current-document.js.map +1 -1
  247. package/dist/lib/assets/upload.d.ts +31 -2
  248. package/dist/lib/assets/upload.js +61 -6
  249. package/dist/lib/assets/upload.js.map +1 -1
  250. package/dist/lib/clipboard/os-clipboard.d.ts +10 -2
  251. package/dist/lib/clipboard/os-clipboard.js +8 -4
  252. package/dist/lib/clipboard/os-clipboard.js.map +1 -1
  253. package/dist/lib/clipboard/paste-target.d.ts +18 -9
  254. package/dist/lib/clipboard/paste-target.js +8 -7
  255. package/dist/lib/clipboard/paste-target.js.map +1 -1
  256. package/dist/lib/cms/field-patch.d.ts +15 -0
  257. package/dist/lib/cms/field-patch.js +25 -0
  258. package/dist/lib/cms/field-patch.js.map +1 -0
  259. package/dist/lib/cms/published-documents.d.ts +1 -1
  260. package/dist/lib/cms/published-documents.js +1 -1
  261. package/dist/lib/cms/published-documents.js.map +1 -1
  262. package/dist/lib/cms-views/view-model.d.ts +3 -3
  263. package/dist/lib/collection-view/__fixtures__/document-writes.d.ts +6 -0
  264. package/dist/lib/collection-view/__fixtures__/document-writes.js +23 -0
  265. package/dist/lib/collection-view/__fixtures__/document-writes.js.map +1 -0
  266. package/dist/lib/collection-view/collection-view-source.d.ts +69 -6
  267. package/dist/lib/collection-view/collection-view-source.js.map +1 -1
  268. package/dist/lib/data/collection-content.d.ts +4 -13
  269. package/dist/lib/data/collection-content.js +11 -5
  270. package/dist/lib/data/collection-content.js.map +1 -1
  271. package/dist/lib/dnd/drop-rules.d.ts +25 -31
  272. package/dist/lib/dnd/drop-rules.js +53 -59
  273. package/dist/lib/dnd/drop-rules.js.map +1 -1
  274. package/dist/lib/engine-version.d.ts +1 -1
  275. package/dist/lib/engine-version.js +1 -1
  276. package/dist/lib/engine-version.js.map +1 -1
  277. package/dist/lib/i18n/messages.de.js +72 -15
  278. package/dist/lib/i18n/messages.de.js.map +1 -1
  279. package/dist/lib/i18n/messages.en.d.ts +61 -12
  280. package/dist/lib/i18n/messages.en.js +76 -16
  281. package/dist/lib/i18n/messages.en.js.map +1 -1
  282. package/dist/lib/operations/__fixtures__/write-document.d.ts +30 -0
  283. package/dist/lib/operations/__fixtures__/write-document.js +16 -0
  284. package/dist/lib/operations/__fixtures__/write-document.js.map +1 -0
  285. package/dist/lib/operations/cms-persistence.d.ts +124 -31
  286. package/dist/lib/operations/cms-persistence.js +447 -68
  287. package/dist/lib/operations/cms-persistence.js.map +1 -1
  288. package/dist/lib/operations/config-manifest-lookup.d.ts +35 -0
  289. package/dist/lib/operations/config-manifest-lookup.js +56 -0
  290. package/dist/lib/operations/config-manifest-lookup.js.map +1 -0
  291. package/dist/lib/operations/project-runtime-config.d.ts +39 -0
  292. package/dist/lib/operations/project-runtime-config.js +54 -0
  293. package/dist/lib/operations/project-runtime-config.js.map +1 -0
  294. package/dist/lib/operations/publish-with-revision.d.ts +64 -0
  295. package/dist/lib/operations/publish-with-revision.js +66 -0
  296. package/dist/lib/operations/publish-with-revision.js.map +1 -0
  297. package/dist/lib/operations/runtime-validator.d.ts +32 -0
  298. package/dist/lib/operations/runtime-validator.js +18 -0
  299. package/dist/lib/operations/runtime-validator.js.map +1 -0
  300. package/dist/lib/operations/session-hydration.d.ts +31 -14
  301. package/dist/lib/operations/session-hydration.js +12 -16
  302. package/dist/lib/operations/session-hydration.js.map +1 -1
  303. package/dist/lib/operations/studio-operations.d.ts +59 -2
  304. package/dist/lib/operations/studio-operations.js +76 -14
  305. package/dist/lib/operations/studio-operations.js.map +1 -1
  306. package/dist/lib/persistence/convex-adapter.d.ts +13 -5
  307. package/dist/lib/persistence/convex-adapter.js +189 -74
  308. package/dist/lib/persistence/convex-adapter.js.map +1 -1
  309. package/dist/lib/persistence/convex-client.d.ts +65 -5
  310. package/dist/lib/persistence/convex-client.js +106 -3
  311. package/dist/lib/persistence/convex-client.js.map +1 -1
  312. package/dist/lib/persistence/index.js +17 -18
  313. package/dist/lib/persistence/index.js.map +1 -1
  314. package/dist/lib/persona/labels.js +4 -1
  315. package/dist/lib/persona/labels.js.map +1 -1
  316. package/dist/lib/query/operations-query.d.ts +1 -1
  317. package/dist/lib/query/operations-query.js +1 -1
  318. package/dist/lib/query/operations-query.js.map +1 -1
  319. package/dist/lib/references/impact.d.ts +21 -15
  320. package/dist/lib/references/impact.js +13 -26
  321. package/dist/lib/references/impact.js.map +1 -1
  322. package/dist/lib/references/references-store.d.ts +9 -0
  323. package/dist/lib/references/references-store.js +24 -4
  324. package/dist/lib/references/references-store.js.map +1 -1
  325. package/dist/lib/routes/route-issues.d.ts +6 -6
  326. package/dist/lib/routes/route-issues.js +26 -80
  327. package/dist/lib/routes/route-issues.js.map +1 -1
  328. package/dist/lib/workspace/config-issues.js +2 -1
  329. package/dist/lib/workspace/config-issues.js.map +1 -1
  330. package/dist/lib/workspace/index.d.ts +31 -1
  331. package/dist/lib/workspace/index.js +64 -17
  332. package/dist/lib/workspace/index.js.map +1 -1
  333. package/dist/lib/workspace/switcher-source.d.ts +3 -3
  334. package/dist/lib/workspace/switcher-source.js.map +1 -1
  335. package/dist/lib/workspace/workspace-source.d.ts +2 -2
  336. package/dist/lib/workspace/workspace-source.js +2 -1
  337. package/dist/lib/workspace/workspace-source.js.map +1 -1
  338. package/package.json +3 -3
  339. package/dist/components/cms/cms-composition-validators.d.ts +0 -16
  340. package/dist/components/cms/cms-composition-validators.js +0 -133
  341. package/dist/components/cms/cms-composition-validators.js.map +0 -1
  342. package/dist/components/cms/publish-clean.d.ts +0 -28
  343. package/dist/components/cms/publish-clean.js +0 -38
  344. package/dist/components/cms/publish-clean.js.map +0 -1
  345. package/dist/components/cms/use-save-mode.d.ts +0 -35
  346. package/dist/components/cms/use-save-mode.js +0 -54
  347. package/dist/components/cms/use-save-mode.js.map +0 -1
  348. package/dist/lib/assets/asset-placements.d.ts +0 -28
  349. package/dist/lib/assets/asset-placements.js +0 -83
  350. package/dist/lib/assets/asset-placements.js.map +0 -1
  351. package/dist/lib/cms/document-gate.d.ts +0 -47
  352. package/dist/lib/cms/document-gate.js +0 -61
  353. package/dist/lib/cms/document-gate.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cms-store.js","sourceRoot":"","sources":["../../../src/components/cms/cms-store.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n createCollectionRegistry,\n createDocumentStore,\n documentKey,\n documentReachabilityIssues,\n documentSchema,\n resolveDocumentTitle,\n seedDefaults,\n resolveSingletonDocument,\n titleFieldOf,\n validateDocument,\n valuesInLocale,\n writeField,\n} from '@elytracms/core/cms-core'\nimport type {\n CmsDocument,\n CmsValidationIssue,\n CollectionDef,\n CollectionRegistry,\n DocumentRef,\n FieldDef,\n Locale,\n LocaleConfig,\n LocalizedString,\n RestoreScope,\n ValidateDocumentOptions,\n} from '@elytracms/core/cms-core'\nimport type { CmsDocumentRecord, DocumentVersionRecord } from '@elytracms/core/persistence'\nimport { translate } from '@elytracms/studio/lib/i18n'\nimport { configureStudioLocales, useStudioLocale } from '@elytracms/studio/lib/locale'\nimport { studioManifestLookup } from '@elytracms/studio/lib/registry'\nimport {\n resolveDeploymentCollections,\n resolveDeploymentLocaleConfig,\n resolveDeploymentRoutes,\n} from '@elytracms/studio/lib/workspace'\nimport { Heading, Panel, Stack, Text } from '@elytracms/studio/ui'\nimport { assetLibraryOracle, gateValidateOptions } from './gate-validation'\nimport {\n clearSessionDocumentValidator,\n setSessionDocumentValidator,\n} from '@elytracms/studio/lib/cms/document-gate'\nimport type { SessionDocumentValidator } from '@elytracms/studio/lib/cms/document-gate'\nimport { matchesRef, removeDoc, replaceDoc, upsertDoc } from './document-ref-utils'\nimport { createRequiredContext } from '@elytracms/studio/lib/required-context'\nimport { createCmsPersister, getStudioOperations } from '@elytracms/studio/lib/operations'\nimport type {\n CmsPersister,\n OperationError,\n OperationResult,\n} from '@elytracms/studio/lib/operations'\nimport {\n ALL_VIEW_ID,\n DEFAULT_VIEW_OVERRIDE_ID,\n canonicalViewState,\n configViewIssues,\n defaultConfigViewId,\n defaultViewState,\n deprecatedDefaultFlagViewIds,\n hasDefaultViewOverride,\n pseudoColumns,\n resolveCollectionViews,\n viewStatesEqual,\n} from '@elytracms/studio/lib/cms-views'\nimport type { TableViewState } from '@elytracms/studio/lib/cms-views'\nimport { useOptionalAssets } from '../assets/assets-store'\nimport { consumeStagedDocuments } from './document-staging'\nimport { commitCellEdit } from './cell-edit'\nimport type { CellCommitInput, CellCommitOutcome } from './cell-edit'\nimport { runBulkAction } from './bulk-actions'\nimport type { BulkAction, BulkReport, BulkSetField } from './bulk-actions'\nimport { cleanHiddenForPublish } from './publish-clean'\n\n/**\n * A resolved table view: a named bundle of filters (closed AD-3 vocabulary),\n * sort, and visible/ordered columns. EC-246b: named views are **config-as-code**\n * (declared in `cms/`, read live via `configViewsFor`) — the editor-owned DB\n * saved-view store (EC-169) is retired. The unnamed \"All documents\" default is\n * derived per collection; editors keep only transient in-session tweaks + Reset.\n */\nexport interface SavedView {\n id: string\n /**\n * The view label — a {@link LocalizedString} (EC-343): the built-in \"All\" default is\n * a plain translated string; a config view's name may be a `{ locale }` map, resolved\n * at the render site (`ViewTabs`) via the same `resolveLabel` path as `form.label`.\n */\n name: LocalizedString\n state: TableViewState\n}\n\nexport interface ImportReport {\n added: number\n rejected: { id: string; issues: CmsValidationIssue[] }[]\n}\n\n/**\n * A document's recorded version history plus its live pin (EC-224), as the\n * Versions inspector pane reads it. `versions` is newest-first; `publishedVersion`\n * is the recorded version currently pinned live, absent when unpublished.\n */\nexport interface DocumentVersionsView {\n versions: DocumentVersionRecord[]\n publishedVersion?: number\n}\n\nexport interface CmsStore {\n /** The project this CMS session edits (set when persistence is enabled); the asset picker scopes the real library by it (EC-152). */\n projectId?: string\n collections: readonly CollectionDef[]\n localeConfig: LocaleConfig\n /**\n * The studio's ambient active locale (EC-176): table cells, detail forms,\n * and inline edits all display and write THIS locale. Switched once via the\n * shared `LocaleSwitcher`, never per control.\n */\n activeLocale: Locale\n getCollection(id: string): CollectionDef | undefined\n documentsOf(collectionId: string): CmsDocument[]\n getDocument(ref: DocumentRef): CmsDocument | undefined\n /** Resolve a relation/asset target's display title. */\n titleOf(ref: DocumentRef): string\n saveDocument(doc: CmsDocument): void\n /**\n * Commit ONE field edit from the table (EC-168): optimistic session apply +\n * exactly one `documents.upsert` operations command, awaited. Validation\n * failures and operation rejections return a structured error (the caller\n * renders it on the cell) and leave the session rolled back.\n */\n commitFieldEdit(input: CellCommitInput): Promise<CellCommitOutcome>\n createDocument(collectionId: string): DocumentRef\n /**\n * Ensure a singleton collection's lone document exists and return its ref\n * (EC-274). Resolves the existing single document, or creates one with a normal\n * generated id (never the collection id). Idempotent. The singleton route opens\n * through this so the one document always exists to edit.\n */\n ensureSingletonDocument(collectionId: string): DocumentRef\n deleteDocument(ref: DocumentRef): void\n /**\n * Is this document currently published? Sourced from the version POINTER\n * (EC-224), not the flat `state` enum — seeded from hydration and updated by\n * {@link publishDocument}/{@link unpublishDocument}.\n */\n isPublished(ref: DocumentRef): boolean\n /**\n * The record's last-write ISO timestamp (EC-445) — the data behind the\n * `$updatedAt` list column. Seeded from hydration (connected: the persisted\n * `cmsDocuments.updatedAt`; playground: session-start for the seeded fixtures),\n * then re-stamped on the common edit paths. `undefined` for a ref the session\n * has no timestamp for. See {@link documentPublishedAt} for the publish-instant column.\n */\n documentUpdatedAt(ref: DocumentRef): string | undefined\n /**\n * The record's FIRST-publish ISO instant (EC-447) — the data behind the\n * `$publishedAt` list column. Seeded from hydration (the persisted\n * `cmsDocuments.publishedAt`), then re-stamped/cleared authoritatively on\n * publish/unpublish from the reconciled backend record (set-once on publish,\n * cleared on unpublish). `undefined` for a draft / never-published /\n * currently-unpublished ref (the column shows EmDash).\n */\n documentPublishedAt(ref: DocumentRef): string | undefined\n /**\n * Does this PUBLISHED document's working draft carry unpublished changes\n * (EC-449)? The cheap per-row signal behind the amber \"changed\" `$state` dot —\n * sourced from the materialized `cmsDocuments.hasUnpublishedChanges` (computed\n * ONCE at the write chokepoint, never per render). Seeded from hydration, then\n * re-stamped authoritatively from the returned record on save (the persister's\n * saved-record hook / the inline-edit dispatch), publish (→ false) and\n * unpublish (→ cleared). Always `false` for a draft / never-published ref.\n */\n documentHasUnpublishedChanges(ref: DocumentRef): boolean\n /**\n * Publish: snapshot the draft as a new version and pin it live (EC-224).\n * Flips published-ness optimistically, then reconciles against the backend\n * record (EC-225) so the badge can never claim a publish the backend refused\n * (e.g. blocked by publish-time field validation).\n */\n publishDocument(ref: DocumentRef): Promise<void>\n /**\n * Unpublish: clear the live version pin (EC-224). Blocked at the operations\n * layer while strict relation fields published-reference it (EC-173); the\n * optimistic flip reconciles against the backend on rejection (EC-225).\n */\n unpublishDocument(ref: DocumentRef): Promise<void>\n /**\n * Load this document's recorded version history + live pin (EC-224) for the\n * Versions inspector pane. Fixture/playground sessions (no project) have no\n * persisted history → an empty view. Failures surface as {@link persistError}.\n */\n loadDocumentVersions(ref: DocumentRef): Promise<DocumentVersionsView>\n /**\n * Restore a recorded version as the new working draft (EC-224): the operation\n * snapshots the current draft first (so the rollback is itself undoable), then\n * loads the chosen snapshot. An optional `scope` (EC-298) restores only one\n * field or block, laid over the current draft, instead of the whole document.\n * Returns the restored draft (or null on failure/fixture session) so the open\n * editor can adopt it.\n */\n restoreDocumentVersion(\n ref: DocumentRef,\n version: number,\n scope?: RestoreScope,\n ): Promise<CmsDocument | null>\n importDocuments(collectionId: string, docs: unknown[]): ImportReport\n validate(doc: CmsDocument): CmsValidationIssue[]\n /**\n * THE validation option bag {@link validate} uses (EC-497) — the session document\n * store, the project locales, the composition + rich-text-embed leashes, the\n * published-ness pointer and the real asset-library oracle, built once by\n * `gateValidateOptions`.\n *\n * Exposed so a surface validating a document that is NOT yet in the session (the\n * AI engines judge a proposal before it exists) passes the editor's rules WHOLE.\n * EC-473 exposed the two store-dependent halves for that; handing over the bag\n * instead removes the remaining way to get it wrong — assembling a subset at the\n * call site, which is the defect EC-497 exists to end.\n */\n validateOptions: ValidateDocumentOptions\n // EC-511: `documentStore` and `assetExists` were exposed HERE by EC-473 as the two\n // store-dependent halves of the option bag, for the AI panel to reassemble. EC-497\n // replaced that with `validateOptions` above — the whole bag — and the reassembly\n // site went with it. Both members were then read by nothing (measured: zero call\n // sites across `packages/`, `apps/`, `tools/`, `docs/` and both consumer repos,\n // in a search whose sibling members `validateOptions`/`isFieldReadOnly`/`viewsOf`\n // all showed hits), so they are gone rather than kept as a documented member\n // nobody consumes. Both oracles still exist INSIDE the bag, which is the one\n // supported way to get them (the asset one as `findAsset` since EC-588).\n isFieldReadOnly(field: FieldDef): boolean\n // Views (EC-246b): the built-in default + config-declared named views (from\n // `cms/`, read live). Shared views are code, not editor-owned DB data.\n viewsOf(collectionId: string): SavedView[]\n activeViewId(collectionId: string): string\n /** Switch views — resets the working table state to the view's state. */\n setActiveView(collectionId: string, viewId: string): void\n /** The live table state (the active view's state plus unsaved edits). */\n tableStateOf(collectionId: string): TableViewState\n /**\n * Update the working state. Always pass an updater when deriving from the\n * previous state — render-time snapshots go stale across rapid events.\n */\n setTableState(\n collectionId: string,\n update: TableViewState | ((prev: TableViewState) => TableViewState),\n ): void\n /** Does the working state diverge from the active view (\"unsaved changes\")? */\n isViewDirty(collectionId: string): boolean\n /** Discard working-state edits, back to the active view. */\n resetTableState(collectionId: string): void\n /**\n * Bulk publish/unpublish/delete (EC-169) + set-field (EC-247): one operations\n * command PER item, per-item outcomes in the report — partial failure is\n * enumerated, never silent. Only succeeded items mutate the session. A\n * `set-field` carries its `{ field, value }` payload.\n */\n runBulk(\n collectionId: string,\n ids: readonly string[],\n action: BulkAction,\n setField?: BulkSetField,\n ): Promise<BulkReport>\n /**\n * Mirror a collection into the session (e.g. an accepted AI-generated\n * schema, EC-097). Replaces by id. Session-only: persistence happens through\n * the accept flow's changeset (`schema.upsertCollection`), not here.\n */\n addCollection(def: CollectionDef): void\n /**\n * Most recent failed/denied persisted mutation (structured, from the\n * operation result). Rendered by the CMS surface — never a silent failure.\n */\n persistError: OperationError | null\n clearPersistError(): void\n /** Seed the persisted baseline now (e.g. before applying an AI changeset). */\n ensurePersistedBaseline(): Promise<void>\n /** Await all queued persisted mutations (tests, publish flows). */\n flushPersistence(): Promise<void>\n}\n\nconst { Context: CmsContext, useRequired: useCms } = createRequiredContext<CmsStore>('Cms')\n\nfunction primaryField(collection: CollectionDef): string {\n return titleFieldOf(collection)?.name ?? collection.fields[0]?.name ?? 'id'\n}\n\n/**\n * EC-316 (bug fix) — mint a fresh, COLLISION-FREE document id for `+ New`.\n *\n * `seq` is an in-memory, per-session counter (reset to 0 on every reload). A\n * document minted `new-<collection>-<n>` in a PRIOR session can already occupy\n * whatever `n` this session's counter would next reissue — the pre-fix bug:\n * `+ New` on a `post` collection that already held a (possibly published)\n * `new-post-1` handed out that SAME id again, silently opening the existing\n * document for editing instead of creating a fresh draft. Walking the counter\n * past every id already in `existingIds` makes the mint collision-free\n * regardless of what a prior session left behind.\n */\nexport function mintDocumentId(\n collectionId: string,\n seq: { current: number },\n existingIds: ReadonlySet<string>,\n): string {\n let id: string\n do {\n seq.current += 1\n id = `new-${collectionId}-${seq.current}`\n } while (existingIds.has(id))\n return id\n}\n\n/**\n * Build a fresh document for `collectionId`: a collision-free id (EC-316, via\n * {@link mintDocumentId} against every id `existingDocs` already holds for\n * this collection) and the collection's declared field defaults (EC-297, via\n * `seedDefaults` — a localized default lands in the project's default-locale\n * bucket, EC-580). Pure — the sensitive part of the insert sequence shared by\n * `createDocument` and `ensureSingletonDocument`'s empty branch (via the\n * private `insertNewDocument` below), factored out so it's unit-testable\n * without a `CmsProvider`.\n */\nexport function buildNewDocument(\n collectionId: string,\n registry: CollectionRegistry,\n seq: { current: number },\n existingDocs: readonly CmsDocument[],\n locales: LocaleConfig,\n): CmsDocument {\n const existingIds = new Set(\n existingDocs.filter((d) => d.collection === collectionId).map((d) => d.id),\n )\n const id = mintDocumentId(collectionId, seq, existingIds)\n const collection = registry.get(collectionId)\n return {\n collection: collectionId,\n id,\n ...(collection ? seedDefaults(collection, locales) : { values: {} }),\n }\n}\n\n/**\n * Does `docs` already hold a document for `collectionId`? `ensureSingletonDocument`'s\n * empty branch re-checks this INSIDE the `setDocuments` updater (against the\n * latest `prev`, not a stale snapshot) so a concurrent invocation — StrictMode's\n * double-invoked effect, or a second caller racing the same synchronous guard —\n * can never materialize a second singleton document.\n */\nexport function hasDocumentFor(docs: readonly CmsDocument[], collectionId: string): boolean {\n return docs.some((d) => d.collection === collectionId)\n}\n\n/**\n * Surface a duplicate `initial: true` across a collection's config views (EC-343/\n * EC-444) as a visible, one-time console warning — never a silent swallow. This is a\n * developer config mistake (editors can't fix config-as-code), so it takes the same\n * warn-once console channel the i18n runtime uses for config problems, not an editor\n * banner; the first-declared still seeds deterministically. Deduped per collection id.\n */\nconst warnedDuplicateDefaultCollections = new Set<string>()\nfunction warnDuplicateDefaultViews(collection: CollectionDef): void {\n if (warnedDuplicateDefaultCollections.has(collection.id)) return\n const issues = configViewIssues(collection)\n if (issues.length === 0) return\n warnedDuplicateDefaultCollections.add(collection.id)\n if (typeof console !== 'undefined') console.warn(`[views] ${issues[0]!.message}`)\n}\n\n/**\n * Surface the DEPRECATED `default: true` view flag (EC-444) as a one-time console\n * warning per collection — never silent. `default` (the view flag) is renamed to\n * `initial`; it is read as an alias for one release and removed next release. Same\n * warn-once channel as the duplicate check; deduped per collection id.\n */\nconst warnedDeprecatedDefaultCollections = new Set<string>()\nfunction warnDeprecatedDefaultFlag(collection: CollectionDef): void {\n if (warnedDeprecatedDefaultCollections.has(collection.id)) return\n const ids = deprecatedDefaultFlagViewIds(collection)\n if (ids.length === 0) return\n warnedDeprecatedDefaultCollections.add(collection.id)\n if (typeof console !== 'undefined') {\n console.warn(\n `[views] Collection \"${collection.id}\" uses the deprecated view flag \\`default\\` on ${ids.join(', ')}; rename it to \\`initial\\` (EC-444 — \\`default\\` is removed next release).`,\n )\n }\n}\n\n/** The unnamed built-in view: no filters, no sort, every field visible. */\nfunction defaultView(\n collection: CollectionDef | undefined,\n pseudo: readonly string[] = [],\n): SavedView {\n return {\n id: ALL_VIEW_ID,\n name: translate('cms.list.view.all'),\n state: collection\n ? defaultViewState(collection, pseudo)\n : { filters: [], sort: null, columns: [], hidden: [] },\n }\n}\n\nexport interface CmsProviderProps {\n children: ReactNode\n /** Enables persistence through the shared operations client. */\n projectId?: string\n /**\n * Did `initialDocuments` come from a fresh persisted-state hydration (EC-461)?\n * Drives the staged-document merge rule (`consumeStagedDocuments`): a hydrated\n * seed supersedes staged entries; a static kit/fixture seed lets them win.\n * Omitted → the historical mode default (connected hydrates, playground may not).\n */\n seedReflectsWrites?: boolean\n /**\n * The session's collections — the project's own schema (hydration, a starter\n * kit, or `elytra.config.ts`). Absent → **no collections** (EC-479): the store\n * used to fall back to `cms-core`'s `sampleFilterableCollections`, so a studio\n * whose config never arrived showed the engine's demo schema as if it were the\n * project's. The absence is now reported at the rail (`projectConfigIssues`).\n */\n initialCollections?: CollectionDef[]\n /**\n * The session's documents. Absent → **none** (EC-479; was `sampleDocuments`).\n */\n initialDocuments?: CmsDocument[]\n /**\n * Published document keys from hydration (EC-224): the version pointer\n * (`publishedVersion` set). Absent (kit / fixture sessions) → none published\n * (EC-479 retired the `samplePublishedKeys` fixture default, which only ever\n * described the engine's own sample documents).\n */\n initialPublishedKeys?: readonly string[]\n /**\n * Per-document last-write timestamps from hydration (EC-445), keyed by\n * `documentKey` (`collection:id`) → ISO string. Backs the `$updatedAt` list column.\n * Absent (playground / kit session) → the seeded documents get a session-start\n * timestamp so the column is never blank, then re-stamped on edits.\n */\n initialTimestamps?: Record<string, string>\n /**\n * Per-document FIRST-publish instants from hydration (EC-447), keyed by\n * `documentKey` (`collection:id`) → ISO string. Backs the `$publishedAt` column.\n * UNLIKE {@link initialTimestamps} there is NO session-start fallback — an absent\n * entry is a real \"no publish date\" (EmDash); the store re-stamps/clears it\n * authoritatively on publish/unpublish. Absent (playground / kit) → empty map.\n */\n initialPublishTimestamps?: Record<string, string>\n /**\n * Document keys whose draft carries unpublished changes, from hydration\n * (EC-449, the persisted `cmsDocuments.hasUnpublishedChanges === true` set) —\n * the amber \"changed\" `$state` dot. Mirrors {@link initialPublishedKeys}; the\n * store re-stamps the set authoritatively on save/publish/unpublish from the\n * returned records. Absent (playground / kit) → empty set.\n */\n initialChangedKeys?: readonly string[]\n /**\n * Locale config for this session — the PROJECT's own (config-declared locales,\n * or its persisted settings; see `resolveCmsInitialLocaleConfig`). Absent → the\n * active config project's locales are read directly, and failing that the\n * session runs with no locale at all rather than the engine's `en/de`\n * `sampleLocaleConfig` fixture (EC-479/EC-483: the default locale is the literal\n * storage key for localized values, so inventing one is a future data migration).\n */\n initialLocaleConfig?: LocaleConfig\n}\n\n/**\n * The CMS session store (EC-141): documents and collections are optimistic,\n * synchronous session state (live validation while typing); every mutation —\n * create/save/delete/state transitions — is mirrored onto the operations\n * layer (`documents.*` / `schema.*` commands) through {@link createCmsPersister}.\n * Failed/denied commands surface as {@link CmsStore.persistError}.\n *\n * EC-479 — this outer component exists to make ONE property structural: a CMS\n * session always runs in the project's own locale, or it does not run. The locale\n * is resolved here (the caller's, else the active `elytra.config.ts` project's)\n * and handed to {@link CmsSession} as a REQUIRED value, so no branch inside the\n * session can reach for the engine's `sampleLocaleConfig` — the default locale is\n * the storage key every localized value is written under (EC-483), and a session\n * that guessed it would corrupt content rather than fail. With no locale at all\n * the surface says so instead of editing in an invented one.\n */\nexport function CmsProvider(props: CmsProviderProps) {\n const localeConfig = props.initialLocaleConfig ?? resolveDeploymentLocaleConfig()\n if (localeConfig === undefined) return <MissingProjectLocales />\n return <CmsSession {...props} localeConfig={localeConfig} />\n}\n\n/**\n * The project declares no locales, so there is no key to write localized values\n * under. Visible and specific rather than a silent fixture locale (EC-479) — and\n * the rail foot carries the same finding as a project-level validation issue\n * (`projectConfigIssues`), so it is reported wherever the developer is looking.\n */\nfunction MissingProjectLocales() {\n return (\n <Panel className=\"m-6 p-6\">\n <Stack gap=\"2\">\n <Heading level={2} size=\"h4\">\n {translate('cms.session.noLocales.title')}\n </Heading>\n <Text size=\"sm\" tone=\"subtle\">\n {translate('cms.session.noLocales.body')}\n </Text>\n </Stack>\n </Panel>\n )\n}\n\nfunction CmsSession({\n children,\n projectId,\n initialCollections,\n initialDocuments,\n initialPublishedKeys,\n initialTimestamps,\n initialPublishTimestamps,\n initialChangedKeys,\n seedReflectsWrites,\n localeConfig,\n}: CmsProviderProps & { localeConfig: LocaleConfig }) {\n const [documents, setDocuments] = useState<CmsDocument[]>(() => {\n const seeded = (initialDocuments ?? []).map((d) => structuredClone(d))\n // EC-320 (0.0.44 follow-up): merge any documents STAGED by the\n // Components-view \"Use in document…\" transfer — a cross-mount handoff in\n // EVERY mode (see document-staging.ts). EC-461: the merge rule keys on the\n // seed's PROVENANCE — a hydrated seed (fresh persisted-state query, both\n // modes now) supersedes staged entries; a static kit/fixture seed lets\n // them win (they are the only cross-mount signal of a live edit there).\n return seedReflectsWrites === undefined\n ? consumeStagedDocuments(projectId, seeded)\n : consumeStagedDocuments(projectId, seeded, seedReflectsWrites)\n })\n // Published-ness as the version POINTER (EC-224), decoupled from the flat\n // `state` enum: seeded from hydration's pointer set. A kit's imported content\n // (`initialDocuments` without a pointer set) starts unpublished (drafts) until\n // an editor publishes it, and so does a session with no pointer set at all —\n // EC-479 retired the `samplePublishedKeys` branch, which pinned the ENGINE's\n // sample documents live in a session that no longer has any. The flat `state`\n // is never consulted.\n const [publishedKeys, setPublishedKeys] = useState<Set<string>>(\n () => new Set(initialPublishedKeys ?? []),\n )\n // EC-445: per-document last-write timestamps behind the `$updatedAt` column.\n // Seeded from hydration (connected: the persisted `cmsDocuments.updatedAt`), then\n // re-stamped on the common edit paths. A seeded document with no hydrated timestamp\n // (the playground fixtures / a kit) gets a session-start stamp so the column is\n // never a wall of blanks; a fresh draft is stamped when it is created.\n const [updatedAtByKey, setUpdatedAtByKey] = useState<Map<string, string>>(() => {\n const now = new Date().toISOString()\n const map = new Map<string, string>()\n if (initialTimestamps) {\n for (const [key, value] of Object.entries(initialTimestamps)) map.set(key, value)\n }\n for (const doc of initialDocuments ?? []) {\n const key = documentKey(doc)\n if (!map.has(key)) map.set(key, now)\n }\n return map\n })\n const stampUpdatedAt = useCallback(\n (ref: DocumentRef, iso: string = new Date().toISOString()) => {\n setUpdatedAtByKey((prev) => {\n const next = new Map(prev)\n next.set(documentKey(ref), iso)\n return next\n })\n },\n [],\n )\n const documentUpdatedAt = useCallback(\n (ref: DocumentRef) => updatedAtByKey.get(documentKey(ref)),\n [updatedAtByKey],\n )\n // EC-447: per-document FIRST-publish instants behind the `$publishedAt` column.\n // Seeded from hydration (the persisted `cmsDocuments.publishedAt`); UNLIKE\n // `$updatedAt` there is NO session-start fallback — an absent entry is a real \"no\n // publish date\" (EmDash). The store re-stamps/clears it authoritatively on\n // publish/unpublish (the set-once + clear semantics live in the persistence spine).\n const [publishedAtByKey, setPublishedAtByKey] = useState<Map<string, string>>(() => {\n const map = new Map<string, string>()\n if (initialPublishTimestamps) {\n for (const [key, value] of Object.entries(initialPublishTimestamps)) map.set(key, value)\n }\n return map\n })\n // Adopt the AUTHORITATIVE publish instant from the reconciled record: an ISO value\n // stamps it (set-once is enforced server-side, so this only ever adopts the pinned\n // first-publish value); `undefined` CLEARS it (unpublish). Mirrors `stampUpdatedAt`\n // but supports clearing — the column shows a date iff the doc is currently published.\n const stampPublishedAt = useCallback((ref: DocumentRef, iso: string | undefined) => {\n setPublishedAtByKey((prev) => {\n const key = documentKey(ref)\n if (iso === undefined) {\n if (!prev.has(key)) return prev\n const next = new Map(prev)\n next.delete(key)\n return next\n }\n if (prev.get(key) === iso) return prev\n const next = new Map(prev)\n next.set(key, iso)\n return next\n })\n }, [])\n const documentPublishedAt = useCallback(\n (ref: DocumentRef) => publishedAtByKey.get(documentKey(ref)),\n [publishedAtByKey],\n )\n // EC-449: the documents whose draft carries unpublished changes — the amber\n // \"changed\" `$state` dot. A SET like `publishedKeys` (membership = the\n // materialized `hasUnpublishedChanges === true`); seeded from hydration, then\n // re-stamped authoritatively from returned records — the verdict is computed\n // ONCE at the write chokepoint (both adapters), never client-side per render.\n const [changedKeys, setChangedKeys] = useState<Set<string>>(\n () => new Set(initialChangedKeys ?? []),\n )\n // Adopt the authoritative flag: `true` adds the key; `false`/`undefined` (not\n // changed / cleared at unpublish / not materialized) both remove it — the dot\n // renders those identically, so the set stores no tri-state.\n const stampHasUnpublishedChanges = useCallback(\n (ref: DocumentRef, changed: boolean | undefined) => {\n setChangedKeys((prev) => {\n const key = documentKey(ref)\n if (prev.has(key) === (changed === true)) return prev\n const next = new Set(prev)\n if (changed === true) next.add(key)\n else next.delete(key)\n return next\n })\n },\n [],\n )\n const documentHasUnpublishedChanges = useCallback(\n (ref: DocumentRef) => changedKeys.has(documentKey(ref)),\n [changedKeys],\n )\n // The one adoption seam for a SAVED document record (persister queue upsert,\n // inline cell edit, bulk set-field, restore): stamp the server-computed\n // changed verdict for the record's ref. Referentially stable — the persister\n // closes over it once.\n const adoptSavedRecord = useCallback(\n (record: CmsDocumentRecord) => {\n stampHasUnpublishedChanges(\n { collection: record.document.collection, id: record.document.id },\n record.hasUnpublishedChanges,\n )\n },\n [stampHasUnpublishedChanges],\n )\n const [activeViews, setActiveViews] = useState<Record<string, string>>({})\n // The live table state per collection where it diverges from the active\n // view; absent key = exactly the active view's state (not dirty).\n const [tableStates, setTableStates] = useState<Record<string, TableViewState>>({})\n // Collections are stateful so AI-generated schemas (EC-097) can be accepted\n // into the session. The session schema IS the source the sort/filter\n // offering follows (EC-177 gap 3): hydrated sessions receive the persisted\n // schema via `initialCollections`, which is the project's own throughout —\n // hydration, a kit, or `elytra.config.ts` (`resolveCmsInitialCollections`).\n // EC-479: with none, the session has NO collections and the rail says so; it\n // no longer borrows the engine's sample schema, which offered `filterable`\n // fields the project's real backend would reject.\n const [collections, setCollections] = useState<CollectionDef[]>(() => [\n ...(initialCollections ?? []),\n ])\n const [persistError, setPersistError] = useState<OperationError | null>(null)\n const seq = useRef(0)\n // EC-274: collection ids whose lone singleton document this session has already\n // created — a synchronous guard so a re-invoked effect (or StrictMode's double\n // mount) never materializes a second document under a freshly generated id.\n const ensuredSingletons = useRef<Set<string>>(new Set())\n\n // Latest session state for the persister's lazy baseline (no re-subscribing).\n const collectionsRef = useRef(collections)\n collectionsRef.current = collections\n const documentsRef = useRef(documents)\n documentsRef.current = documents\n\n const persisterRef = useRef<CmsPersister | null>(null)\n if (persisterRef.current === null && projectId !== undefined) {\n persisterRef.current = createCmsPersister({\n projectId,\n getOperations: async () => (await getStudioOperations()).operations,\n getCollections: () => collectionsRef.current,\n getDocuments: () => documentsRef.current,\n // EC-277: self-type composition static props on write (the manifest half of\n // the lens), so extraction stays schema-free. Document fields self-type via\n // the schema alone (above); the registry adds blocks/embed prop coverage.\n lookupManifest: studioManifestLookup(),\n onError: setPersistError,\n // EC-449: adopt the server-computed `hasUnpublishedChanges` verdict from\n // every queued upsert's authoritative record (saves, imports, bulk-cleaned\n // drafts) — the amber list dot follows the chokepoint, never a client guess.\n onDocumentSaved: adoptSavedRecord,\n })\n }\n\n // EC-224: published-ness IS the version pointer (`publishedKeys`) — the SOLE\n // studio source of truth. Declared up here (EC-497) because it is part of THE\n // validation option bag, which the cell-edit commit — defined above the publish\n // helpers — now also takes.\n const isPublished = useCallback(\n (ref: DocumentRef) => publishedKeys.has(documentKey(ref)),\n [publishedKeys],\n )\n\n const registry = useMemo(() => createCollectionRegistry(collections), [collections])\n // EC-497: the gate seam registers ONCE and reads through refs, so it always sees\n // the latest session without re-registering on every keystroke.\n const registryRef = useRef(registry)\n registryRef.current = registry\n const store = useMemo(() => createDocumentStore(documents), [documents])\n\n // Asset references are validated against the REAL asset library (assets live in\n // their own repository, not as CMS documents). EC-588: the oracle returns the\n // RECORD, so one lookup answers existence AND the field's `accept`. It is absent —\n // no asset checks — with no provider mounted and while the library loads or\n // errors (`assetLibraryOracle`), so a valid upload is never transiently flagged.\n const assetStore = useOptionalAssets()\n const findAsset = useMemo(() => assetLibraryOracle(assetStore), [assetStore])\n\n // The ambient studio locale (EC-176): this session's locale config drives\n // the switcher options; every CMS surface follows the one active locale.\n // EC-479: the ambient store is `null` until this effect installs the project's\n // config (it no longer opens on the engine's `en/de` fixture), so the FIRST\n // render — and any surface mounted outside a CMS session — reads the project's\n // own default here rather than a locale nobody declared.\n const { locale } = useStudioLocale()\n const activeLocale = locale ?? localeConfig.default\n useEffect(() => {\n configureStudioLocales(localeConfig)\n }, [localeConfig])\n\n const getCollection = useCallback((id: string) => registry.get(id), [registry])\n\n const getDocument = useCallback(\n (ref: DocumentRef) => documents.find((d) => matchesRef(d, ref)),\n [documents],\n )\n\n const titleOf = useCallback(\n (ref: DocumentRef) => {\n const doc = documents.find((d) => matchesRef(d, ref))\n const collection = registry.get(ref.collection)\n if (!doc || !collection) return ref.id\n // EC-296/EC-242/EC-580: THE identity resolver (a string `titleField` or a\n // function pattern) over the document's displayed view in the ambient active\n // locale (EC-176) — `valuesInLocale`, with the EC-018 fallback — so localized\n // titles follow the switcher and agree with the list title column and the\n // detail header, which read the same view.\n return resolveDocumentTitle(\n collection,\n valuesInLocale(collection, doc, activeLocale, localeConfig),\n ref.id,\n )\n },\n [documents, registry, localeConfig, activeLocale],\n )\n\n const saveDocument = useCallback(\n (doc: CmsDocument) => {\n // Replace-or-append (upsert): a brand-new document must still land even\n // though nothing in the session matches its ref yet.\n setDocuments((prev) => upsertDoc(prev, doc))\n stampUpdatedAt(doc) // EC-445: a save bumps the $updatedAt column\n persisterRef.current?.upsertDocument(doc)\n },\n [stampUpdatedAt],\n )\n\n const commitFieldEdit = useCallback(\n (input: CellCommitInput): Promise<CellCommitOutcome> => {\n // Pure map-replace: an edit always targets a document already open in\n // the session, so a miss (already gone) is a no-op, never an append.\n const replaceWith = (doc: CmsDocument) => setDocuments((prev) => replaceDoc(prev, doc))\n const persister = persisterRef.current\n return commitCellEdit(\n {\n registry,\n documents: documentsRef.current,\n localeConfig,\n // EC-497: the remaining halves of THE option bag. A cell edit now\n // validates with exactly what the editor and the publish gate use and\n // filters the result to the committed cell — it is not a weaker check.\n isPublished,\n ...(findAsset ? { findAsset } : {}),\n // EC-445: the optimistic apply bumps the $updatedAt column (a rollback\n // leaves it — it self-corrects on the next hydration).\n applySession: (doc) => {\n replaceWith(doc)\n stampUpdatedAt(doc)\n },\n rollbackSession: replaceWith,\n ...(persister && projectId !== undefined\n ? {\n dispatch: async (next: CmsDocument) => {\n // Make sure the persisted baseline + every queued mutation\n // landed first, then issue the commit's single command.\n await persister.ensureBaseline()\n const { operations } = await getStudioOperations()\n const result = await operations.documents.upsert({ projectId, document: next })\n // EC-449: adopt the chokepoint's changed verdict (inline edits\n // bypass the persister queue, so its hook doesn't see them).\n if (result.ok) adoptSavedRecord(result.value)\n return result\n },\n }\n : {}),\n },\n input,\n )\n },\n [\n registry,\n localeConfig,\n projectId,\n isPublished,\n findAsset,\n stampUpdatedAt,\n adoptSavedRecord,\n ],\n )\n\n // Shared insert sequence (EC-326): existingIds/mint/seedDefaults (via\n // `buildNewDocument`) + optimistic append + persist, consumed by both\n // `createDocument` (always inserts) and `ensureSingletonDocument`'s empty\n // branch (`guardExisting: true` — re-checks \"no document for this collection\n // yet\" against the LATEST `prev` inside the `setDocuments` updater, not the\n // `documentsRef.current` snapshot the caller already checked, so a\n // concurrent invocation — StrictMode's double-invoked effect — can never\n // materialize a second singleton document).\n const insertNewDocument = useCallback(\n (collectionId: string, options?: { guardExisting?: boolean }): CmsDocument => {\n const doc = buildNewDocument(collectionId, registry, seq, documentsRef.current, localeConfig)\n setDocuments((prev) =>\n options?.guardExisting && hasDocumentFor(prev, collectionId) ? prev : [...prev, doc],\n )\n stampUpdatedAt(doc) // EC-445: a fresh draft's $updatedAt starts at creation time\n persisterRef.current?.upsertDocument(doc)\n return doc\n },\n [registry, stampUpdatedAt, localeConfig],\n )\n\n const createDocument = useCallback(\n (collectionId: string): DocumentRef => {\n const doc = insertNewDocument(collectionId)\n return { collection: collectionId, id: doc.id }\n },\n [insertNewDocument],\n )\n\n // EC-274 (re-scopes EC-217): a singleton is a UI lens, not a fixed id. Resolve\n // the collection's lone document and return its ref; if none exists yet, create\n // one with a NORMAL generated id (never the collection id — no code ever names a\n // literal doc id). Idempotent under React effects/StrictMode: the create guard\n // keys on \"any document in this collection\", so a re-invocation never adds a\n // second. On drift (>1 doc) the studio routes to the list, so this defensively\n // returns the first; the empty draft persists like any create.\n const ensureSingletonDocument = useCallback(\n (collectionId: string): DocumentRef => {\n const collection = registry.get(collectionId)\n const resolution = collection\n ? resolveSingletonDocument(collection, documentsRef.current)\n : ({ kind: 'empty' } as const)\n if (resolution.kind === 'ready') {\n return { collection: collectionId, id: resolution.doc.id }\n }\n if (resolution.kind === 'drift') {\n return { collection: collectionId, id: resolution.docs[0]!.id }\n }\n // Empty: create the lone document once. The ref guard (synchronous) plus the\n // updater's \"any doc in collection\" check make this idempotent under a\n // re-invoked effect or StrictMode's double mount — never a second draft.\n const existing = documentsRef.current.find((d) => d.collection === collectionId)\n if (existing) return { collection: collectionId, id: existing.id }\n if (ensuredSingletons.current.has(collectionId)) {\n return { collection: collectionId, id: `new-${collectionId}-pending` }\n }\n ensuredSingletons.current.add(collectionId)\n // EC-316: same collision-free mint as `createDocument` (via the shared\n // `insertNewDocument` — defensive here, the singleton-empty branch only\n // runs when no document exists yet).\n const doc = insertNewDocument(collectionId, { guardExisting: true })\n return { collection: collectionId, id: doc.id }\n },\n [registry, insertNewDocument],\n )\n\n const deleteDocument = useCallback((ref: DocumentRef) => {\n setDocuments((prev) => removeDoc(prev, ref))\n persisterRef.current?.deleteDocument(ref)\n }, [])\n\n // EC-224: published-ness IS the version pointer (`publishedKeys`) — the SOLE\n // studio source of truth, read via `isPublished`. The live row stays a\n // continuous draft (Sanity model); no flat `state` mirror is maintained. Every\n // reader now consults the pointer (the table badge/$state via `isPublished`,\n // the preview engine via the pin), so the flat field is read by nothing here.\n const setPublished = useCallback((ref: DocumentRef, published: boolean) => {\n const key = documentKey(ref)\n setPublishedKeys((prev) => {\n if (prev.has(key) === published) return prev\n const next = new Set(prev)\n if (published) next.add(key)\n else next.delete(key)\n return next\n })\n }, [])\n\n // Reconcile published-ness for a ref against the AUTHORITATIVE backend record\n // (EC-225): the optimistic flip is a guess; once the queued op settles we read\n // the actual pin so the badge can never claim a state the backend refused\n // (a publish blocked by field rules, an unpublish blocked by a strict ref).\n const reconcilePublished = useCallback(\n async (ref: DocumentRef) => {\n if (projectId === undefined) return\n const { operations } = await getStudioOperations()\n const record = await operations.documents.get({ projectId, ref })\n if (record.ok) {\n setPublished(ref, record.value.publishedVersion !== undefined)\n // EC-445: publish/unpublish patches `updatedAt` — adopt the authoritative\n // value so the $updatedAt column reflects the actual write, not a guess.\n if (record.value.updatedAt) stampUpdatedAt(ref, record.value.updatedAt)\n // EC-447: adopt the authoritative `publishedAt` — set-once on the first\n // publish, absent after unpublish. Passing `undefined` CLEARS the column, so\n // an unpublish reverts $publishedAt to EmDash and a republish records fresh.\n stampPublishedAt(ref, record.value.publishedAt)\n // EC-449: adopt the authoritative changed flag — `false` after a publish\n // (the draft became the baseline), absent after an unpublish (cleared).\n stampHasUnpublishedChanges(ref, record.value.hasUnpublishedChanges)\n }\n },\n [projectId, setPublished, stampUpdatedAt, stampPublishedAt, stampHasUnpublishedChanges],\n )\n\n const publishDocument = useCallback(\n async (ref: DocumentRef) => {\n setPublished(ref, true) // optimistic\n // EC-273: no clearing here — the draft is already free of conditionally-hidden\n // values (the editor clears them on write), so the snapshot the publish op\n // pins is clean by construction.\n persisterRef.current?.publishDocument(ref)\n await persisterRef.current?.flush()\n await reconcilePublished(ref)\n },\n [setPublished, reconcilePublished],\n )\n\n const unpublishDocument = useCallback(\n async (ref: DocumentRef) => {\n setPublished(ref, false) // optimistic\n persisterRef.current?.unpublishDocument(ref)\n await persisterRef.current?.flush()\n await reconcilePublished(ref)\n },\n [setPublished, reconcilePublished],\n )\n\n const loadDocumentVersions = useCallback(\n async (ref: DocumentRef): Promise<DocumentVersionsView> => {\n // No persisted backend (fixture/playground): no recorded history.\n if (projectId === undefined) return { versions: [] }\n const { operations } = await getStudioOperations()\n const [versionsRes, recordRes] = await Promise.all([\n operations.documents.listVersions({ projectId, ref }),\n operations.documents.get({ projectId, ref }),\n ])\n if (!versionsRes.ok) {\n setPersistError(versionsRes.error)\n return { versions: [] }\n }\n // The pinned (live) version comes off the document record; a never-saved\n // doc simply has no record (and no versions) — not an error to surface.\n const publishedVersion = recordRes.ok ? recordRes.value.publishedVersion : undefined\n return {\n versions: versionsRes.value,\n ...(publishedVersion !== undefined ? { publishedVersion } : {}),\n }\n },\n [projectId],\n )\n\n const restoreDocumentVersion = useCallback(\n async (\n ref: DocumentRef,\n version: number,\n scope?: RestoreScope,\n ): Promise<CmsDocument | null> => {\n if (projectId === undefined) return null\n // Land any queued edits before the restore reads the current draft to\n // snapshot it (same ordering contract as commitFieldEdit/runBulk). This is\n // what makes a granular (field/block) restore merge over the LATEST draft.\n await persisterRef.current?.ensureBaseline()\n const { operations } = await getStudioOperations()\n const result = await operations.documents.restore({\n projectId,\n ref,\n version,\n ...(scope ? { scope } : {}),\n })\n if (!result.ok) {\n setPersistError(result.error)\n return null\n }\n const restored = result.value.document\n // Pure map-replace: a restore always targets a document already open in\n // the session.\n setDocuments((prev) => replaceDoc(prev, restored))\n // EC-449: a restore is a save-shaped write — adopt the chokepoint's fresh\n // changed verdict from the returned record (e.g. restoring a published\n // doc's draft to an older version flips the dot to amber immediately).\n adoptSavedRecord(result.value)\n return restored\n },\n [projectId, adoptSavedRecord],\n )\n\n /**\n * EC-497 — THE option bag (AD-497a), built once and used by every surface that\n * validates a CMS document. `gateValidateOptions` is the only place options are\n * assembled; before it there were seven hand-assembled subsets and the weakest\n * one was the publish gate. Note it carries `isPublished` too: the EC-173\n * weak-reference warning sources published-ness from the version POINTER, so\n * editing a published doc that references an unpublished target surfaces the\n * fallback warning (it had gone inert when the flat `state` mirror was dropped).\n */\n const validateOptions = useMemo(\n () =>\n gateValidateOptions({\n store,\n localeConfig,\n isPublished,\n ...(findAsset ? { findAsset } : {}),\n }),\n [store, localeConfig, isPublished, findAsset],\n )\n\n const validate = useCallback(\n (doc: CmsDocument): CmsValidationIssue[] => {\n const issues = validateDocument(registry, doc, validateOptions)\n // EC-492: a document whose composed URL no request can reach — a top-level\n // slug that collides with a declared locale code, which the host reads as a\n // locale prefix. Not part of `validateDocument` because it needs the project\n // ROUTES (the schema validator is route-free by design); emitted here, where\n // the deployment's routes and the collection's sibling set are both in hand.\n // Silent in a single-locale project — the fault is structurally impossible.\n const collection = registry.get(doc.collection)\n if (!collection) return issues\n return [\n ...issues,\n ...documentReachabilityIssues(\n { routes: resolveDeploymentRoutes(), localeConfig },\n collection,\n doc,\n { siblings: documents.filter((sibling) => sibling.collection === doc.collection) },\n ),\n ]\n },\n [registry, validateOptions, documents, localeConfig],\n )\n\n /**\n * EC-497 — publish the session's canonical validator to the gate seam, so the\n * operations-layer `documents.publish` gate judges a document with exactly these\n * rules instead of the weaker, mode-dependent ones it read off the adapter's\n * schema record. `[]` for a collection the config does not declare preserves the\n * EC-183/AD-11 data-store rule (studio system collections carry no config field\n * rules); a validator kept fresh through a ref means the seam sees the latest\n * session without re-registering per keystroke.\n */\n const gateRef = useRef(validate)\n gateRef.current = validate\n useEffect(() => {\n const owned: SessionDocumentValidator = (doc) =>\n registryRef.current.has(doc.collection) ? gateRef.current(doc) : []\n setSessionDocumentValidator(owned)\n return () => clearSessionDocumentValidator(owned)\n }, [])\n\n const importDocuments = useCallback(\n (collectionId: string, raw: unknown[]): ImportReport => {\n const report: ImportReport = { added: 0, rejected: [] }\n // Pre-parse so intra-batch relation/asset targets resolve during validation.\n const parsedBatch: CmsDocument[] = []\n const schemaFails: { item: unknown; error: ReturnType<typeof documentSchema.safeParse> }[] =\n []\n for (const item of raw) {\n const parsed = documentSchema.safeParse({ ...(item as object), collection: collectionId })\n if (parsed.success) parsedBatch.push(parsed.data)\n else schemaFails.push({ item, error: parsed })\n }\n for (const { item, error } of schemaFails) {\n report.rejected.push({\n id: (item as { id?: string })?.id ?? translate('cms.list.import.noId'),\n issues: (error.success ? [] : error.error.issues).map((e) => ({\n code: 'invalid-field-value' as const,\n severity: 'error' as const,\n message: e.message,\n path: e.path.map((p) => (typeof p === 'symbol' ? String(p) : p)),\n })),\n })\n }\n // Validate each against existing docs PLUS the rest of the batch.\n const batchStore = createDocumentStore([...documents, ...parsedBatch])\n const accepted: CmsDocument[] = []\n // EC-497: the same bag as everywhere else, over the batch-aware store. It\n // used to omit the composition leashes and the published-ness pointer, so an\n // import could land a document the editor would immediately flag.\n const importOptions = gateValidateOptions({\n store: batchStore,\n localeConfig,\n isPublished,\n ...(findAsset ? { findAsset } : {}),\n })\n for (const doc of parsedBatch) {\n const issues = validateDocument(registry, doc, importOptions)\n const errors = issues.filter((iss) => iss.severity === 'error')\n if (errors.length > 0) report.rejected.push({ id: doc.id, issues: errors })\n else accepted.push(doc)\n }\n if (accepted.length > 0) {\n // Replace-or-append (upsert): an imported row may be brand new to the\n // session, so each accepted document must land even with no prior\n // entry for its ref.\n setDocuments((prev) => accepted.reduce((acc, doc) => upsertDoc(acc, doc), prev))\n for (const doc of accepted) persisterRef.current?.upsertDocument(doc)\n // EC-224: imports land as the working DRAFT. Publish-ness is the version\n // pointer (`publishedKeys`), set by publishing — never carried in the\n // imported row — so an import never auto-publishes; the editor publishes\n // explicitly afterward.\n report.added = accepted.length\n }\n return report\n },\n [registry, documents, localeConfig, isPublished, findAsset],\n )\n\n const isFieldReadOnly = useCallback((field: FieldDef) => field.form?.readOnly === true, [])\n\n // --- Views (EC-246b: config-as-code) --------------------------------------\n\n // EC-445: the reserved pseudo-columns a CMS collection's list surfaces. Every\n // `cmsDocuments` collection has a publish lifecycle + materialized timestamps\n // ($state + $updatedAt always apply); $url applies only where the deployment\n // resolves a delivery route for it (mirrors the live-URL column's own guard).\n const pseudoColumnsFor = useCallback(\n (collectionId: string): string[] => {\n const collection = registry.get(collectionId)\n if (!collection) return []\n const routable = resolveDeploymentRoutes().some(\n (route) => route.document?.collection === collectionId,\n )\n return pseudoColumns(collection, { publishing: true, timestamps: true, routable })\n },\n [registry],\n )\n\n const viewsOf = useCallback(\n (collectionId: string): SavedView[] => {\n // The baseline view plus the collection's config-declared views (EC-246b/EC-444).\n // Views are PRESENTATION, read live from elytra.config.ts (AD-11) — not the\n // persisted content schema the session booted from — so they reflect code\n // immediately without a re-seed (the persisted schema is only baselined on\n // first run). The EC-169 DB saved-view store is retired: shared views are\n // code, editors keep only transient in-session tweaks + Reset.\n //\n // EC-444: a config view with the reserved `id: 'default'` REPLACES the\n // synthesized \"All entries\" baseline verbatim (first tab); absent one, the\n // synthesized baseline leads. `resolveCollectionViews` owns that selection.\n const pseudo = pseudoColumnsFor(collectionId)\n const baseline = defaultView(registry.get(collectionId), pseudo)\n const configCollection = resolveDeploymentCollections().find((c) => c.id === collectionId)\n if (!configCollection) return [baseline]\n return resolveCollectionViews(configCollection, baseline, pseudo)\n },\n [registry, pseudoColumnsFor],\n )\n\n // The INITIAL active view for a collection (EC-343/EC-444): a config view flagged\n // `initial: true` seeds the first-load lens; else the baseline — the `id: 'default'`\n // override when present, else the synthesized \"All entries\" (`ALL_VIEW_ID`). Only\n // consulted before the editor has picked a view (`activeViews[id]` wins once set),\n // so transient switching + Reset are unaffected. A duplicate `initial` and any\n // deprecated `default` flag are each warned once (never silent).\n const initialViewId = useCallback((collectionId: string): string => {\n const configCollection = resolveDeploymentCollections().find((c) => c.id === collectionId)\n if (!configCollection) return ALL_VIEW_ID\n warnDuplicateDefaultViews(configCollection)\n warnDeprecatedDefaultFlag(configCollection)\n const initial = defaultConfigViewId(configCollection)\n if (initial) return initial\n return hasDefaultViewOverride(configCollection) ? DEFAULT_VIEW_OVERRIDE_ID : ALL_VIEW_ID\n }, [])\n\n const activeViewOf = useCallback(\n (collectionId: string): SavedView => {\n const id = activeViews[collectionId] ?? initialViewId(collectionId)\n return (\n viewsOf(collectionId).find((view) => view.id === id) ??\n defaultView(registry.get(collectionId), pseudoColumnsFor(collectionId))\n )\n },\n [activeViews, initialViewId, viewsOf, registry, pseudoColumnsFor],\n )\n\n const tableStateOf = useCallback(\n (collectionId: string): TableViewState =>\n tableStates[collectionId] ?? activeViewOf(collectionId).state,\n [tableStates, activeViewOf],\n )\n\n const dropTableState = useCallback((collectionId: string) => {\n setTableStates((prev) => {\n if (!(collectionId in prev)) return prev\n const next = { ...prev }\n delete next[collectionId]\n return next\n })\n }, [])\n\n const setActiveView = useCallback(\n (collectionId: string, viewId: string) => {\n setActiveViews((prev) => ({ ...prev, [collectionId]: viewId }))\n dropTableState(collectionId)\n },\n [dropTableState],\n )\n\n // --- Bulk actions (EC-169) ------------------------------------------------\n\n const runBulk = useCallback(\n async (\n collectionId: string,\n ids: readonly string[],\n action: BulkAction,\n setField?: BulkSetField,\n ): Promise<BulkReport> => {\n const collection = registry.get(collectionId)\n // A set-field needs both the field payload AND the collection def to fold\n // the value the locale-aware way — guard so a misconfigured call fails\n // loud rather than silently no-opping each item.\n if (action === 'set-field' && (!setField || !collection)) {\n return {\n action,\n ...(setField ? { setField } : {}),\n results: ids.map((id) => ({\n ref: { collection: collectionId, id },\n title: titleOf({ collection: collectionId, id }),\n ok: false,\n reason: translate('cms.list.bulk.error.invalidSetField'),\n error: { code: 'unknown', message: 'Invalid set-field request.' },\n })),\n }\n }\n // The next document for a set-field item: fold the value into the active\n // locale's bag (localized) or the shared `values` (non-localized).\n const setFieldDoc = (doc: CmsDocument): CmsDocument =>\n writeField(collection!, doc, setField!.field, activeLocale, setField!.value)\n\n let dispatch:\n | ((action: BulkAction, ref: DocumentRef) => Promise<OperationResult<unknown>>)\n | undefined\n const persister = persisterRef.current\n if (persister && projectId !== undefined) {\n // Pending queued mutations + baseline land first, then one awaited\n // command per item (same ordering contract as commitFieldEdit).\n await persister.ensureBaseline()\n const { operations } = await getStudioOperations()\n dispatch = (bulkAction, ref) => {\n if (bulkAction === 'delete') return operations.documents.delete({ projectId, ref })\n if (bulkAction === 'publish') return operations.documents.publish({ projectId, ref })\n if (bulkAction === 'unpublish') return operations.documents.unpublish({ projectId, ref })\n // set-field: upsert the document carrying the new value. The write\n // path self-types it through the schema lens (EC-277); a scalar field\n // stores its scalar as-is.\n const current = documentsRef.current.find((d) => matchesRef(d, ref))\n if (!current) {\n return Promise.resolve<OperationResult<unknown>>({\n ok: false,\n error: {\n code: 'not-found',\n message: 'Document is no longer in the session.',\n entity: 'cms-document',\n key: `${ref.collection}:${ref.id}`,\n },\n })\n }\n return operations.documents\n .upsert({ projectId, document: setFieldDoc(current) })\n .then((result) => {\n // EC-449: adopt the chokepoint's changed verdict per set-field item\n // (bulk dispatch bypasses the persister queue and its hook).\n if (result.ok) adoptSavedRecord(result.value)\n return result\n })\n }\n }\n return runBulkAction(\n {\n documents: documentsRef.current,\n titleOf,\n // EC-497: THE bag, over the freshest session snapshot (`runBulk` is\n // async, so `documentsRef.current` — not the memoized store — is the\n // world as it is now). It used to be assembled here and silently missed\n // `isPublished`, so a bulk publish and a single publish of the same\n // document could disagree about the EC-173 weak-reference warning.\n validate: (doc) =>\n validateDocument(\n registry,\n doc,\n gateValidateOptions({\n store: createDocumentStore(documentsRef.current),\n localeConfig,\n isPublished,\n ...(findAsset ? { findAsset } : {}),\n }),\n ),\n // EC-425: bulk publish joins the single-document clean point — the\n // SAME shared hidden-strip `doPublish` runs (EC-273 field values +\n // EC-394 component props, session registry), per item.\n // EC-580: in the session's locale views — the single publish's same step.\n ...(collection\n ? {\n cleanForPublish: (doc: CmsDocument) =>\n cleanHiddenForPublish(collection, doc, undefined, localeConfig),\n }\n : {}),\n // Land a cleaned draft exactly the way the editor's publish does:\n // session apply + the persister's self-typing upsert (EC-277 manifest\n // lens), flushed so the serial queue lands the upsert BEFORE the\n // awaited publish command snapshots the stored draft.\n applyCleaned: async (_ref, cleaned) => {\n setDocuments((prev) => replaceDoc(prev, cleaned))\n const persister = persisterRef.current\n if (persister && projectId !== undefined) {\n persister.upsertDocument(cleaned)\n await persister.flush()\n }\n },\n // EC-224: a succeeded publish/unpublish moves the version pointer\n // (`publishedKeys`) via setPublished — there is no separate flat\n // `state` mirror to keep in sync (published-ness is derived from the\n // pointer set).\n // EC-449: either transition resolves the changed flag — publish writes\n // `false` (the draft became the baseline), unpublish clears it — and\n // bulk has no per-item record reconcile, so mirror that here.\n applyState: (ref, state) => {\n setPublished(ref, state === 'published')\n stampHasUnpublishedChanges(ref, false)\n },\n applyDelete: (ref) => setDocuments((prev) => removeDoc(prev, ref)),\n // EC-247: fold the new value into the session document (same\n // locale-aware path the dispatched upsert used). Not a plain\n // `replaceDoc` — the replacement is computed FROM each matched\n // document (`setFieldDoc(d)`), not a fixed value to swap in.\n applySetField: (ref) =>\n setDocuments((prev) => prev.map((d) => (matchesRef(d, ref) ? setFieldDoc(d) : d))),\n ...(dispatch ? { dispatch } : {}),\n },\n collectionId,\n ids,\n action,\n setField,\n )\n },\n [\n projectId,\n titleOf,\n registry,\n localeConfig,\n activeLocale,\n setPublished,\n isPublished,\n findAsset,\n adoptSavedRecord,\n stampHasUnpublishedChanges,\n ],\n )\n\n const store$ = useMemo<CmsStore>(\n () => ({\n ...(projectId !== undefined ? { projectId } : {}),\n collections,\n localeConfig,\n activeLocale,\n getCollection,\n documentsOf: (collectionId) => documents.filter((d) => d.collection === collectionId),\n getDocument,\n titleOf,\n saveDocument,\n commitFieldEdit,\n createDocument,\n ensureSingletonDocument,\n deleteDocument,\n isPublished,\n documentUpdatedAt,\n documentPublishedAt,\n documentHasUnpublishedChanges,\n publishDocument,\n unpublishDocument,\n loadDocumentVersions,\n restoreDocumentVersion,\n importDocuments,\n validate,\n validateOptions,\n isFieldReadOnly,\n viewsOf,\n activeViewId: (collectionId) => activeViews[collectionId] ?? initialViewId(collectionId),\n setActiveView,\n tableStateOf,\n setTableState: (collectionId, update) =>\n setTableStates((prev) => {\n const current = prev[collectionId] ?? activeViewOf(collectionId).state\n const next = typeof update === 'function' ? update(current) : update\n return { ...prev, [collectionId]: next }\n }),\n isViewDirty: (collectionId) => {\n const working = tableStates[collectionId]\n if (working === undefined) return false\n const active = activeViewOf(collectionId).state\n const collection = registry.get(collectionId)\n if (collection === undefined) return !viewStatesEqual(working, active)\n // Compare schema-resolved forms (EC-213): a column-order reconciliation\n // or a stale `hidden` entry must not read as an unsaved edit. EC-445: the\n // pseudo-column universe must match so a reserved column never reads as a diff.\n const pseudo = pseudoColumnsFor(collectionId)\n return !viewStatesEqual(\n canonicalViewState(collection, working, pseudo),\n canonicalViewState(collection, active, pseudo),\n )\n },\n resetTableState: dropTableState,\n runBulk,\n addCollection: (def) =>\n setCollections((prev) => [...prev.filter((c) => c.id !== def.id), def]),\n persistError,\n clearPersistError: () => setPersistError(null),\n ensurePersistedBaseline: () => persisterRef.current?.ensureBaseline() ?? Promise.resolve(),\n flushPersistence: () => persisterRef.current?.flush() ?? Promise.resolve(),\n }),\n [\n projectId,\n collections,\n documents,\n localeConfig,\n activeLocale,\n getCollection,\n getDocument,\n titleOf,\n saveDocument,\n commitFieldEdit,\n createDocument,\n ensureSingletonDocument,\n deleteDocument,\n isPublished,\n documentUpdatedAt,\n documentPublishedAt,\n documentHasUnpublishedChanges,\n publishDocument,\n unpublishDocument,\n loadDocumentVersions,\n restoreDocumentVersion,\n importDocuments,\n validate,\n validateOptions,\n isFieldReadOnly,\n viewsOf,\n activeViews,\n activeViewOf,\n initialViewId,\n tableStates,\n tableStateOf,\n setActiveView,\n dropTableState,\n runBulk,\n registry,\n pseudoColumnsFor,\n persistError,\n ],\n )\n\n return <CmsContext.Provider value={store$}>{children}</CmsContext.Provider>\n}\n\nexport { useCms }\n\nexport { primaryField }\nexport type { Locale }\n"]}
1
+ {"version":3,"file":"cms-store.js","sourceRoot":"","sources":["../../../src/components/cms/cms-store.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n applyDocumentPatches,\n createCollectionRegistry,\n createDocumentStore,\n documentKey,\n documentReachabilityIssues,\n documentSchema,\n resolveDocumentTitle,\n seedDefaults,\n titleFieldOf,\n validateDocument,\n valuesInLocale,\n writeField,\n} from '@elytracms/core/cms-core'\nimport type {\n CmsDocument,\n CmsValidationIssue,\n CollectionDef,\n CollectionRegistry,\n DocumentPatch,\n DocumentRef,\n FieldDef,\n ValuePath,\n Locale,\n LocaleConfig,\n LocalizedString,\n RestoreScope,\n ValidateDocumentOptions,\n} from '@elytracms/core/cms-core'\nimport { createUuidIdFactory } from '@elytracms/core/persistence'\nimport type {\n CmsDocumentRecord,\n DocumentVersionRecord,\n IdFactory,\n PresenceEntry,\n} from '@elytracms/core/persistence'\nimport { translate } from '@elytracms/studio/lib/i18n'\nimport { configureStudioLocales, useStudioLocale } from '@elytracms/studio/lib/locale'\nimport { studioManifestLookup } from '@elytracms/studio/lib/registry'\nimport {\n resolveDeploymentCollections,\n resolveDeploymentLocaleConfig,\n resolveDeploymentRoutes,\n} from '@elytracms/studio/lib/workspace'\nimport { Heading, Panel, Stack, Text } from '@elytracms/studio/ui'\nimport { assetLibraryOracle, gateValidateOptions } from './gate-validation'\nimport { matchesRef, removeDoc, replaceDoc, upsertDoc } from './document-ref-utils'\nimport { createRequiredContext } from '@elytracms/studio/lib/required-context'\nimport { createCmsPersister, getStudioActor, getStudioOperations } from '@elytracms/studio/lib/operations'\nimport {\n publishInSession,\n publishWithRevision as publishRevision,\n} from '@elytracms/studio/lib/operations/publish-with-revision'\nimport { operationErrorMessage } from '@elytracms/studio/lib/persona/labels'\nimport type {\n CmsPersister,\n CommitOutcome,\n DocumentConflict,\n OperationError,\n OperationResult,\n OperationsClient,\n} from '@elytracms/studio/lib/operations'\nimport { fieldWritePatch } from '@elytracms/studio/lib/cms/field-patch'\nimport {\n ALL_VIEW_ID,\n DEFAULT_VIEW_OVERRIDE_ID,\n canonicalViewState,\n configViewIssues,\n defaultConfigViewId,\n defaultViewState,\n deprecatedDefaultFlagViewIds,\n hasDefaultViewOverride,\n pseudoColumns,\n resolveCollectionViews,\n viewStatesEqual,\n} from '@elytracms/studio/lib/cms-views'\nimport type { TableViewState } from '@elytracms/studio/lib/cms-views'\nimport { useOptionalAssets } from '../assets/assets-store'\nimport { consumeStagedDocuments } from './document-staging'\nimport { commitCellEdit } from './cell-edit'\nimport type { CellCommitInput, CellCommitOutcome } from './cell-edit'\nimport { runBulkAction } from './bulk-actions'\nimport type { BulkAction, BulkReport, BulkSetField } from './bulk-actions'\n\n/**\n * A resolved table view: a named bundle of filters (closed AD-3 vocabulary),\n * sort, and visible/ordered columns. EC-246b: named views are **config-as-code**\n * (declared in `cms/`, read live via `configViewsFor`) — the editor-owned DB\n * saved-view store (EC-169) is retired. The unnamed \"All documents\" default is\n * derived per collection; editors keep only transient in-session tweaks + Reset.\n */\nexport interface SavedView {\n id: string\n /**\n * The view label — a {@link LocalizedString} (EC-343): the built-in \"All\" default is\n * a plain translated string; a config view's name may be a `{ locale }` map, resolved\n * at the render site (`ViewTabs`) via the same `resolveLabel` path as `form.label`.\n */\n name: LocalizedString\n state: TableViewState\n}\n\nexport interface ImportReport {\n added: number\n rejected: { id: string; issues: CmsValidationIssue[] }[]\n}\n\n/**\n * A document's recorded version history plus its live pin (EC-224), as the\n * Versions inspector pane reads it. `versions` is newest-first; `publishedVersion`\n * is the recorded version currently pinned live, absent when unpublished.\n */\nexport interface DocumentVersionsView {\n versions: DocumentVersionRecord[]\n publishedVersion?: number\n}\n\nexport interface CmsStore {\n /** The project this CMS session edits (set when persistence is enabled); the asset picker scopes the real library by it (EC-152). */\n projectId?: string\n collections: readonly CollectionDef[]\n localeConfig: LocaleConfig\n /**\n * The studio's ambient active locale (EC-176): table cells, detail forms,\n * and inline edits all display and write THIS locale. Switched once via the\n * shared `LocaleSwitcher`, never per control.\n */\n activeLocale: Locale\n getCollection(id: string): CollectionDef | undefined\n documentsOf(collectionId: string): CmsDocument[]\n getDocument(ref: DocumentRef): CmsDocument | undefined\n /** Resolve a relation/asset target's display title. */\n titleOf(ref: DocumentRef): string\n /**\n * EC-595 A2 — commit the patches a writer made to a document (the form's field\n * paths, the canvas's node patches, an AI proposal's changes, …): the session's view\n * updates at once and the patches persist through `documents.patch` against the\n * revision the view was at. A refused path becomes a per-field conflict\n * ({@link documentConflicts}); a failure, {@link persistError}. Resolves with the\n * commit's outcome once acknowledged (fixture sessions: applied locally, at once).\n */\n commitPatches(\n ref: DocumentRef,\n patches: readonly DocumentPatch[],\n bases?: readonly (number | undefined)[],\n ): Promise<CommitOutcome | undefined>\n /** EC-595 A2 — the revision the session's view of a document is at (the next patch's base). */\n revisionOf(ref: DocumentRef): number | undefined\n /**\n * EC-595 A2 / EC-578 — create a document from a whole value (duplicate, import of a\n * new row, an AI create, a transfer, a reuse promote): insert-if-absent\n * (`documents.replace` `{ ifAbsent: true }`), never an overwrite.\n */\n insertDocument(doc: CmsDocument): void\n /** EC-578 — a fresh document id from the session's injected id factory (UUIDs in the studio). */\n newDocumentId(): string\n /**\n * Commit ONE field edit from the table (EC-168): optimistic session apply + exactly\n * one field patch through the persister's queue (EC-595 A2 — no longer a side\n * channel past it), awaited. Validation failures and refusals return a structured\n * error (the caller renders it on the cell).\n */\n commitFieldEdit(input: CellCommitInput): Promise<CellCommitOutcome>\n createDocument(collectionId: string): DocumentRef\n /**\n * Ensure a singleton collection's lone document exists (EC-274 → EC-595 A2): when the\n * session holds none, `documents.create({ singleton: true })` — the store's\n * `ifCollectionEmpty` precondition, so two sessions opening an empty singleton make\n * ONE document; the loser adopts the winner's from the conflict. The singleton gate\n * re-resolves once the document lands in the session.\n */\n ensureSingletonDocument(collectionId: string): void\n /** EC-595 A2 — the open per-field conflicts on a document (\"changed by X — take theirs / keep mine\"). */\n documentConflicts(ref: DocumentRef): readonly DocumentConflict[]\n /** EC-595 A2 — resolve one: `theirs` adopts the server value, `mine` re-sends at the current base. */\n resolveConflict(ref: DocumentRef, conflictId: string, choice: 'theirs' | 'mine'): void\n /**\n * EC-595 A2 (point 7) — adopt a row the open editor's document subscription pushed:\n * applied under unflushed local edits, which win on their paths until flushed.\n */\n adoptDocumentSnapshot(ref: DocumentRef, record: CmsDocumentRecord | undefined): void\n /** EC-595 point 7 — follow one open document (rows to the persister, presence to the caller). */\n subscribeDocument(ref: DocumentRef, onPresence: (presence: readonly PresenceEntry[]) => void): () => void\n /** EC-595 thin presence — this tab's heartbeat on a document (the focused field's path). */\n reportPresence(ref: DocumentRef, path: ValuePath | undefined): void\n clearPresence(ref: DocumentRef): void\n /** This tab's presence id. */\n presenceSessionId: string\n /** Write a whole document at the session's revision (a document-level key — the alias). */\n replaceDocument(doc: CmsDocument): void\n deleteDocument(ref: DocumentRef): void\n /**\n * Is this document currently published? Sourced from the version POINTER\n * (EC-224), not the flat `state` enum — seeded from hydration and updated by\n * {@link publishDocument}/{@link unpublishDocument}.\n */\n isPublished(ref: DocumentRef): boolean\n /**\n * The record's last-write ISO timestamp (EC-445) — the data behind the\n * `$updatedAt` list column. Seeded from hydration (connected: the persisted\n * `cmsDocuments.updatedAt`; playground: session-start for the seeded fixtures),\n * then re-stamped on the common edit paths. `undefined` for a ref the session\n * has no timestamp for. See {@link documentPublishedAt} for the publish-instant column.\n */\n documentUpdatedAt(ref: DocumentRef): string | undefined\n /**\n * The record's FIRST-publish ISO instant (EC-447) — the data behind the\n * `$publishedAt` list column. Seeded from hydration (the persisted\n * `cmsDocuments.publishedAt`), then re-stamped/cleared authoritatively on\n * publish/unpublish from the reconciled backend record (set-once on publish,\n * cleared on unpublish). `undefined` for a draft / never-published /\n * currently-unpublished ref (the column shows EmDash).\n */\n documentPublishedAt(ref: DocumentRef): string | undefined\n /**\n * Does this PUBLISHED document's working draft carry unpublished changes\n * (EC-449)? The cheap per-row signal behind the amber \"changed\" `$state` dot —\n * sourced from the materialized `cmsDocuments.hasUnpublishedChanges` (computed\n * ONCE at the write chokepoint, never per render). Seeded from hydration, then\n * re-stamped authoritatively from the returned record on save (the persister's\n * saved-record hook / the inline-edit dispatch), publish (→ false) and\n * unpublish (→ cleared). Always `false` for a draft / never-published ref.\n */\n documentHasUnpublishedChanges(ref: DocumentRef): boolean\n /**\n * Publish: the ONE publish operation (EC-585) — it clears the draft's hidden values,\n * validates, and pins a new version (EC-224). Flips published-ness optimistically,\n * then reconciles against the backend record (EC-225) so the badge can never claim a\n * publish the backend refused — and a refusal REJECTS (`PublishRefusedError`, after\n * reporting it on the persist banner), so no caller shows success for it.\n */\n publishDocument(ref: DocumentRef): Promise<void>\n /**\n * Unpublish: clear the live version pin (EC-224). Blocked at the operations\n * layer while strict relation fields published-reference it (EC-173); the\n * optimistic flip reconciles against the backend on rejection (EC-225).\n */\n unpublishDocument(ref: DocumentRef): Promise<void>\n /**\n * Load this document's recorded version history + live pin (EC-224) for the\n * Versions inspector pane. Fixture/playground sessions (no project) have no\n * persisted history → an empty view. Failures surface as {@link persistError}.\n */\n loadDocumentVersions(ref: DocumentRef): Promise<DocumentVersionsView>\n /**\n * Restore a recorded version as the new working draft (EC-224): the operation\n * snapshots the current draft first (so the rollback is itself undoable), then\n * loads the chosen snapshot. An optional `scope` (EC-298) restores only one\n * field or block, laid over the current draft, instead of the whole document.\n * Returns the restored draft (or null on failure/fixture session) so the open\n * editor can adopt it.\n */\n restoreDocumentVersion(\n ref: DocumentRef,\n version: number,\n scope?: RestoreScope,\n ): Promise<CmsDocument | null>\n importDocuments(collectionId: string, docs: unknown[]): ImportReport\n validate(doc: CmsDocument): CmsValidationIssue[]\n /**\n * THE validation option bag {@link validate} uses (EC-497) — the session document\n * store, the project locales, the composition + rich-text-embed leashes, the\n * published-ness pointer and the real asset-library oracle, built once by\n * `gateValidateOptions`.\n *\n * Exposed so a surface validating a document that is NOT yet in the session (the\n * AI engines judge a proposal before it exists) passes the editor's rules WHOLE.\n * EC-473 exposed the two store-dependent halves for that; handing over the bag\n * instead removes the remaining way to get it wrong — assembling a subset at the\n * call site, which is the defect EC-497 exists to end.\n */\n validateOptions: ValidateDocumentOptions\n // EC-511: `documentStore` and `assetExists` were exposed HERE by EC-473 as the two\n // store-dependent halves of the option bag, for the AI panel to reassemble. EC-497\n // replaced that with `validateOptions` above — the whole bag — and the reassembly\n // site went with it. Both members were then read by nothing (measured: zero call\n // sites across `packages/`, `apps/`, `tools/`, `docs/` and both consumer repos,\n // in a search whose sibling members `validateOptions`/`isFieldReadOnly`/`viewsOf`\n // all showed hits), so they are gone rather than kept as a documented member\n // nobody consumes. Both oracles still exist INSIDE the bag, which is the one\n // supported way to get them (the asset one as `findAsset` since EC-588).\n isFieldReadOnly(field: FieldDef): boolean\n // Views (EC-246b): the built-in default + config-declared named views (from\n // `cms/`, read live). Shared views are code, not editor-owned DB data.\n viewsOf(collectionId: string): SavedView[]\n activeViewId(collectionId: string): string\n /** Switch views — resets the working table state to the view's state. */\n setActiveView(collectionId: string, viewId: string): void\n /** The live table state (the active view's state plus unsaved edits). */\n tableStateOf(collectionId: string): TableViewState\n /**\n * Update the working state. Always pass an updater when deriving from the\n * previous state — render-time snapshots go stale across rapid events.\n */\n setTableState(\n collectionId: string,\n update: TableViewState | ((prev: TableViewState) => TableViewState),\n ): void\n /** Does the working state diverge from the active view (\"unsaved changes\")? */\n isViewDirty(collectionId: string): boolean\n /** Discard working-state edits, back to the active view. */\n resetTableState(collectionId: string): void\n /**\n * Bulk publish/unpublish/delete (EC-169) + set-field (EC-247): one operations\n * command PER item, per-item outcomes in the report — partial failure is\n * enumerated, never silent. Only succeeded items mutate the session. A\n * `set-field` carries its `{ field, value }` payload.\n */\n runBulk(\n collectionId: string,\n ids: readonly string[],\n action: BulkAction,\n setField?: BulkSetField,\n ): Promise<BulkReport>\n /**\n * Mirror a collection into the session (e.g. an accepted AI-generated\n * schema, EC-097). Replaces by id. Session-only: persistence happens through\n * the accept flow's changeset (`schema.upsertCollection`), not here.\n */\n addCollection(def: CollectionDef): void\n /**\n * Most recent failed/denied persisted mutation (structured, from the\n * operation result). Rendered by the CMS surface — never a silent failure.\n */\n persistError: OperationError | null\n clearPersistError(): void\n /**\n * Await every queued persisted write (of one document, or all) — the persistence half\n * of the FORCED FLUSH (publish, duplicate, transfer, an AI proposal, unmount, tab hide).\n */\n flushPersistence(ref?: DocumentRef): Promise<void>\n}\n\nconst { Context: CmsContext, useRequired: useCms } = createRequiredContext<CmsStore>('Cms')\n\n/** The stable empty conflict list (referential stability for the surfaces' memos). */\nconst NO_CONFLICTS: readonly DocumentConflict[] = []\n\n/**\n * EC-595 thin presence — ONE id per tab (per page load): the heartbeat's identity, so a\n * second tab of the same user is a second presence, and the editor leaves itself out.\n */\nconst PRESENCE_SESSION_ID = createUuidIdFactory()()\n\n\n\nfunction primaryField(collection: CollectionDef): string {\n return titleFieldOf(collection)?.name ?? collection.fields[0]?.name ?? 'id'\n}\n\n/**\n * Build a fresh document for `collectionId` (EC-297 / EC-578): an id from THE injected\n * id factory — UUIDs in the studio, so two sessions can never mint the same id (the old\n * per-session `new-<collection>-<n>` counter minted `new-post-1` in both, and the second\n * create overwrote the first) — and the collection's declared field defaults\n * (`seedDefaults`; a localized default lands in the project's default-locale bucket,\n * EC-580). Pure — unit-testable without a `CmsProvider`.\n */\nexport function buildNewDocument(\n collectionId: string,\n registry: CollectionRegistry,\n newId: IdFactory,\n locales: LocaleConfig,\n): CmsDocument {\n const collection = registry.get(collectionId)\n return {\n collection: collectionId,\n id: newId(),\n ...(collection ? seedDefaults(collection, locales) : { values: {} }),\n }\n}\n\n/**\n * EC-274 → EC-595 A2 (critic correction 9) — a singleton's first document:\n * `documents.create({ singleton: true })` (the store's `ifCollectionEmpty`\n * precondition). The race loser's `conflict` carries the winner's row, which it ADOPTS\n * — two sessions opening an empty singleton end up on ONE document. Exported for tests.\n */\nexport async function createOrAdoptSingleton(\n operations: OperationsClient,\n projectId: string,\n collectionId: string,\n seeded: Pick<CmsDocument, 'values' | 'localized'>,\n): Promise<{ ok: true; record: CmsDocumentRecord; adopted: boolean } | { ok: false; error: OperationError }> {\n const result = await operations.documents.create({\n projectId,\n collection: collectionId,\n values: seeded.values ?? {},\n ...(seeded.localized ? { localized: seeded.localized } : {}),\n singleton: true,\n })\n if (result.ok) return { ok: true, record: result.value, adopted: false }\n const error = result.error\n if (error.code === 'conflict' && 'current' in error && error.current) {\n return { ok: true, record: error.current, adopted: true }\n }\n return { ok: false, error }\n}\n\n/**\n * Does `docs` already hold a document for `collectionId`? `ensureSingletonDocument`'s\n * empty branch re-checks this INSIDE the `setDocuments` updater (against the\n * latest `prev`, not a stale snapshot) so a concurrent invocation — StrictMode's\n * double-invoked effect, or a second caller racing the same synchronous guard —\n * can never materialize a second singleton document.\n */\nexport function hasDocumentFor(docs: readonly CmsDocument[], collectionId: string): boolean {\n return docs.some((d) => d.collection === collectionId)\n}\n\n/**\n * Surface a duplicate `initial: true` across a collection's config views (EC-343/\n * EC-444) as a visible, one-time console warning — never a silent swallow. This is a\n * developer config mistake (editors can't fix config-as-code), so it takes the same\n * warn-once console channel the i18n runtime uses for config problems, not an editor\n * banner; the first-declared still seeds deterministically. Deduped per collection id.\n */\nconst warnedDuplicateDefaultCollections = new Set<string>()\nfunction warnDuplicateDefaultViews(collection: CollectionDef): void {\n if (warnedDuplicateDefaultCollections.has(collection.id)) return\n const issues = configViewIssues(collection)\n if (issues.length === 0) return\n warnedDuplicateDefaultCollections.add(collection.id)\n if (typeof console !== 'undefined') console.warn(`[views] ${issues[0]!.message}`)\n}\n\n/**\n * Surface the DEPRECATED `default: true` view flag (EC-444) as a one-time console\n * warning per collection — never silent. `default` (the view flag) is renamed to\n * `initial`; it is read as an alias for one release and removed next release. Same\n * warn-once channel as the duplicate check; deduped per collection id.\n */\nconst warnedDeprecatedDefaultCollections = new Set<string>()\nfunction warnDeprecatedDefaultFlag(collection: CollectionDef): void {\n if (warnedDeprecatedDefaultCollections.has(collection.id)) return\n const ids = deprecatedDefaultFlagViewIds(collection)\n if (ids.length === 0) return\n warnedDeprecatedDefaultCollections.add(collection.id)\n if (typeof console !== 'undefined') {\n console.warn(\n `[views] Collection \"${collection.id}\" uses the deprecated view flag \\`default\\` on ${ids.join(', ')}; rename it to \\`initial\\` (EC-444 — \\`default\\` is removed next release).`,\n )\n }\n}\n\n/** The unnamed built-in view: no filters, no sort, every field visible. */\nfunction defaultView(\n collection: CollectionDef | undefined,\n pseudo: readonly string[] = [],\n): SavedView {\n return {\n id: ALL_VIEW_ID,\n name: translate('cms.list.view.all'),\n state: collection\n ? defaultViewState(collection, pseudo)\n : { filters: [], sort: null, columns: [], hidden: [] },\n }\n}\n\nexport interface CmsProviderProps {\n children: ReactNode\n /** Enables persistence through the shared operations client. */\n projectId?: string\n /**\n * Did `initialDocuments` come from a fresh persisted-state hydration (EC-461)?\n * Drives the staged-document merge rule (`consumeStagedDocuments`): a hydrated\n * seed supersedes staged entries; a static kit/fixture seed lets them win.\n * Omitted → the historical mode default (connected hydrates, playground may not).\n */\n seedReflectsWrites?: boolean\n /**\n * The session's collections — the project's own schema (hydration, a starter\n * kit, or `elytra.config.ts`). Absent → **no collections** (EC-479): the store\n * used to fall back to `cms-core`'s `sampleFilterableCollections`, so a studio\n * whose config never arrived showed the engine's demo schema as if it were the\n * project's. The absence is now reported at the rail (`projectConfigIssues`).\n */\n initialCollections?: CollectionDef[]\n /**\n * The session's documents. Absent → **none** (EC-479; was `sampleDocuments`).\n */\n initialDocuments?: CmsDocument[]\n /**\n * Published document keys from hydration (EC-224): the version pointer\n * (`publishedVersion` set). Absent (kit / fixture sessions) → none published\n * (EC-479 retired the `samplePublishedKeys` fixture default, which only ever\n * described the engine's own sample documents).\n */\n initialPublishedKeys?: readonly string[]\n /**\n * Per-document last-write timestamps from hydration (EC-445), keyed by\n * `documentKey` (`collection:id`) → ISO string. Backs the `$updatedAt` list column.\n * Absent (playground / kit session) → the seeded documents get a session-start\n * timestamp so the column is never blank, then re-stamped on edits.\n */\n initialTimestamps?: Record<string, string>\n /**\n * Per-document FIRST-publish instants from hydration (EC-447), keyed by\n * `documentKey` (`collection:id`) → ISO string. Backs the `$publishedAt` column.\n * UNLIKE {@link initialTimestamps} there is NO session-start fallback — an absent\n * entry is a real \"no publish date\" (EmDash); the store re-stamps/clears it\n * authoritatively on publish/unpublish. Absent (playground / kit) → empty map.\n */\n initialPublishTimestamps?: Record<string, string>\n /**\n * Document keys whose draft carries unpublished changes, from hydration\n * (EC-449, the persisted `cmsDocuments.hasUnpublishedChanges === true` set) —\n * the amber \"changed\" `$state` dot. Mirrors {@link initialPublishedKeys}; the\n * store re-stamps the set authoritatively on save/publish/unpublish from the\n * returned records. Absent (playground / kit) → empty set.\n */\n initialChangedKeys?: readonly string[]\n /**\n * EC-595 A2 — each document's hydrated revision (`documentKey` → revision): the base\n * the session's patches are made against (the persister's `track`). Absent (fixture\n * sessions) → a document is read once before its first patch.\n */\n initialRevisions?: Record<string, number>\n /** EC-578 — the document-id factory. Defaults to UUIDs; fixtures inject a sequential one. */\n idFactory?: IdFactory\n /**\n * Locale config for this session — the PROJECT's own (config-declared locales,\n * or its persisted settings; see `resolveCmsInitialLocaleConfig`). Absent → the\n * active config project's locales are read directly, and failing that the\n * session runs with no locale at all rather than the engine's `en/de`\n * `sampleLocaleConfig` fixture (EC-479/EC-483: the default locale is the literal\n * storage key for localized values, so inventing one is a future data migration).\n */\n initialLocaleConfig?: LocaleConfig\n}\n\n/**\n * The CMS session store (EC-141): documents and collections are optimistic,\n * synchronous session state (live validation while typing); every mutation —\n * create/save/delete/state transitions — is mirrored onto the operations\n * layer (`documents.*` / `schema.*` commands) through {@link createCmsPersister}.\n * Failed/denied commands surface as {@link CmsStore.persistError}.\n *\n * EC-479 — this outer component exists to make ONE property structural: a CMS\n * session always runs in the project's own locale, or it does not run. The locale\n * is resolved here (the caller's, else the active `elytra.config.ts` project's)\n * and handed to {@link CmsSession} as a REQUIRED value, so no branch inside the\n * session can reach for the engine's `sampleLocaleConfig` — the default locale is\n * the storage key every localized value is written under (EC-483), and a session\n * that guessed it would corrupt content rather than fail. With no locale at all\n * the surface says so instead of editing in an invented one.\n */\nexport function CmsProvider(props: CmsProviderProps) {\n const localeConfig = props.initialLocaleConfig ?? resolveDeploymentLocaleConfig()\n if (localeConfig === undefined) return <MissingProjectLocales />\n return <CmsSession {...props} localeConfig={localeConfig} />\n}\n\n/**\n * The project declares no locales, so there is no key to write localized values\n * under. Visible and specific rather than a silent fixture locale (EC-479) — and\n * the rail foot carries the same finding as a project-level validation issue\n * (`projectConfigIssues`), so it is reported wherever the developer is looking.\n */\nfunction MissingProjectLocales() {\n return (\n <Panel className=\"m-6 p-6\">\n <Stack gap=\"2\">\n <Heading level={2} size=\"h4\">\n {translate('cms.session.noLocales.title')}\n </Heading>\n <Text size=\"sm\" tone=\"subtle\">\n {translate('cms.session.noLocales.body')}\n </Text>\n </Stack>\n </Panel>\n )\n}\n\nfunction CmsSession({\n children,\n projectId,\n initialCollections,\n initialDocuments,\n initialPublishedKeys,\n initialTimestamps,\n initialPublishTimestamps,\n initialChangedKeys,\n initialRevisions,\n idFactory,\n seedReflectsWrites,\n localeConfig,\n}: CmsProviderProps & { localeConfig: LocaleConfig }) {\n // EC-578: THE id factory for this session (documents created here).\n const [newId] = useState<IdFactory>(() => idFactory ?? createUuidIdFactory())\n const [documents, setDocuments] = useState<CmsDocument[]>(() => {\n const seeded = (initialDocuments ?? []).map((d) => structuredClone(d))\n // EC-320 (0.0.44 follow-up): merge any documents STAGED by the\n // Components-view \"Use in document…\" transfer — a cross-mount handoff in\n // EVERY mode (see document-staging.ts). EC-461: the merge rule keys on the\n // seed's PROVENANCE — a hydrated seed (fresh persisted-state query, both\n // modes now) supersedes staged entries; a static kit/fixture seed lets\n // them win (they are the only cross-mount signal of a live edit there).\n return seedReflectsWrites === undefined\n ? consumeStagedDocuments(projectId, seeded)\n : consumeStagedDocuments(projectId, seeded, seedReflectsWrites)\n })\n // Published-ness as the version POINTER (EC-224), decoupled from the flat\n // `state` enum: seeded from hydration's pointer set. A kit's imported content\n // (`initialDocuments` without a pointer set) starts unpublished (drafts) until\n // an editor publishes it, and so does a session with no pointer set at all —\n // EC-479 retired the `samplePublishedKeys` branch, which pinned the ENGINE's\n // sample documents live in a session that no longer has any. The flat `state`\n // is never consulted.\n const [publishedKeys, setPublishedKeys] = useState<Set<string>>(\n () => new Set(initialPublishedKeys ?? []),\n )\n // EC-445: per-document last-write timestamps behind the `$updatedAt` column.\n // Seeded from hydration (connected: the persisted `cmsDocuments.updatedAt`), then\n // re-stamped on the common edit paths. A seeded document with no hydrated timestamp\n // (the playground fixtures / a kit) gets a session-start stamp so the column is\n // never a wall of blanks; a fresh draft is stamped when it is created.\n const [updatedAtByKey, setUpdatedAtByKey] = useState<Map<string, string>>(() => {\n const now = new Date().toISOString()\n const map = new Map<string, string>()\n if (initialTimestamps) {\n for (const [key, value] of Object.entries(initialTimestamps)) map.set(key, value)\n }\n for (const doc of initialDocuments ?? []) {\n const key = documentKey(doc)\n if (!map.has(key)) map.set(key, now)\n }\n return map\n })\n const stampUpdatedAt = useCallback(\n (ref: DocumentRef, iso: string = new Date().toISOString()) => {\n setUpdatedAtByKey((prev) => {\n const next = new Map(prev)\n next.set(documentKey(ref), iso)\n return next\n })\n },\n [],\n )\n const documentUpdatedAt = useCallback(\n (ref: DocumentRef) => updatedAtByKey.get(documentKey(ref)),\n [updatedAtByKey],\n )\n // EC-447: per-document FIRST-publish instants behind the `$publishedAt` column.\n // Seeded from hydration (the persisted `cmsDocuments.publishedAt`); UNLIKE\n // `$updatedAt` there is NO session-start fallback — an absent entry is a real \"no\n // publish date\" (EmDash). The store re-stamps/clears it authoritatively on\n // publish/unpublish (the set-once + clear semantics live in the persistence spine).\n const [publishedAtByKey, setPublishedAtByKey] = useState<Map<string, string>>(() => {\n const map = new Map<string, string>()\n if (initialPublishTimestamps) {\n for (const [key, value] of Object.entries(initialPublishTimestamps)) map.set(key, value)\n }\n return map\n })\n // Adopt the AUTHORITATIVE publish instant from the reconciled record: an ISO value\n // stamps it (set-once is enforced server-side, so this only ever adopts the pinned\n // first-publish value); `undefined` CLEARS it (unpublish). Mirrors `stampUpdatedAt`\n // but supports clearing — the column shows a date iff the doc is currently published.\n const stampPublishedAt = useCallback((ref: DocumentRef, iso: string | undefined) => {\n setPublishedAtByKey((prev) => {\n const key = documentKey(ref)\n if (iso === undefined) {\n if (!prev.has(key)) return prev\n const next = new Map(prev)\n next.delete(key)\n return next\n }\n if (prev.get(key) === iso) return prev\n const next = new Map(prev)\n next.set(key, iso)\n return next\n })\n }, [])\n const documentPublishedAt = useCallback(\n (ref: DocumentRef) => publishedAtByKey.get(documentKey(ref)),\n [publishedAtByKey],\n )\n // EC-449: the documents whose draft carries unpublished changes — the amber\n // \"changed\" `$state` dot. A SET like `publishedKeys` (membership = the\n // materialized `hasUnpublishedChanges === true`); seeded from hydration, then\n // re-stamped authoritatively from returned records — the verdict is computed\n // ONCE at the write chokepoint (both adapters), never client-side per render.\n const [changedKeys, setChangedKeys] = useState<Set<string>>(\n () => new Set(initialChangedKeys ?? []),\n )\n // Adopt the authoritative flag: `true` adds the key; `false`/`undefined` (not\n // changed / cleared at unpublish / not materialized) both remove it — the dot\n // renders those identically, so the set stores no tri-state.\n const stampHasUnpublishedChanges = useCallback(\n (ref: DocumentRef, changed: boolean | undefined) => {\n setChangedKeys((prev) => {\n const key = documentKey(ref)\n if (prev.has(key) === (changed === true)) return prev\n const next = new Set(prev)\n if (changed === true) next.add(key)\n else next.delete(key)\n return next\n })\n },\n [],\n )\n const documentHasUnpublishedChanges = useCallback(\n (ref: DocumentRef) => changedKeys.has(documentKey(ref)),\n [changedKeys],\n )\n // The one adoption seam for a SAVED document record (persister queue upsert,\n // inline cell edit, bulk set-field, restore): stamp the server-computed\n // changed verdict for the record's ref. Referentially stable — the persister\n // closes over it once.\n const adoptSavedRecord = useCallback(\n (record: CmsDocumentRecord) => {\n const ref = { collection: record.document.collection, id: record.document.id }\n stampHasUnpublishedChanges(ref, record.hasUnpublishedChanges)\n // EC-595 A2: an adopted row also carries the chokepoint's last-write instant.\n if (record.updatedAt) stampUpdatedAt(ref, record.updatedAt)\n },\n [stampHasUnpublishedChanges, stampUpdatedAt],\n )\n const [activeViews, setActiveViews] = useState<Record<string, string>>({})\n // The live table state per collection where it diverges from the active\n // view; absent key = exactly the active view's state (not dirty).\n const [tableStates, setTableStates] = useState<Record<string, TableViewState>>({})\n // Collections are stateful so AI-generated schemas (EC-097) can be accepted\n // into the session. The session schema IS the source the sort/filter\n // offering follows (EC-177 gap 3): hydrated sessions receive the persisted\n // schema via `initialCollections`, which is the project's own throughout —\n // hydration, a kit, or `elytra.config.ts` (`resolveCmsInitialCollections`).\n // EC-479: with none, the session has NO collections and the rail says so; it\n // no longer borrows the engine's sample schema, which offered `filterable`\n // fields the project's real backend would reject.\n const [collections, setCollections] = useState<CollectionDef[]>(() => [\n ...(initialCollections ?? []),\n ])\n const [persistError, setPersistError] = useState<OperationError | null>(null)\n // EC-595 A2: the open per-field conflicts, by document key.\n const [conflictsByKey, setConflictsByKey] = useState<ReadonlyMap<string, readonly DocumentConflict[]>>(\n () => new Map(),\n )\n // EC-274 → EC-595 A2: collection ids whose singleton create this session already\n // issued — a synchronous guard so a re-invoked effect (or StrictMode's double mount)\n // never issues a second create (the store's `ifCollectionEmpty` would refuse it anyway).\n const ensuredSingletons = useRef<Set<string>>(new Set())\n\n // Latest session state for the persister's lazy baseline (no re-subscribing).\n const collectionsRef = useRef(collections)\n collectionsRef.current = collections\n const documentsRef = useRef(documents)\n documentsRef.current = documents\n\n const persisterRef = useRef<CmsPersister | null>(null)\n if (persisterRef.current === null && projectId !== undefined) {\n persisterRef.current = createCmsPersister({\n projectId,\n getOperations: async () => (await getStudioOperations()).operations,\n getCollections: () => collectionsRef.current,\n // EC-277: self-type composition static props on write (the manifest half of\n // the lens), so extraction stays schema-free. Document fields self-type via\n // the schema alone (above); the registry adds blocks/embed prop coverage.\n lookupManifest: studioManifestLookup(),\n onError: setPersistError,\n // EC-595 A2: the persister owns the session's view of every document it writes —\n // the adopted server row with the unflushed local patches re-applied — so an\n // adopted row (a write result, a subscription push, a conflict's current) shows\n // here at once, canonical values included (EC-586 found-but-left).\n onDocument: (ref, doc) =>\n setDocuments((prev) => (doc ? upsertDoc(prev, doc) : removeDoc(prev, ref))),\n // EC-449: adopt the server-computed `hasUnpublishedChanges` verdict (and the\n // timestamps) from every adopted row — the chokepoint's, never a client guess.\n onRecord: adoptSavedRecord,\n onConflicts: (ref, conflicts) =>\n setConflictsByKey((prev) => {\n const next = new Map(prev)\n if (conflicts.length === 0) next.delete(documentKey(ref))\n else next.set(documentKey(ref), conflicts)\n return next\n }),\n })\n // The base every hydrated document's patches are made against (EC-595 A2).\n for (const doc of initialDocuments ?? []) {\n const revision = initialRevisions?.[documentKey(doc)]\n if (revision !== undefined) persisterRef.current.track({ document: doc, revision })\n }\n }\n\n // EC-224: published-ness IS the version pointer (`publishedKeys`) — the SOLE\n // studio source of truth. Declared up here (EC-497) because it is part of THE\n // validation option bag, which the cell-edit commit — defined above the publish\n // helpers — now also takes.\n const isPublished = useCallback(\n (ref: DocumentRef) => publishedKeys.has(documentKey(ref)),\n [publishedKeys],\n )\n\n const registry = useMemo(() => createCollectionRegistry(collections), [collections])\n const store = useMemo(() => createDocumentStore(documents), [documents])\n\n // Asset references are validated against the REAL asset library (assets live in\n // their own repository, not as CMS documents). EC-588: the oracle returns the\n // RECORD, so one lookup answers existence AND the field's `accept`. It is absent —\n // no asset checks — with no provider mounted and while the library loads or\n // errors (`assetLibraryOracle`), so a valid upload is never transiently flagged.\n const assetStore = useOptionalAssets()\n const findAsset = useMemo(() => assetLibraryOracle(assetStore), [assetStore])\n\n // The ambient studio locale (EC-176): this session's locale config drives\n // the switcher options; every CMS surface follows the one active locale.\n // EC-479: the ambient store is `null` until this effect installs the project's\n // config (it no longer opens on the engine's `en/de` fixture), so the FIRST\n // render — and any surface mounted outside a CMS session — reads the project's\n // own default here rather than a locale nobody declared.\n const { locale } = useStudioLocale()\n const activeLocale = locale ?? localeConfig.default\n useEffect(() => {\n configureStudioLocales(localeConfig)\n }, [localeConfig])\n\n const getCollection = useCallback((id: string) => registry.get(id), [registry])\n\n const getDocument = useCallback(\n (ref: DocumentRef) => documents.find((d) => matchesRef(d, ref)),\n [documents],\n )\n\n const titleOf = useCallback(\n (ref: DocumentRef) => {\n const doc = documents.find((d) => matchesRef(d, ref))\n const collection = registry.get(ref.collection)\n if (!doc || !collection) return ref.id\n // EC-296/EC-242/EC-580: THE identity resolver (a string `titleField` or a\n // function pattern) over the document's displayed view in the ambient active\n // locale (EC-176) — `valuesInLocale`, with the EC-018 fallback — so localized\n // titles follow the switcher and agree with the list title column and the\n // detail header, which read the same view.\n return resolveDocumentTitle(\n collection,\n valuesInLocale(collection, doc, activeLocale, localeConfig),\n ref.id,\n )\n },\n [documents, registry, localeConfig, activeLocale],\n )\n\n const commitPatches = useCallback(\n (\n ref: DocumentRef,\n patches: readonly DocumentPatch[],\n bases?: readonly (number | undefined)[],\n ): Promise<CommitOutcome | undefined> => {\n if (patches.length === 0) return Promise.resolve(undefined)\n stampUpdatedAt(ref) // EC-445: a write bumps the $updatedAt column (the row's own stamp follows)\n const persister = persisterRef.current\n const current = documentsRef.current.find((d) => matchesRef(d, ref))\n if (!persister) {\n // A fixture session (no project): apply locally, the same merge the stores run.\n if (current) {\n const next = applyDocumentPatches({ document: current, patches, since: [] }).document\n setDocuments((prev) => replaceDoc(prev, next))\n }\n return Promise.resolve(undefined)\n }\n return persister.commit(ref, patches, current, bases)\n },\n [stampUpdatedAt],\n )\n\n const insertDocument = useCallback(\n (doc: CmsDocument) => {\n stampUpdatedAt(doc) // EC-445: a fresh document's $updatedAt starts at creation\n const persister = persisterRef.current\n if (persister) persister.create(doc)\n else setDocuments((prev) => upsertDoc(prev, doc))\n },\n [stampUpdatedAt],\n )\n\n const commitFieldEdit = useCallback(\n (input: CellCommitInput): Promise<CellCommitOutcome> => {\n // Pure map-replace: an edit always targets a document already open in\n // the session, so a miss (already gone) is a no-op, never an append.\n const replaceWith = (doc: CmsDocument) => setDocuments((prev) => replaceDoc(prev, doc))\n const persister = persisterRef.current\n const ref = { collection: input.doc.collection, id: input.doc.id }\n return commitCellEdit(\n {\n registry,\n documents: documentsRef.current,\n localeConfig,\n // EC-497: the remaining halves of THE option bag. A cell edit now\n // validates with exactly what the editor and the publish gate use and\n // filters the result to the committed cell — it is not a weaker check.\n isPublished,\n ...(findAsset ? { findAsset } : {}),\n // EC-445: the optimistic apply bumps the $updatedAt column (a rollback\n // leaves it — it self-corrects on the next hydration).\n applySession: (doc) => {\n replaceWith(doc)\n stampUpdatedAt(doc)\n },\n // EC-595 A2: in a persisted session the persister's view is the truth — a\n // refused cell shows theirs (mine is dropped, see below), a failed one keeps\n // the local value queued for the next flush (no silent loss).\n rollbackSession: (previous) => replaceWith(persister?.documentOf(ref) ?? previous),\n ...(persister && projectId !== undefined\n ? {\n // EC-595 A2: ONE field patch through the persister's queue — at the\n // revision the row was at — never a whole-document side channel.\n dispatch: async (next: CmsDocument): Promise<OperationResult<unknown>> => {\n const patch = fieldWritePatch(input.collection, next, input.field.name, input.locale)\n const outcome = await persister.commit(ref, [patch], input.doc)\n if (outcome.status === 'applied') return { ok: true, value: outcome.record }\n if (outcome.status === 'failed') return { ok: false, error: outcome.error }\n // Refused: someone changed this cell's field since the row loaded. A\n // table cell has no room for take/keep, so it takes theirs and says so;\n // the editor offers the choice.\n for (const conflict of outcome.conflicts) persister.resolveConflict(ref, conflict.id, 'theirs')\n return {\n ok: false,\n error: {\n code: 'conflict',\n key: documentKey(ref),\n message: 'This field was changed by someone else since you loaded it — their value is shown.',\n messageRef: { key: 'cms.conflict.cellRefused' },\n },\n }\n },\n }\n : {}),\n },\n input,\n )\n },\n [\n registry,\n localeConfig,\n projectId,\n isPublished,\n findAsset,\n stampUpdatedAt,\n ],\n )\n\n const createDocument = useCallback(\n (collectionId: string): DocumentRef => {\n // EC-578: the id comes from the injected factory; create is insert-if-absent.\n const doc = buildNewDocument(collectionId, registry, newId, localeConfig)\n insertDocument(doc)\n return { collection: collectionId, id: doc.id }\n },\n [registry, newId, localeConfig, insertDocument],\n )\n\n // EC-274 (re-scopes EC-217): a singleton is a UI lens, not a fixed id. When the\n // session holds none of the collection's documents, create one through\n // `documents.create({ singleton: true })` (EC-595 A2) — the store's\n // `ifCollectionEmpty` precondition, so two sessions on an empty singleton make ONE\n // document; the loser's conflict carries the winner's row, which it adopts. Either\n // way the document lands in the session and the gate opens it. Idempotent (the ref\n // guard); a fixture session (no project) creates locally.\n const ensureSingletonDocument = useCallback(\n (collectionId: string): void => {\n if (documentsRef.current.some((d) => d.collection === collectionId)) return\n if (ensuredSingletons.current.has(collectionId)) return\n ensuredSingletons.current.add(collectionId)\n const collection = registry.get(collectionId)\n const seeded = collection ? seedDefaults(collection, localeConfig) : { values: {} }\n const persister = persisterRef.current\n if (!persister || projectId === undefined) {\n const doc = { collection: collectionId, id: newId(), ...seeded }\n setDocuments((prev) => (hasDocumentFor(prev, collectionId) ? prev : [...prev, doc]))\n return\n }\n void (async () => {\n const { operations } = await getStudioOperations()\n const outcome = await createOrAdoptSingleton(operations, projectId, collectionId, seeded)\n if (!outcome.ok) {\n setPersistError(outcome.error)\n ensuredSingletons.current.delete(collectionId)\n return\n }\n persister.track(outcome.record)\n adoptSavedRecord(outcome.record)\n setDocuments((prev) => upsertDoc(prev, outcome.record.document))\n })()\n },\n [registry, localeConfig, projectId, newId, adoptSavedRecord],\n )\n\n const deleteDocument = useCallback((ref: DocumentRef) => {\n setDocuments((prev) => removeDoc(prev, ref))\n persisterRef.current?.deleteDocument(ref)\n }, [])\n\n // EC-224: published-ness IS the version pointer (`publishedKeys`) — the SOLE\n // studio source of truth, read via `isPublished`. The live row stays a\n // continuous draft (Sanity model); no flat `state` mirror is maintained. Every\n // reader now consults the pointer (the table badge/$state via `isPublished`,\n // the preview engine via the pin), so the flat field is read by nothing here.\n const setPublished = useCallback((ref: DocumentRef, published: boolean) => {\n const key = documentKey(ref)\n setPublishedKeys((prev) => {\n if (prev.has(key) === published) return prev\n const next = new Set(prev)\n if (published) next.add(key)\n else next.delete(key)\n return next\n })\n }, [])\n\n // Reconcile published-ness for a ref against the AUTHORITATIVE backend record\n // (EC-225): the optimistic flip is a guess; once the queued op settles we read\n // the actual pin so the badge can never claim a state the backend refused\n // (a publish blocked by field rules, an unpublish blocked by a strict ref).\n const reconcilePublished = useCallback(\n async (ref: DocumentRef) => {\n if (projectId === undefined) return\n const { operations } = await getStudioOperations()\n const record = await operations.documents.get({ projectId, ref })\n if (record.ok) {\n setPublished(ref, record.value.publishedVersion !== undefined)\n // EC-445: publish/unpublish patches `updatedAt` — adopt the authoritative\n // value so the $updatedAt column reflects the actual write, not a guess.\n if (record.value.updatedAt) stampUpdatedAt(ref, record.value.updatedAt)\n // EC-447: adopt the authoritative `publishedAt` — set-once on the first\n // publish, absent after unpublish. Passing `undefined` CLEARS the column, so\n // an unpublish reverts $publishedAt to EmDash and a republish records fresh.\n stampPublishedAt(ref, record.value.publishedAt)\n // EC-449: adopt the authoritative changed flag — `false` after a publish\n // (the draft became the baseline), absent after an unpublish (cleared).\n stampHasUnpublishedChanges(ref, record.value.hasUnpublishedChanges)\n }\n },\n [projectId, setPublished, stampUpdatedAt, stampPublishedAt, stampHasUnpublishedChanges],\n )\n\n /**\n * EC-595 binding point 6 — publish the revision the client validated. FORCED FLUSH\n * first (the pending patches land, the session adopts the committed draft), then\n * `documents.publish({ expectedRevision })`: the store refuses when the draft moved\n * since (a colleague's save landed in between — Codex P05). On that refusal the\n * session adopts the current row, RE-VALIDATES it, and retries — bounded, and never\n * past a validation error the new draft carries. Returns the outcome so a bulk run\n * can report it.\n */\n const publishWithRevision = useCallback(\n async (ref: DocumentRef): Promise<OperationResult<unknown>> => {\n const persister = persisterRef.current\n if (!persister || projectId === undefined) return { ok: true, value: undefined }\n const { operations } = await getStudioOperations()\n return publishRevision(ref, {\n flush: (target) => persister.flush(target),\n revisionOf: (target) => persister.revisionOf(target),\n publish: (target, expectedRevision) =>\n operations.documents.publish({\n projectId,\n ref: target,\n ...(expectedRevision !== undefined ? { expectedRevision } : {}),\n }),\n adopt: (record) => persister.adoptRecord(record),\n documentOf: (target) => persister.documentOf(target),\n validate: (doc) => validateRef.current(doc),\n })\n },\n [projectId],\n )\n\n const publishDocument = useCallback(\n (ref: DocumentRef) =>\n // EC-585: the hidden-clear runs INSIDE `documents.publish` (for this and every\n // other caller), and a refusal rejects — see `publishInSession`.\n publishInSession(ref, {\n markPublished: (target) => setPublished(target, true), // optimistic\n publish: publishWithRevision,\n reconcile: reconcilePublished,\n report: setPersistError,\n describe: operationErrorMessage,\n }),\n [setPublished, reconcilePublished, publishWithRevision],\n )\n\n const unpublishDocument = useCallback(\n async (ref: DocumentRef) => {\n setPublished(ref, false) // optimistic\n persisterRef.current?.unpublishDocument(ref)\n await persisterRef.current?.flush(ref)\n await reconcilePublished(ref)\n },\n [setPublished, reconcilePublished],\n )\n\n const loadDocumentVersions = useCallback(\n async (ref: DocumentRef): Promise<DocumentVersionsView> => {\n // No persisted backend (fixture/playground): no recorded history.\n if (projectId === undefined) return { versions: [] }\n const { operations } = await getStudioOperations()\n const [versionsRes, recordRes] = await Promise.all([\n operations.documents.listVersions({ projectId, ref }),\n operations.documents.get({ projectId, ref }),\n ])\n if (!versionsRes.ok) {\n setPersistError(versionsRes.error)\n return { versions: [] }\n }\n // The pinned (live) version comes off the document record; a never-saved\n // doc simply has no record (and no versions) — not an error to surface.\n const publishedVersion = recordRes.ok ? recordRes.value.publishedVersion : undefined\n return {\n versions: versionsRes.value,\n ...(publishedVersion !== undefined ? { publishedVersion } : {}),\n }\n },\n [projectId],\n )\n\n const restoreDocumentVersion = useCallback(\n async (\n ref: DocumentRef,\n version: number,\n scope?: RestoreScope,\n ): Promise<CmsDocument | null> => {\n if (projectId === undefined) return null\n // FORCED FLUSH: land any queued edits before the restore reads the current draft\n // to snapshot it. This is what makes a granular (field/block) restore merge over\n // the LATEST draft — and the restore replaces AT the revision it read (EC-595).\n await persisterRef.current?.flush(ref)\n const { operations } = await getStudioOperations()\n const result = await operations.documents.restore({\n projectId,\n ref,\n version,\n ...(scope ? { scope } : {}),\n })\n if (!result.ok) {\n setPersistError(result.error)\n return null\n }\n // EC-595 A2: the restored row is adopted as the new base (its revision, its\n // canonical values, its changed flag — EC-449) and shows in the session.\n const persister = persisterRef.current\n if (persister) persister.adoptRecord(result.value)\n else setDocuments((prev) => replaceDoc(prev, result.value.document))\n adoptSavedRecord(result.value)\n return persister?.documentOf(ref) ?? result.value.document\n },\n [projectId, adoptSavedRecord],\n )\n\n /**\n * EC-497 — THE option bag (AD-497a), built once and used by every surface that\n * validates a CMS document. `gateValidateOptions` is the only place options are\n * assembled; before it there were seven hand-assembled subsets and the weakest\n * one was the publish gate. Note it carries `isPublished` too: the EC-173\n * weak-reference warning sources published-ness from the version POINTER, so\n * editing a published doc that references an unpublished target surfaces the\n * fallback warning (it had gone inert when the flat `state` mirror was dropped).\n */\n const validateOptions = useMemo(\n () =>\n gateValidateOptions({\n store,\n localeConfig,\n isPublished,\n ...(findAsset ? { findAsset } : {}),\n }),\n [store, localeConfig, isPublished, findAsset],\n )\n\n const validate = useCallback(\n (doc: CmsDocument): CmsValidationIssue[] => {\n const issues = validateDocument(registry, doc, validateOptions)\n // EC-492: a document whose composed URL no request can reach — a top-level\n // slug that collides with a declared locale code, which the host reads as a\n // locale prefix. Not part of `validateDocument` because it needs the project\n // ROUTES (the schema validator is route-free by design); emitted here, where\n // the deployment's routes and the collection's sibling set are both in hand.\n // Silent in a single-locale project — the fault is structurally impossible.\n const collection = registry.get(doc.collection)\n if (!collection) return issues\n return [\n ...issues,\n ...documentReachabilityIssues(\n { routes: resolveDeploymentRoutes(), localeConfig },\n collection,\n doc,\n { siblings: documents.filter((sibling) => sibling.collection === doc.collection) },\n ),\n ]\n },\n [registry, validateOptions, documents, localeConfig],\n )\n\n // The publish retry re-validates with the session's latest rules (a ref: no churn).\n const validateRef = useRef(validate)\n validateRef.current = validate\n\n // EC-595 A2 (F23): this session no longer publishes its validator to a module-global\n // gate seam. The publish gate validates with the operations bundle's runtime\n // validator (`lib/operations/runtime-validator.ts` — the operation's project config +\n // oracles prefetched through the adapter), so mounting a second provider (the\n // transfer dialog) can no longer change a verdict. `validate` above stays the\n // session's DISPLAY validation (the editor's issues, cell edit, import, AI).\n\n const importDocuments = useCallback(\n (collectionId: string, raw: unknown[]): ImportReport => {\n const report: ImportReport = { added: 0, rejected: [] }\n // Pre-parse so intra-batch relation/asset targets resolve during validation.\n const parsedBatch: CmsDocument[] = []\n const schemaFails: { item: unknown; error: ReturnType<typeof documentSchema.safeParse> }[] =\n []\n for (const item of raw) {\n const parsed = documentSchema.safeParse({ ...(item as object), collection: collectionId })\n if (parsed.success) parsedBatch.push(parsed.data)\n else schemaFails.push({ item, error: parsed })\n }\n for (const { item, error } of schemaFails) {\n report.rejected.push({\n id: (item as { id?: string })?.id ?? translate('cms.list.import.noId'),\n issues: (error.success ? [] : error.error.issues).map((e) => ({\n code: 'invalid-field-value' as const,\n severity: 'error' as const,\n message: e.message,\n path: e.path.map((p) => (typeof p === 'symbol' ? String(p) : p)),\n })),\n })\n }\n // Validate each against existing docs PLUS the rest of the batch.\n const batchStore = createDocumentStore([...documents, ...parsedBatch])\n const accepted: CmsDocument[] = []\n // EC-497: the same bag as everywhere else, over the batch-aware store. It\n // used to omit the composition leashes and the published-ness pointer, so an\n // import could land a document the editor would immediately flag.\n const importOptions = gateValidateOptions({\n store: batchStore,\n localeConfig,\n isPublished,\n ...(findAsset ? { findAsset } : {}),\n })\n for (const doc of parsedBatch) {\n const issues = validateDocument(registry, doc, importOptions)\n const errors = issues.filter((iss) => iss.severity === 'error')\n if (errors.length > 0) report.rejected.push({ id: doc.id, issues: errors })\n else accepted.push(doc)\n }\n if (accepted.length > 0) {\n // Replace-or-append (upsert): an imported row may be brand new to the\n // session, so each accepted document must land even with no prior\n // entry for its ref.\n // EC-595 A2: a row new to the store is CREATED (insert-if-absent); a row the\n // session already holds is REPLACED at the revision it was loaded at — an import\n // never overwrites a change made since.\n const persister = persisterRef.current\n if (!persister) setDocuments((prev) => accepted.reduce((acc, doc) => upsertDoc(acc, doc), prev))\n for (const doc of accepted) {\n if (!persister) continue\n if (persister.revisionOf(doc) !== undefined) persister.replace(doc)\n else persister.create(doc)\n }\n // EC-224: imports land as the working DRAFT. Publish-ness is the version\n // pointer (`publishedKeys`), set by publishing — never carried in the\n // imported row — so an import never auto-publishes; the editor publishes\n // explicitly afterward.\n report.added = accepted.length\n }\n return report\n },\n [registry, documents, localeConfig, isPublished, findAsset],\n )\n\n const isFieldReadOnly = useCallback((field: FieldDef) => field.form?.readOnly === true, [])\n\n // --- Views (EC-246b: config-as-code) --------------------------------------\n\n // EC-445: the reserved pseudo-columns a CMS collection's list surfaces. Every\n // `cmsDocuments` collection has a publish lifecycle + materialized timestamps\n // ($state + $updatedAt always apply); $url applies only where the deployment\n // resolves a delivery route for it (mirrors the live-URL column's own guard).\n const pseudoColumnsFor = useCallback(\n (collectionId: string): string[] => {\n const collection = registry.get(collectionId)\n if (!collection) return []\n const routable = resolveDeploymentRoutes().some(\n (route) => route.document?.collection === collectionId,\n )\n return pseudoColumns(collection, { publishing: true, timestamps: true, routable })\n },\n [registry],\n )\n\n const viewsOf = useCallback(\n (collectionId: string): SavedView[] => {\n // The baseline view plus the collection's config-declared views (EC-246b/EC-444).\n // Views are PRESENTATION, read live from elytra.config.ts (AD-11) — not the\n // persisted content schema the session booted from — so they reflect code\n // immediately without a re-seed (the persisted schema is only baselined on\n // first run). The EC-169 DB saved-view store is retired: shared views are\n // code, editors keep only transient in-session tweaks + Reset.\n //\n // EC-444: a config view with the reserved `id: 'default'` REPLACES the\n // synthesized \"All entries\" baseline verbatim (first tab); absent one, the\n // synthesized baseline leads. `resolveCollectionViews` owns that selection.\n const pseudo = pseudoColumnsFor(collectionId)\n const baseline = defaultView(registry.get(collectionId), pseudo)\n const configCollection = resolveDeploymentCollections().find((c) => c.id === collectionId)\n if (!configCollection) return [baseline]\n return resolveCollectionViews(configCollection, baseline, pseudo)\n },\n [registry, pseudoColumnsFor],\n )\n\n // The INITIAL active view for a collection (EC-343/EC-444): a config view flagged\n // `initial: true` seeds the first-load lens; else the baseline — the `id: 'default'`\n // override when present, else the synthesized \"All entries\" (`ALL_VIEW_ID`). Only\n // consulted before the editor has picked a view (`activeViews[id]` wins once set),\n // so transient switching + Reset are unaffected. A duplicate `initial` and any\n // deprecated `default` flag are each warned once (never silent).\n const initialViewId = useCallback((collectionId: string): string => {\n const configCollection = resolveDeploymentCollections().find((c) => c.id === collectionId)\n if (!configCollection) return ALL_VIEW_ID\n warnDuplicateDefaultViews(configCollection)\n warnDeprecatedDefaultFlag(configCollection)\n const initial = defaultConfigViewId(configCollection)\n if (initial) return initial\n return hasDefaultViewOverride(configCollection) ? DEFAULT_VIEW_OVERRIDE_ID : ALL_VIEW_ID\n }, [])\n\n const activeViewOf = useCallback(\n (collectionId: string): SavedView => {\n const id = activeViews[collectionId] ?? initialViewId(collectionId)\n return (\n viewsOf(collectionId).find((view) => view.id === id) ??\n defaultView(registry.get(collectionId), pseudoColumnsFor(collectionId))\n )\n },\n [activeViews, initialViewId, viewsOf, registry, pseudoColumnsFor],\n )\n\n const tableStateOf = useCallback(\n (collectionId: string): TableViewState =>\n tableStates[collectionId] ?? activeViewOf(collectionId).state,\n [tableStates, activeViewOf],\n )\n\n const dropTableState = useCallback((collectionId: string) => {\n setTableStates((prev) => {\n if (!(collectionId in prev)) return prev\n const next = { ...prev }\n delete next[collectionId]\n return next\n })\n }, [])\n\n const setActiveView = useCallback(\n (collectionId: string, viewId: string) => {\n setActiveViews((prev) => ({ ...prev, [collectionId]: viewId }))\n dropTableState(collectionId)\n },\n [dropTableState],\n )\n\n // --- Bulk actions (EC-169) ------------------------------------------------\n\n const runBulk = useCallback(\n async (\n collectionId: string,\n ids: readonly string[],\n action: BulkAction,\n setField?: BulkSetField,\n ): Promise<BulkReport> => {\n const collection = registry.get(collectionId)\n // A set-field needs both the field payload AND the collection def to fold\n // the value the locale-aware way — guard so a misconfigured call fails\n // loud rather than silently no-opping each item.\n if (action === 'set-field' && (!setField || !collection)) {\n return {\n action,\n ...(setField ? { setField } : {}),\n results: ids.map((id) => ({\n ref: { collection: collectionId, id },\n title: titleOf({ collection: collectionId, id }),\n ok: false,\n reason: translate('cms.list.bulk.error.invalidSetField'),\n error: { code: 'unknown', message: 'Invalid set-field request.' },\n })),\n }\n }\n // The next document for a set-field item: fold the value into the active\n // locale's bag (localized) or the shared `values` (non-localized).\n const setFieldDoc = (doc: CmsDocument): CmsDocument =>\n writeField(collection!, doc, setField!.field, activeLocale, setField!.value)\n\n let dispatch:\n | ((action: BulkAction, ref: DocumentRef) => Promise<OperationResult<unknown>>)\n | undefined\n const persister = persisterRef.current\n if (persister && projectId !== undefined) {\n // Pending queued writes land first, then one awaited command per item.\n await persister.flush()\n const { operations } = await getStudioOperations()\n dispatch = async (bulkAction, ref) => {\n if (bulkAction === 'delete') return operations.documents.delete({ projectId, ref })\n // EC-595 point 6: publish the revision validated, with the same retry.\n if (bulkAction === 'publish') return publishWithRevision(ref)\n if (bulkAction === 'unpublish') return operations.documents.unpublish({ projectId, ref })\n // set-field: ONE field patch per document through the persister (EC-595 A2) —\n // the operation canonicalises the value by the field (EC-277/EC-586).\n const current = documentsRef.current.find((d) => matchesRef(d, ref))\n if (!current) {\n return Promise.resolve<OperationResult<unknown>>({\n ok: false,\n error: {\n code: 'not-found',\n message: 'Document is no longer in the session.',\n entity: 'cms-document',\n key: `${ref.collection}:${ref.id}`,\n },\n })\n }\n const written = setFieldDoc(current)\n const outcome = await persister.commit(\n ref,\n [fieldWritePatch(collection!, written, setField!.field, activeLocale)],\n current,\n )\n if (outcome.status === 'applied') return { ok: true, value: outcome.record }\n if (outcome.status === 'failed') return { ok: false, error: outcome.error }\n // Refused: the field changed since — the item fails visibly; theirs stays.\n for (const conflict of outcome.conflicts) persister.resolveConflict(ref, conflict.id, 'theirs')\n return {\n ok: false,\n error: {\n code: 'conflict',\n key: documentKey(ref),\n message: 'This field was changed by someone else since you loaded it — their value is kept.',\n messageRef: { key: 'cms.conflict.cellRefused' },\n },\n }\n }\n }\n return runBulkAction(\n {\n documents: documentsRef.current,\n titleOf,\n // EC-497: THE bag, over the freshest session snapshot (`runBulk` is\n // async, so `documentsRef.current` — not the memoized store — is the\n // world as it is now). It used to be assembled here and silently missed\n // `isPublished`, so a bulk publish and a single publish of the same\n // document could disagree about the EC-173 weak-reference warning.\n validate: (doc) =>\n validateDocument(\n registry,\n doc,\n gateValidateOptions({\n store: createDocumentStore(documentsRef.current),\n localeConfig,\n isPublished,\n ...(findAsset ? { findAsset } : {}),\n }),\n ),\n // EC-585: no clean step here — the hidden-clear runs inside the one publish\n // operation each item's `publishWithRevision` dispatches (EC-425's shared\n // clean point, moved to where every publish path crosses it).\n // EC-224: a succeeded publish/unpublish moves the version pointer\n // (`publishedKeys`) via setPublished — there is no separate flat\n // `state` mirror to keep in sync (published-ness is derived from the\n // pointer set).\n // EC-449: either transition resolves the changed flag — publish writes\n // `false` (the draft became the baseline), unpublish clears it — and\n // bulk has no per-item record reconcile, so mirror that here.\n applyState: (ref, state) => {\n setPublished(ref, state === 'published')\n stampHasUnpublishedChanges(ref, false)\n },\n applyDelete: (ref) => setDocuments((prev) => removeDoc(prev, ref)),\n // EC-247: fold the new value into the session document (same\n // locale-aware path the dispatched upsert used). Not a plain\n // `replaceDoc` — the replacement is computed FROM each matched\n // document (`setFieldDoc(d)`), not a fixed value to swap in.\n // A persisted session's view already holds the committed patch (the persister);\n // a fixture session folds the value locally.\n applySetField: (ref) => {\n if (persisterRef.current) return\n setDocuments((prev) => prev.map((d) => (matchesRef(d, ref) ? setFieldDoc(d) : d)))\n },\n ...(dispatch ? { dispatch } : {}),\n },\n collectionId,\n ids,\n action,\n setField,\n )\n },\n [\n projectId,\n titleOf,\n registry,\n localeConfig,\n activeLocale,\n setPublished,\n isPublished,\n findAsset,\n stampHasUnpublishedChanges,\n publishWithRevision,\n ],\n )\n\n // EC-595 point 7 — follow one open document: pushed rows go to the persister (applied\n // under the local edits), presence to the caller. The capability lives on the\n // operations bundle (the UI never holds a reactive Convex client).\n const subscribeDocument = useCallback(\n (ref: DocumentRef, onPresence: (presence: readonly PresenceEntry[]) => void) => {\n if (projectId === undefined) return () => {}\n let stop = () => {}\n let stopped = false\n void getStudioOperations().then((studio) => {\n if (stopped) return\n stop = studio.subscribeDocument(projectId, ref, {\n onSnapshot: (snapshot) => {\n persisterRef.current?.adoptSnapshot(ref, snapshot.record)\n onPresence(snapshot.presence)\n },\n })\n })\n return () => {\n stopped = true\n stop()\n }\n },\n [projectId],\n )\n // EC-595 thin presence: this tab's heartbeat on a document (the focused field's path).\n const reportPresence = useCallback(\n (ref: DocumentRef, path: ValuePath | undefined) => {\n if (projectId === undefined) return\n const actor = getStudioActor()\n void getStudioOperations()\n .then((studio) =>\n studio.reportPresence(projectId, ref, {\n sessionId: PRESENCE_SESSION_ID,\n ...(actor ? { actor: actor.id } : {}),\n ...(actor?.name ? { actorName: actor.name } : {}),\n ...(path ? { path } : {}),\n }),\n )\n .catch(() => {\n // Reported on the operations bus (EC-403 sees an expiry); presence is advisory.\n })\n },\n [projectId],\n )\n const clearPresence = useCallback(\n (ref: DocumentRef) => {\n if (projectId === undefined) return\n void getStudioOperations()\n .then((studio) => studio.clearPresence(projectId, ref, PRESENCE_SESSION_ID))\n .catch(() => {})\n },\n [projectId],\n )\n const replaceDocument = useCallback(\n (doc: CmsDocument) => {\n const persister = persisterRef.current\n if (persister) persister.replace(doc)\n else setDocuments((prev) => replaceDoc(prev, doc))\n },\n [],\n )\n\n const store$ = useMemo<CmsStore>(\n () => ({\n ...(projectId !== undefined ? { projectId } : {}),\n collections,\n localeConfig,\n activeLocale,\n getCollection,\n documentsOf: (collectionId) => documents.filter((d) => d.collection === collectionId),\n getDocument,\n titleOf,\n commitPatches,\n revisionOf: (ref) => persisterRef.current?.revisionOf(ref),\n insertDocument,\n newDocumentId: newId,\n commitFieldEdit,\n createDocument,\n ensureSingletonDocument,\n documentConflicts: (ref) => conflictsByKey.get(documentKey(ref)) ?? NO_CONFLICTS,\n resolveConflict: (ref, conflictId, choice) =>\n persisterRef.current?.resolveConflict(ref, conflictId, choice),\n adoptDocumentSnapshot: (ref, record) => persisterRef.current?.adoptSnapshot(ref, record),\n subscribeDocument,\n reportPresence,\n clearPresence,\n presenceSessionId: PRESENCE_SESSION_ID,\n replaceDocument,\n deleteDocument,\n isPublished,\n documentUpdatedAt,\n documentPublishedAt,\n documentHasUnpublishedChanges,\n publishDocument,\n unpublishDocument,\n loadDocumentVersions,\n restoreDocumentVersion,\n importDocuments,\n validate,\n validateOptions,\n isFieldReadOnly,\n viewsOf,\n activeViewId: (collectionId) => activeViews[collectionId] ?? initialViewId(collectionId),\n setActiveView,\n tableStateOf,\n setTableState: (collectionId, update) =>\n setTableStates((prev) => {\n const current = prev[collectionId] ?? activeViewOf(collectionId).state\n const next = typeof update === 'function' ? update(current) : update\n return { ...prev, [collectionId]: next }\n }),\n isViewDirty: (collectionId) => {\n const working = tableStates[collectionId]\n if (working === undefined) return false\n const active = activeViewOf(collectionId).state\n const collection = registry.get(collectionId)\n if (collection === undefined) return !viewStatesEqual(working, active)\n // Compare schema-resolved forms (EC-213): a column-order reconciliation\n // or a stale `hidden` entry must not read as an unsaved edit. EC-445: the\n // pseudo-column universe must match so a reserved column never reads as a diff.\n const pseudo = pseudoColumnsFor(collectionId)\n return !viewStatesEqual(\n canonicalViewState(collection, working, pseudo),\n canonicalViewState(collection, active, pseudo),\n )\n },\n resetTableState: dropTableState,\n runBulk,\n addCollection: (def) =>\n setCollections((prev) => [...prev.filter((c) => c.id !== def.id), def]),\n persistError,\n clearPersistError: () => setPersistError(null),\n flushPersistence: (ref) => persisterRef.current?.flush(ref) ?? Promise.resolve(),\n }),\n [\n projectId,\n collections,\n documents,\n localeConfig,\n activeLocale,\n getCollection,\n getDocument,\n titleOf,\n commitPatches,\n insertDocument,\n newId,\n commitFieldEdit,\n createDocument,\n ensureSingletonDocument,\n conflictsByKey,\n subscribeDocument,\n reportPresence,\n clearPresence,\n replaceDocument,\n deleteDocument,\n isPublished,\n documentUpdatedAt,\n documentPublishedAt,\n documentHasUnpublishedChanges,\n publishDocument,\n unpublishDocument,\n loadDocumentVersions,\n restoreDocumentVersion,\n importDocuments,\n validate,\n validateOptions,\n isFieldReadOnly,\n viewsOf,\n activeViews,\n activeViewOf,\n initialViewId,\n tableStates,\n tableStateOf,\n setActiveView,\n dropTableState,\n runBulk,\n registry,\n pseudoColumnsFor,\n persistError,\n ],\n )\n\n return <CmsContext.Provider value={store$}>{children}</CmsContext.Provider>\n}\n\nexport { useCms }\n\nexport { primaryField }\nexport type { Locale }\n"]}
@@ -7,6 +7,7 @@ import { Button, Code, DropdownMenu, DropdownMenuContent, DropdownMenuItem, Drop
7
7
  import { cn } from '@elytracms/studio/lib/utils';
8
8
  import { localizedLabel, translate } from '@elytracms/studio/lib/i18n';
9
9
  import { LocaleSwitcher, resolveDisplayedValue } from '@elytracms/studio/lib/locale';
10
+ import { resolveDeploymentPageCollections } from '@elytracms/studio/lib/workspace';
10
11
  import { EMPTY_SELECTION, PUBLISHED_AT_FIELD, STATE_FIELD, UPDATED_AT_FIELD, URL_FIELD, applyViewState, clearSelection, isPseudoColumn, primaryColumn, selectAll, toggleRow, visibleColumns, visibleSelection, } from '@elytracms/studio/lib/cms-views';
11
12
  import { pseudoColumnsForSource } from '@elytracms/studio/lib/collection-view/collection-view-source';
12
13
  import { cellEditKind, cellKey } from './cell-edit.js';
@@ -108,7 +109,7 @@ export function LoadedCollectionTable({ projectId, toolbarExtra, }) {
108
109
  // already-filtered rows depth-first — filters/sort still order siblings.
109
110
  const hierarchical = source.capabilities.hierarchy;
110
111
  const [treeMode, setTreeMode] = useState(hierarchical);
111
- const treeRows = useMemo(() => (hierarchical && treeMode ? orderHierarchically(visibleDocs) : null), [hierarchical, treeMode, visibleDocs]);
112
+ const treeRows = useMemo(() => (hierarchical && treeMode ? orderHierarchically(visibleDocs, collection) : null), [hierarchical, treeMode, visibleDocs, collection]);
112
113
  const orderedDocs = treeRows ? treeRows.map((row) => row.doc) : visibleDocs;
113
114
  const depthById = useMemo(() => (treeRows ? new Map(treeRows.map((row) => [row.doc.id, row.depth])) : undefined), [treeRows]);
114
115
  // EC-246a header derivations. The count reads with the collection's own noun
@@ -130,7 +131,8 @@ export function LoadedCollectionTable({ projectId, toolbarExtra, }) {
130
131
  // the slug/title (and, for pages, the parent) are typed in the form, and a
131
132
  // missing/duplicate slug surfaces as a Publish-gating issue, never blocks the
132
133
  // draft. Routes are config-sourced (EC-207), so nothing else is written here.
133
- const isPageCollection = collectionId === 'page';
134
+ // EC-590: a collection a route addresses (no collection is NAMED a page collection).
135
+ const isPageCollection = resolveDeploymentPageCollections().includes(collectionId);
134
136
  // Creation is a capability (a credential rail like users mints identities via
135
137
  // sign-up, not here), and the detail route is rail-owned (never the CMS route).
136
138
  const canCreate = source.capabilities.create && source.detailPath !== undefined;
@@ -194,7 +196,10 @@ export function LoadedCollectionTable({ projectId, toolbarExtra, }) {
194
196
  // The action is offered iff `capabilities.create` + a detail surface
195
197
  // (`rowActionsFor`), the New button's exact gate.
196
198
  if (action === 'duplicate') {
199
+ // EC-595 A2: one insert-if-absent create with a factory id (`duplicateFromSource`).
197
200
  const newRef = duplicateFromSource(source, doc);
201
+ if (!newRef)
202
+ return;
198
203
  toast.success(translate('cms.editor.duplicateCreated'));
199
204
  const splat = source.detailPath?.(newRef.id);
200
205
  if (splat === undefined)