@vypdev/copilot 3.10.5 → 3.10.6

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.
Files changed (28) hide show
  1. package/README.md +14 -0
  2. package/action.yml +16 -1
  3. package/build/api/index.js +1162 -76
  4. package/build/api/src/application/ports/bugbot_pull_request_resolution_ports.d.ts +4 -3
  5. package/build/api/src/application/ports/bugbot_pull_request_write_ports.d.ts +4 -3
  6. package/build/api/src/application/ports/pull_request_review_comment_ports.d.ts +4 -0
  7. package/build/api/src/data/model/application_error.d.ts +17 -2
  8. package/build/api/src/domain/change_size_reconciliation.d.ts +15 -0
  9. package/build/api/src/domain/copilot_command.d.ts +25 -0
  10. package/build/api/src/domain/copilot_command_validation.d.ts +10 -0
  11. package/build/api/src/domain/copilot_command_vocabulary.d.ts +3 -0
  12. package/build/api/src/domain/issue_workflow_diagnostic.d.ts +10 -0
  13. package/build/api/src/domain/issue_workflow_field_mapping.d.ts +10 -0
  14. package/build/api/src/domain/issue_workflow_profile.d.ts +67 -0
  15. package/build/api/src/domain/progress_binary_evidence_diagnostic.d.ts +9 -0
  16. package/build/api/src/domain/verification_failure.d.ts +15 -0
  17. package/build/cli/index.js +4299 -531
  18. package/build/deployment_recovery/index.js +41863 -0
  19. package/build/github_action/index.js +4877 -551
  20. package/deployment-recovery/action.yml +52 -0
  21. package/deployment-recovery/index.cjs +3 -0
  22. package/issue-admission/action.yml +41 -0
  23. package/issue-admission/index.cjs +13 -0
  24. package/package.json +19 -8
  25. package/setup/workflows/copilot_commit.yml +2 -0
  26. package/setup/workflows/copilot_issue.yml +57 -1
  27. package/setup/workflows/hotfix_workflow.yml +151 -7
  28. package/setup/workflows/release_workflow.yml +151 -7
@@ -1,7 +1,8 @@
1
- import type { PullRequestReviewComment, PullRequestReviewCommentListQueryPort, PullRequestReviewCommentUpdatePort, PullRequestReviewThreadCommandPort } from "./pull_request_review_comment_ports";
2
- export interface BugbotPullRequestResolutionPort extends PullRequestReviewCommentListQueryPort, PullRequestReviewCommentUpdatePort, PullRequestReviewThreadCommandPort {
1
+ import type { PullRequestReviewThreadStateQueryPort, BoundPullRequestReviewThreadStateQueryPort, PullRequestReviewComment, PullRequestReviewCommentListQueryPort, PullRequestReviewCommentUpdatePort, PullRequestReviewThreadCommandPort } from "./pull_request_review_comment_ports";
2
+ export interface BugbotPullRequestResolutionPort extends PullRequestReviewCommentListQueryPort, PullRequestReviewCommentUpdatePort, PullRequestReviewThreadCommandPort, Partial<PullRequestReviewThreadStateQueryPort> {
3
3
  }
4
- export interface BoundBugbotPullRequestResolutionPort {
4
+ /** Re-adjudicating a withdrawn dismissal requires the optional fresh-thread query. */
5
+ export interface BoundBugbotPullRequestResolutionPort extends Partial<BoundPullRequestReviewThreadStateQueryPort> {
5
6
  listPullRequestReviewComments(pullRequestNumber: number): Promise<PullRequestReviewComment[]>;
6
7
  updatePullRequestReviewComment(commentIdentity: string, body: string): Promise<void>;
7
8
  resolvePullRequestReviewThread(pullRequestNumber: number, commentIdentity: string): Promise<void>;
@@ -1,8 +1,9 @@
1
- import type { PullRequestReviewCommentDraft, PullRequestReviewReference, PullRequestReviewCommentCommandPort, PullRequestReviewThreadCommandPort } from "./pull_request_review_comment_ports";
1
+ import type { PullRequestReviewThreadStateQueryPort, BoundPullRequestReviewThreadStateQueryPort, PullRequestReviewCommentDraft, PullRequestReviewReference, PullRequestReviewCommentCommandPort, PullRequestReviewThreadCommandPort } from "./pull_request_review_comment_ports";
2
2
  /** Publication may refresh a comment and reopen its thread when a finding returns. */
3
- export interface BugbotPullRequestWritePort extends PullRequestReviewCommentCommandPort, Pick<PullRequestReviewThreadCommandPort, "unresolvePullRequestReviewThread"> {
3
+ export interface BugbotPullRequestWritePort extends PullRequestReviewCommentCommandPort, Pick<PullRequestReviewThreadCommandPort, "unresolvePullRequestReviewThread">, Partial<PullRequestReviewThreadStateQueryPort> {
4
4
  }
5
- export interface BoundBugbotPullRequestWritePort {
5
+ /** Re-adjudicating a withdrawn dismissal requires the optional fresh-thread query. */
6
+ export interface BoundBugbotPullRequestWritePort extends Partial<BoundPullRequestReviewThreadStateQueryPort> {
6
7
  createReviewWithComments(pullRequestNumber: number, commitId: string, body: string, comments: PullRequestReviewCommentDraft[]): Promise<PullRequestReviewReference | undefined>;
7
8
  updatePullRequestReviewComment(commentIdentity: string, body: string): Promise<void>;
8
9
  unresolvePullRequestReviewThread(pullRequestNumber: number, commentIdentity: string): Promise<void>;
@@ -70,3 +70,7 @@ export interface PullRequestReviewThreadState {
70
70
  resolved: boolean;
71
71
  resolvedByLogin?: string;
72
72
  }
73
+ /** Fresh thread facts for an already-bound repository identity. */
74
+ export interface BoundPullRequestReviewThreadStateQueryPort {
75
+ listPullRequestReviewThreadStates(pullRequestNumber: number): Promise<Record<string, PullRequestReviewThreadState>>;
76
+ }
@@ -1,11 +1,19 @@
1
+ import { type ProgressBinaryEvidenceFacts } from '../../domain/progress_binary_evidence_diagnostic';
2
+ import { type IssueWorkflowDiagnosticFacts } from '../../domain/issue_workflow_diagnostic';
3
+ import { type ChangeSizeReconciliationFacts } from '../../domain/change_size_reconciliation';
4
+ import { type CopilotCommandValidationReason } from '../../domain/copilot_command_validation';
5
+ import type { CopilotCommandName } from '../../domain/copilot_command';
1
6
  import { type ClosedIssueReconciliationFacts } from '../../domain/closed_issue_reconciliation';
2
7
  import { type ApprovalEvidenceDiagnostic } from '../../domain/approval_evidence_diagnostic';
3
8
  import { type BranchSyncValidationCode } from '../../domain/branch_sync_validation';
9
+ import { type BranchSyncVerificationFailure } from '../../domain/verification_failure';
4
10
  export type ApplicationErrorKind = 'configuration' | 'authorization' | 'provider' | 'agent' | 'validation' | 'workflow' | 'unknown';
5
11
  export type ApplicationErrorCode = 'configuration.invalid' | 'configuration.unsupported' | 'authorization.denied' | 'authorization.credential-invalid' | 'provider.not-found' | 'provider.conflict' | 'provider.rate-limited' | 'provider.unavailable' | 'provider.contract-invalid' | 'agent.policy-rejected' | 'agent.failed' | 'locale.output-invalid' | 'locale.translation-failed' | 'validation.invalid-input' | 'validation.evidence-too-large' | 'validation.evidence-unavailable' | 'workflow.invalid-event' | 'workflow.stale' | 'workflow.cancelled' | 'workflow.failed' | 'workflow.presentation-pending' | 'timeout' | 'unexpected';
6
- export declare const APPLICATION_ERROR_RECOVERY_IDS: readonly ["pull-request-link-restored", "pull-request-link-base-retained", "pull-request-link-reference-retained", "pull-request-link-base-and-reference-retained", "managed-branch-enrichment-failed", "inactivity-explanation-failed", "bugbot-review-blocks-pending", "branch-sync-agent-disabled", "branch-sync-fixer-unavailable", "branch-sync-resolution-invalid", "sdd-draft-size-exceeded", "sdd-draft-format-invalid", "sdd-draft-case-identity-invalid", "sdd-draft-case-budget-invalid", "sdd-draft-requirement-mapping-invalid", "sdd-draft-repository-path-invalid", "workspace-changes-rejected", "closed-issue-reconciliation-failed", "approval-evidence-read-failed", "stored-configuration-schema-missing", "stored-configuration-schema-unsupported", "stored-configuration-invalid"];
12
+ export declare const APPLICATION_ERROR_RECOVERY_IDS: readonly ["comment-command-length", "comment-command-name-missing", "comment-command-name-unknown", "comment-command-argument-count", "comment-command-arguments-unexpected", "comment-command-arguments-missing", "comment-command-finding-quoting", "comment-command-review-format", "comment-command-review-effort", "comment-command-review-boolean", "comment-command-review-option", "comment-command-sync-option", "comment-command-sync-parent", "pull-request-link-restored", "pull-request-link-base-retained", "pull-request-link-reference-retained", "pull-request-link-base-and-reference-retained", "managed-branch-enrichment-failed", "inactivity-explanation-failed", "bugbot-review-blocks-pending", "branch-sync-agent-disabled", "branch-sync-fixer-unavailable", "branch-sync-resolution-invalid", "branch-sync-verification-failed", "sdd-draft-size-exceeded", "sdd-catalog-unsupported-profile", "sdd-catalog-format-invalid", "sdd-draft-format-invalid", "sdd-draft-case-identity-invalid", "sdd-draft-case-budget-invalid", "sdd-draft-requirement-mapping-invalid", "sdd-draft-repository-path-invalid", "deployment-publication-context-missing", "workspace-changes-rejected", "closed-issue-reconciliation-failed", "approval-evidence-read-failed", "change-size-reconciliation-failed", "issue-workflow-admission-blocked", "progress-binary-evidence-unavailable", "stored-configuration-schema-missing", "stored-configuration-schema-unsupported", "stored-configuration-invalid"];
7
13
  export type ApplicationErrorRecoveryId = typeof APPLICATION_ERROR_RECOVERY_IDS[number];
8
- interface ApplicationErrorRecoveryVariables {
14
+ interface ApplicationErrorRecoveryVariables extends Readonly<Record<CopilotCommandValidationReason, Readonly<{
15
+ command: CopilotCommandName;
16
+ }>>> {
9
17
  readonly 'stored-configuration-schema-missing': Readonly<{
10
18
  issueNumber: number;
11
19
  expectedVersion: number;
@@ -21,6 +29,9 @@ interface ApplicationErrorRecoveryVariables {
21
29
  }>;
22
30
  readonly 'closed-issue-reconciliation-failed': ClosedIssueReconciliationFacts;
23
31
  readonly 'approval-evidence-read-failed': ApprovalEvidenceDiagnostic;
32
+ readonly 'change-size-reconciliation-failed': ChangeSizeReconciliationFacts;
33
+ readonly 'issue-workflow-admission-blocked': IssueWorkflowDiagnosticFacts;
34
+ readonly 'progress-binary-evidence-unavailable': ProgressBinaryEvidenceFacts;
24
35
  readonly 'pull-request-link-restored': Readonly<Record<string, never>>;
25
36
  readonly 'pull-request-link-base-retained': Readonly<Record<string, never>>;
26
37
  readonly 'pull-request-link-reference-retained': Readonly<Record<string, never>>;
@@ -44,12 +55,16 @@ interface ApplicationErrorRecoveryVariables {
44
55
  validationCode: BranchSyncValidationCode;
45
56
  command: '/copilot sync-branch';
46
57
  }>;
58
+ readonly 'branch-sync-verification-failed': BranchSyncVerificationFailure;
47
59
  readonly 'sdd-draft-size-exceeded': Readonly<Record<string, never>>;
60
+ readonly 'sdd-catalog-unsupported-profile': Readonly<Record<string, never>>;
61
+ readonly 'sdd-catalog-format-invalid': Readonly<Record<string, never>>;
48
62
  readonly 'sdd-draft-format-invalid': Readonly<Record<string, never>>;
49
63
  readonly 'sdd-draft-case-identity-invalid': Readonly<Record<string, never>>;
50
64
  readonly 'sdd-draft-case-budget-invalid': Readonly<Record<string, never>>;
51
65
  readonly 'sdd-draft-requirement-mapping-invalid': Readonly<Record<string, never>>;
52
66
  readonly 'sdd-draft-repository-path-invalid': Readonly<Record<string, never>>;
67
+ readonly 'deployment-publication-context-missing': Readonly<Record<string, never>>;
53
68
  readonly 'workspace-changes-rejected': Readonly<Record<string, never>>;
54
69
  }
55
70
  export type ApplicationErrorRecovery = {
@@ -0,0 +1,15 @@
1
+ export declare const CHANGE_SIZE_OPERATIONS: readonly ["calculate-size", "issue-labels", "issue-project-size", "list-pull-requests", "pr-label-read", "pr-label-write", "pr-project-membership", "pr-project-size"];
2
+ export type ChangeSizeOperation = typeof CHANGE_SIZE_OPERATIONS[number];
3
+ /** Only bounded identifiers and closed operation names cross the public error boundary. */
4
+ export interface ChangeSizeReconciliationFacts {
5
+ readonly operation: ChangeSizeOperation;
6
+ readonly issueNumber: number;
7
+ readonly targetNumber: number;
8
+ /** One-based configured Project position; zero means no Project operation. */
9
+ readonly projectIndex: number;
10
+ readonly verifiedOperations: number;
11
+ readonly pendingProjectSizes: number;
12
+ readonly providerStatus: string;
13
+ readonly providerReference: string;
14
+ }
15
+ export declare function isChangeSizeReconciliationFacts(value: Readonly<Record<string, unknown>>): boolean;
@@ -0,0 +1,25 @@
1
+ import type { CopilotCommandValidationDiagnostic } from './copilot_command_validation';
2
+ import { type CopilotCommandName } from './copilot_command_vocabulary';
3
+ export { COPILOT_COMMAND_NAMES, type CopilotCommandName } from './copilot_command_vocabulary';
4
+ /** Commands whose arguments may contain human prose that benefits from locale adaptation. */
5
+ export declare function copilotCommandAcceptsAdaptableProse(name: CopilotCommandName): boolean;
6
+ export interface ParsedCopilotCommand {
7
+ readonly name: CopilotCommandName;
8
+ readonly arguments: readonly string[];
9
+ readonly raw: string;
10
+ }
11
+ export type CopilotCommandParseResult = {
12
+ readonly kind: 'none';
13
+ } | {
14
+ readonly kind: 'command';
15
+ readonly command: ParsedCopilotCommand;
16
+ } | {
17
+ readonly kind: 'invalid';
18
+ readonly reason: string;
19
+ readonly validation: CopilotCommandValidationDiagnostic;
20
+ };
21
+ /**
22
+ * Parses only a command at the beginning of a comment. Everything else is
23
+ * ordinary user data and must continue through the existing agent flow.
24
+ */
25
+ export declare function parseCopilotCommand(raw: unknown): CopilotCommandParseResult;
@@ -0,0 +1,10 @@
1
+ import type { CopilotCommandName } from './copilot_command_vocabulary';
2
+ /** Closed public reasons; none contains user text, operands, paths or credentials. */
3
+ export declare const COPILOT_COMMAND_VALIDATION_REASONS: readonly ["comment-command-length", "comment-command-name-missing", "comment-command-name-unknown", "comment-command-argument-count", "comment-command-arguments-unexpected", "comment-command-arguments-missing", "comment-command-finding-quoting", "comment-command-review-format", "comment-command-review-effort", "comment-command-review-boolean", "comment-command-review-option", "comment-command-sync-option", "comment-command-sync-parent"];
4
+ export type CopilotCommandValidationReason = typeof COPILOT_COMMAND_VALIDATION_REASONS[number];
5
+ export interface CopilotCommandValidationDiagnostic {
6
+ readonly reason: CopilotCommandValidationReason;
7
+ readonly command: CopilotCommandName;
8
+ }
9
+ export declare function isCopilotCommandValidationReason(value: unknown): value is CopilotCommandValidationReason;
10
+ export declare function isValidCopilotCommandValidation(reason: unknown, command: unknown): boolean;
@@ -0,0 +1,3 @@
1
+ /** Explicit commands are the safe, deterministic entry point for mutations. */
2
+ export declare const COPILOT_COMMAND_NAMES: readonly ["help", "analyze", "plan", "clarify", "estimate", "test-plan", "status", "sdd-diff", "doctor", "history", "description", "explain", "diagnose", "review", "findings", "fix", "dismiss", "remember", "recheck", "implement", "sync-branch"];
3
+ export type CopilotCommandName = typeof COPILOT_COMMAND_NAMES[number];
@@ -0,0 +1,10 @@
1
+ import { type IssueWorkflowAdmission } from './issue_workflow_profile';
2
+ export interface IssueWorkflowDiagnosticFacts {
3
+ readonly kind: string;
4
+ readonly reason: 'missing-fields' | 'invalid-fields' | 'disabled-kind' | 'conflicting-kinds' | 'unmanaged';
5
+ readonly fields: string;
6
+ }
7
+ export declare function issueWorkflowDiagnostic(admission: IssueWorkflowAdmission | undefined): IssueWorkflowDiagnosticFacts | undefined;
8
+ export declare function isIssueWorkflowDiagnostic(value: Readonly<Record<string, unknown>>): boolean;
9
+ /** Bound heading data stays inert in Markdown tables, HTML, mentions and code spans. */
10
+ export declare function issueWorkflowDiagnosticPresentation(facts: IssueWorkflowDiagnosticFacts): Readonly<Record<string, string>>;
@@ -0,0 +1,10 @@
1
+ export type WorkflowFieldMappings<Kind extends string = string> = Readonly<Partial<Record<Kind, Readonly<Record<string, string>>>>>;
2
+ export declare const ISSUE_FIELD_HEADING_MAX_BYTES = 128;
3
+ type Definitions = Readonly<Record<string, {
4
+ readonly requiredHeadings: readonly string[];
5
+ }>>;
6
+ /** One explicit replacement per canonical semantic field; never guesses an alias from an issue body. */
7
+ export declare function normalizeWorkflowFieldMappings(value: unknown, definitions: Definitions, enabled: readonly string[]): WorkflowFieldMappings | undefined;
8
+ export declare function isIssueFieldHeading(value: unknown): value is string;
9
+ export declare function escapeIssueFieldHeadingMarkdown(field: string): string;
10
+ export {};
@@ -0,0 +1,67 @@
1
+ import { type WorkflowFieldMappings } from './issue_workflow_field_mapping';
2
+ /** Stable workflow identifiers used by setup, generated guidance, and Actions. */
3
+ export type IssueWorkflowKind = 'feature' | 'bugfix' | 'documentation' | 'chore' | 'help' | 'hotfix' | 'release';
4
+ export declare const ISSUE_WORKFLOW_KINDS: readonly IssueWorkflowKind[];
5
+ /** Canonical values shared by admission, form inspection and deterministic readers. */
6
+ export declare const ISSUE_WORKFLOW_RELEASE_TYPES: readonly ["Patch", "Minor", "Major"];
7
+ export declare function parseIssueWorkflowReleaseType(value: string): typeof ISSUE_WORKFLOW_RELEASE_TYPES[number] | undefined;
8
+ export interface IssueWorkflowDefinition {
9
+ readonly id: IssueWorkflowKind;
10
+ readonly label: string;
11
+ readonly formFile: string;
12
+ readonly nativeIssueType: 'Feature' | 'Bug' | 'Documentation' | 'Maintenance' | 'Question' | 'Help' | 'Hotfix' | 'Release';
13
+ readonly labels: readonly string[];
14
+ readonly branchManaged: boolean;
15
+ readonly requiredHeadings: readonly string[];
16
+ readonly requiredValueHeadings: readonly string[];
17
+ }
18
+ export declare const ISSUE_WORKFLOW_CATALOG: Readonly<Record<IssueWorkflowKind, IssueWorkflowDefinition>>;
19
+ export interface IssueWorkflowProfile {
20
+ readonly schemaVersion: 1 | 2;
21
+ readonly enabled: readonly IssueWorkflowKind[];
22
+ readonly fieldMappings?: WorkflowFieldMappings<IssueWorkflowKind>;
23
+ }
24
+ export type IssueWorkflowProfileParseResult = {
25
+ readonly profile: IssueWorkflowProfile;
26
+ } | {
27
+ readonly error: string;
28
+ };
29
+ export type IssueWorkflowAdmission = {
30
+ readonly status: 'eligible';
31
+ readonly kind: IssueWorkflowKind;
32
+ } | {
33
+ readonly status: 'unmanaged';
34
+ readonly reason: 'no-recognized-kind';
35
+ } | {
36
+ readonly status: 'disabled';
37
+ readonly kind: IssueWorkflowKind;
38
+ } | {
39
+ readonly status: 'conflict';
40
+ readonly kinds: readonly IssueWorkflowKind[];
41
+ } | {
42
+ readonly status: 'invalid';
43
+ readonly kind: IssueWorkflowKind;
44
+ readonly missingHeadings: readonly string[];
45
+ readonly invalidFields?: readonly string[];
46
+ };
47
+ export interface IssueWorkflowLabelConfiguration {
48
+ readonly feature?: readonly string[];
49
+ readonly bugfix?: readonly string[];
50
+ readonly documentation?: readonly string[];
51
+ readonly chore?: readonly string[];
52
+ readonly help?: readonly string[];
53
+ readonly hotfix?: readonly string[];
54
+ readonly release?: readonly string[];
55
+ }
56
+ export declare const ALL_ISSUE_WORKFLOWS: IssueWorkflowProfile;
57
+ export declare function createIssueWorkflowProfile(enabled: readonly IssueWorkflowKind[], fieldMappings?: WorkflowFieldMappings<IssueWorkflowKind>): IssueWorkflowProfile;
58
+ /** Empty input selects all workflows with the same admission checks as an explicit profile. */
59
+ export declare function parseIssueWorkflowProfile(raw: string | undefined): IssueWorkflowProfileParseResult;
60
+ export declare function serializeIssueWorkflowProfile(profile: IssueWorkflowProfile): string;
61
+ export declare function classifyIssueWorkflow(labels: readonly string[], profile?: IssueWorkflowProfile, labelConfiguration?: IssueWorkflowLabelConfiguration, body?: string, validateBody?: boolean): IssueWorkflowAdmission;
62
+ export declare function hasMarkdownHeading(body: string, heading: string): boolean;
63
+ export declare function issueWorkflowFormFiles(profile: IssueWorkflowProfile): readonly string[];
64
+ export declare function isAutomaticOrVersion(value: string): boolean;
65
+ export declare function issueWorkflowHeading(profile: IssueWorkflowProfile, kind: IssueWorkflowKind, canonical: string): string;
66
+ export declare function issueWorkflowRequiredHeadings(profile: IssueWorkflowProfile, kind: IssueWorkflowKind): readonly string[];
67
+ export type IssueWorkflowFieldMappings = WorkflowFieldMappings<IssueWorkflowKind>;
@@ -0,0 +1,9 @@
1
+ export interface ProgressBinaryEvidenceFacts {
2
+ readonly paths: string;
3
+ readonly pathCount: number;
4
+ }
5
+ /** Canonical, bounded exact paths. The total discloses additional unreviewed paths in the pinned inventory. */
6
+ export declare function progressBinaryEvidenceFacts(paths: readonly string[]): ProgressBinaryEvidenceFacts;
7
+ export declare function isProgressBinaryEvidenceFacts(value: Readonly<Record<string, unknown>>): boolean;
8
+ /** JSON renders control characters literally; a noncolliding code span keeps paths inert in Markdown and plain CLI text. */
9
+ export declare function progressBinaryEvidencePresentation(facts: ProgressBinaryEvidenceFacts): Readonly<Record<string, string | number>>;
@@ -0,0 +1,15 @@
1
+ /** Closed operational facts; never populate these with subprocess output or arbitrary argv. */
2
+ export declare const VERIFICATION_FAILURE_STAGES: readonly ["dependencies", "repository-setup", "runtime", "command"];
3
+ export declare const VERIFICATION_FAILURE_REASONS: readonly ["tool-unavailable", "unsupported-graph", "install-failed", "candidate-changed", "setup-blocked", "runtime-blocked", "command-failed", "command-invalid"];
4
+ export declare const VERIFICATION_COMMAND_LABELS: readonly ["configured-command", "pnpm run build", "pnpm run typecheck", "pnpm run test:coverage", "pnpm run lint", "pnpm run validate:documentation", "pnpm run validate:specifications"];
5
+ export type VerificationFailure = {
6
+ readonly stage: typeof VERIFICATION_FAILURE_STAGES[number];
7
+ readonly reason: typeof VERIFICATION_FAILURE_REASONS[number];
8
+ readonly command: typeof VERIFICATION_COMMAND_LABELS[number];
9
+ readonly commandIndex: number;
10
+ };
11
+ export type BranchSyncVerificationFailure = VerificationFailure & {
12
+ readonly childSha: string;
13
+ readonly restoration: 'restored' | 'unverified';
14
+ };
15
+ export declare function isBranchSyncVerificationFailure(value: Readonly<Record<string, unknown>>): boolean;