mimo-cli 0.1.1 → 0.1.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/mimo.mjs +92 -81
- package/dist/mimo.mjs.map +13 -13
- package/dist/sdk.mjs +19 -4
- package/dist/sdk.mjs.map +5 -5
- package/package.json +1 -1
package/dist/sdk.mjs
CHANGED
|
@@ -270,13 +270,22 @@ Set env var: MIMO_API_KEY=<key>`
|
|
|
270
270
|
"config.setTimeout": { zh: "timeout 必须为正数。", en: "timeout must be a positive number." },
|
|
271
271
|
"config.setOutput": { zh: 'output 必须为 "text" 或 "json"。', en: 'output must be "text" or "json".' },
|
|
272
272
|
"config.setDone": { zh: "已设置", en: "Set" },
|
|
273
|
+
"config.invalidActiveKey": { zh: 'active_key 必须为 "tp" 或 "sk"。', en: 'active_key must be "tp" or "sk".' },
|
|
274
|
+
"config.switchKey": { zh: "已切换为{type} Key({url})", en: "Switched to {type} key ({url})" },
|
|
273
275
|
"config.corrupted": { zh: "警告:配置文件已损坏(", en: "Warning: config file is corrupted (" },
|
|
274
276
|
"config.corruptedHint": { zh: `)。运行 "mimo config set" 重置。
|
|
275
277
|
`, en: `). Run 'mimo config set' to reset.
|
|
276
278
|
` },
|
|
277
|
-
"update.
|
|
278
|
-
|
|
279
|
-
|
|
279
|
+
"update.checking": { zh: "正在检查更新...", en: "Checking for updates..." },
|
|
280
|
+
"update.checkFailed": { zh: "无法检查更新,请检查网络连接。", en: "Failed to check for updates. Please check your network connection." },
|
|
281
|
+
"update.currentVersion": { zh: "当前版本:{version}", en: "Current version: {version}" },
|
|
282
|
+
"update.latestVersion": { zh: "最新版本:{version}", en: "Latest version: {version}" },
|
|
283
|
+
"update.alreadyLatest": { zh: "已是最新版本,无需更新。", en: "Already up to date." },
|
|
284
|
+
"update.updating": { zh: "正在更新至 v{version}...", en: "Updating to v{version}..." },
|
|
285
|
+
"update.success": { zh: "更新成功!已升级至 v{version}。", en: "Update successful! Upgraded to v{version}." },
|
|
286
|
+
"update.updateFailed": { zh: "npm update 失败,尝试 npm install...", en: "npm update failed, trying npm install..." },
|
|
287
|
+
"update.installFailed": { zh: "自动更新失败。", en: "Auto-update failed." },
|
|
288
|
+
"update.manualHint": { zh: "请手动执行:npm install -g mimo-cli@latest", en: "Please run manually: npm install -g mimo-cli@latest" },
|
|
280
289
|
"repl.intro": { zh: "MiMo 交互对话 — 输入 /exit 退出,/clear 清空对话", en: "MiMo REPL — type /exit to quit, /clear to reset" },
|
|
281
290
|
"repl.you": { zh: "你", en: "You" },
|
|
282
291
|
"repl.placeholder": { zh: "输入你的消息...", en: "Type your message..." },
|
|
@@ -372,9 +381,15 @@ function resolveCredential(config) {
|
|
|
372
381
|
if (envKey) {
|
|
373
382
|
return { token: envKey, method: "api-key", source: "env" };
|
|
374
383
|
}
|
|
384
|
+
if (config.activeKey === "sk" && config.fileSkApiKey) {
|
|
385
|
+
return { token: config.fileSkApiKey, method: "api-key", source: "config.json" };
|
|
386
|
+
}
|
|
375
387
|
if (config.fileApiKey) {
|
|
376
388
|
return { token: config.fileApiKey, method: "api-key", source: "config.json" };
|
|
377
389
|
}
|
|
390
|
+
if (config.fileSkApiKey) {
|
|
391
|
+
return { token: config.fileSkApiKey, method: "api-key", source: "config.json" };
|
|
392
|
+
}
|
|
378
393
|
throw new CLIError("No credentials found.", ExitCode.AUTH, `Log in: mimo auth login
|
|
379
394
|
Pass directly: --api-key <key>
|
|
380
395
|
Set env var: MIMO_API_KEY=<key>`);
|
|
@@ -818,5 +833,5 @@ export {
|
|
|
818
833
|
ASRSDK
|
|
819
834
|
};
|
|
820
835
|
|
|
821
|
-
//# debugId=
|
|
836
|
+
//# debugId=F666A5B285CB002564756E2164756E21
|
|
822
837
|
//# sourceMappingURL=sdk.mjs.map
|
package/dist/sdk.mjs.map
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import OpenAI from 'openai';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n} from 'openai/resources/chat/completions';\nimport type { Stream } from 'openai/streaming';\nimport type { ChatRequest, MiMoChatCompletion, MiMoChatCompletionChunk, ToolDef } from '../types/api';\nimport { VERSION } from '../version';\nimport { wrapApiError } from './errors';\n\nconst DEFAULT_BASE_URL = 'https://api.xiaomimimo.com/v1';\nconst DEFAULT_TIMEOUT_SEC = 300;\n\nexport interface MiMoClientConfig {\n apiKey: string;\n baseURL?: string;\n timeout?: number;\n}\n\n/**\n * MiMo API client that wraps the OpenAI SDK.\n * MiMo API is OpenAI-compatible, so we reuse the SDK's chat.completions endpoint.\n */\nexport class MiMoClient {\n private openai: OpenAI;\n\n constructor(config: MiMoClientConfig) {\n this.openai = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseURL || DEFAULT_BASE_URL,\n timeout: (config.timeout ?? DEFAULT_TIMEOUT_SEC) * 1000,\n defaultHeaders: {\n 'User-Agent': `mimo-cli/${VERSION}`,\n },\n });\n }\n\n /**\n * 构建 OpenAI SDK 兼容的请求参数,将 MiMo 特有字段提取到 extraBody 中。\n * OpenAI SDK 会将 extraBody 中的字段透传到请求体,无需 as any。\n *\n * 注意:OpenAI SDK 的 tools 参数只接受 type: 'function' 的工具定义,\n * MiMo 的 web_search 工具需要通过额外请求体透传。\n */\n private buildRequestParams(params: ChatRequest, stream: boolean): Record<string, unknown> {\n const { thinking, asr_options, audio, tools, ...openaiParams } = params;\n\n const result: Record<string, unknown> = {\n ...openaiParams,\n stream,\n thinking,\n asr_options,\n audio,\n };\n\n // MiMo API 的 tools 参数同时支持 function 和 web_search 类型,\n // 但 OpenAI SDK 只接受 function 类型,因此需要直接透传原始 tools 数组\n if (tools && tools.length > 0) {\n result.tools = tools;\n }\n\n return result;\n }\n\n /**\n * Non-streaming chat completion.\n * 返回 MiMoChatCompletion 类型。由于 OpenAI SDK 的 ChatCompletion 类型\n * 不包含 MiMo 扩展字段(reasoning_content 等),需要类型转换。\n * 运行时 MiMo API 返回的数据结构是兼容的,因此此转换是安全的。\n */\n async chatCompletion(\n params: ChatRequest,\n ): Promise<MiMoChatCompletion> {\n try {\n const requestParams = this.buildRequestParams(params, false);\n // 请求参数类型转换:MiMo 特有字段通过 OpenAI SDK 透传\n const response = await this.openai.chat.completions.create(\n requestParams as unknown as Parameters<typeof this.openai.chat.completions.create>[0],\n );\n // 响应类型转换:OpenAI ChatCompletion → MiMoChatCompletion(运行时结构兼容)\n return response as unknown as MiMoChatCompletion;\n } catch (err) {\n throw wrapApiError(err);\n }\n }\n\n /**\n * Streaming chat completion.\n * 返回 Stream<ChatCompletionChunk>,MiMo 扩展字段在 delta 中通过运行时透传。\n * 使用 extractDelta() 辅助函数可安全提取 MiMo 扩展字段。\n */\n async chatCompletionStream(\n params: ChatRequest,\n ): Promise<Stream<ChatCompletionChunk>> {\n try {\n const requestParams = this.buildRequestParams(params, true);\n // 请求参数类型转换同 chatCompletion\n return await this.openai.chat.completions.create(\n requestParams as unknown as Parameters<typeof this.openai.chat.completions.create>[0],\n ) as Stream<ChatCompletionChunk>;\n } catch (err) {\n throw wrapApiError(err);\n }\n }\n\n /**\n * Convenience method: detect the `stream` parameter and call the\n * appropriate method. MiMo-specific fields (thinking, asr_options, audio)\n * are passed through the request body.\n *\n * Returns either a MiMoChatCompletion (non-streaming) or a Stream<ChatCompletionChunk> (streaming).\n */\n async chat(\n params: ChatRequest,\n ): Promise<MiMoChatCompletion | Stream<ChatCompletionChunk>> {\n const isStreaming = params.stream === true;\n\n if (isStreaming) {\n return this.chatCompletionStream(params);\n }\n\n return this.chatCompletion(params);\n }\n\n /**\n * Access the underlying OpenAI instance for advanced usage.\n */\n get raw(): OpenAI {\n return this.openai;\n }\n}\n\nexport { wrapApiError } from './errors';\nexport { createClient } from './errors';\n",
|
|
6
6
|
"export const VERSION = process.env.CLI_VERSION ?? '0.1.0';\n",
|
|
7
|
-
"import OpenAI from 'openai';\nimport type { APIError } from 'openai';\nimport { CLIError } from '../errors/base';\nimport { ExitCode } from '../errors/codes';\nimport { mapApiError, type ApiErrorBody } from '../errors/api';\nimport { MiMoClient } from './index';\nimport { extractErrorUrl } from '../types/api';\nimport { resolveCredential, inferBaseUrlFromKey } from '../auth/resolver';\nimport type { Config } from '../config/schema';\n\n/**\n * Extract the URL from an OpenAI APIError.\n * 使用 extractErrorUrl 辅助函数安全访问运行时属性。\n */\nfunction getErrorUrl(err: APIError): string {\n return extractErrorUrl(err);\n}\n\n/**\n * Wrap an unknown error (typically from the OpenAI SDK) into a CLIError.\n */\nexport function wrapApiError(err: unknown): CLIError {\n if (err instanceof CLIError) {\n return err;\n }\n\n if (err instanceof OpenAI.APIConnectionError) {\n return new CLIError(\n 'Network request failed.',\n ExitCode.NETWORK,\n 'Check your network connection.\\n' +\n 'To use a proxy: set HTTPS_PROXY env var, or run: mimo config set proxy http://HOST:PORT',\n );\n }\n\n if (err instanceof OpenAI.RateLimitError) {\n const body = (err.error as ApiErrorBody) ?? {};\n return mapApiError(err.status ?? 429, body, getErrorUrl(err));\n }\n\n if (err instanceof OpenAI.AuthenticationError) {\n const body = (err.error as ApiErrorBody) ?? {};\n return mapApiError(err.status ?? 401, body, getErrorUrl(err));\n }\n\n if (err instanceof OpenAI.BadRequestError) {\n const body = (err.error as ApiErrorBody) ?? {};\n return mapApiError(err.status ?? 400, body, getErrorUrl(err));\n }\n\n if (err instanceof OpenAI.APIError) {\n const body = (err.error as ApiErrorBody) ?? {};\n return mapApiError(err.status ?? 0, body, getErrorUrl(err));\n }\n\n // Generic error fallback\n if (err instanceof Error) {\n if (\n err.name === 'AbortError' ||\n err.name === 'TimeoutError' ||\n err.message.includes('timed out')\n ) {\n return new CLIError(\n 'Request timed out.',\n ExitCode.TIMEOUT,\n 'Try increasing --timeout (e.g. --timeout 60).',\n );\n }\n\n return new CLIError(err.message, ExitCode.GENERAL);\n }\n\n return new CLIError(String(err), ExitCode.GENERAL);\n}\n\nexport interface ClientConfig {\n apiKey?: string;\n fileApiKey?: string;\n baseURL?: string;\n baseUrl?: string; // Config 类型使用 baseUrl(小写 u)\n timeout?: number;\n}\n\n/**\n * Resolve the API key from config, env, or credential store.\n * 使用统一的 resolveCredential 函数,支持 flag / env / config.json 三种来源。\n */\nfunction resolveApiKey(config?: Partial<ClientConfig>): string {\n if (config) {\n // 构造一个最小 Config 对象传给 resolveCredential\n const partialConfig: Partial<Config> = {\n apiKey: config.apiKey,\n fileApiKey: config.fileApiKey,\n };\n try {\n return resolveCredential(partialConfig as Config).token;\n } catch {\n // resolveCredential 抛出异常,继续尝试下面的方式\n }\n }\n\n // 环境变量兜底\n const envKey = process.env.MIMO_API_KEY ?? process.env.MIMO_API_TOKEN;\n if (envKey) {\n return envKey;\n }\n\n throw new CLIError(\n 'No API key provided.',\n ExitCode.AUTH,\n 'Set your API key:\\n' +\n ' mimo auth login — interactive login\\n' +\n ' export MIMO_API_KEY=... — via environment variable\\n' +\n ' mimo chat --api-key ... — via flag',\n );\n}\n\n/**\n * Resolve the base URL from config or env.\n * 同时支持 baseURL(ClientConfig)和 baseUrl(Config)两种命名。\n * 如果没有显式配置 base URL,则根据 API Key 前缀自动推断。\n */\nfunction resolveBaseURL(config?: Partial<ClientConfig>): string | undefined {\n if (config?.baseURL) {\n return config.baseURL;\n }\n if (config?.baseUrl) {\n return config.baseUrl;\n }\n if (process.env.MIMO_BASE_URL) {\n return process.env.MIMO_BASE_URL;\n }\n\n // 根据 API Key 前缀自动推断 base URL\n const apiKey = config?.apiKey || config?.fileApiKey;\n if (apiKey) {\n const inferred = inferBaseUrlFromKey(apiKey);\n if (inferred) {\n return inferred;\n }\n }\n\n return undefined;\n}\n\n/**\n * Factory: create a MiMoClient from partial config.\n * Resolves API key and base URL from environment if not provided.\n */\nexport function createClient(config?: Partial<ClientConfig>): MiMoClient {\n const apiKey = resolveApiKey(config);\n const baseURL = resolveBaseURL(config);\n\n return new MiMoClient({\n apiKey,\n baseURL,\n timeout: config?.timeout,\n });\n}\n",
|
|
7
|
+
"import OpenAI from 'openai';\nimport type { APIError } from 'openai';\nimport { CLIError } from '../errors/base';\nimport { ExitCode } from '../errors/codes';\nimport { mapApiError, type ApiErrorBody } from '../errors/api';\nimport { MiMoClient } from './index';\nimport { extractErrorUrl } from '../types/api';\nimport { resolveCredential, inferBaseUrlFromKey } from '../auth/resolver';\nimport type { Config } from '../config/schema';\n\n/**\n * Extract the URL from an OpenAI APIError.\n * 使用 extractErrorUrl 辅助函数安全访问运行时属性。\n */\nfunction getErrorUrl(err: APIError): string {\n return extractErrorUrl(err);\n}\n\n/**\n * Wrap an unknown error (typically from the OpenAI SDK) into a CLIError.\n */\nexport function wrapApiError(err: unknown): CLIError {\n if (err instanceof CLIError) {\n return err;\n }\n\n if (err instanceof OpenAI.APIConnectionError) {\n return new CLIError(\n 'Network request failed.',\n ExitCode.NETWORK,\n 'Check your network connection.\\n' +\n 'To use a proxy: set HTTPS_PROXY env var, or run: mimo config set proxy http://HOST:PORT',\n );\n }\n\n if (err instanceof OpenAI.RateLimitError) {\n const body = (err.error as ApiErrorBody) ?? {};\n return mapApiError(err.status ?? 429, body, getErrorUrl(err));\n }\n\n if (err instanceof OpenAI.AuthenticationError) {\n const body = (err.error as ApiErrorBody) ?? {};\n return mapApiError(err.status ?? 401, body, getErrorUrl(err));\n }\n\n if (err instanceof OpenAI.BadRequestError) {\n const body = (err.error as ApiErrorBody) ?? {};\n return mapApiError(err.status ?? 400, body, getErrorUrl(err));\n }\n\n if (err instanceof OpenAI.APIError) {\n const body = (err.error as ApiErrorBody) ?? {};\n return mapApiError(err.status ?? 0, body, getErrorUrl(err));\n }\n\n // Generic error fallback\n if (err instanceof Error) {\n if (\n err.name === 'AbortError' ||\n err.name === 'TimeoutError' ||\n err.message.includes('timed out')\n ) {\n return new CLIError(\n 'Request timed out.',\n ExitCode.TIMEOUT,\n 'Try increasing --timeout (e.g. --timeout 60).',\n );\n }\n\n return new CLIError(err.message, ExitCode.GENERAL);\n }\n\n return new CLIError(String(err), ExitCode.GENERAL);\n}\n\nexport interface ClientConfig {\n apiKey?: string;\n fileApiKey?: string;\n fileSkApiKey?: string;\n activeKey?: 'tp' | 'sk';\n baseURL?: string;\n baseUrl?: string; // Config 类型使用 baseUrl(小写 u)\n timeout?: number;\n}\n\n/**\n * Resolve the API key from config, env, or credential store.\n * 使用统一的 resolveCredential 函数,支持 flag / env / config.json 三种来源。\n */\nfunction resolveApiKey(config?: Partial<ClientConfig>): string {\n if (config) {\n // 构造一个最小 Config 对象传给 resolveCredential\n const partialConfig: Partial<Config> = {\n apiKey: config.apiKey,\n fileApiKey: config.fileApiKey,\n fileSkApiKey: config.fileSkApiKey,\n activeKey: config.activeKey,\n };\n try {\n return resolveCredential(partialConfig as Config).token;\n } catch {\n // resolveCredential 抛出异常,继续尝试下面的方式\n }\n }\n\n // 环境变量兜底\n const envKey = process.env.MIMO_API_KEY ?? process.env.MIMO_API_TOKEN;\n if (envKey) {\n return envKey;\n }\n\n throw new CLIError(\n 'No API key provided.',\n ExitCode.AUTH,\n 'Set your API key:\\n' +\n ' mimo auth login — interactive login\\n' +\n ' export MIMO_API_KEY=... — via environment variable\\n' +\n ' mimo chat --api-key ... — via flag',\n );\n}\n\n/**\n * Resolve the base URL from config or env.\n * 同时支持 baseURL(ClientConfig)和 baseUrl(Config)两种命名。\n * 如果没有显式配置 base URL,则根据 API Key 前缀自动推断。\n */\nfunction resolveBaseURL(config?: Partial<ClientConfig>): string | undefined {\n if (config?.baseURL) {\n return config.baseURL;\n }\n if (config?.baseUrl) {\n return config.baseUrl;\n }\n if (process.env.MIMO_BASE_URL) {\n return process.env.MIMO_BASE_URL;\n }\n\n // 根据 API Key 前缀自动推断 base URL\n const activeKey = config?.activeKey;\n const apiKey = activeKey === 'sk'\n ? (config?.fileSkApiKey || config?.apiKey || config?.fileApiKey)\n : (config?.apiKey || config?.fileApiKey || config?.fileSkApiKey);\n if (apiKey) {\n const inferred = inferBaseUrlFromKey(apiKey);\n if (inferred) {\n return inferred;\n }\n }\n\n return undefined;\n}\n\n/**\n * Factory: create a MiMoClient from partial config.\n * Resolves API key and base URL from environment if not provided.\n */\nexport function createClient(config?: Partial<ClientConfig>): MiMoClient {\n const apiKey = resolveApiKey(config);\n const baseURL = resolveBaseURL(config);\n\n return new MiMoClient({\n apiKey,\n baseURL,\n timeout: config?.timeout,\n });\n}\n",
|
|
8
8
|
"export const ExitCode = {\n SUCCESS: 0,\n GENERAL: 1,\n USAGE: 2,\n AUTH: 3,\n QUOTA: 4,\n TIMEOUT: 5,\n NETWORK: 6,\n CONTENT_FILTER: 10,\n INVALID_INPUT: 11,\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n",
|
|
9
9
|
"import { ExitCode } from './codes';\n\nexport class CLIError extends Error {\n readonly exitCode: ExitCode;\n readonly hint?: string;\n\n constructor(message: string, exitCode: ExitCode = ExitCode.GENERAL, hint?: string) {\n super(message);\n this.name = 'CLIError';\n this.exitCode = exitCode;\n this.hint = hint;\n }\n\n toJSON() {\n return {\n error: {\n code: this.exitCode,\n message: this.message,\n ...(this.hint ? { hint: this.hint } : {}),\n },\n };\n }\n}\n",
|
|
10
10
|
"import { resolve, normalize } from 'node:path';\nimport { CLIError } from '../errors/base';\nimport { ExitCode } from '../errors/codes';\n\n/**\n * 规范化并验证用户输入的文件路径,防止路径遍历攻击。\n * 检查规范化后的路径是否在 baseDir 目录下,如果逃逸则抛出 CLIError。\n *\n * @param inputPath - 用户输入的文件路径\n * @param baseDir - 允许的基准目录,默认为 process.cwd()\n * @returns 规范化后的绝对路径\n * @throws CLIError 如果路径逃逸到 baseDir 之外\n */\nexport function sanitizePath(inputPath: string, baseDir?: string): string {\n const base = resolve(baseDir ?? process.cwd());\n const resolved = resolve(inputPath);\n\n // 规范化后检查路径是否以 baseDir 开头\n // 确保比较时 baseDir 以路径分隔符结尾,避免 /app 匹配 /application 的情况\n const baseWithSep = base.endsWith('/') || base.endsWith('\\\\') ? base : base + '/';\n if (resolved !== base && !resolved.startsWith(baseWithSep)) {\n throw new CLIError(\n `路径不允许逃逸到预期目录之外: ${inputPath}`,\n ExitCode.INVALID_INPUT,\n '请确保文件路径在当前工作目录内,不要使用绝对路径或 ../ 等相对路径逃逸。',\n );\n }\n\n return resolved;\n}\n\n/**\n * 对 API Key 做脱敏处理,只显示前4位和后4位,中间用 **** 替代。\n * 格式: sk-****xxxx\n *\n * @param key - 原始 API Key\n * @returns 脱敏后的 API Key\n */\nexport function maskApiKey(key: string): string {\n if (!key || typeof key !== 'string') return '****';\n\n // 对于很短的 key,全部脱敏\n if (key.length <= 8) {\n return key.slice(0, 2) + '****';\n }\n\n return key.slice(0, 4) + '****' + key.slice(-4);\n}\n\n/**\n * 在文本中扫描并替换可能泄露的 API Key。\n * 匹配 sk- 或 tp- 开头的长字符串(>=20字符),替换为脱敏格式。\n *\n * @param text - 可能包含 API Key 的文本\n * @returns 脱敏后的文本\n */\nexport function redactApiKeysInText(text: string): string {\n if (!text || typeof text !== 'string') return text;\n\n // 匹配 sk- 或 tp- 开头且长度 >= 20 的字符串(典型的 API Key 格式)\n return text.replace(/(?:sk|tp)-[A-Za-z0-9_-]{16,}/g, (match) => {\n return maskApiKey(match);\n });\n}\n",
|
|
11
|
-
"// ============================================================\n// MiMo CLI 国际化 (i18n) 模块\n// ============================================================\n\nexport type Locale = 'zh' | 'en';\n\n// 当前语言,默认中文\nlet currentLocale: Locale = 'zh';\n\nexport function getLocale(): Locale {\n return currentLocale;\n}\n\nexport function setLocale(locale: Locale): void {\n if (locale !== 'zh' && locale !== 'en') {\n currentLocale = 'zh';\n } else {\n currentLocale = locale;\n }\n}\n\n// 从配置值初始化语言\nexport function initLocale(configLang?: string): void {\n if (!configLang) {\n // 尝试从环境变量检测\n const envLang = process.env.LANG || process.env.LC_ALL || process.env.LC_MESSAGES || '';\n if (envLang.startsWith('zh')) {\n currentLocale = 'zh';\n } else {\n currentLocale = 'zh'; // 默认中文\n }\n return;\n }\n if (configLang === 'en') {\n currentLocale = 'en';\n } else {\n currentLocale = 'zh';\n }\n}\n\n// ============================================================\n// 翻译字典\n// ============================================================\n\nconst translations: Record<string, Record<Locale, string>> = {\n // ---- 主界面 ----\n 'main.usage': {\n zh: '用法:mimo <资源> <命令> [参数]',\n en: 'Usage: mimo <resource> <command> [flags]',\n },\n 'main.resources': {\n zh: '可用命令:',\n en: 'Resources:',\n },\n 'main.globalFlags': {\n zh: '全局参数:',\n en: 'Global Flags:',\n },\n 'main.gettingHelp': {\n zh: '获取帮助:',\n en: 'Getting Help:',\n },\n 'main.helpHint1': {\n zh: '在任何命令后添加 --help 查看完整选项、默认值和示例。',\n en: 'Add --help after any command to see its full list of options, defaults,',\n },\n 'main.helpHint2': {\n zh: '例如:',\n en: 'and usage examples. For example:',\n },\n 'main.notLoggedIn': {\n zh: ' 尚未登录。',\n en: ' Not logged in.',\n },\n 'main.loginHint1': {\n zh: ' mimo auth login 使用 API Key 登录',\n en: ' mimo auth login Log in with an API key',\n },\n 'main.loginHint2': {\n zh: ' mimo auth login --api-key 直接保存 API Key',\n en: ' mimo auth login --api-key Save an API key directly',\n },\n 'main.interrupted': {\n zh: '\\n已中断,退出。',\n en: '\\nInterrupted. Exiting.',\n },\n 'main.fatalArgv': {\n zh: '致命错误:无法读取进程参数。\\n',\n en: 'Fatal: failed to read process arguments.\\n',\n },\n\n // ---- 命令帮助 ----\n 'help.usage': { zh: '用法:', en: 'Usage:' },\n 'help.options': { zh: '选项:', en: 'Options:' },\n 'help.examples': { zh: '示例:', en: 'Examples:' },\n 'help.apiRef': { zh: 'API 参考:', en: 'API Reference:' },\n 'help.commands': { zh: '子命令:', en: 'Commands:' },\n 'help.globalHint': {\n zh: '全局参数(--api-key、--output、--quiet 等)始终可用。',\n en: 'Global flags (--api-key, --output, --quiet, etc.) are always available.',\n },\n 'help.globalHintRun': {\n zh: '运行 mimo --help 查看完整列表。',\n en: 'Run mimo --help for the full list.',\n },\n\n // ---- 错误处理 ----\n 'error.prefix': { zh: '错误:', en: 'Error:' },\n 'error.exitCode': { zh: '(退出码 {code})', en: '(exit code {code})' },\n 'error.timeout': { zh: '请求超时。', en: 'Request timed out.' },\n 'error.timeoutHint': {\n zh: '尝试增大超时时间(如 --timeout 60)。\\n如果使用有效 API Key 仍然频繁超时,请检查网络和区域。\\n运行:mimo auth status — 检查认证状态。',\n en: 'Try increasing --timeout (e.g. --timeout 60).\\nIf this happens on every request with a valid API key, check your network and region.\\nRun: mimo auth status — to check your credentials.',\n },\n 'error.network': { zh: '网络请求失败。', en: 'Network request failed.' },\n 'error.networkHint': {\n zh: '请检查网络连接。\\n如需使用代理:设置 HTTPS_PROXY 环境变量,或运行:mimo config set proxy http://HOST:PORT',\n en: 'Check your network connection.\\nTo use a proxy: set HTTPS_PROXY env var, or run: mimo config set proxy http://HOST:PORT',\n },\n 'error.proxyHint': {\n zh: '代理连接失败 — 请检查代理 URL 和认证信息。\\n检查:HTTPS_PROXY / HTTP_PROXY 环境变量,或运行 mimo config show 查看已配置的代理。',\n en: 'Proxy connection failed — verify your proxy URL and authentication.\\nCheck: HTTPS_PROXY / HTTP_PROXY env vars, or mimo config show for configured proxy.',\n },\n 'error.fsEnoent': { zh: '文件或目录不存在。', en: 'File or directory not found.' },\n 'error.fsEacces': { zh: '权限不足 — 请检查文件或目录权限。', en: 'Permission denied — check file or directory permissions.' },\n 'error.fsEnospc': { zh: '磁盘空间不足 — 请释放空间后重试。', en: 'Disk full — free up space and try again.' },\n 'error.fsDefault': { zh: '请检查文件路径和权限。', en: 'Check the file path and permissions.' },\n 'error.fsPrefix': { zh: '文件系统错误:', en: 'File system error: ' },\n\n // ---- API 错误 ----\n 'api.400': { zh: '请求参数错误:', en: 'Bad request: ' },\n 'api.400Hint': { zh: '请检查请求格式和参数。', en: 'Check your request format and parameters.' },\n 'api.401': { zh: '认证失败(HTTP 401)。', en: 'Authentication failed (HTTP 401).' },\n 'api.401Hint': { zh: '请检查 API Key:mimo auth status\\n重新登录:mimo auth login', en: 'Check your API Key: mimo auth status\\nRe-authenticate: mimo auth login' },\n 'api.402': { zh: '余额不足:', en: 'Payment required: ' },\n 'api.402Hint': { zh: '账户余额不足,请充值。', en: 'Insufficient balance. Please top up your account.' },\n 'api.403': { zh: '访问被拒绝(HTTP 403)。', en: 'Access denied (HTTP 403).' },\n 'api.403Hint': { zh: '您的 API Key 可能无权访问此资源,或 Key 受限。\\n请检查 API Key 权限。', en: 'Your API Key may not have access to this resource, or the key is restricted.\\nCheck your API Key permissions.' },\n 'api.404': { zh: '未找到:', en: 'Not found: ' },\n 'api.404Hint': { zh: '请求的模型或功能可能不受支持,请检查模型名称和接口地址。', en: 'The requested model or feature may not be supported. Check the model name and endpoint.' },\n 'api.421': { zh: '内容被过滤:', en: 'Content filtered: ' },\n 'api.421Hint': { zh: '您的输入被内容安全过滤器标记,请修改后重试。', en: 'Your input was flagged by the content safety filter. Please modify your request and try again.' },\n 'api.429': { zh: '请求频率超限:', en: 'Rate limit exceeded: ' },\n 'api.429Hint': { zh: '请求过于频繁,请稍后重试或检查配额。', en: 'You are sending requests too quickly. Please wait and retry, or check your quota.' },\n 'api.500': { zh: '服务器内部错误(HTTP 500)。', en: 'Server error (HTTP 500).' },\n 'api.500Hint': { zh: '服务器遇到内部错误,请稍后重试。', en: 'The server encountered an internal error. Please retry later.' },\n 'api.503': { zh: '服务暂不可用(HTTP 503)。', en: 'Service unavailable (HTTP 503).' },\n 'api.503Hint': { zh: '服务器暂时过载或维护中,请稍后重试。', en: 'The server is temporarily overloaded or under maintenance. Please retry later.' },\n 'api.default': { zh: 'API 错误:', en: 'API error: ' },\n\n // ---- 认证 ----\n 'auth.noCreds': { zh: '未找到认证信息。', en: 'No credentials found.' },\n 'auth.noCredsHint': {\n zh: '登录: mimo auth login\\n直接传入: --api-key <key>\\n环境变量: MIMO_API_KEY=<key>',\n en: 'Log in: mimo auth login\\nPass directly: --api-key <key>\\nSet env var: MIMO_API_KEY=<key>',\n },\n 'auth.noKeyProvided': { zh: '未提供 API Key。', en: 'No API key provided.' },\n 'auth.noKeyHint': { zh: '使用:mimo auth login --api-key <key>', en: 'Use: mimo auth login --api-key <key>' },\n 'auth.keyEmpty': { zh: 'API Key 不能为空。', en: 'API key cannot be empty.' },\n 'auth.keyRequired': { zh: 'API Key 为必填项。', en: 'API key is required.' },\n 'auth.keySaved': { zh: 'API Key 已保存至', en: 'API key saved to' },\n 'auth.baseUrlAuto': { zh: '接口地址已自动配置:', en: 'Base URL auto-configured: ' },\n 'auth.promptTitle': { zh: '请输入您的 MiMo API Key:', en: 'Please enter your MiMo API key:' },\n 'auth.promptPayKey': { zh: '- 按量计费 Key:以 \"sk-\" 等非 \"tp-\" 前缀开头', en: '- Pay-as-you-go Key: starts with \"sk-\" or other non-\"tp-\" prefix' },\n 'auth.promptTpKey': { zh: '- TokenPlan Key:以 \"tp-\" 前缀开头', en: '- TokenPlan Key: starts with \"tp-\" prefix' },\n 'auth.promptLabel': { zh: '输入 MiMo API Key:', en: 'Enter your MiMo API key:' },\n 'auth.logoutNoKey': { zh: '配置文件中未找到 API Key,已处于登出状态。', en: 'No API key found in config file. Already logged out.' },\n 'auth.logoutDone': { zh: 'API Key 已移除,您已登出。', en: 'API key removed. You are now logged out.' },\n\n // ---- 命令描述 ----\n 'cmd.chat.desc': { zh: '发送对话请求', en: 'Send a chat completion request' },\n 'cmd.repl.desc': { zh: '交互式多轮对话', en: 'Interactive multi-turn REPL conversation' },\n 'cmd.vision.desc': { zh: '多模态理解(图片、音频、视频)', en: 'Multi-modal understanding (image, audio, video)' },\n 'cmd.asr.desc': { zh: '语音识别(ASR)', en: 'Speech recognition (ASR)' },\n 'cmd.ttsSynth.desc': { zh: '预设音色语音合成', en: 'Pre-set voice text-to-speech synthesis' },\n 'cmd.ttsClone.desc': { zh: '声音克隆语音合成', en: 'Voice clone text-to-speech synthesis' },\n 'cmd.ttsDesign.desc': { zh: '自定义音色语音合成', en: 'Voice design text-to-speech synthesis' },\n 'cmd.ttsVoices.desc': { zh: '列出可用的 TTS 音色', en: 'List available TTS voices' },\n 'cmd.authLogin.desc': { zh: '使用 MiMo API Key 登录(自动识别按量计费/TokenPlan)', en: 'Log in with a MiMo API key (auto-detects key type: Pay-as-you-go or TokenPlan)' },\n 'cmd.authStatus.desc': { zh: '查看当前认证状态', en: 'Show current authentication status' },\n 'cmd.authLogout.desc': { zh: '清除已保存的 API Key', en: 'Clear saved API key from config file' },\n 'cmd.configShow.desc': { zh: '显示当前配置', en: 'Display current configuration' },\n 'cmd.configSet.desc': { zh: '设置配置项', en: 'Set a configuration value' },\n 'cmd.update.desc': { zh: '更新 MiMo CLI', en: 'Self-update the MiMo CLI' },\n 'cmd.help.desc': { zh: '显示命令帮助', en: 'Show help for commands' },\n 'cmd.language.desc': { zh: '切换界面语言(zh/en)', en: 'Switch interface language (zh/en)' },\n\n // ---- 视频理解错误 ----\n 'vision.videoTooLarge': {\n zh: '视频文件过大:{size}MB(原始)。Base64 编码后将超过 {limit}MB 的 API 限制。',\n en: 'Video file too large: {size}MB (raw). After Base64 encoding it would exceed the {limit}MB API limit.',\n },\n 'vision.videoTooLargeHint': {\n zh: '请改用 URL 方式传入视频(URL 模式支持最大 300MB),或将视频压缩至 {max}MB 以下。',\n en: 'Please use a URL to pass the video instead (URL mode supports up to 300MB), or compress the video to under {max}MB.',\n },\n 'vision.videoBase64TooLarge': {\n zh: '视频 Base64 大小 {size}MB 超过 {limit}MB 的 API 限制。',\n en: 'Video Base64 size {size}MB exceeds the {limit}MB API limit.',\n },\n 'vision.videoBase64TooLargeHint': {\n zh: '请改用 URL 方式传入视频(URL 模式支持最大 300MB),或压缩视频。',\n en: 'Please use a URL to pass the video instead (URL mode supports up to 300MB), or compress the video.',\n },\n 'vision.noMedia': {\n zh: '至少需要提供 --image、--audio 或 --video 中的一项。',\n en: 'At least one of --image, --audio, or --video is required.',\n },\n 'vision.noPrompt': {\n zh: '缺少必填参数:--prompt',\n en: 'Missing required flag: --prompt',\n },\n 'vision.requestFailed': {\n zh: '多模态请求失败:',\n en: 'Vision request failed: ',\n },\n 'vision.requestFailedHint': {\n zh: '请检查网络连接和媒体文件格式。',\n en: 'Check your network connection and media file format.',\n },\n\n // ---- Chat 错误 ----\n 'chat.noMessage': { zh: '缺少必填参数:--message', en: 'Missing required flag: --message' },\n 'chat.emptyMessage': { zh: '消息不能为空或仅包含空白字符。', en: 'Message cannot be empty or whitespace only.' },\n 'chat.messageTooLong': { zh: '消息过长:{len} 字符(上限 {max})。', en: 'Message too long: {len} characters (max {max}).' },\n 'chat.messageTooLongHint': { zh: '请缩短消息或拆分为多次请求。', en: 'Shorten your message or split it into multiple requests.' },\n 'chat.streamFailed': { zh: '流式请求失败:', en: 'Stream request failed: ' },\n 'chat.streamFailedHint': { zh: '请检查网络连接和 API Key。', en: 'Check your network connection and API key.' },\n\n // ---- ASR 错误 ----\n 'asr.noFile': { zh: '需要提供音频文件路径。', en: 'Audio file path is required.' },\n 'asr.streamFailed': { zh: '语音识别流式请求失败:', en: 'ASR stream request failed: ' },\n 'asr.requestFailed': { zh: '语音识别请求失败:', en: 'ASR request failed: ' },\n 'asr.checkHint': { zh: '请检查网络连接和音频文件格式。', en: 'Check your network connection and audio file format.' },\n\n // ---- TTS 错误 ----\n 'tts.noText': { zh: '--text 为必填项。', en: '--text is required.' },\n 'tts.emptyText': { zh: '--text 不能为空或仅包含空白字符。', en: '--text cannot be empty or whitespace only.' },\n 'tts.textTooLong': { zh: '文本过长:{len} 字符(上限 {max})。', en: 'Text too long: {len} characters (max {max}).' },\n 'tts.textTooLongHint': { zh: '请缩短文本或拆分为多次合成请求。', en: 'Shorten your text or split into multiple synthesis requests.' },\n 'tts.noSample': { zh: '--sample 为必填项。', en: '--sample is required.' },\n 'tts.noPrompt': { zh: '--prompt 为必填项。', en: '--prompt is required.' },\n 'tts.noTextOrOptimize': { zh: '需要提供 --text 或启用 --optimize-text。', en: 'Either --text or --optimize-text is required.' },\n 'tts.noAudioData': { zh: 'API 响应中缺少音频数据。', en: 'API response missing audio data.' },\n 'tts.invalidVoice': { zh: '无效音色:', en: 'Invalid voice: ' },\n\n // ---- Config ----\n 'config.keyRequired': { zh: '--key 为必填项。', en: '--key is required.' },\n 'config.valueRequired': { zh: '--value 为必填项。', en: '--value is required.' },\n 'config.invalidKey': { zh: '无效的配置键:', en: 'Invalid config key: ' },\n 'config.invalidKeyChars': { zh: '配置键只能包含字母、数字和下划线。', en: 'Config key must only contain letters, numbers, and underscores.' },\n 'config.validKeys': { zh: '有效的键:', en: 'Valid keys: ' },\n 'config.setTimeout': { zh: 'timeout 必须为正数。', en: 'timeout must be a positive number.' },\n 'config.setOutput': { zh: 'output 必须为 \"text\" 或 \"json\"。', en: 'output must be \"text\" or \"json\".' },\n 'config.setDone': { zh: '已设置', en: 'Set' },\n 'config.corrupted': { zh: '警告:配置文件已损坏(', en: 'Warning: config file is corrupted (' },\n 'config.corruptedHint': { zh: ')。运行 \"mimo config set\" 重置。\\n', en: '). Run \\'mimo config set\\' to reset.\\n' },\n\n // ---- Update ----\n 'update.notImplemented': { zh: '自动更新尚未实现,请从 GitHub 重新安装。\\n', en: 'Self-update is not yet implemented. Please reinstall from GitHub.\\n' },\n\n // ---- REPL ----\n 'repl.intro': { zh: 'MiMo 交互对话 — 输入 /exit 退出,/clear 清空对话', en: 'MiMo REPL — type /exit to quit, /clear to reset' },\n 'repl.you': { zh: '你', en: 'You' },\n 'repl.placeholder': { zh: '输入你的消息...', en: 'Type your message...' },\n 'repl.goodbye': { zh: '再见!', en: 'Goodbye!' },\n 'repl.cleared': { zh: '对话已清空。', en: 'Conversation cleared.' },\n\n // ---- Spinner ----\n 'spinner.synthesizing': { zh: '正在合成语音...', en: 'Synthesizing speech...' },\n 'spinner.readingSample': { zh: '正在读取音频样本...', en: 'Reading audio sample...' },\n 'spinner.cloning': { zh: '正在合成克隆语音...', en: 'Synthesizing cloned speech...' },\n 'spinner.designing': { zh: '正在设计音色...', en: 'Designing voice...' },\n\n // ---- Language 命令 ----\n 'language.current': { zh: '当前界面语言:', en: 'Current interface language: ' },\n 'language.changed': { zh: '界面语言已切换为中文。', en: 'Interface language changed to English.' },\n 'language.invalid': { zh: '无效的语言代码,请使用 zh(中文)或 en(英文)。', en: 'Invalid language code. Use zh (Chinese) or en (English).' },\n 'language.hint': { zh: '使用:mimo language zh 或 mimo language en', en: 'Usage: mimo language zh or mimo language en' },\n\n // ---- 通用 ----\n 'general.notSet': { zh: '(未设置)', en: '(not set)' },\n 'general.or': { zh: '或', en: 'or' },\n};\n\n// ============================================================\n// 翻译函数\n// ============================================================\n\n/**\n * 获取翻译文本,支持模板变量替换\n * @param key 翻译键\n * @param vars 模板变量,如 { size: '120', limit: '50' }\n */\nexport function t(key: string, vars?: Record<string, string | number>): string {\n const entry = translations[key];\n if (!entry) return key;\n let text = entry[currentLocale] || entry['zh'] || key;\n if (vars) {\n for (const [k, v] of Object.entries(vars)) {\n text = text.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), String(v));\n }\n }\n return text;\n}\n",
|
|
11
|
+
"// ============================================================\n// MiMo CLI 国际化 (i18n) 模块\n// ============================================================\n\nexport type Locale = 'zh' | 'en';\n\n// 当前语言,默认中文\nlet currentLocale: Locale = 'zh';\n\nexport function getLocale(): Locale {\n return currentLocale;\n}\n\nexport function setLocale(locale: Locale): void {\n if (locale !== 'zh' && locale !== 'en') {\n currentLocale = 'zh';\n } else {\n currentLocale = locale;\n }\n}\n\n// 从配置值初始化语言\nexport function initLocale(configLang?: string): void {\n if (!configLang) {\n // 尝试从环境变量检测\n const envLang = process.env.LANG || process.env.LC_ALL || process.env.LC_MESSAGES || '';\n if (envLang.startsWith('zh')) {\n currentLocale = 'zh';\n } else {\n currentLocale = 'zh'; // 默认中文\n }\n return;\n }\n if (configLang === 'en') {\n currentLocale = 'en';\n } else {\n currentLocale = 'zh';\n }\n}\n\n// ============================================================\n// 翻译字典\n// ============================================================\n\nconst translations: Record<string, Record<Locale, string>> = {\n // ---- 主界面 ----\n 'main.usage': {\n zh: '用法:mimo <资源> <命令> [参数]',\n en: 'Usage: mimo <resource> <command> [flags]',\n },\n 'main.resources': {\n zh: '可用命令:',\n en: 'Resources:',\n },\n 'main.globalFlags': {\n zh: '全局参数:',\n en: 'Global Flags:',\n },\n 'main.gettingHelp': {\n zh: '获取帮助:',\n en: 'Getting Help:',\n },\n 'main.helpHint1': {\n zh: '在任何命令后添加 --help 查看完整选项、默认值和示例。',\n en: 'Add --help after any command to see its full list of options, defaults,',\n },\n 'main.helpHint2': {\n zh: '例如:',\n en: 'and usage examples. For example:',\n },\n 'main.notLoggedIn': {\n zh: ' 尚未登录。',\n en: ' Not logged in.',\n },\n 'main.loginHint1': {\n zh: ' mimo auth login 使用 API Key 登录',\n en: ' mimo auth login Log in with an API key',\n },\n 'main.loginHint2': {\n zh: ' mimo auth login --api-key 直接保存 API Key',\n en: ' mimo auth login --api-key Save an API key directly',\n },\n 'main.interrupted': {\n zh: '\\n已中断,退出。',\n en: '\\nInterrupted. Exiting.',\n },\n 'main.fatalArgv': {\n zh: '致命错误:无法读取进程参数。\\n',\n en: 'Fatal: failed to read process arguments.\\n',\n },\n\n // ---- 命令帮助 ----\n 'help.usage': { zh: '用法:', en: 'Usage:' },\n 'help.options': { zh: '选项:', en: 'Options:' },\n 'help.examples': { zh: '示例:', en: 'Examples:' },\n 'help.apiRef': { zh: 'API 参考:', en: 'API Reference:' },\n 'help.commands': { zh: '子命令:', en: 'Commands:' },\n 'help.globalHint': {\n zh: '全局参数(--api-key、--output、--quiet 等)始终可用。',\n en: 'Global flags (--api-key, --output, --quiet, etc.) are always available.',\n },\n 'help.globalHintRun': {\n zh: '运行 mimo --help 查看完整列表。',\n en: 'Run mimo --help for the full list.',\n },\n\n // ---- 错误处理 ----\n 'error.prefix': { zh: '错误:', en: 'Error:' },\n 'error.exitCode': { zh: '(退出码 {code})', en: '(exit code {code})' },\n 'error.timeout': { zh: '请求超时。', en: 'Request timed out.' },\n 'error.timeoutHint': {\n zh: '尝试增大超时时间(如 --timeout 60)。\\n如果使用有效 API Key 仍然频繁超时,请检查网络和区域。\\n运行:mimo auth status — 检查认证状态。',\n en: 'Try increasing --timeout (e.g. --timeout 60).\\nIf this happens on every request with a valid API key, check your network and region.\\nRun: mimo auth status — to check your credentials.',\n },\n 'error.network': { zh: '网络请求失败。', en: 'Network request failed.' },\n 'error.networkHint': {\n zh: '请检查网络连接。\\n如需使用代理:设置 HTTPS_PROXY 环境变量,或运行:mimo config set proxy http://HOST:PORT',\n en: 'Check your network connection.\\nTo use a proxy: set HTTPS_PROXY env var, or run: mimo config set proxy http://HOST:PORT',\n },\n 'error.proxyHint': {\n zh: '代理连接失败 — 请检查代理 URL 和认证信息。\\n检查:HTTPS_PROXY / HTTP_PROXY 环境变量,或运行 mimo config show 查看已配置的代理。',\n en: 'Proxy connection failed — verify your proxy URL and authentication.\\nCheck: HTTPS_PROXY / HTTP_PROXY env vars, or mimo config show for configured proxy.',\n },\n 'error.fsEnoent': { zh: '文件或目录不存在。', en: 'File or directory not found.' },\n 'error.fsEacces': { zh: '权限不足 — 请检查文件或目录权限。', en: 'Permission denied — check file or directory permissions.' },\n 'error.fsEnospc': { zh: '磁盘空间不足 — 请释放空间后重试。', en: 'Disk full — free up space and try again.' },\n 'error.fsDefault': { zh: '请检查文件路径和权限。', en: 'Check the file path and permissions.' },\n 'error.fsPrefix': { zh: '文件系统错误:', en: 'File system error: ' },\n\n // ---- API 错误 ----\n 'api.400': { zh: '请求参数错误:', en: 'Bad request: ' },\n 'api.400Hint': { zh: '请检查请求格式和参数。', en: 'Check your request format and parameters.' },\n 'api.401': { zh: '认证失败(HTTP 401)。', en: 'Authentication failed (HTTP 401).' },\n 'api.401Hint': { zh: '请检查 API Key:mimo auth status\\n重新登录:mimo auth login', en: 'Check your API Key: mimo auth status\\nRe-authenticate: mimo auth login' },\n 'api.402': { zh: '余额不足:', en: 'Payment required: ' },\n 'api.402Hint': { zh: '账户余额不足,请充值。', en: 'Insufficient balance. Please top up your account.' },\n 'api.403': { zh: '访问被拒绝(HTTP 403)。', en: 'Access denied (HTTP 403).' },\n 'api.403Hint': { zh: '您的 API Key 可能无权访问此资源,或 Key 受限。\\n请检查 API Key 权限。', en: 'Your API Key may not have access to this resource, or the key is restricted.\\nCheck your API Key permissions.' },\n 'api.404': { zh: '未找到:', en: 'Not found: ' },\n 'api.404Hint': { zh: '请求的模型或功能可能不受支持,请检查模型名称和接口地址。', en: 'The requested model or feature may not be supported. Check the model name and endpoint.' },\n 'api.421': { zh: '内容被过滤:', en: 'Content filtered: ' },\n 'api.421Hint': { zh: '您的输入被内容安全过滤器标记,请修改后重试。', en: 'Your input was flagged by the content safety filter. Please modify your request and try again.' },\n 'api.429': { zh: '请求频率超限:', en: 'Rate limit exceeded: ' },\n 'api.429Hint': { zh: '请求过于频繁,请稍后重试或检查配额。', en: 'You are sending requests too quickly. Please wait and retry, or check your quota.' },\n 'api.500': { zh: '服务器内部错误(HTTP 500)。', en: 'Server error (HTTP 500).' },\n 'api.500Hint': { zh: '服务器遇到内部错误,请稍后重试。', en: 'The server encountered an internal error. Please retry later.' },\n 'api.503': { zh: '服务暂不可用(HTTP 503)。', en: 'Service unavailable (HTTP 503).' },\n 'api.503Hint': { zh: '服务器暂时过载或维护中,请稍后重试。', en: 'The server is temporarily overloaded or under maintenance. Please retry later.' },\n 'api.default': { zh: 'API 错误:', en: 'API error: ' },\n\n // ---- 认证 ----\n 'auth.noCreds': { zh: '未找到认证信息。', en: 'No credentials found.' },\n 'auth.noCredsHint': {\n zh: '登录: mimo auth login\\n直接传入: --api-key <key>\\n环境变量: MIMO_API_KEY=<key>',\n en: 'Log in: mimo auth login\\nPass directly: --api-key <key>\\nSet env var: MIMO_API_KEY=<key>',\n },\n 'auth.noKeyProvided': { zh: '未提供 API Key。', en: 'No API key provided.' },\n 'auth.noKeyHint': { zh: '使用:mimo auth login --api-key <key>', en: 'Use: mimo auth login --api-key <key>' },\n 'auth.keyEmpty': { zh: 'API Key 不能为空。', en: 'API key cannot be empty.' },\n 'auth.keyRequired': { zh: 'API Key 为必填项。', en: 'API key is required.' },\n 'auth.keySaved': { zh: 'API Key 已保存至', en: 'API key saved to' },\n 'auth.baseUrlAuto': { zh: '接口地址已自动配置:', en: 'Base URL auto-configured: ' },\n 'auth.promptTitle': { zh: '请输入您的 MiMo API Key:', en: 'Please enter your MiMo API key:' },\n 'auth.promptPayKey': { zh: '- 按量计费 Key:以 \"sk-\" 等非 \"tp-\" 前缀开头', en: '- Pay-as-you-go Key: starts with \"sk-\" or other non-\"tp-\" prefix' },\n 'auth.promptTpKey': { zh: '- TokenPlan Key:以 \"tp-\" 前缀开头', en: '- TokenPlan Key: starts with \"tp-\" prefix' },\n 'auth.promptLabel': { zh: '输入 MiMo API Key:', en: 'Enter your MiMo API key:' },\n 'auth.logoutNoKey': { zh: '配置文件中未找到 API Key,已处于登出状态。', en: 'No API key found in config file. Already logged out.' },\n 'auth.logoutDone': { zh: 'API Key 已移除,您已登出。', en: 'API key removed. You are now logged out.' },\n\n // ---- 命令描述 ----\n 'cmd.chat.desc': { zh: '发送对话请求', en: 'Send a chat completion request' },\n 'cmd.repl.desc': { zh: '交互式多轮对话', en: 'Interactive multi-turn REPL conversation' },\n 'cmd.vision.desc': { zh: '多模态理解(图片、音频、视频)', en: 'Multi-modal understanding (image, audio, video)' },\n 'cmd.asr.desc': { zh: '语音识别(ASR)', en: 'Speech recognition (ASR)' },\n 'cmd.ttsSynth.desc': { zh: '预设音色语音合成', en: 'Pre-set voice text-to-speech synthesis' },\n 'cmd.ttsClone.desc': { zh: '声音克隆语音合成', en: 'Voice clone text-to-speech synthesis' },\n 'cmd.ttsDesign.desc': { zh: '自定义音色语音合成', en: 'Voice design text-to-speech synthesis' },\n 'cmd.ttsVoices.desc': { zh: '列出可用的 TTS 音色', en: 'List available TTS voices' },\n 'cmd.authLogin.desc': { zh: '使用 MiMo API Key 登录(自动识别按量计费/TokenPlan)', en: 'Log in with a MiMo API key (auto-detects key type: Pay-as-you-go or TokenPlan)' },\n 'cmd.authStatus.desc': { zh: '查看当前认证状态', en: 'Show current authentication status' },\n 'cmd.authLogout.desc': { zh: '清除已保存的 API Key', en: 'Clear saved API key from config file' },\n 'cmd.configShow.desc': { zh: '显示当前配置', en: 'Display current configuration' },\n 'cmd.configSet.desc': { zh: '设置配置项', en: 'Set a configuration value' },\n 'cmd.update.desc': { zh: '更新 MiMo CLI', en: 'Self-update the MiMo CLI' },\n 'cmd.help.desc': { zh: '显示命令帮助', en: 'Show help for commands' },\n 'cmd.language.desc': { zh: '切换界面语言(zh/en)', en: 'Switch interface language (zh/en)' },\n\n // ---- 视频理解错误 ----\n 'vision.videoTooLarge': {\n zh: '视频文件过大:{size}MB(原始)。Base64 编码后将超过 {limit}MB 的 API 限制。',\n en: 'Video file too large: {size}MB (raw). After Base64 encoding it would exceed the {limit}MB API limit.',\n },\n 'vision.videoTooLargeHint': {\n zh: '请改用 URL 方式传入视频(URL 模式支持最大 300MB),或将视频压缩至 {max}MB 以下。',\n en: 'Please use a URL to pass the video instead (URL mode supports up to 300MB), or compress the video to under {max}MB.',\n },\n 'vision.videoBase64TooLarge': {\n zh: '视频 Base64 大小 {size}MB 超过 {limit}MB 的 API 限制。',\n en: 'Video Base64 size {size}MB exceeds the {limit}MB API limit.',\n },\n 'vision.videoBase64TooLargeHint': {\n zh: '请改用 URL 方式传入视频(URL 模式支持最大 300MB),或压缩视频。',\n en: 'Please use a URL to pass the video instead (URL mode supports up to 300MB), or compress the video.',\n },\n 'vision.noMedia': {\n zh: '至少需要提供 --image、--audio 或 --video 中的一项。',\n en: 'At least one of --image, --audio, or --video is required.',\n },\n 'vision.noPrompt': {\n zh: '缺少必填参数:--prompt',\n en: 'Missing required flag: --prompt',\n },\n 'vision.requestFailed': {\n zh: '多模态请求失败:',\n en: 'Vision request failed: ',\n },\n 'vision.requestFailedHint': {\n zh: '请检查网络连接和媒体文件格式。',\n en: 'Check your network connection and media file format.',\n },\n\n // ---- Chat 错误 ----\n 'chat.noMessage': { zh: '缺少必填参数:--message', en: 'Missing required flag: --message' },\n 'chat.emptyMessage': { zh: '消息不能为空或仅包含空白字符。', en: 'Message cannot be empty or whitespace only.' },\n 'chat.messageTooLong': { zh: '消息过长:{len} 字符(上限 {max})。', en: 'Message too long: {len} characters (max {max}).' },\n 'chat.messageTooLongHint': { zh: '请缩短消息或拆分为多次请求。', en: 'Shorten your message or split it into multiple requests.' },\n 'chat.streamFailed': { zh: '流式请求失败:', en: 'Stream request failed: ' },\n 'chat.streamFailedHint': { zh: '请检查网络连接和 API Key。', en: 'Check your network connection and API key.' },\n\n // ---- ASR 错误 ----\n 'asr.noFile': { zh: '需要提供音频文件路径。', en: 'Audio file path is required.' },\n 'asr.streamFailed': { zh: '语音识别流式请求失败:', en: 'ASR stream request failed: ' },\n 'asr.requestFailed': { zh: '语音识别请求失败:', en: 'ASR request failed: ' },\n 'asr.checkHint': { zh: '请检查网络连接和音频文件格式。', en: 'Check your network connection and audio file format.' },\n\n // ---- TTS 错误 ----\n 'tts.noText': { zh: '--text 为必填项。', en: '--text is required.' },\n 'tts.emptyText': { zh: '--text 不能为空或仅包含空白字符。', en: '--text cannot be empty or whitespace only.' },\n 'tts.textTooLong': { zh: '文本过长:{len} 字符(上限 {max})。', en: 'Text too long: {len} characters (max {max}).' },\n 'tts.textTooLongHint': { zh: '请缩短文本或拆分为多次合成请求。', en: 'Shorten your text or split into multiple synthesis requests.' },\n 'tts.noSample': { zh: '--sample 为必填项。', en: '--sample is required.' },\n 'tts.noPrompt': { zh: '--prompt 为必填项。', en: '--prompt is required.' },\n 'tts.noTextOrOptimize': { zh: '需要提供 --text 或启用 --optimize-text。', en: 'Either --text or --optimize-text is required.' },\n 'tts.noAudioData': { zh: 'API 响应中缺少音频数据。', en: 'API response missing audio data.' },\n 'tts.invalidVoice': { zh: '无效音色:', en: 'Invalid voice: ' },\n\n // ---- Config ----\n 'config.keyRequired': { zh: '--key 为必填项。', en: '--key is required.' },\n 'config.valueRequired': { zh: '--value 为必填项。', en: '--value is required.' },\n 'config.invalidKey': { zh: '无效的配置键:', en: 'Invalid config key: ' },\n 'config.invalidKeyChars': { zh: '配置键只能包含字母、数字和下划线。', en: 'Config key must only contain letters, numbers, and underscores.' },\n 'config.validKeys': { zh: '有效的键:', en: 'Valid keys: ' },\n 'config.setTimeout': { zh: 'timeout 必须为正数。', en: 'timeout must be a positive number.' },\n 'config.setOutput': { zh: 'output 必须为 \"text\" 或 \"json\"。', en: 'output must be \"text\" or \"json\".' },\n 'config.setDone': { zh: '已设置', en: 'Set' },\n 'config.invalidActiveKey': { zh: 'active_key 必须为 \"tp\" 或 \"sk\"。', en: 'active_key must be \"tp\" or \"sk\".' },\n 'config.switchKey': { zh: '已切换为{type} Key({url})', en: 'Switched to {type} key ({url})' },\n 'config.corrupted': { zh: '警告:配置文件已损坏(', en: 'Warning: config file is corrupted (' },\n 'config.corruptedHint': { zh: ')。运行 \"mimo config set\" 重置。\\n', en: '). Run \\'mimo config set\\' to reset.\\n' },\n\n // ---- Update ----\n 'update.checking': { zh: '正在检查更新...', en: 'Checking for updates...' },\n 'update.checkFailed': { zh: '无法检查更新,请检查网络连接。', en: 'Failed to check for updates. Please check your network connection.' },\n 'update.currentVersion': { zh: '当前版本:{version}', en: 'Current version: {version}' },\n 'update.latestVersion': { zh: '最新版本:{version}', en: 'Latest version: {version}' },\n 'update.alreadyLatest': { zh: '已是最新版本,无需更新。', en: 'Already up to date.' },\n 'update.updating': { zh: '正在更新至 v{version}...', en: 'Updating to v{version}...' },\n 'update.success': { zh: '更新成功!已升级至 v{version}。', en: 'Update successful! Upgraded to v{version}.' },\n 'update.updateFailed': { zh: 'npm update 失败,尝试 npm install...', en: 'npm update failed, trying npm install...' },\n 'update.installFailed': { zh: '自动更新失败。', en: 'Auto-update failed.' },\n 'update.manualHint': { zh: '请手动执行:npm install -g mimo-cli@latest', en: 'Please run manually: npm install -g mimo-cli@latest' },\n\n // ---- REPL ----\n 'repl.intro': { zh: 'MiMo 交互对话 — 输入 /exit 退出,/clear 清空对话', en: 'MiMo REPL — type /exit to quit, /clear to reset' },\n 'repl.you': { zh: '你', en: 'You' },\n 'repl.placeholder': { zh: '输入你的消息...', en: 'Type your message...' },\n 'repl.goodbye': { zh: '再见!', en: 'Goodbye!' },\n 'repl.cleared': { zh: '对话已清空。', en: 'Conversation cleared.' },\n\n // ---- Spinner ----\n 'spinner.synthesizing': { zh: '正在合成语音...', en: 'Synthesizing speech...' },\n 'spinner.readingSample': { zh: '正在读取音频样本...', en: 'Reading audio sample...' },\n 'spinner.cloning': { zh: '正在合成克隆语音...', en: 'Synthesizing cloned speech...' },\n 'spinner.designing': { zh: '正在设计音色...', en: 'Designing voice...' },\n\n // ---- Language 命令 ----\n 'language.current': { zh: '当前界面语言:', en: 'Current interface language: ' },\n 'language.changed': { zh: '界面语言已切换为中文。', en: 'Interface language changed to English.' },\n 'language.invalid': { zh: '无效的语言代码,请使用 zh(中文)或 en(英文)。', en: 'Invalid language code. Use zh (Chinese) or en (English).' },\n 'language.hint': { zh: '使用:mimo language zh 或 mimo language en', en: 'Usage: mimo language zh or mimo language en' },\n\n // ---- 通用 ----\n 'general.notSet': { zh: '(未设置)', en: '(not set)' },\n 'general.or': { zh: '或', en: 'or' },\n};\n\n// ============================================================\n// 翻译函数\n// ============================================================\n\n/**\n * 获取翻译文本,支持模板变量替换\n * @param key 翻译键\n * @param vars 模板变量,如 { size: '120', limit: '50' }\n */\nexport function t(key: string, vars?: Record<string, string | number>): string {\n const entry = translations[key];\n if (!entry) return key;\n let text = entry[currentLocale] || entry['zh'] || key;\n if (vars) {\n for (const [k, v] of Object.entries(vars)) {\n text = text.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), String(v));\n }\n }\n return text;\n}\n",
|
|
12
12
|
"import { CLIError } from './base';\nimport { ExitCode } from './codes';\nimport { redactApiKeysInText } from '../utils/sanitize';\nimport { t } from '../i18n';\n\nexport interface ApiErrorBody {\n error?: {\n message?: string;\n type?: string;\n code?: string | number;\n };\n message?: string;\n msg?: string;\n}\n\nexport function mapApiError(status: number, body: ApiErrorBody, url: string): CLIError {\n // 对 API 错误消息做脱敏处理,防止泄露认证信息\n const apiMsg =\n redactApiKeysInText(\n body.error?.message ||\n body.message ||\n body.msg ||\n `HTTP ${status}`\n );\n\n switch (status) {\n case 400:\n return new CLIError(\n t('api.400') + apiMsg,\n ExitCode.USAGE,\n t('api.400Hint'),\n );\n\n case 401:\n return new CLIError(\n t('api.401'),\n ExitCode.AUTH,\n t('api.401Hint'),\n );\n\n case 402:\n return new CLIError(\n t('api.402') + apiMsg,\n ExitCode.QUOTA,\n t('api.402Hint'),\n );\n\n case 403:\n return new CLIError(\n t('api.403'),\n ExitCode.AUTH,\n t('api.403Hint'),\n );\n\n case 404:\n return new CLIError(\n t('api.404') + apiMsg,\n ExitCode.USAGE,\n t('api.404Hint'),\n );\n\n case 421:\n return new CLIError(\n t('api.421') + apiMsg,\n ExitCode.CONTENT_FILTER,\n t('api.421Hint'),\n );\n\n case 429:\n return new CLIError(\n t('api.429') + apiMsg,\n ExitCode.QUOTA,\n t('api.429Hint'),\n );\n\n case 500:\n return new CLIError(\n t('api.500'),\n ExitCode.NETWORK,\n t('api.500Hint'),\n );\n\n case 503:\n return new CLIError(\n t('api.503'),\n ExitCode.NETWORK,\n t('api.503Hint'),\n );\n\n default:\n return new CLIError(\n t('api.default') + apiMsg + ' (HTTP ' + status + ')',\n ExitCode.GENERAL,\n );\n }\n}\n",
|
|
13
13
|
"// ============================================================\n// MiMo 扩展类型定义\n// ============================================================\n\n// Chat\nexport interface ChatMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | ContentPart[];\n reasoning_content?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n}\n\nexport type ContentPart = TextPart | ImageUrlPart | InputAudioPart | VideoUrlPart;\n\nexport interface TextPart {\n type: 'text';\n text: string;\n}\n\nexport interface ImageUrlPart {\n type: 'image_url';\n image_url: { url: string };\n}\n\nexport interface InputAudioPart {\n type: 'input_audio';\n input_audio: { data: string };\n}\n\nexport interface VideoUrlPart {\n type: 'video_url';\n video_url: { url: string };\n fps?: number;\n media_resolution?: 'default' | 'max';\n}\n\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n}\n\nexport interface ChatRequest {\n model: string;\n messages: ChatMessage[];\n max_completion_tokens?: number;\n temperature?: number;\n top_p?: number;\n stream?: boolean;\n stop?: string | string[];\n frequency_penalty?: number;\n presence_penalty?: number;\n thinking?: { type: 'enabled' | 'disabled' };\n tools?: ToolDef[];\n tool_choice?: string;\n response_format?: { type: 'text' | 'json_object' };\n audio?: AudioOutputConfig;\n asr_options?: { language: 'auto' | 'zh' | 'en' };\n}\n\nexport interface ToolDef {\n type: 'function' | 'web_search';\n // 使用 Record<string, unknown> 替代 any,表示任意 JSON Schema 对象\n function?: { name: string; description?: string; parameters?: Record<string, unknown>; strict?: boolean };\n max_keyword?: number;\n force_search?: boolean;\n limit?: number;\n user_location?: { type: string; country?: string; region?: string; city?: string };\n}\n\nexport interface AudioOutputConfig {\n format?: 'wav' | 'mp3' | 'pcm' | 'pcm16';\n voice?: string;\n optimize_text_preview?: boolean;\n}\n\nexport interface ChatResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: ChatChoice[];\n usage?: Usage;\n}\n\nexport interface ChatChoice {\n index: number;\n message: ChatMessage & { audio?: AudioData; annotations?: Annotation[] };\n finish_reason: string;\n}\n\n// 流式响应 delta 类型,替代原来的 any\nexport interface ChatStreamDelta {\n role?: string;\n content?: string;\n reasoning_content?: string;\n annotations?: Annotation[];\n}\n\nexport interface ChatStreamChunk {\n id: string;\n object: 'chat.completion.chunk';\n created: number;\n model: string;\n choices: { index: number; delta: ChatStreamDelta; finish_reason: string | null }[];\n usage?: Usage;\n}\n\nexport interface AudioData {\n id: string;\n data: string;\n expires_at: number | null;\n transcript: string | null;\n}\n\nexport interface Annotation {\n type: string;\n url: string;\n title: string;\n summary: string;\n site_name: string;\n publish_time: string;\n logo_url: string;\n}\n\nexport interface Usage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: { reasoning_tokens: number };\n prompt_tokens_details?: {\n cached_tokens: number;\n audio_tokens: number;\n image_tokens: number;\n video_tokens: number;\n };\n web_search_usage?: { tool_usage: number; page_usage: number };\n seconds?: number;\n}\n\n// TTS voices\nexport interface TTSVoice {\n name: string;\n voiceId: string;\n language: string;\n gender: string;\n}\n\n// ============================================================\n// MiMo 扩展的 ChatCompletion 消息类型\n// ============================================================\n\nexport interface MiMoChatMessage {\n role: 'system' | 'user' | 'assistant';\n content: string | MiMoContentPart[];\n reasoning_content?: string; // MiMo 推理过程\n}\n\nexport interface MiMoContentPart {\n type: 'text' | 'image_url' | 'input_audio' | 'video_url';\n text?: string;\n image_url?: { url: string };\n input_audio?: { data: string; format?: string };\n video_url?: { url: string };\n}\n\n// MiMo 扩展的 ChatCompletion 参数\nexport interface MiMoChatCompletionParams {\n model: string;\n messages: MiMoChatMessage[];\n stream?: boolean;\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n // MiMo 特有参数\n search?: boolean;\n reasoning_effort?: 'low' | 'medium' | 'high';\n}\n\n// MiMo TTS 参数\nexport interface MiMoTTSParams {\n model: string;\n input: string;\n voice: string;\n response_format?: string;\n speed?: number;\n // 声音克隆参数\n reference_audio?: string;\n reference_text?: string;\n // 音色设计参数\n voice_design_prompt?: string;\n}\n\n// MiMo ASR 参数\nexport interface MiMoASRParams {\n model: string;\n file: string; // base64 encoded audio\n response_format?: 'json' | 'text' | 'srt' | 'verbose_json' | 'vtt';\n language?: string;\n}\n\n// MiMo ChatCompletion 响应扩展\nexport interface MiMoChatCompletion {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string | null;\n reasoning_content?: string;\n audio?: AudioData;\n annotations?: Annotation[];\n };\n finish_reason: string;\n }>;\n usage?: Usage;\n}\n\n// MiMo 流式响应 chunk 扩展\nexport interface MiMoChatCompletionChunk {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: ChatStreamDelta;\n finish_reason: string | null;\n }>;\n}\n\n// ============================================================\n// 类型安全辅助函数 — 替代 as unknown as 模式\n// ============================================================\n\n/**\n * 从 OpenAI SDK 的 delta 对象中安全提取 MiMo 扩展字段。\n * OpenAI SDK 的 Delta 类型不包含 reasoning_content 和 annotations,\n * 但 MiMo API 会在运行时返回这些字段。\n */\nexport function extractDelta(delta: Record<string, unknown>): ChatStreamDelta {\n return {\n role: typeof delta.role === 'string' ? delta.role : undefined,\n content: typeof delta.content === 'string' ? delta.content : undefined,\n reasoning_content: typeof delta.reasoning_content === 'string' ? delta.reasoning_content : undefined,\n annotations: Array.isArray(delta.annotations) ? delta.annotations as Annotation[] : undefined,\n };\n}\n\n/**\n * 从 OpenAI SDK 的 chunk 对象中安全提取 usage 字段。\n * OpenAI SDK 的 ChatCompletionChunk.usage 类型与 MiMo 的 Usage 不完全一致。\n */\nexport function extractChunkUsage(chunk: Record<string, unknown>): Usage | undefined {\n const usage = chunk.usage;\n if (typeof usage === 'object' && usage !== null) {\n return usage as Usage;\n }\n return undefined;\n}\n\n/**\n * 安全中止 OpenAI SDK 的 Stream 对象。\n * Stream 内部有 controller 属性但不在公开类型定义中。\n */\nexport function abortStream(stream: object): void {\n if ('controller' in stream) {\n const ctrl = (stream as Record<string, unknown>).controller;\n if (ctrl && typeof ctrl === 'object' && ctrl !== null && 'abort' in ctrl) {\n (ctrl as { abort(): void }).abort();\n }\n }\n}\n\n/**\n * 从 OpenAI APIError 中安全提取 url 字段。\n * url 属性在运行时存在但不在 OpenAI SDK 类型定义中。\n */\nexport function extractErrorUrl(err: object): string {\n if ('url' in err) {\n const url = (err as Record<string, unknown>).url;\n return typeof url === 'string' ? url : '';\n }\n return '';\n}\n",
|
|
14
|
-
"import type { Config } from '../config/schema';\nimport { CLIError } from '../errors/base';\nimport { ExitCode } from '../errors/codes';\nimport { maskApiKey } from '../utils/sanitize';\n\nexport interface ResolvedCredential {\n token: string;\n method: 'api-key';\n source: 'flag' | 'config.json' | 'env';\n}\n\n/**\n * 根据 API Key 前缀推断 base URL:\n * - tp- 开头:TokenPlan Key → https://token-plan-cn.xiaomimimo.com/v1\n * - 其他:按量计费 Key → https://api.xiaomimimo.com/v1\n */\nexport function inferBaseUrlFromKey(apiKey: string): string | undefined {\n if (apiKey.startsWith('tp-')) {\n return 'https://token-plan-cn.xiaomimimo.com/v1';\n }\n // 按量计费 Key 不需要返回,使用默认 base URL 即可\n return undefined;\n}\n\nexport function resolveCredential(config: Config): ResolvedCredential {\n // 1. --api-key flag\n if (config.apiKey) {\n return { token: config.apiKey, method: 'api-key', source: 'flag' };\n }\n\n // 2. MIMO_API_KEY env var\n const envKey = process.env.MIMO_API_KEY;\n if (envKey) {\n return { token: envKey, method: 'api-key', source: 'env' };\n }\n\n // 3.
|
|
14
|
+
"import type { Config } from '../config/schema';\nimport { CLIError } from '../errors/base';\nimport { ExitCode } from '../errors/codes';\nimport { maskApiKey } from '../utils/sanitize';\n\nexport interface ResolvedCredential {\n token: string;\n method: 'api-key';\n source: 'flag' | 'config.json' | 'env';\n}\n\n/**\n * 根据 API Key 前缀推断 base URL:\n * - tp- 开头:TokenPlan Key → https://token-plan-cn.xiaomimimo.com/v1\n * - 其他:按量计费 Key → https://api.xiaomimimo.com/v1\n */\nexport function inferBaseUrlFromKey(apiKey: string): string | undefined {\n if (apiKey.startsWith('tp-')) {\n return 'https://token-plan-cn.xiaomimimo.com/v1';\n }\n // 按量计费 Key 不需要返回,使用默认 base URL 即可\n return undefined;\n}\n\nexport function resolveCredential(config: Config): ResolvedCredential {\n // 1. --api-key flag\n if (config.apiKey) {\n return { token: config.apiKey, method: 'api-key', source: 'flag' };\n }\n\n // 2. MIMO_API_KEY env var\n const envKey = process.env.MIMO_API_KEY;\n if (envKey) {\n return { token: envKey, method: 'api-key', source: 'env' };\n }\n\n // 3. 根据 active_key 选择配置文件中的 Key\n if (config.activeKey === 'sk' && config.fileSkApiKey) {\n return { token: config.fileSkApiKey, method: 'api-key', source: 'config.json' };\n }\n\n // 4. 默认使用 tp Key(api_key),如果不存在则回退到 sk_api_key\n if (config.fileApiKey) {\n return { token: config.fileApiKey, method: 'api-key', source: 'config.json' };\n }\n\n // 5. 如果只有 sk_api_key,也使用它\n if (config.fileSkApiKey) {\n return { token: config.fileSkApiKey, method: 'api-key', source: 'config.json' };\n }\n\n // 错误提示中使用脱敏示例,不泄露真实 key\n throw new CLIError(\n 'No credentials found.',\n ExitCode.AUTH,\n 'Log in: mimo auth login\\nPass directly: --api-key <key>\\nSet env var: MIMO_API_KEY=<key>',\n );\n}\n",
|
|
15
15
|
"import { MiMoClient, wrapApiError } from '../client/index';\nimport type { Config } from '../config/schema';\nimport { resolveCredential, inferBaseUrlFromKey } from '../auth/resolver';\n\nexport interface MiMoSDKClientOptions {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n}\n\nexport class MiMoSDKClient {\n readonly mimo: MiMoClient;\n readonly options: MiMoSDKClientOptions;\n\n constructor(options: MiMoSDKClientOptions) {\n this.options = options;\n // 如果未指定 baseUrl,根据 apiKey 前缀自动推断\n const resolvedBaseUrl = options.baseUrl || inferBaseUrlFromKey(options.apiKey ?? '') || undefined;\n this.mimo = new MiMoClient({\n apiKey: options.apiKey ?? '',\n baseURL: resolvedBaseUrl,\n timeout: options.timeout,\n });\n }\n\n /** Create a MiMoSDKClient from CLI Config, resolving credentials automatically. */\n static async fromConfig(config: Config): Promise<MiMoSDKClient> {\n const cred = resolveCredential(config);\n return new MiMoSDKClient({\n apiKey: cred.token,\n baseUrl: config.baseUrl,\n timeout: config.timeout,\n });\n }\n\n /** Wrap API errors into CLIError. */\n handleError(error: unknown): never {\n throw wrapApiError(error);\n }\n}\n",
|
|
16
16
|
"import { MiMoSDKClient } from './client';\nimport type {\n ChatMessage,\n ChatRequest,\n ChatResponse,\n ChatStreamChunk,\n Usage,\n} from '../types/api';\nimport { extractDelta, extractChunkUsage } from '../types/api';\n\nexport interface ChatOptions {\n model?: string;\n messages: ChatMessage[];\n maxCompletionTokens?: number;\n temperature?: number;\n topP?: number;\n stream?: boolean;\n stop?: string | string[];\n frequencyPenalty?: number;\n presencePenalty?: number;\n thinking?: boolean;\n responseFormat?: { type: 'text' | 'json_object' };\n}\n\nexport interface ChatResult {\n id: string;\n content: string;\n reasoningContent?: string;\n model: string;\n usage?: Usage;\n finishReason: string;\n}\n\nexport class ChatSDK {\n private client: MiMoSDKClient;\n\n constructor(client: MiMoSDKClient) {\n this.client = client;\n }\n\n async chat(options: ChatOptions): Promise<ChatResult> {\n const request: ChatRequest = {\n model: options.model ?? 'MiMo-7B-RL',\n messages: options.messages,\n max_completion_tokens: options.maxCompletionTokens,\n temperature: options.temperature,\n top_p: options.topP,\n stream: false,\n stop: options.stop,\n frequency_penalty: options.frequencyPenalty,\n presence_penalty: options.presencePenalty,\n thinking: options.thinking ? { type: 'enabled' } : undefined,\n response_format: options.responseFormat,\n };\n\n try {\n // chatCompletion 返回 MiMoChatCompletion,可直接访问 MiMo 扩展字段\n const response = await this.client.mimo.chatCompletion(request);\n const choice = response.choices[0];\n return {\n id: response.id,\n content: choice?.message?.content ?? '',\n reasoningContent: choice?.message?.reasoning_content,\n model: response.model,\n usage: response.usage,\n finishReason: choice?.finish_reason ?? 'stop',\n };\n } catch (error) {\n this.client.handleError(error);\n }\n }\n\n async *chatStream(options: ChatOptions): AsyncGenerator<ChatStreamChunk> {\n const request: ChatRequest = {\n model: options.model ?? 'MiMo-7B-RL',\n messages: options.messages,\n max_completion_tokens: options.maxCompletionTokens,\n temperature: options.temperature,\n top_p: options.topP,\n stream: true,\n stop: options.stop,\n frequency_penalty: options.frequencyPenalty,\n presence_penalty: options.presencePenalty,\n thinking: options.thinking ? { type: 'enabled' } : undefined,\n response_format: options.responseFormat,\n };\n\n try {\n const stream = await this.client.mimo.chatCompletionStream(request);\n // stream 类型为 Stream<ChatCompletionChunk>,转为 ChatStreamChunk 的异步迭代\n for await (const chunk of stream) {\n // 使用 extractDelta 安全提取 MiMo 扩展字段(reasoning_content、annotations)\n const mapped: ChatStreamChunk = {\n id: chunk.id,\n object: 'chat.completion.chunk',\n created: chunk.created,\n model: chunk.model,\n choices: chunk.choices.map((c) => ({\n index: c.index,\n delta: extractDelta(c.delta as Record<string, unknown>),\n finish_reason: c.finish_reason,\n })),\n usage: extractChunkUsage(chunk as unknown as Record<string, unknown>),\n };\n yield mapped;\n }\n } catch (error) {\n this.client.handleError(error);\n }\n }\n}\n",
|
|
17
17
|
"import { MiMoSDKClient } from './client';\nimport type { ChatMessage, ContentPart, Usage, ChatRequest, MiMoChatCompletion } from '../types/api';\n\nexport interface VisionOptions {\n model?: string;\n image?: string;\n audio?: string;\n video?: string;\n prompt?: string;\n fps?: number;\n mediaResolution?: 'default' | 'max';\n}\n\nexport interface VisionResult {\n id: string;\n content: string;\n model: string;\n usage?: Usage;\n}\n\nexport class VisionSDK {\n private client: MiMoSDKClient;\n\n constructor(client: MiMoSDKClient) {\n this.client = client;\n }\n\n async describe(options: VisionOptions): Promise<VisionResult> {\n const contentParts: ContentPart[] = [];\n\n if (options.prompt) {\n contentParts.push({ type: 'text', text: options.prompt });\n }\n\n if (options.image) {\n contentParts.push({\n type: 'image_url',\n image_url: { url: options.image },\n });\n }\n\n if (options.audio) {\n contentParts.push({\n type: 'input_audio',\n input_audio: { data: options.audio },\n });\n }\n\n if (options.video) {\n contentParts.push({\n type: 'video_url',\n video_url: {\n url: options.video,\n ...(options.fps ? { fps: options.fps } : {}),\n ...(options.mediaResolution ? { media_resolution: options.mediaResolution } : {}),\n },\n });\n }\n\n const messages: ChatMessage[] = [\n {\n role: 'user',\n content: contentParts.length > 0 ? contentParts : (options.prompt ?? 'Describe this.'),\n },\n ];\n\n try {\n const request: ChatRequest = {\n model: options.model ?? 'mimo-v2.5',\n messages,\n stream: false,\n };\n // chatCompletion 返回 MiMoChatCompletion,可直接访问扩展字段\n const response: MiMoChatCompletion = await this.client.mimo.chatCompletion(request);\n const choice = response.choices[0];\n return {\n id: response.id,\n content: choice?.message?.content ?? '',\n model: response.model,\n usage: response.usage,\n };\n } catch (error) {\n this.client.handleError(error);\n }\n }\n}\n",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"import { MiMoSDKClient } from './client';\nimport { wrapApiError } from '../client/index';\nimport type { TTSVoice } from '../types/api';\n\nexport interface TTSSynthesizeOptions {\n model?: string;\n text: string;\n voice?: string;\n style?: string;\n format?: 'wav' | 'mp3' | 'pcm';\n}\n\nexport interface TTSCloneOptions {\n model?: string;\n sample: string; // base64 data URI of reference audio\n text: string;\n format?: 'wav' | 'mp3' | 'pcm';\n}\n\nexport interface TTSDesignOptions {\n model?: string;\n prompt: string;\n text: string;\n optimizeText?: boolean;\n format?: 'wav' | 'mp3' | 'pcm';\n}\n\nexport interface TTSResult {\n id: string;\n audio: Buffer;\n model: string;\n}\n\nexport interface TTSVoicesResult {\n voices: TTSVoice[];\n}\n\nexport class TTSSDK {\n private client: MiMoSDKClient;\n\n constructor(client: MiMoSDKClient) {\n this.client = client;\n }\n\n async synthesize(options: TTSSynthesizeOptions): Promise<TTSResult> {\n try {\n const response = await fetch(`${this.client.options.baseUrl}/tts/synthesize`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.client.options.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: options.model ?? 'mimo-v2.5-tts',\n text: options.text,\n voice: options.voice,\n style: options.style,\n format: options.format ?? 'mp3',\n }),\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw wrapApiError({ status: response.status, error: body, url: response.url });\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n return {\n id: response.headers.get('x-request-id') ?? '',\n audio: buffer,\n model: options.model ?? 'mimo-v2.5-tts',\n };\n } catch (error) {\n throw wrapApiError(error);\n }\n }\n\n async clone(options: TTSCloneOptions): Promise<TTSResult> {\n try {\n const response = await fetch(`${this.client.options.baseUrl}/tts/clone`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.client.options.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: options.model ?? 'mimo-v2.5-tts',\n sample: options.sample,\n text: options.text,\n format: options.format ?? 'mp3',\n }),\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw wrapApiError({ status: response.status, error: body, url: response.url });\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n return {\n id: response.headers.get('x-request-id') ?? '',\n audio: buffer,\n model: options.model ?? 'mimo-v2.5-tts',\n };\n } catch (error) {\n throw wrapApiError(error);\n }\n }\n\n async design(options: TTSDesignOptions): Promise<TTSResult> {\n try {\n const response = await fetch(`${this.client.options.baseUrl}/tts/design`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.client.options.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: options.model ?? 'mimo-v2.5-tts',\n prompt: options.prompt,\n text: options.text,\n optimize_text_preview: options.optimizeText ?? false,\n format: options.format ?? 'mp3',\n }),\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw wrapApiError({ status: response.status, error: body, url: response.url });\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n return {\n id: response.headers.get('x-request-id') ?? '',\n audio: buffer,\n model: options.model ?? 'mimo-v2.5-tts',\n };\n } catch (error) {\n throw wrapApiError(error);\n }\n }\n\n async voices(): Promise<TTSVoicesResult> {\n try {\n const response = await fetch(`${this.client.options.baseUrl}/tts/voices`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.client.options.apiKey}`,\n },\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw wrapApiError({ status: response.status, error: body, url: response.url });\n }\n\n const data = await response.json() as Record<string, unknown>;\n return {\n voices: (data.voices ?? data.data ?? []) as TTSVoice[],\n };\n } catch (error) {\n throw wrapApiError(error);\n }\n }\n}\n",
|
|
20
20
|
"import { MiMoSDKClient, type MiMoSDKClientOptions } from './client';\nimport { ChatSDK, type ChatOptions, type ChatResult } from './chat';\nimport { VisionSDK, type VisionOptions, type VisionResult } from './vision';\nimport { ASRSDK, type ASROptions, type ASRResult } from './asr';\nimport { TTSSDK, type TTSSynthesizeOptions, type TTSCloneOptions, type TTSDesignOptions, type TTSResult, type TTSVoicesResult } from './tts';\nimport type { Config } from '../config/schema';\n\nexport { MiMoSDKClient, type MiMoSDKClientOptions } from './client';\nexport { ChatSDK, type ChatOptions, type ChatResult } from './chat';\nexport { VisionSDK, type VisionOptions, type VisionResult } from './vision';\nexport { ASRSDK, type ASROptions, type ASRResult } from './asr';\nexport { TTSSDK, type TTSSynthesizeOptions, type TTSCloneOptions, type TTSDesignOptions, type TTSResult, type TTSVoicesResult } from './tts';\n\nexport interface MiMoSDKOptions {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n}\n\nexport class MiMoSDK {\n readonly chat: ChatSDK;\n readonly vision: VisionSDK;\n readonly asr: ASRSDK;\n readonly tts: TTSSDK;\n readonly client: MiMoSDKClient;\n\n constructor(options: MiMoSDKOptions) {\n this.client = new MiMoSDKClient(options);\n this.chat = new ChatSDK(this.client);\n this.vision = new VisionSDK(this.client);\n this.asr = new ASRSDK(this.client);\n this.tts = new TTSSDK(this.client);\n }\n\n /** Create a MiMoSDK from CLI Config, resolving credentials automatically. */\n static async fromConfig(config: Config): Promise<MiMoSDK> {\n const client = await MiMoSDKClient.fromConfig(config);\n return new MiMoSDK({\n apiKey: client.options.apiKey,\n baseUrl: client.options.baseUrl,\n timeout: client.options.timeout,\n });\n }\n}\n"
|
|
21
21
|
],
|
|
22
|
-
"mappings": "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",
|
|
23
|
-
"debugId": "
|
|
22
|
+
"mappings": ";AAAA;;;ACAO,IAAM,UAAU,QAAQ,IAAI,eAAe;;;ACAlD;;;ACAO,IAAM,WAAW;AAAA,EACtB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,eAAe;AACjB;;;ACRO,MAAM,iBAAiB,MAAM;AAAA,EACzB;AAAA,EACA;AAAA,EAET,WAAW,CAAC,SAAiB,WAAqB,SAAS,SAAS,MAAe;AAAA,IACjF,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,WAAW;AAAA,IAChB,KAAK,OAAO;AAAA;AAAA,EAGd,MAAM,GAAG;AAAA,IACP,OAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,SAAS,KAAK;AAAA,WACV,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,MACzC;AAAA,IACF;AAAA;AAEJ;;;ACgBO,SAAS,UAAU,CAAC,KAAqB;AAAA,EAC9C,IAAI,CAAC,OAAO,OAAO,QAAQ;AAAA,IAAU,OAAO;AAAA,EAG5C,IAAI,IAAI,UAAU,GAAG;AAAA,IACnB,OAAO,IAAI,MAAM,GAAG,CAAC,IAAI;AAAA,EAC3B;AAAA,EAEA,OAAO,IAAI,MAAM,GAAG,CAAC,IAAI,SAAS,IAAI,MAAM,EAAE;AAAA;AAUzC,SAAS,mBAAmB,CAAC,MAAsB;AAAA,EACxD,IAAI,CAAC,QAAQ,OAAO,SAAS;AAAA,IAAU,OAAO;AAAA,EAG9C,OAAO,KAAK,QAAQ,iCAAiC,CAAC,UAAU;AAAA,IAC9D,OAAO,WAAW,KAAK;AAAA,GACxB;AAAA;;;ACvDH,IAAI,gBAAwB;AAqC5B,IAAM,eAAuD;AAAA,EAE3D,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,oBAAoB;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,oBAAoB;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,oBAAoB;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,oBAAoB;AAAA,IAClB,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,EACN;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,EACN;AAAA,EAGA,cAAc,EAAE,IAAI,OAAM,IAAI,SAAS;AAAA,EACvC,gBAAgB,EAAE,IAAI,OAAM,IAAI,WAAW;AAAA,EAC3C,iBAAiB,EAAE,IAAI,OAAM,IAAI,YAAY;AAAA,EAC7C,eAAe,EAAE,IAAI,WAAU,IAAI,iBAAiB;AAAA,EACpD,iBAAiB,EAAE,IAAI,QAAO,IAAI,YAAY;AAAA,EAC9C,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,sBAAsB;AAAA,IACpB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EAGA,gBAAgB,EAAE,IAAI,OAAM,IAAI,SAAS;AAAA,EACzC,kBAAkB,EAAE,IAAI,gBAAe,IAAI,qBAAqB;AAAA,EAChE,iBAAiB,EAAE,IAAI,SAAQ,IAAI,qBAAqB;AAAA,EACxD,qBAAqB;AAAA,IACnB,IAAI;AAAA;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA;AAAA,EACN;AAAA,EACA,iBAAiB,EAAE,IAAI,WAAU,IAAI,0BAA0B;AAAA,EAC/D,qBAAqB;AAAA,IACnB,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,EACN;AAAA,EACA,mBAAmB;AAAA,IACjB,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,EACN;AAAA,EACA,kBAAkB,EAAE,IAAI,aAAY,IAAI,+BAA+B;AAAA,EACvE,kBAAkB,EAAE,IAAI,sBAAqB,IAAI,2DAA2D;AAAA,EAC5G,kBAAkB,EAAE,IAAI,sBAAqB,IAAI,2CAA2C;AAAA,EAC5F,mBAAmB,EAAE,IAAI,eAAc,IAAI,uCAAuC;AAAA,EAClF,kBAAkB,EAAE,IAAI,WAAU,IAAI,sBAAsB;AAAA,EAG5D,WAAW,EAAE,IAAI,WAAU,IAAI,gBAAgB;AAAA,EAC/C,eAAe,EAAE,IAAI,eAAc,IAAI,4CAA4C;AAAA,EACnF,WAAW,EAAE,IAAI,mBAAkB,IAAI,oCAAoC;AAAA,EAC3E,eAAe,EAAE,IAAI;AAAA,uBAAqD,IAAI;AAAA,kCAAyE;AAAA,EACvJ,WAAW,EAAE,IAAI,SAAQ,IAAI,qBAAqB;AAAA,EAClD,eAAe,EAAE,IAAI,eAAc,IAAI,oDAAoD;AAAA,EAC3F,WAAW,EAAE,IAAI,oBAAmB,IAAI,4BAA4B;AAAA,EACpE,eAAe,EAAE,IAAI;AAAA,kBAAkD,IAAI;AAAA,iCAAgH;AAAA,EAC3L,WAAW,EAAE,IAAI,QAAO,IAAI,cAAc;AAAA,EAC1C,eAAe,EAAE,IAAI,gCAA+B,IAAI,0FAA0F;AAAA,EAClJ,WAAW,EAAE,IAAI,UAAS,IAAI,qBAAqB;AAAA,EACnD,eAAe,EAAE,IAAI,0BAAyB,IAAI,iGAAiG;AAAA,EACnJ,WAAW,EAAE,IAAI,WAAU,IAAI,wBAAwB;AAAA,EACvD,eAAe,EAAE,IAAI,sBAAqB,IAAI,oFAAoF;AAAA,EAClI,WAAW,EAAE,IAAI,sBAAqB,IAAI,2BAA2B;AAAA,EACrE,eAAe,EAAE,IAAI,oBAAmB,IAAI,gEAAgE;AAAA,EAC5G,WAAW,EAAE,IAAI,qBAAoB,IAAI,kCAAkC;AAAA,EAC3E,eAAe,EAAE,IAAI,sBAAqB,IAAI,iFAAiF;AAAA,EAC/H,eAAe,EAAE,IAAI,WAAU,IAAI,cAAc;AAAA,EAGjD,gBAAgB,EAAE,IAAI,YAAW,IAAI,wBAAwB;AAAA,EAC7D,oBAAoB;AAAA,IAClB,IAAI;AAAA;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA;AAAA,EACN;AAAA,EACA,sBAAsB,EAAE,IAAI,gBAAe,IAAI,uBAAuB;AAAA,EACtE,kBAAkB,EAAE,IAAI,sCAAqC,IAAI,uCAAuC;AAAA,EACxG,iBAAiB,EAAE,IAAI,iBAAgB,IAAI,2BAA2B;AAAA,EACtE,oBAAoB,EAAE,IAAI,iBAAgB,IAAI,uBAAuB;AAAA,EACrE,iBAAiB,EAAE,IAAI,gBAAe,IAAI,mBAAmB;AAAA,EAC7D,oBAAoB,EAAE,IAAI,cAAa,IAAI,6BAA6B;AAAA,EACxE,oBAAoB,EAAE,IAAI,uBAAsB,IAAI,kCAAkC;AAAA,EACtF,qBAAqB,EAAE,IAAI,oCAAmC,IAAI,mEAAmE;AAAA,EACrI,oBAAoB,EAAE,IAAI,gCAA+B,IAAI,4CAA4C;AAAA,EACzG,oBAAoB,EAAE,IAAI,oBAAmB,IAAI,2BAA2B;AAAA,EAC5E,oBAAoB,EAAE,IAAI,6BAA4B,IAAI,uDAAuD;AAAA,EACjH,mBAAmB,EAAE,IAAI,qBAAoB,IAAI,2CAA2C;AAAA,EAG5F,iBAAiB,EAAE,IAAI,UAAS,IAAI,iCAAiC;AAAA,EACrE,iBAAiB,EAAE,IAAI,WAAU,IAAI,2CAA2C;AAAA,EAChF,mBAAmB,EAAE,IAAI,mBAAkB,IAAI,kDAAkD;AAAA,EACjG,gBAAgB,EAAE,IAAI,aAAY,IAAI,2BAA2B;AAAA,EACjE,qBAAqB,EAAE,IAAI,YAAW,IAAI,yCAAyC;AAAA,EACnF,qBAAqB,EAAE,IAAI,YAAW,IAAI,uCAAuC;AAAA,EACjF,sBAAsB,EAAE,IAAI,aAAY,IAAI,wCAAwC;AAAA,EACpF,sBAAsB,EAAE,IAAI,gBAAe,IAAI,4BAA4B;AAAA,EAC3E,sBAAsB,EAAE,IAAI,0CAAyC,IAAI,iFAAiF;AAAA,EAC1J,uBAAuB,EAAE,IAAI,YAAW,IAAI,qCAAqC;AAAA,EACjF,uBAAuB,EAAE,IAAI,kBAAiB,IAAI,uCAAuC;AAAA,EACzF,uBAAuB,EAAE,IAAI,UAAS,IAAI,gCAAgC;AAAA,EAC1E,sBAAsB,EAAE,IAAI,SAAQ,IAAI,4BAA4B;AAAA,EACpE,mBAAmB,EAAE,IAAI,eAAc,IAAI,2BAA2B;AAAA,EACtE,iBAAiB,EAAE,IAAI,UAAS,IAAI,yBAAyB;AAAA,EAC7D,qBAAqB,EAAE,IAAI,iBAAgB,IAAI,oCAAoC;AAAA,EAGnF,wBAAwB;AAAA,IACtB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,4BAA4B;AAAA,IAC1B,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,8BAA8B;AAAA,IAC5B,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,kCAAkC;AAAA,IAChC,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,wBAAwB;AAAA,IACtB,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,4BAA4B;AAAA,IAC1B,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EAGA,kBAAkB,EAAE,IAAI,oBAAmB,IAAI,mCAAmC;AAAA,EAClF,qBAAqB,EAAE,IAAI,mBAAkB,IAAI,8CAA8C;AAAA,EAC/F,uBAAuB,EAAE,IAAI,4BAA2B,IAAI,kDAAkD;AAAA,EAC9G,2BAA2B,EAAE,IAAI,kBAAiB,IAAI,2DAA2D;AAAA,EACjH,qBAAqB,EAAE,IAAI,WAAU,IAAI,0BAA0B;AAAA,EACnE,yBAAyB,EAAE,IAAI,qBAAoB,IAAI,6CAA6C;AAAA,EAGpG,cAAc,EAAE,IAAI,eAAc,IAAI,+BAA+B;AAAA,EACrE,oBAAoB,EAAE,IAAI,eAAc,IAAI,8BAA8B;AAAA,EAC1E,qBAAqB,EAAE,IAAI,aAAY,IAAI,uBAAuB;AAAA,EAClE,iBAAiB,EAAE,IAAI,mBAAkB,IAAI,uDAAuD;AAAA,EAGpG,cAAc,EAAE,IAAI,gBAAe,IAAI,sBAAsB;AAAA,EAC7D,iBAAiB,EAAE,IAAI,wBAAuB,IAAI,6CAA6C;AAAA,EAC/F,mBAAmB,EAAE,IAAI,4BAA2B,IAAI,+CAA+C;AAAA,EACvG,uBAAuB,EAAE,IAAI,oBAAmB,IAAI,+DAA+D;AAAA,EACnH,gBAAgB,EAAE,IAAI,kBAAiB,IAAI,wBAAwB;AAAA,EACnE,gBAAgB,EAAE,IAAI,kBAAiB,IAAI,wBAAwB;AAAA,EACnE,wBAAwB,EAAE,IAAI,oCAAmC,IAAI,gDAAgD;AAAA,EACrH,mBAAmB,EAAE,IAAI,kBAAiB,IAAI,mCAAmC;AAAA,EACjF,oBAAoB,EAAE,IAAI,SAAQ,IAAI,kBAAkB;AAAA,EAGxD,sBAAsB,EAAE,IAAI,eAAc,IAAI,qBAAqB;AAAA,EACnE,wBAAwB,EAAE,IAAI,iBAAgB,IAAI,uBAAuB;AAAA,EACzE,qBAAqB,EAAE,IAAI,WAAU,IAAI,uBAAuB;AAAA,EAChE,0BAA0B,EAAE,IAAI,qBAAoB,IAAI,kEAAkE;AAAA,EAC1H,oBAAoB,EAAE,IAAI,SAAQ,IAAI,eAAe;AAAA,EACrD,qBAAqB,EAAE,IAAI,kBAAiB,IAAI,qCAAqC;AAAA,EACrF,oBAAoB,EAAE,IAAI,+BAA8B,IAAI,mCAAmC;AAAA,EAC/F,kBAAkB,EAAE,IAAI,OAAM,IAAI,MAAM;AAAA,EACxC,2BAA2B,EAAE,IAAI,+BAA8B,IAAI,mCAAmC;AAAA,EACtG,oBAAoB,EAAE,IAAI,yBAAwB,IAAI,iCAAiC;AAAA,EACvF,oBAAoB,EAAE,IAAI,eAAc,IAAI,sCAAsC;AAAA,EAClF,wBAAwB,EAAE,IAAI;AAAA,GAA+B,IAAI;AAAA,EAAyC;AAAA,EAG1G,mBAAmB,EAAE,IAAI,aAAY,IAAI,0BAA0B;AAAA,EACnE,sBAAsB,EAAE,IAAI,mBAAkB,IAAI,qEAAqE;AAAA,EACvH,yBAAyB,EAAE,IAAI,kBAAiB,IAAI,6BAA6B;AAAA,EACjF,wBAAwB,EAAE,IAAI,kBAAiB,IAAI,4BAA4B;AAAA,EAC/E,wBAAwB,EAAE,IAAI,gBAAe,IAAI,sBAAsB;AAAA,EACvE,mBAAmB,EAAE,IAAI,uBAAsB,IAAI,4BAA4B;AAAA,EAC/E,kBAAkB,EAAE,IAAI,yBAAwB,IAAI,6CAA6C;AAAA,EACjG,uBAAuB,EAAE,IAAI,mCAAkC,IAAI,2CAA2C;AAAA,EAC9G,wBAAwB,EAAE,IAAI,WAAU,IAAI,sBAAsB;AAAA,EAClE,qBAAqB,EAAE,IAAI,wCAAuC,IAAI,sDAAsD;AAAA,EAG5H,cAAc,EAAE,IAAI,uCAAsC,IAAI,kDAAkD;AAAA,EAChH,YAAY,EAAE,IAAI,KAAI,IAAI,MAAM;AAAA,EAChC,oBAAoB,EAAE,IAAI,aAAY,IAAI,uBAAuB;AAAA,EACjE,gBAAgB,EAAE,IAAI,OAAM,IAAI,WAAW;AAAA,EAC3C,gBAAgB,EAAE,IAAI,UAAS,IAAI,wBAAwB;AAAA,EAG3D,wBAAwB,EAAE,IAAI,aAAY,IAAI,yBAAyB;AAAA,EACvE,yBAAyB,EAAE,IAAI,eAAc,IAAI,0BAA0B;AAAA,EAC3E,mBAAmB,EAAE,IAAI,eAAc,IAAI,gCAAgC;AAAA,EAC3E,qBAAqB,EAAE,IAAI,aAAY,IAAI,qBAAqB;AAAA,EAGhE,oBAAoB,EAAE,IAAI,WAAU,IAAI,+BAA+B;AAAA,EACvE,oBAAoB,EAAE,IAAI,eAAc,IAAI,yCAAyC;AAAA,EACrF,oBAAoB,EAAE,IAAI,+BAA8B,IAAI,2DAA2D;AAAA,EACvH,iBAAiB,EAAE,IAAI,0CAAyC,IAAI,8CAA8C;AAAA,EAGlH,kBAAkB,EAAE,IAAI,SAAQ,IAAI,YAAY;AAAA,EAChD,cAAc,EAAE,IAAI,KAAI,IAAI,KAAK;AACnC;AAWO,SAAS,CAAC,CAAC,KAAa,MAAgD;AAAA,EAC7E,MAAM,QAAQ,aAAa;AAAA,EAC3B,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EACnB,IAAI,OAAO,MAAM,kBAAkB,MAAM,SAAS;AAAA,EAClD,IAAI,MAAM;AAAA,IACR,YAAY,GAAG,MAAM,OAAO,QAAQ,IAAI,GAAG;AAAA,MACzC,OAAO,KAAK,QAAQ,IAAI,OAAO,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;AC3SF,SAAS,WAAW,CAAC,QAAgB,MAAoB,KAAuB;AAAA,EAErF,MAAM,SACJ,oBACE,KAAK,OAAO,WACZ,KAAK,WACL,KAAK,OACL,QAAQ,QACV;AAAA,EAEF,QAAQ;AAAA,SACD;AAAA,MACH,OAAO,IAAI,SACT,EAAE,SAAS,IAAI,QACf,SAAS,OACT,EAAE,aAAa,CACjB;AAAA,SAEG;AAAA,MACH,OAAO,IAAI,SACT,EAAE,SAAS,GACX,SAAS,MACT,EAAE,aAAa,CACjB;AAAA,SAEG;AAAA,MACH,OAAO,IAAI,SACT,EAAE,SAAS,IAAI,QACf,SAAS,OACT,EAAE,aAAa,CACjB;AAAA,SAEG;AAAA,MACH,OAAO,IAAI,SACT,EAAE,SAAS,GACX,SAAS,MACT,EAAE,aAAa,CACjB;AAAA,SAEG;AAAA,MACH,OAAO,IAAI,SACT,EAAE,SAAS,IAAI,QACf,SAAS,OACT,EAAE,aAAa,CACjB;AAAA,SAEG;AAAA,MACH,OAAO,IAAI,SACT,EAAE,SAAS,IAAI,QACf,SAAS,gBACT,EAAE,aAAa,CACjB;AAAA,SAEG;AAAA,MACH,OAAO,IAAI,SACT,EAAE,SAAS,IAAI,QACf,SAAS,OACT,EAAE,aAAa,CACjB;AAAA,SAEG;AAAA,MACH,OAAO,IAAI,SACT,EAAE,SAAS,GACX,SAAS,SACT,EAAE,aAAa,CACjB;AAAA,SAEG;AAAA,MACH,OAAO,IAAI,SACT,EAAE,SAAS,GACX,SAAS,SACT,EAAE,aAAa,CACjB;AAAA;AAAA,MAGA,OAAO,IAAI,SACT,EAAE,aAAa,IAAI,SAAS,YAAY,SAAS,KACjD,SAAS,OACX;AAAA;AAAA;;;ACuJC,SAAS,YAAY,CAAC,OAAiD;AAAA,EAC5E,OAAO;AAAA,IACL,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,IACpD,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAAA,IAC7D,mBAAmB,OAAO,MAAM,sBAAsB,WAAW,MAAM,oBAAoB;AAAA,IAC3F,aAAa,MAAM,QAAQ,MAAM,WAAW,IAAI,MAAM,cAA8B;AAAA,EACtF;AAAA;AAOK,SAAS,iBAAiB,CAAC,OAAmD;AAAA,EACnF,MAAM,QAAQ,MAAM;AAAA,EACpB,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAAA,IAC/C,OAAO;AAAA,EACT;AAAA,EACA;AAAA;AAoBK,SAAS,eAAe,CAAC,KAAqB;AAAA,EACnD,IAAI,SAAS,KAAK;AAAA,IAChB,MAAM,MAAO,IAAgC;AAAA,IAC7C,OAAO,OAAO,QAAQ,WAAW,MAAM;AAAA,EACzC;AAAA,EACA,OAAO;AAAA;;;AC/QF,SAAS,mBAAmB,CAAC,QAAoC;AAAA,EACtE,IAAI,OAAO,WAAW,KAAK,GAAG;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EAEA;AAAA;AAGK,SAAS,iBAAiB,CAAC,QAAoC;AAAA,EAEpE,IAAI,OAAO,QAAQ;AAAA,IACjB,OAAO,EAAE,OAAO,OAAO,QAAQ,QAAQ,WAAW,QAAQ,OAAO;AAAA,EACnE;AAAA,EAGA,MAAM,SAAS,QAAQ,IAAI;AAAA,EAC3B,IAAI,QAAQ;AAAA,IACV,OAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM;AAAA,EAC3D;AAAA,EAGA,IAAI,OAAO,cAAc,QAAQ,OAAO,cAAc;AAAA,IACpD,OAAO,EAAE,OAAO,OAAO,cAAc,QAAQ,WAAW,QAAQ,cAAc;AAAA,EAChF;AAAA,EAGA,IAAI,OAAO,YAAY;AAAA,IACrB,OAAO,EAAE,OAAO,OAAO,YAAY,QAAQ,WAAW,QAAQ,cAAc;AAAA,EAC9E;AAAA,EAGA,IAAI,OAAO,cAAc;AAAA,IACvB,OAAO,EAAE,OAAO,OAAO,cAAc,QAAQ,WAAW,QAAQ,cAAc;AAAA,EAChF;AAAA,EAGA,MAAM,IAAI,SACR,yBACA,SAAS,MACT;AAAA;AAAA,mCACF;AAAA;;;AP1CF,SAAS,WAAW,CAAC,KAAuB;AAAA,EAC1C,OAAO,gBAAgB,GAAG;AAAA;AAMrB,SAAS,YAAY,CAAC,KAAwB;AAAA,EACnD,IAAI,eAAe,UAAU;AAAA,IAC3B,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,eAAe,OAAO,oBAAoB;AAAA,IAC5C,OAAO,IAAI,SACT,2BACA,SAAS,SACT;AAAA,IACE,yFACJ;AAAA,EACF;AAAA,EAEA,IAAI,eAAe,OAAO,gBAAgB;AAAA,IACxC,MAAM,OAAQ,IAAI,SAA0B,CAAC;AAAA,IAC7C,OAAO,YAAY,IAAI,UAAU,KAAK,MAAM,YAAY,GAAG,CAAC;AAAA,EAC9D;AAAA,EAEA,IAAI,eAAe,OAAO,qBAAqB;AAAA,IAC7C,MAAM,OAAQ,IAAI,SAA0B,CAAC;AAAA,IAC7C,OAAO,YAAY,IAAI,UAAU,KAAK,MAAM,YAAY,GAAG,CAAC;AAAA,EAC9D;AAAA,EAEA,IAAI,eAAe,OAAO,iBAAiB;AAAA,IACzC,MAAM,OAAQ,IAAI,SAA0B,CAAC;AAAA,IAC7C,OAAO,YAAY,IAAI,UAAU,KAAK,MAAM,YAAY,GAAG,CAAC;AAAA,EAC9D;AAAA,EAEA,IAAI,eAAe,OAAO,UAAU;AAAA,IAClC,MAAM,OAAQ,IAAI,SAA0B,CAAC;AAAA,IAC7C,OAAO,YAAY,IAAI,UAAU,GAAG,MAAM,YAAY,GAAG,CAAC;AAAA,EAC5D;AAAA,EAGA,IAAI,eAAe,OAAO;AAAA,IACxB,IACE,IAAI,SAAS,gBACb,IAAI,SAAS,kBACb,IAAI,QAAQ,SAAS,WAAW,GAChC;AAAA,MACA,OAAO,IAAI,SACT,sBACA,SAAS,SACT,+CACF;AAAA,IACF;AAAA,IAEA,OAAO,IAAI,SAAS,IAAI,SAAS,SAAS,OAAO;AAAA,EACnD;AAAA,EAEA,OAAO,IAAI,SAAS,OAAO,GAAG,GAAG,SAAS,OAAO;AAAA;;;AF9DnD,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AAAA;AAYrB,MAAM,WAAW;AAAA,EACd;AAAA,EAER,WAAW,CAAC,QAA0B;AAAA,IACpC,KAAK,SAAS,IAAI,QAAO;AAAA,MACvB,QAAQ,OAAO;AAAA,MACf,SAAS,OAAO,WAAW;AAAA,MAC3B,UAAU,OAAO,WAAW,uBAAuB;AAAA,MACnD,gBAAgB;AAAA,QACd,cAAc,YAAY;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA;AAAA,EAUK,kBAAkB,CAAC,QAAqB,QAA0C;AAAA,IACxF,QAAQ,UAAU,aAAa,OAAO,UAAU,iBAAiB;AAAA,IAEjE,MAAM,SAAkC;AAAA,SACnC;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IAIA,IAAI,SAAS,MAAM,SAAS,GAAG;AAAA,MAC7B,OAAO,QAAQ;AAAA,IACjB;AAAA,IAEA,OAAO;AAAA;AAAA,OASH,eAAc,CAClB,QAC6B;AAAA,IAC7B,IAAI;AAAA,MACF,MAAM,gBAAgB,KAAK,mBAAmB,QAAQ,KAAK;AAAA,MAE3D,MAAM,WAAW,MAAM,KAAK,OAAO,KAAK,YAAY,OAClD,aACF;AAAA,MAEA,OAAO;AAAA,MACP,OAAO,KAAK;AAAA,MACZ,MAAM,aAAa,GAAG;AAAA;AAAA;AAAA,OASpB,qBAAoB,CACxB,QACsC;AAAA,IACtC,IAAI;AAAA,MACF,MAAM,gBAAgB,KAAK,mBAAmB,QAAQ,IAAI;AAAA,MAE1D,OAAO,MAAM,KAAK,OAAO,KAAK,YAAY,OACxC,aACF;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,MAAM,aAAa,GAAG;AAAA;AAAA;AAAA,OAWpB,KAAI,CACR,QAC2D;AAAA,IAC3D,MAAM,cAAc,OAAO,WAAW;AAAA,IAEtC,IAAI,aAAa;AAAA,MACf,OAAO,KAAK,qBAAqB,MAAM;AAAA,IACzC;AAAA,IAEA,OAAO,KAAK,eAAe,MAAM;AAAA;AAAA,MAM/B,GAAG,GAAW;AAAA,IAChB,OAAO,KAAK;AAAA;AAEhB;;;AUxHO,MAAM,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,EAET,WAAW,CAAC,SAA+B;AAAA,IACzC,KAAK,UAAU;AAAA,IAEf,MAAM,kBAAkB,QAAQ,WAAW,oBAAoB,QAAQ,UAAU,EAAE,KAAK;AAAA,IACxF,KAAK,OAAO,IAAI,WAAW;AAAA,MACzB,QAAQ,QAAQ,UAAU;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS,QAAQ;AAAA,IACnB,CAAC;AAAA;AAAA,cAIU,WAAU,CAAC,QAAwC;AAAA,IAC9D,MAAM,OAAO,kBAAkB,MAAM;AAAA,IACrC,OAAO,IAAI,cAAc;AAAA,MACvB,QAAQ,KAAK;AAAA,MACb,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA;AAAA,EAIH,WAAW,CAAC,OAAuB;AAAA,IACjC,MAAM,aAAa,KAAK;AAAA;AAE5B;;;ACNO,MAAM,QAAQ;AAAA,EACX;AAAA,EAER,WAAW,CAAC,QAAuB;AAAA,IACjC,KAAK,SAAS;AAAA;AAAA,OAGV,KAAI,CAAC,SAA2C;AAAA,IACpD,MAAM,UAAuB;AAAA,MAC3B,OAAO,QAAQ,SAAS;AAAA,MACxB,UAAU,QAAQ;AAAA,MAClB,uBAAuB,QAAQ;AAAA,MAC/B,aAAa,QAAQ;AAAA,MACrB,OAAO,QAAQ;AAAA,MACf,QAAQ;AAAA,MACR,MAAM,QAAQ;AAAA,MACd,mBAAmB,QAAQ;AAAA,MAC3B,kBAAkB,QAAQ;AAAA,MAC1B,UAAU,QAAQ,WAAW,EAAE,MAAM,UAAU,IAAI;AAAA,MACnD,iBAAiB,QAAQ;AAAA,IAC3B;AAAA,IAEA,IAAI;AAAA,MAEF,MAAM,WAAW,MAAM,KAAK,OAAO,KAAK,eAAe,OAAO;AAAA,MAC9D,MAAM,SAAS,SAAS,QAAQ;AAAA,MAChC,OAAO;AAAA,QACL,IAAI,SAAS;AAAA,QACb,SAAS,QAAQ,SAAS,WAAW;AAAA,QACrC,kBAAkB,QAAQ,SAAS;AAAA,QACnC,OAAO,SAAS;AAAA,QAChB,OAAO,SAAS;AAAA,QAChB,cAAc,QAAQ,iBAAiB;AAAA,MACzC;AAAA,MACA,OAAO,OAAO;AAAA,MACd,KAAK,OAAO,YAAY,KAAK;AAAA;AAAA;AAAA,SAI1B,UAAU,CAAC,SAAuD;AAAA,IACvE,MAAM,UAAuB;AAAA,MAC3B,OAAO,QAAQ,SAAS;AAAA,MACxB,UAAU,QAAQ;AAAA,MAClB,uBAAuB,QAAQ;AAAA,MAC/B,aAAa,QAAQ;AAAA,MACrB,OAAO,QAAQ;AAAA,MACf,QAAQ;AAAA,MACR,MAAM,QAAQ;AAAA,MACd,mBAAmB,QAAQ;AAAA,MAC3B,kBAAkB,QAAQ;AAAA,MAC1B,UAAU,QAAQ,WAAW,EAAE,MAAM,UAAU,IAAI;AAAA,MACnD,iBAAiB,QAAQ;AAAA,IAC3B;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK,qBAAqB,OAAO;AAAA,MAElE,iBAAiB,SAAS,QAAQ;AAAA,QAEhC,MAAM,SAA0B;AAAA,UAC9B,IAAI,MAAM;AAAA,UACV,QAAQ;AAAA,UACR,SAAS,MAAM;AAAA,UACf,OAAO,MAAM;AAAA,UACb,SAAS,MAAM,QAAQ,IAAI,CAAC,OAAO;AAAA,YACjC,OAAO,EAAE;AAAA,YACT,OAAO,aAAa,EAAE,KAAgC;AAAA,YACtD,eAAe,EAAE;AAAA,UACnB,EAAE;AAAA,UACF,OAAO,kBAAkB,KAA2C;AAAA,QACtE;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,OAAO,OAAO;AAAA,MACd,KAAK,OAAO,YAAY,KAAK;AAAA;AAAA;AAGnC;;;AC1FO,MAAM,UAAU;AAAA,EACb;AAAA,EAER,WAAW,CAAC,QAAuB;AAAA,IACjC,KAAK,SAAS;AAAA;AAAA,OAGV,SAAQ,CAAC,SAA+C;AAAA,IAC5D,MAAM,eAA8B,CAAC;AAAA,IAErC,IAAI,QAAQ,QAAQ;AAAA,MAClB,aAAa,KAAK,EAAE,MAAM,QAAQ,MAAM,QAAQ,OAAO,CAAC;AAAA,IAC1D;AAAA,IAEA,IAAI,QAAQ,OAAO;AAAA,MACjB,aAAa,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,WAAW,EAAE,KAAK,QAAQ,MAAM;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,IAEA,IAAI,QAAQ,OAAO;AAAA,MACjB,aAAa,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,aAAa,EAAE,MAAM,QAAQ,MAAM;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IAEA,IAAI,QAAQ,OAAO;AAAA,MACjB,aAAa,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,WAAW;AAAA,UACT,KAAK,QAAQ;AAAA,aACT,QAAQ,MAAM,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,aACtC,QAAQ,kBAAkB,EAAE,kBAAkB,QAAQ,gBAAgB,IAAI,CAAC;AAAA,QACjF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,WAA0B;AAAA,MAC9B;AAAA,QACE,MAAM;AAAA,QACN,SAAS,aAAa,SAAS,IAAI,eAAgB,QAAQ,UAAU;AAAA,MACvE;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,UAAuB;AAAA,QAC3B,OAAO,QAAQ,SAAS;AAAA,QACxB;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MAEA,MAAM,WAA+B,MAAM,KAAK,OAAO,KAAK,eAAe,OAAO;AAAA,MAClF,MAAM,SAAS,SAAS,QAAQ;AAAA,MAChC,OAAO;AAAA,QACL,IAAI,SAAS;AAAA,QACb,SAAS,QAAQ,SAAS,WAAW;AAAA,QACrC,OAAO,SAAS;AAAA,QAChB,OAAO,SAAS;AAAA,MAClB;AAAA,MACA,OAAO,OAAO;AAAA,MACd,KAAK,OAAO,YAAY,KAAK;AAAA;AAAA;AAGnC;;;ACrEO,MAAM,OAAO;AAAA,EACV;AAAA,EAER,WAAW,CAAC,QAAuB;AAAA,IACjC,KAAK,SAAS;AAAA;AAAA,OAGV,WAAU,CAAC,SAAyC;AAAA,IACxD,MAAM,WAA0B;AAAA,MAC9B;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,EAAE,MAAM,eAAwB,aAAa,EAAE,MAAM,QAAQ,KAAK,EAAE;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,UAAuB;AAAA,QAC3B,OAAO,QAAQ,SAAS;AAAA,QACxB;AAAA,QACA,QAAQ;AAAA,QACR,aAAa,EAAE,UAAU,QAAQ,YAAY,OAAO;AAAA,MACtD;AAAA,MAEA,MAAM,WAA+B,MAAM,KAAK,OAAO,KAAK,eAAe,OAAO;AAAA,MAClF,MAAM,SAAS,SAAS,QAAQ;AAAA,MAChC,OAAO;AAAA,QACL,IAAI,SAAS;AAAA,QACb,MAAM,QAAQ,SAAS,WAAW;AAAA,QAClC,OAAO,SAAS;AAAA,QAChB,OAAO,SAAS;AAAA,MAClB;AAAA,MACA,OAAO,OAAO;AAAA,MACd,KAAK,OAAO,YAAY,KAAK;AAAA;AAAA;AAGnC;;;AChBO,MAAM,OAAO;AAAA,EACV;AAAA,EAER,WAAW,CAAC,QAAuB;AAAA,IACjC,KAAK,SAAS;AAAA;AAAA,OAGV,WAAU,CAAC,SAAmD;AAAA,IAClE,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,QAAQ,0BAA0B;AAAA,QAC5E,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAiB,UAAU,KAAK,OAAO,QAAQ;AAAA,UAC/C,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO,QAAQ,SAAS;AAAA,UACxB,MAAM,QAAQ;AAAA,UACd,OAAO,QAAQ;AAAA,UACf,OAAO,QAAQ;AAAA,UACf,QAAQ,QAAQ,UAAU;AAAA,QAC5B,CAAC;AAAA,MACH,CAAC;AAAA,MAED,IAAI,CAAC,SAAS,IAAI;AAAA,QAChB,MAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,QACnD,MAAM,aAAa,EAAE,QAAQ,SAAS,QAAQ,OAAO,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA,MAChF;AAAA,MAEA,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC;AAAA,MACvD,OAAO;AAAA,QACL,IAAI,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,QAC5C,OAAO;AAAA,QACP,OAAO,QAAQ,SAAS;AAAA,MAC1B;AAAA,MACA,OAAO,OAAO;AAAA,MACd,MAAM,aAAa,KAAK;AAAA;AAAA;AAAA,OAItB,MAAK,CAAC,SAA8C;AAAA,IACxD,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,QAAQ,qBAAqB;AAAA,QACvE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAiB,UAAU,KAAK,OAAO,QAAQ;AAAA,UAC/C,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO,QAAQ,SAAS;AAAA,UACxB,QAAQ,QAAQ;AAAA,UAChB,MAAM,QAAQ;AAAA,UACd,QAAQ,QAAQ,UAAU;AAAA,QAC5B,CAAC;AAAA,MACH,CAAC;AAAA,MAED,IAAI,CAAC,SAAS,IAAI;AAAA,QAChB,MAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,QACnD,MAAM,aAAa,EAAE,QAAQ,SAAS,QAAQ,OAAO,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA,MAChF;AAAA,MAEA,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC;AAAA,MACvD,OAAO;AAAA,QACL,IAAI,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,QAC5C,OAAO;AAAA,QACP,OAAO,QAAQ,SAAS;AAAA,MAC1B;AAAA,MACA,OAAO,OAAO;AAAA,MACd,MAAM,aAAa,KAAK;AAAA;AAAA;AAAA,OAItB,OAAM,CAAC,SAA+C;AAAA,IAC1D,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,QAAQ,sBAAsB;AAAA,QACxE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAiB,UAAU,KAAK,OAAO,QAAQ;AAAA,UAC/C,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO,QAAQ,SAAS;AAAA,UACxB,QAAQ,QAAQ;AAAA,UAChB,MAAM,QAAQ;AAAA,UACd,uBAAuB,QAAQ,gBAAgB;AAAA,UAC/C,QAAQ,QAAQ,UAAU;AAAA,QAC5B,CAAC;AAAA,MACH,CAAC;AAAA,MAED,IAAI,CAAC,SAAS,IAAI;AAAA,QAChB,MAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,QACnD,MAAM,aAAa,EAAE,QAAQ,SAAS,QAAQ,OAAO,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA,MAChF;AAAA,MAEA,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC;AAAA,MACvD,OAAO;AAAA,QACL,IAAI,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,QAC5C,OAAO;AAAA,QACP,OAAO,QAAQ,SAAS;AAAA,MAC1B;AAAA,MACA,OAAO,OAAO;AAAA,MACd,MAAM,aAAa,KAAK;AAAA;AAAA;AAAA,OAItB,OAAM,GAA6B;AAAA,IACvC,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,QAAQ,sBAAsB;AAAA,QACxE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAiB,UAAU,KAAK,OAAO,QAAQ;AAAA,QACjD;AAAA,MACF,CAAC;AAAA,MAED,IAAI,CAAC,SAAS,IAAI;AAAA,QAChB,MAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,QACnD,MAAM,aAAa,EAAE,QAAQ,SAAS,QAAQ,OAAO,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA,MAChF;AAAA,MAEA,MAAM,OAAO,MAAM,SAAS,KAAK;AAAA,MACjC,OAAO;AAAA,QACL,QAAS,KAAK,UAAU,KAAK,QAAQ,CAAC;AAAA,MACxC;AAAA,MACA,OAAO,OAAO;AAAA,MACd,MAAM,aAAa,KAAK;AAAA;AAAA;AAG9B;;;ACjJO,MAAM,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,WAAW,CAAC,SAAyB;AAAA,IACnC,KAAK,SAAS,IAAI,cAAc,OAAO;AAAA,IACvC,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM;AAAA,IACnC,KAAK,SAAS,IAAI,UAAU,KAAK,MAAM;AAAA,IACvC,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM;AAAA,IACjC,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM;AAAA;AAAA,cAItB,WAAU,CAAC,QAAkC;AAAA,IACxD,MAAM,SAAS,MAAM,cAAc,WAAW,MAAM;AAAA,IACpD,OAAO,IAAI,QAAQ;AAAA,MACjB,QAAQ,OAAO,QAAQ;AAAA,MACvB,SAAS,OAAO,QAAQ;AAAA,MACxB,SAAS,OAAO,QAAQ;AAAA,IAC1B,CAAC;AAAA;AAEL;",
|
|
23
|
+
"debugId": "F666A5B285CB002564756E2164756E21",
|
|
24
24
|
"names": []
|
|
25
25
|
}
|