canopycms 0.0.67-int.90 → 0.0.67

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 (539) hide show
  1. package/README.md +30 -3
  2. package/dist/ai/generate.js +1 -27
  3. package/dist/ai/handler.d.ts +0 -4
  4. package/dist/ai/handler.js +0 -11
  5. package/dist/ai/index.d.ts +1 -8
  6. package/dist/ai/index.js +1 -8
  7. package/dist/ai/json-to-markdown.js +15 -58
  8. package/dist/ai/resolve-branch.d.ts +2 -7
  9. package/dist/ai/resolve-branch.js +2 -8
  10. package/dist/ai/strip-mdx.d.ts +5 -13
  11. package/dist/ai/strip-mdx.js +5 -17
  12. package/dist/ai/to-plain-text.d.ts +10 -28
  13. package/dist/ai/to-plain-text.js +10 -28
  14. package/dist/ai/transform-components.d.ts +2 -4
  15. package/dist/ai/transform-components.js +8 -19
  16. package/dist/ai/types.d.ts +5 -10
  17. package/dist/api/admin-branch-health.d.ts +4 -12
  18. package/dist/api/admin-branch-health.js +26 -66
  19. package/dist/api/admin.d.ts +4 -12
  20. package/dist/api/admin.js +10 -26
  21. package/dist/api/assets.d.ts +0 -25
  22. package/dist/api/assets.js +50 -91
  23. package/dist/api/branch-merge.d.ts +1 -1
  24. package/dist/api/branch-merge.js +0 -2
  25. package/dist/api/branch-review.d.ts +0 -8
  26. package/dist/api/branch-review.js +0 -13
  27. package/dist/api/branch-status.d.ts +0 -3
  28. package/dist/api/branch-status.js +8 -33
  29. package/dist/api/branch-withdraw.d.ts +0 -1
  30. package/dist/api/branch-withdraw.js +6 -9
  31. package/dist/api/branch.d.ts +7 -12
  32. package/dist/api/branch.js +7 -44
  33. package/dist/api/client.d.ts +71 -224
  34. package/dist/api/client.js +82 -233
  35. package/dist/api/comments.d.ts +2 -4
  36. package/dist/api/comments.js +0 -17
  37. package/dist/api/content.d.ts +0 -6
  38. package/dist/api/content.js +66 -142
  39. package/dist/api/entries-constants.d.ts +5 -9
  40. package/dist/api/entries-constants.js +5 -9
  41. package/dist/api/entries.d.ts +8 -13
  42. package/dist/api/entries.js +20 -51
  43. package/dist/api/github-sync.d.ts +2 -4
  44. package/dist/api/github-sync.js +4 -8
  45. package/dist/api/groups.d.ts +3 -0
  46. package/dist/api/groups.js +8 -21
  47. package/dist/api/guards.d.ts +4 -16
  48. package/dist/api/guards.js +3 -22
  49. package/dist/api/index.d.ts +4 -4
  50. package/dist/api/permissions.d.ts +2 -0
  51. package/dist/api/permissions.js +18 -40
  52. package/dist/api/reference-options.d.ts +0 -1
  53. package/dist/api/reference-options.js +3 -11
  54. package/dist/api/request-body-hash.d.ts +12 -23
  55. package/dist/api/request-body-hash.js +12 -23
  56. package/dist/api/resolve-references.d.ts +0 -1
  57. package/dist/api/resolve-references.js +13 -28
  58. package/dist/api/route-builder.d.ts +3 -7
  59. package/dist/api/route-builder.js +1 -1
  60. package/dist/api/routes.d.ts +12 -0
  61. package/dist/api/routes.js +47 -0
  62. package/dist/api/schema.d.ts +23 -33
  63. package/dist/api/schema.js +20 -74
  64. package/dist/api/settings-helpers.js +4 -5
  65. package/dist/api/types.d.ts +0 -5
  66. package/dist/api/user.js +0 -5
  67. package/dist/api/validators.d.ts +14 -52
  68. package/dist/api/validators.js +14 -52
  69. package/dist/assets/asset-prefixes.d.ts +4 -8
  70. package/dist/assets/asset-prefixes.js +4 -8
  71. package/dist/assets/asset-src.d.ts +5 -22
  72. package/dist/assets/asset-src.js +5 -21
  73. package/dist/assets/factory.d.ts +1 -2
  74. package/dist/assets/factory.js +1 -2
  75. package/dist/assets/finalize.d.ts +3 -1
  76. package/dist/assets/finalize.js +3 -1
  77. package/dist/assets/index.d.ts +3 -3
  78. package/dist/assets/index.js +1 -1
  79. package/dist/assets/keys.d.ts +5 -3
  80. package/dist/assets/keys.js +6 -3
  81. package/dist/assets/pipeline.d.ts +3 -2
  82. package/dist/assets/pipeline.js +22 -56
  83. package/dist/assets/sharp-loader.d.ts +2 -10
  84. package/dist/assets/sharp-loader.js +2 -10
  85. package/dist/assets/store-local.d.ts +1 -2
  86. package/dist/assets/store-local.js +1 -2
  87. package/dist/assets/store-s3.d.ts +3 -4
  88. package/dist/assets/svg-sanitizer.d.ts +6 -14
  89. package/dist/assets/svg-sanitizer.js +6 -14
  90. package/dist/assets/transform-directives.d.ts +3 -4
  91. package/dist/assets/transform-directives.js +1 -1
  92. package/dist/assets/transform.d.ts +19 -30
  93. package/dist/assets/transform.js +18 -31
  94. package/dist/auth/cache.d.ts +2 -3
  95. package/dist/auth/cache.js +2 -3
  96. package/dist/auth/caching-auth-plugin.d.ts +11 -22
  97. package/dist/auth/caching-auth-plugin.js +12 -14
  98. package/dist/auth/context-helpers.d.ts +6 -20
  99. package/dist/auth/context-helpers.js +5 -17
  100. package/dist/auth/file-based-auth-cache.d.ts +10 -21
  101. package/dist/auth/file-based-auth-cache.js +23 -51
  102. package/dist/auth/plugin.d.ts +29 -61
  103. package/dist/auth/plugin.js +9 -13
  104. package/dist/auth/types.d.ts +11 -20
  105. package/dist/authorization/branch.d.ts +30 -49
  106. package/dist/authorization/branch.js +16 -42
  107. package/dist/authorization/content.d.ts +11 -40
  108. package/dist/authorization/content.js +13 -45
  109. package/dist/authorization/groups/index.d.ts +0 -3
  110. package/dist/authorization/groups/index.js +0 -3
  111. package/dist/authorization/groups/loader.d.ts +14 -28
  112. package/dist/authorization/groups/loader.js +14 -38
  113. package/dist/authorization/groups/schema.d.ts +0 -6
  114. package/dist/authorization/groups/schema.js +4 -7
  115. package/dist/authorization/helpers.d.ts +9 -28
  116. package/dist/authorization/helpers.js +9 -28
  117. package/dist/authorization/index.d.ts +3 -25
  118. package/dist/authorization/index.js +3 -35
  119. package/dist/authorization/path.d.ts +6 -13
  120. package/dist/authorization/path.js +8 -25
  121. package/dist/authorization/permissions/index.d.ts +0 -3
  122. package/dist/authorization/permissions/index.js +0 -3
  123. package/dist/authorization/permissions/loader.d.ts +14 -27
  124. package/dist/authorization/permissions/loader.js +14 -32
  125. package/dist/authorization/permissions/schema.d.ts +1 -6
  126. package/dist/authorization/permissions/schema.js +6 -13
  127. package/dist/authorization/protected-branch.d.ts +36 -65
  128. package/dist/authorization/protected-branch.js +29 -41
  129. package/dist/authorization/settings-file-store.d.ts +38 -81
  130. package/dist/authorization/settings-file-store.js +38 -79
  131. package/dist/authorization/types.d.ts +4 -26
  132. package/dist/authorization/types.js +0 -6
  133. package/dist/authorization/validation.d.ts +1 -23
  134. package/dist/authorization/validation.js +1 -24
  135. package/dist/branch-health.d.ts +39 -67
  136. package/dist/branch-health.js +27 -43
  137. package/dist/branch-metadata-file.d.ts +16 -32
  138. package/dist/branch-metadata-file.js +13 -26
  139. package/dist/branch-metadata.d.ts +49 -80
  140. package/dist/branch-metadata.js +57 -87
  141. package/dist/branch-registry.d.ts +26 -64
  142. package/dist/branch-registry.js +44 -93
  143. package/dist/branch-schema-cache.d.ts +34 -124
  144. package/dist/branch-schema-cache.js +49 -155
  145. package/dist/branch-workspace.d.ts +4 -4
  146. package/dist/branch-workspace.js +15 -19
  147. package/dist/build/generate-ai-content.d.ts +1 -0
  148. package/dist/build/generate-ai-content.js +12 -25
  149. package/dist/build-canopy.d.ts +17 -27
  150. package/dist/build-canopy.js +16 -23
  151. package/dist/build-mode.d.ts +25 -27
  152. package/dist/build-mode.js +25 -29
  153. package/dist/cli/cli.d.ts +15 -26
  154. package/dist/cli/cli.js +601 -978
  155. package/dist/cli/generate-ai-content.js +351 -628
  156. package/dist/cli/github-app-manifest.d.ts +84 -0
  157. package/dist/cli/github-app-manifest.js +161 -0
  158. package/dist/cli/init-github-app.d.ts +110 -444
  159. package/dist/cli/init-github-app.js +236 -773
  160. package/dist/cli/init.js +39 -80
  161. package/dist/cli/migrate.d.ts +13 -10
  162. package/dist/cli/migrate.js +22 -30
  163. package/dist/cli/project-detect.d.ts +17 -31
  164. package/dist/cli/project-detect.js +31 -42
  165. package/dist/cli/project-root.d.ts +4 -11
  166. package/dist/cli/project-root.js +4 -11
  167. package/dist/cli/prompt.d.ts +10 -0
  168. package/dist/cli/prompt.js +67 -0
  169. package/dist/cli/sync.d.ts +0 -8
  170. package/dist/cli/sync.js +8 -28
  171. package/dist/cli/template-files/middleware.ts.template +15 -29
  172. package/dist/cli/templates.d.ts +2 -12
  173. package/dist/cli/templates.js +4 -4
  174. package/dist/client.d.ts +1 -1
  175. package/dist/comment-store.d.ts +32 -53
  176. package/dist/comment-store.js +32 -52
  177. package/dist/config/flatten.d.ts +0 -3
  178. package/dist/config/flatten.js +2 -12
  179. package/dist/config/helpers.js +2 -2
  180. package/dist/config/index.d.ts +2 -2
  181. package/dist/config/index.js +1 -4
  182. package/dist/config/schemas/collection.d.ts +0 -8
  183. package/dist/config/schemas/collection.js +0 -10
  184. package/dist/config/schemas/config.d.ts +6 -78
  185. package/dist/config/schemas/config.js +38 -54
  186. package/dist/config/schemas/field.d.ts +2 -242
  187. package/dist/config/schemas/field.js +9 -20
  188. package/dist/config/schemas/media.js +1 -1
  189. package/dist/config/schemas/permissions.js +0 -2
  190. package/dist/config/schemas/url.d.ts +5 -6
  191. package/dist/config/schemas/url.js +5 -6
  192. package/dist/config/types.d.ts +45 -33
  193. package/dist/config/types.js +0 -1
  194. package/dist/config.d.ts +1 -8
  195. package/dist/config.js +1 -9
  196. package/dist/content-id-index.d.ts +76 -188
  197. package/dist/content-id-index.js +79 -230
  198. package/dist/content-index-generation.d.ts +27 -48
  199. package/dist/content-index-generation.js +35 -84
  200. package/dist/content-index-registry.d.ts +15 -24
  201. package/dist/content-index-registry.js +5 -9
  202. package/dist/content-listing.d.ts +64 -107
  203. package/dist/content-listing.js +68 -118
  204. package/dist/content-reader.d.ts +20 -29
  205. package/dist/content-reader.js +10 -18
  206. package/dist/content-store.d.ts +210 -336
  207. package/dist/content-store.js +413 -657
  208. package/dist/content-tree.d.ts +44 -86
  209. package/dist/content-tree.js +26 -54
  210. package/dist/context.d.ts +67 -94
  211. package/dist/context.js +53 -72
  212. package/dist/dev-content-watcher.d.ts +18 -18
  213. package/dist/dev-content-watcher.js +41 -44
  214. package/dist/editor/BranchManager.d.ts +3 -6
  215. package/dist/editor/BranchManager.js +24 -44
  216. package/dist/editor/CanopyEditor.js +5 -2
  217. package/dist/editor/CommentsPanel.js +0 -2
  218. package/dist/editor/Editor.js +19 -76
  219. package/dist/editor/EditorAuthGate.d.ts +27 -0
  220. package/dist/editor/EditorAuthGate.js +140 -0
  221. package/dist/editor/EntryNavigator.js +0 -20
  222. package/dist/editor/FormRenderer.d.ts +1 -2
  223. package/dist/editor/FormRenderer.js +8 -23
  224. package/dist/editor/admin/SystemHealthPanel.js +20 -37
  225. package/dist/editor/admin/useSystemHealth.d.ts +2 -3
  226. package/dist/editor/admin/useSystemHealth.js +10 -12
  227. package/dist/editor/client-reference-resolver.d.ts +2 -5
  228. package/dist/editor/client-reference-resolver.js +2 -19
  229. package/dist/editor/comments/BranchComments.js +0 -4
  230. package/dist/editor/comments/EntryComments.js +0 -4
  231. package/dist/editor/comments/FieldWrapper.js +0 -4
  232. package/dist/editor/comments/InlineCommentThread.js +0 -2
  233. package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
  234. package/dist/editor/comments/ThreadCarousel.js +0 -12
  235. package/dist/editor/components/EditorFooter.d.ts +0 -8
  236. package/dist/editor/components/EditorFooter.js +0 -5
  237. package/dist/editor/components/EditorHeader.d.ts +0 -31
  238. package/dist/editor/components/EditorHeader.js +21 -71
  239. package/dist/editor/components/EditorSidebar.d.ts +0 -19
  240. package/dist/editor/components/EditorSidebar.js +0 -16
  241. package/dist/editor/components/EntryCreateModal.d.ts +4 -4
  242. package/dist/editor/components/EntryCreateModal.js +7 -22
  243. package/dist/editor/components/RenameEntryModal.js +0 -4
  244. package/dist/editor/components/UserBadge.js +0 -10
  245. package/dist/editor/components/index.js +0 -2
  246. package/dist/editor/context/ApiClientContext.d.ts +8 -7
  247. package/dist/editor/context/ApiClientContext.js +39 -11
  248. package/dist/editor/context/AssetContext.d.ts +7 -17
  249. package/dist/editor/context/AssetContext.js +7 -17
  250. package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
  251. package/dist/editor/context/EditorIdentityContext.js +7 -0
  252. package/dist/editor/context/EditorStateContext.d.ts +10 -41
  253. package/dist/editor/context/EditorStateContext.js +7 -23
  254. package/dist/editor/context/SWRProvider.d.ts +3 -6
  255. package/dist/editor/context/index.d.ts +1 -20
  256. package/dist/editor/context/index.js +1 -20
  257. package/dist/editor/editor-utils.d.ts +8 -47
  258. package/dist/editor/editor-utils.js +19 -72
  259. package/dist/editor/fields/BlockField.d.ts +2 -2
  260. package/dist/editor/fields/BlockField.js +1 -2
  261. package/dist/editor/fields/CodeField.d.ts +0 -1
  262. package/dist/editor/fields/CodeField.js +0 -1
  263. package/dist/editor/fields/DateTimeField.d.ts +15 -22
  264. package/dist/editor/fields/DateTimeField.js +17 -26
  265. package/dist/editor/fields/ImageField.d.ts +2 -2
  266. package/dist/editor/fields/ImageField.js +8 -14
  267. package/dist/editor/fields/InlineGroupField.d.ts +0 -1
  268. package/dist/editor/fields/InlineGroupField.js +0 -1
  269. package/dist/editor/fields/MarkdownField.d.ts +0 -1
  270. package/dist/editor/fields/MarkdownField.js +6 -11
  271. package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
  272. package/dist/editor/fields/MdxImageDialog.js +0 -1
  273. package/dist/editor/fields/NumberField.d.ts +9 -19
  274. package/dist/editor/fields/NumberField.js +11 -22
  275. package/dist/editor/fields/NumberListField.d.ts +7 -10
  276. package/dist/editor/fields/NumberListField.js +7 -10
  277. package/dist/editor/fields/ObjectField.d.ts +5 -8
  278. package/dist/editor/fields/ObjectField.js +0 -1
  279. package/dist/editor/fields/ReferenceField.d.ts +1 -1
  280. package/dist/editor/fields/ReferenceField.js +11 -16
  281. package/dist/editor/fields/SelectField.d.ts +2 -2
  282. package/dist/editor/fields/SelectField.js +0 -1
  283. package/dist/editor/fields/StringListField.d.ts +0 -4
  284. package/dist/editor/fields/StringListField.js +4 -9
  285. package/dist/editor/fields/TextField.d.ts +0 -1
  286. package/dist/editor/fields/TextField.js +0 -1
  287. package/dist/editor/fields/ToggleField.d.ts +0 -1
  288. package/dist/editor/fields/ToggleField.js +0 -1
  289. package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
  290. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
  291. package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
  292. package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
  293. package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
  294. package/dist/editor/group-manager/GroupCard.d.ts +0 -3
  295. package/dist/editor/group-manager/GroupForm.d.ts +0 -3
  296. package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
  297. package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
  298. package/dist/editor/group-manager/MemberList.d.ts +0 -3
  299. package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
  300. package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
  301. package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
  302. package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
  303. package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
  304. package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
  305. package/dist/editor/group-manager/index.d.ts +0 -6
  306. package/dist/editor/group-manager/index.js +0 -10
  307. package/dist/editor/group-manager/types.d.ts +2 -5
  308. package/dist/editor/group-manager/types.js +0 -3
  309. package/dist/editor/hooks/index.d.ts +6 -11
  310. package/dist/editor/hooks/index.js +6 -12
  311. package/dist/editor/hooks/useBranchActions.d.ts +0 -14
  312. package/dist/editor/hooks/useBranchActions.js +0 -22
  313. package/dist/editor/hooks/useBranchManager.d.ts +2 -48
  314. package/dist/editor/hooks/useBranchManager.js +4 -64
  315. package/dist/editor/hooks/useBranchesData.d.ts +7 -6
  316. package/dist/editor/hooks/useBranchesData.js +7 -6
  317. package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
  318. package/dist/editor/hooks/useCommentSystem.js +1 -36
  319. package/dist/editor/hooks/useDraftManager.d.ts +2 -35
  320. package/dist/editor/hooks/useDraftManager.js +23 -64
  321. package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
  322. package/dist/editor/hooks/useEditorLayout.js +0 -23
  323. package/dist/editor/hooks/useEntriesData.d.ts +1 -0
  324. package/dist/editor/hooks/useEntriesData.js +2 -3
  325. package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
  326. package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
  327. package/dist/editor/hooks/useEntryManager.d.ts +2 -27
  328. package/dist/editor/hooks/useEntryManager.js +29 -78
  329. package/dist/editor/hooks/useGroupManager.d.ts +0 -21
  330. package/dist/editor/hooks/useGroupManager.js +0 -21
  331. package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
  332. package/dist/editor/hooks/usePermissionManager.js +0 -20
  333. package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
  334. package/dist/editor/hooks/useReferenceResolution.js +1 -48
  335. package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
  336. package/dist/editor/hooks/useSchemaManager.js +0 -19
  337. package/dist/editor/hooks/useUserContext.d.ts +2 -9
  338. package/dist/editor/hooks/useUserContext.js +10 -10
  339. package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
  340. package/dist/editor/hooks/useUserMetadata.js +0 -3
  341. package/dist/editor/media/AssetCard.d.ts +0 -1
  342. package/dist/editor/media/AssetCard.js +1 -2
  343. package/dist/editor/media/CropStep.d.ts +0 -1
  344. package/dist/editor/media/CropStep.js +0 -1
  345. package/dist/editor/media/MediaLibrary.d.ts +1 -2
  346. package/dist/editor/media/MediaLibrary.js +1 -2
  347. package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
  348. package/dist/editor/media/MediaLibraryBody.js +0 -1
  349. package/dist/editor/media/crop-math.d.ts +1 -1
  350. package/dist/editor/media/crop-math.js +1 -1
  351. package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
  352. package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
  353. package/dist/editor/permission-manager/PermissionEditor.js +0 -1
  354. package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
  355. package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
  356. package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
  357. package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
  358. package/dist/editor/permission-manager/constants.d.ts +0 -3
  359. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
  360. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
  361. package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
  362. package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
  363. package/dist/editor/permission-manager/index.d.ts +0 -7
  364. package/dist/editor/permission-manager/index.js +0 -16
  365. package/dist/editor/permission-manager/types.d.ts +2 -12
  366. package/dist/editor/permission-manager/types.js +0 -3
  367. package/dist/editor/permission-manager/utils.d.ts +0 -28
  368. package/dist/editor/permission-manager/utils.js +9 -23
  369. package/dist/editor/preview-bridge.d.ts +5 -1
  370. package/dist/editor/preview-bridge.js +4 -4
  371. package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
  372. package/dist/editor/schema-editor/CollectionEditor.js +9 -31
  373. package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
  374. package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
  375. package/dist/editor/schema-editor/index.d.ts +0 -7
  376. package/dist/editor/schema-editor/index.js +0 -7
  377. package/dist/editor/utils/env.d.ts +3 -18
  378. package/dist/editor/utils/env.js +6 -25
  379. package/dist/entry-link-resolver.d.ts +13 -35
  380. package/dist/entry-link-resolver.js +20 -53
  381. package/dist/entry-schema-registry.d.ts +20 -60
  382. package/dist/entry-schema-registry.js +20 -69
  383. package/dist/entry-schema.d.ts +118 -223
  384. package/dist/entry-schema.js +46 -91
  385. package/dist/git-manager.d.ts +101 -200
  386. package/dist/git-manager.js +211 -384
  387. package/dist/github-service.d.ts +34 -75
  388. package/dist/github-service.js +37 -91
  389. package/dist/http/handler.d.ts +6 -37
  390. package/dist/http/handler.js +65 -120
  391. package/dist/http/router.d.ts +15 -32
  392. package/dist/http/router.js +34 -99
  393. package/dist/http/types.d.ts +15 -40
  394. package/dist/http/types.js +3 -7
  395. package/dist/id.d.ts +4 -10
  396. package/dist/id.js +4 -10
  397. package/dist/index.js +6 -9
  398. package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
  399. package/dist/operating-mode/client-safe-strategy.js +8 -28
  400. package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
  401. package/dist/operating-mode/client-unsafe-strategy.js +9 -34
  402. package/dist/operating-mode/client.d.ts +3 -10
  403. package/dist/operating-mode/client.js +3 -8
  404. package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
  405. package/dist/operating-mode/deployment-name-fixtures.js +14 -18
  406. package/dist/operating-mode/deployment-name.d.ts +19 -29
  407. package/dist/operating-mode/deployment-name.js +29 -47
  408. package/dist/operating-mode/index.d.ts +4 -25
  409. package/dist/operating-mode/index.js +9 -31
  410. package/dist/operating-mode/mode-env.d.ts +32 -54
  411. package/dist/operating-mode/mode-env.js +36 -58
  412. package/dist/operating-mode/types.d.ts +24 -72
  413. package/dist/operating-mode/types.js +1 -7
  414. package/dist/paths/branch-name.d.ts +30 -40
  415. package/dist/paths/branch-name.js +30 -40
  416. package/dist/paths/branch.d.ts +4 -18
  417. package/dist/paths/branch.js +6 -22
  418. package/dist/paths/index.d.ts +2 -13
  419. package/dist/paths/index.js +3 -23
  420. package/dist/paths/normalize-server.d.ts +3 -15
  421. package/dist/paths/normalize-server.js +3 -15
  422. package/dist/paths/normalize.d.ts +13 -33
  423. package/dist/paths/normalize.js +13 -33
  424. package/dist/paths/resolve.d.ts +4 -17
  425. package/dist/paths/resolve.js +4 -22
  426. package/dist/paths/types.d.ts +12 -34
  427. package/dist/paths/types.js +5 -7
  428. package/dist/paths/validation.d.ts +22 -119
  429. package/dist/paths/validation.js +30 -148
  430. package/dist/reference-resolver.d.ts +0 -13
  431. package/dist/reference-resolver.js +0 -18
  432. package/dist/resolve-canopy-user.d.ts +16 -18
  433. package/dist/resolve-canopy-user.js +17 -26
  434. package/dist/resource-generation.d.ts +16 -25
  435. package/dist/resource-generation.js +34 -97
  436. package/dist/schema/meta-loader.d.ts +2 -14
  437. package/dist/schema/meta-loader.js +15 -64
  438. package/dist/schema/resolver.d.ts +1 -4
  439. package/dist/schema/resolver.js +1 -6
  440. package/dist/schema/schema-store-types.d.ts +0 -12
  441. package/dist/schema/schema-store.d.ts +61 -138
  442. package/dist/schema/schema-store.js +85 -282
  443. package/dist/schema/types.d.ts +0 -4
  444. package/dist/server.d.ts +62 -93
  445. package/dist/server.js +63 -94
  446. package/dist/services.d.ts +23 -47
  447. package/dist/services.js +55 -98
  448. package/dist/settings-workspace.d.ts +17 -30
  449. package/dist/settings-workspace.js +51 -81
  450. package/dist/static/index.d.ts +26 -52
  451. package/dist/static/index.js +33 -67
  452. package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
  453. package/dist/task-queue/cms-task-queue.js +13 -0
  454. package/dist/task-queue/task-queue-config.d.ts +3 -0
  455. package/dist/{worker → task-queue}/task-queue-config.js +1 -6
  456. package/dist/task-queue/task-queue.d.ts +16 -22
  457. package/dist/task-queue/task-queue.js +20 -44
  458. package/dist/task-queue/types.d.ts +0 -1
  459. package/dist/task-queue/worker-status.d.ts +35 -0
  460. package/dist/task-queue/worker-status.js +40 -0
  461. package/dist/types.d.ts +40 -51
  462. package/dist/url-collision.d.ts +26 -40
  463. package/dist/url-collision.js +47 -63
  464. package/dist/url-exclusivity-fixtures.d.ts +15 -20
  465. package/dist/url-exclusivity-fixtures.js +14 -19
  466. package/dist/url-path-resolver.d.ts +8 -16
  467. package/dist/url-path-resolver.js +19 -29
  468. package/dist/user.d.ts +8 -21
  469. package/dist/user.js +10 -19
  470. package/dist/utils/async-mutex.js +4 -6
  471. package/dist/utils/atomic-write.d.ts +2 -11
  472. package/dist/utils/atomic-write.js +2 -11
  473. package/dist/utils/body-field.d.ts +8 -15
  474. package/dist/utils/body-field.js +8 -15
  475. package/dist/utils/content-serialize.d.ts +18 -24
  476. package/dist/utils/content-serialize.js +109 -160
  477. package/dist/utils/content-write-lock.d.ts +51 -106
  478. package/dist/utils/content-write-lock.js +66 -111
  479. package/dist/utils/debug.d.ts +7 -23
  480. package/dist/utils/debug.js +7 -23
  481. package/dist/utils/entry-url.d.ts +11 -23
  482. package/dist/utils/entry-url.js +11 -26
  483. package/dist/utils/error.d.ts +25 -90
  484. package/dist/utils/error.js +60 -147
  485. package/dist/utils/flatten-group-fields.d.ts +5 -7
  486. package/dist/utils/flatten-group-fields.js +5 -7
  487. package/dist/utils/format.d.ts +1 -5
  488. package/dist/utils/format.js +1 -5
  489. package/dist/utils/fs.d.ts +3 -4
  490. package/dist/utils/fs.js +3 -4
  491. package/dist/utils/git.d.ts +52 -83
  492. package/dist/utils/git.js +79 -125
  493. package/dist/utils/logger.d.ts +35 -50
  494. package/dist/utils/logger.js +35 -52
  495. package/dist/utils/provisioning-lock.d.ts +23 -35
  496. package/dist/utils/provisioning-lock.js +49 -69
  497. package/dist/utils/sanitize-href.d.ts +5 -10
  498. package/dist/utils/sanitize-href.js +8 -18
  499. package/dist/utils/title-field.d.ts +17 -20
  500. package/dist/utils/title-field.js +18 -27
  501. package/dist/utils/typed-filename.d.ts +20 -48
  502. package/dist/utils/typed-filename.js +25 -61
  503. package/dist/utils/url-prefix.d.ts +3 -3
  504. package/dist/utils/url-prefix.js +3 -3
  505. package/dist/validation/block-structural-keys.d.ts +16 -31
  506. package/dist/validation/block-structural-keys.js +19 -29
  507. package/dist/validation/deletion-checker.d.ts +0 -34
  508. package/dist/validation/deletion-checker.js +1 -43
  509. package/dist/validation/entry-link-validator.d.ts +6 -13
  510. package/dist/validation/entry-link-validator.js +4 -13
  511. package/dist/validation/entry-type-reference-validator.d.ts +13 -18
  512. package/dist/validation/entry-type-reference-validator.js +13 -18
  513. package/dist/validation/entry-validator.d.ts +13 -25
  514. package/dist/validation/entry-validator.js +15 -32
  515. package/dist/validation/field-traversal.d.ts +3 -30
  516. package/dist/validation/field-traversal.js +1 -32
  517. package/dist/validation/reference-validator.d.ts +5 -24
  518. package/dist/validation/reference-validator.js +5 -30
  519. package/dist/worker/cms-worker.d.ts +172 -232
  520. package/dist/worker/cms-worker.js +241 -333
  521. package/dist/worker/git-sync.d.ts +32 -133
  522. package/dist/worker/git-sync.js +129 -191
  523. package/dist/worker/github-auth.d.ts +13 -19
  524. package/dist/worker/github-auth.js +13 -19
  525. package/dist/worker/history-rewrite.d.ts +53 -66
  526. package/dist/worker/history-rewrite.js +54 -60
  527. package/dist/worker/log.d.ts +24 -41
  528. package/dist/worker/log.js +25 -42
  529. package/dist/worker/rebase.d.ts +20 -110
  530. package/dist/worker/rebase.js +279 -354
  531. package/dist/worker/task-runner.d.ts +32 -66
  532. package/dist/worker/task-runner.js +126 -162
  533. package/dist/worker/worker-context.d.ts +41 -81
  534. package/package.json +4 -4
  535. package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
  536. package/dist/worker/task-queue-config.d.ts +0 -8
  537. package/dist/worker/task-queue.js +0 -19
  538. package/dist/worker/worker-status.d.ts +0 -47
  539. package/dist/worker/worker-status.js +0 -52
@@ -3,26 +3,6 @@ import { notifications } from '@mantine/notifications';
3
3
  import { useApiClient } from '../context/index.js';
4
4
  /**
5
5
  * Custom hook for managing internal groups (CRUD operations).
6
- *
7
- * Handles:
8
- * - Loading groups from API
9
- * - Saving groups to API
10
- * - Searching for users to add to groups
11
- * - Searching for external groups
12
- *
13
- * @example
14
- * ```tsx
15
- * const { groupsData, groupsLoading, handleSaveGroups, handleSearchUsers } = useGroupManager({
16
- * isOpen: groupManagerOpen
17
- * })
18
- *
19
- * // Groups are automatically loaded when isOpen becomes true
20
- * // Save groups
21
- * await handleSaveGroups(updatedGroups)
22
- *
23
- * // Search users
24
- * const users = await handleSearchUsers('john', 10)
25
- * ```
26
6
  */
27
7
  export function useGroupManager(options) {
28
8
  const apiClient = useApiClient();
@@ -114,7 +94,6 @@ export function useGroupManager(options) {
114
94
  return [];
115
95
  }
116
96
  }, []);
117
- // Load groups when group manager opens
118
97
  useEffect(() => {
119
98
  if (options.isOpen) {
120
99
  loadGroups();
@@ -2,7 +2,6 @@ import type { PathPermission } from '../../config/index.js';
2
2
  import type { PermissionGroupOption } from '../../auth/types.js';
3
3
  export interface UsePermissionManagerOptions {
4
4
  /**
5
- * Whether the permission manager is currently open.
6
5
  * Permissions are loaded when this becomes true.
7
6
  */
8
7
  isOpen: boolean;
@@ -16,24 +15,5 @@ export interface UsePermissionManagerReturn {
16
15
  }
17
16
  /**
18
17
  * Custom hook for managing path permissions (CRUD operations).
19
- *
20
- * Handles:
21
- * - Loading permissions from API
22
- * - Saving permissions to API
23
- * - Listing groups for permission assignment
24
- *
25
- * @example
26
- * ```tsx
27
- * const { permissionsData, permissionsLoading, handleSavePermissions, handleListGroups } = usePermissionManager({
28
- * isOpen: permissionManagerOpen
29
- * })
30
- *
31
- * // Permissions are automatically loaded when isOpen becomes true
32
- * // Save permissions
33
- * await handleSavePermissions(updatedPermissions)
34
- *
35
- * // List groups
36
- * const groups = await handleListGroups()
37
- * ```
38
18
  */
39
19
  export declare function usePermissionManager(options: UsePermissionManagerOptions): UsePermissionManagerReturn;
@@ -3,25 +3,6 @@ import { notifications } from '@mantine/notifications';
3
3
  import { useApiClient } from '../context/index.js';
4
4
  /**
5
5
  * Custom hook for managing path permissions (CRUD operations).
6
- *
7
- * Handles:
8
- * - Loading permissions from API
9
- * - Saving permissions to API
10
- * - Listing groups for permission assignment
11
- *
12
- * @example
13
- * ```tsx
14
- * const { permissionsData, permissionsLoading, handleSavePermissions, handleListGroups } = usePermissionManager({
15
- * isOpen: permissionManagerOpen
16
- * })
17
- *
18
- * // Permissions are automatically loaded when isOpen becomes true
19
- * // Save permissions
20
- * await handleSavePermissions(updatedPermissions)
21
- *
22
- * // List groups
23
- * const groups = await handleListGroups()
24
- * ```
25
6
  */
26
7
  export function usePermissionManager(options) {
27
8
  const apiClient = useApiClient();
@@ -90,7 +71,6 @@ export function usePermissionManager(options) {
90
71
  }
91
72
  return result.data?.groups ?? [];
92
73
  };
93
- // Load permissions when permission manager opens
94
74
  useEffect(() => {
95
75
  if (options.isOpen) {
96
76
  loadPermissions();
@@ -1,37 +1,5 @@
1
- /**
2
- * Hook for live preview reference resolution
3
- *
4
- * LIVE PREVIEW REFERENCE RESOLUTION
5
- *
6
- * Problem: The preview needs full referenced content (e.g., {name: "Alice", bio: "..."}),
7
- * but the form only stores IDs (e.g., "5NVkkrB1MJUvnLqEDqDkRN").
8
- *
9
- * Solution: Synchronous resolution with background caching
10
- *
11
- * 1. SYNCHRONOUS PHASE (useMemo):
12
- * - Compute resolvedValue by applying cached data to form value
13
- * - If reference ID is in cache, use full object; otherwise keep ID
14
- * - Runs during render, so no async gaps or race conditions
15
- * - Preview always gets complete, valid data
16
- *
17
- * 2. BACKGROUND PHASE (useEffect):
18
- * - Find IDs not in cache
19
- * - After 300ms debounce, fetch from API
20
- * - Update cache with resolved data
21
- * - Trigger useMemo re-run via resolutionTrigger
22
- * - Preview updates again with full data
23
- *
24
- * This two-phase approach eliminates race conditions that occurred with async state,
25
- * where form data and resolved data could get out of sync during transitions
26
- * (e.g., "Discard All Drafts" was passing empty objects to preview).
27
- *
28
- * Cache structure: Map<string, unknown> with keys like "main:5NVkkrB1MJUvnLqEDqDkRN"
29
- * - Branch-scoped to prevent stale cross-branch data
30
- * - Cleared on branch change
31
- * - Persists across edits for instant re-renders
32
- */
33
1
  import type { EntrySchema } from '../../config/index.js';
34
- export type FormValue = Record<string, unknown>;
2
+ type FormValue = Record<string, unknown>;
35
3
  export interface UseReferenceResolutionOptions {
36
4
  value: FormValue;
37
5
  fields: EntrySchema;
@@ -44,3 +12,4 @@ export interface UseReferenceResolutionResult {
44
12
  loadingState: FormValue;
45
13
  }
46
14
  export declare function useReferenceResolution({ value, fields, branch, onResolvedValueChange, onLoadingStateChange, }: UseReferenceResolutionOptions): UseReferenceResolutionResult;
15
+ export {};
@@ -1,35 +1,3 @@
1
- /**
2
- * Hook for live preview reference resolution
3
- *
4
- * LIVE PREVIEW REFERENCE RESOLUTION
5
- *
6
- * Problem: The preview needs full referenced content (e.g., {name: "Alice", bio: "..."}),
7
- * but the form only stores IDs (e.g., "5NVkkrB1MJUvnLqEDqDkRN").
8
- *
9
- * Solution: Synchronous resolution with background caching
10
- *
11
- * 1. SYNCHRONOUS PHASE (useMemo):
12
- * - Compute resolvedValue by applying cached data to form value
13
- * - If reference ID is in cache, use full object; otherwise keep ID
14
- * - Runs during render, so no async gaps or race conditions
15
- * - Preview always gets complete, valid data
16
- *
17
- * 2. BACKGROUND PHASE (useEffect):
18
- * - Find IDs not in cache
19
- * - After 300ms debounce, fetch from API
20
- * - Update cache with resolved data
21
- * - Trigger useMemo re-run via resolutionTrigger
22
- * - Preview updates again with full data
23
- *
24
- * This two-phase approach eliminates race conditions that occurred with async state,
25
- * where form data and resolved data could get out of sync during transitions
26
- * (e.g., "Discard All Drafts" was passing empty objects to preview).
27
- *
28
- * Cache structure: Map&lt;string, unknown&gt; with keys like "main:5NVkkrB1MJUvnLqEDqDkRN"
29
- * - Branch-scoped to prevent stale cross-branch data
30
- * - Cleared on branch change
31
- * - Persists across edits for instant re-renders
32
- */
33
1
  import { useEffect, useMemo, useRef, useState } from 'react';
34
2
  import { resolveChangedReferences } from '../client-reference-resolver.js';
35
3
  import { flattenGroupFields } from '../../utils/flatten-group-fields.js';
@@ -52,7 +20,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
52
20
  // clearTimeout can't: a newer value/branch superseding this attempt, or
53
21
  // the component unmounting, while the network call was in flight.
54
22
  const resolveGenerationRef = useRef(0);
55
- // Map field names to their types for fast lookup
56
23
  const referenceFieldNames = useMemo(() => {
57
24
  const names = new Set();
58
25
  for (const field of flattenGroupFields(fields)) {
@@ -77,25 +44,20 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
77
44
  */
78
45
  const resolvedValue = useMemo(() => {
79
46
  const result = { ...value };
80
- // Synchronously apply cached resolutions
81
47
  for (const fieldName of referenceFieldNames) {
82
48
  const fieldValue = value[fieldName];
83
49
  if (fieldValue) {
84
50
  if (Array.isArray(fieldValue)) {
85
- // List of references
86
51
  result[fieldName] = fieldValue.map((id) => {
87
52
  if (typeof id === 'string') {
88
53
  const cached = resolvedCache.current.get(`${branch}:${id}`);
89
- // Return cached object, or null if not yet resolved
90
54
  return cached || null;
91
55
  }
92
56
  return id;
93
57
  });
94
58
  }
95
59
  else if (typeof fieldValue === 'string') {
96
- // Single reference
97
60
  const cached = resolvedCache.current.get(`${branch}:${fieldValue}`);
98
- // Return cached object, or null if not yet resolved
99
61
  result[fieldName] = cached || null;
100
62
  }
101
63
  }
@@ -112,7 +74,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
112
74
  const fieldValue = value[fieldName];
113
75
  if (fieldValue) {
114
76
  if (Array.isArray(fieldValue)) {
115
- // List of references - return array of booleans
116
77
  result[fieldName] = fieldValue.map((id) => {
117
78
  if (typeof id === 'string') {
118
79
  return !resolvedCache.current.has(`${branch}:${id}`);
@@ -121,7 +82,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
121
82
  });
122
83
  }
123
84
  else if (typeof fieldValue === 'string') {
124
- // Single reference - return boolean
125
85
  result[fieldName] = !resolvedCache.current.has(`${branch}:${fieldValue}`);
126
86
  }
127
87
  else {
@@ -140,7 +100,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
140
100
  * Find reference IDs that aren't in cache yet and fetch them from the API.
141
101
  */
142
102
  useEffect(() => {
143
- // Find all uncached reference IDs
144
103
  const uncachedIds = new Set();
145
104
  for (const fieldName of referenceFieldNames) {
146
105
  const fieldValue = value[fieldName];
@@ -162,16 +121,13 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
162
121
  // moment THIS attempt was scheduled -- not whatever the ref happens to
163
122
  // hold when the callback resumes after its await.
164
123
  const generation = ++resolveGenerationRef.current;
165
- // Debounce API calls to batch multiple rapid changes
166
124
  const timeout = setTimeout(async () => {
167
125
  try {
168
- // Resolve uncached IDs via API
169
126
  const updates = await resolveChangedReferences(prevValueRef.current, value, fields, branch, resolvedCache.current, apiClient ?? undefined);
170
127
  // A newer value/branch superseded this attempt, or the component
171
128
  // unmounted, while the request above was in flight -- discard.
172
129
  if (generation !== resolveGenerationRef.current)
173
130
  return;
174
- // Update cache with resolved values
175
131
  for (const [fieldName, resolvedFieldValue] of Object.entries(updates)) {
176
132
  if (Array.isArray(resolvedFieldValue)) {
177
133
  resolvedFieldValue.forEach((obj, idx) => {
@@ -191,7 +147,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
191
147
  }
192
148
  }
193
149
  }
194
- // Trigger useMemo re-computation
195
150
  setResolutionTrigger((prev) => prev + 1);
196
151
  prevValueRef.current = value;
197
152
  }
@@ -207,10 +162,9 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
207
162
  ++resolveGenerationRef.current;
208
163
  };
209
164
  }, [value, fields, branch, referenceFieldNames, apiClient]);
210
- // Clear cache when branch changes
211
165
  useEffect(() => {
212
166
  resolvedCache.current.clear();
213
- setResolutionTrigger((prev) => prev + 1); // Trigger re-computation with empty cache
167
+ setResolutionTrigger((prev) => prev + 1);
214
168
  }, [branch]);
215
169
  // Notify parent of resolved value changes (with infinite loop prevention)
216
170
  useEffect(() => {
@@ -220,7 +174,6 @@ export function useReferenceResolution({ value, fields, branch, onResolvedValueC
220
174
  onResolvedValueChange?.(resolvedValue);
221
175
  }
222
176
  }, [resolvedValue, onResolvedValueChange]);
223
- // Notify parent of loading state changes
224
177
  const lastNotifiedLoadingRef = useRef('');
225
178
  useEffect(() => {
226
179
  const serialized = JSON.stringify(loadingState);
@@ -6,13 +6,12 @@ export interface UseSchemaManagerOptions {
6
6
  }
7
7
  /**
8
8
  * Result of a schema mutation that has no success payload. Callers branch on
9
- * `ok` to get a real error message instead of a bare `false`/`null` — see
10
- * PR #106 review follow-up item 7: `useSchemaManager` used to swallow every
11
- * failure into a toast, leaving catch blocks in `Editor`/`CollectionEditor`
12
- * with nothing but a hardcoded generic message (or no inline error at all).
13
- * Result objects (rather than rethrowing) keep fire-and-forget call sites
14
- * (e.g. `updateOrder` from a reorder click) compiling without turning them
15
- * into unhandled rejections.
9
+ * `ok` to get a real error message instead of a bare `false`/`null`: every
10
+ * operation returns a result object rather than throwing, so a failure is
11
+ * surfaced per call site instead of collapsing into one generic toast.
12
+ * Result objects (rather than rethrowing) also keep fire-and-forget call
13
+ * sites (e.g. `updateOrder` from a reorder click) compiling without turning
14
+ * them into unhandled rejections.
16
15
  */
17
16
  export type SchemaOpResult = {
18
17
  ok: true;
@@ -21,7 +20,7 @@ export type SchemaOpResult = {
21
20
  error: string;
22
21
  };
23
22
  /** Same shape as {@link SchemaOpResult}, plus a payload on success. */
24
- export type CreateCollectionResult = {
23
+ type CreateCollectionResult = {
25
24
  ok: true;
26
25
  data: {
27
26
  collectionPath: LogicalPath;
@@ -45,25 +44,7 @@ export interface UseSchemaManagerReturn {
45
44
  /**
46
45
  * Hook for managing schema operations (collections, entry types, ordering).
47
46
  *
48
- * Provides methods to create, update, and delete collections and entry types.
49
47
  * All operations require admin permissions on the server.
50
- *
51
- * @example
52
- * ```tsx
53
- * const {
54
- * createCollection,
55
- * deleteCollection,
56
- * addEntryType,
57
- * updateOrder,
58
- * isLoading
59
- * } = useSchemaManager({ branchName: 'main', onSchemaChange: refreshEntries })
60
- *
61
- * // Create a new collection
62
- * await createCollection({
63
- * name: 'posts',
64
- * label: 'Blog Posts',
65
- * entries: [{ name: 'post', format: 'mdx', schema: 'postSchema' }]
66
- * })
67
- * ```
68
48
  */
69
49
  export declare function useSchemaManager(options: UseSchemaManagerOptions): UseSchemaManagerReturn;
50
+ export {};
@@ -5,26 +5,7 @@ import { getErrorMessage } from '../../utils/error.js';
5
5
  /**
6
6
  * Hook for managing schema operations (collections, entry types, ordering).
7
7
  *
8
- * Provides methods to create, update, and delete collections and entry types.
9
8
  * All operations require admin permissions on the server.
10
- *
11
- * @example
12
- * ```tsx
13
- * const {
14
- * createCollection,
15
- * deleteCollection,
16
- * addEntryType,
17
- * updateOrder,
18
- * isLoading
19
- * } = useSchemaManager({ branchName: 'main', onSchemaChange: refreshEntries })
20
- *
21
- * // Create a new collection
22
- * await createCollection({
23
- * name: 'posts',
24
- * label: 'Blog Posts',
25
- * entries: [{ name: 'post', format: 'mdx', schema: 'postSchema' }]
26
- * })
27
- * ```
28
9
  */
29
10
  export function useSchemaManager(options) {
30
11
  const apiClient = useApiClient();
@@ -8,14 +8,7 @@ export interface UseUserContextReturn {
8
8
  * Hook to fetch current user context from the API.
9
9
  * This provides the userId and groups needed for permission checks.
10
10
  *
11
- * @example
12
- * ```tsx
13
- * const { userContext, loading, error } = useUserContext()
14
- *
15
- * if (loading) return <div>Loading...</div>
16
- * if (error) return <div>Error: {error}</div>
17
- *
18
- * return <BranchManager user={userContext} />
19
- * ```
11
+ * Inside an `EditorAuthGate` (always, under `CanopyEditor`) it returns the identity the gate
12
+ * already resolved and issues no request of its own. Outside one it fetches `whoami` itself.
20
13
  */
21
14
  export declare function useUserContext(): UseUserContextReturn;
@@ -2,21 +2,16 @@
2
2
  import { useEffect, useState } from 'react';
3
3
  import { createApiClient } from '../../api/index.js';
4
4
  import { useOptionalApiClient } from '../context/index.js';
5
+ import { useEditorIdentity } from '../context/EditorIdentityContext.js';
5
6
  /**
6
7
  * Hook to fetch current user context from the API.
7
8
  * This provides the userId and groups needed for permission checks.
8
9
  *
9
- * @example
10
- * ```tsx
11
- * const { userContext, loading, error } = useUserContext()
12
- *
13
- * if (loading) return <div>Loading...</div>
14
- * if (error) return <div>Error: {error}</div>
15
- *
16
- * return <BranchManager user={userContext} />
17
- * ```
10
+ * Inside an `EditorAuthGate` (always, under `CanopyEditor`) it returns the identity the gate
11
+ * already resolved and issues no request of its own. Outside one it fetches `whoami` itself.
18
12
  */
19
13
  export function useUserContext() {
14
+ const gateIdentity = useEditorIdentity();
20
15
  const [userContext, setUserContext] = useState();
21
16
  const [loading, setLoading] = useState(true);
22
17
  const [error, setError] = useState();
@@ -26,6 +21,8 @@ export function useUserContext() {
26
21
  // which case we fall back to a default-configured client below.
27
22
  const contextApiClient = useOptionalApiClient();
28
23
  useEffect(() => {
24
+ if (gateIdentity)
25
+ return;
29
26
  const fetchUserContext = async () => {
30
27
  setLoading(true);
31
28
  try {
@@ -50,6 +47,9 @@ export function useUserContext() {
50
47
  }
51
48
  };
52
49
  fetchUserContext();
53
- }, [contextApiClient]);
50
+ }, [contextApiClient, gateIdentity]);
51
+ if (gateIdentity) {
52
+ return { userContext: gateIdentity.user, loading: false, error: undefined };
53
+ }
54
54
  return { userContext, loading, error };
55
55
  }
@@ -8,8 +8,6 @@ export interface UseUserMetadataResult {
8
8
  /**
9
9
  * Fetches user metadata using the provided getter function.
10
10
  *
11
- * @param userId - User ID to fetch metadata for
12
- * @param getUserMetadata - Function to fetch user metadata
13
11
  * @param cachedUser - Optional: if provided, returns immediately without fetching
14
12
  */
15
13
  export declare function useUserMetadata(userId: CanopyUserId, getUserMetadata: (userId: string) => Promise<UserSearchResult | null>, cachedUser?: UserSearchResult): UseUserMetadataResult;
@@ -2,8 +2,6 @@ import { useEffect, useState } from 'react';
2
2
  /**
3
3
  * Fetches user metadata using the provided getter function.
4
4
  *
5
- * @param userId - User ID to fetch metadata for
6
- * @param getUserMetadata - Function to fetch user metadata
7
5
  * @param cachedUser - Optional: if provided, returns immediately without fetching
8
6
  */
9
7
  export function useUserMetadata(userId, getUserMetadata, cachedUser) {
@@ -11,7 +9,6 @@ export function useUserMetadata(userId, getUserMetadata, cachedUser) {
11
9
  const [isLoading, setIsLoading] = useState(!cachedUser);
12
10
  const [error, setError] = useState(null);
13
11
  useEffect(() => {
14
- // Skip fetch if cachedUser provided
15
12
  if (cachedUser)
16
13
  return;
17
14
  // Special case: anonymous user
@@ -17,4 +17,3 @@ export interface AssetCardProps {
17
17
  * render a file-type icon instead.
18
18
  */
19
19
  export declare const AssetCard: React.FC<AssetCardProps>;
20
- export default AssetCard;
@@ -17,7 +17,7 @@ export const AssetCard = ({ asset, baseUrl, onSelect, onDelete }) => {
17
17
  const thumbnailSrc = assetUrl(asset, { width: THUMBNAIL_WIDTH, baseUrl });
18
18
  const [thumbnailFailed, setThumbnailFailed] = useState(false);
19
19
  // Reset the error state if the underlying asset/src changes, so a
20
- // previously-broken thumbnail gets another chance to load. Adjusting state
20
+ // thumbnail that failed earlier gets another chance to load. Adjusting state
21
21
  // during render (rather than in a useEffect) avoids an extra render pass -
22
22
  // see https://react.dev/learn/you-might-not-need-an-effect#adjusting-some-state-when-a-prop-changes
23
23
  const [prevThumbnailSrc, setPrevThumbnailSrc] = useState(thumbnailSrc);
@@ -58,4 +58,3 @@ export const AssetCard = ({ asset, baseUrl, onSelect, onDelete }) => {
58
58
  background: 'var(--mantine-color-gray-1)',
59
59
  }, children: [_jsx(IconPhotoOff, { size: 28, stroke: 1.5, color: "var(--mantine-color-gray-5)" }), _jsx(Text, { size: "xs", c: "dimmed", children: "Preview unavailable" })] })) : (_jsx("img", { src: thumbnailSrc, alt: asset.filename, style: { width: '100%', height: 100, objectFit: 'cover', display: 'block' }, onError: () => setThumbnailFailed(true) })) }), _jsx(Tooltip, { label: asset.filename, openDelay: 400, children: _jsx(Text, { size: "xs", fw: 500, truncate: true, mt: 4, children: asset.slug }) }), _jsx(Text, { size: "xs", c: "dimmed", children: uploadedDate })] }));
60
60
  };
61
- export default AssetCard;
@@ -22,4 +22,3 @@ export interface CropStepProps {
22
22
  * that would otherwise need to call `setState` synchronously to reset it.
23
23
  */
24
24
  export declare const CropStep: React.FC<CropStepProps>;
25
- export default CropStep;
@@ -34,4 +34,3 @@ const CropStepBody = ({ imageSrc, aspect, initialCrop, onConfirm, onClose, }) =>
34
34
  const initialCroppedAreaPercentages = initialCrop ? cropRectToAreaPercent(initialCrop) : undefined;
35
35
  return (_jsxs(Stack, { gap: "md", children: [_jsx("div", { style: { position: 'relative', width: '100%', height: 360, background: '#000' }, children: _jsx(Cropper, { image: imageSrc, crop: crop, zoom: zoom, aspect: aspect, initialCroppedAreaPercentages: initialCroppedAreaPercentages, onCropChange: setCrop, onZoomChange: setZoom, onCropComplete: (croppedArea) => setPendingArea(croppedArea) }) }), _jsxs(Group, { gap: "sm", align: "center", children: [_jsx(Text, { size: "sm", w: 50, children: "Zoom" }), _jsx(Slider, { style: { flex: 1 }, min: MIN_ZOOM, max: MAX_ZOOM, step: ZOOM_STEP, value: zoom, onChange: setZoom, label: (value) => `${value.toFixed(2)}x` })] }), _jsxs(Group, { justify: "flex-end", children: [_jsx(Button, { variant: "default", onClick: onClose, children: "Cancel" }), _jsx(Button, { onClick: handleConfirm, disabled: !pendingArea, "data-testid": "crop-step-apply", children: "Apply crop" })] })] }));
36
36
  };
37
- export default CropStep;
@@ -15,7 +15,6 @@ export interface MediaLibraryProps {
15
15
  /**
16
16
  * One component, two presentations, sharing the same grid/upload/filter/
17
17
  * pagination/delete core (MediaLibraryBody) - see
18
- * .claude/future-tasks/assets-media-system.md "MediaManager design".
18
+ * .claude/future-tasks/resolved/assets-media-system.md "MediaManager design".
19
19
  */
20
20
  export declare const MediaLibrary: React.FC<MediaLibraryProps>;
21
- export default MediaLibrary;
@@ -5,7 +5,7 @@ import { MediaLibraryBody } from './MediaLibraryBody.js';
5
5
  /**
6
6
  * One component, two presentations, sharing the same grid/upload/filter/
7
7
  * pagination/delete core (MediaLibraryBody) - see
8
- * .claude/future-tasks/assets-media-system.md "MediaManager design".
8
+ * .claude/future-tasks/resolved/assets-media-system.md "MediaManager design".
9
9
  */
10
10
  export const MediaLibrary = ({ opened, onClose, mode, onSelect }) => {
11
11
  if (mode === 'picker') {
@@ -13,4 +13,3 @@ export const MediaLibrary = ({ opened, onClose, mode, onSelect }) => {
13
13
  }
14
14
  return (_jsx(Drawer, { opened: opened, onClose: onClose, position: "right", title: _jsxs("div", { children: [_jsx(Title, { order: 4, children: "Media library" }), _jsx(Text, { size: "xs", c: "dimmed", children: "Upload and manage images and PDFs" })] }), padding: "md", size: 700, overlayProps: { blur: 2 }, "data-testid": "media-library-manage", children: _jsx(MediaLibraryBody, { opened: opened, mode: "manage" }) }));
15
15
  };
16
- export default MediaLibrary;
@@ -13,4 +13,3 @@ export interface MediaLibraryBodyProps {
13
13
  * MediaLibrary.tsx for the two wrappers.
14
14
  */
15
15
  export declare const MediaLibraryBody: React.FC<MediaLibraryBodyProps>;
16
- export default MediaLibraryBody;
@@ -139,4 +139,3 @@ export const MediaLibraryBody = ({ opened, mode, onSelect }) => {
139
139
  : 'Drop an image or PDF here, or click to browse' })] }) }), upload.uploading &&
140
140
  (upload.progress !== null ? (_jsx(Progress, { value: upload.progress * 100, size: "sm", "data-testid": "upload-progress" })) : (_jsx(Progress, { value: 100, size: "sm", animated: true, "data-testid": "upload-progress-indeterminate" }))), upload.error && (_jsx(Alert, { icon: _jsx(IconAlertCircle, { size: 16 }), color: "red", "data-testid": "upload-error", children: upload.error })), _jsx(TextInput, { placeholder: "Filter by filename...", value: filterText, onChange: (event) => setFilterText(event.currentTarget.value), "data-testid": "media-library-filter" }), listError && (_jsx(Alert, { icon: _jsx(IconAlertCircle, { size: 16 }), color: "red", "data-testid": "media-library-error", children: _jsxs(Stack, { gap: 4, children: [_jsx(Text, { size: "sm", children: listError }), _jsx(Button, { size: "xs", variant: "light", onClick: () => void loadFirstPage(), children: "Retry" })] }) })), _jsxs(ScrollArea, { style: { flex: 1 }, children: [loading ? (_jsx(Group, { justify: "center", py: "xl", children: _jsx(Loader, { size: "sm", "data-testid": "media-library-loading" }) })) : filteredAssets.length === 0 ? (_jsx(Text, { size: "sm", c: "dimmed", py: "xl", ta: "center", children: "No assets found." })) : (_jsx(SimpleGrid, { cols: { base: 2, sm: 3, md: 4 }, spacing: "sm", children: filteredAssets.map((asset) => (_jsx(AssetCard, { asset: asset, baseUrl: baseUrl, onSelect: mode === 'picker' ? onSelect : undefined, onDelete: canDeleteAsset(asset) ? () => handleDeleteClick(asset) : undefined }, asset.hash32))) })), !loading && nextCursor && (_jsx(Group, { justify: "center", py: "sm", children: _jsx(Button, { variant: "light", size: "xs", loading: loadingMore, onClick: () => void handleLoadMore(), "data-testid": "media-library-load-more", children: "Load more" }) }))] })] }));
141
141
  };
142
- export default MediaLibraryBody;
@@ -26,7 +26,7 @@ export interface CropAreaPercent {
26
26
  */
27
27
  export declare function cropAreaPercentToRect(area: CropAreaPercent): CropRect | null;
28
28
  /**
29
- * Inverse of `cropAreaPercentToRect` - used to seed react-easy-crop's
29
+ * Inverse of `cropAreaPercentToRect` - seeds react-easy-crop's
30
30
  * `initialCroppedAreaPercentages` when re-opening the crop step for an
31
31
  * already-cropped image, so the user sees their previous selection instead
32
32
  * of starting over.
@@ -42,7 +42,7 @@ export function cropAreaPercentToRect(area) {
42
42
  return { x, y, w, h };
43
43
  }
44
44
  /**
45
- * Inverse of `cropAreaPercentToRect` - used to seed react-easy-crop's
45
+ * Inverse of `cropAreaPercentToRect` - seeds react-easy-crop's
46
46
  * `initialCroppedAreaPercentages` when re-opening the crop step for an
47
47
  * already-cropped image, so the user sees their previous selection instead
48
48
  * of starting over.
@@ -1,6 +1,3 @@
1
- /**
2
- * Group search and selection component
3
- */
4
1
  import React from 'react';
5
2
  import type { GroupSelectItem } from './types.js';
6
3
  export interface GroupSelectorProps {
@@ -1,7 +1,3 @@
1
- /**
2
- * Permission editor panel for a selected tree node.
3
- * Handles permission CRUD with tabs for each level.
4
- */
5
1
  import React from 'react';
6
2
  import type { TreeNode, PermissionLevel, GroupSelectItem, UserSearchResult } from './types.js';
7
3
  export interface PermissionEditorProps {
@@ -9,7 +9,6 @@ import { UserBadge } from '../components/UserBadge.js';
9
9
  export const PermissionEditor = ({ node, activeLevel, onSetActiveLevel, canEdit, groups, isSelected, userSearchResults, isSearchingUsers, showUserSearch, userSearchQuery, userSearchError, onSearchUsers, onGetUserMetadata, onToggleUserSearch, onAddUser, onRemoveUser, showGroupSearch, groupSearchQuery, filteredGroups, onSearchGroups, onToggleGroupSearch, onAddGroup, onRemoveGroup, }) => {
10
10
  const directPerm = node.directPermission;
11
11
  const inheritedPerm = node.inheritedPermission;
12
- // Get permission target for a level (from direct or inherited)
13
12
  const getTargetForLevel = (level, source) => {
14
13
  const perm = source === 'direct' ? directPerm : inheritedPerm;
15
14
  return perm?.[level];
@@ -1,6 +1,3 @@
1
- /**
2
- * Badge component for displaying permission levels
3
- */
4
1
  import React from 'react';
5
2
  import type { PermissionLevel, PermissionTarget } from './types.js';
6
3
  export interface PermissionLevelBadgeProps {
@@ -8,8 +5,4 @@ export interface PermissionLevelBadgeProps {
8
5
  target?: PermissionTarget;
9
6
  inherited?: PermissionTarget;
10
7
  }
11
- /**
12
- * Displays a badge for a permission level.
13
- * Shows filled badge for direct permissions, outlined for inherited.
14
- */
15
8
  export declare const PermissionLevelBadge: React.FC<PermissionLevelBadgeProps>;
@@ -2,10 +2,6 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { Badge, Tooltip } from '@mantine/core';
4
4
  import { LEVEL_CONFIG } from './constants.js';
5
- /**
6
- * Displays a badge for a permission level.
7
- * Shows filled badge for direct permissions, outlined for inherited.
8
- */
9
5
  export const PermissionLevelBadge = ({ level, target, inherited, }) => {
10
6
  const hasPerms = target && ((target.allowedUsers?.length ?? 0) > 0 || (target.allowedGroups?.length ?? 0) > 0);
11
7
  const hasInherited = !hasPerms &&
@@ -1,7 +1,3 @@
1
- /**
2
- * Tree visualization component for permission management.
3
- * Renders the content tree with permission badges and handles selection.
4
- */
5
1
  import React from 'react';
6
2
  import type { TreeNode, PermissionLevel, PermissionTarget, GroupSelectItem, UserSearchResult } from './types.js';
7
3
  export interface PermissionTreeProps {
@@ -1,6 +1,3 @@
1
- /**
2
- * User search and selection component
3
- */
4
1
  import React from 'react';
5
2
  import type { UserSearchResult } from './types.js';
6
3
  export interface UserSelectorProps {
@@ -1,6 +1,3 @@
1
- /**
2
- * Constants for PermissionManager
3
- */
4
1
  import React from 'react';
5
2
  import type { PermissionLevel } from './types.js';
6
3
  export declare const PERMISSION_LEVELS: PermissionLevel[];
@@ -1,6 +1,3 @@
1
- /**
2
- * Hook for managing groups and user search state
3
- */
4
1
  import type { UserSearchResult, PermissionGroupOption, GroupSelectItem } from '../types.js';
5
2
  export interface UseGroupsAndUsersOptions {
6
3
  onListGroups?: () => Promise<PermissionGroupOption[]>;