export interface PiModel { id: string; provider: string; name?: string; } export interface PiTheme { fg(color: string, text: string): string; } export interface PiUi { theme: PiTheme; notify(message: string, type?: "info" | "warning" | "error"): void; setStatus(key: string, text: string | undefined): void; } export interface PiModelRegistry { getAll?(): PiModel[]; find?(provider: string, modelId: string): PiModel | undefined; isUsingOAuth?(model: PiModel): boolean; getApiKeyForProvider?(provider: string): Promise; } export interface PiContextUsage { tokens: number | null; contextWindow: number; percent: number | null; } export interface PiContext { ui: PiUi; model?: PiModel; modelRegistry: PiModelRegistry; hasUI: boolean; mode: "tui" | "rpc" | "json" | "print" | string; getContextUsage?(): PiContextUsage | undefined; } export interface PiCommandContext extends PiContext { waitForIdle?(): Promise; } export interface PiAfterProviderResponseEvent { status: number; headers: Record; } export interface PiModelSelectEvent { model: PiModel; previousModel?: PiModel; source: "set" | "cycle" | "restore" | string; } export interface PiSessionStartEvent { reason: string; } export interface PiSessionShutdownEvent { reason: string; } type EventHandler = ( event: TEvent, ctx: TContext, ) => void | Promise; export interface PiCommandDefinition { description?: string; handler: (args: string, ctx: PiCommandContext) => Promise; } export interface PiExtensionAPI { on(event: "session_start", handler: EventHandler): void; on( event: "session_shutdown", handler: EventHandler, ): void; on(event: "model_select", handler: EventHandler): void; on( event: "after_provider_response", handler: EventHandler, ): void; on(event: string, handler: EventHandler): void; registerCommand(name: string, definition: PiCommandDefinition): void; sendMessage( message: { customType: string; content: string; display: boolean; details?: T; }, options?: unknown, ): void; }