import { Schema } from "effect"; export const RuntimeModeSchema = Schema.Literal("approval-required", "full-access"); export type RuntimeMode = Schema.Schema.Type; export const ProjectScriptSchema = Schema.Struct({ id: Schema.String, name: Schema.String, command: Schema.String, keybinding: Schema.optional(Schema.String), }); export type ProjectScript = Schema.Schema.Type; export const ProjectViewSchema = Schema.Struct({ id: Schema.String, name: Schema.String, cwd: Schema.String, model: Schema.String, expanded: Schema.Boolean, scripts: Schema.Array(ProjectScriptSchema), }); export type ProjectView = Schema.Schema.Type; export const ChatAttachmentSchema = Schema.Struct({ type: Schema.Literal("image"), id: Schema.String, name: Schema.String, mimeType: Schema.String, sizeBytes: Schema.Number, previewUrl: Schema.optional(Schema.String), }); export type ChatAttachment = Schema.Schema.Type; export const ChatMessageSchema = Schema.Struct({ id: Schema.String, role: Schema.Literal("user", "assistant"), text: Schema.String, attachments: Schema.optional(Schema.Array(ChatAttachmentSchema)), createdAt: Schema.String, streaming: Schema.Boolean, }); export type ChatMessage = Schema.Schema.Type; export const SessionStatusSchema = Schema.Literal( "connecting", "ready", "running", "error", "closed", ); export type SessionStatus = Schema.Schema.Type; export const ProviderSessionViewSchema = Schema.Struct({ sessionId: Schema.String, provider: Schema.Literal("codex", "claudeCode"), status: SessionStatusSchema, cwd: Schema.optional(Schema.String), model: Schema.optional(Schema.String), threadId: Schema.optional(Schema.String), activeTurnId: Schema.optional(Schema.String), createdAt: Schema.String, updatedAt: Schema.String, lastError: Schema.optional(Schema.String), }); export type ProviderSessionView = Schema.Schema.Type; export const ProviderEventSchema = Schema.Struct({ id: Schema.String, kind: Schema.Literal("session", "notification", "request", "error"), method: Schema.String, payload: Schema.optional(Schema.Unknown), createdAt: Schema.String, sessionId: Schema.String, threadId: Schema.optional(Schema.String), turnId: Schema.optional(Schema.String), itemId: Schema.optional(Schema.String), textDelta: Schema.optional(Schema.String), requestId: Schema.optional(Schema.String), requestKind: Schema.optional(Schema.String), message: Schema.optional(Schema.String), }); export type ProviderEvent = Schema.Schema.Type; export const TurnDiffFileChangeSchema = Schema.Struct({ path: Schema.String, kind: Schema.optional(Schema.String), additions: Schema.optional(Schema.Number), deletions: Schema.optional(Schema.Number), }); export type TurnDiffFileChange = Schema.Schema.Type; export const TurnDiffSummarySchema = Schema.Struct({ turnId: Schema.String, completedAt: Schema.String, status: Schema.optional(Schema.String), files: Schema.Array(TurnDiffFileChangeSchema), assistantMessageId: Schema.optional(Schema.String), checkpointTurnCount: Schema.optional(Schema.Number), }); export type TurnDiffSummary = Schema.Schema.Type; export const ThreadTerminalGroupSchema = Schema.Struct({ id: Schema.String, terminalIds: Schema.Array(Schema.String), }); export type ThreadTerminalGroup = Schema.Schema.Type; export const ThreadViewSchema = Schema.Struct({ id: Schema.String, codexThreadId: Schema.NullOr(Schema.String), projectId: Schema.String, title: Schema.String, model: Schema.String, terminalOpen: Schema.Boolean, terminalHeight: Schema.Number, terminalIds: Schema.Array(Schema.String), runningTerminalIds: Schema.Array(Schema.String), activeTerminalId: Schema.String, terminalGroups: Schema.Array(ThreadTerminalGroupSchema), activeTerminalGroupId: Schema.String, session: Schema.NullOr(ProviderSessionViewSchema), messages: Schema.Array(ChatMessageSchema), events: Schema.Array(ProviderEventSchema), error: Schema.NullOr(Schema.String), createdAt: Schema.String, latestTurnId: Schema.optional(Schema.String), latestTurnStartedAt: Schema.optional(Schema.String), latestTurnCompletedAt: Schema.optional(Schema.String), latestTurnDurationMs: Schema.optional(Schema.Number), lastVisitedAt: Schema.optional(Schema.String), branch: Schema.NullOr(Schema.String), worktreePath: Schema.NullOr(Schema.String), turnDiffSummaries: Schema.Array(TurnDiffSummarySchema), }); export type ThreadView = Schema.Schema.Type; export const AppViewStateSchema = Schema.Struct({ projects: Schema.Array(ProjectViewSchema), threads: Schema.Array(ThreadViewSchema), threadsHydrated: Schema.Boolean, runtimeMode: RuntimeModeSchema, lastPosition: Schema.Number, }); export type AppViewState = Schema.Schema.Type; export const emptyAppViewState = (): AppViewState => ({ projects: [], threads: [], threadsHydrated: false, runtimeMode: "full-access", lastPosition: 0, });