@dyyz1993/pi-coding-agent 0.74.10 → 0.74.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/core/agent-session.d.ts +5 -0
  2. package/dist/core/agent-session.d.ts.map +1 -1
  3. package/dist/core/agent-session.js +23 -0
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/mcp/mcp-manager.d.ts +1 -0
  6. package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
  7. package/dist/core/mcp/mcp-manager.js +36 -0
  8. package/dist/core/mcp/mcp-manager.js.map +1 -1
  9. package/dist/core/settings-manager.d.ts +3 -1
  10. package/dist/core/settings-manager.d.ts.map +1 -1
  11. package/dist/core/settings-manager.js +41 -0
  12. package/dist/core/settings-manager.js.map +1 -1
  13. package/dist/modes/rpc/rpc-client-types.d.ts +2 -0
  14. package/dist/modes/rpc/rpc-client-types.d.ts.map +1 -1
  15. package/dist/modes/rpc/rpc-client-types.js.map +1 -1
  16. package/dist/modes/rpc/rpc-client.d.ts +2 -0
  17. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  18. package/dist/modes/rpc/rpc-client.js +6 -0
  19. package/dist/modes/rpc/rpc-client.js.map +1 -1
  20. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  21. package/dist/modes/rpc/rpc-mode.js +18 -0
  22. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  23. package/dist/modes/rpc/rpc-types.d.ts +21 -0
  24. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  25. package/dist/modes/rpc/rpc-types.js.map +1 -1
  26. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  27. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  28. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  29. package/examples/extensions/sandbox/package-lock.json +2 -2
  30. package/examples/extensions/sandbox/package.json +1 -1
  31. package/examples/extensions/with-deps/package-lock.json +2 -2
  32. package/examples/extensions/with-deps/package.json +1 -1
  33. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-client.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC Client for programmatic access to the coding agent.\n *\n * Spawns the agent in RPC mode and provides a typed API for all operations.\n */\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentEvent, AgentMessage, ThinkingLevel } from \"@dyyz1993/pi-agent-core\";\nimport type { ImageContent } from \"@dyyz1993/pi-ai\";\nimport type { SessionStats } from \"../../core/agent-session.js\";\nimport type { BashResult } from \"../../core/bash-executor.js\";\nimport type { CompactionResult } from \"../../core/compaction/index.js\";\nimport type { Channel, ChannelDataMessage } from \"../../core/extensions/channel-types.js\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.js\";\nimport type { TreeWithLeaf } from \"./rpc-client-types.js\";\nimport type {\n\tRpcCommand,\n\tRpcExtension,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSkill,\n\tRpcSlashCommand,\n\tRpcTool,\n\tTreeEntry,\n} from \"./rpc-types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Distributive Omit that works with union types */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\n/** RpcCommand without the id field (for internal send) */\ntype RpcCommandBody = DistributiveOmit<RpcCommand, \"id\">;\n\nexport interface RpcClientOptions {\n\t/** Path to the CLI entry point (default: searches for dist/cli.js) */\n\tcliPath?: string;\n\t/** Working directory for the agent */\n\tcwd?: string;\n\t/** Environment variables */\n\tenv?: Record<string, string>;\n\t/** Provider to use */\n\tprovider?: string;\n\t/** Model ID to use */\n\tmodel?: string;\n\t/** Additional CLI arguments */\n\targs?: string[];\n\t/** Session-scoped variables passed to extensions via ctx.variables */\n\tvariables?: Record<string, string>;\n}\n\nexport interface ModelInfo {\n\tprovider: string;\n\tid: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\nexport type RpcEventListener = (event: AgentEvent) => void;\n\n// ============================================================================\n// RPC Client\n// ============================================================================\n\nexport class RpcClient {\n\tprivate process: ChildProcess | null = null;\n\tprivate stopReadingStdout: (() => void) | null = null;\n\tprivate eventListeners: RpcEventListener[] = [];\n\tprivate pendingRequests: Map<string, { resolve: (response: RpcResponse) => void; reject: (error: Error) => void }> =\n\t\tnew Map();\n\tprivate requestId = 0;\n\tprivate channelHandlers = new Map<string, Set<(data: unknown) => void>>();\n\tprivate remoteToolCallHandlers: Array<\n\t\t(call: { toolCallId: string; toolName: string; args: Record<string, unknown> }) => void\n\t> = [];\n\tprivate stderr = \"\";\n\tprivate readyResolve: (() => void) | null = null;\n\n\tconstructor(private options: RpcClientOptions = {}) {}\n\n\t/**\n\t * Start the RPC agent process.\n\t */\n\tasync start(): Promise<void> {\n\t\tif (this.process) {\n\t\t\tthrow new Error(\"Client already started\");\n\t\t}\n\n\t\tconst cliPath = this.options.cliPath ?? \"dist/cli.js\";\n\t\tconst args = [\"--mode\", \"rpc\"];\n\n\t\tif (this.options.provider) {\n\t\t\targs.push(\"--provider\", this.options.provider);\n\t\t}\n\t\tif (this.options.model) {\n\t\t\targs.push(\"--model\", this.options.model);\n\t\t}\n\t\tif (this.options.args) {\n\t\t\targs.push(...this.options.args);\n\t\t}\n\n\t\tconst mergedEnv: Record<string, string> = { ...process.env, ...this.options.env } as Record<string, string>;\n\t\tif (this.options.variables) {\n\t\t\tfor (const [key, value] of Object.entries(this.options.variables)) {\n\t\t\t\tmergedEnv[`PI_VARIABLE_${key.toUpperCase()}`] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis.process = spawn(\"node\", [cliPath, ...args], {\n\t\t\tcwd: this.options.cwd,\n\t\t\tenv: mergedEnv,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\t// Collect stderr for debugging\n\t\tthis.process.stderr?.on(\"data\", (data) => {\n\t\t\tthis.stderr += data.toString();\n\t\t\tprocess.stderr.write(data);\n\t\t});\n\n\t\t// Set up strict JSONL reader for stdout.\n\t\tthis.stopReadingStdout = attachJsonlLineReader(this.process.stdout!, (line) => {\n\t\t\tthis.handleLine(line);\n\t\t});\n\n\t\t// Wait for first stdout line (agent ready)\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tthis.readyResolve = resolve;\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.readyResolve = null;\n\t\t\t\treject(new Error(`Agent process did not become ready. Stderr: ${this.stderr}`));\n\t\t\t}, 15000);\n\t\t\tthis.readyResolve = () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t});\n\n\t\tif (this.process.exitCode !== null) {\n\t\t\tthrow new Error(`Agent process exited immediately with code ${this.process.exitCode}. Stderr: ${this.stderr}`);\n\t\t}\n\t}\n\n\t/**\n\t * Stop the RPC agent process.\n\t */\n\tasync stop(): Promise<void> {\n\t\tif (!this.process) return;\n\n\t\tthis.stopReadingStdout?.();\n\t\tthis.stopReadingStdout = null;\n\t\tthis.process.kill(\"SIGTERM\");\n\n\t\t// Wait for process to exit\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.process?.kill(\"SIGKILL\");\n\t\t\t\tresolve();\n\t\t\t}, 1000);\n\n\t\t\tthis.process?.on(\"exit\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tthis.process = null;\n\t\tthis.pendingRequests.clear();\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t */\n\tonEvent(listener: RpcEventListener): () => void {\n\t\tthis.eventListeners.push(listener);\n\t\treturn () => {\n\t\t\tconst index = this.eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Get collected stderr output (useful for debugging).\n\t */\n\tgetStderr(): string {\n\t\treturn this.stderr;\n\t}\n\n\t// =========================================================================\n\t// Command Methods\n\t// =========================================================================\n\n\t/**\n\t * Send a prompt to the agent.\n\t * Returns immediately after sending; use onEvent() to receive streaming events.\n\t * Use waitForIdle() to wait for completion.\n\t */\n\tasync prompt(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"prompt\", message, images });\n\t}\n\n\t/**\n\t * Queue a steering message to interrupt the agent mid-run.\n\t */\n\tasync steer(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"steer\", message, images });\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t */\n\tasync followUp(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"follow_up\", message, images });\n\t}\n\n\t/**\n\t * Abort current operation.\n\t */\n\tasync abort(): Promise<void> {\n\t\tawait this.send({ type: \"abort\" });\n\t}\n\n\t/**\n\t * Start a new session, optionally with parent tracking.\n\t * @param parentSession - Optional parent session path for lineage tracking\n\t * @returns Object with `cancelled: true` if an extension cancelled the new session\n\t */\n\tasync newSession(parentSession?: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"new_session\", parentSession });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get current session state.\n\t */\n\tasync getState(): Promise<RpcSessionState> {\n\t\tconst response = await this.send({ type: \"get_state\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set model by provider and ID.\n\t */\n\tasync setModel(provider: string, modelId: string): Promise<{ provider: string; id: string }> {\n\t\tconst response = await this.send({ type: \"set_model\", provider, modelId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Cycle to next model.\n\t */\n\tasync cycleModel(): Promise<{\n\t\tmodel: { provider: string; id: string };\n\t\tthinkingLevel: ThinkingLevel;\n\t\tisScoped: boolean;\n\t} | null> {\n\t\tconst response = await this.send({ type: \"cycle_model\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get list of available models.\n\t */\n\tasync getAvailableModels(): Promise<ModelInfo[]> {\n\t\tconst response = await this.send({ type: \"get_available_models\" });\n\t\treturn this.getData<{ models: ModelInfo[] }>(response).models;\n\t}\n\n\t/**\n\t * Set thinking level.\n\t */\n\tasync setThinkingLevel(level: ThinkingLevel): Promise<void> {\n\t\tawait this.send({ type: \"set_thinking_level\", level });\n\t}\n\n\t/**\n\t * Cycle thinking level.\n\t */\n\tasync cycleThinkingLevel(): Promise<{ level: ThinkingLevel } | null> {\n\t\tconst response = await this.send({ type: \"cycle_thinking_level\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set steering mode.\n\t */\n\tasync setSteeringMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_steering_mode\", mode });\n\t}\n\n\t/**\n\t * Set follow-up mode.\n\t */\n\tasync setFollowUpMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_follow_up_mode\", mode });\n\t}\n\n\t/**\n\t * Compact session context.\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tconst response = await this.send({ type: \"compact\", customInstructions });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set auto-compaction enabled/disabled.\n\t */\n\tasync setAutoCompaction(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_compaction\", enabled });\n\t}\n\n\t/**\n\t * Set auto-retry enabled/disabled.\n\t */\n\tasync setAutoRetry(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_retry\", enabled });\n\t}\n\n\t/**\n\t * Abort in-progress retry.\n\t */\n\tasync abortRetry(): Promise<void> {\n\t\tawait this.send({ type: \"abort_retry\" });\n\t}\n\n\t/**\n\t * Execute a bash command.\n\t */\n\tasync bash(command: string): Promise<BashResult> {\n\t\tconst response = await this.send({ type: \"bash\", command });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Abort running bash command.\n\t */\n\tasync abortBash(): Promise<void> {\n\t\tawait this.send({ type: \"abort_bash\" });\n\t}\n\n\t/**\n\t * Get session statistics.\n\t */\n\tasync getSessionStats(): Promise<SessionStats> {\n\t\tconst response = await this.send({ type: \"get_session_stats\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t */\n\tasync exportHtml(outputPath?: string): Promise<{ path: string }> {\n\t\tconst response = await this.send({ type: \"export_html\", outputPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Switch to a different session file.\n\t * @returns Object with `cancelled: true` if an extension cancelled the switch\n\t */\n\tasync switchSession(sessionPath: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"switch_session\", sessionPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Fork from a specific message.\n\t * @returns Object with `text` (the message text) and `cancelled` (if extension cancelled)\n\t */\n\tasync fork(entryId: string): Promise<{ text: string; cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"fork\", entryId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Clone the current active branch into a new session.\n\t * @returns Object with `cancelled: true` if an extension cancelled the clone\n\t */\n\tasync clone(): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"clone\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get messages available for forking.\n\t */\n\tasync getForkMessages(): Promise<Array<{ entryId: string; text: string }>> {\n\t\tconst response = await this.send({ type: \"get_fork_messages\" });\n\t\treturn this.getData<{ messages: Array<{ entryId: string; text: string }> }>(response).messages;\n\t}\n\n\t/**\n\t * Get text of last assistant message.\n\t */\n\tasync getLastAssistantText(): Promise<string | null> {\n\t\tconst response = await this.send({ type: \"get_last_assistant_text\" });\n\t\treturn this.getData<{ text: string | null }>(response).text;\n\t}\n\n\t/**\n\t * Set the session display name.\n\t */\n\tasync setSessionName(name: string): Promise<void> {\n\t\tawait this.send({ type: \"set_session_name\", name });\n\t}\n\n\t/**\n\t * Get all messages in the session.\n\t */\n\tasync getMessages(): Promise<AgentMessage[]> {\n\t\tconst response = await this.send({ type: \"get_messages\" });\n\t\treturn this.getData<{ messages: AgentMessage[] }>(response).messages;\n\t}\n\n\t/**\n\t * Get available commands (extension commands, prompt templates, skills).\n\t */\n\tasync getCommands(): Promise<RpcSlashCommand[]> {\n\t\tconst response = await this.send({ type: \"get_commands\" });\n\t\treturn this.getData<{ commands: RpcSlashCommand[] }>(response).commands;\n\t}\n\n\tasync getSkills(): Promise<RpcSkill[]> {\n\t\tconst response = await this.send({ type: \"get_skills\" });\n\t\treturn this.getData<{ skills: RpcSkill[] }>(response).skills;\n\t}\n\n\tasync getExtensions(): Promise<RpcExtension[]> {\n\t\tconst response = await this.send({ type: \"get_extensions\" });\n\t\treturn this.getData<{ extensions: RpcExtension[] }>(response).extensions;\n\t}\n\n\tasync getTools(): Promise<RpcTool[]> {\n\t\tconst response = await this.send({ type: \"get_tools\" });\n\t\treturn this.getData<{ tools: RpcTool[] }>(response).tools;\n\t}\n\n\tasync getSettings(scope?: \"global\" | \"project\"): Promise<Record<string, unknown>> {\n\t\tconst command: Record<string, unknown> = { type: \"get_settings\" };\n\t\tif (scope) command.scope = scope;\n\t\tconst response = await this.send(command as RpcCommandBody);\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync setSettings(settings: Record<string, unknown>, scope?: \"global\" | \"project\"): Promise<void> {\n\t\tconst command: Record<string, unknown> = { type: \"set_settings\", settings };\n\t\tif (scope) command.scope = scope;\n\t\tawait this.send(command as RpcCommandBody);\n\t}\n\n\tasync getContextUsage(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_context_usage\" });\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync getSystemPrompt(): Promise<{ systemPrompt: string; appendSystemPrompt?: string }> {\n\t\tconst response = await this.send({ type: \"get_system_prompt\" });\n\t\treturn this.getData<{ systemPrompt: string; appendSystemPrompt?: string }>(response);\n\t}\n\n\tasync getActiveTools(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_active_tools\" });\n\t\treturn this.getData<{ toolNames: string[] }>(response).toolNames;\n\t}\n\n\tasync setActiveTools(toolNames: string[]): Promise<void> {\n\t\tawait this.send({ type: \"set_active_tools\", toolNames });\n\t}\n\n\tasync getMcpServers(): Promise<Array<import(\"./rpc-types.js\").RpcMcpServer>> {\n\t\tconst response = await this.send({ type: \"get_mcp_servers\" });\n\t\treturn this.getData<{ servers: Array<import(\"./rpc-types.js\").RpcMcpServer> }>(response).servers;\n\t}\n\n\tasync getQueue(): Promise<{ steering: unknown[]; followUp: unknown[] }> {\n\t\tconst response = await this.send({ type: \"get_queue\" });\n\t\treturn this.getData<{ steering: unknown[]; followUp: unknown[] }>(response);\n\t}\n\n\tasync clearQueue(): Promise<{ steering: unknown[]; followUp: unknown[] }> {\n\t\tconst response = await this.send({ type: \"clear_queue\" });\n\t\treturn this.getData<{ steering: unknown[]; followUp: unknown[] }>(response);\n\t}\n\n\tasync getFlags(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_flags\" });\n\t\treturn this.getData<{ flags: Record<string, unknown> }>(response).flags;\n\t}\n\n\tasync getFlagValues(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_flag_values\" });\n\t\treturn this.getData<{ values: Record<string, unknown> }>(response).values;\n\t}\n\n\tasync setFlag(name: string, value: string | boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_flag\", name, value });\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait this.send({ type: \"reload\" });\n\t}\n\n\tasync getAgentsFiles(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_agents_files\" });\n\t\treturn this.getData<{ agentsFiles: string[] }>(response).agentsFiles;\n\t}\n\n\tasync setCwd(cwd: string): Promise<void> {\n\t\tawait this.send({ type: \"set_cwd\", cwd });\n\t}\n\n\tasync getFullMessages(options?: {\n\t\tlimit?: number;\n\t\tafterEntryId?: string;\n\t\tincludeUserMessages?: boolean;\n\t\tdirection?: \"asc\" | \"desc\";\n\t}): Promise<Record<string, unknown>> {\n\t\tconst command: Record<string, unknown> = { type: \"get_full_messages\" };\n\t\tif (options) Object.assign(command, options);\n\t\tconst response = await this.send(command as RpcCommandBody);\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync getTree(): Promise<{ entries: unknown[]; leafId: string }> {\n\t\tconst response = await this.send({ type: \"get_tree\" });\n\t\treturn this.getData<{ entries: unknown[]; leafId: string }>(response);\n\t}\n\n\tasync getTreeWithLeaf(): Promise<TreeWithLeaf> {\n\t\tconst response = await this.send({ type: \"get_tree_with_leaf\" });\n\t\treturn this.getData<TreeWithLeaf>(response);\n\t}\n\n\tasync getModifiedFiles(options?: {\n\t\tfromEntryId?: string;\n\t\ttoEntryId?: string;\n\t}): Promise<Array<{ path: string; status: \"added\" | \"modified\" | \"deleted\"; turnIndex: number; entryId: string }>> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_modified_files\",\n\t\t\tfromEntryId: options?.fromEntryId,\n\t\t\ttoEntryId: options?.toEntryId,\n\t\t});\n\t\treturn this.getData<{\n\t\t\tfiles: Array<{\n\t\t\t\tpath: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tturnIndex: number;\n\t\t\t\tentryId: string;\n\t\t\t}>;\n\t\t}>(response).files;\n\t}\n\n\tasync getFileDiff(options: { filePath: string; fromEntryId?: string; toEntryId?: string }): Promise<{\n\t\tpath: string;\n\t\toldContent: string | null;\n\t\tnewContent: string | null;\n\t\tunifiedDiff: string;\n\t} | null> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_file_diff\",\n\t\t\tfilePath: options.filePath,\n\t\t\tfromEntryId: options.fromEntryId,\n\t\t\ttoEntryId: options.toEntryId,\n\t\t});\n\t\tconst data = this.getData<{\n\t\t\tpath: string;\n\t\t\toldContent: string | null;\n\t\t\tnewContent: string | null;\n\t\t\tunifiedDiff: string;\n\t\t} | null>(response);\n\t\treturn data;\n\t}\n\n\tasync getBatchDiffs(options?: { fromEntryId?: string; toEntryId?: string }): Promise<{\n\t\tfiles: Array<{\n\t\t\tpath: string;\n\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\tdiff: {\n\t\t\t\tpath: string;\n\t\t\t\toldContent: string | null;\n\t\t\t\tnewContent: string | null;\n\t\t\t\tunifiedDiff: string;\n\t\t\t} | null;\n\t\t}>;\n\t\tsummary: { totalFiles: number; added: number; modified: number; deleted: number };\n\t}> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_batch_diffs\",\n\t\t\tfromEntryId: options?.fromEntryId,\n\t\t\ttoEntryId: options?.toEntryId,\n\t\t});\n\t\treturn this.getData<{\n\t\t\tfiles: Array<{\n\t\t\t\tpath: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tdiff: {\n\t\t\t\t\tpath: string;\n\t\t\t\t\toldContent: string | null;\n\t\t\t\t\tnewContent: string | null;\n\t\t\t\t\tunifiedDiff: string;\n\t\t\t\t} | null;\n\t\t\t}>;\n\t\t\tsummary: { totalFiles: number; added: number; modified: number; deleted: number };\n\t\t}>(response);\n\t}\n\n\tasync getFileHistory(options: { filePath: string }): Promise<{\n\t\thistory: Array<{\n\t\t\tentryId: string;\n\t\t\tturnIndex: number;\n\t\t\ttimestamp: string;\n\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\tsnapshotHash: string;\n\t\t\tpreviousHash: string | null;\n\t\t}>;\n\t}> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_file_history\",\n\t\t\tfilePath: options.filePath,\n\t\t});\n\t\treturn this.getData<{\n\t\t\thistory: Array<{\n\t\t\t\tentryId: string;\n\t\t\t\tturnIndex: number;\n\t\t\t\ttimestamp: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tsnapshotHash: string;\n\t\t\t\tpreviousHash: string | null;\n\t\t\t}>;\n\t\t}>(response);\n\t}\n\n\tonRemoteToolCall(\n\t\thandler: (call: { toolCallId: string; toolName: string; args: Record<string, unknown> }) => void,\n\t): () => void {\n\t\tthis.remoteToolCallHandlers.push(handler);\n\t\treturn () => {\n\t\t\tconst index = this.remoteToolCallHandlers.indexOf(handler);\n\t\t\tif (index !== -1) this.remoteToolCallHandlers.splice(index, 1);\n\t\t};\n\t}\n\n\tsendRemoteToolResult(\n\t\ttoolCallId: string,\n\t\tresult: { content: Array<{ type: string; text: string }>; isError: boolean },\n\t): void {\n\t\tthis.writeLine({ type: \"remote_tool_result\", toolCallId, result });\n\t}\n\n\trespondUI(requestId: string, response: Record<string, unknown>): void {\n\t\tthis.writeLine({ type: \"extension_ui_response\", id: requestId, ...response });\n\t}\n\n\t// =========================================================================\n\t// Helpers\n\t// =========================================================================\n\n\tchannel(name: string): Pick<Channel, \"name\" | \"send\" | \"onReceive\" | \"invoke\" | \"call\"> {\n\t\tconst invokeImpl = (data: unknown, timeoutMs: number = 30_000): Promise<unknown> => {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst invokeId = `inv_${randomUUID().slice(0, 8)}`;\n\t\t\t\tconst timer = setTimeout(() => {\n\t\t\t\t\treject(new Error(`Channel invoke \"${name}\" timed out after ${timeoutMs}ms`));\n\t\t\t\t}, timeoutMs);\n\n\t\t\t\tconst handler = (responseData: unknown) => {\n\t\t\t\t\tconst d = responseData as Record<string, unknown>;\n\t\t\t\t\tif (d && d.invokeId === invokeId) {\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\tconst handlers = this.channelHandlers.get(name);\n\t\t\t\t\t\tif (handlers) handlers.delete(handler);\n\t\t\t\t\t\tresolve(responseData);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tlet handlers = this.channelHandlers.get(name);\n\t\t\t\tif (!handlers) {\n\t\t\t\t\thandlers = new Set();\n\t\t\t\t\tthis.channelHandlers.set(name, handlers);\n\t\t\t\t}\n\t\t\t\thandlers.add(handler);\n\n\t\t\t\tthis.writeLine({\n\t\t\t\t\ttype: \"channel_data\",\n\t\t\t\t\tname,\n\t\t\t\t\tdata: { ...((data as Record<string, unknown>) ?? {}), invokeId },\n\t\t\t\t} as ChannelDataMessage);\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tname,\n\t\t\tsend: (data: unknown) => {\n\t\t\t\tthis.writeLine({ type: \"channel_data\", name, data } as ChannelDataMessage);\n\t\t\t},\n\t\t\tonReceive: (handler: (data: unknown) => void) => {\n\t\t\t\tlet handlers = this.channelHandlers.get(name);\n\t\t\t\tif (!handlers) {\n\t\t\t\t\thandlers = new Set();\n\t\t\t\t\tthis.channelHandlers.set(name, handlers);\n\t\t\t\t}\n\t\t\t\thandlers.add(handler);\n\t\t\t\treturn () => {\n\t\t\t\t\thandlers!.delete(handler);\n\t\t\t\t\tif (handlers!.size === 0) this.channelHandlers.delete(name);\n\t\t\t\t};\n\t\t\t},\n\t\t\tinvoke: invokeImpl,\n\t\t\tcall: (method: string, params: Record<string, unknown>, timeoutMs?: number) => {\n\t\t\t\tconst payload = { ...params, __call: method };\n\t\t\t\treturn invokeImpl(payload, timeoutMs ?? 30_000);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Wait for agent to become idle (no streaming).\n\t * Resolves when agent_end event is received.\n\t */\n\twaitForIdle(timeout = 60000): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Collect events until agent becomes idle.\n\t */\n\tcollectEvents(timeout = 60000): Promise<AgentEvent[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst events: AgentEvent[] = [];\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tevents.push(event);\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve(events);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Send prompt and wait for completion, returning all events.\n\t */\n\tasync promptAndWait(message: string, images?: ImageContent[], timeout = 60000): Promise<AgentEvent[]> {\n\t\tconst eventsPromise = this.collectEvents(timeout);\n\t\tawait this.prompt(message, images);\n\t\treturn eventsPromise;\n\t}\n\n\t// =========================================================================\n\t// Internal\n\t// =========================================================================\n\n\tprivate handleLine(line: string): void {\n\t\ttry {\n\t\t\tconst data = JSON.parse(line);\n\n\t\t\tif (this.readyResolve && data.type === \"ready\") {\n\t\t\t\tconst resolve = this.readyResolve;\n\t\t\t\tthis.readyResolve = null;\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's a response to a pending request\n\t\t\tif (data.type === \"response\" && data.id && this.pendingRequests.has(data.id)) {\n\t\t\t\tconst pending = this.pendingRequests.get(data.id)!;\n\t\t\t\tthis.pendingRequests.delete(data.id);\n\t\t\t\tpending.resolve(data as RpcResponse);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's channel data\n\t\t\tif (data.type === \"channel_data\" && data.name) {\n\t\t\t\tconst handlers = this.channelHandlers.get(data.name as string);\n\t\t\t\tif (handlers) {\n\t\t\t\t\tconst payload = data.data as Record<string, unknown> | undefined;\n\t\t\t\t\tconst invokeId = payload?.invokeId as string | undefined;\n\n\t\t\t\t\tfor (const handler of handlers) {\n\t\t\t\t\t\tconst result = handler(data.data);\n\t\t\t\t\t\tif (invokeId && result !== undefined) {\n\t\t\t\t\t\t\tthis.writeLine({\n\t\t\t\t\t\t\t\ttype: \"channel_data\",\n\t\t\t\t\t\t\t\tname: data.name,\n\t\t\t\t\t\t\t\tdata: { ...(typeof result === \"object\" ? result : { value: result }), invokeId },\n\t\t\t\t\t\t\t} as ChannelDataMessage);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's a remote tool call\n\t\t\tif (data.type === \"remote_tool_call\" && data.toolCallId && data.toolName) {\n\t\t\t\tfor (const handler of this.remoteToolCallHandlers) {\n\t\t\t\t\thandler({ toolCallId: data.toolCallId, toolName: data.toolName, args: data.args ?? {} });\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Otherwise it's an event\n\t\t\tfor (const listener of this.eventListeners) {\n\t\t\t\tlistener(data as AgentEvent);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore non-JSON lines\n\t\t}\n\t}\n\n\tprivate async send(command: RpcCommandBody): Promise<RpcResponse> {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\n\t\tconst id = `req_${++this.requestId}`;\n\t\tconst fullCommand = { ...command, id } as RpcCommand;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.pendingRequests.set(id, { resolve, reject });\n\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pendingRequests.delete(id);\n\t\t\t\treject(new Error(`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`));\n\t\t\t}, 30000);\n\n\t\t\tthis.pendingRequests.set(id, {\n\t\t\t\tresolve: (response) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve(response);\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.process!.stdin!.write(serializeJsonLine(fullCommand));\n\t\t});\n\t}\n\n\tprivate getData<T>(response: RpcResponse): T {\n\t\tif (!response.success) {\n\t\t\tconst errorResponse = response as Extract<RpcResponse, { success: false }>;\n\t\t\tthrow new Error(errorResponse.error);\n\t\t}\n\t\t// Type assertion: we trust response.data matches T based on the command sent.\n\t\t// This is safe because each public method specifies the correct T for its command.\n\t\tconst successResponse = response as Extract<RpcResponse, { success: true; data: unknown }>;\n\t\treturn successResponse.data as T;\n\t}\n\n\tprivate writeLine(obj: object): void {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\t\tthis.process.stdin.write(serializeJsonLine(obj));\n\t}\n}\n"]}
1
+ {"version":3,"file":"rpc-client.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC Client for programmatic access to the coding agent.\n *\n * Spawns the agent in RPC mode and provides a typed API for all operations.\n */\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentEvent, AgentMessage, ThinkingLevel } from \"@dyyz1993/pi-agent-core\";\nimport type { ImageContent } from \"@dyyz1993/pi-ai\";\nimport type { SessionStats } from \"../../core/agent-session.js\";\nimport type { BashResult } from \"../../core/bash-executor.js\";\nimport type { CompactionResult } from \"../../core/compaction/index.js\";\nimport type { Channel, ChannelDataMessage } from \"../../core/extensions/channel-types.js\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.js\";\nimport type { TreeWithLeaf } from \"./rpc-client-types.js\";\nimport type {\n\tRpcCommand,\n\tRpcExtension,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSkill,\n\tRpcSlashCommand,\n\tRpcTool,\n\tTreeEntry,\n} from \"./rpc-types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Distributive Omit that works with union types */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\n/** RpcCommand without the id field (for internal send) */\ntype RpcCommandBody = DistributiveOmit<RpcCommand, \"id\">;\n\nexport interface RpcClientOptions {\n\t/** Path to the CLI entry point (default: searches for dist/cli.js) */\n\tcliPath?: string;\n\t/** Working directory for the agent */\n\tcwd?: string;\n\t/** Environment variables */\n\tenv?: Record<string, string>;\n\t/** Provider to use */\n\tprovider?: string;\n\t/** Model ID to use */\n\tmodel?: string;\n\t/** Additional CLI arguments */\n\targs?: string[];\n\t/** Session-scoped variables passed to extensions via ctx.variables */\n\tvariables?: Record<string, string>;\n}\n\nexport interface ModelInfo {\n\tprovider: string;\n\tid: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\nexport type RpcEventListener = (event: AgentEvent) => void;\n\n// ============================================================================\n// RPC Client\n// ============================================================================\n\nexport class RpcClient {\n\tprivate process: ChildProcess | null = null;\n\tprivate stopReadingStdout: (() => void) | null = null;\n\tprivate eventListeners: RpcEventListener[] = [];\n\tprivate pendingRequests: Map<string, { resolve: (response: RpcResponse) => void; reject: (error: Error) => void }> =\n\t\tnew Map();\n\tprivate requestId = 0;\n\tprivate channelHandlers = new Map<string, Set<(data: unknown) => void>>();\n\tprivate remoteToolCallHandlers: Array<\n\t\t(call: { toolCallId: string; toolName: string; args: Record<string, unknown> }) => void\n\t> = [];\n\tprivate stderr = \"\";\n\tprivate readyResolve: (() => void) | null = null;\n\n\tconstructor(private options: RpcClientOptions = {}) {}\n\n\t/**\n\t * Start the RPC agent process.\n\t */\n\tasync start(): Promise<void> {\n\t\tif (this.process) {\n\t\t\tthrow new Error(\"Client already started\");\n\t\t}\n\n\t\tconst cliPath = this.options.cliPath ?? \"dist/cli.js\";\n\t\tconst args = [\"--mode\", \"rpc\"];\n\n\t\tif (this.options.provider) {\n\t\t\targs.push(\"--provider\", this.options.provider);\n\t\t}\n\t\tif (this.options.model) {\n\t\t\targs.push(\"--model\", this.options.model);\n\t\t}\n\t\tif (this.options.args) {\n\t\t\targs.push(...this.options.args);\n\t\t}\n\n\t\tconst mergedEnv: Record<string, string> = { ...process.env, ...this.options.env } as Record<string, string>;\n\t\tif (this.options.variables) {\n\t\t\tfor (const [key, value] of Object.entries(this.options.variables)) {\n\t\t\t\tmergedEnv[`PI_VARIABLE_${key.toUpperCase()}`] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis.process = spawn(\"node\", [cliPath, ...args], {\n\t\t\tcwd: this.options.cwd,\n\t\t\tenv: mergedEnv,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\t// Collect stderr for debugging\n\t\tthis.process.stderr?.on(\"data\", (data) => {\n\t\t\tthis.stderr += data.toString();\n\t\t\tprocess.stderr.write(data);\n\t\t});\n\n\t\t// Set up strict JSONL reader for stdout.\n\t\tthis.stopReadingStdout = attachJsonlLineReader(this.process.stdout!, (line) => {\n\t\t\tthis.handleLine(line);\n\t\t});\n\n\t\t// Wait for first stdout line (agent ready)\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tthis.readyResolve = resolve;\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.readyResolve = null;\n\t\t\t\treject(new Error(`Agent process did not become ready. Stderr: ${this.stderr}`));\n\t\t\t}, 15000);\n\t\t\tthis.readyResolve = () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t});\n\n\t\tif (this.process.exitCode !== null) {\n\t\t\tthrow new Error(`Agent process exited immediately with code ${this.process.exitCode}. Stderr: ${this.stderr}`);\n\t\t}\n\t}\n\n\t/**\n\t * Stop the RPC agent process.\n\t */\n\tasync stop(): Promise<void> {\n\t\tif (!this.process) return;\n\n\t\tthis.stopReadingStdout?.();\n\t\tthis.stopReadingStdout = null;\n\t\tthis.process.kill(\"SIGTERM\");\n\n\t\t// Wait for process to exit\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.process?.kill(\"SIGKILL\");\n\t\t\t\tresolve();\n\t\t\t}, 1000);\n\n\t\t\tthis.process?.on(\"exit\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tthis.process = null;\n\t\tthis.pendingRequests.clear();\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t */\n\tonEvent(listener: RpcEventListener): () => void {\n\t\tthis.eventListeners.push(listener);\n\t\treturn () => {\n\t\t\tconst index = this.eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Get collected stderr output (useful for debugging).\n\t */\n\tgetStderr(): string {\n\t\treturn this.stderr;\n\t}\n\n\t// =========================================================================\n\t// Command Methods\n\t// =========================================================================\n\n\t/**\n\t * Send a prompt to the agent.\n\t * Returns immediately after sending; use onEvent() to receive streaming events.\n\t * Use waitForIdle() to wait for completion.\n\t */\n\tasync prompt(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"prompt\", message, images });\n\t}\n\n\t/**\n\t * Queue a steering message to interrupt the agent mid-run.\n\t */\n\tasync steer(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"steer\", message, images });\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t */\n\tasync followUp(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"follow_up\", message, images });\n\t}\n\n\t/**\n\t * Abort current operation.\n\t */\n\tasync abort(): Promise<void> {\n\t\tawait this.send({ type: \"abort\" });\n\t}\n\n\t/**\n\t * Start a new session, optionally with parent tracking.\n\t * @param parentSession - Optional parent session path for lineage tracking\n\t * @returns Object with `cancelled: true` if an extension cancelled the new session\n\t */\n\tasync newSession(parentSession?: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"new_session\", parentSession });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get current session state.\n\t */\n\tasync getState(): Promise<RpcSessionState> {\n\t\tconst response = await this.send({ type: \"get_state\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set model by provider and ID.\n\t */\n\tasync setModel(provider: string, modelId: string): Promise<{ provider: string; id: string }> {\n\t\tconst response = await this.send({ type: \"set_model\", provider, modelId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Cycle to next model.\n\t */\n\tasync cycleModel(): Promise<{\n\t\tmodel: { provider: string; id: string };\n\t\tthinkingLevel: ThinkingLevel;\n\t\tisScoped: boolean;\n\t} | null> {\n\t\tconst response = await this.send({ type: \"cycle_model\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get list of available models.\n\t */\n\tasync getAvailableModels(): Promise<ModelInfo[]> {\n\t\tconst response = await this.send({ type: \"get_available_models\" });\n\t\treturn this.getData<{ models: ModelInfo[] }>(response).models;\n\t}\n\n\t/**\n\t * Set thinking level.\n\t */\n\tasync setThinkingLevel(level: ThinkingLevel): Promise<void> {\n\t\tawait this.send({ type: \"set_thinking_level\", level });\n\t}\n\n\t/**\n\t * Cycle thinking level.\n\t */\n\tasync cycleThinkingLevel(): Promise<{ level: ThinkingLevel } | null> {\n\t\tconst response = await this.send({ type: \"cycle_thinking_level\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set steering mode.\n\t */\n\tasync setSteeringMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_steering_mode\", mode });\n\t}\n\n\t/**\n\t * Set follow-up mode.\n\t */\n\tasync setFollowUpMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_follow_up_mode\", mode });\n\t}\n\n\t/**\n\t * Compact session context.\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tconst response = await this.send({ type: \"compact\", customInstructions });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set auto-compaction enabled/disabled.\n\t */\n\tasync setAutoCompaction(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_compaction\", enabled });\n\t}\n\n\t/**\n\t * Set auto-retry enabled/disabled.\n\t */\n\tasync setAutoRetry(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_retry\", enabled });\n\t}\n\n\t/**\n\t * Abort in-progress retry.\n\t */\n\tasync abortRetry(): Promise<void> {\n\t\tawait this.send({ type: \"abort_retry\" });\n\t}\n\n\t/**\n\t * Execute a bash command.\n\t */\n\tasync bash(command: string): Promise<BashResult> {\n\t\tconst response = await this.send({ type: \"bash\", command });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Abort running bash command.\n\t */\n\tasync abortBash(): Promise<void> {\n\t\tawait this.send({ type: \"abort_bash\" });\n\t}\n\n\t/**\n\t * Get session statistics.\n\t */\n\tasync getSessionStats(): Promise<SessionStats> {\n\t\tconst response = await this.send({ type: \"get_session_stats\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t */\n\tasync exportHtml(outputPath?: string): Promise<{ path: string }> {\n\t\tconst response = await this.send({ type: \"export_html\", outputPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Switch to a different session file.\n\t * @returns Object with `cancelled: true` if an extension cancelled the switch\n\t */\n\tasync switchSession(sessionPath: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"switch_session\", sessionPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Fork from a specific message.\n\t * @returns Object with `text` (the message text) and `cancelled` (if extension cancelled)\n\t */\n\tasync fork(entryId: string): Promise<{ text: string; cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"fork\", entryId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Clone the current active branch into a new session.\n\t * @returns Object with `cancelled: true` if an extension cancelled the clone\n\t */\n\tasync clone(): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"clone\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get messages available for forking.\n\t */\n\tasync getForkMessages(): Promise<Array<{ entryId: string; text: string }>> {\n\t\tconst response = await this.send({ type: \"get_fork_messages\" });\n\t\treturn this.getData<{ messages: Array<{ entryId: string; text: string }> }>(response).messages;\n\t}\n\n\t/**\n\t * Get text of last assistant message.\n\t */\n\tasync getLastAssistantText(): Promise<string | null> {\n\t\tconst response = await this.send({ type: \"get_last_assistant_text\" });\n\t\treturn this.getData<{ text: string | null }>(response).text;\n\t}\n\n\t/**\n\t * Set the session display name.\n\t */\n\tasync setSessionName(name: string): Promise<void> {\n\t\tawait this.send({ type: \"set_session_name\", name });\n\t}\n\n\t/**\n\t * Get all messages in the session.\n\t */\n\tasync getMessages(): Promise<AgentMessage[]> {\n\t\tconst response = await this.send({ type: \"get_messages\" });\n\t\treturn this.getData<{ messages: AgentMessage[] }>(response).messages;\n\t}\n\n\t/**\n\t * Get available commands (extension commands, prompt templates, skills).\n\t */\n\tasync getCommands(): Promise<RpcSlashCommand[]> {\n\t\tconst response = await this.send({ type: \"get_commands\" });\n\t\treturn this.getData<{ commands: RpcSlashCommand[] }>(response).commands;\n\t}\n\n\tasync getSkills(): Promise<RpcSkill[]> {\n\t\tconst response = await this.send({ type: \"get_skills\" });\n\t\treturn this.getData<{ skills: RpcSkill[] }>(response).skills;\n\t}\n\n\tasync getExtensions(): Promise<RpcExtension[]> {\n\t\tconst response = await this.send({ type: \"get_extensions\" });\n\t\treturn this.getData<{ extensions: RpcExtension[] }>(response).extensions;\n\t}\n\n\tasync getTools(): Promise<RpcTool[]> {\n\t\tconst response = await this.send({ type: \"get_tools\" });\n\t\treturn this.getData<{ tools: RpcTool[] }>(response).tools;\n\t}\n\n\tasync getSettings(scope?: \"global\" | \"project\"): Promise<Record<string, unknown>> {\n\t\tconst command: Record<string, unknown> = { type: \"get_settings\" };\n\t\tif (scope) command.scope = scope;\n\t\tconst response = await this.send(command as RpcCommandBody);\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync setSettings(settings: Record<string, unknown>, scope?: \"global\" | \"project\"): Promise<void> {\n\t\tconst command: Record<string, unknown> = { type: \"set_settings\", settings };\n\t\tif (scope) command.scope = scope;\n\t\tawait this.send(command as RpcCommandBody);\n\t}\n\n\tasync getContextUsage(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_context_usage\" });\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync getSystemPrompt(): Promise<{ systemPrompt: string; appendSystemPrompt?: string }> {\n\t\tconst response = await this.send({ type: \"get_system_prompt\" });\n\t\treturn this.getData<{ systemPrompt: string; appendSystemPrompt?: string }>(response);\n\t}\n\n\tasync getActiveTools(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_active_tools\" });\n\t\treturn this.getData<{ toolNames: string[] }>(response).toolNames;\n\t}\n\n\tasync setActiveTools(toolNames: string[]): Promise<void> {\n\t\tawait this.send({ type: \"set_active_tools\", toolNames });\n\t}\n\n\tasync getMcpServers(): Promise<Array<import(\"./rpc-types.js\").RpcMcpServer>> {\n\t\tconst response = await this.send({ type: \"get_mcp_servers\" });\n\t\treturn this.getData<{ servers: Array<import(\"./rpc-types.js\").RpcMcpServer> }>(response).servers;\n\t}\n\n\tasync toggleMcpServer(name: string, enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"mcp_toggle_server\", name, enabled });\n\t}\n\n\tasync restartMcpServer(name: string): Promise<void> {\n\t\tawait this.send({ type: \"mcp_restart_server\", name });\n\t}\n\n\tasync getQueue(): Promise<{ steering: unknown[]; followUp: unknown[] }> {\n\t\tconst response = await this.send({ type: \"get_queue\" });\n\t\treturn this.getData<{ steering: unknown[]; followUp: unknown[] }>(response);\n\t}\n\n\tasync clearQueue(): Promise<{ steering: unknown[]; followUp: unknown[] }> {\n\t\tconst response = await this.send({ type: \"clear_queue\" });\n\t\treturn this.getData<{ steering: unknown[]; followUp: unknown[] }>(response);\n\t}\n\n\tasync getFlags(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_flags\" });\n\t\treturn this.getData<{ flags: Record<string, unknown> }>(response).flags;\n\t}\n\n\tasync getFlagValues(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_flag_values\" });\n\t\treturn this.getData<{ values: Record<string, unknown> }>(response).values;\n\t}\n\n\tasync setFlag(name: string, value: string | boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_flag\", name, value });\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait this.send({ type: \"reload\" });\n\t}\n\n\tasync getAgentsFiles(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_agents_files\" });\n\t\treturn this.getData<{ agentsFiles: string[] }>(response).agentsFiles;\n\t}\n\n\tasync setCwd(cwd: string): Promise<void> {\n\t\tawait this.send({ type: \"set_cwd\", cwd });\n\t}\n\n\tasync getFullMessages(options?: {\n\t\tlimit?: number;\n\t\tafterEntryId?: string;\n\t\tincludeUserMessages?: boolean;\n\t\tdirection?: \"asc\" | \"desc\";\n\t}): Promise<Record<string, unknown>> {\n\t\tconst command: Record<string, unknown> = { type: \"get_full_messages\" };\n\t\tif (options) Object.assign(command, options);\n\t\tconst response = await this.send(command as RpcCommandBody);\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync getTree(): Promise<{ entries: unknown[]; leafId: string }> {\n\t\tconst response = await this.send({ type: \"get_tree\" });\n\t\treturn this.getData<{ entries: unknown[]; leafId: string }>(response);\n\t}\n\n\tasync getTreeWithLeaf(): Promise<TreeWithLeaf> {\n\t\tconst response = await this.send({ type: \"get_tree_with_leaf\" });\n\t\treturn this.getData<TreeWithLeaf>(response);\n\t}\n\n\tasync getModifiedFiles(options?: {\n\t\tfromEntryId?: string;\n\t\ttoEntryId?: string;\n\t}): Promise<Array<{ path: string; status: \"added\" | \"modified\" | \"deleted\"; turnIndex: number; entryId: string }>> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_modified_files\",\n\t\t\tfromEntryId: options?.fromEntryId,\n\t\t\ttoEntryId: options?.toEntryId,\n\t\t});\n\t\treturn this.getData<{\n\t\t\tfiles: Array<{\n\t\t\t\tpath: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tturnIndex: number;\n\t\t\t\tentryId: string;\n\t\t\t}>;\n\t\t}>(response).files;\n\t}\n\n\tasync getFileDiff(options: { filePath: string; fromEntryId?: string; toEntryId?: string }): Promise<{\n\t\tpath: string;\n\t\toldContent: string | null;\n\t\tnewContent: string | null;\n\t\tunifiedDiff: string;\n\t} | null> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_file_diff\",\n\t\t\tfilePath: options.filePath,\n\t\t\tfromEntryId: options.fromEntryId,\n\t\t\ttoEntryId: options.toEntryId,\n\t\t});\n\t\tconst data = this.getData<{\n\t\t\tpath: string;\n\t\t\toldContent: string | null;\n\t\t\tnewContent: string | null;\n\t\t\tunifiedDiff: string;\n\t\t} | null>(response);\n\t\treturn data;\n\t}\n\n\tasync getBatchDiffs(options?: { fromEntryId?: string; toEntryId?: string }): Promise<{\n\t\tfiles: Array<{\n\t\t\tpath: string;\n\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\tdiff: {\n\t\t\t\tpath: string;\n\t\t\t\toldContent: string | null;\n\t\t\t\tnewContent: string | null;\n\t\t\t\tunifiedDiff: string;\n\t\t\t} | null;\n\t\t}>;\n\t\tsummary: { totalFiles: number; added: number; modified: number; deleted: number };\n\t}> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_batch_diffs\",\n\t\t\tfromEntryId: options?.fromEntryId,\n\t\t\ttoEntryId: options?.toEntryId,\n\t\t});\n\t\treturn this.getData<{\n\t\t\tfiles: Array<{\n\t\t\t\tpath: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tdiff: {\n\t\t\t\t\tpath: string;\n\t\t\t\t\toldContent: string | null;\n\t\t\t\t\tnewContent: string | null;\n\t\t\t\t\tunifiedDiff: string;\n\t\t\t\t} | null;\n\t\t\t}>;\n\t\t\tsummary: { totalFiles: number; added: number; modified: number; deleted: number };\n\t\t}>(response);\n\t}\n\n\tasync getFileHistory(options: { filePath: string }): Promise<{\n\t\thistory: Array<{\n\t\t\tentryId: string;\n\t\t\tturnIndex: number;\n\t\t\ttimestamp: string;\n\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\tsnapshotHash: string;\n\t\t\tpreviousHash: string | null;\n\t\t}>;\n\t}> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_file_history\",\n\t\t\tfilePath: options.filePath,\n\t\t});\n\t\treturn this.getData<{\n\t\t\thistory: Array<{\n\t\t\t\tentryId: string;\n\t\t\t\tturnIndex: number;\n\t\t\t\ttimestamp: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tsnapshotHash: string;\n\t\t\t\tpreviousHash: string | null;\n\t\t\t}>;\n\t\t}>(response);\n\t}\n\n\tonRemoteToolCall(\n\t\thandler: (call: { toolCallId: string; toolName: string; args: Record<string, unknown> }) => void,\n\t): () => void {\n\t\tthis.remoteToolCallHandlers.push(handler);\n\t\treturn () => {\n\t\t\tconst index = this.remoteToolCallHandlers.indexOf(handler);\n\t\t\tif (index !== -1) this.remoteToolCallHandlers.splice(index, 1);\n\t\t};\n\t}\n\n\tsendRemoteToolResult(\n\t\ttoolCallId: string,\n\t\tresult: { content: Array<{ type: string; text: string }>; isError: boolean },\n\t): void {\n\t\tthis.writeLine({ type: \"remote_tool_result\", toolCallId, result });\n\t}\n\n\trespondUI(requestId: string, response: Record<string, unknown>): void {\n\t\tthis.writeLine({ type: \"extension_ui_response\", id: requestId, ...response });\n\t}\n\n\t// =========================================================================\n\t// Helpers\n\t// =========================================================================\n\n\tchannel(name: string): Pick<Channel, \"name\" | \"send\" | \"onReceive\" | \"invoke\" | \"call\"> {\n\t\tconst invokeImpl = (data: unknown, timeoutMs: number = 30_000): Promise<unknown> => {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst invokeId = `inv_${randomUUID().slice(0, 8)}`;\n\t\t\t\tconst timer = setTimeout(() => {\n\t\t\t\t\treject(new Error(`Channel invoke \"${name}\" timed out after ${timeoutMs}ms`));\n\t\t\t\t}, timeoutMs);\n\n\t\t\t\tconst handler = (responseData: unknown) => {\n\t\t\t\t\tconst d = responseData as Record<string, unknown>;\n\t\t\t\t\tif (d && d.invokeId === invokeId) {\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\tconst handlers = this.channelHandlers.get(name);\n\t\t\t\t\t\tif (handlers) handlers.delete(handler);\n\t\t\t\t\t\tresolve(responseData);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tlet handlers = this.channelHandlers.get(name);\n\t\t\t\tif (!handlers) {\n\t\t\t\t\thandlers = new Set();\n\t\t\t\t\tthis.channelHandlers.set(name, handlers);\n\t\t\t\t}\n\t\t\t\thandlers.add(handler);\n\n\t\t\t\tthis.writeLine({\n\t\t\t\t\ttype: \"channel_data\",\n\t\t\t\t\tname,\n\t\t\t\t\tdata: { ...((data as Record<string, unknown>) ?? {}), invokeId },\n\t\t\t\t} as ChannelDataMessage);\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tname,\n\t\t\tsend: (data: unknown) => {\n\t\t\t\tthis.writeLine({ type: \"channel_data\", name, data } as ChannelDataMessage);\n\t\t\t},\n\t\t\tonReceive: (handler: (data: unknown) => void) => {\n\t\t\t\tlet handlers = this.channelHandlers.get(name);\n\t\t\t\tif (!handlers) {\n\t\t\t\t\thandlers = new Set();\n\t\t\t\t\tthis.channelHandlers.set(name, handlers);\n\t\t\t\t}\n\t\t\t\thandlers.add(handler);\n\t\t\t\treturn () => {\n\t\t\t\t\thandlers!.delete(handler);\n\t\t\t\t\tif (handlers!.size === 0) this.channelHandlers.delete(name);\n\t\t\t\t};\n\t\t\t},\n\t\t\tinvoke: invokeImpl,\n\t\t\tcall: (method: string, params: Record<string, unknown>, timeoutMs?: number) => {\n\t\t\t\tconst payload = { ...params, __call: method };\n\t\t\t\treturn invokeImpl(payload, timeoutMs ?? 30_000);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Wait for agent to become idle (no streaming).\n\t * Resolves when agent_end event is received.\n\t */\n\twaitForIdle(timeout = 60000): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Collect events until agent becomes idle.\n\t */\n\tcollectEvents(timeout = 60000): Promise<AgentEvent[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst events: AgentEvent[] = [];\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tevents.push(event);\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve(events);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Send prompt and wait for completion, returning all events.\n\t */\n\tasync promptAndWait(message: string, images?: ImageContent[], timeout = 60000): Promise<AgentEvent[]> {\n\t\tconst eventsPromise = this.collectEvents(timeout);\n\t\tawait this.prompt(message, images);\n\t\treturn eventsPromise;\n\t}\n\n\t// =========================================================================\n\t// Internal\n\t// =========================================================================\n\n\tprivate handleLine(line: string): void {\n\t\ttry {\n\t\t\tconst data = JSON.parse(line);\n\n\t\t\tif (this.readyResolve && data.type === \"ready\") {\n\t\t\t\tconst resolve = this.readyResolve;\n\t\t\t\tthis.readyResolve = null;\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's a response to a pending request\n\t\t\tif (data.type === \"response\" && data.id && this.pendingRequests.has(data.id)) {\n\t\t\t\tconst pending = this.pendingRequests.get(data.id)!;\n\t\t\t\tthis.pendingRequests.delete(data.id);\n\t\t\t\tpending.resolve(data as RpcResponse);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's channel data\n\t\t\tif (data.type === \"channel_data\" && data.name) {\n\t\t\t\tconst handlers = this.channelHandlers.get(data.name as string);\n\t\t\t\tif (handlers) {\n\t\t\t\t\tconst payload = data.data as Record<string, unknown> | undefined;\n\t\t\t\t\tconst invokeId = payload?.invokeId as string | undefined;\n\n\t\t\t\t\tfor (const handler of handlers) {\n\t\t\t\t\t\tconst result = handler(data.data);\n\t\t\t\t\t\tif (invokeId && result !== undefined) {\n\t\t\t\t\t\t\tthis.writeLine({\n\t\t\t\t\t\t\t\ttype: \"channel_data\",\n\t\t\t\t\t\t\t\tname: data.name,\n\t\t\t\t\t\t\t\tdata: { ...(typeof result === \"object\" ? result : { value: result }), invokeId },\n\t\t\t\t\t\t\t} as ChannelDataMessage);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's a remote tool call\n\t\t\tif (data.type === \"remote_tool_call\" && data.toolCallId && data.toolName) {\n\t\t\t\tfor (const handler of this.remoteToolCallHandlers) {\n\t\t\t\t\thandler({ toolCallId: data.toolCallId, toolName: data.toolName, args: data.args ?? {} });\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Otherwise it's an event\n\t\t\tfor (const listener of this.eventListeners) {\n\t\t\t\tlistener(data as AgentEvent);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore non-JSON lines\n\t\t}\n\t}\n\n\tprivate async send(command: RpcCommandBody): Promise<RpcResponse> {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\n\t\tconst id = `req_${++this.requestId}`;\n\t\tconst fullCommand = { ...command, id } as RpcCommand;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.pendingRequests.set(id, { resolve, reject });\n\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pendingRequests.delete(id);\n\t\t\t\treject(new Error(`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`));\n\t\t\t}, 30000);\n\n\t\t\tthis.pendingRequests.set(id, {\n\t\t\t\tresolve: (response) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve(response);\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.process!.stdin!.write(serializeJsonLine(fullCommand));\n\t\t});\n\t}\n\n\tprivate getData<T>(response: RpcResponse): T {\n\t\tif (!response.success) {\n\t\t\tconst errorResponse = response as Extract<RpcResponse, { success: false }>;\n\t\t\tthrow new Error(errorResponse.error);\n\t\t}\n\t\t// Type assertion: we trust response.data matches T based on the command sent.\n\t\t// This is safe because each public method specifies the correct T for its command.\n\t\tconst successResponse = response as Extract<RpcResponse, { success: true; data: unknown }>;\n\t\treturn successResponse.data as T;\n\t}\n\n\tprivate writeLine(obj: object): void {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\t\tthis.process.stdin.write(serializeJsonLine(obj));\n\t}\n}\n"]}
@@ -363,6 +363,12 @@ export class RpcClient {
363
363
  const response = await this.send({ type: "get_mcp_servers" });
364
364
  return this.getData(response).servers;
365
365
  }
366
+ async toggleMcpServer(name, enabled) {
367
+ await this.send({ type: "mcp_toggle_server", name, enabled });
368
+ }
369
+ async restartMcpServer(name) {
370
+ await this.send({ type: "mcp_restart_server", name });
371
+ }
366
372
  async getQueue() {
367
373
  const response = await this.send({ type: "get_queue" });
368
374
  return this.getData(response);
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC Client for programmatic access to the coding agent.\n *\n * Spawns the agent in RPC mode and provides a typed API for all operations.\n */\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentEvent, AgentMessage, ThinkingLevel } from \"@dyyz1993/pi-agent-core\";\nimport type { ImageContent } from \"@dyyz1993/pi-ai\";\nimport type { SessionStats } from \"../../core/agent-session.js\";\nimport type { BashResult } from \"../../core/bash-executor.js\";\nimport type { CompactionResult } from \"../../core/compaction/index.js\";\nimport type { Channel, ChannelDataMessage } from \"../../core/extensions/channel-types.js\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.js\";\nimport type { TreeWithLeaf } from \"./rpc-client-types.js\";\nimport type {\n\tRpcCommand,\n\tRpcExtension,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSkill,\n\tRpcSlashCommand,\n\tRpcTool,\n\tTreeEntry,\n} from \"./rpc-types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Distributive Omit that works with union types */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\n/** RpcCommand without the id field (for internal send) */\ntype RpcCommandBody = DistributiveOmit<RpcCommand, \"id\">;\n\nexport interface RpcClientOptions {\n\t/** Path to the CLI entry point (default: searches for dist/cli.js) */\n\tcliPath?: string;\n\t/** Working directory for the agent */\n\tcwd?: string;\n\t/** Environment variables */\n\tenv?: Record<string, string>;\n\t/** Provider to use */\n\tprovider?: string;\n\t/** Model ID to use */\n\tmodel?: string;\n\t/** Additional CLI arguments */\n\targs?: string[];\n\t/** Session-scoped variables passed to extensions via ctx.variables */\n\tvariables?: Record<string, string>;\n}\n\nexport interface ModelInfo {\n\tprovider: string;\n\tid: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\nexport type RpcEventListener = (event: AgentEvent) => void;\n\n// ============================================================================\n// RPC Client\n// ============================================================================\n\nexport class RpcClient {\n\tprivate process: ChildProcess | null = null;\n\tprivate stopReadingStdout: (() => void) | null = null;\n\tprivate eventListeners: RpcEventListener[] = [];\n\tprivate pendingRequests: Map<string, { resolve: (response: RpcResponse) => void; reject: (error: Error) => void }> =\n\t\tnew Map();\n\tprivate requestId = 0;\n\tprivate channelHandlers = new Map<string, Set<(data: unknown) => void>>();\n\tprivate remoteToolCallHandlers: Array<\n\t\t(call: { toolCallId: string; toolName: string; args: Record<string, unknown> }) => void\n\t> = [];\n\tprivate stderr = \"\";\n\tprivate readyResolve: (() => void) | null = null;\n\n\tconstructor(private options: RpcClientOptions = {}) {}\n\n\t/**\n\t * Start the RPC agent process.\n\t */\n\tasync start(): Promise<void> {\n\t\tif (this.process) {\n\t\t\tthrow new Error(\"Client already started\");\n\t\t}\n\n\t\tconst cliPath = this.options.cliPath ?? \"dist/cli.js\";\n\t\tconst args = [\"--mode\", \"rpc\"];\n\n\t\tif (this.options.provider) {\n\t\t\targs.push(\"--provider\", this.options.provider);\n\t\t}\n\t\tif (this.options.model) {\n\t\t\targs.push(\"--model\", this.options.model);\n\t\t}\n\t\tif (this.options.args) {\n\t\t\targs.push(...this.options.args);\n\t\t}\n\n\t\tconst mergedEnv: Record<string, string> = { ...process.env, ...this.options.env } as Record<string, string>;\n\t\tif (this.options.variables) {\n\t\t\tfor (const [key, value] of Object.entries(this.options.variables)) {\n\t\t\t\tmergedEnv[`PI_VARIABLE_${key.toUpperCase()}`] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis.process = spawn(\"node\", [cliPath, ...args], {\n\t\t\tcwd: this.options.cwd,\n\t\t\tenv: mergedEnv,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\t// Collect stderr for debugging\n\t\tthis.process.stderr?.on(\"data\", (data) => {\n\t\t\tthis.stderr += data.toString();\n\t\t\tprocess.stderr.write(data);\n\t\t});\n\n\t\t// Set up strict JSONL reader for stdout.\n\t\tthis.stopReadingStdout = attachJsonlLineReader(this.process.stdout!, (line) => {\n\t\t\tthis.handleLine(line);\n\t\t});\n\n\t\t// Wait for first stdout line (agent ready)\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tthis.readyResolve = resolve;\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.readyResolve = null;\n\t\t\t\treject(new Error(`Agent process did not become ready. Stderr: ${this.stderr}`));\n\t\t\t}, 15000);\n\t\t\tthis.readyResolve = () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t});\n\n\t\tif (this.process.exitCode !== null) {\n\t\t\tthrow new Error(`Agent process exited immediately with code ${this.process.exitCode}. Stderr: ${this.stderr}`);\n\t\t}\n\t}\n\n\t/**\n\t * Stop the RPC agent process.\n\t */\n\tasync stop(): Promise<void> {\n\t\tif (!this.process) return;\n\n\t\tthis.stopReadingStdout?.();\n\t\tthis.stopReadingStdout = null;\n\t\tthis.process.kill(\"SIGTERM\");\n\n\t\t// Wait for process to exit\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.process?.kill(\"SIGKILL\");\n\t\t\t\tresolve();\n\t\t\t}, 1000);\n\n\t\t\tthis.process?.on(\"exit\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tthis.process = null;\n\t\tthis.pendingRequests.clear();\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t */\n\tonEvent(listener: RpcEventListener): () => void {\n\t\tthis.eventListeners.push(listener);\n\t\treturn () => {\n\t\t\tconst index = this.eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Get collected stderr output (useful for debugging).\n\t */\n\tgetStderr(): string {\n\t\treturn this.stderr;\n\t}\n\n\t// =========================================================================\n\t// Command Methods\n\t// =========================================================================\n\n\t/**\n\t * Send a prompt to the agent.\n\t * Returns immediately after sending; use onEvent() to receive streaming events.\n\t * Use waitForIdle() to wait for completion.\n\t */\n\tasync prompt(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"prompt\", message, images });\n\t}\n\n\t/**\n\t * Queue a steering message to interrupt the agent mid-run.\n\t */\n\tasync steer(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"steer\", message, images });\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t */\n\tasync followUp(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"follow_up\", message, images });\n\t}\n\n\t/**\n\t * Abort current operation.\n\t */\n\tasync abort(): Promise<void> {\n\t\tawait this.send({ type: \"abort\" });\n\t}\n\n\t/**\n\t * Start a new session, optionally with parent tracking.\n\t * @param parentSession - Optional parent session path for lineage tracking\n\t * @returns Object with `cancelled: true` if an extension cancelled the new session\n\t */\n\tasync newSession(parentSession?: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"new_session\", parentSession });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get current session state.\n\t */\n\tasync getState(): Promise<RpcSessionState> {\n\t\tconst response = await this.send({ type: \"get_state\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set model by provider and ID.\n\t */\n\tasync setModel(provider: string, modelId: string): Promise<{ provider: string; id: string }> {\n\t\tconst response = await this.send({ type: \"set_model\", provider, modelId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Cycle to next model.\n\t */\n\tasync cycleModel(): Promise<{\n\t\tmodel: { provider: string; id: string };\n\t\tthinkingLevel: ThinkingLevel;\n\t\tisScoped: boolean;\n\t} | null> {\n\t\tconst response = await this.send({ type: \"cycle_model\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get list of available models.\n\t */\n\tasync getAvailableModels(): Promise<ModelInfo[]> {\n\t\tconst response = await this.send({ type: \"get_available_models\" });\n\t\treturn this.getData<{ models: ModelInfo[] }>(response).models;\n\t}\n\n\t/**\n\t * Set thinking level.\n\t */\n\tasync setThinkingLevel(level: ThinkingLevel): Promise<void> {\n\t\tawait this.send({ type: \"set_thinking_level\", level });\n\t}\n\n\t/**\n\t * Cycle thinking level.\n\t */\n\tasync cycleThinkingLevel(): Promise<{ level: ThinkingLevel } | null> {\n\t\tconst response = await this.send({ type: \"cycle_thinking_level\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set steering mode.\n\t */\n\tasync setSteeringMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_steering_mode\", mode });\n\t}\n\n\t/**\n\t * Set follow-up mode.\n\t */\n\tasync setFollowUpMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_follow_up_mode\", mode });\n\t}\n\n\t/**\n\t * Compact session context.\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tconst response = await this.send({ type: \"compact\", customInstructions });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set auto-compaction enabled/disabled.\n\t */\n\tasync setAutoCompaction(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_compaction\", enabled });\n\t}\n\n\t/**\n\t * Set auto-retry enabled/disabled.\n\t */\n\tasync setAutoRetry(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_retry\", enabled });\n\t}\n\n\t/**\n\t * Abort in-progress retry.\n\t */\n\tasync abortRetry(): Promise<void> {\n\t\tawait this.send({ type: \"abort_retry\" });\n\t}\n\n\t/**\n\t * Execute a bash command.\n\t */\n\tasync bash(command: string): Promise<BashResult> {\n\t\tconst response = await this.send({ type: \"bash\", command });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Abort running bash command.\n\t */\n\tasync abortBash(): Promise<void> {\n\t\tawait this.send({ type: \"abort_bash\" });\n\t}\n\n\t/**\n\t * Get session statistics.\n\t */\n\tasync getSessionStats(): Promise<SessionStats> {\n\t\tconst response = await this.send({ type: \"get_session_stats\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t */\n\tasync exportHtml(outputPath?: string): Promise<{ path: string }> {\n\t\tconst response = await this.send({ type: \"export_html\", outputPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Switch to a different session file.\n\t * @returns Object with `cancelled: true` if an extension cancelled the switch\n\t */\n\tasync switchSession(sessionPath: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"switch_session\", sessionPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Fork from a specific message.\n\t * @returns Object with `text` (the message text) and `cancelled` (if extension cancelled)\n\t */\n\tasync fork(entryId: string): Promise<{ text: string; cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"fork\", entryId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Clone the current active branch into a new session.\n\t * @returns Object with `cancelled: true` if an extension cancelled the clone\n\t */\n\tasync clone(): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"clone\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get messages available for forking.\n\t */\n\tasync getForkMessages(): Promise<Array<{ entryId: string; text: string }>> {\n\t\tconst response = await this.send({ type: \"get_fork_messages\" });\n\t\treturn this.getData<{ messages: Array<{ entryId: string; text: string }> }>(response).messages;\n\t}\n\n\t/**\n\t * Get text of last assistant message.\n\t */\n\tasync getLastAssistantText(): Promise<string | null> {\n\t\tconst response = await this.send({ type: \"get_last_assistant_text\" });\n\t\treturn this.getData<{ text: string | null }>(response).text;\n\t}\n\n\t/**\n\t * Set the session display name.\n\t */\n\tasync setSessionName(name: string): Promise<void> {\n\t\tawait this.send({ type: \"set_session_name\", name });\n\t}\n\n\t/**\n\t * Get all messages in the session.\n\t */\n\tasync getMessages(): Promise<AgentMessage[]> {\n\t\tconst response = await this.send({ type: \"get_messages\" });\n\t\treturn this.getData<{ messages: AgentMessage[] }>(response).messages;\n\t}\n\n\t/**\n\t * Get available commands (extension commands, prompt templates, skills).\n\t */\n\tasync getCommands(): Promise<RpcSlashCommand[]> {\n\t\tconst response = await this.send({ type: \"get_commands\" });\n\t\treturn this.getData<{ commands: RpcSlashCommand[] }>(response).commands;\n\t}\n\n\tasync getSkills(): Promise<RpcSkill[]> {\n\t\tconst response = await this.send({ type: \"get_skills\" });\n\t\treturn this.getData<{ skills: RpcSkill[] }>(response).skills;\n\t}\n\n\tasync getExtensions(): Promise<RpcExtension[]> {\n\t\tconst response = await this.send({ type: \"get_extensions\" });\n\t\treturn this.getData<{ extensions: RpcExtension[] }>(response).extensions;\n\t}\n\n\tasync getTools(): Promise<RpcTool[]> {\n\t\tconst response = await this.send({ type: \"get_tools\" });\n\t\treturn this.getData<{ tools: RpcTool[] }>(response).tools;\n\t}\n\n\tasync getSettings(scope?: \"global\" | \"project\"): Promise<Record<string, unknown>> {\n\t\tconst command: Record<string, unknown> = { type: \"get_settings\" };\n\t\tif (scope) command.scope = scope;\n\t\tconst response = await this.send(command as RpcCommandBody);\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync setSettings(settings: Record<string, unknown>, scope?: \"global\" | \"project\"): Promise<void> {\n\t\tconst command: Record<string, unknown> = { type: \"set_settings\", settings };\n\t\tif (scope) command.scope = scope;\n\t\tawait this.send(command as RpcCommandBody);\n\t}\n\n\tasync getContextUsage(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_context_usage\" });\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync getSystemPrompt(): Promise<{ systemPrompt: string; appendSystemPrompt?: string }> {\n\t\tconst response = await this.send({ type: \"get_system_prompt\" });\n\t\treturn this.getData<{ systemPrompt: string; appendSystemPrompt?: string }>(response);\n\t}\n\n\tasync getActiveTools(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_active_tools\" });\n\t\treturn this.getData<{ toolNames: string[] }>(response).toolNames;\n\t}\n\n\tasync setActiveTools(toolNames: string[]): Promise<void> {\n\t\tawait this.send({ type: \"set_active_tools\", toolNames });\n\t}\n\n\tasync getMcpServers(): Promise<Array<import(\"./rpc-types.js\").RpcMcpServer>> {\n\t\tconst response = await this.send({ type: \"get_mcp_servers\" });\n\t\treturn this.getData<{ servers: Array<import(\"./rpc-types.js\").RpcMcpServer> }>(response).servers;\n\t}\n\n\tasync getQueue(): Promise<{ steering: unknown[]; followUp: unknown[] }> {\n\t\tconst response = await this.send({ type: \"get_queue\" });\n\t\treturn this.getData<{ steering: unknown[]; followUp: unknown[] }>(response);\n\t}\n\n\tasync clearQueue(): Promise<{ steering: unknown[]; followUp: unknown[] }> {\n\t\tconst response = await this.send({ type: \"clear_queue\" });\n\t\treturn this.getData<{ steering: unknown[]; followUp: unknown[] }>(response);\n\t}\n\n\tasync getFlags(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_flags\" });\n\t\treturn this.getData<{ flags: Record<string, unknown> }>(response).flags;\n\t}\n\n\tasync getFlagValues(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_flag_values\" });\n\t\treturn this.getData<{ values: Record<string, unknown> }>(response).values;\n\t}\n\n\tasync setFlag(name: string, value: string | boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_flag\", name, value });\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait this.send({ type: \"reload\" });\n\t}\n\n\tasync getAgentsFiles(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_agents_files\" });\n\t\treturn this.getData<{ agentsFiles: string[] }>(response).agentsFiles;\n\t}\n\n\tasync setCwd(cwd: string): Promise<void> {\n\t\tawait this.send({ type: \"set_cwd\", cwd });\n\t}\n\n\tasync getFullMessages(options?: {\n\t\tlimit?: number;\n\t\tafterEntryId?: string;\n\t\tincludeUserMessages?: boolean;\n\t\tdirection?: \"asc\" | \"desc\";\n\t}): Promise<Record<string, unknown>> {\n\t\tconst command: Record<string, unknown> = { type: \"get_full_messages\" };\n\t\tif (options) Object.assign(command, options);\n\t\tconst response = await this.send(command as RpcCommandBody);\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync getTree(): Promise<{ entries: unknown[]; leafId: string }> {\n\t\tconst response = await this.send({ type: \"get_tree\" });\n\t\treturn this.getData<{ entries: unknown[]; leafId: string }>(response);\n\t}\n\n\tasync getTreeWithLeaf(): Promise<TreeWithLeaf> {\n\t\tconst response = await this.send({ type: \"get_tree_with_leaf\" });\n\t\treturn this.getData<TreeWithLeaf>(response);\n\t}\n\n\tasync getModifiedFiles(options?: {\n\t\tfromEntryId?: string;\n\t\ttoEntryId?: string;\n\t}): Promise<Array<{ path: string; status: \"added\" | \"modified\" | \"deleted\"; turnIndex: number; entryId: string }>> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_modified_files\",\n\t\t\tfromEntryId: options?.fromEntryId,\n\t\t\ttoEntryId: options?.toEntryId,\n\t\t});\n\t\treturn this.getData<{\n\t\t\tfiles: Array<{\n\t\t\t\tpath: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tturnIndex: number;\n\t\t\t\tentryId: string;\n\t\t\t}>;\n\t\t}>(response).files;\n\t}\n\n\tasync getFileDiff(options: { filePath: string; fromEntryId?: string; toEntryId?: string }): Promise<{\n\t\tpath: string;\n\t\toldContent: string | null;\n\t\tnewContent: string | null;\n\t\tunifiedDiff: string;\n\t} | null> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_file_diff\",\n\t\t\tfilePath: options.filePath,\n\t\t\tfromEntryId: options.fromEntryId,\n\t\t\ttoEntryId: options.toEntryId,\n\t\t});\n\t\tconst data = this.getData<{\n\t\t\tpath: string;\n\t\t\toldContent: string | null;\n\t\t\tnewContent: string | null;\n\t\t\tunifiedDiff: string;\n\t\t} | null>(response);\n\t\treturn data;\n\t}\n\n\tasync getBatchDiffs(options?: { fromEntryId?: string; toEntryId?: string }): Promise<{\n\t\tfiles: Array<{\n\t\t\tpath: string;\n\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\tdiff: {\n\t\t\t\tpath: string;\n\t\t\t\toldContent: string | null;\n\t\t\t\tnewContent: string | null;\n\t\t\t\tunifiedDiff: string;\n\t\t\t} | null;\n\t\t}>;\n\t\tsummary: { totalFiles: number; added: number; modified: number; deleted: number };\n\t}> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_batch_diffs\",\n\t\t\tfromEntryId: options?.fromEntryId,\n\t\t\ttoEntryId: options?.toEntryId,\n\t\t});\n\t\treturn this.getData<{\n\t\t\tfiles: Array<{\n\t\t\t\tpath: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tdiff: {\n\t\t\t\t\tpath: string;\n\t\t\t\t\toldContent: string | null;\n\t\t\t\t\tnewContent: string | null;\n\t\t\t\t\tunifiedDiff: string;\n\t\t\t\t} | null;\n\t\t\t}>;\n\t\t\tsummary: { totalFiles: number; added: number; modified: number; deleted: number };\n\t\t}>(response);\n\t}\n\n\tasync getFileHistory(options: { filePath: string }): Promise<{\n\t\thistory: Array<{\n\t\t\tentryId: string;\n\t\t\tturnIndex: number;\n\t\t\ttimestamp: string;\n\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\tsnapshotHash: string;\n\t\t\tpreviousHash: string | null;\n\t\t}>;\n\t}> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_file_history\",\n\t\t\tfilePath: options.filePath,\n\t\t});\n\t\treturn this.getData<{\n\t\t\thistory: Array<{\n\t\t\t\tentryId: string;\n\t\t\t\tturnIndex: number;\n\t\t\t\ttimestamp: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tsnapshotHash: string;\n\t\t\t\tpreviousHash: string | null;\n\t\t\t}>;\n\t\t}>(response);\n\t}\n\n\tonRemoteToolCall(\n\t\thandler: (call: { toolCallId: string; toolName: string; args: Record<string, unknown> }) => void,\n\t): () => void {\n\t\tthis.remoteToolCallHandlers.push(handler);\n\t\treturn () => {\n\t\t\tconst index = this.remoteToolCallHandlers.indexOf(handler);\n\t\t\tif (index !== -1) this.remoteToolCallHandlers.splice(index, 1);\n\t\t};\n\t}\n\n\tsendRemoteToolResult(\n\t\ttoolCallId: string,\n\t\tresult: { content: Array<{ type: string; text: string }>; isError: boolean },\n\t): void {\n\t\tthis.writeLine({ type: \"remote_tool_result\", toolCallId, result });\n\t}\n\n\trespondUI(requestId: string, response: Record<string, unknown>): void {\n\t\tthis.writeLine({ type: \"extension_ui_response\", id: requestId, ...response });\n\t}\n\n\t// =========================================================================\n\t// Helpers\n\t// =========================================================================\n\n\tchannel(name: string): Pick<Channel, \"name\" | \"send\" | \"onReceive\" | \"invoke\" | \"call\"> {\n\t\tconst invokeImpl = (data: unknown, timeoutMs: number = 30_000): Promise<unknown> => {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst invokeId = `inv_${randomUUID().slice(0, 8)}`;\n\t\t\t\tconst timer = setTimeout(() => {\n\t\t\t\t\treject(new Error(`Channel invoke \"${name}\" timed out after ${timeoutMs}ms`));\n\t\t\t\t}, timeoutMs);\n\n\t\t\t\tconst handler = (responseData: unknown) => {\n\t\t\t\t\tconst d = responseData as Record<string, unknown>;\n\t\t\t\t\tif (d && d.invokeId === invokeId) {\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\tconst handlers = this.channelHandlers.get(name);\n\t\t\t\t\t\tif (handlers) handlers.delete(handler);\n\t\t\t\t\t\tresolve(responseData);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tlet handlers = this.channelHandlers.get(name);\n\t\t\t\tif (!handlers) {\n\t\t\t\t\thandlers = new Set();\n\t\t\t\t\tthis.channelHandlers.set(name, handlers);\n\t\t\t\t}\n\t\t\t\thandlers.add(handler);\n\n\t\t\t\tthis.writeLine({\n\t\t\t\t\ttype: \"channel_data\",\n\t\t\t\t\tname,\n\t\t\t\t\tdata: { ...((data as Record<string, unknown>) ?? {}), invokeId },\n\t\t\t\t} as ChannelDataMessage);\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tname,\n\t\t\tsend: (data: unknown) => {\n\t\t\t\tthis.writeLine({ type: \"channel_data\", name, data } as ChannelDataMessage);\n\t\t\t},\n\t\t\tonReceive: (handler: (data: unknown) => void) => {\n\t\t\t\tlet handlers = this.channelHandlers.get(name);\n\t\t\t\tif (!handlers) {\n\t\t\t\t\thandlers = new Set();\n\t\t\t\t\tthis.channelHandlers.set(name, handlers);\n\t\t\t\t}\n\t\t\t\thandlers.add(handler);\n\t\t\t\treturn () => {\n\t\t\t\t\thandlers!.delete(handler);\n\t\t\t\t\tif (handlers!.size === 0) this.channelHandlers.delete(name);\n\t\t\t\t};\n\t\t\t},\n\t\t\tinvoke: invokeImpl,\n\t\t\tcall: (method: string, params: Record<string, unknown>, timeoutMs?: number) => {\n\t\t\t\tconst payload = { ...params, __call: method };\n\t\t\t\treturn invokeImpl(payload, timeoutMs ?? 30_000);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Wait for agent to become idle (no streaming).\n\t * Resolves when agent_end event is received.\n\t */\n\twaitForIdle(timeout = 60000): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Collect events until agent becomes idle.\n\t */\n\tcollectEvents(timeout = 60000): Promise<AgentEvent[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst events: AgentEvent[] = [];\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tevents.push(event);\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve(events);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Send prompt and wait for completion, returning all events.\n\t */\n\tasync promptAndWait(message: string, images?: ImageContent[], timeout = 60000): Promise<AgentEvent[]> {\n\t\tconst eventsPromise = this.collectEvents(timeout);\n\t\tawait this.prompt(message, images);\n\t\treturn eventsPromise;\n\t}\n\n\t// =========================================================================\n\t// Internal\n\t// =========================================================================\n\n\tprivate handleLine(line: string): void {\n\t\ttry {\n\t\t\tconst data = JSON.parse(line);\n\n\t\t\tif (this.readyResolve && data.type === \"ready\") {\n\t\t\t\tconst resolve = this.readyResolve;\n\t\t\t\tthis.readyResolve = null;\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's a response to a pending request\n\t\t\tif (data.type === \"response\" && data.id && this.pendingRequests.has(data.id)) {\n\t\t\t\tconst pending = this.pendingRequests.get(data.id)!;\n\t\t\t\tthis.pendingRequests.delete(data.id);\n\t\t\t\tpending.resolve(data as RpcResponse);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's channel data\n\t\t\tif (data.type === \"channel_data\" && data.name) {\n\t\t\t\tconst handlers = this.channelHandlers.get(data.name as string);\n\t\t\t\tif (handlers) {\n\t\t\t\t\tconst payload = data.data as Record<string, unknown> | undefined;\n\t\t\t\t\tconst invokeId = payload?.invokeId as string | undefined;\n\n\t\t\t\t\tfor (const handler of handlers) {\n\t\t\t\t\t\tconst result = handler(data.data);\n\t\t\t\t\t\tif (invokeId && result !== undefined) {\n\t\t\t\t\t\t\tthis.writeLine({\n\t\t\t\t\t\t\t\ttype: \"channel_data\",\n\t\t\t\t\t\t\t\tname: data.name,\n\t\t\t\t\t\t\t\tdata: { ...(typeof result === \"object\" ? result : { value: result }), invokeId },\n\t\t\t\t\t\t\t} as ChannelDataMessage);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's a remote tool call\n\t\t\tif (data.type === \"remote_tool_call\" && data.toolCallId && data.toolName) {\n\t\t\t\tfor (const handler of this.remoteToolCallHandlers) {\n\t\t\t\t\thandler({ toolCallId: data.toolCallId, toolName: data.toolName, args: data.args ?? {} });\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Otherwise it's an event\n\t\t\tfor (const listener of this.eventListeners) {\n\t\t\t\tlistener(data as AgentEvent);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore non-JSON lines\n\t\t}\n\t}\n\n\tprivate async send(command: RpcCommandBody): Promise<RpcResponse> {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\n\t\tconst id = `req_${++this.requestId}`;\n\t\tconst fullCommand = { ...command, id } as RpcCommand;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.pendingRequests.set(id, { resolve, reject });\n\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pendingRequests.delete(id);\n\t\t\t\treject(new Error(`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`));\n\t\t\t}, 30000);\n\n\t\t\tthis.pendingRequests.set(id, {\n\t\t\t\tresolve: (response) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve(response);\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.process!.stdin!.write(serializeJsonLine(fullCommand));\n\t\t});\n\t}\n\n\tprivate getData<T>(response: RpcResponse): T {\n\t\tif (!response.success) {\n\t\t\tconst errorResponse = response as Extract<RpcResponse, { success: false }>;\n\t\t\tthrow new Error(errorResponse.error);\n\t\t}\n\t\t// Type assertion: we trust response.data matches T based on the command sent.\n\t\t// This is safe because each public method specifies the correct T for its command.\n\t\tconst successResponse = response as Extract<RpcResponse, { success: true; data: unknown }>;\n\t\treturn successResponse.data as T;\n\t}\n\n\tprivate writeLine(obj: object): void {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\t\tthis.process.stdin.write(serializeJsonLine(obj));\n\t}\n}\n"]}
1
+ {"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC Client for programmatic access to the coding agent.\n *\n * Spawns the agent in RPC mode and provides a typed API for all operations.\n */\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentEvent, AgentMessage, ThinkingLevel } from \"@dyyz1993/pi-agent-core\";\nimport type { ImageContent } from \"@dyyz1993/pi-ai\";\nimport type { SessionStats } from \"../../core/agent-session.js\";\nimport type { BashResult } from \"../../core/bash-executor.js\";\nimport type { CompactionResult } from \"../../core/compaction/index.js\";\nimport type { Channel, ChannelDataMessage } from \"../../core/extensions/channel-types.js\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.js\";\nimport type { TreeWithLeaf } from \"./rpc-client-types.js\";\nimport type {\n\tRpcCommand,\n\tRpcExtension,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSkill,\n\tRpcSlashCommand,\n\tRpcTool,\n\tTreeEntry,\n} from \"./rpc-types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Distributive Omit that works with union types */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\n/** RpcCommand without the id field (for internal send) */\ntype RpcCommandBody = DistributiveOmit<RpcCommand, \"id\">;\n\nexport interface RpcClientOptions {\n\t/** Path to the CLI entry point (default: searches for dist/cli.js) */\n\tcliPath?: string;\n\t/** Working directory for the agent */\n\tcwd?: string;\n\t/** Environment variables */\n\tenv?: Record<string, string>;\n\t/** Provider to use */\n\tprovider?: string;\n\t/** Model ID to use */\n\tmodel?: string;\n\t/** Additional CLI arguments */\n\targs?: string[];\n\t/** Session-scoped variables passed to extensions via ctx.variables */\n\tvariables?: Record<string, string>;\n}\n\nexport interface ModelInfo {\n\tprovider: string;\n\tid: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\nexport type RpcEventListener = (event: AgentEvent) => void;\n\n// ============================================================================\n// RPC Client\n// ============================================================================\n\nexport class RpcClient {\n\tprivate process: ChildProcess | null = null;\n\tprivate stopReadingStdout: (() => void) | null = null;\n\tprivate eventListeners: RpcEventListener[] = [];\n\tprivate pendingRequests: Map<string, { resolve: (response: RpcResponse) => void; reject: (error: Error) => void }> =\n\t\tnew Map();\n\tprivate requestId = 0;\n\tprivate channelHandlers = new Map<string, Set<(data: unknown) => void>>();\n\tprivate remoteToolCallHandlers: Array<\n\t\t(call: { toolCallId: string; toolName: string; args: Record<string, unknown> }) => void\n\t> = [];\n\tprivate stderr = \"\";\n\tprivate readyResolve: (() => void) | null = null;\n\n\tconstructor(private options: RpcClientOptions = {}) {}\n\n\t/**\n\t * Start the RPC agent process.\n\t */\n\tasync start(): Promise<void> {\n\t\tif (this.process) {\n\t\t\tthrow new Error(\"Client already started\");\n\t\t}\n\n\t\tconst cliPath = this.options.cliPath ?? \"dist/cli.js\";\n\t\tconst args = [\"--mode\", \"rpc\"];\n\n\t\tif (this.options.provider) {\n\t\t\targs.push(\"--provider\", this.options.provider);\n\t\t}\n\t\tif (this.options.model) {\n\t\t\targs.push(\"--model\", this.options.model);\n\t\t}\n\t\tif (this.options.args) {\n\t\t\targs.push(...this.options.args);\n\t\t}\n\n\t\tconst mergedEnv: Record<string, string> = { ...process.env, ...this.options.env } as Record<string, string>;\n\t\tif (this.options.variables) {\n\t\t\tfor (const [key, value] of Object.entries(this.options.variables)) {\n\t\t\t\tmergedEnv[`PI_VARIABLE_${key.toUpperCase()}`] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis.process = spawn(\"node\", [cliPath, ...args], {\n\t\t\tcwd: this.options.cwd,\n\t\t\tenv: mergedEnv,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\t// Collect stderr for debugging\n\t\tthis.process.stderr?.on(\"data\", (data) => {\n\t\t\tthis.stderr += data.toString();\n\t\t\tprocess.stderr.write(data);\n\t\t});\n\n\t\t// Set up strict JSONL reader for stdout.\n\t\tthis.stopReadingStdout = attachJsonlLineReader(this.process.stdout!, (line) => {\n\t\t\tthis.handleLine(line);\n\t\t});\n\n\t\t// Wait for first stdout line (agent ready)\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tthis.readyResolve = resolve;\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.readyResolve = null;\n\t\t\t\treject(new Error(`Agent process did not become ready. Stderr: ${this.stderr}`));\n\t\t\t}, 15000);\n\t\t\tthis.readyResolve = () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t});\n\n\t\tif (this.process.exitCode !== null) {\n\t\t\tthrow new Error(`Agent process exited immediately with code ${this.process.exitCode}. Stderr: ${this.stderr}`);\n\t\t}\n\t}\n\n\t/**\n\t * Stop the RPC agent process.\n\t */\n\tasync stop(): Promise<void> {\n\t\tif (!this.process) return;\n\n\t\tthis.stopReadingStdout?.();\n\t\tthis.stopReadingStdout = null;\n\t\tthis.process.kill(\"SIGTERM\");\n\n\t\t// Wait for process to exit\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.process?.kill(\"SIGKILL\");\n\t\t\t\tresolve();\n\t\t\t}, 1000);\n\n\t\t\tthis.process?.on(\"exit\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tthis.process = null;\n\t\tthis.pendingRequests.clear();\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t */\n\tonEvent(listener: RpcEventListener): () => void {\n\t\tthis.eventListeners.push(listener);\n\t\treturn () => {\n\t\t\tconst index = this.eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Get collected stderr output (useful for debugging).\n\t */\n\tgetStderr(): string {\n\t\treturn this.stderr;\n\t}\n\n\t// =========================================================================\n\t// Command Methods\n\t// =========================================================================\n\n\t/**\n\t * Send a prompt to the agent.\n\t * Returns immediately after sending; use onEvent() to receive streaming events.\n\t * Use waitForIdle() to wait for completion.\n\t */\n\tasync prompt(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"prompt\", message, images });\n\t}\n\n\t/**\n\t * Queue a steering message to interrupt the agent mid-run.\n\t */\n\tasync steer(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"steer\", message, images });\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t */\n\tasync followUp(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"follow_up\", message, images });\n\t}\n\n\t/**\n\t * Abort current operation.\n\t */\n\tasync abort(): Promise<void> {\n\t\tawait this.send({ type: \"abort\" });\n\t}\n\n\t/**\n\t * Start a new session, optionally with parent tracking.\n\t * @param parentSession - Optional parent session path for lineage tracking\n\t * @returns Object with `cancelled: true` if an extension cancelled the new session\n\t */\n\tasync newSession(parentSession?: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"new_session\", parentSession });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get current session state.\n\t */\n\tasync getState(): Promise<RpcSessionState> {\n\t\tconst response = await this.send({ type: \"get_state\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set model by provider and ID.\n\t */\n\tasync setModel(provider: string, modelId: string): Promise<{ provider: string; id: string }> {\n\t\tconst response = await this.send({ type: \"set_model\", provider, modelId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Cycle to next model.\n\t */\n\tasync cycleModel(): Promise<{\n\t\tmodel: { provider: string; id: string };\n\t\tthinkingLevel: ThinkingLevel;\n\t\tisScoped: boolean;\n\t} | null> {\n\t\tconst response = await this.send({ type: \"cycle_model\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get list of available models.\n\t */\n\tasync getAvailableModels(): Promise<ModelInfo[]> {\n\t\tconst response = await this.send({ type: \"get_available_models\" });\n\t\treturn this.getData<{ models: ModelInfo[] }>(response).models;\n\t}\n\n\t/**\n\t * Set thinking level.\n\t */\n\tasync setThinkingLevel(level: ThinkingLevel): Promise<void> {\n\t\tawait this.send({ type: \"set_thinking_level\", level });\n\t}\n\n\t/**\n\t * Cycle thinking level.\n\t */\n\tasync cycleThinkingLevel(): Promise<{ level: ThinkingLevel } | null> {\n\t\tconst response = await this.send({ type: \"cycle_thinking_level\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set steering mode.\n\t */\n\tasync setSteeringMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_steering_mode\", mode });\n\t}\n\n\t/**\n\t * Set follow-up mode.\n\t */\n\tasync setFollowUpMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_follow_up_mode\", mode });\n\t}\n\n\t/**\n\t * Compact session context.\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tconst response = await this.send({ type: \"compact\", customInstructions });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set auto-compaction enabled/disabled.\n\t */\n\tasync setAutoCompaction(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_compaction\", enabled });\n\t}\n\n\t/**\n\t * Set auto-retry enabled/disabled.\n\t */\n\tasync setAutoRetry(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_retry\", enabled });\n\t}\n\n\t/**\n\t * Abort in-progress retry.\n\t */\n\tasync abortRetry(): Promise<void> {\n\t\tawait this.send({ type: \"abort_retry\" });\n\t}\n\n\t/**\n\t * Execute a bash command.\n\t */\n\tasync bash(command: string): Promise<BashResult> {\n\t\tconst response = await this.send({ type: \"bash\", command });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Abort running bash command.\n\t */\n\tasync abortBash(): Promise<void> {\n\t\tawait this.send({ type: \"abort_bash\" });\n\t}\n\n\t/**\n\t * Get session statistics.\n\t */\n\tasync getSessionStats(): Promise<SessionStats> {\n\t\tconst response = await this.send({ type: \"get_session_stats\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t */\n\tasync exportHtml(outputPath?: string): Promise<{ path: string }> {\n\t\tconst response = await this.send({ type: \"export_html\", outputPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Switch to a different session file.\n\t * @returns Object with `cancelled: true` if an extension cancelled the switch\n\t */\n\tasync switchSession(sessionPath: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"switch_session\", sessionPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Fork from a specific message.\n\t * @returns Object with `text` (the message text) and `cancelled` (if extension cancelled)\n\t */\n\tasync fork(entryId: string): Promise<{ text: string; cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"fork\", entryId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Clone the current active branch into a new session.\n\t * @returns Object with `cancelled: true` if an extension cancelled the clone\n\t */\n\tasync clone(): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"clone\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get messages available for forking.\n\t */\n\tasync getForkMessages(): Promise<Array<{ entryId: string; text: string }>> {\n\t\tconst response = await this.send({ type: \"get_fork_messages\" });\n\t\treturn this.getData<{ messages: Array<{ entryId: string; text: string }> }>(response).messages;\n\t}\n\n\t/**\n\t * Get text of last assistant message.\n\t */\n\tasync getLastAssistantText(): Promise<string | null> {\n\t\tconst response = await this.send({ type: \"get_last_assistant_text\" });\n\t\treturn this.getData<{ text: string | null }>(response).text;\n\t}\n\n\t/**\n\t * Set the session display name.\n\t */\n\tasync setSessionName(name: string): Promise<void> {\n\t\tawait this.send({ type: \"set_session_name\", name });\n\t}\n\n\t/**\n\t * Get all messages in the session.\n\t */\n\tasync getMessages(): Promise<AgentMessage[]> {\n\t\tconst response = await this.send({ type: \"get_messages\" });\n\t\treturn this.getData<{ messages: AgentMessage[] }>(response).messages;\n\t}\n\n\t/**\n\t * Get available commands (extension commands, prompt templates, skills).\n\t */\n\tasync getCommands(): Promise<RpcSlashCommand[]> {\n\t\tconst response = await this.send({ type: \"get_commands\" });\n\t\treturn this.getData<{ commands: RpcSlashCommand[] }>(response).commands;\n\t}\n\n\tasync getSkills(): Promise<RpcSkill[]> {\n\t\tconst response = await this.send({ type: \"get_skills\" });\n\t\treturn this.getData<{ skills: RpcSkill[] }>(response).skills;\n\t}\n\n\tasync getExtensions(): Promise<RpcExtension[]> {\n\t\tconst response = await this.send({ type: \"get_extensions\" });\n\t\treturn this.getData<{ extensions: RpcExtension[] }>(response).extensions;\n\t}\n\n\tasync getTools(): Promise<RpcTool[]> {\n\t\tconst response = await this.send({ type: \"get_tools\" });\n\t\treturn this.getData<{ tools: RpcTool[] }>(response).tools;\n\t}\n\n\tasync getSettings(scope?: \"global\" | \"project\"): Promise<Record<string, unknown>> {\n\t\tconst command: Record<string, unknown> = { type: \"get_settings\" };\n\t\tif (scope) command.scope = scope;\n\t\tconst response = await this.send(command as RpcCommandBody);\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync setSettings(settings: Record<string, unknown>, scope?: \"global\" | \"project\"): Promise<void> {\n\t\tconst command: Record<string, unknown> = { type: \"set_settings\", settings };\n\t\tif (scope) command.scope = scope;\n\t\tawait this.send(command as RpcCommandBody);\n\t}\n\n\tasync getContextUsage(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_context_usage\" });\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync getSystemPrompt(): Promise<{ systemPrompt: string; appendSystemPrompt?: string }> {\n\t\tconst response = await this.send({ type: \"get_system_prompt\" });\n\t\treturn this.getData<{ systemPrompt: string; appendSystemPrompt?: string }>(response);\n\t}\n\n\tasync getActiveTools(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_active_tools\" });\n\t\treturn this.getData<{ toolNames: string[] }>(response).toolNames;\n\t}\n\n\tasync setActiveTools(toolNames: string[]): Promise<void> {\n\t\tawait this.send({ type: \"set_active_tools\", toolNames });\n\t}\n\n\tasync getMcpServers(): Promise<Array<import(\"./rpc-types.js\").RpcMcpServer>> {\n\t\tconst response = await this.send({ type: \"get_mcp_servers\" });\n\t\treturn this.getData<{ servers: Array<import(\"./rpc-types.js\").RpcMcpServer> }>(response).servers;\n\t}\n\n\tasync toggleMcpServer(name: string, enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"mcp_toggle_server\", name, enabled });\n\t}\n\n\tasync restartMcpServer(name: string): Promise<void> {\n\t\tawait this.send({ type: \"mcp_restart_server\", name });\n\t}\n\n\tasync getQueue(): Promise<{ steering: unknown[]; followUp: unknown[] }> {\n\t\tconst response = await this.send({ type: \"get_queue\" });\n\t\treturn this.getData<{ steering: unknown[]; followUp: unknown[] }>(response);\n\t}\n\n\tasync clearQueue(): Promise<{ steering: unknown[]; followUp: unknown[] }> {\n\t\tconst response = await this.send({ type: \"clear_queue\" });\n\t\treturn this.getData<{ steering: unknown[]; followUp: unknown[] }>(response);\n\t}\n\n\tasync getFlags(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_flags\" });\n\t\treturn this.getData<{ flags: Record<string, unknown> }>(response).flags;\n\t}\n\n\tasync getFlagValues(): Promise<Record<string, unknown>> {\n\t\tconst response = await this.send({ type: \"get_flag_values\" });\n\t\treturn this.getData<{ values: Record<string, unknown> }>(response).values;\n\t}\n\n\tasync setFlag(name: string, value: string | boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_flag\", name, value });\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait this.send({ type: \"reload\" });\n\t}\n\n\tasync getAgentsFiles(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_agents_files\" });\n\t\treturn this.getData<{ agentsFiles: string[] }>(response).agentsFiles;\n\t}\n\n\tasync setCwd(cwd: string): Promise<void> {\n\t\tawait this.send({ type: \"set_cwd\", cwd });\n\t}\n\n\tasync getFullMessages(options?: {\n\t\tlimit?: number;\n\t\tafterEntryId?: string;\n\t\tincludeUserMessages?: boolean;\n\t\tdirection?: \"asc\" | \"desc\";\n\t}): Promise<Record<string, unknown>> {\n\t\tconst command: Record<string, unknown> = { type: \"get_full_messages\" };\n\t\tif (options) Object.assign(command, options);\n\t\tconst response = await this.send(command as RpcCommandBody);\n\t\treturn this.getData<Record<string, unknown>>(response);\n\t}\n\n\tasync getTree(): Promise<{ entries: unknown[]; leafId: string }> {\n\t\tconst response = await this.send({ type: \"get_tree\" });\n\t\treturn this.getData<{ entries: unknown[]; leafId: string }>(response);\n\t}\n\n\tasync getTreeWithLeaf(): Promise<TreeWithLeaf> {\n\t\tconst response = await this.send({ type: \"get_tree_with_leaf\" });\n\t\treturn this.getData<TreeWithLeaf>(response);\n\t}\n\n\tasync getModifiedFiles(options?: {\n\t\tfromEntryId?: string;\n\t\ttoEntryId?: string;\n\t}): Promise<Array<{ path: string; status: \"added\" | \"modified\" | \"deleted\"; turnIndex: number; entryId: string }>> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_modified_files\",\n\t\t\tfromEntryId: options?.fromEntryId,\n\t\t\ttoEntryId: options?.toEntryId,\n\t\t});\n\t\treturn this.getData<{\n\t\t\tfiles: Array<{\n\t\t\t\tpath: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tturnIndex: number;\n\t\t\t\tentryId: string;\n\t\t\t}>;\n\t\t}>(response).files;\n\t}\n\n\tasync getFileDiff(options: { filePath: string; fromEntryId?: string; toEntryId?: string }): Promise<{\n\t\tpath: string;\n\t\toldContent: string | null;\n\t\tnewContent: string | null;\n\t\tunifiedDiff: string;\n\t} | null> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_file_diff\",\n\t\t\tfilePath: options.filePath,\n\t\t\tfromEntryId: options.fromEntryId,\n\t\t\ttoEntryId: options.toEntryId,\n\t\t});\n\t\tconst data = this.getData<{\n\t\t\tpath: string;\n\t\t\toldContent: string | null;\n\t\t\tnewContent: string | null;\n\t\t\tunifiedDiff: string;\n\t\t} | null>(response);\n\t\treturn data;\n\t}\n\n\tasync getBatchDiffs(options?: { fromEntryId?: string; toEntryId?: string }): Promise<{\n\t\tfiles: Array<{\n\t\t\tpath: string;\n\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\tdiff: {\n\t\t\t\tpath: string;\n\t\t\t\toldContent: string | null;\n\t\t\t\tnewContent: string | null;\n\t\t\t\tunifiedDiff: string;\n\t\t\t} | null;\n\t\t}>;\n\t\tsummary: { totalFiles: number; added: number; modified: number; deleted: number };\n\t}> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_batch_diffs\",\n\t\t\tfromEntryId: options?.fromEntryId,\n\t\t\ttoEntryId: options?.toEntryId,\n\t\t});\n\t\treturn this.getData<{\n\t\t\tfiles: Array<{\n\t\t\t\tpath: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tdiff: {\n\t\t\t\t\tpath: string;\n\t\t\t\t\toldContent: string | null;\n\t\t\t\t\tnewContent: string | null;\n\t\t\t\t\tunifiedDiff: string;\n\t\t\t\t} | null;\n\t\t\t}>;\n\t\t\tsummary: { totalFiles: number; added: number; modified: number; deleted: number };\n\t\t}>(response);\n\t}\n\n\tasync getFileHistory(options: { filePath: string }): Promise<{\n\t\thistory: Array<{\n\t\t\tentryId: string;\n\t\t\tturnIndex: number;\n\t\t\ttimestamp: string;\n\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\tsnapshotHash: string;\n\t\t\tpreviousHash: string | null;\n\t\t}>;\n\t}> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"get_file_history\",\n\t\t\tfilePath: options.filePath,\n\t\t});\n\t\treturn this.getData<{\n\t\t\thistory: Array<{\n\t\t\t\tentryId: string;\n\t\t\t\tturnIndex: number;\n\t\t\t\ttimestamp: string;\n\t\t\t\tstatus: \"added\" | \"modified\" | \"deleted\";\n\t\t\t\tsnapshotHash: string;\n\t\t\t\tpreviousHash: string | null;\n\t\t\t}>;\n\t\t}>(response);\n\t}\n\n\tonRemoteToolCall(\n\t\thandler: (call: { toolCallId: string; toolName: string; args: Record<string, unknown> }) => void,\n\t): () => void {\n\t\tthis.remoteToolCallHandlers.push(handler);\n\t\treturn () => {\n\t\t\tconst index = this.remoteToolCallHandlers.indexOf(handler);\n\t\t\tif (index !== -1) this.remoteToolCallHandlers.splice(index, 1);\n\t\t};\n\t}\n\n\tsendRemoteToolResult(\n\t\ttoolCallId: string,\n\t\tresult: { content: Array<{ type: string; text: string }>; isError: boolean },\n\t): void {\n\t\tthis.writeLine({ type: \"remote_tool_result\", toolCallId, result });\n\t}\n\n\trespondUI(requestId: string, response: Record<string, unknown>): void {\n\t\tthis.writeLine({ type: \"extension_ui_response\", id: requestId, ...response });\n\t}\n\n\t// =========================================================================\n\t// Helpers\n\t// =========================================================================\n\n\tchannel(name: string): Pick<Channel, \"name\" | \"send\" | \"onReceive\" | \"invoke\" | \"call\"> {\n\t\tconst invokeImpl = (data: unknown, timeoutMs: number = 30_000): Promise<unknown> => {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst invokeId = `inv_${randomUUID().slice(0, 8)}`;\n\t\t\t\tconst timer = setTimeout(() => {\n\t\t\t\t\treject(new Error(`Channel invoke \"${name}\" timed out after ${timeoutMs}ms`));\n\t\t\t\t}, timeoutMs);\n\n\t\t\t\tconst handler = (responseData: unknown) => {\n\t\t\t\t\tconst d = responseData as Record<string, unknown>;\n\t\t\t\t\tif (d && d.invokeId === invokeId) {\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\tconst handlers = this.channelHandlers.get(name);\n\t\t\t\t\t\tif (handlers) handlers.delete(handler);\n\t\t\t\t\t\tresolve(responseData);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tlet handlers = this.channelHandlers.get(name);\n\t\t\t\tif (!handlers) {\n\t\t\t\t\thandlers = new Set();\n\t\t\t\t\tthis.channelHandlers.set(name, handlers);\n\t\t\t\t}\n\t\t\t\thandlers.add(handler);\n\n\t\t\t\tthis.writeLine({\n\t\t\t\t\ttype: \"channel_data\",\n\t\t\t\t\tname,\n\t\t\t\t\tdata: { ...((data as Record<string, unknown>) ?? {}), invokeId },\n\t\t\t\t} as ChannelDataMessage);\n\t\t\t});\n\t\t};\n\n\t\treturn {\n\t\t\tname,\n\t\t\tsend: (data: unknown) => {\n\t\t\t\tthis.writeLine({ type: \"channel_data\", name, data } as ChannelDataMessage);\n\t\t\t},\n\t\t\tonReceive: (handler: (data: unknown) => void) => {\n\t\t\t\tlet handlers = this.channelHandlers.get(name);\n\t\t\t\tif (!handlers) {\n\t\t\t\t\thandlers = new Set();\n\t\t\t\t\tthis.channelHandlers.set(name, handlers);\n\t\t\t\t}\n\t\t\t\thandlers.add(handler);\n\t\t\t\treturn () => {\n\t\t\t\t\thandlers!.delete(handler);\n\t\t\t\t\tif (handlers!.size === 0) this.channelHandlers.delete(name);\n\t\t\t\t};\n\t\t\t},\n\t\t\tinvoke: invokeImpl,\n\t\t\tcall: (method: string, params: Record<string, unknown>, timeoutMs?: number) => {\n\t\t\t\tconst payload = { ...params, __call: method };\n\t\t\t\treturn invokeImpl(payload, timeoutMs ?? 30_000);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Wait for agent to become idle (no streaming).\n\t * Resolves when agent_end event is received.\n\t */\n\twaitForIdle(timeout = 60000): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Collect events until agent becomes idle.\n\t */\n\tcollectEvents(timeout = 60000): Promise<AgentEvent[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst events: AgentEvent[] = [];\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tevents.push(event);\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve(events);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Send prompt and wait for completion, returning all events.\n\t */\n\tasync promptAndWait(message: string, images?: ImageContent[], timeout = 60000): Promise<AgentEvent[]> {\n\t\tconst eventsPromise = this.collectEvents(timeout);\n\t\tawait this.prompt(message, images);\n\t\treturn eventsPromise;\n\t}\n\n\t// =========================================================================\n\t// Internal\n\t// =========================================================================\n\n\tprivate handleLine(line: string): void {\n\t\ttry {\n\t\t\tconst data = JSON.parse(line);\n\n\t\t\tif (this.readyResolve && data.type === \"ready\") {\n\t\t\t\tconst resolve = this.readyResolve;\n\t\t\t\tthis.readyResolve = null;\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's a response to a pending request\n\t\t\tif (data.type === \"response\" && data.id && this.pendingRequests.has(data.id)) {\n\t\t\t\tconst pending = this.pendingRequests.get(data.id)!;\n\t\t\t\tthis.pendingRequests.delete(data.id);\n\t\t\t\tpending.resolve(data as RpcResponse);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's channel data\n\t\t\tif (data.type === \"channel_data\" && data.name) {\n\t\t\t\tconst handlers = this.channelHandlers.get(data.name as string);\n\t\t\t\tif (handlers) {\n\t\t\t\t\tconst payload = data.data as Record<string, unknown> | undefined;\n\t\t\t\t\tconst invokeId = payload?.invokeId as string | undefined;\n\n\t\t\t\t\tfor (const handler of handlers) {\n\t\t\t\t\t\tconst result = handler(data.data);\n\t\t\t\t\t\tif (invokeId && result !== undefined) {\n\t\t\t\t\t\t\tthis.writeLine({\n\t\t\t\t\t\t\t\ttype: \"channel_data\",\n\t\t\t\t\t\t\t\tname: data.name,\n\t\t\t\t\t\t\t\tdata: { ...(typeof result === \"object\" ? result : { value: result }), invokeId },\n\t\t\t\t\t\t\t} as ChannelDataMessage);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if it's a remote tool call\n\t\t\tif (data.type === \"remote_tool_call\" && data.toolCallId && data.toolName) {\n\t\t\t\tfor (const handler of this.remoteToolCallHandlers) {\n\t\t\t\t\thandler({ toolCallId: data.toolCallId, toolName: data.toolName, args: data.args ?? {} });\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Otherwise it's an event\n\t\t\tfor (const listener of this.eventListeners) {\n\t\t\t\tlistener(data as AgentEvent);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore non-JSON lines\n\t\t}\n\t}\n\n\tprivate async send(command: RpcCommandBody): Promise<RpcResponse> {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\n\t\tconst id = `req_${++this.requestId}`;\n\t\tconst fullCommand = { ...command, id } as RpcCommand;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.pendingRequests.set(id, { resolve, reject });\n\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pendingRequests.delete(id);\n\t\t\t\treject(new Error(`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`));\n\t\t\t}, 30000);\n\n\t\t\tthis.pendingRequests.set(id, {\n\t\t\t\tresolve: (response) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve(response);\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.process!.stdin!.write(serializeJsonLine(fullCommand));\n\t\t});\n\t}\n\n\tprivate getData<T>(response: RpcResponse): T {\n\t\tif (!response.success) {\n\t\t\tconst errorResponse = response as Extract<RpcResponse, { success: false }>;\n\t\t\tthrow new Error(errorResponse.error);\n\t\t}\n\t\t// Type assertion: we trust response.data matches T based on the command sent.\n\t\t// This is safe because each public method specifies the correct T for its command.\n\t\tconst successResponse = response as Extract<RpcResponse, { success: true; data: unknown }>;\n\t\treturn successResponse.data as T;\n\t}\n\n\tprivate writeLine(obj: object): void {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\t\tthis.process.stdin.write(serializeJsonLine(obj));\n\t}\n}\n"]}