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,49 +1,25 @@
1
1
  import type { Octokit } from '@octokit/rest';
2
2
  import type { SanitizedBranchName } from '../paths/types.js';
3
- import type { Task, TaskQueueLogger } from './task-queue.js';
3
+ import type { Task, TaskQueueLogger } from '../task-queue/cms-task-queue.js';
4
4
  import type { WorkerStatusReport } from '../types.js';
5
5
  /**
6
6
  * The slice of {@link import('./cms-worker.js').CmsWorker} that its extracted
7
- * clusters (task-runner.ts, git-sync.ts, rebase.ts, history-rewrite.ts) are
8
- * allowed to reach.
7
+ * clusters (task-runner.ts, git-sync.ts, rebase.ts, history-rewrite.ts) may
8
+ * reach — the ONLY channel between the class and that code. Each module narrows
9
+ * it further with a `Pick<WorkerContext, ...>` alias, so a function's signature
10
+ * names its real dependency set rather than the union.
9
11
  *
10
- * `CmsWorker` used to be 2,949 lines holding four disjoint call trees under one
11
- * entry point, sharing six helper methods and a 16-field config. The clusters
12
- * now live in their own modules as free functions taking this context, and the
13
- * class keeps thin delegating methods. This interface is what makes the sharing
14
- * explicit: it is the ONLY channel between the class and the extracted code, so
15
- * "what does the rebase loop actually need from the worker?" has an answer you
16
- * can read, rather than being whatever `this.` happens to resolve to.
17
- *
18
- * Each module narrows it further with a `Pick<WorkerContext, ...>` alias, so a
19
- * function's signature names its real dependency set rather than the union.
20
- *
21
- * ## Why the second group are FUNCTIONS, not fields
22
- *
23
- * Everything below the divider is resolved by CALLING back onto the live
24
- * `CmsWorker` instance, never snapshotted into the context object. That is
25
- * load-bearing, not stylistic. The worker's ten `cms-worker*.test.ts` files drive it by
26
- * reaching through the instance:
27
- *
28
- * - `cms-worker.test.ts` and `cms-worker-sync-reconcile.test.ts` REPLACE
29
- * `buildGitHubUrl` on the instance to redirect pushes at a local fixture repo
30
- * instead of github.com;
31
- * - `cms-worker-merge-poll.test.ts` and `cms-worker.test.ts` ASSIGN a mock over
32
- * the `octokit` field;
33
- * - `cms-worker.test.ts` REPLACES `executeTask` (to drive the retry/timeout
34
- * paths without real work) and `pushBranchToGitHub` (to exercise the PR
35
- * actions with no git remote), then asserts on the replacement;
36
- * - several set `running` directly instead of calling `start()`;
37
- * - `cms-worker-content-lock.test.ts` SUBCLASSES `CmsWorker` to override the two
38
- * `afterConflictDetectedForTesting`/`afterRebaseCompletedForTesting` hooks.
39
- *
40
- * A context built with `octokit: this.octokit` would capture the real Octokit
41
- * before the test ever installs its mock, and a captured `buildGitHubUrl` string
42
- * would send a test's push to github.com for real. Writing them as functions
43
- * (`ctx.octokit()`, `ctx.buildGitHubUrl()`) makes the late binding visible at
44
- * every call site, which a getter would hide. `CmsWorker.ctx()` builds a fresh
45
- * context per call for the same reason — there is no long-lived object for a
46
- * stale reference to hide in.
12
+ * INVARIANT: everything below the divider is a FUNCTION, resolved by CALLING
13
+ * back onto the live instance and never snapshotted, and `CmsWorker.ctx()`
14
+ * builds a fresh context per call. That is load-bearing, not stylistic. The
15
+ * `cms-worker*.test.ts` files drive the class by reaching through the instance:
16
+ * they REPLACE `buildGitHubUrl` (aiming pushes at a local fixture repo rather
17
+ * than github.com), `executeTask` and `pushBranchToGitHub`, ASSIGN a mock over
18
+ * the `octokit` field, set `running` directly, and SUBCLASS to override the two
19
+ * rebase test hooks. A context that captured any of those at construction would
20
+ * hand the extracted code the pre-test value — which for `buildGitHubUrl` means
21
+ * a test's push going to github.com for real. Functions (`ctx.octokit()`) make
22
+ * the late binding visible at every call site, which a getter would hide.
47
23
  */
48
24
  export interface WorkerContext {
49
25
  /** GitHub owner, e.g. 'safeinsights'. */
@@ -56,8 +32,8 @@ export interface WorkerContext {
56
32
  */
57
33
  readonly baseBranch: string;
58
34
  /**
59
- * The base branch's workspace DIRECTORY name. Computed once so every
60
- * filesystem call site agrees instead of re-deriving it and risking drift.
35
+ * The base branch's workspace DIRECTORY name, computed once so every
36
+ * filesystem call site agrees instead of re-deriving it.
61
37
  */
62
38
  readonly sanitizedBaseBranch: SanitizedBranchName;
63
39
  /** `{workspacePath}/.tasks` — the task queue and worker-status.json. */
@@ -80,34 +56,24 @@ export interface WorkerContext {
80
56
  octokit(): Octokit;
81
57
  /**
82
58
  * The tokenized GitHub clone URL, resolved at call time (tests replace this
83
- * method to point at a local fixture repo).
59
+ * method to point at a local fixture repo). Async because under GitHub App
60
+ * auth the credential is minted on demand and lasts about an hour (see
61
+ * worker/github-auth.ts); the token path resolves immediately.
84
62
  *
85
- * Async because the credential need not be something the worker already
86
- * holds: a credential that has to be fetched or minted cannot be assembled
87
- * synchronously out of config. Under GitHub App auth it is minted on
88
- * demand and lasts about an hour (see worker/github-auth.ts); the personal
89
- * access token path still resolves immediately.
90
- *
91
- * A caller that needs the URL more than once must resolve it ONCE into a
92
- * local and reuse that, rather than calling again per push -- see
93
- * pushBranchToGitHub, where a second resolution inside the stale-lease catch
94
- * block would replace the very error being classified.
95
- *
96
- * Anything derived from it can embed the bot token, so a message that reaches
97
- * worker-status.json, branch.json or a task file must go through
98
- * `redactCredentials` first.
63
+ * A caller that needs the URL more than once resolves it ONCE into a local --
64
+ * see pushBranchToGitHub, where a second resolution inside the stale-lease
65
+ * catch would replace the very error being classified. Anything derived from
66
+ * it can embed the bot token, so a message reaching worker-status.json,
67
+ * branch.json or a task file goes through `redactCredentials` first.
99
68
  */
100
69
  buildGitHubUrl(): Promise<string>;
101
70
  /**
102
71
  * Re-read the GitHub credential because an operation that used it just
103
- * failed, read at call time.
104
- *
105
- * Best-effort and NEVER throws: a failed read, or one that does not settle
106
- * within `taskTimeoutMs`, is logged and swallowed, because every caller is
107
- * already handling a failure and that failure is the one to report. Once it
108
- * resolves, the next `buildGitHubUrl()` or `octokit()` call sees any rotated
109
- * value. See `CmsWorker.refreshGitHubCredential` for the two call sites and
110
- * why neither is gated on the error's shape.
72
+ * failed, read at call time. Best-effort and NEVER throws: a failed read, or
73
+ * one that does not settle within `taskTimeoutMs`, is logged and swallowed,
74
+ * because every caller is already reporting the failure that matters. The
75
+ * next `buildGitHubUrl()`/`octokit()` sees any rotated value. See
76
+ * `CmsWorker.refreshGitHubCredential`.
111
77
  */
112
78
  refreshGitHubCredential(): Promise<void>;
113
79
  /**
@@ -116,23 +82,18 @@ export interface WorkerContext {
116
82
  */
117
83
  branchWorkspacePath(branchRefName: string): string;
118
84
  /**
119
- * Run one task, read at call time.
120
- *
121
- * Routed back through the instance even though the implementation lives in
122
- * task-runner.ts beside its only caller, because cms-worker.test.ts REPLACES
123
- * this method on the instance to drive the retry and timeout paths without
124
- * doing real work. `executeTaskWithTimeout` must therefore call
125
- * `ctx.executeTask(...)`, never the module-level function directly -- doing
126
- * the latter silently bypasses the stub and the tests go red.
85
+ * Run one task, read at call time. Routed back through the instance even
86
+ * though the implementation lives in task-runner.ts beside its only caller,
87
+ * because cms-worker.test.ts REPLACES this method on the instance:
88
+ * `executeTaskWithTimeout` must call `ctx.executeTask(...)`, never the
89
+ * module-level function, which would silently bypass the stub.
127
90
  */
128
91
  executeTask(task: Task, signal: AbortSignal): Promise<Record<string, unknown>>;
129
92
  /**
130
- * Push a branch from remote.git to GitHub, read at call time.
131
- *
132
- * Routed through the instance for the same reason as `executeTask`:
133
- * cms-worker.test.ts replaces it with a spy so the PR actions can be
134
- * exercised with no git remote, and then asserts the spy was NOT called on
135
- * the base-branch-refusal path.
93
+ * Push a branch from remote.git to GitHub, read at call time. Routed through
94
+ * the instance for the same reason as `executeTask`: cms-worker.test.ts
95
+ * replaces it with a spy and asserts the spy was NOT called on the
96
+ * base-branch-refusal path.
136
97
  */
137
98
  pushBranchToGitHub(branch: string): Promise<void>;
138
99
  /** Whether the worker is still running; both poll loops bail when false. */
@@ -143,8 +104,7 @@ export interface WorkerContext {
143
104
  ensureSettingsBranch(): string;
144
105
  /**
145
106
  * Test hook: fires when the rebase has reported conflicted files and is about
146
- * to `checkout --theirs` them. No-op in production; overridden by a subclass
147
- * in cms-worker-content-lock.test.ts.
107
+ * to `checkout --theirs` them. No-op in production.
148
108
  */
149
109
  afterConflictDetectedForTesting(): Promise<void>;
150
110
  /**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "//": "@codemirror/language, @lezer/highlight: workaround — @mdxeditor/editor uses cm6-theme-basic-light which peer-requires these but mdxeditor doesn't declare them as dependencies",
3
3
  "name": "canopycms",
4
- "version": "0.0.67-int.90",
4
+ "version": "0.0.67",
5
5
  "description": "CanopyCMS core package: schema-driven content, branch-aware editing, and editor UI for Next.js.",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -53,9 +53,9 @@
53
53
  "require": "./dist/task-queue/index.js"
54
54
  },
55
55
  "./worker/task-queue": {
56
- "types": "./dist/worker/task-queue.d.ts",
57
- "import": "./dist/worker/task-queue.js",
58
- "require": "./dist/worker/task-queue.js"
56
+ "types": "./dist/task-queue/cms-task-queue.d.ts",
57
+ "import": "./dist/task-queue/cms-task-queue.js",
58
+ "require": "./dist/task-queue/cms-task-queue.js"
59
59
  },
60
60
  "./worker/cms-worker": {
61
61
  "types": "./dist/worker/cms-worker.d.ts",
@@ -1,37 +0,0 @@
1
- import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'
2
-
3
- const isProtectedRoute = createRouteMatcher(['/edit(.*)', '/api/canopycms(.*)'])
4
-
5
- // This middleware is optional. CanopyCMS authenticates /api/canopycms without
6
- // it: createNextCanopyContext wraps the Clerk auth plugin in CachingAuthPlugin,
7
- // which verifies each request's Clerk token with CLERK_JWT_KEY alone and reads
8
- // user and group metadata from the auth cache. What this file adds is turning
9
- // signed-out requests to /edit and /api/canopycms away before they reach the
10
- // app. On a deployed CMS Lambda it costs two things:
11
- // - CLERK_SECRET_KEY on the Lambda. clerkMiddleware throws on every request
12
- // it matches unless it can resolve a secret key (jwtKey doesn't count),
13
- // which breaks the public-keys-only Lambda that the Security Model in
14
- // docs/deploying-to-aws.md describes.
15
- // - One image per Clerk instance. It reads the publishable key inlined at
16
- // image build (NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY), not the one your
17
- // ClerkProvider receives, unless you pass it an options callback that
18
- // reads both keys at run time.
19
- // To run without it, delete this file; docs/deploying-to-aws.md ("One image
20
- // for every Clerk tier") describes that shape.
21
- //
22
- // Without an explicit jwtKey, @clerk/nextjs fetches JWKS from api.clerk.com on
23
- // every cold verification -- the prod CMS Lambda has no internet and hangs.
24
- // With it, verification is a local PEM operation (the env var alone does
25
- // nothing; it appears only in Clerk error messages).
26
- export default clerkMiddleware(
27
- async (auth, req) => {
28
- if (isProtectedRoute(req)) {
29
- await auth.protect()
30
- }
31
- },
32
- { jwtKey: process.env.CLERK_JWT_KEY },
33
- )
34
-
35
- export const config = {
36
- matcher: ['/edit(.*)', '/api/canopycms(.*)'],
37
- }
@@ -1,8 +0,0 @@
1
- import type { CanopyConfig } from '../config/index.js';
2
- /**
3
- * Get the task queue directory for async worker operations.
4
- *
5
- * In prod mode: {CANOPYCMS_WORKSPACE_ROOT}/.tasks
6
- * In dev mode: {cwd}/.canopy-dev/.tasks
7
- */
8
- export declare function getTaskQueueDir(config: Pick<CanopyConfig, 'mode'>): string;
@@ -1,19 +0,0 @@
1
- /**
2
- * CanopyCMS task queue — re-exports from the generic task-queue module
3
- * with CMS-specific action types and a WorkerTask alias.
4
- */
5
- import { createDebugLogger } from '../utils/debug.js';
6
- // ============================================================================
7
- // Shared logger instance for CMS task queue operations
8
- // ============================================================================
9
- const debugLogger = createDebugLogger({ prefix: 'TaskQueue' });
10
- export const cmsTaskQueueLogger = {
11
- debug(message, data) {
12
- debugLogger.debug('task', message, data);
13
- },
14
- };
15
- // ============================================================================
16
- // Re-exports from generic task-queue module
17
- // ============================================================================
18
- export { enqueueTask, dequeueTask, completeTask, failTask, retryTask, requeueFailedTask, recoverOrphanedTasks, cleanupOldTasks, getTask, getTask as getTaskResult, // backward-compatible alias
19
- listTasks, getQueueStats, listCorruptTaskFiles, } from '../task-queue/index.js';
@@ -1,47 +0,0 @@
1
- /**
2
- * worker-status.json: the CmsWorker daemon's self-reported liveness/health
3
- * snapshot (PR-W1), written under the task queue directory
4
- * (`{taskDir}/worker-status.json`, i.e. `.tasks/worker-status.json`) and
5
- * read tolerantly by the admin API (api/admin.ts's `readWorkerStatus`).
6
- * Wire shape: `WorkerStatusReport` in ../types.
7
- *
8
- * Single-writer file: only the lock-holding CmsWorker (see cms-worker.ts's
9
- * `acquireLock`, DEP-C2) ever writes it. Every write is a FULL regeneration
10
- * of the whole report, never a partial merge -- there is no read-modify-write
11
- * step, so last-write-wins is trivially correct: whichever write lands last
12
- * (via the atomic rename below) is a complete, self-consistent snapshot.
13
- * Readers (the Lambda admin endpoint, typically on a different host) are
14
- * stale-tolerant by design: this file is a liveness signal, not
15
- * authoritative state, and NFS/EFS attribute-cache staleness (see
16
- * docs/concurrency.md) means a reader can see a snapshot up to the cache
17
- * window old regardless of how carefully the write itself is done.
18
- *
19
- * Honest caveat: after a lock compromise (`onCompromised` in
20
- * `acquireLock`), the old holder's `stop()` drains in-flight operations for
21
- * up to `taskTimeoutMs` (default 60s) before the lock is actually released,
22
- * while a new holder may already be running against the same workspace. For
23
- * that window, both the old and new holder can call `writeWorkerStatus`
24
- * concurrently. This is harmless: every write is an atomic full-snapshot
25
- * rename (temp file + `rename()`, see utils/atomic-write.ts), never a
26
- * read-modify-write, so the result is always exactly one writer's complete
27
- * snapshot -- whichever lands last -- never a corrupt or interleaved mix of
28
- * both writers' data.
29
- */
30
- import type { WorkerStatusReport } from '../types.js';
31
- export declare const WORKER_STATUS_FILE = "worker-status.json";
32
- /**
33
- * Write the worker's status report to `{taskDir}/worker-status.json`.
34
- *
35
- * Full-file regeneration via the shared atomic write util (temp file +
36
- * rename) -- never a partial update, so callers should pass the complete
37
- * report they want persisted, not a delta. Stamps/overwrites `updatedAt`
38
- * with the current time; every other field is the caller's responsibility.
39
- *
40
- * Throws on failure rather than swallowing it: callers that can't afford a
41
- * status-write failure to break their own operation (a git sync cycle, a
42
- * task-queue poll) wrap this call in best-effort handling at the call site
43
- * -- see cms-worker.ts's `syncGit`/`processTaskQueue`/`start()`. Any call
44
- * site that doesn't wrap it falls back on scheduleLoop's existing per-cycle
45
- * catch, which logs and continues.
46
- */
47
- export declare function writeWorkerStatus(taskDir: string, report: WorkerStatusReport): Promise<void>;
@@ -1,52 +0,0 @@
1
- /**
2
- * worker-status.json: the CmsWorker daemon's self-reported liveness/health
3
- * snapshot (PR-W1), written under the task queue directory
4
- * (`{taskDir}/worker-status.json`, i.e. `.tasks/worker-status.json`) and
5
- * read tolerantly by the admin API (api/admin.ts's `readWorkerStatus`).
6
- * Wire shape: `WorkerStatusReport` in ../types.
7
- *
8
- * Single-writer file: only the lock-holding CmsWorker (see cms-worker.ts's
9
- * `acquireLock`, DEP-C2) ever writes it. Every write is a FULL regeneration
10
- * of the whole report, never a partial merge -- there is no read-modify-write
11
- * step, so last-write-wins is trivially correct: whichever write lands last
12
- * (via the atomic rename below) is a complete, self-consistent snapshot.
13
- * Readers (the Lambda admin endpoint, typically on a different host) are
14
- * stale-tolerant by design: this file is a liveness signal, not
15
- * authoritative state, and NFS/EFS attribute-cache staleness (see
16
- * docs/concurrency.md) means a reader can see a snapshot up to the cache
17
- * window old regardless of how carefully the write itself is done.
18
- *
19
- * Honest caveat: after a lock compromise (`onCompromised` in
20
- * `acquireLock`), the old holder's `stop()` drains in-flight operations for
21
- * up to `taskTimeoutMs` (default 60s) before the lock is actually released,
22
- * while a new holder may already be running against the same workspace. For
23
- * that window, both the old and new holder can call `writeWorkerStatus`
24
- * concurrently. This is harmless: every write is an atomic full-snapshot
25
- * rename (temp file + `rename()`, see utils/atomic-write.ts), never a
26
- * read-modify-write, so the result is always exactly one writer's complete
27
- * snapshot -- whichever lands last -- never a corrupt or interleaved mix of
28
- * both writers' data.
29
- */
30
- import path from 'node:path';
31
- import { atomicWriteFile } from '../utils/atomic-write.js';
32
- export const WORKER_STATUS_FILE = 'worker-status.json';
33
- /**
34
- * Write the worker's status report to `{taskDir}/worker-status.json`.
35
- *
36
- * Full-file regeneration via the shared atomic write util (temp file +
37
- * rename) -- never a partial update, so callers should pass the complete
38
- * report they want persisted, not a delta. Stamps/overwrites `updatedAt`
39
- * with the current time; every other field is the caller's responsibility.
40
- *
41
- * Throws on failure rather than swallowing it: callers that can't afford a
42
- * status-write failure to break their own operation (a git sync cycle, a
43
- * task-queue poll) wrap this call in best-effort handling at the call site
44
- * -- see cms-worker.ts's `syncGit`/`processTaskQueue`/`start()`. Any call
45
- * site that doesn't wrap it falls back on scheduleLoop's existing per-cycle
46
- * catch, which logs and continues.
47
- */
48
- export async function writeWorkerStatus(taskDir, report) {
49
- const filePath = path.join(taskDir, WORKER_STATUS_FILE);
50
- const stamped = { ...report, updatedAt: new Date().toISOString() };
51
- await atomicWriteFile(filePath, JSON.stringify(stamped, null, 2));
52
- }