import type { EnvironmentId, ModelSelection, OrchestrationLatestTurn, OrchestrationProposedPlanId, RepositoryIdentity, OrchestrationSessionStatus, OrchestrationThreadActivity, ProjectScript as ContractProjectScript, ThreadId, ProjectId, TurnId, MessageId, ProviderKind, CheckpointRef, ProviderInteractionMode, RuntimeMode, } from "@t3tools/contracts"; export type SessionPhase = "disconnected" | "connecting" | "ready" | "running"; export const DEFAULT_RUNTIME_MODE: RuntimeMode = "full-access"; export const DEFAULT_INTERACTION_MODE: ProviderInteractionMode = "default"; export const DEFAULT_THREAD_TERMINAL_HEIGHT = 280; export const DEFAULT_THREAD_TERMINAL_ID = "default"; export const MAX_TERMINALS_PER_GROUP = 4; export type ProjectScript = ContractProjectScript; export interface ThreadTerminalGroup { id: string; terminalIds: string[]; } export interface ChatImageAttachment { type: "image"; id: string; name: string; mimeType: string; sizeBytes: number; previewUrl?: string; } export type ChatAttachment = ChatImageAttachment; export interface ChatMessage { id: MessageId; role: "user" | "assistant" | "system"; text: string; attachments?: ChatAttachment[]; turnId?: TurnId | null; createdAt: string; completedAt?: string | undefined; streaming: boolean; } export interface ProposedPlan { id: OrchestrationProposedPlanId; turnId: TurnId | null; planMarkdown: string; implementedAt: string | null; implementationThreadId: ThreadId | null; createdAt: string; updatedAt: string; } export interface TurnDiffFileChange { path: string; kind?: string | undefined; additions?: number | undefined; deletions?: number | undefined; } export interface TurnDiffSummary { turnId: TurnId; completedAt: string; status?: string | undefined; files: TurnDiffFileChange[]; checkpointRef?: CheckpointRef | undefined; assistantMessageId?: MessageId | undefined; checkpointTurnCount?: number | undefined; } export interface Project { id: ProjectId; environmentId: EnvironmentId; name: string; cwd: string; repositoryIdentity?: RepositoryIdentity | null; defaultModelSelection: ModelSelection | null; createdAt?: string | undefined; updatedAt?: string | undefined; scripts: ProjectScript[]; } export interface Thread { id: ThreadId; environmentId: EnvironmentId; codexThreadId: string | null; projectId: ProjectId; title: string; modelSelection: ModelSelection; runtimeMode: RuntimeMode; interactionMode: ProviderInteractionMode; session: ThreadSession | null; messages: ChatMessage[]; proposedPlans: ProposedPlan[]; error: string | null; createdAt: string; archivedAt: string | null; updatedAt?: string | undefined; latestTurn: OrchestrationLatestTurn | null; pendingSourceProposedPlan?: OrchestrationLatestTurn["sourceProposedPlan"]; branch: string | null; worktreePath: string | null; turnDiffSummaries: TurnDiffSummary[]; activities: OrchestrationThreadActivity[]; } export interface ThreadShell { id: ThreadId; environmentId: EnvironmentId; codexThreadId: string | null; projectId: ProjectId; title: string; modelSelection: ModelSelection; runtimeMode: RuntimeMode; interactionMode: ProviderInteractionMode; error: string | null; createdAt: string; archivedAt: string | null; updatedAt?: string | undefined; branch: string | null; worktreePath: string | null; } export interface ThreadTurnState { latestTurn: OrchestrationLatestTurn | null; pendingSourceProposedPlan?: OrchestrationLatestTurn["sourceProposedPlan"]; } export interface SidebarThreadSummary { id: ThreadId; environmentId: EnvironmentId; projectId: ProjectId; title: string; interactionMode: ProviderInteractionMode; session: ThreadSession | null; createdAt: string; archivedAt: string | null; updatedAt?: string | undefined; latestTurn: OrchestrationLatestTurn | null; branch: string | null; worktreePath: string | null; latestUserMessageAt: string | null; hasPendingApprovals: boolean; hasPendingUserInput: boolean; hasActionableProposedPlan: boolean; } export interface ThreadSession { provider: ProviderKind; status: SessionPhase | "error" | "closed"; activeTurnId?: TurnId | undefined; createdAt: string; updatedAt: string; lastError?: string; orchestrationStatus: OrchestrationSessionStatus; }