canopycms 0.0.68-int.98 → 0.1.0

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 (688) hide show
  1. package/CHANGELOG.md +2131 -0
  2. package/README.md +47 -63
  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 +223 -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 +88 -78
  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.d.ts +1 -1
  22. package/dist/api/branch-merge.js +1 -1
  23. package/dist/api/branch-review.d.ts +3 -3
  24. package/dist/api/branch-review.js +16 -7
  25. package/dist/api/branch-status.d.ts +16 -6
  26. package/dist/api/branch-status.js +57 -12
  27. package/dist/api/branch-withdraw.d.ts +2 -2
  28. package/dist/api/branch-withdraw.js +8 -3
  29. package/dist/api/branch.d.ts +25 -12
  30. package/dist/api/branch.js +164 -103
  31. package/dist/api/client.d.ts +78 -58
  32. package/dist/api/client.js +150 -117
  33. package/dist/api/comments.d.ts +12 -3
  34. package/dist/api/comments.js +118 -9
  35. package/dist/api/content.d.ts +9 -9
  36. package/dist/api/content.js +131 -22
  37. package/dist/api/entries-constants.d.ts +14 -3
  38. package/dist/api/entries-constants.js +14 -3
  39. package/dist/api/entries.d.ts +40 -2
  40. package/dist/api/entries.js +102 -6
  41. package/dist/api/github-sync.d.ts +19 -0
  42. package/dist/api/github-sync.js +50 -3
  43. package/dist/api/groups.d.ts +4 -4
  44. package/dist/api/groups.js +2 -1
  45. package/dist/api/guards.js +23 -3
  46. package/dist/api/index.d.ts +3 -1
  47. package/dist/api/index.js +1 -0
  48. package/dist/api/permissions.d.ts +21 -2
  49. package/dist/api/permissions.js +50 -3
  50. package/dist/api/request-deadline.d.ts +59 -0
  51. package/dist/api/request-deadline.js +73 -0
  52. package/dist/api/resolve-references.js +8 -7
  53. package/dist/api/route-builder.d.ts +14 -0
  54. package/dist/api/route-builder.js +14 -1
  55. package/dist/api/schema.d.ts +11 -9
  56. package/dist/api/schema.js +2 -0
  57. package/dist/api/settings-helpers.d.ts +5 -1
  58. package/dist/api/settings-helpers.js +10 -2
  59. package/dist/api/types.d.ts +18 -0
  60. package/dist/api/users-constants.d.ts +6 -0
  61. package/dist/api/users-constants.js +6 -0
  62. package/dist/assets/asset-url.d.ts +28 -16
  63. package/dist/assets/asset-url.js +51 -25
  64. package/dist/assets/finalize.js +3 -0
  65. package/dist/assets/index.d.ts +1 -1
  66. package/dist/assets/materialize.d.ts +153 -0
  67. package/dist/assets/materialize.js +402 -0
  68. package/dist/assets/store-local.d.ts +19 -5
  69. package/dist/assets/store-local.js +69 -10
  70. package/dist/assets/store-s3.d.ts +38 -7
  71. package/dist/assets/store-s3.js +128 -22
  72. package/dist/assets/transform-directives.d.ts +52 -13
  73. package/dist/assets/transform-directives.js +87 -27
  74. package/dist/assets/transform.d.ts +3 -3
  75. package/dist/assets/transform.js +13 -8
  76. package/dist/assets/types.d.ts +31 -4
  77. package/dist/auth/cache.d.ts +1 -1
  78. package/dist/auth/cache.js +1 -1
  79. package/dist/auth/caching-auth-plugin.d.ts +2 -0
  80. package/dist/auth/caching-auth-plugin.js +12 -2
  81. package/dist/auth/file-based-auth-cache.d.ts +8 -0
  82. package/dist/auth/file-based-auth-cache.js +18 -8
  83. package/dist/auth/person-name.d.ts +5 -0
  84. package/dist/auth/person-name.js +8 -0
  85. package/dist/auth/plugin.d.ts +10 -1
  86. package/dist/auth/types.d.ts +2 -0
  87. package/dist/auth/user-metadata-lookup.d.ts +21 -0
  88. package/dist/auth/user-metadata-lookup.js +116 -0
  89. package/dist/authorization/branch.d.ts +1 -1
  90. package/dist/authorization/branch.js +12 -13
  91. package/dist/authorization/groups/schema.d.ts +4 -4
  92. package/dist/authorization/helpers.d.ts +8 -0
  93. package/dist/authorization/helpers.js +8 -0
  94. package/dist/authorization/index.d.ts +1 -1
  95. package/dist/authorization/index.js +1 -1
  96. package/dist/authorization/protected-branch.d.ts +5 -4
  97. package/dist/authorization/protected-branch.js +7 -5
  98. package/dist/branch-health.d.ts +35 -8
  99. package/dist/branch-health.js +54 -18
  100. package/dist/branch-metadata-error.d.ts +27 -0
  101. package/dist/branch-metadata-error.js +23 -0
  102. package/dist/branch-metadata-file.d.ts +205 -24
  103. package/dist/branch-metadata-file.js +126 -25
  104. package/dist/branch-metadata.d.ts +45 -6
  105. package/dist/branch-metadata.js +142 -50
  106. package/dist/branch-provisioning.d.ts +167 -0
  107. package/dist/branch-provisioning.js +501 -0
  108. package/dist/branch-registry.d.ts +8 -0
  109. package/dist/branch-registry.js +61 -9
  110. package/dist/branch-schema-cache.d.ts +29 -12
  111. package/dist/branch-schema-cache.js +64 -21
  112. package/dist/branch-sparse.d.ts +23 -0
  113. package/dist/branch-sparse.js +118 -0
  114. package/dist/branch-workspace.d.ts +42 -3
  115. package/dist/branch-workspace.js +239 -100
  116. package/dist/build/asset-refs.d.ts +94 -0
  117. package/dist/build/asset-refs.js +267 -0
  118. package/dist/build/generate-ai-content.js +5 -0
  119. package/dist/build/inline-flight.d.ts +37 -0
  120. package/dist/build/inline-flight.js +142 -0
  121. package/dist/cli/asset-refs.d.ts +52 -0
  122. package/dist/cli/asset-refs.js +194 -0
  123. package/dist/cli/cli.d.ts +15 -1
  124. package/dist/cli/cli.js +8543 -3193
  125. package/dist/cli/configured-asset-store.d.ts +12 -0
  126. package/dist/cli/configured-asset-store.js +46 -0
  127. package/dist/cli/generate-ai-content.js +4244 -1072
  128. package/dist/cli/init.js +217 -126
  129. package/dist/cli/project-detect.d.ts +2 -0
  130. package/dist/cli/project-detect.js +2 -0
  131. package/dist/cli/template-files/Dockerfile.cms.template +13 -5
  132. package/dist/cli/template-files/cms-stack.ts.template +16 -13
  133. package/dist/client.d.ts +1 -2
  134. package/dist/client.js +1 -2
  135. package/dist/comment-store.d.ts +25 -0
  136. package/dist/comment-store.js +43 -8
  137. package/dist/config/flatten.js +2 -0
  138. package/dist/config/helpers.js +2 -2
  139. package/dist/config/index.d.ts +1 -1
  140. package/dist/config/schemas/config.d.ts +12 -29
  141. package/dist/config/schemas/config.js +9 -12
  142. package/dist/config/schemas/field.d.ts +3 -0
  143. package/dist/config/schemas/field.js +58 -4
  144. package/dist/config/schemas/media.d.ts +4 -13
  145. package/dist/config/schemas/media.js +5 -8
  146. package/dist/config/schemas/url.d.ts +2 -20
  147. package/dist/config/schemas/url.js +2 -25
  148. package/dist/config/types.d.ts +116 -22
  149. package/dist/config/types.js +3 -9
  150. package/dist/config/validation.d.ts +25 -4
  151. package/dist/config/validation.js +116 -3
  152. package/dist/content-id-index.js +2 -2
  153. package/dist/content-index-generation.d.ts +1 -1
  154. package/dist/content-index-generation.js +1 -1
  155. package/dist/content-listing.d.ts +10 -1
  156. package/dist/content-listing.js +22 -5
  157. package/dist/content-reader.d.ts +9 -0
  158. package/dist/content-reader.js +16 -11
  159. package/dist/content-store.d.ts +75 -12
  160. package/dist/content-store.js +249 -86
  161. package/dist/content-tree.js +2 -2
  162. package/dist/context.js +5 -2
  163. package/dist/dangling-reference-log.d.ts +17 -0
  164. package/dist/dangling-reference-log.js +29 -0
  165. package/dist/dev-content-watcher.d.ts +1 -1
  166. package/dist/dev-content-watcher.js +1 -1
  167. package/dist/editor/BranchManager.d.ts +23 -7
  168. package/dist/editor/BranchManager.js +119 -54
  169. package/dist/editor/CanopyEditor.d.ts +1 -1
  170. package/dist/editor/CanopyEditor.js +1 -2
  171. package/dist/editor/CommentsPanel.d.ts +14 -0
  172. package/dist/editor/CommentsPanel.js +68 -43
  173. package/dist/editor/Editor.d.ts +11 -5
  174. package/dist/editor/Editor.js +891 -218
  175. package/dist/editor/EditorAuthGate.d.ts +7 -1
  176. package/dist/editor/EditorAuthGate.js +41 -9
  177. package/dist/editor/EntryNavigator.d.ts +22 -0
  178. package/dist/editor/EntryNavigator.js +353 -105
  179. package/dist/editor/FormHeader.d.ts +25 -0
  180. package/dist/editor/FormHeader.js +82 -0
  181. package/dist/editor/FormRenderer.d.ts +27 -3
  182. package/dist/editor/FormRenderer.js +171 -76
  183. package/dist/editor/PreviewFrame.d.ts +40 -0
  184. package/dist/editor/PreviewFrame.js +215 -0
  185. package/dist/editor/PreviewPane.d.ts +47 -0
  186. package/dist/editor/PreviewPane.js +147 -0
  187. package/dist/editor/PreviewToolbarTools.d.ts +22 -0
  188. package/dist/editor/PreviewToolbarTools.js +73 -0
  189. package/dist/editor/admin/SystemHealthPanel.d.ts +2 -1
  190. package/dist/editor/admin/SystemHealthPanel.js +163 -33
  191. package/dist/editor/admin/useSystemHealth.d.ts +18 -0
  192. package/dist/editor/admin/useSystemHealth.js +70 -1
  193. package/dist/editor/branch-status.d.ts +17 -0
  194. package/dist/editor/branch-status.js +29 -0
  195. package/dist/editor/canopy-path.d.ts +9 -6
  196. package/dist/editor/canopy-path.js +8 -11
  197. package/dist/editor/client-reference-resolver.d.ts +43 -16
  198. package/dist/editor/client-reference-resolver.js +155 -64
  199. package/dist/editor/comments/BranchComments.d.ts +1 -1
  200. package/dist/editor/comments/BranchComments.js +2 -2
  201. package/dist/editor/comments/CloseRefusedNotice.d.ts +4 -0
  202. package/dist/editor/comments/CloseRefusedNotice.js +7 -0
  203. package/dist/editor/comments/CommentThreadsPopover.d.ts +47 -0
  204. package/dist/editor/comments/CommentThreadsPopover.js +274 -0
  205. package/dist/editor/comments/CommentWriteAlert.d.ts +11 -0
  206. package/dist/editor/comments/CommentWriteAlert.js +13 -0
  207. package/dist/editor/comments/EntryComments.d.ts +10 -4
  208. package/dist/editor/comments/EntryComments.js +14 -17
  209. package/dist/editor/comments/FieldWrapper.d.ts +18 -4
  210. package/dist/editor/comments/FieldWrapper.js +62 -28
  211. package/dist/editor/comments/InlineCommentThread.d.ts +9 -2
  212. package/dist/editor/comments/InlineCommentThread.js +11 -47
  213. package/dist/editor/comments/ThreadCarousel.d.ts +1 -1
  214. package/dist/editor/comments/ThreadCarousel.js +18 -21
  215. package/dist/editor/comments/ThreadReplyControls.d.ts +28 -0
  216. package/dist/editor/comments/ThreadReplyControls.js +92 -0
  217. package/dist/editor/comments/field-comment-context.d.ts +14 -0
  218. package/dist/editor/comments/field-comment-context.js +14 -0
  219. package/dist/editor/comments/form-comments.d.ts +48 -0
  220. package/dist/editor/comments/form-comments.js +178 -0
  221. package/dist/editor/comments/item-anchor-copy.d.ts +6 -0
  222. package/dist/editor/comments/item-anchor-copy.js +6 -0
  223. package/dist/editor/comments/move-focus-if-unmoved.d.ts +6 -0
  224. package/dist/editor/comments/move-focus-if-unmoved.js +11 -0
  225. package/dist/editor/comments/popover-placement.d.ts +18 -0
  226. package/dist/editor/comments/popover-placement.js +58 -0
  227. package/dist/editor/comments/use-tracked-writes.d.ts +16 -0
  228. package/dist/editor/comments/use-tracked-writes.js +53 -0
  229. package/dist/editor/components/BranchAccessList.d.ts +15 -0
  230. package/dist/editor/components/BranchAccessList.js +52 -0
  231. package/dist/editor/components/BranchLockBanner.d.ts +22 -0
  232. package/dist/editor/components/BranchLockBanner.js +39 -0
  233. package/dist/editor/components/BranchPill.d.ts +32 -0
  234. package/dist/editor/components/BranchPill.js +33 -0
  235. package/dist/editor/components/BranchesDrawer.d.ts +11 -0
  236. package/dist/editor/components/BranchesDrawer.js +5 -0
  237. package/dist/editor/components/ConfirmDeleteModal.d.ts +6 -1
  238. package/dist/editor/components/ConfirmDeleteModal.js +3 -2
  239. package/dist/editor/components/DestructiveMenuItem.d.ts +7 -0
  240. package/dist/editor/components/DestructiveMenuItem.js +8 -0
  241. package/dist/editor/components/EditorCrashScreen.d.ts +17 -0
  242. package/dist/editor/components/EditorCrashScreen.js +22 -0
  243. package/dist/editor/components/EditorErrorBoundary.d.ts +38 -0
  244. package/dist/editor/components/EditorErrorBoundary.js +40 -0
  245. package/dist/editor/components/EditorHeader.d.ts +56 -106
  246. package/dist/editor/components/EditorHeader.js +130 -131
  247. package/dist/editor/components/EditorRail.d.ts +49 -0
  248. package/dist/editor/components/EditorRail.js +65 -0
  249. package/dist/editor/components/EntryBreadcrumb.d.ts +33 -0
  250. package/dist/editor/components/EntryBreadcrumb.js +56 -0
  251. package/dist/editor/components/EntryCreateModal.d.ts +12 -7
  252. package/dist/editor/components/EntryCreateModal.js +51 -57
  253. package/dist/editor/components/NoEditPermissionNotice.d.ts +6 -5
  254. package/dist/editor/components/NoEditPermissionNotice.js +5 -4
  255. package/dist/editor/components/QuickOpenPalette.d.ts +22 -0
  256. package/dist/editor/components/QuickOpenPalette.js +66 -0
  257. package/dist/editor/components/ReadOnlyDraftNotice.d.ts +11 -0
  258. package/dist/editor/components/ReadOnlyDraftNotice.js +12 -0
  259. package/dist/editor/components/ReasonedMenuItem.d.ts +15 -0
  260. package/dist/editor/components/ReasonedMenuItem.js +15 -0
  261. package/dist/editor/components/ReferencedByList.d.ts +11 -0
  262. package/dist/editor/components/ReferencedByList.js +28 -0
  263. package/dist/editor/components/RelativeTime.d.ts +10 -0
  264. package/dist/editor/components/RelativeTime.js +10 -0
  265. package/dist/editor/components/RenameEntryModal.d.ts +9 -1
  266. package/dist/editor/components/RenameEntryModal.js +19 -31
  267. package/dist/editor/components/RetryToastMessage.d.ts +9 -0
  268. package/dist/editor/components/RetryToastMessage.js +6 -0
  269. package/dist/editor/components/SaveAllResult.d.ts +25 -0
  270. package/dist/editor/components/SaveAllResult.js +86 -0
  271. package/dist/editor/components/SaveSplitButton.d.ts +30 -0
  272. package/dist/editor/components/SaveSplitButton.js +108 -0
  273. package/dist/editor/components/StagedChangesDrawer.d.ts +39 -0
  274. package/dist/editor/components/StagedChangesDrawer.js +92 -0
  275. package/dist/editor/components/UnavailableEntryNotice.d.ts +6 -0
  276. package/dist/editor/components/UnavailableEntryNotice.js +9 -0
  277. package/dist/editor/components/UnavailableTypeMessage.d.ts +6 -0
  278. package/dist/editor/components/UnavailableTypeMessage.js +9 -0
  279. package/dist/editor/components/UndoToastMessage.d.ts +18 -0
  280. package/dist/editor/components/UndoToastMessage.js +10 -0
  281. package/dist/editor/components/UserBadge.d.ts +2 -5
  282. package/dist/editor/components/UserBadge.js +62 -33
  283. package/dist/editor/components/ValidationSummary.d.ts +14 -0
  284. package/dist/editor/components/ValidationSummary.js +24 -0
  285. package/dist/editor/components/index.d.ts +2 -2
  286. package/dist/editor/components/index.js +2 -2
  287. package/dist/editor/context/ApiClientContext.d.ts +8 -2
  288. package/dist/editor/context/ApiClientContext.js +19 -8
  289. package/dist/editor/context/AssetContext.d.ts +13 -35
  290. package/dist/editor/context/AssetContext.js +12 -31
  291. package/dist/editor/context/EditorStateContext.d.ts +4 -4
  292. package/dist/editor/context/EditorStateContext.js +4 -4
  293. package/dist/editor/context/SWRProvider.d.ts +3 -3
  294. package/dist/editor/context/SiteMdxAllowContext.d.ts +4 -0
  295. package/dist/editor/context/SiteMdxAllowContext.js +7 -0
  296. package/dist/editor/context/index.d.ts +2 -1
  297. package/dist/editor/context/index.js +2 -1
  298. package/dist/editor/contrast.d.ts +19 -0
  299. package/dist/editor/contrast.js +41 -0
  300. package/dist/editor/copy.d.ts +18 -0
  301. package/dist/editor/copy.js +18 -0
  302. package/dist/editor/editor-config.js +16 -0
  303. package/dist/editor/editor-utils.d.ts +34 -8
  304. package/dist/editor/editor-utils.js +42 -20
  305. package/dist/editor/entry-search.d.ts +20 -0
  306. package/dist/editor/entry-search.js +34 -0
  307. package/dist/editor/field-breadcrumb.d.ts +12 -0
  308. package/dist/editor/field-breadcrumb.js +85 -0
  309. package/dist/editor/field-props.d.ts +86 -0
  310. package/dist/editor/field-props.js +27 -0
  311. package/dist/editor/field-target.d.ts +30 -0
  312. package/dist/editor/field-target.js +77 -0
  313. package/dist/editor/fields/BlockField.d.ts +12 -0
  314. package/dist/editor/fields/BlockField.js +89 -73
  315. package/dist/editor/fields/CodeField.d.ts +2 -0
  316. package/dist/editor/fields/CodeField.js +6 -2
  317. package/dist/editor/fields/DateTimeField.d.ts +4 -29
  318. package/dist/editor/fields/DateTimeField.js +79 -41
  319. package/dist/editor/fields/ExpandAllButton.d.ts +6 -0
  320. package/dist/editor/fields/ExpandAllButton.js +4 -0
  321. package/dist/editor/fields/FieldCrashFallback.d.ts +17 -0
  322. package/dist/editor/fields/FieldCrashFallback.js +30 -0
  323. package/dist/editor/fields/FieldLabel.d.ts +37 -0
  324. package/dist/editor/fields/FieldLabel.js +19 -0
  325. package/dist/editor/fields/ImageField.d.ts +4 -0
  326. package/dist/editor/fields/ImageField.js +29 -14
  327. package/dist/editor/fields/InlineGroupField.js +4 -3
  328. package/dist/editor/fields/ItemList.d.ts +42 -0
  329. package/dist/editor/fields/ItemList.js +130 -0
  330. package/dist/editor/fields/MarkdownField.d.ts +32 -0
  331. package/dist/editor/fields/MarkdownField.js +223 -46
  332. package/dist/editor/fields/MdxImageDialog.js +1 -1
  333. package/dist/editor/fields/NumberField.d.ts +2 -0
  334. package/dist/editor/fields/NumberField.js +8 -5
  335. package/dist/editor/fields/NumberListField.d.ts +2 -0
  336. package/dist/editor/fields/NumberListField.js +19 -16
  337. package/dist/editor/fields/ObjectField.d.ts +2 -7
  338. package/dist/editor/fields/ObjectField.js +15 -5
  339. package/dist/editor/fields/ObjectListField.d.ts +29 -0
  340. package/dist/editor/fields/ObjectListField.js +57 -0
  341. package/dist/editor/fields/ReferenceField.d.ts +2 -0
  342. package/dist/editor/fields/ReferenceField.js +34 -9
  343. package/dist/editor/fields/SelectField.d.ts +2 -0
  344. package/dist/editor/fields/SelectField.js +11 -2
  345. package/dist/editor/fields/StringListField.d.ts +4 -1
  346. package/dist/editor/fields/StringListField.js +22 -8
  347. package/dist/editor/fields/TextField.d.ts +2 -0
  348. package/dist/editor/fields/TextField.js +6 -2
  349. package/dist/editor/fields/ToggleField.d.ts +2 -0
  350. package/dist/editor/fields/ToggleField.js +8 -3
  351. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +1 -1
  352. package/dist/editor/fields/entry-link/InsertEntryLink.js +1 -1
  353. package/dist/editor/fields/form-expansion.d.ts +9 -0
  354. package/dist/editor/fields/form-expansion.js +2 -0
  355. package/dist/editor/fields/item-expansion.d.ts +15 -0
  356. package/dist/editor/fields/item-expansion.js +60 -0
  357. package/dist/editor/fields/list-item-keys.d.ts +8 -0
  358. package/dist/editor/fields/list-item-keys.js +50 -0
  359. package/dist/editor/fields/list-item-title.d.ts +20 -0
  360. package/dist/editor/fields/list-item-title.js +85 -0
  361. package/dist/editor/fields/markdown-export-options.d.ts +2 -0
  362. package/dist/editor/fields/markdown-export-options.js +8 -0
  363. package/dist/editor/fields/markdown-fidelity-visitors.d.ts +11 -0
  364. package/dist/editor/fields/markdown-fidelity-visitors.js +160 -0
  365. package/dist/editor/fields/mdx-jsx-support.d.ts +5 -1
  366. package/dist/editor/fields/mdx-jsx-support.js +157 -69
  367. package/dist/editor/fields/rich-text-failures.d.ts +5 -0
  368. package/dist/editor/fields/rich-text-failures.js +26 -0
  369. package/dist/editor/fields/toolbar-wrap.d.ts +7 -0
  370. package/dist/editor/fields/toolbar-wrap.js +35 -0
  371. package/dist/editor/form-outline.d.ts +13 -0
  372. package/dist/editor/form-outline.js +70 -0
  373. package/dist/editor/group-manager/GroupCard.d.ts +4 -1
  374. package/dist/editor/group-manager/GroupCard.js +12 -3
  375. package/dist/editor/group-manager/GroupForm.js +1 -1
  376. package/dist/editor/group-manager/InternalGroupsTab.d.ts +2 -1
  377. package/dist/editor/group-manager/InternalGroupsTab.js +4 -4
  378. package/dist/editor/group-manager/MemberList.d.ts +2 -1
  379. package/dist/editor/group-manager/MemberList.js +15 -4
  380. package/dist/editor/group-manager/hooks/useGroupState.d.ts +5 -0
  381. package/dist/editor/group-manager/hooks/useGroupState.js +30 -7
  382. package/dist/editor/group-manager/index.js +34 -5
  383. package/dist/editor/group-manager/types.d.ts +5 -2
  384. package/dist/editor/hooks/create-branch-request.d.ts +20 -0
  385. package/dist/editor/hooks/create-branch-request.js +54 -0
  386. package/dist/editor/hooks/save-all.d.ts +68 -0
  387. package/dist/editor/hooks/save-all.js +61 -0
  388. package/dist/editor/hooks/useBranchActions.d.ts +11 -1
  389. package/dist/editor/hooks/useBranchActions.js +42 -19
  390. package/dist/editor/hooks/useBranchManager.d.ts +21 -0
  391. package/dist/editor/hooks/useBranchManager.js +321 -125
  392. package/dist/editor/hooks/useBranchesData.d.ts +8 -4
  393. package/dist/editor/hooks/useBranchesData.js +9 -5
  394. package/dist/editor/hooks/useCommentSystem.d.ts +14 -2
  395. package/dist/editor/hooks/useCommentSystem.js +79 -55
  396. package/dist/editor/hooks/useCommentsData.d.ts +11 -7
  397. package/dist/editor/hooks/useCommentsData.js +20 -19
  398. package/dist/editor/hooks/useDraftManager.d.ts +77 -3
  399. package/dist/editor/hooks/useDraftManager.js +887 -94
  400. package/dist/editor/hooks/useEditorLayout.d.ts +53 -7
  401. package/dist/editor/hooks/useEditorLayout.js +98 -20
  402. package/dist/editor/hooks/useEntriesData.d.ts +2 -1
  403. package/dist/editor/hooks/useEntriesData.js +18 -4
  404. package/dist/editor/hooks/useEntryManager.d.ts +41 -2
  405. package/dist/editor/hooks/useEntryManager.js +227 -41
  406. package/dist/editor/hooks/useGroupManager.js +13 -16
  407. package/dist/editor/hooks/usePermissionManager.js +14 -6
  408. package/dist/editor/hooks/usePreviewMarks.d.ts +21 -0
  409. package/dist/editor/hooks/usePreviewMarks.js +33 -0
  410. package/dist/editor/hooks/useReferenceResolution.d.ts +10 -3
  411. package/dist/editor/hooks/useReferenceResolution.js +34 -177
  412. package/dist/editor/hooks/useSchemaManager.d.ts +25 -6
  413. package/dist/editor/hooks/useSchemaManager.js +97 -39
  414. package/dist/editor/hooks/useUserMetadata.d.ts +14 -4
  415. package/dist/editor/hooks/useUserMetadata.js +76 -47
  416. package/dist/editor/hooks/user-metadata-batcher.d.ts +8 -0
  417. package/dist/editor/hooks/user-metadata-batcher.js +33 -0
  418. package/dist/editor/media/AssetCard.d.ts +6 -7
  419. package/dist/editor/media/AssetCard.js +24 -31
  420. package/dist/editor/media/AssetListRow.d.ts +16 -0
  421. package/dist/editor/media/AssetListRow.js +41 -0
  422. package/dist/editor/media/CropStep.js +6 -1
  423. package/dist/editor/media/MediaLibrary.d.ts +4 -3
  424. package/dist/editor/media/MediaLibrary.js +11 -4
  425. package/dist/editor/media/MediaLibraryBody.d.ts +3 -3
  426. package/dist/editor/media/MediaLibraryBody.js +195 -80
  427. package/dist/editor/media/MediaLibrarySkeleton.d.ts +6 -0
  428. package/dist/editor/media/MediaLibrarySkeleton.js +14 -0
  429. package/dist/editor/media/crop-math.d.ts +3 -4
  430. package/dist/editor/media/crop-math.js +11 -22
  431. package/dist/editor/media/editor-image-src.d.ts +8 -0
  432. package/dist/editor/media/editor-image-src.js +10 -0
  433. package/dist/editor/media/format-bytes.d.ts +2 -0
  434. package/dist/editor/media/format-bytes.js +23 -0
  435. package/dist/editor/media/media-library-prefs.d.ts +23 -0
  436. package/dist/editor/media/media-library-prefs.js +49 -0
  437. package/dist/editor/media/media-library-view.d.ts +34 -0
  438. package/dist/editor/media/media-library-view.js +40 -0
  439. package/dist/editor/media/useAssetLibrary.d.ts +30 -0
  440. package/dist/editor/media/useAssetLibrary.js +126 -0
  441. package/dist/editor/media/useStableAssetOrder.d.ts +11 -0
  442. package/dist/editor/media/useStableAssetOrder.js +37 -0
  443. package/dist/editor/media/useThumbnailFailure.d.ts +6 -0
  444. package/dist/editor/media/useThumbnailFailure.js +16 -0
  445. package/dist/editor/permission-manager/GroupSelector.js +2 -2
  446. package/dist/editor/permission-manager/PermissionEditor.d.ts +1 -1
  447. package/dist/editor/permission-manager/PermissionEditor.js +15 -4
  448. package/dist/editor/permission-manager/PermissionLevelBadge.js +1 -1
  449. package/dist/editor/permission-manager/PermissionTree.d.ts +1 -1
  450. package/dist/editor/permission-manager/UserSelector.d.ts +1 -1
  451. package/dist/editor/permission-manager/UserSelector.js +3 -3
  452. package/dist/editor/permission-manager/index.js +12 -3
  453. package/dist/editor/permission-manager/types.d.ts +5 -2
  454. package/dist/editor/platform.d.ts +3 -0
  455. package/dist/editor/platform.js +9 -0
  456. package/dist/editor/preview-asset-base.d.ts +9 -0
  457. package/dist/editor/preview-asset-base.js +17 -0
  458. package/dist/editor/preview-bridge.d.ts +51 -27
  459. package/dist/editor/preview-bridge.js +103 -144
  460. package/dist/editor/preview-marks.d.ts +15 -0
  461. package/dist/editor/preview-marks.js +74 -0
  462. package/dist/editor/preview-path.d.ts +12 -0
  463. package/dist/editor/preview-path.js +45 -1
  464. package/dist/editor/preview-scale.d.ts +27 -0
  465. package/dist/editor/preview-scale.js +34 -0
  466. package/dist/editor/raw-asset-base.d.ts +5 -0
  467. package/dist/editor/raw-asset-base.js +14 -0
  468. package/dist/editor/relative-time.d.ts +4 -4
  469. package/dist/editor/relative-time.js +16 -8
  470. package/dist/editor/schema-editor/CollectionEditor.d.ts +20 -3
  471. package/dist/editor/schema-editor/CollectionEditor.js +361 -62
  472. package/dist/editor/schema-editor/EntryTypeEditor.d.ts +5 -1
  473. package/dist/editor/schema-editor/EntryTypeEditor.js +11 -6
  474. package/dist/editor/schema-editor/collection-draft.d.ts +22 -0
  475. package/dist/editor/schema-editor/collection-draft.js +40 -0
  476. package/dist/editor/schema-editor/index.d.ts +1 -1
  477. package/dist/editor/schema-label.d.ts +10 -0
  478. package/dist/editor/schema-label.js +17 -0
  479. package/dist/editor/settings-conflict.d.ts +5 -0
  480. package/dist/editor/settings-conflict.js +8 -0
  481. package/dist/editor/shell/ActivityRail.d.ts +37 -0
  482. package/dist/editor/shell/ActivityRail.js +91 -0
  483. package/dist/editor/shell/EditorShell.d.ts +17 -0
  484. package/dist/editor/shell/EditorShell.js +31 -0
  485. package/dist/editor/shell/PaneLayout.d.ts +28 -0
  486. package/dist/editor/shell/PaneLayout.js +116 -0
  487. package/dist/editor/shell/SidePanelHost.d.ts +35 -0
  488. package/dist/editor/shell/SidePanelHost.js +184 -0
  489. package/dist/editor/shell/TopBar.d.ts +12 -0
  490. package/dist/editor/shell/TopBar.js +14 -0
  491. package/dist/editor/shell/host-chrome.d.ts +16 -0
  492. package/dist/editor/shell/host-chrome.js +69 -0
  493. package/dist/editor/slug.d.ts +16 -0
  494. package/dist/editor/slug.js +43 -0
  495. package/dist/editor/theme.d.ts +2 -1
  496. package/dist/editor/theme.js +314 -13
  497. package/dist/editor/unanswered.d.ts +17 -0
  498. package/dist/editor/unanswered.js +26 -0
  499. package/dist/editor/unavailable-entry-type.d.ts +20 -0
  500. package/dist/editor/unavailable-entry-type.js +28 -0
  501. package/dist/editor/undo-removal.d.ts +57 -0
  502. package/dist/editor/undo-removal.js +163 -0
  503. package/dist/editor/user-display.d.ts +4 -0
  504. package/dist/editor/user-display.js +5 -0
  505. package/dist/editor/utils/confirm-modal.d.ts +8 -0
  506. package/dist/editor/utils/confirm-modal.js +12 -0
  507. package/dist/editor/utils/editor-errors.d.ts +19 -0
  508. package/dist/editor/utils/editor-errors.js +32 -0
  509. package/dist/editor/utils/focus-return.d.ts +56 -0
  510. package/dist/editor/utils/focus-return.js +106 -0
  511. package/dist/entry-link-resolver.d.ts +11 -1
  512. package/dist/entry-link-resolver.js +65 -5
  513. package/dist/entry-schema-registry.d.ts +3 -3
  514. package/dist/entry-schema-registry.js +7 -4
  515. package/dist/entry-schema.d.ts +49 -3
  516. package/dist/entry-schema.js +18 -0
  517. package/dist/git-manager.d.ts +172 -10
  518. package/dist/git-manager.js +449 -107
  519. package/dist/github-service.d.ts +39 -2
  520. package/dist/github-service.js +101 -7
  521. package/dist/http/handler.js +74 -9
  522. package/dist/http/types.d.ts +2 -0
  523. package/dist/http/worker-not-ready.d.ts +9 -4
  524. package/dist/http/worker-not-ready.js +59 -6
  525. package/dist/index.d.ts +2 -0
  526. package/dist/index.js +3 -0
  527. package/dist/item-keys.d.ts +46 -0
  528. package/dist/item-keys.js +235 -0
  529. package/dist/operating-mode/editor-mode-check.d.ts +15 -0
  530. package/dist/operating-mode/editor-mode-check.js +24 -0
  531. package/dist/operating-mode/mode-env.d.ts +13 -14
  532. package/dist/operating-mode/mode-env.js +13 -14
  533. package/dist/operating-mode/types.d.ts +2 -2
  534. package/dist/paths/branch.d.ts +0 -1
  535. package/dist/paths/branch.js +1 -8
  536. package/dist/paths/index.d.ts +1 -1
  537. package/dist/paths/index.js +1 -1
  538. package/dist/paths/validation.js +0 -2
  539. package/dist/preview.d.ts +8 -0
  540. package/dist/preview.js +7 -0
  541. package/dist/reference-resolver.js +1 -0
  542. package/dist/resolve-canopy-user.d.ts +1 -1
  543. package/dist/resolve-canopy-user.js +1 -1
  544. package/dist/schema/meta-loader.d.ts +18 -8
  545. package/dist/schema/meta-loader.js +42 -9
  546. package/dist/schema/registry-fingerprint.d.ts +14 -0
  547. package/dist/schema/registry-fingerprint.js +63 -0
  548. package/dist/schema/resolver.d.ts +7 -4
  549. package/dist/schema/resolver.js +7 -6
  550. package/dist/schema/schema-store.d.ts +7 -10
  551. package/dist/schema/schema-store.js +13 -11
  552. package/dist/schema/schema-unavailable-error.d.ts +11 -0
  553. package/dist/schema/schema-unavailable-error.js +15 -0
  554. package/dist/schema/types.d.ts +22 -0
  555. package/dist/schema-registry-record.d.ts +35 -0
  556. package/dist/schema-registry-record.js +134 -0
  557. package/dist/server.d.ts +79 -9
  558. package/dist/server.js +62 -8
  559. package/dist/services.d.ts +33 -5
  560. package/dist/services.js +155 -37
  561. package/dist/settings-workspace.d.ts +23 -3
  562. package/dist/settings-workspace.js +159 -45
  563. package/dist/stamp-on-publish.d.ts +36 -0
  564. package/dist/stamp-on-publish.js +71 -0
  565. package/dist/static/index.d.ts +58 -5
  566. package/dist/static/index.js +133 -3
  567. package/dist/static/seo.d.ts +5 -5
  568. package/dist/static/seo.js +5 -5
  569. package/dist/submission-attribution.d.ts +8 -0
  570. package/dist/submission-attribution.js +22 -0
  571. package/dist/system-users.d.ts +12 -0
  572. package/dist/system-users.js +12 -0
  573. package/dist/task-queue/cms-task-queue.d.ts +1 -1
  574. package/dist/task-queue/cms-task-queue.js +1 -1
  575. package/dist/task-queue/index.d.ts +1 -1
  576. package/dist/task-queue/index.js +1 -1
  577. package/dist/task-queue/task-queue.d.ts +6 -0
  578. package/dist/task-queue/task-queue.js +29 -0
  579. package/dist/task-queue/worker-status.d.ts +35 -9
  580. package/dist/task-queue/worker-status.js +84 -17
  581. package/dist/types.d.ts +90 -9
  582. package/dist/url-collision.js +3 -3
  583. package/dist/url-exclusivity-fixtures.d.ts +8 -1
  584. package/dist/url-exclusivity-fixtures.js +11 -1
  585. package/dist/user.js +2 -1
  586. package/dist/utils/atomic-write.js +2 -1
  587. package/dist/utils/base-branch.d.ts +13 -0
  588. package/dist/utils/base-branch.js +23 -0
  589. package/dist/utils/content-serialize.d.ts +15 -7
  590. package/dist/utils/content-serialize.js +353 -51
  591. package/dist/utils/content-write-lock.d.ts +6 -1
  592. package/dist/utils/content-write-lock.js +21 -6
  593. package/dist/utils/debug.d.ts +1 -1
  594. package/dist/utils/debug.js +5 -3
  595. package/dist/utils/error.js +13 -2
  596. package/dist/utils/escape-text.d.ts +7 -0
  597. package/dist/utils/escape-text.js +27 -0
  598. package/dist/utils/fs.d.ts +12 -4
  599. package/dist/utils/fs.js +18 -5
  600. package/dist/utils/git.d.ts +21 -1
  601. package/dist/utils/git.js +63 -8
  602. package/dist/utils/json-source-splice.d.ts +14 -0
  603. package/dist/utils/json-source-splice.js +120 -0
  604. package/dist/utils/markdown-body-splice.d.ts +39 -0
  605. package/dist/utils/markdown-body-splice.js +421 -0
  606. package/dist/utils/occ-json-write.js +18 -12
  607. package/dist/utils/provision-log.d.ts +25 -0
  608. package/dist/utils/provision-log.js +49 -0
  609. package/dist/utils/provisioning-lock.d.ts +32 -1
  610. package/dist/utils/provisioning-lock.js +78 -32
  611. package/dist/utils/sanitize-href.d.ts +9 -23
  612. package/dist/utils/sanitize-href.js +14 -28
  613. package/dist/utils/title-field.d.ts +10 -0
  614. package/dist/utils/title-field.js +47 -0
  615. package/dist/utils/yaml-source-splice.d.ts +58 -0
  616. package/dist/utils/yaml-source-splice.js +515 -0
  617. package/dist/validation/block-structural-keys.d.ts +1 -1
  618. package/dist/validation/block-structural-keys.js +1 -1
  619. package/dist/validation/deletion-checker.d.ts +21 -29
  620. package/dist/validation/deletion-checker.js +41 -117
  621. package/dist/validation/entry-validator.d.ts +6 -10
  622. package/dist/validation/entry-validator.js +19 -26
  623. package/dist/validation/field-traversal.d.ts +22 -0
  624. package/dist/validation/field-traversal.js +39 -8
  625. package/dist/validation/markdown-safety.d.ts +68 -0
  626. package/dist/validation/markdown-safety.js +596 -0
  627. package/dist/validation/mdx-allowlist.d.ts +55 -0
  628. package/dist/validation/mdx-allowlist.js +183 -0
  629. package/dist/validation/reference-validator.d.ts +2 -0
  630. package/dist/validation/reference-validator.js +3 -0
  631. package/dist/version.d.ts +1 -1
  632. package/dist/version.js +1 -1
  633. package/dist/worker/branch-policy.d.ts +124 -0
  634. package/dist/worker/branch-policy.js +243 -0
  635. package/dist/worker/bundle-header.d.ts +117 -0
  636. package/dist/worker/bundle-header.js +253 -0
  637. package/dist/worker/cms-worker.d.ts +236 -142
  638. package/dist/worker/cms-worker.js +772 -285
  639. package/dist/worker/gateway-egress.d.ts +43 -0
  640. package/dist/worker/gateway-egress.js +209 -0
  641. package/dist/worker/gateway-instance.d.ts +42 -0
  642. package/dist/worker/gateway-instance.js +129 -0
  643. package/dist/worker/git-process.d.ts +81 -0
  644. package/dist/worker/git-process.js +234 -0
  645. package/dist/worker/git-sync.d.ts +34 -17
  646. package/dist/worker/git-sync.js +394 -131
  647. package/dist/worker/github-auth.d.ts +9 -9
  648. package/dist/worker/github-auth.js +13 -15
  649. package/dist/worker/github-gateway-http.d.ts +62 -0
  650. package/dist/worker/github-gateway-http.js +977 -0
  651. package/dist/worker/github-gateway-wire.d.ts +590 -0
  652. package/dist/worker/github-gateway-wire.js +488 -0
  653. package/dist/worker/github-gateway.d.ts +238 -0
  654. package/dist/worker/github-gateway.js +726 -0
  655. package/dist/worker/github-mirror-upkeep.d.ts +75 -0
  656. package/dist/worker/github-mirror-upkeep.js +266 -0
  657. package/dist/worker/github-mirror.d.ts +364 -0
  658. package/dist/worker/github-mirror.js +1030 -0
  659. package/dist/worker/github-transfer.d.ts +56 -0
  660. package/dist/worker/github-transfer.js +444 -0
  661. package/dist/worker/history-rewrite.d.ts +4 -5
  662. package/dist/worker/history-rewrite.js +12 -17
  663. package/dist/worker/provisioned-workspace.d.ts +5 -5
  664. package/dist/worker/provisioned-workspace.js +5 -5
  665. package/dist/worker/rebase.d.ts +1 -1
  666. package/dist/worker/rebase.js +58 -54
  667. package/dist/worker/remote-git-maintenance.d.ts +3 -0
  668. package/dist/worker/remote-git-maintenance.js +12 -0
  669. package/dist/worker/schema-gate.d.ts +49 -0
  670. package/dist/worker/schema-gate.js +226 -0
  671. package/dist/worker/self-checks.d.ts +107 -0
  672. package/dist/worker/self-checks.js +358 -0
  673. package/dist/worker/shared-repo-git.d.ts +96 -0
  674. package/dist/worker/shared-repo-git.js +459 -0
  675. package/dist/worker/sparse-cone.d.ts +20 -0
  676. package/dist/worker/sparse-cone.js +136 -0
  677. package/dist/worker/stale-mirror.d.ts +82 -0
  678. package/dist/worker/stale-mirror.js +130 -0
  679. package/dist/worker/task-runner.d.ts +5 -3
  680. package/dist/worker/task-runner.js +287 -186
  681. package/dist/worker/worker-context.d.ts +36 -37
  682. package/package.json +35 -7
  683. package/dist/editor/EditorPanes.d.ts +0 -10
  684. package/dist/editor/EditorPanes.js +0 -98
  685. package/dist/editor/components/EditorFooter.d.ts +0 -11
  686. package/dist/editor/components/EditorFooter.js +0 -9
  687. package/dist/editor/components/EditorSidebar.d.ts +0 -67
  688. package/dist/editor/components/EditorSidebar.js +0 -22
@@ -1,7 +1,7 @@
1
1
  import type { RootCollectionConfig } from './config/index.js';
2
2
  import type { FlatSchemaItem } from './config/types.js';
3
3
  import type { OperatingMode } from './operating-mode/index.js';
4
- import type { EntrySchemaRegistry, SchemaResolutionResult } from './schema/types.js';
4
+ import type { EntrySchemaRegistry, SchemaIssue, SchemaResolutionResult, UnknownSchemaPolicy } from './schema/types.js';
5
5
  /** File name of the schema cache inside {@link schemaCacheDir}. */
6
6
  export declare const SCHEMA_CACHE_FILE = "schema-cache.json";
7
7
  /** resource-generation.ts resource key for the schema cache's marker. */
@@ -18,6 +18,19 @@ export interface BranchSchemaCacheEntry {
18
18
  * isGenerationCurrent) to decide freshness.
19
19
  */
20
20
  generation: string | null;
21
+ /**
22
+ * {@link registryFingerprint} of the registry this snapshot was resolved
23
+ * against. A deploy bumps no marker, so without it a new image would keep
24
+ * serving schemas resolved by the old image's registry.
25
+ */
26
+ registryFingerprint: string;
27
+ issues: SchemaIssue[];
28
+ }
29
+ /** A branch's resolved schema, plus what a degraded resolve left out of it. */
30
+ export interface ResolvedBranchSchema {
31
+ schema: RootCollectionConfig;
32
+ flatSchema: FlatSchemaItem[];
33
+ issues: SchemaIssue[];
21
34
  }
22
35
  /**
23
36
  * Per-branch schema cache: one file in {@link schemaCacheDir} with no in-memory
@@ -32,6 +45,15 @@ export interface BranchSchemaCacheEntry {
32
45
  * Callers that bypass SchemaOps (api/schema.ts's invalidate endpoint, and the
33
46
  * bulk git-op bump in invalidateBranchContentCaches) accept the lazy
34
47
  * next-read regen instead.
48
+ *
49
+ * The owner of the strict/degrade split. Content read from the checkout (a
50
+ * build, a static deployment) shares a commit with the code, so a schema
51
+ * reference the registry lacks is a real bug and resolution throws. A branch
52
+ * workspace's content arrives by sync, which can land before the image whose
53
+ * registry it needs, or after an image that needs content it lacks; there an
54
+ * unknown schema marks only its entry type `unavailable`, an unknown reference
55
+ * `entryTypes` value only empties that field's options, and both are returned
56
+ * as `issues`.
35
57
  */
36
58
  export declare class BranchSchemaCache {
37
59
  /** Tracks when we last checked mtimes per contentRoot, to debounce rapid requests */
@@ -39,25 +61,23 @@ export declare class BranchSchemaCache {
39
61
  private readonly devMode;
40
62
  constructor(mode?: OperatingMode);
41
63
  /**
42
- * Whether to skip the on-disk cache for this branchRoot.
64
+ * Whether this branchRoot is the checkout rather than a branch workspace,
65
+ * which skips the on-disk cache and resolves strictly (see the class doc).
43
66
  *
44
67
  * Never write a schema cache at the project root, whichever entrypoint
45
68
  * produced the cwd branchRoot. branchRoot equals process.cwd() only in the
46
69
  * synthetic contexts static deployments and build phases use; a real branch
47
70
  * root is always nested under the workspace.
48
71
  */
49
- private skipDiskCache;
72
+ private readsCheckout;
50
73
  /** Get schema for a branch, from the cache when fresh, else resolved fresh. */
51
- getSchema(branchRoot: string, entrySchemaRegistry: EntrySchemaRegistry, contentRootName?: string): Promise<{
52
- schema: RootCollectionConfig;
53
- flatSchema: FlatSchemaItem[];
54
- }>;
74
+ getSchema(branchRoot: string, entrySchemaRegistry: EntrySchemaRegistry, contentRootName?: string): Promise<ResolvedBranchSchema>;
55
75
  /**
56
76
  * Resolve the schema from disk. Protected rather than a direct resolveSchema
57
77
  * call so tests can subclass and block it to simulate cross-process
58
78
  * interleavings — mirrors BranchRegistry's scanBranchDirectories() hook.
59
79
  */
60
- protected resolveFresh(contentRoot: string, entrySchemaRegistry: EntrySchemaRegistry): Promise<SchemaResolutionResult>;
80
+ protected resolveFresh(contentRoot: string, entrySchemaRegistry: EntrySchemaRegistry, unknownSchema: UnknownSchemaPolicy): Promise<SchemaResolutionResult>;
61
81
  private loadFromCacheOrResolve;
62
82
  /**
63
83
  * Resolve the schema fresh from disk and persist it (subject to the
@@ -75,10 +95,7 @@ export declare class BranchSchemaCache {
75
95
  * instead return a snapshot a concurrent host wrote — possibly one embedding
76
96
  * the now-current token over ITS own stale-NFS scan — skipping that scan.
77
97
  */
78
- resolveAndPersist(branchRoot: string, entrySchemaRegistry: EntrySchemaRegistry, contentRootName?: string): Promise<{
79
- schema: RootCollectionConfig;
80
- flatSchema: FlatSchemaItem[];
81
- }>;
98
+ resolveAndPersist(branchRoot: string, entrySchemaRegistry: EntrySchemaRegistry, contentRootName?: string): Promise<ResolvedBranchSchema>;
82
99
  /**
83
100
  * Invalidate a branch's cache by bumping the marker; every process sharing
84
101
  * this branchRoot re-resolves at its next read. The bump must succeed —
@@ -1,20 +1,39 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { resolveSchema, isValidSchema } from './schema/resolver.js';
4
+ import { registryFingerprint } from './schema/registry-fingerprint.js';
4
5
  import { flattenSchema } from './config/flatten.js';
5
6
  import { validateReferenceEntryTypes } from './validation/entry-type-reference-validator.js';
6
7
  import { isBuildMode } from './build-mode.js';
7
8
  import { bumpResourceGeneration, readResourceGeneration, isGenerationCurrent, } from './resource-generation.js';
8
9
  import { timeRequestPhase } from './utils/request-timing.js';
9
10
  import { CANOPY_META_DIR } from './utils/git.js';
11
+ import { canopyLogWarn } from './utils/logger.js';
10
12
  /** Bump when BranchSchemaCacheEntry shape changes to auto-invalidate stale caches */
11
- const SCHEMA_CACHE_VERSION = 3;
13
+ const SCHEMA_CACHE_VERSION = 4;
12
14
  /** Minimum interval between mtime staleness checks (ms) */
13
15
  const MTIME_CHECK_DEBOUNCE_MS = 1000;
14
16
  /** File name of the schema cache inside {@link schemaCacheDir}. */
15
17
  export const SCHEMA_CACHE_FILE = 'schema-cache.json';
16
18
  /** resource-generation.ts resource key for the schema cache's marker. */
17
19
  export const SCHEMA_GENERATION_RESOURCE = 'schema';
20
+ const reportedIssues = new Set();
21
+ /** Log each schema issue once per process, whether it was resolved here or read from a snapshot. */
22
+ function reportSchemaIssues(issues) {
23
+ for (const issue of issues) {
24
+ const line = issue.kind === 'unknown-schema'
25
+ ? `CanopyCMS: ${issue.metaFile} names entry schema "${issue.schemaRef}", which this ` +
26
+ `deployment's entry schema registry does not define, so entry type ` +
27
+ `"${issue.entryType}" is unavailable until code defining it is deployed or the ` +
28
+ `content stops naming it.`
29
+ : `CanopyCMS: ${issue.message} That reference field offers no options until the ` +
30
+ `content declares the entry type.`;
31
+ if (reportedIssues.has(line))
32
+ continue;
33
+ reportedIssues.add(line);
34
+ canopyLogWarn(line);
35
+ }
36
+ }
18
37
  /**
19
38
  * True when a .collection.json under `dir` is newer than `cachedAt`.
20
39
  *
@@ -73,6 +92,15 @@ async function schemaCacheDir(branchRoot) {
73
92
  * Callers that bypass SchemaOps (api/schema.ts's invalidate endpoint, and the
74
93
  * bulk git-op bump in invalidateBranchContentCaches) accept the lazy
75
94
  * next-read regen instead.
95
+ *
96
+ * The owner of the strict/degrade split. Content read from the checkout (a
97
+ * build, a static deployment) shares a commit with the code, so a schema
98
+ * reference the registry lacks is a real bug and resolution throws. A branch
99
+ * workspace's content arrives by sync, which can land before the image whose
100
+ * registry it needs, or after an image that needs content it lacks; there an
101
+ * unknown schema marks only its entry type `unavailable`, an unknown reference
102
+ * `entryTypes` value only empties that field's options, and both are returned
103
+ * as `issues`.
76
104
  */
77
105
  export class BranchSchemaCache {
78
106
  constructor(mode = 'prod') {
@@ -81,14 +109,15 @@ export class BranchSchemaCache {
81
109
  this.devMode = mode === 'dev';
82
110
  }
83
111
  /**
84
- * Whether to skip the on-disk cache for this branchRoot.
112
+ * Whether this branchRoot is the checkout rather than a branch workspace,
113
+ * which skips the on-disk cache and resolves strictly (see the class doc).
85
114
  *
86
115
  * Never write a schema cache at the project root, whichever entrypoint
87
116
  * produced the cwd branchRoot. branchRoot equals process.cwd() only in the
88
117
  * synthetic contexts static deployments and build phases use; a real branch
89
118
  * root is always nested under the workspace.
90
119
  */
91
- skipDiskCache(branchRoot) {
120
+ readsCheckout(branchRoot) {
92
121
  return isBuildMode() || path.resolve(branchRoot) === path.resolve(process.cwd());
93
122
  }
94
123
  /** Get schema for a branch, from the cache when fresh, else resolved fresh. */
@@ -100,13 +129,13 @@ export class BranchSchemaCache {
100
129
  * call so tests can subclass and block it to simulate cross-process
101
130
  * interleavings — mirrors BranchRegistry's scanBranchDirectories() hook.
102
131
  */
103
- async resolveFresh(contentRoot, entrySchemaRegistry) {
104
- return resolveSchema(contentRoot, entrySchemaRegistry);
132
+ async resolveFresh(contentRoot, entrySchemaRegistry, unknownSchema) {
133
+ return resolveSchema(contentRoot, entrySchemaRegistry, { unknownSchema });
105
134
  }
106
135
  async loadFromCacheOrResolve(branchRoot, entrySchemaRegistry, contentRootName) {
107
136
  const contentRoot = path.join(branchRoot, contentRootName);
108
- const skipDiskCache = this.skipDiskCache(branchRoot);
109
- if (!skipDiskCache) {
137
+ const fromCheckout = this.readsCheckout(branchRoot);
138
+ if (!fromCheckout) {
110
139
  const cachePath = path.join(await schemaCacheDir(branchRoot), SCHEMA_CACHE_FILE);
111
140
  let cacheData = null;
112
141
  try {
@@ -120,7 +149,9 @@ export class BranchSchemaCache {
120
149
  // Strict version check, not truthiness: a snapshot from an older version
121
150
  // left on EFS by a rolling deploy has no `generation` field, and an
122
151
  // `undefined` token breaks the freshness comparison below.
123
- if (cacheData && cacheData.version === SCHEMA_CACHE_VERSION) {
152
+ if (cacheData &&
153
+ cacheData.version === SCHEMA_CACHE_VERSION &&
154
+ cacheData.registryFingerprint === registryFingerprint(entrySchemaRegistry)) {
124
155
  const read = await readResourceGeneration(branchRoot, SCHEMA_GENERATION_RESOURCE);
125
156
  if (isGenerationCurrent(cacheData.generation, read)) {
126
157
  // Dev also walks mtimes, debounced, to catch edits made outside the CMS.
@@ -135,7 +166,12 @@ export class BranchSchemaCache {
135
166
  else {
136
167
  if (this.devMode)
137
168
  this.lastMtimeCheck.set(contentRoot, now);
138
- return { schema: cacheData.schema, flatSchema: cacheData.flatSchema };
169
+ reportSchemaIssues(cacheData.issues);
170
+ return {
171
+ schema: cacheData.schema,
172
+ flatSchema: cacheData.flatSchema,
173
+ issues: cacheData.issues,
174
+ };
139
175
  }
140
176
  }
141
177
  else {
@@ -148,7 +184,7 @@ export class BranchSchemaCache {
148
184
  }
149
185
  }
150
186
  return this.resolveFreshAndPersist(branchRoot, entrySchemaRegistry, contentRootName, {
151
- skipDiskCache,
187
+ fromCheckout,
152
188
  });
153
189
  }
154
190
  /**
@@ -158,32 +194,36 @@ export class BranchSchemaCache {
158
194
  * cache-miss fallback and by {@link resolveAndPersist}.
159
195
  */
160
196
  async resolveFreshAndPersist(branchRoot, entrySchemaRegistry, contentRootName, options) {
161
- const { skipDiskCache } = options;
197
+ const { fromCheckout } = options;
162
198
  const contentRoot = path.join(branchRoot, contentRootName);
163
199
  // Capture the marker strictly BEFORE resolving, so a bump landing
164
200
  // mid-resolve differs from the token persisted below and forces a
165
201
  // re-resolve on the next read.
166
- const read = skipDiskCache
202
+ const read = fromCheckout
167
203
  ? null
168
204
  : await readResourceGeneration(branchRoot, SCHEMA_GENERATION_RESOURCE);
169
205
  // Nested under `schema`, so a request summary names a cache miss (`…schema>resolve`).
170
- const result = await timeRequestPhase('resolve', () => this.resolveFresh(contentRoot, entrySchemaRegistry));
206
+ const result = await timeRequestPhase('resolve', () => this.resolveFresh(contentRoot, entrySchemaRegistry, fromCheckout ? 'throw' : 'degrade'));
171
207
  // Validate schema has content
172
208
  if (!isValidSchema(result.schema)) {
173
209
  throw new Error(`No schema found in ${contentRoot}. Create .collection.json files ` +
174
210
  'with references to field schemas defined in your entry schema registry.');
175
211
  }
176
212
  // Reference fields may only scope themselves to entry types that exist.
177
- // Checked here, before anything is cached, so a typo fails loudly and
178
- // consistently instead of silently resolving to zero reference options.
213
+ // Checked here, before anything is cached, so a typo fails a build loudly
214
+ // instead of silently resolving to zero reference options.
179
215
  const entryTypeIssues = validateReferenceEntryTypes(result.schema);
180
- if (entryTypeIssues.length > 0) {
216
+ if (entryTypeIssues.length > 0 && fromCheckout) {
181
217
  throw new Error(`Invalid reference field entryTypes in ${contentRoot}:\n` +
182
218
  entryTypeIssues.map((issue) => ` - ${issue}`).join('\n'));
183
219
  }
220
+ const issues = [
221
+ ...result.issues,
222
+ ...entryTypeIssues.map((message) => ({ kind: 'reference-entry-type', message })),
223
+ ];
184
224
  // Use configured contentRoot name as base path for logical paths
185
225
  const flatSchema = flattenSchema(result.schema, contentRootName);
186
- if (!skipDiskCache) {
226
+ if (!fromCheckout) {
187
227
  const cacheDir = await schemaCacheDir(branchRoot);
188
228
  const cachePath = path.join(cacheDir, SCHEMA_CACHE_FILE);
189
229
  // Opportunistic cleanup of the retired .stale marker file, which a
@@ -196,6 +236,8 @@ export class BranchSchemaCache {
196
236
  flatSchema,
197
237
  cachedAt: new Date().toISOString(),
198
238
  generation: read.token,
239
+ registryFingerprint: registryFingerprint(entrySchemaRegistry),
240
+ issues,
199
241
  };
200
242
  // Temp file then rename, with the temp file unlinked on a failed
201
243
  // rename so a transient error leaves no stray `.tmp` beside the cache.
@@ -215,7 +257,8 @@ export class BranchSchemaCache {
215
257
  // with an unattributable one would look correctly attributed to every
216
258
  // future reader. Serve the fresh result without persisting it.
217
259
  }
218
- return { schema: result.schema, flatSchema };
260
+ reportSchemaIssues(issues);
261
+ return { schema: result.schema, flatSchema, issues };
219
262
  }
220
263
  /**
221
264
  * Resolve fresh from disk and persist, SKIPPING the cache read entirely.
@@ -227,9 +270,9 @@ export class BranchSchemaCache {
227
270
  * the now-current token over ITS own stale-NFS scan — skipping that scan.
228
271
  */
229
272
  async resolveAndPersist(branchRoot, entrySchemaRegistry, contentRootName = 'content') {
230
- const skipDiskCache = this.skipDiskCache(branchRoot);
273
+ const fromCheckout = this.readsCheckout(branchRoot);
231
274
  return this.resolveFreshAndPersist(branchRoot, entrySchemaRegistry, contentRootName, {
232
- skipDiskCache,
275
+ fromCheckout,
233
276
  });
234
277
  }
235
278
  /**
@@ -241,7 +284,7 @@ export class BranchSchemaCache {
241
284
  * No eager re-resolve here; it lives in SchemaOps (see the class doc).
242
285
  */
243
286
  async invalidate(branchRoot) {
244
- if (this.skipDiskCache(branchRoot))
287
+ if (this.readsCheckout(branchRoot))
245
288
  return;
246
289
  await bumpResourceGeneration(branchRoot, SCHEMA_GENERATION_RESOURCE, { mustSucceed: true });
247
290
  }
@@ -0,0 +1,23 @@
1
+ import type { CanopyConfig } from './config/index.js';
2
+ /**
3
+ * The cone a content branch's clone checks out for `contentRoot`, sorted as
4
+ * `git sparse-checkout list` prints it, or null for a full clone when the content root is the
5
+ * repository root.
6
+ */
7
+ export declare function sparseConeFor(contentRoot: string | undefined): string[] | null;
8
+ export declare function sameCone(a: readonly string[] | null, b: readonly string[] | null): boolean;
9
+ export interface RecordedSparseCone {
10
+ cone: string[] | null;
11
+ }
12
+ /** The recorded cone, or undefined when none is recorded or the record does not parse. */
13
+ export declare function readRecordedSparseCone(contentBranchesRoot: string): Promise<RecordedSparseCone | undefined>;
14
+ /**
15
+ * Record `cone` unless it already is, by temp file and rename. Does not create the branches
16
+ * root: a deployment without one has no clones to re-apply a cone to.
17
+ */
18
+ export declare function recordSparseCone(contentBranchesRoot: string, cone: string[] | null): Promise<void>;
19
+ /**
20
+ * Record the cone `config` asks for, once per process start, so a changed content root reaches
21
+ * existing clones without waiting for a new branch. Best-effort: a failure is logged.
22
+ */
23
+ export declare function recordConfiguredSparseCone(config: CanopyConfig): Promise<void>;
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Sparse checkout for content-branch clones. An editor reads and writes only under the content
3
+ * root, and on EFS every checked-out file costs an NFS round trip, so a content branch's clone
4
+ * checks out the content root and `.canopy-meta` in cone mode, which always keeps the files at
5
+ * the repository root (a root permissions.json among them).
6
+ *
7
+ * A cone is set only by `stageBranchWorkspace` and, on clones already sparse, by the worker
8
+ * (worker/sparse-cone.ts), so settings workspaces are never sparse; their orphan init also
9
+ * empties the index with `--sparse`, so a sparse one could not leak base content either.
10
+ * Sparse-index stays off: git expands it for most commands anyway.
11
+ *
12
+ * `git add` and `git rm` refuse a path outside the cone unless given `--sparse` (git >= 2.34),
13
+ * so every call that can name one passes it.
14
+ */
15
+ import fs from 'node:fs/promises';
16
+ import path from 'node:path';
17
+ import { readsFromCheckout } from './build-mode.js';
18
+ import { operatingStrategy } from './operating-mode/index.js';
19
+ import { getErrorMessage, isNodeError } from './utils/error.js';
20
+ import { CANOPY_META_DIR } from './utils/git.js';
21
+ import { canopyLogWarn } from './utils/logger.js';
22
+ /**
23
+ * The cone a content branch's clone checks out for `contentRoot`, sorted as
24
+ * `git sparse-checkout list` prints it, or null for a full clone when the content root is the
25
+ * repository root.
26
+ */
27
+ export function sparseConeFor(contentRoot) {
28
+ const root = (contentRoot ?? 'content')
29
+ .split('/')
30
+ .filter((segment) => segment && segment !== '.')
31
+ .join('/');
32
+ return root ? [...new Set([CANOPY_META_DIR, root])].sort() : null;
33
+ }
34
+ export function sameCone(a, b) {
35
+ if (a === null || b === null)
36
+ return a === b;
37
+ const [left, right] = [[...a].sort(), [...b].sort()];
38
+ return left.length === right.length && left.every((dir, i) => dir === right[i]);
39
+ }
40
+ /**
41
+ * Beside the branch directories: the cone this deployment's config asks for, written by the
42
+ * processes that hold the config and read by the worker, which does not, to re-apply a changed
43
+ * content root to existing clones.
44
+ */
45
+ const SPARSE_CONE_RECORD = '.sparse-cone.json';
46
+ function isConeDir(dir) {
47
+ return (typeof dir === 'string' &&
48
+ dir.length > 0 &&
49
+ !path.isAbsolute(dir) &&
50
+ !dir.split('/').some((segment) => segment === '' || segment === '.' || segment === '..'));
51
+ }
52
+ /** The recorded cone, or undefined when none is recorded or the record does not parse. */
53
+ export async function readRecordedSparseCone(contentBranchesRoot) {
54
+ let raw;
55
+ try {
56
+ raw = await fs.readFile(path.join(contentBranchesRoot, SPARSE_CONE_RECORD), 'utf8');
57
+ }
58
+ catch (err) {
59
+ if (isNodeError(err) && err.code === 'ENOENT')
60
+ return undefined;
61
+ throw err;
62
+ }
63
+ let parsed;
64
+ try {
65
+ parsed = JSON.parse(raw);
66
+ }
67
+ catch {
68
+ return undefined;
69
+ }
70
+ if (typeof parsed !== 'object' || parsed === null || !('cone' in parsed))
71
+ return undefined;
72
+ const { cone } = parsed;
73
+ if (cone === null)
74
+ return { cone: null };
75
+ return Array.isArray(cone) && cone.length > 0 && cone.every(isConeDir)
76
+ ? { cone: cone.filter(isConeDir) }
77
+ : undefined;
78
+ }
79
+ /**
80
+ * Record `cone` unless it already is, by temp file and rename. Does not create the branches
81
+ * root: a deployment without one has no clones to re-apply a cone to.
82
+ */
83
+ export async function recordSparseCone(contentBranchesRoot, cone) {
84
+ const current = await readRecordedSparseCone(contentBranchesRoot);
85
+ if (current && sameCone(current.cone, cone))
86
+ return;
87
+ const target = path.join(contentBranchesRoot, SPARSE_CONE_RECORD);
88
+ const temp = `${target}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
89
+ try {
90
+ await fs.writeFile(temp, `${JSON.stringify({ cone })}\n`, 'utf8');
91
+ }
92
+ catch (err) {
93
+ if (isNodeError(err) && err.code === 'ENOENT')
94
+ return;
95
+ throw err;
96
+ }
97
+ try {
98
+ await fs.rename(temp, target);
99
+ }
100
+ catch (err) {
101
+ await fs.unlink(temp).catch(() => { });
102
+ throw err;
103
+ }
104
+ }
105
+ /**
106
+ * Record the cone `config` asks for, once per process start, so a changed content root reaches
107
+ * existing clones without waiting for a new branch. Best-effort: a failure is logged.
108
+ */
109
+ export async function recordConfiguredSparseCone(config) {
110
+ try {
111
+ if (readsFromCheckout(config))
112
+ return;
113
+ await recordSparseCone(operatingStrategy(config.mode).getContentBranchesRoot(config.sourceRoot), sparseConeFor(config.contentRoot));
114
+ }
115
+ catch (err) {
116
+ canopyLogWarn(`[canopy] Could not record the sparse-checkout cone: ${getErrorMessage(err)}`);
117
+ }
118
+ }
@@ -1,4 +1,5 @@
1
1
  import type { CanopyConfig } from './config/index.js';
2
+ import { type BlockingKind } from './branch-provisioning.js';
2
3
  import type { BranchAccessControl, BranchContext, CanopyUserId } from './types.js';
3
4
  import type { OperatingMode } from './operating-mode/index.js';
4
5
  export interface OpenBranchOptions {
@@ -12,14 +13,52 @@ export interface OpenBranchOptions {
12
13
  remoteUrl?: string;
13
14
  }
14
15
  /**
15
- * Manages per-branch filesystem workspace: resolves root, ensures metadata,
16
- * and updates the branch registry.
16
+ * `created`: this call published the branch. `exists`: it was already there, or another request
17
+ * published it first; its metadata is returned as found, never merged with this call's.
18
+ */
19
+ export interface ProvisionOutcome {
20
+ kind: 'created' | 'exists';
21
+ context: BranchContext;
22
+ }
23
+ /** @internal Test seams around the publish step. */
24
+ export interface ProvisioningTestHooks {
25
+ beforePublish?: (paths: {
26
+ stagingPath: string;
27
+ finalPath: string;
28
+ }) => Promise<void>;
29
+ inspectBlocked?: (finalPath: string) => Promise<BlockingKind>;
30
+ }
31
+ /** @internal Exported for tests; no argument clears them. */
32
+ export declare function setProvisioningTestHooks(hooks?: ProvisioningTestHooks): void;
33
+ /**
34
+ * Provisions per-branch workspaces under [PROV-1]: a branch's directory appears only by rename,
35
+ * complete with branch.json (branch-provisioning.ts).
17
36
  */
18
37
  export declare class BranchWorkspaceManager {
19
38
  private readonly config;
20
39
  constructor(config: CanopyConfig);
21
- private ensureGitWorkspace;
40
+ /** The branch's context, provisioning it first when it does not exist. */
22
41
  openOrCreateBranch(options: OpenBranchOptions): Promise<BranchContext>;
42
+ /**
43
+ * Provision a branch workspace, or report the one already there.
44
+ *
45
+ * @throws BranchProvisioningBusyError when another process is mid-way through this branch, or
46
+ * what is at its path is too fresh to judge (retriable)
47
+ * @throws BranchDirOccupiedError in prod, when its path holds a repository this deployment did
48
+ * not create
49
+ * @throws BranchMetadataCorruptError when its branch.json is not valid JSON or fails its schema
50
+ */
51
+ provisionBranch(options: OpenBranchOptions): Promise<ProvisionOutcome>;
52
+ private provisionUnshared;
53
+ private stageAndPublish;
54
+ /**
55
+ * The one exception to [PROV-1]: a dev workspace that already holds real work is kept where it
56
+ * is, given branch.json under the branch's lock.
57
+ */
58
+ private adoptInPlace;
59
+ /** Whether residue at the branch path may still belong to a live process. */
60
+ private recentlyActive;
61
+ private existing;
23
62
  }
24
63
  export { loadBranchContext } from './branch-metadata.js';
25
64
  /**