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
@@ -6,10 +6,14 @@
6
6
  * (changes will be overwritten), edit the generator's templates instead.
7
7
  */
8
8
  import { computeContentSha256Hex } from './request-body-hash.js';
9
+ import { resolveTimeoutMs, runWithDeadline } from './request-deadline.js';
10
+ export { isApiTimeoutError, WRITE_TIMED_OUT_MESSAGE } from './request-deadline.js';
9
11
  import { readTrailingSlashEnv, withTrailingSlash } from '../utils/url-prefix.js';
12
+ import { EDITOR_MODE_HEADER, EDITOR_MODE_MISMATCH_STATUS } from '../operating-mode/editor-mode-check.js';
10
13
  /**
11
14
  * Typed client for the CanopyCMS API: one method per endpoint, grouped by namespace, each
12
- * returning that endpoint's ApiResponse.
15
+ * returning that endpoint's ApiResponse. Every method takes {@link RequestOptions} last; a call
16
+ * that outlives its deadline rejects with an `ApiTimeoutError` (request-deadline.ts).
13
17
  *
14
18
  * @example
15
19
  * ```ts
@@ -21,106 +25,106 @@ export class CanopyApiClient {
21
25
  constructor(options = {}) {
22
26
  this.branches = {
23
27
  /** GET /branches */
24
- list: () => {
25
- return this.request('GET', '/branches');
28
+ list: (options) => {
29
+ return this.request('GET', '/branches', undefined, 'standard', options);
26
30
  },
27
31
  /** POST /branches */
28
- create: (body) => {
29
- return this.request('POST', '/branches', body);
32
+ create: (body, options) => {
33
+ return this.request('POST', '/branches', body, 'long', options);
30
34
  },
31
35
  /** DELETE /:branch */
32
- delete: (params) => {
33
- return this.request('DELETE', this.buildPath('/:branch', params));
36
+ delete: (params, options) => {
37
+ return this.request('DELETE', this.buildPath('/:branch', params), undefined, 'standard', options);
34
38
  },
35
39
  /** PATCH /:branch/access */
36
- updateAccess: (params, body) => {
37
- return this.request('PATCH', this.buildPath('/:branch/access', params), body);
40
+ updateAccess: (params, body, options) => {
41
+ return this.request('PATCH', this.buildPath('/:branch/access', params), body, 'standard', options);
38
42
  },
39
43
  };
40
44
  this.workflow = {
41
45
  /** POST /:branch/withdraw */
42
- withdraw: (params) => {
43
- return this.request('POST', this.buildPath('/:branch/withdraw', params));
46
+ withdraw: (params, options) => {
47
+ return this.request('POST', this.buildPath('/:branch/withdraw', params), undefined, 'standard', options);
44
48
  },
45
49
  /** POST /:branch/request-changes */
46
- requestChanges: (params) => {
47
- return this.request('POST', this.buildPath('/:branch/request-changes', params));
50
+ requestChanges: (params, options) => {
51
+ return this.request('POST', this.buildPath('/:branch/request-changes', params), undefined, 'standard', options);
48
52
  },
49
53
  /** POST /:branch/approve */
50
- approve: (params) => {
51
- return this.request('POST', this.buildPath('/:branch/approve', params));
54
+ approve: (params, options) => {
55
+ return this.request('POST', this.buildPath('/:branch/approve', params), undefined, 'standard', options);
52
56
  },
53
57
  /** POST /:branch/mark-merged */
54
- markMerged: (params) => {
55
- return this.request('POST', this.buildPath('/:branch/mark-merged', params));
58
+ markMerged: (params, options) => {
59
+ return this.request('POST', this.buildPath('/:branch/mark-merged', params), undefined, 'standard', options);
56
60
  },
57
61
  /** GET /:branch/status */
58
- getStatus: (params) => {
59
- return this.request('GET', this.buildPath('/:branch/status', params));
62
+ getStatus: (params, options) => {
63
+ return this.request('GET', this.buildPath('/:branch/status', params), undefined, 'standard', options);
60
64
  },
61
65
  /** POST /:branch/submit */
62
- submit: (params) => {
63
- return this.request('POST', this.buildPath('/:branch/submit', params));
66
+ submit: (params, options) => {
67
+ return this.request('POST', this.buildPath('/:branch/submit', params), undefined, 'long', options);
64
68
  },
65
69
  };
66
70
  this.comments = {
67
71
  /** GET /:branch/comments */
68
- list: (params) => {
69
- return this.request('GET', this.buildPath('/:branch/comments', params));
72
+ list: (params, options) => {
73
+ return this.request('GET', this.buildPath('/:branch/comments', params), undefined, 'standard', options);
70
74
  },
71
75
  /** POST /:branch/comments */
72
- add: (params, body) => {
73
- return this.request('POST', this.buildPath('/:branch/comments', params), body);
76
+ add: (params, body, options) => {
77
+ return this.request('POST', this.buildPath('/:branch/comments', params), body, 'standard', options);
74
78
  },
75
79
  /** POST /:branch/comments/:threadId/resolve */
76
- resolve: (params) => {
77
- return this.request('POST', this.buildPath('/:branch/comments/:threadId/resolve', params));
80
+ resolve: (params, options) => {
81
+ return this.request('POST', this.buildPath('/:branch/comments/:threadId/resolve', params), undefined, 'standard', options);
78
82
  },
79
83
  };
80
84
  this.content = {
81
85
  /** GET /:branch/content/...path */
82
- read: (params) => {
83
- return this.request('GET', this.buildPath('/:branch/content/...path', params));
86
+ read: (params, options) => {
87
+ return this.request('GET', this.buildPath('/:branch/content/...path', params), undefined, 'standard', options);
84
88
  },
85
89
  /** PUT /:branch/content/...path */
86
- write: (params, body) => {
87
- return this.request('PUT', this.buildPath('/:branch/content/...path', params), body);
90
+ write: (params, body, options) => {
91
+ return this.request('PUT', this.buildPath('/:branch/content/...path', params), body, 'standard', options);
88
92
  },
89
93
  /** POST /:branch/validate-references/...path */
90
- validateReferences: (params, body) => {
91
- return this.request('POST', this.buildPath('/:branch/validate-references/...path', params), body);
94
+ validateReferences: (params, body, options) => {
95
+ return this.request('POST', this.buildPath('/:branch/validate-references/...path', params), body, 'standard', options, true);
92
96
  },
93
97
  /** PATCH /:branch/rename-entry/...path */
94
- renameEntry: (params, body) => {
95
- return this.request('PATCH', this.buildPath('/:branch/rename-entry/...path', params), body);
98
+ renameEntry: (params, body, options) => {
99
+ return this.request('PATCH', this.buildPath('/:branch/rename-entry/...path', params), body, 'standard', options);
96
100
  },
97
101
  /** GET /:branch/reference-options */
98
- getReferenceOptions: (params) => {
99
- return this.request('GET', this.buildPath('/:branch/reference-options', params));
102
+ getReferenceOptions: (params, options) => {
103
+ return this.request('GET', this.buildPath('/:branch/reference-options', params), undefined, 'standard', options);
100
104
  },
101
105
  /** POST /:branch/resolve-references */
102
- resolveReferences: (params, body) => {
103
- return this.request('POST', this.buildPath('/:branch/resolve-references', params), body);
106
+ resolveReferences: (params, body, options) => {
107
+ return this.request('POST', this.buildPath('/:branch/resolve-references', params), body, 'standard', options, true);
104
108
  },
105
109
  };
106
110
  this.entries = {
107
111
  /** GET /:branch/entries */
108
- list: (params) => {
109
- return this.request('GET', this.buildPath('/:branch/entries', params));
112
+ list: (params, options) => {
113
+ return this.request('GET', this.buildPath('/:branch/entries', params), undefined, 'standard', options);
110
114
  },
111
115
  /** DELETE /:branch/entries/...entryPath */
112
- delete: (params) => {
113
- return this.request('DELETE', this.buildPath('/:branch/entries/...entryPath', params));
116
+ delete: (params, options) => {
117
+ return this.request('DELETE', this.buildPath('/:branch/entries/...entryPath', params), undefined, 'standard', options);
114
118
  },
115
119
  };
116
120
  this.assets = {
117
121
  /** POST /assets/presign */
118
- presign: (body) => {
119
- return this.request('POST', '/assets/presign', body);
122
+ presign: (body, options) => {
123
+ return this.request('POST', '/assets/presign', body, 'standard', options, true);
120
124
  },
121
125
  /** POST /assets/finalize */
122
- finalize: (body) => {
123
- return this.request('POST', '/assets/finalize', body);
126
+ finalize: (body, options) => {
127
+ return this.request('POST', '/assets/finalize', body, 'standard', options);
124
128
  },
125
129
  /** POST /assets/upload: multipart upload, hand-written because the generic template only knows JSON bodies. */
126
130
  uploadProxied: (file, options) => {
@@ -129,133 +133,137 @@ export class CanopyApiClient {
129
133
  if (options?.filename) {
130
134
  formData.append('filename', options.filename);
131
135
  }
132
- return this.request('POST', '/assets/upload', formData);
136
+ return this.request('POST', '/assets/upload', formData, 'long', options);
133
137
  },
134
138
  /** GET /assets */
135
- list: (params) => {
136
- return this.request('GET', this.buildPath('/assets', params));
139
+ list: (params, options) => {
140
+ return this.request('GET', this.buildPath('/assets', params), undefined, 'standard', options);
137
141
  },
138
142
  /** DELETE /assets */
139
- delete: (params) => {
140
- return this.request('DELETE', this.buildPath('/assets', params));
143
+ delete: (params, options) => {
144
+ return this.request('DELETE', this.buildPath('/assets', params), undefined, 'standard', options);
141
145
  },
142
146
  };
143
147
  this.permissions = {
144
148
  /** GET /permissions */
145
- get: () => {
146
- return this.request('GET', '/permissions');
149
+ get: (options) => {
150
+ return this.request('GET', '/permissions', undefined, 'standard', options);
147
151
  },
148
152
  /** PUT /permissions */
149
- update: (body) => {
150
- return this.request('PUT', '/permissions', body);
153
+ update: (body, options) => {
154
+ return this.request('PUT', '/permissions', body, 'standard', options);
151
155
  },
152
156
  /** GET /users/search */
153
- searchUsers: (params) => {
154
- return this.request('GET', this.buildPath('/users/search', params));
157
+ searchUsers: (params, options) => {
158
+ return this.request('GET', this.buildPath('/users/search', params), undefined, 'standard', options);
155
159
  },
156
160
  /** GET /groups */
157
- listGroups: () => {
158
- return this.request('GET', '/groups');
161
+ listGroups: (options) => {
162
+ return this.request('GET', '/groups', undefined, 'standard', options);
159
163
  },
160
164
  /** GET /users/:userId */
161
- getUserMetadata: (params) => {
162
- return this.request('GET', this.buildPath('/users/:userId', params));
165
+ getUserMetadata: (params, options) => {
166
+ return this.request('GET', this.buildPath('/users/:userId', params), undefined, 'standard', options);
167
+ },
168
+ /** POST /users/batch */
169
+ batchGetUserMetadata: (body, options) => {
170
+ return this.request('POST', '/users/batch', body, 'standard', options, true);
163
171
  },
164
172
  };
165
173
  this.groups = {
166
174
  /** GET /groups/internal */
167
- getInternal: () => {
168
- return this.request('GET', '/groups/internal');
175
+ getInternal: (options) => {
176
+ return this.request('GET', '/groups/internal', undefined, 'standard', options);
169
177
  },
170
178
  /** PUT /groups/internal */
171
- updateInternal: (body) => {
172
- return this.request('PUT', '/groups/internal', body);
179
+ updateInternal: (body, options) => {
180
+ return this.request('PUT', '/groups/internal', body, 'standard', options);
173
181
  },
174
182
  /** GET /groups/search */
175
- searchExternal: (params) => {
176
- return this.request('GET', this.buildPath('/groups/search', params));
183
+ searchExternal: (params, options) => {
184
+ return this.request('GET', this.buildPath('/groups/search', params), undefined, 'standard', options);
177
185
  },
178
186
  };
179
187
  this.user = {
180
188
  /** GET /whoami */
181
- whoami: () => {
182
- return this.request('GET', '/whoami');
189
+ whoami: (options) => {
190
+ return this.request('GET', '/whoami', undefined, 'standard', options);
183
191
  },
184
192
  };
185
193
  this.schema = {
186
194
  /** GET /:branch/schema */
187
- get: (params) => {
188
- return this.request('GET', this.buildPath('/:branch/schema', params));
195
+ get: (params, options) => {
196
+ return this.request('GET', this.buildPath('/:branch/schema', params), undefined, 'standard', options);
189
197
  },
190
198
  /** GET /:branch/schema/collection/...collectionPath */
191
- getCollection: (params) => {
192
- return this.request('GET', this.buildPath('/:branch/schema/collection/...collectionPath', params));
199
+ getCollection: (params, options) => {
200
+ return this.request('GET', this.buildPath('/:branch/schema/collection/...collectionPath', params), undefined, 'standard', options);
193
201
  },
194
202
  /** POST /:branch/schema/collections */
195
- createCollection: (params, body) => {
196
- return this.request('POST', this.buildPath('/:branch/schema/collections', params), body);
203
+ createCollection: (params, body, options) => {
204
+ return this.request('POST', this.buildPath('/:branch/schema/collections', params), body, 'standard', options);
197
205
  },
198
206
  /** PATCH /:branch/schema/collection/...collectionPath */
199
- updateCollection: (params, body) => {
200
- return this.request('PATCH', this.buildPath('/:branch/schema/collection/...collectionPath', params), body);
207
+ updateCollection: (params, body, options) => {
208
+ return this.request('PATCH', this.buildPath('/:branch/schema/collection/...collectionPath', params), body, 'standard', options);
201
209
  },
202
210
  /** DELETE /:branch/schema/collection/...collectionPath */
203
- deleteCollection: (params) => {
204
- return this.request('DELETE', this.buildPath('/:branch/schema/collection/...collectionPath', params));
211
+ deleteCollection: (params, options) => {
212
+ return this.request('DELETE', this.buildPath('/:branch/schema/collection/...collectionPath', params), undefined, 'standard', options);
205
213
  },
206
214
  /** POST /:branch/schema/entry-types/...collectionPath */
207
- addEntryType: (params, body) => {
208
- return this.request('POST', this.buildPath('/:branch/schema/entry-types/...collectionPath', params), body);
215
+ addEntryType: (params, body, options) => {
216
+ return this.request('POST', this.buildPath('/:branch/schema/entry-types/...collectionPath', params), body, 'standard', options);
209
217
  },
210
218
  /** PATCH /:branch/schema/entry-types/:entryTypeName/...collectionPath */
211
- updateEntryType: (params, body) => {
212
- return this.request('PATCH', this.buildPath('/:branch/schema/entry-types/:entryTypeName/...collectionPath', params), body);
219
+ updateEntryType: (params, body, options) => {
220
+ return this.request('PATCH', this.buildPath('/:branch/schema/entry-types/:entryTypeName/...collectionPath', params), body, 'standard', options);
213
221
  },
214
222
  /** DELETE /:branch/schema/entry-types/:entryTypeName/...collectionPath */
215
- removeEntryType: (params) => {
216
- return this.request('DELETE', this.buildPath('/:branch/schema/entry-types/:entryTypeName/...collectionPath', params));
223
+ removeEntryType: (params, options) => {
224
+ return this.request('DELETE', this.buildPath('/:branch/schema/entry-types/:entryTypeName/...collectionPath', params), undefined, 'standard', options);
217
225
  },
218
226
  /** PATCH /:branch/schema/order/...collectionPath */
219
- updateOrder: (params, body) => {
220
- return this.request('PATCH', this.buildPath('/:branch/schema/order/...collectionPath', params), body);
227
+ updateOrder: (params, body, options) => {
228
+ return this.request('PATCH', this.buildPath('/:branch/schema/order/...collectionPath', params), body, 'standard', options);
221
229
  },
222
230
  /** POST /:branch/schema/invalidate-cache */
223
- invalidateSchemaCache: (params) => {
224
- return this.request('POST', this.buildPath('/:branch/schema/invalidate-cache', params));
231
+ invalidateSchemaCache: (params, options) => {
232
+ return this.request('POST', this.buildPath('/:branch/schema/invalidate-cache', params), undefined, 'standard', options);
225
233
  },
226
234
  };
227
235
  this.admin = {
228
236
  /** GET /admin/branch-health */
229
- branchHealth: () => {
230
- return this.request('GET', '/admin/branch-health');
237
+ branchHealth: (params, options) => {
238
+ return this.request('GET', this.buildPath('/admin/branch-health', params), undefined, 'long', options);
231
239
  },
232
240
  /** POST /admin/branch-dirs/:dirName/purge */
233
- purgeBranchDir: (params) => {
234
- return this.request('POST', this.buildPath('/admin/branch-dirs/:dirName/purge', params));
241
+ purgeBranchDir: (params, options) => {
242
+ return this.request('POST', this.buildPath('/admin/branch-dirs/:dirName/purge', params), undefined, 'long', options);
235
243
  },
236
244
  /** POST /admin/branch-dirs/:dirName/repair-metadata */
237
- repairBranchDir: (params) => {
238
- return this.request('POST', this.buildPath('/admin/branch-dirs/:dirName/repair-metadata', params));
245
+ repairBranchDir: (params, options) => {
246
+ return this.request('POST', this.buildPath('/admin/branch-dirs/:dirName/repair-metadata', params), undefined, 'long', options);
239
247
  },
240
248
  /** POST /admin/branch-dirs/:dirName/repair-content-duplicates */
241
- repairContentDuplicates: (params) => {
242
- return this.request('POST', this.buildPath('/admin/branch-dirs/:dirName/repair-content-duplicates', params));
249
+ repairContentDuplicates: (params, options) => {
250
+ return this.request('POST', this.buildPath('/admin/branch-dirs/:dirName/repair-content-duplicates', params), undefined, 'long', options);
243
251
  },
244
252
  /** GET /admin/status */
245
- status: () => {
246
- return this.request('GET', '/admin/status');
253
+ status: (options) => {
254
+ return this.request('GET', '/admin/status', undefined, 'standard', options);
247
255
  },
248
256
  /** GET /admin/tasks/:status */
249
- listTasks: (params) => {
250
- return this.request('GET', this.buildPath('/admin/tasks/:status', params));
257
+ listTasks: (params, options) => {
258
+ return this.request('GET', this.buildPath('/admin/tasks/:status', params), undefined, 'standard', options);
251
259
  },
252
260
  /** POST /admin/tasks/:taskId/retry */
253
- retryTask: (params) => {
254
- return this.request('POST', this.buildPath('/admin/tasks/:taskId/retry', params));
261
+ retryTask: (params, options) => {
262
+ return this.request('POST', this.buildPath('/admin/tasks/:taskId/retry', params), undefined, 'standard', options);
255
263
  },
256
264
  /** DELETE /admin/tasks/:status/:fileName */
257
- deleteTask: (params) => {
258
- return this.request('DELETE', this.buildPath('/admin/tasks/:status/:fileName', params));
265
+ deleteTask: (params, options) => {
266
+ return this.request('DELETE', this.buildPath('/admin/tasks/:status/:fileName', params), undefined, 'standard', options);
259
267
  },
260
268
  };
261
269
  this.baseUrl = options.baseUrl ?? '/api/canopycms';
@@ -263,6 +271,8 @@ export class CanopyApiClient {
263
271
  this.fetchFn = options.fetch ?? (typeof window !== 'undefined' ? fetch.bind(window) : fetch);
264
272
  this.trailingSlash = options.trailingSlash ?? readTrailingSlashEnv();
265
273
  this.onUnauthorized = options.onUnauthorized;
274
+ this.editorMode = options.editorMode;
275
+ this.onEditorModeMismatch = options.onEditorModeMismatch;
266
276
  }
267
277
  buildPath(template, params) {
268
278
  let result = template;
@@ -293,11 +303,21 @@ export class CanopyApiClient {
293
303
  }
294
304
  return result;
295
305
  }
296
- async request(method, path, body, headers = {}) {
306
+ /** One API call, 429 resends included, under the deadline `timeout` and `options` give it. */
307
+ request(method, path, body, timeout, options, readOnly = method === 'GET') {
308
+ return runWithDeadline((signal) => this.send(method, path, body, signal), {
309
+ method,
310
+ path,
311
+ readOnly,
312
+ timeoutMs: resolveTimeoutMs(timeout, options),
313
+ signal: options?.signal,
314
+ });
315
+ }
316
+ async send(method, path, body, signal) {
297
317
  const url = `${this.baseUrl}${this.trailingSlash ? withTrailingSlash(path) : path}`;
298
- const requestHeaders = {
299
- ...headers,
300
- };
318
+ const requestHeaders = {};
319
+ if (this.editorMode)
320
+ requestHeaders[EDITOR_MODE_HEADER] = this.editorMode;
301
321
  let requestBody;
302
322
  if (body !== undefined) {
303
323
  if (body instanceof FormData) {
@@ -322,10 +342,13 @@ export class CanopyApiClient {
322
342
  const init = {
323
343
  method,
324
344
  headers: requestHeaders,
345
+ signal,
325
346
  };
326
347
  if (requestBody !== undefined) {
327
348
  init.body = requestBody;
328
349
  }
350
+ // Hashing the body is async, so the deadline may already have passed: send nothing then.
351
+ signal.throwIfAborted();
329
352
  let response = await this.fetchFn(url, init);
330
353
  // A body from in front of the API (a proxy or CDN error page) may be empty, not JSON, or
331
354
  // not an ApiResponse; every such body becomes an `ok: false` ApiResponse, never a throw.
@@ -338,13 +361,20 @@ export class CanopyApiClient {
338
361
  if (delay === undefined)
339
362
  break;
340
363
  await sleep(delay);
364
+ signal.throwIfAborted();
341
365
  response = await this.fetchFn(url, init);
342
366
  parsed = await response.json().catch(() => undefined);
343
367
  }
344
- if (response.status === 401) {
368
+ // The body's status is the signal: `unauthenticatedStatus` may send it under HTTP 419.
369
+ if (response.status === 401 || (isApiResponseBody(parsed) && parsed.status === 401)) {
345
370
  this.onUnauthorized?.();
346
371
  return { ok: false, status: 401, error: errorFromBody(parsed) ?? 'Unauthorized' };
347
372
  }
373
+ if (isApiResponseBody(parsed) &&
374
+ parsed.status === EDITOR_MODE_MISMATCH_STATUS &&
375
+ parsed.code === 'EDITOR_MODE_MISMATCH') {
376
+ this.onEditorModeMismatch?.();
377
+ }
348
378
  if (isApiResponseBody(parsed))
349
379
  return parsed;
350
380
  const converted = {
@@ -361,13 +391,13 @@ export class CanopyApiClient {
361
391
  * clears as they finish, so the waits span a few seconds.
362
392
  */
363
393
  const THROTTLE_RETRY_DELAYS_MS = [250, 1000, 3000];
364
- /** The longest `Retry-After` waited; a throttle asking for longer is reported, not resent. */
394
+ /** The longest `Retry-After` honoured; a throttle asking for longer is reported, not resent. */
365
395
  const MAX_RETRY_AFTER_MS = 5000;
366
396
  /**
367
397
  * The wait before resend `attempt`, or undefined when there is to be no resend: the attempts
368
- * are used up, or `Retry-After` asks for longer than {@link MAX_RETRY_AFTER_MS}. Without a
369
- * `Retry-After`, the base delay plus up to half again, so throttled requests do not resend in
370
- * lockstep.
398
+ * are used up, or `Retry-After` asks for longer than {@link MAX_RETRY_AFTER_MS}. The base delay,
399
+ * or `Retry-After` when longer, plus up to half the base again, so requests throttled in one
400
+ * burst do not resend in lockstep.
371
401
  */
372
402
  function throttleRetryDelayMs(response, attempt) {
373
403
  const base = THROTTLE_RETRY_DELAYS_MS[attempt];
@@ -377,11 +407,14 @@ function throttleRetryDelayMs(response, attempt) {
377
407
  // `fetch` option may return a Response-like without headers.
378
408
  const header = response.headers?.get('retry-after')?.trim();
379
409
  const retryAfter = header ? Number(header) : Number.NaN;
410
+ let wait = base;
380
411
  if (Number.isFinite(retryAfter) && retryAfter >= 0) {
381
412
  const ms = retryAfter * 1000;
382
- return ms > MAX_RETRY_AFTER_MS ? undefined : ms;
413
+ if (ms > MAX_RETRY_AFTER_MS)
414
+ return undefined;
415
+ wait = Math.max(ms, base);
383
416
  }
384
- return base + Math.random() * base * 0.5;
417
+ return wait + Math.random() * base * 0.5;
385
418
  }
386
419
  function sleep(ms) {
387
420
  return new Promise((resolve) => setTimeout(resolve, ms));
@@ -1,15 +1,21 @@
1
1
  import { z } from 'zod';
2
2
  import type { ApiResponse } from './types.js';
3
3
  import type { CommentThread, CommentType } from '../comment-store.js';
4
+ import type { UserProfile } from '../auth/types.js';
5
+ import type { LogicalPath } from '../paths/types.js';
4
6
  export interface AddCommentBody {
5
7
  text: string;
6
8
  threadId?: string;
7
9
  type: CommentType;
8
10
  entryPath?: string;
9
11
  canopyPath?: string;
12
+ /** For a new field thread: the key of each list item on `canopyPath` (`CommentThread.itemKeys`). */
13
+ itemKeys?: string[];
10
14
  }
11
15
  interface ListCommentsResponse {
12
16
  threads: CommentThread[];
17
+ /** Profiles of the people who wrote or resolved `threads`, in no order; unknown ids are absent. */
18
+ users: UserProfile[];
13
19
  }
14
20
  /** Response type for listing comments */
15
21
  export type CommentsResponse = ApiResponse<ListCommentsResponse>;
@@ -48,19 +54,22 @@ export declare const COMMENT_ROUTES: {
48
54
  text: z.ZodString;
49
55
  threadId: z.ZodOptional<z.ZodString>;
50
56
  type: z.ZodEnum<["field", "entry", "branch"]>;
51
- entryPath: z.ZodOptional<z.ZodType<import("../paths/index.js").LogicalPath, z.ZodTypeDef, import("../paths/index.js").LogicalPath>>;
57
+ entryPath: z.ZodOptional<z.ZodType<LogicalPath, z.ZodTypeDef, LogicalPath>>;
52
58
  canopyPath: z.ZodOptional<z.ZodString>;
59
+ itemKeys: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
53
60
  }, "strip", z.ZodTypeAny, {
54
61
  type: "branch" | "entry" | "field";
55
62
  text: string;
56
- entryPath?: import("../paths/index.js").LogicalPath | undefined;
63
+ entryPath?: LogicalPath | undefined;
57
64
  threadId?: string | undefined;
65
+ itemKeys?: string[] | undefined;
58
66
  canopyPath?: string | undefined;
59
67
  }, {
60
68
  type: "branch" | "entry" | "field";
61
69
  text: string;
62
- entryPath?: import("../paths/index.js").LogicalPath | undefined;
70
+ entryPath?: LogicalPath | undefined;
63
71
  threadId?: string | undefined;
72
+ itemKeys?: string[] | undefined;
64
73
  canopyPath?: string | undefined;
65
74
  }>, AddCommentResponse>;
66
75
  readonly resolve: import("./route-builder.js").RouteDefinition<z.ZodObject<{