seacloud-sdk 0.12.0 → 0.12.2

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/types.ts","../src/core/config.ts","../src/core/version.ts","../src/core/client.ts","../src/core/global-config.ts","../src/api/llm_chat_completions.ts","../src/api/agent_chat_completions.ts","../src/api/app_search.ts","../src/api/scan.ts","../src/cli.ts"],"names":["__filename"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * SeaCloud SDK 核心类型定义\n */\n\n/**\n * SDK 配置选项\n */\nexport interface SeacloudConfig {\n /** API Service Token - 从环境变量 API_SERVICE_TOKEN 读取或直接传入 */\n apiKey?: string;\n /** 代理服务器基础 URL,默认为 http://localhost:8080 */\n baseUrl?: string;\n /** 自定义 fetch 实现(可选,用于 Node.js < 18 或测试) */\n fetch?: typeof fetch;\n /** 请求超时时间(毫秒),默认 30000 */\n timeout?: number;\n /** X-Project header 值,用于 Agent API 访问标识,默认为 'SeaVerse' */\n xProject?: string;\n}\n\n/**\n * 任务状态\n */\nexport type TaskStatus = 'pending' | 'processing' | 'in_progress' | 'completed' | 'failed';\n\n/**\n * 任务错误信息\n */\nexport interface TaskError {\n code: string;\n message: string;\n details?: any;\n}\n\n/**\n * 任务结果\n */\nexport interface TaskResult {\n /** 任务 ID */\n id: string;\n /** 创建时间戳 */\n created_at: number;\n /** 任务状态 */\n status: TaskStatus;\n /** 错误信息(如果失败) */\n error?: TaskError | null;\n /** 模型名称 */\n model: string;\n /** 输出结果 */\n output?: Array<{\n content?: Array<{\n type?: string;\n url?: string;\n size?: number;\n jobId?: string;\n [key: string]: any;\n }>;\n [key: string]: any;\n }>;\n /** 其他字段 */\n [key: string]: any;\n}\n\n/**\n * 任务轮询选项\n */\nexport interface PollingOptions {\n /** 轮询间隔(毫秒),默认 3000 */\n intervalMs?: number;\n /** 最大尝试次数,默认 120 */\n maxAttempts?: number;\n /** 进度回调函数 */\n onProgress?: (attempt: number, status: TaskStatus) => void;\n}\n\n/**\n * HTTP 响应错误\n */\nexport class SeacloudError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public response?: any,\n ) {\n super(message);\n this.name = 'SeacloudError';\n }\n}\n","import type { SeacloudConfig } from './types.js';\n\n/**\n * 检测当前是否在 iframe 中\n */\nfunction isInIframe(): boolean {\n try {\n return typeof (globalThis as any).window !== 'undefined' &&\n (globalThis as any).window.self !== (globalThis as any).window.top;\n } catch (e) {\n // 如果访问 window.top 抛出异常,说明在跨域 iframe 中\n return true;\n }\n}\n\n/**\n * 通过 PostMessage 从父页面获取 token\n *\n * 此函数允许接收来自任何源的 PostMessage 消息,便于跨域 iframe 集成。\n * 使用 seaverse 协议与父页面通信:\n * - 发送: { type: 'seaverse:get_token' }\n * - 接收: { type: 'seaverse:token', payload: { accessToken: string, expiresIn: number } }\n * - 错误: { type: 'seaverse:error', error: string }\n *\n * @param timeout 超时时间(毫秒),默认 5000ms\n * @returns token 或 null\n */\nasync function getTokenFromParent(timeout: number = 5000): Promise<string | null> {\n if (!isInIframe()) {\n return null;\n }\n\n return new Promise((resolve) => {\n const messageHandler = (event: MessageEvent) => {\n // 验证消息格式\n if (event.data && event.data.type === 'seaverse:token') {\n cleanup();\n // 从 payload.accessToken 中获取 token\n const token = event.data.payload?.accessToken;\n resolve(token || null);\n } else if (event.data && event.data.type === 'seaverse:error') {\n // 处理错误响应\n cleanup();\n console.warn('[SeaCloud SDK] Error getting token from parent:', event.data.error);\n resolve(null);\n }\n };\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve(null);\n }, timeout);\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n (globalThis as any).window.removeEventListener('message', messageHandler);\n };\n\n // 监听父页面的响应(不限制来源)\n (globalThis as any).window.addEventListener('message', messageHandler);\n\n // 向父页面发送请求(允许任何源接收)\n try {\n (globalThis as any).window.parent.postMessage(\n { type: 'seaverse:get_token' },\n '*' // 允许任何源,支持跨域场景\n );\n } catch (e) {\n cleanup();\n resolve(null);\n }\n });\n}\n\n/**\n * 通过 PostMessage 从父页面获取 Host\n *\n * 此函数允许接收来自任何源的 PostMessage 消息,便于跨域 iframe 集成。\n * 使用 seaverse 协议与父页面通信:\n * - 发送: { type: 'seaverse:get_host' }\n * - 接收: { type: 'seaverse:host', payload: { host: string } }\n * - 错误: { type: 'seaverse:error', error: string }\n *\n * @param timeout 超时时间(毫秒),默认 5000ms\n * @returns host (如 window.location.origin) 或 null\n */\nexport async function getHostFromParent(timeout: number = 5000): Promise<string | null> {\n if (!isInIframe()) {\n return null;\n }\n\n return new Promise((resolve) => {\n const messageHandler = (event: MessageEvent) => {\n // 验证消息格式\n if (event.data && event.data.type === 'seaverse:host') {\n cleanup();\n // 从 payload.host 中获取 host\n const host = event.data.payload?.host;\n resolve(host || null);\n } else if (event.data && event.data.type === 'seaverse:error') {\n // 处理错误响应\n cleanup();\n console.warn('[SeaCloud SDK] Error getting host from parent:', event.data.error);\n resolve(null);\n }\n };\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve(null);\n }, timeout);\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n (globalThis as any).window.removeEventListener('message', messageHandler);\n };\n\n // 监听父页面的响应(不限制来源)\n (globalThis as any).window.addEventListener('message', messageHandler);\n\n // 向父页面发送请求(允许任何源接收)\n try {\n (globalThis as any).window.parent.postMessage(\n { type: 'seaverse:get_host' },\n '*' // 允许任何源,支持跨域场景\n );\n } catch (e) {\n cleanup();\n resolve(null);\n }\n });\n}\n\n/**\n * 动态获取 API Token\n * 优先级:\n * 1. 传入的 apiKey\n * 2. localStorage auth_token (浏览器环境)\n * 3. 环境变量 API_SERVICE_TOKEN (Node.js 环境)\n * 4. 通过 PostMessage 从父页面获取 (iframe 环境)\n * 5. 没有找到 → 抛出错误\n *\n * @param providedApiKey 用户提供的 apiKey(可选)\n * @returns API Token\n */\nexport async function getApiToken(providedApiKey?: string): Promise<string | undefined> {\n // 1. 如果提供了 apiKey,直接使用\n if (providedApiKey) {\n return providedApiKey;\n }\n\n // 2. 尝试从 localStorage 获取 (浏览器环境)\n if (typeof (globalThis as any).window !== 'undefined' && typeof (globalThis as any).localStorage !== 'undefined') {\n try {\n const localStorageToken = (globalThis as any).localStorage.getItem('auth_token');\n if (localStorageToken) {\n return localStorageToken;\n }\n } catch (e) {\n // localStorage might be blocked or unavailable\n }\n }\n\n // 3. 尝试从环境变量获取 (Node.js 环境)\n if (typeof process !== 'undefined' && process.env?.API_SERVICE_TOKEN) {\n return process.env.API_SERVICE_TOKEN;\n }\n\n // 4. 如果在 iframe 中,尝试通过 PostMessage 从父页面获取\n if (typeof (globalThis as any).window !== 'undefined') {\n const parentToken = await getTokenFromParent();\n if (parentToken) {\n return parentToken;\n }\n }\n\n // 5. 返回'',让调用方处理\n return '';\n\n // // 5. 没有找到任何 token,抛出错误\n // throw new Error(\n // 'SeaCloud SDK: No API token found. ' +\n // 'Please ensure token is available in localStorage.getItem(\"auth_token\") (browser) ' +\n // 'or process.env.API_SERVICE_TOKEN (Node.js), ' +\n // 'or initialize with initSeacloud({ apiKey: \"your-token\" }).'\n // );\n}\n\n/**\n * 创建 SDK 配置\n * @param options 配置选项\n * @returns 完整的配置对象\n */\nexport function createConfig(options: SeacloudConfig = {}): Required<SeacloudConfig> {\n // apiKey 允许为 undefined,在实际请求时才异步获取\n const apiKey = options.apiKey;\n\n // 使用环境变量或传入的 baseUrl\n const baseUrl = options.baseUrl ||\n (typeof process !== 'undefined' ? process.env?.SEACLOUD_BASE_URL : undefined) ||\n 'https://proxy-rs.seaverse.ai';\n\n // 使用全局 fetch 或自定义实现\n // 在浏览器环境中,fetch 需要绑定到 globalThis 以避免 \"Illegal invocation\" 错误\n const fetchImpl = options.fetch || (globalThis.fetch ? globalThis.fetch.bind(globalThis) : undefined);\n\n if (!fetchImpl) {\n throw new Error('fetch is not available. Please provide a fetch implementation in config or upgrade to Node.js 18+');\n }\n\n return {\n apiKey: apiKey || '', // 提供默认空字符串,实际请求时会动态获取\n baseUrl,\n fetch: fetchImpl,\n timeout: options.timeout || 30000,\n xProject: options.xProject || 'SeaVerse',\n };\n}\n\n/**\n * 验证配置\n * @param config 配置对象\n * @throws 如果配置无效\n */\nexport function validateConfig(config: Required<SeacloudConfig>): void {\n // 移除 API key 验证,允许空 key 传递给后端处理\n\n if (!config.baseUrl) {\n throw new Error('baseUrl is required');\n }\n\n if (typeof config.fetch !== 'function') {\n throw new Error('fetch must be a function');\n }\n}\n","/**\n * SDK 版本号\n * 此文件在构建时自动生成或手动更新\n */\nexport const VERSION = '0.9.6';\n","import type { SeacloudConfig, TaskResult } from './types.js';\nimport { SeacloudError } from './types.js';\nimport { createConfig, validateConfig, getApiToken } from './config.js';\nimport { VERSION } from './version.js';\n\n/**\n * SeaCloud HTTP 客户端\n * 用于创建任务和查询任务状态\n */\nexport class SeacloudClient {\n private config: Required<SeacloudConfig>;\n private providedApiKey?: string; // 保存用户提供的 apiKey\n\n constructor(config: SeacloudConfig = {}) {\n this.config = createConfig(config);\n this.providedApiKey = config.apiKey; // 保存用户提供的 apiKey(如果有)\n validateConfig(this.config);\n\n // 检测是否为浏览器环境\n const isBrowser = typeof (globalThis as any).window !== 'undefined' &&\n typeof (globalThis as any).localStorage !== 'undefined';\n\n // 仅在浏览器环境打印调试信息\n if (isBrowser) {\n console.log('[SeaCloud SDK] Client initialized', {\n version: VERSION,\n environment: 'browser',\n tokenSource: 'localStorage.auth_token',\n baseUrl: this.config.baseUrl,\n timeout: this.config.timeout,\n hasCustomApiKey: !!this.providedApiKey,\n });\n }\n }\n\n /**\n * 创建一个新任务\n * @param endpoint API 端点路径(例如:/model/tasks)\n * @param body 请求体\n * @returns 任务结果\n */\n async createTask(endpoint: string, body: Record<string, any>): Promise<TaskResult> {\n const url = `${this.config.baseUrl}${endpoint}`;\n\n // 每次请求时动态获取最新的 token(现在是异步的)\n const currentToken = await getApiToken(this.providedApiKey);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await this.config.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentToken}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new SeacloudError(\n `HTTP ${response.status}: ${errorBody}`,\n response.status,\n errorBody,\n );\n }\n\n const result = await response.json();\n return result as TaskResult;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof SeacloudError) {\n throw error;\n }\n\n if ((error as Error).name === 'AbortError') {\n throw new SeacloudError(`Request timeout after ${this.config.timeout}ms`);\n }\n\n throw new SeacloudError(\n `Request failed: ${(error as Error).message}`,\n undefined,\n error,\n );\n }\n }\n\n /**\n * 查询任务状态\n * @param endpoint API 端点路径(例如:/model/v1/generation)\n * @param taskId 任务 ID\n * @returns 任务结果\n */\n async getTaskStatus(endpoint: string, taskId: string): Promise<TaskResult> {\n const url = `${this.config.baseUrl}${endpoint}/task/${taskId}`;\n\n // 每次请求时动态获取最新的 token(现在是异步的)\n const currentToken = await getApiToken(this.providedApiKey);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await this.config.fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${currentToken}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new SeacloudError(\n `HTTP ${response.status}: ${errorBody}`,\n response.status,\n errorBody,\n );\n }\n\n const result = await response.json();\n return result as TaskResult;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof SeacloudError) {\n throw error;\n }\n\n if ((error as Error).name === 'AbortError') {\n throw new SeacloudError(`Request timeout after ${this.config.timeout}ms`);\n }\n\n throw new SeacloudError(\n `Request failed: ${(error as Error).message}`,\n undefined,\n error,\n );\n }\n }\n\n /**\n * 获取当前配置\n */\n getConfig(): Readonly<Required<SeacloudConfig>> {\n return { ...this.config };\n }\n}\n","/**\n * 全局配置管理\n */\n\nimport type { SeacloudClient } from './client.js';\nimport type { PollingOptions } from './types.js';\nimport { SeacloudClient as Client } from './client.js';\nimport { getHostFromParent } from './config.js';\n\n// 全局配置状态\ninterface GlobalConfig {\n client: SeacloudClient | null;\n defaultPollingOptions: PollingOptions;\n}\n\nconst globalConfig: GlobalConfig = {\n client: null,\n defaultPollingOptions: {\n intervalMs: 3000, // 3秒轮询间隔\n maxAttempts: 100, // 最多尝试100次 (约5分钟)\n },\n};\n\n/**\n * 初始化配置选项\n */\nexport interface InitOptions {\n apiKey?: string;\n baseUrl?: string;\n intervalMs?: number; // 轮询间隔(毫秒)\n maxAttempts?: number; // 最大尝试次数\n timeout?: number;\n xProject?: string; // X-Project header 值,用于 Agent API 访问标识,默认为 'SeaVerse'\n}\n\n/**\n * 初始化 SDK(可选)\n *\n * 从 v0.9.2 版本开始,此函数是可选的。\n * 如果不调用此函数,SDK 会在每次 API 调用时自动使用最新的环境变量/localStorage token。\n *\n * 何时调用此函数:\n * 1. 需要自定义 polling 选项(intervalMs, maxAttempts)\n * 2. 需要固定使用某个特定的 apiKey/baseUrl(不希望每次都重新读取)\n *\n * 在 iframe 环境中,SDK 会自动从父页面获取 Host 并判断环境(开发/正式),\n * 然后根据环境自动设置合适的 baseUrl。\n *\n * @example\n * // 不调用 initSeacloud - 每次都使用最新 token\n * const result = await llmChatCompletions({...});\n *\n * @example\n * // 调用 initSeacloud - 使用固定配置\n * initSeacloud({ intervalMs: 5000, maxAttempts: 200 });\n * const result = await llmChatCompletions({...});\n *\n * @example\n * // 在 iframe 中调用 - 自动判断环境\n * await initSeacloud(); // 会自动从父页面获取 host 并设置 baseUrl\n *\n * @param apiKeyOrConfig API 密钥字符串或完整配置对象\n * @param options 可选配置(仅在第一个参数为字符串时使用)\n */\nexport async function initSeacloud(\n apiKeyOrConfig?: string | InitOptions,\n options?: {\n baseUrl?: string;\n intervalMs?: number;\n maxAttempts?: number;\n timeout?: number;\n }\n): Promise<SeacloudClient> {\n let apiKey: string | undefined;\n let config: InitOptions;\n\n // 判断第一个参数的类型\n if (typeof apiKeyOrConfig === 'string') {\n // 方式 1: initSeacloud('api-key', { ... })\n apiKey = apiKeyOrConfig;\n config = options || {};\n } else if (apiKeyOrConfig && typeof apiKeyOrConfig === 'object') {\n // 方式 2: initSeacloud({ apiKey: '...', baseUrl: '...', ... })\n config = apiKeyOrConfig;\n apiKey = config.apiKey;\n } else {\n // 方式 3: initSeacloud() - 无参数,完全依赖自动检测\n config = {};\n apiKey = undefined;\n }\n\n // 如果用户没有显式设置 baseUrl,尝试从父页面获取 host 并自动判断环境\n if (!config.baseUrl) {\n try {\n const parentHost = await getHostFromParent(3000); // 3秒超时,避免初始化卡顿\n\n if (parentHost) {\n // 判断是否为开发环境\n // 开发环境特征:localhost, 127.0.0.1, 或者域名包含 seaverse.dev\n const isDevelopment =\n parentHost.includes('localhost') ||\n parentHost.includes('127.0.0.1') ||\n parentHost.includes(':3000') ||\n parentHost.includes(':8080') ||\n parentHost.includes('seaverse.dev');\n\n // 根据环境设置 baseUrl\n if (isDevelopment) {\n config.baseUrl = 'https://proxy-rs.sg.seaverse.dev'; // 开发环境\n console.log('[SeaCloud SDK] 检测到开发环境,使用开发 baseUrl:', config.baseUrl);\n } else {\n config.baseUrl = 'https://proxy-rs.seaverse.ai'; // 正式环境\n console.log('[SeaCloud SDK] 检测到正式环境,使用正式 baseUrl:', config.baseUrl);\n }\n }\n } catch (error) {\n // 获取 host 失败,使用默认配置\n console.warn('[SeaCloud SDK] 获取父页面 host 失败,使用默认配置', error);\n }\n }\n\n // 创建客户端(允许空 API key,让后端处理认证错误)\n globalConfig.client = new Client({\n apiKey: apiKey || '',\n baseUrl: config.baseUrl,\n timeout: config.timeout,\n xProject: config.xProject,\n });\n\n // 设置默认轮询选项\n if (config.intervalMs !== undefined) {\n globalConfig.defaultPollingOptions.intervalMs = config.intervalMs;\n }\n if (config.maxAttempts !== undefined) {\n globalConfig.defaultPollingOptions.maxAttempts = config.maxAttempts;\n }\n\n return globalConfig.client;\n}\n\n/**\n * 获取客户端实例\n *\n * 如果用户调用过 initSeacloud(),返回缓存的客户端实例\n * 否则,创建新的临时客户端实例(使用最新的环境变量/localStorage token)\n *\n * @returns SeacloudClient 实例\n */\nexport function getClient(): SeacloudClient {\n // 如果用户显式调用了 initSeacloud(),使用缓存的 client\n if (globalConfig.client) {\n return globalConfig.client;\n }\n\n // 否则,每次都动态创建新 client(使用最新的 token/env)\n return new Client({\n // 不传 apiKey - 让 createConfig() 自动从环境变量/localStorage 读取\n // 不传 baseUrl - 让 createConfig() 自动从环境变量读取或使用默认值\n // 不传 timeout - 使用默认 30000ms\n });\n}\n\n/**\n * 获取默认轮询选项\n */\nexport function getDefaultPollingOptions(): PollingOptions {\n return { ...globalConfig.defaultPollingOptions };\n}\n\n/**\n * 更新默认轮询选项\n */\nexport function setDefaultPollingOptions(options: Partial<PollingOptions>) {\n Object.assign(globalConfig.defaultPollingOptions, options);\n}\n\n/**\n * 重置配置(主要用于测试)\n */\nexport function resetConfig() {\n globalConfig.client = null;\n globalConfig.defaultPollingOptions = {\n intervalMs: 3000,\n maxAttempts: 100,\n };\n}\n","import { getClient } from '../core/global-config.js';\nimport { SeacloudError } from '../core/types.js';\nimport { getApiToken } from '../core/config.js';\n\n/**\n * Chat message role\n */\nexport type ChatMessageRole = 'system' | 'user' | 'assistant';\n\n/**\n * Chat message interface\n */\nexport interface ChatMessage {\n /**\n * Message role\n */\n role: ChatMessageRole;\n /**\n * Message content\n */\n content: string;\n}\n\n/**\n * LLM chat completions request parameters\n */\nexport interface LlmChatCompletionsParams {\n /**\n * Model name to use for chat completion\n * Supports 100+ models including:\n * - Claude: seaart-mix-sonnet-4-5, shaseng-claude-4.5, seacloud-claude-haiku-4.5, seacloud-claude-sonnet-4, seacloud-claude-opus-4.5\n * - Kimi: kimi-k2, kimi-k2-thinking, kimi-k2-250905\n * - Grok: grok-4, grok-code-fast-1\n * - DeepSeek: deepseek-v3.1, deepseek-v3-0324, deepseek-r1, deepseek-r1-0528\n * - Gemini: gemini-2.5-pro, gemini-2.5-flash, gemini-2.0-flash, gemini-3-pro-preview, gemini-3-flash-preview\n * - Qwen: qwen-plus, qwen-plus-character, qwen3-coder-plus\n * - GLM: glm-4.5-air, glm-4.5, glm-4.6, glm-4-plus\n * - GPT: gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, gpt-5, gpt-5.1, gpt-5.2\n * - Hunyuan: hunyuan-turbos-latest, hunyuan-large-role-20250822, hunyuan-large-role-plus-20250718\n * - Mistral: mistral-small-3.2-24b-instruct, mistral-small-3.1-24b-instruct, mistral-nemo\n * - Hermes: hermes-4-70b, hermes-4-405b, hermes-3-llama-3.1-405b\n * - Doubao: doubao-romantic, doubao-seed-1-6, doubao-seed-code-preview-251028\n * - Ernie: ernie-5.0-thinking-latest, ernie-5.0-thinking-preview\n * - WizardLM: wizardlm-2-8x22b\n * - O1/O3: o1-pre, o3-pre\n * - LongCat: LongCat-Flash-Chat, LongCat-Flash-Thinking\n * - And many more...\n *\n * @example \"seaart-mix-sonnet-4-5\"\n * @example \"kimi-k2\"\n * @example \"deepseek-v3.1\"\n */\n model: string;\n\n /**\n * Array of messages comprising the conversation so far\n */\n messages: ChatMessage[];\n\n /**\n * Maximum number of tokens to generate in the completion\n * @default undefined (model default)\n */\n max_tokens?: number;\n\n /**\n * Sampling temperature (0-2)\n * Higher values make output more random, lower values more deterministic\n * @default undefined (model default, usually 1.0)\n */\n temperature?: number;\n\n /**\n * Nucleus sampling parameter (0-1)\n * Alternative to temperature sampling\n * @default undefined (model default, usually 1.0)\n */\n top_p?: number;\n\n /**\n * Whether to stream the response\n * If true, returns an async iterator of chunks\n * If false, waits for complete response\n * @default false\n */\n stream?: boolean;\n\n /**\n * Number of completions to generate\n * @default 1\n */\n n?: number;\n\n /**\n * Sequences where the API will stop generating further tokens\n */\n stop?: string | string[];\n\n /**\n * Penalty for new tokens based on whether they appear in the text so far (-2.0 to 2.0)\n * @default 0\n */\n presence_penalty?: number;\n\n /**\n * Penalty for new tokens based on their existing frequency in the text so far (-2.0 to 2.0)\n * @default 0\n */\n frequency_penalty?: number;\n\n /**\n * A unique identifier representing your end-user\n */\n user?: string;\n\n /**\n * Request timeout in milliseconds\n * Overrides the global timeout set in initSeacloud()\n * @default 30000 (from global config)\n * @example 60000 for 60 seconds timeout\n */\n timeout?: number;\n}\n\n/**\n * Usage statistics for the completion\n */\nexport interface ChatCompletionUsage {\n /**\n * Number of tokens in the prompt\n */\n prompt_tokens: number;\n\n /**\n * Number of tokens in the generated completion\n */\n completion_tokens: number;\n\n /**\n * Total number of tokens used\n */\n total_tokens: number;\n\n /**\n * Cost in USD (if available)\n */\n cost?: number;\n\n /**\n * Additional usage details\n */\n [key: string]: any;\n}\n\n/**\n * A single chat completion choice\n */\nexport interface ChatCompletionChoice {\n /**\n * The index of this choice\n */\n index: number;\n\n /**\n * The message generated by the model\n */\n message: ChatMessage;\n\n /**\n * The reason the model stopped generating tokens\n * @values stop | length | content_filter | function_call\n */\n finish_reason: string | null;\n\n /**\n * Additional choice-specific fields\n */\n [key: string]: any;\n}\n\n/**\n * Chat completion response (non-streaming)\n */\nexport interface ChatCompletionResponse {\n /**\n * Unique identifier for the completion\n */\n id: string;\n\n /**\n * The object type, always \"chat.completion\"\n */\n object: string;\n\n /**\n * Unix timestamp of when the completion was created\n */\n created: number;\n\n /**\n * The model used for completion\n */\n model: string;\n\n /**\n * List of completion choices\n */\n choices: ChatCompletionChoice[];\n\n /**\n * Usage statistics for the completion\n */\n usage?: ChatCompletionUsage;\n\n /**\n * Additional response fields\n */\n [key: string]: any;\n}\n\n/**\n * Delta message for streaming chunks\n */\nexport interface ChatCompletionChunkDelta {\n /**\n * The role of the message (only in first chunk)\n */\n role?: ChatMessageRole;\n\n /**\n * The content delta for this chunk\n */\n content?: string;\n}\n\n/**\n * A single streaming chunk choice\n */\nexport interface ChatCompletionChunkChoice {\n /**\n * The index of this choice\n */\n index: number;\n\n /**\n * The delta message for this chunk\n */\n delta: ChatCompletionChunkDelta;\n\n /**\n * The reason the model stopped generating tokens (only in last chunk)\n */\n finish_reason: string | null;\n\n /**\n * Additional choice-specific fields\n */\n [key: string]: any;\n}\n\n/**\n * Chat completion streaming chunk\n */\nexport interface ChatCompletionChunk {\n /**\n * Unique identifier for the completion\n */\n id: string;\n\n /**\n * The object type, always \"chat.completion.chunk\"\n */\n object: string;\n\n /**\n * Unix timestamp of when the chunk was created\n */\n created: number;\n\n /**\n * The model used for completion\n */\n model: string;\n\n /**\n * List of chunk choices\n */\n choices: ChatCompletionChunkChoice[];\n\n /**\n * Additional chunk fields\n */\n [key: string]: any;\n}\n\n/**\n * Call LLM chat completions API (non-streaming)\n *\n * @example\n * ```typescript\n * import { initSeacloud, llmChatCompletions } from 'seacloud-sdk';\n *\n * initSeacloud({ apiKey: 'your-api-key' });\n *\n * const response = await llmChatCompletions({\n * model: 'seaart-mix-sonnet-4-5',\n * messages: [\n * { role: 'user', content: 'Hello!' }\n * ],\n * max_tokens: 100\n * });\n *\n * console.log(response.choices[0].message.content);\n * ```\n *\n * @example With custom timeout\n * ```typescript\n * // Set 60 seconds timeout for this specific call\n * const response = await llmChatCompletions({\n * model: 'deepseek-v3.1',\n * messages: [\n * { role: 'user', content: 'Write a long article' }\n * ],\n * timeout: 60000 // 60 seconds\n * });\n * ```\n *\n * @param params Request parameters\n * @returns Chat completion response\n */\nexport async function llmChatCompletions(\n params: LlmChatCompletionsParams & { stream?: false }\n): Promise<ChatCompletionResponse>;\n\n/**\n * Call LLM chat completions API (streaming)\n *\n * @example\n * ```typescript\n * import { initSeacloud, llmChatCompletions } from 'seacloud-sdk';\n *\n * initSeacloud({ apiKey: 'your-api-key' });\n *\n * const stream = await llmChatCompletions({\n * model: 'seaart-mix-sonnet-4-5',\n * messages: [\n * { role: 'user', content: 'Tell me a story' }\n * ],\n * stream: true\n * });\n *\n * for await (const chunk of stream) {\n * const content = chunk.choices[0]?.delta?.content;\n * if (content) {\n * process.stdout.write(content);\n * }\n * }\n * ```\n *\n * @param params Request parameters with stream: true\n * @returns Async iterator of chat completion chunks\n */\nexport async function llmChatCompletions(\n params: LlmChatCompletionsParams & { stream: true }\n): Promise<AsyncIterable<ChatCompletionChunk>>;\n\n// Implementation\nexport async function llmChatCompletions(\n params: LlmChatCompletionsParams\n): Promise<ChatCompletionResponse | AsyncIterable<ChatCompletionChunk>> {\n const client = getClient();\n const config = client.getConfig();\n\n const url = `${config.baseUrl}/llm/chat/completions`;\n\n // 动态获取 API token\n const token = await getApiToken(config.apiKey);\n\n // Use params.timeout if provided, otherwise use global config.timeout\n const timeoutMs = params.timeout ?? config.timeout;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await config.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n },\n body: JSON.stringify(params),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new SeacloudError(\n `HTTP ${response.status}: ${errorBody}`,\n response.status,\n errorBody,\n );\n }\n\n // Streaming response\n if (params.stream) {\n return parseStreamingResponse(response);\n }\n\n // Non-streaming response\n const result = await response.json();\n return result as ChatCompletionResponse;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof SeacloudError) {\n throw error;\n }\n\n if ((error as Error).name === 'AbortError') {\n throw new SeacloudError(`Request timeout after ${timeoutMs}ms`);\n }\n\n throw new SeacloudError(\n `Request failed: ${(error as Error).message}`,\n undefined,\n error,\n );\n }\n}\n\n/**\n * Parse streaming response into async iterable\n */\nasync function* parseStreamingResponse(\n response: Response\n): AsyncIterable<ChatCompletionChunk> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new SeacloudError('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n if (!trimmedLine) continue;\n if (trimmedLine === 'data: [DONE]') continue;\n\n if (trimmedLine.startsWith('data: ')) {\n const jsonStr = trimmedLine.slice(6);\n try {\n const chunk = JSON.parse(jsonStr) as ChatCompletionChunk;\n yield chunk;\n } catch (error) {\n console.warn('Failed to parse SSE chunk:', jsonStr);\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","/**\n * ============================================================================\n * SeaCloud Fast Agent Chat Completions API\n * ============================================================================\n *\n * This module provides a comprehensive API for interacting with SeaCloud's\n * Fast Agent system, which supports:\n *\n * - Multi-turn conversations with session management\n * - Tool calling for artifact generation (images, videos, music, etc.)\n * - Streaming and non-streaming response modes\n * - Multiple content types (text, image, video, audio, file)\n * - Flexible model selection (Claude, GPT, Gemini, etc.)\n *\n * IMPORTANT NOTES:\n * ================\n *\n * 1. REQUIRED PARAMETERS:\n * - agent_id: Caller-provided agent identifier\n * - messages: Array of conversation messages\n *\n * 2. TIMEOUT CONFIGURATION:\n * - Default timeout: 30 seconds (may be too short for tool calls)\n * - Recommended for agent operations: 120 seconds or more\n * - Set via initSeacloud({ timeout: 120000 })\n *\n * 3. STREAMING MODE:\n * - API always returns Server-Sent Events (SSE) format\n * - params.stream controls how SDK consumes the response\n * - For tool calls (image/video generation), streaming is RECOMMENDED\n *\n * 4. AUTHENTICATION:\n * - Requires 'X-Project' header (configured via initSeacloud({ xProject: 'SeaArt' }))\n * - Uses Bearer token authentication\n *\n * 5. SESSION MANAGEMENT:\n * - Use session_id to maintain multi-turn conversations\n * - Increment seq for each message in the session\n *\n * @see AGENT_API.md for detailed documentation and examples\n */\n\nimport { getClient } from '../core/global-config.js';\nimport { SeacloudError } from '../core/types.js';\n\n/**\n * Message content type\n */\nexport type AgentMessageContentType = 'text' | 'image' | 'video' | 'audio' | 'file';\n\n/**\n * Base message content\n */\ninterface BaseMessageContent {\n type: AgentMessageContentType;\n}\n\n/**\n * Text message content\n */\ninterface TextMessageContent extends BaseMessageContent {\n type: 'text';\n text: string;\n}\n\n/**\n * Image message content\n */\ninterface ImageMessageContent extends BaseMessageContent {\n type: 'image';\n image_url: string;\n}\n\n/**\n * Video message content\n */\ninterface VideoMessageContent extends BaseMessageContent {\n type: 'video';\n video_url: string;\n}\n\n/**\n * Audio message content\n */\ninterface AudioMessageContent extends BaseMessageContent {\n type: 'audio';\n audio_url: string;\n}\n\n/**\n * File message content\n */\ninterface FileMessageContent extends BaseMessageContent {\n type: 'file';\n file_url: string;\n}\n\n/**\n * Message content item (union type for type safety)\n */\nexport type AgentMessageContent =\n | TextMessageContent\n | ImageMessageContent\n | VideoMessageContent\n | AudioMessageContent\n | FileMessageContent;\n\n/**\n * Message role type\n */\nexport type AgentMessageRole = 'developer' | 'user' | 'assistant' | 'tool';\n\n/**\n * Chat message\n */\nexport interface AgentMessage {\n /**\n * Message role\n * - developer: System instructions/prompts (equivalent to \"system\" role)\n * - user: User input messages\n * - assistant: AI assistant responses (for multi-turn conversations)\n * - tool: Tool execution results\n */\n role: AgentMessageRole;\n\n /**\n * Message content array\n */\n content: AgentMessageContent[];\n\n /**\n * Tool call ID (for role: 'tool')\n */\n tool_call_id?: string;\n\n /**\n * Tool name (for role: 'tool')\n */\n name?: string;\n}\n\n/**\n * Tool function definition\n */\nexport interface AgentToolFunction {\n /**\n * Tool name\n * Available tools:\n *\n * Image Generation:\n * - seagen_text2image_flux1d_artifact_tool\n * - seagen_text2image_seedream40_artifact_tool\n * - seagen_text2image_google_gemini3_pro_image_artifact_tool\n * - seagen_blackforestlabs_flux_2_pro_tool\n * - mm_volces_seedream_4_5_gateway_tool\n *\n * Image Editing:\n * - seagen_edit_image_google_artifact_tool\n * - seagen_blackforestlabs_flux_2_pro_edit_tool\n *\n * Video Generation:\n * - seagen_image2video_wanx26_artifact_tool\n * - seagen_text2video_wanx26_artifact_tool\n * - seagen_image2video_seedance_pro_fast_artifact_tool\n * - mm_text2video_kling_v2_6_gateway_tool\n * - mm_image2video_kling_v2_6_i2v_gateway_tool\n *\n * Music & Audio:\n * - seagen_text2song_mureka_artifact_tool\n * - seagen_text2lyrics_mureka_artifact_tool\n */\n name: string;\n\n /**\n * Tool description (optional)\n */\n description?: string;\n\n /**\n * Tool parameters schema (optional)\n */\n parameters?: Record<string, any>;\n}\n\n/**\n * Tool definition\n */\nexport interface AgentTool {\n /**\n * Tool type (always 'function')\n */\n type: 'function';\n\n /**\n * Function definition\n */\n function: AgentToolFunction;\n}\n\n/**\n * Agent chat completions request parameters\n */\nexport interface AgentChatCompletionsParams {\n /**\n * Agent ID to invoke\n * @example \"seaverse_agent\"\n * @example \"seagen_agent\"\n */\n agent_id: string;\n\n /**\n * Array of messages comprising the conversation\n */\n messages: AgentMessage[];\n\n /**\n * AI model to use for processing\n * @default \"custom_openai/vertex-ai-claude-sonnet-4.5\"\n * @example \"gpt-4o\"\n * @example \"custom_openai/vertex-ai-claude-sonnet-4.5\"\n */\n model?: string;\n\n /**\n * Sampling temperature for creativity control (0.0 to 1.0)\n * - 0.0: Focused and deterministic responses\n * - 1.0: Maximum creativity and randomness\n * @default 0.7\n */\n temperature?: number;\n\n /**\n * Session ID for multi-turn conversations\n * Used to maintain conversation context across multiple requests\n * Server returns this in the response; use it in subsequent calls\n */\n session_id?: string;\n\n /**\n * User identifier for tracking and analytics\n * Optional field for associating requests with specific users\n */\n user_id?: string;\n\n /**\n * Message ID for SSE reconnection (ADVANCED USE)\n * Only use this when resuming an interrupted streaming response\n * Server returns msg_id in response; use it to resume from disconnect point\n *\n * WARNING: Do NOT use for multi-turn conversations\n * For multi-turn, just include full message history + session_id\n *\n * @example\n * // DON'T do this for multi-turn:\n * // { msg_id: previousResponse.msg_id, seq: 1 }\n *\n * // DO this instead:\n * // { session_id: previousResponse.session_id, messages: [...allMessages] }\n */\n msg_id?: string;\n\n /**\n * Sequence number for message resumption (ADVANCED USE)\n * Only used with msg_id for resuming interrupted streams\n * For regular multi-turn conversations, omit this parameter\n *\n * @default 0\n */\n seq?: number;\n\n /**\n * Business-specific parameters\n * Key-value pairs passed through to backend systems\n * Common use cases:\n * - aspect_ratio: Video/image aspect ratio (e.g., \"16:9\", \"1:1\")\n * - duration: Video duration in seconds\n * - resolution: Output resolution (e.g., \"1080p\", \"4k\")\n */\n metadata?: Record<string, any>;\n\n /**\n * List of tools available to the agent\n * Agent automatically selects appropriate tool based on user request\n */\n tools?: AgentTool[];\n\n /**\n * Enable Server-Sent Events streaming\n * @default true\n */\n stream?: boolean;\n\n /**\n * Maximum number of tokens to generate\n */\n max_tokens?: number;\n\n /**\n * Number of completions to generate\n * @default 1\n */\n n?: number;\n\n /**\n * Sequences where the API will stop generating\n */\n stop?: string | string[];\n\n /**\n * Penalty for new tokens based on presence (-2.0 to 2.0)\n * @default 0\n */\n presence_penalty?: number;\n\n /**\n * Penalty for new tokens based on frequency (-2.0 to 2.0)\n * @default 0\n */\n frequency_penalty?: number;\n\n /**\n * Top-p nucleus sampling (0-1)\n */\n top_p?: number;\n\n /**\n * Request timeout in milliseconds\n * Overrides the global timeout set in initSeacloud()\n * @default 30000 (from global config)\n * @recommended 120000 or more for agent operations with tool calls\n * @example 120000 for 120 seconds timeout\n */\n timeout?: number;\n}\n\n/**\n * Artifact (generated file)\n */\nexport interface AgentArtifact {\n /**\n * File name\n * @example \"image.webp\"\n */\n name: string;\n\n /**\n * CDN URL to access the file\n */\n url: string;\n\n /**\n * Content type\n * @example \"image\" | \"video\" | \"audio\"\n */\n type: string;\n\n /**\n * MIME type\n * @example \"image/webp\" | \"video/mp4\" | \"audio/mp3\"\n */\n mime_type?: string;\n\n /**\n * File size in bytes\n */\n size?: number;\n\n /**\n * Duration in seconds (for video/audio)\n */\n duration?: number;\n\n /**\n * Width in pixels (for image/video)\n */\n width?: number;\n\n /**\n * Height in pixels (for image/video)\n */\n height?: number;\n\n /**\n * Additional metadata\n */\n [key: string]: any;\n}\n\n/**\n * Tool call information\n */\nexport interface AgentToolCall {\n /**\n * Tool call ID\n */\n id: string;\n\n /**\n * Tool type\n */\n type: 'function';\n\n /**\n * Function call details\n */\n function: {\n /**\n * Function name\n */\n name: string;\n\n /**\n * Function arguments (JSON string)\n */\n arguments: string;\n };\n\n /**\n * Tool call index\n */\n index?: number;\n}\n\n/**\n * Delta content for streaming chunks\n */\nexport interface AgentChatCompletionDelta {\n /**\n * Message role (only in first chunk)\n */\n role?: AgentMessageRole;\n\n /**\n * Content delta (string or array)\n */\n content?: string | AgentMessageContent[];\n\n /**\n * Artifacts (generated files)\n */\n artifacts?: AgentArtifact[];\n\n /**\n * Tool calls\n */\n tool_calls?: AgentToolCall[];\n\n /**\n * Refusal message\n */\n refusal?: string | null;\n\n /**\n * Function call (deprecated, use tool_calls)\n */\n function_call?: any;\n\n /**\n * Audio content\n */\n audio?: any;\n\n /**\n * Additional provider-specific fields\n */\n provider_specific_fields?: any;\n}\n\n/**\n * Content filter result\n */\nexport interface AgentContentFilterResult {\n /**\n * Error information\n */\n error?: {\n /**\n * Error code\n */\n code: string;\n\n /**\n * Error message\n */\n message: string;\n };\n\n /**\n * Additional filter results\n */\n [key: string]: any;\n}\n\n/**\n * Chat completion choice (streaming)\n */\nexport interface AgentChatCompletionChunkChoice {\n /**\n * Choice index\n */\n index: number;\n\n /**\n * Delta message for this chunk\n */\n delta: AgentChatCompletionDelta;\n\n /**\n * Finish reason (only in last chunk)\n * - \"stop\": Natural completion\n * - \"length\": Maximum token limit reached\n * - \"tool_calls\": Tool execution triggered\n * - \"content_filter\": Content filtered\n */\n finish_reason: string | null;\n\n /**\n * Log probabilities\n */\n logprobs?: any;\n\n /**\n * Content filter results\n */\n content_filter_results?: AgentContentFilterResult;\n\n /**\n * Content filter result (singular)\n */\n content_filter_result?: AgentContentFilterResult;\n}\n\n/**\n * Usage statistics\n */\nexport interface AgentUsage {\n /**\n * Prompt tokens\n */\n prompt_tokens: number;\n\n /**\n * Completion tokens\n */\n completion_tokens: number;\n\n /**\n * Total tokens\n */\n total_tokens: number;\n\n /**\n * Completion tokens details\n */\n completion_tokens_details?: {\n /**\n * Accepted prediction tokens\n */\n accepted_prediction_tokens?: number;\n\n /**\n * Audio tokens\n */\n audio_tokens?: number;\n\n /**\n * Reasoning tokens\n */\n reasoning_tokens?: number;\n\n /**\n * Rejected prediction tokens\n */\n rejected_prediction_tokens?: number;\n };\n\n /**\n * Prompt tokens details\n */\n prompt_tokens_details?: {\n /**\n * Audio tokens\n */\n audio_tokens?: number;\n\n /**\n * Cached tokens\n */\n cached_tokens?: number;\n\n /**\n * Text tokens\n */\n text_tokens?: number | null;\n\n /**\n * Image tokens\n */\n image_tokens?: number | null;\n };\n\n /**\n * Cost in USD\n */\n cost?: number;\n}\n\n/**\n * Chat completion streaming chunk\n */\nexport interface AgentChatCompletionChunk {\n /**\n * Unique identifier for the completion\n */\n id: string;\n\n /**\n * Object type (always \"chat.completion.chunk\")\n */\n object: string;\n\n /**\n * Unix timestamp\n */\n created: number;\n\n /**\n * Model used\n */\n model: string;\n\n /**\n * System fingerprint\n */\n system_fingerprint?: string;\n\n /**\n * List of choices\n */\n choices: AgentChatCompletionChunkChoice[];\n\n /**\n * Usage statistics (usually in last chunk)\n */\n usage?: AgentUsage;\n\n /**\n * Session ID for conversation continuation\n */\n session_id?: string;\n\n /**\n * Message ID\n */\n msg_id?: string;\n\n /**\n * Provider-specific fields\n */\n provider_specific_fields?: any;\n\n /**\n * Citations\n */\n citations?: any;\n\n /**\n * Service tier\n */\n service_tier?: string | null;\n\n /**\n * Obfuscation\n */\n obfuscation?: string;\n}\n\n/**\n * Message in non-streaming response\n */\nexport interface AgentResponseMessage {\n /**\n * Message role\n */\n role: AgentMessageRole;\n\n /**\n * Message content\n */\n content: string;\n\n /**\n * Tool calls\n */\n tool_calls?: AgentToolCall[];\n\n /**\n * Refusal message\n */\n refusal?: string | null;\n\n /**\n * Function call (deprecated)\n */\n function_call?: any;\n\n /**\n * Audio content\n */\n audio?: any;\n}\n\n/**\n * Chat completion choice (non-streaming)\n */\nexport interface AgentChatCompletionChoice {\n /**\n * Choice index\n */\n index: number;\n\n /**\n * Message\n */\n message: AgentResponseMessage;\n\n /**\n * Finish reason\n */\n finish_reason: string | null;\n\n /**\n * Log probabilities\n */\n logprobs?: any;\n\n /**\n * Content filter results\n */\n content_filter_results?: AgentContentFilterResult;\n}\n\n/**\n * Chat completion response (non-streaming)\n */\nexport interface AgentChatCompletionResponse {\n /**\n * Unique identifier\n */\n id: string;\n\n /**\n * Object type (always \"chat.completion\")\n */\n object: string;\n\n /**\n * Unix timestamp\n */\n created: number;\n\n /**\n * Model used\n */\n model: string;\n\n /**\n * System fingerprint\n */\n system_fingerprint?: string;\n\n /**\n * List of choices\n */\n choices: AgentChatCompletionChoice[];\n\n /**\n * Usage statistics\n */\n usage?: AgentUsage;\n\n /**\n * Session ID\n */\n session_id?: string;\n\n /**\n * Message ID\n */\n msg_id?: string;\n\n /**\n * Provider-specific fields\n */\n provider_specific_fields?: any;\n\n /**\n * Service tier\n */\n service_tier?: string | null;\n\n /**\n * Generated artifacts\n */\n artifacts?: AgentArtifact[];\n}\n\n/**\n * Call SeaCloud Fast Agent API (non-streaming)\n *\n * @example\n * ```typescript\n * import { initSeacloud, agentChatCompletions } from 'seacloud-sdk';\n *\n * initSeacloud({\n * apiKey: 'your-api-key',\n * baseUrl: 'http://proxy.sg.seaverse.dev',\n * });\n *\n * // Simple chat\n * const response = await agentChatCompletions({\n * agent_id: 'seaverse_agent',\n * messages: [\n * {\n * role: 'user',\n * content: [{ type: 'text', text: 'Hello!' }]\n * }\n * ],\n * model: 'gpt-4o',\n * });\n *\n * console.log(response.choices[0].message.content);\n * ```\n *\n * @example\n * ```typescript\n * // Generate an image\n * const response = await agentChatCompletions({\n * agent_id: 'seaverse_agent',\n * messages: [\n * {\n * role: 'user',\n * content: [{ type: 'text', text: 'Generate a cute puppy photo' }]\n * }\n * ],\n * model: 'gpt-4o',\n * tools: [\n * {\n * type: 'function',\n * function: { name: 'seagen_text2image_flux1d_artifact_tool' }\n * }\n * ]\n * });\n *\n * // Access generated image\n * const imageUrl = response.artifacts?.[0]?.url;\n * ```\n *\n * @param params Request parameters\n * @returns Chat completion response\n */\nexport async function agentChatCompletions(\n params: AgentChatCompletionsParams & { stream?: false }\n): Promise<AgentChatCompletionResponse>;\n\n/**\n * Call SeaCloud Fast Agent API (streaming)\n *\n * @example\n * ```typescript\n * import { initSeacloud, agentChatCompletions } from 'seacloud-sdk';\n *\n * initSeacloud({\n * apiKey: 'your-api-key',\n * baseUrl: 'http://proxy.sg.seaverse.dev',\n * });\n *\n * const stream = await agentChatCompletions({\n * agent_id: 'seaverse_agent',\n * messages: [\n * {\n * role: 'user',\n * content: [{ type: 'text', text: 'Tell me a story' }]\n * }\n * ],\n * model: 'gpt-4o',\n * stream: true,\n * });\n *\n * for await (const chunk of stream) {\n * const content = chunk.choices[0]?.delta?.content;\n * if (typeof content === 'string') {\n * process.stdout.write(content);\n * }\n *\n * // Handle artifacts\n * const artifacts = chunk.choices[0]?.delta?.artifacts;\n * if (artifacts) {\n * console.log('Generated artifacts:', artifacts);\n * }\n * }\n * ```\n *\n * @param params Request parameters with stream: true\n * @returns Async iterator of chat completion chunks\n */\nexport async function agentChatCompletions(\n params: AgentChatCompletionsParams & { stream: true }\n): Promise<AsyncIterable<AgentChatCompletionChunk>>;\n\n// Implementation\nexport async function agentChatCompletions(\n params: AgentChatCompletionsParams\n): Promise<AgentChatCompletionResponse | AsyncIterable<AgentChatCompletionChunk>> {\n const client = getClient();\n const config = client.getConfig();\n\n const url = `${config.baseUrl}/agent/api/v1/chat/completions`;\n\n // ============================================================================\n // PARAMETER PROCESSING LOGIC\n // ============================================================================\n\n /**\n * Default Model:\n * - If not specified, uses 'custom_openai/vertex-ai-claude-sonnet-4.5'\n * - This is Claude Sonnet 4.5, optimized for agent operations\n * - You can override with any supported model (gpt-4o, claude-4, etc.)\n */\n const model = params.model || 'custom_openai/vertex-ai-claude-sonnet-4.5';\n\n /**\n * Stream Mode:\n * - Agent API ALWAYS returns Server-Sent Events (SSE) format\n * - Even if params.stream=false, API returns SSE chunks\n * - We force stream: true in API request for consistency\n * - For non-streaming (params.stream=false), we collect all chunks internally\n */\n const userWantsStreaming = params.stream !== false; // Default to true\n const requestBody = {\n ...params,\n model,\n stream: true, // Always request SSE from API\n };\n\n // ============================================================================\n // TIMEOUT & REQUEST HANDLING\n // ============================================================================\n\n /**\n * Timeout Configuration:\n * - Default: 30 seconds (set in config)\n * - For agent operations (especially with tool calls like image generation):\n * Recommend setting timeout to 120000ms (2 minutes) or more\n * - Can override per-request: agentChatCompletions({ ..., timeout: 120000 })\n * - Or set globally: initSeacloud({ apiKey: '...', timeout: 120000 })\n */\n // Use params.timeout if provided, otherwise use global config.timeout\n const timeoutMs = params.timeout ?? config.timeout;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n /**\n * Request Headers:\n * - Content-Type: application/json (standard)\n * - Authorization: Bearer token for authentication\n * - X-Project: 由 initSeacloud({ xProject: '...' }) 配置\n */\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n };\n\n // 仅在配置了 xProject 时添加 X-Project header\n if (config.xProject) {\n headers['X-Project'] = config.xProject;\n }\n\n const response = await config.fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new SeacloudError(\n `HTTP ${response.status}: ${errorBody}`,\n response.status,\n errorBody,\n );\n }\n\n // ============================================================================\n // RESPONSE HANDLING\n // ============================================================================\n\n /**\n * Response Routing:\n * - If user wants streaming (params.stream !== false):\n * Return async iterator that yields chunks as they arrive\n *\n * - If user wants non-streaming (params.stream === false):\n * Internally collect all SSE chunks and return complete response\n *\n * Note: Both paths read SSE format from API, just different consumption patterns\n */\n if (userWantsStreaming) {\n return parseAgentStreamingResponse(response);\n }\n\n // Non-streaming: Collect all chunks and return complete response\n return await parseAgentNonStreamingResponse(response);\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof SeacloudError) {\n throw error;\n }\n\n if ((error as Error).name === 'AbortError') {\n throw new SeacloudError(`Request timeout after ${timeoutMs}ms`);\n }\n\n throw new SeacloudError(\n `Request failed: ${(error as Error).message}`,\n undefined,\n error,\n );\n }\n}\n\n/**\n * Parse non-streaming response (API returns SSE even with stream: false)\n */\nasync function parseAgentNonStreamingResponse(\n response: Response\n): Promise<AgentChatCompletionResponse> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new SeacloudError('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let fullContent = '';\n let artifacts: AgentArtifact[] = [];\n let finishReason = '';\n let sessionId = '';\n let msgId = '';\n let lastChunk: AgentChatCompletionChunk | null = null;\n let usage: AgentUsage | undefined;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n if (!trimmedLine) continue;\n if (trimmedLine === 'data: [DONE]') continue;\n if (trimmedLine === 'event: heartbeat') continue;\n\n if (trimmedLine.startsWith('data: ')) {\n const data = trimmedLine.slice(6).trim();\n\n try {\n const parsed = JSON.parse(data) as AgentChatCompletionChunk;\n lastChunk = parsed;\n\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n if (typeof delta.content === 'string') {\n fullContent += delta.content;\n } else if (Array.isArray(delta.content)) {\n for (const item of delta.content) {\n if (item.type === 'text' && item.text) {\n fullContent += item.text;\n }\n }\n }\n }\n\n if (delta?.artifacts) {\n artifacts.push(...delta.artifacts);\n }\n\n if (parsed.choices?.[0]?.finish_reason) {\n finishReason = parsed.choices[0].finish_reason;\n }\n\n if (parsed.session_id) {\n sessionId = parsed.session_id;\n }\n\n if (parsed.msg_id) {\n msgId = parsed.msg_id;\n }\n\n if (parsed.usage) {\n usage = parsed.usage;\n }\n } catch (e) {\n // Skip invalid JSON\n console.warn('Failed to parse SSE chunk:', data.substring(0, 100));\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (!lastChunk) {\n throw new SeacloudError('No valid response chunks received');\n }\n\n return {\n id: lastChunk.id,\n object: 'chat.completion',\n created: lastChunk.created,\n model: lastChunk.model,\n system_fingerprint: lastChunk.system_fingerprint,\n choices: [\n {\n index: 0,\n message: {\n role: 'assistant',\n content: fullContent,\n },\n finish_reason: finishReason || null,\n },\n ],\n usage,\n session_id: sessionId || undefined,\n msg_id: msgId || undefined,\n artifacts: artifacts.length > 0 ? artifacts : undefined,\n };\n}\n\n/**\n * Parse streaming response into async iterable\n */\nasync function* parseAgentStreamingResponse(\n response: Response\n): AsyncIterable<AgentChatCompletionChunk> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new SeacloudError('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n // Skip empty lines and comments\n if (!trimmedLine || trimmedLine.startsWith(':')) continue;\n\n // Handle event type declarations (e.g., \"event: heartbeat\")\n if (trimmedLine.startsWith('event: ')) {\n const eventType = trimmedLine.slice(7).trim();\n if (eventType === 'heartbeat') {\n // Heartbeat events can be logged but don't yield\n continue;\n }\n }\n\n // Handle data events\n if (trimmedLine.startsWith('data: ')) {\n const data = trimmedLine.slice(6).trim();\n\n // Check for stream completion signal\n if (data === '[DONE]') {\n break;\n }\n\n try {\n const chunk = JSON.parse(data) as AgentChatCompletionChunk;\n yield chunk;\n } catch (error) {\n console.warn('Failed to parse SSE chunk:', data);\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Helper function to create a text message\n *\n * @param role - Message role ('user' | 'assistant' | 'developer' | 'tool')\n * @param text - Text content\n * @returns Agent message with text content\n *\n * @example\n * ```typescript\n * const message = createTextMessage('user', 'Hello!');\n * ```\n */\nexport function createTextMessage(role: AgentMessageRole, text: string): AgentMessage {\n return {\n role,\n content: [{ type: 'text', text }],\n };\n}\n\n/**\n * Helper function to create a message with image\n *\n * @param role - Message role ('user' | 'assistant' | 'developer' | 'tool')\n * @param text - Text content\n * @param imageUrl - Image URL\n * @returns Agent message with text and image content\n *\n * @example\n * ```typescript\n * const message = createImageMessage('user', 'What is this?', 'https://example.com/image.jpg');\n * ```\n */\nexport function createImageMessage(role: AgentMessageRole, text: string, imageUrl: string): AgentMessage {\n return {\n role,\n content: [\n { type: 'text', text },\n { type: 'image', image_url: imageUrl },\n ],\n };\n}\n\n/**\n * Helper function to create a message with video\n *\n * @param role - Message role\n * @param text - Text content\n * @param videoUrl - Video URL\n * @returns Agent message with text and video content\n */\nexport function createVideoMessage(role: AgentMessageRole, text: string, videoUrl: string): AgentMessage {\n return {\n role,\n content: [\n { type: 'text', text },\n { type: 'video', video_url: videoUrl },\n ],\n };\n}\n\n/**\n * Helper function to create a message with audio\n *\n * @param role - Message role\n * @param text - Text content\n * @param audioUrl - Audio URL\n * @returns Agent message with text and audio content\n */\nexport function createAudioMessage(role: AgentMessageRole, text: string, audioUrl: string): AgentMessage {\n return {\n role,\n content: [\n { type: 'text', text },\n { type: 'audio', audio_url: audioUrl },\n ],\n };\n}\n\n/**\n * Helper function to create a tool\n */\nexport function createTool(toolName: string): AgentTool {\n return {\n type: 'function',\n function: {\n name: toolName,\n },\n };\n}\n","import { getClient } from '../core/global-config.js';\n\n/**\n * 查询参数中的约束条件\n */\nexport interface TemplateSpecConstraint {\n /**\n * 默认值(任意类型)\n */\n default?: any;\n [key: string]: any;\n}\n\n/**\n * 模板输入参数定义\n */\nexport interface TemplateSpecInput {\n /**\n * 节点字段名称\n */\n field: string;\n /**\n * 节点字段id\n */\n node_id: string;\n /**\n * 节点class_type\n */\n node_type: string;\n /**\n * 作者节点字段自定义标题\n */\n title: string;\n /**\n * 节点字段类型\n */\n type: string;\n /**\n * 节点字段是否必须\n */\n required: boolean;\n /**\n * 约束条件\n */\n constraints?: TemplateSpecConstraint;\n}\n\n/**\n * 模板输出定义\n */\nexport interface TemplateSpecOutput {\n /**\n * 节点ID\n */\n node_id: string;\n /**\n * 节点类型\n */\n node_type: string;\n}\n\n/**\n * 模板详细信息\n */\nexport interface TemplateSpec {\n /**\n * 快应用ID\n */\n template_id: string;\n /**\n * 线上快应用名称\n */\n template_name: string;\n /**\n * 线上快应用描述\n */\n description: string;\n /**\n * 线上快应用版本\n */\n version: string;\n /**\n * 输入参数列表\n */\n inputs: TemplateSpecInput[];\n /**\n * 输出节点列表\n */\n outputs?: TemplateSpecOutput[];\n}\n\n/**\n * 快应用搜索请求参数\n */\nexport interface AppSearchParams {\n /**\n * 类型,默认值为 comfyui\n * @default \"comfyui\"\n */\n type?: string;\n /**\n * 快应用模板ID列表\n */\n template_ids: string[];\n}\n\n/**\n * 快应用搜索响应结果\n */\nexport interface AppSearchResponse {\n /**\n * 类型\n */\n type: string;\n /**\n * 模板信息列表\n */\n templates: TemplateSpec[];\n}\n\n/**\n * appSearch\n *\n * 快应用通过template_id查询参数\n *\n * 根据提供的模板ID列表,批量查询快应用的参数配置信息。\n * 返回每个模板的详细规格,包括输入参数定义、约束条件等。\n *\n * @example\n * ```typescript\n * import { initSeacloud, appSearch } from 'seacloud-sdk';\n *\n * initSeacloud('your-api-key');\n *\n * const result = await appSearch({\n * type: 'comfyui',\n * template_ids: ['template-id-1', 'template-id-2']\n * });\n *\n * console.log(result.templates);\n * ```\n *\n * @param params 请求参数\n * @returns 模板规格信息\n */\nexport async function appSearch(\n params: AppSearchParams,\n): Promise<AppSearchResponse> {\n const client = getClient();\n const config = client.getConfig();\n\n const url = `${config.baseUrl}/model/v1/template/specs`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeout);\n\n try {\n const requestId = `req-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n 'X-Request-Id': requestId,\n };\n\n // 仅在配置了 xProject 时添加 X-Project header\n if (config.xProject) {\n headers['X-Project'] = config.xProject;\n }\n\n const response = await config.fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(params),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`HTTP ${response.status}: ${errorBody}`);\n }\n\n const result = await response.json();\n return result as AppSearchResponse;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n\n// 保留旧的函数名作为别名,向后兼容\nexport const templateSpecs = appSearch;\nexport type TemplateSpecsParams = AppSearchParams;\nexport type TemplateSpecsResponse = AppSearchResponse;\n","import { getClient } from '../core/global-config.js';\nimport { SeacloudError } from '../core/types.js';\nimport { getApiToken } from '../core/config.js';\n\n/**\n * 风险类型枚举\n */\nexport type RiskType = 'POLITY' | 'EROTIC' | 'VIOLENT' | 'CHILD';\n\n/**\n * 标签项\n */\nexport interface LabelItem {\n /**\n * 标签名称,格式: 场景:类别:具体标签\n */\n name: string;\n /**\n * 标签对应的风险级别 (0-6)\n */\n score: number;\n /**\n * 标签所属的风险类型\n */\n risk_type: RiskType;\n}\n\n/**\n * 视频帧检测结果\n */\nexport interface FrameResult {\n /**\n * 帧索引号\n */\n frame_index: number;\n /**\n * 风险级别\n */\n nsfw_level: number;\n /**\n * 标签列表\n */\n label_items: LabelItem[];\n /**\n * 风险类型列表\n */\n risk_types: RiskType[];\n}\n\n/**\n * 内容安全检测请求参数\n *\n * 参数示例:\n * ```typescript\n * {\n * \"uri\": \"https://example.com/image.jpg\",\n * \"risk_types\": [\"POLITY\", \"EROTIC\", \"VIOLENT\", \"CHILD\"],\n * \"detected_age\": 0,\n * \"is_video\": 0\n * }\n * ```\n */\nexport interface ScanParams {\n /**\n * 图片或视频的URL地址\n * 注意:视频检测必须使用 uri,不支持 img_base64\n */\n uri?: string;\n /**\n * 图片的Base64编码字符串\n * 注意:视频检测不支持 base64 输入\n */\n img_base64?: string;\n /**\n * 需要检测的风险类型列表\n * 可选值:POLITY(政治敏感)、EROTIC(色情内容)、VIOLENT(暴力血腥)、CHILD(儿童安全)\n */\n risk_types: RiskType[];\n /**\n * 是否进行年龄检测,0或1\n * @default 0\n */\n detected_age: number;\n /**\n * 是否为视频文件,0或1\n * @default 0\n */\n is_video: number;\n}\n\n/**\n * 内容安全检测响应结果\n */\nexport interface ScanResponse {\n /**\n * 请求是否成功\n */\n ok: boolean;\n /**\n * 风险级别,范围 0-6\n */\n nsfw_level?: number;\n /**\n * 检测到的标签列表\n */\n label_items?: LabelItem[];\n /**\n * 实际检测到的风险类型列表\n */\n risk_types?: RiskType[];\n /**\n * 年龄组信息 [年龄段代码, 置信度]\n */\n age_group?: any[];\n /**\n * 错误信息\n */\n error?: string;\n /**\n * 视频时长(秒)\n */\n video_duration?: number;\n /**\n * 最高风险帧的索引号\n */\n max_risk_frame?: number;\n /**\n * 总抽帧数量\n */\n frame_count?: number;\n /**\n * 实际检测的帧数\n */\n frames_checked?: number;\n /**\n * 是否因检测到6级风险而提前退出\n */\n early_exit?: boolean;\n /**\n * 每一帧的详细检测结果\n */\n frame_results?: FrameResult[];\n}\n\n/**\n * scan - 内容安全检测\n *\n * 云服务内容安全检测接口,支持图片和视频的风险检测。\n *\n * Features:\n * - 支持图片和视频检测\n * - 多种风险类型检测(政治敏感、色情、暴力、儿童安全)\n * - 风险级别评分(0-6)\n * - 视频逐帧检测\n * - 可选年龄检测\n *\n * @example\n * ```typescript\n * import { initSeacloud, scan } from 'seacloud-sdk';\n *\n * initSeacloud('your-api-key');\n *\n * // 图片检测\n * const imageResult = await scan({\n * uri: \"https://example.com/image.jpg\",\n * risk_types: [\"POLITY\", \"EROTIC\", \"VIOLENT\", \"CHILD\"],\n * detected_age: 0,\n * is_video: 0\n * });\n *\n * console.log(imageResult.nsfw_level); // 风险级别 0-6\n * console.log(imageResult.label_items); // 检测到的标签\n *\n * // 视频检测\n * const videoResult = await scan({\n * uri: \"https://example.com/video.mp4\",\n * risk_types: [\"EROTIC\", \"VIOLENT\"],\n * detected_age: 0,\n * is_video: 1\n * });\n *\n * console.log(videoResult.frame_results); // 每一帧的检测结果\n * ```\n *\n * @param params 请求参数,详见 ScanParams 接口定义\n * @returns 检测结果,包含风险级别、标签等信息\n * @throws {SeacloudError} 当请求失败或参数不合法时抛出错误\n */\nexport async function scan(params: ScanParams): Promise<ScanResponse> {\n // 参数验证\n if (!params.uri && !params.img_base64) {\n throw new SeacloudError('必须提供 uri 或 img_base64 中的至少一个参数');\n }\n\n if (params.is_video === 1 && params.img_base64) {\n throw new SeacloudError('视频检测不支持 base64 输入,必须使用 uri 参数');\n }\n\n if (!params.risk_types || params.risk_types.length === 0) {\n throw new SeacloudError('必须提供至少一个风险类型');\n }\n\n const client = getClient();\n const config = client.getConfig();\n\n // 复用现有的认证和请求逻辑\n const url = `${config.baseUrl}/scan`;\n const token = await getApiToken(config.apiKey);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeout);\n\n try {\n const response = await config.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n },\n body: JSON.stringify(params),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new SeacloudError(\n `HTTP ${response.status}: ${errorBody}`,\n response.status,\n errorBody\n );\n }\n\n const responseData = await response.json() as any;\n\n // 检查是否有包装格式 { success, data }\n let result: ScanResponse;\n if (responseData.success !== undefined && responseData.data) {\n // 服务器返回了包装格式\n result = responseData.data as ScanResponse;\n } else {\n // 直接返回格式\n result = responseData as ScanResponse;\n }\n\n if (!result.ok) {\n throw new SeacloudError(\n `内容安全检测业务错误: ${result.error || '未知错误'}`,\n undefined,\n result\n );\n }\n\n return result;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof SeacloudError) {\n throw error;\n }\n\n if ((error as Error).name === 'AbortError') {\n throw new SeacloudError(`Request timeout after ${config.timeout}ms`);\n }\n\n throw new SeacloudError(\n `Request failed: ${(error as Error).message}`,\n undefined,\n error\n );\n }\n}\n","#!/usr/bin/env node\n\nimport { SeacloudClient } from './core/index.js';\nimport { initSeacloud } from './core/global-config.js';\nimport { llmChatCompletions } from './api/llm_chat_completions.js';\nimport { agentChatCompletions, createTextMessage } from './api/agent_chat_completions.js';\nimport { appSearch } from './api/app_search.js';\nimport { appGeneration } from './api/app_generation.js';\nimport { scan } from './api/scan.js';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\ninterface CliOptions {\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n params?: Record<string, any>;\n}\n\nfunction showHelp() {\n console.log(`\nSeaCloud CLI - Test AI models, LLM, and Agent from command line\n\nUsage:\n seacloud <command> [options]\n\nCommands:\n llm <prompt> Chat with LLM models\n agent <prompt> Chat with Fast Agent (supports image/video generation)\n app <subcommand> App-related operations (search, generation)\n scan <uri> Content safety scan (image/video/audio)\n status <task-id> Query task status by task ID\n <model> Test specific model generation\n\nApp Subcommands:\n app search <ids> Query template specifications by template IDs\n app generation Create generation task from template\n\nLLM Options:\n --model <name> Model name (default: seaart-mix-sonnet-4-5)\n --stream Enable streaming mode\n --temperature <n> Temperature 0-2 (default: 0.7)\n --max-tokens <n> Max tokens to generate\n\nAgent Options:\n --agent-id <id> Agent ID (default: seagen_agent)\n --model <name> Model name (default: gpt-4o)\n --stream Enable streaming mode\n --session-id <id> Session ID for multi-turn conversation\n\nApp Search Options:\n --type <type> Template type (default: comfyui)\n\nApp Generation Options:\n --template-id <id> Template ID (required)\n --params <json> Input parameters as JSON string (required)\n\nScan Options:\n --risk-types <types> Risk types (default: POLITY,EROTIC,VIOLENT,CHILD)\n --detected-age Enable age detection (default: false)\n --api-key <key> API key (or set API_SERVICE_TOKEN env var)\n --base-url <url> Base URL (default: http://proxy.sg.seaverse.dev)\n\nModel Generation Options:\n --api-key <key> API key (or set API_SERVICE_TOKEN env var)\n --base-url <url> Base URL (default: http://proxy.sg.seaverse.dev)\n --params <json> JSON parameters for the model\n\nStatus Query Options:\n --api-key <key> API key (or set API_SERVICE_TOKEN env var)\n --base-url <url> Base URL (default: http://proxy.sg.seaverse.dev)\n\nExamples:\n # Chat with LLM (non-streaming)\n seacloud llm \"What is the capital of France?\"\n\n # Chat with LLM (streaming)\n seacloud llm \"Tell me a story\" --stream\n\n # Chat with LLM using specific model\n seacloud llm \"Hello\" --model deepseek-v3.1 --temperature 1.0\n\n # Chat with Agent (can generate images)\n seacloud agent \"Generate an image of a sunset\"\n\n # Chat with Agent (streaming)\n seacloud agent \"Create a cat image\" --stream\n\n # Query template specifications (app search)\n seacloud app search \"template-id-1,template-id-2\"\n seacloud app search \"template-abc\" --type comfyui\n\n # Create generation task (app generation)\n seacloud app generation --template-id \"d26trpte878eqsnm3bjg\" --params '[{\"field\":\"prompt1\",\"value\":\"hello\"}]'\n\n # Query task status\n seacloud status d123456789abcdef\n\n # Scan image\n seacloud scan \"https://example.com/image.jpg\"\n\n # Scan video with custom risk types\n seacloud scan \"https://example.com/video.mp4\" --risk-types EROTIC,VIOLENT\n\n # Scan with age detection\n seacloud scan \"https://example.com/photo.jpg\" --detected-age\n\n # Test model generation\n seacloud flux_1_1_pro --params '{\"prompt\":\"a beautiful sunset\"}'\n\n # Use custom API key\n seacloud llm \"Hello\" --api-key sa-xxx\n\nEnvironment Variables:\n API_SERVICE_TOKEN API authentication token (required)\n SEACLOUD_BASE_URL Base URL for API endpoints\n`);\n}\n\nfunction parseArgs(args: string[]): CliOptions {\n const options: CliOptions = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case '--api-key':\n options.apiKey = args[++i];\n break;\n case '--base-url':\n options.baseUrl = args[++i];\n break;\n case '--model':\n options.model = args[++i];\n break;\n case '--params':\n try {\n options.params = JSON.parse(args[++i]);\n } catch (e) {\n console.error('Error: Invalid JSON for --params');\n process.exit(1);\n }\n break;\n }\n }\n\n return options;\n}\n\nasync function testModel(model: string, options: CliOptions) {\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n if (!options.params) {\n console.error('Error: --params required. Provide JSON parameters for the model');\n process.exit(1);\n }\n\n console.log(`Testing model: ${model}`);\n console.log(`Base URL: ${baseUrl}`);\n console.log(`Parameters:`, JSON.stringify(options.params, null, 2));\n console.log('');\n\n const client = new SeacloudClient({ apiKey, baseUrl });\n\n try {\n console.log('Creating task...');\n const task = await client.createTask('/model/v1/generation', {\n model,\n input: [{ params: options.params }],\n });\n\n console.log(`Task created: ${task.id}`);\n console.log(`Initial status: ${task.status}`);\n console.log('');\n\n if (task.status === 'failed') {\n console.error('Task failed immediately:', task.error);\n process.exit(1);\n }\n\n console.log('Polling for results...');\n let attempt = 0;\n const maxAttempts = 120;\n const intervalMs = 3000;\n\n while (attempt < maxAttempts) {\n attempt++;\n\n const result = await client.getTaskStatus('/model/v1/generation', task.id);\n process.stdout.write(`\\rAttempt ${attempt}/${maxAttempts} - Status: ${result.status} `);\n\n if (result.status === 'completed') {\n console.log('\\n\\nTask completed!');\n console.log('\\nResults:');\n console.log(JSON.stringify(result.output, null, 2));\n\n // Extract URLs if available\n if (result.output) {\n const urls: string[] = [];\n for (const item of result.output) {\n if (item.content) {\n for (const resource of item.content) {\n if (resource.url) {\n urls.push(resource.url);\n }\n }\n }\n }\n\n if (urls.length > 0) {\n console.log('\\nGenerated URLs:');\n urls.forEach((url, i) => {\n console.log(` ${i + 1}. ${url}`);\n });\n }\n }\n\n process.exit(0);\n }\n\n if (result.status === 'failed') {\n console.log('\\n\\nTask failed!');\n console.error('Error:', result.error);\n process.exit(1);\n }\n\n await new Promise(resolve => setTimeout(resolve, intervalMs));\n }\n\n console.log('\\n\\nTimeout: Task did not complete within the time limit');\n process.exit(1);\n\n } catch (error: any) {\n console.error('\\nError:', error.message);\n process.exit(1);\n }\n}\n\nasync function runLlm(prompt: string, args: string[]) {\n const options: any = { stream: false, model: 'seaart-mix-sonnet-4-5', temperature: 0.7 };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--model') options.model = args[++i];\n else if (arg === '--stream') options.stream = true;\n else if (arg === '--temperature') options.temperature = parseFloat(args[++i]);\n else if (arg === '--max-tokens') options.maxTokens = parseInt(args[++i]);\n else if (arg === '--api-key') options.apiKey = args[++i];\n else if (arg === '--base-url') options.baseUrl = args[++i];\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n initSeacloud(apiKey, { baseUrl, timeout: 120000 });\n\n console.log(`Model: ${options.model}`);\n console.log(`Prompt: ${prompt}\\n`);\n\n if (options.stream) {\n const stream = await llmChatCompletions({\n model: options.model,\n messages: [{ role: 'user', content: prompt }],\n stream: true,\n temperature: options.temperature,\n max_tokens: options.maxTokens,\n });\n\n process.stdout.write('Response: ');\n for await (const chunk of stream) {\n const content = chunk.choices[0]?.delta?.content;\n if (typeof content === 'string') process.stdout.write(content);\n }\n console.log('\\n');\n } else {\n const response = await llmChatCompletions({\n model: options.model,\n messages: [{ role: 'user', content: prompt }],\n stream: false,\n temperature: options.temperature,\n max_tokens: options.maxTokens,\n });\n\n console.log('Response:', response.choices[0].message.content);\n console.log('\\nUsage:', response.usage);\n }\n}\n\nasync function runAgent(prompt: string, args: string[]) {\n const options: any = {\n stream: false,\n model: 'gpt-4o',\n agentId: 'seagen_agent',\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--model') options.model = args[++i];\n else if (arg === '--stream') options.stream = true;\n else if (arg === '--agent-id') options.agentId = args[++i];\n else if (arg === '--session-id') options.sessionId = args[++i];\n else if (arg === '--api-key') options.apiKey = args[++i];\n else if (arg === '--base-url') options.baseUrl = args[++i];\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n initSeacloud(apiKey, { baseUrl, timeout: 300000 }); // 5 min for agent\n\n console.log(`Agent: ${options.agentId}`);\n console.log(`Model: ${options.model}`);\n console.log(`Prompt: ${prompt}\\n`);\n\n if (options.stream) {\n const stream = await agentChatCompletions({\n agent_id: options.agentId,\n messages: [createTextMessage('user', prompt)],\n model: options.model,\n stream: true,\n session_id: options.sessionId,\n seq: 0,\n });\n\n process.stdout.write('Response: ');\n for await (const chunk of stream) {\n const content = chunk.choices[0]?.delta?.content;\n if (typeof content === 'string') process.stdout.write(content);\n }\n console.log('\\n');\n } else {\n const response = await agentChatCompletions({\n agent_id: options.agentId,\n messages: [createTextMessage('user', prompt)],\n model: options.model,\n stream: false,\n session_id: options.sessionId,\n seq: 0,\n });\n\n console.log('Response:', response.choices[0].message.content);\n\n if (response.artifacts && response.artifacts.length > 0) {\n console.log('\\nGenerated Artifacts:');\n response.artifacts.forEach((artifact, i) => {\n console.log(` ${i + 1}. ${artifact.name}`);\n console.log(` URL: ${artifact.url}`);\n });\n }\n\n console.log('\\nSession ID:', response.session_id);\n console.log('Message ID:', response.msg_id);\n }\n}\n\nasync function runAppGeneration(args: string[]) {\n const options: any = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--template-id') options.templateId = args[++i];\n else if (arg === '--params') {\n try {\n options.params = JSON.parse(args[++i]);\n } catch (e) {\n console.error('Error: --params must be valid JSON array');\n console.error('Example: --params \\'[{\"field\":\"prompt1\",\"value\":\"hello\"}]\\'');\n process.exit(1);\n }\n }\n else if (arg === '--api-key') options.apiKey = args[++i];\n else if (arg === '--base-url') options.baseUrl = args[++i];\n }\n\n if (!options.templateId) {\n console.error('Error: --template-id required');\n console.error('Usage: seacloud app generation --template-id <id> --params <json>');\n process.exit(1);\n }\n\n if (!options.params) {\n console.error('Error: --params required');\n console.error('Usage: seacloud app generation --template-id <id> --params <json>');\n console.error('Example: --params \\'[{\"field\":\"prompt1\",\"value\":\"hello\"}]\\'');\n process.exit(1);\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n const client = new SeacloudClient({ apiKey, baseUrl });\n\n try {\n console.log('Creating task...');\n const task = await client.createTask('/model/v1/generation', {\n model: 'comfyui',\n input: [{ params: { template_id: options.templateId, inputs: options.params } }],\n });\n\n console.log(`Task created: ${task.id}`);\n console.log(`Initial status: ${task.status}`);\n console.log('');\n\n if (task.status === 'failed') {\n console.error('Task failed immediately:', task.error);\n process.exit(1);\n }\n\n console.log('Polling for results...');\n let attempt = 0;\n const maxAttempts = 120;\n const intervalMs = 3000;\n\n while (attempt < maxAttempts) {\n attempt++;\n\n const result = await client.getTaskStatus('/model/v1/generation', task.id);\n process.stdout.write(`\\rAttempt ${attempt}/${maxAttempts} - Status: ${result.status} `);\n\n if (result.status === 'completed') {\n console.log('\\n\\nTask completed!');\n console.log('\\nResults:');\n console.log(JSON.stringify(result, null, 2));\n\n process.exit(0);\n }\n\n if (result.status === 'failed') {\n console.log('\\n\\nTask failed!');\n console.error('Error:', result.error);\n process.exit(1);\n }\n\n await new Promise(resolve => setTimeout(resolve, intervalMs));\n }\n\n console.log('\\n\\nTimeout: Task did not complete within the time limit');\n process.exit(1);\n\n } catch (error: any) {\n console.error('\\nError:', error.message);\n process.exit(1);\n }\n}\n\nasync function runAppSearch(templateIdsStr: string, args: string[]) {\n const options: any = { type: 'comfyui' };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--type') options.type = args[++i];\n else if (arg === '--api-key') options.apiKey = args[++i];\n else if (arg === '--base-url') options.baseUrl = args[++i];\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n initSeacloud(apiKey, { baseUrl });\n\n const templateIds = templateIdsStr.split(',').map(id => id.trim());\n\n const result = await appSearch({\n type: options.type,\n template_ids: templateIds,\n });\n\n console.log(JSON.stringify(result, null, 2));\n}\n\n/**\n * 检测 URI 是否为视频或音频\n */\nfunction detectMediaType(uri: string): { isVideo: number; mediaType: string } {\n // 视频扩展名正则(不区分大小写)\n const videoExtRegex = /\\.(?:mp4|avi|mkv|mov|flv|wmv|webm|m4v|3gp|ts|mts|mpeg|mpg|vob|ogv|m2ts|divx|rm|rmvb|asf|f4v)(?:[^a-z0-9]|$)/i;\n\n // 音频扩展名正则(不区分大小写)\n const audioExtRegex = /\\.(?:mp3|wav|ogg|m4a|aac|flac|wma|m4b|m4p|m4r)(?:[^a-z0-9]|$)/i;\n\n if (videoExtRegex.test(uri)) {\n return { isVideo: 1, mediaType: 'video' };\n }\n\n if (audioExtRegex.test(uri)) {\n return { isVideo: 1, mediaType: 'audio' };\n }\n\n return { isVideo: 0, mediaType: 'image' };\n}\n\nasync function runScan(uri: string, args: string[]) {\n const options: any = {\n riskTypes: ['POLITY', 'EROTIC', 'VIOLENT', 'CHILD'],\n detectedAge: false,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--risk-types') {\n options.riskTypes = args[++i].split(',').map((t: string) => t.trim());\n } else if (arg === '--detected-age') {\n options.detectedAge = true;\n } else if (arg === '--api-key') {\n options.apiKey = args[++i];\n } else if (arg === '--base-url') {\n options.baseUrl = args[++i];\n }\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n initSeacloud(apiKey, { baseUrl });\n\n // 自动检测媒体类型\n const { isVideo, mediaType } = detectMediaType(uri);\n\n console.log(`资源地址: ${uri}`);\n console.log(`媒体类型: ${mediaType}`);\n console.log(`风险类型: ${options.riskTypes.join(', ')}`);\n console.log(`年龄检测: ${options.detectedAge ? '启用' : '禁用'}`);\n console.log('');\n\n try {\n const result = await scan({\n uri,\n risk_types: options.riskTypes,\n detected_age: options.detectedAge ? 1 : 0,\n is_video: isVideo,\n });\n\n console.log('✅ 扫描完成!\\n');\n console.log(`请求状态: ${result.ok ? '成功' : '失败'}`);\n\n if (result.nsfw_level !== undefined) {\n console.log(`风险级别: ${result.nsfw_level} (0-6)`);\n }\n\n if (result.risk_types && result.risk_types.length > 0) {\n console.log(`检测到的风险类型: ${result.risk_types.join(', ')}`);\n }\n\n if (result.age_group && result.age_group.length > 0) {\n console.log(`年龄组: ${JSON.stringify(result.age_group)}`);\n }\n\n // 视频特有字段\n if (isVideo === 1) {\n if (result.video_duration !== undefined) {\n console.log(`视频时长: ${result.video_duration} 秒`);\n }\n if (result.frame_count !== undefined) {\n console.log(`总抽帧数: ${result.frame_count}`);\n }\n if (result.frames_checked !== undefined) {\n console.log(`实际检测帧数: ${result.frames_checked}`);\n }\n if (result.max_risk_frame !== undefined) {\n console.log(`最高风险帧索引: ${result.max_risk_frame}`);\n }\n if (result.early_exit !== undefined) {\n console.log(`提前退出: ${result.early_exit ? '是' : '否'}`);\n }\n }\n\n // 显示标签详情\n if (result.label_items && result.label_items.length > 0) {\n console.log(`\\n检测到的标签 (${result.label_items.length} 个):`);\n result.label_items.forEach((item, i) => {\n console.log(` ${i + 1}. ${item.name}`);\n console.log(` 风险级别: ${item.score}, 类型: ${item.risk_type}`);\n });\n }\n\n // 显示帧检测结果(前5帧)\n if (result.frame_results && result.frame_results.length > 0) {\n console.log(`\\n帧检测结果 (前5帧):`);\n result.frame_results.slice(0, 5).forEach((frame) => {\n console.log(` 帧 ${frame.frame_index}: 风险级别 ${frame.nsfw_level}, 标签数 ${frame.label_items.length}`);\n });\n if (result.frame_results.length > 5) {\n console.log(` ... 还有 ${result.frame_results.length - 5} 帧结果`);\n }\n }\n\n if (result.error) {\n console.log(`\\n❌ 错误: ${result.error}`);\n }\n\n } catch (error: any) {\n console.error('\\n❌ 扫描失败:', error.message);\n process.exit(1);\n }\n}\n\nasync function runTaskStatus(taskId: string, args: string[]) {\n const options: any = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--api-key') options.apiKey = args[++i];\n else if (arg === '--base-url') options.baseUrl = args[++i];\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n const client = new SeacloudClient({ apiKey, baseUrl });\n\n console.log(`Querying task status...`);\n console.log(`Task ID: ${taskId}`);\n console.log(`Base URL: ${baseUrl}\\n`);\n\n try {\n const result = await client.getTaskStatus('/model/v1/generation', taskId);\n\n console.log(`Status: ${result.status}`);\n console.log(`Task ID: ${result.id}\\n`);\n\n if (result.status === 'completed') {\n console.log('✅ Task completed successfully!\\n');\n console.log('Output:');\n console.log(JSON.stringify(result.output, null, 2));\n\n // Extract URLs if available\n if (result.output) {\n const urls: string[] = [];\n for (const item of result.output) {\n if (item.content) {\n for (const resource of item.content) {\n if (resource.url) {\n urls.push(resource.url);\n }\n }\n }\n }\n\n if (urls.length > 0) {\n console.log('\\nGenerated URLs:');\n urls.forEach((url, i) => {\n console.log(` ${i + 1}. ${url}`);\n });\n }\n }\n } else if (result.status === 'failed') {\n console.log('❌ Task failed!\\n');\n console.log('Error:', JSON.stringify(result.error, null, 2));\n } else if (result.status === 'processing') {\n console.log('⏳ Task is still processing...');\n console.log('Please check again later.');\n } else if (result.status === 'pending') {\n console.log('⏳ Task is pending...');\n console.log('Please check again later.');\n } else {\n console.log('Full result:');\n console.log(JSON.stringify(result, null, 2));\n }\n\n } catch (error: any) {\n console.error('\\nError querying task status:', error.message);\n if (error.statusCode) {\n console.error('HTTP Status Code:', error.statusCode);\n }\n process.exit(1);\n }\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {\n showHelp();\n process.exit(0);\n }\n\n const command = args[0];\n\n try {\n if (command === 'llm') {\n if (args.length < 2) {\n console.error('Error: prompt required for llm command');\n console.log('Usage: seacloud llm \"<prompt>\" [options]');\n process.exit(1);\n }\n await runLlm(args[1], args.slice(2));\n } else if (command === 'agent') {\n if (args.length < 2) {\n console.error('Error: prompt required for agent command');\n console.log('Usage: seacloud agent \"<prompt>\" [options]');\n process.exit(1);\n }\n await runAgent(args[1], args.slice(2));\n } else if (command === 'scan') {\n if (args.length < 2) {\n console.error('Error: URI required for scan command');\n console.log('Usage: seacloud scan \"<uri>\" [options]');\n process.exit(1);\n }\n await runScan(args[1], args.slice(2));\n } else if (command === 'status') {\n if (args.length < 2) {\n console.error('Error: task ID required for status command');\n console.log('Usage: seacloud status <task-id> [options]');\n process.exit(1);\n }\n await runTaskStatus(args[1], args.slice(2));\n } else if (command === 'app') {\n const subcommand = args[1];\n if (!subcommand) {\n console.error('Error: subcommand required for app command');\n console.log('Usage: seacloud app <subcommand> [options]');\n console.log('Subcommands: search, generation');\n process.exit(1);\n }\n\n if (subcommand === 'search') {\n if (args.length < 3) {\n console.error('Error: template IDs required for app search command');\n console.log('Usage: seacloud app search \"<id1,id2,...>\" [options]');\n process.exit(1);\n }\n await runAppSearch(args[2], args.slice(3));\n } else if (subcommand === 'generation') {\n await runAppGeneration(args.slice(2));\n } else {\n console.error(`Error: unknown subcommand '${subcommand}'`);\n console.log('Available subcommands: search, generation');\n process.exit(1);\n }\n } else {\n // Model generation command\n const model = command;\n\n if (model.startsWith('--')) {\n console.error('Error: command or model name required');\n console.log('Usage: seacloud <command> [options]');\n process.exit(1);\n }\n\n const options = parseArgs(args.slice(1));\n await testModel(model, options);\n }\n } catch (error: any) {\n console.error('\\nError:', error.message);\n process.exit(1);\n }\n}\n\nmain().catch(console.error);\n"]}
1
+ {"version":3,"sources":["../src/core/types.ts","../src/core/config.ts","../src/core/version.ts","../src/core/client.ts","../src/core/global-config.ts","../src/api/llm_chat_completions.ts","../src/api/agent_chat_completions.ts","../src/api/app_search.ts","../src/api/scan.ts","../src/cli.ts"],"names":["__filename"],"mappings":";;;;;AA8EO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,WAAA,CACE,OAAA,EACO,UAAA,EACA,QAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHN,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF,CAAA;;;AClFA,SAAS,UAAA,GAAsB;AAC7B,EAAA,IAAI;AACF,IAAA,OAAO,OAAQ,WAAmB,MAAA,KAAW,WAAA,IACrC,WAAmB,MAAA,CAAO,IAAA,KAAU,WAAmB,MAAA,CAAO,GAAA;AAAA,EACxE,SAAS,CAAA,EAAG;AAEV,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAcA,eAAe,kBAAA,CAAmB,UAAkB,GAAA,EAA8B;AAChF,EAAA,IAAI,CAAC,YAAW,EAAG;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAwB;AAE9C,MAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,gBAAA,EAAkB;AACtD,QAAA,OAAA,EAAQ;AAER,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,WAAA;AAClC,QAAA,OAAA,CAAQ,SAAS,IAAI,CAAA;AAAA,MACvB,WAAW,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,gBAAA,EAAkB;AAE7D,QAAA,OAAA,EAAQ;AACR,QAAA,OAAA,CAAQ,IAAA,CAAK,iDAAA,EAAmD,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAChF,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM;AACjC,MAAA,OAAA,EAAQ;AACR,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,GAAG,OAAO,CAAA;AAEV,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAC,UAAA,CAAmB,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,cAAc,CAAA;AAAA,IAC1E,CAAA;AAGA,IAAC,UAAA,CAAmB,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,cAAc,CAAA;AAGrE,IAAA,IAAI;AACF,MAAC,UAAA,CAAmB,OAAO,MAAA,CAAO,WAAA;AAAA,QAChC,EAAE,MAAM,oBAAA,EAAqB;AAAA,QAC7B;AAAA;AAAA,OACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,EAAQ;AACR,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd;AAAA,EACF,CAAC,CAAA;AACH;AAcA,eAAsB,iBAAA,CAAkB,UAAkB,GAAA,EAA8B;AACtF,EAAA,IAAI,CAAC,YAAW,EAAG;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAwB;AAE9C,MAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,eAAA,EAAiB;AACrD,QAAA,OAAA,EAAQ;AAER,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAA;AACjC,QAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,MACtB,WAAW,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,gBAAA,EAAkB;AAE7D,QAAA,OAAA,EAAQ;AACR,QAAA,OAAA,CAAQ,IAAA,CAAK,gDAAA,EAAkD,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC/E,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM;AACjC,MAAA,OAAA,EAAQ;AACR,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,GAAG,OAAO,CAAA;AAEV,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAC,UAAA,CAAmB,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,cAAc,CAAA;AAAA,IAC1E,CAAA;AAGA,IAAC,UAAA,CAAmB,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,cAAc,CAAA;AAGrE,IAAA,IAAI;AACF,MAAC,UAAA,CAAmB,OAAO,MAAA,CAAO,WAAA;AAAA,QAChC,EAAE,MAAM,mBAAA,EAAoB;AAAA,QAC5B;AAAA;AAAA,OACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,EAAQ;AACR,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd;AAAA,EACF,CAAC,CAAA;AACH;AAcA,eAAsB,YAAY,cAAA,EAAsD;AAEtF,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAO,cAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAQ,UAAA,CAAmB,MAAA,KAAW,eAAe,OAAQ,UAAA,CAAmB,iBAAiB,WAAA,EAAa;AAChH,IAAA,IAAI;AACF,MAAA,MAAM,iBAAA,GAAqB,UAAA,CAAmB,YAAA,CAAa,OAAA,CAAQ,YAAY,CAAA;AAC/E,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,OAAO,iBAAA;AAAA,MACT;AAAA,IACF,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,KAAK,iBAAA,EAAmB;AACpE,IAAA,OAAO,QAAQ,GAAA,CAAI,iBAAA;AAAA,EACrB;AAGA,EAAA,IAAI,OAAQ,UAAA,CAAmB,MAAA,KAAW,WAAA,EAAa;AACrD,IAAA,MAAM,WAAA,GAAc,MAAM,kBAAA,EAAmB;AAC7C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,OAAO,EAAA;AAST;AAOO,SAAS,YAAA,CAAa,OAAA,GAA0B,EAAC,EAA6B;AAEnF,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AAGvB,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,KACP,OAAO,YAAY,WAAA,GAAc,OAAA,CAAQ,GAAA,EAAK,iBAAA,GAAoB,MAAA,CAAA,IACnE,8BAAA;AAIhB,EAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,KAAU,UAAA,CAAW,QAAQ,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA,CAAA;AAE3F,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,MAAM,mGAAmG,CAAA;AAAA,EACrH;AAEA,EAAA,OAAO;AAAA,IACL,QAAQ,MAAA,IAAU,EAAA;AAAA;AAAA,IAClB,OAAA;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,QAAQ,OAAA,IAAW,GAAA;AAAA,IAC5B,QAAA,EAAU,QAAQ,QAAA,IAAY;AAAA,GAChC;AACF;AAOO,SAAS,eAAe,MAAA,EAAwC;AAGrE,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,UAAA,EAAY;AACtC,IAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,EAC5C;AACF;;;ACtOO,IAAM,OAAA,GAAU,OAAA;;;ACKhB,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAI1B,WAAA,CAAY,MAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,aAAa,MAAM,CAAA;AACjC,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,MAAA;AAC7B,IAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAG1B,IAAA,MAAM,YAAY,OAAQ,UAAA,CAAmB,WAAW,WAAA,IACtC,OAAQ,WAAmB,YAAA,KAAiB,WAAA;AAG9D,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,IAAI,mCAAA,EAAqC;AAAA,QAC/C,OAAA,EAAS,OAAA;AAAA,QACT,WAAA,EAAa,SAAA;AAAA,QACb,WAAA,EAAa,yBAAA;AAAA,QACb,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,eAAA,EAAiB,CAAC,CAAC,IAAA,CAAK;AAAA,OACzB,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAA,CAAW,QAAA,EAAkB,IAAA,EAAgD;AACjF,IAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,GAAG,QAAQ,CAAA,CAAA;AAG7C,IAAA,MAAM,YAAA,GAAe,MAAM,WAAA,CAAY,IAAA,CAAK,cAAc,CAAA;AAE1D,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,GAAA,EAAK;AAAA,QAC5C,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,eAAA,EAAiB,UAAU,YAAY,CAAA;AAAA,SACzC;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,UACrC,QAAA,CAAS,MAAA;AAAA,UACT;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,IAAK,KAAA,CAAgB,SAAS,YAAA,EAAc;AAC1C,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,sBAAA,EAAyB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,MAC1E;AAEA,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,gBAAA,EAAoB,MAAgB,OAAO,CAAA,CAAA;AAAA,QAC3C,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAA,CAAc,QAAA,EAAkB,MAAA,EAAqC;AACzE,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG,QAAQ,SAAS,MAAM,CAAA,CAAA;AAG5D,IAAA,MAAM,YAAA,GAAe,MAAM,WAAA,CAAY,IAAA,CAAK,cAAc,CAAA;AAE1D,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,GAAA,EAAK;AAAA,QAC5C,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,UAAU,YAAY,CAAA;AAAA,SACzC;AAAA,QACA,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,UACrC,QAAA,CAAS,MAAA;AAAA,UACT;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,IAAK,KAAA,CAAgB,SAAS,YAAA,EAAc;AAC1C,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,sBAAA,EAAyB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,MAC1E;AAEA,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,gBAAA,EAAoB,MAAgB,OAAO,CAAA,CAAA;AAAA,QAC3C,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAgD;AAC9C,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AACF,CAAA;;;AC5IA,IAAM,YAAA,GAA6B;AAAA,EACjC,MAAA,EAAQ,IAAA;AAAA,EACR,qBAAA,EAAuB;AAAA,IACrB,UAAA,EAAY,GAAA;AAAA;AAAA,IACZ,WAAA,EAAa;AAAA;AAAA;AAEjB,CAAA;AA2CA,eAAsB,YAAA,CACpB,gBACA,OAAA,EAMyB;AACzB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,MAAA;AAGJ,EAAA,IAAI,OAAO,mBAAmB,QAAA,EAAU;AAEtC,IAAA,MAAA,GAAS,cAAA;AACT,IAAA,MAAA,GAAS,WAAW,EAAC;AAAA,EACvB,CAAA,MAAA,IAAW,cAAA,IAAkB,OAAO,cAAA,KAAmB,QAAA,EAAU;AAE/D,IAAA,MAAA,GAAS,cAAA;AACT,IAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,EAClB,CAAA,MAAO;AAEL,IAAA,MAAA,GAAS,EAAC;AACV,IAAA,MAAA,GAAS,MAAA;AAAA,EACX;AAGA,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,GAAI,CAAA;AAE/C,MAAA,IAAI,UAAA,EAAY;AAGd,QAAA,MAAM,gBACJ,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,IAC/B,UAAA,CAAW,SAAS,WAAW,CAAA,IAC/B,WAAW,QAAA,CAAS,OAAO,KAC3B,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,IAC3B,UAAA,CAAW,SAAS,cAAc,CAAA;AAGpC,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,MAAA,CAAO,OAAA,GAAU,kCAAA;AACjB,UAAA,OAAA,CAAQ,GAAA,CAAI,kGAAA,EAAwC,MAAA,CAAO,OAAO,CAAA;AAAA,QACpE,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,OAAA,GAAU,8BAAA;AACjB,UAAA,OAAA,CAAQ,GAAA,CAAI,kGAAA,EAAwC,MAAA,CAAO,OAAO,CAAA;AAAA,QACpE;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,IAAA,CAAK,6GAAuC,KAAK,CAAA;AAAA,IAC3D;AAAA,EACF;AAGA,EAAA,YAAA,CAAa,MAAA,GAAS,IAAI,cAAA,CAAO;AAAA,IAC/B,QAAQ,MAAA,IAAU,EAAA;AAAA,IAClB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO;AAAA,GAClB,CAAA;AAGD,EAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,IAAA,YAAA,CAAa,qBAAA,CAAsB,aAAa,MAAA,CAAO,UAAA;AAAA,EACzD;AACA,EAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACpC,IAAA,YAAA,CAAa,qBAAA,CAAsB,cAAc,MAAA,CAAO,WAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,YAAA,CAAa,MAAA;AACtB;AAUO,SAAS,SAAA,GAA4B;AAE1C,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,OAAO,YAAA,CAAa,MAAA;AAAA,EACtB;AAGA,EAAA,OAAO,IAAI,cAAA,CAAO;AAAA;AAAA;AAAA;AAAA,GAIjB,CAAA;AACH;;;AC+MA,eAAsB,mBACpB,MAAA,EACsE;AACtE,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAEhC,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,qBAAA,CAAA;AAG7B,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA;AAG7C,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA;AAE3C,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAEhE,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,eAAA,EAAiB,UAAU,KAAK,CAAA;AAAA,OAClC;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,MAC3B,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AAED,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,QACrC,QAAA,CAAS,MAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,OAAO,uBAAuB,QAAQ,CAAA;AAAA,IACxC;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAK,KAAA,CAAgB,SAAS,YAAA,EAAc;AAC1C,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,sBAAA,EAAyB,SAAS,CAAA,EAAA,CAAI,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,CAAA,gBAAA,EAAoB,MAAgB,OAAO,CAAA,CAAA;AAAA,MAC3C,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAKA,gBAAgB,uBACd,QAAA,EACoC;AACpC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,cAAc,+BAA+B,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAE1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAG/B,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,WAAA,GAAc,KAAK,IAAA,EAAK;AAE9B,QAAA,IAAI,CAAC,WAAA,EAAa;AAClB,QAAA,IAAI,gBAAgB,cAAA,EAAgB;AAEpC,QAAA,IAAI,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA,EAAG;AACpC,UAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA;AACnC,UAAA,IAAI;AACF,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,YAAA,MAAM,KAAA;AAAA,UACR,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,IAAA,CAAK,8BAA8B,OAAO,CAAA;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;;;AC8aA,eAAsB,qBACpB,MAAA,EACgF;AAChF,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAEhC,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,8BAAA,CAAA;AAY7B,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,2CAAA;AAS9B,EAAA,MAAM,kBAAA,GAAqB,OAAO,MAAA,KAAW,KAAA;AAC7C,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,GAAG,MAAA;AAAA,IACH,KAAA;AAAA,IACA,MAAA,EAAQ;AAAA;AAAA,GACV;AAeA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA;AAE3C,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAEhE,EAAA,IAAI;AAOF,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,KAC1C;AAGA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,OAAA,CAAQ,WAAW,IAAI,MAAA,CAAO,QAAA;AAAA,IAChC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AAAA,MAChC,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AAED,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,QACrC,QAAA,CAAS,MAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAgBA,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,OAAO,4BAA4B,QAAQ,CAAA;AAAA,IAC7C;AAGA,IAAA,OAAO,MAAM,+BAA+B,QAAQ,CAAA;AAAA,EACtD,SAAS,KAAA,EAAO;AACd,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAK,KAAA,CAAgB,SAAS,YAAA,EAAc;AAC1C,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,sBAAA,EAAyB,SAAS,CAAA,EAAA,CAAI,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,CAAA,gBAAA,EAAoB,MAAgB,OAAO,CAAA,CAAA;AAAA,MAC3C,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAKA,eAAe,+BACb,QAAA,EACsC;AACtC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,cAAc,+BAA+B,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,IAAI,YAA6B,EAAC;AAClC,EAAA,IAAI,YAAA,GAAe,EAAA;AACnB,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,SAAA,GAA6C,IAAA;AACjD,EAAA,IAAI,KAAA;AAEJ,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAE1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAG/B,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,WAAA,GAAc,KAAK,IAAA,EAAK;AAE9B,QAAA,IAAI,CAAC,WAAA,EAAa;AAClB,QAAA,IAAI,gBAAgB,cAAA,EAAgB;AACpC,QAAA,IAAI,gBAAgB,kBAAA,EAAoB;AAExC,QAAA,IAAI,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA,EAAG;AACpC,UAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAEvC,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,YAAA,SAAA,GAAY,MAAA;AAEZ,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA,EAAG,KAAA;AAEnC,YAAA,IAAI,OAAO,OAAA,EAAS;AAClB,cAAA,IAAI,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,EAAU;AACrC,gBAAA,WAAA,IAAe,KAAA,CAAM,OAAA;AAAA,cACvB,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACvC,gBAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,OAAA,EAAS;AAChC,kBAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,IAAA,EAAM;AACrC,oBAAA,WAAA,IAAe,IAAA,CAAK,IAAA;AAAA,kBACtB;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAEA,YAAA,IAAI,OAAO,SAAA,EAAW;AACpB,cAAA,SAAA,CAAU,IAAA,CAAK,GAAG,KAAA,CAAM,SAAS,CAAA;AAAA,YACnC;AAEA,YAAA,IAAI,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA,EAAG,aAAA,EAAe;AACtC,cAAA,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,aAAA;AAAA,YACnC;AAEA,YAAA,IAAI,OAAO,UAAA,EAAY;AACrB,cAAA,SAAA,GAAY,MAAA,CAAO,UAAA;AAAA,YACrB;AAEA,YAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,cAAA,KAAA,GAAQ,MAAA,CAAO,MAAA;AAAA,YACjB;AAEA,YAAA,IAAI,OAAO,KAAA,EAAO;AAChB,cAAA,KAAA,GAAQ,MAAA,CAAO,KAAA;AAAA,YACjB;AAAA,UACF,SAAS,CAAA,EAAG;AAEV,YAAA,OAAA,CAAQ,KAAK,4BAAA,EAA8B,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AAEA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,cAAc,mCAAmC,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO;AAAA,IACL,IAAI,SAAA,CAAU,EAAA;AAAA,IACd,MAAA,EAAQ,iBAAA;AAAA,IACR,SAAS,SAAA,CAAU,OAAA;AAAA,IACnB,OAAO,SAAA,CAAU,KAAA;AAAA,IACjB,oBAAoB,SAAA,CAAU,kBAAA;AAAA,IAC9B,OAAA,EAAS;AAAA,MACP;AAAA,QACE,KAAA,EAAO,CAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACX;AAAA,QACA,eAAe,YAAA,IAAgB;AAAA;AACjC,KACF;AAAA,IACA,KAAA;AAAA,IACA,YAAY,SAAA,IAAa,MAAA;AAAA,IACzB,QAAQ,KAAA,IAAS,MAAA;AAAA,IACjB,SAAA,EAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY;AAAA,GAChD;AACF;AAKA,gBAAgB,4BACd,QAAA,EACyC;AACzC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,cAAc,+BAA+B,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAE1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAG/B,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,WAAA,GAAc,KAAK,IAAA,EAAK;AAG9B,QAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,UAAA,CAAW,GAAG,CAAA,EAAG;AAGjD,QAAA,IAAI,WAAA,CAAY,UAAA,CAAW,SAAS,CAAA,EAAG;AACrC,UAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAC5C,UAAA,IAAI,cAAc,WAAA,EAAa;AAE7B,YAAA;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA,EAAG;AACpC,UAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAGvC,UAAA,IAAI,SAAS,QAAA,EAAU;AACrB,YAAA;AAAA,UACF;AAEA,UAAA,IAAI;AACF,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,YAAA,MAAM,KAAA;AAAA,UACR,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,IAAA,CAAK,8BAA8B,IAAI,CAAA;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAcO,SAAS,iBAAA,CAAkB,MAAwB,IAAA,EAA4B;AACpF,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM;AAAA,GAClC;AACF;;;ACvkCA,eAAsB,UACpB,MAAA,EAC4B;AAC5B,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAEhC,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,wBAAA,CAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,OAAO,OAAO,CAAA;AAErE,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAE9E,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,MACxC,cAAA,EAAgB;AAAA,KAClB;AAGA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,OAAA,CAAQ,WAAW,IAAI,MAAA,CAAO,QAAA;AAAA,IAChC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,MAC3B,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AAED,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,MAAM,KAAA;AAAA,EACR;AACF;;;ACDA,eAAsB,KAAK,MAAA,EAA2C;AAEpE,EAAA,IAAI,CAAC,MAAA,CAAO,GAAA,IAAO,CAAC,OAAO,UAAA,EAAY;AACrC,IAAA,MAAM,IAAI,cAAc,iGAAgC,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,CAAA,IAAK,MAAA,CAAO,UAAA,EAAY;AAC9C,IAAA,MAAM,IAAI,cAAc,+GAA+B,CAAA;AAAA,EACzD;AAEA,EAAA,IAAI,CAAC,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA,EAAG;AACxD,IAAA,MAAM,IAAI,cAAc,0EAAc,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAGhC,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,KAAA,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA;AAE7C,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,OAAO,OAAO,CAAA;AAErE,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,eAAA,EAAiB,UAAU,KAAK,CAAA;AAAA,OAClC;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,MAC3B,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AAED,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,QACrC,QAAA,CAAS,MAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AAGzC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,YAAA,CAAa,OAAA,KAAY,KAAA,CAAA,IAAa,YAAA,CAAa,IAAA,EAAM;AAE3D,MAAA,MAAA,GAAS,YAAA,CAAa,IAAA;AAAA,IACxB,CAAA,MAAO;AAEL,MAAA,MAAA,GAAS,YAAA;AAAA,IACX;AAEA,IAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,CAAA,8DAAA,EAAe,MAAA,CAAO,KAAA,IAAS,0BAAM,CAAA,CAAA;AAAA,QACrC,KAAA,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAK,KAAA,CAAgB,SAAS,YAAA,EAAc;AAC1C,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,sBAAA,EAAyB,MAAA,CAAO,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,IAAI,aAAA;AAAA,MACR,CAAA,gBAAA,EAAoB,MAAgB,OAAO,CAAA,CAAA;AAAA,MAC3C,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;ACnQA,IAAMA,YAAA,GAAa,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC9B,QAAQA,YAAU;AASpC,SAAS,QAAA,GAAW;AAClB,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAgGb,CAAA;AACD;AAEA,SAAS,UAAU,IAAA,EAA4B;AAC7C,EAAA,MAAM,UAAsB,EAAC;AAE7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAElB,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,WAAA;AACH,QAAA,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AACzB,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAC1B,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AACxB,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAAA,QACvC,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,MAAM,kCAAkC,CAAA;AAChD,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,SAAA,CAAU,OAAe,OAAA,EAAqB;AAC3D,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,iBAAA,IAAqB,EAAA;AAClE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,8BAAA;AAEpE,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,OAAA,CAAQ,MAAM,iEAAiE,CAAA;AAC/E,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE,CAAA;AACrC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,OAAO,CAAA,CAAE,CAAA;AAClC,EAAA,OAAA,CAAQ,GAAA,CAAI,eAAe,IAAA,CAAK,SAAA,CAAU,QAAQ,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAClE,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,MAAM,SAAS,IAAI,cAAA,CAAe,EAAE,MAAA,EAAQ,SAAS,CAAA;AAErD,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,sBAAA,EAAwB;AAAA,MAC3D,KAAA;AAAA,MACA,OAAO,CAAC,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAQ;AAAA,KACnC,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AACtC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAC5C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,IAAI,IAAA,CAAK,WAAW,QAAA,EAAU;AAC5B,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAAA,EAA4B,IAAA,CAAK,KAAK,CAAA;AACpD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,WAAA,GAAc,GAAA;AACpB,IAAA,MAAM,UAAA,GAAa,GAAA;AAEnB,IAAA,OAAO,UAAU,WAAA,EAAa;AAC5B,MAAA,OAAA,EAAA;AAEA,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,aAAA,CAAc,sBAAA,EAAwB,KAAK,EAAE,CAAA;AACzE,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,IAAI,WAAW,CAAA,WAAA,EAAc,MAAA,CAAO,MAAM,CAAA,IAAA,CAAM,CAAA;AAEzF,MAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AACjC,QAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AACxB,QAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAO,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAGlD,QAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,UAAA,MAAM,OAAiB,EAAC;AACxB,UAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,MAAA,EAAQ;AAChC,YAAA,IAAI,KAAK,OAAA,EAAS;AAChB,cAAA,KAAA,MAAW,QAAA,IAAY,KAAK,OAAA,EAAS;AACnC,gBAAA,IAAI,SAAS,GAAA,EAAK;AAChB,kBAAA,IAAA,CAAK,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,gBACxB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,UAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,YAAA,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAC/B,YAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACvB,cAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,YAClC,CAAC,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAC9B,QAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,QAAA,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,MAAA,CAAO,KAAK,CAAA;AACpC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAA,CAAQ,IAAI,0DAA0D,CAAA;AACtE,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAEhB,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,OAAO,CAAA;AACvC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AAEA,eAAe,MAAA,CAAO,QAAgB,IAAA,EAAgB;AACpD,EAAA,MAAM,UAAe,EAAE,MAAA,EAAQ,OAAO,KAAA,EAAO,uBAAA,EAAyB,aAAa,GAAA,EAAI;AAEvF,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,QAAQ,SAAA,EAAW,OAAA,CAAQ,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACtC,GAAA,KAAQ,UAAA,EAAY,OAAA,CAAQ,MAAA,GAAS,IAAA;AAAA,SAAA,IACrC,GAAA,KAAQ,iBAAiB,OAAA,CAAQ,WAAA,GAAc,WAAW,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAAA,SAAA,IACnE,GAAA,KAAQ,gBAAgB,OAAA,CAAQ,SAAA,GAAY,SAAS,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAAA,SAAA,IAC9D,QAAQ,WAAA,EAAa,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IAC9C,QAAQ,YAAA,EAAc,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,iBAAA,IAAqB,EAAA;AAClE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,8BAAA;AAEpE,EAAA,YAAA,CAAa,MAAA,EAAQ,EAAE,OAAA,EAAS,OAAA,EAAS,MAAQ,CAAA;AAEjD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AACrC,EAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,MAAM;AAAA,CAAI,CAAA;AAEjC,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB;AAAA,MACtC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA;AAAA,MAC5C,MAAA,EAAQ,IAAA;AAAA,MACR,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAED,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,YAAY,CAAA;AACjC,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAG,KAAA,EAAO,OAAA;AACzC,MAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAA,CAAQ,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,IAC/D;AACA,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,EAClB,CAAA,MAAO;AACL,IAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB;AAAA,MACxC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA;AAAA,MAC5C,MAAA,EAAQ,KAAA;AAAA,MACR,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAED,IAAA,OAAA,CAAQ,IAAI,WAAA,EAAa,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAE,QAAQ,OAAO,CAAA;AAC5D,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,QAAA,CAAS,KAAK,CAAA;AAAA,EACxC;AACF;AAEA,eAAe,QAAA,CAAS,QAAgB,IAAA,EAAgB;AACtD,EAAA,MAAM,OAAA,GAAe;AAAA,IACnB,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,QAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,QAAQ,SAAA,EAAW,OAAA,CAAQ,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACtC,GAAA,KAAQ,UAAA,EAAY,OAAA,CAAQ,MAAA,GAAS,IAAA;AAAA,SAAA,IACrC,QAAQ,YAAA,EAAc,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IAChD,QAAQ,cAAA,EAAgB,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACpD,QAAQ,WAAA,EAAa,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IAC9C,QAAQ,YAAA,EAAc,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,iBAAA,IAAqB,EAAA;AAClE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,8BAAA;AAEpE,EAAA,YAAA,CAAa,MAAA,EAAQ,EAAE,OAAA,EAAS,OAAA,EAAS,KAAQ,CAAA;AAEjD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,OAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AACvC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AACrC,EAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,MAAM;AAAA,CAAI,CAAA;AAEjC,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB;AAAA,MACxC,UAAU,OAAA,CAAQ,OAAA;AAAA,MAClB,QAAA,EAAU,CAAC,iBAAA,CAAkB,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,MAC5C,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAA,EAAQ,IAAA;AAAA,MACR,YAAY,OAAA,CAAQ,SAAA;AAAA,MACpB,GAAA,EAAK;AAAA,KACN,CAAA;AAED,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,YAAY,CAAA;AACjC,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAG,KAAA,EAAO,OAAA;AACzC,MAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAA,CAAQ,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,IAC/D;AACA,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,EAClB,CAAA,MAAO;AACL,IAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB;AAAA,MAC1C,UAAU,OAAA,CAAQ,OAAA;AAAA,MAClB,QAAA,EAAU,CAAC,iBAAA,CAAkB,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,MAC5C,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAA,EAAQ,KAAA;AAAA,MACR,YAAY,OAAA,CAAQ,SAAA;AAAA,MACpB,GAAA,EAAK;AAAA,KACN,CAAA;AAED,IAAA,OAAA,CAAQ,IAAI,WAAA,EAAa,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAE,QAAQ,OAAO,CAAA;AAE5D,IAAA,IAAI,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA,EAAG;AACvD,MAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,MAAA,QAAA,CAAS,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,EAAU,CAAA,KAAM;AAC1C,QAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAC1C,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,QAAA,CAAS,GAAG,CAAA,CAAE,CAAA;AAAA,MACzC,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,QAAA,CAAS,UAAU,CAAA;AAChD,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,EAAe,QAAA,CAAS,MAAM,CAAA;AAAA,EAC5C;AACF;AAEA,eAAe,iBAAiB,IAAA,EAAgB;AAC9C,EAAA,MAAM,UAAe,EAAC;AAEtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,QAAQ,eAAA,EAAiB,OAAA,CAAQ,UAAA,GAAa,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACjD,QAAQ,UAAA,EAAY;AAC3B,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAAA,MACvC,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,MAAM,0CAA0C,CAAA;AACxD,QAAA,OAAA,CAAQ,MAAM,CAAA,yDAAA,CAA6D,CAAA;AAC3E,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,WACS,GAAA,KAAQ,WAAA,UAAqB,MAAA,GAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IAC9C,QAAQ,YAAA,EAAc,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,IAAA,OAAA,CAAQ,MAAM,+BAA+B,CAAA;AAC7C,IAAA,OAAA,CAAQ,MAAM,mEAAmE,CAAA;AACjF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,OAAA,CAAQ,MAAM,0BAA0B,CAAA;AACxC,IAAA,OAAA,CAAQ,MAAM,mEAAmE,CAAA;AACjF,IAAA,OAAA,CAAQ,MAAM,CAAA,yDAAA,CAA6D,CAAA;AAC3E,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,iBAAA,IAAqB,EAAA;AAClE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,8BAAA;AAEpE,EAAA,MAAM,SAAS,IAAI,cAAA,CAAe,EAAE,MAAA,EAAQ,SAAS,CAAA;AAErD,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,sBAAA,EAAwB;AAAA,MAC3D,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,CAAC,EAAE,MAAA,EAAQ,EAAE,WAAA,EAAa,OAAA,CAAQ,UAAA,EAAY,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,EAAG;AAAA,KAChF,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AACtC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAC5C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,IAAI,IAAA,CAAK,WAAW,QAAA,EAAU;AAC5B,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAAA,EAA4B,IAAA,CAAK,KAAK,CAAA;AACpD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,WAAA,GAAc,GAAA;AACpB,IAAA,MAAM,UAAA,GAAa,GAAA;AAEnB,IAAA,OAAO,UAAU,WAAA,EAAa;AAC5B,MAAA,OAAA,EAAA;AAEA,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,aAAA,CAAc,sBAAA,EAAwB,KAAK,EAAE,CAAA;AACzE,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,IAAI,WAAW,CAAA,WAAA,EAAc,MAAA,CAAO,MAAM,CAAA,IAAA,CAAM,CAAA;AAEzF,MAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AACjC,QAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AACxB,QAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAE3C,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAC9B,QAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,QAAA,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,MAAA,CAAO,KAAK,CAAA;AACpC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAA,CAAQ,IAAI,0DAA0D,CAAA;AACtE,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAEhB,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,OAAO,CAAA;AACvC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AAEA,eAAe,YAAA,CAAa,gBAAwB,IAAA,EAAgB;AAClE,EAAA,MAAM,OAAA,GAAe,EAAE,IAAA,EAAM,SAAA,EAAU;AAEvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,QAAQ,QAAA,EAAU,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACpC,QAAQ,WAAA,EAAa,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IAC9C,QAAQ,YAAA,EAAc,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,iBAAA,IAAqB,EAAA;AAClE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,8BAAA;AAEpE,EAAA,YAAA,CAAa,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA;AAEhC,EAAA,MAAM,WAAA,GAAc,eAAe,KAAA,CAAM,GAAG,EAAE,GAAA,CAAI,CAAA,EAAA,KAAM,EAAA,CAAG,IAAA,EAAM,CAAA;AAEjE,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU;AAAA,IAC7B,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,YAAA,EAAc;AAAA,GACf,CAAA;AAED,EAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC7C;AAKA,SAAS,gBAAgB,GAAA,EAAqD;AAE5E,EAAA,MAAM,aAAA,GAAgB,8GAAA;AAGtB,EAAA,MAAM,aAAA,GAAgB,gEAAA;AAEtB,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,SAAA,EAAW,OAAA,EAAQ;AAAA,EAC1C;AAEA,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,SAAA,EAAW,OAAA,EAAQ;AAAA,EAC1C;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,SAAA,EAAW,OAAA,EAAQ;AAC1C;AAEA,eAAe,OAAA,CAAQ,KAAa,IAAA,EAAgB;AAClD,EAAA,MAAM,OAAA,GAAe;AAAA,IACnB,SAAA,EAAW,CAAC,QAAA,EAAU,QAAA,EAAU,WAAW,OAAO,CAAA;AAAA,IAClD,WAAA,EAAa;AAAA,GACf;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,EAAE,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAc,CAAA,CAAE,MAAM,CAAA;AAAA,IACtE,CAAA,MAAA,IAAW,QAAQ,gBAAA,EAAkB;AACnC,MAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AAAA,IACxB,CAAA,MAAA,IAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,iBAAA,IAAqB,EAAA;AAClE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,8BAAA;AAEpE,EAAA,YAAA,CAAa,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA;AAGhC,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,gBAAgB,GAAG,CAAA;AAElD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AAC1B,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAAS,SAAS,CAAA,CAAE,CAAA;AAChC,EAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAAS,OAAA,CAAQ,UAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACnD,EAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAAS,OAAA,CAAQ,WAAA,GAAc,cAAA,GAAO,cAAI,CAAA,CAAE,CAAA;AACxD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK;AAAA,MACxB,GAAA;AAAA,MACA,YAAY,OAAA,CAAQ,SAAA;AAAA,MACpB,YAAA,EAAc,OAAA,CAAQ,WAAA,GAAc,CAAA,GAAI,CAAA;AAAA,MACxC,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAA,CAAQ,IAAI,oCAAW,CAAA;AACvB,IAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAAS,MAAA,CAAO,EAAA,GAAK,cAAA,GAAO,cAAI,CAAA,CAAE,CAAA;AAE9C,IAAA,IAAI,MAAA,CAAO,eAAe,KAAA,CAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAAS,MAAA,CAAO,UAAU,CAAA,MAAA,CAAQ,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AACrD,MAAA,OAAA,CAAQ,IAAI,CAAA,kDAAA,EAAa,MAAA,CAAO,WAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA,EAAG;AACnD,MAAA,OAAA,CAAQ,IAAI,CAAA,oBAAA,EAAQ,IAAA,CAAK,UAAU,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,IACxD;AAGA,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,IAAI,MAAA,CAAO,mBAAmB,KAAA,CAAA,EAAW;AACvC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAAS,MAAA,CAAO,cAAc,CAAA,OAAA,CAAI,CAAA;AAAA,MAChD;AACA,MAAA,IAAI,MAAA,CAAO,gBAAgB,KAAA,CAAA,EAAW;AACpC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAAS,MAAA,CAAO,WAAW,CAAA,CAAE,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,MAAA,CAAO,mBAAmB,KAAA,CAAA,EAAW;AACvC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAW,MAAA,CAAO,cAAc,CAAA,CAAE,CAAA;AAAA,MAChD;AACA,MAAA,IAAI,MAAA,CAAO,mBAAmB,KAAA,CAAA,EAAW;AACvC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4CAAA,EAAY,MAAA,CAAO,cAAc,CAAA,CAAE,CAAA;AAAA,MACjD;AACA,MAAA,IAAI,MAAA,CAAO,eAAe,KAAA,CAAA,EAAW;AACnC,QAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAAS,MAAA,CAAO,UAAA,GAAa,QAAA,GAAM,QAAG,CAAA,CAAE,CAAA;AAAA,MACtD;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA,EAAG;AACvD,MAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,sCAAA,EAAa,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA,SAAA,CAAM,CAAA;AACxD,MAAA,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AACtC,QAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACtC,QAAA,OAAA,CAAQ,IAAI,CAAA,+BAAA,EAAc,IAAA,CAAK,KAAK,CAAA,gBAAA,EAAS,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAAA,MAC/D,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,aAAA,CAAc,SAAS,CAAA,EAAG;AAC3D,MAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,+CAAA,CAAgB,CAAA;AAC5B,MAAA,MAAA,CAAO,cAAc,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU;AAClD,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAO,KAAA,CAAM,WAAW,CAAA,2BAAA,EAAU,KAAA,CAAM,UAAU,CAAA,qBAAA,EAAS,KAAA,CAAM,WAAA,CAAY,MAAM,CAAA,CAAE,CAAA;AAAA,MACnG,CAAC,CAAA;AACD,MAAA,IAAI,MAAA,CAAO,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACnC,QAAA,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAY,MAAA,CAAO,aAAA,CAAc,MAAA,GAAS,CAAC,CAAA,mBAAA,CAAM,CAAA;AAAA,MAC/D;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,qBAAA,EAAW,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACvC;AAAA,EAEF,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,oCAAA,EAAa,KAAA,CAAM,OAAO,CAAA;AACxC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AAEA,eAAe,aAAA,CAAc,QAAgB,IAAA,EAAgB;AAC3D,EAAA,MAAM,UAAe,EAAC;AAEtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,QAAQ,WAAA,EAAa,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,SAAA,IACzC,QAAQ,YAAA,EAAc,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,iBAAA,IAAqB,EAAA;AAClE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,IAAI,iBAAA,IAAqB,8BAAA;AAEpE,EAAA,MAAM,SAAS,IAAI,cAAA,CAAe,EAAE,MAAA,EAAQ,SAAS,CAAA;AAErD,EAAA,OAAA,CAAQ,IAAI,CAAA,uBAAA,CAAyB,CAAA;AACrC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,MAAM,CAAA,CAAE,CAAA;AAChC,EAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,OAAO;AAAA,CAAI,CAAA;AAEpC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,aAAA,CAAc,wBAAwB,MAAM,CAAA;AAExE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AACtC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,MAAA,CAAO,EAAE;AAAA,CAAI,CAAA;AAErC,IAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAA,CAAQ,IAAI,uCAAkC,CAAA;AAC9C,MAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAO,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAGlD,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAM,OAAiB,EAAC;AACxB,QAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,MAAA,EAAQ;AAChC,UAAA,IAAI,KAAK,OAAA,EAAS;AAChB,YAAA,KAAA,MAAW,QAAA,IAAY,KAAK,OAAA,EAAS;AACnC,cAAA,IAAI,SAAS,GAAA,EAAK;AAChB,gBAAA,IAAA,CAAK,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,cACxB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAA,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAC/B,UAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACvB,YAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,UAClC,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,KAAW,QAAA,EAAU;AACrC,MAAA,OAAA,CAAQ,IAAI,uBAAkB,CAAA;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,IAAA,CAAK,SAAA,CAAU,OAAO,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC7D,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,KAAW,YAAA,EAAc;AACzC,MAAA,OAAA,CAAQ,IAAI,oCAA+B,CAAA;AAC3C,MAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,KAAW,SAAA,EAAW;AACtC,MAAA,OAAA,CAAQ,IAAI,2BAAsB,CAAA;AAClC,MAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,cAAc,CAAA;AAC1B,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC7C;AAAA,EAEF,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,+BAAA,EAAiC,KAAA,CAAM,OAAO,CAAA;AAC5D,IAAA,IAAI,MAAM,UAAA,EAAY;AACpB,MAAA,OAAA,CAAQ,KAAA,CAAM,mBAAA,EAAqB,KAAA,CAAM,UAAU,CAAA;AAAA,IACrD;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AAEA,eAAe,IAAA,GAAO;AACpB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAEjC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,CAAC,MAAM,QAAA,IAAY,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,EAAM;AACjE,IAAA,QAAA,EAAS;AACT,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AAEtB,EAAA,IAAI;AACF,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,OAAA,CAAQ,MAAM,wCAAwC,CAAA;AACtD,QAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AACtD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,MAAM,OAAO,IAAA,CAAK,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACrC,CAAA,MAAA,IAAW,YAAY,OAAA,EAAS;AAC9B,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,OAAA,CAAQ,MAAM,0CAA0C,CAAA;AACxD,QAAA,OAAA,CAAQ,IAAI,4CAA4C,CAAA;AACxD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,MAAM,SAAS,IAAA,CAAK,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACvC,CAAA,MAAA,IAAW,YAAY,MAAA,EAAQ;AAC7B,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,OAAA,CAAQ,MAAM,sCAAsC,CAAA;AACpD,QAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AACpD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,MAAM,QAAQ,IAAA,CAAK,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACtC,CAAA,MAAA,IAAW,YAAY,QAAA,EAAU;AAC/B,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,OAAA,CAAQ,MAAM,4CAA4C,CAAA;AAC1D,QAAA,OAAA,CAAQ,IAAI,4CAA4C,CAAA;AACxD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,MAAM,cAAc,IAAA,CAAK,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,YAAY,KAAA,EAAO;AAC5B,MAAA,MAAM,UAAA,GAAa,KAAK,CAAC,CAAA;AACzB,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAA,CAAQ,MAAM,4CAA4C,CAAA;AAC1D,QAAA,OAAA,CAAQ,IAAI,4CAA4C,CAAA;AACxD,QAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA;AAC7C,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAA,OAAA,CAAQ,MAAM,qDAAqD,CAAA;AACnE,UAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAClE,UAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QAChB;AACA,QAAA,MAAM,aAAa,IAAA,CAAK,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MAC3C,CAAA,MAAA,IAAW,eAAe,YAAA,EAAc;AACtC,QAAA,MAAM,gBAAA,CAAiB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MACtC,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,UAAU,CAAA,CAAA,CAAG,CAAA;AACzD,QAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,KAAA,GAAQ,OAAA;AAEd,MAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AAC1B,QAAA,OAAA,CAAQ,MAAM,uCAAuC,CAAA;AACrD,QAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AACjD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACvC,MAAA,MAAM,SAAA,CAAU,OAAO,OAAO,CAAA;AAAA,IAChC;AAAA,EACF,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,OAAO,CAAA;AACvC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AAEA,IAAA,EAAK,CAAE,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA","file":"cli.js","sourcesContent":["/**\n * SeaCloud SDK 核心类型定义\n */\n\n/**\n * SDK 配置选项\n */\nexport interface SeacloudConfig {\n /** API Service Token - 从环境变量 API_SERVICE_TOKEN 读取或直接传入 */\n apiKey?: string;\n /** 代理服务器基础 URL,默认为 http://localhost:8080 */\n baseUrl?: string;\n /** 自定义 fetch 实现(可选,用于 Node.js < 18 或测试) */\n fetch?: typeof fetch;\n /** 请求超时时间(毫秒),默认 30000 */\n timeout?: number;\n /** X-Project header 值,用于 Agent API 访问标识,默认为 'SeaVerse' */\n xProject?: string;\n}\n\n/**\n * 任务状态\n */\nexport type TaskStatus = 'pending' | 'processing' | 'in_progress' | 'completed' | 'failed';\n\n/**\n * 任务错误信息\n */\nexport interface TaskError {\n code: string;\n message: string;\n details?: any;\n}\n\n/**\n * 任务结果\n */\nexport interface TaskResult {\n /** 任务 ID */\n id: string;\n /** 创建时间戳 */\n created_at: number;\n /** 任务状态 */\n status: TaskStatus;\n /** 错误信息(如果失败) */\n error?: TaskError | null;\n /** 模型名称 */\n model: string;\n /** 输出结果 */\n output?: Array<{\n content?: Array<{\n type?: string;\n url?: string;\n size?: number;\n jobId?: string;\n [key: string]: any;\n }>;\n [key: string]: any;\n }>;\n /** 其他字段 */\n [key: string]: any;\n}\n\n/**\n * 任务轮询选项\n */\nexport interface PollingOptions {\n /** 轮询间隔(毫秒),默认 3000 */\n intervalMs?: number;\n /** 最大尝试次数,默认 120 */\n maxAttempts?: number;\n /** 进度回调函数 */\n onProgress?: (attempt: number, status: TaskStatus) => void;\n}\n\n/**\n * HTTP 响应错误\n */\nexport class SeacloudError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public response?: any,\n ) {\n super(message);\n this.name = 'SeacloudError';\n }\n}\n","import type { SeacloudConfig } from './types.js';\n\n/**\n * 检测当前是否在 iframe 中\n */\nfunction isInIframe(): boolean {\n try {\n return typeof (globalThis as any).window !== 'undefined' &&\n (globalThis as any).window.self !== (globalThis as any).window.top;\n } catch (e) {\n // 如果访问 window.top 抛出异常,说明在跨域 iframe 中\n return true;\n }\n}\n\n/**\n * 通过 PostMessage 从父页面获取 token\n *\n * 此函数允许接收来自任何源的 PostMessage 消息,便于跨域 iframe 集成。\n * 使用 seaverse 协议与父页面通信:\n * - 发送: { type: 'seaverse:get_token' }\n * - 接收: { type: 'seaverse:token', payload: { accessToken: string, expiresIn: number } }\n * - 错误: { type: 'seaverse:error', error: string }\n *\n * @param timeout 超时时间(毫秒),默认 5000ms\n * @returns token 或 null\n */\nasync function getTokenFromParent(timeout: number = 5000): Promise<string | null> {\n if (!isInIframe()) {\n return null;\n }\n\n return new Promise((resolve) => {\n const messageHandler = (event: MessageEvent) => {\n // 验证消息格式\n if (event.data && event.data.type === 'seaverse:token') {\n cleanup();\n // 从 payload.accessToken 中获取 token\n const token = event.data.payload?.accessToken;\n resolve(token || null);\n } else if (event.data && event.data.type === 'seaverse:error') {\n // 处理错误响应\n cleanup();\n console.warn('[SeaCloud SDK] Error getting token from parent:', event.data.error);\n resolve(null);\n }\n };\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve(null);\n }, timeout);\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n (globalThis as any).window.removeEventListener('message', messageHandler);\n };\n\n // 监听父页面的响应(不限制来源)\n (globalThis as any).window.addEventListener('message', messageHandler);\n\n // 向父页面发送请求(允许任何源接收)\n try {\n (globalThis as any).window.parent.postMessage(\n { type: 'seaverse:get_token' },\n '*' // 允许任何源,支持跨域场景\n );\n } catch (e) {\n cleanup();\n resolve(null);\n }\n });\n}\n\n/**\n * 通过 PostMessage 从父页面获取 Host\n *\n * 此函数允许接收来自任何源的 PostMessage 消息,便于跨域 iframe 集成。\n * 使用 seaverse 协议与父页面通信:\n * - 发送: { type: 'seaverse:get_host' }\n * - 接收: { type: 'seaverse:host', payload: { host: string } }\n * - 错误: { type: 'seaverse:error', error: string }\n *\n * @param timeout 超时时间(毫秒),默认 5000ms\n * @returns host (如 window.location.origin) 或 null\n */\nexport async function getHostFromParent(timeout: number = 5000): Promise<string | null> {\n if (!isInIframe()) {\n return null;\n }\n\n return new Promise((resolve) => {\n const messageHandler = (event: MessageEvent) => {\n // 验证消息格式\n if (event.data && event.data.type === 'seaverse:host') {\n cleanup();\n // 从 payload.host 中获取 host\n const host = event.data.payload?.host;\n resolve(host || null);\n } else if (event.data && event.data.type === 'seaverse:error') {\n // 处理错误响应\n cleanup();\n console.warn('[SeaCloud SDK] Error getting host from parent:', event.data.error);\n resolve(null);\n }\n };\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve(null);\n }, timeout);\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n (globalThis as any).window.removeEventListener('message', messageHandler);\n };\n\n // 监听父页面的响应(不限制来源)\n (globalThis as any).window.addEventListener('message', messageHandler);\n\n // 向父页面发送请求(允许任何源接收)\n try {\n (globalThis as any).window.parent.postMessage(\n { type: 'seaverse:get_host' },\n '*' // 允许任何源,支持跨域场景\n );\n } catch (e) {\n cleanup();\n resolve(null);\n }\n });\n}\n\n/**\n * 动态获取 API Token\n * 优先级:\n * 1. 传入的 apiKey\n * 2. localStorage auth_token (浏览器环境)\n * 3. 环境变量 API_SERVICE_TOKEN (Node.js 环境)\n * 4. 通过 PostMessage 从父页面获取 (iframe 环境)\n * 5. 没有找到 → 抛出错误\n *\n * @param providedApiKey 用户提供的 apiKey(可选)\n * @returns API Token\n */\nexport async function getApiToken(providedApiKey?: string): Promise<string | undefined> {\n // 1. 如果提供了 apiKey,直接使用\n if (providedApiKey) {\n return providedApiKey;\n }\n\n // 2. 尝试从 localStorage 获取 (浏览器环境)\n if (typeof (globalThis as any).window !== 'undefined' && typeof (globalThis as any).localStorage !== 'undefined') {\n try {\n const localStorageToken = (globalThis as any).localStorage.getItem('auth_token');\n if (localStorageToken) {\n return localStorageToken;\n }\n } catch (e) {\n // localStorage might be blocked or unavailable\n }\n }\n\n // 3. 尝试从环境变量获取 (Node.js 环境)\n if (typeof process !== 'undefined' && process.env?.API_SERVICE_TOKEN) {\n return process.env.API_SERVICE_TOKEN;\n }\n\n // 4. 如果在 iframe 中,尝试通过 PostMessage 从父页面获取\n if (typeof (globalThis as any).window !== 'undefined') {\n const parentToken = await getTokenFromParent();\n if (parentToken) {\n return parentToken;\n }\n }\n\n // 5. 返回'',让调用方处理\n return '';\n\n // // 5. 没有找到任何 token,抛出错误\n // throw new Error(\n // 'SeaCloud SDK: No API token found. ' +\n // 'Please ensure token is available in localStorage.getItem(\"auth_token\") (browser) ' +\n // 'or process.env.API_SERVICE_TOKEN (Node.js), ' +\n // 'or initialize with initSeacloud({ apiKey: \"your-token\" }).'\n // );\n}\n\n/**\n * 创建 SDK 配置\n * @param options 配置选项\n * @returns 完整的配置对象\n */\nexport function createConfig(options: SeacloudConfig = {}): Required<SeacloudConfig> {\n // apiKey 允许为 undefined,在实际请求时才异步获取\n const apiKey = options.apiKey;\n\n // 使用环境变量或传入的 baseUrl\n const baseUrl = options.baseUrl ||\n (typeof process !== 'undefined' ? process.env?.SEACLOUD_BASE_URL : undefined) ||\n 'https://proxy-rs.seaverse.ai';\n\n // 使用全局 fetch 或自定义实现\n // 在浏览器环境中,fetch 需要绑定到 globalThis 以避免 \"Illegal invocation\" 错误\n const fetchImpl = options.fetch || (globalThis.fetch ? globalThis.fetch.bind(globalThis) : undefined);\n\n if (!fetchImpl) {\n throw new Error('fetch is not available. Please provide a fetch implementation in config or upgrade to Node.js 18+');\n }\n\n return {\n apiKey: apiKey || '', // 提供默认空字符串,实际请求时会动态获取\n baseUrl,\n fetch: fetchImpl,\n timeout: options.timeout || 30000,\n xProject: options.xProject || 'SeaVerse',\n };\n}\n\n/**\n * 验证配置\n * @param config 配置对象\n * @throws 如果配置无效\n */\nexport function validateConfig(config: Required<SeacloudConfig>): void {\n // 移除 API key 验证,允许空 key 传递给后端处理\n\n if (!config.baseUrl) {\n throw new Error('baseUrl is required');\n }\n\n if (typeof config.fetch !== 'function') {\n throw new Error('fetch must be a function');\n }\n}\n","/**\n * SDK 版本号\n * 此文件在构建时自动生成或手动更新\n */\nexport const VERSION = '0.9.6';\n","import type { SeacloudConfig, TaskResult } from './types.js';\nimport { SeacloudError } from './types.js';\nimport { createConfig, validateConfig, getApiToken } from './config.js';\nimport { VERSION } from './version.js';\n\n/**\n * SeaCloud HTTP 客户端\n * 用于创建任务和查询任务状态\n */\nexport class SeacloudClient {\n private config: Required<SeacloudConfig>;\n private providedApiKey?: string; // 保存用户提供的 apiKey\n\n constructor(config: SeacloudConfig = {}) {\n this.config = createConfig(config);\n this.providedApiKey = config.apiKey; // 保存用户提供的 apiKey(如果有)\n validateConfig(this.config);\n\n // 检测是否为浏览器环境\n const isBrowser = typeof (globalThis as any).window !== 'undefined' &&\n typeof (globalThis as any).localStorage !== 'undefined';\n\n // 仅在浏览器环境打印调试信息\n if (isBrowser) {\n console.log('[SeaCloud SDK] Client initialized', {\n version: VERSION,\n environment: 'browser',\n tokenSource: 'localStorage.auth_token',\n baseUrl: this.config.baseUrl,\n timeout: this.config.timeout,\n hasCustomApiKey: !!this.providedApiKey,\n });\n }\n }\n\n /**\n * 创建一个新任务\n * @param endpoint API 端点路径(例如:/model/tasks)\n * @param body 请求体\n * @returns 任务结果\n */\n async createTask(endpoint: string, body: Record<string, any>): Promise<TaskResult> {\n const url = `${this.config.baseUrl}${endpoint}`;\n\n // 每次请求时动态获取最新的 token(现在是异步的)\n const currentToken = await getApiToken(this.providedApiKey);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await this.config.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentToken}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new SeacloudError(\n `HTTP ${response.status}: ${errorBody}`,\n response.status,\n errorBody,\n );\n }\n\n const result = await response.json();\n return result as TaskResult;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof SeacloudError) {\n throw error;\n }\n\n if ((error as Error).name === 'AbortError') {\n throw new SeacloudError(`Request timeout after ${this.config.timeout}ms`);\n }\n\n throw new SeacloudError(\n `Request failed: ${(error as Error).message}`,\n undefined,\n error,\n );\n }\n }\n\n /**\n * 查询任务状态\n * @param endpoint API 端点路径(例如:/model/v1/generation)\n * @param taskId 任务 ID\n * @returns 任务结果\n */\n async getTaskStatus(endpoint: string, taskId: string): Promise<TaskResult> {\n const url = `${this.config.baseUrl}${endpoint}/task/${taskId}`;\n\n // 每次请求时动态获取最新的 token(现在是异步的)\n const currentToken = await getApiToken(this.providedApiKey);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await this.config.fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${currentToken}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new SeacloudError(\n `HTTP ${response.status}: ${errorBody}`,\n response.status,\n errorBody,\n );\n }\n\n const result = await response.json();\n return result as TaskResult;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof SeacloudError) {\n throw error;\n }\n\n if ((error as Error).name === 'AbortError') {\n throw new SeacloudError(`Request timeout after ${this.config.timeout}ms`);\n }\n\n throw new SeacloudError(\n `Request failed: ${(error as Error).message}`,\n undefined,\n error,\n );\n }\n }\n\n /**\n * 获取当前配置\n */\n getConfig(): Readonly<Required<SeacloudConfig>> {\n return { ...this.config };\n }\n}\n","/**\n * 全局配置管理\n */\n\nimport type { SeacloudClient } from './client.js';\nimport type { PollingOptions } from './types.js';\nimport { SeacloudClient as Client } from './client.js';\nimport { getHostFromParent } from './config.js';\n\n// 全局配置状态\ninterface GlobalConfig {\n client: SeacloudClient | null;\n defaultPollingOptions: PollingOptions;\n}\n\nconst globalConfig: GlobalConfig = {\n client: null,\n defaultPollingOptions: {\n intervalMs: 3000, // 3秒轮询间隔\n maxAttempts: 100, // 最多尝试100次 (约5分钟)\n },\n};\n\n/**\n * 初始化配置选项\n */\nexport interface InitOptions {\n apiKey?: string;\n baseUrl?: string;\n intervalMs?: number; // 轮询间隔(毫秒)\n maxAttempts?: number; // 最大尝试次数\n timeout?: number;\n xProject?: string; // X-Project header 值,用于 Agent API 访问标识,默认为 'SeaVerse'\n}\n\n/**\n * 初始化 SDK(可选)\n *\n * 从 v0.9.2 版本开始,此函数是可选的。\n * 如果不调用此函数,SDK 会在每次 API 调用时自动使用最新的环境变量/localStorage token。\n *\n * 何时调用此函数:\n * 1. 需要自定义 polling 选项(intervalMs, maxAttempts)\n * 2. 需要固定使用某个特定的 apiKey/baseUrl(不希望每次都重新读取)\n *\n * 在 iframe 环境中,SDK 会自动从父页面获取 Host 并判断环境(开发/正式),\n * 然后根据环境自动设置合适的 baseUrl。\n *\n * @example\n * // 不调用 initSeacloud - 每次都使用最新 token\n * const result = await llmChatCompletions({...});\n *\n * @example\n * // 调用 initSeacloud - 使用固定配置\n * initSeacloud({ intervalMs: 5000, maxAttempts: 200 });\n * const result = await llmChatCompletions({...});\n *\n * @example\n * // 在 iframe 中调用 - 自动判断环境\n * await initSeacloud(); // 会自动从父页面获取 host 并设置 baseUrl\n *\n * @param apiKeyOrConfig API 密钥字符串或完整配置对象\n * @param options 可选配置(仅在第一个参数为字符串时使用)\n */\nexport async function initSeacloud(\n apiKeyOrConfig?: string | InitOptions,\n options?: {\n baseUrl?: string;\n intervalMs?: number;\n maxAttempts?: number;\n timeout?: number;\n }\n): Promise<SeacloudClient> {\n let apiKey: string | undefined;\n let config: InitOptions;\n\n // 判断第一个参数的类型\n if (typeof apiKeyOrConfig === 'string') {\n // 方式 1: initSeacloud('api-key', { ... })\n apiKey = apiKeyOrConfig;\n config = options || {};\n } else if (apiKeyOrConfig && typeof apiKeyOrConfig === 'object') {\n // 方式 2: initSeacloud({ apiKey: '...', baseUrl: '...', ... })\n config = apiKeyOrConfig;\n apiKey = config.apiKey;\n } else {\n // 方式 3: initSeacloud() - 无参数,完全依赖自动检测\n config = {};\n apiKey = undefined;\n }\n\n // 如果用户没有显式设置 baseUrl,尝试从父页面获取 host 并自动判断环境\n if (!config.baseUrl) {\n try {\n const parentHost = await getHostFromParent(3000); // 3秒超时,避免初始化卡顿\n\n if (parentHost) {\n // 判断是否为开发环境\n // 开发环境特征:localhost, 127.0.0.1, 或者域名包含 seaverse.dev\n const isDevelopment =\n parentHost.includes('localhost') ||\n parentHost.includes('127.0.0.1') ||\n parentHost.includes(':3000') ||\n parentHost.includes(':8080') ||\n parentHost.includes('seaverse.dev');\n\n // 根据环境设置 baseUrl\n if (isDevelopment) {\n config.baseUrl = 'https://proxy-rs.sg.seaverse.dev'; // 开发环境\n console.log('[SeaCloud SDK] 检测到开发环境,使用开发 baseUrl:', config.baseUrl);\n } else {\n config.baseUrl = 'https://proxy-rs.seaverse.ai'; // 正式环境\n console.log('[SeaCloud SDK] 检测到正式环境,使用正式 baseUrl:', config.baseUrl);\n }\n }\n } catch (error) {\n // 获取 host 失败,使用默认配置\n console.warn('[SeaCloud SDK] 获取父页面 host 失败,使用默认配置', error);\n }\n }\n\n // 创建客户端(允许空 API key,让后端处理认证错误)\n globalConfig.client = new Client({\n apiKey: apiKey || '',\n baseUrl: config.baseUrl,\n timeout: config.timeout,\n xProject: config.xProject,\n });\n\n // 设置默认轮询选项\n if (config.intervalMs !== undefined) {\n globalConfig.defaultPollingOptions.intervalMs = config.intervalMs;\n }\n if (config.maxAttempts !== undefined) {\n globalConfig.defaultPollingOptions.maxAttempts = config.maxAttempts;\n }\n\n return globalConfig.client;\n}\n\n/**\n * 获取客户端实例\n *\n * 如果用户调用过 initSeacloud(),返回缓存的客户端实例\n * 否则,创建新的临时客户端实例(使用最新的环境变量/localStorage token)\n *\n * @returns SeacloudClient 实例\n */\nexport function getClient(): SeacloudClient {\n // 如果用户显式调用了 initSeacloud(),使用缓存的 client\n if (globalConfig.client) {\n return globalConfig.client;\n }\n\n // 否则,每次都动态创建新 client(使用最新的 token/env)\n return new Client({\n // 不传 apiKey - 让 createConfig() 自动从环境变量/localStorage 读取\n // 不传 baseUrl - 让 createConfig() 自动从环境变量读取或使用默认值\n // 不传 timeout - 使用默认 30000ms\n });\n}\n\n/**\n * 获取默认轮询选项\n */\nexport function getDefaultPollingOptions(): PollingOptions {\n return { ...globalConfig.defaultPollingOptions };\n}\n\n/**\n * 更新默认轮询选项\n */\nexport function setDefaultPollingOptions(options: Partial<PollingOptions>) {\n Object.assign(globalConfig.defaultPollingOptions, options);\n}\n\n/**\n * 重置配置(主要用于测试)\n */\nexport function resetConfig() {\n globalConfig.client = null;\n globalConfig.defaultPollingOptions = {\n intervalMs: 3000,\n maxAttempts: 100,\n };\n}\n","import { getClient } from '../core/global-config.js';\nimport { SeacloudError } from '../core/types.js';\nimport { getApiToken } from '../core/config.js';\n\n/**\n * Chat message role\n */\nexport type ChatMessageRole = 'system' | 'user' | 'assistant';\n\n/**\n * Chat message interface\n */\nexport interface ChatMessage {\n /**\n * Message role\n */\n role: ChatMessageRole;\n /**\n * Message content\n */\n content: string;\n}\n\n/**\n * LLM chat completions request parameters\n */\nexport interface LlmChatCompletionsParams {\n /**\n * Model name to use for chat completion\n * Supports 100+ models including:\n * - Claude: seaart-mix-sonnet-4-5, shaseng-claude-4.5, seacloud-claude-haiku-4.5, seacloud-claude-sonnet-4, seacloud-claude-opus-4.5\n * - Kimi: kimi-k2, kimi-k2-thinking, kimi-k2-250905\n * - Grok: grok-4, grok-code-fast-1\n * - DeepSeek: deepseek-v3.1, deepseek-v3-0324, deepseek-r1, deepseek-r1-0528\n * - Gemini: gemini-2.5-pro, gemini-2.5-flash, gemini-2.0-flash, gemini-3-pro-preview, gemini-3-flash-preview\n * - Qwen: qwen-plus, qwen-plus-character, qwen3-coder-plus\n * - GLM: glm-4.5-air, glm-4.5, glm-4.6, glm-4-plus\n * - GPT: gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, gpt-5, gpt-5.1, gpt-5.2\n * - Hunyuan: hunyuan-turbos-latest, hunyuan-large-role-20250822, hunyuan-large-role-plus-20250718\n * - Mistral: mistral-small-3.2-24b-instruct, mistral-small-3.1-24b-instruct, mistral-nemo\n * - Hermes: hermes-4-70b, hermes-4-405b, hermes-3-llama-3.1-405b\n * - Doubao: doubao-romantic, doubao-seed-1-6, doubao-seed-code-preview-251028\n * - Ernie: ernie-5.0-thinking-latest, ernie-5.0-thinking-preview\n * - WizardLM: wizardlm-2-8x22b\n * - O1/O3: o1-pre, o3-pre\n * - LongCat: LongCat-Flash-Chat, LongCat-Flash-Thinking\n * - And many more...\n *\n * @example \"seaart-mix-sonnet-4-5\"\n * @example \"kimi-k2\"\n * @example \"deepseek-v3.1\"\n */\n model: string;\n\n /**\n * Array of messages comprising the conversation so far\n */\n messages: ChatMessage[];\n\n /**\n * Maximum number of tokens to generate in the completion\n * @default undefined (model default)\n */\n max_tokens?: number;\n\n /**\n * Sampling temperature (0-2)\n * Higher values make output more random, lower values more deterministic\n * @default undefined (model default, usually 1.0)\n */\n temperature?: number;\n\n /**\n * Nucleus sampling parameter (0-1)\n * Alternative to temperature sampling\n * @default undefined (model default, usually 1.0)\n */\n top_p?: number;\n\n /**\n * Whether to stream the response\n * If true, returns an async iterator of chunks\n * If false, waits for complete response\n * @default false\n */\n stream?: boolean;\n\n /**\n * Number of completions to generate\n * @default 1\n */\n n?: number;\n\n /**\n * Sequences where the API will stop generating further tokens\n */\n stop?: string | string[];\n\n /**\n * Penalty for new tokens based on whether they appear in the text so far (-2.0 to 2.0)\n * @default 0\n */\n presence_penalty?: number;\n\n /**\n * Penalty for new tokens based on their existing frequency in the text so far (-2.0 to 2.0)\n * @default 0\n */\n frequency_penalty?: number;\n\n /**\n * A unique identifier representing your end-user\n */\n user?: string;\n\n /**\n * Request timeout in milliseconds\n * Overrides the global timeout set in initSeacloud()\n * @default 30000 (from global config)\n * @example 60000 for 60 seconds timeout\n */\n timeout?: number;\n}\n\n/**\n * Usage statistics for the completion\n */\nexport interface ChatCompletionUsage {\n /**\n * Number of tokens in the prompt\n */\n prompt_tokens: number;\n\n /**\n * Number of tokens in the generated completion\n */\n completion_tokens: number;\n\n /**\n * Total number of tokens used\n */\n total_tokens: number;\n\n /**\n * Cost in USD (if available)\n */\n cost?: number;\n\n /**\n * Additional usage details\n */\n [key: string]: any;\n}\n\n/**\n * A single chat completion choice\n */\nexport interface ChatCompletionChoice {\n /**\n * The index of this choice\n */\n index: number;\n\n /**\n * The message generated by the model\n */\n message: ChatMessage;\n\n /**\n * The reason the model stopped generating tokens\n * @values stop | length | content_filter | function_call\n */\n finish_reason: string | null;\n\n /**\n * Additional choice-specific fields\n */\n [key: string]: any;\n}\n\n/**\n * Chat completion response (non-streaming)\n */\nexport interface ChatCompletionResponse {\n /**\n * Unique identifier for the completion\n */\n id: string;\n\n /**\n * The object type, always \"chat.completion\"\n */\n object: string;\n\n /**\n * Unix timestamp of when the completion was created\n */\n created: number;\n\n /**\n * The model used for completion\n */\n model: string;\n\n /**\n * List of completion choices\n */\n choices: ChatCompletionChoice[];\n\n /**\n * Usage statistics for the completion\n */\n usage?: ChatCompletionUsage;\n\n /**\n * Additional response fields\n */\n [key: string]: any;\n}\n\n/**\n * Delta message for streaming chunks\n */\nexport interface ChatCompletionChunkDelta {\n /**\n * The role of the message (only in first chunk)\n */\n role?: ChatMessageRole;\n\n /**\n * The content delta for this chunk\n */\n content?: string;\n}\n\n/**\n * A single streaming chunk choice\n */\nexport interface ChatCompletionChunkChoice {\n /**\n * The index of this choice\n */\n index: number;\n\n /**\n * The delta message for this chunk\n */\n delta: ChatCompletionChunkDelta;\n\n /**\n * The reason the model stopped generating tokens (only in last chunk)\n */\n finish_reason: string | null;\n\n /**\n * Additional choice-specific fields\n */\n [key: string]: any;\n}\n\n/**\n * Chat completion streaming chunk\n */\nexport interface ChatCompletionChunk {\n /**\n * Unique identifier for the completion\n */\n id: string;\n\n /**\n * The object type, always \"chat.completion.chunk\"\n */\n object: string;\n\n /**\n * Unix timestamp of when the chunk was created\n */\n created: number;\n\n /**\n * The model used for completion\n */\n model: string;\n\n /**\n * List of chunk choices\n */\n choices: ChatCompletionChunkChoice[];\n\n /**\n * Additional chunk fields\n */\n [key: string]: any;\n}\n\n/**\n * Call LLM chat completions API (non-streaming)\n *\n * @example\n * ```typescript\n * import { initSeacloud, llmChatCompletions } from 'seacloud-sdk';\n *\n * initSeacloud({ apiKey: 'your-api-key' });\n *\n * const response = await llmChatCompletions({\n * model: 'seaart-mix-sonnet-4-5',\n * messages: [\n * { role: 'user', content: 'Hello!' }\n * ],\n * max_tokens: 100\n * });\n *\n * console.log(response.choices[0].message.content);\n * ```\n *\n * @example With custom timeout\n * ```typescript\n * // Set 60 seconds timeout for this specific call\n * const response = await llmChatCompletions({\n * model: 'deepseek-v3.1',\n * messages: [\n * { role: 'user', content: 'Write a long article' }\n * ],\n * timeout: 60000 // 60 seconds\n * });\n * ```\n *\n * @param params Request parameters\n * @returns Chat completion response\n */\nexport async function llmChatCompletions(\n params: LlmChatCompletionsParams & { stream?: false }\n): Promise<ChatCompletionResponse>;\n\n/**\n * Call LLM chat completions API (streaming)\n *\n * @example\n * ```typescript\n * import { initSeacloud, llmChatCompletions } from 'seacloud-sdk';\n *\n * initSeacloud({ apiKey: 'your-api-key' });\n *\n * const stream = await llmChatCompletions({\n * model: 'seaart-mix-sonnet-4-5',\n * messages: [\n * { role: 'user', content: 'Tell me a story' }\n * ],\n * stream: true\n * });\n *\n * for await (const chunk of stream) {\n * const content = chunk.choices[0]?.delta?.content;\n * if (content) {\n * process.stdout.write(content);\n * }\n * }\n * ```\n *\n * @param params Request parameters with stream: true\n * @returns Async iterator of chat completion chunks\n */\nexport async function llmChatCompletions(\n params: LlmChatCompletionsParams & { stream: true }\n): Promise<AsyncIterable<ChatCompletionChunk>>;\n\n// Implementation\nexport async function llmChatCompletions(\n params: LlmChatCompletionsParams\n): Promise<ChatCompletionResponse | AsyncIterable<ChatCompletionChunk>> {\n const client = getClient();\n const config = client.getConfig();\n\n const url = `${config.baseUrl}/llm/chat/completions`;\n\n // 动态获取 API token\n const token = await getApiToken(config.apiKey);\n\n // Use params.timeout if provided, otherwise use global config.timeout\n const timeoutMs = params.timeout ?? config.timeout;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await config.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n },\n body: JSON.stringify(params),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new SeacloudError(\n `HTTP ${response.status}: ${errorBody}`,\n response.status,\n errorBody,\n );\n }\n\n // Streaming response\n if (params.stream) {\n return parseStreamingResponse(response);\n }\n\n // Non-streaming response\n const result = await response.json();\n return result as ChatCompletionResponse;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof SeacloudError) {\n throw error;\n }\n\n if ((error as Error).name === 'AbortError') {\n throw new SeacloudError(`Request timeout after ${timeoutMs}ms`);\n }\n\n throw new SeacloudError(\n `Request failed: ${(error as Error).message}`,\n undefined,\n error,\n );\n }\n}\n\n/**\n * Parse streaming response into async iterable\n */\nasync function* parseStreamingResponse(\n response: Response\n): AsyncIterable<ChatCompletionChunk> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new SeacloudError('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n if (!trimmedLine) continue;\n if (trimmedLine === 'data: [DONE]') continue;\n\n if (trimmedLine.startsWith('data: ')) {\n const jsonStr = trimmedLine.slice(6);\n try {\n const chunk = JSON.parse(jsonStr) as ChatCompletionChunk;\n yield chunk;\n } catch (error) {\n console.warn('Failed to parse SSE chunk:', jsonStr);\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","/**\n * ============================================================================\n * SeaCloud Fast Agent Chat Completions API\n * ============================================================================\n *\n * This module provides a comprehensive API for interacting with SeaCloud's\n * Fast Agent system, which supports:\n *\n * - Multi-turn conversations with session management\n * - Tool calling for artifact generation (images, videos, music, etc.)\n * - Streaming and non-streaming response modes\n * - Multiple content types (text, image, video, audio, file)\n * - Flexible model selection (Claude, GPT, Gemini, etc.)\n *\n * IMPORTANT NOTES:\n * ================\n *\n * 1. REQUIRED PARAMETERS:\n * - agent_id: Caller-provided agent identifier\n * - messages: Array of conversation messages\n *\n * 2. TIMEOUT CONFIGURATION:\n * - Default timeout: 30 seconds (may be too short for tool calls)\n * - Recommended for agent operations: 120 seconds or more\n * - Set via initSeacloud({ timeout: 120000 })\n *\n * 3. STREAMING MODE:\n * - API always returns Server-Sent Events (SSE) format\n * - params.stream controls how SDK consumes the response\n * - For tool calls (image/video generation), streaming is RECOMMENDED\n *\n * 4. AUTHENTICATION:\n * - Requires 'X-Project' header (configured via initSeacloud({ xProject: 'SeaVerse' }))\n * - Uses Bearer token authentication\n *\n * 5. SESSION MANAGEMENT:\n * - Use session_id to maintain multi-turn conversations\n * - Increment seq for each message in the session\n *\n * @see AGENT_API.md for detailed documentation and examples\n */\n\nimport { getClient } from '../core/global-config.js';\nimport { SeacloudError } from '../core/types.js';\n\n/**\n * Message content type\n */\nexport type AgentMessageContentType = 'text' | 'image' | 'video' | 'audio' | 'file';\n\n/**\n * Base message content\n */\ninterface BaseMessageContent {\n type: AgentMessageContentType;\n}\n\n/**\n * Text message content\n */\ninterface TextMessageContent extends BaseMessageContent {\n type: 'text';\n text: string;\n}\n\n/**\n * Image message content\n */\ninterface ImageMessageContent extends BaseMessageContent {\n type: 'image';\n image_url: string;\n}\n\n/**\n * Video message content\n */\ninterface VideoMessageContent extends BaseMessageContent {\n type: 'video';\n video_url: string;\n}\n\n/**\n * Audio message content\n */\ninterface AudioMessageContent extends BaseMessageContent {\n type: 'audio';\n audio_url: string;\n}\n\n/**\n * File message content\n */\ninterface FileMessageContent extends BaseMessageContent {\n type: 'file';\n file_url: string;\n}\n\n/**\n * Message content item (union type for type safety)\n */\nexport type AgentMessageContent =\n | TextMessageContent\n | ImageMessageContent\n | VideoMessageContent\n | AudioMessageContent\n | FileMessageContent;\n\n/**\n * Message role type\n */\nexport type AgentMessageRole = 'developer' | 'user' | 'assistant' | 'tool';\n\n/**\n * Chat message\n */\nexport interface AgentMessage {\n /**\n * Message role\n * - developer: System instructions/prompts (equivalent to \"system\" role)\n * - user: User input messages\n * - assistant: AI assistant responses (for multi-turn conversations)\n * - tool: Tool execution results\n */\n role: AgentMessageRole;\n\n /**\n * Message content array\n */\n content: AgentMessageContent[];\n\n /**\n * Tool call ID (for role: 'tool')\n */\n tool_call_id?: string;\n\n /**\n * Tool name (for role: 'tool')\n */\n name?: string;\n}\n\n/**\n * Tool function definition\n */\nexport interface AgentToolFunction {\n /**\n * Tool name\n * Available tools:\n *\n * Image Generation:\n * - seagen_text2image_flux1d_artifact_tool\n * - seagen_text2image_seedream40_artifact_tool\n * - seagen_text2image_google_gemini3_pro_image_artifact_tool\n * - seagen_blackforestlabs_flux_2_pro_tool\n * - mm_volces_seedream_4_5_gateway_tool\n *\n * Image Editing:\n * - seagen_edit_image_google_artifact_tool\n * - seagen_blackforestlabs_flux_2_pro_edit_tool\n *\n * Video Generation:\n * - seagen_image2video_wanx26_artifact_tool\n * - seagen_text2video_wanx26_artifact_tool\n * - seagen_image2video_seedance_pro_fast_artifact_tool\n * - mm_text2video_kling_v2_6_gateway_tool\n * - mm_image2video_kling_v2_6_i2v_gateway_tool\n *\n * Music & Audio:\n * - seagen_text2song_mureka_artifact_tool\n * - seagen_text2lyrics_mureka_artifact_tool\n */\n name: string;\n\n /**\n * Tool description (optional)\n */\n description?: string;\n\n /**\n * Tool parameters schema (optional)\n */\n parameters?: Record<string, any>;\n}\n\n/**\n * Tool definition\n */\nexport interface AgentTool {\n /**\n * Tool type (always 'function')\n */\n type: 'function';\n\n /**\n * Function definition\n */\n function: AgentToolFunction;\n}\n\n/**\n * Agent chat completions request parameters\n */\nexport interface AgentChatCompletionsParams {\n /**\n * Agent ID to invoke\n * @example \"seaverse_agent\"\n * @example \"seagen_agent\"\n */\n agent_id: string;\n\n /**\n * Array of messages comprising the conversation\n */\n messages: AgentMessage[];\n\n /**\n * AI model to use for processing\n * @default \"custom_openai/vertex-ai-claude-sonnet-4.5\"\n * @example \"gpt-4o\"\n * @example \"custom_openai/vertex-ai-claude-sonnet-4.5\"\n */\n model?: string;\n\n /**\n * Sampling temperature for creativity control (0.0 to 1.0)\n * - 0.0: Focused and deterministic responses\n * - 1.0: Maximum creativity and randomness\n * @default 0.7\n */\n temperature?: number;\n\n /**\n * Session ID for multi-turn conversations\n * Used to maintain conversation context across multiple requests\n * Server returns this in the response; use it in subsequent calls\n */\n session_id?: string;\n\n /**\n * User identifier for tracking and analytics\n * Optional field for associating requests with specific users\n */\n user_id?: string;\n\n /**\n * Message ID for SSE reconnection (ADVANCED USE)\n * Only use this when resuming an interrupted streaming response\n * Server returns msg_id in response; use it to resume from disconnect point\n *\n * WARNING: Do NOT use for multi-turn conversations\n * For multi-turn, just include full message history + session_id\n *\n * @example\n * // DON'T do this for multi-turn:\n * // { msg_id: previousResponse.msg_id, seq: 1 }\n *\n * // DO this instead:\n * // { session_id: previousResponse.session_id, messages: [...allMessages] }\n */\n msg_id?: string;\n\n /**\n * Sequence number for message resumption (ADVANCED USE)\n * Only used with msg_id for resuming interrupted streams\n * For regular multi-turn conversations, omit this parameter\n *\n * @default 0\n */\n seq?: number;\n\n /**\n * Business-specific parameters\n * Key-value pairs passed through to backend systems\n * Common use cases:\n * - aspect_ratio: Video/image aspect ratio (e.g., \"16:9\", \"1:1\")\n * - duration: Video duration in seconds\n * - resolution: Output resolution (e.g., \"1080p\", \"4k\")\n */\n metadata?: Record<string, any>;\n\n /**\n * List of tools available to the agent\n * Agent automatically selects appropriate tool based on user request\n */\n tools?: AgentTool[];\n\n /**\n * Enable Server-Sent Events streaming\n * @default true\n */\n stream?: boolean;\n\n /**\n * Maximum number of tokens to generate\n */\n max_tokens?: number;\n\n /**\n * Number of completions to generate\n * @default 1\n */\n n?: number;\n\n /**\n * Sequences where the API will stop generating\n */\n stop?: string | string[];\n\n /**\n * Penalty for new tokens based on presence (-2.0 to 2.0)\n * @default 0\n */\n presence_penalty?: number;\n\n /**\n * Penalty for new tokens based on frequency (-2.0 to 2.0)\n * @default 0\n */\n frequency_penalty?: number;\n\n /**\n * Top-p nucleus sampling (0-1)\n */\n top_p?: number;\n\n /**\n * Request timeout in milliseconds\n * Overrides the global timeout set in initSeacloud()\n * @default 30000 (from global config)\n * @recommended 120000 or more for agent operations with tool calls\n * @example 120000 for 120 seconds timeout\n */\n timeout?: number;\n}\n\n/**\n * Artifact (generated file)\n */\nexport interface AgentArtifact {\n /**\n * File name\n * @example \"image.webp\"\n */\n name: string;\n\n /**\n * CDN URL to access the file\n */\n url: string;\n\n /**\n * Content type\n * @example \"image\" | \"video\" | \"audio\"\n */\n type: string;\n\n /**\n * MIME type\n * @example \"image/webp\" | \"video/mp4\" | \"audio/mp3\"\n */\n mime_type?: string;\n\n /**\n * File size in bytes\n */\n size?: number;\n\n /**\n * Duration in seconds (for video/audio)\n */\n duration?: number;\n\n /**\n * Width in pixels (for image/video)\n */\n width?: number;\n\n /**\n * Height in pixels (for image/video)\n */\n height?: number;\n\n /**\n * Additional metadata\n */\n [key: string]: any;\n}\n\n/**\n * Tool call information\n */\nexport interface AgentToolCall {\n /**\n * Tool call ID\n */\n id: string;\n\n /**\n * Tool type\n */\n type: 'function';\n\n /**\n * Function call details\n */\n function: {\n /**\n * Function name\n */\n name: string;\n\n /**\n * Function arguments (JSON string)\n */\n arguments: string;\n };\n\n /**\n * Tool call index\n */\n index?: number;\n}\n\n/**\n * Delta content for streaming chunks\n */\nexport interface AgentChatCompletionDelta {\n /**\n * Message role (only in first chunk)\n */\n role?: AgentMessageRole;\n\n /**\n * Content delta (string or array)\n */\n content?: string | AgentMessageContent[];\n\n /**\n * Artifacts (generated files)\n */\n artifacts?: AgentArtifact[];\n\n /**\n * Tool calls\n */\n tool_calls?: AgentToolCall[];\n\n /**\n * Refusal message\n */\n refusal?: string | null;\n\n /**\n * Function call (deprecated, use tool_calls)\n */\n function_call?: any;\n\n /**\n * Audio content\n */\n audio?: any;\n\n /**\n * Additional provider-specific fields\n */\n provider_specific_fields?: any;\n}\n\n/**\n * Content filter result\n */\nexport interface AgentContentFilterResult {\n /**\n * Error information\n */\n error?: {\n /**\n * Error code\n */\n code: string;\n\n /**\n * Error message\n */\n message: string;\n };\n\n /**\n * Additional filter results\n */\n [key: string]: any;\n}\n\n/**\n * Chat completion choice (streaming)\n */\nexport interface AgentChatCompletionChunkChoice {\n /**\n * Choice index\n */\n index: number;\n\n /**\n * Delta message for this chunk\n */\n delta: AgentChatCompletionDelta;\n\n /**\n * Finish reason (only in last chunk)\n * - \"stop\": Natural completion\n * - \"length\": Maximum token limit reached\n * - \"tool_calls\": Tool execution triggered\n * - \"content_filter\": Content filtered\n */\n finish_reason: string | null;\n\n /**\n * Log probabilities\n */\n logprobs?: any;\n\n /**\n * Content filter results\n */\n content_filter_results?: AgentContentFilterResult;\n\n /**\n * Content filter result (singular)\n */\n content_filter_result?: AgentContentFilterResult;\n}\n\n/**\n * Usage statistics\n */\nexport interface AgentUsage {\n /**\n * Prompt tokens\n */\n prompt_tokens: number;\n\n /**\n * Completion tokens\n */\n completion_tokens: number;\n\n /**\n * Total tokens\n */\n total_tokens: number;\n\n /**\n * Completion tokens details\n */\n completion_tokens_details?: {\n /**\n * Accepted prediction tokens\n */\n accepted_prediction_tokens?: number;\n\n /**\n * Audio tokens\n */\n audio_tokens?: number;\n\n /**\n * Reasoning tokens\n */\n reasoning_tokens?: number;\n\n /**\n * Rejected prediction tokens\n */\n rejected_prediction_tokens?: number;\n };\n\n /**\n * Prompt tokens details\n */\n prompt_tokens_details?: {\n /**\n * Audio tokens\n */\n audio_tokens?: number;\n\n /**\n * Cached tokens\n */\n cached_tokens?: number;\n\n /**\n * Text tokens\n */\n text_tokens?: number | null;\n\n /**\n * Image tokens\n */\n image_tokens?: number | null;\n };\n\n /**\n * Cost in USD\n */\n cost?: number;\n}\n\n/**\n * Chat completion streaming chunk\n */\nexport interface AgentChatCompletionChunk {\n /**\n * Unique identifier for the completion\n */\n id: string;\n\n /**\n * Object type (always \"chat.completion.chunk\")\n */\n object: string;\n\n /**\n * Unix timestamp\n */\n created: number;\n\n /**\n * Model used\n */\n model: string;\n\n /**\n * System fingerprint\n */\n system_fingerprint?: string;\n\n /**\n * List of choices\n */\n choices: AgentChatCompletionChunkChoice[];\n\n /**\n * Usage statistics (usually in last chunk)\n */\n usage?: AgentUsage;\n\n /**\n * Session ID for conversation continuation\n */\n session_id?: string;\n\n /**\n * Message ID\n */\n msg_id?: string;\n\n /**\n * Provider-specific fields\n */\n provider_specific_fields?: any;\n\n /**\n * Citations\n */\n citations?: any;\n\n /**\n * Service tier\n */\n service_tier?: string | null;\n\n /**\n * Obfuscation\n */\n obfuscation?: string;\n}\n\n/**\n * Message in non-streaming response\n */\nexport interface AgentResponseMessage {\n /**\n * Message role\n */\n role: AgentMessageRole;\n\n /**\n * Message content\n */\n content: string;\n\n /**\n * Tool calls\n */\n tool_calls?: AgentToolCall[];\n\n /**\n * Refusal message\n */\n refusal?: string | null;\n\n /**\n * Function call (deprecated)\n */\n function_call?: any;\n\n /**\n * Audio content\n */\n audio?: any;\n}\n\n/**\n * Chat completion choice (non-streaming)\n */\nexport interface AgentChatCompletionChoice {\n /**\n * Choice index\n */\n index: number;\n\n /**\n * Message\n */\n message: AgentResponseMessage;\n\n /**\n * Finish reason\n */\n finish_reason: string | null;\n\n /**\n * Log probabilities\n */\n logprobs?: any;\n\n /**\n * Content filter results\n */\n content_filter_results?: AgentContentFilterResult;\n}\n\n/**\n * Chat completion response (non-streaming)\n */\nexport interface AgentChatCompletionResponse {\n /**\n * Unique identifier\n */\n id: string;\n\n /**\n * Object type (always \"chat.completion\")\n */\n object: string;\n\n /**\n * Unix timestamp\n */\n created: number;\n\n /**\n * Model used\n */\n model: string;\n\n /**\n * System fingerprint\n */\n system_fingerprint?: string;\n\n /**\n * List of choices\n */\n choices: AgentChatCompletionChoice[];\n\n /**\n * Usage statistics\n */\n usage?: AgentUsage;\n\n /**\n * Session ID\n */\n session_id?: string;\n\n /**\n * Message ID\n */\n msg_id?: string;\n\n /**\n * Provider-specific fields\n */\n provider_specific_fields?: any;\n\n /**\n * Service tier\n */\n service_tier?: string | null;\n\n /**\n * Generated artifacts\n */\n artifacts?: AgentArtifact[];\n}\n\n/**\n * Call SeaCloud Fast Agent API (non-streaming)\n *\n * @example\n * ```typescript\n * import { initSeacloud, agentChatCompletions } from 'seacloud-sdk';\n *\n * initSeacloud({\n * apiKey: 'your-api-key',\n * baseUrl: 'http://proxy.sg.seaverse.dev',\n * });\n *\n * // Simple chat\n * const response = await agentChatCompletions({\n * agent_id: 'seaverse_agent',\n * messages: [\n * {\n * role: 'user',\n * content: [{ type: 'text', text: 'Hello!' }]\n * }\n * ],\n * model: 'gpt-4o',\n * });\n *\n * console.log(response.choices[0].message.content);\n * ```\n *\n * @example\n * ```typescript\n * // Generate an image\n * const response = await agentChatCompletions({\n * agent_id: 'seaverse_agent',\n * messages: [\n * {\n * role: 'user',\n * content: [{ type: 'text', text: 'Generate a cute puppy photo' }]\n * }\n * ],\n * model: 'gpt-4o',\n * tools: [\n * {\n * type: 'function',\n * function: { name: 'seagen_text2image_flux1d_artifact_tool' }\n * }\n * ]\n * });\n *\n * // Access generated image\n * const imageUrl = response.artifacts?.[0]?.url;\n * ```\n *\n * @param params Request parameters\n * @returns Chat completion response\n */\nexport async function agentChatCompletions(\n params: AgentChatCompletionsParams & { stream?: false }\n): Promise<AgentChatCompletionResponse>;\n\n/**\n * Call SeaCloud Fast Agent API (streaming)\n *\n * @example\n * ```typescript\n * import { initSeacloud, agentChatCompletions } from 'seacloud-sdk';\n *\n * initSeacloud({\n * apiKey: 'your-api-key',\n * baseUrl: 'http://proxy.sg.seaverse.dev',\n * });\n *\n * const stream = await agentChatCompletions({\n * agent_id: 'seaverse_agent',\n * messages: [\n * {\n * role: 'user',\n * content: [{ type: 'text', text: 'Tell me a story' }]\n * }\n * ],\n * model: 'gpt-4o',\n * stream: true,\n * });\n *\n * for await (const chunk of stream) {\n * const content = chunk.choices[0]?.delta?.content;\n * if (typeof content === 'string') {\n * process.stdout.write(content);\n * }\n *\n * // Handle artifacts\n * const artifacts = chunk.choices[0]?.delta?.artifacts;\n * if (artifacts) {\n * console.log('Generated artifacts:', artifacts);\n * }\n * }\n * ```\n *\n * @param params Request parameters with stream: true\n * @returns Async iterator of chat completion chunks\n */\nexport async function agentChatCompletions(\n params: AgentChatCompletionsParams & { stream: true }\n): Promise<AsyncIterable<AgentChatCompletionChunk>>;\n\n// Implementation\nexport async function agentChatCompletions(\n params: AgentChatCompletionsParams\n): Promise<AgentChatCompletionResponse | AsyncIterable<AgentChatCompletionChunk>> {\n const client = getClient();\n const config = client.getConfig();\n\n const url = `${config.baseUrl}/agent/api/v1/chat/completions`;\n\n // ============================================================================\n // PARAMETER PROCESSING LOGIC\n // ============================================================================\n\n /**\n * Default Model:\n * - If not specified, uses 'custom_openai/vertex-ai-claude-sonnet-4.5'\n * - This is Claude Sonnet 4.5, optimized for agent operations\n * - You can override with any supported model (gpt-4o, claude-4, etc.)\n */\n const model = params.model || 'custom_openai/vertex-ai-claude-sonnet-4.5';\n\n /**\n * Stream Mode:\n * - Agent API ALWAYS returns Server-Sent Events (SSE) format\n * - Even if params.stream=false, API returns SSE chunks\n * - We force stream: true in API request for consistency\n * - For non-streaming (params.stream=false), we collect all chunks internally\n */\n const userWantsStreaming = params.stream !== false; // Default to true\n const requestBody = {\n ...params,\n model,\n stream: true, // Always request SSE from API\n };\n\n // ============================================================================\n // TIMEOUT & REQUEST HANDLING\n // ============================================================================\n\n /**\n * Timeout Configuration:\n * - Default: 30 seconds (set in config)\n * - For agent operations (especially with tool calls like image generation):\n * Recommend setting timeout to 120000ms (2 minutes) or more\n * - Can override per-request: agentChatCompletions({ ..., timeout: 120000 })\n * - Or set globally: initSeacloud({ apiKey: '...', timeout: 120000 })\n */\n // Use params.timeout if provided, otherwise use global config.timeout\n const timeoutMs = params.timeout ?? config.timeout;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n /**\n * Request Headers:\n * - Content-Type: application/json (standard)\n * - Authorization: Bearer token for authentication\n * - X-Project: 由 initSeacloud({ xProject: '...' }) 配置\n */\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n };\n\n // 仅在配置了 xProject 时添加 X-Project header\n if (config.xProject) {\n headers['X-Project'] = config.xProject;\n }\n\n const response = await config.fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new SeacloudError(\n `HTTP ${response.status}: ${errorBody}`,\n response.status,\n errorBody,\n );\n }\n\n // ============================================================================\n // RESPONSE HANDLING\n // ============================================================================\n\n /**\n * Response Routing:\n * - If user wants streaming (params.stream !== false):\n * Return async iterator that yields chunks as they arrive\n *\n * - If user wants non-streaming (params.stream === false):\n * Internally collect all SSE chunks and return complete response\n *\n * Note: Both paths read SSE format from API, just different consumption patterns\n */\n if (userWantsStreaming) {\n return parseAgentStreamingResponse(response);\n }\n\n // Non-streaming: Collect all chunks and return complete response\n return await parseAgentNonStreamingResponse(response);\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof SeacloudError) {\n throw error;\n }\n\n if ((error as Error).name === 'AbortError') {\n throw new SeacloudError(`Request timeout after ${timeoutMs}ms`);\n }\n\n throw new SeacloudError(\n `Request failed: ${(error as Error).message}`,\n undefined,\n error,\n );\n }\n}\n\n/**\n * Parse non-streaming response (API returns SSE even with stream: false)\n */\nasync function parseAgentNonStreamingResponse(\n response: Response\n): Promise<AgentChatCompletionResponse> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new SeacloudError('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let fullContent = '';\n let artifacts: AgentArtifact[] = [];\n let finishReason = '';\n let sessionId = '';\n let msgId = '';\n let lastChunk: AgentChatCompletionChunk | null = null;\n let usage: AgentUsage | undefined;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n if (!trimmedLine) continue;\n if (trimmedLine === 'data: [DONE]') continue;\n if (trimmedLine === 'event: heartbeat') continue;\n\n if (trimmedLine.startsWith('data: ')) {\n const data = trimmedLine.slice(6).trim();\n\n try {\n const parsed = JSON.parse(data) as AgentChatCompletionChunk;\n lastChunk = parsed;\n\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n if (typeof delta.content === 'string') {\n fullContent += delta.content;\n } else if (Array.isArray(delta.content)) {\n for (const item of delta.content) {\n if (item.type === 'text' && item.text) {\n fullContent += item.text;\n }\n }\n }\n }\n\n if (delta?.artifacts) {\n artifacts.push(...delta.artifacts);\n }\n\n if (parsed.choices?.[0]?.finish_reason) {\n finishReason = parsed.choices[0].finish_reason;\n }\n\n if (parsed.session_id) {\n sessionId = parsed.session_id;\n }\n\n if (parsed.msg_id) {\n msgId = parsed.msg_id;\n }\n\n if (parsed.usage) {\n usage = parsed.usage;\n }\n } catch (e) {\n // Skip invalid JSON\n console.warn('Failed to parse SSE chunk:', data.substring(0, 100));\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (!lastChunk) {\n throw new SeacloudError('No valid response chunks received');\n }\n\n return {\n id: lastChunk.id,\n object: 'chat.completion',\n created: lastChunk.created,\n model: lastChunk.model,\n system_fingerprint: lastChunk.system_fingerprint,\n choices: [\n {\n index: 0,\n message: {\n role: 'assistant',\n content: fullContent,\n },\n finish_reason: finishReason || null,\n },\n ],\n usage,\n session_id: sessionId || undefined,\n msg_id: msgId || undefined,\n artifacts: artifacts.length > 0 ? artifacts : undefined,\n };\n}\n\n/**\n * Parse streaming response into async iterable\n */\nasync function* parseAgentStreamingResponse(\n response: Response\n): AsyncIterable<AgentChatCompletionChunk> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new SeacloudError('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n // Skip empty lines and comments\n if (!trimmedLine || trimmedLine.startsWith(':')) continue;\n\n // Handle event type declarations (e.g., \"event: heartbeat\")\n if (trimmedLine.startsWith('event: ')) {\n const eventType = trimmedLine.slice(7).trim();\n if (eventType === 'heartbeat') {\n // Heartbeat events can be logged but don't yield\n continue;\n }\n }\n\n // Handle data events\n if (trimmedLine.startsWith('data: ')) {\n const data = trimmedLine.slice(6).trim();\n\n // Check for stream completion signal\n if (data === '[DONE]') {\n break;\n }\n\n try {\n const chunk = JSON.parse(data) as AgentChatCompletionChunk;\n yield chunk;\n } catch (error) {\n console.warn('Failed to parse SSE chunk:', data);\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Helper function to create a text message\n *\n * @param role - Message role ('user' | 'assistant' | 'developer' | 'tool')\n * @param text - Text content\n * @returns Agent message with text content\n *\n * @example\n * ```typescript\n * const message = createTextMessage('user', 'Hello!');\n * ```\n */\nexport function createTextMessage(role: AgentMessageRole, text: string): AgentMessage {\n return {\n role,\n content: [{ type: 'text', text }],\n };\n}\n\n/**\n * Helper function to create a message with image\n *\n * @param role - Message role ('user' | 'assistant' | 'developer' | 'tool')\n * @param text - Text content\n * @param imageUrl - Image URL\n * @returns Agent message with text and image content\n *\n * @example\n * ```typescript\n * const message = createImageMessage('user', 'What is this?', 'https://example.com/image.jpg');\n * ```\n */\nexport function createImageMessage(role: AgentMessageRole, text: string, imageUrl: string): AgentMessage {\n return {\n role,\n content: [\n { type: 'text', text },\n { type: 'image', image_url: imageUrl },\n ],\n };\n}\n\n/**\n * Helper function to create a message with video\n *\n * @param role - Message role\n * @param text - Text content\n * @param videoUrl - Video URL\n * @returns Agent message with text and video content\n */\nexport function createVideoMessage(role: AgentMessageRole, text: string, videoUrl: string): AgentMessage {\n return {\n role,\n content: [\n { type: 'text', text },\n { type: 'video', video_url: videoUrl },\n ],\n };\n}\n\n/**\n * Helper function to create a message with audio\n *\n * @param role - Message role\n * @param text - Text content\n * @param audioUrl - Audio URL\n * @returns Agent message with text and audio content\n */\nexport function createAudioMessage(role: AgentMessageRole, text: string, audioUrl: string): AgentMessage {\n return {\n role,\n content: [\n { type: 'text', text },\n { type: 'audio', audio_url: audioUrl },\n ],\n };\n}\n\n/**\n * Helper function to create a tool\n */\nexport function createTool(toolName: string): AgentTool {\n return {\n type: 'function',\n function: {\n name: toolName,\n },\n };\n}\n","import { getClient } from '../core/global-config.js';\n\n/**\n * 查询参数中的约束条件\n */\nexport interface TemplateSpecConstraint {\n /**\n * 默认值(任意类型)\n */\n default?: any;\n [key: string]: any;\n}\n\n/**\n * 模板输入参数定义\n */\nexport interface TemplateSpecInput {\n /**\n * 节点字段名称\n */\n field: string;\n /**\n * 节点字段id\n */\n node_id: string;\n /**\n * 节点class_type\n */\n node_type: string;\n /**\n * 作者节点字段自定义标题\n */\n title: string;\n /**\n * 节点字段类型\n */\n type: string;\n /**\n * 节点字段是否必须\n */\n required: boolean;\n /**\n * 约束条件\n */\n constraints?: TemplateSpecConstraint;\n}\n\n/**\n * 模板输出定义\n */\nexport interface TemplateSpecOutput {\n /**\n * 节点ID\n */\n node_id: string;\n /**\n * 节点类型\n */\n node_type: string;\n}\n\n/**\n * 模板详细信息\n */\nexport interface TemplateSpec {\n /**\n * 快应用ID\n */\n template_id: string;\n /**\n * 线上快应用名称\n */\n template_name: string;\n /**\n * 线上快应用描述\n */\n description: string;\n /**\n * 线上快应用版本\n */\n version: string;\n /**\n * 输入参数列表\n */\n inputs: TemplateSpecInput[];\n /**\n * 输出节点列表\n */\n outputs?: TemplateSpecOutput[];\n}\n\n/**\n * 快应用搜索请求参数\n */\nexport interface AppSearchParams {\n /**\n * 类型,默认值为 comfyui\n * @default \"comfyui\"\n */\n type?: string;\n /**\n * 快应用模板ID列表\n */\n template_ids: string[];\n}\n\n/**\n * 快应用搜索响应结果\n */\nexport interface AppSearchResponse {\n /**\n * 类型\n */\n type: string;\n /**\n * 模板信息列表\n */\n templates: TemplateSpec[];\n}\n\n/**\n * appSearch\n *\n * 快应用通过template_id查询参数\n *\n * 根据提供的模板ID列表,批量查询快应用的参数配置信息。\n * 返回每个模板的详细规格,包括输入参数定义、约束条件等。\n *\n * @example\n * ```typescript\n * import { initSeacloud, appSearch } from 'seacloud-sdk';\n *\n * initSeacloud('your-api-key');\n *\n * const result = await appSearch({\n * type: 'comfyui',\n * template_ids: ['template-id-1', 'template-id-2']\n * });\n *\n * console.log(result.templates);\n * ```\n *\n * @param params 请求参数\n * @returns 模板规格信息\n */\nexport async function appSearch(\n params: AppSearchParams,\n): Promise<AppSearchResponse> {\n const client = getClient();\n const config = client.getConfig();\n\n const url = `${config.baseUrl}/model/v1/template/specs`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeout);\n\n try {\n const requestId = `req-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n 'X-Request-Id': requestId,\n };\n\n // 仅在配置了 xProject 时添加 X-Project header\n if (config.xProject) {\n headers['X-Project'] = config.xProject;\n }\n\n const response = await config.fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(params),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`HTTP ${response.status}: ${errorBody}`);\n }\n\n const result = await response.json();\n return result as AppSearchResponse;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n\n// 保留旧的函数名作为别名,向后兼容\nexport const templateSpecs = appSearch;\nexport type TemplateSpecsParams = AppSearchParams;\nexport type TemplateSpecsResponse = AppSearchResponse;\n","import { getClient } from '../core/global-config.js';\nimport { SeacloudError } from '../core/types.js';\nimport { getApiToken } from '../core/config.js';\n\n/**\n * 风险类型枚举\n */\nexport type RiskType = 'POLITY' | 'EROTIC' | 'VIOLENT' | 'CHILD';\n\n/**\n * 标签项\n */\nexport interface LabelItem {\n /**\n * 标签名称,格式: 场景:类别:具体标签\n */\n name: string;\n /**\n * 标签对应的风险级别 (0-6)\n */\n score: number;\n /**\n * 标签所属的风险类型\n */\n risk_type: RiskType;\n}\n\n/**\n * 视频帧检测结果\n */\nexport interface FrameResult {\n /**\n * 帧索引号\n */\n frame_index: number;\n /**\n * 风险级别\n */\n nsfw_level: number;\n /**\n * 标签列表\n */\n label_items: LabelItem[];\n /**\n * 风险类型列表\n */\n risk_types: RiskType[];\n}\n\n/**\n * 内容安全检测请求参数\n *\n * 参数示例:\n * ```typescript\n * {\n * \"uri\": \"https://example.com/image.jpg\",\n * \"risk_types\": [\"POLITY\", \"EROTIC\", \"VIOLENT\", \"CHILD\"],\n * \"detected_age\": 0,\n * \"is_video\": 0\n * }\n * ```\n */\nexport interface ScanParams {\n /**\n * 图片或视频的URL地址\n * 注意:视频检测必须使用 uri,不支持 img_base64\n */\n uri?: string;\n /**\n * 图片的Base64编码字符串\n * 注意:视频检测不支持 base64 输入\n */\n img_base64?: string;\n /**\n * 需要检测的风险类型列表\n * 可选值:POLITY(政治敏感)、EROTIC(色情内容)、VIOLENT(暴力血腥)、CHILD(儿童安全)\n */\n risk_types: RiskType[];\n /**\n * 是否进行年龄检测,0或1\n * @default 0\n */\n detected_age: number;\n /**\n * 是否为视频文件,0或1\n * @default 0\n */\n is_video: number;\n}\n\n/**\n * 内容安全检测响应结果\n */\nexport interface ScanResponse {\n /**\n * 请求是否成功\n */\n ok: boolean;\n /**\n * 风险级别,范围 0-6\n */\n nsfw_level?: number;\n /**\n * 检测到的标签列表\n */\n label_items?: LabelItem[];\n /**\n * 实际检测到的风险类型列表\n */\n risk_types?: RiskType[];\n /**\n * 年龄组信息 [年龄段代码, 置信度]\n */\n age_group?: any[];\n /**\n * 错误信息\n */\n error?: string;\n /**\n * 视频时长(秒)\n */\n video_duration?: number;\n /**\n * 最高风险帧的索引号\n */\n max_risk_frame?: number;\n /**\n * 总抽帧数量\n */\n frame_count?: number;\n /**\n * 实际检测的帧数\n */\n frames_checked?: number;\n /**\n * 是否因检测到6级风险而提前退出\n */\n early_exit?: boolean;\n /**\n * 每一帧的详细检测结果\n */\n frame_results?: FrameResult[];\n}\n\n/**\n * scan - 内容安全检测\n *\n * 云服务内容安全检测接口,支持图片和视频的风险检测。\n *\n * Features:\n * - 支持图片和视频检测\n * - 多种风险类型检测(政治敏感、色情、暴力、儿童安全)\n * - 风险级别评分(0-6)\n * - 视频逐帧检测\n * - 可选年龄检测\n *\n * @example\n * ```typescript\n * import { initSeacloud, scan } from 'seacloud-sdk';\n *\n * initSeacloud('your-api-key');\n *\n * // 图片检测\n * const imageResult = await scan({\n * uri: \"https://example.com/image.jpg\",\n * risk_types: [\"POLITY\", \"EROTIC\", \"VIOLENT\", \"CHILD\"],\n * detected_age: 0,\n * is_video: 0\n * });\n *\n * console.log(imageResult.nsfw_level); // 风险级别 0-6\n * console.log(imageResult.label_items); // 检测到的标签\n *\n * // 视频检测\n * const videoResult = await scan({\n * uri: \"https://example.com/video.mp4\",\n * risk_types: [\"EROTIC\", \"VIOLENT\"],\n * detected_age: 0,\n * is_video: 1\n * });\n *\n * console.log(videoResult.frame_results); // 每一帧的检测结果\n * ```\n *\n * @param params 请求参数,详见 ScanParams 接口定义\n * @returns 检测结果,包含风险级别、标签等信息\n * @throws {SeacloudError} 当请求失败或参数不合法时抛出错误\n */\nexport async function scan(params: ScanParams): Promise<ScanResponse> {\n // 参数验证\n if (!params.uri && !params.img_base64) {\n throw new SeacloudError('必须提供 uri 或 img_base64 中的至少一个参数');\n }\n\n if (params.is_video === 1 && params.img_base64) {\n throw new SeacloudError('视频检测不支持 base64 输入,必须使用 uri 参数');\n }\n\n if (!params.risk_types || params.risk_types.length === 0) {\n throw new SeacloudError('必须提供至少一个风险类型');\n }\n\n const client = getClient();\n const config = client.getConfig();\n\n // 复用现有的认证和请求逻辑\n const url = `${config.baseUrl}/scan`;\n const token = await getApiToken(config.apiKey);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeout);\n\n try {\n const response = await config.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n },\n body: JSON.stringify(params),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new SeacloudError(\n `HTTP ${response.status}: ${errorBody}`,\n response.status,\n errorBody\n );\n }\n\n const responseData = await response.json() as any;\n\n // 检查是否有包装格式 { success, data }\n let result: ScanResponse;\n if (responseData.success !== undefined && responseData.data) {\n // 服务器返回了包装格式\n result = responseData.data as ScanResponse;\n } else {\n // 直接返回格式\n result = responseData as ScanResponse;\n }\n\n if (!result.ok) {\n throw new SeacloudError(\n `内容安全检测业务错误: ${result.error || '未知错误'}`,\n undefined,\n result\n );\n }\n\n return result;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof SeacloudError) {\n throw error;\n }\n\n if ((error as Error).name === 'AbortError') {\n throw new SeacloudError(`Request timeout after ${config.timeout}ms`);\n }\n\n throw new SeacloudError(\n `Request failed: ${(error as Error).message}`,\n undefined,\n error\n );\n }\n}\n","#!/usr/bin/env node\n\nimport { SeacloudClient } from './core/index.js';\nimport { initSeacloud } from './core/global-config.js';\nimport { llmChatCompletions } from './api/llm_chat_completions.js';\nimport { agentChatCompletions, createTextMessage } from './api/agent_chat_completions.js';\nimport { appSearch } from './api/app_search.js';\nimport { appGeneration } from './api/app_generation.js';\nimport { scan } from './api/scan.js';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\ninterface CliOptions {\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n params?: Record<string, any>;\n}\n\nfunction showHelp() {\n console.log(`\nSeaCloud CLI - Test AI models, LLM, and Agent from command line\n\nUsage:\n seacloud <command> [options]\n\nCommands:\n llm <prompt> Chat with LLM models\n agent <prompt> Chat with Fast Agent (supports image/video generation)\n app <subcommand> App-related operations (search, generation)\n scan <uri> Content safety scan (image/video/audio)\n status <task-id> Query task status by task ID\n <model> Test specific model generation\n\nApp Subcommands:\n app search <ids> Query template specifications by template IDs\n app generation Create generation task from template\n\nLLM Options:\n --model <name> Model name (default: seaart-mix-sonnet-4-5)\n --stream Enable streaming mode\n --temperature <n> Temperature 0-2 (default: 0.7)\n --max-tokens <n> Max tokens to generate\n\nAgent Options:\n --agent-id <id> Agent ID (default: seagen_agent)\n --model <name> Model name (default: gpt-4o)\n --stream Enable streaming mode\n --session-id <id> Session ID for multi-turn conversation\n\nApp Search Options:\n --type <type> Template type (default: comfyui)\n\nApp Generation Options:\n --template-id <id> Template ID (required)\n --params <json> Input parameters as JSON string (required)\n\nScan Options:\n --risk-types <types> Risk types (default: POLITY,EROTIC,VIOLENT,CHILD)\n --detected-age Enable age detection (default: false)\n --api-key <key> API key (or set API_SERVICE_TOKEN env var)\n --base-url <url> Base URL (default: http://proxy.sg.seaverse.dev)\n\nModel Generation Options:\n --api-key <key> API key (or set API_SERVICE_TOKEN env var)\n --base-url <url> Base URL (default: http://proxy.sg.seaverse.dev)\n --params <json> JSON parameters for the model\n\nStatus Query Options:\n --api-key <key> API key (or set API_SERVICE_TOKEN env var)\n --base-url <url> Base URL (default: http://proxy.sg.seaverse.dev)\n\nExamples:\n # Chat with LLM (non-streaming)\n seacloud llm \"What is the capital of France?\"\n\n # Chat with LLM (streaming)\n seacloud llm \"Tell me a story\" --stream\n\n # Chat with LLM using specific model\n seacloud llm \"Hello\" --model deepseek-v3.1 --temperature 1.0\n\n # Chat with Agent (can generate images)\n seacloud agent \"Generate an image of a sunset\"\n\n # Chat with Agent (streaming)\n seacloud agent \"Create a cat image\" --stream\n\n # Query template specifications (app search)\n seacloud app search \"template-id-1,template-id-2\"\n seacloud app search \"template-abc\" --type comfyui\n\n # Create generation task (app generation)\n seacloud app generation --template-id \"d26trpte878eqsnm3bjg\" --params '[{\"field\":\"prompt1\",\"value\":\"hello\"}]'\n\n # Query task status\n seacloud status d123456789abcdef\n\n # Scan image\n seacloud scan \"https://example.com/image.jpg\"\n\n # Scan video with custom risk types\n seacloud scan \"https://example.com/video.mp4\" --risk-types EROTIC,VIOLENT\n\n # Scan with age detection\n seacloud scan \"https://example.com/photo.jpg\" --detected-age\n\n # Test model generation\n seacloud flux_1_1_pro --params '{\"prompt\":\"a beautiful sunset\"}'\n\n # Use custom API key\n seacloud llm \"Hello\" --api-key sa-xxx\n\nEnvironment Variables:\n API_SERVICE_TOKEN API authentication token (required)\n SEACLOUD_BASE_URL Base URL for API endpoints\n`);\n}\n\nfunction parseArgs(args: string[]): CliOptions {\n const options: CliOptions = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n switch (arg) {\n case '--api-key':\n options.apiKey = args[++i];\n break;\n case '--base-url':\n options.baseUrl = args[++i];\n break;\n case '--model':\n options.model = args[++i];\n break;\n case '--params':\n try {\n options.params = JSON.parse(args[++i]);\n } catch (e) {\n console.error('Error: Invalid JSON for --params');\n process.exit(1);\n }\n break;\n }\n }\n\n return options;\n}\n\nasync function testModel(model: string, options: CliOptions) {\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n if (!options.params) {\n console.error('Error: --params required. Provide JSON parameters for the model');\n process.exit(1);\n }\n\n console.log(`Testing model: ${model}`);\n console.log(`Base URL: ${baseUrl}`);\n console.log(`Parameters:`, JSON.stringify(options.params, null, 2));\n console.log('');\n\n const client = new SeacloudClient({ apiKey, baseUrl });\n\n try {\n console.log('Creating task...');\n const task = await client.createTask('/model/v1/generation', {\n model,\n input: [{ params: options.params }],\n });\n\n console.log(`Task created: ${task.id}`);\n console.log(`Initial status: ${task.status}`);\n console.log('');\n\n if (task.status === 'failed') {\n console.error('Task failed immediately:', task.error);\n process.exit(1);\n }\n\n console.log('Polling for results...');\n let attempt = 0;\n const maxAttempts = 120;\n const intervalMs = 3000;\n\n while (attempt < maxAttempts) {\n attempt++;\n\n const result = await client.getTaskStatus('/model/v1/generation', task.id);\n process.stdout.write(`\\rAttempt ${attempt}/${maxAttempts} - Status: ${result.status} `);\n\n if (result.status === 'completed') {\n console.log('\\n\\nTask completed!');\n console.log('\\nResults:');\n console.log(JSON.stringify(result.output, null, 2));\n\n // Extract URLs if available\n if (result.output) {\n const urls: string[] = [];\n for (const item of result.output) {\n if (item.content) {\n for (const resource of item.content) {\n if (resource.url) {\n urls.push(resource.url);\n }\n }\n }\n }\n\n if (urls.length > 0) {\n console.log('\\nGenerated URLs:');\n urls.forEach((url, i) => {\n console.log(` ${i + 1}. ${url}`);\n });\n }\n }\n\n process.exit(0);\n }\n\n if (result.status === 'failed') {\n console.log('\\n\\nTask failed!');\n console.error('Error:', result.error);\n process.exit(1);\n }\n\n await new Promise(resolve => setTimeout(resolve, intervalMs));\n }\n\n console.log('\\n\\nTimeout: Task did not complete within the time limit');\n process.exit(1);\n\n } catch (error: any) {\n console.error('\\nError:', error.message);\n process.exit(1);\n }\n}\n\nasync function runLlm(prompt: string, args: string[]) {\n const options: any = { stream: false, model: 'seaart-mix-sonnet-4-5', temperature: 0.7 };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--model') options.model = args[++i];\n else if (arg === '--stream') options.stream = true;\n else if (arg === '--temperature') options.temperature = parseFloat(args[++i]);\n else if (arg === '--max-tokens') options.maxTokens = parseInt(args[++i]);\n else if (arg === '--api-key') options.apiKey = args[++i];\n else if (arg === '--base-url') options.baseUrl = args[++i];\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n initSeacloud(apiKey, { baseUrl, timeout: 120000 });\n\n console.log(`Model: ${options.model}`);\n console.log(`Prompt: ${prompt}\\n`);\n\n if (options.stream) {\n const stream = await llmChatCompletions({\n model: options.model,\n messages: [{ role: 'user', content: prompt }],\n stream: true,\n temperature: options.temperature,\n max_tokens: options.maxTokens,\n });\n\n process.stdout.write('Response: ');\n for await (const chunk of stream) {\n const content = chunk.choices[0]?.delta?.content;\n if (typeof content === 'string') process.stdout.write(content);\n }\n console.log('\\n');\n } else {\n const response = await llmChatCompletions({\n model: options.model,\n messages: [{ role: 'user', content: prompt }],\n stream: false,\n temperature: options.temperature,\n max_tokens: options.maxTokens,\n });\n\n console.log('Response:', response.choices[0].message.content);\n console.log('\\nUsage:', response.usage);\n }\n}\n\nasync function runAgent(prompt: string, args: string[]) {\n const options: any = {\n stream: false,\n model: 'gpt-4o',\n agentId: 'seagen_agent',\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--model') options.model = args[++i];\n else if (arg === '--stream') options.stream = true;\n else if (arg === '--agent-id') options.agentId = args[++i];\n else if (arg === '--session-id') options.sessionId = args[++i];\n else if (arg === '--api-key') options.apiKey = args[++i];\n else if (arg === '--base-url') options.baseUrl = args[++i];\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n initSeacloud(apiKey, { baseUrl, timeout: 300000 }); // 5 min for agent\n\n console.log(`Agent: ${options.agentId}`);\n console.log(`Model: ${options.model}`);\n console.log(`Prompt: ${prompt}\\n`);\n\n if (options.stream) {\n const stream = await agentChatCompletions({\n agent_id: options.agentId,\n messages: [createTextMessage('user', prompt)],\n model: options.model,\n stream: true,\n session_id: options.sessionId,\n seq: 0,\n });\n\n process.stdout.write('Response: ');\n for await (const chunk of stream) {\n const content = chunk.choices[0]?.delta?.content;\n if (typeof content === 'string') process.stdout.write(content);\n }\n console.log('\\n');\n } else {\n const response = await agentChatCompletions({\n agent_id: options.agentId,\n messages: [createTextMessage('user', prompt)],\n model: options.model,\n stream: false,\n session_id: options.sessionId,\n seq: 0,\n });\n\n console.log('Response:', response.choices[0].message.content);\n\n if (response.artifacts && response.artifacts.length > 0) {\n console.log('\\nGenerated Artifacts:');\n response.artifacts.forEach((artifact, i) => {\n console.log(` ${i + 1}. ${artifact.name}`);\n console.log(` URL: ${artifact.url}`);\n });\n }\n\n console.log('\\nSession ID:', response.session_id);\n console.log('Message ID:', response.msg_id);\n }\n}\n\nasync function runAppGeneration(args: string[]) {\n const options: any = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--template-id') options.templateId = args[++i];\n else if (arg === '--params') {\n try {\n options.params = JSON.parse(args[++i]);\n } catch (e) {\n console.error('Error: --params must be valid JSON array');\n console.error('Example: --params \\'[{\"field\":\"prompt1\",\"value\":\"hello\"}]\\'');\n process.exit(1);\n }\n }\n else if (arg === '--api-key') options.apiKey = args[++i];\n else if (arg === '--base-url') options.baseUrl = args[++i];\n }\n\n if (!options.templateId) {\n console.error('Error: --template-id required');\n console.error('Usage: seacloud app generation --template-id <id> --params <json>');\n process.exit(1);\n }\n\n if (!options.params) {\n console.error('Error: --params required');\n console.error('Usage: seacloud app generation --template-id <id> --params <json>');\n console.error('Example: --params \\'[{\"field\":\"prompt1\",\"value\":\"hello\"}]\\'');\n process.exit(1);\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n const client = new SeacloudClient({ apiKey, baseUrl });\n\n try {\n console.log('Creating task...');\n const task = await client.createTask('/model/v1/generation', {\n model: 'comfyui',\n input: [{ params: { template_id: options.templateId, inputs: options.params } }],\n });\n\n console.log(`Task created: ${task.id}`);\n console.log(`Initial status: ${task.status}`);\n console.log('');\n\n if (task.status === 'failed') {\n console.error('Task failed immediately:', task.error);\n process.exit(1);\n }\n\n console.log('Polling for results...');\n let attempt = 0;\n const maxAttempts = 120;\n const intervalMs = 3000;\n\n while (attempt < maxAttempts) {\n attempt++;\n\n const result = await client.getTaskStatus('/model/v1/generation', task.id);\n process.stdout.write(`\\rAttempt ${attempt}/${maxAttempts} - Status: ${result.status} `);\n\n if (result.status === 'completed') {\n console.log('\\n\\nTask completed!');\n console.log('\\nResults:');\n console.log(JSON.stringify(result, null, 2));\n\n process.exit(0);\n }\n\n if (result.status === 'failed') {\n console.log('\\n\\nTask failed!');\n console.error('Error:', result.error);\n process.exit(1);\n }\n\n await new Promise(resolve => setTimeout(resolve, intervalMs));\n }\n\n console.log('\\n\\nTimeout: Task did not complete within the time limit');\n process.exit(1);\n\n } catch (error: any) {\n console.error('\\nError:', error.message);\n process.exit(1);\n }\n}\n\nasync function runAppSearch(templateIdsStr: string, args: string[]) {\n const options: any = { type: 'comfyui' };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--type') options.type = args[++i];\n else if (arg === '--api-key') options.apiKey = args[++i];\n else if (arg === '--base-url') options.baseUrl = args[++i];\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n initSeacloud(apiKey, { baseUrl });\n\n const templateIds = templateIdsStr.split(',').map(id => id.trim());\n\n const result = await appSearch({\n type: options.type,\n template_ids: templateIds,\n });\n\n console.log(JSON.stringify(result, null, 2));\n}\n\n/**\n * 检测 URI 是否为视频或音频\n */\nfunction detectMediaType(uri: string): { isVideo: number; mediaType: string } {\n // 视频扩展名正则(不区分大小写)\n const videoExtRegex = /\\.(?:mp4|avi|mkv|mov|flv|wmv|webm|m4v|3gp|ts|mts|mpeg|mpg|vob|ogv|m2ts|divx|rm|rmvb|asf|f4v)(?:[^a-z0-9]|$)/i;\n\n // 音频扩展名正则(不区分大小写)\n const audioExtRegex = /\\.(?:mp3|wav|ogg|m4a|aac|flac|wma|m4b|m4p|m4r)(?:[^a-z0-9]|$)/i;\n\n if (videoExtRegex.test(uri)) {\n return { isVideo: 1, mediaType: 'video' };\n }\n\n if (audioExtRegex.test(uri)) {\n return { isVideo: 1, mediaType: 'audio' };\n }\n\n return { isVideo: 0, mediaType: 'image' };\n}\n\nasync function runScan(uri: string, args: string[]) {\n const options: any = {\n riskTypes: ['POLITY', 'EROTIC', 'VIOLENT', 'CHILD'],\n detectedAge: false,\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--risk-types') {\n options.riskTypes = args[++i].split(',').map((t: string) => t.trim());\n } else if (arg === '--detected-age') {\n options.detectedAge = true;\n } else if (arg === '--api-key') {\n options.apiKey = args[++i];\n } else if (arg === '--base-url') {\n options.baseUrl = args[++i];\n }\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n initSeacloud(apiKey, { baseUrl });\n\n // 自动检测媒体类型\n const { isVideo, mediaType } = detectMediaType(uri);\n\n console.log(`资源地址: ${uri}`);\n console.log(`媒体类型: ${mediaType}`);\n console.log(`风险类型: ${options.riskTypes.join(', ')}`);\n console.log(`年龄检测: ${options.detectedAge ? '启用' : '禁用'}`);\n console.log('');\n\n try {\n const result = await scan({\n uri,\n risk_types: options.riskTypes,\n detected_age: options.detectedAge ? 1 : 0,\n is_video: isVideo,\n });\n\n console.log('✅ 扫描完成!\\n');\n console.log(`请求状态: ${result.ok ? '成功' : '失败'}`);\n\n if (result.nsfw_level !== undefined) {\n console.log(`风险级别: ${result.nsfw_level} (0-6)`);\n }\n\n if (result.risk_types && result.risk_types.length > 0) {\n console.log(`检测到的风险类型: ${result.risk_types.join(', ')}`);\n }\n\n if (result.age_group && result.age_group.length > 0) {\n console.log(`年龄组: ${JSON.stringify(result.age_group)}`);\n }\n\n // 视频特有字段\n if (isVideo === 1) {\n if (result.video_duration !== undefined) {\n console.log(`视频时长: ${result.video_duration} 秒`);\n }\n if (result.frame_count !== undefined) {\n console.log(`总抽帧数: ${result.frame_count}`);\n }\n if (result.frames_checked !== undefined) {\n console.log(`实际检测帧数: ${result.frames_checked}`);\n }\n if (result.max_risk_frame !== undefined) {\n console.log(`最高风险帧索引: ${result.max_risk_frame}`);\n }\n if (result.early_exit !== undefined) {\n console.log(`提前退出: ${result.early_exit ? '是' : '否'}`);\n }\n }\n\n // 显示标签详情\n if (result.label_items && result.label_items.length > 0) {\n console.log(`\\n检测到的标签 (${result.label_items.length} 个):`);\n result.label_items.forEach((item, i) => {\n console.log(` ${i + 1}. ${item.name}`);\n console.log(` 风险级别: ${item.score}, 类型: ${item.risk_type}`);\n });\n }\n\n // 显示帧检测结果(前5帧)\n if (result.frame_results && result.frame_results.length > 0) {\n console.log(`\\n帧检测结果 (前5帧):`);\n result.frame_results.slice(0, 5).forEach((frame) => {\n console.log(` 帧 ${frame.frame_index}: 风险级别 ${frame.nsfw_level}, 标签数 ${frame.label_items.length}`);\n });\n if (result.frame_results.length > 5) {\n console.log(` ... 还有 ${result.frame_results.length - 5} 帧结果`);\n }\n }\n\n if (result.error) {\n console.log(`\\n❌ 错误: ${result.error}`);\n }\n\n } catch (error: any) {\n console.error('\\n❌ 扫描失败:', error.message);\n process.exit(1);\n }\n}\n\nasync function runTaskStatus(taskId: string, args: string[]) {\n const options: any = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--api-key') options.apiKey = args[++i];\n else if (arg === '--base-url') options.baseUrl = args[++i];\n }\n\n const apiKey = options.apiKey || process.env.API_SERVICE_TOKEN || '';\n const baseUrl = options.baseUrl || process.env.SEACLOUD_BASE_URL || 'http://proxy.sg.seaverse.dev';\n\n const client = new SeacloudClient({ apiKey, baseUrl });\n\n console.log(`Querying task status...`);\n console.log(`Task ID: ${taskId}`);\n console.log(`Base URL: ${baseUrl}\\n`);\n\n try {\n const result = await client.getTaskStatus('/model/v1/generation', taskId);\n\n console.log(`Status: ${result.status}`);\n console.log(`Task ID: ${result.id}\\n`);\n\n if (result.status === 'completed') {\n console.log('✅ Task completed successfully!\\n');\n console.log('Output:');\n console.log(JSON.stringify(result.output, null, 2));\n\n // Extract URLs if available\n if (result.output) {\n const urls: string[] = [];\n for (const item of result.output) {\n if (item.content) {\n for (const resource of item.content) {\n if (resource.url) {\n urls.push(resource.url);\n }\n }\n }\n }\n\n if (urls.length > 0) {\n console.log('\\nGenerated URLs:');\n urls.forEach((url, i) => {\n console.log(` ${i + 1}. ${url}`);\n });\n }\n }\n } else if (result.status === 'failed') {\n console.log('❌ Task failed!\\n');\n console.log('Error:', JSON.stringify(result.error, null, 2));\n } else if (result.status === 'processing') {\n console.log('⏳ Task is still processing...');\n console.log('Please check again later.');\n } else if (result.status === 'pending') {\n console.log('⏳ Task is pending...');\n console.log('Please check again later.');\n } else {\n console.log('Full result:');\n console.log(JSON.stringify(result, null, 2));\n }\n\n } catch (error: any) {\n console.error('\\nError querying task status:', error.message);\n if (error.statusCode) {\n console.error('HTTP Status Code:', error.statusCode);\n }\n process.exit(1);\n }\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {\n showHelp();\n process.exit(0);\n }\n\n const command = args[0];\n\n try {\n if (command === 'llm') {\n if (args.length < 2) {\n console.error('Error: prompt required for llm command');\n console.log('Usage: seacloud llm \"<prompt>\" [options]');\n process.exit(1);\n }\n await runLlm(args[1], args.slice(2));\n } else if (command === 'agent') {\n if (args.length < 2) {\n console.error('Error: prompt required for agent command');\n console.log('Usage: seacloud agent \"<prompt>\" [options]');\n process.exit(1);\n }\n await runAgent(args[1], args.slice(2));\n } else if (command === 'scan') {\n if (args.length < 2) {\n console.error('Error: URI required for scan command');\n console.log('Usage: seacloud scan \"<uri>\" [options]');\n process.exit(1);\n }\n await runScan(args[1], args.slice(2));\n } else if (command === 'status') {\n if (args.length < 2) {\n console.error('Error: task ID required for status command');\n console.log('Usage: seacloud status <task-id> [options]');\n process.exit(1);\n }\n await runTaskStatus(args[1], args.slice(2));\n } else if (command === 'app') {\n const subcommand = args[1];\n if (!subcommand) {\n console.error('Error: subcommand required for app command');\n console.log('Usage: seacloud app <subcommand> [options]');\n console.log('Subcommands: search, generation');\n process.exit(1);\n }\n\n if (subcommand === 'search') {\n if (args.length < 3) {\n console.error('Error: template IDs required for app search command');\n console.log('Usage: seacloud app search \"<id1,id2,...>\" [options]');\n process.exit(1);\n }\n await runAppSearch(args[2], args.slice(3));\n } else if (subcommand === 'generation') {\n await runAppGeneration(args.slice(2));\n } else {\n console.error(`Error: unknown subcommand '${subcommand}'`);\n console.log('Available subcommands: search, generation');\n process.exit(1);\n }\n } else {\n // Model generation command\n const model = command;\n\n if (model.startsWith('--')) {\n console.error('Error: command or model name required');\n console.log('Usage: seacloud <command> [options]');\n process.exit(1);\n }\n\n const options = parseArgs(args.slice(1));\n await testModel(model, options);\n }\n } catch (error: any) {\n console.error('\\nError:', error.message);\n process.exit(1);\n }\n}\n\nmain().catch(console.error);\n"]}