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
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { GatewayRefusalError, MAX_PROTECTED_BRANCHES } from './branch-policy.js';
|
|
3
|
+
import { GitHubPushError, MAX_FETCH_HAVE } from './github-gateway.js';
|
|
4
|
+
import { GitHubTransientError, RefusedPushError } from './github-mirror.js';
|
|
5
|
+
import { gatewayLogWarn, redactEgress } from './gateway-egress.js';
|
|
6
|
+
/**
|
|
7
|
+
* The GitHub gateway's wire format (worker/github-gateway-http.ts): what each operation sends and
|
|
8
|
+
* answers over the socket, and how a thrown error crosses it. Both ends validate everything they
|
|
9
|
+
* read against these schemas, and a value that fails is refused, never coerced: the server before
|
|
10
|
+
* any operation runs, the client before the worker sees an answer.
|
|
11
|
+
*
|
|
12
|
+
* The schemas bound shape and size. Where the gateway refuses a value itself (a branch name, a pull
|
|
13
|
+
* request's text, a protected branch: worker/branch-policy.ts), the bound here sits well above its
|
|
14
|
+
* cap, so its refusal crosses as itself and classifies as it does in-process. Object IDs and the
|
|
15
|
+
* `have` and prerequisite counts are held here to the gateway's own rules. Requests are strict, an
|
|
16
|
+
* unknown field refused: the worker and the gateway ship in one bundle and roll together, so they
|
|
17
|
+
* never differ in version, and tolerating fields would only widen what a hostile worker can send.
|
|
18
|
+
*/
|
|
19
|
+
/** Every route's prefix, so a later incompatible format can sit beside this one. */
|
|
20
|
+
const WIRE_PREFIX = '/v1';
|
|
21
|
+
/** Carries a push's JSON request, so the request body is free for its bundle. Base64url JSON. */
|
|
22
|
+
export const PUSH_REQUEST_HEADER = 'canopy-push-request';
|
|
23
|
+
/** The content type of a bundle, either way. */
|
|
24
|
+
export const BUNDLE_CONTENT_TYPE = 'application/x-git-bundle';
|
|
25
|
+
/** The largest JSON request body, in bytes: `have`'s 10 000 IDs, or a pull request body. */
|
|
26
|
+
export const MAX_JSON_REQUEST_BYTES = 2 * 1024 * 1024;
|
|
27
|
+
/** The largest JSON answer, in bytes: a fetch's ref map for every GitHub branch. */
|
|
28
|
+
export const MAX_JSON_ANSWER_BYTES = 64 * 1024 * 1024;
|
|
29
|
+
/** The longest error message that crosses, in characters; a longer one is cut. */
|
|
30
|
+
const MAX_MESSAGE_LENGTH = 256 * 1024;
|
|
31
|
+
/** The largest Octokit `response.data` that crosses, serialized; a larger one crosses as absent. */
|
|
32
|
+
const MAX_ERROR_DATA_BYTES = 64 * 1024;
|
|
33
|
+
/** The Octokit response headers that cross: the ones the task runner classifies on. */
|
|
34
|
+
const CROSSING_HEADERS = ['x-ratelimit-remaining', 'retry-after'];
|
|
35
|
+
const objectId = z.string().regex(/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/, 'not a full object ID');
|
|
36
|
+
// Shape bounds only: the gateway refuses a name or text over its own caps as itself.
|
|
37
|
+
const name = z.string().max(4096);
|
|
38
|
+
const prNumber = z.number().int().safe();
|
|
39
|
+
const message = z.string().max(MAX_MESSAGE_LENGTH);
|
|
40
|
+
export const fetchRequest = z.object({ have: z.array(objectId).max(MAX_FETCH_HAVE) }).strict();
|
|
41
|
+
export const pushRequest = z
|
|
42
|
+
.object({
|
|
43
|
+
branch: name,
|
|
44
|
+
sha: objectId,
|
|
45
|
+
lease: objectId.optional(),
|
|
46
|
+
prerequisites: z.array(objectId).max(3),
|
|
47
|
+
/** Whether the request body is a bundle; without one it is empty. */
|
|
48
|
+
bundle: z.boolean(),
|
|
49
|
+
})
|
|
50
|
+
.strict();
|
|
51
|
+
const pullRequestText = { title: z.string().max(64 * 1024), body: z.string().max(1024 * 1024) };
|
|
52
|
+
export const requests = {
|
|
53
|
+
prepare: z.object({}).strict(),
|
|
54
|
+
health: z.object({}).strict(),
|
|
55
|
+
defaultBranch: z.object({}).strict(),
|
|
56
|
+
isProtectedBranch: z.object({ branch: name }).strict(),
|
|
57
|
+
createPullRequest: z.object({ head: name, base: name, ...pullRequestText }).strict(),
|
|
58
|
+
updatePullRequest: z
|
|
59
|
+
.object({
|
|
60
|
+
number: prNumber,
|
|
61
|
+
title: pullRequestText.title.optional(),
|
|
62
|
+
body: pullRequestText.body.optional(),
|
|
63
|
+
state: z.literal('closed').optional(),
|
|
64
|
+
})
|
|
65
|
+
.strict(),
|
|
66
|
+
getPullRequest: z.object({ number: prNumber }).strict(),
|
|
67
|
+
createOrUpdatePullRequest: z
|
|
68
|
+
.object({
|
|
69
|
+
head: name,
|
|
70
|
+
base: name,
|
|
71
|
+
...pullRequestText,
|
|
72
|
+
markReadyIfDraft: z.boolean().optional(),
|
|
73
|
+
mergeSectionIntoBody: z.boolean().optional(),
|
|
74
|
+
})
|
|
75
|
+
.strict(),
|
|
76
|
+
convertPullRequestToDraft: z.object({ number: prNumber }).strict(),
|
|
77
|
+
deleteBranch: z.object({ branch: name }).strict(),
|
|
78
|
+
authSnapshot: z.object({}).strict(),
|
|
79
|
+
termination: z.object({}).strict(),
|
|
80
|
+
completeLifecycle: z.object({}).strict(),
|
|
81
|
+
};
|
|
82
|
+
const empty = z.object({}).strict();
|
|
83
|
+
const pullRequestRef = z.object({ number: prNumber, url: z.string().max(4096) }).strict();
|
|
84
|
+
export const answers = {
|
|
85
|
+
prepare: empty,
|
|
86
|
+
health: z
|
|
87
|
+
.object({
|
|
88
|
+
ready: z.boolean(),
|
|
89
|
+
fatalError: message.nullable(),
|
|
90
|
+
preflight: z.enum(['not-an-app', 'verified', 'unverified', 'pending']),
|
|
91
|
+
clerkConfigured: z.boolean(),
|
|
92
|
+
protectedBranches: z
|
|
93
|
+
.object({
|
|
94
|
+
configured: z.array(name).max(MAX_PROTECTED_BRANCHES + 1),
|
|
95
|
+
githubDefault: name.nullable(),
|
|
96
|
+
})
|
|
97
|
+
.strict(),
|
|
98
|
+
})
|
|
99
|
+
.strict(),
|
|
100
|
+
defaultBranch: z.object({ branch: name }).strict(),
|
|
101
|
+
isProtectedBranch: z.object({ protected: z.boolean() }).strict(),
|
|
102
|
+
createPullRequest: pullRequestRef,
|
|
103
|
+
updatePullRequest: empty,
|
|
104
|
+
getPullRequest: z
|
|
105
|
+
.object({
|
|
106
|
+
merged: z.boolean(),
|
|
107
|
+
merged_at: z.string().max(64).nullable(),
|
|
108
|
+
state: z.enum(['open', 'closed']),
|
|
109
|
+
node_id: z.string().max(256),
|
|
110
|
+
})
|
|
111
|
+
.strict(),
|
|
112
|
+
createOrUpdatePullRequest: pullRequestRef.extend({ created: z.boolean() }).strict(),
|
|
113
|
+
convertPullRequestToDraft: empty,
|
|
114
|
+
deleteBranch: empty,
|
|
115
|
+
authSnapshot: z
|
|
116
|
+
.object({
|
|
117
|
+
users: z
|
|
118
|
+
.array(z
|
|
119
|
+
.object({
|
|
120
|
+
id: name,
|
|
121
|
+
name,
|
|
122
|
+
email: name,
|
|
123
|
+
avatarUrl: z.string().max(65536).optional(),
|
|
124
|
+
})
|
|
125
|
+
.strict())
|
|
126
|
+
.max(1_000_000),
|
|
127
|
+
groups: z
|
|
128
|
+
.array(z
|
|
129
|
+
.object({
|
|
130
|
+
id: name,
|
|
131
|
+
name,
|
|
132
|
+
description: name.optional(),
|
|
133
|
+
memberCount: z.number().int().nonnegative().optional(),
|
|
134
|
+
})
|
|
135
|
+
.strict())
|
|
136
|
+
.max(1_000_000),
|
|
137
|
+
memberships: z.record(z.array(name).max(100_000)),
|
|
138
|
+
})
|
|
139
|
+
.strict(),
|
|
140
|
+
termination: z
|
|
141
|
+
.object({
|
|
142
|
+
notice: z
|
|
143
|
+
.object({ kind: z.enum(['auto-scaling', 'spot']), reason: z.string().max(4096) })
|
|
144
|
+
.strict()
|
|
145
|
+
.nullable(),
|
|
146
|
+
})
|
|
147
|
+
.strict(),
|
|
148
|
+
completeLifecycle: empty,
|
|
149
|
+
};
|
|
150
|
+
/** Where each JSON operation is POSTed. */
|
|
151
|
+
export const JSON_ROUTES = {
|
|
152
|
+
prepare: `${WIRE_PREFIX}/prepare`,
|
|
153
|
+
health: `${WIRE_PREFIX}/health`,
|
|
154
|
+
defaultBranch: `${WIRE_PREFIX}/default-branch`,
|
|
155
|
+
isProtectedBranch: `${WIRE_PREFIX}/is-protected-branch`,
|
|
156
|
+
createPullRequest: `${WIRE_PREFIX}/pull-request/create`,
|
|
157
|
+
updatePullRequest: `${WIRE_PREFIX}/pull-request/update`,
|
|
158
|
+
getPullRequest: `${WIRE_PREFIX}/pull-request/get`,
|
|
159
|
+
createOrUpdatePullRequest: `${WIRE_PREFIX}/pull-request/create-or-update`,
|
|
160
|
+
convertPullRequestToDraft: `${WIRE_PREFIX}/pull-request/convert-to-draft`,
|
|
161
|
+
deleteBranch: `${WIRE_PREFIX}/branch/delete`,
|
|
162
|
+
authSnapshot: `${WIRE_PREFIX}/auth-snapshot`,
|
|
163
|
+
termination: `${WIRE_PREFIX}/termination`,
|
|
164
|
+
completeLifecycle: `${WIRE_PREFIX}/complete-lifecycle`,
|
|
165
|
+
};
|
|
166
|
+
export const FETCH_ROUTE = `${WIRE_PREFIX}/fetch`;
|
|
167
|
+
export const PUSH_ROUTE = `${WIRE_PREFIX}/push`;
|
|
168
|
+
export const BUNDLE_ROUTE = `${WIRE_PREFIX}/bundle`;
|
|
169
|
+
/** A fetch job's id, and a bundle's: 32 hex digits. */
|
|
170
|
+
const jobId = z.string().regex(/^[0-9a-f]{32}$/);
|
|
171
|
+
export const fetchStarted = z.object({ job: jobId }).strict();
|
|
172
|
+
/** A fetch job's state as a poll reads it; a failed one answers its error instead. */
|
|
173
|
+
export const fetchPoll = z.discriminatedUnion('state', [
|
|
174
|
+
/** `progress` counts the signs of life from the gateway's git while the job waits. */
|
|
175
|
+
z.object({ state: z.literal('running'), progress: z.number().int().nonnegative() }).strict(),
|
|
176
|
+
z
|
|
177
|
+
.object({
|
|
178
|
+
state: z.literal('done'),
|
|
179
|
+
progress: z.number().int().nonnegative(),
|
|
180
|
+
/** Every GitHub branch and its tip, as pairs: a `Map` has no JSON form of its own. */
|
|
181
|
+
refs: z.array(z.tuple([name, objectId])).max(1_000_000),
|
|
182
|
+
bundleId: jobId.nullable(),
|
|
183
|
+
})
|
|
184
|
+
.strict(),
|
|
185
|
+
]);
|
|
186
|
+
export const pushAnswer = z.union([
|
|
187
|
+
z
|
|
188
|
+
.object({
|
|
189
|
+
kind: z.literal('pushed'),
|
|
190
|
+
moved: z.literal(false),
|
|
191
|
+
pastStaleLease: z.boolean(),
|
|
192
|
+
})
|
|
193
|
+
.strict(),
|
|
194
|
+
z
|
|
195
|
+
.object({
|
|
196
|
+
kind: z.literal('pushed'),
|
|
197
|
+
moved: z.literal(true),
|
|
198
|
+
// git's abbreviation of GitHub's old tip; null for a new branch.
|
|
199
|
+
from: z
|
|
200
|
+
.string()
|
|
201
|
+
.regex(/^[0-9a-f]{4,64}$/)
|
|
202
|
+
.nullable(),
|
|
203
|
+
to: objectId,
|
|
204
|
+
pastStaleLease: z.boolean(),
|
|
205
|
+
})
|
|
206
|
+
.strict(),
|
|
207
|
+
z.object({ kind: z.literal('need-objects'), usable: z.array(objectId).max(3) }).strict(),
|
|
208
|
+
]);
|
|
209
|
+
/**
|
|
210
|
+
* A JSON answer's body, `{ value }` or `{ error }` and nothing else; null for anything else.
|
|
211
|
+
*/
|
|
212
|
+
export function readAnswerBody(json) {
|
|
213
|
+
if (typeof json !== 'object' || json === null || Array.isArray(json))
|
|
214
|
+
return null;
|
|
215
|
+
const keys = Object.keys(json);
|
|
216
|
+
if (keys.length !== 1)
|
|
217
|
+
return null;
|
|
218
|
+
if (keys[0] === 'value')
|
|
219
|
+
return { value: json.value };
|
|
220
|
+
if (keys[0] === 'error')
|
|
221
|
+
return { error: json.error };
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
// Errors
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
const errorEnvelope = z.discriminatedUnion('kind', [
|
|
228
|
+
z
|
|
229
|
+
.object({
|
|
230
|
+
kind: z.literal('refusal'),
|
|
231
|
+
push: z.boolean(),
|
|
232
|
+
operation: z.enum(['push', 'delete', 'pull-request']),
|
|
233
|
+
branch: name,
|
|
234
|
+
reason: z.enum(['invalid', 'protected', 'settings', 'not-a-commit', 'too-long']),
|
|
235
|
+
message,
|
|
236
|
+
})
|
|
237
|
+
.strict(),
|
|
238
|
+
z
|
|
239
|
+
.object({
|
|
240
|
+
kind: z.literal('push'),
|
|
241
|
+
pushKind: z.enum(['rejected', 'rejected-after-stale-lease']),
|
|
242
|
+
message,
|
|
243
|
+
})
|
|
244
|
+
.strict(),
|
|
245
|
+
z
|
|
246
|
+
.object({
|
|
247
|
+
kind: z.literal('transient'),
|
|
248
|
+
code: z.enum([
|
|
249
|
+
'github-fetch-failed',
|
|
250
|
+
'bundle-rejected',
|
|
251
|
+
'prerequisite-gone',
|
|
252
|
+
'bundle-gone',
|
|
253
|
+
'mirror-corrupt',
|
|
254
|
+
'objects-still-needed',
|
|
255
|
+
'ref-kept-moving',
|
|
256
|
+
'default-branch-unread',
|
|
257
|
+
]),
|
|
258
|
+
message,
|
|
259
|
+
})
|
|
260
|
+
.strict(),
|
|
261
|
+
z
|
|
262
|
+
.object({
|
|
263
|
+
kind: z.literal('http'),
|
|
264
|
+
name: z.string().max(256),
|
|
265
|
+
message,
|
|
266
|
+
status: z.number().int(),
|
|
267
|
+
/** Octokit's `response`, when the error carried one: the headers that cross, and its body. */
|
|
268
|
+
response: z
|
|
269
|
+
.object({
|
|
270
|
+
headers: z.record(z.string().max(1024)),
|
|
271
|
+
data: z.unknown().optional(),
|
|
272
|
+
})
|
|
273
|
+
.strict()
|
|
274
|
+
.optional(),
|
|
275
|
+
})
|
|
276
|
+
.strict(),
|
|
277
|
+
z.object({ kind: z.literal('error'), name: z.string().max(256), message }).strict(),
|
|
278
|
+
/** A transport-level refusal, with its HTTP status: the request never reached an operation. */
|
|
279
|
+
z.object({ kind: z.literal('refused'), status: z.number().int(), message }).strict(),
|
|
280
|
+
/** A poll named a job the gateway does not hold: it restarted, or the job's record expired. */
|
|
281
|
+
z.object({ kind: z.literal('unknown-job'), message }).strict(),
|
|
282
|
+
/** The gateway is draining for a stop: to the worker it is as good as gone. */
|
|
283
|
+
z.object({ kind: z.literal('stopping'), message }).strict(),
|
|
284
|
+
]);
|
|
285
|
+
/**
|
|
286
|
+
* An Octokit error as it crosses the socket: the fields the task runner's classifiers read
|
|
287
|
+
* (`status`, `response.headers`, `response.data`, the message), rebuilt on the worker's side. Not
|
|
288
|
+
* a gateway class: a GitHub answer stays a GitHub answer (`isPermanentTaskFailure`,
|
|
289
|
+
* `isRateLimitSignal403`, `isNoCommitsBetweenError`, `isRefAlreadyGoneError`).
|
|
290
|
+
* @internal Exported for tests.
|
|
291
|
+
*/
|
|
292
|
+
export class GitHubRequestError extends Error {
|
|
293
|
+
constructor(name, message, status, response) {
|
|
294
|
+
super(message);
|
|
295
|
+
this.status = status;
|
|
296
|
+
this.response = response;
|
|
297
|
+
this.name = name;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* The GitHub gateway could not be reached, or broke off an answer: it is not running, restarting,
|
|
302
|
+
* or stopping. Transient.
|
|
303
|
+
*/
|
|
304
|
+
export class GitHubGatewayUnreachableError extends Error {
|
|
305
|
+
constructor(message) {
|
|
306
|
+
super(message);
|
|
307
|
+
this.name = 'GitHubGatewayUnreachableError';
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* The gateway answered that it is draining for a stop. Unreachable for every purpose, and more:
|
|
312
|
+
* the task runner releases a task it hits with no retry spent, since the stop, not the task, is
|
|
313
|
+
* why it failed, and a restart's grace could otherwise outlast the task's retries.
|
|
314
|
+
*/
|
|
315
|
+
export class GitHubGatewayStoppingError extends GitHubGatewayUnreachableError {
|
|
316
|
+
constructor(message) {
|
|
317
|
+
super(message);
|
|
318
|
+
this.name = 'GitHubGatewayStoppingError';
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/** The gateway refused a request before any operation ran, or answered outside the wire format. */
|
|
322
|
+
export class GitHubGatewayProtocolError extends Error {
|
|
323
|
+
constructor(message) {
|
|
324
|
+
super(message);
|
|
325
|
+
this.name = 'GitHubGatewayProtocolError';
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* The gateway, or node in front of it, refused a request for its shape or size: the same request
|
|
330
|
+
* is refused again, as the in-process gateway's own refusal of an oversize field is, so the task
|
|
331
|
+
* runner fails it for good. The HTTP status is `refusedWith`, never `status`, which every
|
|
332
|
+
* classifier reads as GitHub's (a 404 there means a branch already gone).
|
|
333
|
+
*/
|
|
334
|
+
export class GatewayRequestRefusedError extends GitHubGatewayProtocolError {
|
|
335
|
+
constructor(message, refusedWith) {
|
|
336
|
+
super(message);
|
|
337
|
+
this.refusedWith = refusedWith;
|
|
338
|
+
this.name = 'GatewayRequestRefusedError';
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* The statuses that refuse a request for its shape or size. An unknown route or method (404, 405)
|
|
343
|
+
* says nothing about the request's content, so it stays transient, as does a 503 (busy,
|
|
344
|
+
* stopping).
|
|
345
|
+
*/
|
|
346
|
+
const SHAPE_REFUSALS = new Set([400, 411, 413, 415, 431]);
|
|
347
|
+
/** The error for a request refused with `status` before any operation ran. */
|
|
348
|
+
export function refusedRequestError(message, status) {
|
|
349
|
+
return status !== undefined && SHAPE_REFUSALS.has(status)
|
|
350
|
+
? new GatewayRequestRefusedError(message, status)
|
|
351
|
+
: new GitHubGatewayProtocolError(message);
|
|
352
|
+
}
|
|
353
|
+
/** The message a thrown value that is not an Error crosses with. */
|
|
354
|
+
const NOT_AN_ERROR_MESSAGE = 'The GitHub gateway failed with a value that is not an Error';
|
|
355
|
+
/**
|
|
356
|
+
* The envelope for an error leaving the gateway. Every string in it is scrubbed as an error is,
|
|
357
|
+
* by the exact token forms and `redactCredentials`'s patterns (worker/gateway-egress.ts): a
|
|
358
|
+
* credentialed operation already did (`LocalGitHubGateway.credentialed`), and this is the last
|
|
359
|
+
* place anything could slip past it. No stack, no
|
|
360
|
+
* `cause` and no Octokit `request` crosses. A thrown value that is not an Error crosses as a fixed
|
|
361
|
+
* message and is logged here instead: its string form can be anything, a stack included.
|
|
362
|
+
*/
|
|
363
|
+
export function encodeError(err) {
|
|
364
|
+
const text = (value) => redactEgress(value).slice(0, MAX_MESSAGE_LENGTH);
|
|
365
|
+
if (err instanceof GatewayRefusalError) {
|
|
366
|
+
return {
|
|
367
|
+
kind: 'refusal',
|
|
368
|
+
push: err instanceof RefusedPushError,
|
|
369
|
+
operation: err.operation,
|
|
370
|
+
branch: text(err.branch),
|
|
371
|
+
reason: err.reason,
|
|
372
|
+
message: text(err.message),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
if (err instanceof GitHubPushError) {
|
|
376
|
+
return { kind: 'push', pushKind: err.kind, message: text(err.message) };
|
|
377
|
+
}
|
|
378
|
+
if (err instanceof GitHubTransientError) {
|
|
379
|
+
return { kind: 'transient', code: err.code, message: text(err.message) };
|
|
380
|
+
}
|
|
381
|
+
if (!(err instanceof Error)) {
|
|
382
|
+
gatewayLogWarn('Answered a thrown value that is not an Error:', text(String(err)));
|
|
383
|
+
return { kind: 'error', name: 'Error', message: NOT_AN_ERROR_MESSAGE };
|
|
384
|
+
}
|
|
385
|
+
const status = err.status;
|
|
386
|
+
if (typeof status === 'number' && Number.isInteger(status)) {
|
|
387
|
+
const response = err.response;
|
|
388
|
+
return {
|
|
389
|
+
kind: 'http',
|
|
390
|
+
name: text(err.name),
|
|
391
|
+
message: text(err.message),
|
|
392
|
+
status,
|
|
393
|
+
...(typeof response === 'object' && response !== null
|
|
394
|
+
? { response: encodeResponse(response) }
|
|
395
|
+
: {}),
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
return { kind: 'error', name: text(err.name), message: text(err.message) };
|
|
399
|
+
}
|
|
400
|
+
function encodeResponse(response) {
|
|
401
|
+
const headers = {};
|
|
402
|
+
if (typeof response.headers === 'object' && response.headers !== null) {
|
|
403
|
+
const source = response.headers;
|
|
404
|
+
for (const key of CROSSING_HEADERS) {
|
|
405
|
+
const value = source[key];
|
|
406
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
407
|
+
headers[key] = redactEgress(String(value)).slice(0, 1024);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
if (response.data === undefined)
|
|
412
|
+
return { headers };
|
|
413
|
+
let serialized;
|
|
414
|
+
try {
|
|
415
|
+
serialized = JSON.stringify(response.data) ?? '';
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
return { headers };
|
|
419
|
+
}
|
|
420
|
+
if (Buffer.byteLength(serialized) > MAX_ERROR_DATA_BYTES)
|
|
421
|
+
return { headers };
|
|
422
|
+
// Scrubbed as text, then read back; text the scrub left unreadable crosses as absent.
|
|
423
|
+
try {
|
|
424
|
+
return { headers, data: JSON.parse(redactEgress(serialized)) };
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
return { headers };
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* The error an envelope describes, as the worker throws it: the gateway's own classes keep their
|
|
432
|
+
* class, fields and message; an Octokit error becomes a {@link GitHubRequestError}.
|
|
433
|
+
*/
|
|
434
|
+
export function decodeError(value) {
|
|
435
|
+
const parsed = errorEnvelope.safeParse(value);
|
|
436
|
+
if (!parsed.success) {
|
|
437
|
+
return new GitHubGatewayProtocolError(`The GitHub gateway answered with an error the worker cannot read: ${parsed.error.message}`);
|
|
438
|
+
}
|
|
439
|
+
const envelope = parsed.data;
|
|
440
|
+
switch (envelope.kind) {
|
|
441
|
+
case 'refusal': {
|
|
442
|
+
const { push, operation, branch, reason } = envelope;
|
|
443
|
+
if (!push)
|
|
444
|
+
return new GatewayRefusalError(operation, branch, reason, envelope.message);
|
|
445
|
+
if (operation !== 'push' || reason === 'too-long') {
|
|
446
|
+
return new GitHubGatewayProtocolError(`The GitHub gateway answered with a push refusal for ${operation}, reason ${reason}`);
|
|
447
|
+
}
|
|
448
|
+
const err = new RefusedPushError(branch, reason);
|
|
449
|
+
// The gateway's message, which can name what RefusedPushError's own cannot (the object).
|
|
450
|
+
err.message = envelope.message;
|
|
451
|
+
return err;
|
|
452
|
+
}
|
|
453
|
+
case 'push':
|
|
454
|
+
return new GitHubPushError(envelope.pushKind, envelope.message);
|
|
455
|
+
case 'transient':
|
|
456
|
+
return new GitHubTransientError(envelope.code, envelope.message);
|
|
457
|
+
case 'http':
|
|
458
|
+
return new GitHubRequestError(envelope.name, envelope.message, envelope.status, envelope.response);
|
|
459
|
+
case 'error': {
|
|
460
|
+
const err = new Error(envelope.message);
|
|
461
|
+
err.name = envelope.name;
|
|
462
|
+
return err;
|
|
463
|
+
}
|
|
464
|
+
case 'refused':
|
|
465
|
+
return refusedRequestError(`The GitHub gateway refused the request: ${envelope.message}`, envelope.status);
|
|
466
|
+
case 'unknown-job':
|
|
467
|
+
return new UnknownFetchJobError(envelope.message);
|
|
468
|
+
case 'stopping':
|
|
469
|
+
return new GitHubGatewayStoppingError(`The GitHub gateway is stopping: ${envelope.message}`);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
/** A poll for a fetch job the gateway does not hold; the client fetches anew, once. */
|
|
473
|
+
export class UnknownFetchJobError extends Error {
|
|
474
|
+
constructor(message) {
|
|
475
|
+
super(message);
|
|
476
|
+
this.name = 'UnknownFetchJobError';
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
/** A push's JSON request, as {@link PUSH_REQUEST_HEADER} carries it. */
|
|
480
|
+
export function encodePushHeader(request) {
|
|
481
|
+
return Buffer.from(JSON.stringify(request)).toString('base64url');
|
|
482
|
+
}
|
|
483
|
+
/** {@link encodePushHeader}'s inverse; throws on anything that is not base64url JSON. */
|
|
484
|
+
export function decodePushHeader(value) {
|
|
485
|
+
if (!/^[A-Za-z0-9_-]*$/.test(value))
|
|
486
|
+
throw new Error('the push header is not base64url');
|
|
487
|
+
return JSON.parse(Buffer.from(value, 'base64url').toString('utf8'));
|
|
488
|
+
}
|