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
package/dist/branch-health.d.ts
CHANGED
|
@@ -6,13 +6,33 @@ import { type DuplicateContentId } from './content-id-index.js';
|
|
|
6
6
|
* Without it two stuck states have no in-product recovery, and prod admins have
|
|
7
7
|
* no filesystem access to see them: a branch dir whose `.canopy-meta/branch.json`
|
|
8
8
|
* is corrupt (the registry drops it silently) and an orphan dir with no
|
|
9
|
-
* `branch.json` at all (a
|
|
9
|
+
* `branch.json` at all (a clone or delete killed in place, until the worker
|
|
10
|
+
* quarantines it — see branch-provisioning.ts).
|
|
10
11
|
*
|
|
11
12
|
* `scanBranchHealth` mirrors the registry's own directory-listing rules (skip
|
|
12
13
|
* non-directories and dot-prefixed names) so the two never disagree about what
|
|
13
14
|
* counts as missing.
|
|
14
15
|
*/
|
|
15
16
|
type BranchHealthKind = 'healthy' | 'corrupt-metadata' | 'orphan';
|
|
17
|
+
/**
|
|
18
|
+
* An orphan younger than this may still be a clone in progress: admin purge refuses it and the
|
|
19
|
+
* worker does not quarantine it. Corrupt-metadata dirs are exempt.
|
|
20
|
+
*/
|
|
21
|
+
export declare const ORPHAN_YOUTH_THRESHOLD_MS: number;
|
|
22
|
+
/**
|
|
23
|
+
* One healthy branch's duplicate-content-ID scan (see content-id-index.ts).
|
|
24
|
+
* `unknown` means the scan did not finish — it failed, or the request's time
|
|
25
|
+
* budget ran out first — and must never be read as `none`.
|
|
26
|
+
*/
|
|
27
|
+
export type DuplicateIdScan = {
|
|
28
|
+
state: 'none';
|
|
29
|
+
} | {
|
|
30
|
+
state: 'found';
|
|
31
|
+
duplicates: DuplicateContentId[];
|
|
32
|
+
} | {
|
|
33
|
+
state: 'unknown';
|
|
34
|
+
reason: 'failed' | 'out-of-time';
|
|
35
|
+
};
|
|
16
36
|
export interface BranchHealthEntry {
|
|
17
37
|
dirName: string;
|
|
18
38
|
kind: BranchHealthKind;
|
|
@@ -21,19 +41,19 @@ export interface BranchHealthEntry {
|
|
|
21
41
|
/** healthy only */
|
|
22
42
|
branch?: BranchMetadata;
|
|
23
43
|
/**
|
|
24
|
-
* healthy only,
|
|
25
|
-
*
|
|
26
|
-
* quarantined IDs degrade, dropping out of ID-based lookups and
|
|
27
|
-
* saves (`DuplicateContentIdError
|
|
28
|
-
*
|
|
44
|
+
* healthy only, and only when the caller asked for the duplicate-ID scan: see
|
|
45
|
+
* {@link DuplicateIdScan}. The branch stays usable while IDs are duplicated —
|
|
46
|
+
* only the quarantined IDs degrade, dropping out of ID-based lookups and
|
|
47
|
+
* refusing saves (`DuplicateContentIdError`) rather than mutating an
|
|
48
|
+
* ambiguous target.
|
|
29
49
|
*/
|
|
30
|
-
|
|
50
|
+
duplicateIdScan?: DuplicateIdScan;
|
|
31
51
|
/**
|
|
32
52
|
* healthy only, true only: this clone has an interrupted rebase on disk
|
|
33
53
|
* (`.git/rebase-merge` / `.git/rebase-apply`).
|
|
34
54
|
*
|
|
35
55
|
* Advisory on `healthy` rather than its own `BranchHealthKind`, like
|
|
36
|
-
* `
|
|
56
|
+
* `duplicateIdScan`: the metadata is intact and the state is usually
|
|
37
57
|
* transient, since the worker's sync loop aborts an interrupted rebase at the
|
|
38
58
|
* top of its next per-branch pass. The flag buys visibility in the window
|
|
39
59
|
* before that, where the branch otherwise scans as plain `healthy` while
|
|
@@ -74,9 +94,16 @@ export interface BranchHealthEntry {
|
|
|
74
94
|
* metadata must not take down the whole scan, as in the registry's quarantine.
|
|
75
95
|
* A missing `baseRoot` returns `[]`, so the admin endpoint can call this
|
|
76
96
|
* without a pre-existence check.
|
|
97
|
+
*
|
|
98
|
+
* `duplicateIdScan` opts in to the per-branch duplicate-ID scan, which shares
|
|
99
|
+
* one `budgetMs` across every healthy branch, scanned in turn; a branch
|
|
100
|
+
* reached after the budget is spent reports `unknown`/`out-of-time`.
|
|
77
101
|
*/
|
|
78
102
|
export declare function scanBranchHealth(baseRoot: string, opts: {
|
|
79
103
|
baseBranchName: string;
|
|
80
104
|
contentRootName?: string;
|
|
105
|
+
duplicateIdScan?: {
|
|
106
|
+
budgetMs: number;
|
|
107
|
+
};
|
|
81
108
|
}): Promise<BranchHealthEntry[]>;
|
|
82
109
|
export {};
|
package/dist/branch-health.js
CHANGED
|
@@ -6,6 +6,11 @@ import { sanitizeBranchName } from './paths/branch-name.js';
|
|
|
6
6
|
import { getErrorMessage, isNodeError, isNotFoundError } from './utils/error.js';
|
|
7
7
|
import { isRebaseInProgress } from './utils/git.js';
|
|
8
8
|
import { branchProvisioningLockName } from './utils/provisioning-lock.js';
|
|
9
|
+
/**
|
|
10
|
+
* An orphan younger than this may still be a clone in progress: admin purge refuses it and the
|
|
11
|
+
* worker does not quarantine it. Corrupt-metadata dirs are exempt.
|
|
12
|
+
*/
|
|
13
|
+
export const ORPHAN_YOUTH_THRESHOLD_MS = 15 * 60_000;
|
|
9
14
|
/**
|
|
10
15
|
* The provisioning lock marker's path for a branch directory.
|
|
11
16
|
*
|
|
@@ -39,20 +44,41 @@ async function readMetaMtime(branchRoot) {
|
|
|
39
44
|
}
|
|
40
45
|
}
|
|
41
46
|
/**
|
|
42
|
-
* Scan a healthy branch's content tree for duplicate embedded IDs
|
|
43
|
-
*
|
|
44
|
-
* not take down the whole health scan. Costs a full recursive readdir
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
+
* Scan a healthy branch's content tree for duplicate embedded IDs, giving up
|
|
48
|
+
* when `budget` runs out. Never throws: one branch's unreadable content tree
|
|
49
|
+
* must not take down the whole health scan. Costs a full recursive readdir, so
|
|
50
|
+
* it runs only on request and under a budget. A readdir cannot be cancelled: a
|
|
51
|
+
* scan that misses the deadline keeps running unobserved until it settles.
|
|
47
52
|
*/
|
|
48
|
-
async function scanDuplicateContentIds(branchRoot, contentRootName) {
|
|
53
|
+
async function scanDuplicateContentIds(branchRoot, contentRootName, budget) {
|
|
54
|
+
const remainingMs = budget.deadline - Date.now();
|
|
55
|
+
if (budget.spent || remainingMs <= 0) {
|
|
56
|
+
budget.spent = true;
|
|
57
|
+
return { state: 'unknown', reason: 'out-of-time' };
|
|
58
|
+
}
|
|
59
|
+
const scan = (async () => {
|
|
60
|
+
try {
|
|
61
|
+
const idIndex = new ContentIdIndex(branchRoot);
|
|
62
|
+
await idIndex.buildFromFilenames(contentRootName);
|
|
63
|
+
const duplicates = idIndex.getDuplicateIds();
|
|
64
|
+
return duplicates.length ? { state: 'found', duplicates } : { state: 'none' };
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return { state: 'unknown', reason: 'failed' };
|
|
68
|
+
}
|
|
69
|
+
})();
|
|
70
|
+
let timer;
|
|
71
|
+
const outOfTime = new Promise((resolve) => {
|
|
72
|
+
timer = setTimeout(() => {
|
|
73
|
+
budget.spent = true;
|
|
74
|
+
resolve({ state: 'unknown', reason: 'out-of-time' });
|
|
75
|
+
}, remainingMs);
|
|
76
|
+
});
|
|
49
77
|
try {
|
|
50
|
-
|
|
51
|
-
await idIndex.buildFromFilenames(contentRootName);
|
|
52
|
-
return idIndex.getDuplicateIds();
|
|
78
|
+
return await Promise.race([scan, outOfTime]);
|
|
53
79
|
}
|
|
54
|
-
|
|
55
|
-
|
|
80
|
+
finally {
|
|
81
|
+
clearTimeout(timer);
|
|
56
82
|
}
|
|
57
83
|
}
|
|
58
84
|
/**
|
|
@@ -61,8 +87,15 @@ async function scanDuplicateContentIds(branchRoot, contentRootName) {
|
|
|
61
87
|
* metadata must not take down the whole scan, as in the registry's quarantine.
|
|
62
88
|
* A missing `baseRoot` returns `[]`, so the admin endpoint can call this
|
|
63
89
|
* without a pre-existence check.
|
|
90
|
+
*
|
|
91
|
+
* `duplicateIdScan` opts in to the per-branch duplicate-ID scan, which shares
|
|
92
|
+
* one `budgetMs` across every healthy branch, scanned in turn; a branch
|
|
93
|
+
* reached after the budget is spent reports `unknown`/`out-of-time`.
|
|
64
94
|
*/
|
|
65
95
|
export async function scanBranchHealth(baseRoot, opts) {
|
|
96
|
+
const duplicateScanBudget = opts.duplicateIdScan
|
|
97
|
+
? { deadline: Date.now() + opts.duplicateIdScan.budgetMs, spent: false }
|
|
98
|
+
: undefined;
|
|
66
99
|
const resolvedRoot = path.resolve(baseRoot);
|
|
67
100
|
const sanitizedBaseBranchName = sanitizeBranchName(opts.baseBranchName);
|
|
68
101
|
const contentRootName = opts.contentRootName ?? 'content';
|
|
@@ -95,13 +128,14 @@ export async function scanBranchHealth(baseRoot, opts) {
|
|
|
95
128
|
}
|
|
96
129
|
if (loadErr) {
|
|
97
130
|
// Every loadOnly failure lands here — BranchMetadataCorruptError for bad
|
|
98
|
-
// JSON, EACCES/EISDIR and the rest for
|
|
99
|
-
// them need admin attention and none may
|
|
131
|
+
// JSON or a failed schema check, EACCES/EISDIR and the rest for
|
|
132
|
+
// everything else — since all of them need admin attention and none may
|
|
133
|
+
// throw out of the scan.
|
|
100
134
|
//
|
|
101
135
|
// [REDACT] parseError reaches the browser through the admin branch-health
|
|
102
136
|
// endpoint, so it must never carry the absolute workspace path.
|
|
103
|
-
// BranchMetadataCorruptError's `parseCause` is the path-free
|
|
104
|
-
//
|
|
137
|
+
// BranchMetadataCorruptError's `parseCause` is the path-free cause
|
|
138
|
+
// for exactly this, while its `message` embeds branchRoot and is
|
|
105
139
|
// for server logs only. Node errors embed the path in `message` too, so
|
|
106
140
|
// only their `code` is safe to surface.
|
|
107
141
|
const parseError = loadErr instanceof BranchMetadataCorruptError
|
|
@@ -124,8 +158,10 @@ export async function scanBranchHealth(baseRoot, opts) {
|
|
|
124
158
|
continue;
|
|
125
159
|
}
|
|
126
160
|
if (meta) {
|
|
127
|
-
const [
|
|
128
|
-
|
|
161
|
+
const [duplicateIdScan, rebaseInProgress] = await Promise.all([
|
|
162
|
+
duplicateScanBudget === undefined
|
|
163
|
+
? undefined
|
|
164
|
+
: scanDuplicateContentIds(branchRoot, contentRootName, duplicateScanBudget),
|
|
129
165
|
isRebaseInProgress(branchRoot),
|
|
130
166
|
]);
|
|
131
167
|
entries.push({
|
|
@@ -133,7 +169,7 @@ export async function scanBranchHealth(baseRoot, opts) {
|
|
|
133
169
|
kind: 'healthy',
|
|
134
170
|
...(isBaseBranch ? { isBaseBranch } : {}),
|
|
135
171
|
branch: meta.branch,
|
|
136
|
-
...(
|
|
172
|
+
...(duplicateIdScan ? { duplicateIdScan } : {}),
|
|
137
173
|
...(rebaseInProgress ? { rebaseInProgress } : {}),
|
|
138
174
|
});
|
|
139
175
|
continue;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The corrupt-`branch.json` error and what the API says about it. Free of
|
|
3
|
+
* node built-ins, so the API guards, which the client bundle reaches, can
|
|
4
|
+
* recognize the error without pulling in the reader (branch-metadata-file.ts).
|
|
5
|
+
*/
|
|
6
|
+
/** What the editor API answers for a branch whose branch.json is corrupt. */
|
|
7
|
+
export declare const BRANCH_METADATA_CORRUPT_MESSAGE = "This branch's metadata file is damaged, so the branch can't be opened or edited. An admin can repair it in System health.";
|
|
8
|
+
/**
|
|
9
|
+
* branch.json exists but is not valid JSON, or fails the schema in branch-metadata-file.ts.
|
|
10
|
+
* Distinguished from provisioning and IO failures so callers can degrade instead
|
|
11
|
+
* of failing hard: the registry scan quarantines the branch, the API answers
|
|
12
|
+
* {@link BRANCH_METADATA_CORRUPT_MESSAGE}, and the request handler keeps serving
|
|
13
|
+
* (with empty internal groups) when the BASE branch is the corrupt one —
|
|
14
|
+
* otherwise the admin recovery surface is unreachable exactly when it is needed.
|
|
15
|
+
*/
|
|
16
|
+
export declare class BranchMetadataCorruptError extends Error {
|
|
17
|
+
readonly branchRoot: string;
|
|
18
|
+
/**
|
|
19
|
+
* [REDACT] What is wrong with the file, with no embedded path: the JSON.parse
|
|
20
|
+
* failure, or the fields that failed the schema.
|
|
21
|
+
* `message` above keeps the `branchRoot`-qualified text for server logs;
|
|
22
|
+
* `parseCause` is the one callers surface to clients (branch-health.ts's
|
|
23
|
+
* `parseError`), so no scan leaks the absolute workspace path.
|
|
24
|
+
*/
|
|
25
|
+
readonly parseCause: string;
|
|
26
|
+
constructor(branchRoot: string, cause: string);
|
|
27
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The corrupt-`branch.json` error and what the API says about it. Free of
|
|
3
|
+
* node built-ins, so the API guards, which the client bundle reaches, can
|
|
4
|
+
* recognize the error without pulling in the reader (branch-metadata-file.ts).
|
|
5
|
+
*/
|
|
6
|
+
/** What the editor API answers for a branch whose branch.json is corrupt. */
|
|
7
|
+
export const BRANCH_METADATA_CORRUPT_MESSAGE = "This branch's metadata file is damaged, so the branch can't be opened or edited. An admin can repair it in System health.";
|
|
8
|
+
/**
|
|
9
|
+
* branch.json exists but is not valid JSON, or fails the schema in branch-metadata-file.ts.
|
|
10
|
+
* Distinguished from provisioning and IO failures so callers can degrade instead
|
|
11
|
+
* of failing hard: the registry scan quarantines the branch, the API answers
|
|
12
|
+
* {@link BRANCH_METADATA_CORRUPT_MESSAGE}, and the request handler keeps serving
|
|
13
|
+
* (with empty internal groups) when the BASE branch is the corrupt one —
|
|
14
|
+
* otherwise the admin recovery surface is unreachable exactly when it is needed.
|
|
15
|
+
*/
|
|
16
|
+
export class BranchMetadataCorruptError extends Error {
|
|
17
|
+
constructor(branchRoot, cause) {
|
|
18
|
+
super(`Corrupt branch metadata in '${branchRoot}': ${cause}`);
|
|
19
|
+
this.name = 'BranchMetadataCorruptError';
|
|
20
|
+
this.branchRoot = branchRoot;
|
|
21
|
+
this.parseCause = cause;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Reading `branch.json` — the file format, nothing else.
|
|
3
3
|
*
|
|
4
|
-
* Deliberately a LEAF, importing only node built-ins,
|
|
5
|
-
*
|
|
4
|
+
* Deliberately a LEAF, importing only node built-ins, zod, types, and the error
|
|
5
|
+
* modules. That is what keeps `branch-registry.ts` (which reads every branch's
|
|
6
6
|
* `branch.json`) out of a runtime import cycle with `branch-metadata.ts` (which
|
|
7
7
|
* writes it and then invalidates the registry cache).
|
|
8
8
|
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import type { ContentId } from './paths/types.js';
|
|
9
11
|
import type { BranchMetadata } from './types.js';
|
|
12
|
+
import { BranchMetadataCorruptError } from './branch-metadata-error.js';
|
|
13
|
+
export { BranchMetadataCorruptError };
|
|
10
14
|
export declare const BRANCH_META_DIR = ".canopy-meta";
|
|
11
15
|
export declare const BRANCH_META_FILE = "branch.json";
|
|
12
16
|
export interface BranchMetadataFile {
|
|
@@ -15,28 +19,205 @@ export interface BranchMetadataFile {
|
|
|
15
19
|
writeId?: string;
|
|
16
20
|
branch: BranchMetadata;
|
|
17
21
|
}
|
|
22
|
+
/** The `branch` object, also embedded in the registry snapshot (branch-registry.ts). */
|
|
23
|
+
export declare const branchMetadataSchema: z.ZodObject<{
|
|
24
|
+
name: z.ZodString;
|
|
25
|
+
title: z.ZodOptional<z.ZodString>;
|
|
26
|
+
description: z.ZodOptional<z.ZodString>;
|
|
27
|
+
status: z.ZodNativeEnum<{
|
|
28
|
+
editing: "editing";
|
|
29
|
+
submitted: "submitted";
|
|
30
|
+
approved: "approved";
|
|
31
|
+
archived: "archived";
|
|
32
|
+
}>;
|
|
33
|
+
access: z.ZodObject<{
|
|
34
|
+
allowedUsers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
35
|
+
allowedGroups: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
36
|
+
managerOrAdminAllowed: z.ZodOptional<z.ZodBoolean>;
|
|
37
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
38
|
+
allowedUsers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
39
|
+
allowedGroups: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
40
|
+
managerOrAdminAllowed: z.ZodOptional<z.ZodBoolean>;
|
|
41
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
42
|
+
allowedUsers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
43
|
+
allowedGroups: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
44
|
+
managerOrAdminAllowed: z.ZodOptional<z.ZodBoolean>;
|
|
45
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
46
|
+
createdBy: z.ZodDefault<z.ZodString>;
|
|
47
|
+
createdAt: z.ZodDefault<z.ZodString>;
|
|
48
|
+
updatedAt: z.ZodDefault<z.ZodString>;
|
|
49
|
+
baseBranch: z.ZodOptional<z.ZodString>;
|
|
50
|
+
pullRequestUrl: z.ZodOptional<z.ZodString>;
|
|
51
|
+
pullRequestNumber: z.ZodOptional<z.ZodNumber>;
|
|
52
|
+
submittedAt: z.ZodOptional<z.ZodString>;
|
|
53
|
+
pushedToGitHubAt: z.ZodOptional<z.ZodString>;
|
|
54
|
+
syncStatus: z.ZodOptional<z.ZodNativeEnum<{
|
|
55
|
+
synced: "synced";
|
|
56
|
+
"pending-sync": "pending-sync";
|
|
57
|
+
"sync-failed": "sync-failed";
|
|
58
|
+
}>>;
|
|
59
|
+
conflictStatus: z.ZodOptional<z.ZodNativeEnum<{
|
|
60
|
+
clean: "clean";
|
|
61
|
+
"conflicts-detected": "conflicts-detected";
|
|
62
|
+
}>>;
|
|
63
|
+
conflictFiles: z.ZodOptional<z.ZodArray<z.ZodType<ContentId, z.ZodTypeDef, ContentId>, "many">>;
|
|
64
|
+
pullRequestState: z.ZodOptional<z.ZodNativeEnum<{
|
|
65
|
+
open: "open";
|
|
66
|
+
closed: "closed";
|
|
67
|
+
merged: "merged";
|
|
68
|
+
}>>;
|
|
69
|
+
mergedAt: z.ZodOptional<z.ZodString>;
|
|
70
|
+
rebaseFailure: z.ZodOptional<z.ZodObject<{
|
|
71
|
+
message: z.ZodString;
|
|
72
|
+
firstAt: z.ZodString;
|
|
73
|
+
lastAt: z.ZodString;
|
|
74
|
+
}, "strip", z.ZodTypeAny, {
|
|
75
|
+
message: string;
|
|
76
|
+
firstAt: string;
|
|
77
|
+
lastAt: string;
|
|
78
|
+
}, {
|
|
79
|
+
message: string;
|
|
80
|
+
firstAt: string;
|
|
81
|
+
lastAt: string;
|
|
82
|
+
}>>;
|
|
83
|
+
historyRewrittenFrom: z.ZodOptional<z.ZodString>;
|
|
84
|
+
syncFailureReason: z.ZodOptional<z.ZodString>;
|
|
85
|
+
editors: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
86
|
+
uncommittedEditors: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
87
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
88
|
+
name: z.ZodString;
|
|
89
|
+
title: z.ZodOptional<z.ZodString>;
|
|
90
|
+
description: z.ZodOptional<z.ZodString>;
|
|
91
|
+
status: z.ZodNativeEnum<{
|
|
92
|
+
editing: "editing";
|
|
93
|
+
submitted: "submitted";
|
|
94
|
+
approved: "approved";
|
|
95
|
+
archived: "archived";
|
|
96
|
+
}>;
|
|
97
|
+
access: z.ZodObject<{
|
|
98
|
+
allowedUsers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
99
|
+
allowedGroups: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
100
|
+
managerOrAdminAllowed: z.ZodOptional<z.ZodBoolean>;
|
|
101
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
102
|
+
allowedUsers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
103
|
+
allowedGroups: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
104
|
+
managerOrAdminAllowed: z.ZodOptional<z.ZodBoolean>;
|
|
105
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
106
|
+
allowedUsers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
107
|
+
allowedGroups: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
108
|
+
managerOrAdminAllowed: z.ZodOptional<z.ZodBoolean>;
|
|
109
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
110
|
+
createdBy: z.ZodDefault<z.ZodString>;
|
|
111
|
+
createdAt: z.ZodDefault<z.ZodString>;
|
|
112
|
+
updatedAt: z.ZodDefault<z.ZodString>;
|
|
113
|
+
baseBranch: z.ZodOptional<z.ZodString>;
|
|
114
|
+
pullRequestUrl: z.ZodOptional<z.ZodString>;
|
|
115
|
+
pullRequestNumber: z.ZodOptional<z.ZodNumber>;
|
|
116
|
+
submittedAt: z.ZodOptional<z.ZodString>;
|
|
117
|
+
pushedToGitHubAt: z.ZodOptional<z.ZodString>;
|
|
118
|
+
syncStatus: z.ZodOptional<z.ZodNativeEnum<{
|
|
119
|
+
synced: "synced";
|
|
120
|
+
"pending-sync": "pending-sync";
|
|
121
|
+
"sync-failed": "sync-failed";
|
|
122
|
+
}>>;
|
|
123
|
+
conflictStatus: z.ZodOptional<z.ZodNativeEnum<{
|
|
124
|
+
clean: "clean";
|
|
125
|
+
"conflicts-detected": "conflicts-detected";
|
|
126
|
+
}>>;
|
|
127
|
+
conflictFiles: z.ZodOptional<z.ZodArray<z.ZodType<ContentId, z.ZodTypeDef, ContentId>, "many">>;
|
|
128
|
+
pullRequestState: z.ZodOptional<z.ZodNativeEnum<{
|
|
129
|
+
open: "open";
|
|
130
|
+
closed: "closed";
|
|
131
|
+
merged: "merged";
|
|
132
|
+
}>>;
|
|
133
|
+
mergedAt: z.ZodOptional<z.ZodString>;
|
|
134
|
+
rebaseFailure: z.ZodOptional<z.ZodObject<{
|
|
135
|
+
message: z.ZodString;
|
|
136
|
+
firstAt: z.ZodString;
|
|
137
|
+
lastAt: z.ZodString;
|
|
138
|
+
}, "strip", z.ZodTypeAny, {
|
|
139
|
+
message: string;
|
|
140
|
+
firstAt: string;
|
|
141
|
+
lastAt: string;
|
|
142
|
+
}, {
|
|
143
|
+
message: string;
|
|
144
|
+
firstAt: string;
|
|
145
|
+
lastAt: string;
|
|
146
|
+
}>>;
|
|
147
|
+
historyRewrittenFrom: z.ZodOptional<z.ZodString>;
|
|
148
|
+
syncFailureReason: z.ZodOptional<z.ZodString>;
|
|
149
|
+
editors: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
150
|
+
uncommittedEditors: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
151
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
152
|
+
name: z.ZodString;
|
|
153
|
+
title: z.ZodOptional<z.ZodString>;
|
|
154
|
+
description: z.ZodOptional<z.ZodString>;
|
|
155
|
+
status: z.ZodNativeEnum<{
|
|
156
|
+
editing: "editing";
|
|
157
|
+
submitted: "submitted";
|
|
158
|
+
approved: "approved";
|
|
159
|
+
archived: "archived";
|
|
160
|
+
}>;
|
|
161
|
+
access: z.ZodObject<{
|
|
162
|
+
allowedUsers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
163
|
+
allowedGroups: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
164
|
+
managerOrAdminAllowed: z.ZodOptional<z.ZodBoolean>;
|
|
165
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
166
|
+
allowedUsers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
167
|
+
allowedGroups: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
168
|
+
managerOrAdminAllowed: z.ZodOptional<z.ZodBoolean>;
|
|
169
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
170
|
+
allowedUsers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
171
|
+
allowedGroups: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
172
|
+
managerOrAdminAllowed: z.ZodOptional<z.ZodBoolean>;
|
|
173
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
174
|
+
createdBy: z.ZodDefault<z.ZodString>;
|
|
175
|
+
createdAt: z.ZodDefault<z.ZodString>;
|
|
176
|
+
updatedAt: z.ZodDefault<z.ZodString>;
|
|
177
|
+
baseBranch: z.ZodOptional<z.ZodString>;
|
|
178
|
+
pullRequestUrl: z.ZodOptional<z.ZodString>;
|
|
179
|
+
pullRequestNumber: z.ZodOptional<z.ZodNumber>;
|
|
180
|
+
submittedAt: z.ZodOptional<z.ZodString>;
|
|
181
|
+
pushedToGitHubAt: z.ZodOptional<z.ZodString>;
|
|
182
|
+
syncStatus: z.ZodOptional<z.ZodNativeEnum<{
|
|
183
|
+
synced: "synced";
|
|
184
|
+
"pending-sync": "pending-sync";
|
|
185
|
+
"sync-failed": "sync-failed";
|
|
186
|
+
}>>;
|
|
187
|
+
conflictStatus: z.ZodOptional<z.ZodNativeEnum<{
|
|
188
|
+
clean: "clean";
|
|
189
|
+
"conflicts-detected": "conflicts-detected";
|
|
190
|
+
}>>;
|
|
191
|
+
conflictFiles: z.ZodOptional<z.ZodArray<z.ZodType<ContentId, z.ZodTypeDef, ContentId>, "many">>;
|
|
192
|
+
pullRequestState: z.ZodOptional<z.ZodNativeEnum<{
|
|
193
|
+
open: "open";
|
|
194
|
+
closed: "closed";
|
|
195
|
+
merged: "merged";
|
|
196
|
+
}>>;
|
|
197
|
+
mergedAt: z.ZodOptional<z.ZodString>;
|
|
198
|
+
rebaseFailure: z.ZodOptional<z.ZodObject<{
|
|
199
|
+
message: z.ZodString;
|
|
200
|
+
firstAt: z.ZodString;
|
|
201
|
+
lastAt: z.ZodString;
|
|
202
|
+
}, "strip", z.ZodTypeAny, {
|
|
203
|
+
message: string;
|
|
204
|
+
firstAt: string;
|
|
205
|
+
lastAt: string;
|
|
206
|
+
}, {
|
|
207
|
+
message: string;
|
|
208
|
+
firstAt: string;
|
|
209
|
+
lastAt: string;
|
|
210
|
+
}>>;
|
|
211
|
+
historyRewrittenFrom: z.ZodOptional<z.ZodString>;
|
|
212
|
+
syncFailureReason: z.ZodOptional<z.ZodString>;
|
|
213
|
+
editors: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
214
|
+
uncommittedEditors: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
215
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
18
216
|
/**
|
|
19
|
-
* branch.json
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*/
|
|
25
|
-
export declare class BranchMetadataCorruptError extends Error {
|
|
26
|
-
readonly branchRoot: string;
|
|
27
|
-
/**
|
|
28
|
-
* [REDACT] The raw JSON.parse failure message, with no embedded path.
|
|
29
|
-
* `message` above keeps the `branchRoot`-qualified text for server logs;
|
|
30
|
-
* `parseCause` is the one callers surface to clients (branch-health.ts's
|
|
31
|
-
* `parseError`), so no scan leaks the absolute workspace path.
|
|
32
|
-
*/
|
|
33
|
-
readonly parseCause: string;
|
|
34
|
-
constructor(branchRoot: string, cause: string);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Read and parse `branch.json`, with no locking, no OCC and no side effects.
|
|
38
|
-
* Callers distinguish three outcomes: `null` when the file does not exist (an
|
|
39
|
-
* un-provisioned or non-branch directory), `BranchMetadataCorruptError` on
|
|
40
|
-
* malformed JSON, and every other IO failure rethrown unchanged.
|
|
217
|
+
* Read, parse and validate `branch.json`, with no locking, no OCC and no side
|
|
218
|
+
* effects. Callers distinguish three outcomes: `null` when the file does not
|
|
219
|
+
* exist (an un-provisioned or non-branch directory),
|
|
220
|
+
* `BranchMetadataCorruptError` on malformed JSON or a failed schema check, and
|
|
221
|
+
* every other IO failure rethrown unchanged.
|
|
41
222
|
*/
|
|
42
223
|
export declare function readBranchMetadataFile(branchRoot: string): Promise<BranchMetadataFile | null>;
|