@aomi-labs/client 0.1.21 → 0.1.23
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/dist/cli.js +4048 -3396
- package/dist/index.cjs +658 -479
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +190 -250
- package/dist/index.d.ts +190 -250
- package/dist/index.js +655 -472
- package/dist/index.js.map +1 -1
- package/package.json +8 -6
- package/skills/README.md +2 -2
- package/skills/{aomi-app-builder → aomi-build}/SKILL.md +2 -2
- package/skills/aomi-build/agents/openai.yaml +4 -0
- package/skills/aomi-transact/SKILL.md +376 -113
- package/skills/aomi-app-builder/agents/openai.yaml +0 -4
- /package/skills/{aomi-app-builder → aomi-build}/references/aomi-sdk-patterns.md +0 -0
- /package/skills/{aomi-app-builder → aomi-build}/references/spec-to-tools.md +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sse.ts","../src/client.ts","../src/types.ts","../src/event-emitter.ts","../src/event-unwrap.ts","../src/wallet-utils.ts","../src/session.ts","../src/aa/types.ts","../src/aa/env.ts","../src/aa/resolve.ts","../src/aa/alchemy.ts","../src/aa/pimlico.ts","../src/aa/adapt.ts","../src/aa/create.ts"],"sourcesContent":["import type { AomiSSEEvent, Logger } from \"./types\";\n\nexport type SseSubscriber = {\n subscribe: (\n sessionId: string,\n onUpdate: (event: AomiSSEEvent) => void,\n onError?: (error: unknown) => void,\n ) => () => void;\n};\n\nexport type SseSubscriberOptions = {\n backendUrl: string;\n getHeaders: (sessionId: string) => HeadersInit;\n logger?: Logger;\n};\n\ntype SseSubscription = {\n abortController: AbortController | null;\n retries: number;\n retryTimer: ReturnType<typeof setTimeout> | null;\n stopped: boolean;\n listeners: Set<SseListener>;\n stop: (reason?: string) => void;\n};\n\ntype SseListener = {\n onUpdate: (event: AomiSSEEvent) => void;\n onError?: (error: unknown) => void;\n};\n\nfunction extractSseData(rawEvent: string): string | null {\n const dataLines = rawEvent\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(5).trimStart());\n if (!dataLines.length) return null;\n return dataLines.join(\"\\n\");\n}\n\nasync function readSseStream(\n stream: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n onMessage: (data: string) => void,\n): Promise<void> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (!signal.aborted) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n buffer = buffer.replace(/\\r/g, \"\");\n\n let separatorIndex = buffer.indexOf(\"\\n\\n\");\n while (separatorIndex >= 0) {\n const rawEvent = buffer.slice(0, separatorIndex);\n buffer = buffer.slice(separatorIndex + 2);\n const data = extractSseData(rawEvent);\n if (data) {\n onMessage(data);\n }\n separatorIndex = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function createSseSubscriber({\n backendUrl,\n getHeaders,\n logger,\n}: SseSubscriberOptions): SseSubscriber {\n const subscriptions = new Map<string, SseSubscription>();\n\n const subscribe: SseSubscriber[\"subscribe\"] = (\n sessionId,\n onUpdate,\n onError,\n ) => {\n const existing = subscriptions.get(sessionId);\n const listener: SseListener = { onUpdate, onError };\n if (existing) {\n existing.listeners.add(listener);\n logger?.debug(\"[aomi][sse] listener added\", {\n sessionId,\n listeners: existing.listeners.size,\n });\n return () => {\n existing.listeners.delete(listener);\n logger?.debug(\"[aomi][sse] listener removed\", {\n sessionId,\n listeners: existing.listeners.size,\n });\n if (existing.listeners.size === 0) {\n existing.stop(\"unsubscribe\");\n if (subscriptions.get(sessionId) === existing) {\n subscriptions.delete(sessionId);\n }\n }\n };\n }\n\n const subscription: SseSubscription = {\n abortController: null,\n retries: 0,\n retryTimer: null,\n stopped: false,\n listeners: new Set([listener]),\n stop: (reason?: string) => {\n subscription.stopped = true;\n if (subscription.retryTimer) {\n clearTimeout(subscription.retryTimer);\n subscription.retryTimer = null;\n }\n subscription.abortController?.abort();\n subscription.abortController = null;\n logger?.debug(\"[aomi][sse] stop\", {\n sessionId,\n reason,\n retries: subscription.retries,\n });\n },\n };\n\n const scheduleRetry = () => {\n if (subscription.stopped) return;\n subscription.retries += 1;\n const delayMs = Math.min(500 * 2 ** (subscription.retries - 1), 10000);\n logger?.debug(\"[aomi][sse] retry scheduled\", {\n sessionId,\n delayMs,\n retries: subscription.retries,\n });\n subscription.retryTimer = setTimeout(() => {\n void open();\n }, delayMs);\n };\n\n const open = async () => {\n if (subscription.stopped) return;\n if (subscription.retryTimer) {\n clearTimeout(subscription.retryTimer);\n subscription.retryTimer = null;\n }\n\n const controller = new AbortController();\n subscription.abortController = controller;\n const openedAt = Date.now();\n\n try {\n const response = await fetch(`${backendUrl}/api/updates`, {\n headers: getHeaders(sessionId),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `SSE HTTP ${response.status}: ${response.statusText}`,\n );\n }\n\n if (!response.body) {\n throw new Error(\"SSE response missing body\");\n }\n\n subscription.retries = 0;\n\n await readSseStream(response.body, controller.signal, (data) => {\n let parsed: AomiSSEEvent;\n try {\n parsed = JSON.parse(data) as AomiSSEEvent;\n } catch (error) {\n for (const item of subscription.listeners) {\n item.onError?.(error);\n }\n return;\n }\n\n for (const item of subscription.listeners) {\n try {\n item.onUpdate(parsed);\n } catch (error) {\n item.onError?.(error);\n }\n }\n });\n logger?.debug(\"[aomi][sse] stream ended\", {\n sessionId,\n aborted: controller.signal.aborted,\n stopped: subscription.stopped,\n durationMs: Date.now() - openedAt,\n });\n } catch (error) {\n if (!controller.signal.aborted && !subscription.stopped) {\n for (const item of subscription.listeners) {\n item.onError?.(error);\n }\n }\n }\n\n if (!subscription.stopped) {\n scheduleRetry();\n }\n };\n\n subscriptions.set(sessionId, subscription);\n void open();\n\n return () => {\n subscription.listeners.delete(listener);\n logger?.debug(\"[aomi][sse] listener removed\", {\n sessionId,\n listeners: subscription.listeners.size,\n });\n if (subscription.listeners.size === 0) {\n subscription.stop(\"unsubscribe\");\n if (subscriptions.get(sessionId) === subscription) {\n subscriptions.delete(sessionId);\n }\n }\n };\n };\n\n return { subscribe };\n}\n","import type {\n AomiClientOptions,\n AomiMessage,\n AomiChatResponse,\n AomiClearSecretsResponse,\n AomiCreateThreadResponse,\n AomiIngestSecretsResponse,\n AomiInterruptResponse,\n AomiSSEEvent,\n AomiSimulateResponse,\n AomiStateResponse,\n AomiSystemEvent,\n AomiSystemResponse,\n AomiThread,\n Logger,\n UserState,\n} from \"./types\";\nimport { createSseSubscriber, type SseSubscriber } from \"./sse\";\n\n// =============================================================================\n// Internal helpers\n// =============================================================================\n\nconst SESSION_ID_HEADER = \"X-Session-Id\";\nconst API_KEY_HEADER = \"X-API-Key\";\n\nfunction joinApiPath(baseUrl: string, path: string): string {\n const normalizedBase = baseUrl === \"/\" ? \"\" : baseUrl.replace(/\\/+$/, \"\");\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${normalizedBase}${normalizedPath}` || normalizedPath;\n}\n\nfunction buildApiUrl(\n baseUrl: string,\n path: string,\n query?: Record<string, string | undefined>,\n): string {\n const url = joinApiPath(baseUrl, path);\n if (!query) return url;\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n params.set(key, value);\n }\n\n const queryString = params.toString();\n return queryString ? `${url}?${queryString}` : url;\n}\n\nfunction toQueryString(payload: Record<string, unknown>): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(payload)) {\n if (value === undefined || value === null) continue;\n params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction withSessionHeader(\n sessionId: string,\n init?: HeadersInit,\n): HeadersInit {\n const headers = new Headers(init);\n headers.set(SESSION_ID_HEADER, sessionId);\n return headers;\n}\n\nasync function postState<T>(\n baseUrl: string,\n path: string,\n payload: Record<string, unknown>,\n sessionId: string,\n apiKey?: string,\n): Promise<T> {\n const query = toQueryString(payload);\n const url = `${baseUrl}${path}${query}`;\n\n const headers = new Headers(withSessionHeader(sessionId));\n if (apiKey) {\n headers.set(API_KEY_HEADER, apiKey);\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as T;\n}\n\n// =============================================================================\n// AomiClient\n// =============================================================================\n\nexport class AomiClient {\n private readonly baseUrl: string;\n private readonly apiKey?: string;\n private readonly logger?: Logger;\n private readonly sseSubscriber: SseSubscriber;\n\n constructor(options: AomiClientOptions) {\n // Strip trailing slash\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this.logger = options.logger;\n\n this.sseSubscriber = createSseSubscriber({\n backendUrl: this.baseUrl,\n getHeaders: (sessionId) =>\n withSessionHeader(sessionId, { Accept: \"text/event-stream\" }),\n logger: this.logger,\n });\n }\n\n // ===========================================================================\n // Chat & State\n // ===========================================================================\n\n /**\n * Fetch current session state (messages, processing status, title).\n */\n async fetchState(\n sessionId: string,\n userState?: UserState,\n clientId?: string,\n ): Promise<AomiStateResponse> {\n const url = buildApiUrl(this.baseUrl, \"/api/state\", {\n user_state: userState ? JSON.stringify(userState) : undefined,\n client_id: clientId,\n });\n\n const response = await fetch(url, {\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as AomiStateResponse;\n }\n\n /**\n * Send a chat message and return updated session state.\n */\n async sendMessage(\n sessionId: string,\n message: string,\n options?: {\n app?: string;\n publicKey?: string;\n apiKey?: string;\n userState?: UserState;\n clientId?: string;\n },\n ): Promise<AomiChatResponse> {\n const app = options?.app ?? \"default\";\n const apiKey = options?.apiKey ?? this.apiKey;\n\n const payload: Record<string, unknown> = { message, app };\n if (options?.publicKey) {\n payload.public_key = options.publicKey;\n }\n if (options?.userState) {\n payload.user_state = JSON.stringify(options.userState);\n }\n if (options?.clientId) {\n payload.client_id = options.clientId;\n }\n\n return postState<AomiChatResponse>(\n this.baseUrl,\n \"/api/chat\",\n payload,\n sessionId,\n apiKey,\n );\n }\n\n /**\n * Send a system-level message (e.g. wallet state changes, context switches).\n */\n async sendSystemMessage(\n sessionId: string,\n message: string,\n ): Promise<AomiSystemResponse> {\n return postState<AomiSystemResponse>(\n this.baseUrl,\n \"/api/system\",\n { message },\n sessionId,\n );\n }\n\n /**\n * Interrupt the AI's current response.\n */\n async interrupt(sessionId: string): Promise<AomiInterruptResponse> {\n return postState<AomiInterruptResponse>(\n this.baseUrl,\n \"/api/interrupt\",\n {},\n sessionId,\n );\n }\n\n // ===========================================================================\n // Secrets\n // ===========================================================================\n\n /**\n * Ingest secrets for a client. Returns opaque `$SECRET:<name>` handles.\n * Call this once at page load (or when secrets change) with a stable\n * client_id for the browser tab. The same client_id should be passed\n * to `sendMessage` / `fetchState` so sessions get associated.\n */\n async ingestSecrets(\n clientId: string,\n secrets: Record<string, string>,\n ): Promise<AomiIngestSecretsResponse> {\n const url = joinApiPath(this.baseUrl, \"/api/secrets\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ client_id: clientId, secrets }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as AomiIngestSecretsResponse;\n }\n\n /**\n * Clear all secrets for a client (e.g. on page unload or logout).\n */\n async clearSecrets(clientId: string): Promise<AomiClearSecretsResponse> {\n const url = buildApiUrl(this.baseUrl, \"/api/secrets\", {\n client_id: clientId,\n });\n const response = await fetch(url, { method: \"DELETE\" });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as AomiClearSecretsResponse;\n }\n\n // ===========================================================================\n // SSE (Real-time Updates)\n // ===========================================================================\n\n /**\n * Subscribe to real-time SSE updates for a session.\n * Automatically reconnects with exponential backoff on disconnects.\n * Returns an unsubscribe function.\n */\n subscribeSSE(\n sessionId: string,\n onUpdate: (event: AomiSSEEvent) => void,\n onError?: (error: unknown) => void,\n ): () => void {\n return this.sseSubscriber.subscribe(sessionId, onUpdate, onError);\n }\n\n // ===========================================================================\n // Thread / Session Management\n // ===========================================================================\n\n /**\n * List all threads for a wallet address.\n */\n async listThreads(publicKey: string): Promise<AomiThread[]> {\n const url = buildApiUrl(this.baseUrl, \"/api/sessions\", {\n public_key: publicKey,\n });\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch threads: HTTP ${response.status}`);\n }\n\n return (await response.json()) as AomiThread[];\n }\n\n /**\n * Get a single thread by ID.\n */\n async getThread(sessionId: string): Promise<AomiThread> {\n const url = buildApiUrl(\n this.baseUrl,\n `/api/sessions/${encodeURIComponent(sessionId)}`,\n );\n const response = await fetch(url, {\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as AomiThread;\n }\n\n /**\n * Create a new thread. The client generates the session ID.\n */\n async createThread(\n threadId: string,\n publicKey?: string,\n ): Promise<AomiCreateThreadResponse> {\n const body: Record<string, string> = {};\n if (publicKey) body.public_key = publicKey;\n\n const url = buildApiUrl(this.baseUrl, \"/api/sessions\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: withSessionHeader(threadId, {\n \"Content-Type\": \"application/json\",\n }),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create thread: HTTP ${response.status}`);\n }\n\n return (await response.json()) as AomiCreateThreadResponse;\n }\n\n /**\n * Delete a thread by ID.\n */\n async deleteThread(sessionId: string): Promise<void> {\n const url = buildApiUrl(\n this.baseUrl,\n `/api/sessions/${encodeURIComponent(sessionId)}`,\n );\n const response = await fetch(url, {\n method: \"DELETE\",\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete thread: HTTP ${response.status}`);\n }\n }\n\n /**\n * Rename a thread.\n */\n async renameThread(sessionId: string, newTitle: string): Promise<void> {\n const url = buildApiUrl(\n this.baseUrl,\n `/api/sessions/${encodeURIComponent(sessionId)}`,\n );\n const response = await fetch(url, {\n method: \"PATCH\",\n headers: withSessionHeader(sessionId, {\n \"Content-Type\": \"application/json\",\n }),\n body: JSON.stringify({ title: newTitle }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to rename thread: HTTP ${response.status}`);\n }\n }\n\n /**\n * Archive a thread.\n */\n async archiveThread(sessionId: string): Promise<void> {\n const url = buildApiUrl(\n this.baseUrl,\n `/api/sessions/${encodeURIComponent(sessionId)}/archive`,\n );\n const response = await fetch(url, {\n method: \"POST\",\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to archive thread: HTTP ${response.status}`);\n }\n }\n\n /**\n * Unarchive a thread.\n */\n async unarchiveThread(sessionId: string): Promise<void> {\n const url = buildApiUrl(\n this.baseUrl,\n `/api/sessions/${encodeURIComponent(sessionId)}/unarchive`,\n );\n const response = await fetch(url, {\n method: \"POST\",\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to unarchive thread: HTTP ${response.status}`);\n }\n }\n\n // ===========================================================================\n // System Events\n // ===========================================================================\n\n /**\n * Get system events for a session.\n */\n async getSystemEvents(\n sessionId: string,\n count?: number,\n ): Promise<AomiSystemEvent[]> {\n const url = buildApiUrl(this.baseUrl, \"/api/events\", {\n count: count !== undefined ? String(count) : undefined,\n });\n const response = await fetch(url, {\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n if (response.status === 404) return [];\n throw new Error(`Failed to get system events: HTTP ${response.status}`);\n }\n\n return (await response.json()) as AomiSystemEvent[];\n }\n\n // ===========================================================================\n // Control API\n // ===========================================================================\n\n /**\n * Get available apps.\n */\n async getApps(\n sessionId: string,\n options?: { publicKey?: string; apiKey?: string },\n ): Promise<string[]> {\n const url = buildApiUrl(this.baseUrl, \"/api/control/apps\", {\n public_key: options?.publicKey,\n });\n\n const apiKey = options?.apiKey ?? this.apiKey;\n const headers = new Headers(withSessionHeader(sessionId));\n if (apiKey) {\n headers.set(API_KEY_HEADER, apiKey);\n }\n\n const response = await fetch(url, { headers });\n\n if (!response.ok) {\n throw new Error(`Failed to get apps: HTTP ${response.status}`);\n }\n\n return (await response.json()) as string[];\n }\n\n /**\n * Get available models.\n */\n async getModels(\n sessionId: string,\n options?: { apiKey?: string },\n ): Promise<string[]> {\n const url = buildApiUrl(this.baseUrl, \"/api/control/models\");\n const apiKey = options?.apiKey ?? this.apiKey;\n const headers = new Headers(withSessionHeader(sessionId));\n if (apiKey) {\n headers.set(API_KEY_HEADER, apiKey);\n }\n\n const response = await fetch(url, {\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get models: HTTP ${response.status}`);\n }\n\n return (await response.json()) as string[];\n }\n\n /**\n * Set the model for a session.\n */\n async setModel(\n sessionId: string,\n rig: string,\n options?: { app?: string; apiKey?: string },\n ): Promise<{\n success: boolean;\n rig: string;\n baml: string;\n created: boolean;\n }> {\n const apiKey = options?.apiKey ?? this.apiKey;\n const payload: Record<string, unknown> = { rig };\n if (options?.app) {\n payload.app = options.app;\n }\n\n return postState<{\n success: boolean;\n rig: string;\n baml: string;\n created: boolean;\n }>(this.baseUrl, \"/api/control/model\", payload, sessionId, apiKey);\n }\n\n // ===========================================================================\n // Batch Simulation\n // ===========================================================================\n\n /**\n * Simulate transactions as an atomic batch.\n * Each tx sees state changes from previous txs (e.g., approve → swap).\n * Sends full tx payloads — the backend does not look up by ID.\n */\n async simulateBatch(\n sessionId: string,\n transactions: Array<{\n to: string;\n value?: string;\n data?: string;\n label?: string;\n }>,\n options?: { from?: string; chainId?: number },\n ): Promise<AomiSimulateResponse> {\n const url = joinApiPath(this.baseUrl, \"/api/simulate\");\n const headers = new Headers(\n withSessionHeader(sessionId, { \"Content-Type\": \"application/json\" }),\n );\n if (this.apiKey) {\n headers.set(API_KEY_HEADER, this.apiKey);\n }\n\n const payload = {\n transactions,\n from: options?.from,\n chain_id: options?.chainId,\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new Error(`HTTP ${response.status}: ${response.statusText}${body ? `\\n${body}` : \"\"}`);\n }\n\n return (await response.json()) as AomiSimulateResponse;\n }\n}\n","// =============================================================================\n// User State\n// =============================================================================\n\n/**\n * Client-side user state synced with the backend.\n * Typically wallet connection info, but can be any key-value data.\n */\nexport type UserState = Record<string, unknown>;\n\n/**\n * Known client surfaces that may want backend-specific UX strategies.\n * Additional string values are allowed for forward compatibility.\n */\nexport type AomiClientType = \"ts_cli\" | \"web_ui\" | (string & {});\n\nexport const CLIENT_TYPE_TS_CLI: AomiClientType = \"ts_cli\";\nexport const CLIENT_TYPE_WEB_UI: AomiClientType = \"web_ui\";\n\n/**\n * Adds/updates an entry on `userState.ext` while keeping `ext` intentionally untyped.\n */\nexport function addUserStateExt(\n userState: UserState,\n key: string,\n value: unknown,\n): UserState {\n const currentExt = userState[\"ext\"];\n const extRecord =\n typeof currentExt === \"object\" && currentExt !== null && !Array.isArray(currentExt)\n ? (currentExt as Record<string, unknown>)\n : {};\n\n return {\n ...userState,\n ext: {\n ...extRecord,\n [key]: value,\n },\n };\n}\n\n// =============================================================================\n// Logger\n// =============================================================================\n\n/**\n * Optional logger for debug output. Pass `console` or any compatible object.\n */\nexport type Logger = {\n debug: (...args: unknown[]) => void;\n};\n\n// =============================================================================\n// Client Options\n// =============================================================================\n\nexport type AomiClientOptions = {\n /** Base URL of the Aomi backend (e.g. \"https://api.aomi.dev\" or \"/\" for same-origin proxying) */\n baseUrl: string;\n /** Default API key for non-default apps */\n apiKey?: string;\n /** Optional logger for debug output (default: silent) */\n logger?: Logger;\n};\n\n// =============================================================================\n// Base Types\n// =============================================================================\n\nexport interface AomiMessage {\n sender?: \"user\" | \"agent\" | \"system\" | string;\n content?: string;\n timestamp?: string;\n is_streaming?: boolean;\n tool_result?: [string, string] | null;\n}\n\n// =============================================================================\n// API Response Types\n// =============================================================================\n\n/**\n * GET /api/state\n * Fetches current session state including messages and processing status\n */\nexport interface AomiStateResponse {\n messages?: AomiMessage[] | null;\n system_events?: AomiSystemEvent[] | null;\n title?: string | null;\n is_processing?: boolean;\n user_state?: UserState | null;\n}\n\n/**\n * POST /api/chat\n * Sends a chat message and returns updated session state\n */\nexport interface AomiChatResponse {\n messages?: AomiMessage[] | null;\n system_events?: AomiSystemEvent[] | null;\n title?: string | null;\n is_processing?: boolean;\n user_state?: UserState | null;\n}\n\n/**\n * POST /api/system\n * Sends a system message and returns the response message\n */\nexport interface AomiSystemResponse {\n res?: AomiMessage | null;\n}\n\n/**\n * POST /api/simulate\n * Batch-simulate pending transactions atomically (snapshot → sequential send → revert).\n */\nexport interface AomiSimulateFee {\n /** Treasury address to receive the fee. */\n recipient: string;\n /** Fee amount in wei (decimal string). */\n amount_wei: string;\n /** Token type — always \"native\" for now. */\n token: \"native\";\n}\n\nexport interface AomiSimulateResponse {\n result: {\n batch_success: boolean;\n stateful: boolean;\n from: string;\n network: string;\n total_gas?: number;\n fee?: AomiSimulateFee;\n steps: Array<{\n step: number;\n label: string;\n success: boolean;\n result?: string | null;\n revert_reason?: string | null;\n gas_used?: number;\n tx: { to: string; value_wei: string; value_eth: string; data: string };\n }>;\n };\n}\n\n/**\n * POST /api/interrupt\n * Interrupts current processing and returns updated session state\n */\nexport type AomiInterruptResponse = AomiChatResponse;\n\n/**\n * GET /api/sessions\n * Returns array of AomiThread\n */\nexport interface AomiThread {\n session_id: string;\n title: string;\n is_archived?: boolean;\n}\n\n/**\n * POST /api/sessions\n * Creates a new thread/session\n */\nexport interface AomiCreateThreadResponse {\n session_id: string;\n title?: string;\n}\n\n// =============================================================================\n// SSE Event Types (/api/updates)\n// =============================================================================\n\n/**\n * Base SSE event - all events have session_id and type\n */\nexport type AomiSSEEvent = {\n type:\n | \"title_changed\"\n | \"tool_update\"\n | \"tool_complete\"\n | \"system_notice\"\n | string;\n session_id: string;\n new_title?: string;\n [key: string]: unknown;\n};\n\n/**\n * POST /api/secrets\n * Ingests secrets for a client, returns opaque handles\n */\nexport interface AomiIngestSecretsResponse {\n handles: Record<string, string>;\n}\n\n/**\n * DELETE /api/secrets\n * Clears all secrets for a client\n */\nexport interface AomiClearSecretsResponse {\n cleared: boolean;\n}\n\nexport type AomiSSEEventType =\n | \"title_changed\"\n | \"tool_update\"\n | \"tool_complete\"\n | \"system_notice\";\n\n// =============================================================================\n// System Events (/api/events)\n// =============================================================================\n\n/**\n * Backend SystemEvent enum serializes as tagged JSON:\n * - InlineCall: {\"InlineCall\": {\"type\": \"wallet_tx_request\", \"payload\": {...}}}\n * - SystemNotice: {\"SystemNotice\": \"message\"}\n * - SystemError: {\"SystemError\": \"message\"}\n * - AsyncCallback: {\"AsyncCallback\": {...}} (not sent over HTTP)\n */\nexport type AomiSystemEvent =\n | { InlineCall: { type: string; payload?: unknown; [key: string]: unknown } }\n | { SystemNotice: string }\n | { SystemError: string }\n | { AsyncCallback: Record<string, unknown> };\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport function isInlineCall(\n event: AomiSystemEvent,\n): event is { InlineCall: { type: string; payload?: unknown } } {\n return \"InlineCall\" in event;\n}\n\nexport function isSystemNotice(\n event: AomiSystemEvent,\n): event is { SystemNotice: string } {\n return \"SystemNotice\" in event;\n}\n\nexport function isSystemError(\n event: AomiSystemEvent,\n): event is { SystemError: string } {\n return \"SystemError\" in event;\n}\n\nexport function isAsyncCallback(\n event: AomiSystemEvent,\n): event is { AsyncCallback: Record<string, unknown> } {\n return \"AsyncCallback\" in event;\n}\n","// =============================================================================\n// Typed EventEmitter (browser-safe, no Node.js deps)\n// =============================================================================\n\ntype Listener<T = unknown> = (payload: T) => void;\n\n/**\n * Minimal typed event emitter with wildcard support.\n *\n * ```ts\n * type Events = { message: string; error: { code: number } };\n * const ee = new TypedEventEmitter<Events>();\n * ee.on(\"message\", (msg) => console.log(msg));\n * ee.emit(\"message\", \"hello\");\n * ```\n */\nexport class TypedEventEmitter<\n EventMap extends Record<string, unknown> = Record<string, unknown>,\n> {\n private listeners = new Map<string, Set<Listener<never>>>();\n\n /**\n * Subscribe to an event type. Returns an unsubscribe function.\n */\n on<K extends keyof EventMap & string>(\n type: K,\n handler: Listener<EventMap[K]>,\n ): () => void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(handler as Listener<never>);\n\n return () => {\n set!.delete(handler as Listener<never>);\n if (set!.size === 0) {\n this.listeners.delete(type);\n }\n };\n }\n\n /**\n * Subscribe to an event type for a single emission, then auto-unsubscribe.\n */\n once<K extends keyof EventMap & string>(\n type: K,\n handler: Listener<EventMap[K]>,\n ): () => void {\n const wrapper = ((payload: EventMap[K]) => {\n unsub();\n handler(payload);\n }) as Listener<EventMap[K]>;\n\n const unsub = this.on(type, wrapper);\n return unsub;\n }\n\n /**\n * Emit an event to all listeners of `type` and wildcard `\"*\"` listeners.\n */\n emit<K extends keyof EventMap & string>(\n type: K,\n payload: EventMap[K],\n ): void {\n // Type-specific listeners\n const typeSet = this.listeners.get(type);\n if (typeSet) {\n for (const handler of typeSet) {\n (handler as Listener<EventMap[K]>)(payload);\n }\n }\n\n // Wildcard listeners\n if (type !== \"*\") {\n const wildcardSet = this.listeners.get(\"*\");\n if (wildcardSet) {\n for (const handler of wildcardSet) {\n (handler as Listener<unknown>)({ type, payload });\n }\n }\n }\n }\n\n /**\n * Remove a specific handler from an event type.\n */\n off<K extends keyof EventMap & string>(\n type: K,\n handler: Listener<EventMap[K]>,\n ): void {\n const set = this.listeners.get(type);\n if (set) {\n set.delete(handler as Listener<never>);\n if (set.size === 0) {\n this.listeners.delete(type);\n }\n }\n }\n\n /**\n * Remove all listeners for all event types.\n */\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","// =============================================================================\n// System Event Unwrap\n// =============================================================================\n//\n// Converts tagged-enum AomiSystemEvent into a flat { type, payload } object.\n// Ported from packages/react/src/contexts/event-context.tsx dispatchSystemEvents.\n\nimport type { AomiSystemEvent } from \"./types\";\nimport {\n isInlineCall,\n isSystemNotice,\n isSystemError,\n isAsyncCallback,\n} from \"./types\";\n\nexport type UnwrappedEvent = {\n type: string;\n payload: unknown;\n};\n\n/**\n * Unwrap a tagged-enum AomiSystemEvent from the backend into a flat event.\n *\n * ```ts\n * const event: AomiSystemEvent = { InlineCall: { type: \"wallet_tx_request\", payload: { to: \"0x...\" } } };\n * const unwrapped = unwrapSystemEvent(event);\n * // => { type: \"wallet_tx_request\", payload: { to: \"0x...\" } }\n * ```\n */\nexport function unwrapSystemEvent(\n event: AomiSystemEvent,\n): UnwrappedEvent | null {\n if (isInlineCall(event)) {\n return {\n type: event.InlineCall.type,\n payload: event.InlineCall.payload ?? event.InlineCall,\n };\n }\n\n if (isSystemNotice(event)) {\n return {\n type: \"system_notice\",\n payload: { message: event.SystemNotice },\n };\n }\n\n if (isSystemError(event)) {\n return {\n type: \"system_error\",\n payload: { message: event.SystemError },\n };\n }\n\n if (isAsyncCallback(event)) {\n return {\n type: \"async_callback\",\n payload: event.AsyncCallback,\n };\n }\n\n return null;\n}\n","// =============================================================================\n// Wallet Payload Normalization\n// =============================================================================\n//\n// Pure functions extracted from packages/react/src/handlers/wallet-handler.ts.\n// Normalizes the various payload shapes the backend can send for wallet\n// transaction and EIP-712 signing requests.\n\n// =============================================================================\n// Types\n// =============================================================================\n\nimport { getAddress } from \"viem\";\n\nexport type WalletTxPayload = {\n to: string;\n value?: string;\n data?: string;\n chainId?: number;\n};\n\nexport type WalletEip712Payload = {\n typed_data?: {\n domain?: { chainId?: number | string };\n types?: Record<string, Array<{ name: string; type: string }>>;\n primaryType?: string;\n message?: Record<string, unknown>;\n };\n description?: string;\n};\n\nexport type ViemSignTypedDataArgs = {\n domain?: Record<string, unknown>;\n types: Record<string, Array<{ name: string; type: string }>>;\n primaryType: string;\n message?: Record<string, unknown>;\n};\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\ntype UnknownRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): UnknownRecord | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return undefined;\n return value as UnknownRecord;\n}\n\nfunction getToolArgs(payload: unknown): UnknownRecord {\n const root = asRecord(payload);\n const nestedArgs = asRecord(root?.args);\n return nestedArgs ?? root ?? {};\n}\n\nfunction parseChainId(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value !== \"string\") return undefined;\n\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n\n if (trimmed.startsWith(\"0x\")) {\n const parsedHex = Number.parseInt(trimmed.slice(2), 16);\n return Number.isFinite(parsedHex) ? parsedHex : undefined;\n }\n\n const parsed = Number.parseInt(trimmed, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction normalizeAddress(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n\n try {\n return getAddress(trimmed);\n } catch {\n if (/^0x[0-9a-fA-F]{40}$/.test(trimmed)) {\n return getAddress(trimmed.toLowerCase());\n }\n return undefined;\n }\n}\n\n// =============================================================================\n// Normalization\n// =============================================================================\n\n/**\n * Normalize a wallet_tx_request payload into a consistent shape.\n * Returns `null` if the payload is missing the required `to` field.\n */\nexport function normalizeTxPayload(payload: unknown): WalletTxPayload | null {\n const root = asRecord(payload);\n const args = getToolArgs(payload);\n const ctx = asRecord(root?.ctx);\n\n const to = normalizeAddress(args.to);\n if (!to) return null;\n\n const valueRaw = args.value;\n const value =\n typeof valueRaw === \"string\"\n ? valueRaw\n : typeof valueRaw === \"number\" && Number.isFinite(valueRaw)\n ? String(Math.trunc(valueRaw))\n : undefined;\n\n const data = typeof args.data === \"string\" ? args.data : undefined;\n const chainId =\n parseChainId(args.chainId) ??\n parseChainId(args.chain_id) ??\n parseChainId(ctx?.user_chain_id) ??\n parseChainId(ctx?.userChainId);\n\n return { to, value, data, chainId };\n}\n\n/**\n * Normalize an EIP-712 signing request payload.\n */\nexport function normalizeEip712Payload(\n payload: unknown,\n): WalletEip712Payload {\n const args = getToolArgs(payload);\n const typedDataRaw = args.typed_data ?? args.typedData;\n let typedData: WalletEip712Payload[\"typed_data\"] | undefined;\n\n if (typeof typedDataRaw === \"string\") {\n try {\n const parsed = JSON.parse(typedDataRaw) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n typedData = parsed as WalletEip712Payload[\"typed_data\"];\n }\n } catch {\n typedData = undefined;\n }\n } else if (\n typedDataRaw &&\n typeof typedDataRaw === \"object\" &&\n !Array.isArray(typedDataRaw)\n ) {\n typedData = typedDataRaw as WalletEip712Payload[\"typed_data\"];\n }\n\n const description =\n typeof args.description === \"string\" ? args.description : undefined;\n\n return { typed_data: typedData, description };\n}\n\n/**\n * Convert normalized EIP-712 payloads into the viem signing shape used by both\n * the CLI and widget component layers.\n */\nexport function toViemSignTypedDataArgs(\n payload: WalletEip712Payload,\n): ViemSignTypedDataArgs | null {\n const typedData = payload.typed_data;\n const primaryType =\n typeof typedData?.primaryType === \"string\" &&\n typedData.primaryType.trim().length > 0\n ? typedData.primaryType\n : undefined;\n\n if (!typedData || !primaryType) {\n return null;\n }\n\n return {\n domain: asRecord(typedData.domain),\n types: Object.fromEntries(\n Object.entries(typedData.types ?? {}).filter(\n ([typeName]) => typeName !== \"EIP712Domain\",\n ),\n ) as ViemSignTypedDataArgs[\"types\"],\n primaryType,\n message: asRecord(typedData.message),\n };\n}\n","// =============================================================================\n// Session — High-level orchestrated client\n// =============================================================================\n//\n// Wraps AomiClient with polling, event dispatch, and wallet request management.\n// Ported from the React runtime (polling-controller, event-context, wallet-handler).\n//\n// Usage:\n// const session = new Session({ baseUrl: \"https://api.aomi.dev\" });\n// session.on(\"wallet_tx_request\", async (req) => {\n// const signed = await signer.signTransaction(req.payload);\n// await session.resolve(req.id, { txHash: signed.hash });\n// });\n// const result = await session.send(\"swap 1 ETH for USDC\");\n// session.close();\n\nimport { AomiClient } from \"./client\";\nimport type {\n AomiClientType,\n AomiClientOptions,\n AomiMessage,\n AomiChatResponse,\n AomiSSEEvent,\n AomiStateResponse,\n AomiSystemEvent,\n UserState,\n} from \"./types\";\nimport { addUserStateExt } from \"./types\";\nimport { TypedEventEmitter } from \"./event-emitter\";\nimport { unwrapSystemEvent } from \"./event-unwrap\";\nimport {\n normalizeTxPayload,\n normalizeEip712Payload,\n type WalletTxPayload,\n type WalletEip712Payload,\n} from \"./wallet-utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type WalletRequestKind = \"transaction\" | \"eip712_sign\";\n\nexport type WalletRequest = {\n id: string;\n kind: WalletRequestKind;\n payload: WalletTxPayload | WalletEip712Payload;\n timestamp: number;\n};\n\nexport type WalletRequestResult = {\n txHash?: string;\n signature?: string;\n amount?: string;\n};\n\nexport type SendResult = {\n messages: AomiMessage[];\n title?: string;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => sortJson(entry));\n }\n if (value && typeof value === \"object\") {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = sortJson((value as Record<string, unknown>)[key]);\n return acc;\n }, {});\n }\n return value;\n}\n\nfunction isSubsetMatch(expected: unknown, actual: unknown): boolean {\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual) || expected.length !== actual.length) {\n return false;\n }\n return expected.every((entry, index) =>\n isSubsetMatch(entry, actual[index]),\n );\n }\n\n if (expected && typeof expected === \"object\") {\n if (!actual || typeof actual !== \"object\" || Array.isArray(actual)) {\n return false;\n }\n\n return Object.entries(expected as Record<string, unknown>).every(\n ([key, value]) =>\n isSubsetMatch(value, (actual as Record<string, unknown>)[key]),\n );\n }\n\n return expected === actual;\n}\n\nexport type SessionOptions = {\n /** Session ID. Auto-generated (crypto.randomUUID) if omitted. */\n sessionId?: string;\n /** App for chat messages. Default: \"default\" */\n app?: string;\n /** User public key (wallet address). */\n publicKey?: string;\n /** API key override. */\n apiKey?: string;\n /** User state to send with requests (wallet connection info, etc). */\n userState?: UserState;\n /** Optional client type hint forwarded to the backend via userState.ext.client_type. */\n clientType?: AomiClientType;\n /** Stable client ID used for secret-vault association. */\n clientId?: string;\n /** Polling interval in ms. Default: 500 */\n pollIntervalMs?: number;\n /** Logger for debug output. Pass `console` for verbose logging. */\n logger?: { debug: (...args: unknown[]) => void };\n};\n\n/** Events emitted by Session. */\nexport type SessionEventMap = {\n /** A transaction signing request arrived from the backend. */\n wallet_tx_request: WalletRequest;\n /** An EIP-712 signing request arrived from the backend. */\n wallet_eip712_request: WalletRequest;\n /** A system notice from the backend. */\n system_notice: { message: string };\n /** A system error from the backend. */\n system_error: { message: string };\n /** An async callback event. */\n async_callback: Record<string, unknown>;\n /** SSE: tool execution in progress. */\n tool_update: AomiSSEEvent;\n /** SSE: tool execution completed. */\n tool_complete: AomiSSEEvent;\n /** Session title changed. */\n title_changed: { title: string };\n /** Messages updated (new messages from poll or send response). */\n messages: AomiMessage[];\n /** AI started processing. */\n processing_start: undefined;\n /** AI finished processing. */\n processing_end: undefined;\n /**\n * Backend transitioned from processing to idle (is_processing went false).\n * Unlike `processing_end`, this fires even when there are unresolved local\n * wallet requests. CLI consumers use it to know that all system events\n * (including wallet requests) have been delivered for the current turn.\n */\n backend_idle: undefined;\n /** An error occurred during polling or SSE. */\n error: { error: unknown };\n /** Wildcard: receives all events as { type, payload }. */\n \"*\": { type: string; payload: unknown };\n};\n\n// =============================================================================\n// Session Class\n// =============================================================================\n\nexport class ClientSession extends TypedEventEmitter<SessionEventMap> {\n /** The underlying low-level client. */\n readonly client: AomiClient;\n /** The session (thread) ID. */\n readonly sessionId: string;\n\n private app: string;\n private publicKey?: string;\n private apiKey?: string;\n private userState?: UserState;\n private clientId: string;\n private pollIntervalMs: number;\n private logger?: { debug: (...args: unknown[]) => void };\n\n // Internal state\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private unsubscribeSSE: (() => void) | null = null;\n private _isProcessing = false;\n private _backendWasProcessing = false;\n private walletRequests: WalletRequest[] = [];\n private walletRequestNextId = 1;\n private _messages: AomiMessage[] = [];\n private _title?: string;\n private closed = false;\n\n // For send() blocking behavior\n private pendingResolve: ((result: SendResult) => void) | null = null;\n\n constructor(\n clientOrOptions: AomiClient | AomiClientOptions,\n sessionOptions?: SessionOptions,\n ) {\n super();\n\n this.client =\n clientOrOptions instanceof AomiClient\n ? clientOrOptions\n : new AomiClient(clientOrOptions);\n\n this.sessionId = sessionOptions?.sessionId ?? crypto.randomUUID();\n this.app = sessionOptions?.app ?? \"default\";\n this.publicKey = sessionOptions?.publicKey;\n this.apiKey = sessionOptions?.apiKey;\n this.userState = sessionOptions?.clientType\n ? addUserStateExt(sessionOptions?.userState ?? {}, \"client_type\", sessionOptions.clientType)\n : sessionOptions?.userState;\n this.clientId = sessionOptions?.clientId ?? crypto.randomUUID();\n this.pollIntervalMs = sessionOptions?.pollIntervalMs ?? 500;\n this.logger = sessionOptions?.logger;\n\n // Start SSE subscription\n this.unsubscribeSSE = this.client.subscribeSSE(\n this.sessionId,\n (event) => this.handleSSEEvent(event),\n (error) => this.emit(\"error\", { error }),\n );\n }\n\n // ===========================================================================\n // Public API — Chat\n // ===========================================================================\n\n /**\n * Send a message and wait for the AI to finish processing.\n *\n * The returned promise resolves when `is_processing` becomes `false` AND\n * there are no pending wallet requests. If a wallet request arrives\n * mid-processing, polling continues but the promise pauses until the\n * request is resolved or rejected via `resolve()` / `reject()`.\n */\n async send(message: string): Promise<SendResult> {\n this.assertOpen();\n\n const response = await this.client.sendMessage(this.sessionId, message, {\n app: this.app,\n publicKey: this.publicKey,\n apiKey: this.apiKey,\n userState: this.userState,\n clientId: this.clientId,\n });\n\n this.assertUserStateAligned(response.user_state);\n this.applyState(response);\n\n if (!response.is_processing && this.walletRequests.length === 0) {\n return { messages: this._messages, title: this._title };\n }\n\n this._isProcessing = true;\n this.emit(\"processing_start\", undefined);\n\n return new Promise<SendResult>((resolve) => {\n this.pendingResolve = resolve;\n this.startPolling();\n });\n }\n\n /**\n * Send a message without waiting for completion.\n * Polling starts in the background; listen to events for updates.\n */\n async sendAsync(message: string): Promise<AomiChatResponse> {\n this.assertOpen();\n\n const response = await this.client.sendMessage(this.sessionId, message, {\n app: this.app,\n publicKey: this.publicKey,\n apiKey: this.apiKey,\n userState: this.userState,\n clientId: this.clientId,\n });\n\n this.assertUserStateAligned(response.user_state);\n this.applyState(response);\n\n if (response.is_processing) {\n this._isProcessing = true;\n this.emit(\"processing_start\", undefined);\n this.startPolling();\n }\n\n return response;\n }\n\n // ===========================================================================\n // Public API — Wallet Request Resolution\n // ===========================================================================\n\n /**\n * Resolve a pending wallet request (transaction or EIP-712 signing).\n * Sends the result to the backend and resumes polling.\n */\n async resolve(requestId: string, result: WalletRequestResult): Promise<void> {\n const req = this.removeWalletRequest(requestId);\n if (!req) {\n throw new Error(`No pending wallet request with id \"${requestId}\"`);\n }\n\n if (req.kind === \"transaction\") {\n await this.sendSystemEvent(\"wallet:tx_complete\", {\n txHash: result.txHash ?? \"\",\n status: \"success\",\n amount: result.amount,\n });\n } else {\n const eip712Payload = req.payload as WalletEip712Payload;\n await this.sendSystemEvent(\"wallet_eip712_response\", {\n status: \"success\",\n signature: result.signature,\n description: eip712Payload.description,\n });\n }\n\n // Resume polling if still processing\n if (this._isProcessing) {\n this.startPolling();\n }\n }\n\n /**\n * Reject a pending wallet request.\n * Sends an error to the backend and resumes polling.\n */\n async reject(requestId: string, reason?: string): Promise<void> {\n const req = this.removeWalletRequest(requestId);\n if (!req) {\n throw new Error(`No pending wallet request with id \"${requestId}\"`);\n }\n\n if (req.kind === \"transaction\") {\n await this.sendSystemEvent(\"wallet:tx_complete\", {\n txHash: \"\",\n status: \"failed\",\n });\n } else {\n const eip712Payload = req.payload as WalletEip712Payload;\n await this.sendSystemEvent(\"wallet_eip712_response\", {\n status: \"failed\",\n error: reason ?? \"Request rejected\",\n description: eip712Payload.description,\n });\n }\n\n if (this._isProcessing) {\n this.startPolling();\n }\n }\n\n // ===========================================================================\n // Public API — Control\n // ===========================================================================\n\n /**\n * Cancel the AI's current response.\n */\n async interrupt(): Promise<void> {\n this.stopPolling();\n const response = await this.client.interrupt(this.sessionId);\n this.applyState(response);\n this._isProcessing = false;\n this.emit(\"processing_end\", undefined);\n this.resolvePending();\n }\n\n /**\n * Close the session. Stops polling, unsubscribes SSE, removes all listeners.\n * The session cannot be used after closing.\n */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.stopPolling();\n this.unsubscribeSSE?.();\n this.unsubscribeSSE = null;\n this.resolvePending();\n this.removeAllListeners();\n }\n\n // ===========================================================================\n // Public API — Accessors\n // ===========================================================================\n\n /** Current messages in the session. */\n getMessages(): AomiMessage[] {\n return this._messages;\n }\n\n /** Current session title. */\n getTitle(): string | undefined {\n return this._title;\n }\n\n /** Pending wallet requests waiting for resolve/reject. */\n getPendingRequests(): WalletRequest[] {\n return [...this.walletRequests];\n }\n\n /** Whether the AI is currently processing. */\n getIsProcessing(): boolean {\n return this._isProcessing;\n }\n\n resolveUserState(userState: UserState): void {\n this.userState = userState;\n\n const address = userState[\"address\"];\n if (typeof address === \"string\" && address.length > 0) {\n this.publicKey = address;\n }\n }\n\n setClientType(clientType: AomiClientType): void {\n this.resolveUserState(addUserStateExt(this.userState ?? {}, \"client_type\", clientType));\n }\n\n addExtValue(key: string, value: unknown): void {\n const current = this.userState ?? {};\n const currentExt = isRecord(current[\"ext\"]) ? current[\"ext\"] : {};\n this.resolveUserState({\n ...current,\n ext: {\n ...currentExt,\n [key]: value,\n },\n });\n }\n\n removeExtValue(key: string): void {\n if (!this.userState) return;\n const currentExt = this.userState[\"ext\"];\n if (!isRecord(currentExt)) return;\n\n const nextExt = { ...currentExt };\n delete nextExt[key];\n\n const nextState = { ...this.userState };\n if (Object.keys(nextExt).length === 0) {\n delete nextState[\"ext\"];\n } else {\n nextState[\"ext\"] = nextExt;\n }\n this.resolveUserState(nextState);\n }\n\n resolveWallet(address: string, chainId?: number): void {\n this.resolveUserState({ address, chainId: chainId ?? 1, isConnected: true });\n }\n\n async syncUserState(): Promise<AomiStateResponse> {\n this.assertOpen();\n\n const state = await this.client.fetchState(this.sessionId, this.userState, this.clientId);\n this.assertUserStateAligned(state.user_state);\n this.applyState(state);\n return state;\n }\n\n // ===========================================================================\n // Internal — Polling (ported from PollingController)\n // ===========================================================================\n\n private startPolling(): void {\n if (this.pollTimer || this.closed) return;\n\n this._backendWasProcessing = true;\n this.logger?.debug(\"[session] polling started\", this.sessionId);\n this.pollTimer = setInterval(() => {\n void this.pollTick();\n }, this.pollIntervalMs);\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n this.logger?.debug(\"[session] polling stopped\", this.sessionId);\n }\n }\n\n private async pollTick(): Promise<void> {\n if (!this.pollTimer) return;\n\n try {\n const state = await this.client.fetchState(\n this.sessionId,\n this.userState,\n this.clientId,\n );\n\n // Guard: polling may have been stopped while awaiting fetch\n if (!this.pollTimer) return;\n\n this.assertUserStateAligned(state.user_state);\n this.applyState(state);\n\n // Detect backend processing → idle transition.\n // Fires even when local wallet requests are pending, so CLI consumers\n // know all system events for this turn have been delivered.\n if (this._backendWasProcessing && !state.is_processing) {\n this.emit(\"backend_idle\", undefined);\n }\n this._backendWasProcessing = !!state.is_processing;\n\n if (!state.is_processing && this.walletRequests.length === 0) {\n this.stopPolling();\n this._isProcessing = false;\n this.emit(\"processing_end\", undefined);\n this.resolvePending();\n }\n } catch (error) {\n this.logger?.debug(\"[session] poll error\", error);\n this.emit(\"error\", { error });\n }\n }\n\n // ===========================================================================\n // Internal — State Application\n // ===========================================================================\n\n private applyState(\n state: Pick<\n AomiStateResponse,\n \"messages\" | \"system_events\" | \"title\" | \"is_processing\"\n >,\n ): void {\n if (state.messages) {\n this._messages = state.messages;\n this.emit(\"messages\", this._messages);\n }\n\n if (state.title) {\n this._title = state.title;\n }\n\n if (state.system_events?.length) {\n this.dispatchSystemEvents(state.system_events);\n }\n }\n\n private dispatchSystemEvents(events: AomiSystemEvent[]): void {\n for (const event of events) {\n const unwrapped = unwrapSystemEvent(event);\n if (!unwrapped) continue;\n\n if (unwrapped.type === \"wallet_tx_request\") {\n const payload = normalizeTxPayload(unwrapped.payload);\n if (payload) {\n const req = this.enqueueWalletRequest(\"transaction\", payload);\n this.emit(\"wallet_tx_request\", req);\n }\n } else if (unwrapped.type === \"wallet_eip712_request\") {\n const payload = normalizeEip712Payload(unwrapped.payload ?? {});\n const req = this.enqueueWalletRequest(\"eip712_sign\", payload);\n this.emit(\"wallet_eip712_request\", req);\n } else if (\n unwrapped.type === \"system_notice\" ||\n unwrapped.type === \"system_error\" ||\n unwrapped.type === \"async_callback\"\n ) {\n // These match known event map keys — emit directly\n this.emit(\n unwrapped.type as keyof SessionEventMap,\n unwrapped.payload as never,\n );\n }\n }\n }\n\n // ===========================================================================\n // Internal — SSE Handling\n // ===========================================================================\n\n private handleSSEEvent(event: AomiSSEEvent): void {\n if (event.type === \"title_changed\" && event.new_title) {\n this._title = event.new_title;\n this.emit(\"title_changed\", { title: event.new_title });\n } else if (event.type === \"tool_update\") {\n this.emit(\"tool_update\", event);\n } else if (event.type === \"tool_complete\") {\n this.emit(\"tool_complete\", event);\n }\n }\n\n // ===========================================================================\n // Internal — Wallet Request Queue\n // ===========================================================================\n\n private enqueueWalletRequest(\n kind: WalletRequestKind,\n payload: WalletTxPayload | WalletEip712Payload,\n ): WalletRequest {\n const req: WalletRequest = {\n id: `wreq-${this.walletRequestNextId++}`,\n kind,\n payload,\n timestamp: Date.now(),\n };\n this.walletRequests.push(req);\n return req;\n }\n\n private removeWalletRequest(id: string): WalletRequest | null {\n const idx = this.walletRequests.findIndex((r) => r.id === id);\n if (idx === -1) return null;\n return this.walletRequests.splice(idx, 1)[0];\n }\n\n // ===========================================================================\n // Internal — Helpers\n // ===========================================================================\n\n private async sendSystemEvent(\n type: string,\n payload: unknown,\n ): Promise<void> {\n const message = JSON.stringify({ type, payload });\n await this.client.sendSystemMessage(this.sessionId, message);\n }\n\n private resolvePending(): void {\n if (this.pendingResolve) {\n const resolve = this.pendingResolve;\n this.pendingResolve = null;\n resolve({ messages: this._messages, title: this._title });\n }\n }\n\n private assertOpen(): void {\n if (this.closed) {\n throw new Error(\"Session is closed\");\n }\n }\n\n private assertUserStateAligned(actualUserState?: UserState | null): void {\n if (!this.userState || !actualUserState) {\n return;\n }\n\n if (!isSubsetMatch(this.userState, actualUserState)) {\n const expected = JSON.stringify(sortJson(this.userState));\n const actual = JSON.stringify(sortJson(actualUserState));\n throw new Error(\n `Backend user_state mismatch. expected subset=${expected} actual=${actual}`,\n );\n }\n }\n}\n","import type { Chain, Hex } from \"viem\";\n\n// ---------------------------------------------------------------------------\n// Enums / Literal Types\n// ---------------------------------------------------------------------------\n\nexport type AAExecutionMode = \"4337\" | \"7702\";\nexport type AASponsorshipMode = \"disabled\" | \"optional\" | \"required\";\n\n// ---------------------------------------------------------------------------\n// Call Types\n// ---------------------------------------------------------------------------\n\nexport type WalletExecutionCall = {\n to: string;\n value: string;\n data?: string;\n chainId: number;\n};\n\nexport type WalletAtomicCapability = {\n atomic?: {\n status?: string;\n };\n};\n\nexport type WalletPrimitiveCall = {\n to: Hex;\n value: bigint;\n data?: Hex;\n};\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface AAChainConfig {\n chainId: number;\n enabled: boolean;\n defaultMode: AAExecutionMode;\n supportedModes: AAExecutionMode[];\n allowBatching: boolean;\n sponsorship: AASponsorshipMode;\n}\n\nexport interface AAConfig {\n enabled: boolean;\n provider: string;\n fallbackToEoa: boolean;\n chains: AAChainConfig[];\n}\n\n// ---------------------------------------------------------------------------\n// Execution Plan\n// ---------------------------------------------------------------------------\n\nexport interface AAExecutionPlan {\n provider: string;\n chainId: number;\n mode: AAExecutionMode;\n batchingEnabled: boolean;\n sponsorship: AASponsorshipMode;\n fallbackToEoa: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Provider Abstractions\n// ---------------------------------------------------------------------------\n\nexport interface AALike {\n provider: string;\n mode: string;\n AAAddress?: Hex;\n delegationAddress?: Hex;\n sendTransaction: (call: WalletPrimitiveCall) => Promise<{ transactionHash: string }>;\n sendBatchTransaction: (calls: WalletPrimitiveCall[]) => Promise<{ transactionHash: string }>;\n}\n\nexport interface AAProviderQuery<TAA extends AALike = AALike> {\n AA?: TAA | null;\n isPending?: boolean;\n error?: Error | null;\n}\n\nexport interface AAProviderState<TAA extends AALike = AALike> {\n plan: AAExecutionPlan | null;\n AA?: TAA | null;\n isPending: boolean;\n error: Error | null;\n query?: AAProviderQuery<TAA>;\n}\n\n// ---------------------------------------------------------------------------\n// Execution Params / Results\n// ---------------------------------------------------------------------------\n\nexport interface TransactionExecutionResult {\n txHash: string;\n txHashes: string[];\n executionKind: string;\n batched: boolean;\n sponsored: boolean;\n AAAddress?: Hex;\n delegationAddress?: Hex;\n}\n\nexport interface SendCallsSyncArgs {\n calls: WalletPrimitiveCall[];\n capabilities?: {\n atomic?: {\n required?: boolean;\n };\n };\n}\n\nexport interface ExecuteWalletCallsParams<\n TAA extends AALike = AALike,\n> {\n callList: WalletExecutionCall[];\n currentChainId: number;\n capabilities: Record<string, WalletAtomicCapability> | undefined;\n localPrivateKey: `0x${string}` | null;\n providerState: AAProviderState<TAA>;\n sendCallsSyncAsync: (args: SendCallsSyncArgs) => Promise<unknown>;\n sendTransactionAsync: (args: {\n chainId: number;\n to: Hex;\n value: bigint;\n data?: Hex;\n }) => Promise<string>;\n switchChainAsync: (params: { chainId: number }) => Promise<unknown>;\n chainsById: Record<number, Chain>;\n getPreferredRpcUrl: (chain: Chain) => string;\n}\n\n// ---------------------------------------------------------------------------\n// Validation Sets\n// ---------------------------------------------------------------------------\n\nexport const MODES = new Set<AAExecutionMode>([\"4337\", \"7702\"]);\nexport const SPONSORSHIP_MODES = new Set<AASponsorshipMode>([\n \"disabled\",\n \"optional\",\n \"required\",\n]);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction assertChainConfig(\n value: unknown,\n index: number,\n): asserts value is AAChainConfig {\n if (!isObject(value)) {\n throw new Error(`Invalid AA config chain at index ${index}: expected object`);\n }\n\n if (typeof value.chainId !== \"number\") {\n throw new Error(`Invalid AA config chain at index ${index}: chainId must be a number`);\n }\n if (typeof value.enabled !== \"boolean\") {\n throw new Error(`Invalid AA config chain ${value.chainId}: enabled must be a boolean`);\n }\n if (!MODES.has(value.defaultMode as AAExecutionMode)) {\n throw new Error(`Invalid AA config chain ${value.chainId}: unsupported defaultMode`);\n }\n if (!Array.isArray(value.supportedModes) || value.supportedModes.length === 0) {\n throw new Error(`Invalid AA config chain ${value.chainId}: supportedModes must be a non-empty array`);\n }\n if (!value.supportedModes.every((mode) => MODES.has(mode as AAExecutionMode))) {\n throw new Error(`Invalid AA config chain ${value.chainId}: supportedModes contains an unsupported mode`);\n }\n if (!value.supportedModes.includes(value.defaultMode)) {\n throw new Error(`Invalid AA config chain ${value.chainId}: defaultMode must be in supportedModes`);\n }\n if (typeof value.allowBatching !== \"boolean\") {\n throw new Error(`Invalid AA config chain ${value.chainId}: allowBatching must be a boolean`);\n }\n if (!SPONSORSHIP_MODES.has(value.sponsorship as AASponsorshipMode)) {\n throw new Error(`Invalid AA config chain ${value.chainId}: unsupported sponsorship mode`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Config Parsing & Planning\n// ---------------------------------------------------------------------------\n\nexport function parseAAConfig(\n value: unknown,\n): AAConfig {\n if (!isObject(value)) {\n throw new Error(\"Invalid AA config: expected object\");\n }\n\n if (typeof value.enabled !== \"boolean\") {\n throw new Error(\"Invalid AA config: enabled must be a boolean\");\n }\n if (typeof value.provider !== \"string\" || !value.provider) {\n throw new Error(\"Invalid AA config: provider must be a non-empty string\");\n }\n if (typeof value.fallbackToEoa !== \"boolean\") {\n throw new Error(\"Invalid AA config: fallbackToEoa must be a boolean\");\n }\n if (!Array.isArray(value.chains)) {\n throw new Error(\"Invalid AA config: chains must be an array\");\n }\n\n value.chains.forEach((chain, index) => assertChainConfig(chain, index));\n\n return {\n enabled: value.enabled,\n provider: value.provider as string,\n fallbackToEoa: value.fallbackToEoa,\n chains: value.chains as AAChainConfig[],\n };\n}\n\nexport function getAAChainConfig(\n config: AAConfig,\n calls: WalletExecutionCall[],\n chainsById: Record<number, Chain>,\n): AAChainConfig | null {\n if (!config.enabled || calls.length === 0) {\n return null;\n }\n\n const chainIds = Array.from(new Set(calls.map((call) => call.chainId)));\n if (chainIds.length !== 1) {\n return null;\n }\n\n const chainId = chainIds[0];\n if (!chainsById[chainId]) {\n return null;\n }\n\n const chainConfig = config.chains.find((item) => item.chainId === chainId);\n if (!chainConfig?.enabled) {\n return null;\n }\n if (calls.length > 1 && !chainConfig.allowBatching) {\n return null;\n }\n\n return chainConfig;\n}\n\nexport function buildAAExecutionPlan(\n config: AAConfig,\n chainConfig: AAChainConfig,\n): AAExecutionPlan {\n const mode = chainConfig.supportedModes.includes(chainConfig.defaultMode)\n ? chainConfig.defaultMode\n : chainConfig.supportedModes[0];\n\n if (!mode) {\n throw new Error(`No smart account mode configured for chain ${chainConfig.chainId}`);\n }\n\n return {\n provider: config.provider,\n chainId: chainConfig.chainId,\n mode,\n batchingEnabled: chainConfig.allowBatching,\n sponsorship: chainConfig.sponsorship,\n fallbackToEoa: config.fallbackToEoa,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Readiness Check\n// ---------------------------------------------------------------------------\n\nexport function getWalletExecutorReady(\n providerState: AAProviderState,\n): boolean {\n return (\n !providerState.plan ||\n (!providerState.isPending &&\n (Boolean(providerState.AA) ||\n Boolean(providerState.error) ||\n providerState.plan.fallbackToEoa))\n );\n}\n\n// ---------------------------------------------------------------------------\n// Execution\n// ---------------------------------------------------------------------------\n\nexport function mapCall(call: WalletExecutionCall): WalletPrimitiveCall {\n return {\n to: call.to as Hex,\n value: BigInt(call.value),\n data: call.data ? (call.data as Hex) : undefined,\n };\n}\n\nexport const DEFAULT_AA_CONFIG: AAConfig = {\n enabled: true,\n provider: \"alchemy\",\n fallbackToEoa: true,\n chains: [\n {\n chainId: 1,\n enabled: true,\n defaultMode: \"7702\",\n supportedModes: [\"4337\", \"7702\"],\n allowBatching: true,\n sponsorship: \"optional\",\n },\n {\n chainId: 137,\n enabled: true,\n defaultMode: \"4337\",\n supportedModes: [\"4337\", \"7702\"],\n allowBatching: true,\n sponsorship: \"optional\",\n },\n {\n chainId: 42161,\n enabled: true,\n defaultMode: \"4337\",\n supportedModes: [\"4337\", \"7702\"],\n allowBatching: true,\n sponsorship: \"optional\",\n },\n {\n chainId: 10,\n enabled: true,\n defaultMode: \"4337\",\n supportedModes: [\"4337\", \"7702\"],\n allowBatching: true,\n sponsorship: \"optional\",\n },\n {\n chainId: 8453,\n enabled: true,\n defaultMode: \"4337\",\n supportedModes: [\"4337\", \"7702\"],\n allowBatching: true,\n sponsorship: \"optional\",\n },\n ],\n};\n\nexport const DISABLED_PROVIDER_STATE: AAProviderState = {\n plan: null,\n AA: undefined,\n isPending: false,\n error: null,\n};\n\nexport async function executeWalletCalls(\n params: ExecuteWalletCallsParams,\n): Promise<TransactionExecutionResult> {\n const {\n callList,\n currentChainId,\n capabilities,\n localPrivateKey,\n providerState,\n sendCallsSyncAsync,\n sendTransactionAsync,\n switchChainAsync,\n chainsById,\n getPreferredRpcUrl,\n } = params;\n\n if (providerState.plan && providerState.AA) {\n return executeViaAA(callList, providerState);\n }\n\n if (providerState.plan && providerState.error && !providerState.plan.fallbackToEoa) {\n throw providerState.error;\n }\n\n return executeViaEoa({\n callList,\n currentChainId,\n capabilities,\n localPrivateKey,\n sendCallsSyncAsync,\n sendTransactionAsync,\n switchChainAsync,\n chainsById,\n getPreferredRpcUrl,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal Execution Paths\n// ---------------------------------------------------------------------------\n\nasync function executeViaAA(\n callList: WalletExecutionCall[],\n providerState: AAProviderState,\n): Promise<TransactionExecutionResult> {\n const AA = providerState.AA;\n const plan = providerState.plan;\n\n if (!AA || !plan) {\n throw providerState.error ?? new Error(\"smart_account_unavailable\");\n }\n\n const callsPayload = callList.map(mapCall);\n const receipt =\n callList.length > 1\n ? await AA.sendBatchTransaction(callsPayload)\n : await AA.sendTransaction(callsPayload[0]);\n const txHash = receipt.transactionHash;\n const providerPrefix = AA.provider.toLowerCase();\n\n // For 7702, the SDK may not provide the delegation address (or provide the\n // EOA which is already filtered out by adaptSmartAccount). Fall back to\n // reading the authorization list from the on-chain transaction.\n let delegationAddress: Hex | undefined =\n AA.mode === \"7702\" ? AA.delegationAddress : undefined;\n\n if (AA.mode === \"7702\" && !delegationAddress) {\n delegationAddress = await resolve7702Delegation(txHash, callList);\n }\n\n return {\n txHash,\n txHashes: [txHash],\n executionKind: `${providerPrefix}_${AA.mode}`,\n batched: callList.length > 1,\n sponsored: plan.sponsorship !== \"disabled\",\n AAAddress: AA.AAAddress,\n delegationAddress,\n };\n}\n\n/**\n * Best-effort extraction of the 7702 delegation target from the on-chain\n * transaction's authorization list. Returns `undefined` on any failure so\n * the caller can safely fall through.\n */\nasync function resolve7702Delegation(\n txHash: string,\n callList: WalletExecutionCall[],\n): Promise<Hex | undefined> {\n try {\n const { createPublicClient, http } = await import(\"viem\");\n const chainId = callList[0]?.chainId;\n if (!chainId) return undefined;\n\n const { mainnet, polygon, arbitrum, optimism, base } = await import(\"viem/chains\");\n const knownChains: Record<number, Parameters<typeof createPublicClient>[0][\"chain\"]> = {\n 1: mainnet, 137: polygon, 42161: arbitrum, 10: optimism, 8453: base,\n };\n const chain = knownChains[chainId];\n if (!chain) return undefined;\n\n const client = createPublicClient({ chain, transport: http() });\n const tx = await client.getTransaction({ hash: txHash as Hex });\n const authList = (\n tx as unknown as {\n authorizationList?: Array<{ address?: Hex; contractAddress?: Hex }>;\n }\n ).authorizationList;\n const target = authList?.[0]?.address ?? authList?.[0]?.contractAddress;\n if (target) {\n return target;\n }\n } catch {\n // Best-effort — don't fail the whole execution.\n }\n return undefined;\n}\n\nasync function executeViaEoa({\n callList,\n currentChainId,\n capabilities,\n localPrivateKey,\n sendCallsSyncAsync,\n sendTransactionAsync,\n switchChainAsync,\n chainsById,\n getPreferredRpcUrl,\n}: Omit<ExecuteWalletCallsParams, \"providerState\">): Promise<TransactionExecutionResult> {\n const { createPublicClient, createWalletClient, http } = await import(\"viem\");\n const { privateKeyToAccount } = await import(\"viem/accounts\");\n\n const hashes: string[] = [];\n\n if (localPrivateKey) {\n for (const call of callList) {\n const chain = chainsById[call.chainId];\n if (!chain) {\n throw new Error(`Unsupported chain ${call.chainId}`);\n }\n const rpcUrl = getPreferredRpcUrl(chain);\n if (!rpcUrl) {\n throw new Error(`No RPC for chain ${call.chainId}`);\n }\n\n const account = privateKeyToAccount(localPrivateKey);\n const walletClient = createWalletClient({\n account,\n chain,\n transport: http(rpcUrl),\n });\n const hash = await walletClient.sendTransaction({\n account,\n to: call.to as Hex,\n value: BigInt(call.value),\n data: call.data ? (call.data as Hex) : undefined,\n });\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n await publicClient.waitForTransactionReceipt({ hash });\n hashes.push(hash);\n }\n\n return {\n txHash: hashes[hashes.length - 1],\n txHashes: hashes,\n executionKind: \"eoa\",\n batched: hashes.length > 1,\n sponsored: false,\n };\n }\n\n const chainIds = Array.from(new Set(callList.map((call) => call.chainId)));\n if (chainIds.length > 1) {\n throw new Error(\"mixed_chain_bundle_not_supported\");\n }\n\n const chainId = chainIds[0];\n if (currentChainId !== chainId) {\n await switchChainAsync({ chainId });\n }\n\n const chainCaps = capabilities?.[`eip155:${chainId}`];\n const atomicStatus = chainCaps?.atomic?.status;\n const canUseSendCalls = atomicStatus === \"supported\" || atomicStatus === \"ready\";\n\n if (canUseSendCalls) {\n const batchResult = await sendCallsSyncAsync({\n calls: callList.map(mapCall),\n capabilities: {\n atomic: {\n required: true,\n },\n },\n });\n\n const receipts =\n (batchResult as { receipts?: Array<{ transactionHash?: string }> }).receipts ??\n [];\n for (const receipt of receipts) {\n if (receipt.transactionHash) {\n hashes.push(receipt.transactionHash);\n }\n }\n } else {\n for (const call of callList) {\n const hash = await sendTransactionAsync({\n chainId: call.chainId,\n to: call.to as Hex,\n value: BigInt(call.value),\n data: call.data ? (call.data as Hex) : undefined,\n });\n hashes.push(hash);\n }\n }\n\n return {\n txHash: hashes[hashes.length - 1],\n txHashes: hashes,\n executionKind: \"eoa\",\n batched: hashes.length > 1,\n sponsored: false,\n };\n}\n","// ---------------------------------------------------------------------------\n// Env Var Constants\n// ---------------------------------------------------------------------------\n\nexport const ALCHEMY_API_KEY_ENVS = [\n \"ALCHEMY_API_KEY\",\n \"NEXT_PUBLIC_ALCHEMY_API_KEY\",\n] as const;\n\nexport const ALCHEMY_GAS_POLICY_ENVS = [\n \"ALCHEMY_GAS_POLICY_ID\",\n \"NEXT_PUBLIC_ALCHEMY_GAS_POLICY_ID\",\n] as const;\n\nexport const PIMLICO_API_KEY_ENVS = [\n \"PIMLICO_API_KEY\",\n \"NEXT_PUBLIC_PIMLICO_API_KEY\",\n] as const;\n\n// ---------------------------------------------------------------------------\n// Core Env Reading\n// ---------------------------------------------------------------------------\n\n/**\n * Reads the first non-empty env var from `candidates`.\n * When `publicOnly` is true, only `NEXT_PUBLIC_*` names are considered.\n */\nexport function readEnv(\n candidates: readonly string[],\n options: { publicOnly?: boolean } = {},\n): string | undefined {\n const { publicOnly = false } = options;\n\n for (const name of candidates) {\n if (publicOnly && !name.startsWith(\"NEXT_PUBLIC_\")) {\n continue;\n }\n const value = process.env[name]?.trim();\n if (value) return value;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Gas Policy Resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves a gas policy ID by trying chain-specific env vars first, then base candidates.\n */\nexport function readGasPolicyEnv(\n chainId: number,\n chainSlugById: Record<number, string>,\n baseCandidates: readonly string[],\n options: { publicOnly?: boolean } = {},\n): string | undefined {\n const slug = chainSlugById[chainId];\n\n if (slug) {\n const chainSpecific = baseCandidates.map(\n (base) => `${base}_${slug.toUpperCase()}`,\n );\n const found = readEnv(chainSpecific, options);\n if (found) return found;\n }\n\n return readEnv(baseCandidates, options);\n}\n\n// ---------------------------------------------------------------------------\n// Provider Detection\n// ---------------------------------------------------------------------------\n\nexport type AAProvider = \"alchemy\" | \"pimlico\";\n\n/**\n * Returns true if the given provider has a configured API key.\n */\nexport function isProviderConfigured(\n provider: AAProvider,\n options: { publicOnly?: boolean } = {},\n): boolean {\n return provider === \"alchemy\"\n ? Boolean(readEnv(ALCHEMY_API_KEY_ENVS, options))\n : Boolean(readEnv(PIMLICO_API_KEY_ENVS, options));\n}\n\n/**\n * Picks the first configured provider (alchemy > pimlico).\n * Throws if neither is configured.\n */\nexport function resolveDefaultProvider(\n options: { publicOnly?: boolean } = {},\n): AAProvider {\n if (isProviderConfigured(\"alchemy\", options)) return \"alchemy\";\n if (isProviderConfigured(\"pimlico\", options)) return \"pimlico\";\n throw new Error(\n \"AA requires provider credentials. Set ALCHEMY_API_KEY or PIMLICO_API_KEY, or use --eoa.\",\n );\n}\n","import type { Chain } from \"viem\";\n\nimport type {\n AAConfig,\n AAChainConfig,\n AAExecutionMode,\n AAExecutionPlan,\n WalletExecutionCall,\n} from \"./types\";\n\nimport {\n DEFAULT_AA_CONFIG,\n buildAAExecutionPlan,\n getAAChainConfig,\n} from \"./types\";\n\nimport {\n readEnv,\n readGasPolicyEnv,\n ALCHEMY_API_KEY_ENVS,\n ALCHEMY_GAS_POLICY_ENVS,\n PIMLICO_API_KEY_ENVS,\n} from \"./env\";\n\n// ---------------------------------------------------------------------------\n// Alchemy Config Resolution\n// ---------------------------------------------------------------------------\n\nexport interface AlchemyResolveOptions {\n calls: WalletExecutionCall[] | null;\n localPrivateKey?: `0x${string}` | null;\n accountAbstractionConfig?: AAConfig;\n chainsById: Record<number, Chain>;\n chainSlugById?: Record<number, string>;\n getPreferredRpcUrl?: (chain: Chain) => string;\n modeOverride?: AAExecutionMode;\n publicOnly?: boolean;\n throwOnMissingConfig?: boolean;\n /**\n * Pre-resolved API key. Use this in Next.js client-side code where\n * dynamic `process.env[name]` access doesn't work.\n */\n apiKey?: string;\n gasPolicyId?: string;\n}\n\nexport interface AlchemyResolvedConfig {\n chainConfig: AAChainConfig;\n plan: AAExecutionPlan;\n apiKey: string;\n chain: Chain;\n rpcUrl: string;\n gasPolicyId?: string;\n mode: AAExecutionMode;\n}\n\nexport function resolveAlchemyConfig(\n options: AlchemyResolveOptions,\n): AlchemyResolvedConfig | null {\n const {\n calls,\n localPrivateKey,\n accountAbstractionConfig = DEFAULT_AA_CONFIG,\n chainsById,\n chainSlugById = {},\n getPreferredRpcUrl = (chain) => chain.rpcUrls.default.http[0] ?? \"\",\n modeOverride,\n publicOnly = false,\n throwOnMissingConfig = false,\n apiKey: preResolvedApiKey,\n gasPolicyId: preResolvedGasPolicyId,\n } = options;\n\n if (!calls || localPrivateKey) {\n return null;\n }\n\n const config = {\n ...accountAbstractionConfig,\n provider: \"alchemy\",\n };\n\n const chainConfig = getAAChainConfig(config, calls, chainsById);\n if (!chainConfig) {\n if (throwOnMissingConfig) {\n const chainIds = Array.from(new Set(calls.map((c) => c.chainId)));\n throw new Error(\n `AA is not configured for chain ${chainIds[0]}, or batching is disabled for that chain.`,\n );\n }\n return null;\n }\n\n const apiKey = preResolvedApiKey ?? readEnv(ALCHEMY_API_KEY_ENVS, { publicOnly });\n if (!apiKey) {\n if (throwOnMissingConfig) {\n throw new Error(\"Alchemy AA requires ALCHEMY_API_KEY.\");\n }\n return null;\n }\n\n const chain = chainsById[chainConfig.chainId];\n if (!chain) {\n return null;\n }\n\n const gasPolicyId = preResolvedGasPolicyId\n ?? readGasPolicyEnv(\n chainConfig.chainId,\n chainSlugById,\n ALCHEMY_GAS_POLICY_ENVS,\n { publicOnly },\n );\n\n if (chainConfig.sponsorship === \"required\" && !gasPolicyId) {\n if (throwOnMissingConfig) {\n throw new Error(\n `Alchemy gas policy required for chain ${chainConfig.chainId} but not configured.`,\n );\n }\n return null;\n }\n\n if (modeOverride && !chainConfig.supportedModes.includes(modeOverride)) {\n if (throwOnMissingConfig) {\n throw new Error(\n `AA mode \"${modeOverride}\" is not supported on chain ${chainConfig.chainId}.`,\n );\n }\n return null;\n }\n\n const resolvedChainConfig = modeOverride\n ? { ...chainConfig, defaultMode: modeOverride }\n : chainConfig;\n\n const plan = buildAAExecutionPlan(config, resolvedChainConfig);\n\n return {\n chainConfig: resolvedChainConfig,\n plan,\n apiKey,\n chain,\n rpcUrl: getPreferredRpcUrl(chain),\n gasPolicyId,\n mode: resolvedChainConfig.defaultMode,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pimlico Config Resolution\n// ---------------------------------------------------------------------------\n\nexport interface PimlicoResolveOptions {\n calls: WalletExecutionCall[] | null;\n localPrivateKey?: `0x${string}` | null;\n accountAbstractionConfig?: AAConfig;\n chainsById: Record<number, Chain>;\n rpcUrl?: string;\n modeOverride?: AAExecutionMode;\n publicOnly?: boolean;\n throwOnMissingConfig?: boolean;\n /**\n * Pre-resolved API key. Use this in Next.js client-side code where\n * dynamic `process.env[name]` access doesn't work.\n */\n apiKey?: string;\n}\n\nexport interface PimlicoResolvedConfig {\n chainConfig: AAChainConfig;\n plan: AAExecutionPlan;\n apiKey: string;\n chain: Chain;\n rpcUrl?: string;\n mode: AAExecutionMode;\n}\n\nexport function resolvePimlicoConfig(\n options: PimlicoResolveOptions,\n): PimlicoResolvedConfig | null {\n const {\n calls,\n localPrivateKey,\n accountAbstractionConfig = DEFAULT_AA_CONFIG,\n chainsById,\n rpcUrl,\n modeOverride,\n publicOnly = false,\n throwOnMissingConfig = false,\n apiKey: preResolvedApiKey,\n } = options;\n\n if (!calls || localPrivateKey) {\n return null;\n }\n\n const config = {\n ...accountAbstractionConfig,\n provider: \"pimlico\",\n };\n\n const chainConfig = getAAChainConfig(config, calls, chainsById);\n if (!chainConfig) {\n if (throwOnMissingConfig) {\n const chainIds = Array.from(new Set(calls.map((c) => c.chainId)));\n throw new Error(\n `AA is not configured for chain ${chainIds[0]}, or batching is disabled for that chain.`,\n );\n }\n return null;\n }\n\n const apiKey = preResolvedApiKey ?? readEnv(PIMLICO_API_KEY_ENVS, { publicOnly });\n if (!apiKey) {\n if (throwOnMissingConfig) {\n throw new Error(\"Pimlico AA requires PIMLICO_API_KEY.\");\n }\n return null;\n }\n\n const chain = chainsById[chainConfig.chainId];\n if (!chain) {\n return null;\n }\n\n if (modeOverride && !chainConfig.supportedModes.includes(modeOverride)) {\n if (throwOnMissingConfig) {\n throw new Error(\n `AA mode \"${modeOverride}\" is not supported on chain ${chainConfig.chainId}.`,\n );\n }\n return null;\n }\n\n const resolvedChainConfig = modeOverride\n ? { ...chainConfig, defaultMode: modeOverride }\n : chainConfig;\n\n const plan = buildAAExecutionPlan(config, resolvedChainConfig);\n\n return {\n chainConfig: resolvedChainConfig,\n plan,\n apiKey,\n chain,\n rpcUrl,\n mode: resolvedChainConfig.defaultMode,\n };\n}\n","import type { Chain } from \"viem\";\n\nimport type {\n AAConfig,\n AAExecutionMode,\n AALike,\n AAProviderQuery,\n AAProviderState,\n WalletExecutionCall,\n} from \"./types\";\n\nimport { DEFAULT_AA_CONFIG } from \"./types\";\nimport { resolveAlchemyConfig } from \"./resolve\";\n\n// ---------------------------------------------------------------------------\n// Alchemy-Specific Types\n// ---------------------------------------------------------------------------\n\nexport interface AlchemyHookParams {\n enabled: boolean;\n apiKey: string;\n chain: Chain;\n rpcUrl: string;\n gasPolicyId?: string;\n mode: AAExecutionMode;\n}\n\nexport type UseAlchemyAAHook<\n TAA extends AALike = AALike,\n TQuery extends AAProviderQuery<TAA> = AAProviderQuery<TAA>,\n> = (params?: AlchemyHookParams) => TQuery;\n\nexport interface CreateAlchemyAAProviderOptions<\n TAA extends AALike = AALike,\n TQuery extends AAProviderQuery<TAA> = AAProviderQuery<TAA>,\n> {\n accountAbstractionConfig?: AAConfig;\n useAlchemyAA: UseAlchemyAAHook<TAA, TQuery>;\n chainsById: Record<number, Chain>;\n chainSlugById: Record<number, string>;\n getPreferredRpcUrl: (chain: Chain) => string;\n apiKeyEnvVar?: string;\n gasPolicyEnvVar?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Provider Factory\n// ---------------------------------------------------------------------------\n\nexport function createAlchemyAAProvider<\n TAA extends AALike = AALike,\n TQuery extends AAProviderQuery<TAA> = AAProviderQuery<TAA>,\n>({\n accountAbstractionConfig = DEFAULT_AA_CONFIG,\n useAlchemyAA,\n chainsById,\n chainSlugById,\n getPreferredRpcUrl,\n}: CreateAlchemyAAProviderOptions<TAA, TQuery>) {\n return function useAlchemyAAProvider(\n calls: WalletExecutionCall[] | null,\n localPrivateKey: `0x${string}` | null,\n ): AAProviderState<TAA> {\n const resolved = resolveAlchemyConfig({\n calls,\n localPrivateKey,\n accountAbstractionConfig,\n chainsById,\n chainSlugById,\n getPreferredRpcUrl,\n publicOnly: true,\n });\n\n const params = resolved\n ? ({\n enabled: true,\n apiKey: resolved.apiKey,\n chain: resolved.chain,\n rpcUrl: resolved.rpcUrl,\n gasPolicyId: resolved.gasPolicyId,\n mode: resolved.mode,\n } satisfies AlchemyHookParams)\n : undefined;\n\n const query = useAlchemyAA(params) as TQuery;\n\n return {\n plan: resolved?.plan ?? null,\n query,\n AA: query.AA,\n isPending: Boolean(resolved && query.isPending),\n error: query.error ?? null,\n };\n };\n}\n","import type { Chain } from \"viem\";\n\nimport type {\n AAConfig,\n AAExecutionMode,\n AALike,\n AAProviderQuery,\n AAProviderState,\n WalletExecutionCall,\n} from \"./types\";\n\nimport { DEFAULT_AA_CONFIG } from \"./types\";\nimport { resolvePimlicoConfig } from \"./resolve\";\n\n// ---------------------------------------------------------------------------\n// Pimlico-Specific Types\n// ---------------------------------------------------------------------------\n\nexport interface PimlicoHookParams {\n enabled: boolean;\n apiKey: string;\n chain: Chain;\n mode: AAExecutionMode;\n rpcUrl?: string;\n}\n\nexport type UsePimlicoAAHook<\n TAA extends AALike = AALike,\n TQuery extends AAProviderQuery<TAA> = AAProviderQuery<TAA>,\n> = (params?: PimlicoHookParams) => TQuery;\n\nexport interface CreatePimlicoAAProviderOptions<\n TAA extends AALike = AALike,\n TQuery extends AAProviderQuery<TAA> = AAProviderQuery<TAA>,\n> {\n accountAbstractionConfig?: AAConfig;\n usePimlicoAA: UsePimlicoAAHook<TAA, TQuery>;\n chainsById: Record<number, Chain>;\n apiKeyEnvVar?: string;\n rpcUrl?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Provider Factory\n// ---------------------------------------------------------------------------\n\nexport function createPimlicoAAProvider<\n TAA extends AALike = AALike,\n TQuery extends AAProviderQuery<TAA> = AAProviderQuery<TAA>,\n>({\n accountAbstractionConfig = DEFAULT_AA_CONFIG,\n usePimlicoAA,\n chainsById,\n rpcUrl,\n}: CreatePimlicoAAProviderOptions<TAA, TQuery>) {\n return function usePimlicoAAProvider(\n calls: WalletExecutionCall[] | null,\n localPrivateKey: `0x${string}` | null,\n ): AAProviderState<TAA> {\n const resolved = resolvePimlicoConfig({\n calls,\n localPrivateKey,\n accountAbstractionConfig,\n chainsById,\n rpcUrl,\n publicOnly: true,\n });\n\n const params = resolved\n ? ({\n enabled: true,\n apiKey: resolved.apiKey,\n chain: resolved.chain,\n mode: resolved.mode,\n rpcUrl: resolved.rpcUrl,\n } satisfies PimlicoHookParams)\n : undefined;\n\n const query = usePimlicoAA(params) as TQuery;\n\n return {\n plan: resolved?.plan ?? null,\n query,\n AA: query.AA,\n isPending: Boolean(resolved && query.isPending),\n error: query.error ?? null,\n };\n };\n}\n","import type { Hex, TransactionReceipt } from \"viem\";\n\nimport type {\n AAExecutionMode,\n AALike,\n WalletPrimitiveCall,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Smart Account Shape (from @getpara/aa-* SDKs)\n// ---------------------------------------------------------------------------\n\nexport type ParaSmartAccountLike = {\n provider: string;\n mode: AAExecutionMode;\n smartAccountAddress: Hex;\n delegationAddress?: Hex;\n sendTransaction: (\n call: WalletPrimitiveCall,\n options?: unknown,\n ) => Promise<TransactionReceipt>;\n sendBatchTransaction: (\n calls: WalletPrimitiveCall[],\n options?: unknown,\n ) => Promise<TransactionReceipt>;\n};\n\n// ---------------------------------------------------------------------------\n// Smart Account Adapter\n// ---------------------------------------------------------------------------\n\n/**\n * Bridges a `ParaSmartAccountLike` (from `@getpara/aa-*` SDKs) into\n * the library's `AALike` interface:\n * - Maps `smartAccountAddress` → `AAAddress`\n * - Unwraps `TransactionReceipt` → `{ transactionHash }`\n */\nexport function adaptSmartAccount(account: ParaSmartAccountLike): AALike {\n // In 7702 mode the smart-account address IS the user's EOA. If the SDK\n // returns the EOA as the delegation address it's a known bug — the real\n // delegation target should be the implementation contract (e.g. Alchemy's\n // SemiModularAccount7702), not the EOA itself. Drop the bogus value so\n // callers don't display a misleading \"Deleg: <own-address>\".\n const delegationAddress =\n account.mode === \"7702\" &&\n account.delegationAddress &&\n account.smartAccountAddress &&\n account.delegationAddress.toLowerCase() ===\n account.smartAccountAddress.toLowerCase()\n ? undefined\n : account.delegationAddress;\n\n return {\n provider: account.provider,\n mode: account.mode,\n AAAddress: account.smartAccountAddress,\n delegationAddress,\n sendTransaction: async (call) => {\n const receipt = await account.sendTransaction(call);\n return { transactionHash: receipt.transactionHash };\n },\n sendBatchTransaction: async (calls) => {\n const receipt = await account.sendBatchTransaction(calls);\n return { transactionHash: receipt.transactionHash };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Error Classification\n// ---------------------------------------------------------------------------\n\n/**\n * Detects Alchemy gas sponsorship quota errors.\n */\nexport function isAlchemySponsorshipLimitError(error: unknown): boolean {\n const message =\n error instanceof Error ? error.message : String(error ?? \"\");\n const normalized = message.toLowerCase();\n return (\n normalized.includes(\"gas sponsorship limit\") ||\n normalized.includes(\"put your team over your gas sponsorship limit\") ||\n normalized.includes(\"buy gas credits in your gas manager dashboard\")\n );\n}\n","import { createAlchemySmartAccount } from \"@getpara/aa-alchemy\";\nimport { createPimlicoSmartAccount } from \"@getpara/aa-pimlico\";\nimport type { Chain, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nimport type {\n AAExecutionMode,\n AAProviderState,\n WalletExecutionCall,\n} from \"./types\";\nimport { adaptSmartAccount } from \"./adapt\";\nimport { resolveAlchemyConfig, resolvePimlicoConfig } from \"./resolve\";\nimport { readEnv, ALCHEMY_GAS_POLICY_ENVS } from \"./env\";\nimport type { AAProvider } from \"./env\";\nimport type { AALike } from \"./types\";\n\n// Alchemy's SemiModularAccount7702 implementation contract.\n// The @getpara/aa-alchemy SDK hardcodes this same address.\n// The @alchemy/wallet-apis SDK does NOT expose the delegation target,\n// so we must use this constant for the Wallet APIs code path.\nconst ALCHEMY_7702_DELEGATION_ADDRESS =\n \"0x69007702764179f14F51cdce752f4f775d74E139\" as Hex;\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// CreateAAOwner\n// \n// { kind: \"direct\", privateKey }\n\n// - This is local key signing.\n// - The client converts the raw private key into a viem account internally.\n// - Best for CLI/server flows where you already have the key material.\n\n// { kind: \"session\", adapter, session, signer?, address? }\n\n// - This is provider-managed signing.\n// - session is the provider client/session object used to resolve an owner.\n// - signer is optional and can represent an already-resolved signer inside that\n// provider context, such as an external wallet.\n// - address identifies which wallet inside the provider session should own the\n// smart account.\n// -------------------------------------------------------------------------\nexport type CreateAAOwner =\n | {\n kind: \"direct\";\n privateKey: `0x${string}`;\n }\n | {\n kind: \"session\";\n // Future adapters such as Privy can be added later. Only \"para\" is\n // implemented today.\n adapter: string;\n session: unknown;\n signer?: unknown;\n address?: Hex;\n };\n\nexport interface CreateAAProviderStateOptions {\n provider: AAProvider;\n chain: Chain;\n owner: CreateAAOwner;\n rpcUrl: string;\n callList: WalletExecutionCall[];\n mode?: AAExecutionMode;\n apiKey?: string;\n gasPolicyId?: string;\n sponsored?: boolean;\n}\n\ninterface CreateAlchemyAAStateOptions {\n chain: Chain;\n owner: CreateAAOwner;\n rpcUrl: string;\n callList: WalletExecutionCall[];\n mode?: AAExecutionMode;\n apiKey?: string;\n gasPolicyId?: string;\n sponsored?: boolean;\n}\n\ninterface CreatePimlicoAAStateOptions {\n chain: Chain;\n owner: CreateAAOwner;\n rpcUrl: string;\n callList: WalletExecutionCall[];\n mode?: AAExecutionMode;\n apiKey?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Unified Creator\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an `AAProviderState` by instantiating the appropriate smart account\n * via `@getpara/aa-alchemy` or `@getpara/aa-pimlico`.\n *\n * This is the single entry-point for async (non-hook) AA provider state creation.\n */\nexport async function createAAProviderState(\n options: CreateAAProviderStateOptions,\n): Promise<AAProviderState> {\n if (options.provider === \"alchemy\") {\n return createAlchemyAAState({\n chain: options.chain,\n owner: options.owner,\n rpcUrl: options.rpcUrl,\n callList: options.callList,\n mode: options.mode,\n apiKey: options.apiKey,\n gasPolicyId: options.gasPolicyId,\n sponsored: options.sponsored,\n });\n }\n\n return createPimlicoAAState({\n chain: options.chain,\n owner: options.owner,\n rpcUrl: options.rpcUrl,\n callList: options.callList,\n mode: options.mode,\n apiKey: options.apiKey,\n });\n}\n\ntype DirectOwner = Extract<CreateAAOwner, { kind: \"direct\" }>;\ntype SessionOwner = Extract<CreateAAOwner, { kind: \"session\" }>;\n\ntype SDKOwnerParams =\n | {\n para: never;\n signer: ReturnType<typeof privateKeyToAccount>;\n }\n | {\n para: never;\n signer: never;\n address?: Hex;\n }\n | {\n para: never;\n address?: Hex;\n };\n\ntype ResolvedOwnerParams =\n | { kind: \"ready\"; ownerParams: SDKOwnerParams }\n | { kind: \"missing\" }\n | { kind: \"unsupported_adapter\"; adapter: string };\n\nfunction getDirectOwnerParams(owner: DirectOwner): ResolvedOwnerParams {\n return {\n kind: \"ready\",\n ownerParams: {\n para: undefined as never,\n signer: privateKeyToAccount(owner.privateKey),\n },\n };\n}\n\nfunction getParaSessionOwnerParams(owner: SessionOwner): ResolvedOwnerParams {\n if (owner.signer) {\n return {\n kind: \"ready\",\n ownerParams: {\n para: owner.session as never,\n signer: owner.signer as never,\n ...(owner.address ? { address: owner.address } : {}),\n },\n };\n }\n\n return {\n kind: \"ready\",\n ownerParams: {\n para: owner.session as never,\n ...(owner.address ? { address: owner.address } : {}),\n },\n };\n}\n\nfunction getSessionOwnerParams(owner: SessionOwner): ResolvedOwnerParams {\n switch (owner.adapter) {\n case \"para\":\n return getParaSessionOwnerParams(owner);\n default:\n return { kind: \"unsupported_adapter\", adapter: owner.adapter };\n }\n}\n\nfunction getOwnerParams(owner: CreateAAOwner | undefined): ResolvedOwnerParams {\n if (!owner) {\n return { kind: \"missing\" };\n }\n\n switch (owner.kind) {\n case \"direct\":\n return getDirectOwnerParams(owner);\n case \"session\":\n return getSessionOwnerParams(owner);\n }\n}\n\nfunction getMissingOwnerState(\n plan: AAProviderState[\"plan\"],\n provider: AAProvider,\n): AAProviderState {\n return {\n plan,\n AA: null,\n isPending: false,\n error: new Error(\n `${provider} AA account creation requires a direct owner or a supported session owner.`,\n ),\n };\n}\n\nfunction getUnsupportedAdapterState(\n plan: AAProviderState[\"plan\"],\n adapter: string,\n): AAProviderState {\n return {\n plan,\n AA: null,\n isPending: false,\n error: new Error(`Session adapter \"${adapter}\" is not implemented.`),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Alchemy\n// ---------------------------------------------------------------------------\n\nasync function createAlchemyAAState(\n options: CreateAlchemyAAStateOptions,\n): Promise<AAProviderState> {\n const {\n chain,\n owner,\n rpcUrl,\n callList,\n mode,\n sponsored = true,\n } = options;\n\n const resolved = resolveAlchemyConfig({\n calls: callList,\n chainsById: { [chain.id]: chain },\n modeOverride: mode,\n throwOnMissingConfig: true,\n getPreferredRpcUrl: () => rpcUrl,\n apiKey: options.apiKey,\n gasPolicyId: options.gasPolicyId,\n });\n\n if (!resolved) {\n throw new Error(\"Alchemy AA config resolution failed.\");\n }\n\n const apiKey = options.apiKey ?? resolved.apiKey;\n const gasPolicyId = sponsored\n ? (options.gasPolicyId ?? readEnv(ALCHEMY_GAS_POLICY_ENVS))\n : undefined;\n\n const plan = {\n ...resolved.plan,\n sponsorship: gasPolicyId ? resolved.plan.sponsorship : \"disabled\",\n fallbackToEoa: false,\n } as AAProviderState[\"plan\"];\n\n const ownerParams = getOwnerParams(owner);\n if (ownerParams.kind === \"missing\") {\n return getMissingOwnerState(plan, \"alchemy\");\n }\n if (ownerParams.kind === \"unsupported_adapter\") {\n return getUnsupportedAdapterState(plan, ownerParams.adapter);\n }\n\n if (owner.kind === \"direct\") {\n try {\n return await createAlchemyWalletApisState({\n plan: plan!,\n chain,\n privateKey: owner.privateKey,\n apiKey,\n gasPolicyId,\n mode: plan!.mode,\n });\n } catch (error) {\n return {\n plan,\n AA: null,\n isPending: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n try {\n const smartAccount = await createAlchemySmartAccount({\n ...ownerParams.ownerParams,\n apiKey,\n gasPolicyId,\n chain,\n rpcUrl,\n mode: plan!.mode,\n });\n\n if (!smartAccount) {\n return {\n plan,\n AA: null,\n isPending: false,\n error: new Error(\"Alchemy AA account could not be initialized.\"),\n };\n }\n\n return {\n plan,\n AA: adaptSmartAccount(smartAccount),\n isPending: false,\n error: null,\n };\n } catch (error) {\n return {\n plan,\n AA: null,\n isPending: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\nasync function createAlchemyWalletApisState(params: {\n plan: NonNullable<AAProviderState[\"plan\"]>;\n chain: Chain;\n privateKey: `0x${string}`;\n apiKey: string;\n gasPolicyId?: string;\n mode: AAExecutionMode;\n}): Promise<AAProviderState> {\n const { createSmartWalletClient, alchemyWalletTransport } = await import(\n \"@alchemy/wallet-apis\"\n );\n\n const signer = privateKeyToAccount(params.privateKey);\n const walletClient = createSmartWalletClient({\n transport: alchemyWalletTransport({ apiKey: params.apiKey }),\n chain: params.chain,\n signer,\n ...(params.gasPolicyId ? { paymaster: { policyId: params.gasPolicyId } } : {}),\n });\n\n let accountAddress = signer.address as Hex;\n if (params.mode === \"4337\") {\n const account = await walletClient.requestAccount();\n accountAddress = account.address as Hex;\n }\n\n const sendCalls = async (\n calls: Array<{ to: Hex; value: bigint; data?: Hex }>,\n ): Promise<{ transactionHash: string }> => {\n const result = await walletClient.sendCalls({\n ...(params.mode === \"4337\" ? { account: accountAddress } : {}),\n calls,\n });\n const status = await walletClient.waitForCallsStatus({ id: result.id });\n const transactionHash = status.receipts?.[0]?.transactionHash;\n if (!transactionHash) {\n throw new Error(\"Alchemy Wallets API did not return a transaction hash.\");\n }\n return { transactionHash };\n };\n\n const AA: AALike = {\n provider: \"alchemy\",\n mode: params.mode,\n AAAddress: accountAddress,\n delegationAddress: params.mode === \"7702\" ? ALCHEMY_7702_DELEGATION_ADDRESS : undefined,\n sendTransaction: async (call) => sendCalls([call]),\n sendBatchTransaction: async (calls) => sendCalls(calls),\n };\n\n return {\n plan: params.plan,\n AA,\n isPending: false,\n error: null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pimlico\n// ---------------------------------------------------------------------------\n\nasync function createPimlicoAAState(\n options: CreatePimlicoAAStateOptions,\n): Promise<AAProviderState> {\n const {\n chain,\n owner,\n rpcUrl,\n callList,\n mode,\n } = options;\n\n const resolved = resolvePimlicoConfig({\n calls: callList,\n chainsById: { [chain.id]: chain },\n rpcUrl,\n modeOverride: mode,\n throwOnMissingConfig: true,\n apiKey: options.apiKey,\n });\n\n if (!resolved) {\n throw new Error(\"Pimlico AA config resolution failed.\");\n }\n\n const apiKey = options.apiKey ?? resolved.apiKey;\n const plan = {\n ...resolved.plan,\n fallbackToEoa: false,\n } as AAProviderState[\"plan\"];\n\n const ownerParams = getOwnerParams(owner);\n if (ownerParams.kind === \"missing\") {\n return getMissingOwnerState(plan, \"pimlico\");\n }\n if (ownerParams.kind === \"unsupported_adapter\") {\n return getUnsupportedAdapterState(plan, ownerParams.adapter);\n }\n\n try {\n const smartAccount = await createPimlicoSmartAccount({\n ...ownerParams.ownerParams,\n apiKey,\n chain,\n rpcUrl,\n mode: plan!.mode,\n });\n\n if (!smartAccount) {\n return {\n plan,\n AA: null,\n isPending: false,\n error: new Error(\"Pimlico AA account could not be initialized.\"),\n };\n }\n\n return {\n plan,\n AA: adaptSmartAccount(smartAccount),\n isPending: false,\n error: null,\n };\n } catch (error) {\n return {\n plan,\n AA: null,\n isPending: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n"],"mappings":"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","names":["_a","privateKeyToAccount","chain"]}
|
|
1
|
+
{"version":3,"sources":["../src/sse.ts","../src/client.ts","../src/types.ts","../src/event.ts","../src/wallet-utils.ts","../src/session.ts","../src/aa/types.ts","../src/chains.ts","../src/aa/execute.ts","../src/aa/alchemy/provider.ts","../src/aa/alchemy/create.ts","../src/aa/adapt.ts","../src/aa/owner.ts","../src/aa/pimlico/resolve.ts","../src/aa/pimlico/provider.ts","../src/aa/pimlico/create.ts","../src/aa/create.ts"],"sourcesContent":["import type { AomiSSEEvent, Logger } from \"./types\";\n\nexport type SseSubscriber = {\n subscribe: (\n sessionId: string,\n onUpdate: (event: AomiSSEEvent) => void,\n onError?: (error: unknown) => void,\n ) => () => void;\n};\n\nexport type SseSubscriberOptions = {\n backendUrl: string;\n getHeaders: (sessionId: string) => HeadersInit;\n logger?: Logger;\n};\n\ntype SseSubscription = {\n abortController: AbortController | null;\n retries: number;\n retryTimer: ReturnType<typeof setTimeout> | null;\n stopped: boolean;\n listeners: Set<SseListener>;\n stop: (reason?: string) => void;\n};\n\ntype SseListener = {\n onUpdate: (event: AomiSSEEvent) => void;\n onError?: (error: unknown) => void;\n};\n\nfunction extractSseData(rawEvent: string): string | null {\n const dataLines = rawEvent\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(5).trimStart());\n if (!dataLines.length) return null;\n return dataLines.join(\"\\n\");\n}\n\nasync function readSseStream(\n stream: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n onMessage: (data: string) => void,\n): Promise<void> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (!signal.aborted) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n buffer = buffer.replace(/\\r/g, \"\");\n\n let separatorIndex = buffer.indexOf(\"\\n\\n\");\n while (separatorIndex >= 0) {\n const rawEvent = buffer.slice(0, separatorIndex);\n buffer = buffer.slice(separatorIndex + 2);\n const data = extractSseData(rawEvent);\n if (data) {\n onMessage(data);\n }\n separatorIndex = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function createSseSubscriber({\n backendUrl,\n getHeaders,\n logger,\n}: SseSubscriberOptions): SseSubscriber {\n const subscriptions = new Map<string, SseSubscription>();\n\n const subscribe: SseSubscriber[\"subscribe\"] = (\n sessionId,\n onUpdate,\n onError,\n ) => {\n const existing = subscriptions.get(sessionId);\n const listener: SseListener = { onUpdate, onError };\n if (existing) {\n existing.listeners.add(listener);\n logger?.debug(\"[aomi][sse] listener added\", {\n sessionId,\n listeners: existing.listeners.size,\n });\n return () => {\n existing.listeners.delete(listener);\n logger?.debug(\"[aomi][sse] listener removed\", {\n sessionId,\n listeners: existing.listeners.size,\n });\n if (existing.listeners.size === 0) {\n existing.stop(\"unsubscribe\");\n if (subscriptions.get(sessionId) === existing) {\n subscriptions.delete(sessionId);\n }\n }\n };\n }\n\n const subscription: SseSubscription = {\n abortController: null,\n retries: 0,\n retryTimer: null,\n stopped: false,\n listeners: new Set([listener]),\n stop: (reason?: string) => {\n subscription.stopped = true;\n if (subscription.retryTimer) {\n clearTimeout(subscription.retryTimer);\n subscription.retryTimer = null;\n }\n subscription.abortController?.abort();\n subscription.abortController = null;\n logger?.debug(\"[aomi][sse] stop\", {\n sessionId,\n reason,\n retries: subscription.retries,\n });\n },\n };\n\n const scheduleRetry = () => {\n if (subscription.stopped) return;\n subscription.retries += 1;\n const delayMs = Math.min(500 * 2 ** (subscription.retries - 1), 10000);\n logger?.debug(\"[aomi][sse] retry scheduled\", {\n sessionId,\n delayMs,\n retries: subscription.retries,\n });\n subscription.retryTimer = setTimeout(() => {\n void open();\n }, delayMs);\n };\n\n const open = async () => {\n if (subscription.stopped) return;\n if (subscription.retryTimer) {\n clearTimeout(subscription.retryTimer);\n subscription.retryTimer = null;\n }\n\n const controller = new AbortController();\n subscription.abortController = controller;\n const openedAt = Date.now();\n\n try {\n const response = await fetch(`${backendUrl}/api/updates`, {\n headers: getHeaders(sessionId),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `SSE HTTP ${response.status}: ${response.statusText}`,\n );\n }\n\n if (!response.body) {\n throw new Error(\"SSE response missing body\");\n }\n\n subscription.retries = 0;\n\n await readSseStream(response.body, controller.signal, (data) => {\n let parsed: AomiSSEEvent;\n try {\n parsed = JSON.parse(data) as AomiSSEEvent;\n } catch (error) {\n for (const item of subscription.listeners) {\n item.onError?.(error);\n }\n return;\n }\n\n for (const item of subscription.listeners) {\n try {\n item.onUpdate(parsed);\n } catch (error) {\n item.onError?.(error);\n }\n }\n });\n logger?.debug(\"[aomi][sse] stream ended\", {\n sessionId,\n aborted: controller.signal.aborted,\n stopped: subscription.stopped,\n durationMs: Date.now() - openedAt,\n });\n } catch (error) {\n if (!controller.signal.aborted && !subscription.stopped) {\n for (const item of subscription.listeners) {\n item.onError?.(error);\n }\n }\n }\n\n if (!subscription.stopped) {\n scheduleRetry();\n }\n };\n\n subscriptions.set(sessionId, subscription);\n void open();\n\n return () => {\n subscription.listeners.delete(listener);\n logger?.debug(\"[aomi][sse] listener removed\", {\n sessionId,\n listeners: subscription.listeners.size,\n });\n if (subscription.listeners.size === 0) {\n subscription.stop(\"unsubscribe\");\n if (subscriptions.get(sessionId) === subscription) {\n subscriptions.delete(sessionId);\n }\n }\n };\n };\n\n return { subscribe };\n}\n","import type {\n AomiClientOptions,\n AomiMessage,\n AomiChatResponse,\n AomiClearSecretsResponse,\n AomiCreateThreadResponse,\n AomiIngestSecretsResponse,\n AomiInterruptResponse,\n AomiSSEEvent,\n AomiSimulateResponse,\n AomiStateResponse,\n AomiSystemEvent,\n AomiSystemResponse,\n AomiThread,\n Logger,\n UserState,\n} from \"./types\";\nimport { createSseSubscriber, type SseSubscriber } from \"./sse\";\n\n// =============================================================================\n// Internal helpers\n// =============================================================================\n\nconst SESSION_ID_HEADER = \"X-Session-Id\";\nconst API_KEY_HEADER = \"X-API-Key\";\n\nfunction joinApiPath(baseUrl: string, path: string): string {\n const normalizedBase = baseUrl === \"/\" ? \"\" : baseUrl.replace(/\\/+$/, \"\");\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${normalizedBase}${normalizedPath}` || normalizedPath;\n}\n\nfunction buildApiUrl(\n baseUrl: string,\n path: string,\n query?: Record<string, string | undefined>,\n): string {\n const url = joinApiPath(baseUrl, path);\n if (!query) return url;\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n params.set(key, value);\n }\n\n const queryString = params.toString();\n return queryString ? `${url}?${queryString}` : url;\n}\n\nfunction toQueryString(payload: Record<string, unknown>): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(payload)) {\n if (value === undefined || value === null) continue;\n params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction withSessionHeader(\n sessionId: string,\n init?: HeadersInit,\n): HeadersInit {\n const headers = new Headers(init);\n headers.set(SESSION_ID_HEADER, sessionId);\n return headers;\n}\n\nasync function postState<T>(\n baseUrl: string,\n path: string,\n payload: Record<string, unknown>,\n sessionId: string,\n apiKey?: string,\n): Promise<T> {\n const query = toQueryString(payload);\n const url = `${baseUrl}${path}${query}`;\n\n const headers = new Headers(withSessionHeader(sessionId));\n if (apiKey) {\n headers.set(API_KEY_HEADER, apiKey);\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as T;\n}\n\n// =============================================================================\n// AomiClient\n// =============================================================================\n\nexport class AomiClient {\n private readonly baseUrl: string;\n private readonly apiKey?: string;\n private readonly logger?: Logger;\n private readonly sseSubscriber: SseSubscriber;\n\n constructor(options: AomiClientOptions) {\n // Strip trailing slash\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this.logger = options.logger;\n\n this.sseSubscriber = createSseSubscriber({\n backendUrl: this.baseUrl,\n getHeaders: (sessionId) =>\n withSessionHeader(sessionId, { Accept: \"text/event-stream\" }),\n logger: this.logger,\n });\n }\n\n // ===========================================================================\n // Chat & State\n // ===========================================================================\n\n /**\n * Fetch current session state (messages, processing status, title).\n */\n async fetchState(\n sessionId: string,\n userState?: UserState,\n clientId?: string,\n ): Promise<AomiStateResponse> {\n const url = buildApiUrl(this.baseUrl, \"/api/state\", {\n user_state: userState ? JSON.stringify(userState) : undefined,\n client_id: clientId,\n });\n\n const response = await fetch(url, {\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as AomiStateResponse;\n }\n\n /**\n * Send a chat message and return updated session state.\n */\n async sendMessage(\n sessionId: string,\n message: string,\n options?: {\n app?: string;\n publicKey?: string;\n apiKey?: string;\n userState?: UserState;\n clientId?: string;\n },\n ): Promise<AomiChatResponse> {\n const app = options?.app ?? \"default\";\n const apiKey = options?.apiKey ?? this.apiKey;\n\n const payload: Record<string, unknown> = { message, app };\n if (options?.publicKey) {\n payload.public_key = options.publicKey;\n }\n if (options?.userState) {\n payload.user_state = JSON.stringify(options.userState);\n }\n if (options?.clientId) {\n payload.client_id = options.clientId;\n }\n\n return postState<AomiChatResponse>(\n this.baseUrl,\n \"/api/chat\",\n payload,\n sessionId,\n apiKey,\n );\n }\n\n /**\n * Send a system-level message (e.g. wallet state changes, context switches).\n */\n async sendSystemMessage(\n sessionId: string,\n message: string,\n ): Promise<AomiSystemResponse> {\n return postState<AomiSystemResponse>(\n this.baseUrl,\n \"/api/system\",\n { message },\n sessionId,\n );\n }\n\n /**\n * Interrupt the AI's current response.\n */\n async interrupt(sessionId: string): Promise<AomiInterruptResponse> {\n return postState<AomiInterruptResponse>(\n this.baseUrl,\n \"/api/interrupt\",\n {},\n sessionId,\n );\n }\n\n // ===========================================================================\n // Secrets\n // ===========================================================================\n\n /**\n * Ingest secrets for a client. Returns opaque `$SECRET:<name>` handles.\n * Call this once at page load (or when secrets change) with a stable\n * client_id for the browser tab. The same client_id should be passed\n * to `sendMessage` / `fetchState` so sessions get associated.\n */\n async ingestSecrets(\n clientId: string,\n secrets: Record<string, string>,\n ): Promise<AomiIngestSecretsResponse> {\n const url = joinApiPath(this.baseUrl, \"/api/secrets\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ client_id: clientId, secrets }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as AomiIngestSecretsResponse;\n }\n\n /**\n * Clear all secrets for a client (e.g. on page unload or logout).\n */\n async clearSecrets(clientId: string): Promise<AomiClearSecretsResponse> {\n const url = buildApiUrl(this.baseUrl, \"/api/secrets\", {\n client_id: clientId,\n });\n const response = await fetch(url, { method: \"DELETE\" });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as AomiClearSecretsResponse;\n }\n\n // ===========================================================================\n // SSE (Real-time Updates)\n // ===========================================================================\n\n /**\n * Subscribe to real-time SSE updates for a session.\n * Automatically reconnects with exponential backoff on disconnects.\n * Returns an unsubscribe function.\n */\n subscribeSSE(\n sessionId: string,\n onUpdate: (event: AomiSSEEvent) => void,\n onError?: (error: unknown) => void,\n ): () => void {\n return this.sseSubscriber.subscribe(sessionId, onUpdate, onError);\n }\n\n // ===========================================================================\n // Thread / Session Management\n // ===========================================================================\n\n /**\n * List all threads for a wallet address.\n */\n async listThreads(publicKey: string): Promise<AomiThread[]> {\n const url = buildApiUrl(this.baseUrl, \"/api/sessions\", {\n public_key: publicKey,\n });\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch threads: HTTP ${response.status}`);\n }\n\n return (await response.json()) as AomiThread[];\n }\n\n /**\n * Get a single thread by ID.\n */\n async getThread(sessionId: string): Promise<AomiThread> {\n const url = buildApiUrl(\n this.baseUrl,\n `/api/sessions/${encodeURIComponent(sessionId)}`,\n );\n const response = await fetch(url, {\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as AomiThread;\n }\n\n /**\n * Create a new thread. The client generates the session ID.\n */\n async createThread(\n threadId: string,\n publicKey?: string,\n ): Promise<AomiCreateThreadResponse> {\n const body: Record<string, string> = {};\n if (publicKey) body.public_key = publicKey;\n\n const url = buildApiUrl(this.baseUrl, \"/api/sessions\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: withSessionHeader(threadId, {\n \"Content-Type\": \"application/json\",\n }),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create thread: HTTP ${response.status}`);\n }\n\n return (await response.json()) as AomiCreateThreadResponse;\n }\n\n /**\n * Delete a thread by ID.\n */\n async deleteThread(sessionId: string): Promise<void> {\n const url = buildApiUrl(\n this.baseUrl,\n `/api/sessions/${encodeURIComponent(sessionId)}`,\n );\n const response = await fetch(url, {\n method: \"DELETE\",\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete thread: HTTP ${response.status}`);\n }\n }\n\n /**\n * Rename a thread.\n */\n async renameThread(sessionId: string, newTitle: string): Promise<void> {\n const url = buildApiUrl(\n this.baseUrl,\n `/api/sessions/${encodeURIComponent(sessionId)}`,\n );\n const response = await fetch(url, {\n method: \"PATCH\",\n headers: withSessionHeader(sessionId, {\n \"Content-Type\": \"application/json\",\n }),\n body: JSON.stringify({ title: newTitle }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to rename thread: HTTP ${response.status}`);\n }\n }\n\n /**\n * Archive a thread.\n */\n async archiveThread(sessionId: string): Promise<void> {\n const url = buildApiUrl(\n this.baseUrl,\n `/api/sessions/${encodeURIComponent(sessionId)}/archive`,\n );\n const response = await fetch(url, {\n method: \"POST\",\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to archive thread: HTTP ${response.status}`);\n }\n }\n\n /**\n * Unarchive a thread.\n */\n async unarchiveThread(sessionId: string): Promise<void> {\n const url = buildApiUrl(\n this.baseUrl,\n `/api/sessions/${encodeURIComponent(sessionId)}/unarchive`,\n );\n const response = await fetch(url, {\n method: \"POST\",\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to unarchive thread: HTTP ${response.status}`);\n }\n }\n\n // ===========================================================================\n // System Events\n // ===========================================================================\n\n /**\n * Get system events for a session.\n */\n async getSystemEvents(\n sessionId: string,\n count?: number,\n ): Promise<AomiSystemEvent[]> {\n const url = buildApiUrl(this.baseUrl, \"/api/events\", {\n count: count !== undefined ? String(count) : undefined,\n });\n const response = await fetch(url, {\n headers: withSessionHeader(sessionId),\n });\n\n if (!response.ok) {\n if (response.status === 404) return [];\n throw new Error(`Failed to get system events: HTTP ${response.status}`);\n }\n\n return (await response.json()) as AomiSystemEvent[];\n }\n\n // ===========================================================================\n // Control API\n // ===========================================================================\n\n /**\n * Get available apps.\n */\n async getApps(\n sessionId: string,\n options?: { publicKey?: string; apiKey?: string },\n ): Promise<string[]> {\n const url = buildApiUrl(this.baseUrl, \"/api/control/apps\", {\n public_key: options?.publicKey,\n });\n\n const apiKey = options?.apiKey ?? this.apiKey;\n const headers = new Headers(withSessionHeader(sessionId));\n if (apiKey) {\n headers.set(API_KEY_HEADER, apiKey);\n }\n\n const response = await fetch(url, { headers });\n\n if (!response.ok) {\n throw new Error(`Failed to get apps: HTTP ${response.status}`);\n }\n\n return (await response.json()) as string[];\n }\n\n /**\n * Get available models.\n */\n async getModels(\n sessionId: string,\n options?: { apiKey?: string },\n ): Promise<string[]> {\n const url = buildApiUrl(this.baseUrl, \"/api/control/models\");\n const apiKey = options?.apiKey ?? this.apiKey;\n const headers = new Headers(withSessionHeader(sessionId));\n if (apiKey) {\n headers.set(API_KEY_HEADER, apiKey);\n }\n\n const response = await fetch(url, {\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get models: HTTP ${response.status}`);\n }\n\n return (await response.json()) as string[];\n }\n\n /**\n * Set the model for a session.\n */\n async setModel(\n sessionId: string,\n rig: string,\n options?: { app?: string; apiKey?: string },\n ): Promise<{\n success: boolean;\n rig: string;\n baml: string;\n created: boolean;\n }> {\n const apiKey = options?.apiKey ?? this.apiKey;\n const payload: Record<string, unknown> = { rig };\n if (options?.app) {\n payload.app = options.app;\n }\n\n return postState<{\n success: boolean;\n rig: string;\n baml: string;\n created: boolean;\n }>(this.baseUrl, \"/api/control/model\", payload, sessionId, apiKey);\n }\n\n // ===========================================================================\n // Batch Simulation\n // ===========================================================================\n\n /**\n * Simulate transactions as an atomic batch.\n * Each tx sees state changes from previous txs (e.g., approve → swap).\n * Sends full tx payloads — the backend does not look up by ID.\n */\n async simulateBatch(\n sessionId: string,\n transactions: Array<{\n to: string;\n value?: string;\n data?: string;\n label?: string;\n }>,\n options?: { from?: string; chainId?: number },\n ): Promise<AomiSimulateResponse> {\n const url = joinApiPath(this.baseUrl, \"/api/simulate\");\n const headers = new Headers(\n withSessionHeader(sessionId, { \"Content-Type\": \"application/json\" }),\n );\n if (this.apiKey) {\n headers.set(API_KEY_HEADER, this.apiKey);\n }\n\n const payload = {\n transactions,\n from: options?.from,\n chain_id: options?.chainId,\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new Error(`HTTP ${response.status}: ${response.statusText}${body ? `\\n${body}` : \"\"}`);\n }\n\n return (await response.json()) as AomiSimulateResponse;\n }\n}\n","// =============================================================================\n// User State\n// =============================================================================\n\n/**\n * Client-side user state synced with the backend.\n * Typically wallet connection info, but can be any key-value data.\n */\nexport type UserState = Record<string, unknown>;\n\n/**\n * Known client surfaces that may want backend-specific UX strategies.\n * Additional string values are allowed for forward compatibility.\n */\nexport type AomiClientType = \"ts_cli\" | \"web_ui\" | (string & {});\n\nexport const CLIENT_TYPE_TS_CLI: AomiClientType = \"ts_cli\";\nexport const CLIENT_TYPE_WEB_UI: AomiClientType = \"web_ui\";\n\n/**\n * Adds/updates an entry on `userState.ext` while keeping `ext` intentionally untyped.\n */\nexport function addUserStateExt(\n userState: UserState,\n key: string,\n value: unknown,\n): UserState {\n const currentExt = userState[\"ext\"];\n const extRecord =\n typeof currentExt === \"object\" && currentExt !== null && !Array.isArray(currentExt)\n ? (currentExt as Record<string, unknown>)\n : {};\n\n return {\n ...userState,\n ext: {\n ...extRecord,\n [key]: value,\n },\n };\n}\n\n// =============================================================================\n// Logger\n// =============================================================================\n\n/**\n * Optional logger for debug output. Pass `console` or any compatible object.\n */\nexport type Logger = {\n debug: (...args: unknown[]) => void;\n};\n\n// =============================================================================\n// Client Options\n// =============================================================================\n\nexport type AomiClientOptions = {\n /** Base URL of the Aomi backend (e.g. \"https://api.aomi.dev\" or \"/\" for same-origin proxying) */\n baseUrl: string;\n /** Default API key for non-default apps */\n apiKey?: string;\n /** Optional logger for debug output (default: silent) */\n logger?: Logger;\n};\n\n// =============================================================================\n// Base Types\n// =============================================================================\n\nexport interface AomiMessage {\n sender?: \"user\" | \"agent\" | \"system\" | string;\n content?: string;\n timestamp?: string;\n is_streaming?: boolean;\n tool_result?: [string, string] | null;\n}\n\n// =============================================================================\n// API Response Types\n// =============================================================================\n\n/**\n * GET /api/state\n * Fetches current session state including messages and processing status\n */\nexport interface AomiStateResponse {\n messages?: AomiMessage[] | null;\n system_events?: AomiSystemEvent[] | null;\n title?: string | null;\n is_processing?: boolean;\n user_state?: UserState | null;\n}\n\n/**\n * POST /api/chat\n * Sends a chat message and returns updated session state\n */\nexport interface AomiChatResponse {\n messages?: AomiMessage[] | null;\n system_events?: AomiSystemEvent[] | null;\n title?: string | null;\n is_processing?: boolean;\n user_state?: UserState | null;\n}\n\n/**\n * POST /api/system\n * Sends a system message and returns the response message\n */\nexport interface AomiSystemResponse {\n res?: AomiMessage | null;\n}\n\n/**\n * POST /api/simulate\n * Batch-simulate pending transactions atomically (snapshot → sequential send → revert).\n */\nexport interface AomiSimulateFee {\n /** Treasury address to receive the fee. */\n recipient: string;\n /** Fee amount in wei (decimal string). */\n amount_wei: string;\n /** Token type — always \"native\" for now. */\n token: \"native\";\n}\n\nexport interface AomiSimulateResponse {\n result: {\n batch_success: boolean;\n stateful: boolean;\n from: string;\n network: string;\n total_gas?: number;\n fee?: AomiSimulateFee;\n steps: Array<{\n step: number;\n label: string;\n success: boolean;\n result?: string | null;\n revert_reason?: string | null;\n gas_used?: number;\n tx: { to: string; value_wei: string; value_eth: string; data: string };\n }>;\n };\n}\n\n/**\n * POST /api/interrupt\n * Interrupts current processing and returns updated session state\n */\nexport type AomiInterruptResponse = AomiChatResponse;\n\n/**\n * GET /api/sessions\n * Returns array of AomiThread\n */\nexport interface AomiThread {\n session_id: string;\n title: string;\n is_archived?: boolean;\n}\n\n/**\n * POST /api/sessions\n * Creates a new thread/session\n */\nexport interface AomiCreateThreadResponse {\n session_id: string;\n title?: string;\n}\n\n// =============================================================================\n// SSE Event Types (/api/updates)\n// =============================================================================\n\n/**\n * Base SSE event - all events have session_id and type\n */\nexport type AomiSSEEvent = {\n type:\n | \"title_changed\"\n | \"tool_update\"\n | \"tool_complete\"\n | \"system_notice\"\n | string;\n session_id: string;\n new_title?: string;\n [key: string]: unknown;\n};\n\n/**\n * POST /api/secrets\n * Ingests secrets for a client, returns opaque handles\n */\nexport interface AomiIngestSecretsResponse {\n handles: Record<string, string>;\n}\n\n/**\n * DELETE /api/secrets\n * Clears all secrets for a client\n */\nexport interface AomiClearSecretsResponse {\n cleared: boolean;\n}\n\nexport type AomiSSEEventType =\n | \"title_changed\"\n | \"tool_update\"\n | \"tool_complete\"\n | \"system_notice\";\n\n// =============================================================================\n// System Events (/api/events)\n// =============================================================================\n\n/**\n * Backend SystemEvent enum serializes as tagged JSON:\n * - InlineCall: {\"InlineCall\": {\"type\": \"wallet_tx_request\", \"payload\": {...}}}\n * - SystemNotice: {\"SystemNotice\": \"message\"}\n * - SystemError: {\"SystemError\": \"message\"}\n * - AsyncCallback: {\"AsyncCallback\": {...}} (not sent over HTTP)\n */\nexport type AomiSystemEvent =\n | { InlineCall: { type: string; payload?: unknown; [key: string]: unknown } }\n | { SystemNotice: string }\n | { SystemError: string }\n | { AsyncCallback: Record<string, unknown> };\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport function isInlineCall(\n event: AomiSystemEvent,\n): event is { InlineCall: { type: string; payload?: unknown } } {\n return \"InlineCall\" in event;\n}\n\nexport function isSystemNotice(\n event: AomiSystemEvent,\n): event is { SystemNotice: string } {\n return \"SystemNotice\" in event;\n}\n\nexport function isSystemError(\n event: AomiSystemEvent,\n): event is { SystemError: string } {\n return \"SystemError\" in event;\n}\n\nexport function isAsyncCallback(\n event: AomiSystemEvent,\n): event is { AsyncCallback: Record<string, unknown> } {\n return \"AsyncCallback\" in event;\n}\n","// =============================================================================\n// Typed EventEmitter (browser-safe, no Node.js deps)\n// =============================================================================\n\ntype Listener<T = unknown> = (payload: T) => void;\n\n/**\n * Minimal typed event emitter with wildcard support.\n *\n * ```ts\n * type Events = { message: string; error: { code: number } };\n * const ee = new TypedEventEmitter<Events>();\n * ee.on(\"message\", (msg) => console.log(msg));\n * ee.emit(\"message\", \"hello\");\n * ```\n */\nexport class TypedEventEmitter<\n EventMap extends Record<string, unknown> = Record<string, unknown>,\n> {\n private listeners = new Map<string, Set<Listener<never>>>();\n\n on<K extends keyof EventMap & string>(\n type: K,\n handler: Listener<EventMap[K]>,\n ): () => void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(handler as Listener<never>);\n\n return () => {\n set!.delete(handler as Listener<never>);\n if (set!.size === 0) {\n this.listeners.delete(type);\n }\n };\n }\n\n once<K extends keyof EventMap & string>(\n type: K,\n handler: Listener<EventMap[K]>,\n ): () => void {\n const wrapper = ((payload: EventMap[K]) => {\n unsub();\n handler(payload);\n }) as Listener<EventMap[K]>;\n\n const unsub = this.on(type, wrapper);\n return unsub;\n }\n\n emit<K extends keyof EventMap & string>(\n type: K,\n payload: EventMap[K],\n ): void {\n const typeSet = this.listeners.get(type);\n if (typeSet) {\n for (const handler of typeSet) {\n (handler as Listener<EventMap[K]>)(payload);\n }\n }\n\n if (type !== \"*\") {\n const wildcardSet = this.listeners.get(\"*\");\n if (wildcardSet) {\n for (const handler of wildcardSet) {\n (handler as Listener<unknown>)({ type, payload });\n }\n }\n }\n }\n\n off<K extends keyof EventMap & string>(\n type: K,\n handler: Listener<EventMap[K]>,\n ): void {\n const set = this.listeners.get(type);\n if (set) {\n set.delete(handler as Listener<never>);\n if (set.size === 0) {\n this.listeners.delete(type);\n }\n }\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n\n// =============================================================================\n// System Event Unwrap\n// =============================================================================\n\nimport type { AomiSystemEvent } from \"./types\";\nimport {\n isInlineCall,\n isSystemNotice,\n isSystemError,\n isAsyncCallback,\n} from \"./types\";\n\nexport type UnwrappedEvent = {\n type: string;\n payload: unknown;\n};\n\nexport function unwrapSystemEvent(\n event: AomiSystemEvent,\n): UnwrappedEvent | null {\n if (isInlineCall(event)) {\n return {\n type: event.InlineCall.type,\n payload: event.InlineCall.payload ?? event.InlineCall,\n };\n }\n\n if (isSystemNotice(event)) {\n return {\n type: \"system_notice\",\n payload: { message: event.SystemNotice },\n };\n }\n\n if (isSystemError(event)) {\n return {\n type: \"system_error\",\n payload: { message: event.SystemError },\n };\n }\n\n if (isAsyncCallback(event)) {\n return {\n type: \"async_callback\",\n payload: event.AsyncCallback,\n };\n }\n\n return null;\n}\n","// =============================================================================\n// Wallet Payload Normalization\n// =============================================================================\n//\n// Pure functions extracted from packages/react/src/handlers/wallet-handler.ts.\n// Normalizes the various payload shapes the backend can send for wallet\n// transaction and EIP-712 signing requests.\n\n// =============================================================================\n// Types\n// =============================================================================\n\nimport { type Hex, getAddress } from \"viem\";\nimport type { AAWalletCall } from \"./aa/types\";\n\nexport type WalletTxPayload = {\n to: string;\n value?: string;\n data?: string;\n chainId?: number;\n};\n\nexport type WalletEip712Payload = {\n typed_data?: {\n domain?: { chainId?: number | string };\n types?: Record<string, Array<{ name: string; type: string }>>;\n primaryType?: string;\n message?: Record<string, unknown>;\n };\n description?: string;\n};\n\nexport type ViemSignTypedDataArgs = {\n domain?: Record<string, unknown>;\n types: Record<string, Array<{ name: string; type: string }>>;\n primaryType: string;\n message?: Record<string, unknown>;\n};\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\ntype UnknownRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): UnknownRecord | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return undefined;\n return value as UnknownRecord;\n}\n\nfunction getToolArgs(payload: unknown): UnknownRecord {\n const root = asRecord(payload);\n const nestedArgs = asRecord(root?.args);\n return nestedArgs ?? root ?? {};\n}\n\nfunction parseChainId(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value !== \"string\") return undefined;\n\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n\n if (trimmed.startsWith(\"0x\")) {\n const parsedHex = Number.parseInt(trimmed.slice(2), 16);\n return Number.isFinite(parsedHex) ? parsedHex : undefined;\n }\n\n const parsed = Number.parseInt(trimmed, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction normalizeAddress(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n\n try {\n return getAddress(trimmed);\n } catch {\n if (/^0x[0-9a-fA-F]{40}$/.test(trimmed)) {\n return getAddress(trimmed.toLowerCase());\n }\n return undefined;\n }\n}\n\n// =============================================================================\n// Normalization\n// =============================================================================\n\n/**\n * Normalize a wallet_tx_request payload into a consistent shape.\n * Returns `null` if the payload is missing the required `to` field.\n */\nexport function normalizeTxPayload(payload: unknown): WalletTxPayload | null {\n const root = asRecord(payload);\n const args = getToolArgs(payload);\n const ctx = asRecord(root?.ctx);\n\n const to = normalizeAddress(args.to);\n if (!to) return null;\n\n const valueRaw = args.value;\n const value =\n typeof valueRaw === \"string\"\n ? valueRaw\n : typeof valueRaw === \"number\" && Number.isFinite(valueRaw)\n ? String(Math.trunc(valueRaw))\n : undefined;\n\n const data = typeof args.data === \"string\" ? args.data : undefined;\n const chainId =\n parseChainId(args.chainId) ??\n parseChainId(args.chain_id) ??\n parseChainId(ctx?.user_chain_id) ??\n parseChainId(ctx?.userChainId);\n\n return { to, value, data, chainId };\n}\n\n/**\n * Normalize an EIP-712 signing request payload.\n */\nexport function normalizeEip712Payload(\n payload: unknown,\n): WalletEip712Payload {\n const args = getToolArgs(payload);\n const typedDataRaw = args.typed_data ?? args.typedData;\n let typedData: WalletEip712Payload[\"typed_data\"] | undefined;\n\n if (typeof typedDataRaw === \"string\") {\n try {\n const parsed = JSON.parse(typedDataRaw) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n typedData = parsed as WalletEip712Payload[\"typed_data\"];\n }\n } catch {\n typedData = undefined;\n }\n } else if (\n typedDataRaw &&\n typeof typedDataRaw === \"object\" &&\n !Array.isArray(typedDataRaw)\n ) {\n typedData = typedDataRaw as WalletEip712Payload[\"typed_data\"];\n }\n\n const description =\n typeof args.description === \"string\" ? args.description : undefined;\n\n return { typed_data: typedData, description };\n}\n\n/**\n * Convert a normalized WalletTxPayload into an AAWalletCall.\n * This is the single boundary conversion point from backend payloads to AA-ready calls.\n */\nexport function toAAWalletCall(\n payload: WalletTxPayload,\n defaultChainId = 1,\n): AAWalletCall {\n return {\n to: payload.to as Hex,\n value: BigInt(payload.value ?? \"0\"),\n data: payload.data ? (payload.data as Hex) : undefined,\n chainId: payload.chainId ?? defaultChainId,\n };\n}\n\n/**\n * Convert normalized EIP-712 payloads into the viem signing shape used by both\n * the CLI and widget component layers.\n */\nexport function toViemSignTypedDataArgs(\n payload: WalletEip712Payload,\n): ViemSignTypedDataArgs | null {\n const typedData = payload.typed_data;\n const primaryType =\n typeof typedData?.primaryType === \"string\" &&\n typedData.primaryType.trim().length > 0\n ? typedData.primaryType\n : undefined;\n\n if (!typedData || !primaryType) {\n return null;\n }\n\n return {\n domain: asRecord(typedData.domain),\n types: Object.fromEntries(\n Object.entries(typedData.types ?? {}).filter(\n ([typeName]) => typeName !== \"EIP712Domain\",\n ),\n ) as ViemSignTypedDataArgs[\"types\"],\n primaryType,\n message: asRecord(typedData.message),\n };\n}\n","// =============================================================================\n// Session — High-level orchestrated client\n// =============================================================================\n//\n// Wraps AomiClient with polling, event dispatch, and wallet request management.\n// Ported from the React runtime (polling-controller, event-context, wallet-handler).\n//\n// Usage:\n// const session = new Session({ baseUrl: \"https://api.aomi.dev\" });\n// session.on(\"wallet_tx_request\", async (req) => {\n// const signed = await signer.signTransaction(req.payload);\n// await session.resolve(req.id, { txHash: signed.hash });\n// });\n// const result = await session.send(\"swap 1 ETH for USDC\");\n// session.close();\n\nimport { AomiClient } from \"./client\";\nimport type {\n AomiClientType,\n AomiClientOptions,\n AomiMessage,\n AomiChatResponse,\n AomiSSEEvent,\n AomiStateResponse,\n AomiSystemEvent,\n UserState,\n} from \"./types\";\nimport { addUserStateExt } from \"./types\";\nimport { TypedEventEmitter } from \"./event\";\nimport { unwrapSystemEvent } from \"./event\";\nimport {\n normalizeTxPayload,\n normalizeEip712Payload,\n type WalletTxPayload,\n type WalletEip712Payload,\n} from \"./wallet-utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type WalletRequestKind = \"transaction\" | \"eip712_sign\";\n\nexport type WalletRequest = {\n id: string;\n kind: WalletRequestKind;\n payload: WalletTxPayload | WalletEip712Payload;\n timestamp: number;\n};\n\nexport type WalletRequestResult = {\n txHash?: string;\n signature?: string;\n amount?: string;\n};\n\nexport type SendResult = {\n messages: AomiMessage[];\n title?: string;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => sortJson(entry));\n }\n if (value && typeof value === \"object\") {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = sortJson((value as Record<string, unknown>)[key]);\n return acc;\n }, {});\n }\n return value;\n}\n\nfunction isSubsetMatch(expected: unknown, actual: unknown): boolean {\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual) || expected.length !== actual.length) {\n return false;\n }\n return expected.every((entry, index) =>\n isSubsetMatch(entry, actual[index]),\n );\n }\n\n if (expected && typeof expected === \"object\") {\n if (!actual || typeof actual !== \"object\" || Array.isArray(actual)) {\n return false;\n }\n\n return Object.entries(expected as Record<string, unknown>).every(\n ([key, value]) =>\n isSubsetMatch(value, (actual as Record<string, unknown>)[key]),\n );\n }\n\n return expected === actual;\n}\n\nexport type SessionOptions = {\n /** Session ID. Auto-generated (crypto.randomUUID) if omitted. */\n sessionId?: string;\n /** App for chat messages. Default: \"default\" */\n app?: string;\n /** User public key (wallet address). */\n publicKey?: string;\n /** API key override. */\n apiKey?: string;\n /** User state to send with requests (wallet connection info, etc). */\n userState?: UserState;\n /** Optional client type hint forwarded to the backend via userState.ext.client_type. */\n clientType?: AomiClientType;\n /** Stable client ID used for secret-vault association. */\n clientId?: string;\n /** Polling interval in ms. Default: 500 */\n pollIntervalMs?: number;\n /** Logger for debug output. Pass `console` for verbose logging. */\n logger?: { debug: (...args: unknown[]) => void };\n};\n\n/** Events emitted by Session. */\nexport type SessionEventMap = {\n /** A transaction signing request arrived from the backend. */\n wallet_tx_request: WalletRequest;\n /** An EIP-712 signing request arrived from the backend. */\n wallet_eip712_request: WalletRequest;\n /** A system notice from the backend. */\n system_notice: { message: string };\n /** A system error from the backend. */\n system_error: { message: string };\n /** An async callback event. */\n async_callback: Record<string, unknown>;\n /** SSE: tool execution in progress. */\n tool_update: AomiSSEEvent;\n /** SSE: tool execution completed. */\n tool_complete: AomiSSEEvent;\n /** Session title changed. */\n title_changed: { title: string };\n /** Messages updated (new messages from poll or send response). */\n messages: AomiMessage[];\n /** AI started processing. */\n processing_start: undefined;\n /** AI finished processing. */\n processing_end: undefined;\n /**\n * Backend transitioned from processing to idle (is_processing went false).\n * Unlike `processing_end`, this fires even when there are unresolved local\n * wallet requests. CLI consumers use it to know that all system events\n * (including wallet requests) have been delivered for the current turn.\n */\n backend_idle: undefined;\n /** An error occurred during polling or SSE. */\n error: { error: unknown };\n /** Wildcard: receives all events as { type, payload }. */\n \"*\": { type: string; payload: unknown };\n};\n\n// =============================================================================\n// Session Class\n// =============================================================================\n\nexport class ClientSession extends TypedEventEmitter<SessionEventMap> {\n /** The underlying low-level client. */\n readonly client: AomiClient;\n /** The session (thread) ID. */\n readonly sessionId: string;\n\n private app: string;\n private publicKey?: string;\n private apiKey?: string;\n private userState?: UserState;\n private clientId: string;\n private pollIntervalMs: number;\n private logger?: { debug: (...args: unknown[]) => void };\n\n // Internal state\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private unsubscribeSSE: (() => void) | null = null;\n private _isProcessing = false;\n private _backendWasProcessing = false;\n private walletRequests: WalletRequest[] = [];\n private walletRequestNextId = 1;\n private _messages: AomiMessage[] = [];\n private _title?: string;\n private closed = false;\n\n // For send() blocking behavior\n private pendingResolve: ((result: SendResult) => void) | null = null;\n\n constructor(\n clientOrOptions: AomiClient | AomiClientOptions,\n sessionOptions?: SessionOptions,\n ) {\n super();\n\n this.client =\n clientOrOptions instanceof AomiClient\n ? clientOrOptions\n : new AomiClient(clientOrOptions);\n\n this.sessionId = sessionOptions?.sessionId ?? crypto.randomUUID();\n this.app = sessionOptions?.app ?? \"default\";\n this.publicKey = sessionOptions?.publicKey;\n this.apiKey = sessionOptions?.apiKey;\n this.userState = sessionOptions?.clientType\n ? addUserStateExt(sessionOptions?.userState ?? {}, \"client_type\", sessionOptions.clientType)\n : sessionOptions?.userState;\n this.clientId = sessionOptions?.clientId ?? crypto.randomUUID();\n this.pollIntervalMs = sessionOptions?.pollIntervalMs ?? 500;\n this.logger = sessionOptions?.logger;\n\n // Start SSE subscription\n this.unsubscribeSSE = this.client.subscribeSSE(\n this.sessionId,\n (event) => this.handleSSEEvent(event),\n (error) => this.emit(\"error\", { error }),\n );\n }\n\n // ===========================================================================\n // Public API — Chat\n // ===========================================================================\n\n /**\n * Send a message and wait for the AI to finish processing.\n *\n * The returned promise resolves when `is_processing` becomes `false` AND\n * there are no pending wallet requests. If a wallet request arrives\n * mid-processing, polling continues but the promise pauses until the\n * request is resolved or rejected via `resolve()` / `reject()`.\n */\n async send(message: string): Promise<SendResult> {\n this.assertOpen();\n\n const response = await this.client.sendMessage(this.sessionId, message, {\n app: this.app,\n publicKey: this.publicKey,\n apiKey: this.apiKey,\n userState: this.userState,\n clientId: this.clientId,\n });\n\n this.assertUserStateAligned(response.user_state);\n this.applyState(response);\n\n if (!response.is_processing && this.walletRequests.length === 0) {\n return { messages: this._messages, title: this._title };\n }\n\n this._isProcessing = true;\n this.emit(\"processing_start\", undefined);\n\n return new Promise<SendResult>((resolve) => {\n this.pendingResolve = resolve;\n this.startPolling();\n });\n }\n\n /**\n * Send a message without waiting for completion.\n * Polling starts in the background; listen to events for updates.\n */\n async sendAsync(message: string): Promise<AomiChatResponse> {\n this.assertOpen();\n\n const response = await this.client.sendMessage(this.sessionId, message, {\n app: this.app,\n publicKey: this.publicKey,\n apiKey: this.apiKey,\n userState: this.userState,\n clientId: this.clientId,\n });\n\n this.assertUserStateAligned(response.user_state);\n this.applyState(response);\n\n if (response.is_processing) {\n this._isProcessing = true;\n this.emit(\"processing_start\", undefined);\n this.startPolling();\n }\n\n return response;\n }\n\n // ===========================================================================\n // Public API — Wallet Request Resolution\n // ===========================================================================\n\n /**\n * Resolve a pending wallet request (transaction or EIP-712 signing).\n * Sends the result to the backend and resumes polling.\n */\n async resolve(requestId: string, result: WalletRequestResult): Promise<void> {\n const req = this.removeWalletRequest(requestId);\n if (!req) {\n throw new Error(`No pending wallet request with id \"${requestId}\"`);\n }\n\n if (req.kind === \"transaction\") {\n await this.sendSystemEvent(\"wallet:tx_complete\", {\n txHash: result.txHash ?? \"\",\n status: \"success\",\n amount: result.amount,\n });\n } else {\n const eip712Payload = req.payload as WalletEip712Payload;\n await this.sendSystemEvent(\"wallet_eip712_response\", {\n status: \"success\",\n signature: result.signature,\n description: eip712Payload.description,\n });\n }\n\n // Resume polling if still processing\n if (this._isProcessing) {\n this.startPolling();\n }\n }\n\n /**\n * Reject a pending wallet request.\n * Sends an error to the backend and resumes polling.\n */\n async reject(requestId: string, reason?: string): Promise<void> {\n const req = this.removeWalletRequest(requestId);\n if (!req) {\n throw new Error(`No pending wallet request with id \"${requestId}\"`);\n }\n\n if (req.kind === \"transaction\") {\n await this.sendSystemEvent(\"wallet:tx_complete\", {\n txHash: \"\",\n status: \"failed\",\n });\n } else {\n const eip712Payload = req.payload as WalletEip712Payload;\n await this.sendSystemEvent(\"wallet_eip712_response\", {\n status: \"failed\",\n error: reason ?? \"Request rejected\",\n description: eip712Payload.description,\n });\n }\n\n if (this._isProcessing) {\n this.startPolling();\n }\n }\n\n // ===========================================================================\n // Public API — Control\n // ===========================================================================\n\n /**\n * Cancel the AI's current response.\n */\n async interrupt(): Promise<void> {\n this.stopPolling();\n const response = await this.client.interrupt(this.sessionId);\n this.applyState(response);\n this._isProcessing = false;\n this.emit(\"processing_end\", undefined);\n this.resolvePending();\n }\n\n /**\n * Close the session. Stops polling, unsubscribes SSE, removes all listeners.\n * The session cannot be used after closing.\n */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.stopPolling();\n this.unsubscribeSSE?.();\n this.unsubscribeSSE = null;\n this.resolvePending();\n this.removeAllListeners();\n }\n\n // ===========================================================================\n // Public API — Accessors\n // ===========================================================================\n\n /** Current messages in the session. */\n getMessages(): AomiMessage[] {\n return this._messages;\n }\n\n /** Current session title. */\n getTitle(): string | undefined {\n return this._title;\n }\n\n /** Pending wallet requests waiting for resolve/reject. */\n getPendingRequests(): WalletRequest[] {\n return [...this.walletRequests];\n }\n\n /** Whether the AI is currently processing. */\n getIsProcessing(): boolean {\n return this._isProcessing;\n }\n\n resolveUserState(userState: UserState): void {\n this.userState = userState;\n\n const address = userState[\"address\"];\n if (typeof address === \"string\" && address.length > 0) {\n this.publicKey = address;\n }\n }\n\n setClientType(clientType: AomiClientType): void {\n this.resolveUserState(addUserStateExt(this.userState ?? {}, \"client_type\", clientType));\n }\n\n addExtValue(key: string, value: unknown): void {\n const current = this.userState ?? {};\n const currentExt = isRecord(current[\"ext\"]) ? current[\"ext\"] : {};\n this.resolveUserState({\n ...current,\n ext: {\n ...currentExt,\n [key]: value,\n },\n });\n }\n\n removeExtValue(key: string): void {\n if (!this.userState) return;\n const currentExt = this.userState[\"ext\"];\n if (!isRecord(currentExt)) return;\n\n const nextExt = { ...currentExt };\n delete nextExt[key];\n\n const nextState = { ...this.userState };\n if (Object.keys(nextExt).length === 0) {\n delete nextState[\"ext\"];\n } else {\n nextState[\"ext\"] = nextExt;\n }\n this.resolveUserState(nextState);\n }\n\n resolveWallet(address: string, chainId?: number): void {\n this.resolveUserState({ address, chainId: chainId ?? 1, isConnected: true });\n }\n\n async syncUserState(): Promise<AomiStateResponse> {\n this.assertOpen();\n\n const state = await this.client.fetchState(this.sessionId, this.userState, this.clientId);\n this.assertUserStateAligned(state.user_state);\n this.applyState(state);\n return state;\n }\n\n // ===========================================================================\n // Public API — Polling Control\n // ===========================================================================\n\n /** Whether the session is currently polling for state updates. */\n getIsPolling(): boolean {\n return this.pollTimer !== null;\n }\n\n /**\n * Fetch the current state from the backend (one-shot).\n * Automatically starts polling if the backend is processing.\n */\n async fetchCurrentState(): Promise<void> {\n this.assertOpen();\n\n const state = await this.client.fetchState(\n this.sessionId,\n this.userState,\n this.clientId,\n );\n\n this.assertUserStateAligned(state.user_state);\n this.applyState(state);\n\n if (state.is_processing && !this.pollTimer) {\n this._isProcessing = true;\n this.emit(\"processing_start\", undefined);\n this.startPolling();\n } else if (!state.is_processing) {\n this._isProcessing = false;\n }\n }\n\n /**\n * Start polling for state updates. Idempotent — no-op if already polling.\n * Useful for resuming polling after resolving a wallet request.\n */\n startPolling(): void {\n if (this.pollTimer || this.closed) return;\n\n this._backendWasProcessing = true;\n this.logger?.debug(\"[session] polling started\", this.sessionId);\n this.pollTimer = setInterval(() => {\n void this.pollTick();\n }, this.pollIntervalMs);\n }\n\n /** Stop polling for state updates. Idempotent — no-op if not polling. */\n stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n this.logger?.debug(\"[session] polling stopped\", this.sessionId);\n }\n }\n\n private async pollTick(): Promise<void> {\n if (!this.pollTimer) return;\n\n try {\n const state = await this.client.fetchState(\n this.sessionId,\n this.userState,\n this.clientId,\n );\n\n // Guard: polling may have been stopped while awaiting fetch\n if (!this.pollTimer) return;\n\n this.assertUserStateAligned(state.user_state);\n this.applyState(state);\n\n // Detect backend processing → idle transition.\n // Fires even when local wallet requests are pending, so CLI consumers\n // know all system events for this turn have been delivered.\n if (this._backendWasProcessing && !state.is_processing) {\n this.emit(\"backend_idle\", undefined);\n }\n this._backendWasProcessing = !!state.is_processing;\n\n if (!state.is_processing && this.walletRequests.length === 0) {\n this.stopPolling();\n this._isProcessing = false;\n this.emit(\"processing_end\", undefined);\n this.resolvePending();\n }\n } catch (error) {\n this.logger?.debug(\"[session] poll error\", error);\n this.emit(\"error\", { error });\n }\n }\n\n // ===========================================================================\n // Internal — State Application\n // ===========================================================================\n\n private applyState(\n state: Pick<\n AomiStateResponse,\n \"messages\" | \"system_events\" | \"title\" | \"is_processing\"\n >,\n ): void {\n if (state.messages) {\n this._messages = state.messages;\n this.emit(\"messages\", this._messages);\n }\n\n if (state.title) {\n this._title = state.title;\n }\n\n if (state.system_events?.length) {\n this.dispatchSystemEvents(state.system_events);\n }\n }\n\n private dispatchSystemEvents(events: AomiSystemEvent[]): void {\n for (const event of events) {\n const unwrapped = unwrapSystemEvent(event);\n if (!unwrapped) continue;\n\n if (unwrapped.type === \"wallet_tx_request\") {\n const payload = normalizeTxPayload(unwrapped.payload);\n if (payload) {\n const req = this.enqueueWalletRequest(\"transaction\", payload);\n this.emit(\"wallet_tx_request\", req);\n }\n } else if (unwrapped.type === \"wallet_eip712_request\") {\n const payload = normalizeEip712Payload(unwrapped.payload ?? {});\n const req = this.enqueueWalletRequest(\"eip712_sign\", payload);\n this.emit(\"wallet_eip712_request\", req);\n } else if (\n unwrapped.type === \"system_notice\" ||\n unwrapped.type === \"system_error\" ||\n unwrapped.type === \"async_callback\"\n ) {\n // These match known event map keys — emit directly\n this.emit(\n unwrapped.type as keyof SessionEventMap,\n unwrapped.payload as never,\n );\n }\n }\n }\n\n // ===========================================================================\n // Internal — SSE Handling\n // ===========================================================================\n\n private handleSSEEvent(event: AomiSSEEvent): void {\n if (event.type === \"title_changed\" && event.new_title) {\n this._title = event.new_title;\n this.emit(\"title_changed\", { title: event.new_title });\n } else if (event.type === \"tool_update\") {\n this.emit(\"tool_update\", event);\n } else if (event.type === \"tool_complete\") {\n this.emit(\"tool_complete\", event);\n }\n }\n\n // ===========================================================================\n // Internal — Wallet Request Queue\n // ===========================================================================\n\n private enqueueWalletRequest(\n kind: WalletRequestKind,\n payload: WalletTxPayload | WalletEip712Payload,\n ): WalletRequest {\n const req: WalletRequest = {\n id: `wreq-${this.walletRequestNextId++}`,\n kind,\n payload,\n timestamp: Date.now(),\n };\n this.walletRequests.push(req);\n return req;\n }\n\n private removeWalletRequest(id: string): WalletRequest | null {\n const idx = this.walletRequests.findIndex((r) => r.id === id);\n if (idx === -1) return null;\n return this.walletRequests.splice(idx, 1)[0];\n }\n\n // ===========================================================================\n // Internal — Helpers\n // ===========================================================================\n\n private async sendSystemEvent(\n type: string,\n payload: unknown,\n ): Promise<void> {\n const message = JSON.stringify({ type, payload });\n await this.client.sendSystemMessage(this.sessionId, message);\n }\n\n private resolvePending(): void {\n if (this.pendingResolve) {\n const resolve = this.pendingResolve;\n this.pendingResolve = null;\n resolve({ messages: this._messages, title: this._title });\n }\n }\n\n private assertOpen(): void {\n if (this.closed) {\n throw new Error(\"Session is closed\");\n }\n }\n\n private assertUserStateAligned(actualUserState?: UserState | null): void {\n if (!this.userState || !actualUserState) {\n return;\n }\n\n if (!isSubsetMatch(this.userState, actualUserState)) {\n const expected = JSON.stringify(sortJson(this.userState));\n const actual = JSON.stringify(sortJson(actualUserState));\n console.warn(\n `[session] Backend user_state mismatch (non-fatal). expected subset=${expected} actual=${actual}`,\n );\n }\n }\n}\n","import type { Chain, Hex } from \"viem\";\n\n// ---------------------------------------------------------------------------\n// Enums / Literal Types\n// ---------------------------------------------------------------------------\n\nexport type AAProvider = \"alchemy\" | \"pimlico\";\nexport type AAMode = \"4337\" | \"7702\";\nexport type AASponsorship = \"disabled\" | \"optional\" | \"required\";\n\n// ---------------------------------------------------------------------------\n// Call Types\n// ---------------------------------------------------------------------------\n\nexport type AAWalletCall = {\n to: Hex;\n value: bigint;\n data?: Hex;\n chainId: number;\n};\n\nexport type WalletAtomicCapability = {\n atomic?: {\n status?: string;\n };\n};\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface AAChainConfig {\n chainId: number;\n enabled: boolean;\n defaultMode: AAMode;\n supportedModes: AAMode[];\n allowBatching: boolean;\n sponsorship: AASponsorship;\n}\n\nexport interface AAConfig {\n enabled: boolean;\n provider: AAProvider;\n fallbackToEoa: boolean;\n chains: AAChainConfig[];\n}\n\n// ---------------------------------------------------------------------------\n// Execution Plan\n// ---------------------------------------------------------------------------\n\nexport interface AAResolvedConfig {\n provider: AAProvider;\n chainId: number;\n mode: AAMode;\n batchingEnabled: boolean;\n sponsorship: AASponsorship;\n fallbackToEoa: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Provider Abstractions\n// ---------------------------------------------------------------------------\n\n/** The subset of AAWalletCall passed to smart account send methods (chainId already resolved). */\nexport type AACallPayload = Omit<AAWalletCall, \"chainId\">;\n\nexport interface SmartAccount {\n provider: string;\n mode: string;\n AAAddress?: Hex;\n delegationAddress?: Hex;\n sendTransaction: (call: AACallPayload) => Promise<{ transactionHash: string }>;\n sendBatchTransaction: (calls: AACallPayload[]) => Promise<{ transactionHash: string }>;\n}\n\nexport interface AAState<TAccount extends SmartAccount = SmartAccount> {\n resolved: AAResolvedConfig | null;\n account?: TAccount | null;\n pending: boolean;\n error: Error | null;\n}\n\n// ---------------------------------------------------------------------------\n// Execution Params / Results\n// ---------------------------------------------------------------------------\n\nexport interface ExecutionResult {\n txHash: string;\n txHashes: string[];\n executionKind: string;\n batched: boolean;\n sponsored: boolean;\n AAAddress?: Hex;\n delegationAddress?: Hex;\n}\n\nexport interface AtomicBatchArgs {\n calls: AACallPayload[];\n capabilities?: {\n atomic?: {\n required?: boolean;\n };\n };\n}\n\nexport interface ExecuteWalletCallsParams<\n TAccount extends SmartAccount = SmartAccount,\n> {\n callList: AAWalletCall[];\n currentChainId: number;\n capabilities: Record<string, WalletAtomicCapability> | undefined;\n localPrivateKey: `0x${string}` | null;\n providerState: AAState<TAccount>;\n sendCallsSyncAsync: (args: AtomicBatchArgs) => Promise<unknown>;\n sendTransactionAsync: (args: {\n chainId: number;\n to: Hex;\n value: bigint;\n data?: Hex;\n }) => Promise<string>;\n switchChainAsync: (params: { chainId: number }) => Promise<unknown>;\n chainsById: Record<number, Chain>;\n getPreferredRpcUrl: (chain: Chain) => string;\n}\n\n// ---------------------------------------------------------------------------\n// Validation Sets\n// ---------------------------------------------------------------------------\n\nexport const MODES = new Set<AAMode>([\"4337\", \"7702\"]);\nexport const SPONSORSHIP_MODES = new Set<AASponsorship>([\n \"disabled\",\n \"optional\",\n \"required\",\n]);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Config Planning\n// ---------------------------------------------------------------------------\n\nexport function getAAChainConfig(\n config: AAConfig,\n calls: AAWalletCall[],\n chainsById: Record<number, Chain>,\n): AAChainConfig | null {\n if (!config.enabled || calls.length === 0) {\n return null;\n }\n\n const chainIds = Array.from(new Set(calls.map((call) => call.chainId)));\n if (chainIds.length !== 1) {\n return null;\n }\n\n const chainId = chainIds[0];\n if (!chainsById[chainId]) {\n return null;\n }\n\n const chainConfig = config.chains.find((item) => item.chainId === chainId);\n if (!chainConfig?.enabled) {\n return null;\n }\n if (calls.length > 1 && !chainConfig.allowBatching) {\n return null;\n }\n\n return chainConfig;\n}\n\nexport function buildAAExecutionPlan(\n config: AAConfig,\n chainConfig: AAChainConfig,\n): AAResolvedConfig {\n const mode = chainConfig.supportedModes.includes(chainConfig.defaultMode)\n ? chainConfig.defaultMode\n : chainConfig.supportedModes[0];\n\n if (!mode) {\n throw new Error(`No smart account mode configured for chain ${chainConfig.chainId}`);\n }\n\n return {\n provider: config.provider,\n chainId: chainConfig.chainId,\n mode,\n batchingEnabled: chainConfig.allowBatching,\n sponsorship: chainConfig.sponsorship,\n fallbackToEoa: config.fallbackToEoa,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Readiness Check\n// ---------------------------------------------------------------------------\n\nexport function getWalletExecutorReady(\n providerState: AAState,\n): boolean {\n return (\n !providerState.resolved ||\n (!providerState.pending &&\n (Boolean(providerState.account) ||\n Boolean(providerState.error) ||\n providerState.resolved.fallbackToEoa))\n );\n}\n\n// ---------------------------------------------------------------------------\n// Execution\n// ---------------------------------------------------------------------------\n\nexport const DEFAULT_AA_CONFIG: AAConfig = {\n enabled: true,\n provider: \"alchemy\",\n fallbackToEoa: true,\n chains: [\n {\n chainId: 1,\n enabled: true,\n defaultMode: \"7702\",\n supportedModes: [\"4337\", \"7702\"],\n allowBatching: true,\n sponsorship: \"optional\",\n },\n {\n chainId: 137,\n enabled: true,\n defaultMode: \"4337\",\n supportedModes: [\"4337\", \"7702\"],\n allowBatching: true,\n sponsorship: \"optional\",\n },\n {\n chainId: 42161,\n enabled: true,\n defaultMode: \"4337\",\n supportedModes: [\"4337\", \"7702\"],\n allowBatching: true,\n sponsorship: \"optional\",\n },\n {\n chainId: 10,\n enabled: true,\n defaultMode: \"4337\",\n supportedModes: [\"4337\", \"7702\"],\n allowBatching: true,\n sponsorship: \"optional\",\n },\n {\n chainId: 8453,\n enabled: true,\n defaultMode: \"4337\",\n supportedModes: [\"4337\", \"7702\"],\n allowBatching: true,\n sponsorship: \"optional\",\n },\n ],\n};\n\nexport const DISABLED_PROVIDER_STATE: AAState = {\n resolved: null,\n account: undefined,\n pending: false,\n error: null,\n};\n\n","import type { Chain } from \"viem\";\nimport { mainnet, polygon, arbitrum, optimism, base, sepolia } from \"viem/chains\";\n\nexport const SUPPORTED_CHAIN_IDS = [1, 137, 42161, 8453, 10, 11155111] as const;\n\nexport const CHAIN_NAMES: Record<number, string> = {\n 1: \"Ethereum\",\n 137: \"Polygon\",\n 42161: \"Arbitrum One\",\n 8453: \"Base\",\n 10: \"Optimism\",\n 11155111: \"Sepolia\",\n};\n\n/** Alchemy network slugs for proxy URL construction. */\nexport const ALCHEMY_CHAIN_SLUGS: Record<number, string> = {\n 1: \"eth-mainnet\",\n 137: \"polygon-mainnet\",\n 42161: \"arb-mainnet\",\n 8453: \"base-mainnet\",\n 10: \"opt-mainnet\",\n 11155111: \"eth-sepolia\",\n};\n\nexport const CHAINS_BY_ID: Record<number, Chain> = {\n 1: mainnet,\n 137: polygon,\n 42161: arbitrum,\n 10: optimism,\n 8453: base,\n 11155111: sepolia,\n};\n","import type { Hex } from \"viem\";\nimport { CHAINS_BY_ID } from \"../chains\";\n\nimport type {\n AACallPayload,\n AAState,\n AAWalletCall,\n ExecuteWalletCallsParams,\n ExecutionResult,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Public Entry Point\n// ---------------------------------------------------------------------------\n\nexport async function executeWalletCalls(\n params: ExecuteWalletCallsParams,\n): Promise<ExecutionResult> {\n const {\n callList,\n currentChainId,\n capabilities,\n localPrivateKey,\n providerState,\n sendCallsSyncAsync,\n sendTransactionAsync,\n switchChainAsync,\n chainsById,\n getPreferredRpcUrl,\n } = params;\n\n if (providerState.resolved && providerState.account) {\n return executeViaAA(callList, providerState);\n }\n\n if (providerState.resolved && providerState.error && !providerState.resolved.fallbackToEoa) {\n throw providerState.error;\n }\n\n return executeViaEoa({\n callList,\n currentChainId,\n capabilities,\n localPrivateKey,\n sendCallsSyncAsync,\n sendTransactionAsync,\n switchChainAsync,\n chainsById,\n getPreferredRpcUrl,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal — AA Path\n// ---------------------------------------------------------------------------\n\nasync function executeViaAA(\n callList: AAWalletCall[],\n providerState: AAState,\n): Promise<ExecutionResult> {\n const account = providerState.account;\n const resolved = providerState.resolved;\n\n if (!account || !resolved) {\n throw providerState.error ?? new Error(\"smart_account_unavailable\");\n }\n\n const callsPayload: AACallPayload[] = callList.map(({ to, value, data }) => ({ to, value, data }));\n const receipt =\n callList.length > 1\n ? await account.sendBatchTransaction(callsPayload)\n : await account.sendTransaction(callsPayload[0]);\n const txHash = receipt.transactionHash;\n const providerPrefix = account.provider.toLowerCase();\n\n // For 7702, the SDK may not provide the delegation address (or provide the\n // EOA which is already filtered out by adaptSmartAccount). Fall back to\n // reading the authorization list from the on-chain transaction.\n let delegationAddress: Hex | undefined =\n account.mode === \"7702\" ? account.delegationAddress : undefined;\n\n if (account.mode === \"7702\" && !delegationAddress) {\n delegationAddress = await resolve7702Delegation(txHash, callList);\n }\n\n return {\n txHash,\n txHashes: [txHash],\n executionKind: `${providerPrefix}_${account.mode}`,\n batched: callList.length > 1,\n sponsored: resolved.sponsorship !== \"disabled\",\n AAAddress: account.AAAddress,\n delegationAddress,\n };\n}\n\n/**\n * Best-effort extraction of the 7702 delegation target from the on-chain\n * transaction's authorization list. Returns `undefined` on any failure so\n * the caller can safely fall through.\n */\nasync function resolve7702Delegation(\n txHash: string,\n callList: AAWalletCall[],\n): Promise<Hex | undefined> {\n try {\n const { createPublicClient, http } = await import(\"viem\");\n const chainId = callList[0]?.chainId;\n if (!chainId) return undefined;\n\n const chain = CHAINS_BY_ID[chainId];\n if (!chain) return undefined;\n\n const client = createPublicClient({ chain, transport: http() });\n const tx = await client.getTransaction({ hash: txHash as Hex });\n const authList = (\n tx as unknown as {\n authorizationList?: Array<{ address?: Hex; contractAddress?: Hex }>;\n }\n ).authorizationList;\n const target = authList?.[0]?.address ?? authList?.[0]?.contractAddress;\n if (target) {\n return target;\n }\n } catch {\n // Best-effort — don't fail the whole execution.\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Internal — EOA Path\n// ---------------------------------------------------------------------------\n\nasync function executeViaEoa({\n callList,\n currentChainId,\n capabilities,\n localPrivateKey,\n sendCallsSyncAsync,\n sendTransactionAsync,\n switchChainAsync,\n chainsById,\n getPreferredRpcUrl,\n}: Omit<ExecuteWalletCallsParams, \"providerState\">): Promise<ExecutionResult> {\n const { createPublicClient, createWalletClient, http } = await import(\"viem\");\n const { privateKeyToAccount } = await import(\"viem/accounts\");\n\n const hashes: string[] = [];\n\n if (localPrivateKey) {\n for (const call of callList) {\n const chain = chainsById[call.chainId];\n if (!chain) {\n throw new Error(`Unsupported chain ${call.chainId}`);\n }\n const rpcUrl = getPreferredRpcUrl(chain);\n if (!rpcUrl) {\n throw new Error(`No RPC for chain ${call.chainId}`);\n }\n\n const account = privateKeyToAccount(localPrivateKey);\n const walletClient = createWalletClient({\n account,\n chain,\n transport: http(rpcUrl),\n });\n const hash = await walletClient.sendTransaction({\n account,\n to: call.to,\n value: call.value,\n data: call.data,\n });\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n await publicClient.waitForTransactionReceipt({ hash });\n hashes.push(hash);\n }\n\n return {\n txHash: hashes[hashes.length - 1],\n txHashes: hashes,\n executionKind: \"eoa\",\n batched: hashes.length > 1,\n sponsored: false,\n };\n }\n\n const chainIds = Array.from(new Set(callList.map((call) => call.chainId)));\n if (chainIds.length > 1) {\n throw new Error(\"mixed_chain_bundle_not_supported\");\n }\n\n const chainId = chainIds[0];\n if (currentChainId !== chainId) {\n await switchChainAsync({ chainId });\n }\n\n const chainCaps = capabilities?.[`eip155:${chainId}`];\n const atomicStatus = chainCaps?.atomic?.status;\n const canUseSendCalls = atomicStatus === \"supported\" || atomicStatus === \"ready\";\n\n if (canUseSendCalls) {\n const batchResult = await sendCallsSyncAsync({\n calls: callList.map(({ to, value, data }) => ({ to, value, data })),\n capabilities: {\n atomic: {\n required: true,\n },\n },\n });\n\n const receipts =\n (batchResult as { receipts?: Array<{ transactionHash?: string }> }).receipts ??\n [];\n for (const receipt of receipts) {\n if (receipt.transactionHash) {\n hashes.push(receipt.transactionHash);\n }\n }\n } else {\n for (const call of callList) {\n const hash = await sendTransactionAsync({\n chainId: call.chainId,\n to: call.to,\n value: call.value,\n data: call.data,\n });\n hashes.push(hash);\n }\n }\n\n return {\n txHash: hashes[hashes.length - 1],\n txHashes: hashes,\n executionKind: \"eoa\",\n batched: hashes.length > 1,\n sponsored: false,\n };\n}\n","import type { Chain } from \"viem\";\n\nimport type {\n AAConfig,\n AAMode,\n AAResolvedConfig,\n AAState,\n SmartAccount,\n AAWalletCall,\n} from \"../types\";\nimport { DEFAULT_AA_CONFIG, getAAChainConfig, buildAAExecutionPlan } from \"../types\";\n\nexport interface AlchemyHookParams {\n enabled: boolean;\n apiKey: string;\n chain: Chain;\n rpcUrl: string;\n gasPolicyId?: string;\n mode: AAMode;\n}\n\ntype AlchemyHookState<TAccount extends SmartAccount = SmartAccount> = {\n account?: TAccount | null;\n pending?: boolean;\n error?: Error | null;\n};\n\nexport type UseAlchemyAAHook<TAccount extends SmartAccount = SmartAccount> = (\n params?: AlchemyHookParams,\n) => AlchemyHookState<TAccount>;\n\nexport interface CreateAlchemyAAProviderOptions<\n TAccount extends SmartAccount = SmartAccount,\n> {\n accountAbstractionConfig?: AAConfig;\n useAlchemyAA: UseAlchemyAAHook<TAccount>;\n chainsById: Record<number, Chain>;\n chainSlugById: Record<number, string>;\n getPreferredRpcUrl: (chain: Chain) => string;\n apiKeyEnvVar?: string;\n gasPolicyEnvVar?: string;\n}\n\n/**\n * Resolve Alchemy config for the React hook path (public env vars only).\n */\nfunction resolveForHook(params: {\n calls: AAWalletCall[] | null;\n localPrivateKey: `0x${string}` | null;\n accountAbstractionConfig: AAConfig;\n chainsById: Record<number, Chain>;\n chainSlugById: Record<number, string>;\n getPreferredRpcUrl: (chain: Chain) => string;\n}): (AAResolvedConfig & { apiKey: string; chain: Chain; rpcUrl: string; gasPolicyId?: string }) | null {\n const { calls, localPrivateKey, accountAbstractionConfig, chainsById, getPreferredRpcUrl } = params;\n\n if (!calls || localPrivateKey) return null;\n\n const config = { ...accountAbstractionConfig, provider: \"alchemy\" as const };\n const chainConfig = getAAChainConfig(config, calls, chainsById);\n if (!chainConfig) return null;\n\n const apiKey = process.env.NEXT_PUBLIC_ALCHEMY_API_KEY?.trim();\n if (!apiKey) return null;\n\n const chain = chainsById[chainConfig.chainId];\n if (!chain) return null;\n\n const gasPolicyId = process.env.NEXT_PUBLIC_ALCHEMY_GAS_POLICY_ID?.trim();\n const resolved = buildAAExecutionPlan(config, chainConfig);\n\n return {\n ...resolved,\n apiKey,\n chain,\n rpcUrl: getPreferredRpcUrl(chain),\n gasPolicyId,\n mode: chainConfig.defaultMode,\n };\n}\n\nexport function createAlchemyAAProvider<\n TAccount extends SmartAccount = SmartAccount,\n>({\n accountAbstractionConfig = DEFAULT_AA_CONFIG,\n useAlchemyAA,\n chainsById,\n chainSlugById,\n getPreferredRpcUrl,\n}: CreateAlchemyAAProviderOptions<TAccount>) {\n return function useAlchemyAAProvider(\n calls: AAWalletCall[] | null,\n localPrivateKey: `0x${string}` | null,\n ): AAState<TAccount> {\n const resolved = resolveForHook({\n calls,\n localPrivateKey,\n accountAbstractionConfig,\n chainsById,\n chainSlugById,\n getPreferredRpcUrl,\n });\n\n const params = resolved\n ? ({\n enabled: true,\n apiKey: resolved.apiKey,\n chain: resolved.chain,\n rpcUrl: resolved.rpcUrl,\n gasPolicyId: resolved.gasPolicyId,\n mode: resolved.mode,\n } satisfies AlchemyHookParams)\n : undefined;\n\n const query = useAlchemyAA(params);\n\n return {\n resolved: resolved ?? null,\n account: query.account,\n pending: Boolean(resolved && query.pending),\n error: query.error ?? null,\n };\n };\n}\n","import type { Chain, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nimport { adaptSmartAccount } from \"../adapt\";\nimport type { AAState, SmartAccount, AAMode, AAWalletCall } from \"../types\";\nimport {\n DEFAULT_AA_CONFIG,\n getAAChainConfig,\n buildAAExecutionPlan,\n} from \"../types\";\nimport {\n getMissingOwnerState,\n getOwnerParams,\n getUnsupportedAdapterState,\n type AAOwner,\n} from \"../owner\";\nimport { ALCHEMY_CHAIN_SLUGS } from \"../../chains\";\n\nconst ALCHEMY_7702_DELEGATION_ADDRESS =\n \"0x69007702764179f14F51cdce752f4f775d74E139\" as Hex;\nconst AA_DEBUG_ENABLED = process.env.AOMI_AA_DEBUG === \"1\";\n\n/** EIP-7702 intrinsic gas per authorization entry. */\nconst EIP_7702_AUTH_GAS_OVERHEAD = BigInt(25000);\n\nfunction alchemyRpcUrl(chainId: number, apiKey: string): string {\n const slug = ALCHEMY_CHAIN_SLUGS[chainId] ?? \"eth-mainnet\";\n return `https://${slug}.g.alchemy.com/v2/${apiKey}`;\n}\n\nfunction aaDebug(message: string, fields?: Record<string, unknown>): void {\n if (!AA_DEBUG_ENABLED) return;\n if (fields) {\n console.debug(`[aomi][aa][alchemy] ${message}`, fields);\n return;\n }\n console.debug(`[aomi][aa][alchemy] ${message}`);\n}\n\nfunction extractExistingAccountAddress(error: unknown): Hex | null {\n const message = error instanceof Error ? error.message : String(error);\n const match = message.match(/Account with address (0x[a-fA-F0-9]{40}) already exists/);\n return (match?.[1] as Hex | undefined) ?? null;\n}\n\nfunction deriveAlchemy4337AccountId(address: Hex): string {\n const hex = address.toLowerCase().slice(2).padEnd(32, \"0\").slice(0, 32).split(\"\");\n const namespace = [\"4\", \"3\", \"3\", \"7\", \"5\", \"a\", \"a\", \"b\"];\n for (let i = 0; i < namespace.length; i += 1) {\n hex[i] = namespace[i];\n }\n hex[12] = \"4\";\n const variant = Number.parseInt(hex[16] ?? \"0\", 16);\n hex[16] = ((variant & 0x3) | 0x8).toString(16);\n\n return [\n hex.slice(0, 8).join(\"\"),\n hex.slice(8, 12).join(\"\"),\n hex.slice(12, 16).join(\"\"),\n hex.slice(16, 20).join(\"\"),\n hex.slice(20, 32).join(\"\"),\n ].join(\"-\");\n}\n\n/** Shared params for the direct-owner 4337/7702 paths. */\ninterface AlchemyDirectOwnerParams {\n resolved: NonNullable<AAState[\"resolved\"]>;\n chain: Chain;\n privateKey: `0x${string}`;\n apiKey?: string;\n proxyBaseUrl?: string;\n gasPolicyId?: string;\n}\n\nexport interface CreateAlchemyAAStateOptions {\n chain: Chain;\n owner: AAOwner;\n rpcUrl: string;\n callList: AAWalletCall[];\n mode?: AAMode;\n /** Alchemy API key for BYOK. Omit to use proxy. */\n apiKey?: string;\n gasPolicyId?: string;\n sponsored?: boolean;\n /** Backend proxy base URL. Used when apiKey is omitted. */\n proxyBaseUrl?: string;\n}\n\nexport async function createAlchemyAAState(\n options: CreateAlchemyAAStateOptions,\n): Promise<AAState> {\n const {\n chain,\n owner,\n callList,\n mode,\n sponsored = true,\n } = options;\n\n const chainConfig = getAAChainConfig(DEFAULT_AA_CONFIG, callList, {\n [chain.id]: chain,\n });\n if (!chainConfig) {\n throw new Error(`AA is not configured for chain ${chain.id}.`);\n }\n\n const effectiveMode = mode ?? chainConfig.defaultMode;\n const plan = buildAAExecutionPlan(\n { ...DEFAULT_AA_CONFIG, provider: \"alchemy\" },\n { ...chainConfig, defaultMode: effectiveMode },\n );\n\n const gasPolicyId = sponsored\n ? (options.gasPolicyId ?? process.env.ALCHEMY_GAS_POLICY_ID?.trim())\n : undefined;\n\n const execution = {\n ...plan,\n mode: effectiveMode,\n sponsorship: gasPolicyId ? plan.sponsorship : \"disabled\",\n fallbackToEoa: false,\n } as AAState[\"resolved\"];\n\n const ownerParams = getOwnerParams(owner);\n if (ownerParams.kind === \"missing\") {\n return getMissingOwnerState(execution, \"alchemy\");\n }\n if (ownerParams.kind === \"unsupported_adapter\") {\n return getUnsupportedAdapterState(execution, ownerParams.adapter);\n }\n\n if (owner.kind === \"direct\") {\n const directParams: AlchemyDirectOwnerParams = {\n resolved: execution!,\n chain,\n privateKey: owner.privateKey,\n apiKey: options.apiKey,\n proxyBaseUrl: options.proxyBaseUrl,\n gasPolicyId,\n };\n try {\n return await (execution!.mode === \"7702\"\n ? createAlchemy7702State(directParams)\n : createAlchemy4337State(directParams));\n } catch (error) {\n return {\n resolved: execution,\n account: null,\n pending: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n // Session/adapter path — requires a real API key (no proxy support)\n if (!options.apiKey) {\n return {\n resolved: execution,\n account: null,\n pending: false,\n error: new Error(\n \"Alchemy AA with session/adapter owner requires ALCHEMY_API_KEY.\",\n ),\n };\n }\n\n try {\n const { createAlchemySmartAccount } = await import(\"@getpara/aa-alchemy\");\n const smartAccount = await createAlchemySmartAccount({\n ...ownerParams.ownerParams,\n apiKey: options.apiKey,\n gasPolicyId,\n chain,\n rpcUrl: options.rpcUrl,\n mode: execution!.mode,\n });\n\n if (!smartAccount) {\n return {\n resolved: execution,\n account: null,\n pending: false,\n error: new Error(\"Alchemy AA account could not be initialized.\"),\n };\n }\n\n return {\n resolved: execution,\n account: adaptSmartAccount(smartAccount),\n pending: false,\n error: null,\n };\n } catch (error) {\n return {\n resolved: execution,\n account: null,\n pending: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Alchemy Wallet APIs — 4337 (bundled UserOperation via @alchemy/wallet-apis)\n// ---------------------------------------------------------------------------\n// Alchemy's bundler enforces full signature validation during\n// eth_estimateUserOperationGas, making client-side userOp construction\n// impossible (chicken-and-egg: can't sign without gas values, can't\n// estimate without valid signature). The wallet_prepareCalls RPC\n// handles estimation + paymaster + signing server-side.\n\nasync function createAlchemy4337State(\n params: AlchemyDirectOwnerParams,\n): Promise<AAState> {\n const { createSmartWalletClient, alchemyWalletTransport } = await import(\n \"@alchemy/wallet-apis\"\n );\n\n const transport = params.proxyBaseUrl\n ? alchemyWalletTransport({ url: params.proxyBaseUrl })\n : alchemyWalletTransport({ apiKey: params.apiKey! });\n\n const signer = privateKeyToAccount(params.privateKey);\n const alchemyClient = createSmartWalletClient({\n transport,\n chain: params.chain,\n signer,\n ...(params.gasPolicyId ? { paymaster: { policyId: params.gasPolicyId } } : {}),\n });\n\n const signerAddress = signer.address as Hex;\n const accountId = deriveAlchemy4337AccountId(signerAddress);\n aaDebug(\"4337:requestAccount:start\", {\n signerAddress,\n chainId: params.chain.id,\n accountId,\n hasGasPolicyId: Boolean(params.gasPolicyId),\n });\n\n let account;\n try {\n account = await alchemyClient.requestAccount({\n signerAddress,\n id: accountId,\n creationHint: {\n accountType: \"sma-b\",\n createAdditional: true,\n },\n });\n } catch (error) {\n const existingAccountAddress = extractExistingAccountAddress(error);\n if (!existingAccountAddress) {\n throw error;\n }\n aaDebug(\"4337:requestAccount:existing-account\", {\n existingAccountAddress,\n });\n account = await alchemyClient.requestAccount({\n accountAddress: existingAccountAddress,\n });\n }\n const accountAddress = account.address as Hex;\n aaDebug(\"4337:requestAccount:done\", { signerAddress, accountAddress });\n\n const sendCalls = async (\n calls: Array<{ to: Hex; value: bigint; data?: Hex }>,\n ): Promise<{ transactionHash: string }> => {\n aaDebug(\"4337:sendCalls:start\", {\n signerAddress,\n accountAddress,\n chainId: params.chain.id,\n callCount: calls.length,\n hasGasPolicyId: Boolean(params.gasPolicyId),\n });\n try {\n const result = await alchemyClient.sendCalls({\n account: accountAddress,\n calls,\n });\n aaDebug(\"4337:sendCalls:submitted\", { callId: result.id });\n\n const status = await alchemyClient.waitForCallsStatus({ id: result.id });\n const transactionHash = status.receipts?.[0]?.transactionHash;\n aaDebug(\"4337:sendCalls:receipt\", {\n callId: result.id,\n hasTransactionHash: Boolean(transactionHash),\n receipts: status.receipts?.length ?? 0,\n });\n if (!transactionHash) {\n throw new Error(\"Alchemy Wallets API did not return a transaction hash.\");\n }\n return { transactionHash };\n } catch (error) {\n aaDebug(\"4337:sendCalls:error\", {\n signerAddress,\n accountAddress,\n chainId: params.chain.id,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n };\n\n const smartAccount: SmartAccount = {\n provider: \"alchemy\",\n mode: \"4337\",\n AAAddress: accountAddress,\n sendTransaction: async (call) => sendCalls([call]),\n sendBatchTransaction: async (calls) => sendCalls(calls),\n };\n\n return {\n resolved: params.resolved,\n account: smartAccount,\n pending: false,\n error: null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Raw EIP-7702 (native type-4 transaction via viem)\n// ---------------------------------------------------------------------------\n\nasync function createAlchemy7702State(\n params: AlchemyDirectOwnerParams,\n): Promise<AAState> {\n const { createWalletClient, createPublicClient, http } = await import(\"viem\");\n const { encodeExecuteData } = await import(\n \"viem/experimental/erc7821\"\n );\n\n if (params.gasPolicyId) {\n aaDebug(\n \"7702:gas-policy-ignored\",\n { gasPolicyId: params.gasPolicyId },\n );\n console.warn(\n \"⚠️ Gas policy is not supported for raw EIP-7702 transactions. \" +\n \"The signer's EOA pays gas directly.\",\n );\n }\n\n const signer = privateKeyToAccount(params.privateKey);\n const signerAddress = signer.address as Hex;\n\n // Build RPC URL: prefer proxyBaseUrl, then Alchemy BYOK, then fallback.\n let rpcUrl: string | undefined;\n if (params.proxyBaseUrl) {\n rpcUrl = params.proxyBaseUrl;\n } else if (params.apiKey) {\n rpcUrl = alchemyRpcUrl(params.chain.id, params.apiKey);\n }\n\n const walletClient = createWalletClient({\n account: signer,\n chain: params.chain,\n transport: http(rpcUrl),\n });\n\n const publicClient = createPublicClient({\n chain: params.chain,\n transport: http(rpcUrl),\n });\n\n const send7702 = async (\n calls: Array<{ to: Hex; value: bigint; data?: Hex }>,\n ): Promise<{ transactionHash: string }> => {\n aaDebug(\"7702:send:start\", {\n signerAddress,\n chainId: params.chain.id,\n callCount: calls.length,\n calls: calls.map((call) => ({\n to: call.to,\n value: call.value.toString(),\n data: call.data ?? \"0x\",\n })),\n });\n\n const authorization = await walletClient.signAuthorization({\n contractAddress: ALCHEMY_7702_DELEGATION_ADDRESS,\n });\n aaDebug(\"7702:authorization-signed\", {\n contractAddress: ALCHEMY_7702_DELEGATION_ADDRESS,\n });\n\n const data = encodeExecuteData({\n calls: calls.map((call) => ({\n to: call.to,\n value: call.value,\n data: call.data ?? (\"0x\" as Hex),\n })),\n });\n aaDebug(\"7702:calldata-encoded\", { dataLength: data.length });\n\n // viem's estimateGas doesn't include EIP-7702 authorization intrinsic cost\n const gasEstimate = await publicClient.estimateGas({\n account: signer,\n to: signerAddress,\n data,\n authorizationList: [authorization],\n });\n const gas = gasEstimate + EIP_7702_AUTH_GAS_OVERHEAD;\n aaDebug(\"7702:gas-estimated\", {\n estimate: gasEstimate.toString(),\n total: gas.toString(),\n });\n\n const hash = await walletClient.sendTransaction({\n to: signerAddress,\n data,\n gas,\n authorizationList: [authorization],\n });\n aaDebug(\"7702:tx-sent\", { hash });\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n aaDebug(\"7702:tx-confirmed\", {\n hash,\n status: receipt.status,\n gasUsed: receipt.gasUsed.toString(),\n });\n\n if (receipt.status === \"reverted\") {\n throw new Error(`EIP-7702 transaction reverted: ${hash}`);\n }\n\n return { transactionHash: hash };\n };\n\n const smartAccount: SmartAccount = {\n provider: \"alchemy\",\n mode: \"7702\",\n AAAddress: signerAddress,\n delegationAddress: ALCHEMY_7702_DELEGATION_ADDRESS,\n sendTransaction: async (call) => send7702([call]),\n sendBatchTransaction: async (calls) => send7702(calls),\n };\n\n return {\n resolved: params.resolved,\n account: smartAccount,\n pending: false,\n error: null,\n };\n}\n\n","import type { Hex, TransactionReceipt } from \"viem\";\n\nimport type {\n AAMode,\n AACallPayload,\n SmartAccount,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Smart Account Shape (from @getpara/aa-* SDKs)\n// ---------------------------------------------------------------------------\n\ntype SdkSmartAccount = {\n provider: string;\n mode: AAMode;\n smartAccountAddress: Hex;\n delegationAddress?: Hex;\n sendTransaction: (\n call: AACallPayload,\n options?: unknown,\n ) => Promise<TransactionReceipt>;\n sendBatchTransaction: (\n calls: AACallPayload[],\n options?: unknown,\n ) => Promise<TransactionReceipt>;\n};\n\n// ---------------------------------------------------------------------------\n// Smart Account Adapter\n// ---------------------------------------------------------------------------\n\n/**\n * Bridges the provider SDK smart-account shape into the library's\n * SmartAccount interface:\n * - Maps `smartAccountAddress` → `AAAddress`\n * - Unwraps `TransactionReceipt` → `{ transactionHash }`\n */\nexport function adaptSmartAccount(account: SdkSmartAccount): SmartAccount {\n // In 7702 mode the smart-account address IS the user's EOA. If the SDK\n // returns the EOA as the delegation address it's a known bug — the real\n // delegation target should be the implementation contract (e.g. Alchemy's\n // SemiModularAccount7702), not the EOA itself. Drop the bogus value so\n // callers don't display a misleading \"Deleg: <own-address>\".\n const delegationAddress =\n account.mode === \"7702\" &&\n account.delegationAddress &&\n account.smartAccountAddress &&\n account.delegationAddress.toLowerCase() ===\n account.smartAccountAddress.toLowerCase()\n ? undefined\n : account.delegationAddress;\n\n return {\n provider: account.provider,\n mode: account.mode,\n AAAddress: account.smartAccountAddress,\n delegationAddress,\n sendTransaction: async (call) => {\n const receipt = await account.sendTransaction(call);\n return { transactionHash: receipt.transactionHash };\n },\n sendBatchTransaction: async (calls) => {\n const receipt = await account.sendBatchTransaction(calls);\n return { transactionHash: receipt.transactionHash };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Error Classification\n// ---------------------------------------------------------------------------\n\n/**\n * Detects Alchemy gas sponsorship quota errors.\n */\nexport function isAlchemySponsorshipLimitError(error: unknown): boolean {\n const message =\n error instanceof Error ? error.message : String(error ?? \"\");\n const normalized = message.toLowerCase();\n return (\n normalized.includes(\"gas sponsorship limit\") ||\n normalized.includes(\"put your team over your gas sponsorship limit\") ||\n normalized.includes(\"buy gas credits in your gas manager dashboard\")\n );\n}\n","import type { Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nimport type { AAState, AAProvider } from \"./types\";\n\nexport type AAOwner =\n | {\n kind: \"direct\";\n privateKey: `0x${string}`;\n }\n | {\n kind: \"session\";\n // Future adapters such as Privy can be added later. Only \"para\" is\n // implemented today.\n adapter: string;\n session: unknown;\n signer?: unknown;\n address?: Hex;\n };\n\ntype DirectOwner = Extract<AAOwner, { kind: \"direct\" }>;\ntype SessionOwner = Extract<AAOwner, { kind: \"session\" }>;\n\ntype SDKOwnerParams =\n | {\n para: never;\n signer: ReturnType<typeof privateKeyToAccount>;\n }\n | {\n para: never;\n signer: never;\n address?: Hex;\n }\n | {\n para: never;\n address?: Hex;\n };\n\ntype ResolvedOwnerParams =\n | { kind: \"ready\"; ownerParams: SDKOwnerParams }\n | { kind: \"missing\" }\n | { kind: \"unsupported_adapter\"; adapter: string };\n\nfunction getDirectOwnerParams(owner: DirectOwner): ResolvedOwnerParams {\n return {\n kind: \"ready\",\n ownerParams: {\n para: undefined as never,\n signer: privateKeyToAccount(owner.privateKey),\n },\n };\n}\n\nfunction getParaSessionOwnerParams(owner: SessionOwner): ResolvedOwnerParams {\n if (owner.signer) {\n return {\n kind: \"ready\",\n ownerParams: {\n para: owner.session as never,\n signer: owner.signer as never,\n ...(owner.address ? { address: owner.address } : {}),\n },\n };\n }\n\n return {\n kind: \"ready\",\n ownerParams: {\n para: owner.session as never,\n ...(owner.address ? { address: owner.address } : {}),\n },\n };\n}\n\nfunction getSessionOwnerParams(owner: SessionOwner): ResolvedOwnerParams {\n switch (owner.adapter) {\n case \"para\":\n return getParaSessionOwnerParams(owner);\n default:\n return { kind: \"unsupported_adapter\", adapter: owner.adapter };\n }\n}\n\nexport function getOwnerParams(\n owner: AAOwner | undefined,\n): ResolvedOwnerParams {\n if (!owner) {\n return { kind: \"missing\" };\n }\n\n switch (owner.kind) {\n case \"direct\":\n return getDirectOwnerParams(owner);\n case \"session\":\n return getSessionOwnerParams(owner);\n }\n}\n\nexport function getMissingOwnerState(\n resolved: AAState[\"resolved\"],\n provider: AAProvider,\n): AAState {\n return {\n resolved,\n account: null,\n pending: false,\n error: new Error(\n `${provider} AA account creation requires a direct owner or a supported session owner.`,\n ),\n };\n}\n\nexport function getUnsupportedAdapterState(\n resolved: AAState[\"resolved\"],\n adapter: string,\n): AAState {\n return {\n resolved,\n account: null,\n pending: false,\n error: new Error(`Session adapter \"${adapter}\" is not implemented.`),\n };\n}\n","import type { Chain } from \"viem\";\n\nimport type {\n AAConfig,\n AAResolvedConfig,\n AAMode,\n AAWalletCall,\n} from \"../types\";\nimport {\n DEFAULT_AA_CONFIG,\n buildAAExecutionPlan,\n getAAChainConfig,\n} from \"../types\";\n\nexport interface PimlicoResolveOptions {\n calls: AAWalletCall[] | null;\n localPrivateKey?: `0x${string}` | null;\n accountAbstractionConfig?: AAConfig;\n chainsById: Record<number, Chain>;\n rpcUrl?: string;\n modeOverride?: AAMode;\n publicOnly?: boolean;\n throwOnMissingConfig?: boolean;\n apiKey?: string;\n}\n\nexport interface PimlicoResolvedConfig extends AAResolvedConfig {\n apiKey: string;\n chain: Chain;\n rpcUrl?: string;\n}\n\nexport function resolvePimlicoConfig(\n options: PimlicoResolveOptions,\n): PimlicoResolvedConfig | null {\n const {\n calls,\n localPrivateKey,\n accountAbstractionConfig = DEFAULT_AA_CONFIG,\n chainsById,\n rpcUrl,\n modeOverride,\n publicOnly = false,\n throwOnMissingConfig = false,\n apiKey: preResolvedApiKey,\n } = options;\n\n if (!calls || localPrivateKey) {\n return null;\n }\n\n const config: AAConfig = {\n ...accountAbstractionConfig,\n provider: \"pimlico\",\n };\n\n const chainConfig = getAAChainConfig(config, calls, chainsById);\n if (!chainConfig) {\n if (throwOnMissingConfig) {\n const chainIds = Array.from(new Set(calls.map((c) => c.chainId)));\n throw new Error(\n `AA is not configured for chain ${chainIds[0]}, or batching is disabled for that chain.`,\n );\n }\n return null;\n }\n\n const apiKey = preResolvedApiKey ?? process.env.PIMLICO_API_KEY?.trim() ?? (publicOnly ? process.env.NEXT_PUBLIC_PIMLICO_API_KEY?.trim() : undefined);\n if (!apiKey) {\n if (throwOnMissingConfig) {\n throw new Error(\"Pimlico AA requires PIMLICO_API_KEY.\");\n }\n return null;\n }\n\n const chain = chainsById[chainConfig.chainId];\n if (!chain) {\n return null;\n }\n\n if (modeOverride && !chainConfig.supportedModes.includes(modeOverride)) {\n if (throwOnMissingConfig) {\n throw new Error(\n `AA mode \"${modeOverride}\" is not supported on chain ${chainConfig.chainId}.`,\n );\n }\n return null;\n }\n\n const resolvedChainConfig = modeOverride\n ? { ...chainConfig, defaultMode: modeOverride }\n : chainConfig;\n\n const resolved = buildAAExecutionPlan(config, resolvedChainConfig);\n\n return {\n ...resolved,\n apiKey,\n chain,\n rpcUrl,\n mode: resolvedChainConfig.defaultMode,\n };\n}\n","import type { Chain } from \"viem\";\n\nimport type {\n AAConfig,\n AAMode,\n AAState,\n SmartAccount,\n AAWalletCall,\n} from \"../types\";\nimport { DEFAULT_AA_CONFIG } from \"../types\";\nimport { resolvePimlicoConfig } from \"./resolve\";\n\nexport interface PimlicoHookParams {\n enabled: boolean;\n apiKey: string;\n chain: Chain;\n mode: AAMode;\n rpcUrl?: string;\n}\n\ntype PimlicoHookState<TAccount extends SmartAccount = SmartAccount> = {\n account?: TAccount | null;\n pending?: boolean;\n error?: Error | null;\n};\n\nexport type UsePimlicoAAHook<TAccount extends SmartAccount = SmartAccount> = (\n params?: PimlicoHookParams,\n) => PimlicoHookState<TAccount>;\n\nexport interface CreatePimlicoAAProviderOptions<\n TAccount extends SmartAccount = SmartAccount,\n> {\n accountAbstractionConfig?: AAConfig;\n usePimlicoAA: UsePimlicoAAHook<TAccount>;\n chainsById: Record<number, Chain>;\n apiKeyEnvVar?: string;\n rpcUrl?: string;\n}\n\nexport function createPimlicoAAProvider<\n TAccount extends SmartAccount = SmartAccount,\n>({\n accountAbstractionConfig = DEFAULT_AA_CONFIG,\n usePimlicoAA,\n chainsById,\n rpcUrl,\n}: CreatePimlicoAAProviderOptions<TAccount>) {\n return function usePimlicoAAProvider(\n calls: AAWalletCall[] | null,\n localPrivateKey: `0x${string}` | null,\n ): AAState<TAccount> {\n const resolved = resolvePimlicoConfig({\n calls,\n localPrivateKey,\n accountAbstractionConfig,\n chainsById,\n rpcUrl,\n publicOnly: true,\n });\n\n const params = resolved\n ? ({\n enabled: true,\n apiKey: resolved.apiKey,\n chain: resolved.chain,\n mode: resolved.mode,\n rpcUrl: resolved.rpcUrl,\n } satisfies PimlicoHookParams)\n : undefined;\n\n const query = usePimlicoAA(params);\n\n return {\n resolved: resolved ?? null,\n account: query.account,\n pending: Boolean(resolved && query.pending),\n error: query.error ?? null,\n };\n };\n}\n","import type { Chain, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nimport { adaptSmartAccount } from \"../adapt\";\nimport type { AAState, SmartAccount, AAMode, AAWalletCall } from \"../types\";\nimport {\n DEFAULT_AA_CONFIG,\n getAAChainConfig,\n buildAAExecutionPlan,\n} from \"../types\";\nimport {\n getMissingOwnerState,\n getOwnerParams,\n getUnsupportedAdapterState,\n type AAOwner,\n} from \"../owner\";\n\nconst AA_DEBUG_ENABLED = process.env.AOMI_AA_DEBUG === \"1\";\n\nfunction pimDebug(message: string, fields?: Record<string, unknown>): void {\n if (!AA_DEBUG_ENABLED) return;\n if (fields) {\n console.debug(`[aomi][aa][pimlico] ${message}`, fields);\n return;\n }\n console.debug(`[aomi][aa][pimlico] ${message}`);\n}\n\nexport interface CreatePimlicoAAStateOptions {\n chain: Chain;\n owner: AAOwner;\n rpcUrl: string;\n callList: AAWalletCall[];\n mode?: AAMode;\n apiKey?: string;\n}\n\nexport async function createPimlicoAAState(\n options: CreatePimlicoAAStateOptions,\n): Promise<AAState> {\n const { chain, owner, callList, mode } = options;\n\n const chainConfig = getAAChainConfig(DEFAULT_AA_CONFIG, callList, {\n [chain.id]: chain,\n });\n if (!chainConfig) {\n throw new Error(`AA is not configured for chain ${chain.id}.`);\n }\n\n const effectiveMode = mode ?? chainConfig.defaultMode;\n const plan = buildAAExecutionPlan(\n { ...DEFAULT_AA_CONFIG, provider: \"pimlico\" },\n { ...chainConfig, defaultMode: effectiveMode },\n );\n\n const apiKey = options.apiKey ?? process.env.PIMLICO_API_KEY?.trim();\n if (!apiKey) {\n throw new Error(\"Pimlico AA requires PIMLICO_API_KEY.\");\n }\n\n const execution = {\n ...plan,\n mode: effectiveMode,\n fallbackToEoa: false,\n } as AAState[\"resolved\"];\n\n const ownerParams = getOwnerParams(owner);\n if (ownerParams.kind === \"missing\") {\n return getMissingOwnerState(execution, \"pimlico\");\n }\n if (ownerParams.kind === \"unsupported_adapter\") {\n return getUnsupportedAdapterState(execution, ownerParams.adapter);\n }\n\n // Direct owner path — build pimlico client from permissionless directly\n if (owner.kind === \"direct\") {\n try {\n return await createPimlicoDirectState({\n resolved: execution!,\n chain,\n privateKey: owner.privateKey,\n rpcUrl: options.rpcUrl,\n apiKey,\n mode: effectiveMode,\n });\n } catch (error) {\n return {\n resolved: execution,\n account: null,\n pending: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n // Session/adapter path — use @getpara/aa-pimlico SDK\n try {\n const { createPimlicoSmartAccount } = await import(\"@getpara/aa-pimlico\");\n const smartAccount = await createPimlicoSmartAccount({\n ...ownerParams.ownerParams,\n apiKey,\n chain,\n rpcUrl: options.rpcUrl,\n mode: execution!.mode,\n });\n\n if (!smartAccount) {\n return {\n resolved: execution,\n account: null,\n pending: false,\n error: new Error(\"Pimlico AA account could not be initialized.\"),\n };\n }\n\n return {\n resolved: execution,\n account: adaptSmartAccount(smartAccount),\n pending: false,\n error: null,\n };\n } catch (error) {\n return {\n resolved: execution,\n account: null,\n pending: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pimlico direct-owner path (permissionless + viem, no Para SDK)\n// ---------------------------------------------------------------------------\n\nfunction buildPimlicoRpcUrl(chain: Chain, apiKey: string): string {\n const slug = chain.name.toLowerCase().replace(/\\s+/g, \"-\");\n return `https://api.pimlico.io/v2/${slug}/rpc?apikey=${apiKey}`;\n}\n\nasync function createPimlicoDirectState(params: {\n resolved: NonNullable<AAState[\"resolved\"]>;\n chain: Chain;\n privateKey: `0x${string}`;\n rpcUrl: string;\n apiKey: string;\n mode: AAMode;\n}): Promise<AAState> {\n const { createSmartAccountClient } = await import(\"permissionless\");\n const { toSimpleSmartAccount } = await import(\"permissionless/accounts\");\n const { createPimlicoClient } = await import(\"permissionless/clients/pimlico\");\n const { createPublicClient, http } = await import(\"viem\");\n const { entryPoint07Address } = await import(\"viem/account-abstraction\");\n\n const signer = privateKeyToAccount(params.privateKey);\n const signerAddress = signer.address as Hex;\n const pimlicoRpcUrl = buildPimlicoRpcUrl(params.chain, params.apiKey);\n\n pimDebug(\"4337:start\", {\n signerAddress,\n chainId: params.chain.id,\n pimlicoRpcUrl: pimlicoRpcUrl.replace(params.apiKey, \"***\"),\n });\n\n const publicClient = createPublicClient({\n chain: params.chain,\n transport: http(params.rpcUrl),\n });\n\n const paymasterClient = createPimlicoClient({\n entryPoint: { address: entryPoint07Address, version: \"0.7\" },\n transport: http(pimlicoRpcUrl),\n });\n\n const smartAccount = await toSimpleSmartAccount({\n client: publicClient,\n owner: signer,\n entryPoint: { address: entryPoint07Address, version: \"0.7\" },\n });\n\n const accountAddress = smartAccount.address;\n pimDebug(\"4337:account-created\", {\n signerAddress,\n accountAddress,\n });\n\n const smartAccountClient = createSmartAccountClient({\n account: smartAccount,\n chain: params.chain,\n paymaster: paymasterClient,\n bundlerTransport: http(pimlicoRpcUrl),\n userOperation: {\n estimateFeesPerGas: async () => {\n const gasPrice = await paymasterClient.getUserOperationGasPrice();\n return (gasPrice as { fast: { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint } }).fast;\n },\n },\n });\n\n const sendCalls = async (\n calls: Array<{ to: Hex; value: bigint; data?: Hex }>,\n ): Promise<{ transactionHash: string }> => {\n pimDebug(\"4337:send:start\", {\n accountAddress,\n chainId: params.chain.id,\n callCount: calls.length,\n });\n\n const hash = await smartAccountClient.sendTransaction({\n account: smartAccount,\n calls: calls.map((c) => ({\n to: c.to,\n value: c.value,\n data: c.data ?? (\"0x\" as Hex),\n })),\n } as Parameters<typeof smartAccountClient.sendTransaction>[0]);\n\n pimDebug(\"4337:send:userOpHash\", { hash });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash,\n });\n pimDebug(\"4337:send:confirmed\", {\n transactionHash: receipt.transactionHash,\n status: receipt.status,\n });\n\n return { transactionHash: receipt.transactionHash };\n };\n\n const account: SmartAccount = {\n provider: \"pimlico\",\n mode: \"4337\",\n AAAddress: accountAddress,\n sendTransaction: async (call) => sendCalls([call]),\n sendBatchTransaction: async (calls) => sendCalls(calls),\n };\n\n return {\n resolved: params.resolved,\n account,\n pending: false,\n error: null,\n };\n}\n","import type { Chain } from \"viem\";\n\nimport type { AAProvider } from \"./types\";\nimport { createAlchemyAAState } from \"./alchemy/create\";\nimport { createPimlicoAAState } from \"./pimlico/create\";\nimport type { AAOwner } from \"./owner\";\nimport type { AAMode, AAState, AAWalletCall } from \"./types\";\n\nexport type { AAOwner } from \"./owner\";\n\nexport interface CreateAAStateOptions {\n provider: AAProvider;\n chain: Chain;\n owner: AAOwner;\n rpcUrl: string;\n callList: AAWalletCall[];\n mode?: AAMode;\n apiKey?: string;\n gasPolicyId?: string;\n sponsored?: boolean;\n /** Backend proxy base URL for Alchemy. Used when apiKey is omitted. */\n proxyBaseUrl?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Unified Creator\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an AA state by instantiating the appropriate smart account via\n * `@getpara/aa-alchemy` or `@getpara/aa-pimlico`.\n */\nexport async function createAAProviderState(\n options: CreateAAStateOptions,\n): Promise<AAState> {\n if (options.provider === \"alchemy\") {\n return createAlchemyAAState({\n chain: options.chain,\n owner: options.owner,\n rpcUrl: options.rpcUrl,\n callList: options.callList,\n mode: options.mode,\n apiKey: options.apiKey,\n gasPolicyId: options.gasPolicyId,\n sponsored: options.sponsored,\n proxyBaseUrl: options.proxyBaseUrl,\n });\n }\n\n return createPimlicoAAState({\n chain: options.chain,\n owner: options.owner,\n rpcUrl: options.rpcUrl,\n callList: options.callList,\n mode: options.mode,\n apiKey: options.apiKey,\n });\n}\n"],"mappings":"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","names":["_a","privateKeyToAccount","privateKeyToAccount","privateKeyToAccount","privateKeyToAccount","AA_DEBUG_ENABLED","privateKeyToAccount"]}
|