/** * RPC Client for programmatic access to the coding agent. * * Spawns the agent in RPC mode and provides a typed API for all operations. */ import type { AgentEvent, AgentMessage, AgentToolResult, ThinkingLevel } from "@oh-my-pi/pi-agent-core"; import type { CompactionResult } from "@oh-my-pi/pi-agent-core/compaction"; import type { ImageContent, Model } from "@oh-my-pi/pi-ai"; import type { BashResult } from "../../exec/bash-executor"; import type { SessionStats } from "../../session/agent-session"; import type { RpcHandoffResult, RpcHostToolDefinition, RpcSessionState } from "./rpc-types"; export interface RpcClientOptions { /** Path to the CLI entry point (default: searches for dist/cli.js) */ cliPath?: string; /** Working directory for the agent */ cwd?: string; /** Environment variables */ env?: Record; /** Provider to use */ provider?: string; /** Model ID to use */ model?: string; /** Session directory for the agent */ sessionDir?: string; /** Additional CLI arguments */ args?: string[]; /** Custom tools owned by the embedding host and exposed over the RPC transport */ customTools?: RpcClientCustomTool[]; } export type ModelInfo = Pick; export type RpcEventListener = (event: AgentEvent) => void; export interface RpcClientToolContext { toolCallId: string; signal: AbortSignal; sendUpdate(partialResult: RpcClientToolResult): void; } export type RpcClientToolResult = AgentToolResult | string; export interface RpcClientCustomTool = Record, TDetails = unknown> extends Omit { parameters: Record; execute(params: TParams, context: RpcClientToolContext): Promise> | RpcClientToolResult; } export declare function defineRpcClientTool = Record, TDetails = unknown>(tool: RpcClientCustomTool): RpcClientCustomTool; export declare class RpcClient { #private; private options; constructor(options?: RpcClientOptions); /** * Start the RPC agent process. */ start(): Promise; /** * Stop the RPC agent process. */ stop(): void; /** * Stop the RPC agent process and clean up resources. */ [Symbol.dispose](): void; /** * Subscribe to agent events. */ onEvent(listener: RpcEventListener): () => void; /** * Get collected stderr output (useful for debugging). */ getStderr(): string; /** * Send a prompt to the agent. * Returns immediately after sending; use onEvent() to receive streaming events. * Use waitForIdle() to wait for completion. */ prompt(message: string, images?: ImageContent[]): Promise; /** * Queue a steering message to interrupt the agent mid-run. */ steer(message: string, images?: ImageContent[]): Promise; /** * Queue a follow-up message to be processed after the agent finishes. */ followUp(message: string, images?: ImageContent[]): Promise; /** * Abort current operation. */ abort(): Promise; /** * Abort current operation and immediately start a new turn with the given message. */ abortAndPrompt(message: string, images?: ImageContent[]): Promise; /** * Start a new session, optionally with parent tracking. * @param parentSession - Optional parent session path for lineage tracking * @returns Object with `cancelled: true` if an extension cancelled the new session */ newSession(parentSession?: string): Promise<{ cancelled: boolean; }>; /** * Get current session state. */ getState(): Promise; /** * Set model by provider and ID. */ setModel(provider: string, modelId: string): Promise<{ provider: string; id: string; }>; /** * Cycle to next model. */ cycleModel(): Promise<{ model: { provider: string; id: string; }; thinkingLevel: ThinkingLevel | undefined; isScoped: boolean; } | null>; /** * Get list of available models. */ getAvailableModels(): Promise; /** * Set thinking level. */ setThinkingLevel(level: ThinkingLevel): Promise; /** * Cycle thinking level. */ cycleThinkingLevel(): Promise<{ level: ThinkingLevel; } | null>; /** * Set steering mode. */ setSteeringMode(mode: "all" | "one-at-a-time"): Promise; /** * Set follow-up mode. */ setFollowUpMode(mode: "all" | "one-at-a-time"): Promise; /** * Compact session context. */ compact(customInstructions?: string): Promise; /** * Set auto-compaction enabled/disabled. */ setAutoCompaction(enabled: boolean): Promise; /** * Set auto-retry enabled/disabled. */ setAutoRetry(enabled: boolean): Promise; /** * Abort in-progress retry. */ abortRetry(): Promise; /** * Execute a bash command. */ bash(command: string): Promise; /** * Abort running bash command. */ abortBash(): Promise; /** * Get session statistics. */ getSessionStats(): Promise; /** * Hand off session context to a new session. */ handoff(customInstructions?: string): Promise; /** * Export session to HTML. */ exportHtml(outputPath?: string): Promise<{ path: string; }>; /** * Switch to a different session file. * @returns Object with `cancelled: true` if an extension cancelled the switch */ switchSession(sessionPath: string): Promise<{ cancelled: boolean; }>; /** * Branch from a specific message. * @returns Object with `text` (the message text) and `cancelled` (if extension cancelled) */ branch(entryId: string): Promise<{ text: string; cancelled: boolean; }>; /** * Get messages available for branching. */ getBranchMessages(): Promise>; /** * Get text of last assistant message. */ getLastAssistantText(): Promise; /** * Get all messages in the session. */ getMessages(): Promise; /** * Get list of OAuth providers available for login, with their current authentication status. */ getLoginProviders(): Promise>; /** * Trigger OAuth login for the given provider. * The server will emit an `open_url` extension_ui_request for the auth URL. * Resolves when login completes or rejects on failure. * * @param onOpenUrl Called when the server emits the auth URL. The host must open * it in a browser for the callback-server OAuth flow to complete. */ login(providerId: string, options?: { onOpenUrl?: (url: string, instructions?: string) => void; }): Promise<{ providerId: string; }>; /** * Replace the host-owned custom tools exposed to the RPC session. * Changes take effect before the next model call. */ setCustomTools(tools: RpcClientCustomTool[]): Promise; /** * Wait for agent to become idle (no streaming). * Resolves when agent_end event is received. */ waitForIdle(timeout?: number): Promise; /** * Collect events until agent becomes idle. */ collectEvents(timeout?: number): Promise; /** * Send prompt and wait for completion, returning all events. */ promptAndWait(message: string, images?: ImageContent[], timeout?: number): Promise; }