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.
- package/README.md +30 -3
- package/dist/ai/generate.js +1 -27
- package/dist/ai/handler.d.ts +0 -4
- package/dist/ai/handler.js +0 -11
- package/dist/ai/index.d.ts +1 -8
- package/dist/ai/index.js +1 -8
- package/dist/ai/json-to-markdown.js +15 -58
- package/dist/ai/resolve-branch.d.ts +2 -7
- package/dist/ai/resolve-branch.js +2 -8
- package/dist/ai/strip-mdx.d.ts +5 -13
- package/dist/ai/strip-mdx.js +5 -17
- package/dist/ai/to-plain-text.d.ts +10 -28
- package/dist/ai/to-plain-text.js +10 -28
- package/dist/ai/transform-components.d.ts +2 -4
- package/dist/ai/transform-components.js +8 -19
- package/dist/ai/types.d.ts +5 -10
- package/dist/api/admin-branch-health.d.ts +4 -12
- package/dist/api/admin-branch-health.js +26 -66
- package/dist/api/admin.d.ts +4 -12
- package/dist/api/admin.js +10 -26
- package/dist/api/assets.d.ts +0 -25
- package/dist/api/assets.js +50 -91
- package/dist/api/branch-merge.d.ts +1 -1
- package/dist/api/branch-merge.js +0 -2
- package/dist/api/branch-review.d.ts +0 -8
- package/dist/api/branch-review.js +0 -13
- package/dist/api/branch-status.d.ts +0 -3
- package/dist/api/branch-status.js +8 -33
- package/dist/api/branch-withdraw.d.ts +0 -1
- package/dist/api/branch-withdraw.js +6 -9
- package/dist/api/branch.d.ts +7 -12
- package/dist/api/branch.js +7 -44
- package/dist/api/client.d.ts +71 -224
- package/dist/api/client.js +82 -233
- package/dist/api/comments.d.ts +2 -4
- package/dist/api/comments.js +0 -17
- package/dist/api/content.d.ts +0 -6
- package/dist/api/content.js +66 -142
- package/dist/api/entries-constants.d.ts +5 -9
- package/dist/api/entries-constants.js +5 -9
- package/dist/api/entries.d.ts +8 -13
- package/dist/api/entries.js +20 -51
- package/dist/api/github-sync.d.ts +2 -4
- package/dist/api/github-sync.js +4 -8
- package/dist/api/groups.d.ts +3 -0
- package/dist/api/groups.js +8 -21
- package/dist/api/guards.d.ts +4 -16
- package/dist/api/guards.js +3 -22
- package/dist/api/index.d.ts +4 -4
- package/dist/api/permissions.d.ts +2 -0
- package/dist/api/permissions.js +18 -40
- package/dist/api/reference-options.d.ts +0 -1
- package/dist/api/reference-options.js +3 -11
- package/dist/api/request-body-hash.d.ts +12 -23
- package/dist/api/request-body-hash.js +12 -23
- package/dist/api/resolve-references.d.ts +0 -1
- package/dist/api/resolve-references.js +13 -28
- package/dist/api/route-builder.d.ts +3 -7
- package/dist/api/route-builder.js +1 -1
- package/dist/api/routes.d.ts +12 -0
- package/dist/api/routes.js +47 -0
- package/dist/api/schema.d.ts +23 -33
- package/dist/api/schema.js +20 -74
- package/dist/api/settings-helpers.js +4 -5
- package/dist/api/types.d.ts +0 -5
- package/dist/api/user.js +0 -5
- package/dist/api/validators.d.ts +14 -52
- package/dist/api/validators.js +14 -52
- package/dist/assets/asset-prefixes.d.ts +4 -8
- package/dist/assets/asset-prefixes.js +4 -8
- package/dist/assets/asset-src.d.ts +5 -22
- package/dist/assets/asset-src.js +5 -21
- package/dist/assets/factory.d.ts +1 -2
- package/dist/assets/factory.js +1 -2
- package/dist/assets/finalize.d.ts +3 -1
- package/dist/assets/finalize.js +3 -1
- package/dist/assets/index.d.ts +3 -3
- package/dist/assets/index.js +1 -1
- package/dist/assets/keys.d.ts +5 -3
- package/dist/assets/keys.js +6 -3
- package/dist/assets/pipeline.d.ts +3 -2
- package/dist/assets/pipeline.js +22 -56
- package/dist/assets/sharp-loader.d.ts +2 -10
- package/dist/assets/sharp-loader.js +2 -10
- package/dist/assets/store-local.d.ts +1 -2
- package/dist/assets/store-local.js +1 -2
- package/dist/assets/store-s3.d.ts +3 -4
- package/dist/assets/svg-sanitizer.d.ts +6 -14
- package/dist/assets/svg-sanitizer.js +6 -14
- package/dist/assets/transform-directives.d.ts +3 -4
- package/dist/assets/transform-directives.js +1 -1
- package/dist/assets/transform.d.ts +19 -30
- package/dist/assets/transform.js +18 -31
- package/dist/auth/cache.d.ts +2 -3
- package/dist/auth/cache.js +2 -3
- package/dist/auth/caching-auth-plugin.d.ts +11 -22
- package/dist/auth/caching-auth-plugin.js +12 -14
- package/dist/auth/context-helpers.d.ts +6 -20
- package/dist/auth/context-helpers.js +5 -17
- package/dist/auth/file-based-auth-cache.d.ts +10 -21
- package/dist/auth/file-based-auth-cache.js +23 -51
- package/dist/auth/plugin.d.ts +29 -61
- package/dist/auth/plugin.js +9 -13
- package/dist/auth/types.d.ts +11 -20
- package/dist/authorization/branch.d.ts +30 -49
- package/dist/authorization/branch.js +16 -42
- package/dist/authorization/content.d.ts +11 -40
- package/dist/authorization/content.js +13 -45
- package/dist/authorization/groups/index.d.ts +0 -3
- package/dist/authorization/groups/index.js +0 -3
- package/dist/authorization/groups/loader.d.ts +14 -28
- package/dist/authorization/groups/loader.js +14 -38
- package/dist/authorization/groups/schema.d.ts +0 -6
- package/dist/authorization/groups/schema.js +4 -7
- package/dist/authorization/helpers.d.ts +9 -28
- package/dist/authorization/helpers.js +9 -28
- package/dist/authorization/index.d.ts +3 -25
- package/dist/authorization/index.js +3 -35
- package/dist/authorization/path.d.ts +6 -13
- package/dist/authorization/path.js +8 -25
- package/dist/authorization/permissions/index.d.ts +0 -3
- package/dist/authorization/permissions/index.js +0 -3
- package/dist/authorization/permissions/loader.d.ts +14 -27
- package/dist/authorization/permissions/loader.js +14 -32
- package/dist/authorization/permissions/schema.d.ts +1 -6
- package/dist/authorization/permissions/schema.js +6 -13
- package/dist/authorization/protected-branch.d.ts +36 -65
- package/dist/authorization/protected-branch.js +29 -41
- package/dist/authorization/settings-file-store.d.ts +38 -81
- package/dist/authorization/settings-file-store.js +38 -79
- package/dist/authorization/types.d.ts +4 -26
- package/dist/authorization/types.js +0 -6
- package/dist/authorization/validation.d.ts +1 -23
- package/dist/authorization/validation.js +1 -24
- package/dist/branch-health.d.ts +39 -67
- package/dist/branch-health.js +27 -43
- package/dist/branch-metadata-file.d.ts +16 -32
- package/dist/branch-metadata-file.js +13 -26
- package/dist/branch-metadata.d.ts +49 -80
- package/dist/branch-metadata.js +57 -87
- package/dist/branch-registry.d.ts +26 -64
- package/dist/branch-registry.js +44 -93
- package/dist/branch-schema-cache.d.ts +34 -124
- package/dist/branch-schema-cache.js +49 -155
- package/dist/branch-workspace.d.ts +4 -4
- package/dist/branch-workspace.js +15 -19
- package/dist/build/generate-ai-content.d.ts +1 -0
- package/dist/build/generate-ai-content.js +12 -25
- package/dist/build-canopy.d.ts +17 -27
- package/dist/build-canopy.js +16 -23
- package/dist/build-mode.d.ts +25 -27
- package/dist/build-mode.js +25 -29
- package/dist/cli/cli.d.ts +15 -26
- package/dist/cli/cli.js +601 -978
- package/dist/cli/generate-ai-content.js +351 -628
- package/dist/cli/github-app-manifest.d.ts +84 -0
- package/dist/cli/github-app-manifest.js +161 -0
- package/dist/cli/init-github-app.d.ts +110 -444
- package/dist/cli/init-github-app.js +236 -773
- package/dist/cli/init.js +39 -80
- package/dist/cli/migrate.d.ts +13 -10
- package/dist/cli/migrate.js +22 -30
- package/dist/cli/project-detect.d.ts +17 -31
- package/dist/cli/project-detect.js +31 -42
- package/dist/cli/project-root.d.ts +4 -11
- package/dist/cli/project-root.js +4 -11
- package/dist/cli/prompt.d.ts +10 -0
- package/dist/cli/prompt.js +67 -0
- package/dist/cli/sync.d.ts +0 -8
- package/dist/cli/sync.js +8 -28
- package/dist/cli/template-files/middleware.ts.template +15 -29
- package/dist/cli/templates.d.ts +2 -12
- package/dist/cli/templates.js +4 -4
- package/dist/client.d.ts +1 -1
- package/dist/comment-store.d.ts +32 -53
- package/dist/comment-store.js +32 -52
- package/dist/config/flatten.d.ts +0 -3
- package/dist/config/flatten.js +2 -12
- package/dist/config/helpers.js +2 -2
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +1 -4
- package/dist/config/schemas/collection.d.ts +0 -8
- package/dist/config/schemas/collection.js +0 -10
- package/dist/config/schemas/config.d.ts +6 -78
- package/dist/config/schemas/config.js +38 -54
- package/dist/config/schemas/field.d.ts +2 -242
- package/dist/config/schemas/field.js +9 -20
- package/dist/config/schemas/media.js +1 -1
- package/dist/config/schemas/permissions.js +0 -2
- package/dist/config/schemas/url.d.ts +5 -6
- package/dist/config/schemas/url.js +5 -6
- package/dist/config/types.d.ts +45 -33
- package/dist/config/types.js +0 -1
- package/dist/config.d.ts +1 -8
- package/dist/config.js +1 -9
- package/dist/content-id-index.d.ts +76 -188
- package/dist/content-id-index.js +79 -230
- package/dist/content-index-generation.d.ts +27 -48
- package/dist/content-index-generation.js +35 -84
- package/dist/content-index-registry.d.ts +15 -24
- package/dist/content-index-registry.js +5 -9
- package/dist/content-listing.d.ts +64 -107
- package/dist/content-listing.js +68 -118
- package/dist/content-reader.d.ts +20 -29
- package/dist/content-reader.js +10 -18
- package/dist/content-store.d.ts +210 -336
- package/dist/content-store.js +413 -657
- package/dist/content-tree.d.ts +44 -86
- package/dist/content-tree.js +26 -54
- package/dist/context.d.ts +67 -94
- package/dist/context.js +53 -72
- package/dist/dev-content-watcher.d.ts +18 -18
- package/dist/dev-content-watcher.js +41 -44
- package/dist/editor/BranchManager.d.ts +3 -6
- package/dist/editor/BranchManager.js +24 -44
- package/dist/editor/CanopyEditor.js +5 -2
- package/dist/editor/CommentsPanel.js +0 -2
- package/dist/editor/Editor.js +19 -76
- package/dist/editor/EditorAuthGate.d.ts +27 -0
- package/dist/editor/EditorAuthGate.js +140 -0
- package/dist/editor/EntryNavigator.js +0 -20
- package/dist/editor/FormRenderer.d.ts +1 -2
- package/dist/editor/FormRenderer.js +8 -23
- package/dist/editor/admin/SystemHealthPanel.js +20 -37
- package/dist/editor/admin/useSystemHealth.d.ts +2 -3
- package/dist/editor/admin/useSystemHealth.js +10 -12
- package/dist/editor/client-reference-resolver.d.ts +2 -5
- package/dist/editor/client-reference-resolver.js +2 -19
- package/dist/editor/comments/BranchComments.js +0 -4
- package/dist/editor/comments/EntryComments.js +0 -4
- package/dist/editor/comments/FieldWrapper.js +0 -4
- package/dist/editor/comments/InlineCommentThread.js +0 -2
- package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
- package/dist/editor/comments/ThreadCarousel.js +0 -12
- package/dist/editor/components/EditorFooter.d.ts +0 -8
- package/dist/editor/components/EditorFooter.js +0 -5
- package/dist/editor/components/EditorHeader.d.ts +0 -31
- package/dist/editor/components/EditorHeader.js +21 -71
- package/dist/editor/components/EditorSidebar.d.ts +0 -19
- package/dist/editor/components/EditorSidebar.js +0 -16
- package/dist/editor/components/EntryCreateModal.d.ts +4 -4
- package/dist/editor/components/EntryCreateModal.js +7 -22
- package/dist/editor/components/RenameEntryModal.js +0 -4
- package/dist/editor/components/UserBadge.js +0 -10
- package/dist/editor/components/index.js +0 -2
- package/dist/editor/context/ApiClientContext.d.ts +8 -7
- package/dist/editor/context/ApiClientContext.js +39 -11
- package/dist/editor/context/AssetContext.d.ts +7 -17
- package/dist/editor/context/AssetContext.js +7 -17
- package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
- package/dist/editor/context/EditorIdentityContext.js +7 -0
- package/dist/editor/context/EditorStateContext.d.ts +10 -41
- package/dist/editor/context/EditorStateContext.js +7 -23
- package/dist/editor/context/SWRProvider.d.ts +3 -6
- package/dist/editor/context/index.d.ts +1 -20
- package/dist/editor/context/index.js +1 -20
- package/dist/editor/editor-utils.d.ts +8 -47
- package/dist/editor/editor-utils.js +19 -72
- package/dist/editor/fields/BlockField.d.ts +2 -2
- package/dist/editor/fields/BlockField.js +1 -2
- package/dist/editor/fields/CodeField.d.ts +0 -1
- package/dist/editor/fields/CodeField.js +0 -1
- package/dist/editor/fields/DateTimeField.d.ts +15 -22
- package/dist/editor/fields/DateTimeField.js +17 -26
- package/dist/editor/fields/ImageField.d.ts +2 -2
- package/dist/editor/fields/ImageField.js +8 -14
- package/dist/editor/fields/InlineGroupField.d.ts +0 -1
- package/dist/editor/fields/InlineGroupField.js +0 -1
- package/dist/editor/fields/MarkdownField.d.ts +0 -1
- package/dist/editor/fields/MarkdownField.js +6 -11
- package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
- package/dist/editor/fields/MdxImageDialog.js +0 -1
- package/dist/editor/fields/NumberField.d.ts +9 -19
- package/dist/editor/fields/NumberField.js +11 -22
- package/dist/editor/fields/NumberListField.d.ts +7 -10
- package/dist/editor/fields/NumberListField.js +7 -10
- package/dist/editor/fields/ObjectField.d.ts +5 -8
- package/dist/editor/fields/ObjectField.js +0 -1
- package/dist/editor/fields/ReferenceField.d.ts +1 -1
- package/dist/editor/fields/ReferenceField.js +11 -16
- package/dist/editor/fields/SelectField.d.ts +2 -2
- package/dist/editor/fields/SelectField.js +0 -1
- package/dist/editor/fields/StringListField.d.ts +0 -4
- package/dist/editor/fields/StringListField.js +4 -9
- package/dist/editor/fields/TextField.d.ts +0 -1
- package/dist/editor/fields/TextField.js +0 -1
- package/dist/editor/fields/ToggleField.d.ts +0 -1
- package/dist/editor/fields/ToggleField.js +0 -1
- package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
- package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
- package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
- package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
- package/dist/editor/group-manager/GroupCard.d.ts +0 -3
- package/dist/editor/group-manager/GroupForm.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
- package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
- package/dist/editor/group-manager/MemberList.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
- package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
- package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
- package/dist/editor/group-manager/index.d.ts +0 -6
- package/dist/editor/group-manager/index.js +0 -10
- package/dist/editor/group-manager/types.d.ts +2 -5
- package/dist/editor/group-manager/types.js +0 -3
- package/dist/editor/hooks/index.d.ts +6 -11
- package/dist/editor/hooks/index.js +6 -12
- package/dist/editor/hooks/useBranchActions.d.ts +0 -14
- package/dist/editor/hooks/useBranchActions.js +0 -22
- package/dist/editor/hooks/useBranchManager.d.ts +2 -48
- package/dist/editor/hooks/useBranchManager.js +4 -64
- package/dist/editor/hooks/useBranchesData.d.ts +7 -6
- package/dist/editor/hooks/useBranchesData.js +7 -6
- package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
- package/dist/editor/hooks/useCommentSystem.js +1 -36
- package/dist/editor/hooks/useDraftManager.d.ts +2 -35
- package/dist/editor/hooks/useDraftManager.js +23 -64
- package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
- package/dist/editor/hooks/useEditorLayout.js +0 -23
- package/dist/editor/hooks/useEntriesData.d.ts +1 -0
- package/dist/editor/hooks/useEntriesData.js +2 -3
- package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
- package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
- package/dist/editor/hooks/useEntryManager.d.ts +2 -27
- package/dist/editor/hooks/useEntryManager.js +29 -78
- package/dist/editor/hooks/useGroupManager.d.ts +0 -21
- package/dist/editor/hooks/useGroupManager.js +0 -21
- package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
- package/dist/editor/hooks/usePermissionManager.js +0 -20
- package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
- package/dist/editor/hooks/useReferenceResolution.js +1 -48
- package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
- package/dist/editor/hooks/useSchemaManager.js +0 -19
- package/dist/editor/hooks/useUserContext.d.ts +2 -9
- package/dist/editor/hooks/useUserContext.js +10 -10
- package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
- package/dist/editor/hooks/useUserMetadata.js +0 -3
- package/dist/editor/media/AssetCard.d.ts +0 -1
- package/dist/editor/media/AssetCard.js +1 -2
- package/dist/editor/media/CropStep.d.ts +0 -1
- package/dist/editor/media/CropStep.js +0 -1
- package/dist/editor/media/MediaLibrary.d.ts +1 -2
- package/dist/editor/media/MediaLibrary.js +1 -2
- package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
- package/dist/editor/media/MediaLibraryBody.js +0 -1
- package/dist/editor/media/crop-math.d.ts +1 -1
- package/dist/editor/media/crop-math.js +1 -1
- package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
- package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
- package/dist/editor/permission-manager/PermissionEditor.js +0 -1
- package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
- package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
- package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
- package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
- package/dist/editor/permission-manager/constants.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
- package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
- package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
- package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
- package/dist/editor/permission-manager/index.d.ts +0 -7
- package/dist/editor/permission-manager/index.js +0 -16
- package/dist/editor/permission-manager/types.d.ts +2 -12
- package/dist/editor/permission-manager/types.js +0 -3
- package/dist/editor/permission-manager/utils.d.ts +0 -28
- package/dist/editor/permission-manager/utils.js +9 -23
- package/dist/editor/preview-bridge.d.ts +5 -1
- package/dist/editor/preview-bridge.js +4 -4
- package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
- package/dist/editor/schema-editor/CollectionEditor.js +9 -31
- package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
- package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
- package/dist/editor/schema-editor/index.d.ts +0 -7
- package/dist/editor/schema-editor/index.js +0 -7
- package/dist/editor/utils/env.d.ts +3 -18
- package/dist/editor/utils/env.js +6 -25
- package/dist/entry-link-resolver.d.ts +13 -35
- package/dist/entry-link-resolver.js +20 -53
- package/dist/entry-schema-registry.d.ts +20 -60
- package/dist/entry-schema-registry.js +20 -69
- package/dist/entry-schema.d.ts +118 -223
- package/dist/entry-schema.js +46 -91
- package/dist/git-manager.d.ts +101 -200
- package/dist/git-manager.js +211 -384
- package/dist/github-service.d.ts +34 -75
- package/dist/github-service.js +37 -91
- package/dist/http/handler.d.ts +6 -37
- package/dist/http/handler.js +65 -120
- package/dist/http/router.d.ts +15 -32
- package/dist/http/router.js +34 -99
- package/dist/http/types.d.ts +15 -40
- package/dist/http/types.js +3 -7
- package/dist/id.d.ts +4 -10
- package/dist/id.js +4 -10
- package/dist/index.js +6 -9
- package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
- package/dist/operating-mode/client-safe-strategy.js +8 -28
- package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
- package/dist/operating-mode/client-unsafe-strategy.js +9 -34
- package/dist/operating-mode/client.d.ts +3 -10
- package/dist/operating-mode/client.js +3 -8
- package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
- package/dist/operating-mode/deployment-name-fixtures.js +14 -18
- package/dist/operating-mode/deployment-name.d.ts +19 -29
- package/dist/operating-mode/deployment-name.js +29 -47
- package/dist/operating-mode/index.d.ts +4 -25
- package/dist/operating-mode/index.js +9 -31
- package/dist/operating-mode/mode-env.d.ts +32 -54
- package/dist/operating-mode/mode-env.js +36 -58
- package/dist/operating-mode/types.d.ts +24 -72
- package/dist/operating-mode/types.js +1 -7
- package/dist/paths/branch-name.d.ts +30 -40
- package/dist/paths/branch-name.js +30 -40
- package/dist/paths/branch.d.ts +4 -18
- package/dist/paths/branch.js +6 -22
- package/dist/paths/index.d.ts +2 -13
- package/dist/paths/index.js +3 -23
- package/dist/paths/normalize-server.d.ts +3 -15
- package/dist/paths/normalize-server.js +3 -15
- package/dist/paths/normalize.d.ts +13 -33
- package/dist/paths/normalize.js +13 -33
- package/dist/paths/resolve.d.ts +4 -17
- package/dist/paths/resolve.js +4 -22
- package/dist/paths/types.d.ts +12 -34
- package/dist/paths/types.js +5 -7
- package/dist/paths/validation.d.ts +22 -119
- package/dist/paths/validation.js +30 -148
- package/dist/reference-resolver.d.ts +0 -13
- package/dist/reference-resolver.js +0 -18
- package/dist/resolve-canopy-user.d.ts +16 -18
- package/dist/resolve-canopy-user.js +17 -26
- package/dist/resource-generation.d.ts +16 -25
- package/dist/resource-generation.js +34 -97
- package/dist/schema/meta-loader.d.ts +2 -14
- package/dist/schema/meta-loader.js +15 -64
- package/dist/schema/resolver.d.ts +1 -4
- package/dist/schema/resolver.js +1 -6
- package/dist/schema/schema-store-types.d.ts +0 -12
- package/dist/schema/schema-store.d.ts +61 -138
- package/dist/schema/schema-store.js +85 -282
- package/dist/schema/types.d.ts +0 -4
- package/dist/server.d.ts +62 -93
- package/dist/server.js +63 -94
- package/dist/services.d.ts +23 -47
- package/dist/services.js +55 -98
- package/dist/settings-workspace.d.ts +17 -30
- package/dist/settings-workspace.js +51 -81
- package/dist/static/index.d.ts +26 -52
- package/dist/static/index.js +33 -67
- package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
- package/dist/task-queue/cms-task-queue.js +13 -0
- package/dist/task-queue/task-queue-config.d.ts +3 -0
- package/dist/{worker → task-queue}/task-queue-config.js +1 -6
- package/dist/task-queue/task-queue.d.ts +16 -22
- package/dist/task-queue/task-queue.js +20 -44
- package/dist/task-queue/types.d.ts +0 -1
- package/dist/task-queue/worker-status.d.ts +35 -0
- package/dist/task-queue/worker-status.js +40 -0
- package/dist/types.d.ts +40 -51
- package/dist/url-collision.d.ts +26 -40
- package/dist/url-collision.js +47 -63
- package/dist/url-exclusivity-fixtures.d.ts +15 -20
- package/dist/url-exclusivity-fixtures.js +14 -19
- package/dist/url-path-resolver.d.ts +8 -16
- package/dist/url-path-resolver.js +19 -29
- package/dist/user.d.ts +8 -21
- package/dist/user.js +10 -19
- package/dist/utils/async-mutex.js +4 -6
- package/dist/utils/atomic-write.d.ts +2 -11
- package/dist/utils/atomic-write.js +2 -11
- package/dist/utils/body-field.d.ts +8 -15
- package/dist/utils/body-field.js +8 -15
- package/dist/utils/content-serialize.d.ts +18 -24
- package/dist/utils/content-serialize.js +109 -160
- package/dist/utils/content-write-lock.d.ts +51 -106
- package/dist/utils/content-write-lock.js +66 -111
- package/dist/utils/debug.d.ts +7 -23
- package/dist/utils/debug.js +7 -23
- package/dist/utils/entry-url.d.ts +11 -23
- package/dist/utils/entry-url.js +11 -26
- package/dist/utils/error.d.ts +25 -90
- package/dist/utils/error.js +60 -147
- package/dist/utils/flatten-group-fields.d.ts +5 -7
- package/dist/utils/flatten-group-fields.js +5 -7
- package/dist/utils/format.d.ts +1 -5
- package/dist/utils/format.js +1 -5
- package/dist/utils/fs.d.ts +3 -4
- package/dist/utils/fs.js +3 -4
- package/dist/utils/git.d.ts +52 -83
- package/dist/utils/git.js +79 -125
- package/dist/utils/logger.d.ts +35 -50
- package/dist/utils/logger.js +35 -52
- package/dist/utils/provisioning-lock.d.ts +23 -35
- package/dist/utils/provisioning-lock.js +49 -69
- package/dist/utils/sanitize-href.d.ts +5 -10
- package/dist/utils/sanitize-href.js +8 -18
- package/dist/utils/title-field.d.ts +17 -20
- package/dist/utils/title-field.js +18 -27
- package/dist/utils/typed-filename.d.ts +20 -48
- package/dist/utils/typed-filename.js +25 -61
- package/dist/utils/url-prefix.d.ts +3 -3
- package/dist/utils/url-prefix.js +3 -3
- package/dist/validation/block-structural-keys.d.ts +16 -31
- package/dist/validation/block-structural-keys.js +19 -29
- package/dist/validation/deletion-checker.d.ts +0 -34
- package/dist/validation/deletion-checker.js +1 -43
- package/dist/validation/entry-link-validator.d.ts +6 -13
- package/dist/validation/entry-link-validator.js +4 -13
- package/dist/validation/entry-type-reference-validator.d.ts +13 -18
- package/dist/validation/entry-type-reference-validator.js +13 -18
- package/dist/validation/entry-validator.d.ts +13 -25
- package/dist/validation/entry-validator.js +15 -32
- package/dist/validation/field-traversal.d.ts +3 -30
- package/dist/validation/field-traversal.js +1 -32
- package/dist/validation/reference-validator.d.ts +5 -24
- package/dist/validation/reference-validator.js +5 -30
- package/dist/worker/cms-worker.d.ts +172 -232
- package/dist/worker/cms-worker.js +241 -333
- package/dist/worker/git-sync.d.ts +32 -133
- package/dist/worker/git-sync.js +129 -191
- package/dist/worker/github-auth.d.ts +13 -19
- package/dist/worker/github-auth.js +13 -19
- package/dist/worker/history-rewrite.d.ts +53 -66
- package/dist/worker/history-rewrite.js +54 -60
- package/dist/worker/log.d.ts +24 -41
- package/dist/worker/log.js +25 -42
- package/dist/worker/rebase.d.ts +20 -110
- package/dist/worker/rebase.js +279 -354
- package/dist/worker/task-runner.d.ts +32 -66
- package/dist/worker/task-runner.js +126 -162
- package/dist/worker/worker-context.d.ts +41 -81
- package/package.json +4 -4
- package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
- package/dist/worker/task-queue-config.d.ts +0 -8
- package/dist/worker/task-queue.js +0 -19
- package/dist/worker/worker-status.d.ts +0 -47
- 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 '
|
|
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)
|
|
8
|
-
*
|
|
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
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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
|
|
60
|
-
* filesystem call site agrees instead of re-deriving it
|
|
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
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
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
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
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
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
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
|
-
*
|
|
133
|
-
*
|
|
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
|
|
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
|
|
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/
|
|
57
|
-
"import": "./dist/
|
|
58
|
-
"require": "./dist/
|
|
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
|
-
}
|