export interface FileChange { path: string; oldPath?: string; status: 'added' | 'modified' | 'deleted' | 'renamed'; staged: boolean; approved: boolean; additions: number; deletions: number; } export interface DiffFile { path: string; oldPath?: string; hunks: DiffHunk[]; language: string; totalLines?: number; truncated?: boolean; } export interface DiffHunk { header: string; oldStart: number; oldLines: number; newStart: number; newLines: number; lines: DiffLine[]; } export interface DiffLine { type: 'add' | 'del' | 'context'; content: string; html?: string; oldNumber?: number; newNumber?: number; } export type DiffScope = 'uncommitted' | 'worktree'; export type DiffMode = 'full' | 'unstaged'; export interface ChangeInfo { changeId: string; commitId: string; description: string; bookmarks: string[]; isWorkingCopy: boolean; parents: string[]; } export interface ChangeStack { main: { changeId: string; commitId: string; description: string } | null; /** Effective change being viewed (selected change, or the working copy). */ current: string | null; /** Explicitly selected change, or null when viewing the working copy. */ selected: string | null; workingCopy: string | null; changes: ChangeInfo[]; }