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,16 +1,9 @@
1
1
  /**
2
- * Project root discovery for CLI commands.
3
- *
4
- * Commands that operate on an existing CanopyCMS project (sync, worker,
5
- * generate-ai-content) resolve the project root by walking up from the
6
- * current directory to the nearest canopycms.config.ts — like git does
7
- * with .git — so running from a subdirectory works and never scatters
8
- * state (e.g. .canopy-dev/) into the wrong directory.
2
+ * Resolves an existing CanopyCMS project's root for sync/worker/generate-ai-content:
3
+ * walks up from the given directory to the nearest canopycms.config.ts (like git
4
+ * and .git), so commands work from any subdirectory without scattering state
5
+ * (e.g. .canopy-dev/) into the wrong place.
9
6
  */
10
7
  /** Config file that marks the root of a CanopyCMS project. */
11
8
  export declare const PROJECT_MARKER = "canopycms.config.ts";
12
- /**
13
- * Walk up from startDir to the nearest directory containing canopycms.config.ts.
14
- * Returns null when no project root is found.
15
- */
16
9
  export declare function findProjectRoot(startDir: string): Promise<string | null>;
@@ -1,20 +1,13 @@
1
1
  /**
2
- * Project root discovery for CLI commands.
3
- *
4
- * Commands that operate on an existing CanopyCMS project (sync, worker,
5
- * generate-ai-content) resolve the project root by walking up from the
6
- * current directory to the nearest canopycms.config.ts — like git does
7
- * with .git — so running from a subdirectory works and never scatters
8
- * state (e.g. .canopy-dev/) into the wrong directory.
2
+ * Resolves an existing CanopyCMS project's root for sync/worker/generate-ai-content:
3
+ * walks up from the given directory to the nearest canopycms.config.ts (like git
4
+ * and .git), so commands work from any subdirectory without scattering state
5
+ * (e.g. .canopy-dev/) into the wrong place.
9
6
  */
10
7
  import path from 'node:path';
11
8
  import { filePathExists } from '../utils/fs.js';
12
9
  /** Config file that marks the root of a CanopyCMS project. */
13
10
  export const PROJECT_MARKER = 'canopycms.config.ts';
14
- /**
15
- * Walk up from startDir to the nearest directory containing canopycms.config.ts.
16
- * Returns null when no project root is found.
17
- */
18
11
  export async function findProjectRoot(startDir) {
19
12
  let dir = path.resolve(startDir);
20
13
  for (;;) {
@@ -0,0 +1,10 @@
1
+ /** Stdin prompts for the CLI commands; `stdinEnded` says why they share one module. */
2
+ /** Wait for the operator to continue. Returns at once if stdin has ended. */
3
+ export declare function pressEnter(prompt: string): Promise<void>;
4
+ /** Read one line from the operator. `null` when stdin ended instead. */
5
+ export declare function askLine(prompt: string): Promise<string | null>;
6
+ /**
7
+ * Reset between tests. Not used by the command itself.
8
+ * @internal Exported for tests.
9
+ */
10
+ export declare function resetStdinStateForTesting(): void;
@@ -0,0 +1,67 @@
1
+ /** Stdin prompts for the CLI commands; `stdinEnded` says why they share one module. */
2
+ import { createInterface } from 'node:readline';
3
+ /**
4
+ * Whether stdin has already delivered end-of-input to an earlier prompt.
5
+ * `process.stdin` can only end ONCE, and a `readline` interface created after
6
+ * it has ended never emits `'line'` or `'close'`, so a per-prompt interface
7
+ * is a footgun once a command has two prompts — even when the first WAS
8
+ * answered, since readline flushes a pending partial line as a final `'line'`
9
+ * event before `'close'`, so "text then EOF" answers normally while the
10
+ * stream also ends in that same moment. The flag records whether the STREAM
11
+ * ended, not whether THIS prompt got an answer.
12
+ * `readableEnded` is checked unconditionally in the `'close'` handler
13
+ * below, before the `answered` branch: gating it on `!answered` would miss
14
+ * the case above and leave the next prompt's readline on an already-ended
15
+ * stream that never emits, so node would exit 0 silently with no cleanup. Our
16
+ * OWN `rl.close()` also fires `'close'` but leaves `readableEnded` false,
17
+ * keeping the two cases apart. Every prompt below consults this first; no
18
+ * other readline interface on `process.stdin` may exist anywhere in the CLI.
19
+ */
20
+ let stdinEnded = false;
21
+ function readLineOnce(prompt) {
22
+ if (stdinEnded) {
23
+ // Already at EOF: answer immediately rather than waiting for input that can
24
+ // never arrive.
25
+ console.log(prompt);
26
+ return Promise.resolve(null);
27
+ }
28
+ const rl = createInterface({ input: process.stdin, terminal: false });
29
+ return new Promise((resolve) => {
30
+ console.log(prompt);
31
+ let answered = false;
32
+ rl.once('line', (line) => {
33
+ answered = true;
34
+ rl.close();
35
+ resolve(line);
36
+ });
37
+ rl.once('close', () => {
38
+ // Checked FIRST and unconditionally (see `stdinEnded` above): `'close'`
39
+ // fires both for our own `rl.close()` and for the stream actually
40
+ // ending, and by the time it fires here the input has already finished
41
+ // emitting `'end'`, so `readableEnded` is reliable to read now.
42
+ if (process.stdin.readableEnded) {
43
+ stdinEnded = true;
44
+ }
45
+ if (answered)
46
+ return;
47
+ stdinEnded = true;
48
+ resolve(null);
49
+ });
50
+ });
51
+ }
52
+ /** Wait for the operator to continue. Returns at once if stdin has ended. */
53
+ export async function pressEnter(prompt) {
54
+ await readLineOnce(prompt);
55
+ }
56
+ /** Read one line from the operator. `null` when stdin ended instead. */
57
+ export async function askLine(prompt) {
58
+ const line = await readLineOnce(prompt);
59
+ return line === null ? null : line.trim();
60
+ }
61
+ /**
62
+ * Reset between tests. Not used by the command itself.
63
+ * @internal Exported for tests.
64
+ */
65
+ export function resetStdinStateForTesting() {
66
+ stdinEnded = false;
67
+ }
@@ -21,14 +21,6 @@ export interface SyncOptions {
21
21
  /** Skip confirmation prompts (for testing or scripts). */
22
22
  force?: boolean;
23
23
  }
24
- /**
25
- * Sync precondition failure (missing content dir, unknown branch, …).
26
- * Thrown so the CLI exits non-zero — scripts/CI must not sail past a
27
- * push that synced nothing.
28
- */
29
- export declare class SyncError extends Error {
30
- constructor(message: string);
31
- }
32
24
  /**
33
25
  * Run the sync command.
34
26
  *
package/dist/cli/sync.js CHANGED
@@ -26,7 +26,7 @@ import { operatingStrategy } from '../operating-mode/index.js';
26
26
  * Thrown so the CLI exits non-zero — scripts/CI must not sail past a
27
27
  * push that synced nothing.
28
28
  */
29
- export class SyncError extends Error {
29
+ class SyncError extends Error {
30
30
  constructor(message) {
31
31
  super(message);
32
32
  this.name = 'SyncError';
@@ -49,14 +49,13 @@ async function selectBranch(options, branchesDir) {
49
49
  let branches = [];
50
50
  if (await filePathExists(branchesDir)) {
51
51
  const entries = await fs.readdir(branchesDir, { withFileTypes: true });
52
- // Dot-prefixed dirs are never branch workspaces (.canopy-meta, and now
52
+ // Dot-prefixed dirs are never branch workspaces (.canopy-meta, plus
53
53
  // .trash-*/.{dirName}.init.lock from the admin branch-health recovery
54
- // surface) -- same skip rule as BranchRegistry.scanBranchDirectories.
54
+ // surface) — same skip rule as BranchRegistry.scanBranchDirectories.
55
55
  branches = entries.filter((e) => e.isDirectory() && !e.name.startsWith('.')).map((e) => e.name);
56
56
  }
57
57
  let branchName = options.branch;
58
58
  if (!branchName) {
59
- // Default to current git branch
60
59
  try {
61
60
  branchName = await detectCurrentBranch(options.projectDir);
62
61
  }
@@ -96,12 +95,11 @@ async function selectBranch(options, branchesDir) {
96
95
  await wsGit.init();
97
96
  await wsGit.checkoutLocalBranch(branchName);
98
97
  await wsGit.raw(['commit', '--allow-empty', '-m', 'init: workspace created by sync']);
99
- // Runtime metadata (.canopy-meta/: branch metadata, comments, the
100
- // content-index generation marker) must never be staged by sync's
101
- // `add -A`. Fully provisioned workspaces get this exclude from
102
- // GitManager.initializeWorkspace; this minimal one needs it too. Sync is
103
- // dev-mode-only (see branchesDir), so ask the dev strategy for the
104
- // pattern rather than hardcoding it.
98
+ // Runtime metadata (.canopy-meta/: branch metadata, comments, content-index
99
+ // marker) must never be staged by sync's `add -A`. Fully provisioned workspaces
100
+ // get this exclude from GitManager.initializeWorkspace; this minimal one needs it
101
+ // too. Sync is dev-mode-only (see branchesDir), so this asks the dev strategy for
102
+ // the pattern rather than hardcoding it.
105
103
  await ensureGitExcludePattern(branchPath, operatingStrategy('dev').getGitExcludePattern());
106
104
  p.log.info(`Created branch workspace: ${branchName}`);
107
105
  }
@@ -133,7 +131,6 @@ async function syncPush(options) {
133
131
  const branchPath = path.join(branchesDir, branchName);
134
132
  assertWithinDir(branchPath, branchesDir, '--branch');
135
133
  const wsGit = simpleGit({ baseDir: branchPath });
136
- // Check workspace health
137
134
  const status = await wsGit.status();
138
135
  if (status.conflicted.length > 0) {
139
136
  p.log.error('Branch workspace has unresolved merge conflicts.');
@@ -152,7 +149,6 @@ async function syncPush(options) {
152
149
  }
153
150
  return { fileCount: 0 };
154
151
  }
155
- // Warn about uncommitted workspace changes (editor saves)
156
152
  if (status.files.length > 0 && !options.force) {
157
153
  p.log.warn(`Branch workspace has ${status.files.length} uncommitted change(s) that will be committed to history then overwritten:`);
158
154
  for (const file of status.files.slice(0, 10)) {
@@ -264,7 +260,6 @@ async function syncPull(options) {
264
260
  return { fileCount: 0 };
265
261
  }
266
262
  }
267
- // Replace the working-tree content with the branch workspace content.
268
263
  // Uses backup-rename pattern: if interrupted, at least one copy always exists.
269
264
  const tmpDestDir = `${destContentDir}.sync-tmp-${Date.now()}`;
270
265
  try {
@@ -276,7 +271,6 @@ async function syncPull(options) {
276
271
  await fs.rm(tmpDestDir, { recursive: true, force: true }).catch(() => { });
277
272
  throw err;
278
273
  }
279
- // Show what changed using git status (re-check after copy)
280
274
  const postStatus = await sourceGit.status();
281
275
  const contentChanges = postStatus.files.filter((f) => f.path.startsWith(contentRoot + '/') || f.path === contentRoot);
282
276
  if (contentChanges.length === 0) {
@@ -318,7 +312,6 @@ async function syncBoth(options) {
318
312
  const branchPath = path.join(branchesDir, branchName);
319
313
  assertWithinDir(branchPath, branchesDir, '--branch');
320
314
  const wsGit = simpleGit({ baseDir: branchPath });
321
- // Check workspace health
322
315
  const status = await wsGit.status();
323
316
  if (status.conflicted.length > 0) {
324
317
  p.log.error('Branch workspace has unresolved merge conflicts.');
@@ -329,8 +322,6 @@ async function syncBoth(options) {
329
322
  });
330
323
  if (!p.isCancel(shouldAbort) && shouldAbort) {
331
324
  await wsGit.merge(['--abort']);
332
- // The abort rewrote the clone's working tree — tell ContentStore ID
333
- // indexes (the dev server is a separate process; on-disk marker).
334
325
  await invalidateBranchContentCaches(branchPath);
335
326
  p.log.success('Merge aborted. Workspace restored to pre-merge state.');
336
327
  }
@@ -343,7 +334,6 @@ async function syncBoth(options) {
343
334
  await wsGit.commit('sync: save editor state before merge');
344
335
  p.log.info('Committed editor changes before merge');
345
336
  }
346
- // Determine merge base
347
337
  let baseRef;
348
338
  try {
349
339
  await wsGit.raw(['rev-parse', SYNC_BASE_TAG]);
@@ -353,17 +343,14 @@ async function syncBoth(options) {
353
343
  // First time: no tag exists. Use current HEAD as base.
354
344
  baseRef = 'HEAD';
355
345
  }
356
- // Remember the current branch to switch back after merge
357
346
  const currentBranch = (await wsGit.revparse(['--abbrev-ref', 'HEAD'])).trim();
358
347
  // Everything from here mutates the branch clone's working tree (temp-branch
359
348
  // checkout, content replace, merge) — whatever the outcome, mark ContentStore
360
349
  // ID indexes stale in the finally below. The dev server is a separate
361
350
  // process, reached via the on-disk generation marker.
362
351
  try {
363
- // Create temp branch from the merge base
364
352
  const incomingBranch = `sync-incoming-${Date.now()}`;
365
353
  await wsGit.raw(['checkout', '-b', incomingBranch, baseRef]);
366
- // Replace content on temp branch with working-tree content
367
354
  const wsContentDir = path.join(branchPath, contentRoot);
368
355
  assertWithinDir(wsContentDir, branchPath, '--content-root');
369
356
  const tmpDir = `${wsContentDir}.sync-tmp-${Date.now()}`;
@@ -380,7 +367,6 @@ async function syncBoth(options) {
380
367
  }
381
368
  await wsGit.add('-A');
382
369
  const incomingStatus = await wsGit.status();
383
- // No working-tree changes — skip merge, just pull editor changes
384
370
  if (incomingStatus.files.length === 0) {
385
371
  await wsGit.checkout(currentBranch);
386
372
  await wsGit.raw(['branch', '-D', incomingBranch]);
@@ -389,14 +375,12 @@ async function syncBoth(options) {
389
375
  return { pushed: 0, pulled: pullResult.fileCount };
390
376
  }
391
377
  await wsGit.commit('sync: incoming working-tree changes');
392
- // Switch back to workspace branch and merge
393
378
  await wsGit.checkout(currentBranch);
394
379
  p.log.step('Merging working-tree changes with editor changes...');
395
380
  try {
396
381
  await wsGit.merge([incomingBranch, '--no-edit']);
397
382
  }
398
383
  catch (mergeError) {
399
- // Check if it's a merge conflict
400
384
  let mergeStatus;
401
385
  try {
402
386
  mergeStatus = await wsGit.status();
@@ -418,7 +402,6 @@ async function syncBoth(options) {
418
402
  await wsGit.raw(['branch', '-D', incomingBranch]).catch(() => { });
419
403
  return { pushed: 0, pulled: 0 };
420
404
  }
421
- // Not a conflict — clean up and re-throw original error
422
405
  await wsGit.raw(['branch', '-D', incomingBranch]).catch(() => { });
423
406
  throw mergeError;
424
407
  }
@@ -426,7 +409,6 @@ async function syncBoth(options) {
426
409
  await wsGit.raw(['branch', '-D', incomingBranch]);
427
410
  await wsGit.tag(['-f', SYNC_BASE_TAG]);
428
411
  p.log.success('Merged working-tree changes with editor changes');
429
- // Pull merged result back to working tree
430
412
  const pullResult = await syncPull({ ...options, branch: branchName, force: true });
431
413
  return { pushed: incomingStatus.files.length, pulled: pullResult.fileCount };
432
414
  }
@@ -453,8 +435,6 @@ async function syncAbort(options) {
453
435
  return;
454
436
  }
455
437
  await wsGit.merge(['--abort']);
456
- // The abort rewrote the clone's working tree — tell ContentStore ID indexes
457
- // (the dev server is a separate process; on-disk marker).
458
438
  await invalidateBranchContentCaches(branchPath);
459
439
  p.log.success(`Merge aborted in branch workspace "${branchName}". Workspace restored to pre-merge state.`);
460
440
  }
@@ -1,18 +1,26 @@
1
1
  import { NextResponse } from 'next/server'
2
2
 
3
- // Protect CMS routes from unauthenticated access.
3
+ // Optional edge protection for /edit and /api/canopycms. This passthrough adds none, and the CMS
4
+ // needs none in any auth mode: the API authenticates every request itself, and the editor shows
5
+ // the auth provider's sign-in screen to signed-out users. It is the same file for every auth mode,
6
+ // so changing CANOPY_AUTH_MODE needs nothing here.
4
7
  //
5
- // For dev auth mode, no middleware protection is needed — this file is a passthrough.
6
- // If you don't need auth protection, you can delete this file entirely.
7
- //
8
- // For Clerk auth, replace this file's contents with:
8
+ // With Clerk you can instead turn signed-out requests away at the edge, before they reach the
9
+ // app. On a deployed CMS Lambda that costs two things:
10
+ // - CLERK_SECRET_KEY on the Lambda. clerkMiddleware throws on every request it matches unless
11
+ // it can resolve a secret key (jwtKey doesn't count), which breaks the public-keys-only
12
+ // Lambda that the Security Model in docs/deploying-to-aws.md describes.
13
+ // - One image per Clerk instance. It reads the publishable key inlined at image build
14
+ // (NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY), not the one your ClerkProvider receives, unless you
15
+ // pass it an options callback that reads both keys at run time.
16
+ // To adopt it anyway, replace this file's contents with:
9
17
  //
10
18
  // import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'
11
19
  //
12
20
  // const isProtectedRoute = createRouteMatcher(['/edit(.*)', '/api/canopycms(.*)'])
13
21
  //
14
- // // jwtKey avoids a JWKS fetch to api.clerk.com on cold verification --
15
- // // the prod CMS Lambda has no internet.
22
+ // // jwtKey avoids a JWKS fetch to api.clerk.com on cold verification -- the prod CMS Lambda
23
+ // // has no internet, and the CLERK_JWT_KEY env var alone is never read.
16
24
  // export default clerkMiddleware(
17
25
  // async (auth, req) => {
18
26
  // if (isProtectedRoute(req)) {
@@ -25,30 +33,8 @@ import { NextResponse } from 'next/server'
25
33
  // export const config = {
26
34
  // matcher: ['/edit(.*)', '/api/canopycms(.*)'],
27
35
  // }
28
- //
29
- // IMPORTANT: unlike canopy.ts and the edit page, this file does NOT read
30
- // CANOPY_AUTH_MODE at runtime -- it is frozen at `init` time. If you switch
31
- // from dev to Clerk auth (or flip CANOPY_AUTH_MODE=clerk), choose what this
32
- // file becomes. The Clerk middleware above turns signed-out requests away
33
- // before they reach the app, but needs CLERK_SECRET_KEY wherever it runs.
34
- // Deleting the file relies on the Clerk auth plugin alone, which rejects
35
- // unauthenticated API calls on its own (the core also fails closed in prod
36
- // mode), and keeps the secret off a deployed CMS Lambda -- see "One image for
37
- // every Clerk tier" in docs/deploying-to-aws.md. Keeping this passthrough with
38
- // Clerk behaves like deleting it; the warning below is there so that it's a
39
- // choice rather than an oversight.
40
-
41
- let warnedAuthModeMismatch = false
42
36
 
43
37
  export default function middleware() {
44
- if (process.env.CANOPY_AUTH_MODE === 'clerk' && !warnedAuthModeMismatch) {
45
- warnedAuthModeMismatch = true
46
- console.warn(
47
- '[canopycms] CANOPY_AUTH_MODE=clerk is set, but middleware.ts is still the dev ' +
48
- 'passthrough generated for dev auth. Replace it with the Clerk middleware (see the ' +
49
- 'comment above), or delete it to rely on the Clerk auth plugin alone.',
50
- )
51
- }
52
38
  return NextResponse.next()
53
39
  }
54
40
 
@@ -22,21 +22,11 @@ export declare function aiConfig(): Promise<string>;
22
22
  export declare function aiRoute(options: {
23
23
  configImport: string;
24
24
  }): Promise<string>;
25
- export declare function middleware(options: {
26
- authProvider: 'clerk' | 'dev';
27
- }): Promise<string>;
25
+ /** One passthrough for every auth mode; it carries the opt-in `clerkMiddleware` as a comment. */
26
+ export declare function middleware(): Promise<string>;
28
27
  export declare function nextConfig(options: {
29
28
  staticBuild: boolean;
30
29
  }): Promise<string>;
31
- /**
32
- * CloudFormation stack id used by the scaffolded CDK app.
33
- *
34
- * Shared rather than written twice: `infrastructure/bin/app.ts` names the
35
- * stack, and the deploy workflow deploys it BY NAME (not `--all`, which would
36
- * also deploy any unrelated stacks an adopter keeps in the same repo). Those
37
- * two must agree, so they read the same constant.
38
- */
39
- export declare const SCAFFOLD_STACK_NAME = "CanopyCms";
40
30
  export declare function dockerfileCms(options: {
41
31
  copy: string;
42
32
  install: string;
@@ -71,9 +71,9 @@ export async function aiRoute(options) {
71
71
  const template = await readTemplate('ai-route.ts.template');
72
72
  return template.replace('{{CONFIG_IMPORT}}', options.configImport);
73
73
  }
74
- export async function middleware(options) {
75
- const templateName = options.authProvider === 'clerk' ? 'middleware-clerk.ts.template' : 'middleware.ts.template';
76
- return readTemplate(templateName);
74
+ /** One passthrough for every auth mode; it carries the opt-in `clerkMiddleware` as a comment. */
75
+ export async function middleware() {
76
+ return readTemplate('middleware.ts.template');
77
77
  }
78
78
  export async function nextConfig(options) {
79
79
  const templateName = options.staticBuild
@@ -89,7 +89,7 @@ export async function nextConfig(options) {
89
89
  * also deploy any unrelated stacks an adopter keeps in the same repo). Those
90
90
  * two must agree, so they read the same constant.
91
91
  */
92
- export const SCAFFOLD_STACK_NAME = 'CanopyCms';
92
+ const SCAFFOLD_STACK_NAME = 'CanopyCms';
93
93
  export async function dockerfileCms(options) {
94
94
  const template = await readTemplate('Dockerfile.cms.template');
95
95
  return template
package/dist/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type { CanopyClientConfig } from './config/index.js';
1
+ export type { CanopyClientConfig, EditorSignInProps } from './config/index.js';
2
2
  export type { CustomFieldRenderers, CustomFieldRenderProps } from './editor/FormRenderer.js';
3
3
  export * from './editor/EditorPanes.js';
4
4
  export * from './editor/EntryNavigator.js';
@@ -1,12 +1,5 @@
1
- /**
2
- * Error thrown when a concurrent modification is detected.
3
- * Operations that encounter this error will automatically retry.
4
- */
5
- export declare class CommentStoreConflictError extends Error {
6
- constructor();
7
- }
8
1
  export type CommentType = 'field' | 'entry' | 'branch';
9
- export interface Comment {
2
+ interface Comment {
10
3
  id: string;
11
4
  threadId: string;
12
5
  userId: string;
@@ -32,28 +25,23 @@ export interface CommentsFile {
32
25
  threads: Record<string, CommentThread>;
33
26
  }
34
27
  /**
35
- * Manages comment storage for a branch workspace.
36
- * Comments are stored in .canopy-meta/comments.json and are NOT committed to git.
28
+ * Comment storage for a branch workspace, in .canopy-meta/comments.json and
29
+ * never committed to git.
37
30
  *
38
- * Mutators are protected by three layers, outermost to innermost:
31
+ * Mutators run under three layers, outermost to innermost:
39
32
  *
40
- * 1. {@link withLock} - an in-process FIFO mutex keyed by the resolved file
41
- * path. Serializes concurrent mutators on the SAME process/host
42
- * deterministically, so racing `resolveThread`/`deleteThread`/`addComment`
43
- * calls against the same store (or two store instances pointed at the
44
- * same branch) never race each other's load-modify-write cycle.
45
- * 2. {@link withOccFileLock} - a server-enforced, cross-process/cross-host
46
- * lock (proper-lockfile, mkdir-based). This is the actual fix for lost
47
- * comments across two warm Lambda containers on EFS, where rename-based
48
- * OCC verification alone is unreliable (see guarantee doc on
49
- * `utils/occ-json-write.ts`).
50
- * 3. {@link withOccRetry} around {@link writeOccJsonFile} - version/writeId
51
- * based optimistic concurrency control. With layers 1-2 in place this is
52
- * now a defense-in-depth backstop only (e.g. a stale process from a
53
- * rolling deploy writing without the lock), not the primary safety
54
- * mechanism.
33
+ * 1. {@link withLock} — an in-process FIFO mutex keyed by the resolved file
34
+ * path, so mutators racing on one host cannot interleave their
35
+ * load-modify-write cycles, whether they share a store instance or not.
36
+ * 2. {@link withOccFileLock} — a server-enforced, cross-process/cross-host lock
37
+ * (proper-lockfile, mkdir-based). This is what actually prevents lost
38
+ * comments across two warm Lambda containers on EFS, where rename-based OCC
39
+ * verification alone is unreliable.
40
+ * 3. {@link withOccRetry} around {@link writeOccJsonFile} — version/writeId
41
+ * optimistic concurrency. With layers 1-2 in place it is defense in depth
42
+ * only, for a writer that skips the lock (a stale process mid-deploy).
55
43
  *
56
- * See `utils/occ-json-write.ts` for full guarantee documentation of layers 2-3.
44
+ * Guarantees for layers 2-3: `utils/occ-json-write.ts`.
57
45
  */
58
46
  export declare class CommentStore {
59
47
  private readonly filePath;
@@ -61,34 +49,30 @@ export declare class CommentStore {
61
49
  constructor(branchRoot: string, options?: {
62
50
  settleMs?: number;
63
51
  });
64
- /**
65
- * Load comments file for read-only access.
66
- */
52
+ /** Read-only load. */
67
53
  load(): Promise<CommentsFile>;
68
54
  /**
69
- * Load comments file along with the version observed at load time. Used by
70
- * mutators, which need the version as a LOCAL value threaded through their
71
- * load-modify-write cycle rather than shared mutable instance state (so
72
- * concurrent mutate cycles on the same instance never clobber each other's
73
- * expected version).
55
+ * Load, with the version observed at load time. Mutators thread that version
56
+ * through their load-modify-write cycle as a LOCAL value, never as instance
57
+ * state, so concurrent cycles cannot clobber each other's expected version.
74
58
  */
75
59
  private loadWithVersion;
76
60
  /**
77
- * Write comments file via the shared OCC helper.
61
+ * Write comments.json via the shared OCC helper.
78
62
  *
79
- * Throws the helper's raw {@link OccWriteConflictError} so the surrounding
80
- * {@link withOccRetry} in withMutation() recognizes and retries it;
81
- * translation to the public `CommentStoreConflictError` contract happens at
82
- * the withMutation() boundary, after retries are exhausted.
63
+ * Throws the helper's raw {@link OccWriteConflictError}, which is what the
64
+ * surrounding {@link withOccRetry} in withMutation() recognizes and retries;
65
+ * translation to the public `CommentStoreConflictError` happens at the
66
+ * withMutation() boundary, once retries are exhausted.
83
67
  *
84
- * Note: comment-store historically wrote without a trailing newline;
85
- * `writeOccJsonFile`'s default (`trailingNewline: false`) preserves that.
68
+ * comments.json is written without a trailing newline (`writeOccJsonFile`'s
69
+ * default), unlike branch.json.
86
70
  */
87
71
  private writeData;
88
72
  /**
89
73
  * Run a mutate cycle (load -> modify -> write) under the full lock +
90
- * OCC-retry stack described in the class doc comment. A conflict that
91
- * survives every retry surfaces as the public `CommentStoreConflictError`.
74
+ * OCC-retry stack (class doc). A conflict surviving every retry surfaces as
75
+ * `CommentStoreConflictError`.
92
76
  */
93
77
  private withMutation;
94
78
  addComment(options: {
@@ -108,16 +92,11 @@ export declare class CommentStore {
108
92
  }): Promise<CommentThread[]>;
109
93
  getThread(threadId: string): Promise<CommentThread | null>;
110
94
  deleteThread(threadId: string): Promise<boolean>;
111
- /**
112
- * Get all threads for a specific field
113
- */
95
+ /** Threads on one field. */
114
96
  getThreadsForField(entryPath: string, canopyPath: string): Promise<CommentThread[]>;
115
- /**
116
- * Get all threads for a specific entry (not field-specific)
117
- */
97
+ /** Threads on one entry, excluding its field threads. */
118
98
  getThreadsForEntry(entryPath: string): Promise<CommentThread[]>;
119
- /**
120
- * Get all branch-level threads
121
- */
99
+ /** Branch-level threads. */
122
100
  getBranchThreads(): Promise<CommentThread[]>;
123
101
  }
102
+ export {};