@elytracms/studio 0.0.1

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 (558) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/convex/assets.ts +107 -0
  4. package/convex/auth.config.ts +15 -0
  5. package/convex/auth.ts +50 -0
  6. package/convex/cliTokens.ts +63 -0
  7. package/convex/cms.ts +174 -0
  8. package/convex/content.ts +316 -0
  9. package/convex/delivery.ts +266 -0
  10. package/convex/functions.ts +35 -0
  11. package/convex/graphs.ts +51 -0
  12. package/convex/guard.ts +67 -0
  13. package/convex/http.ts +30 -0
  14. package/convex/members.ts +83 -0
  15. package/convex/publishing.ts +102 -0
  16. package/convex/references.ts +168 -0
  17. package/convex/schema.ts +173 -0
  18. package/convex/sync.ts +322 -0
  19. package/convex/tsconfig.json +12 -0
  20. package/convex/users.ts +23 -0
  21. package/convex/webhooks.ts +85 -0
  22. package/dist/components/assets/asset-library.d.ts +14 -0
  23. package/dist/components/assets/asset-library.js +191 -0
  24. package/dist/components/assets/asset-library.js.map +1 -0
  25. package/dist/components/assets/asset-metadata.d.ts +34 -0
  26. package/dist/components/assets/asset-metadata.js +40 -0
  27. package/dist/components/assets/asset-metadata.js.map +1 -0
  28. package/dist/components/assets/asset-search.d.ts +7 -0
  29. package/dist/components/assets/asset-search.js +12 -0
  30. package/dist/components/assets/asset-search.js.map +1 -0
  31. package/dist/components/assets/asset-selection.d.ts +17 -0
  32. package/dist/components/assets/asset-selection.js +33 -0
  33. package/dist/components/assets/asset-selection.js.map +1 -0
  34. package/dist/components/assets/assets-store.d.ts +51 -0
  35. package/dist/components/assets/assets-store.js +153 -0
  36. package/dist/components/assets/assets-store.js.map +1 -0
  37. package/dist/components/auth-context.d.ts +38 -0
  38. package/dist/components/auth-context.js +88 -0
  39. package/dist/components/auth-context.js.map +1 -0
  40. package/dist/components/backend-gate.d.ts +19 -0
  41. package/dist/components/backend-gate.js +63 -0
  42. package/dist/components/backend-gate.js.map +1 -0
  43. package/dist/components/breadcrumb-context.d.ts +39 -0
  44. package/dist/components/breadcrumb-context.js +38 -0
  45. package/dist/components/breadcrumb-context.js.map +1 -0
  46. package/dist/components/builder/blocks-model.d.ts +80 -0
  47. package/dist/components/builder/blocks-model.js +181 -0
  48. package/dist/components/builder/blocks-model.js.map +1 -0
  49. package/dist/components/builder/blocks-panel.d.ts +44 -0
  50. package/dist/components/builder/blocks-panel.js +147 -0
  51. package/dist/components/builder/blocks-panel.js.map +1 -0
  52. package/dist/components/builder/builder-store.d.ts +69 -0
  53. package/dist/components/builder/builder-store.js +294 -0
  54. package/dist/components/builder/builder-store.js.map +1 -0
  55. package/dist/components/builder/canvas-stylesheet.d.ts +4 -0
  56. package/dist/components/builder/canvas-stylesheet.js +24 -0
  57. package/dist/components/builder/canvas-stylesheet.js.map +1 -0
  58. package/dist/components/builder/canvas.d.ts +8 -0
  59. package/dist/components/builder/canvas.js +723 -0
  60. package/dist/components/builder/canvas.js.map +1 -0
  61. package/dist/components/builder/clipboard-actions.d.ts +93 -0
  62. package/dist/components/builder/clipboard-actions.js +246 -0
  63. package/dist/components/builder/clipboard-actions.js.map +1 -0
  64. package/dist/components/builder/composition-field-editor.d.ts +11 -0
  65. package/dist/components/builder/composition-field-editor.js +150 -0
  66. package/dist/components/builder/composition-field-editor.js.map +1 -0
  67. package/dist/components/builder/composition-scope.d.ts +16 -0
  68. package/dist/components/builder/composition-scope.js +7 -0
  69. package/dist/components/builder/composition-scope.js.map +1 -0
  70. package/dist/components/builder/drag-session.d.ts +41 -0
  71. package/dist/components/builder/drag-session.js +51 -0
  72. package/dist/components/builder/drag-session.js.map +1 -0
  73. package/dist/components/builder/fixture-thumbnail.d.ts +18 -0
  74. package/dist/components/builder/fixture-thumbnail.js +97 -0
  75. package/dist/components/builder/fixture-thumbnail.js.map +1 -0
  76. package/dist/components/builder/inline-edit.d.ts +142 -0
  77. package/dist/components/builder/inline-edit.js +136 -0
  78. package/dist/components/builder/inline-edit.js.map +1 -0
  79. package/dist/components/builder/insert-context.d.ts +14 -0
  80. package/dist/components/builder/insert-context.js +65 -0
  81. package/dist/components/builder/insert-context.js.map +1 -0
  82. package/dist/components/builder/insert-menu.d.ts +9 -0
  83. package/dist/components/builder/insert-menu.js +9 -0
  84. package/dist/components/builder/insert-menu.js.map +1 -0
  85. package/dist/components/builder/layout-inspector.d.ts +14 -0
  86. package/dist/components/builder/layout-inspector.js +84 -0
  87. package/dist/components/builder/layout-inspector.js.map +1 -0
  88. package/dist/components/builder/node-factory.d.ts +17 -0
  89. package/dist/components/builder/node-factory.js +90 -0
  90. package/dist/components/builder/node-factory.js.map +1 -0
  91. package/dist/components/builder/page-tree.d.ts +3 -0
  92. package/dist/components/builder/page-tree.js +207 -0
  93. package/dist/components/builder/page-tree.js.map +1 -0
  94. package/dist/components/builder/property-inspector.d.ts +1 -0
  95. package/dist/components/builder/property-inspector.js +233 -0
  96. package/dist/components/builder/property-inspector.js.map +1 -0
  97. package/dist/components/builder/rich-text-toolbar.d.ts +4 -0
  98. package/dist/components/builder/rich-text-toolbar.js +104 -0
  99. package/dist/components/builder/rich-text-toolbar.js.map +1 -0
  100. package/dist/components/builder/spacing-handles.d.ts +22 -0
  101. package/dist/components/builder/spacing-handles.js +213 -0
  102. package/dist/components/builder/spacing-handles.js.map +1 -0
  103. package/dist/components/cms/asset-picker.d.ts +12 -0
  104. package/dist/components/cms/asset-picker.js +60 -0
  105. package/dist/components/cms/asset-picker.js.map +1 -0
  106. package/dist/components/cms/bulk-actions.d.ts +60 -0
  107. package/dist/components/cms/bulk-actions.js +95 -0
  108. package/dist/components/cms/bulk-actions.js.map +1 -0
  109. package/dist/components/cms/bulk-bar.d.ts +23 -0
  110. package/dist/components/cms/bulk-bar.js +26 -0
  111. package/dist/components/cms/bulk-bar.js.map +1 -0
  112. package/dist/components/cms/cell-edit.d.ts +91 -0
  113. package/dist/components/cms/cell-edit.js +144 -0
  114. package/dist/components/cms/cell-edit.js.map +1 -0
  115. package/dist/components/cms/cell.d.ts +29 -0
  116. package/dist/components/cms/cell.js +127 -0
  117. package/dist/components/cms/cell.js.map +1 -0
  118. package/dist/components/cms/cms-index.d.ts +8 -0
  119. package/dist/components/cms/cms-index.js +23 -0
  120. package/dist/components/cms/cms-index.js.map +1 -0
  121. package/dist/components/cms/cms-store.d.ts +188 -0
  122. package/dist/components/cms/cms-store.js +702 -0
  123. package/dist/components/cms/cms-store.js.map +1 -0
  124. package/dist/components/cms/collection-table.d.ts +6 -0
  125. package/dist/components/cms/collection-table.js +250 -0
  126. package/dist/components/cms/collection-table.js.map +1 -0
  127. package/dist/components/cms/collections-sidebar.d.ts +9 -0
  128. package/dist/components/cms/collections-sidebar.js +25 -0
  129. package/dist/components/cms/collections-sidebar.js.map +1 -0
  130. package/dist/components/cms/detail-editor.d.ts +7 -0
  131. package/dist/components/cms/detail-editor.js +386 -0
  132. package/dist/components/cms/detail-editor.js.map +1 -0
  133. package/dist/components/cms/doc-state.d.ts +13 -0
  134. package/dist/components/cms/doc-state.js +18 -0
  135. package/dist/components/cms/doc-state.js.map +1 -0
  136. package/dist/components/cms/document-editor-context.d.ts +48 -0
  137. package/dist/components/cms/document-editor-context.js +23 -0
  138. package/dist/components/cms/document-editor-context.js.map +1 -0
  139. package/dist/components/cms/editable-cell.d.ts +22 -0
  140. package/dist/components/cms/editable-cell.js +176 -0
  141. package/dist/components/cms/editable-cell.js.map +1 -0
  142. package/dist/components/cms/field-control.d.ts +8 -0
  143. package/dist/components/cms/field-control.js +149 -0
  144. package/dist/components/cms/field-control.js.map +1 -0
  145. package/dist/components/cms/filter-builder.d.ts +12 -0
  146. package/dist/components/cms/filter-builder.js +84 -0
  147. package/dist/components/cms/filter-builder.js.map +1 -0
  148. package/dist/components/cms/import-export.d.ts +6 -0
  149. package/dist/components/cms/import-export.js +33 -0
  150. package/dist/components/cms/import-export.js.map +1 -0
  151. package/dist/components/cms/new-page-dialog.d.ts +22 -0
  152. package/dist/components/cms/new-page-dialog.js +42 -0
  153. package/dist/components/cms/new-page-dialog.js.map +1 -0
  154. package/dist/components/cms/reference-confirm.d.ts +25 -0
  155. package/dist/components/cms/reference-confirm.js +124 -0
  156. package/dist/components/cms/reference-confirm.js.map +1 -0
  157. package/dist/components/cms/relation-picker.d.ts +16 -0
  158. package/dist/components/cms/relation-picker.js +47 -0
  159. package/dist/components/cms/relation-picker.js.map +1 -0
  160. package/dist/components/cms/use-cell-edit.d.ts +33 -0
  161. package/dist/components/cms/use-cell-edit.js +125 -0
  162. package/dist/components/cms/use-cell-edit.js.map +1 -0
  163. package/dist/components/cms/versions-model.d.ts +15 -0
  164. package/dist/components/cms/versions-model.js +23 -0
  165. package/dist/components/cms/versions-model.js.map +1 -0
  166. package/dist/components/cms/versions-pane.d.ts +14 -0
  167. package/dist/components/cms/versions-pane.js +86 -0
  168. package/dist/components/cms/versions-pane.js.map +1 -0
  169. package/dist/components/cms/view-bar.d.ts +11 -0
  170. package/dist/components/cms/view-bar.js +80 -0
  171. package/dist/components/cms/view-bar.js.map +1 -0
  172. package/dist/components/collab/collab-context.d.ts +34 -0
  173. package/dist/components/collab/collab-context.js +52 -0
  174. package/dist/components/collab/collab-context.js.map +1 -0
  175. package/dist/components/collab/collab-seed.d.ts +27 -0
  176. package/dist/components/collab/collab-seed.js +42 -0
  177. package/dist/components/collab/collab-seed.js.map +1 -0
  178. package/dist/components/components/component-detail.d.ts +9 -0
  179. package/dist/components/components/component-detail.js +30 -0
  180. package/dist/components/components/component-detail.js.map +1 -0
  181. package/dist/components/components/component-status.d.ts +10 -0
  182. package/dist/components/components/component-status.js +30 -0
  183. package/dist/components/components/component-status.js.map +1 -0
  184. package/dist/components/components/components-index.d.ts +8 -0
  185. package/dist/components/components/components-index.js +42 -0
  186. package/dist/components/components/components-index.js.map +1 -0
  187. package/dist/components/components/field-inspector.d.ts +9 -0
  188. package/dist/components/components/field-inspector.js +38 -0
  189. package/dist/components/components/field-inspector.js.map +1 -0
  190. package/dist/components/components/fixture-runner.d.ts +10 -0
  191. package/dist/components/components/fixture-runner.js +24 -0
  192. package/dist/components/components/fixture-runner.js.map +1 -0
  193. package/dist/components/components/registry-browser.d.ts +4 -0
  194. package/dist/components/components/registry-browser.js +64 -0
  195. package/dist/components/components/registry-browser.js.map +1 -0
  196. package/dist/components/current-user-menu.d.ts +13 -0
  197. package/dist/components/current-user-menu.js +31 -0
  198. package/dist/components/current-user-menu.js.map +1 -0
  199. package/dist/components/dev-login-badge.d.ts +9 -0
  200. package/dist/components/dev-login-badge.js +18 -0
  201. package/dist/components/dev-login-badge.js.map +1 -0
  202. package/dist/components/extensions/extensions-view.d.ts +7 -0
  203. package/dist/components/extensions/extensions-view.js +126 -0
  204. package/dist/components/extensions/extensions-view.js.map +1 -0
  205. package/dist/components/guards.d.ts +27 -0
  206. package/dist/components/guards.js +46 -0
  207. package/dist/components/guards.js.map +1 -0
  208. package/dist/components/inspector/inspector-sidebar.d.ts +26 -0
  209. package/dist/components/inspector/inspector-sidebar.js +17 -0
  210. package/dist/components/inspector/inspector-sidebar.js.map +1 -0
  211. package/dist/components/operation-error.d.ts +17 -0
  212. package/dist/components/operation-error.js +54 -0
  213. package/dist/components/operation-error.js.map +1 -0
  214. package/dist/components/playground-badge.d.ts +10 -0
  215. package/dist/components/playground-badge.js +19 -0
  216. package/dist/components/playground-badge.js.map +1 -0
  217. package/dist/components/project-list.d.ts +15 -0
  218. package/dist/components/project-list.js +52 -0
  219. package/dist/components/project-list.js.map +1 -0
  220. package/dist/components/project-session.d.ts +46 -0
  221. package/dist/components/project-session.js +107 -0
  222. package/dist/components/project-session.js.map +1 -0
  223. package/dist/components/project-switcher.d.ts +11 -0
  224. package/dist/components/project-switcher.js +44 -0
  225. package/dist/components/project-switcher.js.map +1 -0
  226. package/dist/components/references/builder-deep-link.d.ts +12 -0
  227. package/dist/components/references/builder-deep-link.js +53 -0
  228. package/dist/components/references/builder-deep-link.js.map +1 -0
  229. package/dist/components/references/references-panel.d.ts +17 -0
  230. package/dist/components/references/references-panel.js +66 -0
  231. package/dist/components/references/references-panel.js.map +1 -0
  232. package/dist/components/routes/redirect-chain.d.ts +9 -0
  233. package/dist/components/routes/redirect-chain.js +16 -0
  234. package/dist/components/routes/redirect-chain.js.map +1 -0
  235. package/dist/components/routes/redirect-manager.d.ts +13 -0
  236. package/dist/components/routes/redirect-manager.js +24 -0
  237. package/dist/components/routes/redirect-manager.js.map +1 -0
  238. package/dist/components/routes/route-list.d.ts +35 -0
  239. package/dist/components/routes/route-list.js +69 -0
  240. package/dist/components/routes/route-list.js.map +1 -0
  241. package/dist/components/routes/routes-shell.d.ts +14 -0
  242. package/dist/components/routes/routes-shell.js +68 -0
  243. package/dist/components/routes/routes-shell.js.map +1 -0
  244. package/dist/components/section-nav.d.ts +17 -0
  245. package/dist/components/section-nav.js +33 -0
  246. package/dist/components/section-nav.js.map +1 -0
  247. package/dist/components/section-state.d.ts +24 -0
  248. package/dist/components/section-state.js +78 -0
  249. package/dist/components/section-state.js.map +1 -0
  250. package/dist/components/section-surface.d.ts +31 -0
  251. package/dist/components/section-surface.js +46 -0
  252. package/dist/components/section-surface.js.map +1 -0
  253. package/dist/components/sections.d.ts +38 -0
  254. package/dist/components/sections.js +72 -0
  255. package/dist/components/sections.js.map +1 -0
  256. package/dist/components/settings-form.d.ts +10 -0
  257. package/dist/components/settings-form.js +17 -0
  258. package/dist/components/settings-form.js.map +1 -0
  259. package/dist/components/studio-context.d.ts +22 -0
  260. package/dist/components/studio-context.js +48 -0
  261. package/dist/components/studio-context.js.map +1 -0
  262. package/dist/components/studio-project-screen.d.ts +19 -0
  263. package/dist/components/studio-project-screen.js +195 -0
  264. package/dist/components/studio-project-screen.js.map +1 -0
  265. package/dist/components/studio-shell.d.ts +18 -0
  266. package/dist/components/studio-shell.js +64 -0
  267. package/dist/components/studio-shell.js.map +1 -0
  268. package/dist/components/theme-context.d.ts +17 -0
  269. package/dist/components/theme-context.js +26 -0
  270. package/dist/components/theme-context.js.map +1 -0
  271. package/dist/components/workspace-gate.d.ts +12 -0
  272. package/dist/components/workspace-gate.js +27 -0
  273. package/dist/components/workspace-gate.js.map +1 -0
  274. package/dist/components/workspace-projects.d.ts +13 -0
  275. package/dist/components/workspace-projects.js +18 -0
  276. package/dist/components/workspace-projects.js.map +1 -0
  277. package/dist/lib/assets/delete-asset.d.ts +34 -0
  278. package/dist/lib/assets/delete-asset.js +34 -0
  279. package/dist/lib/assets/delete-asset.js.map +1 -0
  280. package/dist/lib/assets/image-dimensions.d.ts +18 -0
  281. package/dist/lib/assets/image-dimensions.js +26 -0
  282. package/dist/lib/assets/image-dimensions.js.map +1 -0
  283. package/dist/lib/assets/index.d.ts +9 -0
  284. package/dist/lib/assets/index.js +10 -0
  285. package/dist/lib/assets/index.js.map +1 -0
  286. package/dist/lib/assets/upload-state.d.ts +53 -0
  287. package/dist/lib/assets/upload-state.js +59 -0
  288. package/dist/lib/assets/upload-state.js.map +1 -0
  289. package/dist/lib/assets/upload.d.ts +56 -0
  290. package/dist/lib/assets/upload.js +125 -0
  291. package/dist/lib/assets/upload.js.map +1 -0
  292. package/dist/lib/auth/auth-adapter.d.ts +57 -0
  293. package/dist/lib/auth/auth-adapter.js +13 -0
  294. package/dist/lib/auth/auth-adapter.js.map +1 -0
  295. package/dist/lib/auth/convex-auth-adapter.d.ts +39 -0
  296. package/dist/lib/auth/convex-auth-adapter.js +171 -0
  297. package/dist/lib/auth/convex-auth-adapter.js.map +1 -0
  298. package/dist/lib/auth/dev-auto-login-adapter.d.ts +25 -0
  299. package/dist/lib/auth/dev-auto-login-adapter.js +40 -0
  300. package/dist/lib/auth/dev-auto-login-adapter.js.map +1 -0
  301. package/dist/lib/auth/index.d.ts +28 -0
  302. package/dist/lib/auth/index.js +61 -0
  303. package/dist/lib/auth/index.js.map +1 -0
  304. package/dist/lib/auth/local-auth-adapter.d.ts +57 -0
  305. package/dist/lib/auth/local-auth-adapter.js +78 -0
  306. package/dist/lib/auth/local-auth-adapter.js.map +1 -0
  307. package/dist/lib/auth/route-guard.d.ts +33 -0
  308. package/dist/lib/auth/route-guard.js +51 -0
  309. package/dist/lib/auth/route-guard.js.map +1 -0
  310. package/dist/lib/auth-errors.d.ts +42 -0
  311. package/dist/lib/auth-errors.js +74 -0
  312. package/dist/lib/auth-errors.js.map +1 -0
  313. package/dist/lib/bindings/section-bindings.d.ts +24 -0
  314. package/dist/lib/bindings/section-bindings.js +9 -0
  315. package/dist/lib/bindings/section-bindings.js.map +1 -0
  316. package/dist/lib/clipboard/index.d.ts +7 -0
  317. package/dist/lib/clipboard/index.js +8 -0
  318. package/dist/lib/clipboard/index.js.map +1 -0
  319. package/dist/lib/clipboard/os-clipboard.d.ts +46 -0
  320. package/dist/lib/clipboard/os-clipboard.js +105 -0
  321. package/dist/lib/clipboard/os-clipboard.js.map +1 -0
  322. package/dist/lib/clipboard/paste-issues.d.ts +34 -0
  323. package/dist/lib/clipboard/paste-issues.js +67 -0
  324. package/dist/lib/clipboard/paste-issues.js.map +1 -0
  325. package/dist/lib/clipboard/paste-target.d.ts +20 -0
  326. package/dist/lib/clipboard/paste-target.js +28 -0
  327. package/dist/lib/clipboard/paste-target.js.map +1 -0
  328. package/dist/lib/cms/published-documents.d.ts +30 -0
  329. package/dist/lib/cms/published-documents.js +75 -0
  330. package/dist/lib/cms/published-documents.js.map +1 -0
  331. package/dist/lib/cms-views/index.d.ts +9 -0
  332. package/dist/lib/cms-views/index.js +10 -0
  333. package/dist/lib/cms-views/index.js.map +1 -0
  334. package/dist/lib/cms-views/selection.d.ts +29 -0
  335. package/dist/lib/cms-views/selection.js +46 -0
  336. package/dist/lib/cms-views/selection.js.map +1 -0
  337. package/dist/lib/cms-views/view-model.d.ts +192 -0
  338. package/dist/lib/cms-views/view-model.js +353 -0
  339. package/dist/lib/cms-views/view-model.js.map +1 -0
  340. package/dist/lib/cms-views/views-store.d.ts +70 -0
  341. package/dist/lib/cms-views/views-store.js +129 -0
  342. package/dist/lib/cms-views/views-store.js.map +1 -0
  343. package/dist/lib/data/collection-content.d.ts +105 -0
  344. package/dist/lib/data/collection-content.js +196 -0
  345. package/dist/lib/data/collection-content.js.map +1 -0
  346. package/dist/lib/data/data-store.d.ts +97 -0
  347. package/dist/lib/data/data-store.js +205 -0
  348. package/dist/lib/data/data-store.js.map +1 -0
  349. package/dist/lib/data/index.d.ts +4 -0
  350. package/dist/lib/data/index.js +8 -0
  351. package/dist/lib/data/index.js.map +1 -0
  352. package/dist/lib/data/providers.d.ts +143 -0
  353. package/dist/lib/data/providers.js +255 -0
  354. package/dist/lib/data/providers.js.map +1 -0
  355. package/dist/lib/data/sample-capture.d.ts +30 -0
  356. package/dist/lib/data/sample-capture.js +70 -0
  357. package/dist/lib/data/sample-capture.js.map +1 -0
  358. package/dist/lib/data/sources-store.d.ts +42 -0
  359. package/dist/lib/data/sources-store.js +120 -0
  360. package/dist/lib/data/sources-store.js.map +1 -0
  361. package/dist/lib/dnd/drop-rules.d.ts +219 -0
  362. package/dist/lib/dnd/drop-rules.js +257 -0
  363. package/dist/lib/dnd/drop-rules.js.map +1 -0
  364. package/dist/lib/dnd/gap-drag.d.ts +66 -0
  365. package/dist/lib/dnd/gap-drag.js +95 -0
  366. package/dist/lib/dnd/gap-drag.js.map +1 -0
  367. package/dist/lib/locale/binding-fallback.d.ts +28 -0
  368. package/dist/lib/locale/binding-fallback.js +66 -0
  369. package/dist/lib/locale/binding-fallback.js.map +1 -0
  370. package/dist/lib/locale/fallback.d.ts +43 -0
  371. package/dist/lib/locale/fallback.js +52 -0
  372. package/dist/lib/locale/fallback.js.map +1 -0
  373. package/dist/lib/locale/index.d.ts +6 -0
  374. package/dist/lib/locale/index.js +7 -0
  375. package/dist/lib/locale/index.js.map +1 -0
  376. package/dist/lib/locale/locale-store.d.ts +40 -0
  377. package/dist/lib/locale/locale-store.js +61 -0
  378. package/dist/lib/locale/locale-store.js.map +1 -0
  379. package/dist/lib/locale/locale-switcher.d.ts +10 -0
  380. package/dist/lib/locale/locale-switcher.js +24 -0
  381. package/dist/lib/locale/locale-switcher.js.map +1 -0
  382. package/dist/lib/locale/route-variant.d.ts +14 -0
  383. package/dist/lib/locale/route-variant.js +11 -0
  384. package/dist/lib/locale/route-variant.js.map +1 -0
  385. package/dist/lib/locale/use-studio-locale.d.ts +10 -0
  386. package/dist/lib/locale/use-studio-locale.js +8 -0
  387. package/dist/lib/locale/use-studio-locale.js.map +1 -0
  388. package/dist/lib/operations/asset-repository.d.ts +15 -0
  389. package/dist/lib/operations/asset-repository.js +56 -0
  390. package/dist/lib/operations/asset-repository.js.map +1 -0
  391. package/dist/lib/operations/cms-persistence.d.ts +35 -0
  392. package/dist/lib/operations/cms-persistence.js +75 -0
  393. package/dist/lib/operations/cms-persistence.js.map +1 -0
  394. package/dist/lib/operations/graph-commands.d.ts +140 -0
  395. package/dist/lib/operations/graph-commands.js +86 -0
  396. package/dist/lib/operations/graph-commands.js.map +1 -0
  397. package/dist/lib/operations/graph-persistence.d.ts +27 -0
  398. package/dist/lib/operations/graph-persistence.js +35 -0
  399. package/dist/lib/operations/graph-persistence.js.map +1 -0
  400. package/dist/lib/operations/index.d.ts +13 -0
  401. package/dist/lib/operations/index.js +14 -0
  402. package/dist/lib/operations/index.js.map +1 -0
  403. package/dist/lib/operations/operations-package.d.ts +6 -0
  404. package/dist/lib/operations/operations-package.js +7 -0
  405. package/dist/lib/operations/operations-package.js.map +1 -0
  406. package/dist/lib/operations/persist-queue.d.ts +16 -0
  407. package/dist/lib/operations/persist-queue.js +18 -0
  408. package/dist/lib/operations/persist-queue.js.map +1 -0
  409. package/dist/lib/operations/session-hydration.d.ts +84 -0
  410. package/dist/lib/operations/session-hydration.js +112 -0
  411. package/dist/lib/operations/session-hydration.js.map +1 -0
  412. package/dist/lib/operations/studio-operations.d.ts +59 -0
  413. package/dist/lib/operations/studio-operations.js +92 -0
  414. package/dist/lib/operations/studio-operations.js.map +1 -0
  415. package/dist/lib/persistence/backend-mode.d.ts +69 -0
  416. package/dist/lib/persistence/backend-mode.js +120 -0
  417. package/dist/lib/persistence/backend-mode.js.map +1 -0
  418. package/dist/lib/persistence/convex-adapter.d.ts +34 -0
  419. package/dist/lib/persistence/convex-adapter.js +681 -0
  420. package/dist/lib/persistence/convex-adapter.js.map +1 -0
  421. package/dist/lib/persistence/convex-blob-storage.d.ts +57 -0
  422. package/dist/lib/persistence/convex-blob-storage.js +97 -0
  423. package/dist/lib/persistence/convex-blob-storage.js.map +1 -0
  424. package/dist/lib/persistence/convex-client.d.ts +19 -0
  425. package/dist/lib/persistence/convex-client.js +40 -0
  426. package/dist/lib/persistence/convex-client.js.map +1 -0
  427. package/dist/lib/persistence/index.d.ts +30 -0
  428. package/dist/lib/persistence/index.js +60 -0
  429. package/dist/lib/persistence/index.js.map +1 -0
  430. package/dist/lib/persona/labels.d.ts +23 -0
  431. package/dist/lib/persona/labels.js +122 -0
  432. package/dist/lib/persona/labels.js.map +1 -0
  433. package/dist/lib/rail.d.ts +11 -0
  434. package/dist/lib/rail.js +26 -0
  435. package/dist/lib/rail.js.map +1 -0
  436. package/dist/lib/references/impact.d.ts +64 -0
  437. package/dist/lib/references/impact.js +62 -0
  438. package/dist/lib/references/impact.js.map +1 -0
  439. package/dist/lib/references/index.d.ts +7 -0
  440. package/dist/lib/references/index.js +8 -0
  441. package/dist/lib/references/index.js.map +1 -0
  442. package/dist/lib/references/reference-model.d.ts +125 -0
  443. package/dist/lib/references/reference-model.js +242 -0
  444. package/dist/lib/references/reference-model.js.map +1 -0
  445. package/dist/lib/references/references-store.d.ts +65 -0
  446. package/dist/lib/references/references-store.js +221 -0
  447. package/dist/lib/references/references-store.js.map +1 -0
  448. package/dist/lib/registry/index.d.ts +65 -0
  449. package/dist/lib/registry/index.js +114 -0
  450. package/dist/lib/registry/index.js.map +1 -0
  451. package/dist/lib/registry/preview.d.ts +15 -0
  452. package/dist/lib/registry/preview.js +110 -0
  453. package/dist/lib/registry/preview.js.map +1 -0
  454. package/dist/lib/registry/project-components.d.ts +16 -0
  455. package/dist/lib/registry/project-components.js +152 -0
  456. package/dist/lib/registry/project-components.js.map +1 -0
  457. package/dist/lib/routing/index.d.ts +10 -0
  458. package/dist/lib/routing/index.js +11 -0
  459. package/dist/lib/routing/index.js.map +1 -0
  460. package/dist/lib/routing/routing-analysis.d.ts +26 -0
  461. package/dist/lib/routing/routing-analysis.js +37 -0
  462. package/dist/lib/routing/routing-analysis.js.map +1 -0
  463. package/dist/lib/routing/routing-store.d.ts +50 -0
  464. package/dist/lib/routing/routing-store.js +72 -0
  465. package/dist/lib/routing/routing-store.js.map +1 -0
  466. package/dist/lib/starters/kit-session.d.ts +5 -0
  467. package/dist/lib/starters/kit-session.js +17 -0
  468. package/dist/lib/starters/kit-session.js.map +1 -0
  469. package/dist/lib/theme.d.ts +21 -0
  470. package/dist/lib/theme.js +32 -0
  471. package/dist/lib/theme.js.map +1 -0
  472. package/dist/lib/utils.d.ts +11 -0
  473. package/dist/lib/utils.js +28 -0
  474. package/dist/lib/utils.js.map +1 -0
  475. package/dist/lib/webhooks/config.d.ts +15 -0
  476. package/dist/lib/webhooks/config.js +64 -0
  477. package/dist/lib/webhooks/config.js.map +1 -0
  478. package/dist/lib/webhooks/dispatcher.d.ts +67 -0
  479. package/dist/lib/webhooks/dispatcher.js +61 -0
  480. package/dist/lib/webhooks/dispatcher.js.map +1 -0
  481. package/dist/lib/webhooks/index.d.ts +11 -0
  482. package/dist/lib/webhooks/index.js +10 -0
  483. package/dist/lib/webhooks/index.js.map +1 -0
  484. package/dist/lib/webhooks/signing.d.ts +15 -0
  485. package/dist/lib/webhooks/signing.js +24 -0
  486. package/dist/lib/webhooks/signing.js.map +1 -0
  487. package/dist/lib/webhooks/tags.d.ts +25 -0
  488. package/dist/lib/webhooks/tags.js +173 -0
  489. package/dist/lib/webhooks/tags.js.map +1 -0
  490. package/dist/lib/working-graph.d.ts +82 -0
  491. package/dist/lib/working-graph.js +113 -0
  492. package/dist/lib/working-graph.js.map +1 -0
  493. package/dist/lib/workspace/index.d.ts +109 -0
  494. package/dist/lib/workspace/index.js +206 -0
  495. package/dist/lib/workspace/index.js.map +1 -0
  496. package/dist/lib/workspace/switcher-source.d.ts +39 -0
  497. package/dist/lib/workspace/switcher-source.js +23 -0
  498. package/dist/lib/workspace/switcher-source.js.map +1 -0
  499. package/dist/lib/workspace/workspace-source.d.ts +47 -0
  500. package/dist/lib/workspace/workspace-source.js +67 -0
  501. package/dist/lib/workspace/workspace-source.js.map +1 -0
  502. package/dist/router/index.d.ts +32 -0
  503. package/dist/router/index.js +32 -0
  504. package/dist/router/index.js.map +1 -0
  505. package/dist/router/match.d.ts +75 -0
  506. package/dist/router/match.js +87 -0
  507. package/dist/router/match.js.map +1 -0
  508. package/dist/router/search.d.ts +22 -0
  509. package/dist/router/search.js +16 -0
  510. package/dist/router/search.js.map +1 -0
  511. package/dist/ui/avatar.d.ts +17 -0
  512. package/dist/ui/avatar.js +38 -0
  513. package/dist/ui/avatar.js.map +1 -0
  514. package/dist/ui/badge.d.ts +9 -0
  515. package/dist/ui/badge.js +23 -0
  516. package/dist/ui/badge.js.map +1 -0
  517. package/dist/ui/button.d.ts +11 -0
  518. package/dist/ui/button.js +30 -0
  519. package/dist/ui/button.js.map +1 -0
  520. package/dist/ui/card.d.ts +11 -0
  521. package/dist/ui/card.js +23 -0
  522. package/dist/ui/card.js.map +1 -0
  523. package/dist/ui/dialog.d.ts +12 -0
  524. package/dist/ui/dialog.js +27 -0
  525. package/dist/ui/dialog.js.map +1 -0
  526. package/dist/ui/dropdown-menu.d.ts +15 -0
  527. package/dist/ui/dropdown-menu.js +24 -0
  528. package/dist/ui/dropdown-menu.js.map +1 -0
  529. package/dist/ui/field.d.ts +15 -0
  530. package/dist/ui/field.js +14 -0
  531. package/dist/ui/field.js.map +1 -0
  532. package/dist/ui/index.d.ts +14 -0
  533. package/dist/ui/index.js +15 -0
  534. package/dist/ui/index.js.map +1 -0
  535. package/dist/ui/input.d.ts +3 -0
  536. package/dist/ui/input.js +7 -0
  537. package/dist/ui/input.js.map +1 -0
  538. package/dist/ui/inspector.d.ts +18 -0
  539. package/dist/ui/inspector.js +14 -0
  540. package/dist/ui/inspector.js.map +1 -0
  541. package/dist/ui/layout.d.ts +45 -0
  542. package/dist/ui/layout.js +48 -0
  543. package/dist/ui/layout.js.map +1 -0
  544. package/dist/ui/panel.d.ts +12 -0
  545. package/dist/ui/panel.js +20 -0
  546. package/dist/ui/panel.js.map +1 -0
  547. package/dist/ui/separator.d.ts +6 -0
  548. package/dist/ui/separator.js +7 -0
  549. package/dist/ui/separator.js.map +1 -0
  550. package/dist/ui/toolbar.d.ts +9 -0
  551. package/dist/ui/toolbar.js +16 -0
  552. package/dist/ui/toolbar.js.map +1 -0
  553. package/dist/ui/typography.d.ts +50 -0
  554. package/dist/ui/typography.js +43 -0
  555. package/dist/ui/typography.js.map +1 -0
  556. package/package.json +149 -0
  557. package/src/styles/studio.css +101 -0
  558. package/src/styles/tokens.css +63 -0
@@ -0,0 +1,681 @@
1
+ import { parseProjectGraph, serializeProjectGraph, PROJECT_GRAPH_SCHEMA_VERSION, } from '@elytracms/project-graph';
2
+ import { documentKey, documentSchema } from '@elytracms/cms-core';
3
+ import { RecordNotFoundError, PersistenceValidationError, compareReferenceEntries, validateForPersistence, } from '@elytracms/persistence';
4
+ import { queryRef, mutationRef } from './convex-client';
5
+ import { ConvexBlobStorage } from './convex-blob-storage';
6
+ const realClock = () => new Date().toISOString();
7
+ function newId(prefix) {
8
+ const rand = typeof globalThis.crypto?.randomUUID === 'function'
9
+ ? globalThis.crypto.randomUUID()
10
+ : Math.abs(Date.parse(new Date().toISOString())).toString(36);
11
+ return `${prefix}_${rand}`;
12
+ }
13
+ function toGraphRecord(doc) {
14
+ return {
15
+ id: String(doc._id),
16
+ projectId: doc.projectId,
17
+ revision: doc.revision,
18
+ serializedGraph: doc.serializedGraph,
19
+ schemaVersion: doc.schemaVersion,
20
+ createdAt: doc.createdAt,
21
+ ...(doc.label ? { label: doc.label } : {}),
22
+ ...(doc.message ? { message: doc.message } : {}),
23
+ };
24
+ }
25
+ function loadGraph(record) {
26
+ const parsed = parseProjectGraph(record.serializedGraph);
27
+ if (!parsed.ok) {
28
+ throw new PersistenceValidationError('Stored graph failed to parse.', [
29
+ { code: 'corrupt-graph', message: 'Stored graph is not parseable.', domain: 'graph' },
30
+ ]);
31
+ }
32
+ return { graph: parsed.graph, revision: record };
33
+ }
34
+ class ConvexGraphRepository {
35
+ client;
36
+ clock;
37
+ constructor(client, clock = realClock) {
38
+ this.client = client;
39
+ this.clock = clock;
40
+ }
41
+ async saveGraph(projectId, graph, options = {}) {
42
+ let serializedGraph;
43
+ try {
44
+ serializedGraph = serializeProjectGraph(graph);
45
+ }
46
+ catch (error) {
47
+ throw new PersistenceValidationError('Graph is not well-formed.', [
48
+ { code: 'invalid-graph', message: String(error), domain: 'graph' },
49
+ ]);
50
+ }
51
+ const doc = (await this.client.mutation(mutationRef('graphs:saveRevision'), {
52
+ serializedGraph,
53
+ schemaVersion: graph.schemaVersion ?? PROJECT_GRAPH_SCHEMA_VERSION,
54
+ createdAt: this.clock(),
55
+ ...(options.label ? { label: options.label } : {}),
56
+ ...(options.message ? { message: options.message } : {}),
57
+ }));
58
+ return toGraphRecord(doc);
59
+ }
60
+ async getLatest(projectId) {
61
+ const doc = (await this.client.query(queryRef('graphs:latest'), {}));
62
+ if (!doc)
63
+ throw new RecordNotFoundError('graph', projectId);
64
+ return loadGraph(toGraphRecord(doc));
65
+ }
66
+ async getRevision(projectId, revision) {
67
+ const doc = (await this.client.query(queryRef('graphs:revision'), {
68
+ revision,
69
+ }));
70
+ if (!doc)
71
+ throw new RecordNotFoundError('graph-revision', `${projectId}#${revision}`);
72
+ return loadGraph(toGraphRecord(doc));
73
+ }
74
+ async listRevisions(projectId) {
75
+ const docs = (await this.client.query(queryRef('graphs:listRevisions'), {}));
76
+ return docs.map(toGraphRecord);
77
+ }
78
+ async hasGraph(projectId) {
79
+ const doc = (await this.client.query(queryRef('graphs:latest'), {}));
80
+ return doc !== null;
81
+ }
82
+ }
83
+ // --- CMS, Assets, Publishing ----------------------------------------------
84
+ /**
85
+ * Deterministic, config-owned schema timestamps (EC-183). CMS collections live
86
+ * in `elytra.config.ts`, not the backend, so the synthesized `CmsSchemaRecord`
87
+ * carries a stable placeholder rather than DB-row timestamps.
88
+ */
89
+ const CONFIG_SCHEMA_TIMESTAMP = '2026-01-01T00:00:00.000Z';
90
+ function docRecordFromDoc(doc) {
91
+ return {
92
+ projectId: doc.projectId,
93
+ document: doc.document,
94
+ ...(doc.publishedVersion !== undefined ? { publishedVersion: doc.publishedVersion } : {}),
95
+ createdAt: doc.createdAt,
96
+ updatedAt: doc.updatedAt,
97
+ };
98
+ }
99
+ /** The backend row carries no `projectId` (single-tenant); stamp it from the call. */
100
+ function versionRecordFromDoc(doc, projectId) {
101
+ return {
102
+ projectId,
103
+ collection: doc.collection,
104
+ docId: doc.docId,
105
+ version: doc.version,
106
+ snapshot: doc.snapshot,
107
+ createdAt: doc.createdAt,
108
+ ...(doc.label ? { label: doc.label } : {}),
109
+ };
110
+ }
111
+ class ConvexCmsRepository {
112
+ client;
113
+ collections;
114
+ clock;
115
+ /**
116
+ * @param collections the active project's config-owned CMS collections
117
+ * (EC-183, AD-11), injected from `elytra.config.ts`. The Convex backend has
118
+ * no `cmsSchemas` table — `findSchema`/`getSchema` serve these instead.
119
+ */
120
+ constructor(client, collections = [], clock = realClock) {
121
+ this.client = client;
122
+ this.collections = collections;
123
+ this.clock = clock;
124
+ }
125
+ async saveSchema(_projectId, _collections) {
126
+ // Read-only (EC-183, AD-11): the CMS collection schema is owned by
127
+ // `elytra.config.ts`; the backend stores documents only. A write here is a
128
+ // visible, structured error rather than a silent no-op (the studio's CMS
129
+ // schema surfaces are read-only; legitimate writers were removed in EC-183).
130
+ throw new PersistenceValidationError('CMS collection schema is owned by elytra.config.ts and cannot be written to the backend.', [
131
+ {
132
+ code: 'schema-config-owned',
133
+ message: 'Edit elytra.config.ts to change collections; the backend stores documents only.',
134
+ path: [],
135
+ domain: 'cms',
136
+ },
137
+ ]);
138
+ }
139
+ /** Config-owned schema (EC-183): the active project's collections from config. */
140
+ configSchema(projectId) {
141
+ return {
142
+ projectId,
143
+ collections: [...this.collections],
144
+ createdAt: CONFIG_SCHEMA_TIMESTAMP,
145
+ updatedAt: CONFIG_SCHEMA_TIMESTAMP,
146
+ };
147
+ }
148
+ async getSchema(projectId) {
149
+ return this.configSchema(projectId);
150
+ }
151
+ async findSchema(projectId) {
152
+ return this.configSchema(projectId);
153
+ }
154
+ async upsertDocument(projectId, document) {
155
+ // The backend is a pure document store (EC-183, AD-11): collection-membership
156
+ // validation lives in `@elytracms/cms-core` `validateDocument`, which the studio
157
+ // runs pre-dispatch (cell edits, imports). We still parse the canonical
158
+ // document shape so malformed blobs never reach storage.
159
+ const parsedDoc = documentSchema.parse(document);
160
+ const now = this.clock();
161
+ const doc = (await this.client.mutation(mutationRef('cms:upsertDocument'), {
162
+ collection: parsedDoc.collection,
163
+ docId: parsedDoc.id,
164
+ document: parsedDoc,
165
+ createdAt: now,
166
+ updatedAt: now,
167
+ }));
168
+ return docRecordFromDoc(doc);
169
+ }
170
+ async getDocument(projectId, ref) {
171
+ const found = await this.findDocument(projectId, ref);
172
+ if (!found)
173
+ throw new RecordNotFoundError('cms-document', `${projectId}/${ref.collection}:${ref.id}`);
174
+ return found;
175
+ }
176
+ async findDocument(projectId, ref) {
177
+ const doc = (await this.client.query(queryRef('cms:getDocument'), {
178
+ collection: ref.collection,
179
+ docId: ref.id,
180
+ }));
181
+ return doc ? docRecordFromDoc(doc) : undefined;
182
+ }
183
+ async listDocuments(projectId, collection) {
184
+ const docs = (await this.client.query(queryRef('cms:listDocuments'), {
185
+ ...(collection ? { collection } : {}),
186
+ }));
187
+ // EC-153 parity: deterministic document-key ordering (Convex index order
188
+ // within a project is insertion order, so we sort client-side).
189
+ return docs
190
+ .map(docRecordFromDoc)
191
+ .sort((a, b) => (documentKey(a.document) < documentKey(b.document) ? -1 : 1));
192
+ }
193
+ async deleteDocument(projectId, ref) {
194
+ // EC-153 parity: deleting a missing document is not-found, never a no-op.
195
+ await this.getDocument(projectId, ref);
196
+ await this.client.mutation(mutationRef('cms:deleteDocument'), {
197
+ collection: ref.collection,
198
+ docId: ref.id,
199
+ });
200
+ }
201
+ async saveDocumentVersion(projectId, snapshot, options = {}) {
202
+ const parsed = documentSchema.parse(snapshot);
203
+ const doc = (await this.client.mutation(mutationRef('cms:saveDocumentVersion'), {
204
+ collection: parsed.collection,
205
+ docId: parsed.id,
206
+ snapshot: parsed,
207
+ createdAt: this.clock(),
208
+ ...(options.label ? { label: options.label } : {}),
209
+ }));
210
+ return versionRecordFromDoc(doc, projectId);
211
+ }
212
+ async listDocumentVersions(projectId, ref) {
213
+ const docs = (await this.client.query(queryRef('cms:listDocumentVersions'), {
214
+ collection: ref.collection,
215
+ docId: ref.id,
216
+ }));
217
+ return docs.map((doc) => versionRecordFromDoc(doc, projectId));
218
+ }
219
+ async listAllDocumentVersions(projectId) {
220
+ const docs = (await this.client.query(queryRef('cms:listAllDocumentVersions'), {}));
221
+ return docs.map((doc) => versionRecordFromDoc(doc, projectId));
222
+ }
223
+ async getDocumentVersion(projectId, ref, version) {
224
+ const doc = (await this.client.query(queryRef('cms:getDocumentVersion'), {
225
+ collection: ref.collection,
226
+ docId: ref.id,
227
+ version,
228
+ }));
229
+ if (!doc) {
230
+ throw new RecordNotFoundError('cms-document-version', `${projectId}/${ref.collection}:${ref.id}#${version}`);
231
+ }
232
+ return versionRecordFromDoc(doc, projectId);
233
+ }
234
+ async publishDocumentVersion(projectId, ref, version) {
235
+ // Taxonomy enforced adapter-side (the handler is lenient): the document and
236
+ // the pinned version must both exist (each throws RecordNotFoundError).
237
+ await this.getDocument(projectId, ref);
238
+ await this.getDocumentVersion(projectId, ref, version);
239
+ const doc = (await this.client.mutation(mutationRef('cms:publishDocumentVersion'), {
240
+ collection: ref.collection,
241
+ docId: ref.id,
242
+ version,
243
+ updatedAt: this.clock(),
244
+ }));
245
+ return docRecordFromDoc(doc);
246
+ }
247
+ async unpublishDocument(projectId, ref) {
248
+ const existing = await this.getDocument(projectId, ref);
249
+ if (existing.publishedVersion === undefined) {
250
+ throw new PersistenceValidationError('Document is not currently published.', [
251
+ {
252
+ code: 'invalid-transition',
253
+ message: 'Cannot unpublish: the document has no published version.',
254
+ domain: 'cms',
255
+ },
256
+ ]);
257
+ }
258
+ const doc = (await this.client.mutation(mutationRef('cms:unpublishDocument'), {
259
+ collection: ref.collection,
260
+ docId: ref.id,
261
+ updatedAt: this.clock(),
262
+ }));
263
+ return docRecordFromDoc(doc);
264
+ }
265
+ }
266
+ /** Map a Convex asset doc onto the contract record (assetId → id, drop _id/_creationTime). */
267
+ function assetRecordFromDoc(doc) {
268
+ return {
269
+ id: doc.assetId,
270
+ projectId: doc.projectId,
271
+ filename: doc.filename,
272
+ contentType: doc.contentType,
273
+ byteSize: doc.byteSize,
274
+ ...(doc.width !== undefined ? { width: doc.width } : {}),
275
+ ...(doc.height !== undefined ? { height: doc.height } : {}),
276
+ ...(doc.alt !== undefined ? { alt: doc.alt } : {}),
277
+ ...(doc.title !== undefined ? { title: doc.title } : {}),
278
+ ...(doc.url !== undefined ? { url: doc.url } : {}),
279
+ ...(doc.focalPoint !== undefined ? { focalPoint: doc.focalPoint } : {}),
280
+ storageKey: doc.storageKey,
281
+ createdAt: doc.createdAt,
282
+ updatedAt: doc.updatedAt,
283
+ };
284
+ }
285
+ class ConvexAssetRepository {
286
+ client;
287
+ clock;
288
+ constructor(client, clock = realClock) {
289
+ this.client = client;
290
+ this.clock = clock;
291
+ }
292
+ async upsertAsset(projectId, input) {
293
+ const now = this.clock();
294
+ const id = input.id ?? newId('asset');
295
+ const doc = (await this.client.mutation(mutationRef('assets:upsert'), {
296
+ assetId: id,
297
+ filename: input.filename,
298
+ contentType: input.contentType,
299
+ byteSize: input.byteSize,
300
+ ...(input.width !== undefined ? { width: input.width } : {}),
301
+ ...(input.height !== undefined ? { height: input.height } : {}),
302
+ ...(input.alt !== undefined ? { alt: input.alt } : {}),
303
+ // EC-153 parity: `title` (EC-152 metadata) must persist, not silently drop.
304
+ ...(input.title !== undefined ? { title: input.title } : {}),
305
+ ...(input.url !== undefined ? { url: input.url } : {}),
306
+ ...(input.focalPoint !== undefined ? { focalPoint: input.focalPoint } : {}),
307
+ storageKey: input.storageKey ?? `${projectId}/${id}`,
308
+ createdAt: now,
309
+ updatedAt: now,
310
+ }));
311
+ return assetRecordFromDoc(doc);
312
+ }
313
+ async getAsset(projectId, id) {
314
+ const found = await this.findAsset(projectId, id);
315
+ if (!found)
316
+ throw new RecordNotFoundError('asset', `${projectId}/${id}`);
317
+ return found;
318
+ }
319
+ async findAsset(projectId, id) {
320
+ const doc = (await this.client.query(queryRef('assets:get'), {
321
+ assetId: id,
322
+ }));
323
+ return doc ? assetRecordFromDoc(doc) : undefined;
324
+ }
325
+ async listAssets(projectId) {
326
+ const docs = (await this.client.query(queryRef('assets:list'), {}));
327
+ return docs.map(assetRecordFromDoc);
328
+ }
329
+ async removeAsset(projectId, id) {
330
+ // EC-153 parity: removing an unknown asset is not-found, never a no-op.
331
+ await this.getAsset(projectId, id);
332
+ await this.client.mutation(mutationRef('assets:remove'), { assetId: id });
333
+ }
334
+ async resolveMany(projectId, ids) {
335
+ const all = await this.listAssets(projectId);
336
+ const out = new Map();
337
+ for (const asset of all)
338
+ if (ids.includes(asset.id))
339
+ out.set(asset.id, asset);
340
+ return out;
341
+ }
342
+ }
343
+ /**
344
+ * Map a Convex publishing doc onto the contract record (drop _id/_creationTime).
345
+ * Single-tenant (EC-179): the stored row carries no `projectId`, so the bound
346
+ * slug is stamped from the adapter for the provider-neutral record shape.
347
+ */
348
+ function publishingRecordFromDoc(doc, projectId) {
349
+ return {
350
+ projectId,
351
+ status: doc.status,
352
+ ...(doc.publishedRevisionId ? { publishedRevisionId: doc.publishedRevisionId } : {}),
353
+ ...(doc.publishedRevision !== undefined ? { publishedRevision: doc.publishedRevision } : {}),
354
+ ...(doc.publishedAt ? { publishedAt: doc.publishedAt } : {}),
355
+ createdAt: doc.createdAt,
356
+ updatedAt: doc.updatedAt,
357
+ };
358
+ }
359
+ class ConvexPublishingRepository {
360
+ client;
361
+ clock;
362
+ constructor(client, clock = realClock) {
363
+ this.client = client;
364
+ this.clock = clock;
365
+ }
366
+ async getState(projectId) {
367
+ const found = await this.findState(projectId);
368
+ if (!found)
369
+ throw new RecordNotFoundError('publishing-state', projectId);
370
+ return found;
371
+ }
372
+ async findState(projectId) {
373
+ const doc = (await this.client.query(queryRef('publishing:getState'), {}));
374
+ return doc ? publishingRecordFromDoc(doc, projectId) : undefined;
375
+ }
376
+ async publish(projectId, input) {
377
+ if (!input.revisionId) {
378
+ throw new PersistenceValidationError('Cannot publish without a graph revision.', [
379
+ { code: 'missing-revision', message: 'A revision id is required.', domain: 'publishing' },
380
+ ]);
381
+ }
382
+ // EC-153 parity: validate the revision number like the in-memory adapter.
383
+ if (!Number.isInteger(input.revision) || input.revision < 1) {
384
+ throw new PersistenceValidationError('Cannot publish an invalid revision number.', [
385
+ {
386
+ code: 'invalid-revision',
387
+ message: `Revision must be a positive integer (got ${input.revision}).`,
388
+ domain: 'publishing',
389
+ },
390
+ ]);
391
+ }
392
+ const doc = (await this.client.mutation(mutationRef('publishing:publish'), {
393
+ revisionId: input.revisionId,
394
+ revision: input.revision,
395
+ publishedAt: this.clock(),
396
+ }));
397
+ // EC-153 parity: return the stored record (createdAt survives republish).
398
+ return publishingRecordFromDoc(doc, projectId);
399
+ }
400
+ async unpublish(projectId) {
401
+ let doc;
402
+ try {
403
+ doc = (await this.client.mutation(mutationRef('publishing:unpublish'), {
404
+ updatedAt: this.clock(),
405
+ }));
406
+ }
407
+ catch (error) {
408
+ // Only the backend's invalid-transition guard maps onto validation;
409
+ // anything else (auth, transport) keeps its own category.
410
+ const message = error instanceof Error ? error.message : String(error);
411
+ if (/invalid-transition/.test(message)) {
412
+ throw new PersistenceValidationError('Deployment is not currently published.', [
413
+ { code: 'invalid-transition', message, domain: 'publishing' },
414
+ ]);
415
+ }
416
+ throw error;
417
+ }
418
+ return publishingRecordFromDoc(doc, projectId);
419
+ }
420
+ }
421
+ function referenceRecordFromDoc(doc) {
422
+ return {
423
+ projectId: doc.projectId,
424
+ variant: doc.variant,
425
+ source: { type: doc.sourceType, id: doc.sourceId },
426
+ path: doc.path,
427
+ target: { type: doc.targetType, id: doc.targetId },
428
+ kind: doc.kind,
429
+ };
430
+ }
431
+ /** Deterministic ordering is a repository contract; Convex docs sort client-side. */
432
+ function sortedReferenceRecords(docs) {
433
+ return docs.map(referenceRecordFromDoc).sort(compareReferenceEntries);
434
+ }
435
+ class ConvexReferenceIndexRepository {
436
+ client;
437
+ constructor(client) {
438
+ this.client = client;
439
+ }
440
+ async replaceForSource(projectId, variant, source, references) {
441
+ await this.client.mutation(mutationRef('references:replaceForSource'), {
442
+ variant,
443
+ sourceType: source.type,
444
+ sourceId: source.id,
445
+ references: references.map((r) => ({
446
+ path: r.path,
447
+ targetType: r.target.type,
448
+ targetId: r.target.id,
449
+ kind: r.kind,
450
+ })),
451
+ });
452
+ return this.outbound(projectId, source, { variant });
453
+ }
454
+ async replaceForSourceTypes(projectId, variant, sourceTypes, entries) {
455
+ await this.client.mutation(mutationRef('references:replaceForSourceTypes'), {
456
+ variant,
457
+ sourceTypes: [...sourceTypes],
458
+ entries: entries.map((e) => ({
459
+ sourceType: e.source.type,
460
+ sourceId: e.source.id,
461
+ path: e.path,
462
+ targetType: e.target.type,
463
+ targetId: e.target.id,
464
+ kind: e.kind,
465
+ })),
466
+ });
467
+ const all = await this.listEntries(projectId, variant);
468
+ const types = new Set(sourceTypes);
469
+ return all.filter((record) => types.has(record.source.type));
470
+ }
471
+ async removeForSource(projectId, source, variant) {
472
+ await this.client.mutation(mutationRef('references:removeForSource'), {
473
+ sourceType: source.type,
474
+ sourceId: source.id,
475
+ ...(variant ? { variant } : {}),
476
+ });
477
+ }
478
+ async outbound(projectId, source, options = {}) {
479
+ const docs = (await this.client.query(queryRef('references:outbound'), {
480
+ sourceType: source.type,
481
+ sourceId: source.id,
482
+ ...(options.variant ? { variant: options.variant } : {}),
483
+ }));
484
+ return sortedReferenceRecords(docs);
485
+ }
486
+ async inbound(projectId, target, options = {}) {
487
+ const docs = (await this.client.query(queryRef('references:inbound'), {
488
+ targetType: target.type,
489
+ targetId: target.id,
490
+ ...(options.variant ? { variant: options.variant } : {}),
491
+ }));
492
+ return sortedReferenceRecords(docs);
493
+ }
494
+ async listEntries(projectId, variant) {
495
+ const docs = (await this.client.query(queryRef('references:list'), {
496
+ ...(variant ? { variant } : {}),
497
+ }));
498
+ return sortedReferenceRecords(docs);
499
+ }
500
+ async clearProject(projectId) {
501
+ await this.client.mutation(mutationRef('references:clearProject'), {});
502
+ }
503
+ }
504
+ /**
505
+ * Single-tenant (EC-179): membership is deployment-scoped, so the backend rows
506
+ * carry no `projectId`. The contract record still does — this adapter is bound
507
+ * to its deployment's project, so it stamps that slug onto every record.
508
+ */
509
+ function memberRecordFromDoc(doc, projectId) {
510
+ return {
511
+ projectId,
512
+ userId: doc.userId,
513
+ role: doc.role,
514
+ createdAt: doc.createdAt,
515
+ updatedAt: doc.updatedAt,
516
+ };
517
+ }
518
+ class ConvexMembersRepository {
519
+ client;
520
+ boundProjectId;
521
+ clock;
522
+ constructor(client,
523
+ /** The slug of this deployment's one project — stamped onto records. */
524
+ boundProjectId, clock = realClock) {
525
+ this.client = client;
526
+ this.boundProjectId = boundProjectId;
527
+ this.clock = clock;
528
+ }
529
+ async setMember(projectId, userId, role) {
530
+ const now = this.clock();
531
+ const doc = (await this.client.mutation(mutationRef('members:set'), {
532
+ userId,
533
+ role,
534
+ createdAt: now,
535
+ updatedAt: now,
536
+ }));
537
+ return memberRecordFromDoc(doc, projectId);
538
+ }
539
+ async findMember(projectId, userId) {
540
+ const doc = (await this.client.query(queryRef('members:get'), {
541
+ userId,
542
+ }));
543
+ return doc ? memberRecordFromDoc(doc, projectId) : undefined;
544
+ }
545
+ async listMembers(projectId) {
546
+ const docs = (await this.client.query(queryRef('members:list'), {}));
547
+ return docs.map((d) => memberRecordFromDoc(d, projectId));
548
+ }
549
+ async listMembershipsForUser(userId) {
550
+ // `members:mine` is caller-scoped server-side and returns the caller's single
551
+ // deployment membership (or null). The studio only ever asks about the
552
+ // session user; records are stamped with this deployment's bound project.
553
+ const doc = (await this.client.query(queryRef('members:mine'), {}));
554
+ return doc && doc.userId === userId ? [memberRecordFromDoc(doc, this.boundProjectId)] : [];
555
+ }
556
+ async removeMember(projectId, userId) {
557
+ try {
558
+ await this.client.mutation(mutationRef('members:remove'), { userId });
559
+ }
560
+ catch (error) {
561
+ const message = error instanceof Error ? error.message : String(error);
562
+ if (/not-found/i.test(message)) {
563
+ throw new RecordNotFoundError('project-member', `${projectId}/${userId}`);
564
+ }
565
+ throw error;
566
+ }
567
+ }
568
+ }
569
+ function cliTokenRecordFromDoc(doc) {
570
+ return {
571
+ id: doc.tokenId,
572
+ label: doc.label,
573
+ tokenHash: doc.tokenHash,
574
+ createdAt: doc.createdAt,
575
+ ...(doc.revokedAt ? { revokedAt: doc.revokedAt } : {}),
576
+ };
577
+ }
578
+ class ConvexCliTokenRepository {
579
+ client;
580
+ clock;
581
+ constructor(client, clock = realClock) {
582
+ this.client = client;
583
+ this.clock = clock;
584
+ }
585
+ async createToken(input) {
586
+ const doc = (await this.client.mutation(mutationRef('cliTokens:create'), {
587
+ tokenId: newId('tok'),
588
+ label: input.label,
589
+ tokenHash: input.tokenHash,
590
+ createdAt: this.clock(),
591
+ }));
592
+ return cliTokenRecordFromDoc(doc);
593
+ }
594
+ async listTokens() {
595
+ const docs = (await this.client.query(queryRef('cliTokens:list'), {}));
596
+ return docs.map(cliTokenRecordFromDoc);
597
+ }
598
+ async revokeToken(tokenId) {
599
+ try {
600
+ const doc = (await this.client.mutation(mutationRef('cliTokens:revoke'), {
601
+ tokenId,
602
+ revokedAt: this.clock(),
603
+ }));
604
+ return cliTokenRecordFromDoc(doc);
605
+ }
606
+ catch (error) {
607
+ const message = error instanceof Error ? error.message : String(error);
608
+ if (/not-found/i.test(message)) {
609
+ throw new RecordNotFoundError('cli-token', tokenId);
610
+ }
611
+ throw error;
612
+ }
613
+ }
614
+ async findByHash(tokenHash) {
615
+ const doc = (await this.client.query(queryRef('cliTokens:byHash'), {
616
+ tokenHash,
617
+ }));
618
+ return doc ? cliTokenRecordFromDoc(doc) : undefined;
619
+ }
620
+ }
621
+ /**
622
+ * Convex-backed {@link PersistenceAdapter} (brief §10, EC-039). Every repository
623
+ * is implemented against the Convex functions in `apps/builder/convex/*`, mapping
624
+ * results and failures onto the provider-neutral contracts + error taxonomies.
625
+ */
626
+ export class ConvexPersistenceAdapter {
627
+ client;
628
+ graphs;
629
+ cms;
630
+ assets;
631
+ publishing;
632
+ /** Reference index — outbound/inbound entries per variant (EC-155, AD-6). */
633
+ references;
634
+ /** Per-project membership roles (EC-150). */
635
+ members;
636
+ /** Revocable CLI sync tokens, stored hashed (EC-150). */
637
+ cliTokens;
638
+ /** Convex file storage behind the EC-133 blob boundary (EC-151). */
639
+ blobs;
640
+ /**
641
+ * @param client the Convex client bound to this deployment (one project).
642
+ * @param projectId the slug of this deployment's one project (EC-179). Used to
643
+ * stamp deployment-scoped member records onto the still-project-keyed contract.
644
+ * @param collections the active project's config-owned CMS collections (EC-183,
645
+ * AD-11), from `elytra.config.ts`. The backend has no `cmsSchemas` table, so
646
+ * the CMS repository serves the schema from these.
647
+ */
648
+ constructor(client, projectId, collections = []) {
649
+ this.client = client;
650
+ this.graphs = new ConvexGraphRepository(client);
651
+ this.cms = new ConvexCmsRepository(client, collections);
652
+ this.assets = new ConvexAssetRepository(client);
653
+ this.publishing = new ConvexPublishingRepository(client);
654
+ this.references = new ConvexReferenceIndexRepository(client);
655
+ this.members = new ConvexMembersRepository(client, projectId);
656
+ this.cliTokens = new ConvexCliTokenRepository(client);
657
+ this.blobs = new ConvexBlobStorage(client);
658
+ }
659
+ async status() {
660
+ try {
661
+ // Lightweight connectivity probe (EC-182: no `projects` table). `members:mine`
662
+ // takes no args and answers for any authenticated caller.
663
+ await this.client.query(queryRef('members:mine'), {});
664
+ return { backend: 'convex', available: true };
665
+ }
666
+ catch (error) {
667
+ const detail = error instanceof Error ? error.message : String(error);
668
+ // EC-153: an `unauthorized` rejection *is* a healthy backend — the
669
+ // deployment answered and enforced auth. Only transport/server failures
670
+ // count as unavailable; the BackendGate surfaces those visibly instead
671
+ // of ever falling back to in-memory storage.
672
+ if (/unauthorized/i.test(detail))
673
+ return { backend: 'convex', available: true };
674
+ return { backend: 'convex', available: false, detail };
675
+ }
676
+ }
677
+ validate(input) {
678
+ return validateForPersistence(input);
679
+ }
680
+ }
681
+ //# sourceMappingURL=convex-adapter.js.map