canopycms 0.0.68-int.98 → 0.1.0
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/CHANGELOG.md +2131 -0
- package/README.md +47 -63
- package/dist/ai/generate.d.ts +5 -0
- package/dist/ai/generate.js +244 -115
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/json-to-markdown.d.ts +21 -1
- package/dist/ai/json-to-markdown.js +120 -57
- package/dist/ai/references.d.ts +72 -0
- package/dist/ai/references.js +223 -0
- package/dist/ai/resolve-branch.js +9 -2
- package/dist/ai/to-plain-text.d.ts +17 -8
- package/dist/ai/to-plain-text.js +18 -15
- package/dist/ai/types.d.ts +84 -3
- package/dist/api/admin-branch-health.d.ts +24 -1
- package/dist/api/admin-branch-health.js +52 -20
- package/dist/api/admin.d.ts +23 -5
- package/dist/api/admin.js +36 -1
- package/dist/api/assets.js +88 -78
- package/dist/api/branch-create-window.d.ts +12 -0
- package/dist/api/branch-create-window.js +13 -0
- package/dist/api/branch-merge.d.ts +1 -1
- package/dist/api/branch-merge.js +1 -1
- package/dist/api/branch-review.d.ts +3 -3
- package/dist/api/branch-review.js +16 -7
- package/dist/api/branch-status.d.ts +16 -6
- package/dist/api/branch-status.js +57 -12
- package/dist/api/branch-withdraw.d.ts +2 -2
- package/dist/api/branch-withdraw.js +8 -3
- package/dist/api/branch.d.ts +25 -12
- package/dist/api/branch.js +164 -103
- package/dist/api/client.d.ts +78 -58
- package/dist/api/client.js +150 -117
- package/dist/api/comments.d.ts +12 -3
- package/dist/api/comments.js +118 -9
- package/dist/api/content.d.ts +9 -9
- package/dist/api/content.js +131 -22
- package/dist/api/entries-constants.d.ts +14 -3
- package/dist/api/entries-constants.js +14 -3
- package/dist/api/entries.d.ts +40 -2
- package/dist/api/entries.js +102 -6
- package/dist/api/github-sync.d.ts +19 -0
- package/dist/api/github-sync.js +50 -3
- package/dist/api/groups.d.ts +4 -4
- package/dist/api/groups.js +2 -1
- package/dist/api/guards.js +23 -3
- package/dist/api/index.d.ts +3 -1
- package/dist/api/index.js +1 -0
- package/dist/api/permissions.d.ts +21 -2
- package/dist/api/permissions.js +50 -3
- package/dist/api/request-deadline.d.ts +59 -0
- package/dist/api/request-deadline.js +73 -0
- package/dist/api/resolve-references.js +8 -7
- package/dist/api/route-builder.d.ts +14 -0
- package/dist/api/route-builder.js +14 -1
- package/dist/api/schema.d.ts +11 -9
- package/dist/api/schema.js +2 -0
- package/dist/api/settings-helpers.d.ts +5 -1
- package/dist/api/settings-helpers.js +10 -2
- package/dist/api/types.d.ts +18 -0
- package/dist/api/users-constants.d.ts +6 -0
- package/dist/api/users-constants.js +6 -0
- package/dist/assets/asset-url.d.ts +28 -16
- package/dist/assets/asset-url.js +51 -25
- package/dist/assets/finalize.js +3 -0
- package/dist/assets/index.d.ts +1 -1
- package/dist/assets/materialize.d.ts +153 -0
- package/dist/assets/materialize.js +402 -0
- package/dist/assets/store-local.d.ts +19 -5
- package/dist/assets/store-local.js +69 -10
- package/dist/assets/store-s3.d.ts +38 -7
- package/dist/assets/store-s3.js +128 -22
- package/dist/assets/transform-directives.d.ts +52 -13
- package/dist/assets/transform-directives.js +87 -27
- package/dist/assets/transform.d.ts +3 -3
- package/dist/assets/transform.js +13 -8
- package/dist/assets/types.d.ts +31 -4
- package/dist/auth/cache.d.ts +1 -1
- package/dist/auth/cache.js +1 -1
- package/dist/auth/caching-auth-plugin.d.ts +2 -0
- package/dist/auth/caching-auth-plugin.js +12 -2
- package/dist/auth/file-based-auth-cache.d.ts +8 -0
- package/dist/auth/file-based-auth-cache.js +18 -8
- package/dist/auth/person-name.d.ts +5 -0
- package/dist/auth/person-name.js +8 -0
- package/dist/auth/plugin.d.ts +10 -1
- package/dist/auth/types.d.ts +2 -0
- package/dist/auth/user-metadata-lookup.d.ts +21 -0
- package/dist/auth/user-metadata-lookup.js +116 -0
- package/dist/authorization/branch.d.ts +1 -1
- package/dist/authorization/branch.js +12 -13
- package/dist/authorization/groups/schema.d.ts +4 -4
- package/dist/authorization/helpers.d.ts +8 -0
- package/dist/authorization/helpers.js +8 -0
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.js +1 -1
- package/dist/authorization/protected-branch.d.ts +5 -4
- package/dist/authorization/protected-branch.js +7 -5
- package/dist/branch-health.d.ts +35 -8
- package/dist/branch-health.js +54 -18
- package/dist/branch-metadata-error.d.ts +27 -0
- package/dist/branch-metadata-error.js +23 -0
- package/dist/branch-metadata-file.d.ts +205 -24
- package/dist/branch-metadata-file.js +126 -25
- package/dist/branch-metadata.d.ts +45 -6
- package/dist/branch-metadata.js +142 -50
- package/dist/branch-provisioning.d.ts +167 -0
- package/dist/branch-provisioning.js +501 -0
- package/dist/branch-registry.d.ts +8 -0
- package/dist/branch-registry.js +61 -9
- package/dist/branch-schema-cache.d.ts +29 -12
- package/dist/branch-schema-cache.js +64 -21
- package/dist/branch-sparse.d.ts +23 -0
- package/dist/branch-sparse.js +118 -0
- package/dist/branch-workspace.d.ts +42 -3
- package/dist/branch-workspace.js +239 -100
- package/dist/build/asset-refs.d.ts +94 -0
- package/dist/build/asset-refs.js +267 -0
- package/dist/build/generate-ai-content.js +5 -0
- package/dist/build/inline-flight.d.ts +37 -0
- package/dist/build/inline-flight.js +142 -0
- package/dist/cli/asset-refs.d.ts +52 -0
- package/dist/cli/asset-refs.js +194 -0
- package/dist/cli/cli.d.ts +15 -1
- package/dist/cli/cli.js +8543 -3193
- package/dist/cli/configured-asset-store.d.ts +12 -0
- package/dist/cli/configured-asset-store.js +46 -0
- package/dist/cli/generate-ai-content.js +4244 -1072
- package/dist/cli/init.js +217 -126
- package/dist/cli/project-detect.d.ts +2 -0
- package/dist/cli/project-detect.js +2 -0
- package/dist/cli/template-files/Dockerfile.cms.template +13 -5
- package/dist/cli/template-files/cms-stack.ts.template +16 -13
- package/dist/client.d.ts +1 -2
- package/dist/client.js +1 -2
- package/dist/comment-store.d.ts +25 -0
- package/dist/comment-store.js +43 -8
- package/dist/config/flatten.js +2 -0
- package/dist/config/helpers.js +2 -2
- package/dist/config/index.d.ts +1 -1
- package/dist/config/schemas/config.d.ts +12 -29
- package/dist/config/schemas/config.js +9 -12
- package/dist/config/schemas/field.d.ts +3 -0
- package/dist/config/schemas/field.js +58 -4
- package/dist/config/schemas/media.d.ts +4 -13
- package/dist/config/schemas/media.js +5 -8
- package/dist/config/schemas/url.d.ts +2 -20
- package/dist/config/schemas/url.js +2 -25
- package/dist/config/types.d.ts +116 -22
- package/dist/config/types.js +3 -9
- package/dist/config/validation.d.ts +25 -4
- package/dist/config/validation.js +116 -3
- package/dist/content-id-index.js +2 -2
- package/dist/content-index-generation.d.ts +1 -1
- package/dist/content-index-generation.js +1 -1
- package/dist/content-listing.d.ts +10 -1
- package/dist/content-listing.js +22 -5
- package/dist/content-reader.d.ts +9 -0
- package/dist/content-reader.js +16 -11
- package/dist/content-store.d.ts +75 -12
- package/dist/content-store.js +249 -86
- package/dist/content-tree.js +2 -2
- package/dist/context.js +5 -2
- package/dist/dangling-reference-log.d.ts +17 -0
- package/dist/dangling-reference-log.js +29 -0
- package/dist/dev-content-watcher.d.ts +1 -1
- package/dist/dev-content-watcher.js +1 -1
- package/dist/editor/BranchManager.d.ts +23 -7
- package/dist/editor/BranchManager.js +119 -54
- package/dist/editor/CanopyEditor.d.ts +1 -1
- package/dist/editor/CanopyEditor.js +1 -2
- package/dist/editor/CommentsPanel.d.ts +14 -0
- package/dist/editor/CommentsPanel.js +68 -43
- package/dist/editor/Editor.d.ts +11 -5
- package/dist/editor/Editor.js +891 -218
- package/dist/editor/EditorAuthGate.d.ts +7 -1
- package/dist/editor/EditorAuthGate.js +41 -9
- package/dist/editor/EntryNavigator.d.ts +22 -0
- package/dist/editor/EntryNavigator.js +353 -105
- package/dist/editor/FormHeader.d.ts +25 -0
- package/dist/editor/FormHeader.js +82 -0
- package/dist/editor/FormRenderer.d.ts +27 -3
- package/dist/editor/FormRenderer.js +171 -76
- package/dist/editor/PreviewFrame.d.ts +40 -0
- package/dist/editor/PreviewFrame.js +215 -0
- package/dist/editor/PreviewPane.d.ts +47 -0
- package/dist/editor/PreviewPane.js +147 -0
- package/dist/editor/PreviewToolbarTools.d.ts +22 -0
- package/dist/editor/PreviewToolbarTools.js +73 -0
- package/dist/editor/admin/SystemHealthPanel.d.ts +2 -1
- package/dist/editor/admin/SystemHealthPanel.js +163 -33
- package/dist/editor/admin/useSystemHealth.d.ts +18 -0
- package/dist/editor/admin/useSystemHealth.js +70 -1
- package/dist/editor/branch-status.d.ts +17 -0
- package/dist/editor/branch-status.js +29 -0
- package/dist/editor/canopy-path.d.ts +9 -6
- package/dist/editor/canopy-path.js +8 -11
- package/dist/editor/client-reference-resolver.d.ts +43 -16
- package/dist/editor/client-reference-resolver.js +155 -64
- package/dist/editor/comments/BranchComments.d.ts +1 -1
- package/dist/editor/comments/BranchComments.js +2 -2
- package/dist/editor/comments/CloseRefusedNotice.d.ts +4 -0
- package/dist/editor/comments/CloseRefusedNotice.js +7 -0
- package/dist/editor/comments/CommentThreadsPopover.d.ts +47 -0
- package/dist/editor/comments/CommentThreadsPopover.js +274 -0
- package/dist/editor/comments/CommentWriteAlert.d.ts +11 -0
- package/dist/editor/comments/CommentWriteAlert.js +13 -0
- package/dist/editor/comments/EntryComments.d.ts +10 -4
- package/dist/editor/comments/EntryComments.js +14 -17
- package/dist/editor/comments/FieldWrapper.d.ts +18 -4
- package/dist/editor/comments/FieldWrapper.js +62 -28
- package/dist/editor/comments/InlineCommentThread.d.ts +9 -2
- package/dist/editor/comments/InlineCommentThread.js +11 -47
- package/dist/editor/comments/ThreadCarousel.d.ts +1 -1
- package/dist/editor/comments/ThreadCarousel.js +18 -21
- package/dist/editor/comments/ThreadReplyControls.d.ts +28 -0
- package/dist/editor/comments/ThreadReplyControls.js +92 -0
- package/dist/editor/comments/field-comment-context.d.ts +14 -0
- package/dist/editor/comments/field-comment-context.js +14 -0
- package/dist/editor/comments/form-comments.d.ts +48 -0
- package/dist/editor/comments/form-comments.js +178 -0
- package/dist/editor/comments/item-anchor-copy.d.ts +6 -0
- package/dist/editor/comments/item-anchor-copy.js +6 -0
- package/dist/editor/comments/move-focus-if-unmoved.d.ts +6 -0
- package/dist/editor/comments/move-focus-if-unmoved.js +11 -0
- package/dist/editor/comments/popover-placement.d.ts +18 -0
- package/dist/editor/comments/popover-placement.js +58 -0
- package/dist/editor/comments/use-tracked-writes.d.ts +16 -0
- package/dist/editor/comments/use-tracked-writes.js +53 -0
- package/dist/editor/components/BranchAccessList.d.ts +15 -0
- package/dist/editor/components/BranchAccessList.js +52 -0
- package/dist/editor/components/BranchLockBanner.d.ts +22 -0
- package/dist/editor/components/BranchLockBanner.js +39 -0
- package/dist/editor/components/BranchPill.d.ts +32 -0
- package/dist/editor/components/BranchPill.js +33 -0
- package/dist/editor/components/BranchesDrawer.d.ts +11 -0
- package/dist/editor/components/BranchesDrawer.js +5 -0
- package/dist/editor/components/ConfirmDeleteModal.d.ts +6 -1
- package/dist/editor/components/ConfirmDeleteModal.js +3 -2
- package/dist/editor/components/DestructiveMenuItem.d.ts +7 -0
- package/dist/editor/components/DestructiveMenuItem.js +8 -0
- package/dist/editor/components/EditorCrashScreen.d.ts +17 -0
- package/dist/editor/components/EditorCrashScreen.js +22 -0
- package/dist/editor/components/EditorErrorBoundary.d.ts +38 -0
- package/dist/editor/components/EditorErrorBoundary.js +40 -0
- package/dist/editor/components/EditorHeader.d.ts +56 -106
- package/dist/editor/components/EditorHeader.js +130 -131
- package/dist/editor/components/EditorRail.d.ts +49 -0
- package/dist/editor/components/EditorRail.js +65 -0
- package/dist/editor/components/EntryBreadcrumb.d.ts +33 -0
- package/dist/editor/components/EntryBreadcrumb.js +56 -0
- package/dist/editor/components/EntryCreateModal.d.ts +12 -7
- package/dist/editor/components/EntryCreateModal.js +51 -57
- package/dist/editor/components/NoEditPermissionNotice.d.ts +6 -5
- package/dist/editor/components/NoEditPermissionNotice.js +5 -4
- package/dist/editor/components/QuickOpenPalette.d.ts +22 -0
- package/dist/editor/components/QuickOpenPalette.js +66 -0
- package/dist/editor/components/ReadOnlyDraftNotice.d.ts +11 -0
- package/dist/editor/components/ReadOnlyDraftNotice.js +12 -0
- package/dist/editor/components/ReasonedMenuItem.d.ts +15 -0
- package/dist/editor/components/ReasonedMenuItem.js +15 -0
- package/dist/editor/components/ReferencedByList.d.ts +11 -0
- package/dist/editor/components/ReferencedByList.js +28 -0
- package/dist/editor/components/RelativeTime.d.ts +10 -0
- package/dist/editor/components/RelativeTime.js +10 -0
- package/dist/editor/components/RenameEntryModal.d.ts +9 -1
- package/dist/editor/components/RenameEntryModal.js +19 -31
- package/dist/editor/components/RetryToastMessage.d.ts +9 -0
- package/dist/editor/components/RetryToastMessage.js +6 -0
- package/dist/editor/components/SaveAllResult.d.ts +25 -0
- package/dist/editor/components/SaveAllResult.js +86 -0
- package/dist/editor/components/SaveSplitButton.d.ts +30 -0
- package/dist/editor/components/SaveSplitButton.js +108 -0
- package/dist/editor/components/StagedChangesDrawer.d.ts +39 -0
- package/dist/editor/components/StagedChangesDrawer.js +92 -0
- package/dist/editor/components/UnavailableEntryNotice.d.ts +6 -0
- package/dist/editor/components/UnavailableEntryNotice.js +9 -0
- package/dist/editor/components/UnavailableTypeMessage.d.ts +6 -0
- package/dist/editor/components/UnavailableTypeMessage.js +9 -0
- package/dist/editor/components/UndoToastMessage.d.ts +18 -0
- package/dist/editor/components/UndoToastMessage.js +10 -0
- package/dist/editor/components/UserBadge.d.ts +2 -5
- package/dist/editor/components/UserBadge.js +62 -33
- package/dist/editor/components/ValidationSummary.d.ts +14 -0
- package/dist/editor/components/ValidationSummary.js +24 -0
- package/dist/editor/components/index.d.ts +2 -2
- package/dist/editor/components/index.js +2 -2
- package/dist/editor/context/ApiClientContext.d.ts +8 -2
- package/dist/editor/context/ApiClientContext.js +19 -8
- package/dist/editor/context/AssetContext.d.ts +13 -35
- package/dist/editor/context/AssetContext.js +12 -31
- package/dist/editor/context/EditorStateContext.d.ts +4 -4
- package/dist/editor/context/EditorStateContext.js +4 -4
- package/dist/editor/context/SWRProvider.d.ts +3 -3
- package/dist/editor/context/SiteMdxAllowContext.d.ts +4 -0
- package/dist/editor/context/SiteMdxAllowContext.js +7 -0
- package/dist/editor/context/index.d.ts +2 -1
- package/dist/editor/context/index.js +2 -1
- package/dist/editor/contrast.d.ts +19 -0
- package/dist/editor/contrast.js +41 -0
- package/dist/editor/copy.d.ts +18 -0
- package/dist/editor/copy.js +18 -0
- package/dist/editor/editor-config.js +16 -0
- package/dist/editor/editor-utils.d.ts +34 -8
- package/dist/editor/editor-utils.js +42 -20
- package/dist/editor/entry-search.d.ts +20 -0
- package/dist/editor/entry-search.js +34 -0
- package/dist/editor/field-breadcrumb.d.ts +12 -0
- package/dist/editor/field-breadcrumb.js +85 -0
- package/dist/editor/field-props.d.ts +86 -0
- package/dist/editor/field-props.js +27 -0
- package/dist/editor/field-target.d.ts +30 -0
- package/dist/editor/field-target.js +77 -0
- package/dist/editor/fields/BlockField.d.ts +12 -0
- package/dist/editor/fields/BlockField.js +89 -73
- package/dist/editor/fields/CodeField.d.ts +2 -0
- package/dist/editor/fields/CodeField.js +6 -2
- package/dist/editor/fields/DateTimeField.d.ts +4 -29
- package/dist/editor/fields/DateTimeField.js +79 -41
- package/dist/editor/fields/ExpandAllButton.d.ts +6 -0
- package/dist/editor/fields/ExpandAllButton.js +4 -0
- package/dist/editor/fields/FieldCrashFallback.d.ts +17 -0
- package/dist/editor/fields/FieldCrashFallback.js +30 -0
- package/dist/editor/fields/FieldLabel.d.ts +37 -0
- package/dist/editor/fields/FieldLabel.js +19 -0
- package/dist/editor/fields/ImageField.d.ts +4 -0
- package/dist/editor/fields/ImageField.js +29 -14
- package/dist/editor/fields/InlineGroupField.js +4 -3
- package/dist/editor/fields/ItemList.d.ts +42 -0
- package/dist/editor/fields/ItemList.js +130 -0
- package/dist/editor/fields/MarkdownField.d.ts +32 -0
- package/dist/editor/fields/MarkdownField.js +223 -46
- package/dist/editor/fields/MdxImageDialog.js +1 -1
- package/dist/editor/fields/NumberField.d.ts +2 -0
- package/dist/editor/fields/NumberField.js +8 -5
- package/dist/editor/fields/NumberListField.d.ts +2 -0
- package/dist/editor/fields/NumberListField.js +19 -16
- package/dist/editor/fields/ObjectField.d.ts +2 -7
- package/dist/editor/fields/ObjectField.js +15 -5
- package/dist/editor/fields/ObjectListField.d.ts +29 -0
- package/dist/editor/fields/ObjectListField.js +57 -0
- package/dist/editor/fields/ReferenceField.d.ts +2 -0
- package/dist/editor/fields/ReferenceField.js +34 -9
- package/dist/editor/fields/SelectField.d.ts +2 -0
- package/dist/editor/fields/SelectField.js +11 -2
- package/dist/editor/fields/StringListField.d.ts +4 -1
- package/dist/editor/fields/StringListField.js +22 -8
- package/dist/editor/fields/TextField.d.ts +2 -0
- package/dist/editor/fields/TextField.js +6 -2
- package/dist/editor/fields/ToggleField.d.ts +2 -0
- package/dist/editor/fields/ToggleField.js +8 -3
- package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +1 -1
- package/dist/editor/fields/entry-link/InsertEntryLink.js +1 -1
- package/dist/editor/fields/form-expansion.d.ts +9 -0
- package/dist/editor/fields/form-expansion.js +2 -0
- package/dist/editor/fields/item-expansion.d.ts +15 -0
- package/dist/editor/fields/item-expansion.js +60 -0
- package/dist/editor/fields/list-item-keys.d.ts +8 -0
- package/dist/editor/fields/list-item-keys.js +50 -0
- package/dist/editor/fields/list-item-title.d.ts +20 -0
- package/dist/editor/fields/list-item-title.js +85 -0
- package/dist/editor/fields/markdown-export-options.d.ts +2 -0
- package/dist/editor/fields/markdown-export-options.js +8 -0
- package/dist/editor/fields/markdown-fidelity-visitors.d.ts +11 -0
- package/dist/editor/fields/markdown-fidelity-visitors.js +160 -0
- package/dist/editor/fields/mdx-jsx-support.d.ts +5 -1
- package/dist/editor/fields/mdx-jsx-support.js +157 -69
- package/dist/editor/fields/rich-text-failures.d.ts +5 -0
- package/dist/editor/fields/rich-text-failures.js +26 -0
- package/dist/editor/fields/toolbar-wrap.d.ts +7 -0
- package/dist/editor/fields/toolbar-wrap.js +35 -0
- package/dist/editor/form-outline.d.ts +13 -0
- package/dist/editor/form-outline.js +70 -0
- package/dist/editor/group-manager/GroupCard.d.ts +4 -1
- package/dist/editor/group-manager/GroupCard.js +12 -3
- package/dist/editor/group-manager/GroupForm.js +1 -1
- package/dist/editor/group-manager/InternalGroupsTab.d.ts +2 -1
- package/dist/editor/group-manager/InternalGroupsTab.js +4 -4
- package/dist/editor/group-manager/MemberList.d.ts +2 -1
- package/dist/editor/group-manager/MemberList.js +15 -4
- package/dist/editor/group-manager/hooks/useGroupState.d.ts +5 -0
- package/dist/editor/group-manager/hooks/useGroupState.js +30 -7
- package/dist/editor/group-manager/index.js +34 -5
- package/dist/editor/group-manager/types.d.ts +5 -2
- package/dist/editor/hooks/create-branch-request.d.ts +20 -0
- package/dist/editor/hooks/create-branch-request.js +54 -0
- package/dist/editor/hooks/save-all.d.ts +68 -0
- package/dist/editor/hooks/save-all.js +61 -0
- package/dist/editor/hooks/useBranchActions.d.ts +11 -1
- package/dist/editor/hooks/useBranchActions.js +42 -19
- package/dist/editor/hooks/useBranchManager.d.ts +21 -0
- package/dist/editor/hooks/useBranchManager.js +321 -125
- package/dist/editor/hooks/useBranchesData.d.ts +8 -4
- package/dist/editor/hooks/useBranchesData.js +9 -5
- package/dist/editor/hooks/useCommentSystem.d.ts +14 -2
- package/dist/editor/hooks/useCommentSystem.js +79 -55
- package/dist/editor/hooks/useCommentsData.d.ts +11 -7
- package/dist/editor/hooks/useCommentsData.js +20 -19
- package/dist/editor/hooks/useDraftManager.d.ts +77 -3
- package/dist/editor/hooks/useDraftManager.js +887 -94
- package/dist/editor/hooks/useEditorLayout.d.ts +53 -7
- package/dist/editor/hooks/useEditorLayout.js +98 -20
- package/dist/editor/hooks/useEntriesData.d.ts +2 -1
- package/dist/editor/hooks/useEntriesData.js +18 -4
- package/dist/editor/hooks/useEntryManager.d.ts +41 -2
- package/dist/editor/hooks/useEntryManager.js +227 -41
- package/dist/editor/hooks/useGroupManager.js +13 -16
- package/dist/editor/hooks/usePermissionManager.js +14 -6
- package/dist/editor/hooks/usePreviewMarks.d.ts +21 -0
- package/dist/editor/hooks/usePreviewMarks.js +33 -0
- package/dist/editor/hooks/useReferenceResolution.d.ts +10 -3
- package/dist/editor/hooks/useReferenceResolution.js +34 -177
- package/dist/editor/hooks/useSchemaManager.d.ts +25 -6
- package/dist/editor/hooks/useSchemaManager.js +97 -39
- package/dist/editor/hooks/useUserMetadata.d.ts +14 -4
- package/dist/editor/hooks/useUserMetadata.js +76 -47
- package/dist/editor/hooks/user-metadata-batcher.d.ts +8 -0
- package/dist/editor/hooks/user-metadata-batcher.js +33 -0
- package/dist/editor/media/AssetCard.d.ts +6 -7
- package/dist/editor/media/AssetCard.js +24 -31
- package/dist/editor/media/AssetListRow.d.ts +16 -0
- package/dist/editor/media/AssetListRow.js +41 -0
- package/dist/editor/media/CropStep.js +6 -1
- package/dist/editor/media/MediaLibrary.d.ts +4 -3
- package/dist/editor/media/MediaLibrary.js +11 -4
- package/dist/editor/media/MediaLibraryBody.d.ts +3 -3
- package/dist/editor/media/MediaLibraryBody.js +195 -80
- package/dist/editor/media/MediaLibrarySkeleton.d.ts +6 -0
- package/dist/editor/media/MediaLibrarySkeleton.js +14 -0
- package/dist/editor/media/crop-math.d.ts +3 -4
- package/dist/editor/media/crop-math.js +11 -22
- package/dist/editor/media/editor-image-src.d.ts +8 -0
- package/dist/editor/media/editor-image-src.js +10 -0
- package/dist/editor/media/format-bytes.d.ts +2 -0
- package/dist/editor/media/format-bytes.js +23 -0
- package/dist/editor/media/media-library-prefs.d.ts +23 -0
- package/dist/editor/media/media-library-prefs.js +49 -0
- package/dist/editor/media/media-library-view.d.ts +34 -0
- package/dist/editor/media/media-library-view.js +40 -0
- package/dist/editor/media/useAssetLibrary.d.ts +30 -0
- package/dist/editor/media/useAssetLibrary.js +126 -0
- package/dist/editor/media/useStableAssetOrder.d.ts +11 -0
- package/dist/editor/media/useStableAssetOrder.js +37 -0
- package/dist/editor/media/useThumbnailFailure.d.ts +6 -0
- package/dist/editor/media/useThumbnailFailure.js +16 -0
- package/dist/editor/permission-manager/GroupSelector.js +2 -2
- package/dist/editor/permission-manager/PermissionEditor.d.ts +1 -1
- package/dist/editor/permission-manager/PermissionEditor.js +15 -4
- package/dist/editor/permission-manager/PermissionLevelBadge.js +1 -1
- package/dist/editor/permission-manager/PermissionTree.d.ts +1 -1
- package/dist/editor/permission-manager/UserSelector.d.ts +1 -1
- package/dist/editor/permission-manager/UserSelector.js +3 -3
- package/dist/editor/permission-manager/index.js +12 -3
- package/dist/editor/permission-manager/types.d.ts +5 -2
- package/dist/editor/platform.d.ts +3 -0
- package/dist/editor/platform.js +9 -0
- package/dist/editor/preview-asset-base.d.ts +9 -0
- package/dist/editor/preview-asset-base.js +17 -0
- package/dist/editor/preview-bridge.d.ts +51 -27
- package/dist/editor/preview-bridge.js +103 -144
- package/dist/editor/preview-marks.d.ts +15 -0
- package/dist/editor/preview-marks.js +74 -0
- package/dist/editor/preview-path.d.ts +12 -0
- package/dist/editor/preview-path.js +45 -1
- package/dist/editor/preview-scale.d.ts +27 -0
- package/dist/editor/preview-scale.js +34 -0
- package/dist/editor/raw-asset-base.d.ts +5 -0
- package/dist/editor/raw-asset-base.js +14 -0
- package/dist/editor/relative-time.d.ts +4 -4
- package/dist/editor/relative-time.js +16 -8
- package/dist/editor/schema-editor/CollectionEditor.d.ts +20 -3
- package/dist/editor/schema-editor/CollectionEditor.js +361 -62
- package/dist/editor/schema-editor/EntryTypeEditor.d.ts +5 -1
- package/dist/editor/schema-editor/EntryTypeEditor.js +11 -6
- package/dist/editor/schema-editor/collection-draft.d.ts +22 -0
- package/dist/editor/schema-editor/collection-draft.js +40 -0
- package/dist/editor/schema-editor/index.d.ts +1 -1
- package/dist/editor/schema-label.d.ts +10 -0
- package/dist/editor/schema-label.js +17 -0
- package/dist/editor/settings-conflict.d.ts +5 -0
- package/dist/editor/settings-conflict.js +8 -0
- package/dist/editor/shell/ActivityRail.d.ts +37 -0
- package/dist/editor/shell/ActivityRail.js +91 -0
- package/dist/editor/shell/EditorShell.d.ts +17 -0
- package/dist/editor/shell/EditorShell.js +31 -0
- package/dist/editor/shell/PaneLayout.d.ts +28 -0
- package/dist/editor/shell/PaneLayout.js +116 -0
- package/dist/editor/shell/SidePanelHost.d.ts +35 -0
- package/dist/editor/shell/SidePanelHost.js +184 -0
- package/dist/editor/shell/TopBar.d.ts +12 -0
- package/dist/editor/shell/TopBar.js +14 -0
- package/dist/editor/shell/host-chrome.d.ts +16 -0
- package/dist/editor/shell/host-chrome.js +69 -0
- package/dist/editor/slug.d.ts +16 -0
- package/dist/editor/slug.js +43 -0
- package/dist/editor/theme.d.ts +2 -1
- package/dist/editor/theme.js +314 -13
- package/dist/editor/unanswered.d.ts +17 -0
- package/dist/editor/unanswered.js +26 -0
- package/dist/editor/unavailable-entry-type.d.ts +20 -0
- package/dist/editor/unavailable-entry-type.js +28 -0
- package/dist/editor/undo-removal.d.ts +57 -0
- package/dist/editor/undo-removal.js +163 -0
- package/dist/editor/user-display.d.ts +4 -0
- package/dist/editor/user-display.js +5 -0
- package/dist/editor/utils/confirm-modal.d.ts +8 -0
- package/dist/editor/utils/confirm-modal.js +12 -0
- package/dist/editor/utils/editor-errors.d.ts +19 -0
- package/dist/editor/utils/editor-errors.js +32 -0
- package/dist/editor/utils/focus-return.d.ts +56 -0
- package/dist/editor/utils/focus-return.js +106 -0
- package/dist/entry-link-resolver.d.ts +11 -1
- package/dist/entry-link-resolver.js +65 -5
- package/dist/entry-schema-registry.d.ts +3 -3
- package/dist/entry-schema-registry.js +7 -4
- package/dist/entry-schema.d.ts +49 -3
- package/dist/entry-schema.js +18 -0
- package/dist/git-manager.d.ts +172 -10
- package/dist/git-manager.js +449 -107
- package/dist/github-service.d.ts +39 -2
- package/dist/github-service.js +101 -7
- package/dist/http/handler.js +74 -9
- package/dist/http/types.d.ts +2 -0
- package/dist/http/worker-not-ready.d.ts +9 -4
- package/dist/http/worker-not-ready.js +59 -6
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/item-keys.d.ts +46 -0
- package/dist/item-keys.js +235 -0
- package/dist/operating-mode/editor-mode-check.d.ts +15 -0
- package/dist/operating-mode/editor-mode-check.js +24 -0
- package/dist/operating-mode/mode-env.d.ts +13 -14
- package/dist/operating-mode/mode-env.js +13 -14
- package/dist/operating-mode/types.d.ts +2 -2
- package/dist/paths/branch.d.ts +0 -1
- package/dist/paths/branch.js +1 -8
- package/dist/paths/index.d.ts +1 -1
- package/dist/paths/index.js +1 -1
- package/dist/paths/validation.js +0 -2
- package/dist/preview.d.ts +8 -0
- package/dist/preview.js +7 -0
- package/dist/reference-resolver.js +1 -0
- package/dist/resolve-canopy-user.d.ts +1 -1
- package/dist/resolve-canopy-user.js +1 -1
- package/dist/schema/meta-loader.d.ts +18 -8
- package/dist/schema/meta-loader.js +42 -9
- package/dist/schema/registry-fingerprint.d.ts +14 -0
- package/dist/schema/registry-fingerprint.js +63 -0
- package/dist/schema/resolver.d.ts +7 -4
- package/dist/schema/resolver.js +7 -6
- package/dist/schema/schema-store.d.ts +7 -10
- package/dist/schema/schema-store.js +13 -11
- package/dist/schema/schema-unavailable-error.d.ts +11 -0
- package/dist/schema/schema-unavailable-error.js +15 -0
- package/dist/schema/types.d.ts +22 -0
- package/dist/schema-registry-record.d.ts +35 -0
- package/dist/schema-registry-record.js +134 -0
- package/dist/server.d.ts +79 -9
- package/dist/server.js +62 -8
- package/dist/services.d.ts +33 -5
- package/dist/services.js +155 -37
- package/dist/settings-workspace.d.ts +23 -3
- package/dist/settings-workspace.js +159 -45
- package/dist/stamp-on-publish.d.ts +36 -0
- package/dist/stamp-on-publish.js +71 -0
- package/dist/static/index.d.ts +58 -5
- package/dist/static/index.js +133 -3
- package/dist/static/seo.d.ts +5 -5
- package/dist/static/seo.js +5 -5
- package/dist/submission-attribution.d.ts +8 -0
- package/dist/submission-attribution.js +22 -0
- package/dist/system-users.d.ts +12 -0
- package/dist/system-users.js +12 -0
- package/dist/task-queue/cms-task-queue.d.ts +1 -1
- package/dist/task-queue/cms-task-queue.js +1 -1
- package/dist/task-queue/index.d.ts +1 -1
- package/dist/task-queue/index.js +1 -1
- package/dist/task-queue/task-queue.d.ts +6 -0
- package/dist/task-queue/task-queue.js +29 -0
- package/dist/task-queue/worker-status.d.ts +35 -9
- package/dist/task-queue/worker-status.js +84 -17
- package/dist/types.d.ts +90 -9
- package/dist/url-collision.js +3 -3
- package/dist/url-exclusivity-fixtures.d.ts +8 -1
- package/dist/url-exclusivity-fixtures.js +11 -1
- package/dist/user.js +2 -1
- package/dist/utils/atomic-write.js +2 -1
- package/dist/utils/base-branch.d.ts +13 -0
- package/dist/utils/base-branch.js +23 -0
- package/dist/utils/content-serialize.d.ts +15 -7
- package/dist/utils/content-serialize.js +353 -51
- package/dist/utils/content-write-lock.d.ts +6 -1
- package/dist/utils/content-write-lock.js +21 -6
- package/dist/utils/debug.d.ts +1 -1
- package/dist/utils/debug.js +5 -3
- package/dist/utils/error.js +13 -2
- package/dist/utils/escape-text.d.ts +7 -0
- package/dist/utils/escape-text.js +27 -0
- package/dist/utils/fs.d.ts +12 -4
- package/dist/utils/fs.js +18 -5
- package/dist/utils/git.d.ts +21 -1
- package/dist/utils/git.js +63 -8
- package/dist/utils/json-source-splice.d.ts +14 -0
- package/dist/utils/json-source-splice.js +120 -0
- package/dist/utils/markdown-body-splice.d.ts +39 -0
- package/dist/utils/markdown-body-splice.js +421 -0
- package/dist/utils/occ-json-write.js +18 -12
- package/dist/utils/provision-log.d.ts +25 -0
- package/dist/utils/provision-log.js +49 -0
- package/dist/utils/provisioning-lock.d.ts +32 -1
- package/dist/utils/provisioning-lock.js +78 -32
- package/dist/utils/sanitize-href.d.ts +9 -23
- package/dist/utils/sanitize-href.js +14 -28
- package/dist/utils/title-field.d.ts +10 -0
- package/dist/utils/title-field.js +47 -0
- package/dist/utils/yaml-source-splice.d.ts +58 -0
- package/dist/utils/yaml-source-splice.js +515 -0
- package/dist/validation/block-structural-keys.d.ts +1 -1
- package/dist/validation/block-structural-keys.js +1 -1
- package/dist/validation/deletion-checker.d.ts +21 -29
- package/dist/validation/deletion-checker.js +41 -117
- package/dist/validation/entry-validator.d.ts +6 -10
- package/dist/validation/entry-validator.js +19 -26
- package/dist/validation/field-traversal.d.ts +22 -0
- package/dist/validation/field-traversal.js +39 -8
- package/dist/validation/markdown-safety.d.ts +68 -0
- package/dist/validation/markdown-safety.js +596 -0
- package/dist/validation/mdx-allowlist.d.ts +55 -0
- package/dist/validation/mdx-allowlist.js +183 -0
- package/dist/validation/reference-validator.d.ts +2 -0
- package/dist/validation/reference-validator.js +3 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/branch-policy.d.ts +124 -0
- package/dist/worker/branch-policy.js +243 -0
- package/dist/worker/bundle-header.d.ts +117 -0
- package/dist/worker/bundle-header.js +253 -0
- package/dist/worker/cms-worker.d.ts +236 -142
- package/dist/worker/cms-worker.js +772 -285
- package/dist/worker/gateway-egress.d.ts +43 -0
- package/dist/worker/gateway-egress.js +209 -0
- package/dist/worker/gateway-instance.d.ts +42 -0
- package/dist/worker/gateway-instance.js +129 -0
- package/dist/worker/git-process.d.ts +81 -0
- package/dist/worker/git-process.js +234 -0
- package/dist/worker/git-sync.d.ts +34 -17
- package/dist/worker/git-sync.js +394 -131
- package/dist/worker/github-auth.d.ts +9 -9
- package/dist/worker/github-auth.js +13 -15
- package/dist/worker/github-gateway-http.d.ts +62 -0
- package/dist/worker/github-gateway-http.js +977 -0
- package/dist/worker/github-gateway-wire.d.ts +590 -0
- package/dist/worker/github-gateway-wire.js +488 -0
- package/dist/worker/github-gateway.d.ts +238 -0
- package/dist/worker/github-gateway.js +726 -0
- package/dist/worker/github-mirror-upkeep.d.ts +75 -0
- package/dist/worker/github-mirror-upkeep.js +266 -0
- package/dist/worker/github-mirror.d.ts +364 -0
- package/dist/worker/github-mirror.js +1030 -0
- package/dist/worker/github-transfer.d.ts +56 -0
- package/dist/worker/github-transfer.js +444 -0
- package/dist/worker/history-rewrite.d.ts +4 -5
- package/dist/worker/history-rewrite.js +12 -17
- package/dist/worker/provisioned-workspace.d.ts +5 -5
- package/dist/worker/provisioned-workspace.js +5 -5
- package/dist/worker/rebase.d.ts +1 -1
- package/dist/worker/rebase.js +58 -54
- package/dist/worker/remote-git-maintenance.d.ts +3 -0
- package/dist/worker/remote-git-maintenance.js +12 -0
- package/dist/worker/schema-gate.d.ts +49 -0
- package/dist/worker/schema-gate.js +226 -0
- package/dist/worker/self-checks.d.ts +107 -0
- package/dist/worker/self-checks.js +358 -0
- package/dist/worker/shared-repo-git.d.ts +96 -0
- package/dist/worker/shared-repo-git.js +459 -0
- package/dist/worker/sparse-cone.d.ts +20 -0
- package/dist/worker/sparse-cone.js +136 -0
- package/dist/worker/stale-mirror.d.ts +82 -0
- package/dist/worker/stale-mirror.js +130 -0
- package/dist/worker/task-runner.d.ts +5 -3
- package/dist/worker/task-runner.js +287 -186
- package/dist/worker/worker-context.d.ts +36 -37
- package/package.json +35 -7
- package/dist/editor/EditorPanes.d.ts +0 -10
- package/dist/editor/EditorPanes.js +0 -98
- package/dist/editor/components/EditorFooter.d.ts +0 -11
- package/dist/editor/components/EditorFooter.js +0 -9
- package/dist/editor/components/EditorSidebar.d.ts +0 -67
- package/dist/editor/components/EditorSidebar.js +0 -22
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { type GitHubAuthConfig } from './github-auth.js';
|
|
2
|
+
import { type GitHubGateway } from './github-gateway.js';
|
|
3
|
+
import type { WorkerStatusReport } from '../types.js';
|
|
2
4
|
export { PermanentTaskError, isPermanentTaskFailure } from './task-runner.js';
|
|
3
5
|
export { workerLog, workerLogWarn, workerLogError, installWorkerLogger } from './log.js';
|
|
4
|
-
export { normalizeGitHubAppPrivateKey, DEFAULT_GIT_TOKEN_MINT_TIMEOUT_MS, DEFAULT_GITHUB_TOKEN_REFRESH_MIN_INTERVAL_MS, type GitHubAppAuth, type GitHubAuthConfig, } from './github-auth.js';
|
|
6
|
+
export { resolveWorkerGitHubAuth, normalizeGitHubAppPrivateKey, DEFAULT_GIT_TOKEN_MINT_TIMEOUT_MS, DEFAULT_GITHUB_TOKEN_REFRESH_MIN_INTERVAL_MS, type GitHubAppAuth, type GitHubAuthConfig, } from './github-auth.js';
|
|
7
|
+
export { createLocalGitHubGateway, type GitHubGateway, type GitHubGatewayHealth, type LocalGitHubGatewayOptions, } from './github-gateway.js';
|
|
8
|
+
export { serveGitHubGateway, connectGitHubGateway, type GitHubGatewayClientOptions, type GitHubGatewayListen, type GitHubGatewayServer, type GitHubGatewayServerOptions, } from './github-gateway-http.js';
|
|
9
|
+
export { GitHubGatewayUnreachableError } from './github-gateway-wire.js';
|
|
10
|
+
export { GatewayInstance, type GatewayInstanceOptions } from './gateway-instance.js';
|
|
11
|
+
export { gatewayLog, gatewayLogWarn, gatewayLogError, registerSecretText, registerPrivateKey, redactEgress, } from './gateway-egress.js';
|
|
12
|
+
export { assertSelfChecks, gatewaySelfChecks, workerSelfChecks, type SelfCheckEnvironment, type SelfCheckName, type SelfCheckResult, } from './self-checks.js';
|
|
5
13
|
/**
|
|
6
14
|
* Auth cache refresh function type; adopters supply their auth-plugin-specific
|
|
7
15
|
* implementation (for Clerk, refreshClerkCache from
|
|
@@ -17,6 +25,21 @@ export type AuthCacheRefresher = () => Promise<void>;
|
|
|
17
25
|
export interface CmsWorkerConfig extends GitHubAuthConfig {
|
|
18
26
|
/** Path to workspace root on EFS (e.g., /mnt/efs) */
|
|
19
27
|
workspacePath: string;
|
|
28
|
+
/**
|
|
29
|
+
* A directory only this worker can write, never on the shared filesystem: it holds the private
|
|
30
|
+
* GitHub mirror, the one repository any git command carrying the credential runs in
|
|
31
|
+
* (worker/github-mirror.ts). The AWS worker passes systemd's `StateDirectory=`. Default: a
|
|
32
|
+
* directory under `os.tmpdir()`, which the worker refuses unless it owns it and no one else can
|
|
33
|
+
* write to it.
|
|
34
|
+
*/
|
|
35
|
+
stateDirectory?: string;
|
|
36
|
+
/**
|
|
37
|
+
* A GitHub gateway to use instead of building the in-process one: a client of a gateway another
|
|
38
|
+
* process serves (`connectGitHubGateway`), which holds the credential, the protected set and the
|
|
39
|
+
* mirror. Exclusive with `githubToken`, `githubAppAuth`, `refreshGitHubToken` and
|
|
40
|
+
* `protectedBranches`, which configure the in-process one.
|
|
41
|
+
*/
|
|
42
|
+
githubGateway?: GitHubGateway;
|
|
20
43
|
/** GitHub owner (e.g., 'acme') */
|
|
21
44
|
githubOwner: string;
|
|
22
45
|
/** GitHub repo name (e.g., 'site') */
|
|
@@ -29,8 +52,14 @@ export interface CmsWorkerConfig extends GitHubAuthConfig {
|
|
|
29
52
|
gitSyncInterval?: number;
|
|
30
53
|
/** Auth cache refresh interval in ms (default: 15 * 60 * 1000) */
|
|
31
54
|
authCacheRefreshInterval?: number;
|
|
32
|
-
/** Base branch name (default:
|
|
55
|
+
/** Base branch name (default: detected at start(); see `resolveBaseBranch`) */
|
|
33
56
|
baseBranch?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Branches the worker never pushes, deletes or opens a pull request from, beside the configured
|
|
59
|
+
* base branch and GitHub's default branch: exact names, or globs in which `*` matches any run of
|
|
60
|
+
* characters (`release/*`), which never match a settings branch. See worker/branch-policy.ts.
|
|
61
|
+
*/
|
|
62
|
+
protectedBranches?: readonly string[];
|
|
34
63
|
/**
|
|
35
64
|
* Names THIS worker's own settings branch
|
|
36
65
|
* (`canopycms-settings-{deploymentName}`, default 'prod' — ProdStrategy's
|
|
@@ -56,13 +85,36 @@ export interface CmsWorkerConfig extends GitHubAuthConfig {
|
|
|
56
85
|
maxRetries?: number;
|
|
57
86
|
/** Content root directory name relative to repo root (default: 'content') */
|
|
58
87
|
contentRoot?: string;
|
|
88
|
+
/**
|
|
89
|
+
* Longest the git sync holds the base branch for content naming entry schemas the serving
|
|
90
|
+
* editor does not define, before advancing anyway (default: 30 minutes). See worker/schema-gate.ts.
|
|
91
|
+
*/
|
|
92
|
+
schemaHoldMaxMs?: number;
|
|
59
93
|
/**
|
|
60
94
|
* Worker lock staleness TTL in ms (default 60000, minimum 2000). The holder
|
|
61
95
|
* refreshes the heartbeat at half this interval; a lock whose heartbeat is
|
|
62
96
|
* older than this is abandoned and taken over by the next worker to start.
|
|
63
97
|
*/
|
|
64
98
|
lockStaleMs?: number;
|
|
99
|
+
/**
|
|
100
|
+
* How long `stop()` waits for in-flight work before aborting it, in ms
|
|
101
|
+
* (default {@link DEFAULT_DRAIN_DEADLINE_MS}). An entrypoint's process
|
|
102
|
+
* manager must allow this plus {@link ABORT_GRACE_MS} before it kills the
|
|
103
|
+
* process.
|
|
104
|
+
*/
|
|
105
|
+
drainDeadlineMs?: number;
|
|
65
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* The default `taskTimeoutMs`. Exported because a split worker's gateway client passes it as its
|
|
109
|
+
* `fetchInactivityMs` and the gateway uses it as its `timeoutMs`, as the in-process gateway does.
|
|
110
|
+
*/
|
|
111
|
+
export declare const DEFAULT_TASK_TIMEOUT = 60000;
|
|
112
|
+
/**
|
|
113
|
+
* 90s fits inside an EC2 spot interruption's two-minute notice with room to
|
|
114
|
+
* exit, and exceeds the default task timeout, so a task already running when
|
|
115
|
+
* the drain begins normally finishes or times out on its own.
|
|
116
|
+
*/
|
|
117
|
+
export declare const DEFAULT_DRAIN_DEADLINE_MS = 90000;
|
|
66
118
|
/**
|
|
67
119
|
* CMS Worker daemon: the operations Lambda, which has no internet, cannot
|
|
68
120
|
* perform -- draining the task queue, syncing the bare repo with GitHub,
|
|
@@ -72,28 +124,68 @@ export interface CmsWorkerConfig extends GitHubAuthConfig {
|
|
|
72
124
|
* Auth-agnostic (no specific auth provider) and cloud-agnostic (git/Octokit
|
|
73
125
|
* directly, no AWS SDK dependency).
|
|
74
126
|
*/
|
|
127
|
+
/** Why a worker stopped itself; see {@link CmsWorker.selfStopped}. */
|
|
128
|
+
export interface WorkerSelfStop {
|
|
129
|
+
reason: string;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Record a worker that failed before {@link CmsWorker.start} as `lastFatalError` (phase
|
|
133
|
+
* `startup`), so System health and the API's not-ready answer say why. For an entrypoint's own
|
|
134
|
+
* boot steps (its environment, its secrets); start() records its own failures.
|
|
135
|
+
*
|
|
136
|
+
* Writes under the worker lock like every status write, and writes nothing while the lock looks
|
|
137
|
+
* held (fresher than twice `lockStaleMs`, see recordLockLoss): its holder owns the file. Never
|
|
138
|
+
* throws, since its caller is already exiting.
|
|
139
|
+
*/
|
|
140
|
+
export declare function recordWorkerStartupFailure(options: {
|
|
141
|
+
workspacePath: string;
|
|
142
|
+
error: unknown;
|
|
143
|
+
lockStaleMs?: number;
|
|
144
|
+
/**
|
|
145
|
+
* Write nothing when the file is a failed start's own record (its `lastFatalError` was written
|
|
146
|
+
* by the worker that wrote the file) and this accepts that record: for a failure that only says
|
|
147
|
+
* the recorded cause is still in the way (the GitHub gateway unreachable while it restarts after
|
|
148
|
+
* its own fatal error), which must not replace that cause. A record a later worker carried
|
|
149
|
+
* forward is never kept: that worker got past it.
|
|
150
|
+
*/
|
|
151
|
+
keepRecordedFatal?: (recorded: NonNullable<WorkerStatusReport['lastFatalError']>) => boolean;
|
|
152
|
+
}): Promise<void>;
|
|
75
153
|
export declare class CmsWorker {
|
|
76
154
|
private config;
|
|
77
|
-
private
|
|
155
|
+
private gateway?;
|
|
78
156
|
private taskDir;
|
|
79
157
|
private remoteGitPath;
|
|
158
|
+
private stateDirectory;
|
|
80
159
|
private contentBranchesPath;
|
|
81
|
-
private
|
|
82
|
-
private sanitizedBaseBranch;
|
|
160
|
+
private resolvedBaseBranch?;
|
|
83
161
|
private settingsBranchResolved?;
|
|
84
162
|
private activeTimeouts;
|
|
85
163
|
private running;
|
|
86
164
|
private activeOperations;
|
|
165
|
+
private stopping;
|
|
166
|
+
private drainDeadlineMs;
|
|
167
|
+
private shutdownController;
|
|
87
168
|
private maxTasksPerCycle;
|
|
88
169
|
private taskTimeoutMs;
|
|
89
170
|
private maxRetries;
|
|
90
171
|
private lockFilePath;
|
|
91
172
|
private lockStaleMs;
|
|
173
|
+
private schemaHoldMaxMs;
|
|
92
174
|
private releaseLockFn;
|
|
93
175
|
private contentRoot;
|
|
94
176
|
private log;
|
|
95
177
|
private statusReport?;
|
|
96
|
-
private
|
|
178
|
+
private warnedDivergences;
|
|
179
|
+
private lockLostMessage?;
|
|
180
|
+
private statusWriterAtLock?;
|
|
181
|
+
private settleSelfStopped;
|
|
182
|
+
/**
|
|
183
|
+
* Settles once the worker has stopped for a reason it chose itself (its lock was
|
|
184
|
+
* compromised), after the drain and its record in worker-status.json. Never settles for a
|
|
185
|
+
* stop() the entrypoint asked for. Nothing else ends the process, so an entrypoint exits
|
|
186
|
+
* non-zero on it and its process manager starts a fresh worker.
|
|
187
|
+
*/
|
|
188
|
+
readonly selfStopped: Promise<WorkerSelfStop>;
|
|
97
189
|
constructor(config: CmsWorkerConfig);
|
|
98
190
|
/**
|
|
99
191
|
* This worker's self-reported status object, initialized on first use.
|
|
@@ -114,12 +206,12 @@ export declare class CmsWorker {
|
|
|
114
206
|
* as foreign and never pushes it.
|
|
115
207
|
*
|
|
116
208
|
* DEFERRED out of the constructor deliberately, which is the whole point of
|
|
117
|
-
* the method existing:
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
209
|
+
* the method existing: an entrypoint constructs the worker before calling
|
|
210
|
+
* start(), so a throw during `new CmsWorker(...)` lands BEFORE start()'s
|
|
211
|
+
* catch, which records `lastFatalError` for every entrypoint. Only one that
|
|
212
|
+
* calls `recordWorkerStartupFailure` (canopycms-cdk/worker/run.ts does) would
|
|
213
|
+
* record it otherwise; under systemd `Restart=always` the rest crash-loop
|
|
214
|
+
* every ~5s with System health showing the worker 'absent' and no reason.
|
|
123
215
|
*
|
|
124
216
|
* Lazy rather than start()-only so unit tests driving pushSettingsBranches()
|
|
125
217
|
* still see the value, exactly as ensureStatusReport() above. Idempotent: the
|
|
@@ -133,12 +225,46 @@ export declare class CmsWorker {
|
|
|
133
225
|
* Built FRESH on every call, with instance-backed members as functions rather
|
|
134
226
|
* than copied values. See WorkerContext's INVARIANT: a context that captured
|
|
135
227
|
* any of them at construction time would hand the extracted code the pre-test
|
|
136
|
-
* value, which for
|
|
137
|
-
* for real instead of its local fixture repo.
|
|
228
|
+
* value, which for the GitHub gateway means a test's push going to
|
|
229
|
+
* github.com for real instead of its local fixture repo.
|
|
138
230
|
*/
|
|
139
231
|
private ctx;
|
|
232
|
+
/**
|
|
233
|
+
* Take the worker lock, provision, run the first sync, then schedule the
|
|
234
|
+
* loops. All of it is tracked as an operation, so a stop() that lands
|
|
235
|
+
* mid-startup -- during the lock acquisition, a first-boot clone, the first
|
|
236
|
+
* sync -- drains it before releasing the lock, and start() then resolves
|
|
237
|
+
* without scheduling anything.
|
|
238
|
+
*/
|
|
140
239
|
start(): Promise<void>;
|
|
141
|
-
|
|
240
|
+
private startUnderLock;
|
|
241
|
+
/**
|
|
242
|
+
* Drain, then release the worker lock. Idempotent: a second call returns the
|
|
243
|
+
* first call's promise.
|
|
244
|
+
*
|
|
245
|
+
* 1. Stop taking work: no loop starts another iteration, and none claims
|
|
246
|
+
* another task or starts another sync stage or branch rebase (each checks
|
|
247
|
+
* `isDraining()` at its boundaries).
|
|
248
|
+
* 2. Wait up to the deadline (`drainDeadlineMs`, or `deadlineMs` for this
|
|
249
|
+
* call) for what is already in flight, startup included.
|
|
250
|
+
* 3. At the deadline, abort it through `shutdownSignal()`: a task's git push
|
|
251
|
+
* and GitHub calls are killed and the task is released to pending with no
|
|
252
|
+
* retry spent; a sync's bundle, unbundle, ref update and settings push
|
|
253
|
+
* are killed. The gateway's GitHub fetches and mirror maintenance run on
|
|
254
|
+
* (safeinsights/canopycms#907). A branch rebase
|
|
255
|
+
* is never aborted, because a rebase killed mid-branch is recovered
|
|
256
|
+
* lossily; anything still unsettled after a short grace is abandoned to
|
|
257
|
+
* the process exit.
|
|
258
|
+
* 4. Record `lastShutdown` in worker-status.json -- only while this worker
|
|
259
|
+
* still holds the lock, or after a compromise that started this stop once
|
|
260
|
+
* it has retaken it (recordLockLoss) -- and release the lock. Release comes last, so a successor starts
|
|
261
|
+
* only once this worker's work has settled or been abandoned.
|
|
262
|
+
*/
|
|
263
|
+
stop(options?: {
|
|
264
|
+
reason?: string;
|
|
265
|
+
deadlineMs?: number;
|
|
266
|
+
}): Promise<void>;
|
|
267
|
+
private drainAndStop;
|
|
142
268
|
/**
|
|
143
269
|
* Acquire the cross-host worker lock (DEP-C2).
|
|
144
270
|
*
|
|
@@ -163,19 +289,63 @@ export declare class CmsWorker {
|
|
|
163
289
|
*/
|
|
164
290
|
private acquireLock;
|
|
165
291
|
private releaseLock;
|
|
292
|
+
/**
|
|
293
|
+
* Record a lock compromise in worker-status.json, under the lock: retake it, waiting out its
|
|
294
|
+
* staleness window, and write only if that succeeds and the file is still this worker's (or
|
|
295
|
+
* the one it took the lock from). A worker that took the lock over keeps it fresh, or has
|
|
296
|
+
* written the file since, and owns it, so nothing is written. A heartbeat this worker merely
|
|
297
|
+
* failed to refresh (an EFS hiccup) goes stale, and the record lands where the restarted
|
|
298
|
+
* worker carries `lastShutdown` forward. The restart waits for it: 65 s at the default `lockStaleMs`.
|
|
299
|
+
*/
|
|
300
|
+
private recordLockLoss;
|
|
301
|
+
/** Register `operation` as in flight under `label` until it settles. */
|
|
302
|
+
private trackOperation;
|
|
166
303
|
/**
|
|
167
304
|
* Run `fn` repeatedly, the next invocation starting `interval` ms after the
|
|
168
305
|
* previous one COMPLETES. setTimeout chaining rather than setInterval, so
|
|
169
306
|
* executions cannot overlap when one runs longer than the interval.
|
|
170
307
|
*/
|
|
171
308
|
private scheduleLoop;
|
|
309
|
+
private get baseBranch();
|
|
310
|
+
private get sanitizedBaseBranch();
|
|
311
|
+
private requireBaseBranch;
|
|
312
|
+
private setBaseBranch;
|
|
313
|
+
/**
|
|
314
|
+
* An unconfigured base branch is the one remote.git's HEAD names, which is what the Lambda
|
|
315
|
+
* reads too (GitManager.detectBaseBranch); before remote.git exists, it is GitHub's default
|
|
316
|
+
* branch, which the clone then records as that HEAD. So it is too when remote.git has no branch
|
|
317
|
+
* outside the settings namespace: no base branch is there for HEAD to name, and ensureRemoteGit
|
|
318
|
+
* replaces it from GitHub unless something in it is at stake. Never assumes 'main'.
|
|
319
|
+
*/
|
|
320
|
+
private resolveBaseBranch;
|
|
321
|
+
/**
|
|
322
|
+
* Warn when the base branch is outside the gateway's protected set: it was detected from
|
|
323
|
+
* remote.git rather than configured, and is not GitHub's default branch at boot. Only the
|
|
324
|
+
* worker's own check (`pushBranchToGitHub`) then stops a push to it. A warning, not a refusal, so
|
|
325
|
+
* a change of GitHub's default branch cannot stop the worker booting.
|
|
326
|
+
*/
|
|
327
|
+
private warnIfBaseUnprotected;
|
|
328
|
+
/**
|
|
329
|
+
* Check remote.git's config at boot. A refusal is never a case for replacement: it reports that
|
|
330
|
+
* something wrote there, and listing the refs a replacement would lose means running git under
|
|
331
|
+
* that config. The message says so, so System health does not read it as a routine failure.
|
|
332
|
+
*/
|
|
333
|
+
private assertRemoteGitConfig;
|
|
334
|
+
/** Whether the bare repo at `gitDir` has a branch that is not a settings branch. */
|
|
335
|
+
private hasContentBranch;
|
|
336
|
+
/**
|
|
337
|
+
* Point remote.git's HEAD at the base branch this worker uses, so a Lambda left to detect it
|
|
338
|
+
* (GitManager.detectBaseBranch) reads the same name. Only the worker writes it, at boot under
|
|
339
|
+
* the worker lock, and in a fresh clone before it is renamed into place, so no Lambda reads the
|
|
340
|
+
* clone's GitHub-default HEAD first; a Lambda reads it once per process.
|
|
341
|
+
*/
|
|
342
|
+
private recordBaseBranchInRemoteHead;
|
|
172
343
|
/**
|
|
173
344
|
* Whether the bare repo at `gitDir` has a local `refs/heads/<baseBranch>`.
|
|
174
345
|
*
|
|
175
|
-
*
|
|
346
|
+
* The repository is named outright (sharedRepoGit's GIT_DIR), so this also
|
|
176
347
|
* works where `safe.bareRepository=explicit` refuses cwd-based discovery of
|
|
177
|
-
* bare repos
|
|
178
|
-
* GitManager.bareRemoteHasBranch).
|
|
348
|
+
* bare repos.
|
|
179
349
|
*
|
|
180
350
|
* Deliberately omits `--quiet`: simple-git treats a task as failed only when
|
|
181
351
|
* the process exits non-zero AND writes to stderr, so a silent-on-failure
|
|
@@ -191,8 +361,8 @@ export declare class CmsWorker {
|
|
|
191
361
|
* `git clone https://x-access-token:<token>@github.com/...` records that URL
|
|
192
362
|
* verbatim as `remote.origin.url`, and for `remote.git` that config lives on
|
|
193
363
|
* shared EFS. The security model in docs/deploying-to-aws.md -- a compromised
|
|
194
|
-
* Lambda can read/write EFS content but cannot
|
|
195
|
-
*
|
|
364
|
+
* Lambda can read/write EFS content but cannot reach the GitHub credential,
|
|
365
|
+
* which stays off EFS -- is false while that string is there: the Lambda could read
|
|
196
366
|
* the token off EFS and, with no egress of its own, exfiltrate it by writing
|
|
197
367
|
* it into branch content the worker then pushes to GitHub.
|
|
198
368
|
*
|
|
@@ -204,96 +374,63 @@ export declare class CmsWorker {
|
|
|
204
374
|
*/
|
|
205
375
|
private scrubPersistedRemote;
|
|
206
376
|
/**
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
* Empty-remote guard: simple-git's bare clone of an EMPTY GitHub repo (no
|
|
211
|
-
* commits, or a base branch never pushed) exits 0 and produces a refs-less
|
|
212
|
-
* bare repo whose HEAD points at an unborn branch. `fs.stat` cannot tell that
|
|
213
|
-
* from a healthy clone, so left unchecked it silently poisons remote.git —
|
|
214
|
-
* every later branch operation breaks and the fs.stat short-circuit means it
|
|
215
|
-
* never heals. The base branch is therefore verified right after cloning AND
|
|
216
|
-
* on the already-exists fast path, since a previous run can have left a
|
|
217
|
-
* poisoned remote.git behind.
|
|
377
|
+
* Best-effort: without these settings remote.git still works, and a boot that
|
|
378
|
+
* cannot write its own config has a louder problem to report elsewhere.
|
|
218
379
|
*/
|
|
219
|
-
private
|
|
220
|
-
processTaskQueue(): Promise<void>;
|
|
221
|
-
private executeTask;
|
|
222
|
-
private updateBranchMetadata;
|
|
223
|
-
private pushBranchToGitHub;
|
|
380
|
+
private applyRemoteGitConfig;
|
|
224
381
|
/**
|
|
225
|
-
*
|
|
226
|
-
* Octokit client from it.
|
|
382
|
+
* Ensure the remote.git bare repo exists, seeding it from GitHub on first run.
|
|
227
383
|
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
* throw during `new CmsWorker(...)` lands BEFORE the only code that writes
|
|
233
|
-
* `lastFatalError` — start()'s catch.
|
|
384
|
+
* Seeded through the GitHub gateway: it fetches from GitHub, and a fresh bare repo takes its
|
|
385
|
+
* branches from the bundle it answers with (worker/github-transfer.ts), so no git command run
|
|
386
|
+
* against remote.git ever carries the credential, and no token-bearing URL is ever written to
|
|
387
|
+
* EFS.
|
|
234
388
|
*
|
|
235
|
-
*
|
|
236
|
-
*
|
|
389
|
+
* Empty-remote guard: a remote.git with no base branch (one cloned from an EMPTY GitHub repo,
|
|
390
|
+
* or with a base branch never pushed) is one `fs.stat` cannot tell from a healthy one, so left
|
|
391
|
+
* unchecked it silently poisons remote.git and the stat short-circuit means it never heals. The
|
|
392
|
+
* seed refuses a GitHub without the base branch, and the base branch is verified right after
|
|
393
|
+
* seeding AND on the already-exists fast path, where a poisoned remote.git is replaced
|
|
394
|
+
* (`replacePoisonedRemoteGit`).
|
|
237
395
|
*/
|
|
238
|
-
private
|
|
396
|
+
private ensureRemoteGit;
|
|
239
397
|
/**
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
*
|
|
398
|
+
* Replace an existing remote.git that has no base branch with a fresh seed from GitHub, but only
|
|
399
|
+
* when every ref in it names a commit a GitHub branch contains, so replacing it loses no commit;
|
|
400
|
+
* a branch name GitHub lacks, such as a merged branch deleted there, goes. Otherwise refuse,
|
|
401
|
+
* naming the refs at stake: unpushed work such as a settings branch.
|
|
402
|
+
*
|
|
403
|
+
* The refs are checked against the replacement itself, once it is seeded: a ref's commit counts
|
|
404
|
+
* as on GitHub only when the seed holds it, reachable from a branch GitHub had, so the decision
|
|
405
|
+
* follows exactly what would replace remote.git, whatever the gateway fetches meanwhile. They are
|
|
406
|
+
* listed again just before the swap, since the Lambda can push into remote.git while the seed
|
|
407
|
+
* runs. The swap is two renames, so the name remote.git resolves to the old repo,
|
|
408
|
+
* the new one, or for an instant nothing, never a half-built or half-deleted one.
|
|
245
409
|
*/
|
|
246
|
-
private
|
|
410
|
+
private replacePoisonedRemoteGit;
|
|
247
411
|
/**
|
|
248
|
-
*
|
|
249
|
-
*
|
|
250
|
-
*
|
|
251
|
-
*
|
|
252
|
-
* Async because under GitHub App auth `resolveGitToken` mints an installation
|
|
253
|
-
* token lasting about an hour. NOTHING may cache what this returns — a URL
|
|
254
|
-
* built from an installation token goes stale with it — and resolving per use
|
|
255
|
-
* is cheap, since `@octokit/auth-app` answers from its own cache until the
|
|
256
|
-
* token is near expiry.
|
|
257
|
-
*
|
|
258
|
-
* A mint failure propagates AS THROWN, carrying the `.status` that
|
|
259
|
-
* `isPermanentTaskFailure` classifies on — see github-auth.ts.
|
|
260
|
-
*
|
|
261
|
-
* Do NOT add a parallel token accessor alongside it. Every instance-backed
|
|
262
|
-
* WorkerContext member stays a function precisely so tests can replace it
|
|
263
|
-
* through the instance (worker-context.ts's INVARIANT); a second credential
|
|
264
|
-
* path would be one nothing stubs.
|
|
412
|
+
* Seed a new bare repo from GitHub at `<remote.git>.cloning`, verified and configured, and
|
|
413
|
+
* return its path for the caller to rename into place. `check` runs on the seeded repo, given
|
|
414
|
+
* GitHub's branches as the seed holds them, and its throw stops the seed. Throws with the
|
|
415
|
+
* staging directory gone.
|
|
265
416
|
*/
|
|
266
|
-
private
|
|
417
|
+
private seedRemoteGitStaging;
|
|
418
|
+
processTaskQueue(): Promise<void>;
|
|
419
|
+
private executeTask;
|
|
420
|
+
private updateBranchMetadata;
|
|
421
|
+
private pushBranchToGitHub;
|
|
267
422
|
/**
|
|
268
|
-
*
|
|
269
|
-
*
|
|
270
|
-
*
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
* a problem that does not exist. Called from start()'s try, so the failure is
|
|
274
|
-
* also recorded as `lastFatalError` and reaches the admin panel. No-op on the
|
|
275
|
-
* token path: a PAT is a literal, so the first real request checks everything
|
|
276
|
-
* this could.
|
|
277
|
-
*
|
|
278
|
-
* FATAL UNLESS THE FAILURE POSITIVELY LOOKS TRANSIENT. Both halves are
|
|
279
|
-
* load-bearing. Not always fatal, because the two credential paths must
|
|
280
|
-
* degrade alike: on the token path a GitHub 502 during boot is absorbed (a
|
|
281
|
-
* warm `remote.git` short-circuits `ensureRemoteGit`, `Promise.allSettled`
|
|
282
|
-
* swallows the initial `syncGit`) so the worker starts and its loops retry,
|
|
283
|
-
* while rethrowing every error class would make the App path exit and systemd
|
|
284
|
-
* crash-loop it until GitHub recovered — each iteration telling the operator
|
|
285
|
-
* to check their private key.
|
|
286
|
-
*
|
|
287
|
-
* But fail CLOSED, via `isTransientAuthFailure` rather than the inverse of
|
|
288
|
-
* `isPermanentTaskFailure`: that classifier defaults a status-less error to
|
|
289
|
-
* transient, which is right on the task path (bounded by `maxRetries`) and
|
|
290
|
-
* wrong here (bounded by nothing). A key that never reaches GitHub at all —
|
|
291
|
-
* the wrong type, or too mangled to sign with — fails locally and
|
|
292
|
-
* status-lessly, so defaulting to transient would boot a worker with a dead
|
|
293
|
-
* credential, record no `lastFatalError`, and show healthy in the admin panel
|
|
294
|
-
* while every task and every sync failed.
|
|
423
|
+
* The worker's GitHub gateway, created on first use: inside start()'s try, or wherever a test
|
|
424
|
+
* entry point first reaches it. Creating it resolves the credential, which throws for a
|
|
425
|
+
* half-configured one (both set, neither set, an unusable mint timeout or refresh interval) --
|
|
426
|
+
* never in the constructor, for the reason `ensureSettingsBranch()` gives. Keeps a gateway a
|
|
427
|
+
* test installed.
|
|
295
428
|
*/
|
|
296
|
-
private
|
|
429
|
+
private github;
|
|
430
|
+
/** What worker/github-transfer.ts needs, for the seeds that run before the loops' context. */
|
|
431
|
+
private transferContext;
|
|
432
|
+
/** What the in-process gateway is built from; test-utils/worker-gateway.ts builds from it too. */
|
|
433
|
+
private localGitHubGatewayOptions;
|
|
297
434
|
/**
|
|
298
435
|
* The workspace directory for a branch named by its GIT REF name -- the form
|
|
299
436
|
* task payloads carry (`context.branch.name`), not the directory form.
|
|
@@ -332,49 +469,6 @@ export declare class CmsWorker {
|
|
|
332
469
|
protected afterRebaseCompletedForTesting(): Promise<void>;
|
|
333
470
|
private rebaseActiveBranches;
|
|
334
471
|
syncGit(): Promise<void>;
|
|
335
|
-
/**
|
|
336
|
-
* `syncGit`, plus "the credential may have rotated" on the way out.
|
|
337
|
-
*
|
|
338
|
-
* One of `refreshGitHubCredential`'s two call sites, and the one that works
|
|
339
|
-
* when nobody is publishing: it fetches from GitHub every `gitSyncInterval`
|
|
340
|
-
* whether or not anyone is editing, so a credential that has stopped working
|
|
341
|
-
* surfaces here even with no push queued for days.
|
|
342
|
-
*
|
|
343
|
-
* The SYNC failure is what propagates to `scheduleLoop`'s catch;
|
|
344
|
-
* `refreshGitHubCredential` never throws, so nothing it does can replace it.
|
|
345
|
-
*/
|
|
346
|
-
private syncGitWithCredentialRefresh;
|
|
347
|
-
/**
|
|
348
|
-
* Re-read the GitHub credential, because an operation using it just failed.
|
|
349
|
-
*
|
|
350
|
-
* **Two call sites, each covering what the other cannot.** The git-sync loop
|
|
351
|
-
* (`syncGitWithCredentialRefresh`) notices a dead credential when nobody is
|
|
352
|
-
* publishing. `processTaskQueue`'s per-task catch is what saves a publish: a
|
|
353
|
-
* push task spends its retry budget on a 5s/10s/20s backoff, well inside one
|
|
354
|
-
* 5-minute sync interval, so with the sync loop as the only trigger a publish
|
|
355
|
-
* meeting a rotated token fails permanently while the working one is already
|
|
356
|
-
* in the secret store. Every consumer reaches the credential through
|
|
357
|
-
* `ensureGitHubAuth()`, which reads it per use, so a refresh from either site
|
|
358
|
-
* repairs all of them for their NEXT use — but not an attempt already failed.
|
|
359
|
-
*
|
|
360
|
-
* NOT gated on the error looking auth-shaped, at either site: a `git
|
|
361
|
-
* fetch`/`push` rejected for a dead token throws a plain simple-git error
|
|
362
|
-
* (exit 128, no HTTP `.status`) that `isPermanentTaskFailure` reads as
|
|
363
|
-
* transient, so a gate keyed on it would never fire. Two floors bound the
|
|
364
|
-
* cost instead — core's `refreshGitHubTokenMinIntervalMs` (default 60s,
|
|
365
|
-
* enforced by `refreshCredential` in github-auth.ts) and whatever floor the
|
|
366
|
-
* provider keeps (the AWS one reads at most once per five minutes) — and both
|
|
367
|
-
* call sites share both, so a read issued by one throttles the other. On the
|
|
368
|
-
* GitHub App path the refresh is a no-op.
|
|
369
|
-
*
|
|
370
|
-
* **Never throws**: both callers are already reporting the failure that must
|
|
371
|
-
* reach the log. **Bounded by `taskTimeoutMs`**, because the task loop awaits
|
|
372
|
-
* it and a read that never settled would stop every publish queued behind it
|
|
373
|
-
* (an adopter's provider may have no bound at all; the AWS one can take 87s
|
|
374
|
-
* for one `getSecret`). A losing read is not cancelled and may land later, but
|
|
375
|
-
* `refreshCredential` discards a result older than one already applied.
|
|
376
|
-
*/
|
|
377
|
-
private refreshGitHubCredential;
|
|
378
472
|
private pushSettingsBranches;
|
|
379
473
|
private refreshBaseBranchWorkspace;
|
|
380
474
|
private cleanupTrashedBranchDirs;
|