import type { AgentSessionEvent, SessionManager, SettingsManager, SlashCommandInfo, Theme, } from "@earendil-works/pi-coding-agent"; import type { AgentMessage as PiAgentMessage } from "@earendil-works/pi-agent-core"; export interface ContextUsage { percent: number | null; contextWindow: number; tokens: number | null; } export interface ModelLike { id: string; provider: string; } export interface ToolInfo { name: string; description: string; } export interface NavigateTreeResult { editorText?: string; cancelled: boolean; aborted?: boolean; } export interface SessionStatsInfo { sessionFile?: string; sessionId: string; sessionName?: string; userMessages: number; assistantMessages: number; toolCalls: number; toolResults: number; totalMessages: number; tokens: { input: number; output: number; cacheRead: number; cacheWrite: number; total: number; }; cost: number; contextUsage?: ContextUsage; /** Estimated active time across all entries in the session file. */ totalActiveMs?: number; } interface PromptTemplateLike { name: string; description?: string; sourceInfo: SlashCommandInfo["sourceInfo"]; } interface SkillLike { name: string; description?: string; sourceInfo: SlashCommandInfo["sourceInfo"]; } interface ResourceLoaderLike { getSkills(): { skills: SkillLike[] }; } interface ExtensionRunnerLike { getRegisteredCommands(): Array<{ invocationName: string; description?: string; sourceInfo: SlashCommandInfo["sourceInfo"]; }>; emit?(event: { type: "session_shutdown"; reason: "quit" }): Promise; setUIContext?(uiContext?: unknown, mode?: "tui" | "rpc" | "json" | "print"): void; } type DialogOptionsLike = { signal?: AbortSignal; timeout?: number; }; type WidgetOptionsLike = { placement?: "aboveEditor" | "belowEditor"; }; export interface ExtensionUiContextLike { select(title: string, options: string[], opts?: DialogOptionsLike): Promise; confirm(title: string, message: string, opts?: DialogOptionsLike): Promise; input(title: string, placeholder?: string, opts?: DialogOptionsLike): Promise; editor(title: string, prefill?: string, opts?: DialogOptionsLike): Promise; notify(message: string, type?: "info" | "warning" | "error"): void; onTerminalInput(): () => void; setStatus(key: string, text: string | undefined): void; setWorkingMessage(message?: string): void; setWorkingVisible(visible: boolean): void; setWorkingIndicator(options?: { frames?: string[]; intervalMs?: number }): void; setHiddenThinkingLabel(label?: string): void; setWidget(key: string, content: string[] | ((...args: never[]) => unknown) | undefined, options?: WidgetOptionsLike): void; setFooter(factory: unknown): void; setHeader(factory: unknown): void; setTitle(title: string): void; custom(...args: unknown[]): Promise; pasteToEditor(text: string): void; setEditorText(text: string): void; getEditorText(): string; addAutocompleteProvider(): void; setEditorComponent(): void; getEditorComponent(): undefined; readonly theme: Theme; getAllThemes(): unknown[]; getTheme(name: string): undefined; setTheme(theme: unknown): { success: boolean; error?: string }; getToolsExpanded(): boolean; setToolsExpanded(expanded: boolean): void; } export interface AgentSessionLike { readonly sessionId: string; readonly sessionFile: string | undefined; readonly isStreaming: boolean; readonly isCompacting: boolean; readonly autoCompactionEnabled: boolean; readonly autoRetryEnabled: boolean; readonly model: ModelLike | undefined; readonly modelRuntime: { getModel: (provider: string, modelId: string) => ModelLike | undefined; refresh: (options?: { allowNetwork?: boolean }) => Promise; }; readonly sessionManager: SessionManager; readonly settingsManager: SettingsManager; readonly agent: { state?: { systemPrompt?: string; thinkingLevel?: string; streamingMessage?: PiAgentMessage; }; }; readonly extensionRunner: ExtensionRunnerLike; readonly promptTemplates: readonly PromptTemplateLike[]; readonly resourceLoader: ResourceLoaderLike; readonly bindExtensions?: unknown; dispose(): void; reload(options?: { beforeSessionStart?: () => void | Promise }): Promise; subscribe(listener: (event: AgentSessionEvent) => void): () => void; prompt(text: string, options?: { images?: Array<{ type: "image"; data: string; mimeType: string }>; streamingBehavior?: "steer" | "followUp"; source?: "interactive" | "rpc"; preflightResult?: (success: boolean) => void; }): Promise; abort(): Promise; executeBash(command: string, onChunk?: (chunk: string) => void, options?: { excludeFromContext?: boolean }): Promise<{ output: string; exitCode?: number; cancelled?: boolean; truncated?: boolean; fullOutputPath?: string }>; abortBash(): void; readonly isBashRunning: boolean; setModel(model: ModelLike): Promise; navigateTree(targetId: string, options?: { summarize?: boolean }): Promise; setThinkingLevel(level: string): void; compact(customInstructions?: string): Promise; setSessionName(name: string): void; getSessionStats(): Omit; getLastAssistantText(): string | undefined; setAutoCompactionEnabled(enabled: boolean): void; setAutoRetryEnabled(enabled: boolean): void; steer(text: string, images?: Array<{ type: "image"; data: string; mimeType: string }>): Promise; followUp(text: string, images?: Array<{ type: "image"; data: string; mimeType: string }>): Promise; readonly pendingMessageCount: number; getSteeringMessages(): readonly string[]; getFollowUpMessages(): readonly string[]; clearQueue(): { steering: string[]; followUp: string[] }; getAllTools(): ToolInfo[]; getActiveToolNames(): string[]; setActiveToolsByName(names: string[]): void; abortCompaction(): void; getContextUsage(): ContextUsage | undefined; }