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,65 +1,44 @@
1
- /** Absolute path of the generation marker for a branch-clone root. */
1
+ /**
2
+ * Absolute path of the generation marker for a branch-clone root.
3
+ * @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md.
4
+ */
2
5
  export declare function contentIndexGenerationPath(root: string): string;
3
6
  /**
4
7
  * Record on disk that indexed files under `root` changed, so ContentStores in
5
8
  * OTHER processes rebuild. Must be called AFTER the filesystem mutation.
6
- * Returns the token written, or null if the write failed (logged and swallowed:
7
- * the content mutation is already durable; a lost bump degrades to the
8
- * pre-marker staleness behavior plus the ContentStore backstop).
9
+ * Returns the token written, or null if the write failed — a hint bump, since
10
+ * the content mutation is already durable and ContentStore has a backstop.
9
11
  */
10
12
  export declare function bumpContentIndexGeneration(root: string): Promise<string | null>;
11
13
  /**
12
- * Read the current generation token for `root`. Returns null if the marker
13
- * does not exist yet (a valid state distinct from every token). Read errors
14
- * other than ENOENT are logged and treated as null — the caller then rebuilds,
15
- * which is the safe direction.
14
+ * Read the current generation token for `root`. Null means the marker does not
15
+ * exist yet; a read error collapses to null too, so the caller rebuilds, which
16
+ * is the safe direction.
16
17
  */
17
18
  export declare function readContentIndexGeneration(root: string): Promise<string | null>;
18
19
  /**
19
- * The designated entry point for a FUTURE content-only bulk mutation site —
20
- * one that mutates indexed files under a branch-clone root broadly (not
21
- * through a single known write/delete/rename call) but never touches schema.
22
- * Bumps the on-disk content-index marker (cross-process), then invalidates
23
- * in-process registered stores.
20
+ * The entry point for a bulk mutation site that touches indexed files under a
21
+ * branch-clone root broadly but never touches schema. No production caller yet:
22
+ * `ContentStore`'s write/delete/renameEntry bump the marker directly via
23
+ * `recordOwnMutation()`, and every bulk site (git checkout/merge/rebase, sync,
24
+ * CLI sync, migrate) can touch `.collection.json` as a side effect, so those
25
+ * take `invalidateBranchContentCaches()` below.
24
26
  *
25
- * Currently unused in production: `ContentStore`'s own write()/delete()/
26
- * renameEntry() bump the marker directly via their `recordOwnMutation()` ->
27
- * `bumpContentIndexGeneration()` call, not through this wrapper, and every
28
- * existing bulk-mutation call site (git checkout/merge/rebase, sync, CLI
29
- * sync, migrate) can touch `.collection.json` as a side effect, so those all
30
- * use the combined `invalidateBranchContentCaches()` below instead. Kept as
31
- * the documented, ready-to-use entry point for a future call site that is
32
- * genuinely content-only.
33
- *
34
- * Bump-before-invalidate: the in-process invalidation triggers a rebuild on
35
- * next access, and that rebuild captures the marker token before scanning —
36
- * writing the marker first lets the rebuild pick up the new token in the same
37
- * pass instead of a redundant second rebuild.
27
+ * Bump BEFORE invalidating: the rebuild the invalidation triggers captures the
28
+ * marker token before scanning, so the new token lands in that same pass
29
+ * instead of costing a second rebuild.
38
30
  */
39
31
  export declare function invalidateContentIndexesDurable(root: string): Promise<void>;
40
32
  /**
41
- * The entry point for operations that mutate a branch-clone root's working
42
- * tree BROADLY rather than through a single known write/delete/rename call:
43
- * git working-tree ops (checkout/merge/rebase/abort), content sync, CLI sync,
44
- * and migrate. Such operations can touch `.collection.json` files as a side
45
- * effect (a rebase can pull in upstream schema changes; a sync can overwrite
46
- * the whole content directory), so both durable, cross-process caches rooted
47
- * at `root` need to be told: the ContentId index (content-index-registry.ts)
48
- * AND the resolved-schema cache (branch-schema-cache.ts).
49
- *
50
- * `invalidateContentIndexesDurable` is the designated entry point for a
51
- * future call site that only ever touches content files, never schema, and
52
- * needs the durable-invalidation shape but not the extra schema bump.
53
- * `ContentStore`'s own write/delete/rename paths don't call it either — they
54
- * bump the content-index marker directly via `recordOwnMutation()` (see
55
- * content-store.ts), since they already know exactly which mutation just
56
- * happened and don't need a generic "some indexed files changed" entry point.
33
+ * The entry point for operations that mutate a branch-clone root's working tree
34
+ * broadly: git working-tree ops (checkout/merge/rebase/abort), content sync,
35
+ * CLI sync, migrate. Those can touch `.collection.json` as a side effect (a
36
+ * rebase pulls in upstream schema changes; a sync overwrites the whole content
37
+ * directory), so BOTH caches rooted at `root` are bumped — the ContentId index
38
+ * and the resolved-schema cache.
57
39
  *
58
- * Both marker bumps are "hint" flavor (bumpResourceGeneration's default,
59
- * `mustSucceed` not set): callers of this function are typically `finally`
60
- * blocks in bulk operations (e.g. a git rebase cleanup) that must not start
61
- * throwing because a marker write failed - log-and-swallow is the existing
62
- * semantics at those call sites, and a lost bump only degrades to pre-marker
63
- * staleness behavior plus whatever backstop the consumer implements.
40
+ * Both bumps are hint flavor (no `mustSucceed`): these callers are typically
41
+ * `finally` blocks in bulk operations, which must not start throwing because a
42
+ * marker write failed.
64
43
  */
65
44
  export declare function invalidateBranchContentCaches(root: string): Promise<void>;
@@ -2,43 +2,15 @@ import { resourceGenerationPath, bumpResourceGeneration, readResourceGeneration,
2
2
  import { invalidateContentIndexesForRoot } from './content-index-registry.js';
3
3
  import { SCHEMA_GENERATION_RESOURCE } from './branch-schema-cache.js';
4
4
  /**
5
- * Cross-process ContentId index generation marker.
5
+ * The ContentIdIndex instance of the generation-marker protocol owned by
6
+ * resource-generation.ts; the marker lives at
7
+ * {root}/.canopy-meta/content-index.generation. In-process invalidation of the
8
+ * same indexes is content-index-registry.ts's job.
6
9
  *
7
- * This is the ContentIdIndex-specific instance of the generic on-disk
8
- * generation-marker protocol in resource-generation.ts — see that module's
9
- * doc comment for the full protocol (random-token rationale, bump/read
10
- * ordering, and the general residual staleness windows A/B/C/E). This file
11
- * documents only what is specific to the in-memory ContentIdIndex.
12
- *
13
- * The ContentIdIndex is an in-memory map per ContentStore instance. Within one
14
- * process, content-index-registry.ts invalidates stale indexes directly. Across
15
- * processes (several warm Lambda containers + the EC2 worker sharing branch
16
- * clones on EFS) there is no shared memory and no cross-host file watching, so
17
- * the shared filesystem itself is the coordination medium: every operation that
18
- * mutates indexed files under a branch-clone root also rewrites a small marker
19
- * file with a fresh random token, and every ContentStore cheaply re-reads that
20
- * marker (throttled) to decide whether its in-memory index is still current.
21
- *
22
- * The marker lives at {root}/.canopy-meta/content-index.generation.
23
- *
24
- * ## Residual staleness windows, as they apply here
25
- *
26
- * All bounded in practice by per-request ContentStore lifetimes and self-healed
27
- * by the suspicious-lookup backstop in ContentStore:
28
- *
29
- * - (A) NFS attribute caching: another host may not see a new marker for up to
30
- * the attribute-cache timeout (~3-60s on default EFS mounts). The reader acts
31
- * on a stale token and keeps a stale index until the cache expires.
32
- * - (B) Probe throttle: up to ContentStore's indexFreshnessIntervalMs (1s).
33
- * - (C) Self-adoption: after its own mutation a store adopts the token it
34
- * wrote; if a concurrent foreign bump landed just before ours, we miss that
35
- * one notification (window: from our last token observation to our rename).
36
- * - (E) Fresh-token/stale-scan (cross-host only): a rebuild's readdir calls may
37
- * be served from stale dentry/attribute caches, recording a NEW token against
38
- * PRE-mutation directory listings. Unlike a durable-snapshot consumer (see
39
- * resource-generation.ts), this only mis-serves ONE process's in-memory
40
- * index for the remainder of its lifetime — it is not written back to disk,
41
- * so it cannot become a shared stale state visible to other hosts.
10
+ * Local to this consumer: the index is per-ContentStore memory, never persisted,
11
+ * so a scan that records a fresh token over stale NFS-cached readdir results
12
+ * mis-serves only that one process for the rest of its lifetime — it cannot
13
+ * become shared stale state the way a durable snapshot can.
42
14
  *
43
15
  * Wrong-file WRITE corruption (recreating a concurrently renamed entry →
44
16
  * duplicate IDs) is prevented independently of this marker by the existence
@@ -46,79 +18,58 @@ import { SCHEMA_GENERATION_RESOURCE } from './branch-schema-cache.js';
46
18
  * before recreating a missing expected file.
47
19
  */
48
20
  const RESOURCE = 'content-index';
49
- /** Absolute path of the generation marker for a branch-clone root. */
21
+ /**
22
+ * Absolute path of the generation marker for a branch-clone root.
23
+ * @internal No importer; deletion candidate in knip-no-importer-deletion-candidates.md.
24
+ */
50
25
  export function contentIndexGenerationPath(root) {
51
26
  return resourceGenerationPath(root, RESOURCE);
52
27
  }
53
28
  /**
54
29
  * Record on disk that indexed files under `root` changed, so ContentStores in
55
30
  * OTHER processes rebuild. Must be called AFTER the filesystem mutation.
56
- * Returns the token written, or null if the write failed (logged and swallowed:
57
- * the content mutation is already durable; a lost bump degrades to the
58
- * pre-marker staleness behavior plus the ContentStore backstop).
31
+ * Returns the token written, or null if the write failed — a hint bump, since
32
+ * the content mutation is already durable and ContentStore has a backstop.
59
33
  */
60
34
  export async function bumpContentIndexGeneration(root) {
61
35
  return bumpResourceGeneration(root, RESOURCE);
62
36
  }
63
37
  /**
64
- * Read the current generation token for `root`. Returns null if the marker
65
- * does not exist yet (a valid state distinct from every token). Read errors
66
- * other than ENOENT are logged and treated as null — the caller then rebuilds,
67
- * which is the safe direction.
38
+ * Read the current generation token for `root`. Null means the marker does not
39
+ * exist yet; a read error collapses to null too, so the caller rebuilds, which
40
+ * is the safe direction.
68
41
  */
69
42
  export async function readContentIndexGeneration(root) {
70
43
  const result = await readResourceGeneration(root, RESOURCE);
71
44
  return result.ok ? result.token : null;
72
45
  }
73
46
  /**
74
- * The designated entry point for a FUTURE content-only bulk mutation site —
75
- * one that mutates indexed files under a branch-clone root broadly (not
76
- * through a single known write/delete/rename call) but never touches schema.
77
- * Bumps the on-disk content-index marker (cross-process), then invalidates
78
- * in-process registered stores.
47
+ * The entry point for a bulk mutation site that touches indexed files under a
48
+ * branch-clone root broadly but never touches schema. No production caller yet:
49
+ * `ContentStore`'s write/delete/renameEntry bump the marker directly via
50
+ * `recordOwnMutation()`, and every bulk site (git checkout/merge/rebase, sync,
51
+ * CLI sync, migrate) can touch `.collection.json` as a side effect, so those
52
+ * take `invalidateBranchContentCaches()` below.
79
53
  *
80
- * Currently unused in production: `ContentStore`'s own write()/delete()/
81
- * renameEntry() bump the marker directly via their `recordOwnMutation()` ->
82
- * `bumpContentIndexGeneration()` call, not through this wrapper, and every
83
- * existing bulk-mutation call site (git checkout/merge/rebase, sync, CLI
84
- * sync, migrate) can touch `.collection.json` as a side effect, so those all
85
- * use the combined `invalidateBranchContentCaches()` below instead. Kept as
86
- * the documented, ready-to-use entry point for a future call site that is
87
- * genuinely content-only.
88
- *
89
- * Bump-before-invalidate: the in-process invalidation triggers a rebuild on
90
- * next access, and that rebuild captures the marker token before scanning —
91
- * writing the marker first lets the rebuild pick up the new token in the same
92
- * pass instead of a redundant second rebuild.
54
+ * Bump BEFORE invalidating: the rebuild the invalidation triggers captures the
55
+ * marker token before scanning, so the new token lands in that same pass
56
+ * instead of costing a second rebuild.
93
57
  */
94
58
  export async function invalidateContentIndexesDurable(root) {
95
59
  await bumpContentIndexGeneration(root);
96
60
  invalidateContentIndexesForRoot(root);
97
61
  }
98
62
  /**
99
- * The entry point for operations that mutate a branch-clone root's working
100
- * tree BROADLY rather than through a single known write/delete/rename call:
101
- * git working-tree ops (checkout/merge/rebase/abort), content sync, CLI sync,
102
- * and migrate. Such operations can touch `.collection.json` files as a side
103
- * effect (a rebase can pull in upstream schema changes; a sync can overwrite
104
- * the whole content directory), so both durable, cross-process caches rooted
105
- * at `root` need to be told: the ContentId index (content-index-registry.ts)
106
- * AND the resolved-schema cache (branch-schema-cache.ts).
107
- *
108
- * `invalidateContentIndexesDurable` is the designated entry point for a
109
- * future call site that only ever touches content files, never schema, and
110
- * needs the durable-invalidation shape but not the extra schema bump.
111
- * `ContentStore`'s own write/delete/rename paths don't call it either — they
112
- * bump the content-index marker directly via `recordOwnMutation()` (see
113
- * content-store.ts), since they already know exactly which mutation just
114
- * happened and don't need a generic "some indexed files changed" entry point.
63
+ * The entry point for operations that mutate a branch-clone root's working tree
64
+ * broadly: git working-tree ops (checkout/merge/rebase/abort), content sync,
65
+ * CLI sync, migrate. Those can touch `.collection.json` as a side effect (a
66
+ * rebase pulls in upstream schema changes; a sync overwrites the whole content
67
+ * directory), so BOTH caches rooted at `root` are bumped — the ContentId index
68
+ * and the resolved-schema cache.
115
69
  *
116
- * Both marker bumps are "hint" flavor (bumpResourceGeneration's default,
117
- * `mustSucceed` not set): callers of this function are typically `finally`
118
- * blocks in bulk operations (e.g. a git rebase cleanup) that must not start
119
- * throwing because a marker write failed - log-and-swallow is the existing
120
- * semantics at those call sites, and a lost bump only degrades to pre-marker
121
- * staleness behavior plus whatever backstop the consumer implements.
70
+ * Both bumps are hint flavor (no `mustSucceed`): these callers are typically
71
+ * `finally` blocks in bulk operations, which must not start throwing because a
72
+ * marker write failed.
122
73
  */
123
74
  export async function invalidateBranchContentCaches(root) {
124
75
  await bumpContentIndexGeneration(root);
@@ -1,37 +1,28 @@
1
1
  /**
2
- * In-process registry connecting branch-mutating operations (git checkout/merge/rebase,
3
- * content sync) to the ContentStore instances whose ContentId indexes those operations
4
- * make stale.
2
+ * In-process registry connecting branch-mutating operations to the ContentStore
3
+ * instances whose ContentId indexes they make stale. ContentStore registers
4
+ * itself on construction, keyed by its resolved root; a mutation site calls
5
+ * invalidateContentIndexesForRoot() so the next index access rebuilds from disk
6
+ * instead of serving stale ID→path mappings.
5
7
  *
6
- * ContentStore registers itself (keyed by its resolved root) on construction. Operations
7
- * that change files under a root — GitManager working-tree mutations, the worker's rebase
8
- * loop, sync-core's content replacement — call invalidateContentIndexesForRoot() so the
9
- * next index access rebuilds from disk instead of serving stale ID→path mappings.
8
+ * SCOPE: in-process only, the zero-latency half. Cross-process divergence is the
9
+ * generation marker's job (content-index-generation.ts), and mutation sites
10
+ * should call invalidateContentIndexesDurable() there, which does both.
10
11
  *
11
- * SCOPE: in-process only — the zero-latency path for stores in the same process.
12
- * Cross-process divergence (e.g. Lambda + worker on shared EFS, each with its own
13
- * registry) is handled by the on-disk generation marker in
14
- * content-index-generation.ts; invalidateContentIndexesDurable() there combines
15
- * both scopes and is what mutation sites should call.
16
- *
17
- * Stores are held via WeakRef so short-lived (per-request) instances can be garbage
18
- * collected; a FinalizationRegistry prunes dead entries.
12
+ * Stores are held via WeakRef so per-request instances can be collected; a
13
+ * FinalizationRegistry prunes dead entries.
19
14
  */
20
15
  /** Anything holding a rebuildable content index (in practice: ContentStore). */
21
16
  export interface InvalidatableContentIndex {
22
17
  invalidateIndex(): void;
23
18
  }
24
- /**
25
- * Register a content-index holder for invalidation when files under `root` change.
26
- * Called by the ContentStore constructor.
27
- */
19
+ /** Register a holder for invalidation when files under `root` change. */
28
20
  export declare function registerContentIndexForInvalidation(root: string, target: InvalidatableContentIndex): void;
29
21
  /**
30
- * Invalidate every registered content index rooted at `root` or below it.
31
- * Prefix matching covers stores rooted at a subdirectory of the mutated repo
32
- * (e.g. a store rooted at a branch clone inside a mutated workspace tree).
22
+ * Invalidate every registered index rooted at `root` or below it; the prefix
23
+ * match covers a store rooted at a subdirectory of the mutated repo.
33
24
  *
34
- * Invalidation only marks indexes stale; the rebuild happens lazily on the next
35
- * index access, so calling this for a root with no live stores is free.
25
+ * This only marks indexes stale — the rebuild is lazy, on next access — so a
26
+ * root with no live stores costs nothing.
36
27
  */
37
28
  export declare function invalidateContentIndexesForRoot(root: string): void;
@@ -8,10 +8,7 @@ const finalization = new FinalizationRegistry(({ rootKey, ref }) => {
8
8
  if (refs.size === 0)
9
9
  registry.delete(rootKey);
10
10
  });
11
- /**
12
- * Register a content-index holder for invalidation when files under `root` change.
13
- * Called by the ContentStore constructor.
14
- */
11
+ /** Register a holder for invalidation when files under `root` change. */
15
12
  export function registerContentIndexForInvalidation(root, target) {
16
13
  const rootKey = path.resolve(root);
17
14
  let refs = registry.get(rootKey);
@@ -24,12 +21,11 @@ export function registerContentIndexForInvalidation(root, target) {
24
21
  finalization.register(target, { rootKey, ref });
25
22
  }
26
23
  /**
27
- * Invalidate every registered content index rooted at `root` or below it.
28
- * Prefix matching covers stores rooted at a subdirectory of the mutated repo
29
- * (e.g. a store rooted at a branch clone inside a mutated workspace tree).
24
+ * Invalidate every registered index rooted at `root` or below it; the prefix
25
+ * match covers a store rooted at a subdirectory of the mutated repo.
30
26
  *
31
- * Invalidation only marks indexes stale; the rebuild happens lazily on the next
32
- * index access, so calling this for a root with no live stores is free.
27
+ * This only marks indexes stale — the rebuild is lazy, on next access — so a
28
+ * root with no live stores costs nothing.
33
29
  */
34
30
  export function invalidateContentIndexesForRoot(root) {
35
31
  const rootKey = path.resolve(root);
@@ -1,15 +1,10 @@
1
1
  /**
2
2
  * Shared content-listing utilities used by both the entries API and the content tree builder.
3
- *
4
- * Extracted from api/entries.ts to avoid duplication.
5
3
  */
6
4
  import type { ContentFormat, FlatSchemaItem, EntrySchema } from './config/index.js';
7
5
  import type { LogicalPath, PhysicalPath, Slug, ContentId } from './paths/types.js';
8
6
  import { ContentStore, type ReferenceResolveCache } from './content-store.js';
9
- /**
10
- * An entry listing item with raw data from the filesystem.
11
- * Does not include API-specific fields like canEdit.
12
- */
7
+ /** An entry listing item with raw filesystem data; no API-specific fields like canEdit. */
13
8
  export interface CollectionListItem {
14
9
  logicalPath: LogicalPath;
15
10
  contentId: ContentId;
@@ -23,14 +18,6 @@ export interface CollectionListItem {
23
18
  data: Record<string, unknown>;
24
19
  updatedAt?: string;
25
20
  }
26
- /**
27
- * Read entry data from a file.
28
- * For md/mdx: returns frontmatter fields plus the body content (mapped to the
29
- * field name specified by `bodyFieldName`, which defaults to `'body'`).
30
- * For json: returns the parsed JSON object.
31
- * Returns an empty object on read/parse failure.
32
- */
33
- export declare const readEntryData: (filePath: string, format: ContentFormat, bodyFieldName?: string) => Promise<Record<string, unknown>>;
34
21
  export { parseTypedFilename } from './utils/typed-filename.js';
35
22
  /**
36
23
  * A flat entry item from listEntries.
@@ -40,17 +27,15 @@ export interface ListEntriesItem<T = Record<string, unknown>> {
40
27
  /** URL path segments, e.g., ['researchers', 'guides', 'glossary-of-terms'] */
41
28
  pathSegments: string[];
42
29
  /**
43
- * URL-ready path with index entries collapsed to their parent collection path.
44
- * For index entries: '/guides' instead of '/guides/index'.
45
- * For regular entries: '/guides/glossary-of-terms'.
46
- * For a root index entry: '/'.
30
+ * URL-ready path with index entries collapsed to their parent collection path: '/guides'
31
+ * for the index entry of guides, '/guides/glossary-of-terms' for a regular entry, '/' for a
32
+ * root index entry.
47
33
  *
48
- * Round-trip safe: `readByUrlPath(item.urlPath)` resolves to the same entry. That guarantee
49
- * depends on `slug` passing `parseSlug` — the filename grammar (`utils/typed-filename.ts`)
50
- * allows a slug to contain characters `parseSlug` rejects (a dot, most commonly), and an entry
51
- * whose slug does is listed here same as any other but can never be read back by URL.
52
- * `static/index.ts`'s `assertRoutableSlugs` is the build-time guard that catches this outside
53
- * this doc comment's promise.
34
+ * Round-trip safe: `readByUrlPath(item.urlPath)` resolves to the same entry -- but only
35
+ * while `slug` passes `parseSlug`. The filename grammar (`utils/typed-filename.ts`) allows
36
+ * slugs `parseSlug` rejects (a dot, most commonly), and such an entry is listed here like
37
+ * any other yet can never be read back by URL. `static/index.ts`'s `assertRoutableSlugs` is
38
+ * the build-time guard that catches it.
54
39
  */
55
40
  urlPath: string;
56
41
  /** Entry slug within its collection */
@@ -75,20 +60,17 @@ export interface ListEntriesItem<T = Record<string, unknown>> {
75
60
  /** Field definitions for this entry's type, when resolvable. */
76
61
  schema?: EntrySchema;
77
62
  /**
78
- * Filesystem mtime (ISO 8601) of the entry file, from an unconditional `fs.stat`
79
- * done while listing. Caveat: this is a checkout-time timestamp, not an editorial
80
- * one — a fresh CI clone resets every file's mtime to checkout time, so treat this
81
- * as "changed since last build" at best, not an authoritative last-edited date for
82
- * a public-facing `<lastmod>`. Sourcing mtime from git commit history is a
83
- * separate, not-yet-built improvement.
63
+ * Filesystem mtime (ISO 8601) of the entry file, from an unconditional `fs.stat` done while
64
+ * listing. Caveat: a checkout-time timestamp, not an editorial one — a fresh CI clone resets
65
+ * every file's mtime — so treat it as "changed since last build" at best, never as an
66
+ * authoritative last-edited date for a public-facing `<lastmod>`.
84
67
  */
85
68
  updatedAt?: string;
86
69
  }
87
70
  export interface ListEntriesOptions<T = Record<string, unknown>> {
88
71
  /**
89
- * Transform raw entry data. Controls what ends up in `data` on each result.
90
- * Raw data includes all frontmatter fields; for md/mdx, raw.body is the markdown content.
91
- * Without extract, data is the full raw object.
72
+ * Transform raw entry data; controls what ends up in `data` on each result. Raw data
73
+ * includes all frontmatter fields, and for md/mdx `raw.body` is the markdown content.
92
74
  */
93
75
  extract?: (raw: Record<string, unknown>, meta: {
94
76
  entryPath: LogicalPath;
@@ -107,44 +89,38 @@ export interface ListEntriesOptions<T = Record<string, unknown>> {
107
89
  sort?: (a: ListEntriesItem<T>, b: ListEntriesItem<T>) => number;
108
90
  /**
109
91
  * Resolve `reference` fields to the referenced entry's data, the way
110
- * `read()`/`readByUrlPath()` do — including references nested inside `object` fields,
111
- * inline `group`s and block templates (so a shared/referenced block finally carries its
112
- * snippet's content here). Off leaves them as the bare id string, or `null`.
92
+ * `read()`/`readByUrlPath()` do — including references nested inside `object` fields, inline
93
+ * `group`s and block templates. Off leaves them as the bare id string, or `null`.
113
94
  *
114
- * **Defaults to `false`, unlike `read()`, which defaults to `true`.** The asymmetry is
115
- * deliberate rather than an oversight. `data` is `T` and `extract` receives an untyped
116
- * `Record<string, unknown>`, so turning this on changes a reference from `'a1b2c3d4e5f6'`
117
- * to `{ ...data, id, slug, collection, urlPath }` with no compile error anywhere to catch it — an
118
- * `/authors/${data.author}` template silently becomes `/authors/[object Object]`. Opting
119
- * in is a decision you make per call site, next to the code that reads the field. It also
120
- * keeps the common batch uses free: `collectStaticPaths` discards `data` outright, and
121
- * `build/generate-ai-content.ts` lists purely to validate entry shapes.
95
+ * **Defaults to `false`, unlike `read()`, which defaults to `true`.** Deliberate: `data` is
96
+ * `T` and `extract` receives an untyped `Record<string, unknown>`, so turning this on
97
+ * changes a reference from `'a1b2c3d4e5f6'` to `{ ...data, id, slug, collection, urlPath }`
98
+ * with no compile error anywhere to catch it — an `/authors/${data.author}` template
99
+ * silently becomes `/authors/[object Object]`. Opting in is a decision per call site, next
100
+ * to the code that reads the field. It also keeps the common batch uses free:
101
+ * `collectStaticPaths` discards `data` outright.
122
102
  *
123
103
  * **Cost, and why it is bounded.** Resolution needs a `ContentStore` and its ContentId
124
- * index, so turning it on adds one index scan per call plus one read per DISTINCT
125
- * referenced entry — not per referencing entry. A single {@link ReferenceResolveCache}
126
- * spans the whole call, so a shared block referenced by 40 pages is read once, not 40
127
- * times. Nothing is constructed and nothing is scanned when this is off.
104
+ * index, so this adds one index scan per call plus one read per DISTINCT referenced entry —
105
+ * not per referencing entry, since a single {@link ReferenceResolveCache} spans the whole
106
+ * call. Nothing is constructed and nothing is scanned when this is off.
128
107
  *
129
108
  * **Path ACLs are not applied to the resolved targets**, matching `read()` exactly: a
130
- * reference can resolve to an entry the user could not `read()` directly. The entries
131
- * being LISTED are still ACL-filtered as always, and a filtered-out entry is never
132
- * resolved at all.
109
+ * reference can resolve to an entry the user could not `read()` directly. The entries being
110
+ * LISTED are still ACL-filtered, and a filtered-out entry is never resolved at all.
133
111
  */
134
112
  resolveReferences?: boolean;
135
113
  }
136
114
  /**
137
- * Server-only path-ACL predicate, applied to raw entries before any of their data
138
- * reaches a caller.
115
+ * Server-only path-ACL predicate, applied to raw entries before any of their data reaches a
116
+ * caller.
139
117
  *
140
118
  * Deliberately NOT part of `ListEntriesOptions`/`BuildContentTreeOptions`: those are
141
- * adopter-facing, and adopter code must not be able to supply, widen, or override the
142
- * access check. `context.ts` is the only intended producer — it builds the predicate
143
- * from `services.createContentAccessChecker` for the request-scoped user, and omits it
144
- * entirely at build time / on static deployments (synthetic admin, no ACLs).
145
- *
146
- * Omitting it preserves the pre-existing unfiltered behavior exactly, which is what
147
- * build-time callers want.
119
+ * adopter-facing, and adopter code must not be able to supply, widen or override the access
120
+ * check. `context.ts` is the only intended producer — it builds the predicate from
121
+ * `services.createContentAccessChecker` for the request-scoped user, and omits it entirely at
122
+ * build time / on static deployments (synthetic admin, no ACLs), leaving the listing
123
+ * unfiltered exactly as build-time callers want.
148
124
  */
149
125
  export interface ContentVisibilityOptions {
150
126
  /** Return false to drop an entry. Receives the entry's branch-root-relative physical path. */
@@ -158,18 +134,16 @@ export type CollectionSchemaItem = Extract<FlatSchemaItem, {
158
134
  * Build the `ContentStore` + shared cache that a batch listing resolves references through.
159
135
  *
160
136
  * Unrelated to the `ReferenceResolver` class in reference-resolver.ts despite the adjacent
161
- * name — that one resolves an id to a human-readable *display label* for the editor UI. This
162
- * resolves a reference to the referenced entry's *data* for server-side listings.
137
+ * name — that one resolves an id to a human-readable display label for the editor UI.
163
138
  *
164
- * Constructed lazily by each listing surface, and ONLY when the caller opted in — a store
139
+ * Constructed lazily by each listing surface, and ONLY when the caller opted in: a store
165
140
  * builds a ContentId index on first use, which is a full scan of the content tree, and the
166
141
  * default (`resolveReferences` off) must stay a pure filesystem walk with no index at all.
167
142
  *
168
- * One store and one cache per listing call, not per collection: the cache is the reason a
143
+ * One store and one cache per listing CALL, not per collection: the cache is the reason a
169
144
  * shared block referenced from 40 pages costs one read instead of 40, so it has to span the
170
- * whole batch. Per-call construction is the established shape here — content-reader.ts's
171
- * `resolveStore` builds a store per read, and content-index-registry.ts holds stores through
172
- * `WeakRef` + a `FinalizationRegistry` precisely so short-lived instances stay collectable.
145
+ * whole batch. content-index-registry.ts holds stores through `WeakRef` + a
146
+ * `FinalizationRegistry`, so these short-lived instances stay collectable.
173
147
  */
174
148
  export declare const createReferenceResolver: (branchRoot: string, flatSchema: FlatSchemaItem[], contentRootName: string) => {
175
149
  store: ContentStore;
@@ -188,41 +162,27 @@ export declare const resolveCollectionItemReferences: (items: CollectionListItem
188
162
  cache: ReferenceResolveCache;
189
163
  }) => Promise<CollectionListItem[]>;
190
164
  /**
191
- * List all content entries as a flat array.
192
- *
193
- * Walks the schema to discover collections, reads entries from each,
194
- * and returns a flat list suitable for generateStaticParams, search indexing, sitemaps, etc.
165
+ * List all content entries as a flat array: walks the schema to discover collections, reads
166
+ * entries from each, and returns a flat list suitable for generateStaticParams, search
167
+ * indexing, sitemaps, etc.
195
168
  *
196
- * Build-time-only failure: a file with a recognized content extension (`.md`/`.mdx`/`.json`/
197
- * `.yaml`) sitting in a collection directory that *looks like an attempted entry* (see
198
- * `looksLikeMalformedEntry` below) but doesn't match `{type}.{slug}.{id}.{ext}` is, by default,
199
- * silently dropped (see `listCollectionEntries`'s debug-gated warning). That is exactly the
200
- * silent-page-loss failure mode static generation must not have — a schema rename without a
201
- * matching file rename, or an entry type declared in one collection but not another, would
202
- * otherwise vanish a page with zero build output. So when `isBuildMode()` is true, any such file
203
- * turns the listing into a thrown error instead (see `findInvalidEntries`/`assertBuildEntriesValid`
204
- * in `static/index.ts` for the sibling schema-validity guard this mirrors). Outside build mode
205
- * (admin UI, content tree, `next dev`) the file is still just skipped, since a fresh scaffold or
206
- * mid-rename file legitimately exists there.
169
+ * Build-time-only failure: a file with a recognized content extension sitting in a collection
170
+ * directory that *looks like an attempted entry* (see `looksLikeMalformedEntry`) but does not
171
+ * match `{type}.{slug}.{id}.{ext}` is silently dropped by default. That is exactly the
172
+ * silent-page-loss static generation must not have -- a schema rename without a matching file
173
+ * rename, or an entry type declared in one collection but not another, would vanish a page with
174
+ * zero build output -- so when `isBuildMode()` is true any such file throws instead
175
+ * (`static/index.ts`'s `assertBuildEntriesValid` is the sibling schema-validity guard).
176
+ * Outside build mode (admin UI, content tree, `next dev`) it is still skipped, since a fresh
177
+ * scaffold or mid-rename file legitimately exists there.
207
178
  *
208
- * A file that was never entry-shaped to begin with — a `README.md`, or a colocated sibling
209
- * artifact named `{contentId}.suffix.ext` per the `entryTransforms`/`readSibling` convention
210
- * documented in the README — is not this guard's failure mode and never throws, in or out of
211
- * build mode. See `looksLikeMalformedEntry` for the exact shape test.
212
- *
213
- * @param branchRoot - Absolute path to the branch workspace root
214
- * @param flatSchema - Flattened schema items (from flattenSchema)
215
- * @param contentRootName - The content root name (e.g. "content")
216
- * @param options - Listing options (extract, filter, rootPath, sort, resolveReferences)
217
- * @param visibility - Internal path-ACL predicate; see `ContentVisibilityOptions`
179
+ * A file that was never entry-shaped -- a `README.md`, or a colocated sibling artifact named
180
+ * `{contentId}.suffix.ext` per the `entryTransforms`/`readSibling` convention -- never throws.
218
181
  */
219
182
  export declare function listEntries<T = Record<string, unknown>>(branchRoot: string, flatSchema: FlatSchemaItem[], contentRootName: string, options?: ListEntriesOptions<T>, visibility?: ContentVisibilityOptions): Promise<ListEntriesItem<T>[]>;
220
183
  /**
221
- * Sort items by a content ID order array.
222
- * Items in the order array come first (in order), items not in the array come at the end
223
- * sorted by the provided fallback key.
224
- *
225
- * Note: sorts the array in-place and returns it.
184
+ * Sort items by a content ID order array: items in `order` come first, in that order, then
185
+ * the rest sorted by `fallbackKey`. Sorts the array in place and returns it.
226
186
  */
227
187
  export declare const sortByOrder: <T extends {
228
188
  contentId?: ContentId;
@@ -235,16 +195,13 @@ export interface SkippedListingFile {
235
195
  collectionPath: LogicalPath;
236
196
  }
237
197
  /**
238
- * List all entries in a collection directory.
239
- * Reads each entry's data (frontmatter or JSON).
198
+ * List all entries in a collection directory, reading each entry's data.
240
199
  *
241
- * @param onSkip - Called for every file that has a recognized content extension, doesn't match
242
- * the `{type}.{slug}.{id}.{ext}` grammar (see `parseTypedFilename`), AND structurally looks
243
- * like an attempted entry (see `looksLikeMalformedEntry`). A file that was never entry-shaped
244
- * (too few dot-separated segments to ever be a valid entry — a `README.md`, a colocated
245
- * sibling artifact) is always silently dropped with a debug-gated `log.warn`, never passed to
246
- * `onSkip`. Optional and purely a diagnostic hook — existing callers that omit it keep the
247
- * exact prior behavior. `listEntries` below uses this to turn the skip into a hard build-time
248
- * failure instead of a silent one.
200
+ * `onSkip` is called for every file that has a recognized content extension, does NOT match
201
+ * the `{type}.{slug}.{id}.{ext}` grammar (see `parseTypedFilename`), AND structurally looks
202
+ * like an attempted entry (see `looksLikeMalformedEntry`). A file that was never entry-shaped
203
+ * -- a `README.md`, a colocated sibling artifact -- is always dropped with a debug-gated
204
+ * `log.warn` and never passed to `onSkip`. Optional and purely diagnostic: `listEntries` uses
205
+ * it to turn the skip into a hard build-time failure instead of a silent one.
249
206
  */
250
207
  export declare const listCollectionEntries: (root: string, collection: FlatSchemaItem, onSkip?: (file: SkippedListingFile) => void) => Promise<CollectionListItem[]>;