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
@@ -1,207 +1,127 @@
1
1
  /**
2
- * Typed API client for CanopyCMS.
2
+ * Typed API client for CanopyCMS: one method per endpoint, each returning that
3
+ * endpoint's ApiResponse.
3
4
  *
4
- * AUTO-GENERATED by scripts/generate-client.ts
5
- * Do not edit this file manually - changes will be overwritten.
5
+ * AUTO-GENERATED by scripts/generate-client.ts; do not edit this file manually
6
+ * (changes will be overwritten), edit the generator's templates instead.
6
7
  */
7
8
  import { computeContentSha256Hex } from './request-body-hash.js';
8
9
  /**
9
- * Lightweight typed API client for CanopyCMS.
10
+ * Typed client for the CanopyCMS API: one method per endpoint, grouped by namespace, each
11
+ * returning that endpoint's ApiResponse.
10
12
  *
11
- * Provides type-safe methods for all API endpoints with centralized
12
- * response unwrapping and error handling.
13
- *
14
- * @example Browser usage
15
- * ```ts
16
- * const client = createApiClient()
17
- * const branches = await client.branches.list()
18
- * if (branches.ok) {
19
- * console.log(branches.data.branches)
20
- * }
21
- * ```
22
- *
23
- * @example Test usage
13
+ * @example
24
14
  * ```ts
25
- * const client = createApiClient({
26
- * fetch: mockFetch
27
- * })
15
+ * const branches = await createApiClient().branches.list()
16
+ * if (branches.ok) console.log(branches.data.branches)
28
17
  * ```
29
18
  */
30
19
  export class CanopyApiClient {
31
20
  constructor(options = {}) {
32
- // ========== Auto-Generated Client Namespaces ==========
33
- // Generated by scripts/generate-client.ts - DO NOT EDIT MANUALLY
34
- /**
35
- * branches - Auto-generated methods
36
- */
37
21
  this.branches = {
38
- /**
39
- * list - GET /branches
40
- */
22
+ /** GET /branches */
41
23
  list: () => {
42
24
  return this.request('GET', '/branches');
43
25
  },
44
- /**
45
- * create - POST /branches
46
- */
26
+ /** POST /branches */
47
27
  create: (body) => {
48
28
  return this.request('POST', '/branches', body);
49
29
  },
50
- /**
51
- * delete - DELETE /:branch
52
- */
30
+ /** DELETE /:branch */
53
31
  delete: (params) => {
54
32
  return this.request('DELETE', this.buildPath('/:branch', params));
55
33
  },
56
- /**
57
- * updateAccess - PATCH /:branch/access
58
- */
34
+ /** PATCH /:branch/access */
59
35
  updateAccess: (params, body) => {
60
36
  return this.request('PATCH', this.buildPath('/:branch/access', params), body);
61
37
  },
62
38
  };
63
- /**
64
- * workflow - Auto-generated methods
65
- */
66
39
  this.workflow = {
67
- /**
68
- * withdraw - POST /:branch/withdraw
69
- */
40
+ /** POST /:branch/withdraw */
70
41
  withdraw: (params) => {
71
42
  return this.request('POST', this.buildPath('/:branch/withdraw', params));
72
43
  },
73
- /**
74
- * requestChanges - POST /:branch/request-changes
75
- */
44
+ /** POST /:branch/request-changes */
76
45
  requestChanges: (params) => {
77
46
  return this.request('POST', this.buildPath('/:branch/request-changes', params));
78
47
  },
79
- /**
80
- * approve - POST /:branch/approve
81
- */
48
+ /** POST /:branch/approve */
82
49
  approve: (params) => {
83
50
  return this.request('POST', this.buildPath('/:branch/approve', params));
84
51
  },
85
- /**
86
- * markMerged - POST /:branch/mark-merged
87
- */
52
+ /** POST /:branch/mark-merged */
88
53
  markMerged: (params) => {
89
54
  return this.request('POST', this.buildPath('/:branch/mark-merged', params));
90
55
  },
91
- /**
92
- * getStatus - GET /:branch/status
93
- */
56
+ /** GET /:branch/status */
94
57
  getStatus: (params) => {
95
58
  return this.request('GET', this.buildPath('/:branch/status', params));
96
59
  },
97
- /**
98
- * submit - POST /:branch/submit
99
- */
60
+ /** POST /:branch/submit */
100
61
  submit: (params) => {
101
62
  return this.request('POST', this.buildPath('/:branch/submit', params));
102
63
  },
103
64
  };
104
- /**
105
- * comments - Auto-generated methods
106
- */
107
65
  this.comments = {
108
- /**
109
- * list - GET /:branch/comments
110
- */
66
+ /** GET /:branch/comments */
111
67
  list: (params) => {
112
68
  return this.request('GET', this.buildPath('/:branch/comments', params));
113
69
  },
114
- /**
115
- * add - POST /:branch/comments
116
- */
70
+ /** POST /:branch/comments */
117
71
  add: (params, body) => {
118
72
  return this.request('POST', this.buildPath('/:branch/comments', params), body);
119
73
  },
120
- /**
121
- * resolve - POST /:branch/comments/:threadId/resolve
122
- */
74
+ /** POST /:branch/comments/:threadId/resolve */
123
75
  resolve: (params) => {
124
76
  return this.request('POST', this.buildPath('/:branch/comments/:threadId/resolve', params));
125
77
  },
126
78
  };
127
- /**
128
- * content - Auto-generated methods
129
- */
130
79
  this.content = {
131
- /**
132
- * read - GET /:branch/content/...path
133
- */
80
+ /** GET /:branch/content/...path */
134
81
  read: (params) => {
135
82
  return this.request('GET', this.buildPath('/:branch/content/...path', params));
136
83
  },
137
- /**
138
- * write - PUT /:branch/content/...path
139
- */
84
+ /** PUT /:branch/content/...path */
140
85
  write: (params, body) => {
141
86
  return this.request('PUT', this.buildPath('/:branch/content/...path', params), body);
142
87
  },
143
- /**
144
- * validateReferences - POST /:branch/validate-references/...path
145
- */
88
+ /** POST /:branch/validate-references/...path */
146
89
  validateReferences: (params, body) => {
147
90
  return this.request('POST', this.buildPath('/:branch/validate-references/...path', params), body);
148
91
  },
149
- /**
150
- * renameEntry - PATCH /:branch/rename-entry/...path
151
- */
92
+ /** PATCH /:branch/rename-entry/...path */
152
93
  renameEntry: (params, body) => {
153
94
  return this.request('PATCH', this.buildPath('/:branch/rename-entry/...path', params), body);
154
95
  },
155
- /**
156
- * getReferenceOptions - GET /:branch/reference-options
157
- */
96
+ /** GET /:branch/reference-options */
158
97
  getReferenceOptions: (params) => {
159
98
  return this.request('GET', this.buildPath('/:branch/reference-options', params));
160
99
  },
161
- /**
162
- * resolveReferences - POST /:branch/resolve-references
163
- */
100
+ /** POST /:branch/resolve-references */
164
101
  resolveReferences: (params, body) => {
165
102
  return this.request('POST', this.buildPath('/:branch/resolve-references', params), body);
166
103
  },
167
104
  };
168
- /**
169
- * entries - Auto-generated methods
170
- */
171
105
  this.entries = {
172
- /**
173
- * list - GET /:branch/entries
174
- */
106
+ /** GET /:branch/entries */
175
107
  list: (params) => {
176
108
  return this.request('GET', this.buildPath('/:branch/entries', params));
177
109
  },
178
- /**
179
- * delete - DELETE /:branch/entries/...entryPath
180
- */
110
+ /** DELETE /:branch/entries/...entryPath */
181
111
  delete: (params) => {
182
112
  return this.request('DELETE', this.buildPath('/:branch/entries/...entryPath', params));
183
113
  },
184
114
  };
185
- /**
186
- * assets - Auto-generated methods
187
- */
188
115
  this.assets = {
189
- /**
190
- * presign - POST /assets/presign
191
- */
116
+ /** POST /assets/presign */
192
117
  presign: (body) => {
193
118
  return this.request('POST', '/assets/presign', body);
194
119
  },
195
- /**
196
- * finalize - POST /assets/finalize
197
- */
120
+ /** POST /assets/finalize */
198
121
  finalize: (body) => {
199
122
  return this.request('POST', '/assets/finalize', body);
200
123
  },
201
- /**
202
- * uploadProxied - POST /assets/upload (multipart/form-data - hand-written;
203
- * the generic template only knows JSON bodies, and this route accepts a file)
204
- */
124
+ /** POST /assets/upload: multipart upload, hand-written because the generic template only knows JSON bodies. */
205
125
  uploadProxied: (file, options) => {
206
126
  const formData = new FormData();
207
127
  formData.append('file', file);
@@ -210,217 +130,142 @@ export class CanopyApiClient {
210
130
  }
211
131
  return this.request('POST', '/assets/upload', formData);
212
132
  },
213
- /**
214
- * list - GET /assets
215
- */
133
+ /** GET /assets */
216
134
  list: (params) => {
217
135
  return this.request('GET', this.buildPath('/assets', params));
218
136
  },
219
- /**
220
- * delete - DELETE /assets
221
- */
137
+ /** DELETE /assets */
222
138
  delete: (params) => {
223
139
  return this.request('DELETE', this.buildPath('/assets', params));
224
140
  },
225
141
  };
226
- /**
227
- * permissions - Auto-generated methods
228
- */
229
142
  this.permissions = {
230
- /**
231
- * get - GET /permissions
232
- */
143
+ /** GET /permissions */
233
144
  get: () => {
234
145
  return this.request('GET', '/permissions');
235
146
  },
236
- /**
237
- * update - PUT /permissions
238
- */
147
+ /** PUT /permissions */
239
148
  update: (body) => {
240
149
  return this.request('PUT', '/permissions', body);
241
150
  },
242
- /**
243
- * searchUsers - GET /users/search
244
- */
151
+ /** GET /users/search */
245
152
  searchUsers: (params) => {
246
153
  return this.request('GET', this.buildPath('/users/search', params));
247
154
  },
248
- /**
249
- * listGroups - GET /groups
250
- */
155
+ /** GET /groups */
251
156
  listGroups: () => {
252
157
  return this.request('GET', '/groups');
253
158
  },
254
- /**
255
- * getUserMetadata - GET /users/:userId
256
- */
159
+ /** GET /users/:userId */
257
160
  getUserMetadata: (params) => {
258
161
  return this.request('GET', this.buildPath('/users/:userId', params));
259
162
  },
260
163
  };
261
- /**
262
- * groups - Auto-generated methods
263
- */
264
164
  this.groups = {
265
- /**
266
- * getInternal - GET /groups/internal
267
- */
165
+ /** GET /groups/internal */
268
166
  getInternal: () => {
269
167
  return this.request('GET', '/groups/internal');
270
168
  },
271
- /**
272
- * updateInternal - PUT /groups/internal
273
- */
169
+ /** PUT /groups/internal */
274
170
  updateInternal: (body) => {
275
171
  return this.request('PUT', '/groups/internal', body);
276
172
  },
277
- /**
278
- * searchExternal - GET /groups/search
279
- */
173
+ /** GET /groups/search */
280
174
  searchExternal: (params) => {
281
175
  return this.request('GET', this.buildPath('/groups/search', params));
282
176
  },
283
177
  };
284
- /**
285
- * user - Auto-generated methods
286
- */
287
178
  this.user = {
288
- /**
289
- * whoami - GET /whoami
290
- */
179
+ /** GET /whoami */
291
180
  whoami: () => {
292
181
  return this.request('GET', '/whoami');
293
182
  },
294
183
  };
295
- /**
296
- * schema - Auto-generated methods
297
- */
298
184
  this.schema = {
299
- /**
300
- * get - GET /:branch/schema
301
- */
185
+ /** GET /:branch/schema */
302
186
  get: (params) => {
303
187
  return this.request('GET', this.buildPath('/:branch/schema', params));
304
188
  },
305
- /**
306
- * getCollection - GET /:branch/schema/collection/...collectionPath
307
- */
189
+ /** GET /:branch/schema/collection/...collectionPath */
308
190
  getCollection: (params) => {
309
191
  return this.request('GET', this.buildPath('/:branch/schema/collection/...collectionPath', params));
310
192
  },
311
- /**
312
- * createCollection - POST /:branch/schema/collections
313
- */
193
+ /** POST /:branch/schema/collections */
314
194
  createCollection: (params, body) => {
315
195
  return this.request('POST', this.buildPath('/:branch/schema/collections', params), body);
316
196
  },
317
- /**
318
- * updateCollection - PATCH /:branch/schema/collection/...collectionPath
319
- */
197
+ /** PATCH /:branch/schema/collection/...collectionPath */
320
198
  updateCollection: (params, body) => {
321
199
  return this.request('PATCH', this.buildPath('/:branch/schema/collection/...collectionPath', params), body);
322
200
  },
323
- /**
324
- * deleteCollection - DELETE /:branch/schema/collection/...collectionPath
325
- */
201
+ /** DELETE /:branch/schema/collection/...collectionPath */
326
202
  deleteCollection: (params) => {
327
203
  return this.request('DELETE', this.buildPath('/:branch/schema/collection/...collectionPath', params));
328
204
  },
329
- /**
330
- * addEntryType - POST /:branch/schema/entry-types/...collectionPath
331
- */
205
+ /** POST /:branch/schema/entry-types/...collectionPath */
332
206
  addEntryType: (params, body) => {
333
207
  return this.request('POST', this.buildPath('/:branch/schema/entry-types/...collectionPath', params), body);
334
208
  },
335
- /**
336
- * updateEntryType - PATCH /:branch/schema/entry-types/:entryTypeName/...collectionPath
337
- */
209
+ /** PATCH /:branch/schema/entry-types/:entryTypeName/...collectionPath */
338
210
  updateEntryType: (params, body) => {
339
211
  return this.request('PATCH', this.buildPath('/:branch/schema/entry-types/:entryTypeName/...collectionPath', params), body);
340
212
  },
341
- /**
342
- * removeEntryType - DELETE /:branch/schema/entry-types/:entryTypeName/...collectionPath
343
- */
213
+ /** DELETE /:branch/schema/entry-types/:entryTypeName/...collectionPath */
344
214
  removeEntryType: (params) => {
345
215
  return this.request('DELETE', this.buildPath('/:branch/schema/entry-types/:entryTypeName/...collectionPath', params));
346
216
  },
347
- /**
348
- * updateOrder - PATCH /:branch/schema/order/...collectionPath
349
- */
217
+ /** PATCH /:branch/schema/order/...collectionPath */
350
218
  updateOrder: (params, body) => {
351
219
  return this.request('PATCH', this.buildPath('/:branch/schema/order/...collectionPath', params), body);
352
220
  },
353
- /**
354
- * invalidateSchemaCache - POST /:branch/schema/invalidate-cache
355
- */
221
+ /** POST /:branch/schema/invalidate-cache */
356
222
  invalidateSchemaCache: (params) => {
357
223
  return this.request('POST', this.buildPath('/:branch/schema/invalidate-cache', params));
358
224
  },
359
225
  };
360
- /**
361
- * admin - Auto-generated methods
362
- */
363
226
  this.admin = {
364
- /**
365
- * branchHealth - GET /admin/branch-health
366
- */
227
+ /** GET /admin/branch-health */
367
228
  branchHealth: () => {
368
229
  return this.request('GET', '/admin/branch-health');
369
230
  },
370
- /**
371
- * purgeBranchDir - POST /admin/branch-dirs/:dirName/purge
372
- */
231
+ /** POST /admin/branch-dirs/:dirName/purge */
373
232
  purgeBranchDir: (params) => {
374
233
  return this.request('POST', this.buildPath('/admin/branch-dirs/:dirName/purge', params));
375
234
  },
376
- /**
377
- * repairBranchDir - POST /admin/branch-dirs/:dirName/repair-metadata
378
- */
235
+ /** POST /admin/branch-dirs/:dirName/repair-metadata */
379
236
  repairBranchDir: (params) => {
380
237
  return this.request('POST', this.buildPath('/admin/branch-dirs/:dirName/repair-metadata', params));
381
238
  },
382
- /**
383
- * repairContentDuplicates - POST /admin/branch-dirs/:dirName/repair-content-duplicates
384
- */
239
+ /** POST /admin/branch-dirs/:dirName/repair-content-duplicates */
385
240
  repairContentDuplicates: (params) => {
386
241
  return this.request('POST', this.buildPath('/admin/branch-dirs/:dirName/repair-content-duplicates', params));
387
242
  },
388
- /**
389
- * status - GET /admin/status
390
- */
243
+ /** GET /admin/status */
391
244
  status: () => {
392
245
  return this.request('GET', '/admin/status');
393
246
  },
394
- /**
395
- * listTasks - GET /admin/tasks/:status
396
- */
247
+ /** GET /admin/tasks/:status */
397
248
  listTasks: (params) => {
398
249
  return this.request('GET', this.buildPath('/admin/tasks/:status', params));
399
250
  },
400
- /**
401
- * retryTask - POST /admin/tasks/:taskId/retry
402
- */
251
+ /** POST /admin/tasks/:taskId/retry */
403
252
  retryTask: (params) => {
404
253
  return this.request('POST', this.buildPath('/admin/tasks/:taskId/retry', params));
405
254
  },
406
- /**
407
- * deleteTask - DELETE /admin/tasks/:status/:fileName
408
- */
255
+ /** DELETE /admin/tasks/:status/:fileName */
409
256
  deleteTask: (params) => {
410
257
  return this.request('DELETE', this.buildPath('/admin/tasks/:status/:fileName', params));
411
258
  },
412
259
  };
413
260
  this.baseUrl = options.baseUrl ?? '/api/canopycms';
414
- // Bind fetch to window to prevent "Illegal invocation" errors in browsers
415
- // In Node.js tests, window is undefined so use fetch directly
261
+ // An unbound fetch throws "Illegal invocation" in browsers; Node has no window.
416
262
  this.fetchFn = options.fetch ?? (typeof window !== 'undefined' ? fetch.bind(window) : fetch);
263
+ this.onUnauthorized = options.onUnauthorized;
417
264
  }
418
- // ========== Low-level HTTP methods ==========
419
265
  buildPath(template, params) {
420
266
  let result = template;
421
267
  const queryParams = {};
422
268
  for (const [key, value] of Object.entries(params)) {
423
- // Check if this param is in the path template
424
269
  const pathParamPattern = `:${key}`;
425
270
  const restParamPattern = `...${key}`;
426
271
  if (result.includes(pathParamPattern)) {
@@ -432,15 +277,13 @@ export class CanopyApiClient {
432
277
  result = result.replace(restParamPattern, encoded);
433
278
  }
434
279
  else {
435
- // Not in path template, so it's a query param
436
280
  queryParams[key] = value;
437
281
  }
438
282
  }
439
- // Append query params if any
440
283
  if (Object.keys(queryParams).length > 0) {
441
284
  const queryString = Object.entries(queryParams)
442
285
  .map(([key, value]) => {
443
- // URL-encode with proper handling of spaces and special chars
286
+ // Spaces encode as '+' in the query string.
444
287
  return `${encodeURIComponent(key)}=${encodeURIComponent(String(value)).replace(/%20/g, '+')}`;
445
288
  })
446
289
  .join('&');
@@ -456,20 +299,18 @@ export class CanopyApiClient {
456
299
  let requestBody;
457
300
  if (body !== undefined) {
458
301
  if (body instanceof FormData) {
459
- // Don't set Content-Type for FormData - browser will set it with boundary.
460
- // NOTE: FormData bodies cannot carry an x-amz-content-sha256 hash (the
461
- // multipart boundary is generated at send time), so requests with a
462
- // FormData body will 403 behind the CloudFront OAC prod shape. See
302
+ // No Content-Type for FormData: the browser sets it with the boundary. A
303
+ // FormData body cannot carry x-amz-content-sha256 (the boundary is generated
304
+ // at send time), so it 403s behind the CloudFront OAC prod shape -- see
463
305
  // docs/deploying-to-aws.md.
464
306
  requestBody = body;
465
307
  }
466
308
  else {
467
309
  requestHeaders['Content-Type'] = 'application/json';
468
310
  requestBody = JSON.stringify(body);
469
- // CloudFront's Origin Access Control signs origin requests but never
470
- // hashes the payload itself - the viewer request must already carry
471
- // x-amz-content-sha256 or the OAC-protected Lambda Function URL
472
- // rejects the request with 403. Harmless on non-AWS deployments.
311
+ // CloudFront's OAC signs the origin request but never hashes the payload, so
312
+ // the viewer request must carry x-amz-content-sha256 or the OAC-protected
313
+ // Function URL returns 403. Harmless on non-AWS deployments.
473
314
  const contentHash = await computeContentSha256Hex(requestBody);
474
315
  if (contentHash) {
475
316
  requestHeaders['x-amz-content-sha256'] = contentHash;
@@ -484,14 +325,22 @@ export class CanopyApiClient {
484
325
  init.body = requestBody;
485
326
  }
486
327
  const response = await this.fetchFn(url, init);
328
+ if (response.status === 401) {
329
+ this.onUnauthorized?.();
330
+ // A 401 is an auth answer whatever its body: one from in front of the API (a proxy) may
331
+ // not be an ApiResponse, or not JSON. Always return it as one rather than throwing.
332
+ const body = await response.json().catch(() => undefined);
333
+ const error = typeof body === 'object' && body !== null && 'error' in body && typeof body.error === 'string'
334
+ ? body.error
335
+ : 'Unauthorized';
336
+ return { ok: false, status: 401, error };
337
+ }
487
338
  const payload = await response.json();
488
339
  // All responses use ApiResponse format: { ok, status, data?, error? }
489
340
  return payload;
490
341
  }
491
342
  }
492
- /**
493
- * Create a new API client instance
494
- */
343
+ /** Create a {@link CanopyApiClient}; pass a custom fetch for tests. */
495
344
  export function createApiClient(options) {
496
345
  return new CanopyApiClient(options);
497
346
  }
@@ -8,7 +8,7 @@ export interface AddCommentBody {
8
8
  entryPath?: string;
9
9
  canopyPath?: string;
10
10
  }
11
- export interface ListCommentsResponse {
11
+ interface ListCommentsResponse {
12
12
  threads: CommentThread[];
13
13
  }
14
14
  /** Response type for listing comments */
@@ -22,9 +22,6 @@ export type AddCommentResponse = ApiResponse<{
22
22
  export type ResolveCommentResponse = ApiResponse<{
23
23
  resolved: boolean;
24
24
  }>;
25
- /**
26
- * Exported routes for router registration
27
- */
28
25
  export declare const COMMENT_ROUTES: {
29
26
  readonly list: import("./route-builder.js").RouteDefinition<z.ZodObject<{
30
27
  branch: z.ZodType<import("../paths/index.js").BranchName, z.ZodTypeDef, import("../paths/index.js").BranchName>;
@@ -81,3 +78,4 @@ export declare const COMMENT_ROUTES: {
81
78
  threadId: string;
82
79
  }>, undefined, ResolveCommentResponse>;
83
80
  };
81
+ export {};
@@ -54,7 +54,6 @@ const addCommentHandler = async (gc, _ctx, req, _params, body) => {
54
54
  const resolveCommentHandler = async (gc, _ctx, req, params) => {
55
55
  const { branchContext } = gc;
56
56
  const commentStore = new CommentStore(branchContext.branchRoot);
57
- // Get the thread to check permissions
58
57
  const thread = await commentStore.getThread(params.threadId);
59
58
  if (!thread) {
60
59
  return { ok: false, status: 404, error: 'Thread not found' };
@@ -75,17 +74,9 @@ const resolveCommentHandler = async (gc, _ctx, req, params) => {
75
74
  }
76
75
  return { ok: true, status: 200, data: { resolved: true } };
77
76
  };
78
- // ============================================================================
79
- // Route Definitions with defineEndpoint
80
- // ============================================================================
81
- //
82
77
  // Deliberately no 'writableBranch' guard on any endpoint below: comments live
83
78
  // in .canopy-meta/comments.json, which is never committed to git. Commenting
84
79
  // while browsing the (read-only) protected base branch is desirable.
85
- /**
86
- * List all comment threads for a branch
87
- * GET /:branch/comments
88
- */
89
80
  const listComments = defineEndpoint({
90
81
  namespace: 'comments',
91
82
  name: 'list',
@@ -100,7 +91,6 @@ const listComments = defineEndpoint({
100
91
  });
101
92
  /**
102
93
  * Add a comment to a thread or create new thread
103
- * POST /:branch/comments
104
94
  */
105
95
  const addComment = defineEndpoint({
106
96
  namespace: 'comments',
@@ -116,10 +106,6 @@ const addComment = defineEndpoint({
116
106
  guards: ['branchAccess'],
117
107
  handler: addCommentHandler,
118
108
  });
119
- /**
120
- * Resolve a comment thread
121
- * POST /:branch/comments/:threadId/resolve
122
- */
123
109
  const resolveComment = defineEndpoint({
124
110
  namespace: 'comments',
125
111
  name: 'resolve',
@@ -132,9 +118,6 @@ const resolveComment = defineEndpoint({
132
118
  guards: ['branchAccess'],
133
119
  handler: resolveCommentHandler,
134
120
  });
135
- /**
136
- * Exported routes for router registration
137
- */
138
121
  export const COMMENT_ROUTES = {
139
122
  list: listComments,
140
123
  add: addComment,