agi 0.2.2 → 0.4.0
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.
- package/LICENSE +21 -0
- package/README.md +536 -14
- package/dist/index.d.mts +1427 -0
- package/dist/index.d.ts +1427 -0
- package/dist/index.js +1742 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1723 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +76 -32
- package/LICENSE.pdf +0 -0
- package/scripts/install-dmg.js +0 -74
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/types/screenshot.ts","../src/context/session-context.ts","../src/utils.ts","../src/resources/sessions.ts","../src/client.ts","../src/loop.ts","../src/driver/binary.ts","../src/driver/protocol.ts","../src/driver/driver.ts"],"names":["createParser","__filename","fileURLToPath","__dirname","dirname","require","createRequire","os","platform","arch","join","delimiter","existsSync","EventEmitter","spawn","createInterface"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error classes for AGI SDK\n */\n\n/**\n * Base error class for all AGI API errors\n */\nexport class AGIError extends Error {\n constructor(\n message: string,\n public readonly statusCode?: number,\n public readonly response?: unknown\n ) {\n super(message);\n this.name = 'AGIError';\n Object.setPrototypeOf(this, AGIError.prototype);\n }\n}\n\n/**\n * Authentication error (401)\n */\nexport class AuthenticationError extends AGIError {\n constructor(message: string, response?: unknown) {\n super(message, 401, response);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\n/**\n * Not found error (404)\n */\nexport class NotFoundError extends AGIError {\n constructor(message: string, response?: unknown) {\n super(message, 404, response);\n this.name = 'NotFoundError';\n Object.setPrototypeOf(this, NotFoundError.prototype);\n }\n}\n\n/**\n * Rate limit error (429)\n */\nexport class RateLimitError extends AGIError {\n constructor(message: string, response?: unknown) {\n super(message, 429, response);\n this.name = 'RateLimitError';\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\n/**\n * Agent execution error (task failed)\n */\nexport class AgentExecutionError extends AGIError {\n constructor(message: string, response?: unknown) {\n super(message, undefined, response);\n this.name = 'AgentExecutionError';\n Object.setPrototypeOf(this, AgentExecutionError.prototype);\n }\n}\n\n/**\n * Validation error (422)\n */\nexport class ValidationError extends AGIError {\n constructor(message: string, response?: unknown) {\n super(message, 422, response);\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\n/**\n * Permission error (403)\n */\nexport class PermissionError extends AGIError {\n constructor(message: string, response?: unknown) {\n super(message, 403, response);\n this.name = 'PermissionError';\n Object.setPrototypeOf(this, PermissionError.prototype);\n }\n}\n\n/**\n * API error (5xx server errors)\n */\nexport class APIError extends AGIError {\n constructor(message: string, statusCode?: number, response?: unknown) {\n super(message, statusCode, response);\n this.name = 'APIError';\n Object.setPrototypeOf(this, APIError.prototype);\n }\n}\n","/**\n * HTTP client for AGI API with fetch and SSE support\n */\n\nimport { createParser, type EventSourceParser } from 'eventsource-parser';\nimport type { AGIClientOptions, EventType, SSEEvent } from './types';\nimport {\n AGIError,\n APIError,\n AuthenticationError,\n NotFoundError,\n PermissionError,\n RateLimitError,\n ValidationError,\n} from './errors';\n\nexport interface RequestOptions {\n json?: unknown;\n query?: Record<string, string>;\n headers?: Record<string, string>;\n}\n\nexport class HTTPClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n\n constructor(options: AGIClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? 'https://api.agi.tech';\n this.timeout = options.timeout ?? 60000;\n this.maxRetries = options.maxRetries ?? 3;\n }\n\n /**\n * Make an HTTP request with retries and error handling\n */\n async request<T>(method: string, path: string, options?: RequestOptions): Promise<T> {\n const url = this.buildUrl(path, options?.query);\n const headers = this.buildHeaders(options?.headers);\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method,\n headers,\n body: options?.json ? JSON.stringify(options.json) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Handle errors\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n // Parse JSON response\n const data = await response.json();\n return data as T;\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on client errors (4xx except 429)\n if (error instanceof AGIError && error.statusCode && error.statusCode < 500) {\n if (error.statusCode !== 429) {\n throw error;\n }\n }\n\n // Don't retry on abort/timeout on last attempt\n if (attempt === this.maxRetries) {\n break;\n }\n\n // Exponential backoff\n await this.sleep(Math.pow(2, attempt) * 1000);\n }\n }\n\n throw lastError || new AGIError('Request failed after retries');\n }\n\n /**\n * Make an HTTP request to an absolute URL with retries and error handling\n */\n async requestUrl<T>(method: string, url: string, options?: RequestOptions): Promise<T> {\n const headers = this.buildHeaders(options?.headers);\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method,\n headers,\n body: options?.json ? JSON.stringify(options.json) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Handle errors\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n // Parse JSON response\n const data = await response.json();\n return data as T;\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on client errors (4xx except 429)\n if (error instanceof AGIError && error.statusCode && error.statusCode < 500) {\n if (error.statusCode !== 429) {\n throw error;\n }\n }\n\n // Don't retry on abort/timeout on last attempt\n if (attempt === this.maxRetries) {\n break;\n }\n\n // Exponential backoff\n await this.sleep(Math.pow(2, attempt) * 1000);\n }\n }\n\n throw lastError || new AGIError('Request failed after retries');\n }\n\n /**\n * Stream Server-Sent Events from an endpoint\n */\n async *streamEvents(path: string, query?: Record<string, string>): AsyncGenerator<SSEEvent> {\n const url = this.buildUrl(path, query);\n const headers = this.buildHeaders();\n\n const controller = new AbortController();\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n ...headers,\n Accept: 'text/event-stream',\n },\n signal: controller.signal,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n if (!response.body) {\n throw new AGIError('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n const parser: EventSourceParser = createParser((event) => {\n if (event.type === 'event') {\n try {\n const data = JSON.parse(event.data);\n this.pendingEvents.push({\n id: event.id,\n event: event.event as EventType,\n data,\n });\n } catch {\n // Skip unparseable events\n }\n }\n });\n\n const pendingEvents: SSEEvent[] = [];\n this.pendingEvents = pendingEvents;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n parser.feed(buffer);\n buffer = '';\n\n // Yield all pending events\n while (pendingEvents.length > 0) {\n const event = pendingEvents.shift();\n if (event) {\n yield event;\n }\n }\n }\n } finally {\n controller.abort();\n reader.releaseLock();\n }\n }\n\n private pendingEvents: SSEEvent[] = [];\n\n private buildUrl(path: string, query?: Record<string, string>): string {\n const url = new URL(path, this.baseUrl);\n\n if (query) {\n Object.entries(query).forEach(([key, value]) => {\n url.searchParams.append(key, value);\n });\n }\n\n return url.toString();\n }\n\n private buildHeaders(additional?: Record<string, string>): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n 'User-Agent': 'agi-sdk-node/1.0.0',\n ...additional,\n };\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let errorData: Record<string, unknown> | string | undefined;\n\n // Read body as text first, then try to parse as JSON\n // This avoids the \"body already consumed\" error\n const text = await response.text();\n try {\n errorData = JSON.parse(text) as Record<string, unknown>;\n } catch {\n errorData = text;\n }\n\n const errorMessage =\n typeof errorData === 'object' && errorData.message\n ? errorData.message\n : typeof errorData === 'string'\n ? errorData\n : `HTTP ${response.status}: ${response.statusText}`;\n\n switch (response.status) {\n case 401:\n throw new AuthenticationError(`Authentication failed: ${errorMessage}`, errorData);\n case 403:\n throw new PermissionError(`Permission denied: ${errorMessage}`, errorData);\n case 404:\n throw new NotFoundError(`Resource not found: ${errorMessage}`, errorData);\n case 422:\n throw new ValidationError(`Validation error: ${errorMessage}`, errorData);\n case 429:\n throw new RateLimitError(`Rate limit exceeded: ${errorMessage}`, errorData);\n default:\n if (response.status >= 500) {\n throw new APIError(\n `Server error (${response.status}): ${errorMessage}`,\n response.status,\n errorData\n );\n }\n throw new AGIError(\n `API error (${response.status}): ${errorMessage}`,\n response.status,\n errorData\n );\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * Screenshot handling with image data and metadata\n */\n\n/**\n * Browser screenshot with decoded image data and metadata\n *\n * @example\n * ```typescript\n * const screenshot = await session.screenshot();\n * await screenshot.save(\"page.png\");\n * console.log(`Size: ${screenshot.width}x${screenshot.height}`);\n * console.log(`URL: ${screenshot.url}`);\n * ```\n */\nexport class Screenshot {\n constructor(\n public readonly data: Buffer,\n public readonly format: 'png' | 'jpg',\n public readonly timestamp: Date,\n public readonly width: number,\n public readonly height: number,\n public readonly url: string,\n public readonly title: string\n ) {}\n\n /**\n * Save screenshot to file\n *\n * @param path - File path to save to (e.g., \"screenshot.png\")\n *\n * @example\n * ```typescript\n * const screenshot = await session.screenshot();\n * await screenshot.save(\"amazon.png\");\n * ```\n */\n async save(path: string): Promise<void> {\n const fs = await import('fs/promises');\n await fs.writeFile(path, this.data);\n }\n\n /**\n * Create Screenshot from base64 data URL\n *\n * @param base64Data - Base64-encoded data URL (e.g., \"data:image/jpeg;base64,...\")\n * @param url - Current page URL\n * @param title - Current page title\n * @param timestamp - Screenshot timestamp (defaults to now)\n * @returns Screenshot instance with decoded image data\n */\n static fromBase64(base64Data: string, url: string, title: string, timestamp?: Date): Screenshot {\n // Parse data URL format: \"data:image/jpeg;base64,...\"\n let header: string;\n let encoded: string;\n\n if (base64Data.includes(',')) {\n [header, encoded] = base64Data.split(',', 2);\n } else {\n // Assume it's just base64 without header\n encoded = base64Data;\n header = 'data:image/png;base64';\n }\n\n // Decode base64 to buffer\n const imageData = Buffer.from(encoded, 'base64');\n\n // Determine format from header\n const format =\n header.toLowerCase().includes('jpeg') || header.toLowerCase().includes('jpg') ? 'jpg' : 'png';\n\n // Extract image dimensions\n const { width, height } = Screenshot.getImageDimensions(imageData, format);\n\n return new Screenshot(imageData, format, timestamp || new Date(), width, height, url, title);\n }\n\n /**\n * Extract width and height from image data\n *\n * @param data - Raw image bytes\n * @param format - Image format (png, jpg)\n * @returns Tuple of (width, height)\n */\n private static getImageDimensions(\n data: Buffer,\n format: 'png' | 'jpg'\n ): { width: number; height: number } {\n try {\n if (format === 'png' && data.length >= 24) {\n // PNG: width/height at bytes 16-24\n const width = data.readUInt32BE(16);\n const height = data.readUInt32BE(20);\n return { width, height };\n } else if (format === 'jpg') {\n // JPEG: scan for SOF0 marker (0xFFC0)\n for (let i = 0; i < data.length - 9; i++) {\n if (data[i] === 0xff && data[i + 1] === 0xc0) {\n const height = data.readUInt16BE(i + 5);\n const width = data.readUInt16BE(i + 7);\n return { width, height };\n }\n }\n }\n } catch (error) {\n // Fallback if parsing fails\n }\n\n return { width: 0, height: 0 };\n }\n}\n","/**\n * Session context manager for high-level API\n */\n\nimport type { AGIClient } from '../client';\nimport type {\n TaskResult,\n TaskMetadata,\n ExecuteStatusResponse,\n MessagesResponse,\n NavigateResponse,\n SSEEvent,\n SuccessResponse,\n} from '../types';\nimport { Screenshot } from '../types/screenshot';\nimport { AgentExecutionError } from '../errors';\n\n/**\n * High-level session context manager with automatic cleanup\n *\n * Use with `await using` for automatic session deletion:\n *\n * @example\n * ```typescript\n * await using session = client.session('agi-0');\n * const result = await session.runTask('Find flights...');\n * // Session automatically deleted\n * ```\n */\nexport class SessionContext {\n public sessionId?: string;\n public vncUrl?: string;\n public agentUrl?: string;\n\n constructor(\n private readonly client: AGIClient,\n private readonly agentName: string = 'agi-0',\n private readonly createOptions?: {\n webhookUrl?: string;\n goal?: string;\n maxSteps?: number;\n restoreFromEnvironmentId?: string;\n }\n ) {}\n\n /**\n * Automatic cleanup via explicit resource management\n */\n async [Symbol.asyncDispose](): Promise<void> {\n if (this.sessionId) {\n try {\n await this.client.sessions.delete(this.sessionId);\n } catch (error) {\n // Ignore cleanup errors\n }\n }\n }\n\n /**\n * Ensure session is created\n */\n private async ensureSession(): Promise<void> {\n if (this.sessionId) return;\n\n const response = await this.client.sessions.create(this.agentName, this.createOptions);\n this.sessionId = response.sessionId;\n this.vncUrl = response.vncUrl;\n this.agentUrl = response.agentUrl;\n }\n\n /**\n * Run a task and wait for completion using HTTP polling\n *\n * This method uses HTTP polling instead of SSE streaming for better reliability\n * with long-running tasks and network instability.\n *\n * @param task - Natural language task description\n * @param options - Task execution options\n * @returns TaskResult with data and execution metadata\n *\n * @example\n * ```typescript\n * const result = await session.runTask(\n * 'Find cheapest iPhone 15 Pro',\n * { timeout: 300000, pollInterval: 2000 } // 5 min timeout, 2s polling\n * );\n * console.log(result.data);\n * console.log(`Took ${result.metadata.duration}s, ${result.metadata.steps} steps`);\n * ```\n */\n async runTask(\n task: string,\n options?: {\n startUrl?: string;\n timeout?: number;\n pollInterval?: number;\n }\n ): Promise<TaskResult> {\n await this.ensureSession();\n if (!this.sessionId) throw new Error('Session not created');\n\n const timeout = options?.timeout ?? 600000; // 10 minutes\n const pollInterval = options?.pollInterval ?? 3000; // 3 seconds\n\n await this.client.sessions.sendMessage(this.sessionId, task, {\n startUrl: options?.startUrl,\n });\n\n const startTime = Date.now();\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const elapsed = Date.now() - startTime;\n\n if (elapsed > timeout) {\n throw new AgentExecutionError(\n `Task exceeded timeout of ${timeout}ms (elapsed: ${elapsed}ms)`\n );\n }\n\n const statusResponse = await this.client.sessions.getStatus(this.sessionId);\n\n if (statusResponse.status === 'finished' || statusResponse.status === 'waiting_for_input') {\n const messagesResponse = await this.client.sessions.getMessages(this.sessionId);\n const messages = messagesResponse.messages;\n\n const doneMsg = messages.find((msg) => msg.type === 'DONE' || msg.type === 'QUESTION');\n\n if (!doneMsg) {\n throw new AgentExecutionError(\n `Task status '${statusResponse.status}' but no DONE/QUESTION message found`\n );\n }\n\n const content = doneMsg.content;\n const data =\n typeof content === 'object' && content !== null ? content : { content: content ?? {} };\n\n const duration = (Date.now() - startTime) / 1000;\n const steps = messages.filter((msg) =>\n ['THOUGHT', 'QUESTION', 'DONE'].includes(msg.type)\n ).length;\n\n const metadata: TaskMetadata = {\n taskId: doneMsg.id,\n sessionId: this.sessionId,\n duration,\n cost: 0.0,\n timestamp: new Date(),\n steps,\n success: true,\n };\n\n return { data, metadata };\n }\n\n if (statusResponse.status === 'error') {\n const messagesResponse = await this.client.sessions.getMessages(this.sessionId);\n const errorMsg = messagesResponse.messages.find((msg) => msg.type === 'ERROR');\n const errorDetails = errorMsg\n ? typeof errorMsg.content === 'string'\n ? errorMsg.content\n : JSON.stringify(errorMsg.content)\n : 'Unknown error';\n\n throw new AgentExecutionError(`Task failed: ${errorDetails}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n }\n\n /**\n * Send a message to the agent\n *\n * @param message - Message content\n * @param options - Message options\n * @returns SuccessResponse confirming message was sent\n *\n * @example\n * ```typescript\n * await session.sendMessage('Find flights from SFO to JFK under $450');\n * ```\n */\n async sendMessage(\n message: string,\n options?: {\n startUrl?: string;\n configUpdates?: Record<string, unknown>;\n }\n ): Promise<SuccessResponse> {\n await this.ensureSession();\n if (!this.sessionId) throw new Error('Session not created');\n return this.client.sessions.sendMessage(this.sessionId, message, options);\n }\n\n /**\n * Get current execution status\n *\n * @returns ExecuteStatusResponse with status\n *\n * @example\n * ```typescript\n * const status = await session.getStatus();\n * console.log(status.status);\n * ```\n */\n async getStatus(): Promise<ExecuteStatusResponse> {\n await this.ensureSession();\n if (!this.sessionId) throw new Error('Session not created');\n return this.client.sessions.getStatus(this.sessionId);\n }\n\n /**\n * Get messages from the session\n *\n * @param afterId - Return messages with ID > afterId (for polling)\n * @param sanitize - Filter out system messages, prompts, and images\n * @returns MessagesResponse with messages list and status\n *\n * @example\n * ```typescript\n * const messages = await session.getMessages(0);\n * for (const msg of messages.messages) {\n * console.log(`[${msg.type}] ${msg.content}`);\n * }\n * ```\n */\n async getMessages(afterId?: number, sanitize: boolean = true): Promise<MessagesResponse> {\n await this.ensureSession();\n if (!this.sessionId) throw new Error('Session not created');\n return this.client.sessions.getMessages(this.sessionId, afterId, sanitize);\n }\n\n /**\n * Stream real-time events from the session via Server-Sent Events\n *\n * @param options - Stream options\n * @yields SSEEvent objects\n *\n * @example\n * ```typescript\n * for await (const event of session.streamEvents()) {\n * if (event.event === 'thought') {\n * console.log('Agent:', event.data);\n * }\n * if (event.event === 'done') {\n * console.log('Result:', event.data);\n * break;\n * }\n * }\n * ```\n */\n async *streamEvents(options?: {\n eventTypes?: string[];\n sanitize?: boolean;\n includeHistory?: boolean;\n }): AsyncGenerator<SSEEvent> {\n await this.ensureSession();\n if (!this.sessionId) throw new Error('Session not created');\n yield* this.client.sessions.streamEvents(this.sessionId, options);\n }\n\n /**\n * Pause task execution\n *\n * @returns SuccessResponse confirming pause\n *\n * @example\n * ```typescript\n * await session.pause();\n * ```\n */\n async pause(): Promise<SuccessResponse> {\n await this.ensureSession();\n if (!this.sessionId) throw new Error('Session not created');\n return this.client.sessions.pause(this.sessionId);\n }\n\n /**\n * Resume paused task\n *\n * @returns SuccessResponse confirming resume\n *\n * @example\n * ```typescript\n * await session.resume();\n * ```\n */\n async resume(): Promise<SuccessResponse> {\n await this.ensureSession();\n if (!this.sessionId) throw new Error('Session not created');\n return this.client.sessions.resume(this.sessionId);\n }\n\n /**\n * Cancel task execution\n *\n * @returns SuccessResponse confirming cancellation\n *\n * @example\n * ```typescript\n * await session.cancel();\n * ```\n */\n async cancel(): Promise<SuccessResponse> {\n await this.ensureSession();\n if (!this.sessionId) throw new Error('Session not created');\n return this.client.sessions.cancel(this.sessionId);\n }\n\n /**\n * Navigate browser to URL\n *\n * @param url - URL to navigate to\n * @returns NavigateResponse with current URL\n *\n * @example\n * ```typescript\n * await session.navigate('https://amazon.com');\n * ```\n */\n async navigate(url: string): Promise<NavigateResponse> {\n await this.ensureSession();\n if (!this.sessionId) throw new Error('Session not created');\n return this.client.sessions.navigate(this.sessionId, url);\n }\n\n /**\n * Get browser screenshot\n *\n * @returns Screenshot with decoded image data and save() method\n *\n * @example\n * ```typescript\n * const screenshot = await session.screenshot();\n * await screenshot.save('page.png');\n * console.log(`Size: ${screenshot.width}x${screenshot.height}`);\n * ```\n */\n async screenshot(): Promise<Screenshot> {\n await this.ensureSession();\n if (!this.sessionId) throw new Error('Session not created');\n const response = await this.client.sessions.screenshot(this.sessionId);\n return Screenshot.fromBase64(response.screenshot, response.url, response.title);\n }\n}\n","/**\n * Utility functions for the AGI SDK\n */\n\nimport type { SessionResponse, SessionStatus } from './types';\n\n/**\n * Get value from object supporting both snake_case and camelCase\n */\nexport function getField<T>(\n obj: Record<string, unknown>,\n camelCase: string,\n snakeCase: string\n): T | undefined {\n return (obj[snakeCase] ?? obj[camelCase]) as T | undefined;\n}\n\n/**\n * Normalize API response from snake_case to camelCase for SessionResponse\n */\nexport function normalizeSessionResponse(data: Record<string, unknown>): SessionResponse {\n return {\n sessionId: (data.session_id ?? data.sessionId) as string,\n vncUrl: (data.vnc_url ?? data.vncUrl) as string,\n agentUrl: (data.agent_url ?? data.agentUrl) as string | undefined,\n agentName: (data.agent_name ?? data.agentName) as string,\n status: data.status as SessionStatus,\n createdAt: (data.created_at ?? data.createdAt) as string,\n environmentId: (data.environment_id ?? data.environmentId) as string | undefined,\n goal: data.goal as string | undefined,\n agentSessionType: (data.agent_session_type ?? data.agentSessionType) as string | undefined,\n };\n}\n","/**\n * Sessions API resource\n */\n\nimport type { HTTPClient } from '../http';\nimport type {\n SessionResponse,\n ExecuteStatusResponse,\n MessagesResponse,\n SuccessResponse,\n DeleteResponse,\n NavigateResponse,\n ScreenshotResponse,\n SSEEvent,\n SnapshotMode,\n StepDesktopResponse,\n ModelsResponse,\n} from '../types';\nimport { normalizeSessionResponse } from '../utils';\n\n/**\n * Sessions API resource providing all session-related operations\n */\nexport class SessionsResource {\n constructor(private readonly http: HTTPClient) {}\n\n // ===== SESSION MANAGEMENT =====\n\n /**\n * Create a new agent session\n *\n * @param agentName - Agent model to use (e.g., \"agi-0\", \"agi-2-claude\")\n * @param options - Session creation options\n * @returns SessionResponse with sessionId, vncUrl, agentUrl, status, etc.\n *\n * @example\n * ```typescript\n * // Standard browser session\n * const session = await client.sessions.create('agi-0', {\n * webhookUrl: 'https://yourapp.com/webhook',\n * maxSteps: 200\n * });\n *\n * // Desktop session (client-managed)\n * const session = await client.sessions.create('agi-2-claude', {\n * agentSessionType: 'desktop',\n * goal: 'Open calculator and compute 2+2'\n * });\n * console.log(session.agentUrl); // Use with client.desktop.step()\n * ```\n */\n async create(\n agentName: string = 'agi-0',\n options?: {\n webhookUrl?: string;\n goal?: string;\n maxSteps?: number;\n restoreFromEnvironmentId?: string;\n agentSessionType?: string;\n cdpUrl?: string;\n }\n ): Promise<SessionResponse> {\n const payload: Record<string, unknown> = {\n agent_name: agentName,\n max_steps: options?.maxSteps ?? 100,\n };\n\n if (options?.webhookUrl) payload.webhook_url = options.webhookUrl;\n if (options?.goal) payload.goal = options.goal;\n if (options?.restoreFromEnvironmentId) {\n payload.restore_from_environment_id = options.restoreFromEnvironmentId;\n }\n if (options?.agentSessionType) {\n payload.agent_session_type = options.agentSessionType;\n }\n if (options?.cdpUrl) payload.cdp_url = options.cdpUrl;\n\n const response = await this.http.request<Record<string, unknown>>('POST', '/v1/sessions', {\n json: payload,\n });\n\n return normalizeSessionResponse(response);\n }\n\n /**\n * List all sessions for the authenticated user\n *\n * @returns Array of SessionResponse objects\n *\n * @example\n * ```typescript\n * const sessions = await client.sessions.list();\n * for (const session of sessions) {\n * console.log(`${session.sessionId}: ${session.status}`);\n * }\n * ```\n */\n async list(): Promise<SessionResponse[]> {\n const responses = await this.http.request<Array<Record<string, unknown>>>(\n 'GET',\n '/v1/sessions'\n );\n return responses.map(normalizeSessionResponse);\n }\n\n /**\n * Get details for a specific session\n *\n * @param sessionId - Session UUID\n * @returns SessionResponse with session details\n *\n * @example\n * ```typescript\n * const session = await client.sessions.get('session-uuid');\n * console.log(session.status);\n * ```\n */\n async get(sessionId: string): Promise<SessionResponse> {\n const response = await this.http.request<Record<string, unknown>>(\n 'GET',\n `/v1/sessions/${sessionId}`\n );\n return normalizeSessionResponse(response);\n }\n\n /**\n * Delete a session and cleanup its resources\n *\n * @param sessionId - Session UUID\n * @param saveSnapshotMode - Snapshot mode: \"none\", \"memory\", or \"filesystem\"\n * @returns DeleteResponse confirming deletion\n *\n * @example\n * ```typescript\n * await client.sessions.delete('session-uuid', 'filesystem');\n * ```\n */\n async delete(\n sessionId: string,\n saveSnapshotMode: SnapshotMode = 'none'\n ): Promise<DeleteResponse> {\n return this.http.request<DeleteResponse>('DELETE', `/v1/sessions/${sessionId}`, {\n query: { save_snapshot_mode: saveSnapshotMode },\n });\n }\n\n /**\n * Delete all sessions for the authenticated user\n *\n * @returns DeleteResponse with count of deleted sessions\n *\n * @example\n * ```typescript\n * const result = await client.sessions.deleteAll();\n * console.log(result.message);\n * ```\n */\n async deleteAll(): Promise<DeleteResponse> {\n return this.http.request<DeleteResponse>('DELETE', '/v1/sessions');\n }\n\n // ===== AGENT INTERACTION =====\n\n /**\n * Send a message to the agent to start a task or respond to questions\n *\n * @param sessionId - Session UUID\n * @param message - Message content (task instruction or response)\n * @param options - Message options\n * @returns SuccessResponse confirming message was sent\n *\n * @example\n * ```typescript\n * await client.sessions.sendMessage(\n * 'session-uuid',\n * 'Find flights from SFO to JFK under $450'\n * );\n * ```\n */\n async sendMessage(\n sessionId: string,\n message: string,\n options?: {\n startUrl?: string;\n configUpdates?: Record<string, unknown>;\n }\n ): Promise<SuccessResponse> {\n return this.http.request<SuccessResponse>('POST', `/v1/sessions/${sessionId}/message`, {\n json: {\n message,\n start_url: options?.startUrl,\n config_updates: options?.configUpdates,\n },\n });\n }\n\n /**\n * Get the current execution status of a session\n *\n * @param sessionId - Session UUID\n * @returns ExecuteStatusResponse with status\n *\n * @example\n * ```typescript\n * const status = await client.sessions.getStatus('session-uuid');\n * if (status.status === 'finished') {\n * console.log('Task completed!');\n * }\n * ```\n */\n async getStatus(sessionId: string): Promise<ExecuteStatusResponse> {\n return this.http.request<ExecuteStatusResponse>('GET', `/v1/sessions/${sessionId}/status`);\n }\n\n /**\n * Poll for messages and updates from the agent\n *\n * @param sessionId - Session UUID\n * @param afterId - Return messages with ID > afterId (for polling)\n * @param sanitize - Filter out system messages, prompts, and images\n * @returns MessagesResponse with messages list and status\n *\n * @example\n * ```typescript\n * const messages = await client.sessions.getMessages('session-uuid', 0);\n * for (const msg of messages.messages) {\n * console.log(`[${msg.type}] ${msg.content}`);\n * }\n * ```\n */\n async getMessages(\n sessionId: string,\n afterId: number = 0,\n sanitize: boolean = true\n ): Promise<MessagesResponse> {\n const response = await this.http.request<Record<string, unknown>>(\n 'GET',\n `/v1/sessions/${sessionId}/messages`,\n {\n query: {\n after_id: String(afterId),\n sanitize: String(sanitize),\n },\n }\n );\n\n return {\n messages: (response.messages || []) as MessagesResponse['messages'],\n status: response.status as string,\n hasAgent: (response.has_agent ?? response.hasAgent ?? false) as boolean,\n };\n }\n\n /**\n * Stream real-time events from the session via Server-Sent Events\n *\n * @param sessionId - Session UUID\n * @param options - Stream options\n * @yields SSEEvent objects\n *\n * @example\n * ```typescript\n * for await (const event of client.sessions.streamEvents('session-uuid')) {\n * if (event.event === 'thought') {\n * console.log('Agent:', event.data);\n * }\n * if (event.event === 'done') {\n * console.log('Result:', event.data);\n * break;\n * }\n * }\n * ```\n */\n async *streamEvents(\n sessionId: string,\n options?: {\n eventTypes?: string[];\n sanitize?: boolean;\n includeHistory?: boolean;\n }\n ): AsyncGenerator<SSEEvent> {\n const query: Record<string, string> = {\n sanitize: String(options?.sanitize ?? true),\n include_history: String(options?.includeHistory ?? true),\n };\n\n if (options?.eventTypes) {\n query.event_types = options.eventTypes.join(',');\n }\n\n yield* this.http.streamEvents(`/v1/sessions/${sessionId}/events`, query);\n }\n\n // ===== SESSION CONTROL =====\n\n /**\n * Temporarily pause task execution\n *\n * @param sessionId - Session UUID\n * @returns SuccessResponse confirming pause\n *\n * @example\n * ```typescript\n * await client.sessions.pause('session-uuid');\n * ```\n */\n async pause(sessionId: string): Promise<SuccessResponse> {\n return this.http.request<SuccessResponse>('POST', `/v1/sessions/${sessionId}/pause`);\n }\n\n /**\n * Resume a paused task\n *\n * @param sessionId - Session UUID\n * @returns SuccessResponse confirming resume\n *\n * @example\n * ```typescript\n * await client.sessions.resume('session-uuid');\n * ```\n */\n async resume(sessionId: string): Promise<SuccessResponse> {\n return this.http.request<SuccessResponse>('POST', `/v1/sessions/${sessionId}/resume`);\n }\n\n /**\n * Cancel task execution\n *\n * @param sessionId - Session UUID\n * @returns SuccessResponse confirming cancellation\n *\n * @example\n * ```typescript\n * await client.sessions.cancel('session-uuid');\n * ```\n */\n async cancel(sessionId: string): Promise<SuccessResponse> {\n return this.http.request<SuccessResponse>('POST', `/v1/sessions/${sessionId}/cancel`);\n }\n\n // ===== BROWSER CONTROL =====\n\n /**\n * Navigate the browser to a specific URL\n *\n * @param sessionId - Session UUID\n * @param url - URL to navigate to\n * @returns NavigateResponse with current URL\n *\n * @example\n * ```typescript\n * await client.sessions.navigate('session-uuid', 'https://amazon.com');\n * ```\n */\n async navigate(sessionId: string, url: string): Promise<NavigateResponse> {\n const response = await this.http.request<Record<string, unknown>>(\n 'POST',\n `/v1/sessions/${sessionId}/navigate`,\n {\n json: { url },\n }\n );\n\n return {\n currentUrl: (response.current_url ?? response.currentUrl) as string,\n };\n }\n\n /**\n * Get a screenshot of the browser\n *\n * @param sessionId - Session UUID\n * @returns ScreenshotResponse with base64-encoded image, URL, and title\n *\n * @example\n * ```typescript\n * const screenshot = await client.sessions.screenshot('session-uuid');\n * console.log(screenshot.url);\n * ```\n */\n async screenshot(sessionId: string): Promise<ScreenshotResponse> {\n return this.http.request<ScreenshotResponse>('GET', `/v1/sessions/${sessionId}/screenshot`);\n }\n\n // ===== CLIENT-DRIVEN SESSION CONTROL =====\n\n /**\n * Execute a single step for client-driven sessions (desktop mode).\n *\n * In desktop mode (agentSessionType=\"desktop\"), the client manages the\n * execution loop. This method sends a screenshot to the agent and receives\n * actions to execute locally.\n *\n * @param agentUrl - Agent service URL from session.agentUrl\n * @param sessionId - Session ID (required for routing in shared sandbox)\n * @param screenshot - Base64-encoded screenshot (full resolution, JPEG or PNG)\n * @param message - Optional user message (goal on first call, or follow-up instruction)\n * @returns StepDesktopResponse with actions, thinking, finished, askUser, and step\n *\n * @example\n * ```typescript\n * // Create a desktop session\n * const session = await client.sessions.create('agi-2-claude', {\n * agentSessionType: 'desktop',\n * goal: 'Open calculator and compute 2+2'\n * });\n *\n * // Client-managed loop\n * let finished = false;\n * while (!finished) {\n * const screenshot = captureScreenshot(); // Client captures\n * const result = await client.sessions.step(\n * session.agentUrl!,\n * session.sessionId,\n * screenshot\n * );\n * executeActions(result.actions); // Client executes\n * finished = result.finished;\n * if (result.askUser) {\n * const answer = await promptUser(result.askUser);\n * // Send answer in next step\n * }\n * }\n * ```\n */\n async step(\n agentUrl: string,\n sessionId: string,\n screenshot: string,\n message?: string\n ): Promise<StepDesktopResponse> {\n const url = `${agentUrl.replace(/\\/$/, '')}/step_desktop`;\n const payload: Record<string, unknown> = { screenshot, session_id: sessionId };\n\n if (message !== undefined) {\n payload.message = message;\n }\n\n const response = await this.http.requestUrl<Record<string, unknown>>('POST', url, {\n json: payload,\n });\n\n return {\n actions: (response.actions || []) as StepDesktopResponse['actions'],\n thinking: response.thinking as string | undefined,\n finished: (response.finished ?? false) as boolean,\n askUser: (response.ask_user ?? response.askUser) as string | undefined,\n step: (response.step ?? 0) as number,\n };\n }\n\n // ===== MODELS =====\n\n /**\n * List available agent models.\n *\n * @param filter - Optional filter: \"cdp\" for browser agents, \"desktop\" for\n * desktop agents\n * @returns ModelsResponse with list of available model names\n *\n * @example\n * ```typescript\n * // List all models\n * const models = await client.sessions.listModels();\n * console.log(models.models);\n *\n * // List only desktop-compatible models\n * const desktopModels = await client.sessions.listModels('desktop');\n * console.log(desktopModels.models);\n * // ['agi-2-claude', 'agi-2-qwen']\n * ```\n */\n async listModels(filter?: string): Promise<ModelsResponse> {\n const query: Record<string, string> = {};\n if (filter) {\n query.filter = filter;\n }\n\n return this.http.request<ModelsResponse>('GET', '/v1/models', { query });\n }\n}\n","/**\n * Main AGI API client\n */\n\nimport { HTTPClient } from './http';\nimport { SessionContext } from './context/session-context';\nimport { SessionsResource } from './resources/sessions';\nimport type { AGIClientOptions } from './types';\n\n/**\n * Official TypeScript/JavaScript client for the AGI.tech API\n *\n * The AGIClient provides access to the AGI API for creating and managing\n * AI agent sessions that can perform complex web tasks.\n *\n * @example\n * Simple usage with context manager (recommended):\n * ```typescript\n * import { AGIClient } from 'agi-sdk';\n *\n * const client = new AGIClient({ apiKey: 'your_api_key' });\n *\n * await using session = client.session('agi-0');\n * const result = await session.runTask('Find cheapest iPhone 15 on Amazon');\n * console.log(result.data);\n * console.log(`Duration: ${result.metadata.duration}s`);\n * ```\n *\n * @example\n * Advanced usage with low-level API:\n * ```typescript\n * const session = await client.sessions.create('agi-0', {\n * webhookUrl: 'https://yourapp.com/webhook'\n * });\n *\n * await client.sessions.sendMessage(session.sessionId, 'Find flights...');\n *\n * for await (const event of client.sessions.streamEvents(session.sessionId)) {\n * if (event.event === 'thought') {\n * console.log('Agent:', event.data);\n * }\n * if (event.event === 'done') {\n * break;\n * }\n * }\n *\n * await client.sessions.delete(session.sessionId);\n * ```\n */\nexport class AGIClient {\n private readonly http: HTTPClient;\n\n /** Sessions resource for low-level API access */\n public readonly sessions: SessionsResource;\n\n /**\n * Create a new AGI client\n *\n * @param options - Client configuration options\n *\n * @example\n * ```typescript\n * // With explicit API key\n * const client = new AGIClient({ apiKey: 'your_api_key' });\n *\n * // With custom base URL\n * const client = new AGIClient({\n * apiKey: 'your_api_key',\n * baseUrl: 'https://custom-api.example.com',\n * timeout: 120000,\n * });\n * ```\n */\n constructor(options: AGIClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'api_key is required. Either pass it as a parameter or set the AGI_API_KEY environment variable.'\n );\n }\n\n this.http = new HTTPClient(options);\n this.sessions = new SessionsResource(this.http);\n }\n\n /**\n * Create a session context manager for easy session lifecycle management (recommended)\n *\n * This is the recommended way to use the SDK. The context manager automatically\n * creates and deletes the session using `await using` syntax.\n *\n * @param agentName - Agent model to use (e.g., \"agi-0\", \"agi-0-fast\", \"agi-1\")\n * @param options - Session creation options\n * @returns SessionContext manager\n *\n * @example\n * ```typescript\n * // Simple usage\n * await using session = client.session('agi-0');\n * const result = await session.runTask('Find flights SFO→JFK under $450');\n * console.log(result.data);\n * // Session automatically deleted\n *\n * // With options\n * await using session = client.session('agi-0', {\n * webhookUrl: 'https://yourapp.com/webhook',\n * maxSteps: 200\n * });\n * const result = await session.runTask('Research company XYZ');\n * ```\n */\n session(\n agentName: string = 'agi-0',\n options?: {\n webhookUrl?: string;\n goal?: string;\n maxSteps?: number;\n restoreFromEnvironmentId?: string;\n }\n ): SessionContext {\n return new SessionContext(this, agentName, options);\n }\n}\n","/**\n * Async event loop manager for client-driven sessions.\n */\n\nimport type { AGIClient } from './client';\nimport type { DesktopAction, StepDesktopResponse } from './types';\n\n/**\n * State of the agent execution loop.\n */\nexport type LoopState = 'idle' | 'running' | 'paused' | 'stopped' | 'finished';\n\n/**\n * Callback type for capturing screenshots.\n * Should return a base64-encoded screenshot.\n */\nexport type CaptureScreenshotFn = () => Promise<string>;\n\n/**\n * Callback type for executing actions.\n */\nexport type ExecuteActionsFn = (actions: DesktopAction[]) => Promise<void>;\n\n/**\n * Callback type for handling thinking output.\n */\nexport type OnThinkingFn = (thinking: string) => void;\n\n/**\n * Callback type for handling user questions.\n * Should return the user's answer.\n */\nexport type OnAskUserFn = (question: string) => Promise<string>;\n\n/**\n * Callback type for step completion.\n */\nexport type OnStepFn = (step: number, response: StepDesktopResponse) => void;\n\n/**\n * Options for creating an AgentLoop.\n */\nexport interface AgentLoopOptions {\n /** AGIClient instance */\n client: AGIClient;\n /** Agent service URL from session.agentUrl */\n agentUrl: string;\n /** Session ID (required for routing in shared sandbox) */\n sessionId: string;\n /** Async callback that returns base64-encoded screenshot */\n captureScreenshot: CaptureScreenshotFn;\n /** Async callback that executes a list of actions */\n executeActions: ExecuteActionsFn;\n /** Optional callback for agent thinking/reasoning output */\n onThinking?: OnThinkingFn;\n /** Optional async callback to handle user questions. If not provided and agent asks a question, the loop will stop. */\n onAskUser?: OnAskUserFn;\n /** Optional callback called after each step with step number and full response */\n onStep?: OnStepFn;\n /** Optional delay in milliseconds between steps (default: 0) */\n stepDelay?: number;\n}\n\n/**\n * Async event loop manager for client-driven sessions.\n *\n * This class manages the execution loop for agent sessions where the client\n * is responsible for capturing screenshots and executing actions (e.g., desktop,\n * mobile, or any client-driven session type). It provides start/pause/resume/stop\n * control over the loop.\n *\n * The loop:\n * 1. Captures a screenshot using the provided callback\n * 2. Sends it to the agent via step()\n * 3. Executes returned actions using the provided callback\n * 4. Repeats until finished or stopped\n *\n * @example\n * ```typescript\n * import { AGIClient, AgentLoop } from 'agi-sdk';\n *\n * const client = new AGIClient({ apiKey: '...' });\n *\n * // Create client-driven session\n * const session = await client.sessions.create('agi-2-claude', {\n * agentSessionType: 'desktop',\n * goal: 'Open calculator and compute 2+2'\n * });\n *\n * // Create and run loop\n * const loop = new AgentLoop({\n * client,\n * agentUrl: session.agentUrl!,\n * captureScreenshot: async () => {\n * // Return base64-encoded screenshot\n * return '...';\n * },\n * executeActions: async (actions) => {\n * for (const action of actions) {\n * console.log('Executing:', action);\n * }\n * },\n * onThinking: (t) => console.log('Thinking:', t),\n * });\n *\n * const result = await loop.start();\n * console.log('Finished:', result.finished);\n * ```\n *\n * @example Pause/resume control\n * ```typescript\n * // Start loop without awaiting\n * const promise = loop.start();\n *\n * // Pause after 5 seconds\n * setTimeout(() => loop.pause(), 5000);\n *\n * // Resume after user input\n * process.stdin.once('data', () => loop.resume());\n *\n * // Wait for completion\n * const result = await promise;\n * ```\n */\nexport class AgentLoop {\n private readonly client: AGIClient;\n private readonly agentUrl: string;\n private readonly sessionId: string;\n private readonly captureScreenshot: CaptureScreenshotFn;\n private readonly executeActions: ExecuteActionsFn;\n private readonly onThinking?: OnThinkingFn;\n private readonly onAskUser?: OnAskUserFn;\n private readonly onStep?: OnStepFn;\n private readonly stepDelay: number;\n\n private _state: LoopState = 'idle';\n private _lastResult: StepDesktopResponse | null = null;\n private _currentStep = 0;\n\n // Pause control using Promise-based approach\n private pauseResolve: (() => void) | null = null;\n private pausePromise: Promise<void> | null = null;\n\n constructor(options: AgentLoopOptions) {\n this.client = options.client;\n this.agentUrl = options.agentUrl;\n this.sessionId = options.sessionId;\n this.captureScreenshot = options.captureScreenshot;\n this.executeActions = options.executeActions;\n this.onThinking = options.onThinking;\n this.onAskUser = options.onAskUser;\n this.onStep = options.onStep;\n this.stepDelay = options.stepDelay ?? 0;\n }\n\n /** Current state of the loop. */\n get state(): LoopState {\n return this._state;\n }\n\n /** Current step number. */\n get currentStep(): number {\n return this._currentStep;\n }\n\n /** Last step result, if any. */\n get lastResult(): StepDesktopResponse | null {\n return this._lastResult;\n }\n\n /**\n * Start the execution loop.\n *\n * Runs the loop until the task is finished, stopped, or an unhandled\n * ask_user question is encountered.\n *\n * @param message - Optional initial message (goal or instruction).\n * Usually not needed if goal was set during session creation.\n * @returns The final StepDesktopResponse\n * @throws Error if loop is already running\n */\n async start(message?: string): Promise<StepDesktopResponse> {\n if (this._state === 'running') {\n throw new Error('Loop is already running');\n }\n\n this._state = 'running';\n let currentMessage = message;\n let result: StepDesktopResponse | null = null;\n\n try {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // Wait if paused\n if (this.pausePromise) {\n await this.pausePromise;\n }\n\n // Check state after potential pause (state may have changed during await)\n // Use explicit type to prevent TypeScript narrowing (state can change externally via stop/pause)\n const currentState = this._state as LoopState;\n if (currentState === 'paused') {\n continue; // Keep waiting\n }\n if (currentState !== 'running') {\n break; // stopped/finished/idle - exit loop\n }\n\n // Capture screenshot\n const screenshot = await this.captureScreenshot();\n\n // Call step\n result = await this.client.sessions.step(\n this.agentUrl,\n this.sessionId,\n screenshot,\n currentMessage\n );\n currentMessage = undefined; // Only send message on first call\n this._lastResult = result;\n this._currentStep = result.step;\n\n // Thinking callback\n if (result.thinking && this.onThinking) {\n this.onThinking(result.thinking);\n }\n\n // Step callback\n if (this.onStep) {\n this.onStep(result.step, result);\n }\n\n // Handle ask_user\n if (result.askUser) {\n if (this.onAskUser) {\n const answer = await this.onAskUser(result.askUser);\n currentMessage = answer;\n } else {\n // No handler, stop the loop\n this._state = 'stopped';\n return result;\n }\n }\n\n // Execute actions\n if (result.actions.length > 0) {\n await this.executeActions(result.actions);\n }\n\n // Check if done\n if (result.finished) {\n this._state = 'finished';\n return result;\n }\n\n // Optional delay between steps\n if (this.stepDelay > 0) {\n await new Promise((resolve) => setTimeout(resolve, this.stepDelay));\n }\n }\n } catch (error) {\n this._state = 'stopped';\n throw error;\n }\n\n // Return last result or create empty response\n if (result === null) {\n result = {\n actions: [],\n thinking: undefined,\n finished: true,\n askUser: undefined,\n step: this._currentStep,\n };\n }\n\n return result;\n }\n\n /**\n * Pause the execution loop.\n *\n * The loop will complete the current step before pausing.\n * Call resume() to continue.\n */\n pause(): void {\n if (this._state !== 'running') {\n return;\n }\n this._state = 'paused';\n this.pausePromise = new Promise((resolve) => {\n this.pauseResolve = resolve;\n });\n }\n\n /**\n * Resume a paused loop.\n */\n resume(): void {\n if (this._state !== 'paused') {\n return;\n }\n this._state = 'running';\n if (this.pauseResolve) {\n this.pauseResolve();\n this.pauseResolve = null;\n this.pausePromise = null;\n }\n }\n\n /**\n * Stop the execution loop.\n *\n * The loop will complete the current step before stopping.\n */\n stop(): void {\n this._state = 'stopped';\n // Unblock if paused\n if (this.pauseResolve) {\n this.pauseResolve();\n this.pauseResolve = null;\n this.pausePromise = null;\n }\n }\n\n /** Check if the loop is currently running. */\n isRunning(): boolean {\n return this._state === 'running';\n }\n\n /** Check if the loop is currently paused. */\n isPaused(): boolean {\n return this._state === 'paused';\n }\n\n /** Check if the loop has finished successfully. */\n isFinished(): boolean {\n return this._state === 'finished';\n }\n}\n","/**\n * Binary locator for the agi-driver.\n *\n * Finds the platform-specific binary bundled with the package\n * or falls back to a global installation.\n */\n\nimport { existsSync } from 'fs';\nimport { join, dirname, delimiter } from 'path';\nimport { fileURLToPath } from 'url';\nimport { platform, arch } from 'os';\nimport { createRequire } from 'module';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst require = createRequire(import.meta.url);\n\n/**\n * Platform identifier for binary selection.\n */\nexport type PlatformId = 'darwin-arm64' | 'darwin-x64' | 'linux-x64' | 'win32-x64';\n\n/**\n * Get the current platform identifier.\n */\nexport function getPlatformId(): PlatformId {\n const os = platform();\n const cpu = arch();\n\n if (os === 'darwin') {\n return cpu === 'arm64' ? 'darwin-arm64' : 'darwin-x64';\n } else if (os === 'linux') {\n return 'linux-x64';\n } else if (os === 'win32') {\n return 'win32-x64';\n }\n\n throw new Error(`Unsupported platform: ${os}-${cpu}`);\n}\n\n/**\n * Get the binary filename for the current platform.\n */\nexport function getBinaryFilename(platformId?: PlatformId): string {\n const id = platformId ?? getPlatformId();\n if (id === 'win32-x64') {\n return 'agi-driver.exe';\n }\n return 'agi-driver';\n}\n\n/**\n * Search paths for the binary.\n */\nfunction getSearchPaths(platformId: PlatformId): string[] {\n const filename = getBinaryFilename(platformId);\n const paths: string[] = [];\n\n // 1. Optional dependency package (e.g., @agi/agi-darwin-arm64)\n const packageName = `@agi/agi-${platformId}`;\n try {\n const packagePath = require.resolve(`${packageName}/package.json`);\n const packageDir = dirname(packagePath);\n paths.push(join(packageDir, filename));\n } catch {\n // Package not installed\n }\n\n // 2. Bundled in this package's bin directory\n paths.push(join(__dirname, '..', '..', 'bin', filename));\n paths.push(join(__dirname, '..', '..', '..', 'bin', filename));\n\n // 3. Global installation (in PATH)\n const envPath = process.env.PATH || '';\n for (const dir of envPath.split(delimiter)) {\n if (dir) {\n paths.push(join(dir, filename));\n }\n }\n\n return paths;\n}\n\n/**\n * Check if we can use Python to run the driver module directly.\n * This is a development fallback when the binary isn't compiled.\n *\n * AGI_DRIVER_PATH must point to the `agi_driver` package directory itself\n * (e.g., `/path/to/agi-api/src/agi_driver`). The parent directory is then\n * added to PYTHONPATH so `python -m agi_driver` resolves correctly.\n */\nexport function canUsePythonFallback(): boolean {\n const driverPath = process.env.AGI_DRIVER_PATH;\n if (driverPath && existsSync(join(driverPath, '__main__.py'))) {\n return true;\n }\n return false;\n}\n\n/**\n * Get the Python fallback command and args.\n * Returns null if not available.\n */\nexport function getPythonFallback(): { command: string; args: string[] } | null {\n const driverPath = process.env.AGI_DRIVER_PATH;\n if (driverPath && existsSync(join(driverPath, '__main__.py'))) {\n return {\n command: process.env.PYTHON_PATH || 'python',\n args: ['-m', 'agi_driver'],\n };\n }\n return null;\n}\n\n/**\n * Find the agi-driver binary path.\n *\n * @throws Error if the binary cannot be found\n */\nexport function findBinaryPath(): string {\n const platformId = getPlatformId();\n const searchPaths = getSearchPaths(platformId);\n\n for (const path of searchPaths) {\n if (existsSync(path)) {\n return path;\n }\n }\n\n throw new Error(\n `Could not find agi-driver binary for ${platformId}. ` +\n `Searched: ${searchPaths.join(', ')}. ` +\n `Install the optional dependency @agi/agi-${platformId} or ensure agi-driver is in PATH.`\n );\n}\n\n/**\n * Check if the binary is available.\n */\nexport function isBinaryAvailable(): boolean {\n try {\n findBinaryPath();\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Protocol types for driver communication.\n *\n * The driver communicates via JSON lines:\n * - Events are emitted on stdout (driver -> SDK)\n * - Commands are sent on stdin (SDK -> driver)\n */\n\n// Event types\nexport type EventType =\n | 'ready'\n | 'state_change'\n | 'thinking'\n | 'action'\n | 'confirm'\n | 'ask_question'\n | 'finished'\n | 'error'\n | 'screenshot_captured';\n\n// Command types\nexport type CommandType =\n | 'start'\n | 'screenshot'\n | 'pause'\n | 'resume'\n | 'stop'\n | 'confirm'\n | 'answer';\n\n// Driver states\nexport type DriverState =\n | 'idle'\n | 'running'\n | 'paused'\n | 'waiting_confirmation'\n | 'waiting_answer'\n | 'finished'\n | 'stopped'\n | 'error';\n\n// Base event interface\nexport interface BaseEvent {\n event: EventType;\n step: number;\n}\n\nexport interface ReadyEvent extends BaseEvent {\n event: 'ready';\n version: string;\n protocol: string;\n}\n\nexport interface StateChangeEvent extends BaseEvent {\n event: 'state_change';\n state: DriverState;\n}\n\nexport interface ThinkingEvent extends BaseEvent {\n event: 'thinking';\n text: string;\n}\n\nexport interface ActionEvent extends BaseEvent {\n event: 'action';\n action: DriverAction;\n}\n\nexport interface ConfirmEvent extends BaseEvent {\n event: 'confirm';\n action: DriverAction;\n reason: string;\n}\n\nexport interface AskQuestionEvent extends BaseEvent {\n event: 'ask_question';\n question: string;\n question_id: string;\n}\n\nexport interface FinishedEvent extends BaseEvent {\n event: 'finished';\n reason: string;\n summary: string;\n success: boolean;\n}\n\nexport interface ErrorEvent extends BaseEvent {\n event: 'error';\n message: string;\n code: string;\n recoverable: boolean;\n}\n\n/**\n * Emitted in local mode when the driver captures a screenshot.\n * Lightweight notification (no image data).\n */\nexport interface ScreenshotCapturedEvent extends BaseEvent {\n event: 'screenshot_captured';\n width: number;\n height: number;\n}\n\nexport type DriverEvent =\n | ReadyEvent\n | StateChangeEvent\n | ThinkingEvent\n | ActionEvent\n | ConfirmEvent\n | AskQuestionEvent\n | FinishedEvent\n | ErrorEvent\n | ScreenshotCapturedEvent;\n\n// Action type from the driver\nexport interface DriverAction {\n type: string;\n x?: number;\n y?: number;\n [key: string]: unknown;\n}\n\n// Base command interface\nexport interface BaseCommand {\n command: CommandType;\n}\n\nexport interface StartCommand extends BaseCommand {\n command: 'start';\n session_id: string;\n goal: string;\n screenshot: string;\n screen_width: number;\n screen_height: number;\n platform: 'desktop' | 'android';\n model: string;\n /** \"local\" for autonomous mode, \"\" for legacy SDK-driven mode */\n mode?: string;\n}\n\nexport interface ScreenshotCommand extends BaseCommand {\n command: 'screenshot';\n data: string;\n screen_width: number;\n screen_height: number;\n}\n\nexport interface PauseCommand extends BaseCommand {\n command: 'pause';\n}\n\nexport interface ResumeCommand extends BaseCommand {\n command: 'resume';\n}\n\nexport interface StopCommand extends BaseCommand {\n command: 'stop';\n reason?: string;\n}\n\nexport interface ConfirmResponseCommand extends BaseCommand {\n command: 'confirm';\n approved: boolean;\n message?: string;\n}\n\nexport interface AnswerCommand extends BaseCommand {\n command: 'answer';\n text: string;\n question_id?: string;\n}\n\nexport type DriverCommand =\n | StartCommand\n | ScreenshotCommand\n | PauseCommand\n | ResumeCommand\n | StopCommand\n | ConfirmResponseCommand\n | AnswerCommand;\n\n/**\n * Parse a JSON line into a DriverEvent.\n */\nexport function parseEvent(line: string): DriverEvent {\n const data = JSON.parse(line);\n return data as DriverEvent;\n}\n\n/**\n * Serialize a command to a JSON line.\n */\nexport function serializeCommand(command: DriverCommand): string {\n return JSON.stringify(command);\n}\n","/**\n * AgentDriver - Spawns and manages the agi-driver binary.\n *\n * The driver communicates via JSON lines over stdin/stdout and provides\n * an event-based interface for agent control.\n */\n\nimport { spawn, ChildProcess } from 'child_process';\nimport { EventEmitter } from 'events';\nimport { createInterface, Interface } from 'readline';\nimport { findBinaryPath, getPythonFallback } from './binary';\nimport {\n DriverEvent,\n DriverState,\n StartCommand,\n ScreenshotCommand,\n StopCommand,\n ConfirmResponseCommand,\n AnswerCommand,\n parseEvent,\n serializeCommand,\n FinishedEvent,\n ErrorEvent,\n} from './protocol';\n\n/**\n * Options for creating an AgentDriver.\n */\nexport interface DriverOptions {\n /** Path to the agi-driver binary. If not provided, will be auto-detected. */\n binaryPath?: string;\n /** Model to use (default: 'claude-sonnet') */\n model?: string;\n /** Platform type (default: 'desktop') */\n platform?: 'desktop' | 'android';\n /** \"local\" for autonomous mode, \"\" for legacy SDK-driven mode */\n mode?: string;\n /** Environment variables to pass to the driver process */\n env?: Record<string, string>;\n}\n\n/**\n * Result from running the driver.\n */\nexport interface DriverResult {\n /** Whether the task completed successfully */\n success: boolean;\n /** Reason for completion */\n reason: string;\n /** Summary of what was accomplished */\n summary: string;\n /** Final step number */\n step: number;\n}\n\n/**\n * AgentDriver manages the lifecycle of the agi-driver binary.\n *\n * @example\n * ```typescript\n * const driver = new AgentDriver();\n *\n * driver.on('action', async (action) => {\n * // Execute the action on the local machine\n * await executeAction(action);\n * // Send next screenshot\n * driver.sendScreenshot(captureScreenshot());\n * });\n *\n * driver.on('thinking', (text) => {\n * console.log('Agent thinking:', text);\n * });\n *\n * driver.on('confirm', async (reason) => {\n * // Ask user for confirmation\n * return await askUser(reason);\n * });\n *\n * const result = await driver.start('Open calculator and compute 2+2');\n * console.log('Done:', result.summary);\n * ```\n */\nexport class AgentDriver extends EventEmitter {\n private readonly binaryPath: string | null;\n private readonly pythonFallback: { command: string; args: string[] } | null;\n private readonly model: string;\n private readonly platform: 'desktop' | 'android';\n private readonly mode: string;\n private readonly env: Record<string, string>;\n\n private process: ChildProcess | null = null;\n private readline: Interface | null = null;\n private state: DriverState = 'idle';\n private step = 0;\n private sessionId = '';\n private screenWidth = 0;\n private screenHeight = 0;\n\n private resolveStart: ((result: DriverResult) => void) | null = null;\n private rejectStart: ((error: Error) => void) | null = null;\n\n // Pending callbacks for user interaction\n private pendingConfirm: ((approved: boolean, message?: string) => void) | null = null;\n private pendingAnswer: ((text: string) => void) | null = null;\n\n constructor(options: DriverOptions = {}) {\n super();\n\n // Try to find binary, fall back to Python if available\n let binaryPath: string | null = null;\n try {\n binaryPath = options.binaryPath ?? findBinaryPath();\n } catch {\n // Binary not found, try Python fallback\n }\n\n this.binaryPath = binaryPath;\n this.pythonFallback = binaryPath ? null : getPythonFallback();\n\n if (!this.binaryPath && !this.pythonFallback) {\n throw new Error(\n 'Could not find agi-driver binary and Python fallback is not available. ' +\n 'Set AGI_DRIVER_PATH to the agi_driver source directory for development.'\n );\n }\n\n this.model = options.model ?? 'claude-sonnet';\n this.platform = options.platform ?? 'desktop';\n this.mode = options.mode ?? '';\n this.env = options.env ?? {};\n }\n\n /**\n * Get the current state of the driver.\n */\n get currentState(): DriverState {\n return this.state;\n }\n\n /**\n * Get the current step number.\n */\n get currentStep(): number {\n return this.step;\n }\n\n /**\n * Check if the driver is running.\n */\n get isRunning(): boolean {\n return this.state === 'running';\n }\n\n /**\n * Check if the driver is waiting for user input.\n */\n get isWaiting(): boolean {\n return this.state === 'waiting_confirmation' || this.state === 'waiting_answer';\n }\n\n /**\n * Start the agent with a goal.\n *\n * @param goal - The task for the agent to accomplish\n * @param screenshot - Initial screenshot (base64-encoded). Not needed in local mode.\n * @param screenWidth - Screen width in pixels. Not needed in local mode.\n * @param screenHeight - Screen height in pixels. Not needed in local mode.\n * @param mode - Override the mode set in DriverOptions.\n * @returns Promise that resolves when the agent finishes\n */\n async start(\n goal: string,\n screenshot: string = '',\n screenWidth: number = 0,\n screenHeight: number = 0,\n mode?: string\n ): Promise<DriverResult> {\n if (this.process) {\n throw new Error('Driver is already running');\n }\n\n this.sessionId = `session_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n this.screenWidth = screenWidth;\n this.screenHeight = screenHeight;\n\n return new Promise((resolve, reject) => {\n this.resolveStart = resolve;\n this.rejectStart = reject;\n\n // Spawn the driver process\n if (this.binaryPath) {\n this.process = spawn(this.binaryPath, [], {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: {\n ...process.env,\n ...this.env,\n },\n });\n } else if (this.pythonFallback) {\n this.process = spawn(this.pythonFallback.command, this.pythonFallback.args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: {\n ...process.env,\n ...this.env,\n PYTHONPATH: process.env.AGI_DRIVER_PATH ? `${process.env.AGI_DRIVER_PATH}/..` : '',\n },\n cwd: process.env.AGI_DRIVER_PATH ? `${process.env.AGI_DRIVER_PATH}/..` : undefined,\n });\n } else {\n reject(new Error('No binary or Python fallback available'));\n return;\n }\n\n // Handle process errors\n this.process.on('error', (err) => {\n this.cleanup();\n if (this.rejectStart) {\n this.rejectStart(err);\n this.rejectStart = null;\n this.resolveStart = null;\n }\n });\n\n this.process.on('exit', (code) => {\n this.cleanup();\n if (this.rejectStart) {\n this.rejectStart(new Error(`Driver exited with code ${code}`));\n this.rejectStart = null;\n this.resolveStart = null;\n }\n });\n\n // Set up readline for stdout\n this.readline = createInterface({\n input: this.process.stdout!,\n crlfDelay: Infinity,\n });\n\n this.readline.on('line', (line) => {\n this.handleLine(line).catch((err) => {\n this.emit('error', {\n event: 'error',\n message: `Error handling line: ${err.message}`,\n code: 'parse_error',\n recoverable: false,\n step: this.step,\n });\n });\n });\n\n // Forward stderr\n this.process.stderr?.on('data', (data) => {\n this.emit('stderr', data.toString());\n });\n\n // Wait for ready event before sending start command\n this.once('ready', () => {\n const startCmd: StartCommand = {\n command: 'start',\n session_id: this.sessionId,\n goal,\n screenshot,\n screen_width: screenWidth,\n screen_height: screenHeight,\n platform: this.platform,\n model: this.model,\n mode: mode ?? this.mode,\n };\n this.sendCommand(startCmd);\n });\n });\n }\n\n /**\n * Send a new screenshot to the driver.\n *\n * @param screenshot - Base64-encoded screenshot\n * @param screenWidth - Screen width in pixels\n * @param screenHeight - Screen height in pixels\n */\n sendScreenshot(screenshot: string, screenWidth?: number, screenHeight?: number): void {\n if (!this.process) {\n throw new Error('Driver is not running');\n }\n\n const cmd: ScreenshotCommand = {\n command: 'screenshot',\n data: screenshot,\n screen_width: screenWidth ?? this.screenWidth,\n screen_height: screenHeight ?? this.screenHeight,\n };\n this.sendCommand(cmd);\n }\n\n /**\n * Pause the driver.\n */\n pause(): void {\n if (!this.process) return;\n this.sendCommand({ command: 'pause' });\n }\n\n /**\n * Resume the driver.\n */\n resume(): void {\n if (!this.process) return;\n this.sendCommand({ command: 'resume' });\n }\n\n /**\n * Stop the driver.\n *\n * @param reason - Reason for stopping\n */\n async stop(reason?: string): Promise<void> {\n if (!this.process) return;\n\n const cmd: StopCommand = {\n command: 'stop',\n reason,\n };\n this.sendCommand(cmd);\n\n // Wait for process to exit\n await new Promise<void>((resolve) => {\n if (!this.process) {\n resolve();\n return;\n }\n this.process.once('exit', () => resolve());\n // Give it a second to exit gracefully\n setTimeout(() => {\n if (this.process) {\n this.process.kill();\n }\n resolve();\n }, 1000);\n });\n\n this.cleanup();\n }\n\n /**\n * Respond to a confirmation request.\n *\n * @param approved - Whether the action is approved\n * @param message - Optional message to send with the response\n */\n respondConfirm(approved: boolean, message?: string): void {\n if (!this.process || this.state !== 'waiting_confirmation') {\n throw new Error('Not waiting for confirmation');\n }\n\n const cmd: ConfirmResponseCommand = {\n command: 'confirm',\n approved,\n message,\n };\n this.sendCommand(cmd);\n\n if (this.pendingConfirm) {\n this.pendingConfirm(approved, message);\n this.pendingConfirm = null;\n }\n }\n\n /**\n * Respond to a question.\n *\n * @param text - The answer text\n * @param questionId - Optional question ID\n */\n respondAnswer(text: string, questionId?: string): void {\n if (!this.process || this.state !== 'waiting_answer') {\n throw new Error('Not waiting for answer');\n }\n\n const cmd: AnswerCommand = {\n command: 'answer',\n text,\n question_id: questionId,\n };\n this.sendCommand(cmd);\n\n if (this.pendingAnswer) {\n this.pendingAnswer(text);\n this.pendingAnswer = null;\n }\n }\n\n private sendCommand(cmd: object): void {\n if (!this.process?.stdin) return;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const line = serializeCommand(cmd as any) + '\\n';\n this.process.stdin.write(line);\n }\n\n private async handleLine(line: string): Promise<void> {\n if (!line.trim()) return;\n\n let event: DriverEvent;\n try {\n event = parseEvent(line);\n } catch (e) {\n console.error('Failed to parse event:', line);\n return;\n }\n\n this.step = event.step;\n\n // Emit raw event\n this.emit('event', event);\n\n // Handle specific event types\n switch (event.event) {\n case 'ready':\n this.emit('ready', event);\n break;\n\n case 'state_change':\n this.state = event.state;\n this.emit('state_change', event.state, event);\n break;\n\n case 'thinking':\n this.emit('thinking', event.text, event);\n break;\n\n case 'action':\n this.emit('action', event.action, event);\n break;\n\n case 'confirm': {\n this.state = 'waiting_confirmation';\n // Use rawListeners so once() wrappers are properly invoked and removed.\n // Calling raw wrappers preserves standard EventEmitter once() semantics\n // while also letting us capture return values for auto-response.\n const confirmListeners = this.rawListeners('confirm');\n let confirmHandled = false;\n for (const listener of confirmListeners) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const approved = await (listener as any)(event.reason, event);\n if (typeof approved === 'boolean' && !confirmHandled) {\n this.respondConfirm(approved);\n confirmHandled = true;\n }\n } catch {\n // Listener didn't respond, continue\n }\n }\n break;\n }\n\n case 'ask_question': {\n this.state = 'waiting_answer';\n // Use rawListeners so once() wrappers are properly invoked and removed.\n const questionListeners = this.rawListeners('ask_question');\n let questionHandled = false;\n for (const listener of questionListeners) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const answer = await (listener as any)(event.question, event);\n if (typeof answer === 'string' && !questionHandled) {\n this.respondAnswer(answer, event.question_id);\n questionHandled = true;\n }\n } catch {\n // Listener didn't respond, continue\n }\n }\n break;\n }\n\n case 'screenshot_captured':\n this.emit('screenshot_captured', event);\n break;\n\n case 'finished':\n this.handleFinished(event);\n break;\n\n case 'error':\n this.handleError(event);\n break;\n }\n }\n\n private handleFinished(event: FinishedEvent): void {\n this.state = 'finished';\n this.emit('finished', event);\n\n if (this.resolveStart) {\n this.resolveStart({\n success: event.success,\n reason: event.reason,\n summary: event.summary,\n step: event.step,\n });\n this.resolveStart = null;\n this.rejectStart = null;\n }\n\n this.cleanup();\n }\n\n private handleError(event: ErrorEvent): void {\n this.emit('error', event);\n\n if (!event.recoverable) {\n this.state = 'error';\n if (this.rejectStart) {\n this.rejectStart(new Error(`${event.code}: ${event.message}`));\n this.rejectStart = null;\n this.resolveStart = null;\n }\n this.cleanup();\n }\n }\n\n private cleanup(): void {\n if (this.readline) {\n this.readline.close();\n this.readline = null;\n }\n // Reject the start promise so callers don't hang forever\n if (this.rejectStart) {\n this.rejectStart(new Error('Driver stopped'));\n this.rejectStart = null;\n this.resolveStart = null;\n }\n if (this.process) {\n this.process.kill();\n this.process = null;\n }\n this.pendingConfirm = null;\n this.pendingAnswer = null;\n }\n}\n"]}
|