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
@@ -2,10 +2,7 @@ import { z } from 'zod';
2
2
  import type { BranchContext, BranchMetadata } from '../types.js';
3
3
  import type { ApiContext, ApiRequest, ApiResponse } from './types.js';
4
4
  import { branchParamSchema } from './validators.js';
5
- /** Response type for single branch operations (create, update, status) */
6
- export type BranchResponse = ApiResponse<{
7
- branch: BranchMetadata;
8
- }>;
5
+ import type { UserProfile } from '../auth/types.js';
9
6
  /**
10
7
  * A listed branch plus server-computed protected-base-branch flags (see
11
8
  * authorization/protected-branch.ts). Optional on the wire, matching the
@@ -44,13 +41,21 @@ export interface BranchListItem extends BranchMetadata {
44
41
  * archived non-base branch.
45
42
  */
46
43
  submitBlocked?: boolean;
44
+ /**
45
+ * How many ACL entries {@link toBranchListItem} left out of `access` for a caller without the
46
+ * privileged user lookup. Absent for a privileged caller, who gets the whole list.
47
+ */
48
+ withheldAccess?: {
49
+ users: number;
50
+ groups: number;
51
+ };
47
52
  }
48
53
  /**
49
- * Response type for branch creation. Carries the list-item shape (server-computed
50
- * flags included) so the editor can insert the branch without waiting for a
51
- * listing that may lag behind the create.
54
+ * Response type for branch creation and the workflow transitions. Carries the
55
+ * list-item shape (server-computed flags included) so the editor can show the
56
+ * result without waiting for a listing that may lag behind it.
52
57
  */
53
- export type BranchCreateResponse = ApiResponse<{
58
+ export type BranchListItemResponse = ApiResponse<{
54
59
  branch: BranchListItem;
55
60
  }>;
56
61
  /** Response type for listing branches */
@@ -62,6 +67,8 @@ export type BranchListResponse = ApiResponse<{
62
67
  * Optional on the wire so older servers remain compatible.
63
68
  */
64
69
  defaultBranch?: string;
70
+ /** Profiles of the listed branches' creators, in no order; unknown ids are absent. */
71
+ users: UserProfile[];
65
72
  }>;
66
73
  /** Response type for branch deletion */
67
74
  export type BranchDeleteResponse = ApiResponse<{
@@ -137,8 +144,14 @@ export interface CreateBranchBody {
137
144
  description?: string;
138
145
  access?: BranchMetadata['access'];
139
146
  }
147
+ /**
148
+ * A branch as `viewer` may see it, with server-computed protected-base-branch flags. Every
149
+ * branch response outside the admin-only repairs goes through here. Reads config per call so
150
+ * dev-mode refreshActiveBranch() updates are reflected.
151
+ */
152
+ export declare const toBranchListItem: (config: ApiContext["services"]["config"], branch: BranchMetadata, viewer: CanopyUser) => BranchListItem;
140
153
  /** @internal Exported for tests. */
141
- export declare const createBranchHandler: (ctx: ApiContext, req: ApiRequest, body: z.infer<typeof createBranchBodySchema>) => Promise<BranchCreateResponse>;
154
+ export declare const createBranchHandler: (ctx: ApiContext, req: ApiRequest, body: z.infer<typeof createBranchBodySchema>) => Promise<BranchListItemResponse>;
142
155
  /** @internal Exported for tests. */
143
156
  export declare const listBranchesHandler: (ctx: ApiContext, req: ApiRequest) => Promise<BranchListResponse>;
144
157
  /** @internal Exported for tests. */
@@ -158,7 +171,7 @@ export declare const canModifyBranchAccess: (user: CanopyUser, branchContext: Br
158
171
  reason: string;
159
172
  };
160
173
  /** @internal Exported for tests. */
161
- export declare const updateBranchAccessHandler: (ctx: ApiContext, req: ApiRequest, params: z.infer<typeof branchParamSchema>, body: z.infer<typeof updateBranchAccessBodySchema>) => Promise<BranchResponse>;
174
+ export declare const updateBranchAccessHandler: (ctx: ApiContext, req: ApiRequest, params: z.infer<typeof branchParamSchema>, body: z.infer<typeof updateBranchAccessBodySchema>) => Promise<BranchListItemResponse>;
162
175
  export declare const BRANCH_ROUTES: {
163
176
  readonly list: import("./route-builder.js").RouteDefinition<undefined, undefined, BranchListResponse>;
164
177
  readonly create: import("./route-builder.js").RouteDefinition<undefined, z.ZodObject<{
@@ -195,7 +208,7 @@ export declare const BRANCH_ROUTES: {
195
208
  allowedUsers?: string[] | undefined;
196
209
  allowedGroups?: string[] | undefined;
197
210
  } | undefined;
198
- }>, BranchCreateResponse>;
211
+ }>, BranchListItemResponse>;
199
212
  readonly delete: import("./route-builder.js").RouteDefinition<z.ZodObject<{
200
213
  branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
201
214
  }, "strip", z.ZodTypeAny, {
@@ -226,6 +239,6 @@ export declare const BRANCH_ROUTES: {
226
239
  }, {
227
240
  allowedUsers?: string[] | undefined;
228
241
  allowedGroups?: string[] | undefined;
229
- }>, BranchResponse>;
242
+ }>, BranchListItemResponse>;
230
243
  };
231
244
  export {};
@@ -2,8 +2,10 @@ import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { z } from 'zod';
4
4
  import { BranchWorkspaceManager } from '../branch-workspace.js';
5
+ import { BranchDirOccupiedError, BranchProvisioningBusyError, deletingDirName, removeLeftoverDir, } from '../branch-provisioning.js';
5
6
  import { getBranchMetadataFileManager } from '../branch-metadata.js';
6
7
  import { withOccFileLock } from '../utils/occ-json-write.js';
8
+ import { isCreatorsRecentBranch } from './branch-create-window.js';
7
9
  import { defineEndpoint } from './route-builder.js';
8
10
  import { createDebugLogger } from '../utils/debug.js';
9
11
  import { clientOperatingStrategy } from '../operating-mode/index.js';
@@ -12,7 +14,10 @@ import { filePathExists } from '../utils/fs.js';
12
14
  import { isNetworkRemoteUrl } from '../utils/git.js';
13
15
  import { sanitizeBranchName, RESERVED_SETTINGS_BRANCH_PREFIX, RESERVED_ROUTE_BRANCH_NAMES, isSettingsBranchName, } from '../paths/index.js';
14
16
  import { GitManager } from '../git-manager.js';
17
+ import { syncDeleteRemoteBranch } from './github-sync.js';
15
18
  import { branchNameSchema, branchParamSchema } from './validators.js';
19
+ import { baseBranchOf } from '../utils/base-branch.js';
20
+ import { lookupUserProfiles } from '../auth/user-metadata-lookup.js';
16
21
  const log = createDebugLogger({ prefix: 'BranchAPI' });
17
22
  const createBranchBodySchema = z.object({
18
23
  branch: branchNameSchema,
@@ -29,7 +34,7 @@ const updateBranchAccessBodySchema = z.object({
29
34
  allowedUsers: z.array(z.string()).optional(),
30
35
  allowedGroups: z.array(z.string()).optional(),
31
36
  });
32
- import { isPrivileged, isAdmin, loadPathPermissions, getBranchProtection, getBranchWriteProtection, } from '../authorization/index.js';
37
+ import { isPrivileged, isAdmin, isLockedOutOfBranch, loadPathPermissions, getBranchProtection, getBranchWriteProtection, } from '../authorization/index.js';
33
38
  import { operatingStrategy } from '../operating-mode/index.js';
34
39
  /**
35
40
  * Returns true if:
@@ -88,13 +93,38 @@ const resolveReadOnlyMirrorPath = (ctx, strategy) => {
88
93
  remoteUrlConfig.autoDetectRemotePath);
89
94
  };
90
95
  /**
91
- * Attach server-computed protected-base-branch flags to a branch. Reads config
92
- * per call so dev-mode refreshActiveBranch() updates are reflected.
96
+ * The ACL as `viewer` may see it. Without the privileged user lookup, a caller gets only the
97
+ * entries naming them or their groups, which is all the editor's membership checks read, and a
98
+ * count of the rest: the other ids name people that lookup keeps from them.
93
99
  */
94
- const toBranchListItem = (config, context) => {
95
- const protection = getBranchWriteProtection(config, context.branch.name, context.branch.baseBranch, context.branch.status);
100
+ const accessForViewer = (access, viewer) => {
101
+ if (isPrivileged(viewer.groups))
102
+ return { access };
103
+ const viewerGroups = viewer.groups ?? [];
104
+ const allowedUsers = access.allowedUsers?.filter((id) => id === viewer.userId);
105
+ const allowedGroups = access.allowedGroups?.filter((id) => viewerGroups.includes(id));
96
106
  return {
97
- ...context.branch,
107
+ access: {
108
+ ...access,
109
+ ...(allowedUsers && { allowedUsers }),
110
+ ...(allowedGroups && { allowedGroups }),
111
+ },
112
+ withheldAccess: {
113
+ users: (access.allowedUsers?.length ?? 0) - (allowedUsers?.length ?? 0),
114
+ groups: (access.allowedGroups?.length ?? 0) - (allowedGroups?.length ?? 0),
115
+ },
116
+ };
117
+ };
118
+ /**
119
+ * A branch as `viewer` may see it, with server-computed protected-base-branch flags. Every
120
+ * branch response outside the admin-only repairs goes through here. Reads config per call so
121
+ * dev-mode refreshActiveBranch() updates are reflected.
122
+ */
123
+ export const toBranchListItem = (config, branch, viewer) => {
124
+ const protection = getBranchWriteProtection(config, branch.name, branch.baseBranch, branch.status);
125
+ return {
126
+ ...branch,
127
+ ...accessForViewer(branch.access ?? {}, viewer),
98
128
  isProtected: protection.isProtected,
99
129
  readOnly: protection.readOnly,
100
130
  writeBlocked: protection.writeBlocked,
@@ -165,13 +195,9 @@ export const createBranchHandler = async (ctx, req, body) => {
165
195
  error: `Branch name "${branchName}" is reserved: it collides with the /${branchName} API route namespace`,
166
196
  };
167
197
  }
168
- // Reject the base branch name outright. openOrCreateBranch's save() (see
169
- // branch-metadata.ts) field-merges the caller-supplied `access` over an
170
- // EXISTING branch's metadata rather than replacing it, so a request
171
- // naming the base branch would let the caller inject themselves into the
172
- // protected base branch's ACL (gaining e.g. withdraw rights via the
173
- // allowed_by_acl path). No recorded fork point exists yet for a
174
- // not-yet-created branch, so this checks config protection only.
198
+ // Reject the base branch name outright, even before the base branch is
199
+ // provisioned. No recorded fork point exists yet for a not-yet-created
200
+ // branch, so this checks config protection only.
175
201
  const { isProtected } = getBranchProtection(ctx.services.config, branchName);
176
202
  if (isProtected) {
177
203
  return {
@@ -180,14 +206,10 @@ export const createBranchHandler = async (ctx, req, body) => {
180
206
  error: 'Cannot create a branch with the base branch name',
181
207
  };
182
208
  }
183
- // Reject a name collision with ANY existing branch for the same
184
- // field-merge reason: creating over an existing branch name would let
185
- // the caller's `access` ACL overwrite that branch's real ACL instead of
186
- // creating a new, separate branch. Comparison uses the sanitized name
187
- // since that's what's persisted in branch.json (see
188
- // BranchWorkspaceManager.openOrCreateBranch). System branches
189
- // auto-provisioned via http/handler.ts's getBranchContext don't go
190
- // through this handler, so rejecting collisions here doesn't affect them.
209
+ // A name collision with ANY existing branch answers before a clone is paid
210
+ // for. Provisioning never merges into an existing branch either: it reports
211
+ // `exists`, mapped the same way below. Compared sanitized, the form
212
+ // branch.json records.
191
213
  if (!ctx.services.registry) {
192
214
  return {
193
215
  ok: false,
@@ -197,11 +219,7 @@ export const createBranchHandler = async (ctx, req, body) => {
197
219
  }
198
220
  const existingBranch = await ctx.services.registry.get(sanitizeBranchName(branchName));
199
221
  if (existingBranch) {
200
- return {
201
- ok: false,
202
- status: 409,
203
- error: 'A branch with this name already exists',
204
- };
222
+ return existingBranchResponse(ctx, req, existingBranch);
205
223
  }
206
224
  // L2: create-time collision check against this deployment's local
207
225
  // GitHub mirror (`remote.git`). The CMS Lambda has no internet access
@@ -210,7 +228,7 @@ export const createBranchHandler = async (ctx, req, body) => {
210
228
  // is BOTH this deployment's local git origin AND a mirror of GitHub's
211
229
  // view of the repo: worker/git-sync.ts's syncGit() fetches GitHub into it
212
230
  // (see GITHUB_TRACKING_REF_PREFIX's doc comment in git-manager.ts) and
213
- // then reconciles refs/heads/* non-destructively, so it carries both
231
+ // then reconciles refs/heads/* without touching editor work, so it carries both
214
232
  // this deployment's local heads and GitHub's view -- readable offline by
215
233
  // this same Lambda, since it resolves to the same EFS inode the worker
216
234
  // uses. Reading it here catches a sanitized-name collision with a branch
@@ -272,14 +290,14 @@ export const createBranchHandler = async (ctx, req, body) => {
272
290
  // deleteBranchHandler's cleanup (below) handles the common case, but
273
291
  // cannot cover every ordering: when the branch still existed on
274
292
  // GitHub at editor-delete time, the sync loop's reconcile re-creates
275
- // the local head from the tracking ref within a cycle, and once the
276
- // GitHub side is later deleted (pruning the tracking ref) that
277
- // re-created head is orphaned with no registry entry left for the
278
- // delete path to ever run against. Healing at REUSE time covers
279
- // every ordering, however the head got orphaned: the registry check
280
- // above already proved no live branch owns this name, and the
281
- // tracking check just proved GitHub doesn't either, so a remaining
282
- // local head is stale by definition. Best-effort (old-value-guarded
293
+ // the local head from GitHub's branch within a cycle, and once the
294
+ // GitHub side is later deleted that re-created head stays until the
295
+ // sync loop's next prune, with no registry entry left for the delete
296
+ // path to run against. Healing at REUSE time covers every ordering,
297
+ // however the head got orphaned: the registry check above already
298
+ // proved no live branch owns this name, and the tracking check just
299
+ // proved GitHub doesn't either, so a remaining local head is stale by
300
+ // definition. Best-effort (old-value-guarded
283
301
  // against a concurrent push): on failure, creation still proceeds --
284
302
  // that is today's status quo, and the publish-time 409 message names
285
303
  // this cause.
@@ -309,7 +327,7 @@ export const createBranchHandler = async (ctx, req, body) => {
309
327
  // Load path permissions from the base branch's JSON file (the resolved
310
328
  // fork point — baked into config at service creation; dev-mode git HEAD
311
329
  // when not explicitly configured)
312
- const baseBranch = ctx.services.config.defaultBaseBranch ?? 'main';
330
+ const baseBranch = baseBranchOf(ctx.services.config);
313
331
  const baseBranchContext = await ctx.getBranchContext(baseBranch);
314
332
  let pathPermissions = [];
315
333
  if (baseBranchContext) {
@@ -326,23 +344,47 @@ export const createBranchHandler = async (ctx, req, body) => {
326
344
  };
327
345
  }
328
346
  const manager = new BranchWorkspaceManager(ctx.services.config);
329
- const operatingMode = ctx.services.config.mode;
330
- const context = await manager.openOrCreateBranch({
331
- branchName,
332
- mode: operatingMode,
333
- createdBy: req.user.userId,
334
- title: body.title,
335
- description: body.description,
336
- access: body.access,
337
- });
338
- log.debug('api', 'Branch created', { branchName: context.branch.name });
347
+ let outcome;
348
+ try {
349
+ outcome = await manager.provisionBranch({
350
+ branchName,
351
+ mode: ctx.services.config.mode,
352
+ createdBy: req.user.userId,
353
+ title: body.title,
354
+ description: body.description,
355
+ access: body.access,
356
+ });
357
+ }
358
+ catch (err) {
359
+ if (err instanceof BranchProvisioningBusyError) {
360
+ return { ok: false, status: 503, error: err.message };
361
+ }
362
+ if (err instanceof BranchDirOccupiedError) {
363
+ return { ok: false, status: 409, error: err.message };
364
+ }
365
+ throw err;
366
+ }
367
+ if (outcome.kind === 'exists')
368
+ return existingBranchResponse(ctx, req, outcome.context);
369
+ log.debug('api', 'Branch created', { branchName: outcome.context.branch.name });
339
370
  return {
340
371
  ok: true,
341
372
  status: 200,
342
- data: { branch: toBranchListItem(ctx.services.config, context) },
373
+ data: { branch: toBranchListItem(ctx.services.config, outcome.context.branch, req.user) },
343
374
  };
344
375
  });
345
376
  };
377
+ /** A create that names an existing branch: 409, unless it is that creator's recent retry. */
378
+ const existingBranchResponse = (ctx, req, existing) => {
379
+ if (isCreatorsRecentBranch(existing.branch, req.user.userId)) {
380
+ return {
381
+ ok: true,
382
+ status: 200,
383
+ data: { branch: toBranchListItem(ctx.services.config, existing.branch, req.user) },
384
+ };
385
+ }
386
+ return { ok: false, status: 409, error: 'A branch with this name already exists' };
387
+ };
346
388
  /** @internal Exported for tests. */
347
389
  export const listBranchesHandler = async (ctx, req) => {
348
390
  if (!ctx.services.registry) {
@@ -362,21 +404,18 @@ export const listBranchesHandler = async (ctx, req) => {
362
404
  // but registry branch names are filesystem-sanitized ('claude-foo') — the
363
405
  // editor matches defaultBranch against registry names, so return the form
364
406
  // that can actually be found there.
365
- const defaultBranch = sanitizeBranchName(ctx.services.config.defaultActiveBranch ?? ctx.services.config.defaultBaseBranch ?? 'main');
407
+ const defaultBranch = sanitizeBranchName(ctx.services.config.defaultActiveBranch ?? baseBranchOf(ctx.services.config));
366
408
  // Admins and Reviewers see all branches
367
409
  if (isPrivileged(req.user.groups)) {
368
- return {
369
- ok: true,
370
- status: 200,
371
- data: {
372
- branches: allBranches.map((context) => toBranchListItem(ctx.services.config, context)),
373
- defaultBranch,
374
- },
375
- };
410
+ return branchListResponse(ctx, req, allBranches, defaultBranch);
376
411
  }
377
- // Regular users only see branches they created or have explicit access to
412
+ // Regular users see the base branch and the branches they created or were given access to
378
413
  const visibleBranches = allBranches.filter((context) => {
379
414
  const branch = context.branch;
415
+ // Ahead of every grant below, as in checkBranchAccessWithDefault.
416
+ if (isLockedOutOfBranch(branch.access, req.user.groups)) {
417
+ return false;
418
+ }
380
419
  // The protected base branch is where every user lands by default; always
381
420
  // show it (read-only) so the editor can render its protected state.
382
421
  if (getBranchProtection(ctx.services.config, branch.name, branch.baseBranch).isProtected) {
@@ -396,12 +435,30 @@ export const listBranchesHandler = async (ctx, req) => {
396
435
  }
397
436
  return false;
398
437
  });
438
+ return branchListResponse(ctx, req, visibleBranches, defaultBranch);
439
+ };
440
+ /**
441
+ * The listing, with the profile of each listed branch's creator. Looked up only for branches the
442
+ * requester may see, so it names no one they could not; the branch ACL's users stay behind the
443
+ * privileged user lookup. A failed lookup costs the names, never the listing.
444
+ */
445
+ const branchListResponse = async (ctx, req, branches, defaultBranch) => {
446
+ let users = [];
447
+ if (ctx.authPlugin) {
448
+ try {
449
+ users = await lookupUserProfiles(ctx.authPlugin, branches.map((context) => context.branch.createdBy));
450
+ }
451
+ catch (error) {
452
+ console.error('CanopyCMS: Failed to look up branch owners:', getErrorMessage(error));
453
+ }
454
+ }
399
455
  return {
400
456
  ok: true,
401
457
  status: 200,
402
458
  data: {
403
- branches: visibleBranches.map((context) => toBranchListItem(ctx.services.config, context)),
459
+ branches: branches.map((context) => toBranchListItem(ctx.services.config, context.branch, req.user)),
404
460
  defaultBranch,
461
+ users,
405
462
  },
406
463
  };
407
464
  };
@@ -457,7 +514,7 @@ export const deleteBranchHandler = async (ctx, req, params) => {
457
514
  // writableBranch/submittableBranch guards elsewhere use 403 for the same
458
515
  // "protected" category (tracked as a deferred, deliberately out-of-scope
459
516
  // cleanup in
460
- // .claude/future-tasks/protected-branch-followup-cleanups.md); extending
517
+ // safeinsights/canopycms#781); extending
461
518
  // this check to 'approved' keeps it consistent with its own immediate
462
519
  // neighbour rather than introducing a fresh 400/403 split between two
463
520
  // arms of the same guard.
@@ -468,48 +525,39 @@ export const deleteBranchHandler = async (ctx, req, params) => {
468
525
  error: 'Cannot delete branch with open pull request',
469
526
  };
470
527
  }
471
- // Delete branch metadata file so it disappears from registry scans.
472
- // Hold the same server-enforced lockfile branch-metadata saves hold
473
- // (see utils/occ-json-write.ts): an unguarded unlink racing a concurrent
474
- // save() would let the save's create path resurrect a phantom branch.json
475
- // inside a deleted branch, which the registry's next scan would list as a
476
- // live branch with no clone. The directory removal happens inside the
477
- // same hold so a racing save cannot slip between unlink and rm either.
528
+ // The branch directory leaves its name by one rename, under the same
529
+ // server-enforced lockfile branch-metadata saves hold (see
530
+ // utils/occ-json-write.ts), so a save() that reaches that lock after the
531
+ // rename fails rather than recreating the tree, and a process killed during
532
+ // the `rm` leaves
533
+ // only a `.deleting-*` directory the worker sweeps, never residue under a
534
+ // name that may be created again.
478
535
  const metadataFile = path.join(branchContext.branchRoot, '.canopy-meta', 'branch.json');
479
536
  let cleanupWarning;
537
+ let deletingPath;
480
538
  try {
481
539
  await withOccFileLock(metadataFile, async () => {
540
+ if (branchContext.branchRoot === branchContext.baseRoot) {
541
+ await fs.unlink(metadataFile).catch((err) => {
542
+ if (!isNotFoundError(err))
543
+ throw err;
544
+ });
545
+ return;
546
+ }
547
+ const target = path.join(branchContext.baseRoot, deletingDirName(path.basename(branchContext.branchRoot)));
482
548
  try {
483
- await fs.unlink(metadataFile);
549
+ await fs.rename(branchContext.branchRoot, target);
550
+ deletingPath = target;
484
551
  }
485
552
  catch (err) {
486
- if (!isNotFoundError(err)) {
487
- console.error(`CanopyCMS: Failed to delete branch metadata for ${branchName}:`, getErrorMessage(err));
488
- }
489
- }
490
- // In multi-branch modes, also delete the entire branch directory.
491
- // Retry transient EFS/NFS errors (ENOTEMPTY from a concurrent writer,
492
- // EBUSY) a few times before giving up -- rm's failure must never be
493
- // swallowed: metadata is gone either way (the branch is logically
494
- // deleted and will no longer appear in listings), but silently
495
- // succeeding here would leave a full orphan clone on disk with
496
- // nothing in the API surfacing its existence.
497
- if (branchContext.branchRoot !== branchContext.baseRoot) {
498
- try {
499
- await fs.rm(branchContext.branchRoot, {
500
- recursive: true,
501
- force: true,
502
- maxRetries: 3,
503
- retryDelay: 100,
504
- });
505
- }
506
- catch (err) {
507
- // sanitizeErrorMessage: this string goes back to the browser in the
508
- // delete response (API-H2 — no absolute EFS paths to clients);
509
- // the console line below keeps the raw detail for server logs.
510
- cleanupWarning = `Failed to fully remove branch directory: ${sanitizeErrorMessage(getErrorMessage(err))}`;
511
- console.error(`CanopyCMS: Failed to delete branch directory for ${branchName}:`, getErrorMessage(err));
512
- }
553
+ if (isNotFoundError(err))
554
+ return;
555
+ // Still deleted logically: without branch.json the branch is unlisted,
556
+ // and the worker quarantines what is left.
557
+ await fs.unlink(metadataFile).catch(() => { });
558
+ // [REDACT] Returned to the browser; the console line keeps the path.
559
+ cleanupWarning = `Failed to remove branch directory: ${sanitizeErrorMessage(getErrorMessage(err))}`;
560
+ console.error(`CanopyCMS: Failed to move branch directory for ${branchName} aside:`, getErrorMessage(err));
513
561
  }
514
562
  });
515
563
  }
@@ -522,11 +570,13 @@ export const deleteBranchHandler = async (ctx, req, params) => {
522
570
  error: `Branch is busy, try again: ${getErrorMessage(err)}`,
523
571
  };
524
572
  }
573
+ if (deletingPath)
574
+ await removeLeftoverDir(deletingPath);
525
575
  // Also delete the branch's local head from the remote.git mirror (the
526
- // deployment's local origin). The sync loop deliberately never deletes a
527
- // local head (see reconcileTrackedBranches), so THIS is the one explicit
528
- // path that removes it -- without this, the head outlives the branch
529
- // forever, and reusing the name after the GitHub side is gone (e.g. a
576
+ // deployment's local origin). The sync loop's reconcileTrackedBranches
577
+ // removes a head only once GitHub no longer has its branch, so while GitHub
578
+ // does, THIS is the path that removes it -- without this, the head outlives
579
+ // the branch, and reusing the name after the GitHub side is gone (e.g. a
530
580
  // squash-merged PR with auto-delete) has the reused branch's first publish
531
581
  // rejected non-fast-forward against the stale old tip: a permanent,
532
582
  // misleading 409 -- and a retried submit would then ship the STALE head to
@@ -543,7 +593,7 @@ export const deleteBranchHandler = async (ctx, req, params) => {
543
593
  const sanitizedDeleted = sanitizeBranchName(branchContext.branch.name);
544
594
  // Defense-in-depth only -- isProtected above already rejects the base
545
595
  // branch, and settings branches never resolve through getBranchContext.
546
- const sanitizedBase = sanitizeBranchName(branchContext.branch.baseBranch ?? ctx.services.config.defaultBaseBranch ?? 'main');
596
+ const sanitizedBase = sanitizeBranchName(branchContext.branch.baseBranch ?? baseBranchOf(ctx.services.config));
547
597
  const deletableHead = sanitizedDeleted !== sanitizedBase &&
548
598
  !sanitizedDeleted.startsWith(RESERVED_SETTINGS_BRANCH_PREFIX);
549
599
  if (deletableHead &&
@@ -561,6 +611,12 @@ export const deleteBranchHandler = async (ctx, req, params) => {
561
611
  console.warn(`CanopyCMS: failed to remove deleted branch's mirror head (branch ${sanitizedDeleted}, mirror ${mirrorPath}): ${getErrorMessage(err)}`);
562
612
  }
563
613
  }
614
+ // `branchContext` was read before the delete, so it still carries the PR number this gates on.
615
+ if (deletableHead) {
616
+ const warning = await syncDeleteRemoteBranch(ctx, branchContext);
617
+ if (warning)
618
+ cleanupWarning = cleanupWarning ? `${cleanupWarning}; ${warning}` : warning;
619
+ }
564
620
  // Invalidate registry cache so next list() will regenerate without this branch
565
621
  if (!ctx.services.registry) {
566
622
  return {
@@ -636,7 +692,11 @@ export const updateBranchAccessHandler = async (ctx, req, params, body) => {
636
692
  const updated = await metadata.save({
637
693
  branch: { access: newAccess },
638
694
  });
639
- return { ok: true, status: 200, data: { branch: updated.branch } };
695
+ return {
696
+ ok: true,
697
+ status: 200,
698
+ data: { branch: toBranchListItem(ctx.services.config, updated.branch, req.user) },
699
+ };
640
700
  };
641
701
  /**
642
702
  * List all branches visible to current user
@@ -648,17 +708,18 @@ const listBranches = defineEndpoint({
648
708
  path: '/branches',
649
709
  responseType: 'BranchListResponse',
650
710
  response: {},
651
- defaultMockData: { branches: [] },
711
+ defaultMockData: { branches: [], users: [] },
652
712
  handler: listBranchesHandler,
653
713
  });
654
714
  const createBranch = defineEndpoint({
655
715
  namespace: 'branches',
656
716
  name: 'create',
717
+ clientTimeout: 'long',
657
718
  method: 'POST',
658
719
  path: '/branches',
659
720
  body: createBranchBodySchema,
660
721
  bodyType: 'CreateBranchBody',
661
- responseType: 'BranchCreateResponse',
722
+ responseType: 'BranchListItemResponse',
662
723
  response: {},
663
724
  defaultMockData: {
664
725
  branch: {
@@ -699,7 +760,7 @@ const updateBranchAccess = defineEndpoint({
699
760
  params: branchParamSchema,
700
761
  body: updateBranchAccessBodySchema,
701
762
  bodyType: 'UpdateBranchAccessBody',
702
- responseType: 'BranchResponse',
763
+ responseType: 'BranchListItemResponse',
703
764
  response: {},
704
765
  defaultMockData: {
705
766
  branch: {