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
package/dist/utils/git.js
CHANGED
|
@@ -1,39 +1,30 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { simpleGit } from 'simple-git';
|
|
4
|
-
// Matches scheme://... URLs (http, https, ssh, git — case-insensitive).
|
|
5
4
|
const NETWORK_SCHEME_PATTERN = /^(https?|ssh|git):\/\//i;
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// arbitrary commands — always treat it as network/untrusted.
|
|
5
|
+
// git's "transport helper" syntax (`ext::sh -c ...`, `fd::7`): any `scheme::` prefix hands the
|
|
6
|
+
// URL to `git-remote-<scheme>`, which can run arbitrary commands — always network/untrusted.
|
|
9
7
|
const TRANSPORT_HELPER_PATTERN = /^[a-z][a-z0-9+.-]*::/i;
|
|
10
|
-
// A leading `-`
|
|
11
|
-
//
|
|
8
|
+
// A leading `-` makes git parse the "URL" as a command-line option (`--upload-pack=/evil`) —
|
|
9
|
+
// argument injection, not a real remote.
|
|
12
10
|
const LEADING_OPTION_PATTERN = /^-/;
|
|
13
|
-
// Windows drive paths (`C:\...`, `C:/...`) are the one local form
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// treats `host:path` as ssh).
|
|
11
|
+
// Windows drive paths (`C:\...`, `C:/...`) are the one local form carrying a colon before any
|
|
12
|
+
// slash; everything else with a colon before the first slash is scp-like remote syntax
|
|
13
|
+
// (`git@github.com:owner/repo.git`, or bare `github.com:owner/repo.git` — git treats `host:path`
|
|
14
|
+
// as ssh with no `@` required).
|
|
18
15
|
const WINDOWS_DRIVE_PATTERN = /^[a-zA-Z]:[\\/]/;
|
|
19
16
|
const COLON_BEFORE_SLASH_PATTERN = /^[^/\\\s]+:/;
|
|
20
17
|
/**
|
|
21
|
-
* Whether a git remote URL points at a network location
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* rather than a local filesystem path.
|
|
18
|
+
* Whether a git remote URL points at a network location rather than a local filesystem path. Only
|
|
19
|
+
* `file://` URLs, plain filesystem paths and Windows drive paths are LOCAL; the patterns above
|
|
20
|
+
* enumerate the network forms.
|
|
25
21
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* `
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* misconfig (not being a strict URL parser), this classifier treats anything
|
|
33
|
-
* git could interpret as a network transport, a transport helper, or a
|
|
34
|
-
* command-line option as "network". The one local carve-out beyond `file://`
|
|
35
|
-
* is a Windows drive path (`C:\...` / `C:/...`), which replaces the old
|
|
36
|
-
* `@`-required heuristic for scp-like syntax.
|
|
22
|
+
* The distinction GitManager's prod-mode network-remote guard relies on (see `resolveRemoteUrl`):
|
|
23
|
+
* the intended prod topology only ever resolves a local path (an auto-detected/auto-initialized
|
|
24
|
+
* `remote.git`), so anything network arriving via an explicit param, config, or env var is almost
|
|
25
|
+
* always a prod misconfiguration. Catching that is the job, not being a strict URL parser, so
|
|
26
|
+
* anything git could read as a network transport, a transport helper, or a command-line option
|
|
27
|
+
* counts as "network".
|
|
37
28
|
*/
|
|
38
29
|
export function isNetworkRemoteUrl(url) {
|
|
39
30
|
if (/^file:\/\//i.test(url))
|
|
@@ -48,106 +39,78 @@ export function isNetworkRemoteUrl(url) {
|
|
|
48
39
|
return false;
|
|
49
40
|
return COLON_BEFORE_SLASH_PATTERN.test(url);
|
|
50
41
|
}
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
// machine-readable `--porcelain` form simple-git's `.push()` wrapper requests
|
|
56
|
-
// (`CmsWorker.pushBranchToGitHub`/`pushSettingsBranches`, e.g.
|
|
57
|
-
// `!\trefs/heads/branch:refs/heads/branch\t[rejected] (non-fast-forward)`) --
|
|
58
|
-
// `--porcelain` only changes the per-ref summary's leading fields, not this
|
|
59
|
-
// trailing human-readable bracket text.
|
|
42
|
+
// git's per-ref push-status summary marking a ref as rejected. Present verbatim in BOTH output
|
|
43
|
+
// shapes CanopyCMS's push sites produce -- the plain CLI form and the `--porcelain` form
|
|
44
|
+
// simple-git's `.push()` requests -- because `--porcelain` changes only the summary's leading
|
|
45
|
+
// fields, not this trailing bracket text.
|
|
60
46
|
const REJECTED_MARKER = '[rejected]';
|
|
61
|
-
// git's two names for the SAME
|
|
62
|
-
// when
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
// doesn't have -- retrying the identical push can never succeed until the
|
|
66
|
-
// caller fetches and integrates (or picks a different branch name).
|
|
47
|
+
// git's two names for the SAME condition: `non-fast-forward` when the pusher's remote-tracking ref
|
|
48
|
+
// is present but stale, `fetch first` when no local knowledge of the remote ref exists at all.
|
|
49
|
+
// Both mean the remote has commits this side does not, so the identical push can never succeed
|
|
50
|
+
// until the caller fetches and integrates (or picks a different branch name).
|
|
67
51
|
const NON_FAST_FORWARD_REASONS = ['non-fast-forward', 'fetch first'];
|
|
68
|
-
// git
|
|
69
|
-
// regardless of --porcelain (porcelain only affects the machine-readable
|
|
70
|
-
// summary line, not the human hint text that follows it) -- a second,
|
|
52
|
+
// git prints this stderr hint immediately after a rejected push, `--porcelain` or not -- a second,
|
|
71
53
|
// independent signal for the same condition.
|
|
72
54
|
const REJECTION_HINT = 'Updates were rejected because';
|
|
73
55
|
/**
|
|
74
|
-
* Whether a git push failure message is git's non-fast-forward rejection --
|
|
75
|
-
* the
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* the same content-branch name, or someone pushing directly to GitHub.
|
|
56
|
+
* Whether a git push failure message is git's non-fast-forward rejection -- the remote has
|
|
57
|
+
* diverged, so retrying the IDENTICAL push can never succeed. In CanopyCMS that means two
|
|
58
|
+
* deployments sharing one GitHub repo and picking the same content-branch name, or someone pushing
|
|
59
|
+
* directly to GitHub.
|
|
79
60
|
*
|
|
80
|
-
* Deliberately narrow: ordinary transient push failures -- network drops,
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* this specific, structurally-unretryable shape should fail fast (worker) or
|
|
85
|
-
* return 409 (API) instead.
|
|
61
|
+
* Deliberately narrow: ordinary transient push failures -- network drops, auth/permission denial,
|
|
62
|
+
* lock contention -- must keep retrying with backoff (worker/task-runner.ts's
|
|
63
|
+
* `isPermanentTaskFailure` treats git failures as transient precisely so they do). Only this
|
|
64
|
+
* structurally-unretryable shape fails fast (worker) or returns 409 (API).
|
|
86
65
|
*
|
|
87
|
-
* Matches git's literal
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* LANG/LC_ALL could silently turn this into a permanent no-op.
|
|
66
|
+
* Matches git's literal English rejection text, which is gettext-translated: callers MUST run the
|
|
67
|
+
* git command with a locale-pinning env (`gitChildEnv` in `../git-manager.ts`), or an ambient
|
|
68
|
+
* LANG/LC_ALL silently turns this into a permanent no-op.
|
|
91
69
|
*/
|
|
92
70
|
export function isNonFastForwardRejection(message) {
|
|
93
71
|
const hasNonFastForwardRejection = message.includes(REJECTED_MARKER) &&
|
|
94
72
|
NON_FAST_FORWARD_REASONS.some((reason) => message.includes(reason));
|
|
95
73
|
return hasNonFastForwardRejection || message.includes(REJECTION_HINT);
|
|
96
74
|
}
|
|
97
|
-
// git's reason text when a `--force-with-lease=<ref>:<sha>` push is refused
|
|
98
|
-
//
|
|
75
|
+
// git's reason text when a `--force-with-lease=<ref>:<sha>` push is refused because the remote is
|
|
76
|
+
// not at `<sha>`.
|
|
99
77
|
const STALE_LEASE_REASON = 'stale info';
|
|
100
78
|
/**
|
|
101
|
-
* Whether a git push failure message is a refused `--force-with-lease` --
|
|
102
|
-
* the
|
|
103
|
-
* update was declined and nothing was overwritten.
|
|
79
|
+
* Whether a git push failure message is a refused `--force-with-lease` -- the remote ref is NOT at
|
|
80
|
+
* the commit the pusher expected, so the forced update was declined and nothing overwritten.
|
|
104
81
|
*
|
|
105
|
-
* A SEPARATE predicate from `isNonFastForwardRejection` because git's output
|
|
106
|
-
*
|
|
107
|
-
* `
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
* refusal would be classified transient and retried -- three identical,
|
|
111
|
-
* guaranteed-to-fail force attempts -- instead of surfacing as the permanent,
|
|
112
|
-
* human-actionable state it is.
|
|
113
|
-
*
|
|
114
|
-
* Same locale caveat as above: the reason text is gettext-translated, so
|
|
115
|
-
* callers MUST pin the locale (`gitChildEnv`/`gitNetworkChildEnv`).
|
|
82
|
+
* A SEPARATE predicate from `isNonFastForwardRejection` because git's output for the two is
|
|
83
|
+
* disjoint: a refused lease prints `(stale info)` and emits NEITHER `non-fast-forward`/`fetch
|
|
84
|
+
* first` NOR the `Updates were rejected because` hint. Without it every lease refusal is
|
|
85
|
+
* classified transient and retried -- identical, guaranteed-to-fail force attempts -- instead of
|
|
86
|
+
* surfacing as the permanent, human-actionable state it is. Same locale caveat as above.
|
|
116
87
|
*/
|
|
117
88
|
export function isStaleLeaseRejection(message) {
|
|
118
89
|
return message.includes(REJECTED_MARKER) && message.includes(STALE_LEASE_REASON);
|
|
119
90
|
}
|
|
120
|
-
// git's message when `git fetch <remote> <branch>` names a ref the remote does
|
|
121
|
-
//
|
|
122
|
-
//
|
|
91
|
+
// git's message when `git fetch <remote> <branch>` names a ref the remote does not have. Both
|
|
92
|
+
// spellings occur: modern git prints the lowercase form, older versions and some transports
|
|
93
|
+
// capitalize it.
|
|
123
94
|
const MISSING_REMOTE_REF_REASONS = ["couldn't find remote ref", "Couldn't find remote ref"];
|
|
124
95
|
/**
|
|
125
|
-
* Whether a `git fetch <remote> <branch>` failure is specifically "that ref
|
|
126
|
-
*
|
|
127
|
-
* branch has never been pushed.
|
|
128
|
-
*
|
|
129
|
-
* Narrow on purpose, and the narrowness is the whole point. This predicate
|
|
130
|
-
* exists because a bare `catch` around the fetch classified EVERY failure --
|
|
131
|
-
* unreachable remote, auth denial, permission error on the workspace, corrupt
|
|
132
|
-
* object store -- as "nothing to pull", which callers then logged as normal
|
|
133
|
-
* and proceeded past. Anything this does not recognize must reach the caller
|
|
134
|
-
* as the genuine error it is.
|
|
96
|
+
* Whether a `git fetch <remote> <branch>` failure is specifically "that ref doesn't exist on the
|
|
97
|
+
* remote" -- the ONLY benign fetch outcome, meaning the branch has never been pushed.
|
|
135
98
|
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
99
|
+
* Narrow on purpose, and the narrowness is the point: a bare `catch` around the fetch classifies
|
|
100
|
+
* EVERY failure -- unreachable remote, auth denial, permission error on the workspace, corrupt
|
|
101
|
+
* object store -- as "nothing to pull", which callers then log as normal and proceed past.
|
|
102
|
+
* Anything this does not recognize must reach the caller as the genuine error it is. Same locale
|
|
103
|
+
* caveat as the predicates above.
|
|
138
104
|
*/
|
|
139
105
|
export function isMissingRemoteRefFailure(message) {
|
|
140
106
|
return MISSING_REMOTE_REF_REASONS.some((reason) => message.includes(reason));
|
|
141
107
|
}
|
|
142
108
|
/**
|
|
143
|
-
* Resolve a repository's git directory from its working-tree root, handling
|
|
144
|
-
*
|
|
145
|
-
* `
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
* a per-branch sync loop and an admin-facing health scan that already walk
|
|
149
|
-
* every branch directory, and neither should pay a subprocess per branch just
|
|
150
|
-
* to find a path.
|
|
109
|
+
* Resolve a repository's git directory from its working-tree root, handling both layouts: a real
|
|
110
|
+
* `.git` directory, and a `.git` FILE holding a `gitdir: <path>` pointer (linked worktrees,
|
|
111
|
+
* submodules). Deliberately fs-only rather than `git rev-parse --git-dir`: the callers are a
|
|
112
|
+
* per-branch sync loop and an admin-facing health scan that already walk every branch directory,
|
|
113
|
+
* and neither should pay a subprocess per branch just to find a path.
|
|
151
114
|
*/
|
|
152
115
|
async function resolveGitDir(repoPath) {
|
|
153
116
|
const dotGit = path.join(repoPath, '.git');
|
|
@@ -173,20 +136,16 @@ async function resolveGitDir(repoPath) {
|
|
|
173
136
|
}
|
|
174
137
|
}
|
|
175
138
|
/**
|
|
176
|
-
* Whether a repository has an INTERRUPTED rebase on disk — the `rebase-merge`
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
* mid-
|
|
139
|
+
* Whether a repository has an INTERRUPTED rebase on disk — the `rebase-merge` (interactive/merge
|
|
140
|
+
* backend) or `rebase-apply` (am backend) state directory git leaves when a rebase stops for
|
|
141
|
+
* conflicts or the process dies mid-way. Invisible to every other check the worker makes: a clone
|
|
142
|
+
* left mid-rebase reports uncommitted changes, so the sync loop's dirty check skips it as
|
|
143
|
+
* `skippedDirty` on every cycle forever, and `branch-health` sees valid branch.json and scans it
|
|
144
|
+
* as healthy. Nothing self-heals without it.
|
|
180
145
|
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
* branch.json and scans it as healthy. Nothing self-heals, and recovery
|
|
185
|
-
* previously meant an operator running `git rebase --abort` on EFS by hand.
|
|
186
|
-
*
|
|
187
|
-
* Never throws — a missing or unreadable repo is reported as "no rebase",
|
|
188
|
-
* which is the safe direction for both callers (the worker only ever uses a
|
|
189
|
-
* `true` to justify an abort it holds the content-write lock for).
|
|
146
|
+
* Never throws — a missing or unreadable repo is reported as "no rebase", the safe direction for
|
|
147
|
+
* both callers (the worker only uses a `true` to justify an abort it holds the content-write lock
|
|
148
|
+
* for).
|
|
190
149
|
*/
|
|
191
150
|
export async function isRebaseInProgress(repoPath) {
|
|
192
151
|
const gitDir = await resolveGitDir(repoPath);
|
|
@@ -199,9 +158,8 @@ export async function isRebaseInProgress(repoPath) {
|
|
|
199
158
|
return results.some(Boolean);
|
|
200
159
|
}
|
|
201
160
|
/**
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
* if detection fails or HEAD is detached.
|
|
161
|
+
* The repository's current HEAD branch name, or `fallback` when detection fails or HEAD is
|
|
162
|
+
* detached.
|
|
205
163
|
*/
|
|
206
164
|
export async function detectHeadBranch(repoRoot, fallback = 'main') {
|
|
207
165
|
try {
|
|
@@ -214,18 +172,14 @@ export async function detectHeadBranch(repoRoot, fallback = 'main') {
|
|
|
214
172
|
}
|
|
215
173
|
}
|
|
216
174
|
/**
|
|
217
|
-
* Resolve the base branch — the fork point for CMS editing branches and the
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
-
* - An explicitly configured `defaultBaseBranch` always wins, in both modes.
|
|
223
|
-
* - In dev mode it is detected from the current git HEAD, so workspaces fork
|
|
224
|
-
* from the branch the developer has checked out.
|
|
225
|
-
* - Otherwise it is 'main'.
|
|
175
|
+
* Resolve the base branch — the fork point for CMS editing branches and the branch workspace
|
|
176
|
+
* clones are seeded from. The single definition of base-branch behavior (see ARCHITECTURE.md
|
|
177
|
+
* "Branch Identity"): a configured `defaultBaseBranch` always wins in both modes; dev mode
|
|
178
|
+
* otherwise detects the current git HEAD, so workspaces fork from the developer's checked-out
|
|
179
|
+
* branch; otherwise 'main'.
|
|
226
180
|
*
|
|
227
|
-
* Static deployments never reach git operations, so callers
|
|
228
|
-
*
|
|
181
|
+
* Static deployments never reach git operations, so callers on static paths must short-circuit
|
|
182
|
+
* before calling this (see createCanopyServices).
|
|
229
183
|
*/
|
|
230
184
|
export async function resolveBaseBranch(options) {
|
|
231
185
|
if (options.defaultBaseBranch)
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,51 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Process-scoped logger indirection for modules that run in BOTH the worker
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* the
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* ## Why process-scoped rather than a threaded parameter
|
|
26
|
-
*
|
|
27
|
-
* The invariant is a property of the PROCESS's stdout/stderr, not of any
|
|
28
|
-
* particular call: the same `branch-registry.ts` line is correct as bare
|
|
29
|
-
* console under Lambda and wrong under the worker. Threading a logger down to
|
|
30
|
-
* it would mean touching every signature between `CmsWorker.rebase*` and
|
|
31
|
-
* `BranchMetadataFileManager.loadOnly` to carry a logging concern. One
|
|
32
|
-
* process-wide switch, set once at the worker entrypoint, expresses exactly
|
|
33
|
-
* the thing that is actually true.
|
|
34
|
-
*
|
|
35
|
-
* Lambda and the dev server install nothing and keep plain `console`, which is
|
|
36
|
-
* correct there - CloudWatch's Lambda integration stamps and delimits events
|
|
37
|
-
* on its own.
|
|
38
|
-
*
|
|
39
|
-
* ## Usage
|
|
40
|
-
*
|
|
41
|
-
* Shared server-side modules call `canopyLogWarn`/`canopyLogError`/`canopyLog`
|
|
42
|
-
* instead of `console.*`. The worker entrypoint calls `installWorkerLogger()`
|
|
43
|
-
* (`worker/log.ts`, re-exported from `worker/cms-worker.ts`) once, before doing
|
|
44
|
-
* any work.
|
|
45
|
-
*
|
|
46
|
-
* Not for browser/editor code: those keep `console` directly. This module is
|
|
47
|
-
* dependency-free so importing it can never drag a server-only dependency into
|
|
48
|
-
* a client bundle, but there is nothing for it to do in a browser.
|
|
2
|
+
* Process-scoped logger indirection for modules that run in BOTH the worker daemon and the
|
|
3
|
+
* Lambda/dev server.
|
|
4
|
+
*
|
|
5
|
+
* `worker/log.ts` holds the invariant: every line written to `/var/log/canopy-worker/worker.log`
|
|
6
|
+
* must start with an ISO-8601 timestamp, because the CloudWatch agent's `multi_line_start_pattern`
|
|
7
|
+
* is keyed on that prefix (see `canopycms-cdk/src/constructs/cms-service.ts`). A line WITHOUT the
|
|
8
|
+
* prefix is not a new event - it is appended to the PREVIOUS one, inheriting that timestamp and
|
|
9
|
+
* carrying none of its own severity tag, so an operationally interesting warning goes invisible to
|
|
10
|
+
* `filter @message like /WARN/` (and locally too, since vitest intercepts console). Shared modules
|
|
11
|
+
* the worker also executes (`github-service.ts`, `branch-registry.ts`) would otherwise emit bare
|
|
12
|
+
* `console.warn` into that log.
|
|
13
|
+
*
|
|
14
|
+
* Process-scoped rather than a threaded parameter because the invariant belongs to the PROCESS's
|
|
15
|
+
* stdout/stderr, not to any particular call: the same `branch-registry.ts` line is correct as bare
|
|
16
|
+
* console under Lambda and wrong under the worker. Lambda and the dev server install nothing and
|
|
17
|
+
* keep plain `console`, which is correct there - CloudWatch's Lambda integration stamps and
|
|
18
|
+
* delimits events on its own.
|
|
19
|
+
*
|
|
20
|
+
* So shared server-side modules call `canopyLogWarn`/`canopyLogError`/`canopyLog`, and the worker
|
|
21
|
+
* entrypoint calls `installWorkerLogger()` (`worker/log.ts`, re-exported from
|
|
22
|
+
* `worker/cms-worker.ts`) once before doing any work. Not for browser/editor code, which keeps
|
|
23
|
+
* `console`. Dependency-free, so importing it can never drag a server-only dependency into a
|
|
24
|
+
* client bundle.
|
|
49
25
|
*/
|
|
50
26
|
/** The three levels the shared modules use. Structurally satisfied by `console`. */
|
|
51
27
|
export interface CanopyLogger {
|
|
@@ -58,11 +34,20 @@ export interface CanopyLogger {
|
|
|
58
34
|
* call after the modules that use the helpers have already been imported.
|
|
59
35
|
*/
|
|
60
36
|
export declare function setCanopyLogger(logger: CanopyLogger): void;
|
|
61
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Restore the default (`console`). Exists for tests; production installs once and never reverts.
|
|
39
|
+
* @internal Exported for tests.
|
|
40
|
+
*/
|
|
62
41
|
export declare function resetCanopyLogger(): void;
|
|
63
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* The logger currently installed. Exported for assertions; prefer the helpers below.
|
|
44
|
+
* @internal Exported for tests.
|
|
45
|
+
*/
|
|
64
46
|
export declare function getCanopyLogger(): CanopyLogger;
|
|
65
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* Informational. Routes to stdout (or the worker's timestamped stdout).
|
|
49
|
+
* @internal Exported for tests.
|
|
50
|
+
*/
|
|
66
51
|
export declare function canopyLog(...args: unknown[]): void;
|
|
67
52
|
/** Recoverable problem - the caller carries on. Routes to stderr. */
|
|
68
53
|
export declare function canopyLogWarn(...args: unknown[]): void;
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,58 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Process-scoped logger indirection for modules that run in BOTH the worker
|
|
3
|
-
*
|
|
2
|
+
* Process-scoped logger indirection for modules that run in BOTH the worker daemon and the
|
|
3
|
+
* Lambda/dev server.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* `worker/log.ts` holds the invariant: every line written to `/var/log/canopy-worker/worker.log`
|
|
6
|
+
* must start with an ISO-8601 timestamp, because the CloudWatch agent's `multi_line_start_pattern`
|
|
7
|
+
* is keyed on that prefix (see `canopycms-cdk/src/constructs/cms-service.ts`). A line WITHOUT the
|
|
8
|
+
* prefix is not a new event - it is appended to the PREVIOUS one, inheriting that timestamp and
|
|
9
|
+
* carrying none of its own severity tag, so an operationally interesting warning goes invisible to
|
|
10
|
+
* `filter @message like /WARN/` (and locally too, since vitest intercepts console). Shared modules
|
|
11
|
+
* the worker also executes (`github-service.ts`, `branch-registry.ts`) would otherwise emit bare
|
|
12
|
+
* `console.warn` into that log.
|
|
6
13
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* inheriting that event's timestamp and carrying none of its own severity tag.
|
|
14
|
+
* Process-scoped rather than a threaded parameter because the invariant belongs to the PROCESS's
|
|
15
|
+
* stdout/stderr, not to any particular call: the same `branch-registry.ts` line is correct as bare
|
|
16
|
+
* console under Lambda and wrong under the worker. Lambda and the dev server install nothing and
|
|
17
|
+
* keep plain `console`, which is correct there - CloudWatch's Lambda integration stamps and
|
|
18
|
+
* delimits events on its own.
|
|
13
19
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* (registry regeneration, reached from every worker `meta.save()`). Their
|
|
20
|
-
* output landed in worker.log unprefixed, so an operationally interesting
|
|
21
|
-
* warning - "GitHub throttled us" - was silently folded into a minutes-old
|
|
22
|
-
* event and became invisible to `filter @message like /WARN/`. Invisible
|
|
23
|
-
* locally too, since vitest intercepts console.
|
|
24
|
-
*
|
|
25
|
-
* ## Why process-scoped rather than a threaded parameter
|
|
26
|
-
*
|
|
27
|
-
* The invariant is a property of the PROCESS's stdout/stderr, not of any
|
|
28
|
-
* particular call: the same `branch-registry.ts` line is correct as bare
|
|
29
|
-
* console under Lambda and wrong under the worker. Threading a logger down to
|
|
30
|
-
* it would mean touching every signature between `CmsWorker.rebase*` and
|
|
31
|
-
* `BranchMetadataFileManager.loadOnly` to carry a logging concern. One
|
|
32
|
-
* process-wide switch, set once at the worker entrypoint, expresses exactly
|
|
33
|
-
* the thing that is actually true.
|
|
34
|
-
*
|
|
35
|
-
* Lambda and the dev server install nothing and keep plain `console`, which is
|
|
36
|
-
* correct there - CloudWatch's Lambda integration stamps and delimits events
|
|
37
|
-
* on its own.
|
|
38
|
-
*
|
|
39
|
-
* ## Usage
|
|
40
|
-
*
|
|
41
|
-
* Shared server-side modules call `canopyLogWarn`/`canopyLogError`/`canopyLog`
|
|
42
|
-
* instead of `console.*`. The worker entrypoint calls `installWorkerLogger()`
|
|
43
|
-
* (`worker/log.ts`, re-exported from `worker/cms-worker.ts`) once, before doing
|
|
44
|
-
* any work.
|
|
45
|
-
*
|
|
46
|
-
* Not for browser/editor code: those keep `console` directly. This module is
|
|
47
|
-
* dependency-free so importing it can never drag a server-only dependency into
|
|
48
|
-
* a client bundle, but there is nothing for it to do in a browser.
|
|
20
|
+
* So shared server-side modules call `canopyLogWarn`/`canopyLogError`/`canopyLog`, and the worker
|
|
21
|
+
* entrypoint calls `installWorkerLogger()` (`worker/log.ts`, re-exported from
|
|
22
|
+
* `worker/cms-worker.ts`) once before doing any work. Not for browser/editor code, which keeps
|
|
23
|
+
* `console`. Dependency-free, so importing it can never drag a server-only dependency into a
|
|
24
|
+
* client bundle.
|
|
49
25
|
*/
|
|
50
26
|
/**
|
|
51
|
-
* Deliberately mutable module state, read at CALL time
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* prefix depended on whether `github-service.ts` happened to be imported before
|
|
55
|
-
* or after the entrypoint installed the worker logger.
|
|
27
|
+
* Deliberately mutable module state, read at CALL time rather than captured at import time. A call
|
|
28
|
+
* site does not control module import order, so a captured reference would make a line's prefix
|
|
29
|
+
* depend on whether its module was imported before or after the worker logger was installed.
|
|
56
30
|
*/
|
|
57
31
|
let active = console;
|
|
58
32
|
/**
|
|
@@ -62,15 +36,24 @@ let active = console;
|
|
|
62
36
|
export function setCanopyLogger(logger) {
|
|
63
37
|
active = logger;
|
|
64
38
|
}
|
|
65
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Restore the default (`console`). Exists for tests; production installs once and never reverts.
|
|
41
|
+
* @internal Exported for tests.
|
|
42
|
+
*/
|
|
66
43
|
export function resetCanopyLogger() {
|
|
67
44
|
active = console;
|
|
68
45
|
}
|
|
69
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* The logger currently installed. Exported for assertions; prefer the helpers below.
|
|
48
|
+
* @internal Exported for tests.
|
|
49
|
+
*/
|
|
70
50
|
export function getCanopyLogger() {
|
|
71
51
|
return active;
|
|
72
52
|
}
|
|
73
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* Informational. Routes to stdout (or the worker's timestamped stdout).
|
|
55
|
+
* @internal Exported for tests.
|
|
56
|
+
*/
|
|
74
57
|
export function canopyLog(...args) {
|
|
75
58
|
active.log(...args);
|
|
76
59
|
}
|
|
@@ -1,50 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Called when proper-lockfile reports the lock was lost mid-hold (its directory
|
|
3
|
-
*
|
|
2
|
+
* Called when proper-lockfile reports the lock was lost mid-hold (its directory vanished, or a
|
|
3
|
+
* refresh failed and another holder may have taken over).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* proper-lockfile invokes it from inside the refresh timer, so a throw is an
|
|
11
|
-
* uncaught exception that kills the process.
|
|
5
|
+
* A parameter rather than a fixed policy because every call site must decide what that means for
|
|
6
|
+
* ITS critical section: a compromise during idempotent provisioning is survivable, one during
|
|
7
|
+
* the worker's rebase means a second writer may be live and the next destructive git step must
|
|
8
|
+
* not run. What is NOT negotiable is that it must not throw -- proper-lockfile invokes it from
|
|
9
|
+
* inside the refresh timer, so a throw is an uncaught exception that kills the process.
|
|
12
10
|
*/
|
|
13
11
|
export type OnLockCompromised = (err: Error) => void;
|
|
14
12
|
/**
|
|
15
|
-
* Acquire a cross-process filesystem lock for content provisioning.
|
|
13
|
+
* Acquire a cross-process filesystem lock for content provisioning. Returns a release function —
|
|
14
|
+
* always call it in a `finally`.
|
|
16
15
|
*
|
|
17
|
-
* In-memory locks
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* processes, so only one provisions a given resource at a time while the others
|
|
23
|
-
* wait and then find it already done.
|
|
16
|
+
* In-memory locks serialize only within one process, but build tools such as Next.js static
|
|
17
|
+
* generation provision content from parallel worker *processes*, which then race while creating
|
|
18
|
+
* the same git workspace ("cannot mkdir remote.git: File exists", "destination path already
|
|
19
|
+
* exists"). proper-lockfile's atomic on-disk lock holds across processes, so one provisions while
|
|
20
|
+
* the others wait and then find it already done.
|
|
24
21
|
*
|
|
25
|
-
* Returns a release function — always call it in a `finally`.
|
|
26
|
-
*
|
|
27
|
-
* @param lockTargetDir directory the lock marker lives in (created if missing)
|
|
28
|
-
* @param lockName name of the on-disk lock marker, created inside lockTargetDir
|
|
29
22
|
* @param onCompromised see {@link OnLockCompromised}; defaults to log-and-continue
|
|
30
23
|
*/
|
|
31
24
|
export declare function acquireProvisioningLock(lockTargetDir: string, lockName: string, onCompromised?: OnLockCompromised): Promise<() => Promise<void>>;
|
|
32
25
|
/**
|
|
33
|
-
* Zero-retry variant of {@link acquireProvisioningLock}, for admin actions
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* for a live provisioner to finish; an admin request must fail fast on
|
|
37
|
-
* contention instead (409 immediately) rather than hang the request for that
|
|
38
|
-
* long.
|
|
26
|
+
* Zero-retry variant of {@link acquireProvisioningLock}, for admin actions inside a synchronous
|
|
27
|
+
* request/response cycle (a Lambda-backed API handler). `acquireProvisioningLock`'s ~600-retry
|
|
28
|
+
* budget waits minutes for a live provisioner; an admin request must fail fast instead.
|
|
39
29
|
*
|
|
40
|
-
* `stale: 30_000` is unchanged from the patient variant: a genuinely stale
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* which reads this same lock's mtime to decide whether it is fresh or
|
|
45
|
-
* stale before an admin purge/repair proceeds).
|
|
30
|
+
* `stale: 30_000` is unchanged from the patient variant: a genuinely stale lock (holder crashed
|
|
31
|
+
* more than 30s ago) is still taken over normally. Only the RETRY loop for live contention is
|
|
32
|
+
* removed, not the staleness recovery a caller depends on -- see branch-health.ts's [H1]
|
|
33
|
+
* freshness rail, which reads this lock's mtime before an admin purge/repair proceeds.
|
|
46
34
|
*
|
|
47
|
-
* Throws with `err.code === 'ELOCKED'` on contention (a live, non-stale
|
|
48
|
-
*
|
|
35
|
+
* Throws with `err.code === 'ELOCKED'` on contention (a live, non-stale holder) -- callers
|
|
36
|
+
* translate that into a 409.
|
|
49
37
|
*/
|
|
50
38
|
export declare function tryAcquireProvisioningLock(lockTargetDir: string, lockName: string, onCompromised?: OnLockCompromised): Promise<() => Promise<void>>;
|