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,47 +3,44 @@ import type { CanopyConfig } from './config/index.js';
3
3
  /**
4
4
  * Retry primary rate limits at most twice and only for short waits; beyond
5
5
  * that, task-level retry/backoff (worker) or the caller's error path takes
6
- * over. The worker's task timeout would abort a longer in-request wait
7
- * anyway.
6
+ * over, since the worker's task timeout would abort a longer in-request wait.
7
+ * @internal Exported for tests.
8
8
  */
9
9
  export declare const shouldRetryRateLimit: (retryAfter: number, retryCount: number) => boolean;
10
10
  /**
11
11
  * Secondary (abuse-detection) rate limits are stricter to trip and usually
12
12
  * signal we're hammering the API too fast — retry at most once, and only for
13
13
  * a short wait.
14
+ * @internal Exported for tests.
14
15
  */
15
16
  export declare const shouldRetrySecondaryRateLimit: (retryAfter: number, retryCount: number) => boolean;
16
17
  /**
17
18
  * Octokit's pluggable-auth options, typed STRUCTURALLY.
18
19
  *
19
- * `@octokit/core` calls `authStrategy(…)` once in its constructor and wraps
20
- * the returned object's `.hook` into its request chain, so handing it a
21
- * strategy is the whole of "authenticate every request some other way".
20
+ * `@octokit/core` calls `authStrategy(…)` once in its constructor and wraps the
21
+ * returned object's `.hook` into its request chain, so handing it a strategy is
22
+ * the whole of "authenticate every request some other way".
22
23
  *
23
- * Declared as a shape rather than imported because this module is reachable
24
- * from `services.ts` and therefore lands in every adopter's Next.js server
25
- * bundle: an `import { createAppAuth } from '@octokit/auth-app'` here would
26
- * put that package (and its `universal-github-app-jwt` dependency) into the
27
- * bundle of every adopter, including the overwhelming majority who
28
- * authenticate with a personal access token and will never register a GitHub
29
- * App. `pnpm lint:bundle` guards the *client* boundary only and would not
30
- * catch that, so the structural typing is the guard.
24
+ * The shape is declared, never imported: this module is reachable from
25
+ * `services.ts` and so lands in every adopter's Next.js server bundle, and
26
+ * importing `@octokit/auth-app` here would pull that package (plus
27
+ * `universal-github-app-jwt`) into the bundle of every adopter, including the
28
+ * majority who authenticate with a personal access token and never register a
29
+ * GitHub App. `pnpm lint:bundle` guards the *client* boundary only and would
30
+ * not catch it, so the structural typing IS the guard.
31
31
  *
32
- * A deployment that does use an App constructs the strategy and passes it
33
- * through here. That is the seam `packages/canopycms-cdk/worker/index.ts`
34
- * already uses for `refreshAuthCache`, and its App wiring goes through the same
35
- * one — see `packages/canopycms-cdk/worker/github-app-auth.ts`, with
36
- * `docs/adopter-migration.md` carrying the shape for a hand-written entrypoint.
32
+ * A deployment using an App constructs the strategy and passes it through here
33
+ * — see `packages/canopycms-cdk/worker/github-app-auth.ts` and
34
+ * `docs/adopter-migration.md` for a hand-written entrypoint.
37
35
  */
38
36
  export interface OctokitAuthStrategyOptions {
39
37
  /**
40
- * Octokit calls this with `{ request, log, octokit, octokitOptions }`, with
41
- * the fields of `auth` below merged over them, and expects an object
42
- * carrying a `.hook`.
43
- * `createAppAuth(…)`'s return value satisfies that; so does a closure
44
- * returning an already-constructed one, which is how a single auth instance
45
- * (and therefore a single installation-token cache) can be shared with a
46
- * caller that also needs to mint tokens outside Octokit.
38
+ * Octokit calls this with `{ request, log, octokit, octokitOptions }`, the
39
+ * fields of `auth` below merged over them, and expects an object carrying a
40
+ * `.hook`. `createAppAuth(…)`'s return value satisfies that; so does a
41
+ * closure returning an already-constructed one, which is how one auth
42
+ * instance — and so one installation-token cache — is shared with a caller
43
+ * that also mints tokens outside Octokit.
47
44
  */
48
45
  authStrategy: (options: Record<string, unknown>) => unknown;
49
46
  /** Merged into the strategy's options by Octokit. */
@@ -94,15 +91,11 @@ export interface CreateOrUpdatePullRequestParams {
94
91
  signal?: AbortSignal;
95
92
  }
96
93
  /**
97
- * Create or update a pull request (idempotent — GIT-H1).
98
- *
99
- * If an open PR already exists from head to base, update it and return its
100
- * number/url instead of erroring. This makes PR submission safely
101
- * retryable: if a caller crashes after GitHub creates the PR but before it
102
- * persists the returned PR number, calling this again recovers the
103
- * existing PR instead of hitting the 422 that a blind create would throw on
104
- * a duplicate, which previously wedged the branch in 'sync-failed'
105
- * permanently.
94
+ * Create or update a pull request, idempotently: an open PR from head to base
95
+ * is updated and returned rather than erroring. That keeps PR submission
96
+ * retryable — a caller that crashes after GitHub creates the PR but before it
97
+ * persists the number recovers the existing PR instead of hitting the 422 a
98
+ * blind create throws on a duplicate, which wedges the branch in 'sync-failed'.
106
99
  *
107
100
  * Shared by `GitHubService.createOrUpdatePR` (direct-API callers) and the
108
101
  * worker's `push-and-create-or-update-pr` task, so the list->tiebreak->
@@ -113,33 +106,20 @@ export declare function createOrUpdatePullRequest(params: CreateOrUpdatePullRequ
113
106
  url: string;
114
107
  created: boolean;
115
108
  }>;
116
- /**
117
- * Service for interacting with GitHub API (pull requests, branches, etc.)
118
- */
119
109
  export declare class GitHubService {
120
110
  private octokit;
121
111
  private owner;
122
112
  private repo;
123
113
  private baseBranch;
124
114
  constructor(options: GitHubServiceOptions);
125
- /**
126
- * Create a new pull request
127
- */
128
115
  createPullRequest(options: PullRequestOptions): Promise<{
129
116
  number: number;
130
117
  url: string;
131
118
  }>;
132
- /**
133
- * Update an existing pull request
134
- */
135
119
  updatePullRequest(prNumber: number, options: Partial<Pick<PullRequestOptions, 'title' | 'body'>>): Promise<void>;
136
120
  /**
137
- * Create or update a pull request (idempotent — GIT-H1).
138
- *
139
- * Thin delegate to the module-level `createOrUpdatePullRequest` helper
140
- * (shared with the worker's `push-and-create-or-update-pr` task) bound to
141
- * this instance's octokit/owner/repo. See that function's doc comment for
142
- * the idempotency rationale.
121
+ * Idempotent create-or-update, bound to this instance's octokit/owner/repo.
122
+ * See {@link createOrUpdatePullRequest}.
143
123
  */
144
124
  createOrUpdatePR(options: {
145
125
  head: string;
@@ -152,37 +132,16 @@ export declare class GitHubService {
152
132
  number: number;
153
133
  url: string;
154
134
  }>;
155
- /**
156
- * Get pull request details
157
- */
158
135
  getPullRequest(prNumber: number): Promise<PullRequestDetails>;
159
- /**
160
- * Convert a pull request to draft
161
- */
162
136
  convertToDraft(prNumber: number): Promise<void>;
163
- /**
164
- * Convert a draft pull request to ready for review
165
- */
166
137
  convertToReady(prNumber: number): Promise<void>;
167
- /**
168
- * Close a pull request
169
- */
170
138
  closePullRequest(prNumber: number): Promise<void>;
171
- /**
172
- * Delete a remote branch
173
- */
174
139
  deleteBranch(branchName: string): Promise<void>;
175
- /**
176
- * Get the GraphQL node ID for a pull request (needed for draft operations)
177
- */
178
140
  private getPullRequestNodeId;
179
141
  /**
180
- * Parse GitHub remote URL to extract owner and repo
181
- * Supports both HTTPS and SSH formats:
182
- * - https://github.com/owner/repo.git
183
- * - https://github.com/owner/repo
184
- * - git@github.com:owner/repo.git
185
- * - git@github.com:owner/repo
142
+ * Extract owner and repo from a GitHub remote URL, in either HTTPS
143
+ * (`https://github.com/owner/repo[.git]`) or SSH
144
+ * (`git@github.com:owner/repo[.git]`) form.
186
145
  */
187
146
  static parseRemoteUrl(remoteUrl: string): {
188
147
  owner: string;
@@ -190,7 +149,7 @@ export declare class GitHubService {
190
149
  };
191
150
  }
192
151
  /**
193
- * Create a GitHub service instance from config and remote URL
194
- * Returns null if not applicable (missing token, not GitHub, etc.)
152
+ * A GitHub service for this config and remote URL, or null when one cannot be
153
+ * built (mode without PR support, missing token, unparseable remote).
195
154
  */
196
155
  export declare const createGitHubService: (config: CanopyConfig, remoteUrl?: string) => GitHubService | null;
@@ -2,24 +2,24 @@ import { Octokit } from '@octokit/rest';
2
2
  import { throttling } from '@octokit/plugin-throttling';
3
3
  import { operatingStrategy } from './operating-mode/index.js';
4
4
  import { getErrorMessage } from './utils/error.js';
5
- // canopyLogWarn, not console.warn: this module runs inside the WORKER process
6
- // (its Octokit is the worker's own, and the PR create/update path below is a
7
- // worker task), where every line must carry worker/log.ts's ISO-8601 prefix or
8
- // CloudWatch folds it into the previous event. Under Lambda/dev the helper is
9
- // plain console. See utils/logger.ts.
5
+ // canopyLogWarn, not console.warn: the PR create/update path below runs as a
6
+ // worker task, and every worker line must carry worker/log.ts's ISO-8601 prefix
7
+ // or CloudWatch folds it into the previous event. Under Lambda/dev the helper
8
+ // is plain console. See utils/logger.ts.
10
9
  import { canopyLogWarn } from './utils/logger.js';
11
10
  const ThrottledOctokit = Octokit.plugin(throttling);
12
11
  /**
13
12
  * Retry primary rate limits at most twice and only for short waits; beyond
14
13
  * that, task-level retry/backoff (worker) or the caller's error path takes
15
- * over. The worker's task timeout would abort a longer in-request wait
16
- * anyway.
14
+ * over, since the worker's task timeout would abort a longer in-request wait.
15
+ * @internal Exported for tests.
17
16
  */
18
17
  export const shouldRetryRateLimit = (retryAfter, retryCount) => retryCount < 2 && retryAfter <= 60;
19
18
  /**
20
19
  * Secondary (abuse-detection) rate limits are stricter to trip and usually
21
20
  * signal we're hammering the API too fast — retry at most once, and only for
22
21
  * a short wait.
22
+ * @internal Exported for tests.
23
23
  */
24
24
  export const shouldRetrySecondaryRateLimit = (retryAfter, retryCount) => retryCount < 1 && retryAfter <= 60;
25
25
  /**
@@ -30,12 +30,10 @@ export const shouldRetrySecondaryRateLimit = (retryAfter, retryCount) => retryCo
30
30
  * errors the plugin never sees, like non-403 network failures).
31
31
  */
32
32
  export function createCanopyOctokit(options) {
33
- // The two auth fields are picked out EXPLICITLY rather than spread. A spread
34
- // would forward anything else the caller's object happened to carry --
35
- // `baseUrl`, `request`, `log`, `userAgent` are all live `OctokitOptions`,
36
- // and a non-literal argument (a widened variable, not an inline object)
37
- // slips past TypeScript's excess-property check. This function's contract is
38
- // "our Octokit, authenticated the way you say", not "our Octokit, configured
33
+ // Pick the two auth fields out EXPLICITLY, never spread: `baseUrl`,
34
+ // `request`, `log` and `userAgent` are all live `OctokitOptions`, and a
35
+ // non-literal argument slips past TypeScript's excess-property check. The
36
+ // contract is "our Octokit, authenticated the way you say", not "configured
39
37
  // however you like".
40
38
  const auth = 'authStrategy' in options
41
39
  ? { authStrategy: options.authStrategy, auth: options.auth }
@@ -57,15 +55,11 @@ export function createCanopyOctokit(options) {
57
55
  });
58
56
  }
59
57
  /**
60
- * Create or update a pull request (idempotent — GIT-H1).
61
- *
62
- * If an open PR already exists from head to base, update it and return its
63
- * number/url instead of erroring. This makes PR submission safely
64
- * retryable: if a caller crashes after GitHub creates the PR but before it
65
- * persists the returned PR number, calling this again recovers the
66
- * existing PR instead of hitting the 422 that a blind create would throw on
67
- * a duplicate, which previously wedged the branch in 'sync-failed'
68
- * permanently.
58
+ * Create or update a pull request, idempotently: an open PR from head to base
59
+ * is updated and returned rather than erroring. That keeps PR submission
60
+ * retryable — a caller that crashes after GitHub creates the PR but before it
61
+ * persists the number recovers the existing PR instead of hitting the 422 a
62
+ * blind create throws on a duplicate, which wedges the branch in 'sync-failed'.
69
63
  *
70
64
  * Shared by `GitHubService.createOrUpdatePR` (direct-API callers) and the
71
65
  * worker's `push-and-create-or-update-pr` task, so the list->tiebreak->
@@ -73,11 +67,9 @@ export function createCanopyOctokit(options) {
73
67
  */
74
68
  export async function createOrUpdatePullRequest(params) {
75
69
  const { octokit, owner, repo, head, base, title, body, markReadyIfDraft, signal } = params;
76
- // CONDITIONAL spread: when no signal is passed, request objects below are
77
- // byte-identical to the pre-refactor call sites (exact toHaveBeenCalledWith
78
- // assertions in github-service.test.ts depend on this).
70
+ // CONDITIONAL spread: with no signal, the request objects below carry no
71
+ // `request` key at all (github-service.test.ts asserts on their exact shape).
79
72
  const requestOption = signal ? { request: { signal } } : {};
80
- // Check if an open PR already exists for this head/base
81
73
  const existingPRs = await octokit.pulls.list({
82
74
  owner,
83
75
  repo,
@@ -87,11 +79,9 @@ export async function createOrUpdatePullRequest(params) {
87
79
  ...requestOption,
88
80
  });
89
81
  if (existingPRs.data.length > 0) {
90
- // GIT-M5: GitHub disallows more than one open PR for a given
91
- // head+base pair, so this should always be a single match. Guard
92
- // against blindly trusting array order anyway — if more than one is
93
- // ever returned, warn and prefer the most recently updated instead of
94
- // an arbitrary one.
82
+ // GitHub disallows more than one open PR for a head+base pair, so this is
83
+ // normally a single match. Don't trust array order anyway: if more than one
84
+ // comes back, warn and take the most recently updated.
95
85
  let existing = existingPRs.data[0];
96
86
  if (existingPRs.data.length > 1) {
97
87
  existing = [...existingPRs.data].sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime())[0];
@@ -109,19 +99,16 @@ export async function createOrUpdatePullRequest(params) {
109
99
  // above is never called with draft: true, so a newly created PR is
110
100
  // never draft and needs no conversion.
111
101
  if (markReadyIfDraft && existing.draft) {
112
- // Use GraphQL API for draft conversion (not available in REST API).
113
- // Read the node id straight off the list payload — no extra pulls.get.
102
+ // GraphQL: draft conversion has no REST equivalent. The node id comes
103
+ // straight off the list payload — no extra pulls.get.
114
104
  //
115
- // Best-effort: the push + pulls.update above already succeeded, so the
116
- // submit itself is done. A fine-grained token that can update PRs but
117
- // lacks this mutation's scope throws a GraphqlResponseError, which
118
- // carries no numeric HTTP status (the GraphQL endpoint responds 200
119
- // even for a mutation-level failure) — the worker's
120
- // isPermanentTaskFailure would classify that as transient and retry
121
- // the whole re-push until the retry cap, wedging the branch in
122
- // 'sync-failed' even though the PR already exists and is current.
123
- // Warn and continue instead of letting this sink an already-succeeded
124
- // submit.
105
+ // Best-effort, because the push and pulls.update above already succeeded:
106
+ // a fine-grained token lacking this mutation's scope throws a
107
+ // GraphqlResponseError with no numeric HTTP status (GraphQL answers 200
108
+ // even for a mutation-level failure), which the worker's
109
+ // isPermanentTaskFailure reads as transient and retries the whole re-push
110
+ // to the cap, wedging the branch in 'sync-failed' even though the PR
111
+ // exists and is current.
125
112
  try {
126
113
  await octokit.graphql(`
127
114
  mutation($pullRequestId: ID!) {
@@ -142,7 +129,6 @@ export async function createOrUpdatePullRequest(params) {
142
129
  }
143
130
  return { number: existing.number, url: existing.html_url, created: false };
144
131
  }
145
- // Create new PR
146
132
  const pr = await octokit.pulls.create({
147
133
  owner,
148
134
  repo,
@@ -154,9 +140,6 @@ export async function createOrUpdatePullRequest(params) {
154
140
  });
155
141
  return { number: pr.data.number, url: pr.data.html_url, created: true };
156
142
  }
157
- /**
158
- * Service for interacting with GitHub API (pull requests, branches, etc.)
159
- */
160
143
  export class GitHubService {
161
144
  constructor(options) {
162
145
  this.octokit = createCanopyOctokit({ auth: options.token });
@@ -164,9 +147,6 @@ export class GitHubService {
164
147
  this.repo = options.repo;
165
148
  this.baseBranch = options.baseBranch ?? 'main';
166
149
  }
167
- /**
168
- * Create a new pull request
169
- */
170
150
  async createPullRequest(options) {
171
151
  const response = await this.octokit.pulls.create({
172
152
  owner: this.owner,
@@ -182,9 +162,6 @@ export class GitHubService {
182
162
  url: response.data.html_url,
183
163
  };
184
164
  }
185
- /**
186
- * Update an existing pull request
187
- */
188
165
  async updatePullRequest(prNumber, options) {
189
166
  await this.octokit.pulls.update({
190
167
  owner: this.owner,
@@ -195,12 +172,8 @@ export class GitHubService {
195
172
  });
196
173
  }
197
174
  /**
198
- * Create or update a pull request (idempotent — GIT-H1).
199
- *
200
- * Thin delegate to the module-level `createOrUpdatePullRequest` helper
201
- * (shared with the worker's `push-and-create-or-update-pr` task) bound to
202
- * this instance's octokit/owner/repo. See that function's doc comment for
203
- * the idempotency rationale.
175
+ * Idempotent create-or-update, bound to this instance's octokit/owner/repo.
176
+ * See {@link createOrUpdatePullRequest}.
204
177
  */
205
178
  async createOrUpdatePR(options) {
206
179
  const result = await createOrUpdatePullRequest({
@@ -215,9 +188,6 @@ export class GitHubService {
215
188
  });
216
189
  return { number: result.number, url: result.url };
217
190
  }
218
- /**
219
- * Get pull request details
220
- */
221
191
  async getPullRequest(prNumber) {
222
192
  const response = await this.octokit.pulls.get({
223
193
  owner: this.owner,
@@ -232,9 +202,6 @@ export class GitHubService {
232
202
  draft: response.data.draft ?? false,
233
203
  };
234
204
  }
235
- /**
236
- * Convert a pull request to draft
237
- */
238
205
  async convertToDraft(prNumber) {
239
206
  // Use GraphQL API for draft conversion (not available in REST API)
240
207
  await this.octokit.graphql(`
@@ -249,9 +216,6 @@ export class GitHubService {
249
216
  pullRequestId: await this.getPullRequestNodeId(prNumber),
250
217
  });
251
218
  }
252
- /**
253
- * Convert a draft pull request to ready for review
254
- */
255
219
  async convertToReady(prNumber) {
256
220
  // Use GraphQL API for draft conversion (not available in REST API)
257
221
  await this.octokit.graphql(`
@@ -266,9 +230,6 @@ export class GitHubService {
266
230
  pullRequestId: await this.getPullRequestNodeId(prNumber),
267
231
  });
268
232
  }
269
- /**
270
- * Close a pull request
271
- */
272
233
  async closePullRequest(prNumber) {
273
234
  await this.octokit.pulls.update({
274
235
  owner: this.owner,
@@ -277,9 +238,6 @@ export class GitHubService {
277
238
  state: 'closed',
278
239
  });
279
240
  }
280
- /**
281
- * Delete a remote branch
282
- */
283
241
  async deleteBranch(branchName) {
284
242
  await this.octokit.git.deleteRef({
285
243
  owner: this.owner,
@@ -287,9 +245,6 @@ export class GitHubService {
287
245
  ref: `heads/${branchName}`,
288
246
  });
289
247
  }
290
- /**
291
- * Get the GraphQL node ID for a pull request (needed for draft operations)
292
- */
293
248
  async getPullRequestNodeId(prNumber) {
294
249
  const response = await this.octokit.pulls.get({
295
250
  owner: this.owner,
@@ -299,17 +254,12 @@ export class GitHubService {
299
254
  return response.data.node_id;
300
255
  }
301
256
  /**
302
- * Parse GitHub remote URL to extract owner and repo
303
- * Supports both HTTPS and SSH formats:
304
- * - https://github.com/owner/repo.git
305
- * - https://github.com/owner/repo
306
- * - git@github.com:owner/repo.git
307
- * - git@github.com:owner/repo
257
+ * Extract owner and repo from a GitHub remote URL, in either HTTPS
258
+ * (`https://github.com/owner/repo[.git]`) or SSH
259
+ * (`git@github.com:owner/repo[.git]`) form.
308
260
  */
309
261
  static parseRemoteUrl(remoteUrl) {
310
- // Remove .git suffix if present
311
262
  const urlWithoutGit = remoteUrl.replace(/\.git$/, '');
312
- // Try HTTPS format first
313
263
  const httpsMatch = urlWithoutGit.match(/https?:\/\/github\.com\/([^/]+)\/([^/]+)/);
314
264
  if (httpsMatch) {
315
265
  return {
@@ -333,28 +283,24 @@ export class GitHubService {
333
283
  }
334
284
  }
335
285
  /**
336
- * Create a GitHub service instance from config and remote URL
337
- * Returns null if not applicable (missing token, not GitHub, etc.)
286
+ * A GitHub service for this config and remote URL, or null when one cannot be
287
+ * built (mode without PR support, missing token, unparseable remote).
338
288
  */
339
289
  export const createGitHubService = (config, remoteUrl) => {
340
- // Only create service for modes that support pull requests
341
290
  const mode = config.mode;
342
291
  if (!operatingStrategy(mode).supportsPullRequests()) {
343
292
  return null;
344
293
  }
345
- // Get token from environment
346
294
  const tokenEnvVar = config.githubTokenEnvVar ?? 'GITHUB_BOT_TOKEN';
347
295
  const token = process.env[tokenEnvVar] ?? process.env.CANOPYCMS_GITHUB_TOKEN;
348
296
  if (!token) {
349
297
  canopyLogWarn(`CanopyCMS: GitHub token not found in ${tokenEnvVar} or CANOPYCMS_GITHUB_TOKEN`);
350
298
  return null;
351
299
  }
352
- // Need remote URL to determine owner/repo
353
300
  if (!remoteUrl) {
354
301
  canopyLogWarn('CanopyCMS: GitHub service requires remoteUrl to determine repository');
355
302
  return null;
356
303
  }
357
- // Parse remote URL
358
304
  try {
359
305
  const { owner, repo } = GitHubService.parseRemoteUrl(remoteUrl);
360
306
  return new GitHubService({
@@ -4,11 +4,7 @@ import { type AuthPlugin } from '../auth/plugin.js';
4
4
  import { type CanopyServices } from '../services.js';
5
5
  import type { CanopyConfig } from '../config/index.js';
6
6
  import type { BranchContext } from '../types.js';
7
- /**
8
- * Options for creating a Canopy request handler.
9
- * This is framework-agnostic - adapters convert their framework's
10
- * request/response types to/from CanopyRequest/CanopyResponse.
11
- */
7
+ /** Framework-agnostic: adapters convert to and from CanopyRequest/Response. */
12
8
  export interface CanopyHandlerOptions {
13
9
  services?: CanopyServices;
14
10
  config?: CanopyConfig;
@@ -17,43 +13,16 @@ export interface CanopyHandlerOptions {
17
13
  authPlugin: AuthPlugin;
18
14
  }
19
15
  /**
20
- * Core request handler result type.
21
- * Widened to include `CanopyBinaryResponse` so routes that stream bytes
22
- * (e.g. asset serving) can flow through this handler untouched alongside
23
- * ordinary JSON routes - see `isCanopyBinaryResponse` usage below.
16
+ * Includes `CanopyBinaryResponse` so byte-streaming routes (asset serving) flow
17
+ * through untouched alongside JSON ones — see `isCanopyBinaryResponse` below.
24
18
  */
25
19
  export type CanopyRequestHandler = (req: CanopyRequest, pathSegments: string[]) => Promise<CanopyResponse<ApiResponse> | CanopyBinaryResponse>;
26
20
  /**
27
- * Create a framework-agnostic Canopy request handler.
28
- *
29
- * This is the core handler that processes all Canopy API requests.
30
- * Framework adapters (Next.js, Express, Hono, etc.) should:
31
- * 1. Convert their framework's request to CanopyRequest
32
- * 2. Extract path segments from the URL
33
- * 3. Call this handler
34
- * 4. Convert the CanopyResponse to their framework's response
35
- *
36
- * @example
37
- * ```ts
38
- * // In a framework adapter
39
- * const coreHandler = createCanopyRequestHandler({
40
- * config: myConfig,
41
- * authPlugin: myAuthPlugin,
42
- * })
43
- *
44
- * // Framework-specific handler
45
- * async function handleRequest(frameworkReq) {
46
- * const canopyReq = convertToCanopyRequest(frameworkReq)
47
- * const segments = extractPathSegments(frameworkReq)
48
- * const response = await coreHandler(canopyReq, segments)
49
- * return convertToFrameworkResponse(response)
50
- * }
51
- * ```
21
+ * The core handler behind every Canopy API request. A framework adapter
22
+ * (Next.js, Express, Hono) converts its request to a CanopyRequest, extracts
23
+ * the path segments, calls this, and converts the CanopyResponse back.
52
24
  */
53
25
  export declare function createCanopyRequestHandler(options: CanopyHandlerOptions): CanopyRequestHandler;
54
- /**
55
- * Create a handler with pre-built services from config.
56
- */
57
26
  export declare function createCanopyRequestHandlerFromConfig(options: {
58
27
  config: CanopyConfig;
59
28
  } & Omit<CanopyHandlerOptions, 'services' | 'config'>): Promise<CanopyRequestHandler>;