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,11 +1,6 @@
1
1
  /**
2
2
  * Schema API - endpoints for managing collection structure.
3
3
  *
4
- * Provides CRUD operations for:
5
- * - Collections (create, read, update, delete)
6
- * - Entry types (add, update, remove)
7
- * - Ordering (update item order within collections)
8
- *
9
4
  * All mutations require Admin group membership.
10
5
  * Schema changes are branch-specific (like content edits).
11
6
  */
@@ -107,9 +102,6 @@ function toWireFlatSchema(items, registry) {
107
102
  };
108
103
  });
109
104
  }
110
- // ============================================================================
111
- // Zod Schemas for Params
112
- // ============================================================================
113
105
  const branchParamsSchema = z.object({
114
106
  branch: branchNameSchema,
115
107
  });
@@ -130,9 +122,6 @@ const updateEntryTypeBodySchema = updateEntryTypeInputSchema;
130
122
  const updateOrderBodySchema = z.object({
131
123
  order: z.array(z.string()),
132
124
  });
133
- // ============================================================================
134
- // Helper Functions
135
- // ============================================================================
136
125
  /**
137
126
  * Get a SchemaOps instance for a branch
138
127
  */
@@ -147,28 +136,16 @@ async function getSchemaOps(ctx, branchName) {
147
136
  return { store, branchRoot: context.branchRoot };
148
137
  }
149
138
  /**
150
- * `collectionPath` (C5, August 2026 baseline review follow-up): this used to
151
- * decode the catch-all param itself, because http/router.ts's matchRoute did
152
- * not decode catch-all segments at all - only `:param` ones. matchRoute now
153
- * decodes every matched param exactly once, uniformly for `:param` and
154
- * catch-all alike, and `collectionParamsSchema`'s `logicalPathSchema`
155
- * already re-validates that single decoded value for traversal before this
156
- * handler ever runs. Decoding again here would be a second, unauthorized
157
- * decode pass on an already-decoded value - exactly the "double-encoding
158
- * smuggles a traversal sequence" hazard this function's own re-validation
159
- * was written to defend against, just relocated. This is now a passthrough;
160
- * kept as a named function (rather than inlined at each call site) so a
161
- * future re-validation need has one place to add it back.
139
+ * `collectionPath` is already decoded exactly once by matchRoute (uniformly for `:param` and
140
+ * catch-all segments) and re-validated for traversal by `collectionParamsSchema`'s
141
+ * `logicalPathSchema` before this handler runs. Decoding it again here would be a second,
142
+ * unauthorized decode pass — the "double-encoding smuggles a traversal sequence" hazard this
143
+ * function exists to guard against. A passthrough today; kept as a named function so a future
144
+ * re-validation need has one place to add it back.
162
145
  */
163
146
  function decodeCollectionPath(collectionPath) {
164
147
  return { ok: true, path: collectionPath };
165
148
  }
166
- // ============================================================================
167
- // Handlers
168
- // ============================================================================
169
- /**
170
- * GET /:branch/schema - Get full schema tree
171
- */
172
149
  const getSchemaHandler = async (gc, ctx, _req, _params) => {
173
150
  const { branchContext } = gc;
174
151
  return {
@@ -180,10 +157,6 @@ const getSchemaHandler = async (gc, ctx, _req, _params) => {
180
157
  },
181
158
  };
182
159
  };
183
- /**
184
- * GET /:branch/schema/collection/...collectionPath - Get single collection details
185
- * Note: Uses 'collection' (singular) with catch-all to support paths with slashes
186
- */
187
160
  const getCollectionHandler = async (gc, ctx, req, params) => {
188
161
  const { branchContext } = gc;
189
162
  const decodedPath = decodeCollectionPath(params.collectionPath);
@@ -246,9 +219,6 @@ const getCollectionHandler = async (gc, ctx, req, params) => {
246
219
  data: { collection, entryTypesWithUsage },
247
220
  };
248
221
  };
249
- /**
250
- * POST /:branch/schema/collections - Create collection
251
- */
252
222
  const createCollectionHandler = async (_gc, ctx, req, params, body) => {
253
223
  const storeResult = await getSchemaOps(ctx, params.branch);
254
224
  if ('error' in storeResult) {
@@ -273,10 +243,6 @@ const createCollectionHandler = async (_gc, ctx, req, params, body) => {
273
243
  };
274
244
  }
275
245
  };
276
- /**
277
- * PATCH /:branch/schema/collection/...collectionPath - Update collection
278
- * Note: Uses 'collection' (singular) with catch-all to support paths with slashes
279
- */
280
246
  const updateCollectionHandler = async (_gc, ctx, req, params, body) => {
281
247
  const storeResult = await getSchemaOps(ctx, params.branch);
282
248
  if ('error' in storeResult) {
@@ -306,10 +272,6 @@ const updateCollectionHandler = async (_gc, ctx, req, params, body) => {
306
272
  };
307
273
  }
308
274
  };
309
- /**
310
- * DELETE /:branch/schema/collection/...collectionPath - Delete collection
311
- * Note: Uses 'collection' (singular) with catch-all to support paths with slashes
312
- */
313
275
  const deleteCollectionHandler = async (_gc, ctx, req, params) => {
314
276
  const storeResult = await getSchemaOps(ctx, params.branch);
315
277
  if ('error' in storeResult) {
@@ -339,10 +301,6 @@ const deleteCollectionHandler = async (_gc, ctx, req, params) => {
339
301
  };
340
302
  }
341
303
  };
342
- /**
343
- * POST /:branch/schema/entry-types/...collectionPath - Add entry type
344
- * Note: Restructured URL with catch-all at end to support paths with slashes
345
- */
346
304
  const addEntryTypeHandler = async (_gc, ctx, req, params, body) => {
347
305
  const storeResult = await getSchemaOps(ctx, params.branch);
348
306
  if ('error' in storeResult) {
@@ -372,10 +330,6 @@ const addEntryTypeHandler = async (_gc, ctx, req, params, body) => {
372
330
  };
373
331
  }
374
332
  };
375
- /**
376
- * PATCH /:branch/schema/entry-types/:entryTypeName/...collectionPath - Update entry type
377
- * Note: Restructured URL with entry type name before catch-all path
378
- */
379
333
  const updateEntryTypeHandler = async (_gc, ctx, req, params, body) => {
380
334
  const storeResult = await getSchemaOps(ctx, params.branch);
381
335
  if ('error' in storeResult) {
@@ -386,13 +340,10 @@ const updateEntryTypeHandler = async (_gc, ctx, req, params, body) => {
386
340
  return { ok: false, status: 400, error: decodedPath.error };
387
341
  }
388
342
  const collectionPath = decodedPath.path;
389
- // Note: the breaking-change usage guard (blocking format/schema changes
390
- // while entries still use this type) used to live here, checked BEFORE
391
- // calling the store. It moved into SchemaOps.updateEntryType itself so the
392
- // usage count is read under the same schema lock that guards the write —
393
- // otherwise a concurrent write could land a new entry between this
394
- // handler's count and its call to the store (TOCTOU). See
395
- // schema-store.ts's updateEntryTypeInner.
343
+ // The breaking-change usage guard (blocking format/schema changes while entries still use this
344
+ // type) lives in SchemaOps.updateEntryType, not here: the usage count must be read under the
345
+ // same schema lock that guards the write, or a concurrent write could land a new entry between
346
+ // this handler's count and the store call (TOCTOU). See schema-store.ts's updateEntryTypeInner.
396
347
  try {
397
348
  await storeResult.store.updateEntryType(collectionPath, params.entryTypeName, body);
398
349
  return {
@@ -412,10 +363,6 @@ const updateEntryTypeHandler = async (_gc, ctx, req, params, body) => {
412
363
  };
413
364
  }
414
365
  };
415
- /**
416
- * DELETE /:branch/schema/entry-types/:entryTypeName/...collectionPath - Remove entry type
417
- * Note: Restructured URL with entry type name before catch-all path
418
- */
419
366
  const removeEntryTypeHandler = async (_gc, ctx, req, params) => {
420
367
  const storeResult = await getSchemaOps(ctx, params.branch);
421
368
  if ('error' in storeResult) {
@@ -445,10 +392,6 @@ const removeEntryTypeHandler = async (_gc, ctx, req, params) => {
445
392
  };
446
393
  }
447
394
  };
448
- /**
449
- * PATCH /:branch/schema/order/...collectionPath - Update item order
450
- * Note: Restructured URL with catch-all at end to support paths with slashes
451
- */
452
395
  const updateOrderHandler = async (_gc, ctx, req, params, body) => {
453
396
  const storeResult = await getSchemaOps(ctx, params.branch);
454
397
  if ('error' in storeResult) {
@@ -478,9 +421,6 @@ const updateOrderHandler = async (_gc, ctx, req, params, body) => {
478
421
  };
479
422
  }
480
423
  };
481
- /**
482
- * POST /:branch/schema/invalidate-cache - Invalidate schema cache (for debugging/manual refresh)
483
- */
484
424
  const invalidateSchemaCacheHandler = async (gc, ctx, _req, _params) => {
485
425
  const { branchContext } = gc;
486
426
  try {
@@ -502,11 +442,9 @@ const invalidateSchemaCacheHandler = async (gc, ctx, _req, _params) => {
502
442
  };
503
443
  }
504
444
  };
505
- // ============================================================================
506
- // Route Definitions
507
- // ============================================================================
508
445
  /**
509
446
  * GET /:branch/schema - Get full schema
447
+ * @internal Exported for tests.
510
448
  */
511
449
  export const getSchema = defineEndpoint({
512
450
  namespace: 'schema',
@@ -523,6 +461,7 @@ export const getSchema = defineEndpoint({
523
461
  /**
524
462
  * GET /:branch/schema/collection/...collectionPath - Get single collection
525
463
  * Note: Uses 'collection' (singular) with catch-all to support paths with slashes
464
+ * @internal Exported for tests.
526
465
  */
527
466
  export const getCollection = defineEndpoint({
528
467
  namespace: 'schema',
@@ -538,6 +477,7 @@ export const getCollection = defineEndpoint({
538
477
  });
539
478
  /**
540
479
  * POST /:branch/schema/collections - Create collection
480
+ * @internal Exported for tests.
541
481
  */
542
482
  export const createCollection = defineEndpoint({
543
483
  namespace: 'schema',
@@ -560,6 +500,7 @@ export const createCollection = defineEndpoint({
560
500
  /**
561
501
  * PATCH /:branch/schema/collection/...collectionPath - Update collection
562
502
  * Note: Uses 'collection' (singular) with catch-all to support paths with slashes
503
+ * @internal Exported for tests.
563
504
  */
564
505
  export const updateCollection = defineEndpoint({
565
506
  namespace: 'schema',
@@ -578,6 +519,7 @@ export const updateCollection = defineEndpoint({
578
519
  /**
579
520
  * DELETE /:branch/schema/collection/...collectionPath - Delete collection
580
521
  * Note: Uses 'collection' (singular) with catch-all to support paths with slashes
522
+ * @internal Exported for tests.
581
523
  */
582
524
  export const deleteCollection = defineEndpoint({
583
525
  namespace: 'schema',
@@ -594,6 +536,7 @@ export const deleteCollection = defineEndpoint({
594
536
  /**
595
537
  * POST /:branch/schema/entry-types/...collectionPath - Add entry type
596
538
  * Note: Restructured URL with catch-all at end to support paths with slashes
539
+ * @internal Exported for tests.
597
540
  */
598
541
  export const addEntryType = defineEndpoint({
599
542
  namespace: 'schema',
@@ -612,6 +555,7 @@ export const addEntryType = defineEndpoint({
612
555
  /**
613
556
  * PATCH /:branch/schema/entry-types/:entryTypeName/...collectionPath - Update entry type
614
557
  * Note: Restructured URL with entry type name before catch-all path
558
+ * @internal Exported for tests.
615
559
  */
616
560
  export const updateEntryType = defineEndpoint({
617
561
  namespace: 'schema',
@@ -630,6 +574,7 @@ export const updateEntryType = defineEndpoint({
630
574
  /**
631
575
  * DELETE /:branch/schema/entry-types/:entryTypeName/...collectionPath - Remove entry type
632
576
  * Note: Restructured URL with entry type name before catch-all path
577
+ * @internal Exported for tests.
633
578
  */
634
579
  export const removeEntryType = defineEndpoint({
635
580
  namespace: 'schema',
@@ -646,6 +591,7 @@ export const removeEntryType = defineEndpoint({
646
591
  /**
647
592
  * PATCH /:branch/schema/order/...collectionPath - Update item order
648
593
  * Note: Restructured URL with catch-all at end to support paths with slashes
594
+ * @internal Exported for tests.
649
595
  */
650
596
  export const updateOrder = defineEndpoint({
651
597
  namespace: 'schema',
@@ -664,7 +610,7 @@ export const updateOrder = defineEndpoint({
664
610
  /**
665
611
  * POST /:branch/schema/invalidate-cache - Invalidate schema cache
666
612
  */
667
- export const invalidateSchemaCache = defineEndpoint({
613
+ const invalidateSchemaCache = defineEndpoint({
668
614
  namespace: 'schema',
669
615
  name: 'invalidateSchemaCache',
670
616
  method: 'POST',
@@ -7,11 +7,10 @@ import { sanitizeErrorMessage } from '../utils/error.js';
7
7
  export async function getSettingsBranchContext(ctx) {
8
8
  const mode = ctx.services.config.mode;
9
9
  const strategy = operatingStrategy(mode);
10
- // Determine which branch name to use (for git operations). Pass the whole
11
- // config (not a hand-picked subset) so deploymentName flows through too -
12
- // omitting it here used to make this always compute the mode-default
13
- // settings branch, ignoring any deploymentName/CANOPYCMS_DEPLOYMENT_NAME
14
- // resolution (see resolveDeploymentName in operating-mode/deployment-name.ts).
10
+ // Pass the whole config, not a hand-picked subset, so deploymentName flows
11
+ // through (see resolveDeploymentName in operating-mode/deployment-name.ts)
12
+ // -- a subset silently computes the mode-default settings branch instead,
13
+ // ignoring any deploymentName/CANOPYCMS_DEPLOYMENT_NAME resolution.
15
14
  const branchName = strategy.getSettingsBranchName(ctx.services.config);
16
15
  // Both prod and dev use a separate settings branch
17
16
  const settingsRoot = await ctx.services.getSettingsBranchRoot();
@@ -11,16 +11,11 @@ export interface ApiContext {
11
11
  * Load a branch context for the requested branch name.
12
12
  * Can be backed by BranchRegistry + BranchMetadataFileManager.
13
13
  *
14
- * @param branchName - Name of the branch to load
15
- * @param options - Optional configuration
16
14
  * @param options.loadSchema - If true, loads per-branch schema into context.flatSchema
17
15
  */
18
16
  getBranchContext: (branchName: string, options?: {
19
17
  loadSchema?: boolean;
20
18
  }) => Promise<BranchContext | null>;
21
- /**
22
- * Auth plugin for user/group search (optional)
23
- */
24
19
  authPlugin?: AuthPlugin;
25
20
  }
26
21
  export interface ApiRequest<TBody = unknown> {
package/dist/api/user.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { defineEndpoint } from './route-builder.js';
2
2
  /**
3
- * Get current user info
4
3
  * This is a PUBLIC endpoint - no special permissions required
5
4
  */
6
5
  const getUserInfoHandler = async (ctx, req) => {
@@ -14,10 +13,6 @@ const getUserInfoHandler = async (ctx, req) => {
14
13
  },
15
14
  };
16
15
  };
17
- /**
18
- * Get current user information
19
- * GET /whoami
20
- */
21
16
  const getUserInfo = defineEndpoint({
22
17
  namespace: 'user',
23
18
  name: 'whoami',
@@ -3,74 +3,31 @@
3
3
  *
4
4
  * These schemas validate incoming strings from HTTP requests
5
5
  * and cast them to branded types for type-safe handling in API handlers.
6
- *
7
- * Usage:
8
- * ```ts
9
- * import { branchNameSchema, logicalPathSchema } from './validators.js'
10
- *
11
- * const paramsSchema = z.object({
12
- * branch: branchNameSchema,
13
- * path: logicalPathSchema,
14
- * })
15
- *
16
- * // TypeScript infers branded types automatically
17
- * const params = paramsSchema.parse(req.params)
18
- * // params.branch is BranchName (not string)
19
- * // params.path is LogicalPath (not string)
20
- * ```
21
6
  */
22
7
  import { z } from 'zod';
23
8
  import { type BranchName, type LogicalPath, type ContentId, type Slug } from '../paths/index.js';
24
9
  import { type PermissionPath } from '../authorization/index.js';
25
10
  /**
26
- * Zod schema for BranchName - validates git branch naming rules and brands.
27
- *
28
- * Validates:
29
- * - No empty strings
30
- * - No double dots (..)
31
- * - No leading/trailing slashes
32
- * - No spaces
33
- * - No leading/trailing dots
34
- * - No @{ sequences
11
+ * Zod schema for BranchName: validates and brands a branch-name string via `parseBranchName`
12
+ * (paths/validation.ts), so handlers receive a `BranchName`, not a bare `string`.
35
13
  */
36
14
  export declare const branchNameSchema: z.ZodType<BranchName>;
37
15
  /**
38
- * Zod schema for LogicalPath - validates and brands logical content paths.
39
- *
40
- * Validates:
41
- * - No empty strings
42
- * - No path traversal sequences (..)
43
- * - Not a physical path (no embedded content IDs)
16
+ * Zod schema for LogicalPath: validates and brands via `parseLogicalPath` (paths/validation.ts),
17
+ * which blocks path-traversal sequences and physical-path shapes, so handlers get a
18
+ * `LogicalPath`, not a bare `string`.
44
19
  */
45
20
  export declare const logicalPathSchema: z.ZodType<LogicalPath>;
46
21
  /**
47
- * Zod schema for ContentId - validates 12-char Base58 IDs.
48
- *
49
- * Validates:
50
- * - Exactly 12 characters
51
- * - Base58 alphabet only (no 0, O, I, l)
22
+ * Zod schema for ContentId: validates and brands a 12-char Base58 ID via `parseContentId`
23
+ * (paths/validation.ts), so handlers get a `ContentId`, not a bare `string`.
52
24
  */
53
25
  export declare const contentIdSchema: z.ZodType<ContentId>;
54
26
  /**
55
- * Zod schema for Slug - validates entry and collection slugs.
56
- *
57
- * Validates:
58
- * - No path separators (/ or \)
59
- * - Starts with lowercase letter or number
60
- * - Only lowercase letters, numbers, and hyphens
61
- * - Max 64 characters
27
+ * Zod schema for Slug: validates and brands via `parseSlug` (paths/validation.ts), so handlers
28
+ * get a `Slug`, not a bare `string`.
62
29
  */
63
30
  export declare const slugSchema: z.ZodType<Slug>;
64
- /**
65
- * Zod schema for PermissionPath - validates permission rule paths.
66
- *
67
- * SECURITY: Prevents path traversal attacks in permission rules.
68
- *
69
- * Validates:
70
- * - No path traversal sequences (..)
71
- * - No leading/trailing slashes
72
- * - No consecutive slashes
73
- */
74
31
  /**
75
32
  * Common params schema for endpoints that accept a branch name path parameter.
76
33
  * Shared across branch-status, branch-review, branch-withdraw, comments, and branch handlers.
@@ -86,6 +43,11 @@ export declare const branchParamSchema: z.ZodObject<{
86
43
  readonly __brand: "BranchName";
87
44
  };
88
45
  }>;
46
+ /**
47
+ * Zod schema for PermissionPath: validates and brands via `parsePermissionPath`
48
+ * (authorization/validation.ts), so handlers get a `PermissionPath`, not a bare `string`.
49
+ * SECURITY: this is what blocks path traversal (`..`) in permission-rule paths.
50
+ */
89
51
  export declare const permissionPathSchema: z.ZodType<PermissionPath>;
90
52
  /**
91
53
  * Zod schema for boolean GET query params. HTTP query strings always arrive as
@@ -3,35 +3,13 @@
3
3
  *
4
4
  * These schemas validate incoming strings from HTTP requests
5
5
  * and cast them to branded types for type-safe handling in API handlers.
6
- *
7
- * Usage:
8
- * ```ts
9
- * import { branchNameSchema, logicalPathSchema } from './validators.js'
10
- *
11
- * const paramsSchema = z.object({
12
- * branch: branchNameSchema,
13
- * path: logicalPathSchema,
14
- * })
15
- *
16
- * // TypeScript infers branded types automatically
17
- * const params = paramsSchema.parse(req.params)
18
- * // params.branch is BranchName (not string)
19
- * // params.path is LogicalPath (not string)
20
- * ```
21
6
  */
22
7
  import { z } from 'zod';
23
8
  import { parseBranchName, parseLogicalPath, parseContentId, parseSlug, } from '../paths/index.js';
24
9
  import { parsePermissionPath } from '../authorization/index.js';
25
10
  /**
26
- * Zod schema for BranchName - validates git branch naming rules and brands.
27
- *
28
- * Validates:
29
- * - No empty strings
30
- * - No double dots (..)
31
- * - No leading/trailing slashes
32
- * - No spaces
33
- * - No leading/trailing dots
34
- * - No @{ sequences
11
+ * Zod schema for BranchName: validates and brands a branch-name string via `parseBranchName`
12
+ * (paths/validation.ts), so handlers receive a `BranchName`, not a bare `string`.
35
13
  */
36
14
  export const branchNameSchema = z
37
15
  .string()
@@ -48,12 +26,9 @@ export const branchNameSchema = z
48
26
  return result.name;
49
27
  });
50
28
  /**
51
- * Zod schema for LogicalPath - validates and brands logical content paths.
52
- *
53
- * Validates:
54
- * - No empty strings
55
- * - No path traversal sequences (..)
56
- * - Not a physical path (no embedded content IDs)
29
+ * Zod schema for LogicalPath: validates and brands via `parseLogicalPath` (paths/validation.ts),
30
+ * which blocks path-traversal sequences and physical-path shapes, so handlers get a
31
+ * `LogicalPath`, not a bare `string`.
57
32
  */
58
33
  export const logicalPathSchema = z
59
34
  .string()
@@ -70,11 +45,8 @@ export const logicalPathSchema = z
70
45
  return result.path;
71
46
  });
72
47
  /**
73
- * Zod schema for ContentId - validates 12-char Base58 IDs.
74
- *
75
- * Validates:
76
- * - Exactly 12 characters
77
- * - Base58 alphabet only (no 0, O, I, l)
48
+ * Zod schema for ContentId: validates and brands a 12-char Base58 ID via `parseContentId`
49
+ * (paths/validation.ts), so handlers get a `ContentId`, not a bare `string`.
78
50
  */
79
51
  export const contentIdSchema = z.string().transform((val, ctx) => {
80
52
  const result = parseContentId(val);
@@ -88,13 +60,8 @@ export const contentIdSchema = z.string().transform((val, ctx) => {
88
60
  return result.id;
89
61
  });
90
62
  /**
91
- * Zod schema for Slug - validates entry and collection slugs.
92
- *
93
- * Validates:
94
- * - No path separators (/ or \)
95
- * - Starts with lowercase letter or number
96
- * - Only lowercase letters, numbers, and hyphens
97
- * - Max 64 characters
63
+ * Zod schema for Slug: validates and brands via `parseSlug` (paths/validation.ts), so handlers
64
+ * get a `Slug`, not a bare `string`.
98
65
  */
99
66
  export const slugSchema = z
100
67
  .string()
@@ -110,16 +77,6 @@ export const slugSchema = z
110
77
  }
111
78
  return result.slug;
112
79
  });
113
- /**
114
- * Zod schema for PermissionPath - validates permission rule paths.
115
- *
116
- * SECURITY: Prevents path traversal attacks in permission rules.
117
- *
118
- * Validates:
119
- * - No path traversal sequences (..)
120
- * - No leading/trailing slashes
121
- * - No consecutive slashes
122
- */
123
80
  /**
124
81
  * Common params schema for endpoints that accept a branch name path parameter.
125
82
  * Shared across branch-status, branch-review, branch-withdraw, comments, and branch handlers.
@@ -127,6 +84,11 @@ export const slugSchema = z
127
84
  export const branchParamSchema = z.object({
128
85
  branch: branchNameSchema,
129
86
  });
87
+ /**
88
+ * Zod schema for PermissionPath: validates and brands via `parsePermissionPath`
89
+ * (authorization/validation.ts), so handlers get a `PermissionPath`, not a bare `string`.
90
+ * SECURITY: this is what blocks path traversal (`..`) in permission-rule paths.
91
+ */
130
92
  export const permissionPathSchema = z
131
93
  .string()
132
94
  .min(1)
@@ -1,13 +1,9 @@
1
1
  /**
2
- * The five S3/local bucket-prefix strings (see keys.ts's module doc for the
3
- * full layout: asset-originals/, asset-staging/, asset-meta/, assets/t/,
4
- * assets/).
2
+ * The five S3/local bucket-prefix strings (see keys.ts's module doc for the full layout).
5
3
  *
6
- * Split into its own dependency-free file so client-safe, isomorphic modules
7
- * (transform-directives.ts, asset-url.ts) can import the prefix strings
8
- * directly without pulling keys.ts's `node:crypto` import (used only by
9
- * `hashBytes`) into a browser bundle. keys.ts re-exports `ASSET_PREFIXES`
10
- * from here so existing imports of it from './keys.js' keep working unchanged.
4
+ * Split into its own dependency-free file so isomorphic modules (transform-directives.ts,
5
+ * asset-url.ts) can import the prefixes without pulling keys.ts's `node:crypto` import into a
6
+ * browser bundle. keys.ts re-exports `ASSET_PREFIXES` from here for existing importers.
11
7
  */
12
8
  export declare const ASSET_PREFIXES: {
13
9
  readonly originals: "asset-originals";
@@ -1,13 +1,9 @@
1
1
  /**
2
- * The five S3/local bucket-prefix strings (see keys.ts's module doc for the
3
- * full layout: asset-originals/, asset-staging/, asset-meta/, assets/t/,
4
- * assets/).
2
+ * The five S3/local bucket-prefix strings (see keys.ts's module doc for the full layout).
5
3
  *
6
- * Split into its own dependency-free file so client-safe, isomorphic modules
7
- * (transform-directives.ts, asset-url.ts) can import the prefix strings
8
- * directly without pulling keys.ts's `node:crypto` import (used only by
9
- * `hashBytes`) into a browser bundle. keys.ts re-exports `ASSET_PREFIXES`
10
- * from here so existing imports of it from './keys.js' keep working unchanged.
4
+ * Split into its own dependency-free file so isomorphic modules (transform-directives.ts,
5
+ * asset-url.ts) can import the prefixes without pulling keys.ts's `node:crypto` import into a
6
+ * browser bundle. keys.ts re-exports `ASSET_PREFIXES` from here for existing importers.
11
7
  */
12
8
  export const ASSET_PREFIXES = {
13
9
  originals: 'asset-originals',
@@ -1,35 +1,18 @@
1
1
  /**
2
- * Compute the root-relative public URL for an asset's meta. Shared helper -
3
- * both the API layer (list/finalize responses) and later PRs (structured
4
- * image field, MediaLibrary, `assetUrl()`) build URLs through this so the
5
- * URL shape is defined in exactly one place.
2
+ * Compute the root-relative public URL for an asset's meta.
6
3
  *
7
4
  * svg/pdf: served statically from the public object finalize wrote
8
5
  * (`assets/{hash32}/{slug}.{ext}`, via keys.ts's `publicKey`).
9
6
  *
10
7
  * raster: served through the transform layer using the `orig` (identity)
11
- * directive. The transform engine itself is PR 4's job, but the URL shape is
12
- * decided now (rather than switching every raster URL over once transforms
13
- * ship) so content written by this PR stays valid without a migration.
8
+ * directive.
14
9
  *
15
10
  * Always root-relative, and this is the value that gets STORED in content.
16
11
  * Content moves between branches and environments, so a stored src must not
17
12
  * name an origin or a deployment prefix - it names only the asset's position
18
- * in the `/assets` URL space.
19
- *
20
- * Prefixing is a separate, render-time concern: `assetUrl()`'s `baseUrl` option
21
- * (assets/asset-url.ts) puts the mount point in front, and is the ONLY place a
22
- * prefix is applied. Do not confuse the two:
23
- *
24
- * - `assetSrc()` (here) -> stored, always root-relative, no prefix ever.
25
- * - `assetUrl(ref, {baseUrl})` -> rendered, prefix applied, never written back.
26
- *
27
- * `media.publicBaseUrl` is one source of that render-time prefix (the editor's,
28
- * for when the editor is served from a different origin) - it is config for
29
- * display, not a property of the asset.
13
+ * in the `/assets` URL space. Prefixing it for display is `assetUrl()`'s
14
+ * render-time job - see asset-url.ts.
30
15
  */
31
- import { IDENTITY_TRANSFORM_DIRECTIVE } from './transform-directives.js';
32
16
  import type { AssetMeta } from './types.js';
33
- /** Re-exported for existing importers (assets/index.ts barrel) - the value now lives in transform-directives.ts, PR 4's pure directive module, so it's reachable without pulling keys.ts's node:crypto import into client bundles. */
34
- export { IDENTITY_TRANSFORM_DIRECTIVE };
17
+ /** Re-exported for existing importers (assets/index.ts barrel) - the value now lives in transform-directives.ts, so it's reachable without pulling keys.ts's node:crypto import into client bundles. */
35
18
  export declare function assetSrc(meta: Pick<AssetMeta, 'hash32' | 'slug' | 'ext' | 'kind'>): string;
@@ -1,37 +1,21 @@
1
1
  /**
2
- * Compute the root-relative public URL for an asset's meta. Shared helper -
3
- * both the API layer (list/finalize responses) and later PRs (structured
4
- * image field, MediaLibrary, `assetUrl()`) build URLs through this so the
5
- * URL shape is defined in exactly one place.
2
+ * Compute the root-relative public URL for an asset's meta.
6
3
  *
7
4
  * svg/pdf: served statically from the public object finalize wrote
8
5
  * (`assets/{hash32}/{slug}.{ext}`, via keys.ts's `publicKey`).
9
6
  *
10
7
  * raster: served through the transform layer using the `orig` (identity)
11
- * directive. The transform engine itself is PR 4's job, but the URL shape is
12
- * decided now (rather than switching every raster URL over once transforms
13
- * ship) so content written by this PR stays valid without a migration.
8
+ * directive.
14
9
  *
15
10
  * Always root-relative, and this is the value that gets STORED in content.
16
11
  * Content moves between branches and environments, so a stored src must not
17
12
  * name an origin or a deployment prefix - it names only the asset's position
18
- * in the `/assets` URL space.
19
- *
20
- * Prefixing is a separate, render-time concern: `assetUrl()`'s `baseUrl` option
21
- * (assets/asset-url.ts) puts the mount point in front, and is the ONLY place a
22
- * prefix is applied. Do not confuse the two:
23
- *
24
- * - `assetSrc()` (here) -> stored, always root-relative, no prefix ever.
25
- * - `assetUrl(ref, {baseUrl})` -> rendered, prefix applied, never written back.
26
- *
27
- * `media.publicBaseUrl` is one source of that render-time prefix (the editor's,
28
- * for when the editor is served from a different origin) - it is config for
29
- * display, not a property of the asset.
13
+ * in the `/assets` URL space. Prefixing it for display is `assetUrl()`'s
14
+ * render-time job - see asset-url.ts.
30
15
  */
31
16
  import { ASSET_PREFIXES } from './asset-prefixes.js';
32
17
  import { IDENTITY_TRANSFORM_DIRECTIVE } from './transform-directives.js';
33
- /** Re-exported for existing importers (assets/index.ts barrel) - the value now lives in transform-directives.ts, PR 4's pure directive module, so it's reachable without pulling keys.ts's node:crypto import into client bundles. */
34
- export { IDENTITY_TRANSFORM_DIRECTIVE };
18
+ /** Re-exported for existing importers (assets/index.ts barrel) - the value now lives in transform-directives.ts, so it's reachable without pulling keys.ts's node:crypto import into client bundles. */
35
19
  export function assetSrc(meta) {
36
20
  if (meta.kind === 'svg' || meta.kind === 'pdf') {
37
21
  return `/${ASSET_PREFIXES.public}/${meta.hash32}/${meta.slug}.${meta.ext}`;
@@ -2,8 +2,7 @@
2
2
  * Instantiate the configured AssetStore from a site's `media` config.
3
3
  *
4
4
  * This is the one place that turns the (currently-unconsumed) `media` config
5
- * into a real store — see .claude/future-tasks/assets-media-system.md for why
6
- * this was previously dead configuration.
5
+ * into a real store — see .claude/future-tasks/resolved/assets-media-system.md.
7
6
  */
8
7
  import type { MediaConfig } from '../config/types.js';
9
8
  import type { AssetStore } from './types.js';