canopycms 0.0.68-int.97 → 0.1.0-int.115

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 (637) hide show
  1. package/CHANGELOG.md +2095 -0
  2. package/README.md +49 -64
  3. package/dist/ai/generate.d.ts +5 -0
  4. package/dist/ai/generate.js +244 -115
  5. package/dist/ai/index.d.ts +1 -1
  6. package/dist/ai/json-to-markdown.d.ts +21 -1
  7. package/dist/ai/json-to-markdown.js +120 -57
  8. package/dist/ai/references.d.ts +72 -0
  9. package/dist/ai/references.js +221 -0
  10. package/dist/ai/resolve-branch.js +9 -2
  11. package/dist/ai/to-plain-text.d.ts +17 -8
  12. package/dist/ai/to-plain-text.js +18 -15
  13. package/dist/ai/types.d.ts +84 -3
  14. package/dist/api/admin-branch-health.d.ts +24 -1
  15. package/dist/api/admin-branch-health.js +52 -20
  16. package/dist/api/admin.d.ts +23 -5
  17. package/dist/api/admin.js +36 -1
  18. package/dist/api/assets.js +86 -76
  19. package/dist/api/branch-create-window.d.ts +12 -0
  20. package/dist/api/branch-create-window.js +13 -0
  21. package/dist/api/branch-merge.js +1 -1
  22. package/dist/api/branch-review.d.ts +3 -3
  23. package/dist/api/branch-review.js +16 -7
  24. package/dist/api/branch-status.d.ts +16 -6
  25. package/dist/api/branch-status.js +57 -12
  26. package/dist/api/branch-withdraw.d.ts +2 -2
  27. package/dist/api/branch-withdraw.js +8 -3
  28. package/dist/api/branch.d.ts +29 -8
  29. package/dist/api/branch.js +179 -106
  30. package/dist/api/client.d.ts +78 -58
  31. package/dist/api/client.js +187 -113
  32. package/dist/api/comments.d.ts +12 -3
  33. package/dist/api/comments.js +118 -9
  34. package/dist/api/content.d.ts +9 -9
  35. package/dist/api/content.js +131 -22
  36. package/dist/api/entries-constants.d.ts +14 -3
  37. package/dist/api/entries-constants.js +14 -3
  38. package/dist/api/entries.d.ts +38 -0
  39. package/dist/api/entries.js +102 -6
  40. package/dist/api/github-sync.d.ts +19 -0
  41. package/dist/api/github-sync.js +50 -3
  42. package/dist/api/groups.d.ts +4 -4
  43. package/dist/api/groups.js +2 -1
  44. package/dist/api/guards.js +23 -3
  45. package/dist/api/index.d.ts +3 -1
  46. package/dist/api/index.js +1 -0
  47. package/dist/api/permissions.d.ts +19 -0
  48. package/dist/api/permissions.js +50 -3
  49. package/dist/api/request-deadline.d.ts +59 -0
  50. package/dist/api/request-deadline.js +73 -0
  51. package/dist/api/resolve-references.js +8 -7
  52. package/dist/api/route-builder.d.ts +14 -0
  53. package/dist/api/route-builder.js +14 -1
  54. package/dist/api/schema.d.ts +11 -9
  55. package/dist/api/schema.js +2 -0
  56. package/dist/api/settings-helpers.d.ts +5 -1
  57. package/dist/api/settings-helpers.js +10 -2
  58. package/dist/api/types.d.ts +17 -0
  59. package/dist/api/users-constants.d.ts +6 -0
  60. package/dist/api/users-constants.js +6 -0
  61. package/dist/assets/asset-url.d.ts +28 -16
  62. package/dist/assets/asset-url.js +51 -25
  63. package/dist/assets/finalize.js +3 -0
  64. package/dist/assets/index.d.ts +1 -1
  65. package/dist/assets/materialize.d.ts +153 -0
  66. package/dist/assets/materialize.js +402 -0
  67. package/dist/assets/store-local.d.ts +19 -5
  68. package/dist/assets/store-local.js +69 -10
  69. package/dist/assets/store-s3.d.ts +38 -7
  70. package/dist/assets/store-s3.js +128 -22
  71. package/dist/assets/transform-directives.d.ts +52 -13
  72. package/dist/assets/transform-directives.js +87 -27
  73. package/dist/assets/transform.d.ts +3 -3
  74. package/dist/assets/transform.js +13 -8
  75. package/dist/assets/types.d.ts +31 -4
  76. package/dist/auth/cache.d.ts +1 -1
  77. package/dist/auth/cache.js +1 -1
  78. package/dist/auth/caching-auth-plugin.d.ts +2 -0
  79. package/dist/auth/caching-auth-plugin.js +12 -2
  80. package/dist/auth/file-based-auth-cache.d.ts +8 -0
  81. package/dist/auth/file-based-auth-cache.js +18 -8
  82. package/dist/auth/person-name.d.ts +5 -0
  83. package/dist/auth/person-name.js +8 -0
  84. package/dist/auth/plugin.d.ts +10 -1
  85. package/dist/auth/types.d.ts +2 -0
  86. package/dist/auth/user-metadata-lookup.d.ts +21 -0
  87. package/dist/auth/user-metadata-lookup.js +116 -0
  88. package/dist/authorization/branch.d.ts +1 -1
  89. package/dist/authorization/branch.js +12 -13
  90. package/dist/authorization/groups/schema.d.ts +4 -4
  91. package/dist/authorization/helpers.d.ts +8 -0
  92. package/dist/authorization/helpers.js +8 -0
  93. package/dist/authorization/index.d.ts +1 -1
  94. package/dist/authorization/index.js +1 -1
  95. package/dist/authorization/protected-branch.d.ts +5 -4
  96. package/dist/authorization/protected-branch.js +7 -5
  97. package/dist/branch-health.d.ts +35 -8
  98. package/dist/branch-health.js +54 -18
  99. package/dist/branch-metadata-error.d.ts +27 -0
  100. package/dist/branch-metadata-error.js +23 -0
  101. package/dist/branch-metadata-file.d.ts +205 -24
  102. package/dist/branch-metadata-file.js +126 -25
  103. package/dist/branch-metadata.d.ts +45 -6
  104. package/dist/branch-metadata.js +142 -50
  105. package/dist/branch-provisioning.d.ts +167 -0
  106. package/dist/branch-provisioning.js +501 -0
  107. package/dist/branch-registry.d.ts +8 -0
  108. package/dist/branch-registry.js +61 -9
  109. package/dist/branch-schema-cache.d.ts +29 -12
  110. package/dist/branch-schema-cache.js +64 -21
  111. package/dist/branch-sparse.d.ts +23 -0
  112. package/dist/branch-sparse.js +118 -0
  113. package/dist/branch-workspace.d.ts +42 -3
  114. package/dist/branch-workspace.js +239 -100
  115. package/dist/build/asset-refs.d.ts +94 -0
  116. package/dist/build/asset-refs.js +267 -0
  117. package/dist/build/generate-ai-content.js +5 -0
  118. package/dist/build/inline-flight.d.ts +37 -0
  119. package/dist/build/inline-flight.js +142 -0
  120. package/dist/cli/asset-refs.d.ts +52 -0
  121. package/dist/cli/asset-refs.js +194 -0
  122. package/dist/cli/cli.d.ts +15 -1
  123. package/dist/cli/cli.js +8532 -3184
  124. package/dist/cli/configured-asset-store.d.ts +12 -0
  125. package/dist/cli/configured-asset-store.js +46 -0
  126. package/dist/cli/generate-ai-content.js +4237 -1067
  127. package/dist/cli/init.js +214 -123
  128. package/dist/cli/project-detect.d.ts +2 -0
  129. package/dist/cli/project-detect.js +2 -0
  130. package/dist/cli/template-files/Dockerfile.cms.template +13 -5
  131. package/dist/cli/template-files/cms-stack.ts.template +20 -14
  132. package/dist/client.d.ts +1 -1
  133. package/dist/client.js +1 -1
  134. package/dist/comment-store.d.ts +25 -0
  135. package/dist/comment-store.js +43 -8
  136. package/dist/config/flatten.js +2 -0
  137. package/dist/config/helpers.js +2 -2
  138. package/dist/config/index.d.ts +1 -1
  139. package/dist/config/schemas/config.d.ts +17 -29
  140. package/dist/config/schemas/config.js +10 -12
  141. package/dist/config/schemas/field.d.ts +3 -0
  142. package/dist/config/schemas/field.js +58 -4
  143. package/dist/config/schemas/media.d.ts +4 -13
  144. package/dist/config/schemas/media.js +5 -8
  145. package/dist/config/schemas/url.d.ts +2 -20
  146. package/dist/config/schemas/url.js +2 -25
  147. package/dist/config/types.d.ts +123 -31
  148. package/dist/config/types.js +3 -9
  149. package/dist/config/validation.d.ts +25 -4
  150. package/dist/config/validation.js +116 -3
  151. package/dist/content-id-index.js +2 -2
  152. package/dist/content-listing.d.ts +10 -1
  153. package/dist/content-listing.js +21 -4
  154. package/dist/content-reader.d.ts +9 -0
  155. package/dist/content-reader.js +15 -10
  156. package/dist/content-store.d.ts +74 -11
  157. package/dist/content-store.js +248 -85
  158. package/dist/content-tree.js +2 -2
  159. package/dist/context.js +5 -2
  160. package/dist/dangling-reference-log.d.ts +17 -0
  161. package/dist/dangling-reference-log.js +29 -0
  162. package/dist/editor/BranchManager.d.ts +26 -8
  163. package/dist/editor/BranchManager.js +142 -65
  164. package/dist/editor/CanopyEditor.d.ts +1 -1
  165. package/dist/editor/CanopyEditor.js +2 -6
  166. package/dist/editor/CommentsPanel.d.ts +14 -0
  167. package/dist/editor/CommentsPanel.js +68 -40
  168. package/dist/editor/Editor.d.ts +13 -4
  169. package/dist/editor/Editor.js +673 -148
  170. package/dist/editor/EditorAuthGate.d.ts +7 -1
  171. package/dist/editor/EditorAuthGate.js +34 -7
  172. package/dist/editor/EditorPanes.d.ts +10 -0
  173. package/dist/editor/EditorPanes.js +39 -13
  174. package/dist/editor/EntryNavigator.d.ts +12 -0
  175. package/dist/editor/EntryNavigator.js +304 -105
  176. package/dist/editor/FormHeader.d.ts +25 -0
  177. package/dist/editor/FormHeader.js +82 -0
  178. package/dist/editor/FormRenderer.d.ts +27 -3
  179. package/dist/editor/FormRenderer.js +171 -76
  180. package/dist/editor/PreviewFrame.d.ts +36 -0
  181. package/dist/editor/PreviewFrame.js +214 -0
  182. package/dist/editor/admin/SystemHealthPanel.d.ts +2 -1
  183. package/dist/editor/admin/SystemHealthPanel.js +163 -33
  184. package/dist/editor/admin/useSystemHealth.d.ts +18 -0
  185. package/dist/editor/admin/useSystemHealth.js +70 -1
  186. package/dist/editor/branch-status.d.ts +17 -0
  187. package/dist/editor/branch-status.js +29 -0
  188. package/dist/editor/canopy-path.d.ts +9 -6
  189. package/dist/editor/canopy-path.js +8 -11
  190. package/dist/editor/client-reference-resolver.d.ts +43 -16
  191. package/dist/editor/client-reference-resolver.js +155 -64
  192. package/dist/editor/comments/BranchComments.d.ts +1 -1
  193. package/dist/editor/comments/BranchComments.js +2 -2
  194. package/dist/editor/comments/CloseRefusedNotice.d.ts +4 -0
  195. package/dist/editor/comments/CloseRefusedNotice.js +7 -0
  196. package/dist/editor/comments/CommentThreadsPopover.d.ts +47 -0
  197. package/dist/editor/comments/CommentThreadsPopover.js +274 -0
  198. package/dist/editor/comments/CommentWriteAlert.d.ts +11 -0
  199. package/dist/editor/comments/CommentWriteAlert.js +13 -0
  200. package/dist/editor/comments/EntryComments.d.ts +10 -4
  201. package/dist/editor/comments/EntryComments.js +14 -17
  202. package/dist/editor/comments/FieldWrapper.d.ts +18 -4
  203. package/dist/editor/comments/FieldWrapper.js +62 -28
  204. package/dist/editor/comments/InlineCommentThread.d.ts +9 -2
  205. package/dist/editor/comments/InlineCommentThread.js +11 -47
  206. package/dist/editor/comments/ThreadCarousel.d.ts +1 -1
  207. package/dist/editor/comments/ThreadCarousel.js +18 -21
  208. package/dist/editor/comments/ThreadReplyControls.d.ts +28 -0
  209. package/dist/editor/comments/ThreadReplyControls.js +92 -0
  210. package/dist/editor/comments/field-comment-context.d.ts +14 -0
  211. package/dist/editor/comments/field-comment-context.js +14 -0
  212. package/dist/editor/comments/form-comments.d.ts +48 -0
  213. package/dist/editor/comments/form-comments.js +177 -0
  214. package/dist/editor/comments/item-anchor-copy.d.ts +6 -0
  215. package/dist/editor/comments/item-anchor-copy.js +6 -0
  216. package/dist/editor/comments/move-focus-if-unmoved.d.ts +6 -0
  217. package/dist/editor/comments/move-focus-if-unmoved.js +11 -0
  218. package/dist/editor/comments/popover-placement.d.ts +18 -0
  219. package/dist/editor/comments/popover-placement.js +58 -0
  220. package/dist/editor/comments/use-tracked-writes.d.ts +16 -0
  221. package/dist/editor/comments/use-tracked-writes.js +53 -0
  222. package/dist/editor/components/BranchAccessList.d.ts +15 -0
  223. package/dist/editor/components/BranchAccessList.js +52 -0
  224. package/dist/editor/components/BranchesDrawer.d.ts +11 -0
  225. package/dist/editor/components/BranchesDrawer.js +5 -0
  226. package/dist/editor/components/ConfirmDeleteModal.d.ts +4 -1
  227. package/dist/editor/components/ConfirmDeleteModal.js +2 -2
  228. package/dist/editor/components/DestructiveMenuItem.d.ts +7 -0
  229. package/dist/editor/components/DestructiveMenuItem.js +8 -0
  230. package/dist/editor/components/EditorCrashScreen.d.ts +17 -0
  231. package/dist/editor/components/EditorCrashScreen.js +22 -0
  232. package/dist/editor/components/EditorErrorBoundary.d.ts +38 -0
  233. package/dist/editor/components/EditorErrorBoundary.js +40 -0
  234. package/dist/editor/components/EditorHeader.d.ts +8 -0
  235. package/dist/editor/components/EditorHeader.js +89 -69
  236. package/dist/editor/components/EditorSidebar.d.ts +14 -11
  237. package/dist/editor/components/EditorSidebar.js +32 -4
  238. package/dist/editor/components/EntryCreateModal.d.ts +12 -7
  239. package/dist/editor/components/EntryCreateModal.js +51 -57
  240. package/dist/editor/components/NoEditPermissionNotice.d.ts +6 -5
  241. package/dist/editor/components/NoEditPermissionNotice.js +5 -4
  242. package/dist/editor/components/QuickOpenPalette.d.ts +22 -0
  243. package/dist/editor/components/QuickOpenPalette.js +65 -0
  244. package/dist/editor/components/ReadOnlyDraftNotice.d.ts +11 -0
  245. package/dist/editor/components/ReadOnlyDraftNotice.js +12 -0
  246. package/dist/editor/components/ReasonedMenuItem.d.ts +15 -0
  247. package/dist/editor/components/ReasonedMenuItem.js +15 -0
  248. package/dist/editor/components/ReferencedByList.d.ts +11 -0
  249. package/dist/editor/components/ReferencedByList.js +28 -0
  250. package/dist/editor/components/RelativeTime.d.ts +10 -0
  251. package/dist/editor/components/RelativeTime.js +10 -0
  252. package/dist/editor/components/RenameEntryModal.d.ts +7 -1
  253. package/dist/editor/components/RenameEntryModal.js +18 -31
  254. package/dist/editor/components/RetryToastMessage.d.ts +9 -0
  255. package/dist/editor/components/RetryToastMessage.js +6 -0
  256. package/dist/editor/components/StagedChangesDrawer.d.ts +39 -0
  257. package/dist/editor/components/StagedChangesDrawer.js +92 -0
  258. package/dist/editor/components/UnavailableEntryNotice.d.ts +6 -0
  259. package/dist/editor/components/UnavailableEntryNotice.js +9 -0
  260. package/dist/editor/components/UnavailableTypeMessage.d.ts +6 -0
  261. package/dist/editor/components/UnavailableTypeMessage.js +9 -0
  262. package/dist/editor/components/UndoToastMessage.d.ts +18 -0
  263. package/dist/editor/components/UndoToastMessage.js +10 -0
  264. package/dist/editor/components/UserBadge.d.ts +2 -5
  265. package/dist/editor/components/UserBadge.js +62 -33
  266. package/dist/editor/components/ValidationSummary.d.ts +14 -0
  267. package/dist/editor/components/ValidationSummary.js +24 -0
  268. package/dist/editor/context/ApiClientContext.d.ts +8 -2
  269. package/dist/editor/context/ApiClientContext.js +19 -8
  270. package/dist/editor/context/AssetContext.d.ts +13 -35
  271. package/dist/editor/context/AssetContext.js +12 -31
  272. package/dist/editor/context/SWRProvider.d.ts +3 -3
  273. package/dist/editor/context/SiteMdxAllowContext.d.ts +4 -0
  274. package/dist/editor/context/SiteMdxAllowContext.js +7 -0
  275. package/dist/editor/context/index.d.ts +2 -1
  276. package/dist/editor/context/index.js +2 -1
  277. package/dist/editor/contrast.d.ts +19 -0
  278. package/dist/editor/contrast.js +41 -0
  279. package/dist/editor/copy.d.ts +15 -0
  280. package/dist/editor/copy.js +15 -0
  281. package/dist/editor/editor-config.d.ts +1 -2
  282. package/dist/editor/editor-config.js +15 -22
  283. package/dist/editor/editor-utils.d.ts +31 -9
  284. package/dist/editor/editor-utils.js +75 -38
  285. package/dist/editor/entry-search.d.ts +20 -0
  286. package/dist/editor/entry-search.js +34 -0
  287. package/dist/editor/field-breadcrumb.d.ts +12 -0
  288. package/dist/editor/field-breadcrumb.js +85 -0
  289. package/dist/editor/field-props.d.ts +86 -0
  290. package/dist/editor/field-props.js +27 -0
  291. package/dist/editor/field-target.d.ts +30 -0
  292. package/dist/editor/field-target.js +77 -0
  293. package/dist/editor/fields/BlockField.d.ts +12 -0
  294. package/dist/editor/fields/BlockField.js +89 -73
  295. package/dist/editor/fields/CodeField.d.ts +2 -0
  296. package/dist/editor/fields/CodeField.js +6 -2
  297. package/dist/editor/fields/DateTimeField.d.ts +4 -29
  298. package/dist/editor/fields/DateTimeField.js +79 -41
  299. package/dist/editor/fields/ExpandAllButton.d.ts +6 -0
  300. package/dist/editor/fields/ExpandAllButton.js +4 -0
  301. package/dist/editor/fields/FieldCrashFallback.d.ts +17 -0
  302. package/dist/editor/fields/FieldCrashFallback.js +30 -0
  303. package/dist/editor/fields/FieldLabel.d.ts +37 -0
  304. package/dist/editor/fields/FieldLabel.js +19 -0
  305. package/dist/editor/fields/ImageField.d.ts +4 -0
  306. package/dist/editor/fields/ImageField.js +29 -14
  307. package/dist/editor/fields/InlineGroupField.js +4 -3
  308. package/dist/editor/fields/ItemList.d.ts +42 -0
  309. package/dist/editor/fields/ItemList.js +130 -0
  310. package/dist/editor/fields/MarkdownField.d.ts +32 -0
  311. package/dist/editor/fields/MarkdownField.js +252 -36
  312. package/dist/editor/fields/MdxImageDialog.js +1 -1
  313. package/dist/editor/fields/NumberField.d.ts +2 -0
  314. package/dist/editor/fields/NumberField.js +8 -5
  315. package/dist/editor/fields/NumberListField.d.ts +2 -0
  316. package/dist/editor/fields/NumberListField.js +19 -16
  317. package/dist/editor/fields/ObjectField.d.ts +2 -7
  318. package/dist/editor/fields/ObjectField.js +15 -5
  319. package/dist/editor/fields/ObjectListField.d.ts +29 -0
  320. package/dist/editor/fields/ObjectListField.js +57 -0
  321. package/dist/editor/fields/ReferenceField.d.ts +2 -0
  322. package/dist/editor/fields/ReferenceField.js +34 -9
  323. package/dist/editor/fields/SelectField.d.ts +2 -0
  324. package/dist/editor/fields/SelectField.js +11 -2
  325. package/dist/editor/fields/StringListField.d.ts +4 -1
  326. package/dist/editor/fields/StringListField.js +22 -8
  327. package/dist/editor/fields/TextField.d.ts +2 -0
  328. package/dist/editor/fields/TextField.js +6 -2
  329. package/dist/editor/fields/ToggleField.d.ts +2 -0
  330. package/dist/editor/fields/ToggleField.js +8 -3
  331. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +1 -1
  332. package/dist/editor/fields/entry-link/InsertEntryLink.js +4 -3
  333. package/dist/editor/fields/form-expansion.d.ts +9 -0
  334. package/dist/editor/fields/form-expansion.js +2 -0
  335. package/dist/editor/fields/item-expansion.d.ts +15 -0
  336. package/dist/editor/fields/item-expansion.js +60 -0
  337. package/dist/editor/fields/list-item-keys.d.ts +8 -0
  338. package/dist/editor/fields/list-item-keys.js +50 -0
  339. package/dist/editor/fields/list-item-title.d.ts +20 -0
  340. package/dist/editor/fields/list-item-title.js +85 -0
  341. package/dist/editor/fields/markdown-export-options.d.ts +2 -0
  342. package/dist/editor/fields/markdown-export-options.js +8 -0
  343. package/dist/editor/fields/markdown-fidelity-visitors.d.ts +11 -0
  344. package/dist/editor/fields/markdown-fidelity-visitors.js +160 -0
  345. package/dist/editor/fields/mdx-jsx-support.d.ts +5 -0
  346. package/dist/editor/fields/mdx-jsx-support.js +225 -0
  347. package/dist/editor/fields/rich-text-failures.d.ts +5 -0
  348. package/dist/editor/fields/rich-text-failures.js +26 -0
  349. package/dist/editor/fields/toolbar-wrap.d.ts +7 -0
  350. package/dist/editor/fields/toolbar-wrap.js +35 -0
  351. package/dist/editor/form-outline.d.ts +13 -0
  352. package/dist/editor/form-outline.js +70 -0
  353. package/dist/editor/group-manager/GroupCard.d.ts +4 -1
  354. package/dist/editor/group-manager/GroupCard.js +12 -3
  355. package/dist/editor/group-manager/GroupForm.js +1 -1
  356. package/dist/editor/group-manager/InternalGroupsTab.d.ts +2 -1
  357. package/dist/editor/group-manager/InternalGroupsTab.js +4 -4
  358. package/dist/editor/group-manager/MemberList.d.ts +2 -1
  359. package/dist/editor/group-manager/MemberList.js +15 -4
  360. package/dist/editor/group-manager/hooks/useGroupState.d.ts +5 -0
  361. package/dist/editor/group-manager/hooks/useGroupState.js +30 -7
  362. package/dist/editor/group-manager/index.js +34 -5
  363. package/dist/editor/group-manager/types.d.ts +5 -2
  364. package/dist/editor/hooks/create-branch-request.d.ts +20 -0
  365. package/dist/editor/hooks/create-branch-request.js +54 -0
  366. package/dist/editor/hooks/useBranchActions.d.ts +15 -2
  367. package/dist/editor/hooks/useBranchActions.js +53 -19
  368. package/dist/editor/hooks/useBranchManager.d.ts +32 -0
  369. package/dist/editor/hooks/useBranchManager.js +383 -119
  370. package/dist/editor/hooks/useBranchesData.d.ts +14 -4
  371. package/dist/editor/hooks/useBranchesData.js +15 -7
  372. package/dist/editor/hooks/useCommentSystem.d.ts +12 -2
  373. package/dist/editor/hooks/useCommentSystem.js +76 -55
  374. package/dist/editor/hooks/useCommentsData.d.ts +11 -7
  375. package/dist/editor/hooks/useCommentsData.js +20 -19
  376. package/dist/editor/hooks/useDraftManager.d.ts +54 -3
  377. package/dist/editor/hooks/useDraftManager.js +595 -83
  378. package/dist/editor/hooks/useEditorLayout.d.ts +45 -3
  379. package/dist/editor/hooks/useEditorLayout.js +97 -7
  380. package/dist/editor/hooks/useEntriesData.d.ts +2 -1
  381. package/dist/editor/hooks/useEntriesData.js +19 -5
  382. package/dist/editor/hooks/useEntryManager.d.ts +37 -3
  383. package/dist/editor/hooks/useEntryManager.js +204 -41
  384. package/dist/editor/hooks/useGroupManager.js +13 -16
  385. package/dist/editor/hooks/usePermissionManager.js +14 -6
  386. package/dist/editor/hooks/usePreviewMarks.d.ts +21 -0
  387. package/dist/editor/hooks/usePreviewMarks.js +33 -0
  388. package/dist/editor/hooks/useReferenceResolution.d.ts +10 -3
  389. package/dist/editor/hooks/useReferenceResolution.js +34 -177
  390. package/dist/editor/hooks/useSchemaManager.d.ts +25 -6
  391. package/dist/editor/hooks/useSchemaManager.js +97 -39
  392. package/dist/editor/hooks/useUserMetadata.d.ts +14 -4
  393. package/dist/editor/hooks/useUserMetadata.js +76 -47
  394. package/dist/editor/hooks/user-metadata-batcher.d.ts +8 -0
  395. package/dist/editor/hooks/user-metadata-batcher.js +33 -0
  396. package/dist/editor/media/AssetCard.d.ts +6 -7
  397. package/dist/editor/media/AssetCard.js +24 -31
  398. package/dist/editor/media/AssetListRow.d.ts +16 -0
  399. package/dist/editor/media/AssetListRow.js +41 -0
  400. package/dist/editor/media/CropStep.js +6 -1
  401. package/dist/editor/media/MediaLibrary.d.ts +3 -2
  402. package/dist/editor/media/MediaLibrary.js +11 -4
  403. package/dist/editor/media/MediaLibraryBody.d.ts +3 -3
  404. package/dist/editor/media/MediaLibraryBody.js +195 -80
  405. package/dist/editor/media/MediaLibrarySkeleton.d.ts +6 -0
  406. package/dist/editor/media/MediaLibrarySkeleton.js +14 -0
  407. package/dist/editor/media/crop-math.d.ts +3 -4
  408. package/dist/editor/media/crop-math.js +11 -22
  409. package/dist/editor/media/editor-image-src.d.ts +8 -0
  410. package/dist/editor/media/editor-image-src.js +10 -0
  411. package/dist/editor/media/format-bytes.d.ts +2 -0
  412. package/dist/editor/media/format-bytes.js +23 -0
  413. package/dist/editor/media/media-library-prefs.d.ts +23 -0
  414. package/dist/editor/media/media-library-prefs.js +49 -0
  415. package/dist/editor/media/media-library-view.d.ts +34 -0
  416. package/dist/editor/media/media-library-view.js +40 -0
  417. package/dist/editor/media/useAssetLibrary.d.ts +30 -0
  418. package/dist/editor/media/useAssetLibrary.js +126 -0
  419. package/dist/editor/media/useStableAssetOrder.d.ts +11 -0
  420. package/dist/editor/media/useStableAssetOrder.js +37 -0
  421. package/dist/editor/media/useThumbnailFailure.d.ts +6 -0
  422. package/dist/editor/media/useThumbnailFailure.js +16 -0
  423. package/dist/editor/permission-manager/GroupSelector.js +2 -2
  424. package/dist/editor/permission-manager/PermissionEditor.d.ts +1 -1
  425. package/dist/editor/permission-manager/PermissionEditor.js +15 -4
  426. package/dist/editor/permission-manager/PermissionLevelBadge.js +1 -1
  427. package/dist/editor/permission-manager/PermissionTree.d.ts +1 -1
  428. package/dist/editor/permission-manager/UserSelector.d.ts +1 -1
  429. package/dist/editor/permission-manager/UserSelector.js +3 -3
  430. package/dist/editor/permission-manager/index.js +12 -3
  431. package/dist/editor/permission-manager/types.d.ts +5 -2
  432. package/dist/editor/platform.d.ts +3 -0
  433. package/dist/editor/platform.js +9 -0
  434. package/dist/editor/preview-asset-base.d.ts +9 -0
  435. package/dist/editor/preview-asset-base.js +17 -0
  436. package/dist/editor/preview-bridge.d.ts +51 -27
  437. package/dist/editor/preview-bridge.js +103 -144
  438. package/dist/editor/preview-marks.d.ts +15 -0
  439. package/dist/editor/preview-marks.js +74 -0
  440. package/dist/editor/raw-asset-base.d.ts +5 -0
  441. package/dist/editor/raw-asset-base.js +14 -0
  442. package/dist/editor/relative-time.d.ts +4 -4
  443. package/dist/editor/relative-time.js +16 -8
  444. package/dist/editor/schema-editor/CollectionEditor.d.ts +20 -3
  445. package/dist/editor/schema-editor/CollectionEditor.js +361 -62
  446. package/dist/editor/schema-editor/EntryTypeEditor.d.ts +5 -1
  447. package/dist/editor/schema-editor/EntryTypeEditor.js +11 -6
  448. package/dist/editor/schema-editor/collection-draft.d.ts +22 -0
  449. package/dist/editor/schema-editor/collection-draft.js +40 -0
  450. package/dist/editor/schema-editor/index.d.ts +1 -1
  451. package/dist/editor/schema-label.d.ts +10 -0
  452. package/dist/editor/schema-label.js +17 -0
  453. package/dist/editor/settings-conflict.d.ts +5 -0
  454. package/dist/editor/settings-conflict.js +8 -0
  455. package/dist/editor/slug.d.ts +16 -0
  456. package/dist/editor/slug.js +43 -0
  457. package/dist/editor/theme.d.ts +2 -1
  458. package/dist/editor/theme.js +299 -13
  459. package/dist/editor/unanswered.d.ts +17 -0
  460. package/dist/editor/unanswered.js +26 -0
  461. package/dist/editor/unavailable-entry-type.d.ts +20 -0
  462. package/dist/editor/unavailable-entry-type.js +28 -0
  463. package/dist/editor/undo-removal.d.ts +57 -0
  464. package/dist/editor/undo-removal.js +163 -0
  465. package/dist/editor/user-display.d.ts +4 -0
  466. package/dist/editor/user-display.js +5 -0
  467. package/dist/editor/utils/confirm-modal.d.ts +8 -0
  468. package/dist/editor/utils/confirm-modal.js +12 -0
  469. package/dist/editor/utils/editor-errors.d.ts +19 -0
  470. package/dist/editor/utils/editor-errors.js +32 -0
  471. package/dist/editor/utils/focus-return.d.ts +56 -0
  472. package/dist/editor/utils/focus-return.js +106 -0
  473. package/dist/entry-link-resolver.d.ts +11 -1
  474. package/dist/entry-link-resolver.js +65 -5
  475. package/dist/entry-schema-registry.d.ts +3 -3
  476. package/dist/entry-schema-registry.js +7 -4
  477. package/dist/entry-schema.d.ts +49 -3
  478. package/dist/entry-schema.js +18 -0
  479. package/dist/git-manager.d.ts +172 -10
  480. package/dist/git-manager.js +448 -106
  481. package/dist/github-service.d.ts +39 -2
  482. package/dist/github-service.js +101 -7
  483. package/dist/http/handler.js +74 -9
  484. package/dist/http/types.d.ts +2 -0
  485. package/dist/http/worker-not-ready.d.ts +9 -4
  486. package/dist/http/worker-not-ready.js +59 -6
  487. package/dist/index.d.ts +2 -0
  488. package/dist/index.js +3 -0
  489. package/dist/item-keys.d.ts +46 -0
  490. package/dist/item-keys.js +235 -0
  491. package/dist/operating-mode/editor-mode-check.d.ts +15 -0
  492. package/dist/operating-mode/editor-mode-check.js +24 -0
  493. package/dist/operating-mode/mode-env.d.ts +13 -14
  494. package/dist/operating-mode/mode-env.js +13 -14
  495. package/dist/operating-mode/types.d.ts +1 -1
  496. package/dist/paths/branch.d.ts +0 -1
  497. package/dist/paths/branch.js +1 -8
  498. package/dist/paths/index.d.ts +1 -1
  499. package/dist/paths/index.js +1 -1
  500. package/dist/paths/validation.js +0 -2
  501. package/dist/preview.d.ts +8 -0
  502. package/dist/preview.js +7 -0
  503. package/dist/reference-resolver.js +1 -0
  504. package/dist/schema/meta-loader.d.ts +18 -8
  505. package/dist/schema/meta-loader.js +42 -9
  506. package/dist/schema/registry-fingerprint.d.ts +14 -0
  507. package/dist/schema/registry-fingerprint.js +63 -0
  508. package/dist/schema/resolver.d.ts +6 -3
  509. package/dist/schema/resolver.js +6 -5
  510. package/dist/schema/schema-store.d.ts +6 -9
  511. package/dist/schema/schema-store.js +11 -9
  512. package/dist/schema/schema-unavailable-error.d.ts +11 -0
  513. package/dist/schema/schema-unavailable-error.js +15 -0
  514. package/dist/schema/types.d.ts +22 -0
  515. package/dist/schema-registry-record.d.ts +35 -0
  516. package/dist/schema-registry-record.js +134 -0
  517. package/dist/server.d.ts +79 -9
  518. package/dist/server.js +62 -8
  519. package/dist/services.d.ts +33 -5
  520. package/dist/services.js +155 -37
  521. package/dist/settings-workspace.d.ts +23 -3
  522. package/dist/settings-workspace.js +159 -45
  523. package/dist/stamp-on-publish.d.ts +36 -0
  524. package/dist/stamp-on-publish.js +71 -0
  525. package/dist/static/index.d.ts +58 -5
  526. package/dist/static/index.js +133 -3
  527. package/dist/static/seo.d.ts +5 -5
  528. package/dist/static/seo.js +5 -5
  529. package/dist/submission-attribution.d.ts +8 -0
  530. package/dist/submission-attribution.js +22 -0
  531. package/dist/system-users.d.ts +12 -0
  532. package/dist/system-users.js +12 -0
  533. package/dist/task-queue/cms-task-queue.d.ts +1 -1
  534. package/dist/task-queue/cms-task-queue.js +1 -1
  535. package/dist/task-queue/index.d.ts +1 -1
  536. package/dist/task-queue/index.js +1 -1
  537. package/dist/task-queue/task-queue.d.ts +6 -0
  538. package/dist/task-queue/task-queue.js +29 -0
  539. package/dist/task-queue/worker-status.d.ts +35 -9
  540. package/dist/task-queue/worker-status.js +84 -17
  541. package/dist/types.d.ts +90 -9
  542. package/dist/url-exclusivity-fixtures.d.ts +7 -0
  543. package/dist/url-exclusivity-fixtures.js +10 -0
  544. package/dist/user.js +2 -1
  545. package/dist/utils/atomic-write.js +2 -1
  546. package/dist/utils/base-branch.d.ts +13 -0
  547. package/dist/utils/base-branch.js +23 -0
  548. package/dist/utils/content-serialize.d.ts +15 -7
  549. package/dist/utils/content-serialize.js +353 -51
  550. package/dist/utils/content-write-lock.d.ts +5 -0
  551. package/dist/utils/content-write-lock.js +20 -5
  552. package/dist/utils/error.js +13 -2
  553. package/dist/utils/escape-text.d.ts +7 -0
  554. package/dist/utils/escape-text.js +27 -0
  555. package/dist/utils/fs.d.ts +12 -4
  556. package/dist/utils/fs.js +18 -5
  557. package/dist/utils/git.d.ts +17 -1
  558. package/dist/utils/git.js +36 -3
  559. package/dist/utils/json-source-splice.d.ts +14 -0
  560. package/dist/utils/json-source-splice.js +120 -0
  561. package/dist/utils/markdown-body-splice.d.ts +39 -0
  562. package/dist/utils/markdown-body-splice.js +421 -0
  563. package/dist/utils/occ-json-write.js +18 -12
  564. package/dist/utils/provision-log.d.ts +25 -0
  565. package/dist/utils/provision-log.js +49 -0
  566. package/dist/utils/provisioning-lock.d.ts +32 -1
  567. package/dist/utils/provisioning-lock.js +78 -32
  568. package/dist/utils/sanitize-href.d.ts +9 -23
  569. package/dist/utils/sanitize-href.js +14 -28
  570. package/dist/utils/title-field.d.ts +10 -0
  571. package/dist/utils/title-field.js +47 -0
  572. package/dist/utils/yaml-source-splice.d.ts +58 -0
  573. package/dist/utils/yaml-source-splice.js +515 -0
  574. package/dist/validation/deletion-checker.d.ts +21 -29
  575. package/dist/validation/deletion-checker.js +41 -117
  576. package/dist/validation/entry-validator.d.ts +6 -10
  577. package/dist/validation/entry-validator.js +19 -26
  578. package/dist/validation/field-traversal.d.ts +22 -0
  579. package/dist/validation/field-traversal.js +39 -8
  580. package/dist/validation/markdown-safety.d.ts +68 -0
  581. package/dist/validation/markdown-safety.js +596 -0
  582. package/dist/validation/mdx-allowlist.d.ts +55 -0
  583. package/dist/validation/mdx-allowlist.js +183 -0
  584. package/dist/validation/reference-validator.d.ts +2 -0
  585. package/dist/validation/reference-validator.js +3 -0
  586. package/dist/version.d.ts +1 -1
  587. package/dist/version.js +1 -1
  588. package/dist/worker/branch-policy.d.ts +124 -0
  589. package/dist/worker/branch-policy.js +243 -0
  590. package/dist/worker/bundle-header.d.ts +117 -0
  591. package/dist/worker/bundle-header.js +253 -0
  592. package/dist/worker/cms-worker.d.ts +236 -142
  593. package/dist/worker/cms-worker.js +772 -285
  594. package/dist/worker/gateway-egress.d.ts +43 -0
  595. package/dist/worker/gateway-egress.js +209 -0
  596. package/dist/worker/gateway-instance.d.ts +42 -0
  597. package/dist/worker/gateway-instance.js +129 -0
  598. package/dist/worker/git-process.d.ts +81 -0
  599. package/dist/worker/git-process.js +234 -0
  600. package/dist/worker/git-sync.d.ts +34 -17
  601. package/dist/worker/git-sync.js +394 -131
  602. package/dist/worker/github-auth.d.ts +8 -8
  603. package/dist/worker/github-auth.js +12 -14
  604. package/dist/worker/github-gateway-http.d.ts +62 -0
  605. package/dist/worker/github-gateway-http.js +977 -0
  606. package/dist/worker/github-gateway-wire.d.ts +589 -0
  607. package/dist/worker/github-gateway-wire.js +484 -0
  608. package/dist/worker/github-gateway.d.ts +238 -0
  609. package/dist/worker/github-gateway.js +726 -0
  610. package/dist/worker/github-mirror-upkeep.d.ts +75 -0
  611. package/dist/worker/github-mirror-upkeep.js +266 -0
  612. package/dist/worker/github-mirror.d.ts +364 -0
  613. package/dist/worker/github-mirror.js +1030 -0
  614. package/dist/worker/github-transfer.d.ts +56 -0
  615. package/dist/worker/github-transfer.js +444 -0
  616. package/dist/worker/history-rewrite.d.ts +3 -4
  617. package/dist/worker/history-rewrite.js +11 -16
  618. package/dist/worker/provisioned-workspace.d.ts +5 -5
  619. package/dist/worker/provisioned-workspace.js +5 -5
  620. package/dist/worker/rebase.d.ts +1 -1
  621. package/dist/worker/rebase.js +58 -54
  622. package/dist/worker/remote-git-maintenance.d.ts +3 -0
  623. package/dist/worker/remote-git-maintenance.js +12 -0
  624. package/dist/worker/schema-gate.d.ts +49 -0
  625. package/dist/worker/schema-gate.js +226 -0
  626. package/dist/worker/self-checks.d.ts +107 -0
  627. package/dist/worker/self-checks.js +358 -0
  628. package/dist/worker/shared-repo-git.d.ts +96 -0
  629. package/dist/worker/shared-repo-git.js +459 -0
  630. package/dist/worker/sparse-cone.d.ts +20 -0
  631. package/dist/worker/sparse-cone.js +136 -0
  632. package/dist/worker/stale-mirror.d.ts +82 -0
  633. package/dist/worker/stale-mirror.js +130 -0
  634. package/dist/worker/task-runner.d.ts +5 -3
  635. package/dist/worker/task-runner.js +287 -186
  636. package/dist/worker/worker-context.d.ts +36 -37
  637. package/package.json +31 -4
package/README.md CHANGED
@@ -4,29 +4,17 @@ CanopyCMS is a schema-driven, branch-aware CMS for websites that store their con
4
4
 
5
5
  ## Which documentation matches this build
6
6
 
7
- This package ships code, not documentation. The guides — `docs/adopter-migration.md`,
8
- `docs/deploying-to-aws.md` and the project README — live in the repository and change
9
- alongside the code, so read them at the ref **your installed version was built from**, not at
10
- `main`. The npm provenance attestation records that ref exactly:
11
-
12
- ```bash
13
- V=$(node -p "require('./node_modules/canopycms/package.json').version")
14
- curl -s "https://registry.npmjs.org/-/npm/v1/attestations/canopycms@$V" | node -e '
15
- let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{
16
- const a=JSON.parse(s).attestations.find(x=>x.predicateType==="https://slsa.dev/provenance/v1")
17
- const b=JSON.parse(Buffer.from(a.bundle.dsseEnvelope.payload,"base64")).predicate.buildDefinition
18
- console.log(b.externalParameters.workflow.ref, b.resolvedDependencies[0].digest.gitCommit)
19
- })'
20
- ```
21
-
22
- Then browse `https://github.com/safeinsights/canopycms/tree/<commit>/docs`.
23
-
24
- Check this whenever a documented behaviour does not match what you observe. It matters most on
25
- the `int` channel: a version like `0.0.67-int.90` is published from an integration branch that
26
- has **not** merged to `main`, so `main`'s guides describe the last stable release and simply do
27
- not contain the sections covering your build. A missing section reads exactly like a behaviour
28
- you misunderstood, which is why it is worth resolving the ref rather than guessing. Stable
29
- `X.Y.Z` builds are on `main`, at tag `vX.Y.Z`.
7
+ Read `CHANGELOG.md`, next to this README, first. It is assembled for this exact build: its **This
8
+ build** section names the commit the build came from and lists what is new since the previous int
9
+ on the same branch (a stable build links its release's entries instead), and every link out of it points at that commit. It is the one guide this package
10
+ ships.
11
+
12
+ The other guides, `docs/deploying-to-aws.md` and the project README, live in the repository and
13
+ change alongside the code. Read them at that commit, not at `main`: browse
14
+ `https://github.com/safeinsights/canopycms/tree/v<your version>`, the tag every published version
15
+ carries. This matters most on the `int` channel: a version like `0.0.68-int.112` comes from an
16
+ integration branch that has **not** merged to `main`, so `main`'s guides describe the last
17
+ stable release and lack the sections covering your build.
30
18
 
31
19
  ## What it does for you
32
20
 
@@ -45,9 +33,9 @@ you misunderstood, which is why it is worth resolving the ref rather than guessi
45
33
 
46
34
  ## Branch roots
47
35
 
48
- - Workspaces resolve per mode: `prod` uses `$CANOPYCMS_WORKSPACE_ROOT/content-branches` (default: `/mnt/efs/workspace/content-branches`), `dev` uses `.canopy-dev/content-branches/<branch>`.
36
+ - Workspaces resolve per mode: `prod` uses `$CANOPYCMS_WORKSPACE_ROOT/content-branches` (default: `/mnt/efs/content-branches`), `dev` uses `.canopy-dev/content-branches/<branch>`.
49
37
  - For `prod` mode, you must set `defaultRemoteUrl`. For `dev`, `defaultRemoteUrl` is **optional** - if omitted, a local remote is auto-created at `.canopy-dev/remote.git`.
50
- - Optionally configure `defaultRemoteName` (default: `origin`) and `defaultBaseBranch` (default: `main`).
38
+ - Optionally configure `defaultRemoteName` (default: `origin`) and `defaultBaseBranch` (unset: the checked-out git branch in dev, the repository's default branch in prod).
51
39
  - Git author identity is required for `prod` mode: set `gitBotAuthorName` and `gitBotAuthorEmail` so bot commits can be created reliably.
52
40
  - Branch names are sanitized and traversal is blocked before creating directories.
53
41
  - Metadata lives at `<workspace>/.canopy-meta/branch.json`; the registry lives at `<branchesRoot>/branches.json` and records the workspaceRoot for each branch.
@@ -388,7 +376,7 @@ import config from '../canopycms.config'
388
376
  export default CanopyEditorPage(config)
389
377
  ```
390
378
 
391
- The editor loads entries on the client from `/api/canopycms/[branch]/entries`, so server prefetch is optional. Use `previewBaseByCollection` to control preview URLs per collection.
379
+ The editor loads entries on the client from `/api/canopycms/[branch]/entries`, so server prefetch is optional. Use `editor.previewBase` to override preview URLs.
392
380
 
393
381
  6. **Theme it**
394
382
  Wrap editor surfaces with `CanopyCMSProvider` to load Mantine styles and customize `brand`/`primary`/`neutral`/`accent` colors and color scheme. Pass `themeOptions` into `Editor` if desired.
@@ -396,13 +384,13 @@ The editor loads entries on the client from `/api/canopycms/[branch]/entries`, s
396
384
  _TODO_ show an example
397
385
 
398
386
  7. **Split builds**
399
- Keep your public build free of editor bundles by importing only from `canopycms` (server helpers + data loaders). Host the editor in a separate app or build target that imports from `canopycms/client` and mounts the API routes above.
387
+ Keep your public build free of editor bundles by importing only from `canopycms` (server helpers + data loaders) and `canopycms/preview` (the live-preview hook). Host the editor in a separate app or build target that imports from `canopycms/client` and mounts the API routes above.
400
388
 
401
389
  _TODO_ show real examples of what to do
402
390
 
403
391
  ### Preview branch awareness
404
392
 
405
- - When building preview URLs, include the current branch as a query param (e.g., `/?branch=feature-foo` or `/posts/hello?branch=feature-foo`) so SSR preview pages read from the same branch workspace the editor is editing. The `Editor` component appends the branch param automatically to `previewBaseByCollection`; your page loaders should read `searchParams.branch` and pass it as the `branch` option to `getCanopy()`'s `read`/`readByUrlPath`.
393
+ - When building preview URLs, include the current branch as a query param (e.g., `/?branch=feature-foo` or `/posts/hello?branch=feature-foo`) so SSR preview pages read from the same branch workspace the editor is editing. The `Editor` component appends the branch param to the preview URLs it builds; your page loaders should read `searchParams.branch` and pass it as the `branch` option to `getCanopy()`'s `read`/`readByUrlPath`.
406
394
  - For public static builds, omit/ignore the branch param; this pattern is only for the editor/preview environment.
407
395
  - Likewise, include `branch` in your editor route (e.g., `/edit?branch=feature-foo`) and have your editor page pass it to `<Editor>` so reloads/links preserve the selected branch. The `Editor` will also reflect branch switches back into the query string.
408
396
 
@@ -415,7 +403,7 @@ The `useCanopyPreview` hook provides live updates to your preview components as
415
403
  ```tsx
416
404
  'use client'
417
405
 
418
- import { useCanopyPreview } from 'canopycms/client'
406
+ import { useCanopyPreview } from 'canopycms/preview'
419
407
  import type { PostContent } from './schemas'
420
408
 
421
409
  export function PostView({ data }: { data: PostContent }) {
@@ -442,16 +430,17 @@ export function PostView({ data }: { data: PostContent }) {
442
430
  - `data`: The current content data (initial data on first render, then live updates from editor)
443
431
  - `isLoading`: Object mirroring your data structure with boolean loading states for reference fields
444
432
  - `highlightEnabled`: Boolean indicating if field highlighting is active in the editor
445
- - `fieldProps`: Helper function to add `data-canopy-path` attributes for editor integration
433
+ - `fieldProps`: marks the element rendering a field (`data-canopy-path`), with the path typed against your content; `fieldAttrs` and `scopeFieldProps` from `canopycms` thread it through section components (see the root README's Live Preview)
446
434
 
447
435
  **Reference fields and loading states:**
448
436
 
449
- When using reference fields (foreign key relationships to other content), the editor resolves these references asynchronously. Use the `isLoading` object to show loading states for reference fields:
437
+ In the preview, a reference field holds what `read()` would give it: the referenced entry's data, or a reference marked `unavailable`: title and URL when this editor may not read it, the id alone when the entry no longer exists. The editor resolves each reference an edit adds, at every position `read()` resolves them: top-level fields, inline groups, objects, lists of objects and block templates, nested to any depth. A reference the editor has not resolved yet is `null`, never its id, with `isLoading` `true` at the same path. So a view can receive three things where a reference sits: the resolved entry, `null`, or an `unavailable` reference. Narrow with `isResolvedReference` from `canopycms`:
450
438
 
451
439
  ```tsx
452
440
  'use client'
453
441
 
454
- import { useCanopyPreview } from 'canopycms/client'
442
+ import { isResolvedReference } from 'canopycms'
443
+ import { useCanopyPreview } from 'canopycms/preview'
455
444
 
456
445
  export function PostView({ data }: { data: PostContent }) {
457
446
  const { data: liveData, isLoading } = useCanopyPreview<PostContent>({
@@ -461,42 +450,31 @@ export function PostView({ data }: { data: PostContent }) {
461
450
  return (
462
451
  <article>
463
452
  <h1>{liveData.title}</h1>
464
- <AuthorCard author={liveData.author} isLoading={isLoading.author} />
453
+ <AuthorCard author={liveData.byline?.author} isLoading={isLoading.byline?.author} />
465
454
  </article>
466
455
  )
467
456
  }
468
457
 
469
- // Component receives clean types - no framework coupling
470
458
  interface AuthorCardProps {
471
- author: AuthorContent | null
472
- isLoading?: boolean // Optional - only needed if you want loading UI
459
+ author: NonNullable<PostContent['byline']>['author'] // typed by its `resolvedSchema`
460
+ isLoading?: boolean
473
461
  }
474
462
 
475
463
  function AuthorCard({ author, isLoading }: AuthorCardProps) {
476
- if (isLoading) {
477
- return <p>Loading author...</p>
478
- }
479
- if (!author) {
480
- return null // Render nothing when no author
481
- }
464
+ if (isLoading) return <p>Loading author...</p>
465
+ if (!isResolvedReference(author)) return null // empty, or an unavailable reference
482
466
  return <p>By {author.name}</p>
483
467
  }
484
468
  ```
485
469
 
486
470
  **Loading state structure:**
487
471
 
488
- The `isLoading` object mirrors your data structure:
472
+ `isLoading` (typed `PreviewLoadingState<T>`) holds a boolean only at reference positions, at the same path as the reference:
489
473
 
490
474
  - Single reference field: `isLoading.author` is a `boolean`
491
- - Array of references: `isLoading.relatedPosts` is an array of `boolean[]` values
492
- - Non-reference fields: Always `false` (no loading state needed)
493
-
494
- **Benefits:**
495
-
496
- - ✅ Zero framework types in your components - just your content types + optional `isLoading: boolean`
497
- - ✅ Works for nested reference fields at any depth
498
- - ✅ Optional - only check loading state if you want to show loading UI
499
- - ✅ Familiar pattern - mirrors React Query's `{ data, isLoading }` API
475
+ - Array of references: `isLoading.relatedPosts` is a `boolean[]`
476
+ - Inside an object, an object list or a block: `isLoading.byline.author`, `isLoading.credits[0].people`, `isLoading.blocks[2].value.speaker`
477
+ - Anything that is not a reference: absent
500
478
 
501
479
  ## Modes (pick per environment)
502
480
 
@@ -504,7 +482,7 @@ The `isLoading` object mirrors your data structure:
504
482
  - **Auto-initialization**: If no `defaultRemoteUrl` is configured, CanopyCMS automatically creates a local remote at `.canopy-dev/remote.git` and seeds it with your current `baseBranch` (e.g., `main`). This allows fully local testing of branching and submission workflows without requiring an external GitHub remote.
505
483
  - **Manual remote**: You can still provide an explicit `defaultRemoteUrl` to use a real remote or custom local path.
506
484
  - Use `npx canopycms sync push` / `npx canopycms sync pull` to sync content between your working tree and the CMS.
507
- - **`prod`**: EFS-backed roots under `$CANOPYCMS_WORKSPACE_ROOT` (default: `/mnt/efs/workspace`). Requires `defaultRemoteUrl`.
485
+ - **`prod`**: EFS-backed roots under `$CANOPYCMS_WORKSPACE_ROOT` (default: `/mnt/efs`). Requires `defaultRemoteUrl`.
508
486
 
509
487
  Branch metadata lives in `.canopy-meta/branch.json`; registry in `branches.json` at the branches root. Content APIs resolve the workspace root from branch state + mode instead of relying on `process.cwd()`.
510
488
 
@@ -525,7 +503,7 @@ export default defineCanopyConfig({
525
503
  **How it works:**
526
504
 
527
505
  1. When you create your first branch, CanopyCMS automatically creates a bare git repository at `.canopy-dev/remote.git`
528
- 2. Your current `baseBranch` (default: `main`) is pushed to this local remote
506
+ 2. Your current `baseBranch` (unset: the checked-out branch) is pushed to this local remote
529
507
  3. Branch workspaces are cloned from this local remote into `.canopy-dev/content-branches/<branch-name>/`
530
508
  4. All git operations (push, fetch, etc.) work against the local remote
531
509
 
@@ -597,9 +575,9 @@ export default defineCanopyConfig({
597
575
 
598
576
  ## Assets and media
599
577
 
600
- Uploaded images and PDFs go into a content-addressed asset store, and images are served
601
- through an on-demand transform layer. Both the **local** adapter (for development) and the
602
- **S3** adapter ship today.
578
+ Uploaded images and PDFs go into a content-addressed asset store, and images are served as
579
+ resized derivatives stored before each release. Both the **local** adapter (for development)
580
+ and the **S3** adapter ship today.
603
581
 
604
582
  ```typescript
605
583
  // canopycms.config.ts — production
@@ -617,8 +595,10 @@ media: { adapter: 's3', bucket: 'my-site-assets', region: 'us-east-1' }
617
595
  immutable and deduplicated. A draft branch references its images immediately; publishing
618
596
  needs no separate asset step.
619
597
  - **Delivery** — images are served from `/assets/t/{directives}/…` URLs that resize, crop and
620
- convert to WebP on first request, then cache immutably. Build responsive markup with the
621
- exported helpers, which are client-safe:
598
+ convert, written before release by `canopycms collect-asset-refs <outDir>` then
599
+ `canopycms materialize-assets --refs <file>`, and cached immutably. Every `/assets/t/` URL a
600
+ page can request must appear as text in the build output. Build responsive markup with the
601
+ exported helpers, which are client-safe and take any width from 1 to 8192:
622
602
 
623
603
  ```typescript
624
604
  import { assetUrl, assetSrcSet } from 'canopycms'
@@ -633,7 +613,11 @@ media: { adapter: 's3', bucket: 'my-site-assets', region: 'us-east-1' }
633
613
  />
634
614
  ```
635
615
 
636
- SVGs and PDFs are served statically, with no transform.
616
+ Passing an `image` field value applies its stored crop (`opts.crop` overrides it). Its `width`
617
+ and `height` are the uncropped original's, so scale them by `crop.w` and `crop.h` for a cropped
618
+ value. SVGs and PDFs are served statically, with no transform. The package declares
619
+ `sideEffects`, so this import adds under 7 KB minified to a client bundle and none of the
620
+ config schemas.
637
621
 
638
622
  - **Where `/assets` is mounted** — the URLs above are root-relative, because that is what gets
639
623
  stored in content and content moves between branches and environments. If your renderer sees
@@ -670,8 +654,9 @@ to enable the interactive crop step, or `altOptional: true` for decorative image
670
654
  > CanopyCMS" as visible to your whole editorial team.
671
655
 
672
656
  For deployment, the `canopycms-cdk` package ships an `AssetSupport` construct that provisions
673
- the bucket, the transform Lambda and the CloudFront behaviors. Fuller documentation — every
674
- config option, the transform directive syntax, and the AWS wiring — is in the project README's
675
- `#media-configuration` section and in `docs/deploying-to-aws.md`. Read both at the ref this
676
- build came from, not at `main` — see
657
+ the bucket and serves `/assets/*` from S3 only: an unmaterialized URL is a 403, and
658
+ `lazyPublicTransforms: true` transforms misses in a Lambda instead. Fuller documentation — every
659
+ config option, the release steps and their IAM grants, and the AWS wiring — is in the project
660
+ README's `#media-configuration` section, `docs/deploying-to-aws.md` and `CHANGELOG.md`. Read
661
+ them at the ref this build came from, not at `main` — see
677
662
  [Which documentation matches this build](#which-documentation-matches-this-build).
@@ -42,5 +42,10 @@ export interface GenerateResult {
42
42
  * Walks the schema tree, reads entries, converts to markdown,
43
43
  * and produces per-entry files, per-collection all.md files,
44
44
  * bundle files, and a manifest.
45
+ *
46
+ * A reference or body `entry:` link may only show a target that is itself exported, so every
47
+ * entry is read and filtered first, which settles the exported set. Only then are body links
48
+ * resolved for output, references to anything outside the set masked, entry transforms run, and markdown
49
+ * rendered, in rounds that repeat while a render fails (see the loop below).
45
50
  */
46
51
  export declare function generateAIContent(options: GenerateOptions): Promise<GenerateResult>;