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
package/dist/utils/git.js CHANGED
@@ -1,39 +1,30 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { simpleGit } from 'simple-git';
4
- // Matches scheme://... URLs (http, https, ssh, git — case-insensitive).
5
4
  const NETWORK_SCHEME_PATTERN = /^(https?|ssh|git):\/\//i;
6
- // Matches git's "transport helper" syntax, e.g. `ext::sh -c ...` or `fd::7`.
7
- // Any `scheme::` prefix hands the URL to `git-remote-<scheme>`, which can run
8
- // arbitrary commands — always treat it as network/untrusted.
5
+ // git's "transport helper" syntax (`ext::sh -c ...`, `fd::7`): any `scheme::` prefix hands the
6
+ // URL to `git-remote-<scheme>`, which can run arbitrary commands — always network/untrusted.
9
7
  const TRANSPORT_HELPER_PATTERN = /^[a-z][a-z0-9+.-]*::/i;
10
- // A leading `-` means the "URL" would be parsed as a command-line option by
11
- // git (e.g. `--upload-pack=/evil`) — argument injection, not a real remote.
8
+ // A leading `-` makes git parse the "URL" as a command-line option (`--upload-pack=/evil`) —
9
+ // argument injection, not a real remote.
12
10
  const LEADING_OPTION_PATTERN = /^-/;
13
- // Windows drive paths (`C:\...`, `C:/...`) are the one local form that
14
- // contains a colon before any slash; everything else with a colon before the
15
- // first slash is scp-like remote syntax, e.g. `git@github.com:owner/repo.git`
16
- // or the bare `github.com:owner/repo.git` (no `@` required — git still
17
- // treats `host:path` as ssh).
11
+ // Windows drive paths (`C:\...`, `C:/...`) are the one local form carrying a colon before any
12
+ // slash; everything else with a colon before the first slash is scp-like remote syntax
13
+ // (`git@github.com:owner/repo.git`, or bare `github.com:owner/repo.git` — git treats `host:path`
14
+ // as ssh with no `@` required).
18
15
  const WINDOWS_DRIVE_PATTERN = /^[a-zA-Z]:[\\/]/;
19
16
  const COLON_BEFORE_SLASH_PATTERN = /^[^/\\\s]+:/;
20
17
  /**
21
- * Whether a git remote URL points at a network location — http(s)://,
22
- * ssh://, git://, scp-like `[user@]host:path`, a transport-helper `scheme::`
23
- * form, or a leading-`-` value git would parse as a command-line option —
24
- * rather than a local filesystem path.
18
+ * Whether a git remote URL points at a network location rather than a local filesystem path. Only
19
+ * `file://` URLs, plain filesystem paths and Windows drive paths are LOCAL; the patterns above
20
+ * enumerate the network forms.
25
21
  *
26
- * `file://` URLs and plain filesystem paths are LOCAL — this is the
27
- * distinction GitManager's prod-mode network-remote guard relies on (see
28
- * `resolveRemoteUrl`): the intended prod topology only ever resolves a local
29
- * path (an auto-detected/auto-initialized `remote.git`), so anything network
30
- * flowing in via an explicit param, config, or env var is almost always a
31
- * misconfiguration in prod. Because the guard's job is catching prod
32
- * misconfig (not being a strict URL parser), this classifier treats anything
33
- * git could interpret as a network transport, a transport helper, or a
34
- * command-line option as "network". The one local carve-out beyond `file://`
35
- * is a Windows drive path (`C:\...` / `C:/...`), which replaces the old
36
- * `@`-required heuristic for scp-like syntax.
22
+ * The distinction GitManager's prod-mode network-remote guard relies on (see `resolveRemoteUrl`):
23
+ * the intended prod topology only ever resolves a local path (an auto-detected/auto-initialized
24
+ * `remote.git`), so anything network arriving via an explicit param, config, or env var is almost
25
+ * always a prod misconfiguration. Catching that is the job, not being a strict URL parser, so
26
+ * anything git could read as a network transport, a transport helper, or a command-line option
27
+ * counts as "network".
37
28
  */
38
29
  export function isNetworkRemoteUrl(url) {
39
30
  if (/^file:\/\//i.test(url))
@@ -48,106 +39,78 @@ export function isNetworkRemoteUrl(url) {
48
39
  return false;
49
40
  return COLON_BEFORE_SLASH_PATTERN.test(url);
50
41
  }
51
- // Matches git's per-ref push-status summary line marking a ref as rejected.
52
- // Present verbatim in BOTH output shapes CanopyCMS's push call sites produce:
53
- // the plain CLI form (`GitManager.push()`'s `.raw(['push', ...])`, e.g.
54
- // ` ! [rejected] branch -> branch (non-fast-forward)`) and the
55
- // machine-readable `--porcelain` form simple-git's `.push()` wrapper requests
56
- // (`CmsWorker.pushBranchToGitHub`/`pushSettingsBranches`, e.g.
57
- // `!\trefs/heads/branch:refs/heads/branch\t[rejected] (non-fast-forward)`) --
58
- // `--porcelain` only changes the per-ref summary's leading fields, not this
59
- // trailing human-readable bracket text.
42
+ // git's per-ref push-status summary marking a ref as rejected. Present verbatim in BOTH output
43
+ // shapes CanopyCMS's push sites produce -- the plain CLI form and the `--porcelain` form
44
+ // simple-git's `.push()` requests -- because `--porcelain` changes only the summary's leading
45
+ // fields, not this trailing bracket text.
60
46
  const REJECTED_MARKER = '[rejected]';
61
- // git's two names for the SAME underlying condition: `non-fast-forward` fires
62
- // when the pusher's own remote-tracking ref is present but stale;
63
- // `fetch first` fires when no local knowledge of the remote ref exists at all
64
- // (e.g. it was never fetched). Both mean the remote has commits this side
65
- // doesn't have -- retrying the identical push can never succeed until the
66
- // caller fetches and integrates (or picks a different branch name).
47
+ // git's two names for the SAME condition: `non-fast-forward` when the pusher's remote-tracking ref
48
+ // is present but stale, `fetch first` when no local knowledge of the remote ref exists at all.
49
+ // Both mean the remote has commits this side does not, so the identical push can never succeed
50
+ // until the caller fetches and integrates (or picks a different branch name).
67
51
  const NON_FAST_FORWARD_REASONS = ['non-fast-forward', 'fetch first'];
68
- // git always prints this stderr hint immediately after a rejected push,
69
- // regardless of --porcelain (porcelain only affects the machine-readable
70
- // summary line, not the human hint text that follows it) -- a second,
52
+ // git prints this stderr hint immediately after a rejected push, `--porcelain` or not -- a second,
71
53
  // independent signal for the same condition.
72
54
  const REJECTION_HINT = 'Updates were rejected because';
73
55
  /**
74
- * Whether a git push failure message is git's non-fast-forward rejection --
75
- * the remote has diverged (moved ahead with commits this side never fetched),
76
- * so retrying the IDENTICAL push can never succeed. In CanopyCMS this is the
77
- * signature of two CanopyCMS deployments sharing one GitHub repo and picking
78
- * the same content-branch name, or someone pushing directly to GitHub.
56
+ * Whether a git push failure message is git's non-fast-forward rejection -- the remote has
57
+ * diverged, so retrying the IDENTICAL push can never succeed. In CanopyCMS that means two
58
+ * deployments sharing one GitHub repo and picking the same content-branch name, or someone pushing
59
+ * directly to GitHub.
79
60
  *
80
- * Deliberately narrow: ordinary transient push failures -- network drops,
81
- * auth/permission denial, lock contention -- must keep retrying with backoff
82
- * (see worker/task-runner.ts's `isPermanentTaskFailure`, which treats git
83
- * failures as transient precisely so those cases still get retried). Only
84
- * this specific, structurally-unretryable shape should fail fast (worker) or
85
- * return 409 (API) instead.
61
+ * Deliberately narrow: ordinary transient push failures -- network drops, auth/permission denial,
62
+ * lock contention -- must keep retrying with backoff (worker/task-runner.ts's
63
+ * `isPermanentTaskFailure` treats git failures as transient precisely so they do). Only this
64
+ * structurally-unretryable shape fails fast (worker) or returns 409 (API).
86
65
  *
87
- * Matches git's literal (English) rejection text, which is gettext-
88
- * translated -- callers MUST run the underlying git command with a
89
- * locale-pinning env (see `gitChildEnv` in `../git-manager.ts`) or an ambient
90
- * LANG/LC_ALL could silently turn this into a permanent no-op.
66
+ * Matches git's literal English rejection text, which is gettext-translated: callers MUST run the
67
+ * git command with a locale-pinning env (`gitChildEnv` in `../git-manager.ts`), or an ambient
68
+ * LANG/LC_ALL silently turns this into a permanent no-op.
91
69
  */
92
70
  export function isNonFastForwardRejection(message) {
93
71
  const hasNonFastForwardRejection = message.includes(REJECTED_MARKER) &&
94
72
  NON_FAST_FORWARD_REASONS.some((reason) => message.includes(reason));
95
73
  return hasNonFastForwardRejection || message.includes(REJECTION_HINT);
96
74
  }
97
- // git's reason text when a `--force-with-lease=<ref>:<sha>` push is refused
98
- // because the remote is not at `<sha>`.
75
+ // git's reason text when a `--force-with-lease=<ref>:<sha>` push is refused because the remote is
76
+ // not at `<sha>`.
99
77
  const STALE_LEASE_REASON = 'stale info';
100
78
  /**
101
- * Whether a git push failure message is a refused `--force-with-lease` --
102
- * the remote ref is NOT at the commit the pusher expected, so the forced
103
- * update was declined and nothing was overwritten.
79
+ * Whether a git push failure message is a refused `--force-with-lease` -- the remote ref is NOT at
80
+ * the commit the pusher expected, so the forced update was declined and nothing overwritten.
104
81
  *
105
- * A SEPARATE predicate from `isNonFastForwardRejection` because git's output
106
- * for the two is disjoint: a refused lease prints
107
- * ` ! [rejected] branch -> branch (stale info)` and, unlike an
108
- * ordinary rejection, emits NEITHER `non-fast-forward`/`fetch first` NOR the
109
- * `Updates were rejected because` hint. Without this predicate every lease
110
- * refusal would be classified transient and retried -- three identical,
111
- * guaranteed-to-fail force attempts -- instead of surfacing as the permanent,
112
- * human-actionable state it is.
113
- *
114
- * Same locale caveat as above: the reason text is gettext-translated, so
115
- * callers MUST pin the locale (`gitChildEnv`/`gitNetworkChildEnv`).
82
+ * A SEPARATE predicate from `isNonFastForwardRejection` because git's output for the two is
83
+ * disjoint: a refused lease prints `(stale info)` and emits NEITHER `non-fast-forward`/`fetch
84
+ * first` NOR the `Updates were rejected because` hint. Without it every lease refusal is
85
+ * classified transient and retried -- identical, guaranteed-to-fail force attempts -- instead of
86
+ * surfacing as the permanent, human-actionable state it is. Same locale caveat as above.
116
87
  */
117
88
  export function isStaleLeaseRejection(message) {
118
89
  return message.includes(REJECTED_MARKER) && message.includes(STALE_LEASE_REASON);
119
90
  }
120
- // git's message when `git fetch <remote> <branch>` names a ref the remote does
121
- // not have. Both spellings occur: modern git prints the lowercase form, older
122
- // versions and some transports capitalize it.
91
+ // git's message when `git fetch <remote> <branch>` names a ref the remote does not have. Both
92
+ // spellings occur: modern git prints the lowercase form, older versions and some transports
93
+ // capitalize it.
123
94
  const MISSING_REMOTE_REF_REASONS = ["couldn't find remote ref", "Couldn't find remote ref"];
124
95
  /**
125
- * Whether a `git fetch <remote> <branch>` failure is specifically "that ref
126
- * doesn't exist on the remote" -- the ONLY benign fetch outcome, meaning the
127
- * branch has never been pushed.
128
- *
129
- * Narrow on purpose, and the narrowness is the whole point. This predicate
130
- * exists because a bare `catch` around the fetch classified EVERY failure --
131
- * unreachable remote, auth denial, permission error on the workspace, corrupt
132
- * object store -- as "nothing to pull", which callers then logged as normal
133
- * and proceeded past. Anything this does not recognize must reach the caller
134
- * as the genuine error it is.
96
+ * Whether a `git fetch <remote> <branch>` failure is specifically "that ref doesn't exist on the
97
+ * remote" -- the ONLY benign fetch outcome, meaning the branch has never been pushed.
135
98
  *
136
- * Same locale caveat as the predicates above: the text is gettext-translated,
137
- * so callers MUST run git with a locale-pinning env (`gitChildEnv`).
99
+ * Narrow on purpose, and the narrowness is the point: a bare `catch` around the fetch classifies
100
+ * EVERY failure -- unreachable remote, auth denial, permission error on the workspace, corrupt
101
+ * object store -- as "nothing to pull", which callers then log as normal and proceed past.
102
+ * Anything this does not recognize must reach the caller as the genuine error it is. Same locale
103
+ * caveat as the predicates above.
138
104
  */
139
105
  export function isMissingRemoteRefFailure(message) {
140
106
  return MISSING_REMOTE_REF_REASONS.some((reason) => message.includes(reason));
141
107
  }
142
108
  /**
143
- * Resolve a repository's git directory from its working-tree root, handling
144
- * both layouts: a real `.git` directory, and a `.git` FILE containing a
145
- * `gitdir: <path>` pointer (linked worktrees, submodules).
146
- *
147
- * Deliberately fs-only rather than `git rev-parse --git-dir`: the callers are
148
- * a per-branch sync loop and an admin-facing health scan that already walk
149
- * every branch directory, and neither should pay a subprocess per branch just
150
- * to find a path.
109
+ * Resolve a repository's git directory from its working-tree root, handling both layouts: a real
110
+ * `.git` directory, and a `.git` FILE holding a `gitdir: <path>` pointer (linked worktrees,
111
+ * submodules). Deliberately fs-only rather than `git rev-parse --git-dir`: the callers are a
112
+ * per-branch sync loop and an admin-facing health scan that already walk every branch directory,
113
+ * and neither should pay a subprocess per branch just to find a path.
151
114
  */
152
115
  async function resolveGitDir(repoPath) {
153
116
  const dotGit = path.join(repoPath, '.git');
@@ -173,20 +136,16 @@ async function resolveGitDir(repoPath) {
173
136
  }
174
137
  }
175
138
  /**
176
- * Whether a repository has an INTERRUPTED rebase on disk — the `rebase-merge`
177
- * (interactive/merge backend) or `rebase-apply` (am backend) state directory
178
- * git leaves behind when a rebase stops for conflicts or the process dies
179
- * mid-way.
139
+ * Whether a repository has an INTERRUPTED rebase on disk — the `rebase-merge` (interactive/merge
140
+ * backend) or `rebase-apply` (am backend) state directory git leaves when a rebase stops for
141
+ * conflicts or the process dies mid-way. Invisible to every other check the worker makes: a clone
142
+ * left mid-rebase reports uncommitted changes, so the sync loop's dirty check skips it as
143
+ * `skippedDirty` on every cycle forever, and `branch-health` sees valid branch.json and scans it
144
+ * as healthy. Nothing self-heals without it.
180
145
  *
181
- * This state is invisible to every other check the worker makes: a clone left
182
- * mid-rebase reports uncommitted changes, so the sync loop's dirty check skips
183
- * it as `skippedDirty` on every cycle forever, and `branch-health` sees valid
184
- * branch.json and scans it as healthy. Nothing self-heals, and recovery
185
- * previously meant an operator running `git rebase --abort` on EFS by hand.
186
- *
187
- * Never throws — a missing or unreadable repo is reported as "no rebase",
188
- * which is the safe direction for both callers (the worker only ever uses a
189
- * `true` to justify an abort it holds the content-write lock for).
146
+ * Never throws — a missing or unreadable repo is reported as "no rebase", the safe direction for
147
+ * both callers (the worker only uses a `true` to justify an abort it holds the content-write lock
148
+ * for).
190
149
  */
191
150
  export async function isRebaseInProgress(repoPath) {
192
151
  const gitDir = await resolveGitDir(repoPath);
@@ -199,9 +158,8 @@ export async function isRebaseInProgress(repoPath) {
199
158
  return results.some(Boolean);
200
159
  }
201
160
  /**
202
- * Detect the current HEAD branch name for a given repository root.
203
- * Returns the branch name, or the provided fallback (default 'main')
204
- * if detection fails or HEAD is detached.
161
+ * The repository's current HEAD branch name, or `fallback` when detection fails or HEAD is
162
+ * detached.
205
163
  */
206
164
  export async function detectHeadBranch(repoRoot, fallback = 'main') {
207
165
  try {
@@ -214,18 +172,14 @@ export async function detectHeadBranch(repoRoot, fallback = 'main') {
214
172
  }
215
173
  }
216
174
  /**
217
- * Resolve the base branch — the fork point for CMS editing branches and the
218
- * branch used to seed workspace clones.
219
- *
220
- * This is the single definition of base-branch behavior (see ARCHITECTURE.md
221
- * "Branch Identity"):
222
- * - An explicitly configured `defaultBaseBranch` always wins, in both modes.
223
- * - In dev mode it is detected from the current git HEAD, so workspaces fork
224
- * from the branch the developer has checked out.
225
- * - Otherwise it is 'main'.
175
+ * Resolve the base branch — the fork point for CMS editing branches and the branch workspace
176
+ * clones are seeded from. The single definition of base-branch behavior (see ARCHITECTURE.md
177
+ * "Branch Identity"): a configured `defaultBaseBranch` always wins in both modes; dev mode
178
+ * otherwise detects the current git HEAD, so workspaces fork from the developer's checked-out
179
+ * branch; otherwise 'main'.
226
180
  *
227
- * Static deployments never reach git operations, so callers in static paths
228
- * must short-circuit before calling this (see createCanopyServices).
181
+ * Static deployments never reach git operations, so callers on static paths must short-circuit
182
+ * before calling this (see createCanopyServices).
229
183
  */
230
184
  export async function resolveBaseBranch(options) {
231
185
  if (options.defaultBaseBranch)
@@ -1,51 +1,27 @@
1
1
  /**
2
- * Process-scoped logger indirection for modules that run in BOTH the worker
3
- * daemon and the Lambda/dev server.
4
- *
5
- * ## Why this exists
6
- *
7
- * `worker/log.ts` documents a hard invariant: every line written to
8
- * `/var/log/canopy-worker/worker.log` must start with an ISO-8601 timestamp,
9
- * because the CloudWatch agent's `multi_line_start_pattern` is keyed on that
10
- * prefix (see `canopycms-cdk/src/constructs/cms-service.ts`). A line WITHOUT
11
- * the prefix is not a new event - it is appended to the PREVIOUS one,
12
- * inheriting that event's timestamp and carrying none of its own severity tag.
13
- *
14
- * The worker's own code honoured that by calling `workerLog*`. But the worker
15
- * process also executes shared modules that were never worker-specific and
16
- * called bare `console.warn`: `github-service.ts` (the throttling plugin's
17
- * rate-limit callbacks fire on the worker's own Octokit, and the PR
18
- * create/update path runs on the worker's submit task) and `branch-registry.ts`
19
- * (registry regeneration, reached from every worker `meta.save()`). Their
20
- * output landed in worker.log unprefixed, so an operationally interesting
21
- * warning - "GitHub throttled us" - was silently folded into a minutes-old
22
- * event and became invisible to `filter @message like /WARN/`. Invisible
23
- * locally too, since vitest intercepts console.
24
- *
25
- * ## Why process-scoped rather than a threaded parameter
26
- *
27
- * The invariant is a property of the PROCESS's stdout/stderr, not of any
28
- * particular call: the same `branch-registry.ts` line is correct as bare
29
- * console under Lambda and wrong under the worker. Threading a logger down to
30
- * it would mean touching every signature between `CmsWorker.rebase*` and
31
- * `BranchMetadataFileManager.loadOnly` to carry a logging concern. One
32
- * process-wide switch, set once at the worker entrypoint, expresses exactly
33
- * the thing that is actually true.
34
- *
35
- * Lambda and the dev server install nothing and keep plain `console`, which is
36
- * correct there - CloudWatch's Lambda integration stamps and delimits events
37
- * on its own.
38
- *
39
- * ## Usage
40
- *
41
- * Shared server-side modules call `canopyLogWarn`/`canopyLogError`/`canopyLog`
42
- * instead of `console.*`. The worker entrypoint calls `installWorkerLogger()`
43
- * (`worker/log.ts`, re-exported from `worker/cms-worker.ts`) once, before doing
44
- * any work.
45
- *
46
- * Not for browser/editor code: those keep `console` directly. This module is
47
- * dependency-free so importing it can never drag a server-only dependency into
48
- * a client bundle, but there is nothing for it to do in a browser.
2
+ * Process-scoped logger indirection for modules that run in BOTH the worker daemon and the
3
+ * Lambda/dev server.
4
+ *
5
+ * `worker/log.ts` holds the invariant: every line written to `/var/log/canopy-worker/worker.log`
6
+ * must start with an ISO-8601 timestamp, because the CloudWatch agent's `multi_line_start_pattern`
7
+ * is keyed on that prefix (see `canopycms-cdk/src/constructs/cms-service.ts`). A line WITHOUT the
8
+ * prefix is not a new event - it is appended to the PREVIOUS one, inheriting that timestamp and
9
+ * carrying none of its own severity tag, so an operationally interesting warning goes invisible to
10
+ * `filter @message like /WARN/` (and locally too, since vitest intercepts console). Shared modules
11
+ * the worker also executes (`github-service.ts`, `branch-registry.ts`) would otherwise emit bare
12
+ * `console.warn` into that log.
13
+ *
14
+ * Process-scoped rather than a threaded parameter because the invariant belongs to the PROCESS's
15
+ * stdout/stderr, not to any particular call: the same `branch-registry.ts` line is correct as bare
16
+ * console under Lambda and wrong under the worker. Lambda and the dev server install nothing and
17
+ * keep plain `console`, which is correct there - CloudWatch's Lambda integration stamps and
18
+ * delimits events on its own.
19
+ *
20
+ * So shared server-side modules call `canopyLogWarn`/`canopyLogError`/`canopyLog`, and the worker
21
+ * entrypoint calls `installWorkerLogger()` (`worker/log.ts`, re-exported from
22
+ * `worker/cms-worker.ts`) once before doing any work. Not for browser/editor code, which keeps
23
+ * `console`. Dependency-free, so importing it can never drag a server-only dependency into a
24
+ * client bundle.
49
25
  */
50
26
  /** The three levels the shared modules use. Structurally satisfied by `console`. */
51
27
  export interface CanopyLogger {
@@ -58,11 +34,20 @@ export interface CanopyLogger {
58
34
  * call after the modules that use the helpers have already been imported.
59
35
  */
60
36
  export declare function setCanopyLogger(logger: CanopyLogger): void;
61
- /** Restore the default (`console`). Exists for tests; production installs once and never reverts. */
37
+ /**
38
+ * Restore the default (`console`). Exists for tests; production installs once and never reverts.
39
+ * @internal Exported for tests.
40
+ */
62
41
  export declare function resetCanopyLogger(): void;
63
- /** The logger currently installed. Exported for assertions; prefer the helpers below. */
42
+ /**
43
+ * The logger currently installed. Exported for assertions; prefer the helpers below.
44
+ * @internal Exported for tests.
45
+ */
64
46
  export declare function getCanopyLogger(): CanopyLogger;
65
- /** Informational. Routes to stdout (or the worker's timestamped stdout). */
47
+ /**
48
+ * Informational. Routes to stdout (or the worker's timestamped stdout).
49
+ * @internal Exported for tests.
50
+ */
66
51
  export declare function canopyLog(...args: unknown[]): void;
67
52
  /** Recoverable problem - the caller carries on. Routes to stderr. */
68
53
  export declare function canopyLogWarn(...args: unknown[]): void;
@@ -1,58 +1,32 @@
1
1
  /**
2
- * Process-scoped logger indirection for modules that run in BOTH the worker
3
- * daemon and the Lambda/dev server.
2
+ * Process-scoped logger indirection for modules that run in BOTH the worker daemon and the
3
+ * Lambda/dev server.
4
4
  *
5
- * ## Why this exists
5
+ * `worker/log.ts` holds the invariant: every line written to `/var/log/canopy-worker/worker.log`
6
+ * must start with an ISO-8601 timestamp, because the CloudWatch agent's `multi_line_start_pattern`
7
+ * is keyed on that prefix (see `canopycms-cdk/src/constructs/cms-service.ts`). A line WITHOUT the
8
+ * prefix is not a new event - it is appended to the PREVIOUS one, inheriting that timestamp and
9
+ * carrying none of its own severity tag, so an operationally interesting warning goes invisible to
10
+ * `filter @message like /WARN/` (and locally too, since vitest intercepts console). Shared modules
11
+ * the worker also executes (`github-service.ts`, `branch-registry.ts`) would otherwise emit bare
12
+ * `console.warn` into that log.
6
13
  *
7
- * `worker/log.ts` documents a hard invariant: every line written to
8
- * `/var/log/canopy-worker/worker.log` must start with an ISO-8601 timestamp,
9
- * because the CloudWatch agent's `multi_line_start_pattern` is keyed on that
10
- * prefix (see `canopycms-cdk/src/constructs/cms-service.ts`). A line WITHOUT
11
- * the prefix is not a new event - it is appended to the PREVIOUS one,
12
- * inheriting that event's timestamp and carrying none of its own severity tag.
14
+ * Process-scoped rather than a threaded parameter because the invariant belongs to the PROCESS's
15
+ * stdout/stderr, not to any particular call: the same `branch-registry.ts` line is correct as bare
16
+ * console under Lambda and wrong under the worker. Lambda and the dev server install nothing and
17
+ * keep plain `console`, which is correct there - CloudWatch's Lambda integration stamps and
18
+ * delimits events on its own.
13
19
  *
14
- * The worker's own code honoured that by calling `workerLog*`. But the worker
15
- * process also executes shared modules that were never worker-specific and
16
- * called bare `console.warn`: `github-service.ts` (the throttling plugin's
17
- * rate-limit callbacks fire on the worker's own Octokit, and the PR
18
- * create/update path runs on the worker's submit task) and `branch-registry.ts`
19
- * (registry regeneration, reached from every worker `meta.save()`). Their
20
- * output landed in worker.log unprefixed, so an operationally interesting
21
- * warning - "GitHub throttled us" - was silently folded into a minutes-old
22
- * event and became invisible to `filter @message like /WARN/`. Invisible
23
- * locally too, since vitest intercepts console.
24
- *
25
- * ## Why process-scoped rather than a threaded parameter
26
- *
27
- * The invariant is a property of the PROCESS's stdout/stderr, not of any
28
- * particular call: the same `branch-registry.ts` line is correct as bare
29
- * console under Lambda and wrong under the worker. Threading a logger down to
30
- * it would mean touching every signature between `CmsWorker.rebase*` and
31
- * `BranchMetadataFileManager.loadOnly` to carry a logging concern. One
32
- * process-wide switch, set once at the worker entrypoint, expresses exactly
33
- * the thing that is actually true.
34
- *
35
- * Lambda and the dev server install nothing and keep plain `console`, which is
36
- * correct there - CloudWatch's Lambda integration stamps and delimits events
37
- * on its own.
38
- *
39
- * ## Usage
40
- *
41
- * Shared server-side modules call `canopyLogWarn`/`canopyLogError`/`canopyLog`
42
- * instead of `console.*`. The worker entrypoint calls `installWorkerLogger()`
43
- * (`worker/log.ts`, re-exported from `worker/cms-worker.ts`) once, before doing
44
- * any work.
45
- *
46
- * Not for browser/editor code: those keep `console` directly. This module is
47
- * dependency-free so importing it can never drag a server-only dependency into
48
- * a client bundle, but there is nothing for it to do in a browser.
20
+ * So shared server-side modules call `canopyLogWarn`/`canopyLogError`/`canopyLog`, and the worker
21
+ * entrypoint calls `installWorkerLogger()` (`worker/log.ts`, re-exported from
22
+ * `worker/cms-worker.ts`) once before doing any work. Not for browser/editor code, which keeps
23
+ * `console`. Dependency-free, so importing it can never drag a server-only dependency into a
24
+ * client bundle.
49
25
  */
50
26
  /**
51
- * Deliberately mutable module state, read at CALL time by the helpers below
52
- * rather than captured at import time. Module import order is not something a
53
- * call site controls, so a captured reference would mean whether a line got its
54
- * prefix depended on whether `github-service.ts` happened to be imported before
55
- * or after the entrypoint installed the worker logger.
27
+ * Deliberately mutable module state, read at CALL time rather than captured at import time. A call
28
+ * site does not control module import order, so a captured reference would make a line's prefix
29
+ * depend on whether its module was imported before or after the worker logger was installed.
56
30
  */
57
31
  let active = console;
58
32
  /**
@@ -62,15 +36,24 @@ let active = console;
62
36
  export function setCanopyLogger(logger) {
63
37
  active = logger;
64
38
  }
65
- /** Restore the default (`console`). Exists for tests; production installs once and never reverts. */
39
+ /**
40
+ * Restore the default (`console`). Exists for tests; production installs once and never reverts.
41
+ * @internal Exported for tests.
42
+ */
66
43
  export function resetCanopyLogger() {
67
44
  active = console;
68
45
  }
69
- /** The logger currently installed. Exported for assertions; prefer the helpers below. */
46
+ /**
47
+ * The logger currently installed. Exported for assertions; prefer the helpers below.
48
+ * @internal Exported for tests.
49
+ */
70
50
  export function getCanopyLogger() {
71
51
  return active;
72
52
  }
73
- /** Informational. Routes to stdout (or the worker's timestamped stdout). */
53
+ /**
54
+ * Informational. Routes to stdout (or the worker's timestamped stdout).
55
+ * @internal Exported for tests.
56
+ */
74
57
  export function canopyLog(...args) {
75
58
  active.log(...args);
76
59
  }
@@ -1,50 +1,38 @@
1
1
  /**
2
- * Called when proper-lockfile reports the lock was lost mid-hold (its directory
3
- * vanished, or a refresh failed and another holder may have taken over).
2
+ * Called when proper-lockfile reports the lock was lost mid-hold (its directory vanished, or a
3
+ * refresh failed and another holder may have taken over).
4
4
  *
5
- * Every call site must decide what that means for ITS critical section, which
6
- * is why this is a parameter rather than a fixed policy: a compromise during
7
- * idempotent provisioning is survivable, but a compromise during the worker's
8
- * rebase means a second writer may be live and the next destructive git step
9
- * must not run. What is NOT negotiable is that it must not throw --
10
- * proper-lockfile invokes it from inside the refresh timer, so a throw is an
11
- * uncaught exception that kills the process.
5
+ * A parameter rather than a fixed policy because every call site must decide what that means for
6
+ * ITS critical section: a compromise during idempotent provisioning is survivable, one during
7
+ * the worker's rebase means a second writer may be live and the next destructive git step must
8
+ * not run. What is NOT negotiable is that it must not throw -- proper-lockfile invokes it from
9
+ * inside the refresh timer, so a throw is an uncaught exception that kills the process.
12
10
  */
13
11
  export type OnLockCompromised = (err: Error) => void;
14
12
  /**
15
- * Acquire a cross-process filesystem lock for content provisioning.
13
+ * Acquire a cross-process filesystem lock for content provisioning. Returns a release function —
14
+ * always call it in a `finally`.
16
15
  *
17
- * In-memory locks only serialize work within a single process. Build tools such
18
- * as Next.js static generation provision content from parallel worker
19
- * *processes*, so two processes can otherwise race while creating the same git
20
- * workspace (e.g. "cannot mkdir remote.git: File exists" or "destination path
21
- * already exists"). proper-lockfile uses an atomic on-disk lock that holds across
22
- * processes, so only one provisions a given resource at a time while the others
23
- * wait and then find it already done.
16
+ * In-memory locks serialize only within one process, but build tools such as Next.js static
17
+ * generation provision content from parallel worker *processes*, which then race while creating
18
+ * the same git workspace ("cannot mkdir remote.git: File exists", "destination path already
19
+ * exists"). proper-lockfile's atomic on-disk lock holds across processes, so one provisions while
20
+ * the others wait and then find it already done.
24
21
  *
25
- * Returns a release function — always call it in a `finally`.
26
- *
27
- * @param lockTargetDir directory the lock marker lives in (created if missing)
28
- * @param lockName name of the on-disk lock marker, created inside lockTargetDir
29
22
  * @param onCompromised see {@link OnLockCompromised}; defaults to log-and-continue
30
23
  */
31
24
  export declare function acquireProvisioningLock(lockTargetDir: string, lockName: string, onCompromised?: OnLockCompromised): Promise<() => Promise<void>>;
32
25
  /**
33
- * Zero-retry variant of {@link acquireProvisioningLock}, for admin actions
34
- * running inside a synchronous request/response cycle (e.g. a Lambda-backed
35
- * API handler). `acquireProvisioningLock`'s ~600-retry budget waits minutes
36
- * for a live provisioner to finish; an admin request must fail fast on
37
- * contention instead (409 immediately) rather than hang the request for that
38
- * long.
26
+ * Zero-retry variant of {@link acquireProvisioningLock}, for admin actions inside a synchronous
27
+ * request/response cycle (a Lambda-backed API handler). `acquireProvisioningLock`'s ~600-retry
28
+ * budget waits minutes for a live provisioner; an admin request must fail fast instead.
39
29
  *
40
- * `stale: 30_000` is unchanged from the patient variant: a genuinely stale
41
- * lock (holder crashed more than 30s ago) is still taken over normally --
42
- * this only removes the RETRY loop for live contention, not the staleness
43
- * recovery a caller depends on (see branch-health.ts's [H1] freshness rail,
44
- * which reads this same lock's mtime to decide whether it is fresh or
45
- * stale before an admin purge/repair proceeds).
30
+ * `stale: 30_000` is unchanged from the patient variant: a genuinely stale lock (holder crashed
31
+ * more than 30s ago) is still taken over normally. Only the RETRY loop for live contention is
32
+ * removed, not the staleness recovery a caller depends on -- see branch-health.ts's [H1]
33
+ * freshness rail, which reads this lock's mtime before an admin purge/repair proceeds.
46
34
  *
47
- * Throws with `err.code === 'ELOCKED'` on contention (a live, non-stale
48
- * holder) -- callers should translate that into a 409.
35
+ * Throws with `err.code === 'ELOCKED'` on contention (a live, non-stale holder) -- callers
36
+ * translate that into a 409.
49
37
  */
50
38
  export declare function tryAcquireProvisioningLock(lockTargetDir: string, lockName: string, onCompromised?: OnLockCompromised): Promise<() => Promise<void>>;