export interface Project { id: string; name: string; path: string; createdAt: string; } export interface Workspace { id: string; projectId: string; path: string; label: string; branch?: string; isMain: boolean; isGitRepo: boolean; isGitWorktree: boolean; } export interface SessionInfo { id: string; path: string; cwd: string; name?: string; created: string; modified: string; messageCount: number; firstMessage: string; archived?: boolean; archivedAt?: string; } export interface SessionActivity { sessionId: string; phase: "active" | "idle" | "error"; label: string; detail?: string; at: string; } export interface SessionStatus { sessionId: string; model?: { provider?: string; id?: string; name?: string; contextWindow?: number; reasoning?: unknown }; thinkingLevel?: string; isStreaming: boolean; isCompacting: boolean; isBashRunning: boolean; pendingMessageCount: number; tokens: { input: number; output: number; cacheRead: number; cacheWrite: number; total: number }; cost: number; contextUsage?: { tokens: number | null; contextWindow: number; percent: number | null }; } export interface SlashCommand { name: string; description?: string; source: "extension" | "prompt" | "skill" | "builtin"; } export interface FileSuggestion { path: string; kind: "tracked" | "untracked" | "other"; } export interface FileTreeEntry { name: string; path: string; type: "file" | "directory" | "symlink"; size?: number; modifiedAt?: string; } export interface FileTreeResponse { path: string; entries: FileTreeEntry[]; scannedAt: string; truncated: boolean; } export interface FileContentResponse { path: string; language?: string; encoding: "utf8"; size: number; modifiedAt: string; content: string; truncated: boolean; binary: boolean; } export type GitFileState = "unmodified" | "modified" | "added" | "deleted" | "renamed" | "copied" | "untracked" | "ignored" | "conflicted"; export interface GitStatusFile { path: string; oldPath?: string; index: GitFileState; workingTree: GitFileState; } export interface GitStatusResponse { isGitRepo: boolean; hash: string; branch?: string; upstream?: string; ahead?: number; behind?: number; files: GitStatusFile[]; } export interface GitDiffResponse { path?: string; staged: boolean; hash: string; diff: string; truncated: boolean; } export interface TerminalInfo { id: string; cwd: string; name: string; createdAt: string; exited: boolean; exitCode?: number; } export interface CommandOption { value: string; label: string; description?: string; } export interface MessagePage { messages: unknown[]; start: number; total: number; } export type CommandResult = | { type: "done"; message?: string; session?: SessionInfo } | { type: "select"; requestId: string; title: string; options: CommandOption[] } | { type: "unsupported"; message: string }; export type SessionUiEvent = | { type: "message.append"; message: unknown } | { type: "assistant.delta"; text: string } | { type: "tool.start"; toolName: string; toolCallId: string; summary: string; args?: unknown } | { type: "tool.end"; toolName: string; toolCallId: string; text: string; isError: boolean; content?: unknown } | { type: "shell.start"; command: string; excludeFromContext?: boolean } | { type: "shell.chunk"; chunk: string } | { type: "shell.end"; output?: string; exitCode?: number | null; cancelled?: boolean; truncated?: boolean; fullOutputPath?: string; isError?: boolean } | { type: "agent.start" } | { type: "agent.end" } | { type: "message.end" } | { type: "status.update"; status: SessionStatus } | { type: "activity.update"; activity: SessionActivity } | { type: "command.output"; level: "info" | "success" | "error"; message: string } | { type: "session.error"; message: string } | { type: "session.name"; sessionId: string; name?: string } | { type: "pi.event"; eventType: string }; export type GlobalSessionEvent = Extract;