canopycms 0.0.68-int.98 → 0.1.0

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 (688) hide show
  1. package/CHANGELOG.md +2131 -0
  2. package/README.md +47 -63
  3. package/dist/ai/generate.d.ts +5 -0
  4. package/dist/ai/generate.js +244 -115
  5. package/dist/ai/index.d.ts +1 -1
  6. package/dist/ai/json-to-markdown.d.ts +21 -1
  7. package/dist/ai/json-to-markdown.js +120 -57
  8. package/dist/ai/references.d.ts +72 -0
  9. package/dist/ai/references.js +223 -0
  10. package/dist/ai/resolve-branch.js +9 -2
  11. package/dist/ai/to-plain-text.d.ts +17 -8
  12. package/dist/ai/to-plain-text.js +18 -15
  13. package/dist/ai/types.d.ts +84 -3
  14. package/dist/api/admin-branch-health.d.ts +24 -1
  15. package/dist/api/admin-branch-health.js +52 -20
  16. package/dist/api/admin.d.ts +23 -5
  17. package/dist/api/admin.js +36 -1
  18. package/dist/api/assets.js +88 -78
  19. package/dist/api/branch-create-window.d.ts +12 -0
  20. package/dist/api/branch-create-window.js +13 -0
  21. package/dist/api/branch-merge.d.ts +1 -1
  22. package/dist/api/branch-merge.js +1 -1
  23. package/dist/api/branch-review.d.ts +3 -3
  24. package/dist/api/branch-review.js +16 -7
  25. package/dist/api/branch-status.d.ts +16 -6
  26. package/dist/api/branch-status.js +57 -12
  27. package/dist/api/branch-withdraw.d.ts +2 -2
  28. package/dist/api/branch-withdraw.js +8 -3
  29. package/dist/api/branch.d.ts +25 -12
  30. package/dist/api/branch.js +164 -103
  31. package/dist/api/client.d.ts +78 -58
  32. package/dist/api/client.js +150 -117
  33. package/dist/api/comments.d.ts +12 -3
  34. package/dist/api/comments.js +118 -9
  35. package/dist/api/content.d.ts +9 -9
  36. package/dist/api/content.js +131 -22
  37. package/dist/api/entries-constants.d.ts +14 -3
  38. package/dist/api/entries-constants.js +14 -3
  39. package/dist/api/entries.d.ts +40 -2
  40. package/dist/api/entries.js +102 -6
  41. package/dist/api/github-sync.d.ts +19 -0
  42. package/dist/api/github-sync.js +50 -3
  43. package/dist/api/groups.d.ts +4 -4
  44. package/dist/api/groups.js +2 -1
  45. package/dist/api/guards.js +23 -3
  46. package/dist/api/index.d.ts +3 -1
  47. package/dist/api/index.js +1 -0
  48. package/dist/api/permissions.d.ts +21 -2
  49. package/dist/api/permissions.js +50 -3
  50. package/dist/api/request-deadline.d.ts +59 -0
  51. package/dist/api/request-deadline.js +73 -0
  52. package/dist/api/resolve-references.js +8 -7
  53. package/dist/api/route-builder.d.ts +14 -0
  54. package/dist/api/route-builder.js +14 -1
  55. package/dist/api/schema.d.ts +11 -9
  56. package/dist/api/schema.js +2 -0
  57. package/dist/api/settings-helpers.d.ts +5 -1
  58. package/dist/api/settings-helpers.js +10 -2
  59. package/dist/api/types.d.ts +18 -0
  60. package/dist/api/users-constants.d.ts +6 -0
  61. package/dist/api/users-constants.js +6 -0
  62. package/dist/assets/asset-url.d.ts +28 -16
  63. package/dist/assets/asset-url.js +51 -25
  64. package/dist/assets/finalize.js +3 -0
  65. package/dist/assets/index.d.ts +1 -1
  66. package/dist/assets/materialize.d.ts +153 -0
  67. package/dist/assets/materialize.js +402 -0
  68. package/dist/assets/store-local.d.ts +19 -5
  69. package/dist/assets/store-local.js +69 -10
  70. package/dist/assets/store-s3.d.ts +38 -7
  71. package/dist/assets/store-s3.js +128 -22
  72. package/dist/assets/transform-directives.d.ts +52 -13
  73. package/dist/assets/transform-directives.js +87 -27
  74. package/dist/assets/transform.d.ts +3 -3
  75. package/dist/assets/transform.js +13 -8
  76. package/dist/assets/types.d.ts +31 -4
  77. package/dist/auth/cache.d.ts +1 -1
  78. package/dist/auth/cache.js +1 -1
  79. package/dist/auth/caching-auth-plugin.d.ts +2 -0
  80. package/dist/auth/caching-auth-plugin.js +12 -2
  81. package/dist/auth/file-based-auth-cache.d.ts +8 -0
  82. package/dist/auth/file-based-auth-cache.js +18 -8
  83. package/dist/auth/person-name.d.ts +5 -0
  84. package/dist/auth/person-name.js +8 -0
  85. package/dist/auth/plugin.d.ts +10 -1
  86. package/dist/auth/types.d.ts +2 -0
  87. package/dist/auth/user-metadata-lookup.d.ts +21 -0
  88. package/dist/auth/user-metadata-lookup.js +116 -0
  89. package/dist/authorization/branch.d.ts +1 -1
  90. package/dist/authorization/branch.js +12 -13
  91. package/dist/authorization/groups/schema.d.ts +4 -4
  92. package/dist/authorization/helpers.d.ts +8 -0
  93. package/dist/authorization/helpers.js +8 -0
  94. package/dist/authorization/index.d.ts +1 -1
  95. package/dist/authorization/index.js +1 -1
  96. package/dist/authorization/protected-branch.d.ts +5 -4
  97. package/dist/authorization/protected-branch.js +7 -5
  98. package/dist/branch-health.d.ts +35 -8
  99. package/dist/branch-health.js +54 -18
  100. package/dist/branch-metadata-error.d.ts +27 -0
  101. package/dist/branch-metadata-error.js +23 -0
  102. package/dist/branch-metadata-file.d.ts +205 -24
  103. package/dist/branch-metadata-file.js +126 -25
  104. package/dist/branch-metadata.d.ts +45 -6
  105. package/dist/branch-metadata.js +142 -50
  106. package/dist/branch-provisioning.d.ts +167 -0
  107. package/dist/branch-provisioning.js +501 -0
  108. package/dist/branch-registry.d.ts +8 -0
  109. package/dist/branch-registry.js +61 -9
  110. package/dist/branch-schema-cache.d.ts +29 -12
  111. package/dist/branch-schema-cache.js +64 -21
  112. package/dist/branch-sparse.d.ts +23 -0
  113. package/dist/branch-sparse.js +118 -0
  114. package/dist/branch-workspace.d.ts +42 -3
  115. package/dist/branch-workspace.js +239 -100
  116. package/dist/build/asset-refs.d.ts +94 -0
  117. package/dist/build/asset-refs.js +267 -0
  118. package/dist/build/generate-ai-content.js +5 -0
  119. package/dist/build/inline-flight.d.ts +37 -0
  120. package/dist/build/inline-flight.js +142 -0
  121. package/dist/cli/asset-refs.d.ts +52 -0
  122. package/dist/cli/asset-refs.js +194 -0
  123. package/dist/cli/cli.d.ts +15 -1
  124. package/dist/cli/cli.js +8543 -3193
  125. package/dist/cli/configured-asset-store.d.ts +12 -0
  126. package/dist/cli/configured-asset-store.js +46 -0
  127. package/dist/cli/generate-ai-content.js +4244 -1072
  128. package/dist/cli/init.js +217 -126
  129. package/dist/cli/project-detect.d.ts +2 -0
  130. package/dist/cli/project-detect.js +2 -0
  131. package/dist/cli/template-files/Dockerfile.cms.template +13 -5
  132. package/dist/cli/template-files/cms-stack.ts.template +16 -13
  133. package/dist/client.d.ts +1 -2
  134. package/dist/client.js +1 -2
  135. package/dist/comment-store.d.ts +25 -0
  136. package/dist/comment-store.js +43 -8
  137. package/dist/config/flatten.js +2 -0
  138. package/dist/config/helpers.js +2 -2
  139. package/dist/config/index.d.ts +1 -1
  140. package/dist/config/schemas/config.d.ts +12 -29
  141. package/dist/config/schemas/config.js +9 -12
  142. package/dist/config/schemas/field.d.ts +3 -0
  143. package/dist/config/schemas/field.js +58 -4
  144. package/dist/config/schemas/media.d.ts +4 -13
  145. package/dist/config/schemas/media.js +5 -8
  146. package/dist/config/schemas/url.d.ts +2 -20
  147. package/dist/config/schemas/url.js +2 -25
  148. package/dist/config/types.d.ts +116 -22
  149. package/dist/config/types.js +3 -9
  150. package/dist/config/validation.d.ts +25 -4
  151. package/dist/config/validation.js +116 -3
  152. package/dist/content-id-index.js +2 -2
  153. package/dist/content-index-generation.d.ts +1 -1
  154. package/dist/content-index-generation.js +1 -1
  155. package/dist/content-listing.d.ts +10 -1
  156. package/dist/content-listing.js +22 -5
  157. package/dist/content-reader.d.ts +9 -0
  158. package/dist/content-reader.js +16 -11
  159. package/dist/content-store.d.ts +75 -12
  160. package/dist/content-store.js +249 -86
  161. package/dist/content-tree.js +2 -2
  162. package/dist/context.js +5 -2
  163. package/dist/dangling-reference-log.d.ts +17 -0
  164. package/dist/dangling-reference-log.js +29 -0
  165. package/dist/dev-content-watcher.d.ts +1 -1
  166. package/dist/dev-content-watcher.js +1 -1
  167. package/dist/editor/BranchManager.d.ts +23 -7
  168. package/dist/editor/BranchManager.js +119 -54
  169. package/dist/editor/CanopyEditor.d.ts +1 -1
  170. package/dist/editor/CanopyEditor.js +1 -2
  171. package/dist/editor/CommentsPanel.d.ts +14 -0
  172. package/dist/editor/CommentsPanel.js +68 -43
  173. package/dist/editor/Editor.d.ts +11 -5
  174. package/dist/editor/Editor.js +891 -218
  175. package/dist/editor/EditorAuthGate.d.ts +7 -1
  176. package/dist/editor/EditorAuthGate.js +41 -9
  177. package/dist/editor/EntryNavigator.d.ts +22 -0
  178. package/dist/editor/EntryNavigator.js +353 -105
  179. package/dist/editor/FormHeader.d.ts +25 -0
  180. package/dist/editor/FormHeader.js +82 -0
  181. package/dist/editor/FormRenderer.d.ts +27 -3
  182. package/dist/editor/FormRenderer.js +171 -76
  183. package/dist/editor/PreviewFrame.d.ts +40 -0
  184. package/dist/editor/PreviewFrame.js +215 -0
  185. package/dist/editor/PreviewPane.d.ts +47 -0
  186. package/dist/editor/PreviewPane.js +147 -0
  187. package/dist/editor/PreviewToolbarTools.d.ts +22 -0
  188. package/dist/editor/PreviewToolbarTools.js +73 -0
  189. package/dist/editor/admin/SystemHealthPanel.d.ts +2 -1
  190. package/dist/editor/admin/SystemHealthPanel.js +163 -33
  191. package/dist/editor/admin/useSystemHealth.d.ts +18 -0
  192. package/dist/editor/admin/useSystemHealth.js +70 -1
  193. package/dist/editor/branch-status.d.ts +17 -0
  194. package/dist/editor/branch-status.js +29 -0
  195. package/dist/editor/canopy-path.d.ts +9 -6
  196. package/dist/editor/canopy-path.js +8 -11
  197. package/dist/editor/client-reference-resolver.d.ts +43 -16
  198. package/dist/editor/client-reference-resolver.js +155 -64
  199. package/dist/editor/comments/BranchComments.d.ts +1 -1
  200. package/dist/editor/comments/BranchComments.js +2 -2
  201. package/dist/editor/comments/CloseRefusedNotice.d.ts +4 -0
  202. package/dist/editor/comments/CloseRefusedNotice.js +7 -0
  203. package/dist/editor/comments/CommentThreadsPopover.d.ts +47 -0
  204. package/dist/editor/comments/CommentThreadsPopover.js +274 -0
  205. package/dist/editor/comments/CommentWriteAlert.d.ts +11 -0
  206. package/dist/editor/comments/CommentWriteAlert.js +13 -0
  207. package/dist/editor/comments/EntryComments.d.ts +10 -4
  208. package/dist/editor/comments/EntryComments.js +14 -17
  209. package/dist/editor/comments/FieldWrapper.d.ts +18 -4
  210. package/dist/editor/comments/FieldWrapper.js +62 -28
  211. package/dist/editor/comments/InlineCommentThread.d.ts +9 -2
  212. package/dist/editor/comments/InlineCommentThread.js +11 -47
  213. package/dist/editor/comments/ThreadCarousel.d.ts +1 -1
  214. package/dist/editor/comments/ThreadCarousel.js +18 -21
  215. package/dist/editor/comments/ThreadReplyControls.d.ts +28 -0
  216. package/dist/editor/comments/ThreadReplyControls.js +92 -0
  217. package/dist/editor/comments/field-comment-context.d.ts +14 -0
  218. package/dist/editor/comments/field-comment-context.js +14 -0
  219. package/dist/editor/comments/form-comments.d.ts +48 -0
  220. package/dist/editor/comments/form-comments.js +178 -0
  221. package/dist/editor/comments/item-anchor-copy.d.ts +6 -0
  222. package/dist/editor/comments/item-anchor-copy.js +6 -0
  223. package/dist/editor/comments/move-focus-if-unmoved.d.ts +6 -0
  224. package/dist/editor/comments/move-focus-if-unmoved.js +11 -0
  225. package/dist/editor/comments/popover-placement.d.ts +18 -0
  226. package/dist/editor/comments/popover-placement.js +58 -0
  227. package/dist/editor/comments/use-tracked-writes.d.ts +16 -0
  228. package/dist/editor/comments/use-tracked-writes.js +53 -0
  229. package/dist/editor/components/BranchAccessList.d.ts +15 -0
  230. package/dist/editor/components/BranchAccessList.js +52 -0
  231. package/dist/editor/components/BranchLockBanner.d.ts +22 -0
  232. package/dist/editor/components/BranchLockBanner.js +39 -0
  233. package/dist/editor/components/BranchPill.d.ts +32 -0
  234. package/dist/editor/components/BranchPill.js +33 -0
  235. package/dist/editor/components/BranchesDrawer.d.ts +11 -0
  236. package/dist/editor/components/BranchesDrawer.js +5 -0
  237. package/dist/editor/components/ConfirmDeleteModal.d.ts +6 -1
  238. package/dist/editor/components/ConfirmDeleteModal.js +3 -2
  239. package/dist/editor/components/DestructiveMenuItem.d.ts +7 -0
  240. package/dist/editor/components/DestructiveMenuItem.js +8 -0
  241. package/dist/editor/components/EditorCrashScreen.d.ts +17 -0
  242. package/dist/editor/components/EditorCrashScreen.js +22 -0
  243. package/dist/editor/components/EditorErrorBoundary.d.ts +38 -0
  244. package/dist/editor/components/EditorErrorBoundary.js +40 -0
  245. package/dist/editor/components/EditorHeader.d.ts +56 -106
  246. package/dist/editor/components/EditorHeader.js +130 -131
  247. package/dist/editor/components/EditorRail.d.ts +49 -0
  248. package/dist/editor/components/EditorRail.js +65 -0
  249. package/dist/editor/components/EntryBreadcrumb.d.ts +33 -0
  250. package/dist/editor/components/EntryBreadcrumb.js +56 -0
  251. package/dist/editor/components/EntryCreateModal.d.ts +12 -7
  252. package/dist/editor/components/EntryCreateModal.js +51 -57
  253. package/dist/editor/components/NoEditPermissionNotice.d.ts +6 -5
  254. package/dist/editor/components/NoEditPermissionNotice.js +5 -4
  255. package/dist/editor/components/QuickOpenPalette.d.ts +22 -0
  256. package/dist/editor/components/QuickOpenPalette.js +66 -0
  257. package/dist/editor/components/ReadOnlyDraftNotice.d.ts +11 -0
  258. package/dist/editor/components/ReadOnlyDraftNotice.js +12 -0
  259. package/dist/editor/components/ReasonedMenuItem.d.ts +15 -0
  260. package/dist/editor/components/ReasonedMenuItem.js +15 -0
  261. package/dist/editor/components/ReferencedByList.d.ts +11 -0
  262. package/dist/editor/components/ReferencedByList.js +28 -0
  263. package/dist/editor/components/RelativeTime.d.ts +10 -0
  264. package/dist/editor/components/RelativeTime.js +10 -0
  265. package/dist/editor/components/RenameEntryModal.d.ts +9 -1
  266. package/dist/editor/components/RenameEntryModal.js +19 -31
  267. package/dist/editor/components/RetryToastMessage.d.ts +9 -0
  268. package/dist/editor/components/RetryToastMessage.js +6 -0
  269. package/dist/editor/components/SaveAllResult.d.ts +25 -0
  270. package/dist/editor/components/SaveAllResult.js +86 -0
  271. package/dist/editor/components/SaveSplitButton.d.ts +30 -0
  272. package/dist/editor/components/SaveSplitButton.js +108 -0
  273. package/dist/editor/components/StagedChangesDrawer.d.ts +39 -0
  274. package/dist/editor/components/StagedChangesDrawer.js +92 -0
  275. package/dist/editor/components/UnavailableEntryNotice.d.ts +6 -0
  276. package/dist/editor/components/UnavailableEntryNotice.js +9 -0
  277. package/dist/editor/components/UnavailableTypeMessage.d.ts +6 -0
  278. package/dist/editor/components/UnavailableTypeMessage.js +9 -0
  279. package/dist/editor/components/UndoToastMessage.d.ts +18 -0
  280. package/dist/editor/components/UndoToastMessage.js +10 -0
  281. package/dist/editor/components/UserBadge.d.ts +2 -5
  282. package/dist/editor/components/UserBadge.js +62 -33
  283. package/dist/editor/components/ValidationSummary.d.ts +14 -0
  284. package/dist/editor/components/ValidationSummary.js +24 -0
  285. package/dist/editor/components/index.d.ts +2 -2
  286. package/dist/editor/components/index.js +2 -2
  287. package/dist/editor/context/ApiClientContext.d.ts +8 -2
  288. package/dist/editor/context/ApiClientContext.js +19 -8
  289. package/dist/editor/context/AssetContext.d.ts +13 -35
  290. package/dist/editor/context/AssetContext.js +12 -31
  291. package/dist/editor/context/EditorStateContext.d.ts +4 -4
  292. package/dist/editor/context/EditorStateContext.js +4 -4
  293. package/dist/editor/context/SWRProvider.d.ts +3 -3
  294. package/dist/editor/context/SiteMdxAllowContext.d.ts +4 -0
  295. package/dist/editor/context/SiteMdxAllowContext.js +7 -0
  296. package/dist/editor/context/index.d.ts +2 -1
  297. package/dist/editor/context/index.js +2 -1
  298. package/dist/editor/contrast.d.ts +19 -0
  299. package/dist/editor/contrast.js +41 -0
  300. package/dist/editor/copy.d.ts +18 -0
  301. package/dist/editor/copy.js +18 -0
  302. package/dist/editor/editor-config.js +16 -0
  303. package/dist/editor/editor-utils.d.ts +34 -8
  304. package/dist/editor/editor-utils.js +42 -20
  305. package/dist/editor/entry-search.d.ts +20 -0
  306. package/dist/editor/entry-search.js +34 -0
  307. package/dist/editor/field-breadcrumb.d.ts +12 -0
  308. package/dist/editor/field-breadcrumb.js +85 -0
  309. package/dist/editor/field-props.d.ts +86 -0
  310. package/dist/editor/field-props.js +27 -0
  311. package/dist/editor/field-target.d.ts +30 -0
  312. package/dist/editor/field-target.js +77 -0
  313. package/dist/editor/fields/BlockField.d.ts +12 -0
  314. package/dist/editor/fields/BlockField.js +89 -73
  315. package/dist/editor/fields/CodeField.d.ts +2 -0
  316. package/dist/editor/fields/CodeField.js +6 -2
  317. package/dist/editor/fields/DateTimeField.d.ts +4 -29
  318. package/dist/editor/fields/DateTimeField.js +79 -41
  319. package/dist/editor/fields/ExpandAllButton.d.ts +6 -0
  320. package/dist/editor/fields/ExpandAllButton.js +4 -0
  321. package/dist/editor/fields/FieldCrashFallback.d.ts +17 -0
  322. package/dist/editor/fields/FieldCrashFallback.js +30 -0
  323. package/dist/editor/fields/FieldLabel.d.ts +37 -0
  324. package/dist/editor/fields/FieldLabel.js +19 -0
  325. package/dist/editor/fields/ImageField.d.ts +4 -0
  326. package/dist/editor/fields/ImageField.js +29 -14
  327. package/dist/editor/fields/InlineGroupField.js +4 -3
  328. package/dist/editor/fields/ItemList.d.ts +42 -0
  329. package/dist/editor/fields/ItemList.js +130 -0
  330. package/dist/editor/fields/MarkdownField.d.ts +32 -0
  331. package/dist/editor/fields/MarkdownField.js +223 -46
  332. package/dist/editor/fields/MdxImageDialog.js +1 -1
  333. package/dist/editor/fields/NumberField.d.ts +2 -0
  334. package/dist/editor/fields/NumberField.js +8 -5
  335. package/dist/editor/fields/NumberListField.d.ts +2 -0
  336. package/dist/editor/fields/NumberListField.js +19 -16
  337. package/dist/editor/fields/ObjectField.d.ts +2 -7
  338. package/dist/editor/fields/ObjectField.js +15 -5
  339. package/dist/editor/fields/ObjectListField.d.ts +29 -0
  340. package/dist/editor/fields/ObjectListField.js +57 -0
  341. package/dist/editor/fields/ReferenceField.d.ts +2 -0
  342. package/dist/editor/fields/ReferenceField.js +34 -9
  343. package/dist/editor/fields/SelectField.d.ts +2 -0
  344. package/dist/editor/fields/SelectField.js +11 -2
  345. package/dist/editor/fields/StringListField.d.ts +4 -1
  346. package/dist/editor/fields/StringListField.js +22 -8
  347. package/dist/editor/fields/TextField.d.ts +2 -0
  348. package/dist/editor/fields/TextField.js +6 -2
  349. package/dist/editor/fields/ToggleField.d.ts +2 -0
  350. package/dist/editor/fields/ToggleField.js +8 -3
  351. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +1 -1
  352. package/dist/editor/fields/entry-link/InsertEntryLink.js +1 -1
  353. package/dist/editor/fields/form-expansion.d.ts +9 -0
  354. package/dist/editor/fields/form-expansion.js +2 -0
  355. package/dist/editor/fields/item-expansion.d.ts +15 -0
  356. package/dist/editor/fields/item-expansion.js +60 -0
  357. package/dist/editor/fields/list-item-keys.d.ts +8 -0
  358. package/dist/editor/fields/list-item-keys.js +50 -0
  359. package/dist/editor/fields/list-item-title.d.ts +20 -0
  360. package/dist/editor/fields/list-item-title.js +85 -0
  361. package/dist/editor/fields/markdown-export-options.d.ts +2 -0
  362. package/dist/editor/fields/markdown-export-options.js +8 -0
  363. package/dist/editor/fields/markdown-fidelity-visitors.d.ts +11 -0
  364. package/dist/editor/fields/markdown-fidelity-visitors.js +160 -0
  365. package/dist/editor/fields/mdx-jsx-support.d.ts +5 -1
  366. package/dist/editor/fields/mdx-jsx-support.js +157 -69
  367. package/dist/editor/fields/rich-text-failures.d.ts +5 -0
  368. package/dist/editor/fields/rich-text-failures.js +26 -0
  369. package/dist/editor/fields/toolbar-wrap.d.ts +7 -0
  370. package/dist/editor/fields/toolbar-wrap.js +35 -0
  371. package/dist/editor/form-outline.d.ts +13 -0
  372. package/dist/editor/form-outline.js +70 -0
  373. package/dist/editor/group-manager/GroupCard.d.ts +4 -1
  374. package/dist/editor/group-manager/GroupCard.js +12 -3
  375. package/dist/editor/group-manager/GroupForm.js +1 -1
  376. package/dist/editor/group-manager/InternalGroupsTab.d.ts +2 -1
  377. package/dist/editor/group-manager/InternalGroupsTab.js +4 -4
  378. package/dist/editor/group-manager/MemberList.d.ts +2 -1
  379. package/dist/editor/group-manager/MemberList.js +15 -4
  380. package/dist/editor/group-manager/hooks/useGroupState.d.ts +5 -0
  381. package/dist/editor/group-manager/hooks/useGroupState.js +30 -7
  382. package/dist/editor/group-manager/index.js +34 -5
  383. package/dist/editor/group-manager/types.d.ts +5 -2
  384. package/dist/editor/hooks/create-branch-request.d.ts +20 -0
  385. package/dist/editor/hooks/create-branch-request.js +54 -0
  386. package/dist/editor/hooks/save-all.d.ts +68 -0
  387. package/dist/editor/hooks/save-all.js +61 -0
  388. package/dist/editor/hooks/useBranchActions.d.ts +11 -1
  389. package/dist/editor/hooks/useBranchActions.js +42 -19
  390. package/dist/editor/hooks/useBranchManager.d.ts +21 -0
  391. package/dist/editor/hooks/useBranchManager.js +321 -125
  392. package/dist/editor/hooks/useBranchesData.d.ts +8 -4
  393. package/dist/editor/hooks/useBranchesData.js +9 -5
  394. package/dist/editor/hooks/useCommentSystem.d.ts +14 -2
  395. package/dist/editor/hooks/useCommentSystem.js +79 -55
  396. package/dist/editor/hooks/useCommentsData.d.ts +11 -7
  397. package/dist/editor/hooks/useCommentsData.js +20 -19
  398. package/dist/editor/hooks/useDraftManager.d.ts +77 -3
  399. package/dist/editor/hooks/useDraftManager.js +887 -94
  400. package/dist/editor/hooks/useEditorLayout.d.ts +53 -7
  401. package/dist/editor/hooks/useEditorLayout.js +98 -20
  402. package/dist/editor/hooks/useEntriesData.d.ts +2 -1
  403. package/dist/editor/hooks/useEntriesData.js +18 -4
  404. package/dist/editor/hooks/useEntryManager.d.ts +41 -2
  405. package/dist/editor/hooks/useEntryManager.js +227 -41
  406. package/dist/editor/hooks/useGroupManager.js +13 -16
  407. package/dist/editor/hooks/usePermissionManager.js +14 -6
  408. package/dist/editor/hooks/usePreviewMarks.d.ts +21 -0
  409. package/dist/editor/hooks/usePreviewMarks.js +33 -0
  410. package/dist/editor/hooks/useReferenceResolution.d.ts +10 -3
  411. package/dist/editor/hooks/useReferenceResolution.js +34 -177
  412. package/dist/editor/hooks/useSchemaManager.d.ts +25 -6
  413. package/dist/editor/hooks/useSchemaManager.js +97 -39
  414. package/dist/editor/hooks/useUserMetadata.d.ts +14 -4
  415. package/dist/editor/hooks/useUserMetadata.js +76 -47
  416. package/dist/editor/hooks/user-metadata-batcher.d.ts +8 -0
  417. package/dist/editor/hooks/user-metadata-batcher.js +33 -0
  418. package/dist/editor/media/AssetCard.d.ts +6 -7
  419. package/dist/editor/media/AssetCard.js +24 -31
  420. package/dist/editor/media/AssetListRow.d.ts +16 -0
  421. package/dist/editor/media/AssetListRow.js +41 -0
  422. package/dist/editor/media/CropStep.js +6 -1
  423. package/dist/editor/media/MediaLibrary.d.ts +4 -3
  424. package/dist/editor/media/MediaLibrary.js +11 -4
  425. package/dist/editor/media/MediaLibraryBody.d.ts +3 -3
  426. package/dist/editor/media/MediaLibraryBody.js +195 -80
  427. package/dist/editor/media/MediaLibrarySkeleton.d.ts +6 -0
  428. package/dist/editor/media/MediaLibrarySkeleton.js +14 -0
  429. package/dist/editor/media/crop-math.d.ts +3 -4
  430. package/dist/editor/media/crop-math.js +11 -22
  431. package/dist/editor/media/editor-image-src.d.ts +8 -0
  432. package/dist/editor/media/editor-image-src.js +10 -0
  433. package/dist/editor/media/format-bytes.d.ts +2 -0
  434. package/dist/editor/media/format-bytes.js +23 -0
  435. package/dist/editor/media/media-library-prefs.d.ts +23 -0
  436. package/dist/editor/media/media-library-prefs.js +49 -0
  437. package/dist/editor/media/media-library-view.d.ts +34 -0
  438. package/dist/editor/media/media-library-view.js +40 -0
  439. package/dist/editor/media/useAssetLibrary.d.ts +30 -0
  440. package/dist/editor/media/useAssetLibrary.js +126 -0
  441. package/dist/editor/media/useStableAssetOrder.d.ts +11 -0
  442. package/dist/editor/media/useStableAssetOrder.js +37 -0
  443. package/dist/editor/media/useThumbnailFailure.d.ts +6 -0
  444. package/dist/editor/media/useThumbnailFailure.js +16 -0
  445. package/dist/editor/permission-manager/GroupSelector.js +2 -2
  446. package/dist/editor/permission-manager/PermissionEditor.d.ts +1 -1
  447. package/dist/editor/permission-manager/PermissionEditor.js +15 -4
  448. package/dist/editor/permission-manager/PermissionLevelBadge.js +1 -1
  449. package/dist/editor/permission-manager/PermissionTree.d.ts +1 -1
  450. package/dist/editor/permission-manager/UserSelector.d.ts +1 -1
  451. package/dist/editor/permission-manager/UserSelector.js +3 -3
  452. package/dist/editor/permission-manager/index.js +12 -3
  453. package/dist/editor/permission-manager/types.d.ts +5 -2
  454. package/dist/editor/platform.d.ts +3 -0
  455. package/dist/editor/platform.js +9 -0
  456. package/dist/editor/preview-asset-base.d.ts +9 -0
  457. package/dist/editor/preview-asset-base.js +17 -0
  458. package/dist/editor/preview-bridge.d.ts +51 -27
  459. package/dist/editor/preview-bridge.js +103 -144
  460. package/dist/editor/preview-marks.d.ts +15 -0
  461. package/dist/editor/preview-marks.js +74 -0
  462. package/dist/editor/preview-path.d.ts +12 -0
  463. package/dist/editor/preview-path.js +45 -1
  464. package/dist/editor/preview-scale.d.ts +27 -0
  465. package/dist/editor/preview-scale.js +34 -0
  466. package/dist/editor/raw-asset-base.d.ts +5 -0
  467. package/dist/editor/raw-asset-base.js +14 -0
  468. package/dist/editor/relative-time.d.ts +4 -4
  469. package/dist/editor/relative-time.js +16 -8
  470. package/dist/editor/schema-editor/CollectionEditor.d.ts +20 -3
  471. package/dist/editor/schema-editor/CollectionEditor.js +361 -62
  472. package/dist/editor/schema-editor/EntryTypeEditor.d.ts +5 -1
  473. package/dist/editor/schema-editor/EntryTypeEditor.js +11 -6
  474. package/dist/editor/schema-editor/collection-draft.d.ts +22 -0
  475. package/dist/editor/schema-editor/collection-draft.js +40 -0
  476. package/dist/editor/schema-editor/index.d.ts +1 -1
  477. package/dist/editor/schema-label.d.ts +10 -0
  478. package/dist/editor/schema-label.js +17 -0
  479. package/dist/editor/settings-conflict.d.ts +5 -0
  480. package/dist/editor/settings-conflict.js +8 -0
  481. package/dist/editor/shell/ActivityRail.d.ts +37 -0
  482. package/dist/editor/shell/ActivityRail.js +91 -0
  483. package/dist/editor/shell/EditorShell.d.ts +17 -0
  484. package/dist/editor/shell/EditorShell.js +31 -0
  485. package/dist/editor/shell/PaneLayout.d.ts +28 -0
  486. package/dist/editor/shell/PaneLayout.js +116 -0
  487. package/dist/editor/shell/SidePanelHost.d.ts +35 -0
  488. package/dist/editor/shell/SidePanelHost.js +184 -0
  489. package/dist/editor/shell/TopBar.d.ts +12 -0
  490. package/dist/editor/shell/TopBar.js +14 -0
  491. package/dist/editor/shell/host-chrome.d.ts +16 -0
  492. package/dist/editor/shell/host-chrome.js +69 -0
  493. package/dist/editor/slug.d.ts +16 -0
  494. package/dist/editor/slug.js +43 -0
  495. package/dist/editor/theme.d.ts +2 -1
  496. package/dist/editor/theme.js +314 -13
  497. package/dist/editor/unanswered.d.ts +17 -0
  498. package/dist/editor/unanswered.js +26 -0
  499. package/dist/editor/unavailable-entry-type.d.ts +20 -0
  500. package/dist/editor/unavailable-entry-type.js +28 -0
  501. package/dist/editor/undo-removal.d.ts +57 -0
  502. package/dist/editor/undo-removal.js +163 -0
  503. package/dist/editor/user-display.d.ts +4 -0
  504. package/dist/editor/user-display.js +5 -0
  505. package/dist/editor/utils/confirm-modal.d.ts +8 -0
  506. package/dist/editor/utils/confirm-modal.js +12 -0
  507. package/dist/editor/utils/editor-errors.d.ts +19 -0
  508. package/dist/editor/utils/editor-errors.js +32 -0
  509. package/dist/editor/utils/focus-return.d.ts +56 -0
  510. package/dist/editor/utils/focus-return.js +106 -0
  511. package/dist/entry-link-resolver.d.ts +11 -1
  512. package/dist/entry-link-resolver.js +65 -5
  513. package/dist/entry-schema-registry.d.ts +3 -3
  514. package/dist/entry-schema-registry.js +7 -4
  515. package/dist/entry-schema.d.ts +49 -3
  516. package/dist/entry-schema.js +18 -0
  517. package/dist/git-manager.d.ts +172 -10
  518. package/dist/git-manager.js +449 -107
  519. package/dist/github-service.d.ts +39 -2
  520. package/dist/github-service.js +101 -7
  521. package/dist/http/handler.js +74 -9
  522. package/dist/http/types.d.ts +2 -0
  523. package/dist/http/worker-not-ready.d.ts +9 -4
  524. package/dist/http/worker-not-ready.js +59 -6
  525. package/dist/index.d.ts +2 -0
  526. package/dist/index.js +3 -0
  527. package/dist/item-keys.d.ts +46 -0
  528. package/dist/item-keys.js +235 -0
  529. package/dist/operating-mode/editor-mode-check.d.ts +15 -0
  530. package/dist/operating-mode/editor-mode-check.js +24 -0
  531. package/dist/operating-mode/mode-env.d.ts +13 -14
  532. package/dist/operating-mode/mode-env.js +13 -14
  533. package/dist/operating-mode/types.d.ts +2 -2
  534. package/dist/paths/branch.d.ts +0 -1
  535. package/dist/paths/branch.js +1 -8
  536. package/dist/paths/index.d.ts +1 -1
  537. package/dist/paths/index.js +1 -1
  538. package/dist/paths/validation.js +0 -2
  539. package/dist/preview.d.ts +8 -0
  540. package/dist/preview.js +7 -0
  541. package/dist/reference-resolver.js +1 -0
  542. package/dist/resolve-canopy-user.d.ts +1 -1
  543. package/dist/resolve-canopy-user.js +1 -1
  544. package/dist/schema/meta-loader.d.ts +18 -8
  545. package/dist/schema/meta-loader.js +42 -9
  546. package/dist/schema/registry-fingerprint.d.ts +14 -0
  547. package/dist/schema/registry-fingerprint.js +63 -0
  548. package/dist/schema/resolver.d.ts +7 -4
  549. package/dist/schema/resolver.js +7 -6
  550. package/dist/schema/schema-store.d.ts +7 -10
  551. package/dist/schema/schema-store.js +13 -11
  552. package/dist/schema/schema-unavailable-error.d.ts +11 -0
  553. package/dist/schema/schema-unavailable-error.js +15 -0
  554. package/dist/schema/types.d.ts +22 -0
  555. package/dist/schema-registry-record.d.ts +35 -0
  556. package/dist/schema-registry-record.js +134 -0
  557. package/dist/server.d.ts +79 -9
  558. package/dist/server.js +62 -8
  559. package/dist/services.d.ts +33 -5
  560. package/dist/services.js +155 -37
  561. package/dist/settings-workspace.d.ts +23 -3
  562. package/dist/settings-workspace.js +159 -45
  563. package/dist/stamp-on-publish.d.ts +36 -0
  564. package/dist/stamp-on-publish.js +71 -0
  565. package/dist/static/index.d.ts +58 -5
  566. package/dist/static/index.js +133 -3
  567. package/dist/static/seo.d.ts +5 -5
  568. package/dist/static/seo.js +5 -5
  569. package/dist/submission-attribution.d.ts +8 -0
  570. package/dist/submission-attribution.js +22 -0
  571. package/dist/system-users.d.ts +12 -0
  572. package/dist/system-users.js +12 -0
  573. package/dist/task-queue/cms-task-queue.d.ts +1 -1
  574. package/dist/task-queue/cms-task-queue.js +1 -1
  575. package/dist/task-queue/index.d.ts +1 -1
  576. package/dist/task-queue/index.js +1 -1
  577. package/dist/task-queue/task-queue.d.ts +6 -0
  578. package/dist/task-queue/task-queue.js +29 -0
  579. package/dist/task-queue/worker-status.d.ts +35 -9
  580. package/dist/task-queue/worker-status.js +84 -17
  581. package/dist/types.d.ts +90 -9
  582. package/dist/url-collision.js +3 -3
  583. package/dist/url-exclusivity-fixtures.d.ts +8 -1
  584. package/dist/url-exclusivity-fixtures.js +11 -1
  585. package/dist/user.js +2 -1
  586. package/dist/utils/atomic-write.js +2 -1
  587. package/dist/utils/base-branch.d.ts +13 -0
  588. package/dist/utils/base-branch.js +23 -0
  589. package/dist/utils/content-serialize.d.ts +15 -7
  590. package/dist/utils/content-serialize.js +353 -51
  591. package/dist/utils/content-write-lock.d.ts +6 -1
  592. package/dist/utils/content-write-lock.js +21 -6
  593. package/dist/utils/debug.d.ts +1 -1
  594. package/dist/utils/debug.js +5 -3
  595. package/dist/utils/error.js +13 -2
  596. package/dist/utils/escape-text.d.ts +7 -0
  597. package/dist/utils/escape-text.js +27 -0
  598. package/dist/utils/fs.d.ts +12 -4
  599. package/dist/utils/fs.js +18 -5
  600. package/dist/utils/git.d.ts +21 -1
  601. package/dist/utils/git.js +63 -8
  602. package/dist/utils/json-source-splice.d.ts +14 -0
  603. package/dist/utils/json-source-splice.js +120 -0
  604. package/dist/utils/markdown-body-splice.d.ts +39 -0
  605. package/dist/utils/markdown-body-splice.js +421 -0
  606. package/dist/utils/occ-json-write.js +18 -12
  607. package/dist/utils/provision-log.d.ts +25 -0
  608. package/dist/utils/provision-log.js +49 -0
  609. package/dist/utils/provisioning-lock.d.ts +32 -1
  610. package/dist/utils/provisioning-lock.js +78 -32
  611. package/dist/utils/sanitize-href.d.ts +9 -23
  612. package/dist/utils/sanitize-href.js +14 -28
  613. package/dist/utils/title-field.d.ts +10 -0
  614. package/dist/utils/title-field.js +47 -0
  615. package/dist/utils/yaml-source-splice.d.ts +58 -0
  616. package/dist/utils/yaml-source-splice.js +515 -0
  617. package/dist/validation/block-structural-keys.d.ts +1 -1
  618. package/dist/validation/block-structural-keys.js +1 -1
  619. package/dist/validation/deletion-checker.d.ts +21 -29
  620. package/dist/validation/deletion-checker.js +41 -117
  621. package/dist/validation/entry-validator.d.ts +6 -10
  622. package/dist/validation/entry-validator.js +19 -26
  623. package/dist/validation/field-traversal.d.ts +22 -0
  624. package/dist/validation/field-traversal.js +39 -8
  625. package/dist/validation/markdown-safety.d.ts +68 -0
  626. package/dist/validation/markdown-safety.js +596 -0
  627. package/dist/validation/mdx-allowlist.d.ts +55 -0
  628. package/dist/validation/mdx-allowlist.js +183 -0
  629. package/dist/validation/reference-validator.d.ts +2 -0
  630. package/dist/validation/reference-validator.js +3 -0
  631. package/dist/version.d.ts +1 -1
  632. package/dist/version.js +1 -1
  633. package/dist/worker/branch-policy.d.ts +124 -0
  634. package/dist/worker/branch-policy.js +243 -0
  635. package/dist/worker/bundle-header.d.ts +117 -0
  636. package/dist/worker/bundle-header.js +253 -0
  637. package/dist/worker/cms-worker.d.ts +236 -142
  638. package/dist/worker/cms-worker.js +772 -285
  639. package/dist/worker/gateway-egress.d.ts +43 -0
  640. package/dist/worker/gateway-egress.js +209 -0
  641. package/dist/worker/gateway-instance.d.ts +42 -0
  642. package/dist/worker/gateway-instance.js +129 -0
  643. package/dist/worker/git-process.d.ts +81 -0
  644. package/dist/worker/git-process.js +234 -0
  645. package/dist/worker/git-sync.d.ts +34 -17
  646. package/dist/worker/git-sync.js +394 -131
  647. package/dist/worker/github-auth.d.ts +9 -9
  648. package/dist/worker/github-auth.js +13 -15
  649. package/dist/worker/github-gateway-http.d.ts +62 -0
  650. package/dist/worker/github-gateway-http.js +977 -0
  651. package/dist/worker/github-gateway-wire.d.ts +590 -0
  652. package/dist/worker/github-gateway-wire.js +488 -0
  653. package/dist/worker/github-gateway.d.ts +238 -0
  654. package/dist/worker/github-gateway.js +726 -0
  655. package/dist/worker/github-mirror-upkeep.d.ts +75 -0
  656. package/dist/worker/github-mirror-upkeep.js +266 -0
  657. package/dist/worker/github-mirror.d.ts +364 -0
  658. package/dist/worker/github-mirror.js +1030 -0
  659. package/dist/worker/github-transfer.d.ts +56 -0
  660. package/dist/worker/github-transfer.js +444 -0
  661. package/dist/worker/history-rewrite.d.ts +4 -5
  662. package/dist/worker/history-rewrite.js +12 -17
  663. package/dist/worker/provisioned-workspace.d.ts +5 -5
  664. package/dist/worker/provisioned-workspace.js +5 -5
  665. package/dist/worker/rebase.d.ts +1 -1
  666. package/dist/worker/rebase.js +58 -54
  667. package/dist/worker/remote-git-maintenance.d.ts +3 -0
  668. package/dist/worker/remote-git-maintenance.js +12 -0
  669. package/dist/worker/schema-gate.d.ts +49 -0
  670. package/dist/worker/schema-gate.js +226 -0
  671. package/dist/worker/self-checks.d.ts +107 -0
  672. package/dist/worker/self-checks.js +358 -0
  673. package/dist/worker/shared-repo-git.d.ts +96 -0
  674. package/dist/worker/shared-repo-git.js +459 -0
  675. package/dist/worker/sparse-cone.d.ts +20 -0
  676. package/dist/worker/sparse-cone.js +136 -0
  677. package/dist/worker/stale-mirror.d.ts +82 -0
  678. package/dist/worker/stale-mirror.js +130 -0
  679. package/dist/worker/task-runner.d.ts +5 -3
  680. package/dist/worker/task-runner.js +287 -186
  681. package/dist/worker/worker-context.d.ts +36 -37
  682. package/package.json +35 -7
  683. package/dist/editor/EditorPanes.d.ts +0 -10
  684. package/dist/editor/EditorPanes.js +0 -98
  685. package/dist/editor/components/EditorFooter.d.ts +0 -11
  686. package/dist/editor/components/EditorFooter.js +0 -9
  687. package/dist/editor/components/EditorSidebar.d.ts +0 -67
  688. package/dist/editor/components/EditorSidebar.js +0 -22
@@ -1,7 +1,15 @@
1
1
  import { type GitHubAuthConfig } from './github-auth.js';
2
+ import { type GitHubGateway } from './github-gateway.js';
3
+ import type { WorkerStatusReport } from '../types.js';
2
4
  export { PermanentTaskError, isPermanentTaskFailure } from './task-runner.js';
3
5
  export { workerLog, workerLogWarn, workerLogError, installWorkerLogger } from './log.js';
4
- export { normalizeGitHubAppPrivateKey, DEFAULT_GIT_TOKEN_MINT_TIMEOUT_MS, DEFAULT_GITHUB_TOKEN_REFRESH_MIN_INTERVAL_MS, type GitHubAppAuth, type GitHubAuthConfig, } from './github-auth.js';
6
+ export { resolveWorkerGitHubAuth, normalizeGitHubAppPrivateKey, DEFAULT_GIT_TOKEN_MINT_TIMEOUT_MS, DEFAULT_GITHUB_TOKEN_REFRESH_MIN_INTERVAL_MS, type GitHubAppAuth, type GitHubAuthConfig, } from './github-auth.js';
7
+ export { createLocalGitHubGateway, type GitHubGateway, type GitHubGatewayHealth, type LocalGitHubGatewayOptions, } from './github-gateway.js';
8
+ export { serveGitHubGateway, connectGitHubGateway, type GitHubGatewayClientOptions, type GitHubGatewayListen, type GitHubGatewayServer, type GitHubGatewayServerOptions, } from './github-gateway-http.js';
9
+ export { GitHubGatewayUnreachableError } from './github-gateway-wire.js';
10
+ export { GatewayInstance, type GatewayInstanceOptions } from './gateway-instance.js';
11
+ export { gatewayLog, gatewayLogWarn, gatewayLogError, registerSecretText, registerPrivateKey, redactEgress, } from './gateway-egress.js';
12
+ export { assertSelfChecks, gatewaySelfChecks, workerSelfChecks, type SelfCheckEnvironment, type SelfCheckName, type SelfCheckResult, } from './self-checks.js';
5
13
  /**
6
14
  * Auth cache refresh function type; adopters supply their auth-plugin-specific
7
15
  * implementation (for Clerk, refreshClerkCache from
@@ -17,6 +25,21 @@ export type AuthCacheRefresher = () => Promise<void>;
17
25
  export interface CmsWorkerConfig extends GitHubAuthConfig {
18
26
  /** Path to workspace root on EFS (e.g., /mnt/efs) */
19
27
  workspacePath: string;
28
+ /**
29
+ * A directory only this worker can write, never on the shared filesystem: it holds the private
30
+ * GitHub mirror, the one repository any git command carrying the credential runs in
31
+ * (worker/github-mirror.ts). The AWS worker passes systemd's `StateDirectory=`. Default: a
32
+ * directory under `os.tmpdir()`, which the worker refuses unless it owns it and no one else can
33
+ * write to it.
34
+ */
35
+ stateDirectory?: string;
36
+ /**
37
+ * A GitHub gateway to use instead of building the in-process one: a client of a gateway another
38
+ * process serves (`connectGitHubGateway`), which holds the credential, the protected set and the
39
+ * mirror. Exclusive with `githubToken`, `githubAppAuth`, `refreshGitHubToken` and
40
+ * `protectedBranches`, which configure the in-process one.
41
+ */
42
+ githubGateway?: GitHubGateway;
20
43
  /** GitHub owner (e.g., 'acme') */
21
44
  githubOwner: string;
22
45
  /** GitHub repo name (e.g., 'site') */
@@ -29,8 +52,14 @@ export interface CmsWorkerConfig extends GitHubAuthConfig {
29
52
  gitSyncInterval?: number;
30
53
  /** Auth cache refresh interval in ms (default: 15 * 60 * 1000) */
31
54
  authCacheRefreshInterval?: number;
32
- /** Base branch name (default: 'main') */
55
+ /** Base branch name (default: detected at start(); see `resolveBaseBranch`) */
33
56
  baseBranch?: string;
57
+ /**
58
+ * Branches the worker never pushes, deletes or opens a pull request from, beside the configured
59
+ * base branch and GitHub's default branch: exact names, or globs in which `*` matches any run of
60
+ * characters (`release/*`), which never match a settings branch. See worker/branch-policy.ts.
61
+ */
62
+ protectedBranches?: readonly string[];
34
63
  /**
35
64
  * Names THIS worker's own settings branch
36
65
  * (`canopycms-settings-{deploymentName}`, default 'prod' — ProdStrategy's
@@ -56,13 +85,36 @@ export interface CmsWorkerConfig extends GitHubAuthConfig {
56
85
  maxRetries?: number;
57
86
  /** Content root directory name relative to repo root (default: 'content') */
58
87
  contentRoot?: string;
88
+ /**
89
+ * Longest the git sync holds the base branch for content naming entry schemas the serving
90
+ * editor does not define, before advancing anyway (default: 30 minutes). See worker/schema-gate.ts.
91
+ */
92
+ schemaHoldMaxMs?: number;
59
93
  /**
60
94
  * Worker lock staleness TTL in ms (default 60000, minimum 2000). The holder
61
95
  * refreshes the heartbeat at half this interval; a lock whose heartbeat is
62
96
  * older than this is abandoned and taken over by the next worker to start.
63
97
  */
64
98
  lockStaleMs?: number;
99
+ /**
100
+ * How long `stop()` waits for in-flight work before aborting it, in ms
101
+ * (default {@link DEFAULT_DRAIN_DEADLINE_MS}). An entrypoint's process
102
+ * manager must allow this plus {@link ABORT_GRACE_MS} before it kills the
103
+ * process.
104
+ */
105
+ drainDeadlineMs?: number;
65
106
  }
107
+ /**
108
+ * The default `taskTimeoutMs`. Exported because a split worker's gateway client passes it as its
109
+ * `fetchInactivityMs` and the gateway uses it as its `timeoutMs`, as the in-process gateway does.
110
+ */
111
+ export declare const DEFAULT_TASK_TIMEOUT = 60000;
112
+ /**
113
+ * 90s fits inside an EC2 spot interruption's two-minute notice with room to
114
+ * exit, and exceeds the default task timeout, so a task already running when
115
+ * the drain begins normally finishes or times out on its own.
116
+ */
117
+ export declare const DEFAULT_DRAIN_DEADLINE_MS = 90000;
66
118
  /**
67
119
  * CMS Worker daemon: the operations Lambda, which has no internet, cannot
68
120
  * perform -- draining the task queue, syncing the bare repo with GitHub,
@@ -72,28 +124,68 @@ export interface CmsWorkerConfig extends GitHubAuthConfig {
72
124
  * Auth-agnostic (no specific auth provider) and cloud-agnostic (git/Octokit
73
125
  * directly, no AWS SDK dependency).
74
126
  */
127
+ /** Why a worker stopped itself; see {@link CmsWorker.selfStopped}. */
128
+ export interface WorkerSelfStop {
129
+ reason: string;
130
+ }
131
+ /**
132
+ * Record a worker that failed before {@link CmsWorker.start} as `lastFatalError` (phase
133
+ * `startup`), so System health and the API's not-ready answer say why. For an entrypoint's own
134
+ * boot steps (its environment, its secrets); start() records its own failures.
135
+ *
136
+ * Writes under the worker lock like every status write, and writes nothing while the lock looks
137
+ * held (fresher than twice `lockStaleMs`, see recordLockLoss): its holder owns the file. Never
138
+ * throws, since its caller is already exiting.
139
+ */
140
+ export declare function recordWorkerStartupFailure(options: {
141
+ workspacePath: string;
142
+ error: unknown;
143
+ lockStaleMs?: number;
144
+ /**
145
+ * Write nothing when the file is a failed start's own record (its `lastFatalError` was written
146
+ * by the worker that wrote the file) and this accepts that record: for a failure that only says
147
+ * the recorded cause is still in the way (the GitHub gateway unreachable while it restarts after
148
+ * its own fatal error), which must not replace that cause. A record a later worker carried
149
+ * forward is never kept: that worker got past it.
150
+ */
151
+ keepRecordedFatal?: (recorded: NonNullable<WorkerStatusReport['lastFatalError']>) => boolean;
152
+ }): Promise<void>;
75
153
  export declare class CmsWorker {
76
154
  private config;
77
- private octokit;
155
+ private gateway?;
78
156
  private taskDir;
79
157
  private remoteGitPath;
158
+ private stateDirectory;
80
159
  private contentBranchesPath;
81
- private baseBranch;
82
- private sanitizedBaseBranch;
160
+ private resolvedBaseBranch?;
83
161
  private settingsBranchResolved?;
84
162
  private activeTimeouts;
85
163
  private running;
86
164
  private activeOperations;
165
+ private stopping;
166
+ private drainDeadlineMs;
167
+ private shutdownController;
87
168
  private maxTasksPerCycle;
88
169
  private taskTimeoutMs;
89
170
  private maxRetries;
90
171
  private lockFilePath;
91
172
  private lockStaleMs;
173
+ private schemaHoldMaxMs;
92
174
  private releaseLockFn;
93
175
  private contentRoot;
94
176
  private log;
95
177
  private statusReport?;
96
- private githubAuth?;
178
+ private warnedDivergences;
179
+ private lockLostMessage?;
180
+ private statusWriterAtLock?;
181
+ private settleSelfStopped;
182
+ /**
183
+ * Settles once the worker has stopped for a reason it chose itself (its lock was
184
+ * compromised), after the drain and its record in worker-status.json. Never settles for a
185
+ * stop() the entrypoint asked for. Nothing else ends the process, so an entrypoint exits
186
+ * non-zero on it and its process manager starts a fresh worker.
187
+ */
188
+ readonly selfStopped: Promise<WorkerSelfStop>;
97
189
  constructor(config: CmsWorkerConfig);
98
190
  /**
99
191
  * This worker's self-reported status object, initialized on first use.
@@ -114,12 +206,12 @@ export declare class CmsWorker {
114
206
  * as foreign and never pushes it.
115
207
  *
116
208
  * DEFERRED out of the constructor deliberately, which is the whole point of
117
- * the method existing: canopycms-cdk/worker/index.ts constructs the worker
118
- * before calling start(), so a throw during `new CmsWorker(...)` lands BEFORE
119
- * the only code that writes `lastFatalError` -- start()'s catch. Under
120
- * systemd `Type=simple` + `Restart=always` with no cfn-signal, that is an
121
- * invisible ~5s crash-loop that `cdk deploy` reports as success while the
122
- * admin panel shows the worker 'absent' with no fatal error to explain it.
209
+ * the method existing: an entrypoint constructs the worker before calling
210
+ * start(), so a throw during `new CmsWorker(...)` lands BEFORE start()'s
211
+ * catch, which records `lastFatalError` for every entrypoint. Only one that
212
+ * calls `recordWorkerStartupFailure` (canopycms-cdk/worker/run.ts does) would
213
+ * record it otherwise; under systemd `Restart=always` the rest crash-loop
214
+ * every ~5s with System health showing the worker 'absent' and no reason.
123
215
  *
124
216
  * Lazy rather than start()-only so unit tests driving pushSettingsBranches()
125
217
  * still see the value, exactly as ensureStatusReport() above. Idempotent: the
@@ -133,12 +225,46 @@ export declare class CmsWorker {
133
225
  * Built FRESH on every call, with instance-backed members as functions rather
134
226
  * than copied values. See WorkerContext's INVARIANT: a context that captured
135
227
  * any of them at construction time would hand the extracted code the pre-test
136
- * value, which for `buildGitHubUrl` means a test's push going to github.com
137
- * for real instead of its local fixture repo.
228
+ * value, which for the GitHub gateway means a test's push going to
229
+ * github.com for real instead of its local fixture repo.
138
230
  */
139
231
  private ctx;
232
+ /**
233
+ * Take the worker lock, provision, run the first sync, then schedule the
234
+ * loops. All of it is tracked as an operation, so a stop() that lands
235
+ * mid-startup -- during the lock acquisition, a first-boot clone, the first
236
+ * sync -- drains it before releasing the lock, and start() then resolves
237
+ * without scheduling anything.
238
+ */
140
239
  start(): Promise<void>;
141
- stop(): Promise<void>;
240
+ private startUnderLock;
241
+ /**
242
+ * Drain, then release the worker lock. Idempotent: a second call returns the
243
+ * first call's promise.
244
+ *
245
+ * 1. Stop taking work: no loop starts another iteration, and none claims
246
+ * another task or starts another sync stage or branch rebase (each checks
247
+ * `isDraining()` at its boundaries).
248
+ * 2. Wait up to the deadline (`drainDeadlineMs`, or `deadlineMs` for this
249
+ * call) for what is already in flight, startup included.
250
+ * 3. At the deadline, abort it through `shutdownSignal()`: a task's git push
251
+ * and GitHub calls are killed and the task is released to pending with no
252
+ * retry spent; a sync's bundle, unbundle, ref update and settings push
253
+ * are killed. The gateway's GitHub fetches and mirror maintenance run on
254
+ * (safeinsights/canopycms#907). A branch rebase
255
+ * is never aborted, because a rebase killed mid-branch is recovered
256
+ * lossily; anything still unsettled after a short grace is abandoned to
257
+ * the process exit.
258
+ * 4. Record `lastShutdown` in worker-status.json -- only while this worker
259
+ * still holds the lock, or after a compromise that started this stop once
260
+ * it has retaken it (recordLockLoss) -- and release the lock. Release comes last, so a successor starts
261
+ * only once this worker's work has settled or been abandoned.
262
+ */
263
+ stop(options?: {
264
+ reason?: string;
265
+ deadlineMs?: number;
266
+ }): Promise<void>;
267
+ private drainAndStop;
142
268
  /**
143
269
  * Acquire the cross-host worker lock (DEP-C2).
144
270
  *
@@ -163,19 +289,63 @@ export declare class CmsWorker {
163
289
  */
164
290
  private acquireLock;
165
291
  private releaseLock;
292
+ /**
293
+ * Record a lock compromise in worker-status.json, under the lock: retake it, waiting out its
294
+ * staleness window, and write only if that succeeds and the file is still this worker's (or
295
+ * the one it took the lock from). A worker that took the lock over keeps it fresh, or has
296
+ * written the file since, and owns it, so nothing is written. A heartbeat this worker merely
297
+ * failed to refresh (an EFS hiccup) goes stale, and the record lands where the restarted
298
+ * worker carries `lastShutdown` forward. The restart waits for it: 65 s at the default `lockStaleMs`.
299
+ */
300
+ private recordLockLoss;
301
+ /** Register `operation` as in flight under `label` until it settles. */
302
+ private trackOperation;
166
303
  /**
167
304
  * Run `fn` repeatedly, the next invocation starting `interval` ms after the
168
305
  * previous one COMPLETES. setTimeout chaining rather than setInterval, so
169
306
  * executions cannot overlap when one runs longer than the interval.
170
307
  */
171
308
  private scheduleLoop;
309
+ private get baseBranch();
310
+ private get sanitizedBaseBranch();
311
+ private requireBaseBranch;
312
+ private setBaseBranch;
313
+ /**
314
+ * An unconfigured base branch is the one remote.git's HEAD names, which is what the Lambda
315
+ * reads too (GitManager.detectBaseBranch); before remote.git exists, it is GitHub's default
316
+ * branch, which the clone then records as that HEAD. So it is too when remote.git has no branch
317
+ * outside the settings namespace: no base branch is there for HEAD to name, and ensureRemoteGit
318
+ * replaces it from GitHub unless something in it is at stake. Never assumes 'main'.
319
+ */
320
+ private resolveBaseBranch;
321
+ /**
322
+ * Warn when the base branch is outside the gateway's protected set: it was detected from
323
+ * remote.git rather than configured, and is not GitHub's default branch at boot. Only the
324
+ * worker's own check (`pushBranchToGitHub`) then stops a push to it. A warning, not a refusal, so
325
+ * a change of GitHub's default branch cannot stop the worker booting.
326
+ */
327
+ private warnIfBaseUnprotected;
328
+ /**
329
+ * Check remote.git's config at boot. A refusal is never a case for replacement: it reports that
330
+ * something wrote there, and listing the refs a replacement would lose means running git under
331
+ * that config. The message says so, so System health does not read it as a routine failure.
332
+ */
333
+ private assertRemoteGitConfig;
334
+ /** Whether the bare repo at `gitDir` has a branch that is not a settings branch. */
335
+ private hasContentBranch;
336
+ /**
337
+ * Point remote.git's HEAD at the base branch this worker uses, so a Lambda left to detect it
338
+ * (GitManager.detectBaseBranch) reads the same name. Only the worker writes it, at boot under
339
+ * the worker lock, and in a fresh clone before it is renamed into place, so no Lambda reads the
340
+ * clone's GitHub-default HEAD first; a Lambda reads it once per process.
341
+ */
342
+ private recordBaseBranchInRemoteHead;
172
343
  /**
173
344
  * Whether the bare repo at `gitDir` has a local `refs/heads/<baseBranch>`.
174
345
  *
175
- * Explicit `--git-dir` rather than `simpleGit({ baseDir })`, so this also
346
+ * The repository is named outright (sharedRepoGit's GIT_DIR), so this also
176
347
  * works where `safe.bareRepository=explicit` refuses cwd-based discovery of
177
- * bare repos but expressly allows `--git-dir` (same pattern as
178
- * GitManager.bareRemoteHasBranch).
348
+ * bare repos.
179
349
  *
180
350
  * Deliberately omits `--quiet`: simple-git treats a task as failed only when
181
351
  * the process exits non-zero AND writes to stderr, so a silent-on-failure
@@ -191,8 +361,8 @@ export declare class CmsWorker {
191
361
  * `git clone https://x-access-token:<token>@github.com/...` records that URL
192
362
  * verbatim as `remote.origin.url`, and for `remote.git` that config lives on
193
363
  * shared EFS. The security model in docs/deploying-to-aws.md -- a compromised
194
- * Lambda can read/write EFS content but cannot push to GitHub, secrets stay
195
- * on the worker -- is false while that string is there: the Lambda could read
364
+ * Lambda can read/write EFS content but cannot reach the GitHub credential,
365
+ * which stays off EFS -- is false while that string is there: the Lambda could read
196
366
  * the token off EFS and, with no egress of its own, exfiltrate it by writing
197
367
  * it into branch content the worker then pushes to GitHub.
198
368
  *
@@ -204,96 +374,63 @@ export declare class CmsWorker {
204
374
  */
205
375
  private scrubPersistedRemote;
206
376
  /**
207
- * Ensure the remote.git bare repo exists, cloning it from GitHub on first
208
- * run.
209
- *
210
- * Empty-remote guard: simple-git's bare clone of an EMPTY GitHub repo (no
211
- * commits, or a base branch never pushed) exits 0 and produces a refs-less
212
- * bare repo whose HEAD points at an unborn branch. `fs.stat` cannot tell that
213
- * from a healthy clone, so left unchecked it silently poisons remote.git —
214
- * every later branch operation breaks and the fs.stat short-circuit means it
215
- * never heals. The base branch is therefore verified right after cloning AND
216
- * on the already-exists fast path, since a previous run can have left a
217
- * poisoned remote.git behind.
377
+ * Best-effort: without these settings remote.git still works, and a boot that
378
+ * cannot write its own config has a louder problem to report elsewhere.
218
379
  */
219
- private ensureRemoteGit;
220
- processTaskQueue(): Promise<void>;
221
- private executeTask;
222
- private updateBranchMetadata;
223
- private pushBranchToGitHub;
380
+ private applyRemoteGitConfig;
224
381
  /**
225
- * Resolve which GitHub credential this worker uses, once, and build the
226
- * Octokit client from it.
382
+ * Ensure the remote.git bare repo exists, seeding it from GitHub on first run.
227
383
  *
228
- * DEFERRED out of the constructor deliberately, exactly as
229
- * `ensureSettingsBranch()` is and for the reason that method records:
230
- * `resolveWorkerGitHubAuth` throws for a half-configured credential (both
231
- * set, neither set, an unusable mint timeout or refresh interval), and a
232
- * throw during `new CmsWorker(...)` lands BEFORE the only code that writes
233
- * `lastFatalError` — start()'s catch.
384
+ * Seeded through the GitHub gateway: it fetches from GitHub, and a fresh bare repo takes its
385
+ * branches from the bundle it answers with (worker/github-transfer.ts), so no git command run
386
+ * against remote.git ever carries the credential, and no token-bearing URL is ever written to
387
+ * EFS.
234
388
  *
235
- * Idempotent, and it does NOT replace an `octokit` a test has already
236
- * assigned onto the instance — see the field's comment.
389
+ * Empty-remote guard: a remote.git with no base branch (one cloned from an EMPTY GitHub repo,
390
+ * or with a base branch never pushed) is one `fs.stat` cannot tell from a healthy one, so left
391
+ * unchecked it silently poisons remote.git and the stat short-circuit means it never heals. The
392
+ * seed refuses a GitHub without the base branch, and the base branch is verified right after
393
+ * seeding AND on the already-exists fast path, where a poisoned remote.git is replaced
394
+ * (`replacePoisonedRemoteGit`).
237
395
  */
238
- private ensureGitHubAuth;
396
+ private ensureRemoteGit;
239
397
  /**
240
- * The Octokit client, built on first use. Every read goes through here rather
241
- * than touching the field, which the constructor does not populate: a method
242
- * reached without start() would otherwise see `undefined`.
243
- * `rebaseActiveBranches()` is exactly that case — apps/test-app's e2e route
244
- * calls it directly, and its `pollMergeState` dispatch reads `ctx.octokit()`.
398
+ * Replace an existing remote.git that has no base branch with a fresh seed from GitHub, but only
399
+ * when every ref in it names a commit a GitHub branch contains, so replacing it loses no commit;
400
+ * a branch name GitHub lacks, such as a merged branch deleted there, goes. Otherwise refuse,
401
+ * naming the refs at stake: unpushed work such as a settings branch.
402
+ *
403
+ * The refs are checked against the replacement itself, once it is seeded: a ref's commit counts
404
+ * as on GitHub only when the seed holds it, reachable from a branch GitHub had, so the decision
405
+ * follows exactly what would replace remote.git, whatever the gateway fetches meanwhile. They are
406
+ * listed again just before the swap, since the Lambda can push into remote.git while the seed
407
+ * runs. The swap is two renames, so the name remote.git resolves to the old repo,
408
+ * the new one, or for an instant nothing, never a half-built or half-deleted one.
245
409
  */
246
- private octokitClient;
410
+ private replacePoisonedRemoteGit;
247
411
  /**
248
- * The single seam through which every git-over-HTTPS credential reaches a git
249
- * command. The only other consumer is Octokit, built from the same resolution
250
- * by `ensureGitHubAuth()` above.
251
- *
252
- * Async because under GitHub App auth `resolveGitToken` mints an installation
253
- * token lasting about an hour. NOTHING may cache what this returns — a URL
254
- * built from an installation token goes stale with it — and resolving per use
255
- * is cheap, since `@octokit/auth-app` answers from its own cache until the
256
- * token is near expiry.
257
- *
258
- * A mint failure propagates AS THROWN, carrying the `.status` that
259
- * `isPermanentTaskFailure` classifies on — see github-auth.ts.
260
- *
261
- * Do NOT add a parallel token accessor alongside it. Every instance-backed
262
- * WorkerContext member stays a function precisely so tests can replace it
263
- * through the instance (worker-context.ts's INVARIANT); a second credential
264
- * path would be one nothing stubs.
412
+ * Seed a new bare repo from GitHub at `<remote.git>.cloning`, verified and configured, and
413
+ * return its path for the caller to rename into place. `check` runs on the seeded repo, given
414
+ * GitHub's branches as the seed holds them, and its throw stops the seed. Throws with the
415
+ * staging directory gone.
265
416
  */
266
- private buildGitHubUrl;
417
+ private seedRemoteGitStaging;
418
+ processTaskQueue(): Promise<void>;
419
+ private executeTask;
420
+ private updateBranchMetadata;
421
+ private pushBranchToGitHub;
267
422
  /**
268
- * Prove the GitHub App credential works before anything depends on it.
269
- *
270
- * Without this the first failure comes out of `ensureRemoteGit`'s bare clone
271
- * below, whose catch blames the repository ("may be empty, or the base branch
272
- * may not exist") and sends an operator holding a bad private key looking for
273
- * a problem that does not exist. Called from start()'s try, so the failure is
274
- * also recorded as `lastFatalError` and reaches the admin panel. No-op on the
275
- * token path: a PAT is a literal, so the first real request checks everything
276
- * this could.
277
- *
278
- * FATAL UNLESS THE FAILURE POSITIVELY LOOKS TRANSIENT. Both halves are
279
- * load-bearing. Not always fatal, because the two credential paths must
280
- * degrade alike: on the token path a GitHub 502 during boot is absorbed (a
281
- * warm `remote.git` short-circuits `ensureRemoteGit`, `Promise.allSettled`
282
- * swallows the initial `syncGit`) so the worker starts and its loops retry,
283
- * while rethrowing every error class would make the App path exit and systemd
284
- * crash-loop it until GitHub recovered — each iteration telling the operator
285
- * to check their private key.
286
- *
287
- * But fail CLOSED, via `isTransientAuthFailure` rather than the inverse of
288
- * `isPermanentTaskFailure`: that classifier defaults a status-less error to
289
- * transient, which is right on the task path (bounded by `maxRetries`) and
290
- * wrong here (bounded by nothing). A key that never reaches GitHub at all —
291
- * the wrong type, or too mangled to sign with — fails locally and
292
- * status-lessly, so defaulting to transient would boot a worker with a dead
293
- * credential, record no `lastFatalError`, and show healthy in the admin panel
294
- * while every task and every sync failed.
423
+ * The worker's GitHub gateway, created on first use: inside start()'s try, or wherever a test
424
+ * entry point first reaches it. Creating it resolves the credential, which throws for a
425
+ * half-configured one (both set, neither set, an unusable mint timeout or refresh interval) --
426
+ * never in the constructor, for the reason `ensureSettingsBranch()` gives. Keeps a gateway a
427
+ * test installed.
295
428
  */
296
- private preflightGitHubAppAuth;
429
+ private github;
430
+ /** What worker/github-transfer.ts needs, for the seeds that run before the loops' context. */
431
+ private transferContext;
432
+ /** What the in-process gateway is built from; test-utils/worker-gateway.ts builds from it too. */
433
+ private localGitHubGatewayOptions;
297
434
  /**
298
435
  * The workspace directory for a branch named by its GIT REF name -- the form
299
436
  * task payloads carry (`context.branch.name`), not the directory form.
@@ -332,49 +469,6 @@ export declare class CmsWorker {
332
469
  protected afterRebaseCompletedForTesting(): Promise<void>;
333
470
  private rebaseActiveBranches;
334
471
  syncGit(): Promise<void>;
335
- /**
336
- * `syncGit`, plus "the credential may have rotated" on the way out.
337
- *
338
- * One of `refreshGitHubCredential`'s two call sites, and the one that works
339
- * when nobody is publishing: it fetches from GitHub every `gitSyncInterval`
340
- * whether or not anyone is editing, so a credential that has stopped working
341
- * surfaces here even with no push queued for days.
342
- *
343
- * The SYNC failure is what propagates to `scheduleLoop`'s catch;
344
- * `refreshGitHubCredential` never throws, so nothing it does can replace it.
345
- */
346
- private syncGitWithCredentialRefresh;
347
- /**
348
- * Re-read the GitHub credential, because an operation using it just failed.
349
- *
350
- * **Two call sites, each covering what the other cannot.** The git-sync loop
351
- * (`syncGitWithCredentialRefresh`) notices a dead credential when nobody is
352
- * publishing. `processTaskQueue`'s per-task catch is what saves a publish: a
353
- * push task spends its retry budget on a 5s/10s/20s backoff, well inside one
354
- * 5-minute sync interval, so with the sync loop as the only trigger a publish
355
- * meeting a rotated token fails permanently while the working one is already
356
- * in the secret store. Every consumer reaches the credential through
357
- * `ensureGitHubAuth()`, which reads it per use, so a refresh from either site
358
- * repairs all of them for their NEXT use — but not an attempt already failed.
359
- *
360
- * NOT gated on the error looking auth-shaped, at either site: a `git
361
- * fetch`/`push` rejected for a dead token throws a plain simple-git error
362
- * (exit 128, no HTTP `.status`) that `isPermanentTaskFailure` reads as
363
- * transient, so a gate keyed on it would never fire. Two floors bound the
364
- * cost instead — core's `refreshGitHubTokenMinIntervalMs` (default 60s,
365
- * enforced by `refreshCredential` in github-auth.ts) and whatever floor the
366
- * provider keeps (the AWS one reads at most once per five minutes) — and both
367
- * call sites share both, so a read issued by one throttles the other. On the
368
- * GitHub App path the refresh is a no-op.
369
- *
370
- * **Never throws**: both callers are already reporting the failure that must
371
- * reach the log. **Bounded by `taskTimeoutMs`**, because the task loop awaits
372
- * it and a read that never settled would stop every publish queued behind it
373
- * (an adopter's provider may have no bound at all; the AWS one can take 87s
374
- * for one `getSecret`). A losing read is not cancelled and may land later, but
375
- * `refreshCredential` discards a result older than one already applied.
376
- */
377
- private refreshGitHubCredential;
378
472
  private pushSettingsBranches;
379
473
  private refreshBaseBranchWorkspace;
380
474
  private cleanupTrashedBranchDirs;