export type FileStatusKind = | "modified" | "added" | "deleted" | "renamed" | "untracked" | "conflicted" | "unknown"; export type CommitAiPhase = "idle" | "loading" | "ready" | "error"; export type CommitAiProvider = "local" | "openai" | "anthropic" | "custom"; export type CommitAiLocalProfile = "fast" | "balanced" | "detailed"; export type AppTheme = "system" | "light" | "dark"; export type AppLanguage = "en" | "de"; export interface CommitAiStatus { phase: CommitAiPhase; model_id: string | null; error: string | null; } export type AiReviewRisk = "low" | "medium" | "high"; export type AiReviewSeverity = "critical" | "warning" | "info"; export interface AiReviewFinding { severity: AiReviewSeverity; title: string; description: string; file: string | null; line: number | null; suggestion: string; } export interface AiReviewResult { summary: string; risk: AiReviewRisk; findings: AiReviewFinding[]; } export interface AiCommitGroup { message: string; reason: string; files: string[]; } export interface AiCommitPlan { summary: string; groups: AiCommitGroup[]; } export interface LocalModelOption { id: string; label: string; approx_size_mb: number; } export interface AiSettings { provider: CommitAiProvider; localModelId: string; localProfile: CommitAiLocalProfile; openaiModel: string; anthropicModel: string; customBaseUrl: string; customModel: string; } export interface AnalyticsSettings { enabled: boolean; noticeSeen: boolean; } export interface GitStatus { repo_path: string; current_branch: string | null; upstream: string | null; ahead: number; behind: number; files: GitFileStatus[]; clean: boolean; rebase_in_progress: boolean; cherry_pick_in_progress: boolean; merge_in_progress: boolean; } export interface GitRemote { name: string; fetch_url: string; push_url: string; } export type PullStrategy = "merge" | "rebase" | "ff-only"; export type MergeStrategy = "default" | "squash" | "ff-only" | "no-ff"; export interface GitFileStatus { path: string; old_path: string | null; staged: FileStatusKind | null; unstaged: FileStatusKind | null; } export type PatchApplyAction = "stage" | "unstage" | "discard-unstaged" | "discard-staged"; export interface GitBranch { name: string; current: boolean; remote: boolean; } export interface GitWorktree { path: string; head: string | null; short_head: string | null; branch: string | null; bare: boolean; detached: boolean; locked: boolean; lock_reason: string | null; prunable: boolean; prune_reason: string | null; missing: boolean; is_main: boolean; is_current: boolean; clean: boolean; changed_files: number; } export interface GitTag { name: string; hash: string; short_hash: string; message: string | null; date: string; annotated: boolean; } export interface GitStash { selector: string; index: number; hash: string; branch: string | null; message: string; date: string; } export interface GitCommit { hash: string; short_hash: string; summary: string; author_name: string; author_email: string; date: string; refs: string[]; parents: string[]; files: GitCommitFile[]; } export interface GitCommitFile { path: string; old_path: string | null; status: FileStatusKind; } export interface GitRepositoryFile { path: string; tracked: boolean; status: FileStatusKind | null; } export interface RepositoryBundle { status: GitStatus; branches: GitBranch[]; tags: GitTag[]; stashes: GitStash[]; commits: GitCommit[]; files: GitRepositoryFile[]; } export interface GitDiffFile { path: string; old_path: string | null; status: FileStatusKind; additions: number; deletions: number; } export interface GitCommitComparison { from_hash: string; from_short: string; to_hash: string; to_short: string; files: GitDiffFile[]; patch: string; } export interface GitSearchHit { commit_hash: string; short_hash: string; summary: string; author_name: string; author_email: string; date: string; file: string; old_file: string | null; line_number: number | null; line: string; matches_added: number; } export type ExplorerNodeKind = "folder" | "file"; export interface ExplorerNode { name: string; path: string; kind: ExplorerNodeKind; status: FileStatusKind | null; tracked: boolean; depth: number; children: ExplorerNode[]; } export type ConflictChoice = "ours" | "theirs" | "both-ot" | "both-to"; export type ConflictPart = | { kind: "text"; lines: string[] } | { kind: "conflict"; index: number; oursLines: string[]; theirsLines: string[] }; export type PreparedResolution = | { kind: "content"; content: string } | { kind: "side"; side: "ours" | "theirs" }; export interface ConflictFile { path: string; content: string; ours: string | null; theirs: string | null; base: string | null; binary: boolean; ours_size: number | null; theirs_size: number | null; } export interface GitBlameLine { line_number: number; content: string; commit_hash: string; short_hash: string; author_name: string; author_email: string; author_time: number; summary: string; is_uncommitted: boolean; } export interface GitBlameResult { path: string; lines: GitBlameLine[]; } export type RebaseAction = "pick" | "reword" | "squash" | "fixup" | "drop"; export interface RebaseCommit { hash: string; short_hash: string; summary: string; author_name: string; date: string; } export interface RebasePlanItem { hash: string; action: RebaseAction; message: string | null; } export interface ReflogEntry { hash: string; short_hash: string; selector: string; action: string; author_name: string; date: string; } export interface StoredCredential { username: string; password: string; expiresAt?: string | null; }