mimo-cli 0.1.5 → 0.1.7

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/README.md CHANGED
@@ -1,7 +1,13 @@
1
1
  <p align="center">
2
- <img src="https://img.shields.io/npm/v/mimo-cli.svg" alt="npm version">
3
- <img src="https://img.shields.io/github/license/ljj6600/MIMO-CLI" alt="License">
4
- <img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen" alt="Node >= 18">
2
+ <a href="https://www.npmjs.com/package/mimo-cli">
3
+ <img src="https://img.shields.io/npm/v/mimo-cli.svg" alt="npm version">
4
+ </a>
5
+ <a href="LICENSE">
6
+ <img src="https://img.shields.io/github/license/ljj6600/MIMO-CLI" alt="License">
7
+ </a>
8
+ <a href="https://nodejs.org/">
9
+ <img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen" alt="Node >= 18">
10
+ </a>
5
11
  </p>
6
12
 
7
13
  <h1 align="center">MiMo CLI</h1>
@@ -21,36 +27,73 @@
21
27
 
22
28
  ---
23
29
 
24
- ## 安装
30
+ ## 安装和配置 CLI
31
+
32
+ ### 通过 Agent 安装
33
+
34
+ 请将以下提示词复制给你的 AI Agent(OpenClaw、Claude Code、Cursor、MaxClaw、AutoClaw、KimiClaw、TRAE、OpenCode 等),它会引导你完成安装、登录与 SKILL 接入(请将 `sk-xxxxx` 替换为你的实际密钥):
35
+
36
+ ```
37
+ 请帮我接入 MiMo CLI(`https://github.com/ljj6600/MIMO-CLI`),按以下三步完成安装与配置:
38
+
39
+ 1. 全局安装 CLI:执行 `npm install -g mimo-cli`,完成后用 `mimo --version` 验证
40
+ 2. 登录并配置 API Key:执行 `mimo auth login --api-key sk-xxxxx`
41
+ 3. 安装官方 SKILL:执行 `npx skills add ljj6600/MIMO-CLI -y -g`
42
+ ```
43
+
44
+ ### 手动安装
45
+
46
+ #### 1. 安装 MiMo-CLI
47
+
48
+ 在终端运行以下命令完成全局安装:
25
49
 
26
50
  ```bash
27
- # 全局安装,在任意终端使用
28
51
  npm install -g mimo-cli
29
-
30
- # 安装后即可使用
31
- mimo --version
32
52
  ```
33
53
 
34
54
  > 需要 [Node.js](https://nodejs.org/) 18+。
35
- >
36
- > 需要 MiMo API Key — [按量计费](https://api.xiaomimimo.com) 或 [TokenPlan](https://token-plan-cn.xiaomimimo.com)。
37
55
 
38
- ## 快速开始
56
+ #### 2. 登录 API Key
39
57
 
40
- ### 认证
58
+ 使用 API Key 完成鉴权(请将 `sk-xxxxx` 替换为你的 Key):
41
59
 
42
60
  ```bash
43
- # 交互式输入
44
- mimo auth login
61
+ mimo auth login --api-key sk-xxxxx
62
+ ```
63
+
64
+ 支持两种 Key 类型,前往 [MiMo 平台](https://platform.xiaomimimo.com) 获取:
65
+ - **TokenPlan Key**(`tp-` 前缀)→ [申请地址](https://platform.xiaomimimo.com/console/plan-manage),自动配置 `https://token-plan-cn.xiaomimimo.com/v1`
66
+ - **按量计费 Key**(`sk-` 前缀)→ [申请地址](https://platform.xiaomimimo.com/console/api-keys),自动配置 `https://api.xiaomimimo.com/v1`
45
67
 
46
- # 或直接传入(自动识别 Key 类型)
47
- mimo auth login --api-key sk-xxxxx # 按量计费 Key
48
- mimo auth login --api-key tp-xxxxx # TokenPlan Key
68
+ 最新版 mimo-cli 会根据 Key 前缀自动检测并配置对应的 Base URL。
69
+
70
+ #### 3. 安装 SKILL(可选,推荐 Agent 用户)
71
+
72
+ 若你要在 Claude Code、OpenClaw、Cursor 等 AI Agent 中调用 mimo,建议加装官方 SKILL.md,Agent 调用时决策更准、无需临时翻 `--help`:
73
+
74
+ ```bash
75
+ npx skills add ljj6600/MIMO-CLI -y -g
49
76
  ```
50
77
 
51
- 支持两种 Key 类型:
52
- - **按量计费 Key**(`sk-` 前缀)→ 自动配置 `https://api.xiaomimimo.com/v1`
53
- - **TokenPlan Key**(`tp-` 前缀)→ 自动配置 `https://token-plan-cn.xiaomimimo.com/v1`
78
+ SKILL 会自动 symlink 到 `~/.claude/skills/`、`~/.openclaw/skills/` 等目录,各 Agent 下次启动即可识别。仅在终端直接使用 mimo 命令的用户可以跳过此步。
79
+
80
+ ## 新用户福利
81
+
82
+ 如果您是 **3 天内** 注册 Xiaomi MiMo 开放平台的新用户,可享受专属福利:
83
+
84
+ > 🎁 通过邀请码注册,即得 **¥10 API 体验金**(40 天有效)
85
+
86
+ **三步快速领取:**
87
+
88
+ 1. 点击注册链接:[https://platform.xiaomimimo.com?ref=6MEWY6](https://platform.xiaomimimo.com?ref=6MEWY6)
89
+ 2. 完成账号注册
90
+ 3. 登录后,在控制台左下方「邀请码」入口处填入:`6MEWY6`
91
+
92
+ 体验金可用于 MiMo 全部模型能力,包括对话、多模态理解、语音识别与合成等。
93
+
94
+ ---
95
+
96
+ ## 快速开始
54
97
 
55
98
  ### 开箱即用
56
99
 
@@ -90,23 +133,6 @@ mimo language en
90
133
  mimo language zh
91
134
  ```
92
135
 
93
- ## Agent 集成
94
-
95
- **在 Cursor、Claude Code、OpenClaw 等 AI Agent 中**,Agent 天然会调用终端命令。只要全局安装了 `mimo-cli`,你的 Agent 就拥有了 MiMo 的全部能力 —— 无需写一行代码,无需接入任何 SDK。
96
-
97
- ```bash
98
- # 告诉你的 Agent:
99
- # "你需要在终端中调用 mimo 命令来完成任务"
100
- #
101
- # 它会自动学会使用:
102
- mimo chat -m "..." --thinking # 深度推理
103
- mimo vision --image photo.jpg -p "..." # 看图理解
104
- mimo asr recording.wav # 语音转文字
105
- mimo tts synthesize -t "..." --out out.wav # 生成语音
106
- ```
107
-
108
- **Agent 天然理解** `mimo chat`、`mimo vision`、`mimo asr` 等命令的语义,可以自主组合这些能力完成复杂的多步任务。
109
-
110
136
  ## 功能特性
111
137
 
112
138
  - **对话补全** — 单轮/多轮对话,支持思维链、联网搜索(含地理位置)
@@ -315,8 +341,6 @@ API 客户端层 (Client) ← OpenAI 兼容协议,一键切换
315
341
  MiMo AI Platform API ← 小米大模型能力
316
342
  ```
317
343
 
318
- 详见项目仓库中的 `CODE_WIKI.md`(本地开发目录)。
319
-
320
344
  ## License
321
345
 
322
346
  [MIT](LICENSE)
package/dist/mimo.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{createRequire as U5}from"node:module";var N5=Object.create;var{getPrototypeOf:z5,defineProperty:A4,getOwnPropertyNames:V5}=Object;var B5=Object.prototype.hasOwnProperty;function K5($){return this[$]}var H5,T5,f2=($,Y,Z)=>{var w=$!=null&&typeof $==="object";if(w){var X=Y?H5??=new WeakMap:T5??=new WeakMap,W=X.get($);if(W)return W}Z=$!=null?N5(z5($)):{};let G=Y||!$||!$.__esModule?A4(Z,"default",{value:$,enumerable:!0}):Z;for(let Q of V5($))if(!B5.call(G,Q))A4(G,Q,{get:K5.bind($,Q),enumerable:!0});if(w)X.set($,G);return G};var f4=($,Y)=>()=>(Y||$((Y={exports:{}}).exports,Y),Y.exports);var j4=U5(import.meta.url);var R3=f4((Lw,n4)=>{var S3={to($,Y){if(!Y)return`\x1B[${$+1}G`;return`\x1B[${Y+1};${$+1}H`},move($,Y){let Z="";if($<0)Z+=`\x1B[${-$}D`;else if($>0)Z+=`\x1B[${$}C`;if(Y<0)Z+=`\x1B[${-Y}A`;else if(Y>0)Z+=`\x1B[${Y}B`;return Z},up:($=1)=>`\x1B[${$}A`,down:($=1)=>`\x1B[${$}B`,forward:($=1)=>`\x1B[${$}C`,backward:($=1)=>`\x1B[${$}D`,nextLine:($=1)=>"\x1B[E".repeat($),prevLine:($=1)=>"\x1B[F".repeat($),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},S5={up:($=1)=>"\x1B[S".repeat($),down:($=1)=>"\x1B[T".repeat($)},R5={screen:"\x1B[2J",up:($=1)=>"\x1B[1J".repeat($),down:($=1)=>"\x1B[J".repeat($),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines($){let Y="";for(let Z=0;Z<$;Z++)Y+=this.line+(Z<$-1?S3.up():"");if($)Y+=S3.left;return Y}};n4.exports={cursor:S3,scroll:S5,erase:R5,beep:"\x07"}});var _3=f4((Fw,P3)=>{var D2=process||{},a4=D2.argv||[],I2=D2.env||{},P5=!(!!I2.NO_COLOR||a4.includes("--no-color"))&&(!!I2.FORCE_COLOR||a4.includes("--color")||D2.platform==="win32"||(D2.stdout||{}).isTTY&&I2.TERM!=="dumb"||!!I2.CI),_5=($,Y,Z=$)=>(w)=>{let X=""+w,W=X.indexOf(Y,$.length);return~W?$+A5(X,Y,Z,W)+Y:$+X+Y},A5=($,Y,Z,w)=>{let X="",W=0;do X+=$.substring(W,w)+Z,W=w+Y.length,w=$.indexOf(Y,W);while(~w);return X+$.substring(W)},t4=($=P5)=>{let Y=$?_5:()=>String;return{isColorSupported:$,reset:Y("\x1B[0m","\x1B[0m"),bold:Y("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:Y("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:Y("\x1B[3m","\x1B[23m"),underline:Y("\x1B[4m","\x1B[24m"),inverse:Y("\x1B[7m","\x1B[27m"),hidden:Y("\x1B[8m","\x1B[28m"),strikethrough:Y("\x1B[9m","\x1B[29m"),black:Y("\x1B[30m","\x1B[39m"),red:Y("\x1B[31m","\x1B[39m"),green:Y("\x1B[32m","\x1B[39m"),yellow:Y("\x1B[33m","\x1B[39m"),blue:Y("\x1B[34m","\x1B[39m"),magenta:Y("\x1B[35m","\x1B[39m"),cyan:Y("\x1B[36m","\x1B[39m"),white:Y("\x1B[37m","\x1B[39m"),gray:Y("\x1B[90m","\x1B[39m"),bgBlack:Y("\x1B[40m","\x1B[49m"),bgRed:Y("\x1B[41m","\x1B[49m"),bgGreen:Y("\x1B[42m","\x1B[49m"),bgYellow:Y("\x1B[43m","\x1B[49m"),bgBlue:Y("\x1B[44m","\x1B[49m"),bgMagenta:Y("\x1B[45m","\x1B[49m"),bgCyan:Y("\x1B[46m","\x1B[49m"),bgWhite:Y("\x1B[47m","\x1B[49m"),blackBright:Y("\x1B[90m","\x1B[39m"),redBright:Y("\x1B[91m","\x1B[39m"),greenBright:Y("\x1B[92m","\x1B[39m"),yellowBright:Y("\x1B[93m","\x1B[39m"),blueBright:Y("\x1B[94m","\x1B[39m"),magentaBright:Y("\x1B[95m","\x1B[39m"),cyanBright:Y("\x1B[96m","\x1B[39m"),whiteBright:Y("\x1B[97m","\x1B[39m"),bgBlackBright:Y("\x1B[100m","\x1B[49m"),bgRedBright:Y("\x1B[101m","\x1B[49m"),bgGreenBright:Y("\x1B[102m","\x1B[49m"),bgYellowBright:Y("\x1B[103m","\x1B[49m"),bgBlueBright:Y("\x1B[104m","\x1B[49m"),bgMagentaBright:Y("\x1B[105m","\x1B[49m"),bgCyanBright:Y("\x1B[106m","\x1B[49m"),bgWhiteBright:Y("\x1B[107m","\x1B[49m")}};P3.exports=t4();P3.exports.createColors=t4});function H1($){return $.replace(/-([a-z])/g,(Y,Z)=>Z.toUpperCase())}function b4($){let Y=$.flag.match(/^--([a-z][a-z0-9-]*)/i);return Y?H1(Y[1]):null}function M5($){if($.type==="number"||$.type==="array")return!1;return!$.flag.includes("<")&&!$.flag.includes("[")}function v4($){let Y=new Map;for(let Z of $){let w=Z.flag.split(",").map((X)=>X.trim());if(w.length>=2){let X=w[0].trim(),W=w[1].trim(),G=X.match(/^(-[a-zA-Z])$/),Q=W.match(/^(--[a-z][a-z0-9-]*)/i);if(G&&Q)Y.set(G[1],Q[1])}}return Y}function y4($){let Y=new Set,Z=new Set,w=new Set;for(let X of $){let W=b4(X);if(!W)continue;if(M5(X))Y.add(W);else if(X.type==="number")Z.add(W);else if(X.type==="array")w.add(W)}return{booleans:Y,numbers:Z,arrays:w}}function I4($,Y=[]){let Z=y4(Y),w=v4(Y),X=[],W=0;while(W<$.length){let G=$[W];if(G==="--")break;if(G.startsWith("--")){let Q=G.indexOf("="),z=Q!==-1?G.slice(2,Q):G.slice(2),H=H1(z);if(!Z.booleans.has(H)&&Q===-1)W+=2;else W+=1;continue}if(G.startsWith("-")&&G.length>=2&&G[1]!=="-"){let Q=w.get(G);if(Q){let z=H1(Q.slice(2));if(!Z.booleans.has(z))W+=2;else W+=1}else W+=1;continue}X.push(G),W++}return X}function D4($,Y){let Z=y4(Y),w=v4(Y),X={};for(let G of Y)if(G.default!==void 0){let Q=b4(G);if(Q)X[Q]=G.default}let W=0;while(W<$.length){let G=$[W];if(G==="--help"||G==="-h"){X.help=!0,W++;continue}if(G==="--")break;if(G.startsWith("--")){let Q=G.indexOf("="),z,H;if(Q!==-1)z=G.slice(2,Q),H=G.slice(Q+1);else z=G.slice(2);let T=H1(z);if(z.startsWith("no-")){let K=H1(z.slice(3));if(Z.booleans.has(K)){X[K]=!1,X[`no${K.charAt(0).toUpperCase()}${K.slice(1)}`]=!0,W++;continue}}if(Z.booleans.has(T)){X[T]=!0,W++;continue}if(H===void 0)W++,H=$[W];if(H===void 0)throw Error(`Flag --${z} requires a value.`);if(Z.arrays.has(T)){let K=X[T];if(Array.isArray(K))K.push(H);else X[T]=[H]}else if(Z.numbers.has(T)){let K=Number(H);if(H.trim()===""||!Number.isFinite(K))throw Error(`Flag --${z} requires a numeric value, got "${H}".`);X[T]=K}else X[T]=H;W++;continue}if(G.startsWith("-")&&G.length>=2&&G[1]!=="-"){let Q=w.get(G);if(Q){let z=H1(Q.slice(2));if(Z.booleans.has(z)){X[z]=!0,W++;continue}W++;let H=$[W];if(H===void 0)throw Error(`Flag ${G} requires a value.`);if(Z.arrays.has(z)){let T=X[z];if(Array.isArray(T))T.push(H);else X[z]=[H]}else if(Z.numbers.has(z)){let T=Number(H);if(H.trim()===""||!Number.isFinite(T))throw Error(`Flag ${G} requires a numeric value, got "${H}".`);X[z]=T}else X[z]=H}W++;continue}W++}return X}function j($){return{name:$.name,description:$.description,usage:$.usage,options:$.options,examples:$.examples,apiDocs:$.apiDocs,execute:$.run}}var T1=[{flag:"--api-key <value>",description:"flag.apiKey"},{flag:"--base-url <value>",description:"flag.baseUrl"},{flag:"--output <value>",description:"flag.output",default:"text"},{flag:"--timeout <seconds>",description:"flag.timeout",default:300,type:"number"},{flag:"--quiet",description:"flag.quiet"},{flag:"--verbose",description:"flag.verbose"},{flag:"--no-color",description:"flag.noColor"},{flag:"--dry-run",description:"flag.dryRun"},{flag:"--non-interactive",description:"flag.nonInteractive"},{flag:"--help",description:"flag.help"},{flag:"--version",description:"flag.version"}];var v$="zh";function h4(){return v$}function g4($){if($!=="zh"&&$!=="en")v$="zh";else v$=$}function j2($){if(!$){if((process.env.LANG||process.env.LC_ALL||process.env.LC_MESSAGES||"").startsWith("zh"))v$="zh";else v$="zh";return}if($==="en")v$="en";else v$="zh"}var x5={"main.usage":{zh:"用法:mimo <资源> <命令> [参数]",en:"Usage: mimo <resource> <command> [flags]"},"main.resources":{zh:"可用命令:",en:"Resources:"},"main.globalFlags":{zh:"全局参数:",en:"Global Flags:"},"main.gettingHelp":{zh:"获取帮助:",en:"Getting Help:"},"main.helpHint1":{zh:"在任何命令后添加 --help 查看完整选项、默认值和示例。",en:"Add --help after any command to see its full list of options, defaults,"},"main.helpHint2":{zh:"例如:",en:"and usage examples. For example:"},"main.notLoggedIn":{zh:" 尚未登录。",en:" Not logged in."},"main.loginHint1":{zh:" mimo auth login 使用 API Key 登录",en:" mimo auth login Log in with an API key"},"main.loginHint2":{zh:" mimo auth login --api-key 直接保存 API Key",en:" mimo auth login --api-key Save an API key directly"},"main.interrupted":{zh:`
2
+ import{createRequire as U5}from"node:module";var N5=Object.create;var{getPrototypeOf:z5,defineProperty:A4,getOwnPropertyNames:V5}=Object;var B5=Object.prototype.hasOwnProperty;function K5($){return this[$]}var H5,T5,f2=($,Y,Z)=>{var w=$!=null&&typeof $==="object";if(w){var X=Y?H5??=new WeakMap:T5??=new WeakMap,W=X.get($);if(W)return W}Z=$!=null?N5(z5($)):{};let G=Y||!$||!$.__esModule?A4(Z,"default",{value:$,enumerable:!0}):Z;for(let Q of V5($))if(!B5.call(G,Q))A4(G,Q,{get:K5.bind($,Q),enumerable:!0});if(w)X.set($,G);return G};var f4=($,Y)=>()=>(Y||$((Y={exports:{}}).exports,Y),Y.exports);var j4=U5(import.meta.url);var R3=f4((Lw,n4)=>{var S3={to($,Y){if(!Y)return`\x1B[${$+1}G`;return`\x1B[${Y+1};${$+1}H`},move($,Y){let Z="";if($<0)Z+=`\x1B[${-$}D`;else if($>0)Z+=`\x1B[${$}C`;if(Y<0)Z+=`\x1B[${-Y}A`;else if(Y>0)Z+=`\x1B[${Y}B`;return Z},up:($=1)=>`\x1B[${$}A`,down:($=1)=>`\x1B[${$}B`,forward:($=1)=>`\x1B[${$}C`,backward:($=1)=>`\x1B[${$}D`,nextLine:($=1)=>"\x1B[E".repeat($),prevLine:($=1)=>"\x1B[F".repeat($),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},S5={up:($=1)=>"\x1B[S".repeat($),down:($=1)=>"\x1B[T".repeat($)},R5={screen:"\x1B[2J",up:($=1)=>"\x1B[1J".repeat($),down:($=1)=>"\x1B[J".repeat($),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines($){let Y="";for(let Z=0;Z<$;Z++)Y+=this.line+(Z<$-1?S3.up():"");if($)Y+=S3.left;return Y}};n4.exports={cursor:S3,scroll:S5,erase:R5,beep:"\x07"}});var _3=f4((Fw,P3)=>{var D2=process||{},a4=D2.argv||[],I2=D2.env||{},P5=!(!!I2.NO_COLOR||a4.includes("--no-color"))&&(!!I2.FORCE_COLOR||a4.includes("--color")||D2.platform==="win32"||(D2.stdout||{}).isTTY&&I2.TERM!=="dumb"||!!I2.CI),_5=($,Y,Z=$)=>(w)=>{let X=""+w,W=X.indexOf(Y,$.length);return~W?$+A5(X,Y,Z,W)+Y:$+X+Y},A5=($,Y,Z,w)=>{let X="",W=0;do X+=$.substring(W,w)+Z,W=w+Y.length,w=$.indexOf(Y,W);while(~w);return X+$.substring(W)},t4=($=P5)=>{let Y=$?_5:()=>String;return{isColorSupported:$,reset:Y("\x1B[0m","\x1B[0m"),bold:Y("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:Y("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:Y("\x1B[3m","\x1B[23m"),underline:Y("\x1B[4m","\x1B[24m"),inverse:Y("\x1B[7m","\x1B[27m"),hidden:Y("\x1B[8m","\x1B[28m"),strikethrough:Y("\x1B[9m","\x1B[29m"),black:Y("\x1B[30m","\x1B[39m"),red:Y("\x1B[31m","\x1B[39m"),green:Y("\x1B[32m","\x1B[39m"),yellow:Y("\x1B[33m","\x1B[39m"),blue:Y("\x1B[34m","\x1B[39m"),magenta:Y("\x1B[35m","\x1B[39m"),cyan:Y("\x1B[36m","\x1B[39m"),white:Y("\x1B[37m","\x1B[39m"),gray:Y("\x1B[90m","\x1B[39m"),bgBlack:Y("\x1B[40m","\x1B[49m"),bgRed:Y("\x1B[41m","\x1B[49m"),bgGreen:Y("\x1B[42m","\x1B[49m"),bgYellow:Y("\x1B[43m","\x1B[49m"),bgBlue:Y("\x1B[44m","\x1B[49m"),bgMagenta:Y("\x1B[45m","\x1B[49m"),bgCyan:Y("\x1B[46m","\x1B[49m"),bgWhite:Y("\x1B[47m","\x1B[49m"),blackBright:Y("\x1B[90m","\x1B[39m"),redBright:Y("\x1B[91m","\x1B[39m"),greenBright:Y("\x1B[92m","\x1B[39m"),yellowBright:Y("\x1B[93m","\x1B[39m"),blueBright:Y("\x1B[94m","\x1B[39m"),magentaBright:Y("\x1B[95m","\x1B[39m"),cyanBright:Y("\x1B[96m","\x1B[39m"),whiteBright:Y("\x1B[97m","\x1B[39m"),bgBlackBright:Y("\x1B[100m","\x1B[49m"),bgRedBright:Y("\x1B[101m","\x1B[49m"),bgGreenBright:Y("\x1B[102m","\x1B[49m"),bgYellowBright:Y("\x1B[103m","\x1B[49m"),bgBlueBright:Y("\x1B[104m","\x1B[49m"),bgMagentaBright:Y("\x1B[105m","\x1B[49m"),bgCyanBright:Y("\x1B[106m","\x1B[49m"),bgWhiteBright:Y("\x1B[107m","\x1B[49m")}};P3.exports=t4();P3.exports.createColors=t4});function H1($){return $.replace(/-([a-z])/g,(Y,Z)=>Z.toUpperCase())}function b4($){let Y=$.flag.match(/^--([a-z][a-z0-9-]*)/i);return Y?H1(Y[1]):null}function M5($){if($.type==="number"||$.type==="array")return!1;return!$.flag.includes("<")&&!$.flag.includes("[")}function v4($){let Y=new Map;for(let Z of $){let w=Z.flag.split(",").map((X)=>X.trim());if(w.length>=2){let X=w[0].trim(),W=w[1].trim(),G=X.match(/^(-[a-zA-Z])$/),Q=W.match(/^(--[a-z][a-z0-9-]*)/i);if(G&&Q)Y.set(G[1],Q[1])}}return Y}function y4($){let Y=new Set,Z=new Set,w=new Set;for(let X of $){let W=b4(X);if(!W)continue;if(M5(X))Y.add(W);else if(X.type==="number")Z.add(W);else if(X.type==="array")w.add(W)}return{booleans:Y,numbers:Z,arrays:w}}function I4($,Y=[]){let Z=y4(Y),w=v4(Y),X=[],W=0;while(W<$.length){let G=$[W];if(G==="--")break;if(G.startsWith("--")){let Q=G.indexOf("="),z=Q!==-1?G.slice(2,Q):G.slice(2),H=H1(z);if(!Z.booleans.has(H)&&Q===-1)W+=2;else W+=1;continue}if(G.startsWith("-")&&G.length>=2&&G[1]!=="-"){let Q=w.get(G);if(Q){let z=H1(Q.slice(2));if(!Z.booleans.has(z))W+=2;else W+=1}else W+=1;continue}X.push(G),W++}return X}function D4($,Y){let Z=y4(Y),w=v4(Y),X={};for(let G of Y)if(G.default!==void 0){let Q=b4(G);if(Q)X[Q]=G.default}let W=0;while(W<$.length){let G=$[W];if(G==="--help"||G==="-h"){X.help=!0,W++;continue}if(G==="--")break;if(G.startsWith("--")){let Q=G.indexOf("="),z,H;if(Q!==-1)z=G.slice(2,Q),H=G.slice(Q+1);else z=G.slice(2);let T=H1(z);if(z.startsWith("no-")){let K=H1(z.slice(3));if(Z.booleans.has(K)){X[K]=!1,X[`no${K.charAt(0).toUpperCase()}${K.slice(1)}`]=!0,W++;continue}}if(Z.booleans.has(T)){X[T]=!0,W++;continue}if(H===void 0)W++,H=$[W];if(H===void 0)throw Error(`Flag --${z} requires a value.`);if(Z.arrays.has(T)){let K=X[T];if(Array.isArray(K))K.push(H);else X[T]=[H]}else if(Z.numbers.has(T)){let K=Number(H);if(H.trim()===""||!Number.isFinite(K))throw Error(`Flag --${z} requires a numeric value, got "${H}".`);X[T]=K}else X[T]=H;W++;continue}if(G.startsWith("-")&&G.length>=2&&G[1]!=="-"){let Q=w.get(G);if(Q){let z=H1(Q.slice(2));if(Z.booleans.has(z)){X[z]=!0,W++;continue}W++;let H=$[W];if(H===void 0)throw Error(`Flag ${G} requires a value.`);if(Z.arrays.has(z)){let T=X[z];if(Array.isArray(T))T.push(H);else X[z]=[H]}else if(Z.numbers.has(z)){let T=Number(H);if(H.trim()===""||!Number.isFinite(T))throw Error(`Flag ${G} requires a numeric value, got "${H}".`);X[z]=T}else X[z]=H}W++;continue}W++}return X}function j($){return{name:$.name,description:$.description,usage:$.usage,options:$.options,examples:$.examples,apiDocs:$.apiDocs,execute:$.run}}var T1=[{flag:"--api-key <value>",description:"flag.apiKey"},{flag:"--base-url <value>",description:"flag.baseUrl"},{flag:"--output <value>",description:"flag.output",default:"text"},{flag:"--timeout <seconds>",description:"flag.timeout",default:300,type:"number"},{flag:"--quiet",description:"flag.quiet"},{flag:"--verbose",description:"flag.verbose"},{flag:"--no-color",description:"flag.noColor"},{flag:"--dry-run",description:"flag.dryRun"},{flag:"--non-interactive",description:"flag.nonInteractive"},{flag:"--help",description:"flag.help"},{flag:"--version",description:"flag.version"}];var v$="zh";function h4(){return v$}function g4($){if($!=="zh"&&$!=="en")v$="zh";else v$=$}function j2($){if(!$){if((process.env.LANG||process.env.LC_ALL||process.env.LC_MESSAGES||"").startsWith("zh"))v$="zh";else v$="zh";return}if($==="en")v$="en";else v$="zh"}var x5={"main.usage":{zh:"用法:mimo <资源> <命令> [参数]",en:"Usage: mimo <resource> <command> [flags]"},"main.resources":{zh:"可用命令:",en:"Resources:"},"main.globalFlags":{zh:"全局参数:",en:"Global Flags:"},"main.gettingHelp":{zh:"获取帮助:",en:"Getting Help:"},"main.helpHint1":{zh:"在任何命令后添加 --help 查看完整选项、默认值和示例。",en:"Add --help after any command to see its full list of options, defaults,"},"main.helpHint2":{zh:"例如:",en:"and usage examples. For example:"},"main.notLoggedIn":{zh:" 尚未配置 API Key。",en:" No API key configured."},"main.loginHint1":{zh:" mimo auth login 交互式输入 API Key",en:" mimo auth login Enter an API key interactively"},"main.loginHint2":{zh:" mimo auth login --api-key 直接保存 API Key",en:" mimo auth login --api-key Save an API key directly"},"main.interrupted":{zh:`
3
3
  已中断,退出。`,en:`
4
4
  Interrupted. Exiting.`},"main.fatalArgv":{zh:`致命错误:无法读取进程参数。
5
5
  `,en:`Fatal: failed to read process arguments.
@@ -15,7 +15,7 @@ Check: HTTPS_PROXY / HTTP_PROXY env vars, or mimo config show for configured pro
15
15
  重新登录:mimo auth login`,en:`Check your API Key: mimo auth status
16
16
  Re-authenticate: mimo auth login`},"api.402":{zh:"余额不足:",en:"Payment required: "},"api.402Hint":{zh:"账户余额不足,请充值。",en:"Insufficient balance. Please top up your account."},"api.403":{zh:"访问被拒绝(HTTP 403)。",en:"Access denied (HTTP 403)."},"api.403Hint":{zh:`您的 API Key 可能无权访问此资源,或 Key 受限。
17
17
  请检查 API Key 权限。`,en:`Your API Key may not have access to this resource, or the key is restricted.
18
- Check your API Key permissions.`},"api.404":{zh:"未找到:",en:"Not found: "},"api.404Hint":{zh:"请求的模型或功能可能不受支持,请检查模型名称和接口地址。",en:"The requested model or feature may not be supported. Check the model name and endpoint."},"api.421":{zh:"内容被过滤:",en:"Content filtered: "},"api.421Hint":{zh:"您的输入被内容安全过滤器标记,请修改后重试。",en:"Your input was flagged by the content safety filter. Please modify your request and try again."},"api.429":{zh:"请求频率超限:",en:"Rate limit exceeded: "},"api.429Hint":{zh:"请求过于频繁,请稍后重试或检查配额。",en:"You are sending requests too quickly. Please wait and retry, or check your quota."},"api.500":{zh:"服务器内部错误(HTTP 500)。",en:"Server error (HTTP 500)."},"api.500Hint":{zh:"服务器遇到内部错误,请稍后重试。",en:"The server encountered an internal error. Please retry later."},"api.503":{zh:"服务暂不可用(HTTP 503)。",en:"Service unavailable (HTTP 503)."},"api.503Hint":{zh:"服务器暂时过载或维护中,请稍后重试。",en:"The server is temporarily overloaded or under maintenance. Please retry later."},"api.default":{zh:"API 错误:",en:"API error: "},"auth.noCreds":{zh:"未找到认证信息。",en:"No credentials found."},"auth.noCredsHint":{zh:`登录: mimo auth login
18
+ Check your API Key permissions.`},"api.404":{zh:"未找到:",en:"Not found: "},"api.404Hint":{zh:"请求的模型或功能可能不受支持,请检查模型名称和接口地址。",en:"The requested model or feature may not be supported. Check the model name and endpoint."},"api.421":{zh:"内容被过滤:",en:"Content filtered: "},"api.421Hint":{zh:"您的输入被内容安全过滤器标记,请修改后重试。",en:"Your input was flagged by the content safety filter. Please modify your request and try again."},"api.429":{zh:"请求频率超限:",en:"Rate limit exceeded: "},"api.429Hint":{zh:"请求过于频繁,请稍后重试或检查配额。",en:"You are sending requests too quickly. Please wait and retry, or check your quota."},"api.500":{zh:"服务器内部错误(HTTP 500)。",en:"Server error (HTTP 500)."},"api.500Hint":{zh:"服务器遇到内部错误,请稍后重试。",en:"The server encountered an internal error. Please retry later."},"api.503":{zh:"服务暂不可用(HTTP 503)。",en:"Service unavailable (HTTP 503)."},"api.503Hint":{zh:"服务器暂时过载或维护中,请稍后重试。",en:"The server is temporarily overloaded or under maintenance. Please retry later."},"api.default":{zh:"API 错误:",en:"API error: "},"auth.noCreds":{zh:"未找到 API Key。",en:"No API key found."},"auth.noCredsHint":{zh:`登录: mimo auth login
19
19
  直接传入: --api-key <key>
20
20
  环境变量: MIMO_API_KEY=<key>`,en:`Log in: mimo auth login
21
21
  Pass directly: --api-key <key>
@@ -119,9 +119,9 @@ ${_.default.gray(D3)} ${$}
119
119
  `)};var q9=()=>{let $=I3?["◒","◐","◓","◑"]:["•","o","O","0"],Y=I3?80:120,Z,w,X=!1,W="",G=(T="")=>{X=!0,Z=K9(),W=T.replace(/\.+$/,""),process.stdout.write(`${_.default.gray(T$)}
120
120
  `);let K=0,U=0;w=setInterval(()=>{let M=_.default.magenta($[K]),q=".".repeat(Math.floor(U)).slice(0,3);process.stdout.write(x1.cursor.move(-999,0)),process.stdout.write(x1.erase.down(1)),process.stdout.write(`${M} ${W}${q}`),K=K+1<$.length?K+1:0,U=U<$.length?U+0.125:0},Y)},Q=(T="",K=0)=>{W=T??W,X=!1,clearInterval(w);let U=K===0?_.default.green(h3):K===1?_.default.red(T9):_.default.red(U9);process.stdout.write(x1.cursor.move(-999,0)),process.stdout.write(x1.erase.down(1)),process.stdout.write(`${U} ${W}
121
121
  `),Z()},z=(T="")=>{W=T??W},H=(T)=>{let K=T>1?"Something went wrong":"Canceled";X&&Q(K,T)};return process.on("uncaughtExceptionMonitor",()=>H(2)),process.on("unhandledRejection",()=>H(2)),process.on("SIGINT",()=>H(1)),process.on("SIGTERM",()=>H(1)),process.on("exit",H),{start:G,stop:Q,message:z}};function Q8(){let $=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp($,"g")}function $0(){return process.stdout.isTTY===!0}async function O9($,Y){let Z=await c2({message:$,placeholder:Y?.placeholder});if(M1(Z))throw Error("Operation cancelled");let w=Z.trim();if(!w)throw Error("Input cannot be empty");return w}async function E9($){if($.apiKey||$.fileApiKey||$.fileSkApiKey)return;if(process.env.MIMO_API_KEY)return;if(!$0())throw new L(V("auth.noCreds"),E.AUTH,V("auth.noCredsHint"));process.stderr.write(`
122
- Not logged in.
123
- `),process.stderr.write(` mimo auth login Log in with an API key
124
- `),process.stderr.write(` mimo auth login --api-key Save an API key directly
122
+ `+V("main.notLoggedIn")+`
123
+ `),process.stderr.write(V("main.loginHint1")+`
124
+ `),process.stderr.write(V("main.loginHint2")+`
125
125
 
126
126
  `),process.exit(E.AUTH)}async function L9($,Y){let Z={...K$()};if(Y.startsWith("tp-"))Z.api_key=Y,Z.active_key="tp";else Z.sk_api_key=Y,Z.active_key="sk";let w=S$(Y);if(w)Z.base_url=w;else Z.base_url="https://api.xiaomimimo.com/v1";await y$(Z),$.fileApiKey=Z.api_key,$.fileSkApiKey=Z.sk_api_key,$.activeKey=Z.active_key;let X=Y.startsWith("tp-")?"TokenPlan":"按量计费";if(process.stderr.write(`${V("auth.keySaved")} ${$.configPath??"~/.mimo/config.json"} (${J$(Y)}, ${X})
127
127
  `),w)process.stderr.write(`${V("auth.baseUrlAuto")}${w}
@@ -130,7 +130,7 @@ ${_.default.gray(D3)} ${$}
130
130
  `),process.stderr.write(" "+V("auth.promptPayKey")+`
131
131
  `),process.stderr.write(" "+V("auth.promptTpKey")+`
132
132
 
133
- `);let $=await O9(V("auth.promptLabel"));if(!$)throw new L(V("auth.keyRequired"),E.AUTH);return $}var q1="0.1.5";var k9=j({name:"auth login",description:"cmd.authLogin.desc",usage:"mimo auth login [--api-key <key>]",options:[{flag:"--api-key <key>",description:"flag.auth.apiKey"}],examples:["mimo auth login","mimo auth login --api-key sk-xxxxx # 按量计费 Key","mimo auth login --api-key tp-xxxxx # TokenPlan Key"],async run($,Y){let Z=Y.apiKey;if(!Z){if(!$0())throw new L(V("auth.noKeyProvided"),E.AUTH,V("auth.noKeyHint"));Z=await F9()}if(!Z||Z.trim().length===0)throw new L(V("auth.keyEmpty"),E.AUTH);await L9($,Z.trim())}});var C9=j({name:"auth status",description:"cmd.authStatus.desc",usage:"mimo auth status",async run($,Y){try{let Z=v2($),w=Z.token.startsWith("tp-")?"TokenPlan":"按量计费",X=S$(Z.token),W={authenticated:!0,method:Z.method,activeKey:$.activeKey??"tp",apiKey:J$(Z.token),keyType:w,baseUrl:$.baseUrl||X||"https://api.xiaomimimo.com/v1",source:Z.source,configPath:$.configPath};if($.activeKey==="tp"&&$.fileSkApiKey)W.standbyKey=J$($.fileSkApiKey)+" (按量计费)";else if($.activeKey==="sk"&&$.fileApiKey)W.standbyKey=J$($.fileApiKey)+" (TokenPlan)";console.log(W$(W,$))}catch(Z){if($.verbose)process.stderr.write(`Debug: credential resolution failed — ${Z instanceof Error?Z.message:String(Z)}
133
+ `);let $=await O9(V("auth.promptLabel"));if(!$)throw new L(V("auth.keyRequired"),E.AUTH);return $}var q1="0.1.7";var k9=j({name:"auth login",description:"cmd.authLogin.desc",usage:"mimo auth login [--api-key <key>]",options:[{flag:"--api-key <key>",description:"flag.auth.apiKey"}],examples:["mimo auth login","mimo auth login --api-key sk-xxxxx # 按量计费 Key","mimo auth login --api-key tp-xxxxx # TokenPlan Key"],async run($,Y){let Z=Y.apiKey;if(!Z){if(!$0())throw new L(V("auth.noKeyProvided"),E.AUTH,V("auth.noKeyHint"));Z=await F9()}if(!Z||Z.trim().length===0)throw new L(V("auth.keyEmpty"),E.AUTH);await L9($,Z.trim())}});var C9=j({name:"auth status",description:"cmd.authStatus.desc",usage:"mimo auth status",async run($,Y){try{let Z=v2($),w=Z.token.startsWith("tp-")?"TokenPlan":"按量计费",X=S$(Z.token),W={authenticated:!0,method:Z.method,activeKey:$.activeKey??"tp",apiKey:J$(Z.token),keyType:w,baseUrl:$.baseUrl||X||"https://api.xiaomimimo.com/v1",source:Z.source,configPath:$.configPath};if($.activeKey==="tp"&&$.fileSkApiKey)W.standbyKey=J$($.fileSkApiKey)+" (按量计费)";else if($.activeKey==="sk"&&$.fileApiKey)W.standbyKey=J$($.fileApiKey)+" (TokenPlan)";console.log(W$(W,$))}catch(Z){if($.verbose)process.stderr.write(`Debug: credential resolution failed — ${Z instanceof Error?Z.message:String(Z)}
134
134
  `);let w={authenticated:!1,method:null,activeKey:$.activeKey??"tp",apiKey:null,keyType:null,baseUrl:$.baseUrl||"https://api.xiaomimimo.com/v1",source:null,configPath:$.configPath};console.log(W$(w,$))}}});var S9=j({name:"auth logout",description:"cmd.authLogout.desc",usage:"mimo auth logout",async run($,Y){let Z=K$();if(!Z.api_key&&!Z.sk_api_key){process.stderr.write(V("auth.logoutNoKey")+`
135
135
  `);return}delete Z.api_key,delete Z.sk_api_key,delete Z.active_key,await y$(Z),$.fileApiKey=void 0,$.fileSkApiKey=void 0,$.activeKey=void 0,process.stderr.write(V("auth.logoutDone")+`
136
136
  `)}});var N8=new Set(["api_key","apiKey","api-key","sk_api_key","skApiKey","sk-api-key"]),R9=j({name:"config show",description:"cmd.configShow.desc",usage:"mimo config show",async run($,Y){let Z=K$(),w={baseUrl:$.baseUrl,output:$.output,timeout:$.timeout,defaultModel:$.defaultModel??V("general.notSet"),activeKey:$.activeKey??"tp",configPath:$.configPath};if(Z.api_key)w.tpApiKey=J$(Z.api_key)+" (TokenPlan)";else w.tpApiKey=V("general.notSet");if(Z.sk_api_key)w.skApiKey=J$(Z.sk_api_key)+" (按量计费)";else w.skApiKey=V("general.notSet");if(Z.base_url)w.fileBaseUrl=Z.base_url;for(let[X,W]of Object.entries(Z))if(X!=="api_key"&&X!=="sk_api_key"&&X!=="base_url"&&X!=="active_key"&&N8.has(X)&&typeof W==="string")w[X]=J$(W);console.log(W$(w,$))}});var P9=new Set(["api_key","sk_api_key","active_key","base_url","output","timeout","default_model","language"]),z8=/^[a-zA-Z0-9_]+$/,_9=j({name:"config set",description:"cmd.configSet.desc",usage:"mimo config set --key <key> --value <value>",options:[{flag:"--key <key>",description:"flag.config.key",required:!0},{flag:"--value <value>",description:"flag.config.value",required:!0}],examples:["mimo config set --key base_url --value https://api.xiaomimimo.com/v1","mimo config set --key output --value json","mimo config set --key timeout --value 60","mimo config set --key default_model --value MiMo-7B-RL"],async run($,Y){let{key:Z,value:w}=Y;if(!Z)throw new L(V("config.keyRequired"),E.USAGE);if(!z8.test(Z))throw new L(V("config.invalidKey")+'"'+Z+'"',E.INVALID_INPUT,V("config.invalidKeyChars"));if(!P9.has(Z))throw new L(V("config.invalidKey")+'"'+Z+'"',E.USAGE,V("config.validKeys")+Array.from(P9).join(", "));if(w===void 0||w==="")throw new L(V("config.valueRequired"),E.USAGE);let X=K$();if(Z==="timeout"){let G=Number(w);if(!Number.isFinite(G)||G<=0)throw new L(V("config.setTimeout"),E.USAGE);X[Z]=G}else if(Z==="output"&&w!=="text"&&w!=="json")throw new L(V("config.setOutput"),E.USAGE);else if(Z==="active_key"&&w!=="tp"&&w!=="sk")throw new L(V("config.invalidActiveKey"),E.USAGE);else X[Z]=w;if(Z==="active_key"){let G=w==="sk"?X.sk_api_key:X.api_key;if(typeof G==="string"){let Q=G.startsWith("tp-")?"https://token-plan-cn.xiaomimimo.com/v1":"https://api.xiaomimimo.com/v1";X.base_url=Q}}await y$(X);let W=Z==="api_key"||Z==="sk_api_key"?J$(String(w)):w;process.stderr.write(V("config.setDone")+" "+Z+" = "+W+`
@@ -200,11 +200,11 @@ Error: ${A instanceof Error?A.message:String(A)}
200
200
 
201
201
  ${K.content}`);else if(K?.content)console.log(K.content);else if(K?.reasoning_content)console.log(`[Thinking] ${K.reasoning_content}`)}}}});var Z5=j({name:"asr",description:"cmd.asr.desc",usage:"mimo asr <audio-file> [flags]",options:[{flag:"--language <lang>",description:"flag.asr.language"},{flag:"--stream",description:"flag.asr.stream"},{flag:"--file <path>",description:"flag.asr.file"}],examples:["mimo asr recording.wav","mimo asr audio.mp3 --language zh","mimo asr --file recording.wav --language en"],async run($,Y){let Z=Y,w=G$($),W=Y._positional?.[0]??Z.file;if(!W)throw new L(V("asr.noFile"),E.USAGE,"Usage: mimo asr <audio-file> [flags]");await O3(W,10);let G=await s1(W),Q=Z.language??"auto",T={model:"mimo-v2.5-asr",messages:[{role:"user",content:[{type:"input_audio",input_audio:{data:G}}]}],stream:Z.stream??!1,asr_options:{language:Q}};if($.dryRun){console.log(JSON.stringify({request:{...T,messages:[{role:"user",content:"[audio data]"}]}},null,2));return}if(Z.stream){let K=await w.chatCompletionStream(T);try{for await(let U of K)for(let M of U.choices){let q=n$(M.delta);if(q?.content)process.stdout.write(q.content)}}catch(U){throw new L(V("asr.streamFailed")+(U instanceof Error?U.message:String(U)),E.NETWORK,V("asr.checkHint"))}finally{a$(K)}process.stdout.write(`
202
202
  `)}else{let K;try{K=await w.chatCompletion(T)}catch(U){throw new L(V("asr.requestFailed")+(U instanceof Error?U.message:String(U)),E.NETWORK,V("asr.checkHint"))}for(let U of K.choices){let M=U.message?.content;if(M)console.log(typeof M==="string"?M:JSON.stringify(M))}}}});import{writeFileSync as _Z,mkdirSync as AZ,existsSync as fZ}from"node:fs";import{dirname as jZ,resolve as bZ}from"node:path";function o1($){let Y=q9();return{start(){Y.start($)},stop(Z){Y.stop(Z??"",0)},update(Z){Y.message(Z)}}}var w5=["mimo_default","冰糖","茉莉","苏打","白桦","Mia","Chloe","Milo","Dean"];function _2($,Y){let Z=new Date().toISOString().slice(0,19).replace(/[T:]/g,"-");return`${$}_${Z}.${Y}`}function A2($,Y){let Z=bZ(Y),w=jZ(Z);if(!fZ(w))AZ(w,{recursive:!0});let X=Buffer.from($,"base64");return _Z(Z,X),Z}var R4=j({name:"tts synthesize",description:"cmd.ttsSynth.desc",apiDocs:"/docs/api-reference/tts",usage:"mimo tts synthesize --text <text> [flags]",options:[{flag:"-t, --text <text>",description:"flag.tts.text",required:!0},{flag:"--voice <id>",description:"flag.tts.voice",default:"mimo_default"},{flag:"--style <desc>",description:"flag.tts.style"},{flag:"--format <fmt>",description:"flag.tts.format",default:"wav"},{flag:"-o, --out <path>",description:"flag.tts.out"}],examples:['mimo tts synthesize --text "你好,世界!"','mimo tts synthesize -t "Hello world" --voice Mia --format mp3','mimo tts synthesize -t "温柔地说" --style "温柔、缓慢" --voice 茉莉'],async run($,Y){let Z=Y,w=Z.text;if(!w)throw new L(V("tts.noText"),E.USAGE,'mimo tts synthesize --text "你好,世界!"');if(w.trim().length===0)throw new L(V("tts.emptyText"),E.USAGE,"Provide non-empty text to synthesize.");let X=5000;if(w.length>X)throw new L(V("tts.textTooLong",{len:String(w.length),max:String(X)}),E.USAGE,V("tts.textTooLongHint"));let W=Z.voice??"mimo_default";if(!w5.includes(W))throw new L(V("tts.invalidVoice")+'"'+W+'". '+w5.join(", "),E.USAGE);let G=Z.format??"wav",Q=Z.out??_2("tts_output",G),z=[];if(Z.style)z.push({role:"user",content:Z.style}),z.push({role:"assistant",content:w});else z.push({role:"assistant",content:w});let H={model:"mimo-v2.5-tts",messages:z,stream:!1,audio:{format:G,voice:W}};if(U1($,H))return;let T=o1(V("spinner.synthesizing"));T.start();try{let M=(await G$($).chatCompletion(H)).choices?.[0]?.message?.audio;if(!M?.data)throw new L(V("tts.noAudioData"),E.GENERAL);let q=A2(M.data,Q);T.stop("");let P=X$($.output);if(!$.quiet)console.log(W$({output:q,voice:W,format:G},P));else console.log(q)}catch(K){throw T.stop(""),K}}});var G5=j({name:"tts clone",description:"cmd.ttsClone.desc",apiDocs:"/docs/api-reference/tts-voiceclone",usage:"mimo tts clone --sample <audio> --text <text> [flags]",options:[{flag:"--sample <path>",description:"flag.tts.sample",required:!0},{flag:"-t, --text <text>",description:"flag.tts.text",required:!0},{flag:"--format <fmt>",description:"flag.tts.format",default:"wav"},{flag:"-o, --out <path>",description:"flag.tts.out"}],examples:['mimo tts clone --sample voice.mp3 --text "你好,世界!"','mimo tts clone --sample my_voice.wav -t "Hello world" --format mp3'],async run($,Y){let Z=Y,w=Z.sample,X=Z.text;if(!w)throw new L(V("tts.noSample"),E.USAGE,'mimo tts clone --sample voice.mp3 --text "你好,世界!"');if(!X)throw new L(V("tts.noText"),E.USAGE,'mimo tts clone --sample voice.mp3 --text "你好,世界!"');await O3(w,10);let W=Z.format??"wav",G=Z.out??_2("clone_output",W),Q=o1(V("spinner.readingSample"));Q.start();try{let z=await s1(w);Q.update(V("spinner.cloning"));let T={model:"mimo-v2.5-tts-voiceclone",messages:[{role:"user",content:""},{role:"assistant",content:X}],stream:!1,audio:{format:W,voice:z}};if(U1($,T)){Q.stop("");return}let M=(await G$($).chatCompletion(T)).choices?.[0]?.message?.audio;if(!M?.data)throw new L(V("tts.noAudioData"),E.GENERAL);let q=A2(M.data,G);Q.stop("");let P=X$($.output);if(!$.quiet)console.log(W$({output:q,format:W},P));else console.log(q)}catch(z){throw Q.stop(""),z}}});var X5=j({name:"tts design",description:"cmd.ttsDesign.desc",apiDocs:"/docs/api-reference/tts-voicedesign",usage:"mimo tts design --prompt <description> [flags]",options:[{flag:"-p, --prompt <desc>",description:"flag.ttsDesign.prompt",required:!0},{flag:"-t, --text <text>",description:"flag.ttsDesign.text"},{flag:"--optimize-text",description:"flag.ttsDesign.optimizeText"},{flag:"--format <fmt>",description:"flag.tts.format",default:"wav"},{flag:"-o, --out <path>",description:"flag.tts.out"}],examples:['mimo tts design --prompt "温柔的女声,语速较慢" --text "你好,世界!"','mimo tts design -p "低沉男声,播音腔" --optimize-text','mimo tts design --prompt "活泼的少女音" -t "今天天气真好" --format mp3'],async run($,Y){let Z=Y,w=Z.prompt;if(!w)throw new L(V("tts.noPrompt"),E.USAGE,'mimo tts design --prompt "温柔的女声" --text "你好"');let X=Z.text,W=Z.optimizeText??!1;if(!X&&!W)throw new L(V("tts.noTextOrOptimize"),E.USAGE,'mimo tts design --prompt "温柔的女声" --text "你好" 或 --optimize-text');let G=Z.format??"wav",Q=Z.out??_2("design_output",G),z=[{role:"user",content:w}];if(X)z.push({role:"assistant",content:X});let H={format:G};if(W&&!X)H.optimize_text_preview=!0;let T={model:"mimo-v2.5-tts-voicedesign",messages:z,stream:!1,audio:H};if(U1($,T))return;let K=o1(V("spinner.designing"));K.start();try{let q=(await G$($).chatCompletion(T)).choices?.[0]?.message?.audio;if(!q?.data)throw new L(V("tts.noAudioData"),E.GENERAL);let P=A2(q.data,Q);K.stop("");let A=X$($.output);if(!$.quiet)console.log(W$({output:P,format:G},A));else console.log(P)}catch(U){throw K.stop(""),U}}});var W5=[{name:"MiMo默认",voiceId:"mimo_default",language:"中/英",gender:"-"},{name:"冰糖",voiceId:"冰糖",language:"中文",gender:"女"},{name:"茉莉",voiceId:"茉莉",language:"中文",gender:"女"},{name:"苏打",voiceId:"苏打",language:"中文",gender:"男"},{name:"白桦",voiceId:"白桦",language:"中文",gender:"男"},{name:"Mia",voiceId:"Mia",language:"英文",gender:"女"},{name:"Chloe",voiceId:"Chloe",language:"英文",gender:"女"},{name:"Milo",voiceId:"Milo",language:"英文",gender:"男"},{name:"Dean",voiceId:"Dean",language:"英文",gender:"男"}],J5=j({name:"tts voices",description:"cmd.ttsVoices.desc",usage:"mimo tts voices",options:[],examples:["mimo tts voices","mimo tts voices --output json"],async run($,Y){let Z=X$($.output);if(Z==="json"){console.log(W$(W5,Z));return}let w=["name","voiceId","language","gender"],X=W5.map((W)=>[W.name,W.voiceId,W.language,W.gender]);console.log(k3(w,X))}});h.register("chat",p6);h.register("repl",i6);h.register("vision",Y5);h.register("asr",Z5);h.register("tts synthesize",R4);h.register("tts generate",R4);h.register("tts clone",G5);h.register("tts design",X5);h.register("tts voices",J5);h.register("auth login",k9);h.register("auth status",C9);h.register("auth logout",S9);h.register("config show",R9);h.register("config set",_9);h.register("update",A9);h.register("help",f9);h.register("language",j9);var vZ=[["auth","login"],["auth","status"],["auth","logout"],["config","show"],["config","set"],["update"],["help"],["language"]];process.on("SIGINT",()=>{process.stderr.write(V("main.interrupted")+`
203
- `),process.exit(130)});process.stdout.on("error",($)=>{if($.code==="EPIPE")process.exit(0);else throw $});process.on("uncaughtException",($)=>{x$($)});process.on("unhandledRejection",($)=>{x$($)});async function yZ(){let $;try{$=process.argv.slice(2)}catch(Q){process.stderr.write(V("main.fatalArgv")),process.exit(1)}if($.includes("--version")||$.includes("-v"))console.log(`mimo ${q1}`),process.exit(0);let Y=I4($,T1);if($.includes("--help")||$.includes("-h")){let Q=y2({});j2(Q.language),h.printHelp(Y),process.exit(0)}if(Y.length===0){let Q=y2({});if(j2(Q.language),h.printHelp([]),!(Q.apiKey||Q.fileApiKey||process.env.MIMO_API_KEY))process.stderr.write(V("main.notLoggedIn")+`
203
+ `),process.exit(130)});process.stdout.on("error",($)=>{if($.code==="EPIPE")process.exit(0);else throw $});process.on("uncaughtException",($)=>{x$($)});process.on("unhandledRejection",($)=>{x$($)});async function yZ(){let $;try{$=process.argv.slice(2)}catch(Q){process.stderr.write(V("main.fatalArgv")),process.exit(1)}if($.includes("--version")||$.includes("-v"))console.log(`mimo ${q1}`),process.exit(0);let Y=I4($,T1);if($.includes("--help")||$.includes("-h")){let Q=y2({});j2(Q.language),h.printHelp(Y),process.exit(0)}if(Y.length===0){let Q=y2({});if(j2(Q.language),h.printHelp([]),!(Q.apiKey||Q.fileApiKey||Q.fileSkApiKey||process.env.MIMO_API_KEY))process.stderr.write(V("main.notLoggedIn")+`
204
204
  `),process.stderr.write(V("main.loginHint1")+`
205
205
  `),process.stderr.write(V("main.loginHint2")+`
206
206
 
207
207
  `);process.exit(0)}let{command:Z,extra:w}=h.resolve(Y),X=D4($,[...T1,...Z.options??[]]);if(w.length>0)X._positional=w;let W;try{W=y2(X)}catch(Q){x$(Q),process.exit(1)}if(j2(W.language),!vZ.some((Q)=>Q.every((z,H)=>Y[H]===z)))await E9(W);await Z.execute(W,X)}if(j4.main==j4.module)yZ().catch(x$);export{yZ as main};
208
208
 
209
- //# debugId=6CA5D88130D11D8464756E2164756E21
209
+ //# debugId=8C0644F1A9C6500D64756E2164756E21
210
210
  //# sourceMappingURL=mimo.mjs.map