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
@@ -5,7 +5,7 @@ import type { LogicalPath, PhysicalPath, Slug, ContentId } from '../paths/types.
5
5
  /**
6
6
  * Summary of an entry type for client display.
7
7
  * Simplified from EntryTypeConfig - doesn't include full field definitions.
8
- * @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md.
8
+ * @internal No importer; deletion candidate in safeinsights/canopycms#725.
9
9
  */
10
10
  export interface EntryTypeSummary {
11
11
  name: string;
@@ -28,7 +28,7 @@ export interface CollectionItem {
28
28
  exists?: boolean;
29
29
  canEdit?: boolean;
30
30
  }
31
- /** @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md. */
31
+ /** @internal No importer; deletion candidate in safeinsights/canopycms#725. */
32
32
  export interface ListEntriesParams {
33
33
  branch: string;
34
34
  collection?: LogicalPath;
@@ -37,8 +37,15 @@ export interface ListEntriesParams {
37
37
  q?: string;
38
38
  recursive?: boolean;
39
39
  }
40
+ /** Whether the caller may add an entry to a listed collection. */
41
+ export interface CollectionAccess {
42
+ logicalPath: LogicalPath;
43
+ canAddEntry: boolean;
44
+ }
40
45
  export interface ListEntriesResponse {
41
46
  entries: CollectionItem[];
47
+ /** One per listed collection, on every page. */
48
+ collectionAccess?: CollectionAccess[];
42
49
  pagination: {
43
50
  cursor?: string;
44
51
  hasMore: boolean;
@@ -78,10 +85,32 @@ export declare const listEntries: import("./route-builder.js").RouteDefinition<z
78
85
  cursor?: string | undefined;
79
86
  limit?: number | undefined;
80
87
  }>, undefined, EntriesResponse>;
88
+ /** A readable entry that references the entry a delete targets. */
89
+ interface ReferencingEntrySummary {
90
+ entryPath: LogicalPath;
91
+ contentId: ContentId;
92
+ title: string;
93
+ /** Reference fields holding the target's id, e.g. `author` or `blocks[0].cta.target`. */
94
+ fields: string[];
95
+ /** Where its strings, the md/mdx body included, link to the target with `entry:<id>`. */
96
+ links: string[];
97
+ }
98
+ /** Who references an entry, as far as the requesting user may know. */
99
+ export interface EntryReferencedBy {
100
+ entries: ReferencingEntrySummary[];
101
+ /** Referencing entries the user may not read: counted, never described. */
102
+ hiddenCount: number;
103
+ }
81
104
  /** Response type for deleting an entry */
82
105
  export type DeleteEntryResponse = ApiResponse<{
83
106
  deleted: boolean;
84
107
  contentId?: string;
108
+ /**
109
+ * Set, with status 409 and `deleted: false`, when other entries reference this one and the
110
+ * request did not pass `confirmReferenced`. Its presence is what tells this 409 apart from
111
+ * an edit conflict. Re-sending with `confirmReferenced=true` deletes anyway.
112
+ */
113
+ referencedBy?: EntryReferencedBy;
85
114
  /**
86
115
  * Set when the entry deleted successfully but the collection's order array couldn't be updated
87
116
  * afterward (C6: best-effort hygiene after the delete, so its failure must not present as a
@@ -94,6 +123,8 @@ export type DeleteEntryResponse = ApiResponse<{
94
123
  export declare const deleteEntry: import("./route-builder.js").RouteDefinition<z.ZodObject<{
95
124
  branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
96
125
  entryPath: z.ZodType<LogicalPath, z.ZodTypeDef, LogicalPath>;
126
+ /** Delete even though other entries reference this one (query param). */
127
+ confirmReferenced: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodEnum<["true", "false"]>]>, boolean, boolean | "true" | "false">>;
97
128
  }, "strip", z.ZodTypeAny, {
98
129
  branch: string & {
99
130
  readonly __brand: "BranchName";
@@ -101,6 +132,7 @@ export declare const deleteEntry: import("./route-builder.js").RouteDefinition<z
101
132
  entryPath: string & {
102
133
  readonly __brand: "LogicalPath";
103
134
  };
135
+ confirmReferenced?: boolean | undefined;
104
136
  }, {
105
137
  branch: string & {
106
138
  readonly __brand: "BranchName";
@@ -108,6 +140,7 @@ export declare const deleteEntry: import("./route-builder.js").RouteDefinition<z
108
140
  entryPath: string & {
109
141
  readonly __brand: "LogicalPath";
110
142
  };
143
+ confirmReferenced?: boolean | "true" | "false" | undefined;
111
144
  }>, undefined, DeleteEntryResponse>;
112
145
  /**
113
146
  * Exported routes for router registration
@@ -142,6 +175,8 @@ export declare const ENTRY_ROUTES: {
142
175
  readonly delete: import("./route-builder.js").RouteDefinition<z.ZodObject<{
143
176
  branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
144
177
  entryPath: z.ZodType<LogicalPath, z.ZodTypeDef, LogicalPath>;
178
+ /** Delete even though other entries reference this one (query param). */
179
+ confirmReferenced: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodEnum<["true", "false"]>]>, boolean, boolean | "true" | "false">>;
145
180
  }, "strip", z.ZodTypeAny, {
146
181
  branch: string & {
147
182
  readonly __brand: "BranchName";
@@ -149,6 +184,7 @@ export declare const ENTRY_ROUTES: {
149
184
  entryPath: string & {
150
185
  readonly __brand: "LogicalPath";
151
186
  };
187
+ confirmReferenced?: boolean | undefined;
152
188
  }, {
153
189
  branch: string & {
154
190
  readonly __brand: "BranchName";
@@ -156,5 +192,7 @@ export declare const ENTRY_ROUTES: {
156
192
  entryPath: string & {
157
193
  readonly __brand: "LogicalPath";
158
194
  };
195
+ confirmReferenced?: boolean | "true" | "false" | undefined;
159
196
  }>, undefined, DeleteEntryResponse>;
160
197
  };
198
+ export {};
@@ -7,9 +7,10 @@ import { getErrorMessage, isNotFoundError, sanitizeErrorMessage } from '../utils
7
7
  import { createDebugLogger } from '../utils/debug.js';
8
8
  import { resolveEntryTitle } from '../utils/title-field.js';
9
9
  import { branchNameSchema, logicalPathSchema, queryBooleanSchema } from './validators.js';
10
- import { MAX_ENTRIES_PER_PAGE, DEFAULT_ENTRIES_LIMIT } from './entries-constants.js';
10
+ import { MAX_ENTRIES_PER_PAGE, DEFAULT_ENTRIES_LIMIT, ENTRY_CHANGED_MESSAGE, } from './entries-constants.js';
11
11
  import { SchemaOps, SchemaStoreBusyError } from '../schema/schema-store.js';
12
- import { listCollectionEntries as listCollectionEntriesShared, sortByOrder, } from '../content-listing.js';
12
+ import { listCollectionEntries as listCollectionEntriesShared, listEntries as listContentEntries, sortByOrder, } from '../content-listing.js';
13
+ import { findReferencingEntries } from '../validation/deletion-checker.js';
13
14
  // Re-export pagination constants from the dependency-free module so they remain
14
15
  // part of the entries API surface without pulling server deps into client bundles.
15
16
  const log = createDebugLogger({ prefix: 'EntriesAPI' });
@@ -122,11 +123,20 @@ const listEntriesHandler = async (gc, ctx, req, params) => {
122
123
  const search = params.q?.toLowerCase();
123
124
  const recursive = params.recursive ?? false;
124
125
  let entries = [];
126
+ let collectionAccess = [];
125
127
  try {
126
128
  // Build the access checker once per request: permissions (and, in modes with a
127
129
  // separate settings branch, the settings workspace) are loaded a single time and
128
130
  // reused for every entry, instead of re-loading per entry inside the loop.
129
131
  const checkAccess = await ctx.services.createContentAccessChecker(branchContext, root, req.user);
132
+ // A new entry's slug is unknown, so the probe is one no slug can be: a rule for the whole
133
+ // collection decides, never one for a particular entry. The create itself is checked again.
134
+ collectionAccess = targetCollections
135
+ .filter((item) => item.type === 'collection')
136
+ .map((item) => ({
137
+ logicalPath: item.logicalPath,
138
+ canAddEntry: checkAccess(`${item.logicalPath}/*`, 'edit').allowed,
139
+ }));
130
140
  if (recursive && targetPath) {
131
141
  // Recursive mode: list entries from target collection and all its children
132
142
  const items = await listCollectionEntriesRecursive(root, targetPath, flatCollections);
@@ -164,6 +174,7 @@ const listEntriesHandler = async (gc, ctx, req, params) => {
164
174
  status: 200,
165
175
  data: {
166
176
  entries: paged,
177
+ collectionAccess,
167
178
  pagination: {
168
179
  cursor: nextCursor,
169
180
  hasMore: Boolean(nextCursor),
@@ -198,9 +209,66 @@ export const listEntries = defineEndpoint({
198
209
  const deleteEntryParamsSchema = z.object({
199
210
  branch: branchNameSchema,
200
211
  entryPath: logicalPathSchema, // Format: collectionPath/slug
212
+ /** Delete even though other entries reference this one (query param). */
213
+ confirmReferenced: queryBooleanSchema.optional(),
201
214
  });
215
+ /** Every entry of an `unavailable` entry type on the branch. */
216
+ const listUnavailableEntries = async (branchRoot, flatSchema) => {
217
+ const collections = flatSchema.filter((item) => item.type === 'collection' && item.entries?.some((e) => e.unavailable));
218
+ const listed = await Promise.all(collections.map((collection) => listCollectionEntriesShared(branchRoot, collection)));
219
+ return listed.flat().filter((item) => {
220
+ const collection = collections.find((c) => c.logicalPath === item.collectionPath);
221
+ return (collection?.type === 'collection' &&
222
+ collection.entries?.some((e) => e.name === item.entryType && e.unavailable));
223
+ });
224
+ };
202
225
  /**
203
- * Delete an entry and update the collection's order array.
226
+ * Every entry on the branch that references `contentId`, split by whether `user` may read it.
227
+ * A full raw scan of the branch's content: references are stored only on the referencing
228
+ * side, so there is no index to ask. Null when nothing references it.
229
+ */
230
+ const findReferencedBy = async (branchContext, ctx, req, contentId) => {
231
+ const { branchRoot, flatSchema } = branchContext;
232
+ const listed = await listContentEntries(branchRoot, flatSchema, ctx.services.config.contentRoot || 'content');
233
+ // listEntries leaves out entries of an unavailable type; scanned raw, they still count.
234
+ const unavailable = await listUnavailableEntries(branchRoot, flatSchema);
235
+ const entries = [
236
+ ...listed,
237
+ ...unavailable.map((item) => ({
238
+ entryPath: item.logicalPath,
239
+ entryId: item.contentId,
240
+ slug: item.slug,
241
+ collectionPath: item.collectionPath,
242
+ entryType: item.entryType,
243
+ data: item.data,
244
+ schemaUnavailable: true,
245
+ })),
246
+ ];
247
+ const referencing = findReferencingEntries(entries, contentId);
248
+ if (referencing.length === 0)
249
+ return null;
250
+ const canAccess = await ctx.services.createContentAccessChecker(branchContext, branchRoot, req.user);
251
+ const visible = [];
252
+ for (const { entry, fields, links } of referencing) {
253
+ if (!canAccess(entry.entryPath, 'read').allowed)
254
+ continue;
255
+ const collection = flatSchema.find((item) => item.type === 'collection' && item.logicalPath === entry.collectionPath);
256
+ const entryType = collection?.type === 'collection'
257
+ ? collection.entries?.find((e) => e.name === entry.entryType)
258
+ : undefined;
259
+ visible.push({
260
+ entryPath: entry.entryPath,
261
+ contentId: entry.entryId,
262
+ title: extractTitle(entry.data, entryType, entry.slug),
263
+ fields,
264
+ links,
265
+ });
266
+ }
267
+ return { entries: visible, hiddenCount: referencing.length - visible.length };
268
+ };
269
+ /**
270
+ * Delete an entry and update the collection's order array. An entry other entries reference
271
+ * is deleted only with `confirmReferenced`; without it the response is a 409 naming them.
204
272
  * DELETE /:branch/entries/...entryPath
205
273
  * Note: Uses catch-all to support paths with slashes (e.g., content/posts/hello-world)
206
274
  */
@@ -278,10 +346,40 @@ const deleteEntryHandler = async (gc, ctx, req, params) => {
278
346
  error: 'Edit permission required to delete entry',
279
347
  };
280
348
  }
349
+ // Before the reference scan, whose 409 would otherwise answer first; mapped to a 503.
350
+ await contentStore.assertEntryAvailable(collectionLogicalPath, entrySlug);
281
351
  let orderCleanupWarning;
282
352
  try {
283
353
  // Get the entry's content ID before deleting (for order update)
284
354
  const contentId = await contentStore.getIdForEntry(collectionLogicalPath, entrySlug);
355
+ // Advisory: a reference saved between this scan and the delete below still dangles.
356
+ if (contentId && !params.confirmReferenced) {
357
+ let referencedBy;
358
+ try {
359
+ referencedBy = await findReferencedBy(branchContext, ctx, req, contentId);
360
+ }
361
+ catch (err) {
362
+ // Outside the catch below, which would report a file vanishing mid-scan as this entry.
363
+ log.warn('delete-entry', 'Reference scan failed', {
364
+ entryPath,
365
+ error: getErrorMessage(err),
366
+ });
367
+ return {
368
+ ok: false,
369
+ status: 500,
370
+ error: 'Could not check which entries reference this one; try again',
371
+ };
372
+ }
373
+ if (referencedBy) {
374
+ const count = referencedBy.entries.length + referencedBy.hiddenCount;
375
+ return {
376
+ ok: false,
377
+ status: 409,
378
+ error: `Entry is referenced by ${count} other ${count === 1 ? 'entry' : 'entries'}`,
379
+ data: { deleted: false, contentId, referencedBy },
380
+ };
381
+ }
382
+ }
285
383
  await contentStore.delete(collectionLogicalPath, entrySlug);
286
384
  // Construct exactly like api/schema.ts's getSchemaOps (content root, registry, services,
287
385
  // branch root) so updateOrder's write bumps the schema generation marker — without it, every
@@ -328,9 +426,7 @@ const deleteEntryHandler = async (gc, ctx, req, params) => {
328
426
  return {
329
427
  ok: false,
330
428
  status: 409,
331
- error: err instanceof BranchSyncingError
332
- ? err.message
333
- : 'Content conflict: entry was modified by another editor',
429
+ error: err instanceof BranchSyncingError ? err.message : ENTRY_CHANGED_MESSAGE,
334
430
  };
335
431
  }
336
432
  return {
@@ -8,11 +8,21 @@ export interface GitHubSyncResult {
8
8
  prUrl?: string;
9
9
  prNumber?: number;
10
10
  syncStatus?: SyncStatus;
11
+ /** Client-safe reason a direct GitHub call failed, recorded as the branch's syncFailureReason. */
12
+ syncFailureReason?: string;
13
+ /** GitHub refused the PR because the pushed branch has no commits its base lacks. */
14
+ nothingToSubmit?: boolean;
15
+ /** The direct path, whose submit pushes to GitHub itself: the branch is there whatever the PR call did. */
16
+ pushedToGitHub?: boolean;
11
17
  }
12
18
  /** What the PR body records about a submit. */
13
19
  export interface SubmissionRecord {
14
20
  submitter?: SubmissionEditor;
21
+ /** Every recorded editor of the branch; the PR body lists those other than the submitter. */
22
+ editors?: readonly SubmissionEditor[];
15
23
  changedPaths: readonly string[];
24
+ /** The submit's `submittedAt`, carried to the worker so its failure handling targets this submit. */
25
+ submittedAt?: string;
16
26
  }
17
27
  /**
18
28
  * Uses githubService directly if available, otherwise queues a task for the worker.
@@ -26,3 +36,12 @@ export declare function syncSubmitPr(ctx: ApiContext, context: BranchContext, su
26
36
  * available, otherwise queues a task.
27
37
  */
28
38
  export declare function syncConvertToDraft(ctx: ApiContext, context: BranchContext): Promise<void>;
39
+ /**
40
+ * Used by delete, after the local delete succeeded. Deletes the branch on GitHub when the CMS
41
+ * put it there: a recorded PR number or `pushedToGitHubAt` stamp is the proof (a submit whose PR
42
+ * GitHub refused pushed the branch but has no PR number). Without either, a same-named GitHub
43
+ * branch is someone else's (the create-time collision check is best-effort) and is never touched.
44
+ *
45
+ * Returns a client-facing warning when the delete could not be done or queued; never throws.
46
+ */
47
+ export declare function syncDeleteRemoteBranch(ctx: ApiContext, context: BranchContext): Promise<string | undefined>;
@@ -1,9 +1,11 @@
1
1
  import { enqueueTask } from '../task-queue/cms-task-queue.js';
2
2
  import { getTaskQueueDir } from '../task-queue/task-queue-config.js';
3
3
  import { clientOperatingStrategy } from '../operating-mode/index.js';
4
- import { getErrorMessage } from '../utils/error.js';
4
+ import { getErrorMessage, sanitizeErrorMessage } from '../utils/error.js';
5
5
  import { sanitizeBranchName } from '../paths/branch-name.js';
6
6
  import { buildPrSection, mergePrSection } from '../submission-attribution.js';
7
+ import { isNoCommitsBetweenError, isRefAlreadyGoneError } from '../github-service.js';
8
+ import { baseBranchOf } from '../utils/base-branch.js';
7
9
  /**
8
10
  * Uses githubService directly if available, otherwise queues a task for the worker.
9
11
  *
@@ -17,10 +19,11 @@ export async function syncSubmitPr(ctx, context, submission) {
17
19
  const prSection = buildPrSection({
18
20
  description: context.branch.description,
19
21
  submitter: submission.submitter,
22
+ editors: submission.editors,
20
23
  changedPaths: submission.changedPaths,
21
24
  });
22
25
  // Target the fork point recorded at branch creation when available.
23
- const baseBranch = context.branch.baseBranch ?? ctx.services.config.defaultBaseBranch ?? 'main';
26
+ const baseBranch = context.branch.baseBranch ?? baseBranchOf(ctx.services.config);
24
27
  if (!clientOperatingStrategy(mode).supportsPullRequests()) {
25
28
  return {};
26
29
  }
@@ -64,6 +67,7 @@ export async function syncSubmitPr(ctx, context, submission) {
64
67
  prUrl: context.branch.pullRequestUrl,
65
68
  prNumber: context.branch.pullRequestNumber,
66
69
  syncStatus: 'synced',
70
+ pushedToGitHub: true,
67
71
  };
68
72
  }
69
73
  else {
@@ -91,16 +95,21 @@ export async function syncSubmitPr(ctx, context, submission) {
91
95
  prUrl: result.url,
92
96
  prNumber: result.number,
93
97
  syncStatus: 'synced',
98
+ pushedToGitHub: true,
94
99
  };
95
100
  }
96
101
  }
97
102
  catch (err) {
98
- const message = err instanceof Error ? err.message : 'Unknown error';
103
+ const message = getErrorMessage(err);
99
104
  console.error(`CanopyCMS: Failed to create/update PR for ${context.branch.name}:`, message);
105
+ if (isNoCommitsBetweenError(err))
106
+ return { nothingToSubmit: true, pushedToGitHub: true };
100
107
  return {
101
108
  prUrl: context.branch.pullRequestUrl,
102
109
  prNumber: context.branch.pullRequestNumber,
103
110
  syncStatus: 'sync-failed',
111
+ syncFailureReason: sanitizeErrorMessage(message),
112
+ pushedToGitHub: true,
104
113
  };
105
114
  }
106
115
  }
@@ -123,6 +132,7 @@ export async function syncSubmitPr(ctx, context, submission) {
123
132
  // A content submit is an explicit "ready for review" action: convert a
124
133
  // pre-existing draft PR to ready.
125
134
  markReadyIfDraft: true,
135
+ submittedAt: submission.submittedAt,
126
136
  },
127
137
  });
128
138
  }
@@ -156,6 +166,43 @@ export async function syncConvertToDraft(ctx, context) {
156
166
  });
157
167
  }
158
168
  }
169
+ /**
170
+ * Used by delete, after the local delete succeeded. Deletes the branch on GitHub when the CMS
171
+ * put it there: a recorded PR number or `pushedToGitHubAt` stamp is the proof (a submit whose PR
172
+ * GitHub refused pushed the branch but has no PR number). Without either, a same-named GitHub
173
+ * branch is someone else's (the create-time collision check is best-effort) and is never touched.
174
+ *
175
+ * Returns a client-facing warning when the delete could not be done or queued; never throws.
176
+ */
177
+ export async function syncDeleteRemoteBranch(ctx, context) {
178
+ const { pullRequestNumber, pushedToGitHubAt } = context.branch;
179
+ if (!pullRequestNumber && !pushedToGitHubAt)
180
+ return undefined;
181
+ const { githubService } = ctx.services;
182
+ const branch = context.branch.name;
183
+ if (githubService) {
184
+ try {
185
+ await githubService.deleteBranch(branch);
186
+ }
187
+ catch (err) {
188
+ if (isRefAlreadyGoneError(err))
189
+ return undefined;
190
+ console.error(`CanopyCMS: Failed to delete GitHub branch for ${branch}:`, getErrorMessage(err));
191
+ return 'The branch could not be deleted on GitHub; delete it there by hand';
192
+ }
193
+ return undefined;
194
+ }
195
+ const mode = ctx.services.config.mode;
196
+ if (!clientOperatingStrategy(mode).supportsPullRequests())
197
+ return undefined;
198
+ const result = await enqueueGitHubTask(ctx, context, {
199
+ action: 'delete-remote-branch',
200
+ payload: { branch, pullRequestNumber, pushedToGitHubAt },
201
+ });
202
+ return result.syncStatus === 'sync-failed'
203
+ ? 'Deleting the branch on GitHub could not be queued; delete it there by hand'
204
+ : undefined;
205
+ }
159
206
  async function enqueueGitHubTask(ctx, context, task) {
160
207
  const taskDir = getTaskQueueDir(ctx.services.config);
161
208
  try {
@@ -59,29 +59,29 @@ export declare const GROUP_ROUTES: {
59
59
  members: z.ZodArray<z.ZodString, "many">;
60
60
  }, "strip", z.ZodTypeAny, {
61
61
  name: string;
62
- members: string[];
63
62
  id: string;
63
+ members: string[];
64
64
  description?: string | undefined;
65
65
  }, {
66
66
  name: string;
67
- members: string[];
68
67
  id: string;
68
+ members: string[];
69
69
  description?: string | undefined;
70
70
  }>, "many">;
71
71
  expectedContentVersion: z.ZodOptional<z.ZodNumber>;
72
72
  }, "strip", z.ZodTypeAny, {
73
73
  groups: {
74
74
  name: string;
75
- members: string[];
76
75
  id: string;
76
+ members: string[];
77
77
  description?: string | undefined;
78
78
  }[];
79
79
  expectedContentVersion?: number | undefined;
80
80
  }, {
81
81
  groups: {
82
82
  name: string;
83
- members: string[];
84
83
  id: string;
84
+ members: string[];
85
85
  description?: string | undefined;
86
86
  }[];
87
87
  expectedContentVersion?: number | undefined;
@@ -180,6 +180,7 @@ const updateInternalGroupsHandler = async (_gc, ctx, req, body) => {
180
180
  branchRoot: context.branchRoot,
181
181
  fileName: 'groups.json',
182
182
  message: 'Update internal groups',
183
+ actor: req.user,
183
184
  mode,
184
185
  });
185
186
  if (!commitResult.pushed) {
@@ -193,7 +194,7 @@ const updateInternalGroupsHandler = async (_gc, ctx, req, body) => {
193
194
  }
194
195
  catch (error) {
195
196
  if (error instanceof SettingsVersionConflictError) {
196
- return { ok: false, status: 409, error: error.message };
197
+ return { ok: false, status: 409, error: error.message, code: 'SETTINGS_CHANGED' };
197
198
  }
198
199
  if (error instanceof SettingsFileConflictError) {
199
200
  return { ok: false, status: 409, error: 'Settings are busy, please try again.' };
@@ -3,6 +3,8 @@
3
3
  * error response (404/403/500) to short-circuit, or produce a guard context (e.g. branch context
4
4
  * with schema) for the handler. See api/AGENTS.md for the full guard reference.
5
5
  */
6
+ import { BRANCH_METADATA_CORRUPT_MESSAGE, BranchMetadataCorruptError, } from '../branch-metadata-error.js';
7
+ import { canopyLogError } from '../utils/logger.js';
6
8
  import { isAdmin, isReviewer, isPrivileged } from '../authorization/helpers.js';
7
9
  import { getBranchProtection, getBranchWriteProtection } from '../authorization/protected-branch.js';
8
10
  function extractBranchName(params) {
@@ -92,6 +94,10 @@ const runBranchAccessWithSchemaGuard = async (ctx, req, params, accumulated) =>
92
94
  }
93
95
  return { ok: true, context: { branchContext: context } };
94
96
  };
97
+ /**
98
+ * A success records the user as an editor the next submit credits (route-builder.ts), so give
99
+ * this guard only to endpoints that change the branch's working tree.
100
+ */
95
101
  const runWritableBranchGuard = async (ctx, _req, params, accumulated) => {
96
102
  const branch = extractBranchName(params);
97
103
  if (typeof branch !== 'string')
@@ -117,8 +123,8 @@ const runWritableBranchGuard = async (ctx, _req, params, accumulated) => {
117
123
  const branchStatus = context.branch.status;
118
124
  const error = branchStatus === 'submitted'
119
125
  ? `Branch "${context.branch.name}" is submitted for review and cannot be edited. Withdraw it or request changes to resume editing.`
120
- : // Unreadable status: branch.json parses without schema validation, so a
121
- // damaged file reaches here with no status. Refuse rather than guess.
126
+ : // A branch.json without a status is refused as corrupt before this
127
+ // point; a context built elsewhere can still lack one. Refuse rather than guess.
122
128
  branchStatus === undefined
123
129
  ? `Branch "${context.branch.name}" has no readable workflow status and cannot be edited until its metadata is repaired.`
124
130
  : `Branch "${context.branch.name}" is ${branchStatus} and cannot be edited.`;
@@ -196,7 +202,21 @@ export async function executeGuards(guards, ctx, req, params) {
196
202
  const accumulated = {};
197
203
  for (const guardId of guards) {
198
204
  const runner = GUARD_RUNNERS[guardId];
199
- const result = await runner(ctx, req, params, accumulated);
205
+ let result;
206
+ try {
207
+ result = await runner(ctx, req, params, accumulated);
208
+ }
209
+ catch (err) {
210
+ // Every branch guard resolves the branch from its branch.json, and a
211
+ // corrupt one has no status or ACL anyone can trust: deny, whatever the guard.
212
+ if (!(err instanceof BranchMetadataCorruptError))
213
+ throw err;
214
+ canopyLogError(`CanopyCMS: ${err.message}`);
215
+ return {
216
+ ok: false,
217
+ response: { ok: false, status: 500, error: BRANCH_METADATA_CORRUPT_MESSAGE },
218
+ };
219
+ }
200
220
  if (!result.ok) {
201
221
  return { ok: false, response: result.response };
202
222
  }
@@ -1,5 +1,5 @@
1
1
  export type { ApiResponse, ApiRequest, ApiContext } from './types.js';
2
- export type { BranchResponse, BranchCreateResponse, BranchListResponse, BranchDeleteResponse, CreateBranchBody, UpdateBranchAccessBody, } from './branch.js';
2
+ export type { BranchListItemResponse, BranchListResponse, BranchDeleteResponse, CreateBranchBody, UpdateBranchAccessBody, } from './branch.js';
3
3
  export type { BranchMergeResponse } from './branch-merge.js';
4
4
  export type { CommentsResponse, AddCommentResponse, ResolveCommentResponse } from './comments.js';
5
5
  export type { EntriesResponse, ListEntriesResponse, CollectionItem, ListEntriesParams, DeleteEntryResponse, } from './entries.js';
@@ -16,3 +16,5 @@ export type { AdminStatusResponse, AdminStatusData, AdminTasksResponse, AdminTas
16
16
  export { USER_ROUTES } from './user.js';
17
17
  export { CanopyApiClient, createApiClient } from './client.js';
18
18
  export type { ApiClientOptions } from './client.js';
19
+ export { ApiTimeoutError, isApiTimeoutError } from './request-deadline.js';
20
+ export type { RequestOptions } from './request-deadline.js';
package/dist/api/index.js CHANGED
@@ -4,3 +4,4 @@ export { USER_ROUTES } from './user.js';
4
4
  // Import it directly from './schema.js' in server-side code when needed.
5
5
  // Export client
6
6
  export { CanopyApiClient, createApiClient } from './client.js';
7
+ export { ApiTimeoutError, isApiTimeoutError } from './request-deadline.js';
@@ -19,6 +19,10 @@ export type ListGroupsResponse = ApiResponse<{
19
19
  export type GetUserMetadataResponse = ApiResponse<{
20
20
  user: UserSearchResult | null;
21
21
  }>;
22
+ /** Response type for batch user metadata: the users found, in no guaranteed order; unknown ids are absent */
23
+ export type BatchGetUserMetadataResponse = ApiResponse<{
24
+ users: UserSearchResult[];
25
+ }>;
22
26
  declare const updatePermissionsBodySchema: z.ZodObject<{
23
27
  permissions: z.ZodArray<z.ZodObject<{
24
28
  path: z.ZodType<import("../authorization/index.js").PermissionPath, z.ZodTypeDef, import("../authorization/index.js").PermissionPath>;
@@ -142,10 +146,18 @@ declare const getUserMetadataParamsSchema: z.ZodObject<{
142
146
  }, {
143
147
  userId: string;
144
148
  }>;
149
+ declare const batchGetUserMetadataBodySchema: z.ZodObject<{
150
+ userIds: z.ZodArray<z.ZodString, "many">;
151
+ }, "strip", z.ZodTypeAny, {
152
+ userIds: string[];
153
+ }, {
154
+ userIds: string[];
155
+ }>;
145
156
  export type UpdatePermissionsBody = z.infer<typeof updatePermissionsBodySchema>;
146
- /** @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md. */
157
+ /** @internal No importer; deletion candidate in safeinsights/canopycms#725. */
147
158
  export type SearchUsersParams = z.infer<typeof searchUsersParamsSchema>;
148
- /** @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md. */
159
+ export type BatchGetUserMetadataBody = z.infer<typeof batchGetUserMetadataBodySchema>;
160
+ /** @internal No importer; deletion candidate in safeinsights/canopycms#725. */
149
161
  export type GetUserMetadataParams = z.infer<typeof getUserMetadataParamsSchema>;
150
162
  /**
151
163
  * Exported routes for router registration
@@ -276,5 +288,12 @@ export declare const PERMISSION_ROUTES: {
276
288
  }, {
277
289
  userId: string;
278
290
  }>, undefined, GetUserMetadataResponse>;
291
+ readonly batchGetUserMetadata: import("./route-builder.js").RouteDefinition<undefined, z.ZodObject<{
292
+ userIds: z.ZodArray<z.ZodString, "many">;
293
+ }, "strip", z.ZodTypeAny, {
294
+ userIds: string[];
295
+ }, {
296
+ userIds: string[];
297
+ }>, BatchGetUserMetadataResponse>;
279
298
  };
280
299
  export {};