canopycms 0.0.67-int.90 → 0.0.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. package/README.md +30 -3
  2. package/dist/ai/generate.js +1 -27
  3. package/dist/ai/handler.d.ts +0 -4
  4. package/dist/ai/handler.js +0 -11
  5. package/dist/ai/index.d.ts +1 -8
  6. package/dist/ai/index.js +1 -8
  7. package/dist/ai/json-to-markdown.js +15 -58
  8. package/dist/ai/resolve-branch.d.ts +2 -7
  9. package/dist/ai/resolve-branch.js +2 -8
  10. package/dist/ai/strip-mdx.d.ts +5 -13
  11. package/dist/ai/strip-mdx.js +5 -17
  12. package/dist/ai/to-plain-text.d.ts +10 -28
  13. package/dist/ai/to-plain-text.js +10 -28
  14. package/dist/ai/transform-components.d.ts +2 -4
  15. package/dist/ai/transform-components.js +8 -19
  16. package/dist/ai/types.d.ts +5 -10
  17. package/dist/api/admin-branch-health.d.ts +4 -12
  18. package/dist/api/admin-branch-health.js +26 -66
  19. package/dist/api/admin.d.ts +4 -12
  20. package/dist/api/admin.js +10 -26
  21. package/dist/api/assets.d.ts +0 -25
  22. package/dist/api/assets.js +50 -91
  23. package/dist/api/branch-merge.d.ts +1 -1
  24. package/dist/api/branch-merge.js +0 -2
  25. package/dist/api/branch-review.d.ts +0 -8
  26. package/dist/api/branch-review.js +0 -13
  27. package/dist/api/branch-status.d.ts +0 -3
  28. package/dist/api/branch-status.js +8 -33
  29. package/dist/api/branch-withdraw.d.ts +0 -1
  30. package/dist/api/branch-withdraw.js +6 -9
  31. package/dist/api/branch.d.ts +7 -12
  32. package/dist/api/branch.js +7 -44
  33. package/dist/api/client.d.ts +71 -224
  34. package/dist/api/client.js +82 -233
  35. package/dist/api/comments.d.ts +2 -4
  36. package/dist/api/comments.js +0 -17
  37. package/dist/api/content.d.ts +0 -6
  38. package/dist/api/content.js +66 -142
  39. package/dist/api/entries-constants.d.ts +5 -9
  40. package/dist/api/entries-constants.js +5 -9
  41. package/dist/api/entries.d.ts +8 -13
  42. package/dist/api/entries.js +20 -51
  43. package/dist/api/github-sync.d.ts +2 -4
  44. package/dist/api/github-sync.js +4 -8
  45. package/dist/api/groups.d.ts +3 -0
  46. package/dist/api/groups.js +8 -21
  47. package/dist/api/guards.d.ts +4 -16
  48. package/dist/api/guards.js +3 -22
  49. package/dist/api/index.d.ts +4 -4
  50. package/dist/api/permissions.d.ts +2 -0
  51. package/dist/api/permissions.js +18 -40
  52. package/dist/api/reference-options.d.ts +0 -1
  53. package/dist/api/reference-options.js +3 -11
  54. package/dist/api/request-body-hash.d.ts +12 -23
  55. package/dist/api/request-body-hash.js +12 -23
  56. package/dist/api/resolve-references.d.ts +0 -1
  57. package/dist/api/resolve-references.js +13 -28
  58. package/dist/api/route-builder.d.ts +3 -7
  59. package/dist/api/route-builder.js +1 -1
  60. package/dist/api/routes.d.ts +12 -0
  61. package/dist/api/routes.js +47 -0
  62. package/dist/api/schema.d.ts +23 -33
  63. package/dist/api/schema.js +20 -74
  64. package/dist/api/settings-helpers.js +4 -5
  65. package/dist/api/types.d.ts +0 -5
  66. package/dist/api/user.js +0 -5
  67. package/dist/api/validators.d.ts +14 -52
  68. package/dist/api/validators.js +14 -52
  69. package/dist/assets/asset-prefixes.d.ts +4 -8
  70. package/dist/assets/asset-prefixes.js +4 -8
  71. package/dist/assets/asset-src.d.ts +5 -22
  72. package/dist/assets/asset-src.js +5 -21
  73. package/dist/assets/factory.d.ts +1 -2
  74. package/dist/assets/factory.js +1 -2
  75. package/dist/assets/finalize.d.ts +3 -1
  76. package/dist/assets/finalize.js +3 -1
  77. package/dist/assets/index.d.ts +3 -3
  78. package/dist/assets/index.js +1 -1
  79. package/dist/assets/keys.d.ts +5 -3
  80. package/dist/assets/keys.js +6 -3
  81. package/dist/assets/pipeline.d.ts +3 -2
  82. package/dist/assets/pipeline.js +22 -56
  83. package/dist/assets/sharp-loader.d.ts +2 -10
  84. package/dist/assets/sharp-loader.js +2 -10
  85. package/dist/assets/store-local.d.ts +1 -2
  86. package/dist/assets/store-local.js +1 -2
  87. package/dist/assets/store-s3.d.ts +3 -4
  88. package/dist/assets/svg-sanitizer.d.ts +6 -14
  89. package/dist/assets/svg-sanitizer.js +6 -14
  90. package/dist/assets/transform-directives.d.ts +3 -4
  91. package/dist/assets/transform-directives.js +1 -1
  92. package/dist/assets/transform.d.ts +19 -30
  93. package/dist/assets/transform.js +18 -31
  94. package/dist/auth/cache.d.ts +2 -3
  95. package/dist/auth/cache.js +2 -3
  96. package/dist/auth/caching-auth-plugin.d.ts +11 -22
  97. package/dist/auth/caching-auth-plugin.js +12 -14
  98. package/dist/auth/context-helpers.d.ts +6 -20
  99. package/dist/auth/context-helpers.js +5 -17
  100. package/dist/auth/file-based-auth-cache.d.ts +10 -21
  101. package/dist/auth/file-based-auth-cache.js +23 -51
  102. package/dist/auth/plugin.d.ts +29 -61
  103. package/dist/auth/plugin.js +9 -13
  104. package/dist/auth/types.d.ts +11 -20
  105. package/dist/authorization/branch.d.ts +30 -49
  106. package/dist/authorization/branch.js +16 -42
  107. package/dist/authorization/content.d.ts +11 -40
  108. package/dist/authorization/content.js +13 -45
  109. package/dist/authorization/groups/index.d.ts +0 -3
  110. package/dist/authorization/groups/index.js +0 -3
  111. package/dist/authorization/groups/loader.d.ts +14 -28
  112. package/dist/authorization/groups/loader.js +14 -38
  113. package/dist/authorization/groups/schema.d.ts +0 -6
  114. package/dist/authorization/groups/schema.js +4 -7
  115. package/dist/authorization/helpers.d.ts +9 -28
  116. package/dist/authorization/helpers.js +9 -28
  117. package/dist/authorization/index.d.ts +3 -25
  118. package/dist/authorization/index.js +3 -35
  119. package/dist/authorization/path.d.ts +6 -13
  120. package/dist/authorization/path.js +8 -25
  121. package/dist/authorization/permissions/index.d.ts +0 -3
  122. package/dist/authorization/permissions/index.js +0 -3
  123. package/dist/authorization/permissions/loader.d.ts +14 -27
  124. package/dist/authorization/permissions/loader.js +14 -32
  125. package/dist/authorization/permissions/schema.d.ts +1 -6
  126. package/dist/authorization/permissions/schema.js +6 -13
  127. package/dist/authorization/protected-branch.d.ts +36 -65
  128. package/dist/authorization/protected-branch.js +29 -41
  129. package/dist/authorization/settings-file-store.d.ts +38 -81
  130. package/dist/authorization/settings-file-store.js +38 -79
  131. package/dist/authorization/types.d.ts +4 -26
  132. package/dist/authorization/types.js +0 -6
  133. package/dist/authorization/validation.d.ts +1 -23
  134. package/dist/authorization/validation.js +1 -24
  135. package/dist/branch-health.d.ts +39 -67
  136. package/dist/branch-health.js +27 -43
  137. package/dist/branch-metadata-file.d.ts +16 -32
  138. package/dist/branch-metadata-file.js +13 -26
  139. package/dist/branch-metadata.d.ts +49 -80
  140. package/dist/branch-metadata.js +57 -87
  141. package/dist/branch-registry.d.ts +26 -64
  142. package/dist/branch-registry.js +44 -93
  143. package/dist/branch-schema-cache.d.ts +34 -124
  144. package/dist/branch-schema-cache.js +49 -155
  145. package/dist/branch-workspace.d.ts +4 -4
  146. package/dist/branch-workspace.js +15 -19
  147. package/dist/build/generate-ai-content.d.ts +1 -0
  148. package/dist/build/generate-ai-content.js +12 -25
  149. package/dist/build-canopy.d.ts +17 -27
  150. package/dist/build-canopy.js +16 -23
  151. package/dist/build-mode.d.ts +25 -27
  152. package/dist/build-mode.js +25 -29
  153. package/dist/cli/cli.d.ts +15 -26
  154. package/dist/cli/cli.js +601 -978
  155. package/dist/cli/generate-ai-content.js +351 -628
  156. package/dist/cli/github-app-manifest.d.ts +84 -0
  157. package/dist/cli/github-app-manifest.js +161 -0
  158. package/dist/cli/init-github-app.d.ts +110 -444
  159. package/dist/cli/init-github-app.js +236 -773
  160. package/dist/cli/init.js +39 -80
  161. package/dist/cli/migrate.d.ts +13 -10
  162. package/dist/cli/migrate.js +22 -30
  163. package/dist/cli/project-detect.d.ts +17 -31
  164. package/dist/cli/project-detect.js +31 -42
  165. package/dist/cli/project-root.d.ts +4 -11
  166. package/dist/cli/project-root.js +4 -11
  167. package/dist/cli/prompt.d.ts +10 -0
  168. package/dist/cli/prompt.js +67 -0
  169. package/dist/cli/sync.d.ts +0 -8
  170. package/dist/cli/sync.js +8 -28
  171. package/dist/cli/template-files/middleware.ts.template +15 -29
  172. package/dist/cli/templates.d.ts +2 -12
  173. package/dist/cli/templates.js +4 -4
  174. package/dist/client.d.ts +1 -1
  175. package/dist/comment-store.d.ts +32 -53
  176. package/dist/comment-store.js +32 -52
  177. package/dist/config/flatten.d.ts +0 -3
  178. package/dist/config/flatten.js +2 -12
  179. package/dist/config/helpers.js +2 -2
  180. package/dist/config/index.d.ts +2 -2
  181. package/dist/config/index.js +1 -4
  182. package/dist/config/schemas/collection.d.ts +0 -8
  183. package/dist/config/schemas/collection.js +0 -10
  184. package/dist/config/schemas/config.d.ts +6 -78
  185. package/dist/config/schemas/config.js +38 -54
  186. package/dist/config/schemas/field.d.ts +2 -242
  187. package/dist/config/schemas/field.js +9 -20
  188. package/dist/config/schemas/media.js +1 -1
  189. package/dist/config/schemas/permissions.js +0 -2
  190. package/dist/config/schemas/url.d.ts +5 -6
  191. package/dist/config/schemas/url.js +5 -6
  192. package/dist/config/types.d.ts +45 -33
  193. package/dist/config/types.js +0 -1
  194. package/dist/config.d.ts +1 -8
  195. package/dist/config.js +1 -9
  196. package/dist/content-id-index.d.ts +76 -188
  197. package/dist/content-id-index.js +79 -230
  198. package/dist/content-index-generation.d.ts +27 -48
  199. package/dist/content-index-generation.js +35 -84
  200. package/dist/content-index-registry.d.ts +15 -24
  201. package/dist/content-index-registry.js +5 -9
  202. package/dist/content-listing.d.ts +64 -107
  203. package/dist/content-listing.js +68 -118
  204. package/dist/content-reader.d.ts +20 -29
  205. package/dist/content-reader.js +10 -18
  206. package/dist/content-store.d.ts +210 -336
  207. package/dist/content-store.js +413 -657
  208. package/dist/content-tree.d.ts +44 -86
  209. package/dist/content-tree.js +26 -54
  210. package/dist/context.d.ts +67 -94
  211. package/dist/context.js +53 -72
  212. package/dist/dev-content-watcher.d.ts +18 -18
  213. package/dist/dev-content-watcher.js +41 -44
  214. package/dist/editor/BranchManager.d.ts +3 -6
  215. package/dist/editor/BranchManager.js +24 -44
  216. package/dist/editor/CanopyEditor.js +5 -2
  217. package/dist/editor/CommentsPanel.js +0 -2
  218. package/dist/editor/Editor.js +19 -76
  219. package/dist/editor/EditorAuthGate.d.ts +27 -0
  220. package/dist/editor/EditorAuthGate.js +140 -0
  221. package/dist/editor/EntryNavigator.js +0 -20
  222. package/dist/editor/FormRenderer.d.ts +1 -2
  223. package/dist/editor/FormRenderer.js +8 -23
  224. package/dist/editor/admin/SystemHealthPanel.js +20 -37
  225. package/dist/editor/admin/useSystemHealth.d.ts +2 -3
  226. package/dist/editor/admin/useSystemHealth.js +10 -12
  227. package/dist/editor/client-reference-resolver.d.ts +2 -5
  228. package/dist/editor/client-reference-resolver.js +2 -19
  229. package/dist/editor/comments/BranchComments.js +0 -4
  230. package/dist/editor/comments/EntryComments.js +0 -4
  231. package/dist/editor/comments/FieldWrapper.js +0 -4
  232. package/dist/editor/comments/InlineCommentThread.js +0 -2
  233. package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
  234. package/dist/editor/comments/ThreadCarousel.js +0 -12
  235. package/dist/editor/components/EditorFooter.d.ts +0 -8
  236. package/dist/editor/components/EditorFooter.js +0 -5
  237. package/dist/editor/components/EditorHeader.d.ts +0 -31
  238. package/dist/editor/components/EditorHeader.js +21 -71
  239. package/dist/editor/components/EditorSidebar.d.ts +0 -19
  240. package/dist/editor/components/EditorSidebar.js +0 -16
  241. package/dist/editor/components/EntryCreateModal.d.ts +4 -4
  242. package/dist/editor/components/EntryCreateModal.js +7 -22
  243. package/dist/editor/components/RenameEntryModal.js +0 -4
  244. package/dist/editor/components/UserBadge.js +0 -10
  245. package/dist/editor/components/index.js +0 -2
  246. package/dist/editor/context/ApiClientContext.d.ts +8 -7
  247. package/dist/editor/context/ApiClientContext.js +39 -11
  248. package/dist/editor/context/AssetContext.d.ts +7 -17
  249. package/dist/editor/context/AssetContext.js +7 -17
  250. package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
  251. package/dist/editor/context/EditorIdentityContext.js +7 -0
  252. package/dist/editor/context/EditorStateContext.d.ts +10 -41
  253. package/dist/editor/context/EditorStateContext.js +7 -23
  254. package/dist/editor/context/SWRProvider.d.ts +3 -6
  255. package/dist/editor/context/index.d.ts +1 -20
  256. package/dist/editor/context/index.js +1 -20
  257. package/dist/editor/editor-utils.d.ts +8 -47
  258. package/dist/editor/editor-utils.js +19 -72
  259. package/dist/editor/fields/BlockField.d.ts +2 -2
  260. package/dist/editor/fields/BlockField.js +1 -2
  261. package/dist/editor/fields/CodeField.d.ts +0 -1
  262. package/dist/editor/fields/CodeField.js +0 -1
  263. package/dist/editor/fields/DateTimeField.d.ts +15 -22
  264. package/dist/editor/fields/DateTimeField.js +17 -26
  265. package/dist/editor/fields/ImageField.d.ts +2 -2
  266. package/dist/editor/fields/ImageField.js +8 -14
  267. package/dist/editor/fields/InlineGroupField.d.ts +0 -1
  268. package/dist/editor/fields/InlineGroupField.js +0 -1
  269. package/dist/editor/fields/MarkdownField.d.ts +0 -1
  270. package/dist/editor/fields/MarkdownField.js +6 -11
  271. package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
  272. package/dist/editor/fields/MdxImageDialog.js +0 -1
  273. package/dist/editor/fields/NumberField.d.ts +9 -19
  274. package/dist/editor/fields/NumberField.js +11 -22
  275. package/dist/editor/fields/NumberListField.d.ts +7 -10
  276. package/dist/editor/fields/NumberListField.js +7 -10
  277. package/dist/editor/fields/ObjectField.d.ts +5 -8
  278. package/dist/editor/fields/ObjectField.js +0 -1
  279. package/dist/editor/fields/ReferenceField.d.ts +1 -1
  280. package/dist/editor/fields/ReferenceField.js +11 -16
  281. package/dist/editor/fields/SelectField.d.ts +2 -2
  282. package/dist/editor/fields/SelectField.js +0 -1
  283. package/dist/editor/fields/StringListField.d.ts +0 -4
  284. package/dist/editor/fields/StringListField.js +4 -9
  285. package/dist/editor/fields/TextField.d.ts +0 -1
  286. package/dist/editor/fields/TextField.js +0 -1
  287. package/dist/editor/fields/ToggleField.d.ts +0 -1
  288. package/dist/editor/fields/ToggleField.js +0 -1
  289. package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
  290. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
  291. package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
  292. package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
  293. package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
  294. package/dist/editor/group-manager/GroupCard.d.ts +0 -3
  295. package/dist/editor/group-manager/GroupForm.d.ts +0 -3
  296. package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
  297. package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
  298. package/dist/editor/group-manager/MemberList.d.ts +0 -3
  299. package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
  300. package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
  301. package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
  302. package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
  303. package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
  304. package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
  305. package/dist/editor/group-manager/index.d.ts +0 -6
  306. package/dist/editor/group-manager/index.js +0 -10
  307. package/dist/editor/group-manager/types.d.ts +2 -5
  308. package/dist/editor/group-manager/types.js +0 -3
  309. package/dist/editor/hooks/index.d.ts +6 -11
  310. package/dist/editor/hooks/index.js +6 -12
  311. package/dist/editor/hooks/useBranchActions.d.ts +0 -14
  312. package/dist/editor/hooks/useBranchActions.js +0 -22
  313. package/dist/editor/hooks/useBranchManager.d.ts +2 -48
  314. package/dist/editor/hooks/useBranchManager.js +4 -64
  315. package/dist/editor/hooks/useBranchesData.d.ts +7 -6
  316. package/dist/editor/hooks/useBranchesData.js +7 -6
  317. package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
  318. package/dist/editor/hooks/useCommentSystem.js +1 -36
  319. package/dist/editor/hooks/useDraftManager.d.ts +2 -35
  320. package/dist/editor/hooks/useDraftManager.js +23 -64
  321. package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
  322. package/dist/editor/hooks/useEditorLayout.js +0 -23
  323. package/dist/editor/hooks/useEntriesData.d.ts +1 -0
  324. package/dist/editor/hooks/useEntriesData.js +2 -3
  325. package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
  326. package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
  327. package/dist/editor/hooks/useEntryManager.d.ts +2 -27
  328. package/dist/editor/hooks/useEntryManager.js +29 -78
  329. package/dist/editor/hooks/useGroupManager.d.ts +0 -21
  330. package/dist/editor/hooks/useGroupManager.js +0 -21
  331. package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
  332. package/dist/editor/hooks/usePermissionManager.js +0 -20
  333. package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
  334. package/dist/editor/hooks/useReferenceResolution.js +1 -48
  335. package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
  336. package/dist/editor/hooks/useSchemaManager.js +0 -19
  337. package/dist/editor/hooks/useUserContext.d.ts +2 -9
  338. package/dist/editor/hooks/useUserContext.js +10 -10
  339. package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
  340. package/dist/editor/hooks/useUserMetadata.js +0 -3
  341. package/dist/editor/media/AssetCard.d.ts +0 -1
  342. package/dist/editor/media/AssetCard.js +1 -2
  343. package/dist/editor/media/CropStep.d.ts +0 -1
  344. package/dist/editor/media/CropStep.js +0 -1
  345. package/dist/editor/media/MediaLibrary.d.ts +1 -2
  346. package/dist/editor/media/MediaLibrary.js +1 -2
  347. package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
  348. package/dist/editor/media/MediaLibraryBody.js +0 -1
  349. package/dist/editor/media/crop-math.d.ts +1 -1
  350. package/dist/editor/media/crop-math.js +1 -1
  351. package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
  352. package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
  353. package/dist/editor/permission-manager/PermissionEditor.js +0 -1
  354. package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
  355. package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
  356. package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
  357. package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
  358. package/dist/editor/permission-manager/constants.d.ts +0 -3
  359. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
  360. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
  361. package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
  362. package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
  363. package/dist/editor/permission-manager/index.d.ts +0 -7
  364. package/dist/editor/permission-manager/index.js +0 -16
  365. package/dist/editor/permission-manager/types.d.ts +2 -12
  366. package/dist/editor/permission-manager/types.js +0 -3
  367. package/dist/editor/permission-manager/utils.d.ts +0 -28
  368. package/dist/editor/permission-manager/utils.js +9 -23
  369. package/dist/editor/preview-bridge.d.ts +5 -1
  370. package/dist/editor/preview-bridge.js +4 -4
  371. package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
  372. package/dist/editor/schema-editor/CollectionEditor.js +9 -31
  373. package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
  374. package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
  375. package/dist/editor/schema-editor/index.d.ts +0 -7
  376. package/dist/editor/schema-editor/index.js +0 -7
  377. package/dist/editor/utils/env.d.ts +3 -18
  378. package/dist/editor/utils/env.js +6 -25
  379. package/dist/entry-link-resolver.d.ts +13 -35
  380. package/dist/entry-link-resolver.js +20 -53
  381. package/dist/entry-schema-registry.d.ts +20 -60
  382. package/dist/entry-schema-registry.js +20 -69
  383. package/dist/entry-schema.d.ts +118 -223
  384. package/dist/entry-schema.js +46 -91
  385. package/dist/git-manager.d.ts +101 -200
  386. package/dist/git-manager.js +211 -384
  387. package/dist/github-service.d.ts +34 -75
  388. package/dist/github-service.js +37 -91
  389. package/dist/http/handler.d.ts +6 -37
  390. package/dist/http/handler.js +65 -120
  391. package/dist/http/router.d.ts +15 -32
  392. package/dist/http/router.js +34 -99
  393. package/dist/http/types.d.ts +15 -40
  394. package/dist/http/types.js +3 -7
  395. package/dist/id.d.ts +4 -10
  396. package/dist/id.js +4 -10
  397. package/dist/index.js +6 -9
  398. package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
  399. package/dist/operating-mode/client-safe-strategy.js +8 -28
  400. package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
  401. package/dist/operating-mode/client-unsafe-strategy.js +9 -34
  402. package/dist/operating-mode/client.d.ts +3 -10
  403. package/dist/operating-mode/client.js +3 -8
  404. package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
  405. package/dist/operating-mode/deployment-name-fixtures.js +14 -18
  406. package/dist/operating-mode/deployment-name.d.ts +19 -29
  407. package/dist/operating-mode/deployment-name.js +29 -47
  408. package/dist/operating-mode/index.d.ts +4 -25
  409. package/dist/operating-mode/index.js +9 -31
  410. package/dist/operating-mode/mode-env.d.ts +32 -54
  411. package/dist/operating-mode/mode-env.js +36 -58
  412. package/dist/operating-mode/types.d.ts +24 -72
  413. package/dist/operating-mode/types.js +1 -7
  414. package/dist/paths/branch-name.d.ts +30 -40
  415. package/dist/paths/branch-name.js +30 -40
  416. package/dist/paths/branch.d.ts +4 -18
  417. package/dist/paths/branch.js +6 -22
  418. package/dist/paths/index.d.ts +2 -13
  419. package/dist/paths/index.js +3 -23
  420. package/dist/paths/normalize-server.d.ts +3 -15
  421. package/dist/paths/normalize-server.js +3 -15
  422. package/dist/paths/normalize.d.ts +13 -33
  423. package/dist/paths/normalize.js +13 -33
  424. package/dist/paths/resolve.d.ts +4 -17
  425. package/dist/paths/resolve.js +4 -22
  426. package/dist/paths/types.d.ts +12 -34
  427. package/dist/paths/types.js +5 -7
  428. package/dist/paths/validation.d.ts +22 -119
  429. package/dist/paths/validation.js +30 -148
  430. package/dist/reference-resolver.d.ts +0 -13
  431. package/dist/reference-resolver.js +0 -18
  432. package/dist/resolve-canopy-user.d.ts +16 -18
  433. package/dist/resolve-canopy-user.js +17 -26
  434. package/dist/resource-generation.d.ts +16 -25
  435. package/dist/resource-generation.js +34 -97
  436. package/dist/schema/meta-loader.d.ts +2 -14
  437. package/dist/schema/meta-loader.js +15 -64
  438. package/dist/schema/resolver.d.ts +1 -4
  439. package/dist/schema/resolver.js +1 -6
  440. package/dist/schema/schema-store-types.d.ts +0 -12
  441. package/dist/schema/schema-store.d.ts +61 -138
  442. package/dist/schema/schema-store.js +85 -282
  443. package/dist/schema/types.d.ts +0 -4
  444. package/dist/server.d.ts +62 -93
  445. package/dist/server.js +63 -94
  446. package/dist/services.d.ts +23 -47
  447. package/dist/services.js +55 -98
  448. package/dist/settings-workspace.d.ts +17 -30
  449. package/dist/settings-workspace.js +51 -81
  450. package/dist/static/index.d.ts +26 -52
  451. package/dist/static/index.js +33 -67
  452. package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
  453. package/dist/task-queue/cms-task-queue.js +13 -0
  454. package/dist/task-queue/task-queue-config.d.ts +3 -0
  455. package/dist/{worker → task-queue}/task-queue-config.js +1 -6
  456. package/dist/task-queue/task-queue.d.ts +16 -22
  457. package/dist/task-queue/task-queue.js +20 -44
  458. package/dist/task-queue/types.d.ts +0 -1
  459. package/dist/task-queue/worker-status.d.ts +35 -0
  460. package/dist/task-queue/worker-status.js +40 -0
  461. package/dist/types.d.ts +40 -51
  462. package/dist/url-collision.d.ts +26 -40
  463. package/dist/url-collision.js +47 -63
  464. package/dist/url-exclusivity-fixtures.d.ts +15 -20
  465. package/dist/url-exclusivity-fixtures.js +14 -19
  466. package/dist/url-path-resolver.d.ts +8 -16
  467. package/dist/url-path-resolver.js +19 -29
  468. package/dist/user.d.ts +8 -21
  469. package/dist/user.js +10 -19
  470. package/dist/utils/async-mutex.js +4 -6
  471. package/dist/utils/atomic-write.d.ts +2 -11
  472. package/dist/utils/atomic-write.js +2 -11
  473. package/dist/utils/body-field.d.ts +8 -15
  474. package/dist/utils/body-field.js +8 -15
  475. package/dist/utils/content-serialize.d.ts +18 -24
  476. package/dist/utils/content-serialize.js +109 -160
  477. package/dist/utils/content-write-lock.d.ts +51 -106
  478. package/dist/utils/content-write-lock.js +66 -111
  479. package/dist/utils/debug.d.ts +7 -23
  480. package/dist/utils/debug.js +7 -23
  481. package/dist/utils/entry-url.d.ts +11 -23
  482. package/dist/utils/entry-url.js +11 -26
  483. package/dist/utils/error.d.ts +25 -90
  484. package/dist/utils/error.js +60 -147
  485. package/dist/utils/flatten-group-fields.d.ts +5 -7
  486. package/dist/utils/flatten-group-fields.js +5 -7
  487. package/dist/utils/format.d.ts +1 -5
  488. package/dist/utils/format.js +1 -5
  489. package/dist/utils/fs.d.ts +3 -4
  490. package/dist/utils/fs.js +3 -4
  491. package/dist/utils/git.d.ts +52 -83
  492. package/dist/utils/git.js +79 -125
  493. package/dist/utils/logger.d.ts +35 -50
  494. package/dist/utils/logger.js +35 -52
  495. package/dist/utils/provisioning-lock.d.ts +23 -35
  496. package/dist/utils/provisioning-lock.js +49 -69
  497. package/dist/utils/sanitize-href.d.ts +5 -10
  498. package/dist/utils/sanitize-href.js +8 -18
  499. package/dist/utils/title-field.d.ts +17 -20
  500. package/dist/utils/title-field.js +18 -27
  501. package/dist/utils/typed-filename.d.ts +20 -48
  502. package/dist/utils/typed-filename.js +25 -61
  503. package/dist/utils/url-prefix.d.ts +3 -3
  504. package/dist/utils/url-prefix.js +3 -3
  505. package/dist/validation/block-structural-keys.d.ts +16 -31
  506. package/dist/validation/block-structural-keys.js +19 -29
  507. package/dist/validation/deletion-checker.d.ts +0 -34
  508. package/dist/validation/deletion-checker.js +1 -43
  509. package/dist/validation/entry-link-validator.d.ts +6 -13
  510. package/dist/validation/entry-link-validator.js +4 -13
  511. package/dist/validation/entry-type-reference-validator.d.ts +13 -18
  512. package/dist/validation/entry-type-reference-validator.js +13 -18
  513. package/dist/validation/entry-validator.d.ts +13 -25
  514. package/dist/validation/entry-validator.js +15 -32
  515. package/dist/validation/field-traversal.d.ts +3 -30
  516. package/dist/validation/field-traversal.js +1 -32
  517. package/dist/validation/reference-validator.d.ts +5 -24
  518. package/dist/validation/reference-validator.js +5 -30
  519. package/dist/worker/cms-worker.d.ts +172 -232
  520. package/dist/worker/cms-worker.js +241 -333
  521. package/dist/worker/git-sync.d.ts +32 -133
  522. package/dist/worker/git-sync.js +129 -191
  523. package/dist/worker/github-auth.d.ts +13 -19
  524. package/dist/worker/github-auth.js +13 -19
  525. package/dist/worker/history-rewrite.d.ts +53 -66
  526. package/dist/worker/history-rewrite.js +54 -60
  527. package/dist/worker/log.d.ts +24 -41
  528. package/dist/worker/log.js +25 -42
  529. package/dist/worker/rebase.d.ts +20 -110
  530. package/dist/worker/rebase.js +279 -354
  531. package/dist/worker/task-runner.d.ts +32 -66
  532. package/dist/worker/task-runner.js +126 -162
  533. package/dist/worker/worker-context.d.ts +41 -81
  534. package/package.json +4 -4
  535. package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
  536. package/dist/worker/task-queue-config.d.ts +0 -8
  537. package/dist/worker/task-queue.js +0 -19
  538. package/dist/worker/worker-status.d.ts +0 -47
  539. package/dist/worker/worker-status.js +0 -52
@@ -1,11 +1,8 @@
1
1
  import type { WorkerContext } from './worker-context.js';
2
2
  /**
3
3
  * [SYNC-H1] The history-rewrite kernel: what happens when the rebase loop
4
- * rewrites history that was ALREADY published to `remote.git` (and from there
5
- * to GitHub).
6
- *
7
- * Extracted from cms-worker.ts because it is the one thing all three of the
8
- * worker's big clusters touch, and for opposite-looking reasons:
4
+ * rewrites history ALREADY published to `remote.git` (and from there to
5
+ * GitHub). It lives here because all three of the worker's clusters touch it:
9
6
  *
10
7
  * - rebase.ts ARMS a rewrite (mark -> publish -> queue) and completes an
11
8
  * interrupted one via `reconcilePendingRewrite`;
@@ -14,99 +11,89 @@ import type { WorkerContext } from './worker-context.js';
14
11
  * - git-sync.ts READS it in `reconcileTrackedBranches`, to tell this worker's
15
12
  * own in-flight rewrite apart from a genuine cross-deployment collision.
16
13
  *
17
- * Leaving these on the class would have made every cluster's module import
18
- * every other one. They share no state beyond four resolved paths, so they
19
- * belong here.
20
- *
21
14
  * THE INVARIANT, since it is spread across those three callers: every force
22
15
  * push leases on a SPECIFIC commit this worker knows its own rebase replaced
23
16
  * -- the marker, or the pre-rebase tip -- never on "whatever remote.git holds
24
- * right now". A lease on the current tip is satisfied by a reviewer's direct
25
- * push to the PR branch and would delete it, silently, from remote.git and
26
- * then from GitHub.
17
+ * right now". A lease on the current tip is satisfied by anyone's direct push
18
+ * to the PR branch and would delete it, silently, from remote.git and then
19
+ * from GitHub.
27
20
  */
28
21
  export type HistoryRewriteContext = Pick<WorkerContext, 'remoteGitPath' | 'contentBranchesPath' | 'taskDir' | 'taskTimeoutMs'>;
29
22
  /**
30
- * What `remote.git` currently holds for `branchRef`, or null when this
31
- * branch was never published there (never submitted) or the ref is
32
- * unreadable.
23
+ * What `remote.git` currently holds for `branchRef`, or null when this branch
24
+ * was never published there (never submitted) or the ref is unreadable.
33
25
  *
34
- * Uses the same explicit `--git-dir` shape as verifyBaseBranchExists()
35
- * in cms-worker.ts: reading a bare repo that way does not depend on
36
- * `safe.bareRepository` being permissive, which is why prod code takes
37
- * this route rather than the config override the test-only `openBareRepo`
38
- * helper uses.
26
+ * Explicit `--git-dir`, like verifyBaseBranchExists() in cms-worker.ts:
27
+ * reading a bare repo that way does not depend on `safe.bareRepository` being
28
+ * permissive, which is why prod code takes this route rather than the config
29
+ * override the test-only `openBareRepo` helper uses.
39
30
  */
40
31
  export declare function readPublishedSha(ctx: Pick<HistoryRewriteContext, 'remoteGitPath'>, branchRef: string): Promise<string | null>;
41
32
  /**
42
33
  * Record that this worker rewrote `expectedSha` out of a branch's already
43
34
  * published history (see BranchMetadata.historyRewrittenFrom).
44
35
  *
45
- * Set-once: if a marker is already present it is LEFT ALONE. Across two
46
- * rebases before any GitHub push lands, GitHub still holds the commit the
47
- * FIRST rebase replaced, so advancing the marker would aim the lease at a
48
- * commit GitHub never had and permanently wedge the branch.
36
+ * Set-once: an existing marker is LEFT ALONE. Across two rebases before any
37
+ * GitHub push lands, GitHub still holds the commit the FIRST rebase replaced,
38
+ * so advancing the marker would aim the lease at a commit GitHub never had and
39
+ * permanently wedge the branch.
49
40
  *
50
- * Re-reads metadata rather than trusting the caller's loop-top snapshot:
51
- * the task loop runs concurrently with syncGit() (see scheduleLoop) and may
52
- * have cleared the marker while this branch was rebasing.
41
+ * Re-reads metadata rather than trusting the caller's snapshot: the task loop
42
+ * runs concurrently with syncGit() and may have cleared the marker while this
43
+ * branch was rebasing.
53
44
  */
54
45
  export declare function markHistoryRewritten(ctx: Pick<HistoryRewriteContext, 'contentBranchesPath'>, branchPath: string, branchDir: string, expectedSha: string): Promise<void>;
55
46
  /**
56
47
  * Clear the marker once GitHub is confirmed to hold the rewritten history.
57
48
  *
58
- * Best-effort only in the sense that a failure here destroys nothing: the
59
- * lease still refuses anything unexpected, and the plain-push fallback only
60
- * ever fast-forwards. It is NOT harmless. A marker that outlives its
61
- * episode can wedge the NEXT one -- if the base advances before the stale
62
- * marker is revisited, the queued push leases a commit GitHub has already
63
- * moved off, falls back to a plain push of a rebased (non-ancestor)
64
- * history, and fails permanently with a "something else moved it on
65
- * GitHub" diagnosis that is false: we did.
49
+ * A failure here destroys nothing (the lease still refuses anything
50
+ * unexpected, and the plain-push fallback only ever fast-forwards) but is NOT
51
+ * harmless: a marker that outlives its episode can wedge the NEXT one. If the
52
+ * base advances before the stale marker is revisited, the queued push leases a
53
+ * commit GitHub has already moved off, falls back to a plain push of a rebased
54
+ * (non-ancestor) history, and fails permanently with a "something else moved
55
+ * it on GitHub" diagnosis that is false -- we did.
66
56
  *
67
- * Tracked, with the concurrent-clear race that can drop a marker
68
- * mid-arming, in
69
- * .claude/future-tasks/worker-history-rewrite-marker-races.md.
57
+ * Tracked, with the concurrent-clear race that can drop a marker mid-arming,
58
+ * in .claude/future-tasks/worker-history-rewrite-marker-races.md.
70
59
  */
71
60
  export declare function clearHistoryRewrittenMarker(ctx: Pick<HistoryRewriteContext, 'contentBranchesPath'>, branchPath: string, branchDir: string): Promise<void>;
72
61
  /**
73
62
  * Publish a branch clone's rebased history into `remote.git`, replacing
74
63
  * EXACTLY `expectedSha` and nothing else.
75
64
  *
76
- * The lease is the entire safety argument. `--force-with-lease=<ref>:<sha>`
77
- * refuses unless `remote.git` still stands at `<sha>`, so this can only
78
- * ever undo the commit our own rebase rewrote away. Callers must never pass
79
- * "whatever remote.git currently holds" -- see the arming guard in
80
- * rebase.ts's carryForwardRewrittenHistory for the interleaving where that
81
- * would silently delete a reviewer's direct push.
65
+ * The lease is the entire safety argument: `--force-with-lease=<ref>:<sha>`
66
+ * refuses unless `remote.git` still stands at `<sha>`, so this can only ever
67
+ * undo the commit our own rebase rewrote away. Callers must NEVER pass
68
+ * "whatever remote.git currently holds" -- see the arming guard in rebase.ts's
69
+ * carryForwardRewrittenHistory for the interleaving where that would silently
70
+ * delete someone's direct push.
82
71
  *
83
- * Returns whether the push landed. A refused lease means a concurrent
84
- * Lambda push moved the ref; that is logged and retried by the self-heal
85
- * pass on a later cycle, never thrown.
72
+ * Returns whether the push landed. A refused lease means a concurrent Lambda
73
+ * push moved the ref; logged and retried by the self-heal pass, never thrown.
86
74
  */
87
75
  export declare function forcePublishToLocalRemote(ctx: Pick<HistoryRewriteContext, 'taskTimeoutMs'>, branchPath: string, branchRef: string, expectedSha: string): Promise<boolean>;
88
76
  /**
89
77
  * Queue the GitHub hop for a branch whose rewritten history now sits in
90
- * `remote.git`, so an open PR's head follows the rebase within a cycle
91
- * instead of waiting for the editor's next submit.
78
+ * `remote.git`, so an open PR's head follows the rebase within a cycle instead
79
+ * of waiting for the editor's next submit.
92
80
  *
93
- * Deliberately NOT skipped when a marker is already set: inferring "a task
94
- * must already be queued" from the marker starves this hop whenever a task
95
- * was lost, failed permanently, or was never written. Duplicate push tasks
96
- * are bounded by base-branch advances and are idempotent (a repeat push is
97
- * a no-op once GitHub holds the tip).
81
+ * Deliberately NOT skipped when a marker is already set: inferring "a task must
82
+ * already be queued" from the marker starves this hop whenever a task was lost,
83
+ * failed permanently, or was never written. Duplicate push tasks are bounded by
84
+ * base-branch advances and are idempotent.
98
85
  */
99
86
  export declare function enqueueGitHubPush(ctx: Pick<HistoryRewriteContext, 'taskDir'>, branchRef: string): Promise<void>;
100
87
  /**
101
- * Complete a rewrite this worker started but did not finish: get the
102
- * rebased history into `remote.git` and queued for GitHub.
88
+ * Complete a rewrite this worker started but did not finish: get the rebased
89
+ * history into `remote.git` and queued for GitHub.
103
90
  *
104
- * Runs from the rebase loop for any branch carrying a marker, whether or
105
- * not it is behind base this cycle, so an interrupted publish converges
106
- * without waiting for the next base-branch advance.
91
+ * Runs from the rebase loop for any branch carrying a marker, whether or not it
92
+ * is behind base this cycle, so an interrupted publish converges without
93
+ * waiting for the next base-branch advance.
107
94
  *
108
- * Always leases on the MARKER, never on remote.git's current tip -- the
109
- * marker is the one commit we know our own rebase replaced.
95
+ * Always leases on the MARKER, never on remote.git's current tip -- the marker
96
+ * is the one commit we know our own rebase replaced.
110
97
  */
111
98
  export declare function reconcilePendingRewrite(ctx: HistoryRewriteContext, options: {
112
99
  branchPath: string;
@@ -120,10 +107,10 @@ export declare function reconcilePendingRewrite(ctx: HistoryRewriteContext, opti
120
107
  * rewrote already-published history and the GitHub push has not landed yet
121
108
  * (see BranchMetadata.historyRewrittenFrom).
122
109
  *
123
- * `branchName` is a git ref name; branch workspaces are directories named
124
- * with the sanitized form, hence the conversion. Best-effort: a settings
125
- * branch (no workspace at all), a missing directory or an unreadable
126
- * branch.json all mean "no known rewrite", which is the conservative
127
- * answer -- it keeps the branch in the louder `diverged` bucket.
110
+ * `branchName` is a git ref name; branch workspaces are directories named with
111
+ * the sanitized form, hence the conversion. Best-effort: a settings branch (no
112
+ * workspace at all), a missing directory or an unreadable branch.json all mean
113
+ * "no known rewrite", the conservative answer -- it keeps the branch in the
114
+ * louder `diverged` bucket.
128
115
  */
129
116
  export declare function hasPendingHistoryRewrite(ctx: Pick<HistoryRewriteContext, 'contentBranchesPath'>, branchName: string): Promise<boolean>;
@@ -5,18 +5,16 @@ import { gitChildEnv } from '../git-manager.js';
5
5
  import { sanitizeBranchName } from '../paths/branch-name.js';
6
6
  import { getErrorMessage, redactCredentials } from '../utils/error.js';
7
7
  import { isStaleLeaseRejection } from '../utils/git.js';
8
- import { enqueueTask, listTasks } from './task-queue.js';
8
+ import { enqueueTask, listTasks } from '../task-queue/cms-task-queue.js';
9
9
  import { workerLog, workerLogWarn } from './log.js';
10
10
  /**
11
- * What `remote.git` currently holds for `branchRef`, or null when this
12
- * branch was never published there (never submitted) or the ref is
13
- * unreadable.
11
+ * What `remote.git` currently holds for `branchRef`, or null when this branch
12
+ * was never published there (never submitted) or the ref is unreadable.
14
13
  *
15
- * Uses the same explicit `--git-dir` shape as verifyBaseBranchExists()
16
- * in cms-worker.ts: reading a bare repo that way does not depend on
17
- * `safe.bareRepository` being permissive, which is why prod code takes
18
- * this route rather than the config override the test-only `openBareRepo`
19
- * helper uses.
14
+ * Explicit `--git-dir`, like verifyBaseBranchExists() in cms-worker.ts:
15
+ * reading a bare repo that way does not depend on `safe.bareRepository` being
16
+ * permissive, which is why prod code takes this route rather than the config
17
+ * override the test-only `openBareRepo` helper uses.
20
18
  */
21
19
  export async function readPublishedSha(ctx, branchRef) {
22
20
  try {
@@ -40,14 +38,14 @@ export async function readPublishedSha(ctx, branchRef) {
40
38
  * Record that this worker rewrote `expectedSha` out of a branch's already
41
39
  * published history (see BranchMetadata.historyRewrittenFrom).
42
40
  *
43
- * Set-once: if a marker is already present it is LEFT ALONE. Across two
44
- * rebases before any GitHub push lands, GitHub still holds the commit the
45
- * FIRST rebase replaced, so advancing the marker would aim the lease at a
46
- * commit GitHub never had and permanently wedge the branch.
41
+ * Set-once: an existing marker is LEFT ALONE. Across two rebases before any
42
+ * GitHub push lands, GitHub still holds the commit the FIRST rebase replaced,
43
+ * so advancing the marker would aim the lease at a commit GitHub never had and
44
+ * permanently wedge the branch.
47
45
  *
48
- * Re-reads metadata rather than trusting the caller's loop-top snapshot:
49
- * the task loop runs concurrently with syncGit() (see scheduleLoop) and may
50
- * have cleared the marker while this branch was rebasing.
46
+ * Re-reads metadata rather than trusting the caller's snapshot: the task loop
47
+ * runs concurrently with syncGit() and may have cleared the marker while this
48
+ * branch was rebasing.
51
49
  */
52
50
  export async function markHistoryRewritten(ctx, branchPath, branchDir, expectedSha) {
53
51
  const current = await BranchMetadataFileManager.loadOnly(branchPath);
@@ -59,18 +57,16 @@ export async function markHistoryRewritten(ctx, branchPath, branchDir, expectedS
59
57
  /**
60
58
  * Clear the marker once GitHub is confirmed to hold the rewritten history.
61
59
  *
62
- * Best-effort only in the sense that a failure here destroys nothing: the
63
- * lease still refuses anything unexpected, and the plain-push fallback only
64
- * ever fast-forwards. It is NOT harmless. A marker that outlives its
65
- * episode can wedge the NEXT one -- if the base advances before the stale
66
- * marker is revisited, the queued push leases a commit GitHub has already
67
- * moved off, falls back to a plain push of a rebased (non-ancestor)
68
- * history, and fails permanently with a "something else moved it on
69
- * GitHub" diagnosis that is false: we did.
60
+ * A failure here destroys nothing (the lease still refuses anything
61
+ * unexpected, and the plain-push fallback only ever fast-forwards) but is NOT
62
+ * harmless: a marker that outlives its episode can wedge the NEXT one. If the
63
+ * base advances before the stale marker is revisited, the queued push leases a
64
+ * commit GitHub has already moved off, falls back to a plain push of a rebased
65
+ * (non-ancestor) history, and fails permanently with a "something else moved
66
+ * it on GitHub" diagnosis that is false -- we did.
70
67
  *
71
- * Tracked, with the concurrent-clear race that can drop a marker
72
- * mid-arming, in
73
- * .claude/future-tasks/worker-history-rewrite-marker-races.md.
68
+ * Tracked, with the concurrent-clear race that can drop a marker mid-arming,
69
+ * in .claude/future-tasks/worker-history-rewrite-marker-races.md.
74
70
  */
75
71
  export async function clearHistoryRewrittenMarker(ctx, branchPath, branchDir) {
76
72
  try {
@@ -87,23 +83,22 @@ export async function clearHistoryRewrittenMarker(ctx, branchPath, branchDir) {
87
83
  * Publish a branch clone's rebased history into `remote.git`, replacing
88
84
  * EXACTLY `expectedSha` and nothing else.
89
85
  *
90
- * The lease is the entire safety argument. `--force-with-lease=<ref>:<sha>`
91
- * refuses unless `remote.git` still stands at `<sha>`, so this can only
92
- * ever undo the commit our own rebase rewrote away. Callers must never pass
93
- * "whatever remote.git currently holds" -- see the arming guard in
94
- * rebase.ts's carryForwardRewrittenHistory for the interleaving where that
95
- * would silently delete a reviewer's direct push.
86
+ * The lease is the entire safety argument: `--force-with-lease=<ref>:<sha>`
87
+ * refuses unless `remote.git` still stands at `<sha>`, so this can only ever
88
+ * undo the commit our own rebase rewrote away. Callers must NEVER pass
89
+ * "whatever remote.git currently holds" -- see the arming guard in rebase.ts's
90
+ * carryForwardRewrittenHistory for the interleaving where that would silently
91
+ * delete someone's direct push.
96
92
  *
97
- * Returns whether the push landed. A refused lease means a concurrent
98
- * Lambda push moved the ref; that is logged and retried by the self-heal
99
- * pass on a later cycle, never thrown.
93
+ * Returns whether the push landed. A refused lease means a concurrent Lambda
94
+ * push moved the ref; logged and retried by the self-heal pass, never thrown.
100
95
  */
101
96
  export async function forcePublishToLocalRemote(ctx, branchPath, branchRef, expectedSha) {
102
- // A dedicated instance rather than the caller's: `.env()` replaces the
103
- // whole child environment, and the rebase loop's instance must keep its
104
- // ambient one. gitChildEnv (not gitNetworkChildEnv) because this push
105
- // targets the local bare repo -- and the locale pin is what keeps
106
- // isStaleLeaseRejection below from silently becoming a no-op.
97
+ // A dedicated instance rather than the caller's: `.env()` replaces the whole
98
+ // child environment, and the rebase loop's instance must keep its ambient
99
+ // one. gitChildEnv (not gitNetworkChildEnv) because this push targets the
100
+ // local bare repo -- and its locale pin is what keeps isStaleLeaseRejection
101
+ // below from silently becoming a no-op on a non-English host.
107
102
  const pushGit = simpleGit({ baseDir: branchPath, timeout: { block: ctx.taskTimeoutMs } });
108
103
  pushGit.env(gitChildEnv({}));
109
104
  try {
@@ -129,14 +124,13 @@ export async function forcePublishToLocalRemote(ctx, branchPath, branchRef, expe
129
124
  }
130
125
  /**
131
126
  * Queue the GitHub hop for a branch whose rewritten history now sits in
132
- * `remote.git`, so an open PR's head follows the rebase within a cycle
133
- * instead of waiting for the editor's next submit.
127
+ * `remote.git`, so an open PR's head follows the rebase within a cycle instead
128
+ * of waiting for the editor's next submit.
134
129
  *
135
- * Deliberately NOT skipped when a marker is already set: inferring "a task
136
- * must already be queued" from the marker starves this hop whenever a task
137
- * was lost, failed permanently, or was never written. Duplicate push tasks
138
- * are bounded by base-branch advances and are idempotent (a repeat push is
139
- * a no-op once GitHub holds the tip).
130
+ * Deliberately NOT skipped when a marker is already set: inferring "a task must
131
+ * already be queued" from the marker starves this hop whenever a task was lost,
132
+ * failed permanently, or was never written. Duplicate push tasks are bounded by
133
+ * base-branch advances and are idempotent.
140
134
  */
141
135
  export async function enqueueGitHubPush(ctx, branchRef) {
142
136
  try {
@@ -157,15 +151,15 @@ export async function enqueueGitHubPush(ctx, branchRef) {
157
151
  }
158
152
  }
159
153
  /**
160
- * Complete a rewrite this worker started but did not finish: get the
161
- * rebased history into `remote.git` and queued for GitHub.
154
+ * Complete a rewrite this worker started but did not finish: get the rebased
155
+ * history into `remote.git` and queued for GitHub.
162
156
  *
163
- * Runs from the rebase loop for any branch carrying a marker, whether or
164
- * not it is behind base this cycle, so an interrupted publish converges
165
- * without waiting for the next base-branch advance.
157
+ * Runs from the rebase loop for any branch carrying a marker, whether or not it
158
+ * is behind base this cycle, so an interrupted publish converges without
159
+ * waiting for the next base-branch advance.
166
160
  *
167
- * Always leases on the MARKER, never on remote.git's current tip -- the
168
- * marker is the one commit we know our own rebase replaced.
161
+ * Always leases on the MARKER, never on remote.git's current tip -- the marker
162
+ * is the one commit we know our own rebase replaced.
169
163
  */
170
164
  export async function reconcilePendingRewrite(ctx, options) {
171
165
  const { branchPath, branchDir, branchRef, headSha, marker } = options;
@@ -198,11 +192,11 @@ export async function reconcilePendingRewrite(ctx, options) {
198
192
  * rewrote already-published history and the GitHub push has not landed yet
199
193
  * (see BranchMetadata.historyRewrittenFrom).
200
194
  *
201
- * `branchName` is a git ref name; branch workspaces are directories named
202
- * with the sanitized form, hence the conversion. Best-effort: a settings
203
- * branch (no workspace at all), a missing directory or an unreadable
204
- * branch.json all mean "no known rewrite", which is the conservative
205
- * answer -- it keeps the branch in the louder `diverged` bucket.
195
+ * `branchName` is a git ref name; branch workspaces are directories named with
196
+ * the sanitized form, hence the conversion. Best-effort: a settings branch (no
197
+ * workspace at all), a missing directory or an unreadable branch.json all mean
198
+ * "no known rewrite", the conservative answer -- it keeps the branch in the
199
+ * louder `diverged` bucket.
206
200
  */
207
201
  export async function hasPendingHistoryRewrite(ctx, branchName) {
208
202
  try {
@@ -1,41 +1,26 @@
1
1
  /**
2
2
  * Timestamp-prefixed logging for the CMS worker daemon.
3
3
  *
4
- * The worker's stdout AND stderr both append to
5
- * `/var/log/canopy-worker/worker.log` (see the systemd unit written by
6
- * `packages/canopycms-cdk/src/constructs/cms-service.ts` user-data), which the
7
- * amazon-cloudwatch-agent tails. That arrangement loses two things a bare
8
- * `console.log` used to get for free under journald:
4
+ * INVARIANT: every line written to worker.log starts with this ISO-8601
5
+ * timestamp and a level tag. The worker's stdout AND stderr both append to
6
+ * `/var/log/canopy-worker/worker.log` (the systemd unit written by
7
+ * `packages/canopycms-cdk/src/constructs/cms-service.ts` user-data), so the
8
+ * level tag is the only thing separating `console.log` from `console.error`
9
+ * downstream; and the amazon-cloudwatch-agent that tails it keys
10
+ * `multi_line_start_pattern` on the timestamp, so a stack trace collapses into
11
+ * ONE event while any UNPREFIXED line is appended to the preceding event
12
+ * instead of starting its own. CloudWatch's own stamp is INGESTION time, which
13
+ * skews most exactly when it matters (agent hiccup, buffered burst, restart).
9
14
  *
10
- * 1. **A real timestamp.** CloudWatch otherwise stamps events with their
11
- * *ingestion* time - when the agent read and shipped the line, not when the
12
- * worker emitted it. The skew is small in steady state and largest exactly
13
- * when it matters most (agent hiccup, buffered burst, instance restart).
14
- * 2. **Severity.** Both streams land in one file, so `console.log` and
15
- * `console.error` are indistinguishable downstream. The level tag restores
16
- * it as a greppable field (`filter @message like /ERROR/`).
15
+ * Hence the AWS entrypoint (`packages/canopycms-cdk/worker/index.ts`) imports
16
+ * these helpers rather than calling `console`. Node's own uncaught-exception
17
+ * dump on the way down is the one uncovered case.
17
18
  *
18
- * INVARIANT: every line written to worker.log must start with this ISO-8601
19
- * timestamp. The agent config sets `multi_line_start_pattern` keyed on that
20
- * prefix so a stack trace collapses into ONE CloudWatch event instead of
21
- * fragmenting line-by-line - which also means any line WITHOUT the prefix is
22
- * appended to the preceding event rather than starting its own. That is why
23
- * the AWS entrypoint (`packages/canopycms-cdk/worker/index.ts`) imports these
24
- * helpers too rather than calling `console` directly. Output Node itself
25
- * prints (an uncaught-exception dump on the way down) is the one uncovered
26
- * case: it attaches to the previous event, still strictly better than the
27
- * per-line fragmentation it replaces.
28
- *
29
- * The timestamp and level are passed as SEPARATE console arguments rather than
30
- * concatenated into the message, so console's native formatting of non-string
31
- * arguments survives - Errors keep their stacks, objects keep their inspection
32
- * output.
33
- */
34
- /**
35
- * Named `workerLog*` rather than a bare `log`/`logError`: `CmsWorker` already
36
- * carries a `private log = cmsTaskQueueLogger` field, and two different things
37
- * called `log` in one file is a readability trap.
19
+ * The timestamp and level are SEPARATE console arguments, never concatenated
20
+ * into the message, so console's native formatting of non-string arguments
21
+ * survives - Errors keep their stacks.
38
22
  */
23
+ /** Named `workerLog*`, not `log`: `CmsWorker` already carries a `log` field. */
39
24
  /** Informational worker output. Routes to stdout. */
40
25
  export declare function workerLog(...args: unknown[]): void;
41
26
  /** Recoverable problem - the worker carries on. Routes to stderr. */
@@ -45,16 +30,14 @@ export declare function workerLogError(...args: unknown[]): void;
45
30
  /**
46
31
  * Point the shared `canopyLog*` helpers (`utils/logger.ts`) at the prefixing
47
32
  * functions above, so modules the worker executes but does not own -
48
- * `github-service.ts`, `branch-registry.ts` - satisfy the INVARIANT documented
49
- * at the top of this file instead of writing bare, unprefixed lines into
50
- * worker.log.
33
+ * `github-service.ts`, `branch-registry.ts` - satisfy the INVARIANT above
34
+ * instead of writing bare lines into worker.log. The eslint ban on bare
35
+ * `console` covers the two worker directories but cannot reach those shared
36
+ * modules, which are legitimately plain `console` under Lambda.
51
37
  *
52
38
  * Call this ONCE, first thing in a worker entrypoint, before any work that
53
- * could log. Deliberately not a module-level side effect: importing
54
- * `worker/log.ts` (or anything that re-exports it) must not silently
55
- * reconfigure logging for a Lambda or dev-server process that merely wants the
56
- * helpers' types. The eslint override for the two worker directories bans bare
57
- * `console` there, but it cannot reach the shared modules above - those are
58
- * legitimately plain `console` under Lambda. This is the half that covers them.
39
+ * could log. Deliberately not a module-level side effect: importing this module
40
+ * must not reconfigure logging for a Lambda or dev-server process that merely
41
+ * wants the helpers' types.
59
42
  */
60
43
  export declare function installWorkerLogger(): void;
@@ -1,46 +1,31 @@
1
1
  /**
2
2
  * Timestamp-prefixed logging for the CMS worker daemon.
3
3
  *
4
- * The worker's stdout AND stderr both append to
5
- * `/var/log/canopy-worker/worker.log` (see the systemd unit written by
6
- * `packages/canopycms-cdk/src/constructs/cms-service.ts` user-data), which the
7
- * amazon-cloudwatch-agent tails. That arrangement loses two things a bare
8
- * `console.log` used to get for free under journald:
4
+ * INVARIANT: every line written to worker.log starts with this ISO-8601
5
+ * timestamp and a level tag. The worker's stdout AND stderr both append to
6
+ * `/var/log/canopy-worker/worker.log` (the systemd unit written by
7
+ * `packages/canopycms-cdk/src/constructs/cms-service.ts` user-data), so the
8
+ * level tag is the only thing separating `console.log` from `console.error`
9
+ * downstream; and the amazon-cloudwatch-agent that tails it keys
10
+ * `multi_line_start_pattern` on the timestamp, so a stack trace collapses into
11
+ * ONE event while any UNPREFIXED line is appended to the preceding event
12
+ * instead of starting its own. CloudWatch's own stamp is INGESTION time, which
13
+ * skews most exactly when it matters (agent hiccup, buffered burst, restart).
9
14
  *
10
- * 1. **A real timestamp.** CloudWatch otherwise stamps events with their
11
- * *ingestion* time - when the agent read and shipped the line, not when the
12
- * worker emitted it. The skew is small in steady state and largest exactly
13
- * when it matters most (agent hiccup, buffered burst, instance restart).
14
- * 2. **Severity.** Both streams land in one file, so `console.log` and
15
- * `console.error` are indistinguishable downstream. The level tag restores
16
- * it as a greppable field (`filter @message like /ERROR/`).
15
+ * Hence the AWS entrypoint (`packages/canopycms-cdk/worker/index.ts`) imports
16
+ * these helpers rather than calling `console`. Node's own uncaught-exception
17
+ * dump on the way down is the one uncovered case.
17
18
  *
18
- * INVARIANT: every line written to worker.log must start with this ISO-8601
19
- * timestamp. The agent config sets `multi_line_start_pattern` keyed on that
20
- * prefix so a stack trace collapses into ONE CloudWatch event instead of
21
- * fragmenting line-by-line - which also means any line WITHOUT the prefix is
22
- * appended to the preceding event rather than starting its own. That is why
23
- * the AWS entrypoint (`packages/canopycms-cdk/worker/index.ts`) imports these
24
- * helpers too rather than calling `console` directly. Output Node itself
25
- * prints (an uncaught-exception dump on the way down) is the one uncovered
26
- * case: it attaches to the previous event, still strictly better than the
27
- * per-line fragmentation it replaces.
28
- *
29
- * The timestamp and level are passed as SEPARATE console arguments rather than
30
- * concatenated into the message, so console's native formatting of non-string
31
- * arguments survives - Errors keep their stacks, objects keep their inspection
32
- * output.
19
+ * The timestamp and level are SEPARATE console arguments, never concatenated
20
+ * into the message, so console's native formatting of non-string arguments
21
+ * survives - Errors keep their stacks.
33
22
  */
34
23
  import { setCanopyLogger } from '../utils/logger.js';
35
- /** ISO-8601 with milliseconds, e.g. `2026-08-12T14:30:00.000Z`. */
24
+ /** ISO-8601 with milliseconds: `YYYY-MM-DDTHH:mm:ss.sssZ`. */
36
25
  function timestamp() {
37
26
  return new Date().toISOString();
38
27
  }
39
- /**
40
- * Named `workerLog*` rather than a bare `log`/`logError`: `CmsWorker` already
41
- * carries a `private log = cmsTaskQueueLogger` field, and two different things
42
- * called `log` in one file is a readability trap.
43
- */
28
+ /** Named `workerLog*`, not `log`: `CmsWorker` already carries a `log` field. */
44
29
  /** Informational worker output. Routes to stdout. */
45
30
  export function workerLog(...args) {
46
31
  console.log(timestamp(), 'INFO', ...args);
@@ -56,17 +41,15 @@ export function workerLogError(...args) {
56
41
  /**
57
42
  * Point the shared `canopyLog*` helpers (`utils/logger.ts`) at the prefixing
58
43
  * functions above, so modules the worker executes but does not own -
59
- * `github-service.ts`, `branch-registry.ts` - satisfy the INVARIANT documented
60
- * at the top of this file instead of writing bare, unprefixed lines into
61
- * worker.log.
44
+ * `github-service.ts`, `branch-registry.ts` - satisfy the INVARIANT above
45
+ * instead of writing bare lines into worker.log. The eslint ban on bare
46
+ * `console` covers the two worker directories but cannot reach those shared
47
+ * modules, which are legitimately plain `console` under Lambda.
62
48
  *
63
49
  * Call this ONCE, first thing in a worker entrypoint, before any work that
64
- * could log. Deliberately not a module-level side effect: importing
65
- * `worker/log.ts` (or anything that re-exports it) must not silently
66
- * reconfigure logging for a Lambda or dev-server process that merely wants the
67
- * helpers' types. The eslint override for the two worker directories bans bare
68
- * `console` there, but it cannot reach the shared modules above - those are
69
- * legitimately plain `console` under Lambda. This is the half that covers them.
50
+ * could log. Deliberately not a module-level side effect: importing this module
51
+ * must not reconfigure logging for a Lambda or dev-server process that merely
52
+ * wants the helpers' types.
70
53
  */
71
54
  export function installWorkerLogger() {
72
55
  setCanopyLogger({ log: workerLog, warn: workerLogWarn, error: workerLogError });