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,11 +1,8 @@
|
|
|
1
1
|
import type { WorkerContext } from './worker-context.js';
|
|
2
2
|
/**
|
|
3
3
|
* [SYNC-H1] The history-rewrite kernel: what happens when the rebase loop
|
|
4
|
-
* rewrites history
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Extracted from cms-worker.ts because it is the one thing all three of the
|
|
8
|
-
* worker's big clusters touch, and for opposite-looking reasons:
|
|
4
|
+
* rewrites history ALREADY published to `remote.git` (and from there to
|
|
5
|
+
* GitHub). It lives here because all three of the worker's clusters touch it:
|
|
9
6
|
*
|
|
10
7
|
* - rebase.ts ARMS a rewrite (mark -> publish -> queue) and completes an
|
|
11
8
|
* interrupted one via `reconcilePendingRewrite`;
|
|
@@ -14,99 +11,89 @@ import type { WorkerContext } from './worker-context.js';
|
|
|
14
11
|
* - git-sync.ts READS it in `reconcileTrackedBranches`, to tell this worker's
|
|
15
12
|
* own in-flight rewrite apart from a genuine cross-deployment collision.
|
|
16
13
|
*
|
|
17
|
-
* Leaving these on the class would have made every cluster's module import
|
|
18
|
-
* every other one. They share no state beyond four resolved paths, so they
|
|
19
|
-
* belong here.
|
|
20
|
-
*
|
|
21
14
|
* THE INVARIANT, since it is spread across those three callers: every force
|
|
22
15
|
* push leases on a SPECIFIC commit this worker knows its own rebase replaced
|
|
23
16
|
* -- the marker, or the pre-rebase tip -- never on "whatever remote.git holds
|
|
24
|
-
* right now". A lease on the current tip is satisfied by
|
|
25
|
-
*
|
|
26
|
-
*
|
|
17
|
+
* right now". A lease on the current tip is satisfied by anyone's direct push
|
|
18
|
+
* to the PR branch and would delete it, silently, from remote.git and then
|
|
19
|
+
* from GitHub.
|
|
27
20
|
*/
|
|
28
21
|
export type HistoryRewriteContext = Pick<WorkerContext, 'remoteGitPath' | 'contentBranchesPath' | 'taskDir' | 'taskTimeoutMs'>;
|
|
29
22
|
/**
|
|
30
|
-
* What `remote.git` currently holds for `branchRef`, or null when this
|
|
31
|
-
*
|
|
32
|
-
* unreadable.
|
|
23
|
+
* What `remote.git` currently holds for `branchRef`, or null when this branch
|
|
24
|
+
* was never published there (never submitted) or the ref is unreadable.
|
|
33
25
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* helper uses.
|
|
26
|
+
* Explicit `--git-dir`, like verifyBaseBranchExists() in cms-worker.ts:
|
|
27
|
+
* reading a bare repo that way does not depend on `safe.bareRepository` being
|
|
28
|
+
* permissive, which is why prod code takes this route rather than the config
|
|
29
|
+
* override the test-only `openBareRepo` helper uses.
|
|
39
30
|
*/
|
|
40
31
|
export declare function readPublishedSha(ctx: Pick<HistoryRewriteContext, 'remoteGitPath'>, branchRef: string): Promise<string | null>;
|
|
41
32
|
/**
|
|
42
33
|
* Record that this worker rewrote `expectedSha` out of a branch's already
|
|
43
34
|
* published history (see BranchMetadata.historyRewrittenFrom).
|
|
44
35
|
*
|
|
45
|
-
* Set-once:
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
36
|
+
* Set-once: an existing marker is LEFT ALONE. Across two rebases before any
|
|
37
|
+
* GitHub push lands, GitHub still holds the commit the FIRST rebase replaced,
|
|
38
|
+
* so advancing the marker would aim the lease at a commit GitHub never had and
|
|
39
|
+
* permanently wedge the branch.
|
|
49
40
|
*
|
|
50
|
-
* Re-reads metadata rather than trusting the caller's
|
|
51
|
-
*
|
|
52
|
-
*
|
|
41
|
+
* Re-reads metadata rather than trusting the caller's snapshot: the task loop
|
|
42
|
+
* runs concurrently with syncGit() and may have cleared the marker while this
|
|
43
|
+
* branch was rebasing.
|
|
53
44
|
*/
|
|
54
45
|
export declare function markHistoryRewritten(ctx: Pick<HistoryRewriteContext, 'contentBranchesPath'>, branchPath: string, branchDir: string, expectedSha: string): Promise<void>;
|
|
55
46
|
/**
|
|
56
47
|
* Clear the marker once GitHub is confirmed to hold the rewritten history.
|
|
57
48
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* GitHub" diagnosis that is false: we did.
|
|
49
|
+
* A failure here destroys nothing (the lease still refuses anything
|
|
50
|
+
* unexpected, and the plain-push fallback only ever fast-forwards) but is NOT
|
|
51
|
+
* harmless: a marker that outlives its episode can wedge the NEXT one. If the
|
|
52
|
+
* base advances before the stale marker is revisited, the queued push leases a
|
|
53
|
+
* commit GitHub has already moved off, falls back to a plain push of a rebased
|
|
54
|
+
* (non-ancestor) history, and fails permanently with a "something else moved
|
|
55
|
+
* it on GitHub" diagnosis that is false -- we did.
|
|
66
56
|
*
|
|
67
|
-
* Tracked, with the concurrent-clear race that can drop a marker
|
|
68
|
-
*
|
|
69
|
-
* .claude/future-tasks/worker-history-rewrite-marker-races.md.
|
|
57
|
+
* Tracked, with the concurrent-clear race that can drop a marker mid-arming,
|
|
58
|
+
* in .claude/future-tasks/worker-history-rewrite-marker-races.md.
|
|
70
59
|
*/
|
|
71
60
|
export declare function clearHistoryRewrittenMarker(ctx: Pick<HistoryRewriteContext, 'contentBranchesPath'>, branchPath: string, branchDir: string): Promise<void>;
|
|
72
61
|
/**
|
|
73
62
|
* Publish a branch clone's rebased history into `remote.git`, replacing
|
|
74
63
|
* EXACTLY `expectedSha` and nothing else.
|
|
75
64
|
*
|
|
76
|
-
* The lease is the entire safety argument
|
|
77
|
-
* refuses unless `remote.git` still stands at `<sha>`, so this can only
|
|
78
|
-
*
|
|
79
|
-
* "whatever remote.git currently holds" -- see the arming guard in
|
|
80
|
-
*
|
|
81
|
-
*
|
|
65
|
+
* The lease is the entire safety argument: `--force-with-lease=<ref>:<sha>`
|
|
66
|
+
* refuses unless `remote.git` still stands at `<sha>`, so this can only ever
|
|
67
|
+
* undo the commit our own rebase rewrote away. Callers must NEVER pass
|
|
68
|
+
* "whatever remote.git currently holds" -- see the arming guard in rebase.ts's
|
|
69
|
+
* carryForwardRewrittenHistory for the interleaving where that would silently
|
|
70
|
+
* delete someone's direct push.
|
|
82
71
|
*
|
|
83
|
-
* Returns whether the push landed. A refused lease means a concurrent
|
|
84
|
-
*
|
|
85
|
-
* pass on a later cycle, never thrown.
|
|
72
|
+
* Returns whether the push landed. A refused lease means a concurrent Lambda
|
|
73
|
+
* push moved the ref; logged and retried by the self-heal pass, never thrown.
|
|
86
74
|
*/
|
|
87
75
|
export declare function forcePublishToLocalRemote(ctx: Pick<HistoryRewriteContext, 'taskTimeoutMs'>, branchPath: string, branchRef: string, expectedSha: string): Promise<boolean>;
|
|
88
76
|
/**
|
|
89
77
|
* Queue the GitHub hop for a branch whose rewritten history now sits in
|
|
90
|
-
* `remote.git`, so an open PR's head follows the rebase within a cycle
|
|
91
|
-
*
|
|
78
|
+
* `remote.git`, so an open PR's head follows the rebase within a cycle instead
|
|
79
|
+
* of waiting for the editor's next submit.
|
|
92
80
|
*
|
|
93
|
-
* Deliberately NOT skipped when a marker is already set: inferring "a task
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
* a no-op once GitHub holds the tip).
|
|
81
|
+
* Deliberately NOT skipped when a marker is already set: inferring "a task must
|
|
82
|
+
* already be queued" from the marker starves this hop whenever a task was lost,
|
|
83
|
+
* failed permanently, or was never written. Duplicate push tasks are bounded by
|
|
84
|
+
* base-branch advances and are idempotent.
|
|
98
85
|
*/
|
|
99
86
|
export declare function enqueueGitHubPush(ctx: Pick<HistoryRewriteContext, 'taskDir'>, branchRef: string): Promise<void>;
|
|
100
87
|
/**
|
|
101
|
-
* Complete a rewrite this worker started but did not finish: get the
|
|
102
|
-
*
|
|
88
|
+
* Complete a rewrite this worker started but did not finish: get the rebased
|
|
89
|
+
* history into `remote.git` and queued for GitHub.
|
|
103
90
|
*
|
|
104
|
-
* Runs from the rebase loop for any branch carrying a marker, whether or
|
|
105
|
-
*
|
|
106
|
-
*
|
|
91
|
+
* Runs from the rebase loop for any branch carrying a marker, whether or not it
|
|
92
|
+
* is behind base this cycle, so an interrupted publish converges without
|
|
93
|
+
* waiting for the next base-branch advance.
|
|
107
94
|
*
|
|
108
|
-
* Always leases on the MARKER, never on remote.git's current tip -- the
|
|
109
|
-
*
|
|
95
|
+
* Always leases on the MARKER, never on remote.git's current tip -- the marker
|
|
96
|
+
* is the one commit we know our own rebase replaced.
|
|
110
97
|
*/
|
|
111
98
|
export declare function reconcilePendingRewrite(ctx: HistoryRewriteContext, options: {
|
|
112
99
|
branchPath: string;
|
|
@@ -120,10 +107,10 @@ export declare function reconcilePendingRewrite(ctx: HistoryRewriteContext, opti
|
|
|
120
107
|
* rewrote already-published history and the GitHub push has not landed yet
|
|
121
108
|
* (see BranchMetadata.historyRewrittenFrom).
|
|
122
109
|
*
|
|
123
|
-
* `branchName` is a git ref name; branch workspaces are directories named
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
110
|
+
* `branchName` is a git ref name; branch workspaces are directories named with
|
|
111
|
+
* the sanitized form, hence the conversion. Best-effort: a settings branch (no
|
|
112
|
+
* workspace at all), a missing directory or an unreadable branch.json all mean
|
|
113
|
+
* "no known rewrite", the conservative answer -- it keeps the branch in the
|
|
114
|
+
* louder `diverged` bucket.
|
|
128
115
|
*/
|
|
129
116
|
export declare function hasPendingHistoryRewrite(ctx: Pick<HistoryRewriteContext, 'contentBranchesPath'>, branchName: string): Promise<boolean>;
|
|
@@ -5,18 +5,16 @@ import { gitChildEnv } from '../git-manager.js';
|
|
|
5
5
|
import { sanitizeBranchName } from '../paths/branch-name.js';
|
|
6
6
|
import { getErrorMessage, redactCredentials } from '../utils/error.js';
|
|
7
7
|
import { isStaleLeaseRejection } from '../utils/git.js';
|
|
8
|
-
import { enqueueTask, listTasks } from '
|
|
8
|
+
import { enqueueTask, listTasks } from '../task-queue/cms-task-queue.js';
|
|
9
9
|
import { workerLog, workerLogWarn } from './log.js';
|
|
10
10
|
/**
|
|
11
|
-
* What `remote.git` currently holds for `branchRef`, or null when this
|
|
12
|
-
*
|
|
13
|
-
* unreadable.
|
|
11
|
+
* What `remote.git` currently holds for `branchRef`, or null when this branch
|
|
12
|
+
* was never published there (never submitted) or the ref is unreadable.
|
|
14
13
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* helper uses.
|
|
14
|
+
* Explicit `--git-dir`, like verifyBaseBranchExists() in cms-worker.ts:
|
|
15
|
+
* reading a bare repo that way does not depend on `safe.bareRepository` being
|
|
16
|
+
* permissive, which is why prod code takes this route rather than the config
|
|
17
|
+
* override the test-only `openBareRepo` helper uses.
|
|
20
18
|
*/
|
|
21
19
|
export async function readPublishedSha(ctx, branchRef) {
|
|
22
20
|
try {
|
|
@@ -40,14 +38,14 @@ export async function readPublishedSha(ctx, branchRef) {
|
|
|
40
38
|
* Record that this worker rewrote `expectedSha` out of a branch's already
|
|
41
39
|
* published history (see BranchMetadata.historyRewrittenFrom).
|
|
42
40
|
*
|
|
43
|
-
* Set-once:
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
41
|
+
* Set-once: an existing marker is LEFT ALONE. Across two rebases before any
|
|
42
|
+
* GitHub push lands, GitHub still holds the commit the FIRST rebase replaced,
|
|
43
|
+
* so advancing the marker would aim the lease at a commit GitHub never had and
|
|
44
|
+
* permanently wedge the branch.
|
|
47
45
|
*
|
|
48
|
-
* Re-reads metadata rather than trusting the caller's
|
|
49
|
-
*
|
|
50
|
-
*
|
|
46
|
+
* Re-reads metadata rather than trusting the caller's snapshot: the task loop
|
|
47
|
+
* runs concurrently with syncGit() and may have cleared the marker while this
|
|
48
|
+
* branch was rebasing.
|
|
51
49
|
*/
|
|
52
50
|
export async function markHistoryRewritten(ctx, branchPath, branchDir, expectedSha) {
|
|
53
51
|
const current = await BranchMetadataFileManager.loadOnly(branchPath);
|
|
@@ -59,18 +57,16 @@ export async function markHistoryRewritten(ctx, branchPath, branchDir, expectedS
|
|
|
59
57
|
/**
|
|
60
58
|
* Clear the marker once GitHub is confirmed to hold the rewritten history.
|
|
61
59
|
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* GitHub" diagnosis that is false: we did.
|
|
60
|
+
* A failure here destroys nothing (the lease still refuses anything
|
|
61
|
+
* unexpected, and the plain-push fallback only ever fast-forwards) but is NOT
|
|
62
|
+
* harmless: a marker that outlives its episode can wedge the NEXT one. If the
|
|
63
|
+
* base advances before the stale marker is revisited, the queued push leases a
|
|
64
|
+
* commit GitHub has already moved off, falls back to a plain push of a rebased
|
|
65
|
+
* (non-ancestor) history, and fails permanently with a "something else moved
|
|
66
|
+
* it on GitHub" diagnosis that is false -- we did.
|
|
70
67
|
*
|
|
71
|
-
* Tracked, with the concurrent-clear race that can drop a marker
|
|
72
|
-
*
|
|
73
|
-
* .claude/future-tasks/worker-history-rewrite-marker-races.md.
|
|
68
|
+
* Tracked, with the concurrent-clear race that can drop a marker mid-arming,
|
|
69
|
+
* in .claude/future-tasks/worker-history-rewrite-marker-races.md.
|
|
74
70
|
*/
|
|
75
71
|
export async function clearHistoryRewrittenMarker(ctx, branchPath, branchDir) {
|
|
76
72
|
try {
|
|
@@ -87,23 +83,22 @@ export async function clearHistoryRewrittenMarker(ctx, branchPath, branchDir) {
|
|
|
87
83
|
* Publish a branch clone's rebased history into `remote.git`, replacing
|
|
88
84
|
* EXACTLY `expectedSha` and nothing else.
|
|
89
85
|
*
|
|
90
|
-
* The lease is the entire safety argument
|
|
91
|
-
* refuses unless `remote.git` still stands at `<sha>`, so this can only
|
|
92
|
-
*
|
|
93
|
-
* "whatever remote.git currently holds" -- see the arming guard in
|
|
94
|
-
*
|
|
95
|
-
*
|
|
86
|
+
* The lease is the entire safety argument: `--force-with-lease=<ref>:<sha>`
|
|
87
|
+
* refuses unless `remote.git` still stands at `<sha>`, so this can only ever
|
|
88
|
+
* undo the commit our own rebase rewrote away. Callers must NEVER pass
|
|
89
|
+
* "whatever remote.git currently holds" -- see the arming guard in rebase.ts's
|
|
90
|
+
* carryForwardRewrittenHistory for the interleaving where that would silently
|
|
91
|
+
* delete someone's direct push.
|
|
96
92
|
*
|
|
97
|
-
* Returns whether the push landed. A refused lease means a concurrent
|
|
98
|
-
*
|
|
99
|
-
* pass on a later cycle, never thrown.
|
|
93
|
+
* Returns whether the push landed. A refused lease means a concurrent Lambda
|
|
94
|
+
* push moved the ref; logged and retried by the self-heal pass, never thrown.
|
|
100
95
|
*/
|
|
101
96
|
export async function forcePublishToLocalRemote(ctx, branchPath, branchRef, expectedSha) {
|
|
102
|
-
// A dedicated instance rather than the caller's: `.env()` replaces the
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
//
|
|
97
|
+
// A dedicated instance rather than the caller's: `.env()` replaces the whole
|
|
98
|
+
// child environment, and the rebase loop's instance must keep its ambient
|
|
99
|
+
// one. gitChildEnv (not gitNetworkChildEnv) because this push targets the
|
|
100
|
+
// local bare repo -- and its locale pin is what keeps isStaleLeaseRejection
|
|
101
|
+
// below from silently becoming a no-op on a non-English host.
|
|
107
102
|
const pushGit = simpleGit({ baseDir: branchPath, timeout: { block: ctx.taskTimeoutMs } });
|
|
108
103
|
pushGit.env(gitChildEnv({}));
|
|
109
104
|
try {
|
|
@@ -129,14 +124,13 @@ export async function forcePublishToLocalRemote(ctx, branchPath, branchRef, expe
|
|
|
129
124
|
}
|
|
130
125
|
/**
|
|
131
126
|
* Queue the GitHub hop for a branch whose rewritten history now sits in
|
|
132
|
-
* `remote.git`, so an open PR's head follows the rebase within a cycle
|
|
133
|
-
*
|
|
127
|
+
* `remote.git`, so an open PR's head follows the rebase within a cycle instead
|
|
128
|
+
* of waiting for the editor's next submit.
|
|
134
129
|
*
|
|
135
|
-
* Deliberately NOT skipped when a marker is already set: inferring "a task
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* a no-op once GitHub holds the tip).
|
|
130
|
+
* Deliberately NOT skipped when a marker is already set: inferring "a task must
|
|
131
|
+
* already be queued" from the marker starves this hop whenever a task was lost,
|
|
132
|
+
* failed permanently, or was never written. Duplicate push tasks are bounded by
|
|
133
|
+
* base-branch advances and are idempotent.
|
|
140
134
|
*/
|
|
141
135
|
export async function enqueueGitHubPush(ctx, branchRef) {
|
|
142
136
|
try {
|
|
@@ -157,15 +151,15 @@ export async function enqueueGitHubPush(ctx, branchRef) {
|
|
|
157
151
|
}
|
|
158
152
|
}
|
|
159
153
|
/**
|
|
160
|
-
* Complete a rewrite this worker started but did not finish: get the
|
|
161
|
-
*
|
|
154
|
+
* Complete a rewrite this worker started but did not finish: get the rebased
|
|
155
|
+
* history into `remote.git` and queued for GitHub.
|
|
162
156
|
*
|
|
163
|
-
* Runs from the rebase loop for any branch carrying a marker, whether or
|
|
164
|
-
*
|
|
165
|
-
*
|
|
157
|
+
* Runs from the rebase loop for any branch carrying a marker, whether or not it
|
|
158
|
+
* is behind base this cycle, so an interrupted publish converges without
|
|
159
|
+
* waiting for the next base-branch advance.
|
|
166
160
|
*
|
|
167
|
-
* Always leases on the MARKER, never on remote.git's current tip -- the
|
|
168
|
-
*
|
|
161
|
+
* Always leases on the MARKER, never on remote.git's current tip -- the marker
|
|
162
|
+
* is the one commit we know our own rebase replaced.
|
|
169
163
|
*/
|
|
170
164
|
export async function reconcilePendingRewrite(ctx, options) {
|
|
171
165
|
const { branchPath, branchDir, branchRef, headSha, marker } = options;
|
|
@@ -198,11 +192,11 @@ export async function reconcilePendingRewrite(ctx, options) {
|
|
|
198
192
|
* rewrote already-published history and the GitHub push has not landed yet
|
|
199
193
|
* (see BranchMetadata.historyRewrittenFrom).
|
|
200
194
|
*
|
|
201
|
-
* `branchName` is a git ref name; branch workspaces are directories named
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
195
|
+
* `branchName` is a git ref name; branch workspaces are directories named with
|
|
196
|
+
* the sanitized form, hence the conversion. Best-effort: a settings branch (no
|
|
197
|
+
* workspace at all), a missing directory or an unreadable branch.json all mean
|
|
198
|
+
* "no known rewrite", the conservative answer -- it keeps the branch in the
|
|
199
|
+
* louder `diverged` bucket.
|
|
206
200
|
*/
|
|
207
201
|
export async function hasPendingHistoryRewrite(ctx, branchName) {
|
|
208
202
|
try {
|
package/dist/worker/log.d.ts
CHANGED
|
@@ -1,41 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Timestamp-prefixed logging for the CMS worker daemon.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `console.log`
|
|
4
|
+
* INVARIANT: every line written to worker.log starts with this ISO-8601
|
|
5
|
+
* timestamp and a level tag. The worker's stdout AND stderr both append to
|
|
6
|
+
* `/var/log/canopy-worker/worker.log` (the systemd unit written by
|
|
7
|
+
* `packages/canopycms-cdk/src/constructs/cms-service.ts` user-data), so the
|
|
8
|
+
* level tag is the only thing separating `console.log` from `console.error`
|
|
9
|
+
* downstream; and the amazon-cloudwatch-agent that tails it keys
|
|
10
|
+
* `multi_line_start_pattern` on the timestamp, so a stack trace collapses into
|
|
11
|
+
* ONE event while any UNPREFIXED line is appended to the preceding event
|
|
12
|
+
* instead of starting its own. CloudWatch's own stamp is INGESTION time, which
|
|
13
|
+
* skews most exactly when it matters (agent hiccup, buffered burst, restart).
|
|
9
14
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* when it matters most (agent hiccup, buffered burst, instance restart).
|
|
14
|
-
* 2. **Severity.** Both streams land in one file, so `console.log` and
|
|
15
|
-
* `console.error` are indistinguishable downstream. The level tag restores
|
|
16
|
-
* it as a greppable field (`filter @message like /ERROR/`).
|
|
15
|
+
* Hence the AWS entrypoint (`packages/canopycms-cdk/worker/index.ts`) imports
|
|
16
|
+
* these helpers rather than calling `console`. Node's own uncaught-exception
|
|
17
|
+
* dump on the way down is the one uncovered case.
|
|
17
18
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* fragmenting line-by-line - which also means any line WITHOUT the prefix is
|
|
22
|
-
* appended to the preceding event rather than starting its own. That is why
|
|
23
|
-
* the AWS entrypoint (`packages/canopycms-cdk/worker/index.ts`) imports these
|
|
24
|
-
* helpers too rather than calling `console` directly. Output Node itself
|
|
25
|
-
* prints (an uncaught-exception dump on the way down) is the one uncovered
|
|
26
|
-
* case: it attaches to the previous event, still strictly better than the
|
|
27
|
-
* per-line fragmentation it replaces.
|
|
28
|
-
*
|
|
29
|
-
* The timestamp and level are passed as SEPARATE console arguments rather than
|
|
30
|
-
* concatenated into the message, so console's native formatting of non-string
|
|
31
|
-
* arguments survives - Errors keep their stacks, objects keep their inspection
|
|
32
|
-
* output.
|
|
33
|
-
*/
|
|
34
|
-
/**
|
|
35
|
-
* Named `workerLog*` rather than a bare `log`/`logError`: `CmsWorker` already
|
|
36
|
-
* carries a `private log = cmsTaskQueueLogger` field, and two different things
|
|
37
|
-
* called `log` in one file is a readability trap.
|
|
19
|
+
* The timestamp and level are SEPARATE console arguments, never concatenated
|
|
20
|
+
* into the message, so console's native formatting of non-string arguments
|
|
21
|
+
* survives - Errors keep their stacks.
|
|
38
22
|
*/
|
|
23
|
+
/** Named `workerLog*`, not `log`: `CmsWorker` already carries a `log` field. */
|
|
39
24
|
/** Informational worker output. Routes to stdout. */
|
|
40
25
|
export declare function workerLog(...args: unknown[]): void;
|
|
41
26
|
/** Recoverable problem - the worker carries on. Routes to stderr. */
|
|
@@ -45,16 +30,14 @@ export declare function workerLogError(...args: unknown[]): void;
|
|
|
45
30
|
/**
|
|
46
31
|
* Point the shared `canopyLog*` helpers (`utils/logger.ts`) at the prefixing
|
|
47
32
|
* functions above, so modules the worker executes but does not own -
|
|
48
|
-
* `github-service.ts`, `branch-registry.ts` - satisfy the INVARIANT
|
|
49
|
-
*
|
|
50
|
-
* worker
|
|
33
|
+
* `github-service.ts`, `branch-registry.ts` - satisfy the INVARIANT above
|
|
34
|
+
* instead of writing bare lines into worker.log. The eslint ban on bare
|
|
35
|
+
* `console` covers the two worker directories but cannot reach those shared
|
|
36
|
+
* modules, which are legitimately plain `console` under Lambda.
|
|
51
37
|
*
|
|
52
38
|
* Call this ONCE, first thing in a worker entrypoint, before any work that
|
|
53
|
-
* could log. Deliberately not a module-level side effect: importing
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* helpers' types. The eslint override for the two worker directories bans bare
|
|
57
|
-
* `console` there, but it cannot reach the shared modules above - those are
|
|
58
|
-
* legitimately plain `console` under Lambda. This is the half that covers them.
|
|
39
|
+
* could log. Deliberately not a module-level side effect: importing this module
|
|
40
|
+
* must not reconfigure logging for a Lambda or dev-server process that merely
|
|
41
|
+
* wants the helpers' types.
|
|
59
42
|
*/
|
|
60
43
|
export declare function installWorkerLogger(): void;
|
package/dist/worker/log.js
CHANGED
|
@@ -1,46 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Timestamp-prefixed logging for the CMS worker daemon.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `console.log`
|
|
4
|
+
* INVARIANT: every line written to worker.log starts with this ISO-8601
|
|
5
|
+
* timestamp and a level tag. The worker's stdout AND stderr both append to
|
|
6
|
+
* `/var/log/canopy-worker/worker.log` (the systemd unit written by
|
|
7
|
+
* `packages/canopycms-cdk/src/constructs/cms-service.ts` user-data), so the
|
|
8
|
+
* level tag is the only thing separating `console.log` from `console.error`
|
|
9
|
+
* downstream; and the amazon-cloudwatch-agent that tails it keys
|
|
10
|
+
* `multi_line_start_pattern` on the timestamp, so a stack trace collapses into
|
|
11
|
+
* ONE event while any UNPREFIXED line is appended to the preceding event
|
|
12
|
+
* instead of starting its own. CloudWatch's own stamp is INGESTION time, which
|
|
13
|
+
* skews most exactly when it matters (agent hiccup, buffered burst, restart).
|
|
9
14
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* when it matters most (agent hiccup, buffered burst, instance restart).
|
|
14
|
-
* 2. **Severity.** Both streams land in one file, so `console.log` and
|
|
15
|
-
* `console.error` are indistinguishable downstream. The level tag restores
|
|
16
|
-
* it as a greppable field (`filter @message like /ERROR/`).
|
|
15
|
+
* Hence the AWS entrypoint (`packages/canopycms-cdk/worker/index.ts`) imports
|
|
16
|
+
* these helpers rather than calling `console`. Node's own uncaught-exception
|
|
17
|
+
* dump on the way down is the one uncovered case.
|
|
17
18
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* fragmenting line-by-line - which also means any line WITHOUT the prefix is
|
|
22
|
-
* appended to the preceding event rather than starting its own. That is why
|
|
23
|
-
* the AWS entrypoint (`packages/canopycms-cdk/worker/index.ts`) imports these
|
|
24
|
-
* helpers too rather than calling `console` directly. Output Node itself
|
|
25
|
-
* prints (an uncaught-exception dump on the way down) is the one uncovered
|
|
26
|
-
* case: it attaches to the previous event, still strictly better than the
|
|
27
|
-
* per-line fragmentation it replaces.
|
|
28
|
-
*
|
|
29
|
-
* The timestamp and level are passed as SEPARATE console arguments rather than
|
|
30
|
-
* concatenated into the message, so console's native formatting of non-string
|
|
31
|
-
* arguments survives - Errors keep their stacks, objects keep their inspection
|
|
32
|
-
* output.
|
|
19
|
+
* The timestamp and level are SEPARATE console arguments, never concatenated
|
|
20
|
+
* into the message, so console's native formatting of non-string arguments
|
|
21
|
+
* survives - Errors keep their stacks.
|
|
33
22
|
*/
|
|
34
23
|
import { setCanopyLogger } from '../utils/logger.js';
|
|
35
|
-
/** ISO-8601 with milliseconds
|
|
24
|
+
/** ISO-8601 with milliseconds: `YYYY-MM-DDTHH:mm:ss.sssZ`. */
|
|
36
25
|
function timestamp() {
|
|
37
26
|
return new Date().toISOString();
|
|
38
27
|
}
|
|
39
|
-
/**
|
|
40
|
-
* Named `workerLog*` rather than a bare `log`/`logError`: `CmsWorker` already
|
|
41
|
-
* carries a `private log = cmsTaskQueueLogger` field, and two different things
|
|
42
|
-
* called `log` in one file is a readability trap.
|
|
43
|
-
*/
|
|
28
|
+
/** Named `workerLog*`, not `log`: `CmsWorker` already carries a `log` field. */
|
|
44
29
|
/** Informational worker output. Routes to stdout. */
|
|
45
30
|
export function workerLog(...args) {
|
|
46
31
|
console.log(timestamp(), 'INFO', ...args);
|
|
@@ -56,17 +41,15 @@ export function workerLogError(...args) {
|
|
|
56
41
|
/**
|
|
57
42
|
* Point the shared `canopyLog*` helpers (`utils/logger.ts`) at the prefixing
|
|
58
43
|
* functions above, so modules the worker executes but does not own -
|
|
59
|
-
* `github-service.ts`, `branch-registry.ts` - satisfy the INVARIANT
|
|
60
|
-
*
|
|
61
|
-
* worker
|
|
44
|
+
* `github-service.ts`, `branch-registry.ts` - satisfy the INVARIANT above
|
|
45
|
+
* instead of writing bare lines into worker.log. The eslint ban on bare
|
|
46
|
+
* `console` covers the two worker directories but cannot reach those shared
|
|
47
|
+
* modules, which are legitimately plain `console` under Lambda.
|
|
62
48
|
*
|
|
63
49
|
* Call this ONCE, first thing in a worker entrypoint, before any work that
|
|
64
|
-
* could log. Deliberately not a module-level side effect: importing
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* helpers' types. The eslint override for the two worker directories bans bare
|
|
68
|
-
* `console` there, but it cannot reach the shared modules above - those are
|
|
69
|
-
* legitimately plain `console` under Lambda. This is the half that covers them.
|
|
50
|
+
* could log. Deliberately not a module-level side effect: importing this module
|
|
51
|
+
* must not reconfigure logging for a Lambda or dev-server process that merely
|
|
52
|
+
* wants the helpers' types.
|
|
70
53
|
*/
|
|
71
54
|
export function installWorkerLogger() {
|
|
72
55
|
setCanopyLogger({ log: workerLog, warn: workerLogWarn, error: workerLogError });
|