import type { InspectApplyPayload } from '../editor/inspect.js'; export type PygmalionIntegrationState = 'up_to_date' | 'auto_merged' | 'review_required' | 'conflict' | 'offline'; export interface PygmalionDevMirrorStatus { /** 'drifted' means another server moved the shared mirror checkout; a refresh resyncs it. */ state: 'idle' | 'syncing' | 'ready' | 'error' | 'drifted'; commit: string | null; shortCommit: string | null; /** Git ref the mirror is tracking, or null when it follows the source branch. */ sourceRef: string | null; syncedAt: string | null; updated: boolean; warning: string | null; error: string | null; appOrigin: string | null; /** Present when the proxy child is absent or serves another ref's checkout. */ runtimeDrift?: { expectedAppRoot: string; actualAppRoot: string | null; }; } /** One revision the mirror can be repointed at. */ export interface PygmalionSourceRef { name: string; /** Abbreviated commit used for compact branch-tip labels. */ commit: string; /** Full immutable object id used for preview and artifact identity. */ sourceRevision?: string; fullName: string; kind: 'local' | 'remote'; } /** Revisions available to `switchSource`, listed from the mirror repository. */ export interface PygmalionSourceRefs { refs: readonly PygmalionSourceRef[]; /** Revision followed when none is pinned. */ defaultRef: string | null; /** Ref that renders uncommitted work. */ worktreeRef: string | null; } export interface PygmalionVisualOperation { id: string; revision: number; kind: 'visual'; createdAt: string; commitSha: string; files: string[]; integrationState: PygmalionIntegrationState; } export interface PygmalionVisualRevertOperation { id: string; revision: number; kind: 'visual-revert'; createdAt: string; commitSha: string; revertsOperationId: string; revertsRevision: number; revertsCommitSha: string; recordedCommitSha: string; files: string[]; integrationState: PygmalionIntegrationState; } export interface PygmalionVisualRedoOperation extends Omit { kind: 'visual-redo'; restoresOperationId: string; restoresRevision: number; replaysOperationId: string; } export interface PygmalionVisualRestoreOperation extends Omit { kind: 'visual-restore'; targetRevision: number; targetCommitSha: string; activeOperationIds: string[]; } export interface PygmalionSessionHistoryEntry { id: string; revision: number; kind: PygmalionSessionOperation['kind']; createdAt: string; files: string[]; qa?: { before: Record; after: Record; }; } export interface PygmalionHistoryResult { redone: boolean; restored: boolean; operation: PygmalionVisualRedoOperation | PygmalionVisualRestoreOperation; session: PygmalionDesignSessionStatus; } export interface SessionHistoryResponse { session: PygmalionDesignSessionStatus; operations: PygmalionSessionOperation[]; } export type PygmalionSessionOperation = PygmalionVisualOperation | PygmalionVisualRevertOperation | PygmalionVisualRedoOperation | PygmalionVisualRestoreOperation; export interface PygmalionDesignSessionStatus { id: string; createdAt: string; updatedAt: string; createdFromSha: string; baseDevSha: string; /** Source ref followed by this session; absent on older services. */ sourceRef?: string | null; branchName: string | null; headSha: string | null; revision: number; integration: { state: PygmalionIntegrationState; latestDevSha: string; checkedAt: string; affectedFiles: string[]; conflictFiles: string[]; error?: string; }; lastOperation: PygmalionSessionOperation | null; canRevert: boolean; canRedo?: boolean; history?: PygmalionSessionHistoryEntry[]; lastRevertableOperation: PygmalionVisualOperation | null; lastRevert: PygmalionVisualRevertOperation | null; appOrigin: string | null; previewError: string | null; } export interface PygmalionRevertResult { reverted: true; operation: PygmalionVisualRevertOperation; session: PygmalionDesignSessionStatus; } export interface MirrorRefreshRequest { /** The ref to repoint the mirror at; omitted resyncs the current one. */ ref?: string; } export interface SessionOpenRequest { sessionId: string; baseDevSha: string; /** Bind future integration checks to the selected source, not the server default. */ sourceRef?: string; } export interface SessionCheckRequest { sessionId: string; } export interface SessionMutationRequest { sessionId: string; baseDevSha: string; expectedRevision: number; } export interface SessionPreviewVisualRequest extends SessionMutationRequest { captureBaseline?: boolean; changes: InspectApplyPayload; } export interface SessionPreviewVisualResponse { session?: PygmalionDesignSessionStatus; revision: number; files: { file: string; diff: string; }[]; affectedFiles: string[]; } export interface SessionApplyVisualRequest extends SessionMutationRequest { /** The revision the reviewed diff was produced against, when one was. */ previewRevision?: number; changes: InspectApplyPayload; } export interface SessionApplyVisualResponse { applied?: number; session: PygmalionDesignSessionStatus; } export interface SessionRevertVisualRequest extends SessionMutationRequest { expectedHeadSha: string; } export interface SessionRestoreVisualRequest extends SessionRevertVisualRequest { targetRevision: number; } export type SessionRevertVisualResponse = PygmalionRevertResult; export interface InspectImpactRequest { componentFiles: string[]; } /** The raw QA capture envelope; visualQa.ts turns it into an InspectQaResult. */ export interface QaCaptureEnvelope { baselineId: string; frames?: unknown; failures?: unknown; complete?: unknown; } export interface PreviewCatalogRequest { namespace: string; sourceRevision: string; } export interface SourceUsageRequest { files: readonly string[]; } export interface ComponentBranchesRequest { source: string; }