bailian-cli 1.3.2 → 1.3.3

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.
Files changed (2) hide show
  1. package/dist/bailian.mjs +3 -3
  2. package/package.json +2 -2
package/dist/bailian.mjs CHANGED
@@ -132,7 +132,7 @@ This process keeps the local port open for the console; press Ctrl+C when finish
132
132
  `),process.exit(1)),Ma(e)?a.push(e):r=e}else throw new t(`Missing required argument --image or --video.`,i.USAGE,`bl vision describe --image <path-or-url>
133
133
  bl vision describe --video <url-or-path>`);let u=h(e.output);if(e.dryRun){P({request:{prompt:l,image:r,video:a.length?a:void 0,model:o}},u);return}let d=[];if(a.length>0)for(let n of a){let r=n;if(D(n)){if(!Re(n))throw new t(`Video file not found: ${n}`,i.USAGE);r=await j(n,(await A(e)).token,o)}d.push({type:`video_url`,video_url:{url:r}})}if(r){let t=await Na(r),n=t;if(D(r)&&t.startsWith(`data:`)){let{statSync:t}=await import(`fs`);if(t(r).size>5*1024*1024){let t=await A(e);n=await j(r,t.token,o)}}d.push({type:`image_url`,image_url:{url:n}})}d.push({type:`text`,text:l});let p={model:o,messages:[{role:`user`,content:d}]},m=await k(e,{url:f(e.baseUrl),method:`POST`,body:p}),g=m.choices?.[0]?.message?.content;if(u!==`text`){P(m,u);return}F(g||``)}})})),Ra,za=M((()=>{I(),Ra=m({name:`config show`,description:`Display current configuration`,usage:`bl config show`,examples:[`bl config show`,`bl config show --output json`],async run(e,t){let n=ue(),r=h(e.output),i={region:e.region,base_url:e.baseUrl,output:e.output,timeout:e.timeout,config_file:S()};n.api_key&&(i.api_key=O(n.api_key)),n.access_token&&(i.access_token=O(n.access_token)),n.default_text_model&&(i.default_text_model=n.default_text_model),n.default_video_model&&(i.default_video_model=n.default_video_model),n.default_image_model&&(i.default_image_model=n.default_image_model),P(i,r)}})})),Ba,Va,Ha,Ua,Wa=M((()=>{I(),Ba=[`region`,`base_url`,`output`,`output_dir`,`timeout`,`api_key`,`access_token`,`default_text_model`,`default_video_model`,`default_image_model`,`default_speech_model`,`default_omni_model`,`access_key_id`,`access_key_secret`,`workspace_id`],Va=new Set([`api_key`,`access_token`,`access_key_id`,`access_key_secret`]),Ha={"base-url":`base_url`,"output-dir":`output_dir`,"api-key":`api_key`,"access-token":`access_token`,"default-text-model":`default_text_model`,"default-video-model":`default_video_model`,"default-image-model":`default_image_model`,"default-speech-model":`default_speech_model`,"default-omni-model":`default_omni_model`,"access-key-id":`access_key_id`,"access-key-secret":`access_key_secret`,"workspace-id":`workspace_id`},Ua=m({name:`config set`,description:`Set a config value`,usage:`bl config set --key <key> --value <value>`,options:[{flag:`--key <key>`,description:`Config key (region, base_url, output, output_dir, timeout, api_key, access_token, default_*_model, access_key_id, access_key_secret, workspace_id)`},{flag:`--value <value>`,description:`Value to set`}],examples:[`bl config set --key output --value json`,`bl config set --key timeout --value 600`,`bl config set --key base_url --value https://dashscope.aliyuncs.com`],async run(e,n){let r=n.key,a=n.value;if(!r||a===void 0)throw new t(`--key and --value are required.`,i.USAGE,`bl config set --key <key> --value <value>`);let o=Ha[r]||r;if(!Ba.includes(o))throw new t(`Invalid config key "${r}". Valid keys: ${Ba.join(`, `)}`,i.USAGE);if(o===`region`&&![`cn`,`us`,`intl`].includes(a))throw new t(`Invalid region "${a}". Valid values: cn, us, intl`,i.USAGE);if(o===`output`&&![`text`,`json`].includes(a))throw new t(`Invalid output format "${a}". Valid values: text, json`,i.USAGE);if(o===`timeout`){let e=Number(a);if(isNaN(e)||e<=0)throw new t(`Invalid timeout "${a}". Must be a positive number.`,i.USAGE)}let s=h(e.output);if(e.dryRun){P({would_set:{[o]:a}},s);return}let c=ue();if(c[o]=o===`timeout`?Number(a):a,await De(c),!e.quiet){let e=Va.has(o)?O(String(c[o])):c[o];P({[o]:e},s)}}})})),Ga,Ka,qa=M((()=>{Ga=[`auth `,`config `,`update`],Ka=m({name:`config export-schema`,description:`Export all (or one) CLI command(s) as Anthropic/OpenAI-compatible JSON tool schemas`,usage:`bl config export-schema [--command "<name>"]`,options:[{flag:`--command <name>`,description:`Export schema for a specific command only (e.g. "image generate")`}],examples:[`bl config export-schema`,`bl config export-schema --command "video generate"`],async run(e,n){let{commands:r}=await Promise.resolve().then(()=>(Cm(),xm)),a=n.command;if(a){let e=r[a];if(!e)throw new t(`Command "${a}" not found.`,i.USAGE);let n=b(e);process.stdout.write(JSON.stringify(n,null,2)+`
134
134
  `);return}let o=Object.values(r).filter(e=>!Ga.some(t=>e.name.startsWith(t))).map(e=>b(e));process.stdout.write(JSON.stringify(o,null,2)+`
135
- `)}})}));bi(),ki(),Mi(),Fi(),Hi(),_a(),ya(),Ca(),Ta(),Da(),ka(),ja(),La(),za(),Wa(),qa();var Ja=`1.3.2`,Ya,Xa=M((()=>{Ya=Ja}));function Za(e,t){let n=e.split(`.`).map(Number),r=t.split(`.`).map(Number);for(let e=0;e<3;e++){if((n[e]??0)>(r[e]??0))return!0;if((n[e]??0)<(r[e]??0))return!1}return!1}function Qa(){try{let e=Be(ao(),`utf-8`);return JSON.parse(e)}catch{return null}}function $a(e){try{He(ao(),JSON.stringify(e))}catch{}}async function eo(e=so){try{let t=io.replace(`/`,`%2f`),n=await fetch(`${ro}/${t}/latest`,{headers:{Accept:`application/json`,...Ce()},signal:AbortSignal.timeout(e)});return n.ok?(await n.json()).version??null:null}catch{return null}}function to(){return co}async function no(e){if(process.env.CI||!process.stderr.isTTY)return;let t=Qa(),n=Date.now();if(t&&n-t.lastChecked<oo){t.latestVersion&&Za(t.latestVersion,e)&&(co=t.latestVersion);return}let r=await eo();r&&($a({lastChecked:n,latestVersion:r}),r&&Za(r,e)&&(co=r))}var ro,io,ao,oo,so,co,lo=M((()=>{ro=`https://registry.npmjs.org`,io=`bailian-cli`,ao=()=>Ge(x(),`update-state.json`),oo=14400*1e3,so=3e3,co=null}));function uo(){return{cmd:`npm install -g ${io}@latest`,label:`npm`}}function fo(e){let{green:t,yellow:n,reset:r}=e;process.stderr.write(`
135
+ `)}})}));bi(),ki(),Mi(),Fi(),Hi(),_a(),ya(),Ca(),Ta(),Da(),ka(),ja(),La(),za(),Wa(),qa();var Ja=`1.3.3`,Ya,Xa=M((()=>{Ya=Ja}));function Za(e,t){let n=e.split(`.`).map(Number),r=t.split(`.`).map(Number);for(let e=0;e<3;e++){if((n[e]??0)>(r[e]??0))return!0;if((n[e]??0)<(r[e]??0))return!1}return!1}function Qa(){try{let e=Be(ao(),`utf-8`);return JSON.parse(e)}catch{return null}}function $a(e){try{He(ao(),JSON.stringify(e))}catch{}}async function eo(e=so){try{let t=io.replace(`/`,`%2f`),n=await fetch(`${ro}/${t}/latest`,{headers:{Accept:`application/json`,...Ce()},signal:AbortSignal.timeout(e)});return n.ok?(await n.json()).version??null:null}catch{return null}}function to(){return co}async function no(e){if(process.env.CI||!process.stderr.isTTY)return;let t=Qa(),n=Date.now();if(t&&n-t.lastChecked<oo){t.latestVersion&&Za(t.latestVersion,e)&&(co=t.latestVersion);return}let r=await eo();r&&($a({lastChecked:n,latestVersion:r}),r&&Za(r,e)&&(co=r))}var ro,io,ao,oo,so,co,lo=M((()=>{ro=`https://registry.npmjs.org`,io=`bailian-cli`,ao=()=>Ge(x(),`update-state.json`),oo=14400*1e3,so=3e3,co=null}));function uo(){return{cmd:`npm install -g ${io}@latest`,label:`npm`}}function fo(e){let{green:t,yellow:n,reset:r}=e;process.stderr.write(`
136
136
  Updating agent skill...
137
137
  `);try{Ke(`npx skills update ${po} -g -y`,{stdio:`inherit`}),process.stderr.write(`${t}\u2713 Agent skill updated.${r}\n`)}catch{process.stderr.write(`${n}Agent skill update skipped. Run manually: npx skills update ${po} -g -y${r}\n`)}}var po,mo,ho=M((()=>{Xa(),lo(),po=`bailian-cli`,mo=m({name:`update`,description:`Update bl to the latest version`,usage:`bl update`,examples:[`bl update`],async run(){let e=process.stderr.isTTY,t=e?`\x1B[32m`:``,n=e?`\x1B[33m`:``,r=e?`\x1B[0m`:``;process.stderr.write(`Current version: ${n}${Ya}${r}\n`),process.stderr.write(`Checking for updates...
138
138
  `);let i=await eo(5e3);if(i&&i===Ya){process.stderr.write(`${t}\u2713 Already up to date (${Ya}).${r}\n`);return}i&&process.stderr.write(`Latest version: ${t}${i}${r}\n\n`);let{cmd:a,label:o}=uo();process.stderr.write(`Updating ${io} via ${o}...\n\n`);try{Ke(a,{stdio:`inherit`});try{let e=Ke(`bl --version 2>/dev/null`,{encoding:`utf-8`}).trim().replace(/^bl\s+/,``);process.stderr.write(`\n${t}\u2713 Update complete: ${Ya} \u2192 ${e}${r}\n`);try{He(Ge(x(),`update-state.json`),JSON.stringify({lastChecked:Date.now(),latestVersion:e}))}catch{}}catch{process.stderr.write(`\n${t}\u2713 Update complete.${r}\n`)}fo({green:t,yellow:n,reset:r})}catch{process.stderr.write(`
@@ -150,7 +150,7 @@ Preferred: set DASHSCOPE_API_KEY or pass --api-key.
150
150
  Legacy (deprecated): set ALIBABA_CLOUD_ACCESS_KEY_ID / ALIBABA_CLOUD_ACCESS_KEY_SECRET.`,i.AUTH);if(!l)throw new t(`Knowledge retrieve requires a workspace ID.
151
151
  Set via: --workspace-id flag, or env: BAILIAN_WORKSPACE_ID, or config: bl config set workspace_id <id>`,i.USAGE);process.stderr.write(`Warning: AK/SK auth for knowledge retrieve is deprecated. Prefer --api-key or DASHSCOPE_API_KEY.
152
152
  `);let u={IndexId:r,Query:a};if(n.topK!==void 0&&n.rerankTopN===void 0&&(process.stderr.write(`Warning: --top-k is deprecated. Use --rerank-top-n instead.
153
- `),n.rerankTopN=n.topK),n.rerank&&(u.EnableReranking=!0),n.rerankTopN!==void 0&&(u.RerankTopN=n.rerankTopN),n.denseSimilarityTopK!==void 0&&(u.DenseSimilarityTopK=n.denseSimilarityTopK),n.sparseSimilarityTopK!==void 0&&(u.SparseSimilarityTopK=n.sparseSimilarityTopK),n.rerankModel){let e={ModelName:n.rerankModel};n.rerankMode&&(e.RerankMode=n.rerankMode),n.rerankInstruct&&(e.RerankInstruct=n.rerankInstruct),u.Rerank=[e]}let d=`/${l}/index/retrieve`;if(e.dryRun){P({endpoint:`https://${Ro}${d}`,workspaceId:l,request:u},o);return}let f=JSON.stringify(u),p=_e({accessKeyId:s,accessKeySecret:c,action:`Retrieve`,version:`2023-12-29`,body:f,host:Ro,pathname:d}),m=`https://${Ro}${d}`;e.verbose&&(process.stderr.write(`> POST ${m}\n`),process.stderr.write(`> AK: ${O(s)}\n`));let h=e.timeout*1e3,g=await fetch(m,{method:`POST`,headers:{...p,...Ce()},body:f,signal:AbortSignal.timeout(h)});e.verbose&&process.stderr.write(`< ${g.status} ${g.statusText}\n`);let _=await g.json();if(!g.ok||_.Code&&_.Code!==`Success`)throw new t(`Knowledge retrieve failed: ${_.Code||g.status} - ${_.Message||g.statusText}`,i.GENERAL);let v=_.Data?.Nodes||[];e.quiet||o===`text`?Lo(v.map(e=>({text:e.Text,score:e.Score}))):P(_,o)}function Lo(e){if(e.length===0)F(`No results found.`);else for(let t=0;t<e.length;t++){let n=e[t];F(`[${t+1}] (score: ${n.score.toFixed(4)})`),F(n.text),F(``)}}var Ro,zo,Bo=M((()=>{H(),I(),Ro=`bailian.cn-beijing.aliyuncs.com`,zo=m({name:`knowledge retrieve`,description:`Retrieve from a Bailian knowledge base`,usage:`bl knowledge retrieve --index-id <id> --query <text> [flags]`,options:[{flag:`--index-id <id>`,description:`Knowledge base index ID (required)`,required:!0},{flag:`--query <text>`,description:`Search query (required)`,required:!0},{flag:`--dense-similarity-top-k <n>`,description:`Dense retrieval top K`,type:`number`},{flag:`--sparse-similarity-top-k <n>`,description:`Sparse retrieval top K`,type:`number`},{flag:`--rerank`,description:`Enable reranking`},{flag:`--rerank-top-n <n>`,description:`Rerank top N results`,type:`number`},{flag:`--rerank-model <name>`,description:`Rerank model, e.g. qwen3-rerank-hybrid`},{flag:`--rerank-mode <mode>`,description:`Rerank mode: qa, similar, or custom`},{flag:`--rerank-instruct <text>`,description:`Custom rerank instruction, when mode=custom`},{flag:`--top-k <n>`,description:`Number of results (deprecated, use --rerank-top-n)`,type:`number`},{flag:`--workspace-id <id>`,description:`Bailian workspace ID (required for AK/SK auth)`},{flag:`--access-key-id <key>`,description:`Alibaba Cloud Access Key ID (deprecated)`},{flag:`--access-key-secret <key>`,description:`Alibaba Cloud Access Key Secret (deprecated)`}],examples:[`bl knowledge retrieve --index-id idx_xxx --query "如何使用阿里云百炼"`,`bl knowledge retrieve --index-id idx_xxx --query "API限流" --rerank --rerank-model qwen3-rerank-hybrid`],async run(e,t){let n=t.indexId;n||V(`index-id`,`bl knowledge retrieve --index-id <id> --query <text>`);let r=t.query;r||V(`query`,`bl knowledge retrieve --index-id <id> --query <text>`);let i=h(e.output),a=!!e.apiKey,o=!!(t.accessKeyId&&t.accessKeySecret);if(a)await Fo(e,t,n,r,i);else if(o)await Io(e,t,n,r,i);else{let a=!1;try{await A(e),a=!0}catch{}a?await Fo(e,t,n,r,i):await Io(e,t,n,r,i)}}})}));async function Vo(e){if(e.apiKey||e.fileApiKey||e.accessTokenEnv||e.fileAccessToken)return;let n=process.env.DASHSCOPE_API_KEY,r;if(n&&(E({nonInteractive:e.nonInteractive})?await Yr({message:`Found DASHSCOPE_API_KEY in environment (${O(n)}). Save it to config file?`})&&(r=n):r=n),!r){if(!E({nonInteractive:e.nonInteractive}))throw new t(`No API key found.`,i.AUTH,`Set DASHSCOPE_API_KEY environment variable, pass --api-key, or run interactively to be prompted.`);let n=await Jr({message:`Enter your DashScope API key:`});if(!n)throw new t(`API key is required.`,i.AUTH);r=n}await De({...ue(),api_key:r}),e.fileApiKey=r;let a=e.configPath??`~/.bailian/config.json`;process.stderr.write(`API key saved to ${a}\n`)}var Ho=M((()=>{H()}));function Uo(e){let t={};for(let n of e){let e=n.indexOf(`=`);e<=0&&(process.stderr.write(`Error: --arg must be in K=V form, got: ${n}\n`),process.exit(1));let r=n.slice(0,e).trim(),i=n.slice(e+1);try{t[r]=JSON.parse(i)}catch{t[r]=i}}return t}var Wo,Go=M((()=>{H(),I(),Ho(),Wo=m({name:`mcp call`,description:`Call a tool on an MCP server (tools/call)`,usage:`bl mcp call <server-code>.<tool> [--arg k=v ...] [--json '{...}'] [--url <url>]`,options:[{flag:`<server-code>.<tool>`,description:`Server code and tool name joined by a dot, e.g. market-cmapi00073529.SmartStockSelection`,required:!0},{flag:`--arg <kv>`,description:`Tool argument (repeatable). Values parsed as JSON if possible, else string.`,type:`array`},{flag:`--json <obj>`,description:`Full arguments object as JSON; merged with --arg (arg wins).`},{flag:`--query <text>`,description:`Shortcut for --arg query=<text> (mirrors many DashScope MCP tools).`},{flag:`--url <url>`,description:`Override the MCP endpoint URL (for non-Bailian servers)`}],examples:[`bl mcp call market-cmapi00073529.SmartStockSelection --query "筛选ROE>15%的消费股"`,`bl mcp call market-cmapi00073529.FinQuery --json '{"q":"贵州茅台","limit":5}'`,`bl mcp call market-cmapi00073529.SmartFundSelection --arg riskLevel=R3 --arg minScale=10`],async run(e,t){let n=(t._positional??[])[0];n||V(`<server-code>.<tool>`,`bl mcp call <server-code>.<tool>`);let r=n.indexOf(`.`);(r<=0||r===n.length-1)&&(process.stderr.write(`Error: target must be <server-code>.<tool>, got "${n}".\n`),process.exit(1));let i=n.slice(0,r),a=n.slice(r+1),s={};if(t.json)try{let e=JSON.parse(t.json);(!e||typeof e!=`object`||Array.isArray(e))&&(process.stderr.write(`Error: --json must decode to an object.
153
+ `),n.rerankTopN=n.topK),n.rerank&&(u.EnableReranking=!0),n.rerankTopN!==void 0&&(u.RerankTopN=n.rerankTopN),n.denseSimilarityTopK!==void 0&&(u.DenseSimilarityTopK=n.denseSimilarityTopK),n.sparseSimilarityTopK!==void 0&&(u.SparseSimilarityTopK=n.sparseSimilarityTopK),n.rerankModel){let e={ModelName:n.rerankModel};n.rerankMode&&(e.RerankMode=n.rerankMode),n.rerankInstruct&&(e.RerankInstruct=n.rerankInstruct),u.Rerank=[e]}let d=`/${l}/index/retrieve`;if(e.dryRun){P({endpoint:`https://${Ro}${d}`,workspaceId:l,request:u},o);return}let f=JSON.stringify(u),p=_e({accessKeyId:s,accessKeySecret:c,action:`Retrieve`,version:`2023-12-29`,body:f,host:Ro,pathname:d}),m=`https://${Ro}${d}`;e.verbose&&(process.stderr.write(`> POST ${m}\n`),process.stderr.write(`> AK: ${O(s)}\n`));let h=e.timeout*1e3,g=await fetch(m,{method:`POST`,headers:{...p,...Ce()},body:f,signal:AbortSignal.timeout(h)});e.verbose&&process.stderr.write(`< ${g.status} ${g.statusText}\n`);let _=await g.json();if(!g.ok||_.Code&&_.Code!==`Success`)throw new t(`Knowledge retrieve failed: ${_.Code||g.status} - ${_.Message||g.statusText}`,i.GENERAL);let v=_.Data?.Nodes||[];e.quiet||o===`text`?Lo(v.map(e=>({text:e.Text,score:e.Score}))):P(_,o)}function Lo(e){if(e.length===0)F(`No results found.`);else for(let t=0;t<e.length;t++){let n=e[t];F(`[${t+1}] (score: ${n.score.toFixed(4)})`),F(n.text),F(``)}}var Ro,zo,Bo=M((()=>{H(),I(),Ro=`bailian.cn-beijing.aliyuncs.com`,zo=m({name:`knowledge retrieve`,description:`Retrieve from a Bailian knowledge base`,usage:`bl knowledge retrieve --index-id <id> --query <text> [flags]`,options:[{flag:`--index-id <id>`,description:`Knowledge base index ID (required)`,required:!0},{flag:`--query <text>`,description:`Search query (required)`,required:!0},{flag:`--dense-similarity-top-k <n>`,description:`Dense retrieval top K`,type:`number`},{flag:`--sparse-similarity-top-k <n>`,description:`Sparse retrieval top K`,type:`number`},{flag:`--rerank`,description:`Enable reranking`},{flag:`--rerank-top-n <n>`,description:`Rerank top N results`,type:`number`},{flag:`--rerank-model <name>`,description:`Rerank model, e.g. qwen3-rerank-hybrid`},{flag:`--rerank-mode <mode>`,description:`Rerank mode: qa, similar, or custom`},{flag:`--rerank-instruct <text>`,description:`Custom rerank instruction, when mode=custom`},{flag:`--top-k <n>`,description:`Number of results (deprecated, use --rerank-top-n)`,type:`number`},{flag:`--workspace-id <id>`,description:`Bailian workspace ID (only needed for deprecated AK/SK auth)`},{flag:`--access-key-id <key>`,description:`Deprecated: use global --api-key instead`},{flag:`--access-key-secret <key>`,description:`Deprecated: use global --api-key instead`}],notes:["Authentication: pass `--api-key <key>`. AK/SK auth is deprecated and will be removed in a future version.","`--workspace-id` is NOT required when using --api-key."],examples:[`bl knowledge retrieve --index-id idx_xxx --query "如何使用阿里云百炼"`,`bl knowledge retrieve --api-key $DASHSCOPE_API_KEY --index-id idx_xxx --query "RAG检索" --rerank --rerank-model qwen3-rerank-hybrid`],async run(e,t){let n=t.indexId;n||V(`index-id`,`bl knowledge retrieve --index-id <id> --query <text>`);let r=t.query;r||V(`query`,`bl knowledge retrieve --index-id <id> --query <text>`);let i=h(e.output),a=!!e.apiKey,o=!!(t.accessKeyId&&t.accessKeySecret);if(a)await Fo(e,t,n,r,i);else if(o)await Io(e,t,n,r,i);else{let a=!1;try{await A(e),a=!0}catch{}a?await Fo(e,t,n,r,i):await Io(e,t,n,r,i)}}})}));async function Vo(e){if(e.apiKey||e.fileApiKey||e.accessTokenEnv||e.fileAccessToken)return;let n=process.env.DASHSCOPE_API_KEY,r;if(n&&(E({nonInteractive:e.nonInteractive})?await Yr({message:`Found DASHSCOPE_API_KEY in environment (${O(n)}). Save it to config file?`})&&(r=n):r=n),!r){if(!E({nonInteractive:e.nonInteractive}))throw new t(`No API key found.`,i.AUTH,`Set DASHSCOPE_API_KEY environment variable, pass --api-key, or run interactively to be prompted.`);let n=await Jr({message:`Enter your DashScope API key:`});if(!n)throw new t(`API key is required.`,i.AUTH);r=n}await De({...ue(),api_key:r}),e.fileApiKey=r;let a=e.configPath??`~/.bailian/config.json`;process.stderr.write(`API key saved to ${a}\n`)}var Ho=M((()=>{H()}));function Uo(e){let t={};for(let n of e){let e=n.indexOf(`=`);e<=0&&(process.stderr.write(`Error: --arg must be in K=V form, got: ${n}\n`),process.exit(1));let r=n.slice(0,e).trim(),i=n.slice(e+1);try{t[r]=JSON.parse(i)}catch{t[r]=i}}return t}var Wo,Go=M((()=>{H(),I(),Ho(),Wo=m({name:`mcp call`,description:`Call a tool on an MCP server (tools/call)`,usage:`bl mcp call <server-code>.<tool> [--arg k=v ...] [--json '{...}'] [--url <url>]`,options:[{flag:`<server-code>.<tool>`,description:`Server code and tool name joined by a dot, e.g. market-cmapi00073529.SmartStockSelection`,required:!0},{flag:`--arg <kv>`,description:`Tool argument (repeatable). Values parsed as JSON if possible, else string.`,type:`array`},{flag:`--json <obj>`,description:`Full arguments object as JSON; merged with --arg (arg wins).`},{flag:`--query <text>`,description:`Shortcut for --arg query=<text> (mirrors many DashScope MCP tools).`},{flag:`--url <url>`,description:`Override the MCP endpoint URL (for non-Bailian servers)`}],examples:[`bl mcp call market-cmapi00073529.SmartStockSelection --query "筛选ROE>15%的消费股"`,`bl mcp call market-cmapi00073529.FinQuery --json '{"q":"贵州茅台","limit":5}'`,`bl mcp call market-cmapi00073529.SmartFundSelection --arg riskLevel=R3 --arg minScale=10`],async run(e,t){let n=(t._positional??[])[0];n||V(`<server-code>.<tool>`,`bl mcp call <server-code>.<tool>`);let r=n.indexOf(`.`);(r<=0||r===n.length-1)&&(process.stderr.write(`Error: target must be <server-code>.<tool>, got "${n}".\n`),process.exit(1));let i=n.slice(0,r),a=n.slice(r+1),s={};if(t.json)try{let e=JSON.parse(t.json);(!e||typeof e!=`object`||Array.isArray(e))&&(process.stderr.write(`Error: --json must decode to an object.
154
154
  `),process.exit(1)),s=e}catch(e){process.stderr.write(`Error: --json is not valid JSON — ${e.message}\n`),process.exit(1)}Object.assign(s,Uo(t.arg??[])),t.query!==void 0&&(s.query=t.query);let c=t.url||l(e.baseUrl,i),u=h(e.output);if(e.dryRun){P({server:i,url:c,tool:a,arguments:s},u);return}await Vo(e);let d=new o(e,c);await d.initialize();let f=await d.callTool(a,s);if(f.isError){let e=f.content.map(e=>e.text||``).join(`
155
155
  `);process.stderr.write(`Tool error: ${e}\n`),process.exit(1)}P(f,u)}})})),Ko,qo,Jo=M((()=>{I(),Ko=`zeldaEasy.broadscope-bailian.mcp-server.PageList`,qo=m({name:`mcp list`,description:`List MCP servers activated under your Bailian account`,usage:`bl mcp list [flags]`,options:[{flag:`--name <text>`,description:`Filter by server name (substring match)`},{flag:`--type <type>`,description:`Server type: OFFICIAL | PRIVATE (default: OFFICIAL)`},{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 30)`,type:`number`},{flag:`--region <region>`,description:`API region (default: cn-beijing)`}],examples:[`bl mcp list`,`bl mcp list --name 金融`,`bl mcp list --output json`],async run(e,n){let r=n.name||``,a=n.type||`OFFICIAL`,o=n.page||1,s=n.pageSize||30,c=n.region||`cn-beijing`,l=h(e.output),u={reqDTO:{type:a,displayTools:!1,activated:1,pageNo:o,pageSize:s,serverName:r}};if(e.dryRun){P({api:Ko,data:u,region:c},l);return}let f=(await d(e,(await me(e)).token,{api:Ko,data:u,region:c}))?.data??{};if(f.success===!1){let e=f.errorCode??`UnknownError`,n=f.errorMsg??e,r=e===`BailianGateway.Login.NotLogined`?"Run `bl auth login --console` to refresh your console session.":void 0;throw new t(`Console gateway: ${n}`,i.AUTH,r)}let p=(f.DataV2??{}).data?.data??{},m=p.mcpServerDetailList??[];P({total:p.total??0,servers:m.map(e=>({code:e.serverCode??``,name:e.serverName??``,description:e.description,type:e.type??``,source:e.source,bizType:e.bizType,installType:e.installType,streamable:e.streamable===!0}))},l)}})})),Yo,Xo=M((()=>{H(),I(),Ho(),Yo=m({name:`mcp tools`,description:`List tools exposed by an MCP server (tools/list)`,usage:`bl mcp tools <server-code> [--url <url>]`,options:[{flag:`<server-code>`,description:"Server code from `bl mcp list` (e.g. market-cmapi00073529)",required:!0},{flag:`--url <url>`,description:`Override the MCP endpoint URL (for non-Bailian servers)`}],examples:[`bl mcp tools market-cmapi00073529`,`bl mcp tools market-cmapi00073529 --output json`,`bl mcp tools my-server --url https://example.com/mcp`],async run(e,t){let n=(t._positional??[])[0];n||V(`server-code`,`bl mcp tools <server-code>`);let r=t.url||l(e.baseUrl,n),i=h(e.output);if(e.dryRun){P({server:n,url:r,action:`tools/list`},i);return}await Vo(e);let a=new o(e,r);await a.initialize(),P({server:n,url:r,tools:await a.listTools()},i)}})})),Zo,Qo=M((()=>{Ki(),H(),I(),Zo=m({name:`search web`,description:`Search the web using DashScope MCP WebSearch service`,usage:`bl search web --query <text> [flags]`,options:[{flag:`--query <text>`,description:`Search query text`,required:!0},{flag:`--count <n>`,description:`Number of search results (default: 10)`,type:`number`},{flag:`--list-tools`,description:`List available MCP tools and exit`}],examples:[`bl search web --query "阿里云百炼最新功能"`,`bl search web --query "TypeScript 5.9 new features" --count 5`,`bl search web --query "今日新闻"`,`bl search web --list-tools`],async run(e,t){let n=ne(e.baseUrl),r=h(e.output);if(t.listTools){if(e.dryRun){P({endpoint:n,action:`tools/list`},r);return}let t=new o(e,n);await t.initialize(),P({tools:await t.listTools()},r);return}let i=t.query;if(!i)if(E({nonInteractive:e.nonInteractive})){let e=await Jr({message:`Enter your search query:`});e||(process.stderr.write(`Search cancelled.
156
156
  `),process.exit(1)),i=e}else V(`query`,`bl search web --query <text>`);if(e.dryRun){P({endpoint:n,action:`tools/call`,tool:`bailian_web_search`,arguments:{query:i,count:t.count||void 0}},r);return}let a=new o(e,n),s=Ui(`Initializing search...`);e.quiet||s.start();try{await a.initialize(),e.quiet||s.update(`Searching...`);let n={query:i};t.count&&(n.count=t.count);let o=await a.callTool(`bailian_web_search`,n);if(e.quiet||s.stop(`Done.`),o.isError){let e=o.content.map(e=>e.text||``).join(`
@@ -382,7 +382,7 @@ ${o}
382
382
  ${n(`Getting Help:`)}
383
383
  ${i(`Add --help after any command to see its full list of options, defaults,`)}
384
384
  ${i(`and usage examples. For example:`)} bl text chat --help
385
- `)}printCommandHelp(e,t){let n=e=>this.bold(e,t),r=e=>this.accent(e,t),i=e=>this.dim(e,t);if(t.write(`\n${e.description}\n`),e.usage&&t.write(`${n(`Usage:`)} ${e.usage}\n`),e.options&&e.options.length>0){let a=Math.max(...e.options.map(e=>e.flag.length));t.write(`\n${n(`Options:`)}\n`);for(let n of e.options)t.write(` ${r(n.flag.padEnd(a+2))} ${i(n.description)}\n`)}if(e.examples&&e.examples.length>0){t.write(`\n${n(`Examples:`)}\n`);for(let n of e.examples)t.write(` ${i(n)}\n`)}t.write(`\n${i(`Global flags (--api-key, --output, --quiet, etc.) are always available.`)}\n`),t.write(`${i(`Run`)} bl --help ${i(`for the full list.`)}\n`)}printChildren(e,t,n){let r=[],i=(e,t)=>{for(let[n,a]of e.children)a.command&&r.push({fullName:`${t} ${n}`,description:a.command.description}),a.children.size>0&&i(a,`${t} ${n}`)};i(e,t);let a=Math.max(...r.map(e=>e.fullName.length));for(let{fullName:e,description:t}of r)n.write(` ${this.accent(e.padEnd(a),n)} ${this.dim(t,n)}\n`)}}(Sm);function Tm(e,...t){for(let n of t){let t=e[n]?.trim();if(t)return t}}function Em(e=process.env){return{httpProxy:Tm(e,`http_proxy`,`HTTP_PROXY`),httpsProxy:Tm(e,`https_proxy`,`HTTPS_PROXY`),noProxy:Tm(e,`no_proxy`,`NO_PROXY`)}}function Dm(){let{httpProxy:e,httpsProxy:n,noProxy:r}=Em();if(!(!e&&!n))try{it(new rt({httpProxy:e,httpsProxy:n,noProxy:r}))}catch(e){throw new t(`Invalid proxy configuration: ${e instanceof Error?e.message:String(e)}`,i.USAGE,`Check HTTP_PROXY / HTTPS_PROXY values, e.g. export HTTPS_PROXY=http://127.0.0.1:7890`,{cause:e})}}Et();function Om(e){return e.padEnd(13)}function km(e){return e.split(`
385
+ `)}printCommandHelp(e,t){let n=e=>this.bold(e,t),r=e=>this.accent(e,t),i=e=>this.dim(e,t);if(t.write(`\n${e.description}\n`),e.usage&&t.write(`${n(`Usage:`)} ${e.usage}\n`),e.options&&e.options.length>0){let a=Math.max(...e.options.map(e=>e.flag.length));t.write(`\n${n(`Options:`)}\n`);for(let n of e.options)t.write(` ${r(n.flag.padEnd(a+2))} ${i(n.description)}\n`)}if(e.notes&&e.notes.length>0){t.write(`\n${n(`Notes:`)}\n`);for(let n of e.notes)t.write(` ${n}\n`)}if(e.examples&&e.examples.length>0){t.write(`\n${n(`Examples:`)}\n`);for(let n of e.examples)t.write(` ${i(n)}\n`)}t.write(`\n${i(`Global flags (--api-key, --output, --quiet, etc.) are always available.`)}\n`),t.write(`${i(`Run`)} bl --help ${i(`for the full list.`)}\n`)}printChildren(e,t,n){let r=[],i=(e,t)=>{for(let[n,a]of e.children)a.command&&r.push({fullName:`${t} ${n}`,description:a.command.description}),a.children.size>0&&i(a,`${t} ${n}`)};i(e,t);let a=Math.max(...r.map(e=>e.fullName.length));for(let{fullName:e,description:t}of r)n.write(` ${this.accent(e.padEnd(a),n)} ${this.dim(t,n)}\n`)}}(Sm);function Tm(e,...t){for(let n of t){let t=e[n]?.trim();if(t)return t}}function Em(e=process.env){return{httpProxy:Tm(e,`http_proxy`,`HTTP_PROXY`),httpsProxy:Tm(e,`https_proxy`,`HTTPS_PROXY`),noProxy:Tm(e,`no_proxy`,`NO_PROXY`)}}function Dm(){let{httpProxy:e,httpsProxy:n,noProxy:r}=Em();if(!(!e&&!n))try{it(new rt({httpProxy:e,httpsProxy:n,noProxy:r}))}catch(e){throw new t(`Invalid proxy configuration: ${e instanceof Error?e.message:String(e)}`,i.USAGE,`Check HTTP_PROXY / HTTPS_PROXY values, e.g. export HTTPS_PROXY=http://127.0.0.1:7890`,{cause:e})}}Et();function Om(e){return e.padEnd(13)}function km(e){return e.split(`
386
386
  `).map((e,t)=>t===0?e:` `.repeat(13)+e).join(`
387
387
  `)}function Am(e){return e.exitCode===i.AUTH?e.message===n?e.hint:[e.hint,``,`bl auth login --api-key <your-key>`,`bl auth status`,`Get API Key: ${Tt}`].filter(e=>e!==void 0).join(`
388
388
  `):e.hint}function jm(e=process.argv.slice(2),t=process.env.DASHSCOPE_OUTPUT){for(let n=0;n<e.length;n++){let r=e[n];if(r===`--output`)return h(e[n+1]||t);if(r?.startsWith(`--output=`))return h(r.slice(9))}return h(t)}function Mm(e){let n=e.cause,r=n?.code,a=n?.message,o=[];return r&&o.push(r),a&&a!==r&&o.push(a),new t(`Network request failed: ${o.length>0?o.join(`: `):`unknown cause`}`,i.NETWORK,Nm(r),{cause:e})}function Nm(e){switch(e){case`ENOTFOUND`:case`EAI_AGAIN`:return`DNS resolution failed. Check DASHSCOPE_BASE_URL or your DNS / network.`;case`ECONNREFUSED`:return`Connection refused. Check the target host/port and proxy settings.`;case`ECONNRESET`:return`Connection reset by peer. Retry, or check proxy / firewall.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bailian-cli",
3
- "version": "1.3.2",
3
+ "version": "1.3.3",
4
4
  "description": "CLI for Aliyun Model Studio (DashScope) AI Platform.",
5
5
  "keywords": [
6
6
  "agent",
@@ -39,7 +39,7 @@
39
39
  "boxen": "^8.0.1",
40
40
  "chalk": "^5.6.2",
41
41
  "undici": "^8.4.1",
42
- "bailian-cli-core": "1.3.2"
42
+ "bailian-cli-core": "1.3.3"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@clack/prompts": "^0.7.0",