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,24 +1,5 @@
1
- /**
2
- * Error handling utilities for type-safe error handling.
3
- *
4
- * These utilities help convert `catch (err: unknown)` to usable error information
5
- * without using `any` types.
6
- */
7
- /**
8
- * Extract a message string from an unknown error value.
9
- *
10
- * @param err - The caught error (unknown type)
11
- * @returns A string message suitable for logging or user display
12
- *
13
- * @example
14
- * ```ts
15
- * try {
16
- * await riskyOperation()
17
- * } catch (err: unknown) {
18
- * canopyLogError('Operation failed:', getErrorMessage(err))
19
- * }
20
- * ```
21
- */
1
+ /** Reading a `catch (err: unknown)` value as usable error information, without `any`. */
2
+ /** Message string for an unknown thrown value. */
22
3
  export function getErrorMessage(err) {
23
4
  if (err instanceof Error) {
24
5
  return err.message;
@@ -29,70 +10,51 @@ export function getErrorMessage(err) {
29
10
  return String(err);
30
11
  }
31
12
  /**
32
- * Redact sensitive material from an error message before sending it to API
33
- * clients. Log the ORIGINAL message server-side; send the sanitized one.
13
+ * Redact sensitive material from an error message before it reaches an API client. Log the
14
+ * ORIGINAL message server-side; send the sanitized one.
34
15
  *
35
- * Git/filesystem errors are unbounded (stderr varies by git version, locale,
36
- * and hooks can print anything), so enumerating safe messages is not
37
- * feasible. Instead, redact the known-sensitive SHAPES that can appear in
38
- * any of them:
39
- * - credentials embedded in URLs (`https://x-access-token:tok@github.com/…`)
40
- * - absolute filesystem paths (workspace roots, EFS mounts, home directories)
16
+ * Git/filesystem error text is unbounded (stderr varies by git version and locale, and hooks
17
+ * print anything), so this redacts the known-sensitive SHAPES rather than enumerating safe
18
+ * messages: credentials embedded in URLs (`https://x-access-token:tok@github.com/…`) and
19
+ * absolute filesystem paths (workspace roots, EFS mounts, home directories). Paths under the
20
+ * current working directory are shortened to relative form (CMS-internal layout like
21
+ * `.canopy-dev/remote.git` helps debugging and is not sensitive); absolute paths outside it
22
+ * become `<path>`.
41
23
  *
42
- * Paths under the current working directory are shortened to relative form
43
- * (CMS-internal layout like `.canopy-dev/remote.git` is useful for debugging
44
- * and not sensitive); absolute paths outside it are replaced with `<path>`.
45
- */
46
- /**
47
- * TAG: `[REDACT]`
48
- *
49
- * Grep `[REDACT]` to find every site that persists or surfaces raw error text on
50
- * a path that reaches a browser — worker task errors folded into
51
- * `worker-status.json`, `branch.json` parse failures served by the admin
52
- * branch-health endpoint, rebase-failure messages, and their tests.
53
- *
54
- * Those sites carried the tag `[HIGH-1]`/`[MEDIUM-2]` until 2026-08-23, IDs from
55
- * a review pass whose findings list was never committed — 13 occurrences across
56
- * 6 files resolving to nothing. Renamed rather than deleted because the
57
- * underlying rule is real and genuinely cross-file: a Node error embeds absolute
58
- * paths, and a git remote URL can embed a token, so anything on that path is
59
- * redacted through the function below.
60
- *
61
- * The tag is a grep aid, not the rule. The rule is stated at each site.
24
+ * TAG: `[REDACT]` — grep it for every site that persists or surfaces raw error text on a path
25
+ * reaching a browser (worker task errors folded into `worker-status.json`, `branch.json` parse
26
+ * failures served by the admin branch-health endpoint, rebase-failure messages, and their
27
+ * tests). A Node error embeds absolute paths and a git remote URL can embed a token, so
28
+ * everything on such a path goes through this function. The tag is a grep aid; the rule itself
29
+ * is stated at each site.
62
30
  */
63
31
  export function sanitizeErrorMessage(message) {
64
32
  let result = redactCredentials(message);
65
- // Paths under the project root become relative (split/join avoids regex
66
- // escaping issues with arbitrary cwd values). The bare-cwd replacement is
67
- // anchored to a token boundary so sibling directories that merely share
68
- // the cwd prefix (e.g. `${cwd}-other/…`) stay absolute and get fully
33
+ // Paths under the project root become relative (split/join avoids regex-escaping issues with
34
+ // arbitrary cwd values). The bare-cwd replacement is anchored to a token boundary so a sibling
35
+ // directory that merely shares the cwd prefix (`${cwd}-other/…`) stays absolute and is fully
69
36
  // redacted below instead of leaking a mangled remainder.
70
37
  const cwd = process.cwd();
71
38
  if (cwd !== '/') {
72
39
  result = result.split(`${cwd}/`).join('');
73
40
  const cwdPattern = cwd.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
74
- // cwdPattern is process.cwd() (server-controlled, not attacker/entry-content
75
- // data) with regex metacharacters escaped by the literal regex above, so
76
- // this cannot be used to inject an attacker-chosen pattern.
41
+ // cwdPattern is process.cwd() (server-controlled, not attacker or entry-content data) with
42
+ // regex metacharacters escaped by the literal regex above, so it cannot inject an
43
+ // attacker-chosen pattern.
77
44
  // eslint-disable-next-line security/detect-non-literal-regexp
78
45
  result = result.replace(new RegExp(`${cwdPattern}(?=[\\s'"),:;]|$)`, 'g'), '.');
79
46
  }
80
- // Quoted absolute paths (git quotes most paths in its messages): redact
81
- // the whole quoted span, spaces included.
47
+ // Quoted absolute paths (git quotes most paths): redact the whole quoted span, spaces included.
82
48
  result = result.replace(/'\/[^']*'/g, "'<path>'").replace(/"\/[^"]*"/g, '"<path>"');
83
- // Remaining absolute POSIX paths (outside cwd, e.g. /mnt/efs/…). The
84
- // leading boundary keeps URL slashes (`https://host/…`) untouched. Known
85
- // limitation: an UNQUOTED path containing spaces is only redacted up to
86
- // the first space — spaces are legal both inside paths and as message
87
- // separators, so this is not generally solvable here.
49
+ // Remaining absolute POSIX paths (outside cwd, e.g. /mnt/efs/…). The leading boundary keeps
50
+ // URL slashes (`https://host/…`) untouched. Known limitation: an UNQUOTED path containing
51
+ // spaces is only redacted up to the first space — spaces are legal both inside paths and as
52
+ // message separators, so that is not generally solvable here.
88
53
  //
89
- // The repeated group `(?:[^/\s'")]+\/)+` looks nested-quantifier-shaped, but
90
- // the inner character class excludes `/`, so each repetition can only end at
91
- // a literal `/` boundary in the input: there is exactly one way to decompose
92
- // any matched string into repetitions (no same-substring ambiguity), so this
93
- // does not backtrack catastrophically. Verified empirically with inputs up
94
- // to 400k chars (adversarial runs of non-slash chars, with and without
95
- // trailing slashes): scaling stayed linear, not quadratic/exponential.
54
+ // The repeated group `(?:[^/\s'")]+\/)+` looks nested-quantifier-shaped, but its inner class
55
+ // excludes `/`, so each repetition can only end at a literal `/`: a matched string has exactly
56
+ // one decomposition, so it cannot backtrack catastrophically. Measured linear on adversarial
57
+ // inputs up to 400k chars.
96
58
  // eslint-disable-next-line security/detect-unsafe-regex
97
59
  result = result.replace(/(^|[\s'"(=:,[])\/(?:[^/\s'")]+\/)+[^/\s'")]*/g, '$1<path>');
98
60
  // Windows drive paths
@@ -100,106 +62,57 @@ export function sanitizeErrorMessage(message) {
100
62
  return result;
101
63
  }
102
64
  /**
103
- * Redact only credential material from a message, leaving filesystem paths
104
- * intact. For server-side log lines that deliberately keep full path detail
105
- * (server logs only, useful for debugging) but must never persist a live
106
- * token — client-facing messages go through sanitizeErrorMessage instead,
107
- * which calls this and then also redacts paths.
65
+ * Redact only credential material, leaving filesystem paths intact — for server-side log lines
66
+ * that deliberately keep full path detail for debugging but must never persist a live token.
67
+ * Client-facing messages go through `sanitizeErrorMessage` instead, which calls this and then
68
+ * also redacts paths.
108
69
  */
109
70
  export function redactCredentials(message) {
110
71
  let result = message;
111
- // Credentials in URLs: scheme://user:token@host or scheme://token@host.
112
- // Anchored on the literal `://` (leaving the scheme untouched) — a `\w+`
113
- // scheme prefix would backtrack polynomially on long word-character runs
114
- // (CodeQL js/polynomial-redos).
72
+ // Credentials in URLs: scheme://user:token@host or scheme://token@host. Anchored on the
73
+ // literal `://` (leaving the scheme untouched) — a `\w+` scheme prefix backtracks
74
+ // polynomially on long word-character runs (CodeQL js/polynomial-redos).
115
75
  result = result.replace(/(:\/\/)[^/\s@]+@/g, '$1***@');
116
- // Bare token shapes (defense-in-depth for messages that embed a token
117
- // outside URL userinfo): GitHub token prefixes and Bearer values.
76
+ // Bare token shapes, for messages embedding a token outside URL userinfo: GitHub token
77
+ // prefixes and Bearer values.
118
78
  result = result.replace(/\b(?:gh[pousr]|github_pat)_[A-Za-z0-9_]{8,}/g, '***');
119
79
  result = result.replace(/\b(Bearer\s+)[A-Za-z0-9._~+/=-]{8,}/g, '$1***');
120
- // PEM private-key blocks — a GitHub App's private key. Defense-in-depth,
121
- // exactly like the bare-token rules above: no site today puts key material
122
- // into an error (checked — `createPrivateKey` failures report
123
- // `error:1E08010C:DECODER routines::unsupported` and jsonwebtoken's report
124
- // neither `BEGIN` nor the body), and a rule added before the first leak
125
- // costs nothing. None of the rules above would match one: a PEM has no URL
126
- // userinfo, no `gh*_` prefix and no `Bearer`.
127
- //
128
- // Linear by construction. The label is `[A-Z]{0,9} ?` (bounded, so its
129
- // backtracking is a constant factor) rather than an open `[A-Z ]*`, which
130
- // would rescan a long run of capitals at every start position. The lazy
131
- // `[\s\S]*?` is stopped by the END footer, or by end-of-string when the
132
- // message was truncated mid-key — without that second alternative a
133
- // half-quoted key would pass through in full.
80
+ // PEM private-key blocks — a GitHub App's private key. Defense-in-depth like the bare-token
81
+ // rules above: nothing today puts key material into an error, and none of those rules would
82
+ // match one (a PEM has no URL userinfo, no `gh*_` prefix and no `Bearer`).
134
83
  //
135
- // The footer is spelled out, mirroring the header, rather than "`-----END`
136
- // then anything up to the next dashes". Both looser spellings were measured
137
- // wrong in opposite directions on a single-line message: `[^\n]*` (greedy to
138
- // end of line) swallowed the text after the key, and `[^\n]*?-----` (lazy to
139
- // any dashes) stopped on a label-less `-----END-----` and left a SECOND key
140
- // after it unredacted. Matching only a real footer means anything else falls
141
- // through to `$`, which over-redacts — the safe direction.
84
+ // Linear by construction. The label is bounded (`[A-Z]{0,9} ?`) rather than an open `[A-Z ]*`,
85
+ // which would rescan a long run of capitals at every start position, and the lazy `[\s\S]*?`
86
+ // stops at the END footer or at end-of-string — without that second alternative a key
87
+ // truncated mid-message passes through in full. The footer is spelled out rather than
88
+ // "`-----END` then anything up to the next dashes": greedy `[^\n]*` swallows the text after
89
+ // the key, and lazy `[^\n]*?-----` stops on a label-less `-----END-----` and leaves a SECOND
90
+ // key unredacted. Anything else falls through to `$`, which over-redacts — the safe direction.
142
91
  result = result.replace(/-----BEGIN [A-Z]{0,9} ?PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z]{0,9} ?PRIVATE KEY-----|$)/g, '<private-key>');
143
92
  // Bare JWTs (`eyJ…`) — three dot-separated base64url runs.
144
93
  //
145
- // The leading boundary is `(?<![\w-])`, NOT `\b`. `-` is in the run class but
146
- // is not a word character, so under `\b` every `-eyJ` inside one long
147
- // `[\w-]` run starts a fresh match attempt that rescans the rest of the run
148
- // for a `.` that never comes — quadratic, and measured on `'-eyJ'.repeat(n)`:
149
- // roughly 200ms at 20KB, 900ms at 40KB, 13-16s at 160KB (the absolute
150
- // numbers are machine-dependent; the quadrupling per doubling is not). With
151
- // the lookbehind the same 160KB input is under a millisecond. It gives up
152
- // exactly one case: a JWT
153
- // glued directly to a preceding hyphen (`x-eyJ…`); every real prefix —
94
+ // The leading boundary is `(?<![\w-])`, NOT `\b`: `-` is in the run class but is not a word
95
+ // character, so under `\b` every `-eyJ` inside one long `[\w-]` run starts a fresh match
96
+ // attempt that rescans the rest of the run for a `.` that never comes — quadratic, measured in
97
+ // seconds on a 160KB input where the lookbehind stays under a millisecond. It gives up exactly
98
+ // one case: a JWT glued directly to a preceding hyphen (`x-eyJ…`); every real prefix —
154
99
  // whitespace, `"`, `=`, `(`, `Bearer ` — still matches.
155
100
  result = result.replace(/(?<![\w-])eyJ[\w-]{8,}\.[\w-]{8,}\.[\w-]+/g, '***');
156
101
  return result;
157
102
  }
158
- /**
159
- * Type guard to check if an error is a Node.js system error with a code property.
160
- *
161
- * @param err - The caught error (unknown type)
162
- * @returns True if the error has a `code` property (like ENOENT, EACCES, etc.)
163
- *
164
- * @example
165
- * ```ts
166
- * try {
167
- * await fs.readFile(path)
168
- * } catch (err: unknown) {
169
- * if (isNodeError(err) && err.code === 'ENOENT') {
170
- * return null // File not found is expected
171
- * }
172
- * throw err
173
- * }
174
- * ```
175
- */
103
+ /** True for a Node system error — an `Error` carrying a `code` (ENOENT, EACCES, …). */
176
104
  export function isNodeError(err) {
177
105
  return err instanceof Error && 'code' in err;
178
106
  }
179
- /**
180
- * Check if an error indicates a "file not found" condition.
181
- *
182
- * @param err - The caught error (unknown type)
183
- * @returns True if the error is ENOENT (file/directory not found)
184
- */
107
+ /** True for ENOENT. */
185
108
  export function isNotFoundError(err) {
186
109
  return isNodeError(err) && err.code === 'ENOENT';
187
110
  }
188
- /**
189
- * Check if an error indicates a "permission denied" condition.
190
- *
191
- * @param err - The caught error (unknown type)
192
- * @returns True if the error is EACCES (permission denied)
193
- */
111
+ /** True for EACCES. */
194
112
  export function isPermissionError(err) {
195
113
  return isNodeError(err) && err.code === 'EACCES';
196
114
  }
197
- /**
198
- * Check if an error indicates a "file already exists" condition.
199
- *
200
- * @param err - The caught error (unknown type)
201
- * @returns True if the error is EEXIST (file already exists)
202
- */
115
+ /** True for EEXIST. */
203
116
  export function isFileExistsError(err) {
204
117
  return isNodeError(err) && err.code === 'EEXIST';
205
118
  }
@@ -1,12 +1,10 @@
1
1
  import type { FieldConfig } from '../config/index.js';
2
2
  /**
3
- * Recursively flatten inline groups out of a field array.
4
- * Group children are inlined at the parent level — groups are transparent to data.
3
+ * Recursively flatten inline groups out of a field array: group children are inlined at the
4
+ * parent level, because groups are transparent to data.
5
5
  *
6
- * Use this when iterating fields for data-layer purposes (reference resolution,
7
- * change detection, body-field lookup, etc.) where you need all data-carrying
8
- * fields without group wrappers.
9
- *
10
- * Not needed when using traverseFields() — that already handles groups transparently.
6
+ * For data-layer iteration (reference resolution, change detection, body-field lookup) that
7
+ * needs every data-carrying field without group wrappers. `traverseFields()` already handles
8
+ * groups transparently and does not need this.
11
9
  */
12
10
  export declare function flattenGroupFields(fields: readonly FieldConfig[]): FieldConfig[];
@@ -1,12 +1,10 @@
1
1
  /**
2
- * Recursively flatten inline groups out of a field array.
3
- * Group children are inlined at the parent level — groups are transparent to data.
2
+ * Recursively flatten inline groups out of a field array: group children are inlined at the
3
+ * parent level, because groups are transparent to data.
4
4
  *
5
- * Use this when iterating fields for data-layer purposes (reference resolution,
6
- * change detection, body-field lookup, etc.) where you need all data-carrying
7
- * fields without group wrappers.
8
- *
9
- * Not needed when using traverseFields() — that already handles groups transparently.
5
+ * For data-layer iteration (reference resolution, change detection, body-field lookup) that
6
+ * needs every data-carrying field without group wrappers. `traverseFields()` already handles
7
+ * groups transparently and does not need this.
10
8
  */
11
9
  export function flattenGroupFields(fields) {
12
10
  const result = [];
@@ -1,9 +1,5 @@
1
1
  import type { ContentFormat } from '../config/index.js';
2
- /**
3
- * Get the file extension for a content format
4
- * @param format - The content format (md, mdx, json, yaml)
5
- * @returns The file extension including the dot (e.g., '.md', '.json', '.yaml')
6
- */
2
+ /** The file extension, dot included, for a content format. */
7
3
  export declare const getFormatExtension: (format: ContentFormat) => string;
8
4
  /** Returns true for data-only formats (no body/frontmatter separation) */
9
5
  export declare const isDataOnlyFormat: (format: ContentFormat) => boolean;
@@ -1,8 +1,4 @@
1
- /**
2
- * Get the file extension for a content format
3
- * @param format - The content format (md, mdx, json, yaml)
4
- * @returns The file extension including the dot (e.g., '.md', '.json', '.yaml')
5
- */
1
+ /** The file extension, dot included, for a content format. */
6
2
  export const getFormatExtension = (format) => {
7
3
  if (format === 'md')
8
4
  return '.md';
@@ -1,9 +1,8 @@
1
1
  /** Check if a path exists on disk. */
2
2
  export declare function filePathExists(filePath: string): Promise<boolean>;
3
3
  /**
4
- * Read a UTF-8 file, or return undefined if it does not exist.
5
- *
6
- * Only ENOENT is swallowed — a permissions or I/O failure still throws, so a caller cannot
7
- * mistake "unreadable" for "not there yet".
4
+ * Read a UTF-8 file, or undefined if it does not exist. Only ENOENT is swallowed — a
5
+ * permissions or I/O failure still throws, so a caller cannot mistake "unreadable" for
6
+ * "not there yet".
8
7
  */
9
8
  export declare function readFileIfExists(filePath: string): Promise<string | undefined>;
package/dist/utils/fs.js CHANGED
@@ -13,10 +13,9 @@ export async function filePathExists(filePath) {
13
13
  }
14
14
  }
15
15
  /**
16
- * Read a UTF-8 file, or return undefined if it does not exist.
17
- *
18
- * Only ENOENT is swallowed — a permissions or I/O failure still throws, so a caller cannot
19
- * mistake "unreadable" for "not there yet".
16
+ * Read a UTF-8 file, or undefined if it does not exist. Only ENOENT is swallowed — a
17
+ * permissions or I/O failure still throws, so a caller cannot mistake "unreadable" for
18
+ * "not there yet".
20
19
  */
21
20
  export async function readFileIfExists(filePath) {
22
21
  try {
@@ -1,113 +1,82 @@
1
1
  import type { OperatingMode } from '../operating-mode/index.js';
2
2
  /**
3
- * Whether a git remote URL points at a network location — http(s)://,
4
- * ssh://, git://, scp-like `[user@]host:path`, a transport-helper `scheme::`
5
- * form, or a leading-`-` value git would parse as a command-line option —
6
- * rather than a local filesystem path.
3
+ * Whether a git remote URL points at a network location rather than a local filesystem path. Only
4
+ * `file://` URLs, plain filesystem paths and Windows drive paths are LOCAL; the patterns above
5
+ * enumerate the network forms.
7
6
  *
8
- * `file://` URLs and plain filesystem paths are LOCAL — this is the
9
- * distinction GitManager's prod-mode network-remote guard relies on (see
10
- * `resolveRemoteUrl`): the intended prod topology only ever resolves a local
11
- * path (an auto-detected/auto-initialized `remote.git`), so anything network
12
- * flowing in via an explicit param, config, or env var is almost always a
13
- * misconfiguration in prod. Because the guard's job is catching prod
14
- * misconfig (not being a strict URL parser), this classifier treats anything
15
- * git could interpret as a network transport, a transport helper, or a
16
- * command-line option as "network". The one local carve-out beyond `file://`
17
- * is a Windows drive path (`C:\...` / `C:/...`), which replaces the old
18
- * `@`-required heuristic for scp-like syntax.
7
+ * The distinction GitManager's prod-mode network-remote guard relies on (see `resolveRemoteUrl`):
8
+ * the intended prod topology only ever resolves a local path (an auto-detected/auto-initialized
9
+ * `remote.git`), so anything network arriving via an explicit param, config, or env var is almost
10
+ * always a prod misconfiguration. Catching that is the job, not being a strict URL parser, so
11
+ * anything git could read as a network transport, a transport helper, or a command-line option
12
+ * counts as "network".
19
13
  */
20
14
  export declare function isNetworkRemoteUrl(url: string): boolean;
21
15
  /**
22
- * Whether a git push failure message is git's non-fast-forward rejection --
23
- * the remote has diverged (moved ahead with commits this side never fetched),
24
- * so retrying the IDENTICAL push can never succeed. In CanopyCMS this is the
25
- * signature of two CanopyCMS deployments sharing one GitHub repo and picking
26
- * the same content-branch name, or someone pushing directly to GitHub.
16
+ * Whether a git push failure message is git's non-fast-forward rejection -- the remote has
17
+ * diverged, so retrying the IDENTICAL push can never succeed. In CanopyCMS that means two
18
+ * deployments sharing one GitHub repo and picking the same content-branch name, or someone pushing
19
+ * directly to GitHub.
27
20
  *
28
- * Deliberately narrow: ordinary transient push failures -- network drops,
29
- * auth/permission denial, lock contention -- must keep retrying with backoff
30
- * (see worker/task-runner.ts's `isPermanentTaskFailure`, which treats git
31
- * failures as transient precisely so those cases still get retried). Only
32
- * this specific, structurally-unretryable shape should fail fast (worker) or
33
- * return 409 (API) instead.
21
+ * Deliberately narrow: ordinary transient push failures -- network drops, auth/permission denial,
22
+ * lock contention -- must keep retrying with backoff (worker/task-runner.ts's
23
+ * `isPermanentTaskFailure` treats git failures as transient precisely so they do). Only this
24
+ * structurally-unretryable shape fails fast (worker) or returns 409 (API).
34
25
  *
35
- * Matches git's literal (English) rejection text, which is gettext-
36
- * translated -- callers MUST run the underlying git command with a
37
- * locale-pinning env (see `gitChildEnv` in `../git-manager.ts`) or an ambient
38
- * LANG/LC_ALL could silently turn this into a permanent no-op.
26
+ * Matches git's literal English rejection text, which is gettext-translated: callers MUST run the
27
+ * git command with a locale-pinning env (`gitChildEnv` in `../git-manager.ts`), or an ambient
28
+ * LANG/LC_ALL silently turns this into a permanent no-op.
39
29
  */
40
30
  export declare function isNonFastForwardRejection(message: string): boolean;
41
31
  /**
42
- * Whether a git push failure message is a refused `--force-with-lease` --
43
- * the remote ref is NOT at the commit the pusher expected, so the forced
44
- * update was declined and nothing was overwritten.
32
+ * Whether a git push failure message is a refused `--force-with-lease` -- the remote ref is NOT at
33
+ * the commit the pusher expected, so the forced update was declined and nothing overwritten.
45
34
  *
46
- * A SEPARATE predicate from `isNonFastForwardRejection` because git's output
47
- * for the two is disjoint: a refused lease prints
48
- * ` ! [rejected] branch -> branch (stale info)` and, unlike an
49
- * ordinary rejection, emits NEITHER `non-fast-forward`/`fetch first` NOR the
50
- * `Updates were rejected because` hint. Without this predicate every lease
51
- * refusal would be classified transient and retried -- three identical,
52
- * guaranteed-to-fail force attempts -- instead of surfacing as the permanent,
53
- * human-actionable state it is.
54
- *
55
- * Same locale caveat as above: the reason text is gettext-translated, so
56
- * callers MUST pin the locale (`gitChildEnv`/`gitNetworkChildEnv`).
35
+ * A SEPARATE predicate from `isNonFastForwardRejection` because git's output for the two is
36
+ * disjoint: a refused lease prints `(stale info)` and emits NEITHER `non-fast-forward`/`fetch
37
+ * first` NOR the `Updates were rejected because` hint. Without it every lease refusal is
38
+ * classified transient and retried -- identical, guaranteed-to-fail force attempts -- instead of
39
+ * surfacing as the permanent, human-actionable state it is. Same locale caveat as above.
57
40
  */
58
41
  export declare function isStaleLeaseRejection(message: string): boolean;
59
42
  /**
60
- * Whether a `git fetch <remote> <branch>` failure is specifically "that ref
61
- * doesn't exist on the remote" -- the ONLY benign fetch outcome, meaning the
62
- * branch has never been pushed.
63
- *
64
- * Narrow on purpose, and the narrowness is the whole point. This predicate
65
- * exists because a bare `catch` around the fetch classified EVERY failure --
66
- * unreachable remote, auth denial, permission error on the workspace, corrupt
67
- * object store -- as "nothing to pull", which callers then logged as normal
68
- * and proceeded past. Anything this does not recognize must reach the caller
69
- * as the genuine error it is.
43
+ * Whether a `git fetch <remote> <branch>` failure is specifically "that ref doesn't exist on the
44
+ * remote" -- the ONLY benign fetch outcome, meaning the branch has never been pushed.
70
45
  *
71
- * Same locale caveat as the predicates above: the text is gettext-translated,
72
- * so callers MUST run git with a locale-pinning env (`gitChildEnv`).
46
+ * Narrow on purpose, and the narrowness is the point: a bare `catch` around the fetch classifies
47
+ * EVERY failure -- unreachable remote, auth denial, permission error on the workspace, corrupt
48
+ * object store -- as "nothing to pull", which callers then log as normal and proceed past.
49
+ * Anything this does not recognize must reach the caller as the genuine error it is. Same locale
50
+ * caveat as the predicates above.
73
51
  */
74
52
  export declare function isMissingRemoteRefFailure(message: string): boolean;
75
53
  /**
76
- * Whether a repository has an INTERRUPTED rebase on disk — the `rebase-merge`
77
- * (interactive/merge backend) or `rebase-apply` (am backend) state directory
78
- * git leaves behind when a rebase stops for conflicts or the process dies
79
- * mid-way.
54
+ * Whether a repository has an INTERRUPTED rebase on disk — the `rebase-merge` (interactive/merge
55
+ * backend) or `rebase-apply` (am backend) state directory git leaves when a rebase stops for
56
+ * conflicts or the process dies mid-way. Invisible to every other check the worker makes: a clone
57
+ * left mid-rebase reports uncommitted changes, so the sync loop's dirty check skips it as
58
+ * `skippedDirty` on every cycle forever, and `branch-health` sees valid branch.json and scans it
59
+ * as healthy. Nothing self-heals without it.
80
60
  *
81
- * This state is invisible to every other check the worker makes: a clone left
82
- * mid-rebase reports uncommitted changes, so the sync loop's dirty check skips
83
- * it as `skippedDirty` on every cycle forever, and `branch-health` sees valid
84
- * branch.json and scans it as healthy. Nothing self-heals, and recovery
85
- * previously meant an operator running `git rebase --abort` on EFS by hand.
86
- *
87
- * Never throws — a missing or unreadable repo is reported as "no rebase",
88
- * which is the safe direction for both callers (the worker only ever uses a
89
- * `true` to justify an abort it holds the content-write lock for).
61
+ * Never throws — a missing or unreadable repo is reported as "no rebase", the safe direction for
62
+ * both callers (the worker only uses a `true` to justify an abort it holds the content-write lock
63
+ * for).
90
64
  */
91
65
  export declare function isRebaseInProgress(repoPath: string): Promise<boolean>;
92
66
  /**
93
- * Detect the current HEAD branch name for a given repository root.
94
- * Returns the branch name, or the provided fallback (default 'main')
95
- * if detection fails or HEAD is detached.
67
+ * The repository's current HEAD branch name, or `fallback` when detection fails or HEAD is
68
+ * detached.
96
69
  */
97
70
  export declare function detectHeadBranch(repoRoot: string, fallback?: string): Promise<string>;
98
71
  /**
99
- * Resolve the base branch — the fork point for CMS editing branches and the
100
- * branch used to seed workspace clones.
101
- *
102
- * This is the single definition of base-branch behavior (see ARCHITECTURE.md
103
- * "Branch Identity"):
104
- * - An explicitly configured `defaultBaseBranch` always wins, in both modes.
105
- * - In dev mode it is detected from the current git HEAD, so workspaces fork
106
- * from the branch the developer has checked out.
107
- * - Otherwise it is 'main'.
72
+ * Resolve the base branch — the fork point for CMS editing branches and the branch workspace
73
+ * clones are seeded from. The single definition of base-branch behavior (see ARCHITECTURE.md
74
+ * "Branch Identity"): a configured `defaultBaseBranch` always wins in both modes; dev mode
75
+ * otherwise detects the current git HEAD, so workspaces fork from the developer's checked-out
76
+ * branch; otherwise 'main'.
108
77
  *
109
- * Static deployments never reach git operations, so callers in static paths
110
- * must short-circuit before calling this (see createCanopyServices).
78
+ * Static deployments never reach git operations, so callers on static paths must short-circuit
79
+ * before calling this (see createCanopyServices).
111
80
  */
112
81
  export declare function resolveBaseBranch(options: {
113
82
  defaultBaseBranch?: string;