bailian-cli-commands 1.10.0 → 1.11.0

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/index.mjs CHANGED
@@ -1,31 +1,31 @@
1
- import{ASYNC_FLAG as e,BailianError as t,CONCURRENT_FLAG as n,DEFAULT_TRAINING_TYPE as r,DOCS_HOSTS as i,ExitCode as a,MAX_DATASET_BYTES as o,MAX_MEDIA_ZIP_BYTES as s,MODEL_LIST_API as c,REGIONS as l,SEMANTIC_TOP_K as u,STRATEGIES as d,TRAINING_TYPES_CLI as f,UsageError as p,analyzeIntent as m,appCompletionPath as h,bailianMcpPath as g,buildAcsCanonicalQuery as _,buildDocLink as v,callConsoleGateway as y,cancelFineTune as b,chatPath as x,createBailianControlUser as S,createDeployment as C,createFineTune as ee,defaultDeployPlan as te,defineCommand as w,deleteConfigProfile as ne,deleteDataset as re,deleteDeployment as ie,deleteFineTune as ae,detectModality as oe,detectOutputFormat as T,effectiveConsoleGatewayConfig as se,exportCheckpoint as ce,fetchModelCapability as le,fetchModelDetail as ue,fetchModelGroups as de,fetchModelList as E,fetchPredictConfig as fe,formatIssue as D,generateCLIAccessToken as pe,generateFilename as me,getConfigDir as he,getDataset as ge,getDeployment as _e,getFineTune as ve,getFineTuneLogs as ye,getModelProfilePreset as be,getModels as xe,getProfile as Se,imagePath as Ce,imageSyncPath as we,isLocalFile as Te,isTrainingTypeCli as Ee,knowledgeChatEndpoint as De,knowledgeRetrievePath as Oe,knowledgeSearchEndpoint as ke,listBailianControlWorkspaces as Ae,listCheckpoints as je,listDatasets as Me,listDeployableModels as Ne,listDeployments as Pe,listFineTunes as Fe,listSupportedTrainingTypes as Ie,maskToken as O,mcpWebSearchPath as Le,memoryAddPath as Re,memoryListPath as ze,memoryNodePath as Be,memorySearchPath as Ve,modelSupportsTrainingType as He,normalizeConfigName as Ue,normalizeModelBaseUrl as We,parseDatasetSchemaFlag as Ge,parseSSE as k,pickPlanStrategy as Ke,preflightBatchSizeGate as qe,profileSchemaPath as Je,rankModels as Ye,readConfigFile as Xe,readTextFromPathOrStdin as Ze,recallSemantic as Qe,requestJson as $e,resetBailianControlPolicies4Agent as et,resolveBooleanFlag as tt,resolveOutputDir as A,resolveWatermark as nt,scaleDeployment as rt,speechRecognizePath as it,speechSynthesizePath as at,stripUndefined as ot,taskPath as j,trackingHeaders as st,trainingTypeMethodVariant as ct,unwrapResponse as lt,updateDeployment as ut,uploadDataset as dt,userProfilePath as ft,validateDataset as pt,videoGeneratePath as mt,writeConfigFile as ht}from"bailian-cli-core";import{API_KEY_PAGE as gt,BOOL_FLAG_PROMPT_EXTEND_API_DEFAULT as _t,BOOL_FLAG_PROMPT_EXTEND_CLI_TRUE as vt,BOOL_FLAG_PROMPT_EXTEND_IMAGE_GENERATE as yt,BOOL_FLAG_WATERMARK as bt,VOICE_TTS_PAGE as xt,ansi as M,collectPipelineHints as St,collectPipelineIssues as Ct,createSpinner as wt,displayWidth as N,downloadFile as P,downloadParallel as Tt,emitBare as F,emitResult as I,executePipeline as Et,fetchLatestVersion as Dt,formatBytes as Ot,formatTable as L,getConcurrency as R,initPipelineSteps as kt,padEnd as z,poll as B,renderBoxTable as At,resolveImageSize as jt,runConcurrent as V,streamPipelineEvents as Mt,supportsColor as Nt}from"bailian-cli-runtime";import{randomBytes as Pt}from"node:crypto";import Ft from"node:http";import{execFile as It}from"node:child_process";import{copyFileSync as Lt,createWriteStream as Rt,existsSync as H,mkdirSync as zt,readFileSync as U,renameSync as Bt,statSync as Vt,writeFileSync as Ht}from"fs";import{basename as Ut,dirname as Wt,extname as Gt,join as W}from"path";import{homedir as G,platform as Kt}from"os";import qt from"yaml";import{parse as Jt,stringify as Yt}from"smol-toml";import{execSync as Xt}from"child_process";import{readFile as Zt}from"node:fs/promises";import{dirname as Qt,extname as $t,resolve as en}from"node:path";import tn from"boxen";import nn,{Chalk as rn}from"chalk";function an(e){if(e instanceof t){if(e.exitCode===a.NETWORK||e.exitCode===a.TIMEOUT)return!0;let t=e.api?.httpStatus;return t===401||t!==void 0&&t>=500}return e instanceof Error?e.name===`AbortError`||e.name===`TimeoutError`||e.message.includes(`timed out`)||e.message===`fetch failed`:!1}async function on(e,t,n){process.stderr.write(`Testing key... `);let r={identity:e.identity,settings:e.settings},i=We(n.baseUrl),a=n.persistBaseUrl?We(n.persistBaseUrl):void 0,o={url:i+x(),method:`POST`,headers:{Authorization:`Bearer ${t}`},timeout:Math.min(e.settings.timeout,30),body:{model:n.defaultTextModel||`qwen3.7-max`,messages:[{role:`user`,content:`hi`}],max_tokens:1,stream:!1,enable_thinking:!1}};for(let e=1;e<=3;e++)try{await $e(r,o);break}catch(t){if(e>=3||!an(t))throw process.stderr.write(`Failed
1
+ import{ASYNC_FLAG as e,BailianError as t,CONCURRENT_FLAG as n,DEFAULT_TRAINING_TYPE as r,DOCS_HOSTS as i,ExitCode as a,MAX_DATASET_BYTES as o,MAX_MEDIA_ZIP_BYTES as s,MODEL_LIST_API as c,REGIONS as l,SEMANTIC_TOP_K as u,STRATEGIES as d,TRAINING_TYPES_CLI as f,UsageError as p,analyzeIntent as m,appCompletionPath as h,bailianMcpPath as g,buildAcsCanonicalQuery as _,buildDocLink as v,callConsoleGateway as y,cancelFineTune as b,chatPath as x,createBailianControlUser as S,createDeployment as C,createFineTune as ee,createInstrumentedFetch as te,defaultDeployPlan as w,defineCommand as T,deleteConfigProfile as ne,deleteDataset as re,deleteDeployment as ie,deleteFineTune as ae,detectModality as oe,detectOutputFormat as E,effectiveConsoleGatewayConfig as se,exportCheckpoint as ce,fetchModelCapability as le,fetchModelDetail as ue,fetchModelGroups as de,fetchModelList as fe,fetchPredictConfig as pe,formatIssue as me,generateCLIAccessToken as he,generateFilename as ge,getConfigDir as _e,getDataset as ve,getDeployment as ye,getFineTune as be,getFineTuneLogs as xe,getModelProfilePreset as Se,getModels as Ce,getProfile as we,imageFileToDataUri as Te,imagePath as Ee,imageSyncPath as De,isLocalFile as Oe,isTrainingTypeCli as ke,knowledgeChatEndpoint as Ae,knowledgeRetrievePath as je,knowledgeSearchEndpoint as Me,listBailianControlWorkspaces as Ne,listCheckpoints as Pe,listDatasets as Fe,listDeployableModels as Ie,listDeployments as Le,listFineTunes as Re,listSupportedTrainingTypes as ze,mapApiError as Be,maskToken as D,mcpWebSearchPath as Ve,memoryAddPath as He,memoryListPath as Ue,memoryNodePath as We,memorySearchPath as Ge,modelSupportsTrainingType as Ke,normalizeConfigName as qe,normalizeModelBaseUrl as Je,parseDatasetSchemaFlag as Ye,parseSSE as O,pickPlanStrategy as Xe,preflightBatchSizeGate as Ze,profileSchemaPath as Qe,rankModels as $e,readConfigFile as et,readTextFromPathOrStdin as tt,recallSemantic as nt,redactDataUri as k,requestJson as rt,resetBailianControlPolicies4Agent as it,resolveBooleanFlag as at,resolveOutputDir as A,resolveWatermark as ot,scaleDeployment as st,speechRecognizePath as ct,speechSynthesizePath as lt,stripUndefined as ut,taskPath as j,trackingHeaders as dt,trainingTypeMethodVariant as ft,unwrapResponse as pt,updateDeployment as mt,uploadDataset as ht,userProfilePath as gt,validateDataset as _t,videoGeneratePath as vt,writeConfigFile as yt}from"bailian-cli-core";import{API_KEY_PAGE as bt,BOOL_FLAG_PROMPT_EXTEND_API_DEFAULT as xt,BOOL_FLAG_PROMPT_EXTEND_CLI_TRUE as St,BOOL_FLAG_PROMPT_EXTEND_IMAGE_GENERATE as Ct,BOOL_FLAG_WATERMARK as wt,VOICE_TTS_PAGE as Tt,ansi as M,collectPipelineHints as Et,collectPipelineIssues as Dt,createSpinner as Ot,displayWidth as N,downloadFile as P,downloadParallel as kt,emitBare as F,emitResult as I,executePipeline as At,fetchLatestVersion as jt,formatBytes as Mt,formatTable as L,getConcurrency as R,initPipelineSteps as Nt,padEnd as z,poll as Pt,renderBoxTable as Ft,resolveImageSize as It,runConcurrent as B,streamPipelineEvents as Lt,supportsColor as Rt}from"bailian-cli-runtime";import{randomBytes as zt}from"node:crypto";import Bt from"node:http";import{execFile as Vt}from"node:child_process";import{copyFileSync as Ht,createWriteStream as Ut,existsSync as Wt,mkdirSync as Gt,readFileSync as Kt,renameSync as qt,statSync as Jt,writeFileSync as Yt}from"fs";import{basename as Xt,dirname as Zt,extname as Qt,join as V}from"path";import{homedir as H,platform as $t}from"os";import en from"yaml";import{parse as tn,stringify as nn}from"smol-toml";import{execSync as rn}from"child_process";import{readFile as an,writeFile as on}from"node:fs/promises";import{basename as sn,dirname as cn,extname as ln,resolve as un}from"node:path";import dn from"boxen";import fn,{Chalk as pn}from"chalk";import{existsSync as mn}from"node:fs";import*as hn from"@openagentpack/sdk";import{AGENTS_PROVIDER_FIELDS as gn,LocalFileStateBackend as _n,StateManager as vn,UserError as yn,bootstrapRuntimeCredentialsSync as bn,createProjectRuntime as xn,createSessionForAgent as Sn,deleteSession as Cn,destroyPlannedProjectResources as wn,executePlannedProject as Tn,getSession as En,importResource as Dn,isTerminalSessionStatus as On,listSessionEvents as kn,listSessionSummaries as An,listSkills as jn,parseStateAddress as Mn,planDestroyProjectContext as Nn,planProjectContext as Pn,resolveProjectConfig as Fn,sendSessionMessagePolling as In,sendSessionMessageStreaming as Ln,startSessionRun as Rn,startSessionRunPolling as zn,validateProjectConfig as Bn}from"@openagentpack/sdk";import{sanitizeSessionEvents as Vn}from"@openagentpack/sdk/session-events";function Hn(e){if(e instanceof t){if(e.exitCode===a.NETWORK||e.exitCode===a.TIMEOUT)return!0;let t=e.api?.httpStatus;return t===401||t!==void 0&&t>=500}return e instanceof Error?e.name===`AbortError`||e.name===`TimeoutError`||e.message.includes(`timed out`)||e.message===`fetch failed`:!1}async function Un(e,t,n){process.stderr.write(`Testing key... `);let r={identity:e.identity,settings:e.settings},i=Je(n.baseUrl),a=n.persistBaseUrl?Je(n.persistBaseUrl):void 0,o=n.defaultTextModel||`qwen3.7-max`,s={url:i+x(),method:`POST`,headers:{Authorization:`Bearer ${t}`},timeout:Math.min(e.settings.timeout,30),body:{model:o,messages:[{role:`user`,content:`hi`}],max_tokens:1,stream:!1,enable_thinking:o===`qwen3.8-max-preview`}};for(let e=1;e<=3;e++)try{await rt(r,s);break}catch(t){if(e>=3||!Hn(t))throw process.stderr.write(`Failed
2
2
  `),t;let n=500*2**(e-1);await new Promise(e=>setTimeout(e,n))}process.stderr.write(`Valid
3
- `),await e.authStore.login({...n.persistPatch,api_key:t,base_url:a,default_text_model:n.defaultTextModel,default_image_model:n.defaultImageModel})}function sn(e,t=0){return new Promise((n,r)=>{let i=e=>r(e);e.once(`error`,i),e.listen({port:t,host:`127.0.0.1`,exclusive:!0},()=>{e.off(`error`,i);let t=e.address();if(!t||typeof t==`string`){r(Error(`Expected TCP socket address`));return}n(t.port)})})}function cn(e){let t=process.platform,n=t===`darwin`?`open`:t===`win32`?`cmd`:`xdg-open`,r=t===`win32`?[`/c`,`start`,``,e]:[e];return new Promise((e,t)=>{It(n,r,{windowsHide:!0},n=>{n?t(n):e()})})}const ln=RegExp(`\r
3
+ `),await e.authStore.login({...n.persistPatch,api_key:t,base_url:a,default_text_model:n.defaultTextModel,default_video_model:n.defaultVideoModel,default_image_to_video_model:n.defaultImageToVideoModel,default_reference_to_video_model:n.defaultReferenceToVideoModel,default_image_model:n.defaultImageModel})}function Wn(e,t=0){return new Promise((n,r)=>{let i=e=>r(e);e.once(`error`,i),e.listen({port:t,host:`127.0.0.1`,exclusive:!0},()=>{e.off(`error`,i);let t=e.address();if(!t||typeof t==`string`){r(Error(`Expected TCP socket address`));return}n(t.port)})})}function Gn(e){let t=process.platform,n=t===`darwin`?`open`:t===`win32`?`cmd`:`xdg-open`,r=t===`win32`?[`/c`,`start`,``,e]:[e];return new Promise((e,t)=>{Vt(n,r,{windowsHide:!0},n=>{n?t(n):e()})})}const Kn=RegExp(`\r
4
4
  \r
5
5
  |
6
6
 
7
- `),un={domestic:`https://bailian.console.aliyun.com`,international:`https://modelstudio.console.alibabacloud.com`};function dn(e){return e&&un[e]||un.domestic}function fn(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,e=>{if(r+=e.length,r>65536){n(Error(`payload too large`));return}i.push(e)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function pn(e){let t=e.headers[`content-type`];return Array.isArray(t)?t[0]??``:typeof t==`string`?t:``}function mn(e){let t=e.split(`;`);for(let e of t){let t=e.trim();if(!t.toLowerCase().startsWith(`boundary=`))continue;let n=t.slice(9).trim();return(n.startsWith(`"`)&&n.endsWith(`"`)||n.startsWith(`'`)&&n.endsWith(`'`))&&(n=n.slice(1,-1)),n.length>0?n:null}return null}function hn(e,t){let n=`--${t}`,r=e.split(n);for(let e=1;e<r.length;e++){let t=r[e];if(!/name\s*=\s*["'](?:access_token|accessToken)["']/i.test(t))continue;let n=t.match(ln);if(!n||n.index===void 0)continue;let i=t.slice(n.index+n[0].length);if(i=i.replace(/(?:\r\n)+$/g,``).replace(/\n+$/g,``).trim(),i)return i}return null}function gn(e){for(let t of[`access_token`,`accessToken`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function _n(e){for(let t of[`api_key`,`apiKey`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function vn(e){let t=e.trim();if(t.charCodeAt(0)===65279&&(t=t.slice(1)),!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(!n||typeof n!=`object`||Array.isArray(n))return null;let r=n,i=gn(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=gn(a);if(e)return e}return null}function yn(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`multipart/form-data`)){let n=mn(t);if(n){let t=hn(e,n);if(t)return t}}if(n.includes(`application/json`)||n.includes(`text/json`)){let t=vn(e);if(t)return t}if(n.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim()),n=t.get(`access_token`)??t.get(`accessToken`);if(n?.trim())return n.trim()}catch{}let r=vn(e);if(r)return r;try{let t=new URLSearchParams(e.trim()),n=t.get(`access_token`)??t.get(`accessToken`);if(n?.trim())return n.trim()}catch{}let i=mn(t);if(i){let t=hn(e,i);if(t)return t}return null}function bn(e){let t=e.trim();if(t.charCodeAt(0)===65279&&(t=t.slice(1)),!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(!n||typeof n!=`object`||Array.isArray(n))return null;let r=n,i=_n(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=_n(a);if(e)return e}return null}function xn(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`application/json`)||n.includes(`text/json`)){let t=bn(e);if(t)return t}if(n.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim()),n=t.get(`api_key`)??t.get(`apiKey`);if(n?.trim())return n.trim()}catch{}let r=bn(e);if(r)return r;try{let t=new URLSearchParams(e.trim()),n=t.get(`api_key`)??t.get(`apiKey`);if(n?.trim())return n.trim()}catch{}return null}function Sn(e,...t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t.trim()}return null}function Cn(e,t){let n={baseUrl:null,consoleSite:null,consoleRegion:null,consoleSwitchAgent:null,workspaceId:null};if(!e.trim())return n;let r=null,i=t.toLowerCase();if(i.includes(`application/json`)||i.includes(`text/json`))try{let t=JSON.parse(e.trim());t&&typeof t==`object`&&!Array.isArray(t)&&(r=t)}catch{}if(!r&&i.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim());r=Object.fromEntries(t)}catch{}if(!r)try{let t=JSON.parse(e.trim());t&&typeof t==`object`&&!Array.isArray(t)&&(r=t)}catch{}return r?{baseUrl:Sn(r,`base_url`,`baseUrl`),consoleSite:Sn(r,`console_site`,`consoleSite`),consoleRegion:Sn(r,`console_region`,`consoleRegion`),consoleSwitchAgent:Sn(r,`console_switch_agent`,`consoleSwitchAgent`),workspaceId:Sn(r,`workspace_id`,`workspaceId`)}:n}async function wn(e){let t=new URL(e.url??`/`,`http://127.0.0.1`),n=t.searchParams.get(`access_token`)??t.searchParams.get(`accessToken`),r=t.searchParams.get(`api_key`)??t.searchParams.get(`apiKey`),i=t.searchParams.get(`base_url`)??t.searchParams.get(`baseUrl`),a=t.searchParams.get(`console_site`)??t.searchParams.get(`consoleSite`),o=t.searchParams.get(`console_region`)??t.searchParams.get(`consoleRegion`),s=t.searchParams.get(`console_switch_agent`)??t.searchParams.get(`consoleSwitchAgent`),c=t.searchParams.get(`workspace_id`)??t.searchParams.get(`workspaceId`),l={baseUrl:i?.trim()||null,consoleSite:a?.trim()||null,consoleRegion:o?.trim()||null,consoleSwitchAgent:s?.trim()||null,workspaceId:c?.trim()||null},u=e.method??`GET`;if(u!==`POST`&&u!==`PUT`&&u!==`PATCH`)return{accessToken:n?.trim()||null,apiKey:r?.trim()||null,...l};let d=pn(e),f;try{f=await fn(e)}catch{return{accessToken:n?.trim()||null,apiKey:r?.trim()||null,...l}}let p=n?.trim()||yn(f,d),m=r?.trim()||xn(f,d),h=Cn(f,d);return{accessToken:p,apiKey:m,baseUrl:l.baseUrl||h.baseUrl,consoleSite:l.consoleSite||h.consoleSite,consoleRegion:l.consoleRegion||h.consoleRegion,consoleSwitchAgent:l.consoleSwitchAgent||h.consoleSwitchAgent,workspaceId:l.workspaceId||h.workspaceId}}function Tn(e){return sn(e)}async function En(e,n,r){let i=Pt(16).toString(`hex`),o,s=Ft.createServer(async(e,t)=>{try{if(e.method===`OPTIONS`){t.writeHead(204,{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`GET, POST, PUT, PATCH, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type`}),t.end();return}if(new URL(e.url??`/`,`http://127.0.0.1`).searchParams.get(`state`)!==i){t.writeHead(400,{"Content-Type":`text/plain; charset=utf-8`}),t.end(`bad state
8
- `);return}let{accessToken:r,apiKey:a,baseUrl:c,consoleSite:l,consoleRegion:u,consoleSwitchAgent:d,workspaceId:f}=await wn(e),p=r||c||l||u||d||f;if(p||a)try{let e={access_token:r||void 0,console_site:l||void 0,console_region:u||void 0,console_switch_agent:d?Number(d):void 0,workspace_id:f||void 0};a?(await on(n,a,{baseUrl:c||n.authStore.resolveBaseUrl(),persistBaseUrl:c||void 0,persistPatch:e}),process.stderr.write(`Config saved to ${n.authStore.path}\n`)):p&&(await n.authStore.login({...e,base_url:c||void 0}),process.stderr.write(`Config saved to ${n.authStore.path}\n`))}catch(e){o=e,t.writeHead(500,{"Content-Type":`text/plain; charset=utf-8`}),t.end(`Failed to save credentials
7
+ `),qn={domestic:`https://bailian.console.aliyun.com`,international:`https://modelstudio.console.alibabacloud.com`};function Jn(e){return e&&qn[e]||qn.domestic}function Yn(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,e=>{if(r+=e.length,r>65536){n(Error(`payload too large`));return}i.push(e)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function Xn(e){let t=e.headers[`content-type`];return Array.isArray(t)?t[0]??``:typeof t==`string`?t:``}function Zn(e){let t=e.split(`;`);for(let e of t){let t=e.trim();if(!t.toLowerCase().startsWith(`boundary=`))continue;let n=t.slice(9).trim();return(n.startsWith(`"`)&&n.endsWith(`"`)||n.startsWith(`'`)&&n.endsWith(`'`))&&(n=n.slice(1,-1)),n.length>0?n:null}return null}function Qn(e,t){let n=`--${t}`,r=e.split(n);for(let e=1;e<r.length;e++){let t=r[e];if(!/name\s*=\s*["'](?:access_token|accessToken)["']/i.test(t))continue;let n=t.match(Kn);if(!n||n.index===void 0)continue;let i=t.slice(n.index+n[0].length);if(i=i.replace(/(?:\r\n)+$/g,``).replace(/\n+$/g,``).trim(),i)return i}return null}function $n(e){for(let t of[`access_token`,`accessToken`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function er(e){for(let t of[`api_key`,`apiKey`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function tr(e){let t=e.trim();if(t.charCodeAt(0)===65279&&(t=t.slice(1)),!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(!n||typeof n!=`object`||Array.isArray(n))return null;let r=n,i=$n(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=$n(a);if(e)return e}return null}function nr(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`multipart/form-data`)){let n=Zn(t);if(n){let t=Qn(e,n);if(t)return t}}if(n.includes(`application/json`)||n.includes(`text/json`)){let t=tr(e);if(t)return t}if(n.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim()),n=t.get(`access_token`)??t.get(`accessToken`);if(n?.trim())return n.trim()}catch{}let r=tr(e);if(r)return r;try{let t=new URLSearchParams(e.trim()),n=t.get(`access_token`)??t.get(`accessToken`);if(n?.trim())return n.trim()}catch{}let i=Zn(t);if(i){let t=Qn(e,i);if(t)return t}return null}function rr(e){let t=e.trim();if(t.charCodeAt(0)===65279&&(t=t.slice(1)),!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(!n||typeof n!=`object`||Array.isArray(n))return null;let r=n,i=er(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=er(a);if(e)return e}return null}function ir(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`application/json`)||n.includes(`text/json`)){let t=rr(e);if(t)return t}if(n.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim()),n=t.get(`api_key`)??t.get(`apiKey`);if(n?.trim())return n.trim()}catch{}let r=rr(e);if(r)return r;try{let t=new URLSearchParams(e.trim()),n=t.get(`api_key`)??t.get(`apiKey`);if(n?.trim())return n.trim()}catch{}return null}function ar(e,...t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t.trim()}return null}function or(e,t){let n={baseUrl:null,consoleSite:null,consoleRegion:null,consoleSwitchAgent:null,workspaceId:null};if(!e.trim())return n;let r=null,i=t.toLowerCase();if(i.includes(`application/json`)||i.includes(`text/json`))try{let t=JSON.parse(e.trim());t&&typeof t==`object`&&!Array.isArray(t)&&(r=t)}catch{}if(!r&&i.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim());r=Object.fromEntries(t)}catch{}if(!r)try{let t=JSON.parse(e.trim());t&&typeof t==`object`&&!Array.isArray(t)&&(r=t)}catch{}return r?{baseUrl:ar(r,`base_url`,`baseUrl`),consoleSite:ar(r,`console_site`,`consoleSite`),consoleRegion:ar(r,`console_region`,`consoleRegion`),consoleSwitchAgent:ar(r,`console_switch_agent`,`consoleSwitchAgent`),workspaceId:ar(r,`workspace_id`,`workspaceId`)}:n}async function sr(e){let t=new URL(e.url??`/`,`http://127.0.0.1`),n=t.searchParams.get(`access_token`)??t.searchParams.get(`accessToken`),r=t.searchParams.get(`api_key`)??t.searchParams.get(`apiKey`),i=t.searchParams.get(`base_url`)??t.searchParams.get(`baseUrl`),a=t.searchParams.get(`console_site`)??t.searchParams.get(`consoleSite`),o=t.searchParams.get(`console_region`)??t.searchParams.get(`consoleRegion`),s=t.searchParams.get(`console_switch_agent`)??t.searchParams.get(`consoleSwitchAgent`),c=t.searchParams.get(`workspace_id`)??t.searchParams.get(`workspaceId`),l={baseUrl:i?.trim()||null,consoleSite:a?.trim()||null,consoleRegion:o?.trim()||null,consoleSwitchAgent:s?.trim()||null,workspaceId:c?.trim()||null},u=e.method??`GET`;if(u!==`POST`&&u!==`PUT`&&u!==`PATCH`)return{accessToken:n?.trim()||null,apiKey:r?.trim()||null,...l};let d=Xn(e),f;try{f=await Yn(e)}catch{return{accessToken:n?.trim()||null,apiKey:r?.trim()||null,...l}}let p=n?.trim()||nr(f,d),m=r?.trim()||ir(f,d),h=or(f,d);return{accessToken:p,apiKey:m,baseUrl:l.baseUrl||h.baseUrl,consoleSite:l.consoleSite||h.consoleSite,consoleRegion:l.consoleRegion||h.consoleRegion,consoleSwitchAgent:l.consoleSwitchAgent||h.consoleSwitchAgent,workspaceId:l.workspaceId||h.workspaceId}}function cr(e){return Wn(e)}async function lr(e,n,r){let i=zt(16).toString(`hex`),o,s=Bt.createServer(async(e,t)=>{try{if(e.method===`OPTIONS`){t.writeHead(204,{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`GET, POST, PUT, PATCH, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type`}),t.end();return}if(new URL(e.url??`/`,`http://127.0.0.1`).searchParams.get(`state`)!==i){t.writeHead(400,{"Content-Type":`text/plain; charset=utf-8`}),t.end(`bad state
8
+ `);return}let{accessToken:r,apiKey:a,baseUrl:c,consoleSite:l,consoleRegion:u,consoleSwitchAgent:d,workspaceId:f}=await sr(e),p=r||c||l||u||d||f;if(p||a)try{let e={access_token:r||void 0,console_site:l||void 0,console_region:u||void 0,console_switch_agent:d?Number(d):void 0,workspace_id:f||void 0};a?(await Un(n,a,{baseUrl:c||n.authStore.resolveBaseUrl(),persistBaseUrl:c||void 0,persistPatch:e}),process.stderr.write(`Config saved to ${n.authStore.path}\n`)):p&&(await n.authStore.login({...e,base_url:c||void 0}),process.stderr.write(`Config saved to ${n.authStore.path}\n`))}catch(e){o=e,t.writeHead(500,{"Content-Type":`text/plain; charset=utf-8`}),t.end(`Failed to save credentials
9
9
  `),s.close();return}t.writeHead(200,{"Content-Type":`text/plain; charset=utf-8`,"Access-Control-Allow-Origin":`*`}),t.end(`OK
10
- `),(p||a)&&s.close()}catch{t.statusCode=500,t.end()}}),c;try{c=await Tn(s)}catch(e){throw new t(`Could not bind to 127.0.0.1 (no free port or permission denied): ${e instanceof Error?e.message:String(e)}`,a.USAGE)}let l=`${e}/console-login?notice=127.0.0.1:${c}?state=${encodeURIComponent(i)}`;r?.needApiKey&&(l+=`&needapikey=true`);try{await cn(l),process.stderr.write(`Opened the login page in your default browser. This process keeps the local port open for the console; press Ctrl+C when finished (or wait for idle timeout).
10
+ `),(p||a)&&s.close()}catch{t.statusCode=500,t.end()}}),c;try{c=await cr(s)}catch(e){throw new t(`Could not bind to 127.0.0.1 (no free port or permission denied): ${e instanceof Error?e.message:String(e)}`,a.USAGE)}let l=`${e}/console-login?notice=127.0.0.1:${c}?state=${encodeURIComponent(i)}`;r?.needApiKey&&(l+=`&needapikey=true`);try{await Gn(l),process.stderr.write(`Opened the login page in your default browser. This process keeps the local port open for the console; press Ctrl+C when finished (or wait for idle timeout).
11
11
  `)}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`Could not open the default browser (${t}). Open this URL manually:\n\n`),process.stdout.write(`${l}\n`),process.stderr.write(`
12
12
  This process keeps the local port open for the console; press Ctrl+C when finished (or wait for idle timeout).
13
- `)}if(await new Promise((e,t)=>{let n=!1,r=()=>{n||(n=!0,clearTimeout(i),e())},i=setTimeout(()=>{s.close()},9e5);s.once(`close`,r),s.once(`error`,e=>{clearTimeout(i),n||(n=!0,t(e))})}),o)throw o}function K(e){return typeof e==`string`&&e.trim().length>0}var Dn=w({description:`Authenticate with API key, console browser login, or OpenAPI AK/SK (credentials can coexist)`,auth:`none`,usageArgs:`--api-key <key> | --console | --open-api --access-key-id <id> --access-key-secret <secret>`,flags:{apiKey:{type:`string`,valueHint:`<key>`,description:`Model API key to store`},baseUrl:{type:`string`,valueHint:`<url>`,description:`Model API base URL (used with --api-key for validation)`},console:{type:`switch`,description:`Sign in via browser; use --console-site to choose domestic (default) or international`},consoleSite:{type:`string`,valueHint:`<site>`,description:`Console site: domestic, international`},openApi:{type:`switch`,description:`Store Alibaba Cloud OpenAPI AK/SK credentials`},accessKeyId:{type:`string`,valueHint:`<id>`,description:`Alibaba Cloud Access Key ID to store`},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:`Alibaba Cloud Access Key Secret to store`}},exampleArgs:[`--api-key sk-xxxxx`,`--config token-plan --api-key sk-sp-xxxxx`,`--console`,`--open-api --access-key-id LTAIxxxxx --access-key-secret xxxxx`],validate:e=>{let t=K(e.apiKey),n=e.console===!0,r=e.openApi===!0;if(!t&&K(e.baseUrl))return`Use --base-url only with --api-key`;if(!n&&K(e.consoleSite))return`Use --console-site only with --console`;if(!r&&(K(e.accessKeyId)||K(e.accessKeySecret)))return`Use --open-api with --access-key-id and --access-key-secret`;if([t,n,r].filter(Boolean).length!==1)return`Choose exactly one login mode: --api-key, --console, or --open-api`;if(r&&(!K(e.accessKeyId)||!K(e.accessKeySecret)))return`Provide --access-key-id and --access-key-secret with --open-api`},async run(e){let{identity:t,settings:n,flags:r}=e,i=e.authStore,a={identity:t,settings:n,authStore:i},o=r.apiKey,s=r.baseUrl?We(r.baseUrl):void 0;if(r.console){if(n.dryRun){F(`Would bind a free port on 127.0.0.1 and open the console login URL in your browser.`);return}let e=!!(o||i.stored().apiKey);await En(dn(r.consoleSite||n.consoleSite||`domestic`),a,{needApiKey:!e});return}if(r.openApi){if(n.dryRun){F(`Would save OpenAPI AK/SK credentials and generate CLI access token.`);return}let e=i.resolveBaseUrl();process.stderr.write(`Generating CLI access token... `);let a=(await pe({identity:t,settings:n,baseUrl:e,accessKeyId:r.accessKeyId,accessKeySecret:r.accessKeySecret})).cliAccessToken;await i.login({access_key_id:r.accessKeyId,access_key_secret:r.accessKeySecret,access_token:a}),process.stderr.write(`OpenAPI credentials saved to ${i.path}\n`);return}if(!o)return;if(n.dryRun){F(`Would validate and save API key.`);return}let c=be(n.configName),l=i.stored().baseUrl;await on(a,o,{baseUrl:s||i.resolveBaseUrl(c?.baseUrl),persistBaseUrl:s||(l?void 0:c?.baseUrl),defaultTextModel:c?.defaultTextModel,defaultImageModel:c?.defaultImageModel})}}),On=w({description:`Show current authentication state`,auth:`none`,exampleArgs:[``,`--output json`],async run(e){let{identity:t,settings:n}=e,r=T(n.output),i=e.authStore.describe(),a=i.apiKey?{source:i.apiKey.source,masked:O(i.apiKey.token),base_url:i.apiKey.baseUrl}:void 0,o=i.console?{source:i.console.source,masked:O(i.console.token),region:i.console.region,site:i.console.site}:void 0,s=i.openapi?{source:i.openapi.source,access_key_id:O(i.openapi.accessKeyId),access_key_secret:O(i.openapi.accessKeySecret)}:void 0,c=!!(a||o||s),l=n.configName??`default`,u=e.authStore.path;if(!c){I({authenticated:!1,config:l,config_file:u,message:`Not authenticated.`,hint:[`API key (model): ${t.binName} auth login --api-key <key> or DASHSCOPE_API_KEY`,`Console gateway: ${t.binName} auth login --console`,`OpenAPI (AK/SK): ${t.binName} auth login --open-api --access-key-id <id> --access-key-secret <secret>`,`Get API Key: ${gt}`].join(`
14
- `)},r);return}if(r!==`text`){I({authenticated:!0,config:l,config_file:u,api_key:a,console:o,openapi:s},r);return}F(`Config: ${l}`),F(`Config file: ${u}`),F(`Authentication Status:`),F(a?` API key (model): ${a.source} ${a.masked}`:` API key (model): not configured`),F(o?` Console gateway: ${o.source} ${o.masked} (${o.region}, ${o.site})`:` Console gateway: not configured (run ${t.binName} auth login --console)`),F(s?` OpenAPI (AK/SK): ${s.source} ${s.access_key_id}`:` OpenAPI (AK/SK): not configured (run ${t.binName} auth login --open-api)`)}}),kn=w({description:`Clear stored credentials; full logout also clears the model Base URL`,auth:`none`,usageArgs:`[--console | --open-api] [--dry-run]`,flags:{console:{type:`switch`,description:`Only clear the console access_token, keep api_key intact`},openApi:{type:`switch`,description:`Only clear OpenAPI AK/SK/STS credentials, keep other credentials intact`}},exampleArgs:[``,`--console`,`--open-api`,`--dry-run`],validate:e=>e.console&&e.openApi?`Use only one scope: --console or --open-api`:void 0,async run(e){let{settings:t,flags:n}=e,r=e.authStore,i=r.stored();if(n.console){if(t.dryRun){i.console?F(`Would clear access_token from ${r.path}`):F(`No console access_token to clear.`),F(`No changes made.`);return}await r.logout(`console`)?(process.stderr.write(`Cleared access_token from ${r.path}\n`),i.apiKey&&process.stderr.write(`api_key is still configured and will be used for authentication.
13
+ `)}if(await new Promise((e,t)=>{let n=!1,r=()=>{n||(n=!0,clearTimeout(i),e())},i=setTimeout(()=>{s.close()},9e5);s.once(`close`,r),s.once(`error`,e=>{clearTimeout(i),n||(n=!0,t(e))})}),o)throw o}function U(e){return typeof e==`string`&&e.trim().length>0}var ur=T({description:`Authenticate with API key, console browser login, or OpenAPI AK/SK (credentials can coexist)`,auth:`none`,usageArgs:`--api-key <key> | --console | --open-api --access-key-id <id> --access-key-secret <secret>`,flags:{apiKey:{type:`string`,valueHint:`<key>`,description:`Model API key to store`},baseUrl:{type:`string`,valueHint:`<url>`,description:`Model API base URL (used with --api-key for validation)`},console:{type:`switch`,description:`Sign in via browser; use --console-site to choose domestic (default) or international`},consoleSite:{type:`string`,valueHint:`<site>`,description:`Console site: domestic, international`},openApi:{type:`switch`,description:`Store Alibaba Cloud OpenAPI AK/SK credentials`},accessKeyId:{type:`string`,valueHint:`<id>`,description:`Alibaba Cloud Access Key ID to store`},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:`Alibaba Cloud Access Key Secret to store`}},exampleArgs:[`--api-key sk-xxxxx`,`--config token-plan --api-key sk-sp-xxxxx`,`--console`,`--open-api --access-key-id LTAIxxxxx --access-key-secret xxxxx`],validate:e=>{let t=U(e.apiKey),n=e.console===!0,r=e.openApi===!0;if(!t&&U(e.baseUrl))return`Use --base-url only with --api-key`;if(!n&&U(e.consoleSite))return`Use --console-site only with --console`;if(!r&&(U(e.accessKeyId)||U(e.accessKeySecret)))return`Use --open-api with --access-key-id and --access-key-secret`;if([t,n,r].filter(Boolean).length!==1)return`Choose exactly one login mode: --api-key, --console, or --open-api`;if(r&&(!U(e.accessKeyId)||!U(e.accessKeySecret)))return`Provide --access-key-id and --access-key-secret with --open-api`},async run(e){let{identity:t,settings:n,flags:r}=e,i=e.authStore,a={identity:t,settings:n,authStore:i},o=r.apiKey,s=r.baseUrl?Je(r.baseUrl):void 0;if(r.console){if(n.dryRun){F(`Would bind a free port on 127.0.0.1 and open the console login URL in your browser.`);return}let e=!!(o||i.stored().apiKey);await lr(Jn(r.consoleSite||n.consoleSite||`domestic`),a,{needApiKey:!e});return}if(r.openApi){if(n.dryRun){F(`Would save OpenAPI AK/SK credentials and generate CLI access token.`);return}let e=i.resolveBaseUrl();process.stderr.write(`Generating CLI access token... `);let a=(await he({identity:t,settings:n,baseUrl:e,accessKeyId:r.accessKeyId,accessKeySecret:r.accessKeySecret})).cliAccessToken;await i.login({access_key_id:r.accessKeyId,access_key_secret:r.accessKeySecret,access_token:a}),process.stderr.write(`OpenAPI credentials saved to ${i.path}\n`);return}if(!o)return;if(n.dryRun){F(`Would validate and save API key.`);return}let c=Se(n.configName),l=i.stored().baseUrl;await Un(a,o,{baseUrl:s||i.resolveBaseUrl(c?.baseUrl),persistBaseUrl:s||(l?void 0:c?.baseUrl),defaultTextModel:c?.defaultTextModel,defaultVideoModel:c?.defaultVideoModel,defaultImageToVideoModel:c?.defaultImageToVideoModel,defaultReferenceToVideoModel:c?.defaultReferenceToVideoModel,defaultImageModel:c?.defaultImageModel})}}),dr=T({description:`Show current authentication state`,auth:`none`,exampleArgs:[``,`--output json`],async run(e){let{identity:t,settings:n}=e,r=E(n.output),i=e.authStore.describe(),a=i.apiKey?{source:i.apiKey.source,masked:D(i.apiKey.token),base_url:i.apiKey.baseUrl}:void 0,o=i.console?{source:i.console.source,masked:D(i.console.token),region:i.console.region,site:i.console.site}:void 0,s=i.openapi?{source:i.openapi.source,access_key_id:D(i.openapi.accessKeyId),access_key_secret:D(i.openapi.accessKeySecret)}:void 0,c=!!(a||o||s),l=n.configName??`default`,u=e.authStore.path;if(!c){I({authenticated:!1,config:l,config_file:u,message:`Not authenticated.`,hint:[`API key (model): ${t.binName} auth login --api-key <key> or DASHSCOPE_API_KEY`,`Console gateway: ${t.binName} auth login --console`,`OpenAPI (AK/SK): ${t.binName} auth login --open-api --access-key-id <id> --access-key-secret <secret>`,`Get API Key: ${bt}`].join(`
14
+ `)},r);return}if(r!==`text`){I({authenticated:!0,config:l,config_file:u,api_key:a,console:o,openapi:s},r);return}F(`Config: ${l}`),F(`Config file: ${u}`),F(`Authentication Status:`),F(a?` API key (model): ${a.source} ${a.masked}`:` API key (model): not configured`),F(o?` Console gateway: ${o.source} ${o.masked} (${o.region}, ${o.site})`:` Console gateway: not configured (run ${t.binName} auth login --console)`),F(s?` OpenAPI (AK/SK): ${s.source} ${s.access_key_id}`:` OpenAPI (AK/SK): not configured (run ${t.binName} auth login --open-api)`)}}),fr=T({description:`Clear stored credentials; full logout also clears the model Base URL`,auth:`none`,usageArgs:`[--console | --open-api] [--dry-run]`,flags:{console:{type:`switch`,description:`Only clear the console access_token, keep api_key intact`},openApi:{type:`switch`,description:`Only clear OpenAPI AK/SK/STS credentials, keep other credentials intact`}},exampleArgs:[``,`--console`,`--open-api`,`--dry-run`],validate:e=>e.console&&e.openApi?`Use only one scope: --console or --open-api`:void 0,async run(e){let{settings:t,flags:n}=e,r=e.authStore,i=r.stored();if(n.console){if(t.dryRun){i.console?F(`Would clear access_token from ${r.path}`):F(`No console access_token to clear.`),F(`No changes made.`);return}await r.logout(`console`)?(process.stderr.write(`Cleared access_token from ${r.path}\n`),i.apiKey&&process.stderr.write(`api_key is still configured and will be used for authentication.
15
15
  `)):process.stderr.write(`No console access_token to clear.
16
16
  `);return}if(n.openApi){if(t.dryRun){i.openapi?F(`Would clear access_key_id / access_key_secret / security_token from ${r.path}`):F(`No OpenAPI AK/SK credentials to clear.`),F(`No changes made.`);return}await r.logout(`openapi`)?(process.stderr.write(`Cleared access_key_id / access_key_secret / security_token from ${r.path}\n`),(i.apiKey||i.console)&&process.stderr.write(`Other credentials are still configured and will be used for authentication.
17
17
  `)):process.stderr.write(`No OpenAPI AK/SK credentials to clear.
18
18
  `);return}let a=i.apiKey||i.console||i.openapi||!!i.baseUrl;if(t.dryRun){F(a?`Would clear api_key / base_url / access_token / access_key_id / access_key_secret / security_token from ${r.path}`:`No credentials or model Base URL to clear.`),F(`No changes made.`);return}await r.logout(`all`)?process.stderr.write(`Cleared api_key / base_url / access_token / access_key_id / access_key_secret / security_token from ${r.path}\n`):process.stderr.write(`No credentials or model Base URL to clear.
19
- `)}}),An=w({description:`Generate a CLI access token using OpenAPI AK/SK`,auth:`none`,usageArgs:`--access-key-id <id> --access-key-secret <secret> --security-token <token>`,flags:{accessKeyId:{type:`string`,valueHint:`<id>`,description:`Alibaba Cloud Access Key ID`,required:!0},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:`Alibaba Cloud Access Key Secret`,required:!0},securityToken:{type:`string`,valueHint:`<token>`,description:`Alibaba Cloud STS Security Token to store (optional)`}},exampleArgs:[`--access-key-id LTAIxxxxx --access-key-secret xxxxx --security-token <token>`],async run(e){let{identity:t,settings:n,flags:r}=e,i=T(n.output);I(await pe({identity:t,settings:n,baseUrl:e.client.baseUrl,accessKeyId:r.accessKeyId,accessKeySecret:r.accessKeySecret,securityToken:r.securityToken||void 0}),i)}});const jn={model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: qwen3.7-max)`},message:{type:`array`,valueHint:`<text>`,description:`Message text (repeatable, prefix role: to set role); or use --messages-file`},messagesFile:{type:`string`,valueHint:`<path>`,description:`JSON file with messages array (use - for stdin)`},system:{type:`string`,valueHint:`<text>`,description:`System prompt`},maxTokens:{type:`number`,valueHint:`<n>`,description:`Maximum tokens to generate (default: 4096)`},temperature:{type:`number`,valueHint:`<n>`,description:`Sampling temperature (0.0, 2.0]`},topP:{type:`number`,valueHint:`<n>`,description:`Nucleus sampling threshold`},stream:{type:`switch`,description:`Stream response tokens (default: on in TTY)`},tool:{type:`array`,valueHint:`<json-or-path>`,description:`Tool definition as JSON or file path (repeatable)`},enableThinking:{type:`switch`,description:`Enable thinking/reasoning mode (for qwen3/qwq models)`},thinkingBudget:{type:`number`,valueHint:`<n>`,description:`Max tokens for thinking (default: 4096)`}};function Mn(e){let t=[],n;if(e.system&&(n=e.system),e.messagesFile){let r=Ze(e.messagesFile),i=JSON.parse(r);for(let e of i)e.role===`system`?n=typeof e.content==`string`?e.content:``:t.push(e)}if(e.message){let r=new Set([`system`,`user`,`assistant`]),i=e.message;for(let e of i){let i=e.indexOf(`:`),a=i===-1?``:e.slice(0,i);if(r.has(a)){let r=e.slice(i+1);a===`system`?n=r:t.push({role:a,content:r})}else t.push({role:`user`,content:e})}}return{system:n,messages:t}}var Nn=w({description:`Send a chat completion (OpenAI compatible, DashScope)`,auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:jn,exampleArgs:[`--message "What is Qwen?"`,`--model qwen-max --system "You are a coding assistant." --message "Write fizzbuzz in Python"`,`--message "Hello" --message "assistant:Hi!" --message "How are you?"`,`--messages-file - --stream`,`--message "Hello" --output json`,`--model qwq-plus --message "Solve 1+1" --enable-thinking`],validate:e=>!e.message&&!e.messagesFile?`Provide --message or --messages-file.`:void 0,async run(e){let{settings:t,flags:n}=e,{system:r,messages:i}=Mn(n),a=n.model||t.defaultTextModel||`qwen3.7-max`,o=n.stream||process.stdout.isTTY,s=T(t.output),c=[];r&&c.push({role:`system`,content:r}),c.push(...i);let l={model:a,messages:c,max_tokens:n.maxTokens??4096,stream:o};if(n.temperature!==void 0&&(l.temperature=n.temperature),n.topP!==void 0&&(l.top_p=n.topP),n.enableThinking?(l.enable_thinking=!0,n.thinkingBudget!==void 0&&(l.thinking_budget=n.thinkingBudget)):o||(l.enable_thinking=!1),n.tool&&(l.tools=n.tool.map(e=>{try{return JSON.parse(e)}catch{let t=U(e,`utf-8`);return JSON.parse(t)}})),t.dryRun){I({request:l},s);return}if(o){let t=await e.client.request({path:x(),method:`POST`,body:l,stream:!0}),n=``,r=!1,i=s===`text`,a=process.stdout.isTTY,o=s===`json`?process.stderr:a?process.stdout:process.stderr,c=process.stdout,u=M(o);for await(let e of k(t)){if(e.data===`[DONE]`)break;try{let t=JSON.parse(e.data);for(let e of t.choices){let t=e.delta;t.reasoning_content&&(i&&!r&&(r=!0,o.write(u.dim(`Thinking:
19
+ `)}}),pr=T({description:`Generate a CLI access token using OpenAPI AK/SK`,auth:`none`,usageArgs:`--access-key-id <id> --access-key-secret <secret> --security-token <token>`,flags:{accessKeyId:{type:`string`,valueHint:`<id>`,description:`Alibaba Cloud Access Key ID`,required:!0},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:`Alibaba Cloud Access Key Secret`,required:!0},securityToken:{type:`string`,valueHint:`<token>`,description:`Alibaba Cloud STS Security Token to store (optional)`}},exampleArgs:[`--access-key-id LTAIxxxxx --access-key-secret xxxxx --security-token <token>`],async run(e){let{identity:t,settings:n,flags:r}=e,i=E(n.output);I(await he({identity:t,settings:n,baseUrl:e.client.baseUrl,accessKeyId:r.accessKeyId,accessKeySecret:r.accessKeySecret,securityToken:r.securityToken||void 0}),i)}});const mr={model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: qwen3.7-max)`},message:{type:`array`,valueHint:`<text>`,description:`Message text (repeatable, prefix role: to set role); or use --messages-file`},messagesFile:{type:`string`,valueHint:`<path>`,description:`JSON file with messages array (use - for stdin)`},system:{type:`string`,valueHint:`<text>`,description:`System prompt`},maxTokens:{type:`number`,valueHint:`<n>`,description:`Maximum tokens to generate (default: 4096)`},temperature:{type:`number`,valueHint:`<n>`,description:`Sampling temperature (0.0, 2.0]`},topP:{type:`number`,valueHint:`<n>`,description:`Nucleus sampling threshold`},stream:{type:`switch`,description:`Stream response tokens (default: on in TTY)`},tool:{type:`array`,valueHint:`<json-or-path>`,description:`Tool definition as JSON or file path (repeatable)`},enableThinking:{type:`switch`,description:`Enable thinking/reasoning mode (for qwen3/qwq models)`},thinkingBudget:{type:`number`,valueHint:`<n>`,description:`Max tokens for thinking (default: 4096)`}};function hr(e){let t=[],n;if(e.system&&(n=e.system),e.messagesFile){let r=tt(e.messagesFile),i=JSON.parse(r);for(let e of i)e.role===`system`?n=typeof e.content==`string`?e.content:``:t.push(e)}if(e.message){let r=new Set([`system`,`user`,`assistant`]),i=e.message;for(let e of i){let i=e.indexOf(`:`),a=i===-1?``:e.slice(0,i);if(r.has(a)){let r=e.slice(i+1);a===`system`?n=r:t.push({role:a,content:r})}else t.push({role:`user`,content:e})}}return{system:n,messages:t}}var gr=T({description:`Send a chat completion (OpenAI compatible, DashScope)`,auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:mr,exampleArgs:[`--message "What is Qwen?"`,`--model qwen-max --system "You are a coding assistant." --message "Write fizzbuzz in Python"`,`--message "Hello" --message "assistant:Hi!" --message "How are you?"`,`--messages-file - --stream`,`--message "Hello" --output json`,`--model qwq-plus --message "Solve 1+1" --enable-thinking`],validate:e=>!e.message&&!e.messagesFile?`Provide --message or --messages-file.`:void 0,async run(e){let{settings:t,flags:n}=e,{system:r,messages:i}=hr(n),a=n.model||t.defaultTextModel||`qwen3.7-max`,o=n.stream||process.stdout.isTTY,s=E(t.output),c=[];r&&c.push({role:`system`,content:r}),c.push(...i);let l={model:a,messages:c,max_tokens:n.maxTokens??4096,stream:o};if(n.temperature!==void 0&&(l.temperature=n.temperature),n.topP!==void 0&&(l.top_p=n.topP),n.enableThinking?(l.enable_thinking=!0,n.thinkingBudget!==void 0&&(l.thinking_budget=n.thinkingBudget)):o||(l.enable_thinking=!1),n.tool&&(l.tools=n.tool.map(e=>{try{return JSON.parse(e)}catch{let t=Kt(e,`utf-8`);return JSON.parse(t)}})),t.dryRun){I({request:l},s);return}if(o){let t=await e.client.request({path:x(),method:`POST`,body:l,stream:!0}),n=``,r=!1,i=s===`text`,a=process.stdout.isTTY,o=s===`json`?process.stderr:a?process.stdout:process.stderr,c=process.stdout,u=M(o);for await(let e of O(t)){if(e.data===`[DONE]`)break;try{let t=JSON.parse(e.data);for(let e of t.choices){let t=e.delta;t.reasoning_content&&(i&&!r&&(r=!0,o.write(u.dim(`Thinking:
20
20
  `))),i&&o.write(t.reasoning_content)),t.content&&(i&&r&&(o.write(`${u.reset}\n\nResponse:\n`),r=!1),n+=t.content,i&&c.write(t.content))}}catch{}}r&&o.write(u.reset),s===`json`?I({content:n},s):c.write(`
21
- `)}else{let n=await e.client.requestJson({path:x(),method:`POST`,body:l}),r=n.choices?.[0]?.message?.content??``;t.quiet||s===`text`?F(r):I(n,s)}}});const Pn=[{voice:`Tina`,name:`甜妹`,desc:`甜美亲切`,lang:`中文/英文`},{voice:`Dylan`,name:`北京-晓东`,desc:`胡同少年`,lang:`中文/北京`},{voice:`Kiki`,name:`粤语-阿清`,desc:`甜美港妹`,lang:`中文/英文`},{voice:`Li`,name:`南京-老李`,desc:`南京大叔`,lang:`中文/英文`},{voice:`Sunny`,name:`四川-晴儿`,desc:`甜飒川妹`,lang:`中文`},{voice:`Marcus`,name:`陕西-秦川`,desc:`陕北汉子`,lang:`中文/英文`},{voice:`Eric`,name:`四川-程川`,desc:`成都大哥`,lang:`中文/英文`},{voice:`Rocky`,name:`粤语-阿强`,desc:`幽默港仔`,lang:`中文/英文`},{voice:`Jennifer`,name:`詹妮弗`,desc:`美剧大女主`,lang:`中文/英文`},{voice:`Ryan`,name:`甜茶`,desc:`美剧张力男`,lang:`中文/英文`},{voice:`Katerina`,name:`卡捷琳娜`,desc:`御姐深情女`,lang:`中文/英文`},{voice:`Peter`,name:`天津-李彼得`,desc:`天津捧哏`,lang:`中文/英文`},{voice:`Ethan`,name:`晨煦`,desc:`北方口音男`,lang:`中文/英文`}];function Fn(){let e=(e,t)=>e.padEnd(t);process.stdout.write(`
21
+ `)}else{let n=await e.client.requestJson({path:x(),method:`POST`,body:l}),r=n.choices?.[0]?.message?.content??``;t.quiet||s===`text`?F(r):I(n,s)}}});const _r=[{voice:`Tina`,name:`甜妹`,desc:`甜美亲切`,lang:`中文/英文`},{voice:`Dylan`,name:`北京-晓东`,desc:`胡同少年`,lang:`中文/北京`},{voice:`Kiki`,name:`粤语-阿清`,desc:`甜美港妹`,lang:`中文/英文`},{voice:`Li`,name:`南京-老李`,desc:`南京大叔`,lang:`中文/英文`},{voice:`Sunny`,name:`四川-晴儿`,desc:`甜飒川妹`,lang:`中文`},{voice:`Marcus`,name:`陕西-秦川`,desc:`陕北汉子`,lang:`中文/英文`},{voice:`Eric`,name:`四川-程川`,desc:`成都大哥`,lang:`中文/英文`},{voice:`Rocky`,name:`粤语-阿强`,desc:`幽默港仔`,lang:`中文/英文`},{voice:`Jennifer`,name:`詹妮弗`,desc:`美剧大女主`,lang:`中文/英文`},{voice:`Ryan`,name:`甜茶`,desc:`美剧张力男`,lang:`中文/英文`},{voice:`Katerina`,name:`卡捷琳娜`,desc:`御姐深情女`,lang:`中文/英文`},{voice:`Peter`,name:`天津-李彼得`,desc:`天津捧哏`,lang:`中文/英文`},{voice:`Ethan`,name:`晨煦`,desc:`北方口音男`,lang:`中文/英文`}];function vr(){let e=(e,t)=>e.padEnd(t);process.stdout.write(`
22
22
  Omni output voices:
23
- `),process.stdout.write(`${e(`VOICE ID`,12)} ${e(`NAME`,14)} ${e(`DESCRIPTION`,14)} LANGUAGE\n`),process.stdout.write(`${`-`.repeat(12)} ${`-`.repeat(14)} ${`-`.repeat(14)} ${`-`.repeat(12)}\n`);for(let t of Pn)process.stdout.write(`${e(t.voice,12)} ${e(t.name,14)} ${e(t.desc,14)} ${t.lang}\n`);process.stdout.write(`\nTotal: ${Pn.length} voices\n`)}const In={wav:`wav`,mp3:`mp3`,amr:`amr`,aac:`aac`,m4a:`aac`,ogg:`ogg`,"3gp":`3gp`,"3gpp":`3gpp`},Ln=Object.keys(In);function Rn(e){let n=e.split(`?`)[0].split(`#`)[0],r=Gt(n).slice(1).toLowerCase();if(!r)throw new t(`Cannot infer audio format from "${e}". Use a file/URL whose path ends with: ${Ln.join(`, `)}.`,a.USAGE);let i=In[r];if(!i)throw new t(`Unsupported audio extension ".${r}" for "${e}". Supported extensions: ${Ln.join(`, `)}.`,a.USAGE);return i}function zn(e){let t=Buffer.alloc(44);return t.write(`RIFF`,0),t.writeUInt32LE(36+e,4),t.write(`WAVE`,8),t.write(`fmt `,12),t.writeUInt32LE(16,16),t.writeUInt16LE(1,20),t.writeUInt16LE(1,22),t.writeUInt32LE(24e3,24),t.writeUInt32LE(48e3,28),t.writeUInt16LE(2,32),t.writeUInt16LE(16,34),t.write(`data`,36),t.writeUInt32LE(e,40),t}var Bn=w({description:`Multimodal chat with text + audio output (Qwen-Omni)`,auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:{message:{type:`array`,valueHint:`<text>`,description:`Message text (repeatable, prefix role: to set role)`},model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: qwen3.5-omni-plus)`},system:{type:`string`,valueHint:`<text>`,description:`System prompt`},image:{type:`array`,valueHint:`<url>`,description:`Image URL or local file (repeatable)`},audio:{type:`array`,valueHint:`<url>`,description:`Audio URL or local file (.wav/.mp3/.amr/.aac/.m4a/.ogg/.3gp/.3gpp)`},video:{type:`array`,valueHint:`<url>`,description:`Video file URL / local path, or comma-separated frame URLs`},voice:{type:`string`,valueHint:`<voice>`,description:`Output voice ID (default: Tina). Use --list-voices to see all options`},listVoices:{type:`switch`,description:`List available output voices and exit`},audioFormat:{type:`string`,valueHint:`<fmt>`,description:`Audio output format (default: wav)`},audioOut:{type:`string`,valueHint:`<path>`,description:`Save audio to file (default: auto-generate)`},textOnly:{type:`switch`,description:`Output text only, no audio generation`},maxTokens:{type:`number`,valueHint:`<n>`,description:`Maximum tokens to generate`},temperature:{type:`number`,valueHint:`<n>`,description:`Sampling temperature (0.0, 2.0]`}},exampleArgs:[`--list-voices`,`--message "Hello, who are you?"`,`--message "Describe this image" --image ./photo.jpg`,`--message "What is this audio saying?" --audio https://example.com/audio.wav`,`--message "Summarize this video" --video https://example.com/video.mp4`,`--message "What is this video about?" --video ./local-video.mp4 --text-only`,`--message "Answer in Sichuan dialect: How's the weather today?" --voice Sunny`,`--message "Hello" --text-only --output json`,`--message "Read this passage aloud" --audio-out greeting.wav`],validate:e=>e.listVoices||e.message?void 0:`Missing required flag: --message`,async run(e){let{settings:t,flags:n}=e;if(n.listVoices){Fn();return}let r=n.message??[],i=n.model||t.defaultOmniModel||`qwen3.5-omni-plus`,a=n.voice||`Tina`,o=n.audioFormat||`wav`,s=n.textOnly===!0,c=T(t.output),l=[];n.system&&l.push({role:`system`,content:n.system});let u=new Set([`system`,`user`,`assistant`]);for(let e of r){let t=e.indexOf(`:`),n=t===-1?``:e.slice(0,t);if(u.has(n)){let r=e.slice(t+1);n===`system`?l.push({role:`system`,content:r}):l.push({role:n,content:r})}else l.push({role:`user`,content:e})}let d=n.image||[],f=n.audio||[],p=n.video||[],m=[],h=[],g=[];if(d.length>0||f.length>0||p.length>0){for(let t of d){let n=await e.client.uploadFile(t,i);m.push(n)}for(let t of f){let n=await e.client.uploadFile(t,i);h.push({source:t,data:n})}for(let t of p)if(t.includes(`,`)){let n=t.split(`,`).map(e=>e.trim()).filter(Boolean);for(let t of n){let n=await e.client.uploadFile(t,i);g.push(`frame:${n}`)}}else{let n=await e.client.uploadFile(t,i);g.push(n)}}if(m.length>0||h.length>0||g.length>0){for(let e=l.length-1;e>=0;e--)if(l[e].role===`user`){let t=l[e].content,n=[];typeof t==`string`?n.push({type:`text`,text:t}):Array.isArray(t)&&n.push(...t);for(let e of m)n.push({type:`image_url`,image_url:{url:e}});for(let{source:e,data:t}of h)n.push({type:`input_audio`,input_audio:{data:t,format:Rn(e)}});let r=g.filter(e=>e.startsWith(`frame:`)).map(e=>e.slice(6)),i=g.filter(e=>!e.startsWith(`frame:`));r.length>0&&n.push({type:`video`,video:r});for(let e of i)n.push({type:`video_url`,video_url:{url:e}});l[e]={role:`user`,content:n};break}}let _={model:i,messages:l,stream:!0,stream_options:{include_usage:!0}};if(s||(_.modalities=[`text`,`audio`],_.audio={voice:a,format:o}),n.maxTokens!==void 0&&(_.max_tokens=n.maxTokens),n.temperature!==void 0&&(_.temperature=n.temperature),t.dryRun){I({request:_},c);return}if(!t.quiet){let e=s?`text-only`:`text+audio, voice: ${a}`;process.stderr.write(`[Model: ${i}] [${e}]\n`)}let v=await e.client.request({path:x(),method:`POST`,body:_,stream:!0}),y=``,b=``,S=process.stdout.isTTY,C=process.stdout;for await(let e of k(v)){if(e.data===`[DONE]`)break;try{let t=JSON.parse(e.data);for(let e of t.choices){let t=e.delta;t.content&&(y+=t.content,S&&C.write(t.content)),t.audio?.data&&(b+=t.audio.data)}}catch{}}S&&y&&C.write(`
24
- `);let ee;if(b&&!s){let e=Buffer.from(b,`base64`),r=zn(e.length),i=Buffer.concat([r,e]),a=n.audioOut;if(!a){let{join:e}=await import(`path`);a=e(A(t,{subDir:`omni`}),`omni_${Date.now()}.wav`)}Ht(a,i),ee=a,t.quiet||process.stderr.write(`Audio saved: ${a}\n`)}if(!S||c===`json`){let e={content:y};ee&&(e.audio_saved=ee,e.voice=a),I(e,c)}}});const Vn=[`qwen-image-2.0`,`qwen-image-max`];function Hn(e){return Vn.some(t=>e.startsWith(t))}var Un=w({description:`Generate images (Qwen-Image / wan2.x)`,auth:`apiKey`,usageArgs:`--prompt <text> [flags]`,flags:{prompt:{type:`string`,valueHint:`<text>`,description:`Image description`,required:!0},model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: qwen-image-2.0)`},size:{type:`string`,valueHint:`<W*H>`,description:`Image size: ratio (3:4, 16:9, 1:1) or pixels (2048*2048)`},n:{type:`number`,valueHint:`<count>`,description:`Number of images per request (default: 1, max: 6)`},seed:{type:`number`,valueHint:`<n>`,description:`Random seed for reproducible generation`},negativePrompt:{type:`string`,valueHint:`<text>`,description:`Negative prompt to exclude unwanted content`},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:yt},watermark:{type:`boolean`,valueHint:`<bool>`,description:bt},...e,...n,outDir:{type:`string`,valueHint:`<dir>`,description:`Download images to directory`},outPrefix:{type:`string`,valueHint:`<prefix>`,description:`Filename prefix (default: image)`},pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 3)`}},exampleArgs:[`--prompt "A cat in a spacesuit on Mars"`,`--prompt "Logo design" --n 3 --out-dir ./generated/`,`--prompt "Mountain landscape" --size 2688*1536`,`--prompt "A castle" --seed 42 --prompt-extend false`,`--prompt "Logo" --watermark false`,`--prompt "An alien in the space" --watermark false`,`--prompt "sunset" --model wan2.6-t2i --async --quiet`,`--prompt "Pro quality" --model qwen-image-2.0-pro`,`--prompt "Product shots" --n 2 --concurrent 3 # 6 images in parallel`],async run(e){let{settings:t,flags:n}=e,r=n.prompt,i=n.model||t.defaultImageModel||`qwen-image-2.0`,a=Hn(i),o=jt(n.size||`1:1`,a),s=n.n??1,c=R(n),l=tt(n.promptExtend,a?!0:void 0,`prompt-extend`),u=nt(n.watermark),d={model:i,input:{messages:[{role:`user`,content:[{text:r}]}]},parameters:{size:o,n:s,seed:n.seed,prompt_extend:l,watermark:u,negative_prompt:n.negativePrompt||void 0}},f=T(t.output);if(t.dryRun){I({request:d,mode:a?`sync`:`async`},f);return}t.quiet||process.stderr.write(`[Model: ${i}] [Mode: ${a?`sync`:`async`}]\n`),a?await Wn(e.client,t,i,d,n,f,c):await Gn(e.client,t,i,d,n,f,c)}});async function Wn(e,n,r,i,o,s,c){let l=(await V(c,n,()=>e.requestJson({path:we(),method:`POST`,body:i}))).flatMap(e=>e.output.choices||[]).flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);if(l.length===0)throw new t(`Generation completed but no images returned.`,a.GENERAL);await Kn(l,o,n,s)}async function Gn(e,n,r,i,o,s,c){let l=(await V(c,n,()=>e.requestJson({path:Ce(),method:`POST`,body:i,async:!0}),`tasks`)).map(e=>e.output.task_id);if(o.async){I({task_ids:l},s);return}let u=o.pollInterval??3,d=l.map(t=>B(e,n,{url:e.url(j(t)),intervalSec:u,timeoutSec:n.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})),f=await Promise.all(d),p=[];for(let e of f){if(e.output.choices){let t=e.output.choices.flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);p.push(...t)}if(e.output.results){let t=e.output.results.map(e=>e.url).filter(Boolean);t.length>0&&p.length===0&&p.push(...t)}}if(p.length===0)throw new t(`All tasks completed but no images returned.`,a.GENERAL);await Kn(p,o,n,s,l.length===1?l[0]:void 0,l)}async function Kn(e,t,n,r,i,a){let o=A(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),s=t.prompt||``,c=t.outPrefix||me(`image`,s),l=await Tt(e.length>1?e.map((e,t)=>({url:e,destPath:W(o,`${c}_${String(t+1).padStart(3,`0`)}.png`)})):[{url:e[0],destPath:W(o,`${c}.png`)}],P,{quiet:n.quiet});if(n.quiet)F(l.join(`
25
- `));else{let t={urls:e,saved:l,total:e.length};i&&(t.task_id=i),a&&a.length>1&&(t.task_ids=a),I(t,r)}}const qn=[`qwen-image-2.0`,`qwen-image-max`];function Jn(e){return qn.some(t=>e.startsWith(t))}var Yn=w({description:`Edit an existing image with text instructions (Qwen-Image)`,auth:`apiKey`,usageArgs:`--image <url> --prompt <text> [flags]`,flags:{image:{type:`array`,valueHint:`<url>`,description:`Source image URL or local file path (repeatable for multi-image merge)`,required:!0},prompt:{type:`string`,valueHint:`<text>`,description:`Edit instruction text`,required:!0},model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: qwen-image-2.0)`},size:{type:`string`,valueHint:`<W*H>`,description:`Output image size: ratio (3:4, 16:9) or pixels (2048*2048)`},n:{type:`number`,valueHint:`<count>`,description:`Number of images (default: 1, max: 6)`},seed:{type:`number`,valueHint:`<n>`,description:`Random seed for reproducible results`},negativePrompt:{type:`string`,valueHint:`<text>`,description:`Negative prompt to exclude unwanted content`},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:vt},watermark:{type:`boolean`,valueHint:`<bool>`,description:bt},outDir:{type:`string`,valueHint:`<dir>`,description:`Download images to directory`},outPrefix:{type:`string`,valueHint:`<prefix>`,description:`Filename prefix (default: edited)`},...e,...n,pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 3)`}},exampleArgs:[`--image ./photo.png --prompt "Replace the background with a beach"`,`--image https://example.com/logo.png --prompt "Change color to blue" --n 3`,`--image ./a.png --image ./b.png --prompt "Merge two images into one collage"`,`--image https://example.com/photo.png --prompt "Remove the person" --model qwen-image-2.0-pro`,`--image ./photo.png --prompt "Replace the background with a beach" --watermark false`],async run(e){let{settings:t,flags:n}=e,r=[];Array.isArray(n.image)?r=n.image:typeof n.image==`string`&&(r=[n.image]);let i=n.prompt,a=n.model||t.defaultImageModel||`qwen-image-2.0`,o=Jn(a),s=await Promise.all(r.map(t=>e.client.uploadFile(t,a))),c=n.n??1,l=tt(n.promptExtend,o?!0:void 0,`prompt-extend`),u=s.map(e=>({image:e}));u.push({text:i});let d=nt(n.watermark),f={model:a,input:{messages:[{role:`user`,content:u}]},parameters:{size:jt(n.size,o),n:c,seed:n.seed,prompt_extend:l,watermark:d,negative_prompt:n.negativePrompt||void 0}};ot(f.parameters);let p=T(t.output);if(t.dryRun){I({request:f,mode:o?`sync`:`async`},p);return}t.quiet||process.stderr.write(`[Model: ${a}] [Mode: ${o?`sync`:`async`}] [Images: ${s.length}]\n`);let m=R(n);o?await Xn(e.client,t,f,n,p,m):await Zn(e.client,t,f,n,p,m)}});async function Xn(e,n,r,i,o,s){let c=(await V(s,n,()=>e.requestJson({path:we(),method:`POST`,body:r}))).flatMap(e=>e.output.choices||[]).flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);if(c.length===0)throw new t(`Edit completed but no images returned.`,a.GENERAL);await Qn(c,i,n,o)}async function Zn(e,n,r,i,o,s){let c=(await V(s,n,()=>e.requestJson({path:Ce(),method:`POST`,body:r,async:!0}),`tasks`)).map(e=>e.output.task_id);if(i.async){I({task_ids:c},o);return}let l=i.pollInterval??3,u=c.map(t=>B(e,n,{url:e.url(j(t)),intervalSec:l,timeoutSec:n.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})),d=await Promise.all(u),f=[];for(let e of d){if(e.output.choices){let t=e.output.choices.flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);f.push(...t)}if(e.output.results){let t=e.output.results.map(e=>e.url).filter(Boolean);t.length>0&&f.length===0&&f.push(...t)}}if(f.length===0)throw new t(`All tasks completed but no images returned.`,a.GENERAL);await Qn(f,i,n,o)}async function Qn(e,t,n,r){let i=A(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),a=t.outPrefix||me(`edited`,t.prompt),o=await Tt(e.length>1?e.map((e,t)=>({url:e,destPath:W(i,`${a}_${String(t+1).padStart(3,`0`)}.png`)})):[{url:e[0],destPath:W(i,`${a}.png`)}],P,{quiet:n.quiet});n.quiet?F(o.join(`
26
- `)):I({urls:e,saved:o,total:e.length},r)}var $n=w({description:`Generate a video from text or image (happyhorse-1.1-t2v / happyhorse-1.1-i2v / wan2.6-t2v)`,auth:`apiKey`,usageArgs:`--prompt <text> [--image <url>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: happyhorse-1.1-t2v, or happyhorse-1.1-i2v with --image)`},prompt:{type:`string`,valueHint:`<text>`,description:`Video description`,required:!0},image:{type:`string`,valueHint:`<url>`,description:`Input image URL for image-to-video generation`},negativePrompt:{type:`string`,valueHint:`<text>`,description:`Negative prompt to exclude unwanted content`},resolution:{type:`string`,valueHint:`<res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},ratio:{type:`string`,valueHint:`<ratio>`,description:`Aspect ratio (e.g. 16:9, 9:16, 1:1)`},duration:{type:`number`,valueHint:`<seconds>`,description:`Video duration in seconds (default: 5)`},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:_t},watermark:{type:`boolean`,valueHint:`<bool>`,description:bt},seed:{type:`number`,valueHint:`<n>`,description:`Random seed for reproducible generation`},download:{type:`string`,valueHint:`<path>`,description:`Save video to file on completion`},...e,...n,pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 5)`}},exampleArgs:[`--prompt "A person reading a book, static shot"`,`--prompt "Ocean waves at sunset." --download sunset.mp4`,`--image https://example.com/cat.png --prompt "Make the cat in the scene move"`,`--prompt "Mountain landscape" --resolution 720P --duration 5`,`--prompt "A cat playing with a ball" --watermark false`],async run(e){let{settings:n,flags:r}=e,i=r.prompt,o=r.model||n.defaultVideoModel||(r.image?`happyhorse-1.1-i2v`:`happyhorse-1.1-t2v`),s=T(n.output),c=r.image,l;c&&(l=await e.client.uploadFile(c,o));let u=nt(r.watermark),d=tt(r.promptExtend,void 0,`prompt-extend`),f={model:o,input:{prompt:i,negative_prompt:r.negativePrompt||void 0,...l?{media:[{type:`first_frame`,url:l}]}:{}},parameters:{resolution:r.resolution||void 0,ratio:r.ratio||void 0,duration:r.duration||void 0,prompt_extend:d,watermark:u,seed:r.seed}};if(n.dryRun){I({request:f},s);return}let p=(await V(R(r),n,()=>e.client.requestJson({path:mt(),method:`POST`,body:f,async:!0}),`tasks`)).map(e=>e.output.task_id);if(n.quiet||process.stderr.write(`[Model: ${o}]\n`),r.async){I(p.length===1?{task_id:p[0]}:{task_ids:p},s);return}let m=r.pollInterval??5,h=p.map(t=>{let r=e.client.url(j(t));return B(e.client,n,{url:r,intervalSec:m,timeoutSec:n.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})}),g=await Promise.all(h),_=[];for(let e=0;e<g.length;e++){let t=g[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&_.push({taskId:p[e],videoUrl:n})}if(_.length===0)throw new t(`All tasks completed but no video URLs returned.`,a.GENERAL);if(r.download){let e=r.download,{size:t}=await P(_[0].videoUrl,e,{quiet:n.quiet});n.quiet?F(e):I({task_id:_[0].taskId,video_url:_[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Ot(t)},s);return}let v=A(n,{subDir:`videos`}),{join:y}=await import(`path`),b=[];await Promise.all(_.map(async({taskId:e,videoUrl:t})=>{let r=y(v,`${e}.mp4`);await P(t,r,{quiet:n.quiet}),b.push({task_id:e,video_url:t,saved:r})})),b.length===1?I(b[0],s):I({videos:b,total:b.length},s)}}),er=w({description:`Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.)`,auth:`apiKey`,usageArgs:`--video <url> --prompt <text> [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: happyhorse-1.0-video-edit)`},video:{type:`string`,valueHint:`<url>`,description:`Input video URL or local file (mp4/mov, 2-10s)`,required:!0},prompt:{type:`string`,valueHint:`<text>`,description:`Edit instruction (e.g. "Convert the scene to a claymation style")`},refImage:{type:`string`,valueHint:`<url>`,description:`Reference image URL (up to 4, comma-separated)`},negativePrompt:{type:`string`,valueHint:`<text>`,description:`Negative prompt to exclude unwanted content`},resolution:{type:`string`,valueHint:`<res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},ratio:{type:`string`,valueHint:`<ratio>`,description:`Aspect ratio (16:9, 9:16, 1:1, 4:3, 3:4)`},duration:{type:`number`,valueHint:`<seconds>`,description:`Output video duration in seconds (2-10)`},audioSetting:{type:`string`,valueHint:`<mode>`,description:`Audio: auto (default) or origin (keep original)`,choices:[`auto`,`origin`]},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:_t},watermark:{type:`boolean`,valueHint:`<bool>`,description:bt},seed:{type:`number`,valueHint:`<n>`,description:`Random seed for reproducible generation`},download:{type:`string`,valueHint:`<path>`,description:`Save video to file on completion`},...e,...n,pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 15)`}},exampleArgs:[`--video https://example.com/input.mp4 --prompt "Convert the entire scene to claymation style"`,`--video https://example.com/input.mp4 --prompt "Replace the outfit with the style shown in the image" --ref-image https://example.com/clothes.png`,`--video https://example.com/input.mp4 --prompt "Convert to anime style" --resolution 720P --download output.mp4`,`--video https://example.com/input.mp4 --prompt "Put clothes on the kitten in the video" --watermark false`],async run(e){let{settings:n,flags:r}=e,i=r.video,o=r.prompt,s=r.model||`happyhorse-1.0-video-edit`,c=T(n.output),l=[{type:`video`,url:await e.client.uploadFile(i,s)}],u=r.refImage;if(u){let t=u.split(`,`).map(e=>e.trim()).filter(Boolean);for(let n of t){let t=await e.client.uploadFile(n,s);l.push({type:`reference_image`,url:t})}}let d=tt(r.promptExtend,void 0,`prompt-extend`),f=nt(r.watermark),p={model:s,input:{prompt:o||void 0,negative_prompt:r.negativePrompt||void 0,media:l},parameters:{resolution:r.resolution||void 0,ratio:r.ratio||void 0,duration:r.duration||void 0,audio_setting:r.audioSetting||void 0,prompt_extend:d,watermark:f,seed:r.seed}};if(n.dryRun){I({request:p},c);return}let m=(await V(R(r),n,()=>e.client.requestJson({path:mt(),method:`POST`,body:p,async:!0}),`tasks`)).map(e=>e.output.task_id);if(n.quiet||(process.stderr.write(`[Model: ${s}]\n`),process.stderr.write(`Note: Video editing typically takes 5-8 minutes. Please be patient.
27
- `)),r.async){I(m.length===1?{task_id:m[0]}:{task_ids:m},c);return}let h=r.pollInterval??15,g=Math.max(n.timeout,600),_=await Promise.all(m.map(t=>B(e.client,n,{url:e.client.url(j(t)),intervalSec:h,timeoutSec:g,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}}))),v=[];for(let e=0;e<_.length;e++){let t=_[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&v.push({taskId:m[e],videoUrl:n})}if(v.length===0)throw new t(`All tasks completed but no video URLs returned.`,a.GENERAL);if(r.download){let e=r.download,{size:t}=await P(v[0].videoUrl,e,{quiet:n.quiet});n.quiet?F(e):I({task_id:v[0].taskId,video_url:v[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Ot(t)},c);return}let y=await import(`path`),b=A(n,{subDir:`videos`}),x=[];await Promise.all(v.map(async({taskId:e,videoUrl:t})=>{let r=y.join(b,`${e}.mp4`);await P(t,r,{quiet:n.quiet}),x.push({task_id:e,video_url:t,saved:r})})),x.length===1?I(x[0],c):I({videos:x,total:x.length},c)}}),tr=w({description:`Reference-to-video generation (happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice`,auth:`apiKey`,usageArgs:`--prompt <text> --image <url>... [--ref-video <url>...] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: happyhorse-1.1-r2v)`},prompt:{type:`string`,valueHint:`<text>`,description:`Video description with reference markers (image1, video1, etc.)`,required:!0},image:{type:`array`,valueHint:`<url>`,description:`Reference image URL or local file (repeatable for multiple subjects)`},refVideo:{type:`array`,valueHint:`<url>`,description:`Reference video URL or local file (repeatable)`},imageVoice:{type:`array`,valueHint:`<url>`,description:`Voice URL for corresponding image (pairs by position)`},videoVoice:{type:`array`,valueHint:`<url>`,description:`Voice URL for corresponding ref-video (pairs by position)`},resolution:{type:`string`,valueHint:`<res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},ratio:{type:`string`,valueHint:`<ratio>`,description:`Aspect ratio (16:9, 9:16, 1:1)`},duration:{type:`number`,valueHint:`<seconds>`,description:`Video duration in seconds (default: 5)`},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:_t},watermark:{type:`boolean`,valueHint:`<bool>`,description:bt},seed:{type:`number`,valueHint:`<n>`,description:`Random seed for reproducible generation`},download:{type:`string`,valueHint:`<path>`,description:`Save video to file on completion`},...e,...n,pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 15)`}},exampleArgs:[`--prompt "Image1 running on the grass" --image person.jpg`,`--prompt "Video 1 plays guitar, Image 1 walks over" --ref-video scene.mp4 --image person.jpg`,`--prompt "Image 1 speaks" --image person.jpg --image-voice voice.mp3 --resolution 1080P`,`--prompt "Image 1 and Image 2 have a conversation" --image a.jpg --image b.jpg --image-voice va.mp3 --image-voice vb.mp3`,`--prompt "Image 1 drinks water" --image person.jpg --watermark false`],validate:e=>!e.image?.length&&!e.refVideo?.length?`Provide at least one --image or --ref-video.`:void 0,async run(e){let{settings:n,flags:r}=e,i=r.prompt,o=r.image||[],s=r.refVideo||[],c=r.imageVoice||[],l=r.videoVoice||[],u=r.model||`happyhorse-1.1-r2v`,d=T(n.output),f=[];for(let t=0;t<o.length;t++){let n={type:`reference_image`,url:await e.client.uploadFile(o[t],u)};c[t]&&(n.reference_voice=await e.client.uploadFile(c[t],u)),f.push(n)}for(let t=0;t<s.length;t++){let n={type:`reference_video`,url:await e.client.uploadFile(s[t],u)};l[t]&&(n.reference_voice=await e.client.uploadFile(l[t],u)),f.push(n)}let p=tt(r.promptExtend,void 0,`prompt-extend`),m=nt(r.watermark),h={model:u,input:{prompt:i,media:f},parameters:{resolution:r.resolution||void 0,ratio:r.ratio||void 0,duration:r.duration||void 0,prompt_extend:p,watermark:m,seed:r.seed}};if(n.dryRun){I({request:h},d);return}let g=(await V(R(r),n,()=>e.client.requestJson({path:mt(),method:`POST`,body:h,async:!0}),`tasks`)).map(e=>e.output.task_id);if(n.quiet||(process.stderr.write(`[Model: ${u}]\n`),process.stderr.write(`Note: Reference-to-video typically takes 5-10 minutes. Please be patient.
28
- `)),r.async){I(g.length===1?{task_id:g[0]}:{task_ids:g},d);return}let _=r.pollInterval??15,v=Math.max(n.timeout,600),y=await Promise.all(g.map(t=>B(e.client,n,{url:e.client.url(j(t)),intervalSec:_,timeoutSec:v,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}}))),b=[];for(let e=0;e<y.length;e++){let t=y[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&b.push({taskId:g[e],videoUrl:n})}if(b.length===0)throw new t(`All tasks completed but no video URLs returned.`,a.GENERAL);if(r.download){let e=r.download,{size:t}=await P(b[0].videoUrl,e,{quiet:n.quiet});n.quiet?F(e):I({task_id:b[0].taskId,video_url:b[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Ot(t)},d);return}let{join:x}=await import(`path`),S=A(n,{subDir:`videos`}),C=[];await Promise.all(b.map(async({taskId:e,videoUrl:t})=>{let r=x(S,`${e}.mp4`);await P(t,r,{quiet:n.quiet}),C.push({task_id:e,video_url:t,saved:r})})),C.length===1?I(C[0],d):I({videos:C,total:C.length},d)}}),nr=w({description:`Query async task status`,auth:`apiKey`,usageArgs:`--task-id <id>`,flags:{taskId:{type:`string`,valueHint:`<id>`,description:`Async task ID`,required:!0}},exampleArgs:[`--task-id 3b256896-3e70-xxxx-xxxx-xxxxxxxxxxxx`,`--task-id 3b256896-3e70-xxxx --output json`],async run(e){let{settings:t,flags:n}=e,r=n.taskId,i=T(t.output);if(t.dryRun){I({task_id:r},i);return}let a=await e.client.requestJson({path:j(r)});if(t.quiet){F(a.output.task_status);return}I({task_id:a.output.task_id,task_status:a.output.task_status,video_url:a.output.video_url,results:a.output.results,submit_time:a.output.submit_time,end_time:a.output.end_time},i)}}),rr=w({description:`Download a completed video by task ID`,auth:`apiKey`,usageArgs:`--task-id <id> --out <path>`,flags:{taskId:{type:`string`,valueHint:`<id>`,description:`Task ID to download from`,required:!0},out:{type:`string`,valueHint:`<path>`,description:`Output file path`,required:!0}},exampleArgs:[`--task-id 3b256896-xxxx --out video.mp4`,`--task-id 3b256896-xxxx --out video.mp4 --quiet`],async run(e){let{settings:n,flags:r}=e,i=r.taskId,o=r.out,s=T(n.output);if(n.dryRun){I({task_id:i,action:`download`,out:o},s);return}let c=await e.client.requestJson({path:j(i)});if(c.output.task_status!==`SUCCEEDED`)throw new t(`Task is not complete (status: ${c.output.task_status}).`,a.GENERAL,`Wait for the task to complete before downloading.`);let l=c.output.video_url||c.output.results&&c.output.results[0]?.url;if(!l)throw new t(`No download URL available for this task.`,a.GENERAL);let{size:u}=await P(l,o,{quiet:n.quiet});if(n.quiet){F(o);return}I({saved:o,size:Ot(u)},s)}});const ir={".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".png":`image/png`,".webp":`image/webp`},ar=new Set([`.mp4`,`.mov`,`.avi`,`.mkv`,`.webm`,`.flv`,`.wmv`]);function or(e){let t=Gt(e).toLowerCase().split(`?`)[0];return!!(ar.has(t)||/\.(mp4|mov|avi|mkv|webm|flv|wmv)(\?|$)/i.test(e))}async function sr(e){if(e.startsWith(`data:`)||e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`oss://`))return e;if(!H(e))throw new t(`File not found: ${e}`,a.USAGE);let n=Gt(e).toLowerCase(),r=ir[n];if(!r)throw new t(`Unsupported image format "${n}". Supported: jpg, jpeg, png, webp`,a.USAGE);return`data:${r};base64,${U(e).toString(`base64`)}`}var cr=w({description:`Describe an image or video using Qwen-VL`,auth:`apiKey`,usageArgs:`--image <path-or-url> [--video <url>] [--prompt <text>]`,flags:{image:{type:`string`,valueHint:`<path-or-url>`,description:`Local image path or URL`},video:{type:`array`,valueHint:`<url>`,description:`Video file URL or local path (mp4/mov/avi/mkv/webm)`},prompt:{type:`string`,valueHint:`<text>`,description:`Question about the content (default: auto-detected)`},model:{type:`string`,valueHint:`<model>`,description:`Vision model (default: qwen3-vl-plus)`}},exampleArgs:[`--image photo.jpg`,`--image https://example.com/photo.jpg --prompt "What breed is this dog?"`,`--video https://example.com/video.mp4 --prompt "Summarize the video content"`,`--video ./local-video.mp4`,`--image photo.png --prompt "Extract the text" --model qwen3-vl-plus`],validate:e=>!e.image&&!e.video?.length?`Provide --image or --video.`:void 0,async run(e){let{settings:n,flags:r}=e,i=r.image,o=r.video??[],s=r.model||`qwen3-vl-plus`;i&&or(i)&&(o.push(i),i=void 0);let c=o.length>0?`Describe the video.`:`Describe the image.`,l=r.prompt||c,u=T(n.output);if(n.dryRun){I({request:{prompt:l,image:i,video:o.length?o:void 0,model:s}},u);return}let d=[];if(o.length>0)for(let n of o){let r=n;if(Te(n)){if(!H(n))throw new t(`Video file not found: ${n}`,a.USAGE);r=await e.client.uploadFile(n,s)}d.push({type:`video_url`,video_url:{url:r}})}if(i){let t=await sr(i),n=t;if(Te(i)&&t.startsWith(`data:`)){let{statSync:t}=await import(`fs`);t(i).size>5*1024*1024&&(n=await e.client.uploadFile(i,s))}d.push({type:`image_url`,image_url:{url:n}})}d.push({type:`text`,text:l});let f={model:s,messages:[{role:`user`,content:d}]},p=await e.client.requestJson({path:x(),method:`POST`,body:f}),m=p.choices?.[0]?.message?.content;if(u!==`text`){I(p,u);return}F(m||``)}});const lr=[`base_url`,`output`,`output_dir`,`timeout`,`api_key`,`access_token`,`access_key_id`,`access_key_secret`,`security_token`,`default_text_model`,`default_video_model`,`default_image_model`,`default_speech_model`,`default_omni_model`,`workspace_id`],ur=new Set([`api_key`,`access_token`,`access_key_id`,`access_key_secret`,`security_token`]),dr={"base-url":`base_url`,"output-dir":`output_dir`,"api-key":`api_key`,"access-token":`access_token`,"access-key-id":`access_key_id`,"access-key-secret":`access_key_secret`,"security-token":`security_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`,"workspace-id":`workspace_id`};function fr(e){return dr[e]||e}function pr(e,n){let r=fr(e);if(!lr.includes(r))throw new t(`Invalid config key "${e}". Valid keys: ${lr.join(`, `)}`,a.USAGE);if(r===`output`&&![`text`,`json`].includes(n))throw new t(`Invalid output format "${n}". Valid values: text, json`,a.USAGE);if(r===`timeout`){let e=Number(n);if(isNaN(e)||e<=0)throw new t(`Invalid timeout "${n}". Must be a positive number.`,a.USAGE);return e}return r===`base_url`?We(n):n}var mr=w({description:`Display current configuration`,auth:`none`,exampleArgs:[``,`--output json`],async run(e){let{settings:t,client:n}=e,r=e.configStore,i=r.read(),a=T(t.output),o={...i,base_url:n.baseUrl,output:t.output,timeout:t.timeout,config:t.configName??`default`,config_file:r.path};for(let e of ur)typeof o[e]==`string`&&(o[e]=O(o[e]));I(o,a)}}),hr=w({description:`Set a config value`,auth:`none`,usageArgs:`--key <key> --value <value>`,flags:{key:{type:`string`,valueHint:`<key>`,description:`Config key (base_url, output, output_dir, timeout, api_key, access_token, access_key_id, access_key_secret, security_token, default_*_model, workspace_id)`,required:!0},value:{type:`string`,valueHint:`<value>`,description:`Value to set`,required:!0}},exampleArgs:[`--key output --value json`,`--key timeout --value 600`,`--key base_url --value https://dashscope.aliyuncs.com`],async run(e){let{settings:t,flags:n}=e,r=n.key,i=n.value,a=fr(r),o=pr(r,i),s=T(t.output);if(t.dryRun){I({would_set:{[a]:o},config:t.configName??`default`,config_file:e.configStore.path},s);return}if(await e.configStore.write({[a]:o}),!t.quiet){let n=ur.has(a)?O(String(o)):o;I({[a]:n,config:t.configName??`default`,config_file:e.configStore.path},s)}}}),gr=w({description:`List config profiles and show the active profile`,auth:`none`,exampleArgs:[``,`--output json`],async run(e){let t=e.configStore.profiles(),n=[`default`,...Object.keys(t.named).sort()],r=T(e.settings.output);if(r===`json`){I({active_config:t.active,profiles:n,config_file:e.configStore.path},r);return}let i=Math.max(4,...n.map(e=>e.length));F(`${`NAME`.padEnd(i)} ACTIVE`);for(let e of n)F(`${e.padEnd(i)} ${e===t.active?`*`:``}`)}}),_r=w({description:`Set the active config profile`,auth:`none`,usageArgs:`--name <name>`,flags:{name:{type:`string`,valueHint:`<name>`,description:`Existing profile name, or default`,required:!0}},exampleArgs:[`--name token-plan`,`--name default`],async run(e){let t=T(e.settings.output);if(e.settings.dryRun){I({would_activate:e.configStore.validateActivation(e.flags.name),config_file:e.configStore.path},t);return}let n=await e.configStore.activate(e.flags.name);e.settings.quiet||I({active_config:n,config_file:e.configStore.path},t)}});const vr={port:{type:`number`,valueHint:`<port>`,description:`Port to listen on (default: random free port)`},noOpen:{type:`switch`,description:`Do not open the browser automatically`}};function yr(e){return e instanceof t||e instanceof Error?e.message:String(e)}function q(e,t,n){e.writeHead(t,{"Content-Type":`application/json; charset=utf-8`}),e.end(JSON.stringify(n))}function br(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,e=>{if(r+=e.length,r>1048576){n(Error(`payload too large`));return}i.push(e)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function xr(e){let t={};for(let[n,r]of Object.entries(e)){let e=``;typeof r==`string`?e=r:(typeof r==`number`||typeof r==`boolean`)&&(e=String(r)),e!==``&&(t[fr(n)]=pr(n,e))}return t}function Sr(e,t){let n=new Set(lr),r={};for(let[t,i]of Object.entries(e))n.has(t)||(r[t]=i);return{...r,...t}}function Cr(e,t){return Ft.createServer(async(n,r)=>{try{let i=(n.headers.host||``).split(`:`)[0];if(i!==`127.0.0.1`&&i!==`localhost`){r.writeHead(403,{"Content-Type":`text/plain; charset=utf-8`}),r.end(`forbidden host
23
+ `),process.stdout.write(`${e(`VOICE ID`,12)} ${e(`NAME`,14)} ${e(`DESCRIPTION`,14)} LANGUAGE\n`),process.stdout.write(`${`-`.repeat(12)} ${`-`.repeat(14)} ${`-`.repeat(14)} ${`-`.repeat(12)}\n`);for(let t of _r)process.stdout.write(`${e(t.voice,12)} ${e(t.name,14)} ${e(t.desc,14)} ${t.lang}\n`);process.stdout.write(`\nTotal: ${_r.length} voices\n`)}const yr={wav:`wav`,mp3:`mp3`,amr:`amr`,aac:`aac`,m4a:`aac`,ogg:`ogg`,"3gp":`3gp`,"3gpp":`3gpp`},br=Object.keys(yr);function xr(e){let n=e.split(`?`)[0].split(`#`)[0],r=Qt(n).slice(1).toLowerCase();if(!r)throw new t(`Cannot infer audio format from "${e}". Use a file/URL whose path ends with: ${br.join(`, `)}.`,a.USAGE);let i=yr[r];if(!i)throw new t(`Unsupported audio extension ".${r}" for "${e}". Supported extensions: ${br.join(`, `)}.`,a.USAGE);return i}function Sr(e){let t=Buffer.alloc(44);return t.write(`RIFF`,0),t.writeUInt32LE(36+e,4),t.write(`WAVE`,8),t.write(`fmt `,12),t.writeUInt32LE(16,16),t.writeUInt16LE(1,20),t.writeUInt16LE(1,22),t.writeUInt32LE(24e3,24),t.writeUInt32LE(48e3,28),t.writeUInt16LE(2,32),t.writeUInt16LE(16,34),t.write(`data`,36),t.writeUInt32LE(e,40),t}var Cr=T({description:`Multimodal chat with text + audio output (Qwen-Omni)`,auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:{message:{type:`array`,valueHint:`<text>`,description:`Message text (repeatable, prefix role: to set role)`},model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: qwen3.5-omni-plus)`},system:{type:`string`,valueHint:`<text>`,description:`System prompt`},image:{type:`array`,valueHint:`<url>`,description:`Image URL or local file (repeatable)`},audio:{type:`array`,valueHint:`<url>`,description:`Audio URL or local file (.wav/.mp3/.amr/.aac/.m4a/.ogg/.3gp/.3gpp)`},video:{type:`array`,valueHint:`<url>`,description:`Video file URL / local path, or comma-separated frame URLs`},voice:{type:`string`,valueHint:`<voice>`,description:`Output voice ID (default: Tina). Use --list-voices to see all options`},listVoices:{type:`switch`,description:`List available output voices and exit`},audioFormat:{type:`string`,valueHint:`<fmt>`,description:`Audio output format (default: wav)`},audioOut:{type:`string`,valueHint:`<path>`,description:`Save audio to file (default: auto-generate)`},textOnly:{type:`switch`,description:`Output text only, no audio generation`},maxTokens:{type:`number`,valueHint:`<n>`,description:`Maximum tokens to generate`},temperature:{type:`number`,valueHint:`<n>`,description:`Sampling temperature (0.0, 2.0]`}},exampleArgs:[`--list-voices`,`--message "Hello, who are you?"`,`--message "Describe this image" --image ./photo.jpg`,`--message "What is this audio saying?" --audio https://example.com/audio.wav`,`--message "Summarize this video" --video https://example.com/video.mp4`,`--message "What is this video about?" --video ./local-video.mp4 --text-only`,`--message "Answer in Sichuan dialect: How's the weather today?" --voice Sunny`,`--message "Hello" --text-only --output json`,`--message "Read this passage aloud" --audio-out greeting.wav`],validate:e=>e.listVoices||e.message?void 0:`Missing required flag: --message`,async run(e){let{settings:t,flags:n}=e;if(n.listVoices){vr();return}let r=n.message??[],i=n.model||t.defaultOmniModel||`qwen3.5-omni-plus`,a=n.voice||`Tina`,o=n.audioFormat||`wav`,s=n.textOnly===!0,c=E(t.output),l=[];n.system&&l.push({role:`system`,content:n.system});let u=new Set([`system`,`user`,`assistant`]);for(let e of r){let t=e.indexOf(`:`),n=t===-1?``:e.slice(0,t);if(u.has(n)){let r=e.slice(t+1);n===`system`?l.push({role:`system`,content:r}):l.push({role:n,content:r})}else l.push({role:`user`,content:e})}let d=n.image||[],f=n.audio||[],p=n.video||[],m=[],h=[],g=[];if(d.length>0||f.length>0||p.length>0){for(let t of d){let n=await e.client.uploadFile(t,i);m.push(n)}for(let t of f){let n=await e.client.uploadFile(t,i);h.push({source:t,data:n})}for(let t of p)if(t.includes(`,`)){let n=t.split(`,`).map(e=>e.trim()).filter(Boolean);for(let t of n){let n=await e.client.uploadFile(t,i);g.push(`frame:${n}`)}}else{let n=await e.client.uploadFile(t,i);g.push(n)}}if(m.length>0||h.length>0||g.length>0){for(let e=l.length-1;e>=0;e--)if(l[e].role===`user`){let t=l[e].content,n=[];typeof t==`string`?n.push({type:`text`,text:t}):Array.isArray(t)&&n.push(...t);for(let e of m)n.push({type:`image_url`,image_url:{url:e}});for(let{source:e,data:t}of h)n.push({type:`input_audio`,input_audio:{data:t,format:xr(e)}});let r=g.filter(e=>e.startsWith(`frame:`)).map(e=>e.slice(6)),i=g.filter(e=>!e.startsWith(`frame:`));r.length>0&&n.push({type:`video`,video:r});for(let e of i)n.push({type:`video_url`,video_url:{url:e}});l[e]={role:`user`,content:n};break}}let _={model:i,messages:l,stream:!0,stream_options:{include_usage:!0}};if(s||(_.modalities=[`text`,`audio`],_.audio={voice:a,format:o}),n.maxTokens!==void 0&&(_.max_tokens=n.maxTokens),n.temperature!==void 0&&(_.temperature=n.temperature),t.dryRun){I({request:_},c);return}if(!t.quiet){let e=s?`text-only`:`text+audio, voice: ${a}`;process.stderr.write(`[Model: ${i}] [${e}]\n`)}let v=await e.client.request({path:x(),method:`POST`,body:_,stream:!0}),y=``,b=``,S=process.stdout.isTTY,C=process.stdout;for await(let e of O(v)){if(e.data===`[DONE]`)break;try{let t=JSON.parse(e.data);for(let e of t.choices){let t=e.delta;t.content&&(y+=t.content,S&&C.write(t.content)),t.audio?.data&&(b+=t.audio.data)}}catch{}}S&&y&&C.write(`
24
+ `);let ee;if(b&&!s){let e=Buffer.from(b,`base64`),r=Sr(e.length),i=Buffer.concat([r,e]),a=n.audioOut;if(!a){let{join:e}=await import(`path`);a=e(A(t,{subDir:`omni`}),`omni_${Date.now()}.wav`)}Yt(a,i),ee=a,t.quiet||process.stderr.write(`Audio saved: ${a}\n`)}if(!S||c===`json`){let e={content:y};ee&&(e.audio_saved=ee,e.voice=a),I(e,c)}}});const wr=[`qwen-image-2.0`,`qwen-image-max`,`wan2.7-image`],Tr=[`qwen-image-2.0`,`qwen-image-max`];function Er(e){return wr.some(t=>e.startsWith(t))}function Dr(e){return Tr.some(t=>e.startsWith(t))}var Or=T({description:`Generate images (Qwen-Image / wan2.x)`,auth:`apiKey`,usageArgs:`--prompt <text> [flags]`,flags:{prompt:{type:`string`,valueHint:`<text>`,description:`Image description`,required:!0},model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: qwen-image-2.0)`},size:{type:`string`,valueHint:`<W*H>`,description:`Image size: ratio (3:4, 16:9, 1:1) or pixels (2048*2048)`},n:{type:`number`,valueHint:`<count>`,description:`Number of images per request (default: 1, max: 6)`},seed:{type:`number`,valueHint:`<n>`,description:`Random seed for reproducible generation`},negativePrompt:{type:`string`,valueHint:`<text>`,description:`Negative prompt to exclude unwanted content`},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:Ct},watermark:{type:`boolean`,valueHint:`<bool>`,description:wt},...e,...n,outDir:{type:`string`,valueHint:`<dir>`,description:`Download images to directory`},outPrefix:{type:`string`,valueHint:`<prefix>`,description:`Filename prefix (default: image)`},pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 3)`}},exampleArgs:[`--prompt "A cat in a spacesuit on Mars"`,`--prompt "Logo design" --n 3 --out-dir ./generated/`,`--prompt "Mountain landscape" --size 2688*1536`,`--prompt "A castle" --seed 42 --prompt-extend false`,`--prompt "Logo" --watermark false`,`--prompt "An alien in the space" --watermark false`,`--prompt "sunset" --model wan2.6-t2i --async --quiet`,`--prompt "Pro quality" --model qwen-image-2.0-pro`,`--prompt "Product shots" --n 2 --concurrent 3 # 6 images in parallel`],async run(e){let{settings:t,flags:n}=e,r=n.prompt,i=n.model||t.defaultImageModel||`qwen-image-2.0`,a=Er(i),o=It(n.size||`1:1`,a),s=n.n??1,c=R(n),l=at(n.promptExtend,Dr(i)?!0:void 0,`prompt-extend`),u=ot(n.watermark),d={model:i,input:{messages:[{role:`user`,content:[{text:r}]}]},parameters:{size:o,n:s,seed:n.seed,prompt_extend:l,watermark:u,negative_prompt:n.negativePrompt||void 0}},f=E(t.output);if(t.dryRun){I({request:d,mode:a?`sync`:`async`},f);return}t.quiet||process.stderr.write(`[Model: ${i}] [Mode: ${a?`sync`:`async`}]\n`),a?await kr(e.client,t,i,d,n,f,c):await Ar(e.client,t,i,d,n,f,c)}});async function kr(e,n,r,i,o,s,c){let l=(await B(c,n,()=>e.requestJson({path:De(),method:`POST`,body:i}))).flatMap(e=>e.output.choices||[]).flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);if(l.length===0)throw new t(`Generation completed but no images returned.`,a.GENERAL);await jr(l,o,n,s)}async function Ar(e,n,r,i,o,s,c){let l=(await B(c,n,()=>e.requestJson({path:Ee(),method:`POST`,body:i,async:!0}),`tasks`)).map(e=>e.output.task_id);if(o.async){I({task_ids:l},s);return}let u=o.pollInterval??3,d=l.map(t=>Pt(e,n,{url:e.url(j(t)),intervalSec:u,timeoutSec:n.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})),f=await Promise.all(d),p=[];for(let e of f){if(e.output.choices){let t=e.output.choices.flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);p.push(...t)}if(e.output.results){let t=e.output.results.map(e=>e.url).filter(Boolean);t.length>0&&p.length===0&&p.push(...t)}}if(p.length===0)throw new t(`All tasks completed but no images returned.`,a.GENERAL);await jr(p,o,n,s,l.length===1?l[0]:void 0,l)}async function jr(e,t,n,r,i,a){let o=A(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),s=t.prompt||``,c=t.outPrefix||ge(`image`,s),l=await kt(e.length>1?e.map((e,t)=>({url:e,destPath:V(o,`${c}_${String(t+1).padStart(3,`0`)}.png`)})):[{url:e[0],destPath:V(o,`${c}.png`)}],P,{quiet:n.quiet});if(n.quiet)F(l.join(`
25
+ `));else{let t={urls:e,saved:l,total:e.length};i&&(t.task_id=i),a&&a.length>1&&(t.task_ids=a),I(t,r)}}const Mr=[`qwen-image-2.0`,`qwen-image-max`,`wan2.7-image`],Nr=[`qwen-image-2.0`,`qwen-image-max`];function Pr(e){return Mr.some(t=>e.startsWith(t))}function Fr(e){return Nr.some(t=>e.startsWith(t))}var Ir=T({description:`Edit an existing image with text instructions (Qwen-Image / Wan 2.7)`,auth:`apiKey`,usageArgs:`--image <url> --prompt <text> [flags]`,flags:{image:{type:`array`,valueHint:`<url>`,description:`Source image URL or local file path (repeatable for multi-image merge)`,required:!0},prompt:{type:`string`,valueHint:`<text>`,description:`Edit instruction text`,required:!0},model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: qwen-image-2.0)`},size:{type:`string`,valueHint:`<W*H>`,description:`Output image size: ratio (3:4, 16:9) or pixels (2048*2048)`},n:{type:`number`,valueHint:`<count>`,description:`Number of images (default: 1, max: 6)`},seed:{type:`number`,valueHint:`<n>`,description:`Random seed for reproducible results`},negativePrompt:{type:`string`,valueHint:`<text>`,description:`Negative prompt to exclude unwanted content`},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:St},watermark:{type:`boolean`,valueHint:`<bool>`,description:wt},outDir:{type:`string`,valueHint:`<dir>`,description:`Download images to directory`},outPrefix:{type:`string`,valueHint:`<prefix>`,description:`Filename prefix (default: edited)`},...e,...n,pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 3)`}},exampleArgs:[`--image ./photo.png --prompt "Replace the background with a beach"`,`--image https://example.com/logo.png --prompt "Change color to blue" --n 3`,`--image ./a.png --image ./b.png --prompt "Merge two images into one collage"`,`--image https://example.com/photo.png --prompt "Remove the person" --model qwen-image-2.0-pro`,`--image ./photo.png --prompt "Change the style" --model wan2.7-image`,`--image ./photo.png --prompt "Replace the background with a beach" --watermark false`],async run(e){let{settings:t,flags:n}=e,r=[];Array.isArray(n.image)?r=n.image:typeof n.image==`string`&&(r=[n.image]);let i=n.prompt,a=n.model||t.defaultImageModel||`qwen-image-2.0`,o=Pr(a),s=await Promise.all(r.map(t=>e.client.resolveImageInput(t,a))),c=n.n??1,l=at(n.promptExtend,Fr(a)?!0:void 0,`prompt-extend`),u=s.map(e=>({image:e}));u.push({text:i});let d=ot(n.watermark),f={model:a,input:{messages:[{role:`user`,content:u}]},parameters:{size:It(n.size,o),n:c,seed:n.seed,prompt_extend:l,watermark:d,negative_prompt:n.negativePrompt||void 0}};ut(f.parameters);let p=E(t.output);if(t.dryRun){I({request:{...f,input:{messages:f.input.messages.map(e=>({...e,content:e.content.map(e=>e.image?{...e,image:k(e.image)}:e)}))}},mode:o?`sync`:`async`},p);return}t.quiet||process.stderr.write(`[Model: ${a}] [Mode: ${o?`sync`:`async`}] [Images: ${s.length}]\n`);let m=R(n);o?await Lr(e.client,t,f,n,p,m):await Rr(e.client,t,f,n,p,m)}});async function Lr(e,n,r,i,o,s){let c=(await B(s,n,()=>e.requestJson({path:De(),method:`POST`,body:r}))).flatMap(e=>e.output.choices||[]).flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);if(c.length===0)throw new t(`Edit completed but no images returned.`,a.GENERAL);await zr(c,i,n,o)}async function Rr(e,n,r,i,o,s){let c=(await B(s,n,()=>e.requestJson({path:Ee(),method:`POST`,body:r,async:!0}),`tasks`)).map(e=>e.output.task_id);if(i.async){I({task_ids:c},o);return}let l=i.pollInterval??3,u=c.map(t=>Pt(e,n,{url:e.url(j(t)),intervalSec:l,timeoutSec:n.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})),d=await Promise.all(u),f=[];for(let e of d){if(e.output.choices){let t=e.output.choices.flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);f.push(...t)}if(e.output.results){let t=e.output.results.map(e=>e.url).filter(Boolean);t.length>0&&f.length===0&&f.push(...t)}}if(f.length===0)throw new t(`All tasks completed but no images returned.`,a.GENERAL);await zr(f,i,n,o)}async function zr(e,t,n,r){let i=A(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),a=t.outPrefix||ge(`edited`,t.prompt),o=await kt(e.length>1?e.map((e,t)=>({url:e,destPath:V(i,`${a}_${String(t+1).padStart(3,`0`)}.png`)})):[{url:e[0],destPath:V(i,`${a}.png`)}],P,{quiet:n.quiet});n.quiet?F(o.join(`
26
+ `)):I({urls:e,saved:o,total:e.length},r)}var Br=T({description:`Generate a video from text or image (happyhorse-1.1-t2v / happyhorse-1.1-i2v / wan2.6-t2v)`,auth:`apiKey`,usageArgs:`--prompt <text> [--image <url>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: happyhorse-1.1-t2v, or happyhorse-1.1-i2v with --image)`},prompt:{type:`string`,valueHint:`<text>`,description:`Video description`,required:!0},image:{type:`string`,valueHint:`<url>`,description:`Input image URL for image-to-video generation`},negativePrompt:{type:`string`,valueHint:`<text>`,description:`Negative prompt to exclude unwanted content`},resolution:{type:`string`,valueHint:`<res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},ratio:{type:`string`,valueHint:`<ratio>`,description:`Aspect ratio (e.g. 16:9, 9:16, 1:1)`},duration:{type:`number`,valueHint:`<seconds>`,description:`Video duration in seconds (default: 5)`},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:xt},watermark:{type:`boolean`,valueHint:`<bool>`,description:wt},seed:{type:`number`,valueHint:`<n>`,description:`Random seed for reproducible generation`},download:{type:`string`,valueHint:`<path>`,description:`Save video to file on completion`},...e,...n,pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 5)`}},exampleArgs:[`--prompt "A person reading a book, static shot"`,`--prompt "Ocean waves at sunset." --download sunset.mp4`,`--image https://example.com/cat.png --prompt "Make the cat in the scene move"`,`--prompt "Mountain landscape" --resolution 720P --duration 5`,`--prompt "A cat playing with a ball" --watermark false`],async run(e){let{settings:n,flags:r}=e,i=r.prompt,o=r.model||(r.image?n.defaultImageToVideoModel||`happyhorse-1.1-i2v`:n.defaultVideoModel||`happyhorse-1.1-t2v`),s=E(n.output),c=r.image,l;c&&(l=await e.client.resolveImageInput(c,o));let u=ot(r.watermark),d=at(r.promptExtend,void 0,`prompt-extend`),f={model:o,input:{prompt:i,negative_prompt:r.negativePrompt||void 0,...l?{media:[{type:`first_frame`,url:l}]}:{}},parameters:{resolution:r.resolution||void 0,ratio:r.ratio||void 0,duration:r.duration||void 0,prompt_extend:d,watermark:u,seed:r.seed}};if(n.dryRun){I({request:l?{...f,input:{...f.input,media:[{type:`first_frame`,url:k(l)}]}}:f},s);return}let p=(await B(R(r),n,()=>e.client.requestJson({path:vt(),method:`POST`,body:f,async:!0}),`tasks`)).map(e=>e.output.task_id);if(n.quiet||process.stderr.write(`[Model: ${o}]\n`),r.async){I(p.length===1?{task_id:p[0]}:{task_ids:p},s);return}let m=r.pollInterval??5,h=p.map(t=>{let r=e.client.url(j(t));return Pt(e.client,n,{url:r,intervalSec:m,timeoutSec:n.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})}),g=await Promise.all(h),_=[];for(let e=0;e<g.length;e++){let t=g[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&_.push({taskId:p[e],videoUrl:n})}if(_.length===0)throw new t(`All tasks completed but no video URLs returned.`,a.GENERAL);if(r.download){let e=r.download,{size:t}=await P(_[0].videoUrl,e,{quiet:n.quiet});n.quiet?F(e):I({task_id:_[0].taskId,video_url:_[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Mt(t)},s);return}let v=A(n,{subDir:`videos`}),{join:y}=await import(`path`),b=[];await Promise.all(_.map(async({taskId:e,videoUrl:t})=>{let r=y(v,`${e}.mp4`);await P(t,r,{quiet:n.quiet}),b.push({task_id:e,video_url:t,saved:r})})),b.length===1?I(b[0],s):I({videos:b,total:b.length},s)}}),Vr=T({description:`Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.)`,auth:`apiKey`,usageArgs:`--video <url> --prompt <text> [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: happyhorse-1.0-video-edit)`},video:{type:`string`,valueHint:`<url>`,description:`Input video URL or local file (mp4/mov, 2-10s)`,required:!0},prompt:{type:`string`,valueHint:`<text>`,description:`Edit instruction (e.g. "Convert the scene to a claymation style")`},refImage:{type:`string`,valueHint:`<url>`,description:`Reference image URL (up to 4, comma-separated)`},negativePrompt:{type:`string`,valueHint:`<text>`,description:`Negative prompt to exclude unwanted content`},resolution:{type:`string`,valueHint:`<res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},ratio:{type:`string`,valueHint:`<ratio>`,description:`Aspect ratio (16:9, 9:16, 1:1, 4:3, 3:4)`},duration:{type:`number`,valueHint:`<seconds>`,description:`Output video duration in seconds (2-10)`},audioSetting:{type:`string`,valueHint:`<mode>`,description:`Audio: auto (default) or origin (keep original)`,choices:[`auto`,`origin`]},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:xt},watermark:{type:`boolean`,valueHint:`<bool>`,description:wt},seed:{type:`number`,valueHint:`<n>`,description:`Random seed for reproducible generation`},download:{type:`string`,valueHint:`<path>`,description:`Save video to file on completion`},...e,...n,pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 15)`}},exampleArgs:[`--video https://example.com/input.mp4 --prompt "Convert the entire scene to claymation style"`,`--video https://example.com/input.mp4 --prompt "Replace the outfit with the style shown in the image" --ref-image https://example.com/clothes.png`,`--video https://example.com/input.mp4 --prompt "Convert to anime style" --resolution 720P --download output.mp4`,`--video https://example.com/input.mp4 --prompt "Put clothes on the kitten in the video" --watermark false`],async run(e){let{settings:n,flags:r}=e,i=r.video,o=r.prompt,s=r.model||`happyhorse-1.0-video-edit`,c=E(n.output),l=[{type:`video`,url:await e.client.uploadFile(i,s)}],u=r.refImage;if(u){let t=u.split(`,`).map(e=>e.trim()).filter(Boolean);for(let n of t){let t=await e.client.uploadFile(n,s);l.push({type:`reference_image`,url:t})}}let d=at(r.promptExtend,void 0,`prompt-extend`),f=ot(r.watermark),p={model:s,input:{prompt:o||void 0,negative_prompt:r.negativePrompt||void 0,media:l},parameters:{resolution:r.resolution||void 0,ratio:r.ratio||void 0,duration:r.duration||void 0,audio_setting:r.audioSetting||void 0,prompt_extend:d,watermark:f,seed:r.seed}};if(n.dryRun){I({request:p},c);return}let m=(await B(R(r),n,()=>e.client.requestJson({path:vt(),method:`POST`,body:p,async:!0}),`tasks`)).map(e=>e.output.task_id);if(n.quiet||(process.stderr.write(`[Model: ${s}]\n`),process.stderr.write(`Note: Video editing typically takes 5-8 minutes. Please be patient.
27
+ `)),r.async){I(m.length===1?{task_id:m[0]}:{task_ids:m},c);return}let h=r.pollInterval??15,g=Math.max(n.timeout,600),_=await Promise.all(m.map(t=>Pt(e.client,n,{url:e.client.url(j(t)),intervalSec:h,timeoutSec:g,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}}))),v=[];for(let e=0;e<_.length;e++){let t=_[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&v.push({taskId:m[e],videoUrl:n})}if(v.length===0)throw new t(`All tasks completed but no video URLs returned.`,a.GENERAL);if(r.download){let e=r.download,{size:t}=await P(v[0].videoUrl,e,{quiet:n.quiet});n.quiet?F(e):I({task_id:v[0].taskId,video_url:v[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Mt(t)},c);return}let y=await import(`path`),b=A(n,{subDir:`videos`}),x=[];await Promise.all(v.map(async({taskId:e,videoUrl:t})=>{let r=y.join(b,`${e}.mp4`);await P(t,r,{quiet:n.quiet}),x.push({task_id:e,video_url:t,saved:r})})),x.length===1?I(x[0],c):I({videos:x,total:x.length},c)}}),Hr=T({description:`Reference-to-video generation (happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice`,auth:`apiKey`,usageArgs:`--prompt <text> --image <url>... [--ref-video <url>...] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: happyhorse-1.1-r2v)`},prompt:{type:`string`,valueHint:`<text>`,description:`Video description with reference markers (image1, video1, etc.)`,required:!0},image:{type:`array`,valueHint:`<url>`,description:`Reference image URL or local file (repeatable for multiple subjects)`},refVideo:{type:`array`,valueHint:`<url>`,description:`Reference video URL or local file (repeatable)`},imageVoice:{type:`array`,valueHint:`<url>`,description:`Voice URL for corresponding image (pairs by position)`},videoVoice:{type:`array`,valueHint:`<url>`,description:`Voice URL for corresponding ref-video (pairs by position)`},resolution:{type:`string`,valueHint:`<res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},ratio:{type:`string`,valueHint:`<ratio>`,description:`Aspect ratio (16:9, 9:16, 1:1)`},duration:{type:`number`,valueHint:`<seconds>`,description:`Video duration in seconds (default: 5)`},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:xt},watermark:{type:`boolean`,valueHint:`<bool>`,description:wt},seed:{type:`number`,valueHint:`<n>`,description:`Random seed for reproducible generation`},download:{type:`string`,valueHint:`<path>`,description:`Save video to file on completion`},...e,...n,pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 15)`}},exampleArgs:[`--prompt "Image1 running on the grass" --image person.jpg`,`--prompt "Video 1 plays guitar, Image 1 walks over" --ref-video scene.mp4 --image person.jpg`,`--prompt "Image 1 speaks" --image person.jpg --image-voice voice.mp3 --resolution 1080P`,`--prompt "Image 1 and Image 2 have a conversation" --image a.jpg --image b.jpg --image-voice va.mp3 --image-voice vb.mp3`,`--prompt "Image 1 drinks water" --image person.jpg --watermark false`],validate:e=>!e.image?.length&&!e.refVideo?.length?`Provide at least one --image or --ref-video.`:void 0,async run(e){let{settings:n,flags:r}=e,i=r.prompt,o=r.image||[],s=r.refVideo||[],c=r.imageVoice||[],l=r.videoVoice||[],u=r.model||n.defaultReferenceToVideoModel||`happyhorse-1.1-r2v`,d=E(n.output),f=[];for(let t=0;t<o.length;t++){let n={type:`reference_image`,url:await e.client.resolveImageInput(o[t],u)};c[t]&&(n.reference_voice=await e.client.uploadFile(c[t],u)),f.push(n)}for(let t=0;t<s.length;t++){let n={type:`reference_video`,url:await e.client.uploadFile(s[t],u)};l[t]&&(n.reference_voice=await e.client.uploadFile(l[t],u)),f.push(n)}let p=at(r.promptExtend,void 0,`prompt-extend`),m=ot(r.watermark),h={model:u,input:{prompt:i,media:f},parameters:{resolution:r.resolution||void 0,ratio:r.ratio||void 0,duration:r.duration||void 0,prompt_extend:p,watermark:m,seed:r.seed}};if(n.dryRun){I({request:{...h,input:{...h.input,media:h.input.media.map(e=>({...e,url:k(e.url),reference_voice:e.reference_voice?k(e.reference_voice):void 0}))}}},d);return}let g=(await B(R(r),n,()=>e.client.requestJson({path:vt(),method:`POST`,body:h,async:!0}),`tasks`)).map(e=>e.output.task_id);if(n.quiet||(process.stderr.write(`[Model: ${u}]\n`),process.stderr.write(`Note: Reference-to-video typically takes 5-10 minutes. Please be patient.
28
+ `)),r.async){I(g.length===1?{task_id:g[0]}:{task_ids:g},d);return}let _=r.pollInterval??15,v=Math.max(n.timeout,600),y=await Promise.all(g.map(t=>Pt(e.client,n,{url:e.client.url(j(t)),intervalSec:_,timeoutSec:v,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}}))),b=[];for(let e=0;e<y.length;e++){let t=y[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&b.push({taskId:g[e],videoUrl:n})}if(b.length===0)throw new t(`All tasks completed but no video URLs returned.`,a.GENERAL);if(r.download){let e=r.download,{size:t}=await P(b[0].videoUrl,e,{quiet:n.quiet});n.quiet?F(e):I({task_id:b[0].taskId,video_url:b[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Mt(t)},d);return}let{join:x}=await import(`path`),S=A(n,{subDir:`videos`}),C=[];await Promise.all(b.map(async({taskId:e,videoUrl:t})=>{let r=x(S,`${e}.mp4`);await P(t,r,{quiet:n.quiet}),C.push({task_id:e,video_url:t,saved:r})})),C.length===1?I(C[0],d):I({videos:C,total:C.length},d)}}),Ur=T({description:`Query async task status`,auth:`apiKey`,usageArgs:`--task-id <id>`,flags:{taskId:{type:`string`,valueHint:`<id>`,description:`Async task ID`,required:!0}},exampleArgs:[`--task-id 3b256896-3e70-xxxx-xxxx-xxxxxxxxxxxx`,`--task-id 3b256896-3e70-xxxx --output json`],async run(e){let{settings:t,flags:n}=e,r=n.taskId,i=E(t.output);if(t.dryRun){I({task_id:r},i);return}let a=await e.client.requestJson({path:j(r)});if(t.quiet){F(a.output.task_status);return}I({task_id:a.output.task_id,task_status:a.output.task_status,video_url:a.output.video_url,results:a.output.results,submit_time:a.output.submit_time,end_time:a.output.end_time},i)}}),Wr=T({description:`Download a completed video by task ID`,auth:`apiKey`,usageArgs:`--task-id <id> --out <path>`,flags:{taskId:{type:`string`,valueHint:`<id>`,description:`Task ID to download from`,required:!0},out:{type:`string`,valueHint:`<path>`,description:`Output file path`,required:!0}},exampleArgs:[`--task-id 3b256896-xxxx --out video.mp4`,`--task-id 3b256896-xxxx --out video.mp4 --quiet`],async run(e){let{settings:n,flags:r}=e,i=r.taskId,o=r.out,s=E(n.output);if(n.dryRun){I({task_id:i,action:`download`,out:o},s);return}let c=await e.client.requestJson({path:j(i)});if(c.output.task_status!==`SUCCEEDED`)throw new t(`Task is not complete (status: ${c.output.task_status}).`,a.GENERAL,`Wait for the task to complete before downloading.`);let l=c.output.video_url||c.output.results&&c.output.results[0]?.url;if(!l)throw new t(`No download URL available for this task.`,a.GENERAL);let{size:u}=await P(l,o,{quiet:n.quiet});if(n.quiet){F(o);return}I({saved:o,size:Mt(u)},s)}});const Gr=new Set([`.mp4`,`.mov`,`.avi`,`.mkv`,`.webm`,`.flv`,`.wmv`]);function Kr(e){let t=Qt(e).toLowerCase().split(`?`)[0];return!!(Gr.has(t)||/\.(mp4|mov|avi|mkv|webm|flv|wmv)(\?|$)/i.test(e))}async function qr(e){return e.startsWith(`data:`)||e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`oss://`)?e:Te(e)}var Jr=T({description:`Describe an image or video using Qwen-VL`,auth:`apiKey`,usageArgs:`--image <path-or-url> [--video <url>] [--prompt <text>]`,flags:{image:{type:`string`,valueHint:`<path-or-url>`,description:`Local image path or URL`},video:{type:`array`,valueHint:`<url>`,description:`Video file URL or local path (mp4/mov/avi/mkv/webm)`},prompt:{type:`string`,valueHint:`<text>`,description:`Question about the content (default: auto-detected)`},model:{type:`string`,valueHint:`<model>`,description:`Vision model (default: qwen3-vl-plus)`}},exampleArgs:[`--image photo.jpg`,`--image https://example.com/photo.jpg --prompt "What breed is this dog?"`,`--video https://example.com/video.mp4 --prompt "Summarize the video content"`,`--video ./local-video.mp4`,`--image photo.png --prompt "Extract the text" --model qwen3-vl-plus`],validate:e=>!e.image&&!e.video?.length?`Provide --image or --video.`:void 0,async run(e){let{settings:n,flags:r}=e,i=r.image,o=r.video??[],s=r.model||(e.client.usesTokenPlanEndpoint()?n.defaultTextModel:void 0)||`qwen3-vl-plus`;i&&Kr(i)&&(o.push(i),i=void 0);let c=o.length>0?`Describe the video.`:`Describe the image.`,l=r.prompt||c,u=E(n.output);if(n.dryRun){I({request:{prompt:l,image:i?k(i):void 0,video:o.length?o.map(k):void 0,model:s}},u);return}let d=[];if(o.length>0)for(let n of o){let r=n;if(Oe(n)){if(!Wt(n))throw new t(`Video file not found: ${n}`,a.USAGE);r=await e.client.uploadFile(n,s)}d.push({type:`video_url`,video_url:{url:r}})}if(i){let t=await qr(i),n=t;Oe(i)&&t.startsWith(`data:`)&&Jt(i).size>5*1024*1024&&(n=await e.client.resolveImageInput(i,s)),d.push({type:`image_url`,image_url:{url:n}})}d.push({type:`text`,text:l});let f={model:s,messages:[{role:`user`,content:d}]},p=await e.client.requestJson({path:x(),method:`POST`,body:f}),m=p.choices?.[0]?.message?.content;if(u!==`text`){I(p,u);return}F(m||``)}});const Yr=[`base_url`,`output`,`output_dir`,`timeout`,`api_key`,`access_token`,`access_key_id`,`access_key_secret`,`security_token`,`default_text_model`,`default_video_model`,`default_image_to_video_model`,`default_reference_to_video_model`,`default_image_model`,`default_speech_model`,`default_omni_model`,`workspace_id`],Xr=new Set([`api_key`,`access_token`,`access_key_id`,`access_key_secret`,`security_token`]),Zr={"base-url":`base_url`,"output-dir":`output_dir`,"api-key":`api_key`,"access-token":`access_token`,"access-key-id":`access_key_id`,"access-key-secret":`access_key_secret`,"security-token":`security_token`,"default-text-model":`default_text_model`,"default-video-model":`default_video_model`,"default-image-to-video-model":`default_image_to_video_model`,"default-reference-to-video-model":`default_reference_to_video_model`,"default-image-model":`default_image_model`,"default-speech-model":`default_speech_model`,"default-omni-model":`default_omni_model`,"workspace-id":`workspace_id`};function Qr(e){return Zr[e]||e}function $r(e,n){let r=Qr(e);if(!Yr.includes(r))throw new t(`Invalid config key "${e}". Valid keys: ${Yr.join(`, `)}`,a.USAGE);if(r===`output`&&![`text`,`json`].includes(n))throw new t(`Invalid output format "${n}". Valid values: text, json`,a.USAGE);if(r===`timeout`){let e=Number(n);if(isNaN(e)||e<=0)throw new t(`Invalid timeout "${n}". Must be a positive number.`,a.USAGE);return e}return r===`base_url`?Je(n):n}var ei=T({description:`Display current configuration`,auth:`none`,exampleArgs:[``,`--output json`],async run(e){let{settings:t,client:n}=e,r=e.configStore,i=r.read(),a=E(t.output),o={...i,base_url:n.baseUrl,output:t.output,timeout:t.timeout,config:t.configName??`default`,config_file:r.path};for(let e of Xr)typeof o[e]==`string`&&(o[e]=D(o[e]));I(o,a)}}),ti=T({description:`Set a config value`,auth:`none`,usageArgs:`--key <key> --value <value>`,flags:{key:{type:`string`,valueHint:`<key>`,description:`Config key (base_url, output, output_dir, timeout, api_key, access_token, access_key_id, access_key_secret, security_token, default_*_model, workspace_id)`,required:!0},value:{type:`string`,valueHint:`<value>`,description:`Value to set`,required:!0}},exampleArgs:[`--key output --value json`,`--key timeout --value 600`,`--key base_url --value https://dashscope.aliyuncs.com`],async run(e){let{settings:t,flags:n}=e,r=n.key,i=n.value,a=Qr(r),o=$r(r,i),s=E(t.output);if(t.dryRun){I({would_set:{[a]:o},config:t.configName??`default`,config_file:e.configStore.path},s);return}if(await e.configStore.write({[a]:o}),!t.quiet){let n=Xr.has(a)?D(String(o)):o;I({[a]:n,config:t.configName??`default`,config_file:e.configStore.path},s)}}}),ni=T({description:`List config profiles and show the active profile`,auth:`none`,exampleArgs:[``,`--output json`],async run(e){let t=e.configStore.profiles(),n=[`default`,...Object.keys(t.named).sort()],r=E(e.settings.output);if(r===`json`){I({active_config:t.active,profiles:n,config_file:e.configStore.path},r);return}let i=Math.max(4,...n.map(e=>e.length));F(`${`NAME`.padEnd(i)} ACTIVE`);for(let e of n)F(`${e.padEnd(i)} ${e===t.active?`*`:``}`)}}),ri=T({description:`Set the active config profile`,auth:`none`,usageArgs:`--name <name>`,flags:{name:{type:`string`,valueHint:`<name>`,description:`Existing profile name, or default`,required:!0}},exampleArgs:[`--name token-plan`,`--name default`],async run(e){let t=E(e.settings.output);if(e.settings.dryRun){I({would_activate:e.configStore.validateActivation(e.flags.name),config_file:e.configStore.path},t);return}let n=await e.configStore.activate(e.flags.name);e.settings.quiet||I({active_config:n,config_file:e.configStore.path},t)}});const ii={port:{type:`number`,valueHint:`<port>`,description:`Port to listen on (default: random free port)`},noOpen:{type:`switch`,description:`Do not open the browser automatically`}};function ai(e){return e instanceof t||e instanceof Error?e.message:String(e)}function W(e,t,n){e.writeHead(t,{"Content-Type":`application/json; charset=utf-8`}),e.end(JSON.stringify(n))}function oi(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,e=>{if(r+=e.length,r>1048576){n(Error(`payload too large`));return}i.push(e)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function si(e){let t={};for(let[n,r]of Object.entries(e)){let e=``;typeof r==`string`?e=r:(typeof r==`number`||typeof r==`boolean`)&&(e=String(r)),e!==``&&(t[Qr(n)]=$r(n,e))}return t}function ci(e,t){let n=new Set(Yr),r={};for(let[t,i]of Object.entries(e))n.has(t)||(r[t]=i);return{...r,...t}}function li(e,t){return Bt.createServer(async(n,r)=>{try{let i=(n.headers.host||``).split(`:`)[0];if(i!==`127.0.0.1`&&i!==`localhost`){r.writeHead(403,{"Content-Type":`text/plain; charset=utf-8`}),r.end(`forbidden host
29
29
  `);return}let a=new URL(n.url??`/`,`http://127.0.0.1`);if(a.searchParams.get(`token`)!==e){r.writeHead(401,{"Content-Type":`text/plain; charset=utf-8`}),r.end(`unauthorized
30
30
  `);return}let o=n.method??`GET`,s=a.pathname;if(s===`/`&&o===`GET`){r.writeHead(200,{"Content-Type":`text/html; charset=utf-8`}),r.end(`<!doctype html>
31
31
  <html lang="en">
@@ -289,71 +289,117 @@ Omni output voices:
289
289
  <\/script>
290
290
  </body>
291
291
  </html>
292
- `);return}if(s===`/api/config`&&o===`GET`){let e=t.profiles();q(r,200,{configFile:t.path,keys:lr,secretKeys:[...ur],activeProfile:e.active,default:e.default,named:e.named});return}if(s===`/api/active`&&o===`POST`){let e=await br(n),i;try{i=JSON.parse(e)}catch{q(r,400,{error:`invalid JSON body`});return}let a=i;try{q(r,200,{activeProfile:await t.activate(a.name)})}catch(e){q(r,400,{error:yr(e)})}return}if(s===`/api/profile`&&o===`POST`){let e=await br(n),t;try{t=JSON.parse(e)}catch{q(r,400,{error:`invalid JSON body`});return}let i=t;if(!i.data||typeof i.data!=`object`||Array.isArray(i.data)){q(r,400,{error:`missing or invalid 'data'`});return}let a,o;try{a=Ue(i.name),o=xr(i.data)}catch(e){q(r,400,{error:yr(e)});return}let s=Sr(Xe(a),o);await ht(s,a),q(r,200,{saved:s});return}if(s===`/api/profile`&&o===`DELETE`){try{q(r,200,{deleted:await ne(a.searchParams.get(`name`)??void 0),activeProfile:t.profiles().active})}catch(e){q(r,400,{error:yr(e)})}return}r.writeHead(404,{"Content-Type":`text/plain; charset=utf-8`}),r.end(`not found
293
- `)}catch{r.headersSent||r.writeHead(500),r.end()}})}var wr=w({description:`Open a local web UI to manage config profiles`,auth:`none`,usageArgs:`[--port <port>] [--no-open]`,flags:vr,exampleArgs:[``,`--port 8787`,`--no-open`],async run(e){let{settings:n,flags:r}=e,i=T(n.output);if(n.dryRun){I({host:`127.0.0.1`,port:r.port??`random free port`,config_file:e.configStore.path,routes:[`GET / -> web UI`,`GET /api/config -> read all profiles`,`POST /api/profile -> save a profile`,`POST /api/active -> activate a profile`,`DELETE /api/profile -> delete a named profile`]},i);return}let o=Pt(16).toString(`hex`),s=Cr(o,e.configStore),c;try{c=await sn(s,r.port??0)}catch(e){throw new t(`Could not bind to 127.0.0.1 (no free port or permission denied): ${yr(e)}`,a.USAGE)}let l=`http://127.0.0.1:${c}/?token=${o}`;if(!r.noOpen)try{await cn(l),F(`Opened the config UI in your default browser.`)}catch{F(`Could not open the browser automatically. Open the URL below manually.`)}F(`Config UI running at ${l}`),F(`Note: credentials are shown in cleartext in the browser (localhost only).`),F(`Press Ctrl+C to stop.`),await new Promise(e=>{let t=()=>s.close(()=>e());process.once(`SIGINT`,t),process.once(`SIGTERM`,t),s.once(`close`,()=>e())})}});function J(e){if(!H(e))return{};try{return JSON.parse(U(e,`utf-8`))}catch{return{}}}function Y(e,t){zt(Wt(e),{recursive:!0});let n=e+`.tmp`;Ht(n,JSON.stringify(t,null,2)+`
294
- `,{mode:384}),Bt(n,e)}function Tr(e,t){zt(Wt(e),{recursive:!0});let n=e+`.tmp`;Ht(n,t,{mode:384}),Bt(n,e)}function X(e){H(e)&&Lt(e,`${e}.bak.${Math.floor(Date.now()/1e3)}`)}function Er(e){return e.includes(`/apps/anthropic`)}var Dr={label:`Claude Code`,write({baseUrl:e,apiKey:t,model:n}){let r=W(G(),`.claude`,`settings.json`),i=W(G(),`.claude.json`);X(r);let a=J(r),o=a.env??{};o.ANTHROPIC_BASE_URL=e,o.ANTHROPIC_AUTH_TOKEN=t,o.ANTHROPIC_MODEL=n,o.ANTHROPIC_DEFAULT_HAIKU_MODEL=n,o.ANTHROPIC_DEFAULT_SONNET_MODEL=n,o.ANTHROPIC_DEFAULT_OPUS_MODEL=n,o.CLAUDE_CODE_SUBAGENT_MODEL=n,a.env=o,Y(r,a),X(i);let s=J(i);return s.hasCompletedOnboarding=!0,Y(i,s),{paths:[r,i],nextStep:"Run `claude` to start using Claude Code with DashScope."}}};const Or=`BAILIAN_CLI_API_KEY`;var kr={label:`Qwen Code`,write({baseUrl:e,apiKey:t,model:n}){let r=W(G(),`.qwen`,`settings.json`),i=Er(e)?`anthropic`:`openai`;X(r);let a=J(r),o=a.env??{};o[Or]=t,a.env=o;let s=a.modelProviders??{},c=s[i]??[],l=c.find(t=>t.id===n&&(t.baseUrl??``)===e);l?(l.name=`bailian-cli`,l.baseUrl=e,l.envKey=Or):c.push({id:n,name:`bailian-cli`,baseUrl:e,envKey:Or}),s[i]=c,a.modelProviders=s;let u=a.security??{};return u.auth={selectedType:i,apiKey:t,baseUrl:e},a.security=u,a.model={name:n,baseUrl:e},Y(r,a),{paths:[r],nextStep:"Run `qwen` to start using Qwen Code with DashScope."}}},Ar={label:`OpenCode`,write({baseUrl:e,apiKey:t,model:n}){let r=W(G(),`.config`,`opencode`,`opencode.json`);X(r);let i=J(r);i.$schema||=`https://opencode.ai/config.json`;let a=i.provider??{};return a[`bailian-cli`]={npm:Er(e)?`@ai-sdk/anthropic`:`@ai-sdk/openai-compatible`,name:`Alibaba Cloud Model Studio`,options:{baseURL:e,apiKey:t,setCacheKey:!0},models:{[n]:{name:n}}},i.provider=a,Y(r,i),{paths:[r],nextStep:"Run `opencode` then type `/models` to select your model."}}},jr={label:`OpenClaw`,write({baseUrl:e,apiKey:t,model:n}){let r=W(G(),`.openclaw`,`openclaw.json`);X(r);let i=J(r),a=i.models??{};a.mode=`merge`;let o=a.providers??{};o[`bailian-cli`]={baseUrl:e,apiKey:t,api:Er(e)?`anthropic-messages`:`openai-completions`,models:[{id:n,name:n,contextWindow:1e6,cost:{input:0,output:0}}]},a.providers=o,i.models=a;let s=i.agents??{},c=s.defaults??{};return c.model={primary:`bailian-cli/${n}`},s.defaults=c,i.agents=s,Y(r,i),{paths:[r],nextStep:"Run `openclaw` to start using OpenClaw with DashScope."}}};const Mr=`bailian-cli`;var Nr={label:`Hermes Agent`,write({baseUrl:e,apiKey:t,model:n}){let r=W(G(),`.hermes`,`config.yaml`);X(r);let i={};if(H(r))try{i=qt.parse(U(r,`utf-8`))??{}}catch{i={}}let a={name:Mr,base_url:e,api_key:t,api_mode:Er(e)?`anthropic_messages`:`chat_completions`,models:[{id:n,name:n}]},o=Array.isArray(i.custom_providers)?i.custom_providers:[],s=o.findIndex(e=>e.name===Mr);return s>=0?o[s]=a:o.push(a),i.custom_providers=o,i.model={default:n,provider:Mr},Tr(r,qt.stringify(i)),{paths:[r],nextStep:'Run `hermes chat -q "hello"` to verify.'}}};const Pr=`bailian-cli`,Fr={"claude-code":Dr,"qwen-code":kr,opencode:Ar,openclaw:jr,hermes:Nr,codex:{label:`Codex`,write({baseUrl:e,apiKey:t,model:n}){let r=W(G(),`.codex`,`config.toml`);X(r);let i={};if(H(r))try{i=Jt(U(r,`utf-8`))}catch{i={}}i.model_provider=Pr,i.model=n,i.model_reasoning_effort=`high`,i.disable_response_storage=!0;let a=i.model_providers??{};a[Pr]={...a[Pr]??{},name:Pr,base_url:e,wire_api:`responses`,requires_openai_auth:!0},i.model_providers=a,Tr(r,Yt(i)+`
295
- `);let o=W(G(),`.codex`,`auth.json`);X(o);let s=J(o);return s.OPENAI_API_KEY=t,Y(o,s),{paths:[r,o],nextStep:"Run `codex` to start using Codex with DashScope."}}}},Ir=Object.keys(Fr);var Lr=w({description:`Configure a coding agent to use DashScope API`,auth:`none`,usageArgs:`--agent <name> --base-url <url> --api-key <key> --model <model>`,flags:{agent:{type:`string`,valueHint:`<name>`,description:`Target agent: ${Ir.join(`, `)}`,required:!0,choices:Ir},baseUrl:{type:`string`,valueHint:`<url>`,description:`API base URL`,required:!0},apiKey:{type:`string`,valueHint:`<key>`,description:`API key`,required:!0},model:{type:`string`,valueHint:`<model>`,description:`Default model name`,required:!0}},exampleArgs:[`--agent claude-code --base-url https://dashscope.aliyuncs.com/apps/anthropic --api-key sk-xxxxx --model qwen3-max`,`--agent qwen-code --base-url https://dashscope.aliyuncs.com/compatible-mode/v1 --api-key sk-xxxxx --model qwen3-coder-plus`,`--agent codex --base-url https://dashscope.aliyuncs.com/compatible-mode/v1 --api-key sk-xxxxx --model qwen3-coder-plus`],async run(e){let{settings:t,flags:n}=e,r=n.agent,{baseUrl:i,apiKey:a,model:o}=n,s=Fr[r],c=T(t.output);if(r===`hermes`&&Kt()===`win32`&&process.stderr.write(`Warning: Hermes Agent does not support native Windows. Please use WSL2.
296
- `),t.dryRun){I({agent:r,label:s.label,base_url:i,api_key:O(a),model:o},c);return}let l={baseUrl:i,apiKey:a,model:o},u=s.write(l);if(!t.quiet){F(`${s.label} configured successfully.`);for(let e of u.paths)F(` Written: ${e}`);F(` ${u.nextStep}`)}}});const Rr=`npx skills add modelstudioai/cli --all -g -y`;function zr(e){return{cmd:`npm install -g ${e}@latest`,label:`npm`}}function Br(e){process.stderr.write(`
292
+ `);return}if(s===`/api/config`&&o===`GET`){let e=t.profiles();W(r,200,{configFile:t.path,keys:Yr,secretKeys:[...Xr],activeProfile:e.active,default:e.default,named:e.named});return}if(s===`/api/active`&&o===`POST`){let e=await oi(n),i;try{i=JSON.parse(e)}catch{W(r,400,{error:`invalid JSON body`});return}let a=i;try{W(r,200,{activeProfile:await t.activate(a.name)})}catch(e){W(r,400,{error:ai(e)})}return}if(s===`/api/profile`&&o===`POST`){let e=await oi(n),t;try{t=JSON.parse(e)}catch{W(r,400,{error:`invalid JSON body`});return}let i=t;if(!i.data||typeof i.data!=`object`||Array.isArray(i.data)){W(r,400,{error:`missing or invalid 'data'`});return}let a,o;try{a=qe(i.name),o=si(i.data)}catch(e){W(r,400,{error:ai(e)});return}let s=ci(et(a),o);await yt(s,a),W(r,200,{saved:s});return}if(s===`/api/profile`&&o===`DELETE`){try{W(r,200,{deleted:await ne(a.searchParams.get(`name`)??void 0),activeProfile:t.profiles().active})}catch(e){W(r,400,{error:ai(e)})}return}r.writeHead(404,{"Content-Type":`text/plain; charset=utf-8`}),r.end(`not found
293
+ `)}catch{r.headersSent||r.writeHead(500),r.end()}})}var ui=T({description:`Open a local web UI to manage config profiles`,auth:`none`,usageArgs:`[--port <port>] [--no-open]`,flags:ii,exampleArgs:[``,`--port 8787`,`--no-open`],async run(e){let{settings:n,flags:r}=e,i=E(n.output);if(n.dryRun){I({host:`127.0.0.1`,port:r.port??`random free port`,config_file:e.configStore.path,routes:[`GET / -> web UI`,`GET /api/config -> read all profiles`,`POST /api/profile -> save a profile`,`POST /api/active -> activate a profile`,`DELETE /api/profile -> delete a named profile`]},i);return}let o=zt(16).toString(`hex`),s=li(o,e.configStore),c;try{c=await Wn(s,r.port??0)}catch(e){throw new t(`Could not bind to 127.0.0.1 (no free port or permission denied): ${ai(e)}`,a.USAGE)}let l=`http://127.0.0.1:${c}/?token=${o}`;if(!r.noOpen)try{await Gn(l),F(`Opened the config UI in your default browser.`)}catch{F(`Could not open the browser automatically. Open the URL below manually.`)}F(`Config UI running at ${l}`),F(`Note: credentials are shown in cleartext in the browser (localhost only).`),F(`Press Ctrl+C to stop.`),await new Promise(e=>{let t=()=>s.close(()=>e());process.once(`SIGINT`,t),process.once(`SIGTERM`,t),s.once(`close`,()=>e())})}});function G(e){if(!Wt(e))return{};try{return JSON.parse(Kt(e,`utf-8`))}catch{return{}}}function di(e,t){Gt(Zt(e),{recursive:!0});let n=e+`.tmp`;Yt(n,JSON.stringify(t,null,2)+`
294
+ `,{mode:384}),qt(n,e)}function fi(e,t){Gt(Zt(e),{recursive:!0});let n=e+`.tmp`;Yt(n,t,{mode:384}),qt(n,e)}function K(e){Wt(e)&&Ht(e,`${e}.bak.${Math.floor(Date.now()/1e3)}`)}function pi(e){return e.includes(`/apps/anthropic`)}var mi={label:`Claude Code`,write({baseUrl:e,apiKey:t,model:n}){let r=V(H(),`.claude`,`settings.json`),i=V(H(),`.claude.json`);K(r);let a=G(r),o=a.env??{};o.ANTHROPIC_BASE_URL=e,o.ANTHROPIC_AUTH_TOKEN=t,o.ANTHROPIC_MODEL=n,o.ANTHROPIC_DEFAULT_HAIKU_MODEL=n,o.ANTHROPIC_DEFAULT_SONNET_MODEL=n,o.ANTHROPIC_DEFAULT_OPUS_MODEL=n,o.CLAUDE_CODE_SUBAGENT_MODEL=n,a.env=o,di(r,a),K(i);let s=G(i);return s.hasCompletedOnboarding=!0,di(i,s),{paths:[r,i],nextStep:"Run `claude` to start using Claude Code with DashScope."}}};const hi=`BAILIAN_CLI_API_KEY`;var gi={label:`Qwen Code`,write({baseUrl:e,apiKey:t,model:n}){let r=V(H(),`.qwen`,`settings.json`),i=pi(e)?`anthropic`:`openai`;K(r);let a=G(r),o=a.env??{};o[hi]=t,a.env=o;let s=a.modelProviders??{},c=s[i]??[],l=c.find(t=>t.id===n&&(t.baseUrl??``)===e);l?(l.name=`bailian-cli`,l.baseUrl=e,l.envKey=hi):c.push({id:n,name:`bailian-cli`,baseUrl:e,envKey:hi}),s[i]=c,a.modelProviders=s;let u=a.security??{};return u.auth={selectedType:i,apiKey:t,baseUrl:e},a.security=u,a.model={name:n,baseUrl:e},di(r,a),{paths:[r],nextStep:"Run `qwen` to start using Qwen Code with DashScope."}}},_i={label:`OpenCode`,write({baseUrl:e,apiKey:t,model:n}){let r=V(H(),`.config`,`opencode`,`opencode.json`);K(r);let i=G(r);i.$schema||=`https://opencode.ai/config.json`;let a=i.provider??{};return a[`bailian-cli`]={npm:pi(e)?`@ai-sdk/anthropic`:`@ai-sdk/openai-compatible`,name:`Alibaba Cloud Model Studio`,options:{baseURL:e,apiKey:t,setCacheKey:!0},models:{[n]:{name:n}}},i.provider=a,di(r,i),{paths:[r],nextStep:"Run `opencode` then type `/models` to select your model."}}},vi={label:`OpenClaw`,write({baseUrl:e,apiKey:t,model:n}){let r=V(H(),`.openclaw`,`openclaw.json`);K(r);let i=G(r),a=i.models??{};a.mode=`merge`;let o=a.providers??{};o[`bailian-cli`]={baseUrl:e,apiKey:t,api:pi(e)?`anthropic-messages`:`openai-completions`,models:[{id:n,name:n,contextWindow:1e6,cost:{input:0,output:0}}]},a.providers=o,i.models=a;let s=i.agents??{},c=s.defaults??{};return c.model={primary:`bailian-cli/${n}`},s.defaults=c,i.agents=s,di(r,i),{paths:[r],nextStep:"Run `openclaw` to start using OpenClaw with DashScope."}}};const yi=`bailian-cli`;var bi={label:`Hermes Agent`,write({baseUrl:e,apiKey:t,model:n}){let r=V(H(),`.hermes`,`config.yaml`);K(r);let i={};if(Wt(r))try{i=en.parse(Kt(r,`utf-8`))??{}}catch{i={}}let a={name:yi,base_url:e,api_key:t,api_mode:pi(e)?`anthropic_messages`:`chat_completions`,models:[{id:n,name:n}]},o=Array.isArray(i.custom_providers)?i.custom_providers:[],s=o.findIndex(e=>e.name===yi);return s>=0?o[s]=a:o.push(a),i.custom_providers=o,i.model={default:n,provider:yi},fi(r,en.stringify(i)),{paths:[r],nextStep:'Run `hermes chat -q "hello"` to verify.'}}};const xi=`bailian-cli`,Si={"claude-code":mi,"qwen-code":gi,opencode:_i,openclaw:vi,hermes:bi,codex:{label:`Codex`,write({baseUrl:e,apiKey:t,model:n}){let r=V(H(),`.codex`,`config.toml`);K(r);let i={};if(Wt(r))try{i=tn(Kt(r,`utf-8`))}catch{i={}}i.model_provider=xi,i.model=n,i.model_reasoning_effort=`high`,i.disable_response_storage=!0;let a=i.model_providers??{};a[xi]={...a[xi]??{},name:xi,base_url:e,wire_api:`responses`,requires_openai_auth:!0},i.model_providers=a,fi(r,nn(i)+`
295
+ `);let o=V(H(),`.codex`,`auth.json`);K(o);let s=G(o);return s.OPENAI_API_KEY=t,di(o,s),{paths:[r,o],nextStep:"Run `codex` to start using Codex with DashScope."}}}},Ci=Object.keys(Si);var wi=T({description:`Configure a coding agent to use DashScope API`,auth:`none`,usageArgs:`--agent <name> --base-url <url> --api-key <key> --model <model>`,flags:{agent:{type:`string`,valueHint:`<name>`,description:`Target agent: ${Ci.join(`, `)}`,required:!0,choices:Ci},baseUrl:{type:`string`,valueHint:`<url>`,description:`API base URL`,required:!0},apiKey:{type:`string`,valueHint:`<key>`,description:`API key`,required:!0},model:{type:`string`,valueHint:`<model>`,description:`Default model name`,required:!0}},exampleArgs:[`--agent claude-code --base-url https://dashscope.aliyuncs.com/apps/anthropic --api-key sk-xxxxx --model qwen3-max`,`--agent qwen-code --base-url https://dashscope.aliyuncs.com/compatible-mode/v1 --api-key sk-xxxxx --model qwen3-coder-plus`,`--agent codex --base-url https://dashscope.aliyuncs.com/compatible-mode/v1 --api-key sk-xxxxx --model qwen3-coder-plus`],async run(e){let{settings:t,flags:n}=e,r=n.agent,{baseUrl:i,apiKey:a,model:o}=n,s=Si[r],c=E(t.output);if(r===`hermes`&&$t()===`win32`&&process.stderr.write(`Warning: Hermes Agent does not support native Windows. Please use WSL2.
296
+ `),t.dryRun){I({agent:r,label:s.label,base_url:i,api_key:D(a),model:o},c);return}let l={baseUrl:i,apiKey:a,model:o},u=s.write(l);if(!t.quiet){F(`${s.label} configured successfully.`);for(let e of u.paths)F(` Written: ${e}`);F(` ${u.nextStep}`)}}});const Ti=`npx skills add modelstudioai/cli --all -g -y`;function Ei(e){return{cmd:`npm install -g ${e}@latest`,label:`npm`}}function Di(e){process.stderr.write(`
297
297
  Updating agent skill...
298
- `);try{Xt(Rr,{stdio:`inherit`}),process.stderr.write(`${e.green(`✓ Agent skill updated.`)}\n`)}catch{process.stderr.write(`${e.yellow(`Agent skill update skipped. Run manually: ${Rr}`)}\n`)}}var Vr=w({description:`Update the CLI to the latest version`,auth:`none`,exampleArgs:[``],async run(e){let{identity:t}=e,n=t.npmPackage,r=t.binName,i=t.version,a=M(process.stderr);process.stderr.write(`Current version: ${a.yellow(i)}\n`),process.stderr.write(`Checking for updates...
299
- `);let o=await Dt(5e3,n);if(o&&o===i){process.stderr.write(`${a.green(`\u2713 Already up to date (${i}).`)}\n`),Br(a);return}o&&process.stderr.write(`Latest version: ${a.green(o)}\n\n`);let{cmd:s,label:c}=zr(n);process.stderr.write(`Updating ${n} via ${c}...\n\n`);try{Xt(s,{stdio:`inherit`});try{let e=Xt(`${r} --version 2>/dev/null`,{encoding:`utf-8`}).trim().replace(RegExp(`^${r}\\s+`),``);process.stderr.write(`\n${a.green(`\u2713 Update complete: ${i} \u2192 ${e}`)}\n`);try{Ht(W(he(),`update-state.json`),JSON.stringify({lastChecked:Date.now(),latestVersion:e}))}catch{}}catch{process.stderr.write(`\n${a.green(`✓ Update complete.`)}\n`)}Br(a)}catch{process.stderr.write(`
298
+ `);try{rn(Ti,{stdio:`inherit`}),process.stderr.write(`${e.green(`✓ Agent skill updated.`)}\n`)}catch{process.stderr.write(`${e.yellow(`Agent skill update skipped. Run manually: ${Ti}`)}\n`)}}var Oi=T({description:`Update the CLI to the latest version`,auth:`none`,exampleArgs:[``],async run(e){let{identity:t}=e,n=t.npmPackage,r=t.binName,i=t.version,a=M(process.stderr);process.stderr.write(`Current version: ${a.yellow(i)}\n`),process.stderr.write(`Checking for updates...
299
+ `);let o=await jt(5e3,n);if(o&&o===i){process.stderr.write(`${a.green(`\u2713 Already up to date (${i}).`)}\n`),Di(a);return}o&&process.stderr.write(`Latest version: ${a.green(o)}\n\n`);let{cmd:s,label:c}=Ei(n);process.stderr.write(`Updating ${n} via ${c}...\n\n`);try{rn(s,{stdio:`inherit`});try{let e=rn(`${r} --version 2>/dev/null`,{encoding:`utf-8`}).trim().replace(RegExp(`^${r}\\s+`),``);process.stderr.write(`\n${a.green(`\u2713 Update complete: ${i} \u2192 ${e}`)}\n`);try{Yt(V(_e(),`update-state.json`),JSON.stringify({lastChecked:Date.now(),latestVersion:e}))}catch{}}catch{process.stderr.write(`\n${a.green(`✓ Update complete.`)}\n`)}Di(a)}catch{process.stderr.write(`
300
300
  Automatic update failed. Please run manually:
301
- `),process.stderr.write(` ${s}\n\n`)}}}),Hr=w({description:`Call a Bailian application (agent or workflow)`,auth:`apiKey`,usageArgs:`--app-id <id> --prompt <text> [flags]`,flags:{appId:{type:`string`,valueHint:`<id>`,description:`Application ID (required)`,required:!0},prompt:{type:`string`,valueHint:`<text>`,description:`Input prompt text`,required:!0},image:{type:`array`,valueHint:`<url>`,description:`Image URL(s) to pass to the app (repeatable)`},fileId:{type:`array`,valueHint:`<id>`,description:`Pre-uploaded file ID(s) (repeatable)`},sessionId:{type:`string`,valueHint:`<id>`,description:`Session ID for multi-turn conversation`},stream:{type:`switch`,description:`Stream response (default: on in TTY)`},pipelineIds:{type:`string`,valueHint:`<ids>`,description:`Knowledge base pipeline IDs (comma-separated)`},memoryId:{type:`string`,valueHint:`<id>`,description:`Memory ID for long-term memory`},bizParams:{type:`string`,valueHint:`<json>`,description:`Business parameters JSON (workflow variables)`},hasThoughts:{type:`switch`,description:`Show agent thinking process`}},exampleArgs:[`--app-id abc123 --prompt "Hello"`,`--app-id abc123 --prompt "Describe this image" --image https://example.com/photo.jpg`,`--app-id abc123 --prompt "Analyze the image" --image img1.jpg --image img2.jpg`,`--app-id abc123 --prompt "Continue" --session-id sess_xxx --stream`,`--app-id abc123 --prompt "Search for materials" --pipeline-ids pipe1,pipe2`,`--app-id abc123 --prompt "Start" --biz-params '{"key":"value"}'`],async run(e){let{settings:t,flags:n}=e,r=n.appId,i=n.prompt,a=n.stream||process.stdout.isTTY,o=T(t.output),s={input:{prompt:i},parameters:{incremental_output:a}};n.sessionId&&(s.input.session_id=n.sessionId);let c=n.image;c&&c.length>0&&(s.input.image_list=c);let l=n.fileId;if(l&&l.length>0&&(s.input.file_ids=l),n.hasThoughts&&(s.parameters.has_thoughts=!0),n.pipelineIds){let e=n.pipelineIds.split(`,`).map(e=>e.trim()).filter(Boolean);s.parameters.rag_options={pipeline_ids:e}}if(n.memoryId&&(s.parameters.memory_id=n.memoryId),n.bizParams)try{s.input.biz_params=JSON.parse(n.bizParams)}catch{throw new p(`--biz-params must be valid JSON`)}if(t.dryRun){I({endpoint:e.client.url(h(r)),request:s},o);return}if(a){let i=await e.client.request({path:h(r),method:`POST`,body:s,headers:{"X-DashScope-SSE":`enable`},stream:!0}),a=``,c=``,l=o===`text`,u=M(process.stderr);for await(let e of k(i)){if(e.data===`[DONE]`)break;try{let t=JSON.parse(e.data),r=t.output?.text;if(r&&(l&&process.stdout.write(r),a+=r),t.output?.session_id&&(c=t.output.session_id),t.output?.thoughts&&n.hasThoughts)for(let e of t.output.thoughts)e.thought&&process.stderr.write(`${u.dim(`[Thinking] ${e.thought}`)}\n`),e.action_name&&process.stderr.write(`${u.dim(`[Action] ${e.action_name}: ${e.action_input||``}`)}\n`),e.observation&&process.stderr.write(`${u.dim(`[Observation] ${e.observation}`)}\n`)}catch{}}c&&!t.quiet&&process.stderr.write(`${u.dim(`Session ID: ${c}`)}\n`),o===`json`?I({text:a,session_id:c},o):process.stdout.write(`
302
- `)}else{let n=await e.client.requestJson({path:h(r),method:`POST`,body:s}),i=n.output?.text??``;t.quiet||o===`text`?F(i):I(n,o)}}});const Ur=`zeldaEasy.broadscope-bailian.app-control.list`;var Wr=w({description:`List Bailian applications`,auth:`console`,usageArgs:`[flags]`,flags:{name:{type:`string`,valueHint:`<name>`,description:`Filter by app name (keyword search)`},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 30)`}},exampleArgs:[``,`--name customer service`,`--page 2 --page-size 10`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=n.name||``,i=n.page||1,a=n.pageSize||30,o=T(t.output),s={reqDTO:{name:r,notInTypes:[10],type:5,statuses:[1,4],page_no:i,page_size:a}};if(t.dryRun){I({api:Ur,data:s},o);return}let c=await e.client.console(Ur,s),l=c?.data?.DataV2?.data?.data?.list??[];I({total:c?.data?.DataV2?.data?.data?.total??0,apps:l.map(e=>({code:e.code,name:e.name,user_prompt_params:e.config?.user_prompt_params??[]}))},o)}}),Gr=w({description:`Add memory from messages or custom content`,auth:`apiKey`,usageArgs:`--user-id <id> [--messages <json>] [--content <text>] [flags]`,flags:{userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0},messages:{type:`string`,valueHint:`<json>`,description:`Messages JSON array: [{"role":"user","content":"..."},...]`},content:{type:`string`,valueHint:`<text>`,description:`Custom content text to memorize`},profileSchema:{type:`string`,valueHint:`<id>`,description:`Profile schema ID for user profiling`},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:`Memory library ID (isolate memory space)`}},exampleArgs:[`--user-id user1 --content "The user likes Python programming"`,`--user-id user1 --messages '[{"role":"user","content":"I like traveling"}]'`,`--user-id user1 --content "Lives in Beijing" --profile-schema schema_xxx`],validate:e=>!e.messages&&!e.content?`Provide --messages or --content.`:void 0,async run(e){let{settings:t,flags:n}=e,r={user_id:n.userId};if(n.messages)try{r.messages=JSON.parse(n.messages)}catch{throw new p(`--messages must be valid JSON array`)}n.content&&(r.custom_content=n.content),n.profileSchema&&(r.profile_schema=n.profileSchema),n.memoryLibraryId&&(r.memory_library_id=n.memoryLibraryId);let i=T(t.output);if(t.dryRun){I({endpoint:e.client.url(Re()),request:r},i);return}let a=await e.client.requestJson({path:Re(),method:`POST`,body:r});t.quiet||i===`text`?F(`Memory added. IDs: ${a.memory_ids?.join(`, `)||`none`}`):I(a,i)}}),Kr=w({description:`Search memory nodes by query or messages`,auth:`apiKey`,usageArgs:`--user-id <id> [--query <text>] [flags]`,flags:{userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0},query:{type:`string`,valueHint:`<text>`,description:`Search query text`},messages:{type:`string`,valueHint:`<json>`,description:`Messages JSON array for context-based search`},topK:{type:`number`,valueHint:`<n>`,description:`Number of results to return (default: 10)`},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:`Memory library ID`}},exampleArgs:[`--user-id user1 --query "programming preferences"`,`--user-id user1 --messages '[{"role":"user","content":"recommend a book"}]' --top-k 5`],validate:e=>!e.query&&!e.messages?`Provide --query or --messages.`:void 0,async run(e){let{settings:t,flags:n}=e,r={user_id:n.userId};if(n.query&&(r.query=n.query),n.messages)try{r.messages=JSON.parse(n.messages)}catch{throw new p(`--messages must be valid JSON array`)}!r.messages&&r.query&&(r.messages=[{role:`user`,content:r.query}]),n.topK!==void 0&&(r.top_k=n.topK),n.memoryLibraryId&&(r.memory_library_id=n.memoryLibraryId);let i=T(t.output);if(t.dryRun){I({endpoint:e.client.url(Ve()),request:r},i);return}let a=await e.client.requestJson({path:Ve(),method:`POST`,body:r});if(t.quiet||i===`text`)if(!a.memory_nodes||a.memory_nodes.length===0)F(`No memory nodes found.`);else for(let e of a.memory_nodes)F(`[${e.memory_node_id}] ${e.content}`);else I(a,i)}}),qr=w({description:`List memory nodes for a user`,auth:`apiKey`,usageArgs:`--user-id <id> [flags]`,flags:{userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 10)`},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:`Memory library ID`}},exampleArgs:[`--user-id user1`,`--user-id user1 --page-size 20 --page 2`],async run(e){let{settings:t,flags:n}=e,r=n.userId,i=T(t.output),a=new URLSearchParams;a.set(`user_id`,r),n.pageSize!==void 0&&a.set(`page_size`,String(n.pageSize)),n.page!==void 0&&a.set(`page_num`,String(n.page)),n.memoryLibraryId&&a.set(`memory_library_id`,n.memoryLibraryId);let o=`${ze()}?${a.toString()}`;if(t.dryRun){I({endpoint:e.client.url(o),method:`GET`},i);return}let s=await e.client.requestJson({path:o,method:`GET`});if(t.quiet||i===`text`)if(!s.memory_nodes||s.memory_nodes.length===0)F(`No memory nodes found.`);else{for(let e of s.memory_nodes)F(`[${e.memory_node_id}] ${e.content}`);s.total!==void 0&&F(`\nTotal: ${s.total}`)}else I(s,i)}}),Jr=w({description:`Update a memory node content`,auth:`apiKey`,usageArgs:`--node-id <id> --user-id <id> --content <text>`,flags:{nodeId:{type:`string`,valueHint:`<id>`,description:`Memory node ID (required)`,required:!0},userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0},content:{type:`string`,valueHint:`<text>`,description:`New content for the memory node (required)`,required:!0},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:`Memory library ID (non-default library)`}},exampleArgs:[`--node-id node_xxx --user-id user1 --content "updated memory content"`],async run(e){let{settings:t,flags:n}=e,r=n.nodeId,i={user_id:n.userId,custom_content:n.content};n.memoryLibraryId&&(i.memory_library_id=n.memoryLibraryId);let a=T(t.output);if(t.dryRun){I({endpoint:e.client.url(Be(r)),method:`PATCH`,request:i},a);return}let o=await e.client.requestJson({path:Be(r),method:`PATCH`,body:i});t.quiet||a===`text`?F(`Memory node ${r} updated.`):I(o,a)}}),Yr=w({description:`Delete a memory node`,auth:`apiKey`,usageArgs:`--node-id <id> --user-id <id>`,flags:{nodeId:{type:`string`,valueHint:`<id>`,description:`Memory node ID (required)`,required:!0},userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:`Memory library ID (non-default library)`}},exampleArgs:[`--node-id node_xxx --user-id user1`],async run(e){let{settings:t,flags:n}=e,r=n.nodeId,i=n.userId,a=T(t.output),o=new URLSearchParams({user_id:i});n.memoryLibraryId&&o.set(`memory_library_id`,n.memoryLibraryId);let s=`${Be(r)}?${o.toString()}`;if(t.dryRun){I({endpoint:e.client.url(s),method:`DELETE`},a);return}let c=await e.client.requestJson({path:s,method:`DELETE`});t.quiet||a===`text`?F(`Memory node ${r} deleted.`):I(c,a)}}),Xr=w({description:`Create a user profile schema for memory profiling`,auth:`apiKey`,usageArgs:`--name <name> --attributes <json> [flags]`,flags:{name:{type:`string`,valueHint:`<name>`,description:`Schema name (required)`,required:!0},description:{type:`string`,valueHint:`<text>`,description:`Schema description`},attributes:{type:`string`,valueHint:`<json>`,description:`Attributes JSON array: [{"name":"age","description":"age"}]`,required:!0}},exampleArgs:[`--name "user_basic" --attributes '[{"name":"age","description":"age"},{"name":"hobby","description":"hobby"}]'`],async run(e){let{settings:t,flags:n}=e,r=n.name,i=n.attributes,a;try{a=JSON.parse(i)}catch{throw new p(`--attributes must be valid JSON array`)}let o={name:r,attributes:a};n.description&&(o.description=n.description);let s=T(t.output);if(t.dryRun){I({endpoint:e.client.url(Je()),request:o},s);return}let c=await e.client.requestJson({path:Je(),method:`POST`,body:o});t.quiet||s===`text`?F(`Profile schema created: ${c.profile_schema_id}`):I(c,s)}}),Zr=w({description:`Get user profile by schema ID and user ID`,auth:`apiKey`,usageArgs:`--schema-id <id> --user-id <id>`,flags:{schemaId:{type:`string`,valueHint:`<id>`,description:`Profile schema ID (required)`,required:!0},userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0}},exampleArgs:[`--schema-id schema_xxx --user-id user1`],async run(e){let{settings:t,flags:n}=e,r=n.schemaId,i=n.userId,a=T(t.output),o=new URLSearchParams({user_id:i}),s=`${ft(r)}?${o.toString()}`;if(t.dryRun){I({endpoint:e.client.url(s),method:`GET`},a);return}let c=await e.client.requestJson({path:s,method:`GET`});if(t.quiet||a===`text`)if(c.profile?.attributes)for(let e of c.profile.attributes)F(`${e.name}: ${e.value??`(empty)`}`);else F(`No profile data found.`);else I(c,a)}}),Qr=w({description:"Retrieve from a Bailian knowledge base (deprecated, use `search` instead)",auth:`apiKey`,usageArgs:`--index-id <id> --query <text> [flags]`,flags:{indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base index ID (required)`,required:!0},query:{type:`string`,valueHint:`<text>`,description:`Search query (required)`,required:!0},denseSimilarityTopK:{type:`number`,valueHint:`<n>`,description:`Dense retrieval top K`},sparseSimilarityTopK:{type:`number`,valueHint:`<n>`,description:`Sparse retrieval top K`},rerank:{type:`switch`,description:`Enable reranking`},rerankTopN:{type:`number`,valueHint:`<n>`,description:`Rerank top N results`},rerankModel:{type:`string`,valueHint:`<name>`,description:`Rerank model, e.g. qwen3-rerank-hybrid`},rerankMode:{type:`string`,valueHint:`<mode>`,description:`Rerank mode: qa, similar, or custom`},rerankInstruct:{type:`string`,valueHint:`<text>`,description:`Custom rerank instruction, when mode=custom`},topK:{type:`number`,valueHint:`<n>`,description:`Number of results (deprecated, use --rerank-top-n)`}},exampleArgs:[`--index-id idx_xxx --query "How to use Alibaba Cloud Bailian"`,`--index-id idx_xxx --query "RAG retrieval" --rerank --rerank-model qwen3-rerank-hybrid`],async run(e){let{settings:t,flags:n}=e,r=T(t.output);n.topK!==void 0&&n.rerankTopN===void 0&&(process.stderr.write(`Warning: --top-k is deprecated. Use --rerank-top-n instead.
303
- `),n.rerankTopN=n.topK);let i={index_id:n.indexId,query:n.query,search_filters:[]};if(n.denseSimilarityTopK!==void 0&&(i.dense_similarity_top_k=n.denseSimilarityTopK),n.sparseSimilarityTopK!==void 0&&(i.sparse_similarity_top_k=n.sparseSimilarityTopK),n.rerank&&(i.enable_reranking=!0),n.rerankTopN!==void 0&&(i.rerank_top_n=n.rerankTopN),n.rerankModel){let e={model_name:n.rerankModel};n.rerankMode&&(e.rerank_mode=n.rerankMode),n.rerankInstruct&&(e.rerank_instruct=n.rerankInstruct),i.rerank=[e]}if(t.dryRun){I({endpoint:e.client.url(Oe()),request:i},r);return}let a=await e.client.requestJson({path:Oe(),method:`POST`,body:i}),o=a.data?.nodes||[];t.quiet||r===`text`?$r(o.map(e=>({text:e.text,score:e.score}))):I(a,r)}});function $r(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 ei=w({description:`Search a Bailian knowledge base (RAG semantic retrieval)`,auth:`apiKey`,usageArgs:`--query <text> --agent-id <id> [flags]`,flags:{query:{type:`string`,valueHint:`<text>`,description:`Search query text (required, cannot be empty)`,required:!0},agentId:{type:`string`,valueHint:`<id>`,description:`Retrieval service ID (find in console knowledge retrieval page)`,required:!0},workspaceId:{type:`string`,valueHint:`<id>`,description:`Workspace ID for API endpoint URL (or set BAILIAN_WORKSPACE_ID)`},image:{type:`array`,valueHint:`<url>`,description:`Image URL for multimodal retrieval (repeatable)`},queryHistory:{type:`string`,valueHint:`<json>`,description:`User conversation history JSON for context understanding and query rewriting. Format: '[{"role":"user","content":"What is RAG"},{"role":"assistant","content":"RAG is..."}]'`}},notes:[`Retrieval scope and strategy (multi-index weighting, routing, reranking, etc.) are driven by the agent_id service config. Only query and agent_id are required.`,`Auth: uses DashScope API Key (Bearer token). Get yours from the console API Key page.`,"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or `kscli config set workspace_id <id>`.","`--query-history` passes prior conversation turns; the server rewrites the query based on context to improve retrieval relevance."],exampleArgs:[`--query "What is RAG?" --agent-id aid-xxx --workspace-id ws-xxx`,`--api-key $DASHSCOPE_API_KEY --query "test search" --agent-id aid-xxx --workspace-id ws-xxx --image https://example.com/img.jpg`,`--query "How does it work" --agent-id aid-xxx --workspace-id ws-xxx --query-history '[{"role":"user","content":"What is RAG"},{"role":"assistant","content":"RAG is retrieval-augmented generation"}]'`],async run(e){let{settings:n,flags:r}=e,i=r.workspaceId||n.workspaceId;if(!i)throw new t(`Workspace ID is required.`,a.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: ${e.identity.binName} config set workspace_id <id>`);let o=T(n.output),s={query:r.query,agent_id:r.agentId};if(r.image&&r.image.length>0&&(s.images=r.image),r.queryHistory)try{s.query_history=JSON.parse(r.queryHistory)}catch{throw new t(`--query-history must be valid JSON. Example: --query-history '[{"role":"user","content":"What is RAG"}]'`,a.USAGE)}let c=ke(i);if(n.dryRun){I({endpoint:c,request:s},o);return}let l=await e.client.requestJson({path:c,method:`POST`,body:s}),u=l.data?.nodes||[];if(n.quiet||o===`text`)if(u.length===0)F(`No results found.`);else for(let e=0;e<u.length;e++){let t=u[e];F(`[${e+1}] (score: ${t.score.toFixed(4)})`),F(t.text),F(``)}else I(l,o)}});const ti={message:{type:`array`,valueHint:`<text>`,description:`Message text (repeatable). Supports role:content prefix to set role (e.g. user:hello), defaults to user. Follows OpenAI message format`},agentId:{type:`string`,valueHint:`<id>`,description:`Q&A service ID (find in console knowledge Q&A page)`,required:!0},workspaceId:{type:`string`,valueHint:`<id>`,description:`Workspace ID for API endpoint URL (or set BAILIAN_WORKSPACE_ID)`},image:{type:`array`,valueHint:`<url>`,description:`Image URL (repeatable). Attached to the last user message as multimodal content`}};function ni(e){let t=[];if(e.message){let n=new Set([`user`,`assistant`]);for(let r of e.message){if(r.startsWith(`{`))try{let e=JSON.parse(r);if(e.role&&n.has(e.role)&&e.content!==void 0){t.push(e);continue}}catch{}let e=r.indexOf(`:`),i=e===-1?``:r.slice(0,e);n.has(i)?t.push({role:i,content:r.slice(e+1)}):t.push({role:`user`,content:r})}}return t}function ri(e){for(let t of e)if(Array.isArray(t.content)&&t.content.some(e=>e.type===`image_url`))return!0;return!1}function ii(e,t){let n=-1;for(let t=e.length-1;t>=0;t--)if(e[t].role===`user`){n=t;break}n===-1&&(e.push({role:`user`,content:``}),n=e.length-1);let r=e[n],i=[];typeof r.content==`string`?i.push({type:`text`,text:r.content}):i.push(...r.content);for(let e of t)i.push({type:`image_url`,image_url:{url:e}});r.content=i}const ai={tool_calling:`🔍 Retrieving...`,plan_start:`🤔 Planning...`,generation_start:`✍️ Generating...`};var oi=w({description:`Chat with a Bailian knowledge base (RAG Q&A with streaming)`,auth:`apiKey`,usageArgs:`--message <text> --agent-id <id> [flags]`,flags:ti,notes:[`Response is returned as SSE stream events. Event lifecycle: tool_calling → tool_return → plan_start → planning → plan_end → generation_start → generating → generation_end. tool_calling → tool_return may loop multiple times.`,`Auth: uses DashScope API Key (Bearer token). Get yours from the console API Key page.`,"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or `kscli config set workspace_id <id>`.",`Multi-turn: use --message "user:..." and --message "assistant:..." to pass conversation history.`],exampleArgs:[`--message "What is RAG?" --agent-id aid-xxx --workspace-id ws-xxx`,`--message "user:What is RAG?" --message "assistant:RAG is..." --message "How does it work?" --agent-id aid-xxx --workspace-id ws-xxx`,`--message "Describe these images" --image https://example.com/a.png --image https://example.com/b.png --agent-id aid-xxx --workspace-id ws-xxx`],validate:e=>e.message&&e.message.length>0||e.image&&e.image.length>0?void 0:`Provide --message (or --image for a pure image query).`,async run(e){let{settings:n,flags:r}=e,i=ni(r),o=r.image,s=!!o&&o.length>0;i.length===0&&s&&(i=[{role:`user`,content:``}]);let c=r.workspaceId||n.workspaceId;if(!c)throw new t(`Workspace ID is required.`,a.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: ${e.identity.binName} config set workspace_id <id>`);let l=T(n.output),u=l===`text`&&!!process.stdout.isTTY;if(s){if(ri(i))throw new t(`Cannot use --image when messages already contain embedded image_url content parts. Use one approach or the other.`,a.USAGE);ii(i,o)}let d={input:{messages:i},parameters:{agent_options:{agent_id:r.agentId}},stream:!0},f=De(c);if(n.dryRun){I({endpoint:f,request:d},l);return}let p=await e.client.request({path:f,method:`POST`,body:d,stream:!0});if(u){let e=M(process.stdout),r=n.verbose;for await(let n of k(p)){if(n.data===`[DONE]`)break;if(n.event===`error`){let e=`Chat API error`,r;try{let t=JSON.parse(n.data);e=t.message||e,r=t.code}catch{}throw new t(e,a.GENERAL,r?`API error: ${r}`:void 0)}try{let t=JSON.parse(n.data);for(let n of t.output?.choices??[]){let t=n.message;if(t.extra?.step_change){let n=ai[t.extra.step_change];n&&process.stdout.write(`${e.dim(n)}\n`)}if(r&&t.extra?.step_change&&process.stderr.write(M(process.stderr).dim(`[event] step_change=${t.extra.step_change} step=${t.extra?.step??``} group=${t.extra?.group??``}`)+`
301
+ `),process.stderr.write(` ${s}\n\n`)}}}),ki=T({description:`Call a Bailian application (agent or workflow)`,auth:`apiKey`,usageArgs:`--app-id <id> --prompt <text> [flags]`,flags:{appId:{type:`string`,valueHint:`<id>`,description:`Application ID (required)`,required:!0},prompt:{type:`string`,valueHint:`<text>`,description:`Input prompt text`,required:!0},image:{type:`array`,valueHint:`<url>`,description:`Image URL(s) to pass to the app (repeatable)`},fileId:{type:`array`,valueHint:`<id>`,description:`Pre-uploaded file ID(s) (repeatable)`},sessionId:{type:`string`,valueHint:`<id>`,description:`Session ID for multi-turn conversation`},stream:{type:`switch`,description:`Stream response (default: on in TTY)`},pipelineIds:{type:`string`,valueHint:`<ids>`,description:`Knowledge base pipeline IDs (comma-separated)`},memoryId:{type:`string`,valueHint:`<id>`,description:`Memory ID for long-term memory`},bizParams:{type:`string`,valueHint:`<json>`,description:`Business parameters JSON (workflow variables)`},hasThoughts:{type:`switch`,description:`Show agent thinking process`}},exampleArgs:[`--app-id abc123 --prompt "Hello"`,`--app-id abc123 --prompt "Describe this image" --image https://example.com/photo.jpg`,`--app-id abc123 --prompt "Analyze the image" --image img1.jpg --image img2.jpg`,`--app-id abc123 --prompt "Continue" --session-id sess_xxx --stream`,`--app-id abc123 --prompt "Search for materials" --pipeline-ids pipe1,pipe2`,`--app-id abc123 --prompt "Start" --biz-params '{"key":"value"}'`],async run(e){let{settings:t,flags:n}=e,r=n.appId,i=n.prompt,a=n.stream||process.stdout.isTTY,o=E(t.output),s={input:{prompt:i},parameters:{incremental_output:a}};n.sessionId&&(s.input.session_id=n.sessionId);let c=n.image;c&&c.length>0&&(s.input.image_list=c);let l=n.fileId;if(l&&l.length>0&&(s.input.file_ids=l),n.hasThoughts&&(s.parameters.has_thoughts=!0),n.pipelineIds){let e=n.pipelineIds.split(`,`).map(e=>e.trim()).filter(Boolean);s.parameters.rag_options={pipeline_ids:e}}if(n.memoryId&&(s.parameters.memory_id=n.memoryId),n.bizParams)try{s.input.biz_params=JSON.parse(n.bizParams)}catch{throw new p(`--biz-params must be valid JSON`)}if(t.dryRun){I({endpoint:e.client.url(h(r)),request:s},o);return}if(a){let i=await e.client.request({path:h(r),method:`POST`,body:s,headers:{"X-DashScope-SSE":`enable`},stream:!0}),a=``,c=``,l=o===`text`,u=M(process.stderr);for await(let e of O(i)){if(e.data===`[DONE]`)break;try{let t=JSON.parse(e.data),r=t.output?.text;if(r&&(l&&process.stdout.write(r),a+=r),t.output?.session_id&&(c=t.output.session_id),t.output?.thoughts&&n.hasThoughts)for(let e of t.output.thoughts)e.thought&&process.stderr.write(`${u.dim(`[Thinking] ${e.thought}`)}\n`),e.action_name&&process.stderr.write(`${u.dim(`[Action] ${e.action_name}: ${e.action_input||``}`)}\n`),e.observation&&process.stderr.write(`${u.dim(`[Observation] ${e.observation}`)}\n`)}catch{}}c&&!t.quiet&&process.stderr.write(`${u.dim(`Session ID: ${c}`)}\n`),o===`json`?I({text:a,session_id:c},o):process.stdout.write(`
302
+ `)}else{let n=await e.client.requestJson({path:h(r),method:`POST`,body:s}),i=n.output?.text??``;t.quiet||o===`text`?F(i):I(n,o)}}});const Ai=`zeldaEasy.broadscope-bailian.app-control.list`;var ji=T({description:`List Bailian applications`,auth:`console`,usageArgs:`[flags]`,flags:{name:{type:`string`,valueHint:`<name>`,description:`Filter by app name (keyword search)`},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 30)`}},exampleArgs:[``,`--name customer service`,`--page 2 --page-size 10`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=n.name||``,i=n.page||1,a=n.pageSize||30,o=E(t.output),s={reqDTO:{name:r,notInTypes:[10],type:5,statuses:[1,4],page_no:i,page_size:a}};if(t.dryRun){I({api:Ai,data:s},o);return}let c=await e.client.console(Ai,s),l=c?.data?.DataV2?.data?.data?.list??[];I({total:c?.data?.DataV2?.data?.data?.total??0,apps:l.map(e=>({code:e.code,name:e.name,user_prompt_params:e.config?.user_prompt_params??[]}))},o)}}),Mi=T({description:`Add memory from messages or custom content`,auth:`apiKey`,usageArgs:`--user-id <id> [--messages <json>] [--content <text>] [flags]`,flags:{userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0},messages:{type:`string`,valueHint:`<json>`,description:`Messages JSON array: [{"role":"user","content":"..."},...]`},content:{type:`string`,valueHint:`<text>`,description:`Custom content text to memorize`},profileSchema:{type:`string`,valueHint:`<id>`,description:`Profile schema ID for user profiling`},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:`Memory library ID (isolate memory space)`}},exampleArgs:[`--user-id user1 --content "The user likes Python programming"`,`--user-id user1 --messages '[{"role":"user","content":"I like traveling"}]'`,`--user-id user1 --content "Lives in Beijing" --profile-schema schema_xxx`],validate:e=>!e.messages&&!e.content?`Provide --messages or --content.`:void 0,async run(e){let{settings:t,flags:n}=e,r={user_id:n.userId};if(n.messages)try{r.messages=JSON.parse(n.messages)}catch{throw new p(`--messages must be valid JSON array`)}n.content&&(r.custom_content=n.content),n.profileSchema&&(r.profile_schema=n.profileSchema),n.memoryLibraryId&&(r.memory_library_id=n.memoryLibraryId);let i=E(t.output);if(t.dryRun){I({endpoint:e.client.url(He()),request:r},i);return}let a=await e.client.requestJson({path:He(),method:`POST`,body:r});t.quiet||i===`text`?F(`Memory added. IDs: ${a.memory_ids?.join(`, `)||`none`}`):I(a,i)}}),Ni=T({description:`Search memory nodes by query or messages`,auth:`apiKey`,usageArgs:`--user-id <id> [--query <text>] [flags]`,flags:{userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0},query:{type:`string`,valueHint:`<text>`,description:`Search query text`},messages:{type:`string`,valueHint:`<json>`,description:`Messages JSON array for context-based search`},topK:{type:`number`,valueHint:`<n>`,description:`Number of results to return (default: 10)`},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:`Memory library ID`}},exampleArgs:[`--user-id user1 --query "programming preferences"`,`--user-id user1 --messages '[{"role":"user","content":"recommend a book"}]' --top-k 5`],validate:e=>!e.query&&!e.messages?`Provide --query or --messages.`:void 0,async run(e){let{settings:t,flags:n}=e,r={user_id:n.userId};if(n.query&&(r.query=n.query),n.messages)try{r.messages=JSON.parse(n.messages)}catch{throw new p(`--messages must be valid JSON array`)}!r.messages&&r.query&&(r.messages=[{role:`user`,content:r.query}]),n.topK!==void 0&&(r.top_k=n.topK),n.memoryLibraryId&&(r.memory_library_id=n.memoryLibraryId);let i=E(t.output);if(t.dryRun){I({endpoint:e.client.url(Ge()),request:r},i);return}let a=await e.client.requestJson({path:Ge(),method:`POST`,body:r});if(t.quiet||i===`text`)if(!a.memory_nodes||a.memory_nodes.length===0)F(`No memory nodes found.`);else for(let e of a.memory_nodes)F(`[${e.memory_node_id}] ${e.content}`);else I(a,i)}}),Pi=T({description:`List memory nodes for a user`,auth:`apiKey`,usageArgs:`--user-id <id> [flags]`,flags:{userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 10)`},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:`Memory library ID`}},exampleArgs:[`--user-id user1`,`--user-id user1 --page-size 20 --page 2`],async run(e){let{settings:t,flags:n}=e,r=n.userId,i=E(t.output),a=new URLSearchParams;a.set(`user_id`,r),n.pageSize!==void 0&&a.set(`page_size`,String(n.pageSize)),n.page!==void 0&&a.set(`page_num`,String(n.page)),n.memoryLibraryId&&a.set(`memory_library_id`,n.memoryLibraryId);let o=`${Ue()}?${a.toString()}`;if(t.dryRun){I({endpoint:e.client.url(o),method:`GET`},i);return}let s=await e.client.requestJson({path:o,method:`GET`});if(t.quiet||i===`text`)if(!s.memory_nodes||s.memory_nodes.length===0)F(`No memory nodes found.`);else{for(let e of s.memory_nodes)F(`[${e.memory_node_id}] ${e.content}`);s.total!==void 0&&F(`\nTotal: ${s.total}`)}else I(s,i)}}),Fi=T({description:`Update a memory node content`,auth:`apiKey`,usageArgs:`--node-id <id> --user-id <id> --content <text>`,flags:{nodeId:{type:`string`,valueHint:`<id>`,description:`Memory node ID (required)`,required:!0},userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0},content:{type:`string`,valueHint:`<text>`,description:`New content for the memory node (required)`,required:!0},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:`Memory library ID (non-default library)`}},exampleArgs:[`--node-id node_xxx --user-id user1 --content "updated memory content"`],async run(e){let{settings:t,flags:n}=e,r=n.nodeId,i={user_id:n.userId,custom_content:n.content};n.memoryLibraryId&&(i.memory_library_id=n.memoryLibraryId);let a=E(t.output);if(t.dryRun){I({endpoint:e.client.url(We(r)),method:`PATCH`,request:i},a);return}let o=await e.client.requestJson({path:We(r),method:`PATCH`,body:i});t.quiet||a===`text`?F(`Memory node ${r} updated.`):I(o,a)}}),Ii=T({description:`Delete a memory node`,auth:`apiKey`,usageArgs:`--node-id <id> --user-id <id>`,flags:{nodeId:{type:`string`,valueHint:`<id>`,description:`Memory node ID (required)`,required:!0},userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:`Memory library ID (non-default library)`}},exampleArgs:[`--node-id node_xxx --user-id user1`],async run(e){let{settings:t,flags:n}=e,r=n.nodeId,i=n.userId,a=E(t.output),o=new URLSearchParams({user_id:i});n.memoryLibraryId&&o.set(`memory_library_id`,n.memoryLibraryId);let s=`${We(r)}?${o.toString()}`;if(t.dryRun){I({endpoint:e.client.url(s),method:`DELETE`},a);return}let c=await e.client.requestJson({path:s,method:`DELETE`});t.quiet||a===`text`?F(`Memory node ${r} deleted.`):I(c,a)}}),Li=T({description:`Create a user profile schema for memory profiling`,auth:`apiKey`,usageArgs:`--name <name> --attributes <json> [flags]`,flags:{name:{type:`string`,valueHint:`<name>`,description:`Schema name (required)`,required:!0},description:{type:`string`,valueHint:`<text>`,description:`Schema description`},attributes:{type:`string`,valueHint:`<json>`,description:`Attributes JSON array: [{"name":"age","description":"age"}]`,required:!0}},exampleArgs:[`--name "user_basic" --attributes '[{"name":"age","description":"age"},{"name":"hobby","description":"hobby"}]'`],async run(e){let{settings:t,flags:n}=e,r=n.name,i=n.attributes,a;try{a=JSON.parse(i)}catch{throw new p(`--attributes must be valid JSON array`)}let o={name:r,attributes:a};n.description&&(o.description=n.description);let s=E(t.output);if(t.dryRun){I({endpoint:e.client.url(Qe()),request:o},s);return}let c=await e.client.requestJson({path:Qe(),method:`POST`,body:o});t.quiet||s===`text`?F(`Profile schema created: ${c.profile_schema_id}`):I(c,s)}}),Ri=T({description:`Get user profile by schema ID and user ID`,auth:`apiKey`,usageArgs:`--schema-id <id> --user-id <id>`,flags:{schemaId:{type:`string`,valueHint:`<id>`,description:`Profile schema ID (required)`,required:!0},userId:{type:`string`,valueHint:`<id>`,description:`User ID (required)`,required:!0}},exampleArgs:[`--schema-id schema_xxx --user-id user1`],async run(e){let{settings:t,flags:n}=e,r=n.schemaId,i=n.userId,a=E(t.output),o=new URLSearchParams({user_id:i}),s=`${gt(r)}?${o.toString()}`;if(t.dryRun){I({endpoint:e.client.url(s),method:`GET`},a);return}let c=await e.client.requestJson({path:s,method:`GET`});if(t.quiet||a===`text`)if(c.profile?.attributes)for(let e of c.profile.attributes)F(`${e.name}: ${e.value??`(empty)`}`);else F(`No profile data found.`);else I(c,a)}}),zi=T({description:"Retrieve from a Bailian knowledge base (deprecated, use `search` instead)",auth:`apiKey`,usageArgs:`--index-id <id> --query <text> [flags]`,flags:{indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base index ID (required)`,required:!0},query:{type:`string`,valueHint:`<text>`,description:`Search query (required)`,required:!0},denseSimilarityTopK:{type:`number`,valueHint:`<n>`,description:`Dense retrieval top K`},sparseSimilarityTopK:{type:`number`,valueHint:`<n>`,description:`Sparse retrieval top K`},rerank:{type:`switch`,description:`Enable reranking`},rerankTopN:{type:`number`,valueHint:`<n>`,description:`Rerank top N results`},rerankModel:{type:`string`,valueHint:`<name>`,description:`Rerank model, e.g. qwen3-rerank-hybrid`},rerankMode:{type:`string`,valueHint:`<mode>`,description:`Rerank mode: qa, similar, or custom`},rerankInstruct:{type:`string`,valueHint:`<text>`,description:`Custom rerank instruction, when mode=custom`},topK:{type:`number`,valueHint:`<n>`,description:`Number of results (deprecated, use --rerank-top-n)`}},exampleArgs:[`--index-id idx_xxx --query "How to use Alibaba Cloud Bailian"`,`--index-id idx_xxx --query "RAG retrieval" --rerank --rerank-model qwen3-rerank-hybrid`],async run(e){let{settings:t,flags:n}=e,r=E(t.output);n.topK!==void 0&&n.rerankTopN===void 0&&(process.stderr.write(`Warning: --top-k is deprecated. Use --rerank-top-n instead.
303
+ `),n.rerankTopN=n.topK);let i={index_id:n.indexId,query:n.query,search_filters:[]};if(n.denseSimilarityTopK!==void 0&&(i.dense_similarity_top_k=n.denseSimilarityTopK),n.sparseSimilarityTopK!==void 0&&(i.sparse_similarity_top_k=n.sparseSimilarityTopK),n.rerank&&(i.enable_reranking=!0),n.rerankTopN!==void 0&&(i.rerank_top_n=n.rerankTopN),n.rerankModel){let e={model_name:n.rerankModel};n.rerankMode&&(e.rerank_mode=n.rerankMode),n.rerankInstruct&&(e.rerank_instruct=n.rerankInstruct),i.rerank=[e]}if(t.dryRun){I({endpoint:e.client.url(je()),request:i},r);return}let a=await e.client.requestJson({path:je(),method:`POST`,body:i}),o=a.data?.nodes||[];t.quiet||r===`text`?Bi(o.map(e=>({text:e.text,score:e.score}))):I(a,r)}});function Bi(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 Vi=T({description:`Search a Bailian knowledge base (RAG semantic retrieval)`,auth:`apiKey`,usageArgs:`--query <text> --agent-id <id> [flags]`,flags:{query:{type:`string`,valueHint:`<text>`,description:`Search query text (required, cannot be empty)`,required:!0},agentId:{type:`string`,valueHint:`<id>`,description:`Retrieval service ID (find in console knowledge retrieval page)`,required:!0},workspaceId:{type:`string`,valueHint:`<id>`,description:`Workspace ID for API endpoint URL (or set BAILIAN_WORKSPACE_ID)`},image:{type:`array`,valueHint:`<url>`,description:`Image URL for multimodal retrieval (repeatable)`},queryHistory:{type:`string`,valueHint:`<json>`,description:`User conversation history JSON for context understanding and query rewriting. Format: '[{"role":"user","content":"What is RAG"},{"role":"assistant","content":"RAG is..."}]'`}},notes:[`Retrieval scope and strategy (multi-index weighting, routing, reranking, etc.) are driven by the agent_id service config. Only query and agent_id are required.`,`Auth: uses DashScope API Key (Bearer token). Get yours from the console API Key page.`,"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or `kscli config set workspace_id <id>`.","`--query-history` passes prior conversation turns; the server rewrites the query based on context to improve retrieval relevance."],exampleArgs:[`--query "What is RAG?" --agent-id aid-xxx --workspace-id ws-xxx`,`--api-key $DASHSCOPE_API_KEY --query "test search" --agent-id aid-xxx --workspace-id ws-xxx --image https://example.com/img.jpg`,`--query "How does it work" --agent-id aid-xxx --workspace-id ws-xxx --query-history '[{"role":"user","content":"What is RAG"},{"role":"assistant","content":"RAG is retrieval-augmented generation"}]'`],async run(e){let{settings:n,flags:r}=e,i=r.workspaceId||n.workspaceId;if(!i)throw new t(`Workspace ID is required.`,a.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: ${e.identity.binName} config set workspace_id <id>`);let o=E(n.output),s={query:r.query,agent_id:r.agentId};if(r.image&&r.image.length>0&&(s.images=r.image),r.queryHistory)try{s.query_history=JSON.parse(r.queryHistory)}catch{throw new t(`--query-history must be valid JSON. Example: --query-history '[{"role":"user","content":"What is RAG"}]'`,a.USAGE)}let c=Me(i);if(n.dryRun){I({endpoint:c,request:s},o);return}let l=await e.client.requestJson({path:c,method:`POST`,body:s}),u=l.data?.nodes||[];if(n.quiet||o===`text`)if(u.length===0)F(`No results found.`);else for(let e=0;e<u.length;e++){let t=u[e];F(`[${e+1}] (score: ${t.score.toFixed(4)})`),F(t.text),F(``)}else I(l,o)}});const Hi={message:{type:`array`,valueHint:`<text>`,description:`Message text (repeatable). Supports role:content prefix to set role (e.g. user:hello), defaults to user. Follows OpenAI message format`},agentId:{type:`string`,valueHint:`<id>`,description:`Q&A service ID (find in console knowledge Q&A page)`,required:!0},workspaceId:{type:`string`,valueHint:`<id>`,description:`Workspace ID for API endpoint URL (or set BAILIAN_WORKSPACE_ID)`},image:{type:`array`,valueHint:`<url>`,description:`Image URL (repeatable). Attached to the last user message as multimodal content`}};function Ui(e){let t=[];if(e.message){let n=new Set([`user`,`assistant`]);for(let r of e.message){if(r.startsWith(`{`))try{let e=JSON.parse(r);if(e.role&&n.has(e.role)&&e.content!==void 0){t.push(e);continue}}catch{}let e=r.indexOf(`:`),i=e===-1?``:r.slice(0,e);n.has(i)?t.push({role:i,content:r.slice(e+1)}):t.push({role:`user`,content:r})}}return t}function Wi(e){for(let t of e)if(Array.isArray(t.content)&&t.content.some(e=>e.type===`image_url`))return!0;return!1}function Gi(e,t){let n=-1;for(let t=e.length-1;t>=0;t--)if(e[t].role===`user`){n=t;break}n===-1&&(e.push({role:`user`,content:``}),n=e.length-1);let r=e[n],i=[];typeof r.content==`string`?i.push({type:`text`,text:r.content}):i.push(...r.content);for(let e of t)i.push({type:`image_url`,image_url:{url:e}});r.content=i}const Ki={tool_calling:`🔍 Retrieving...`,plan_start:`🤔 Planning...`,generation_start:`✍️ Generating...`};var qi=T({description:`Chat with a Bailian knowledge base (RAG Q&A with streaming)`,auth:`apiKey`,usageArgs:`--message <text> --agent-id <id> [flags]`,flags:Hi,notes:[`Response is returned as SSE stream events. Event lifecycle: tool_calling → tool_return → plan_start → planning → plan_end → generation_start → generating → generation_end. tool_calling → tool_return may loop multiple times.`,`Auth: uses DashScope API Key (Bearer token). Get yours from the console API Key page.`,"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or `kscli config set workspace_id <id>`.",`Multi-turn: use --message "user:..." and --message "assistant:..." to pass conversation history.`],exampleArgs:[`--message "What is RAG?" --agent-id aid-xxx --workspace-id ws-xxx`,`--message "user:What is RAG?" --message "assistant:RAG is..." --message "How does it work?" --agent-id aid-xxx --workspace-id ws-xxx`,`--message "Describe these images" --image https://example.com/a.png --image https://example.com/b.png --agent-id aid-xxx --workspace-id ws-xxx`],validate:e=>e.message&&e.message.length>0||e.image&&e.image.length>0?void 0:`Provide --message (or --image for a pure image query).`,async run(e){let{settings:n,flags:r}=e,i=Ui(r),o=r.image,s=!!o&&o.length>0;i.length===0&&s&&(i=[{role:`user`,content:``}]);let c=r.workspaceId||n.workspaceId;if(!c)throw new t(`Workspace ID is required.`,a.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: ${e.identity.binName} config set workspace_id <id>`);let l=E(n.output),u=l===`text`&&!!process.stdout.isTTY;if(s){if(Wi(i))throw new t(`Cannot use --image when messages already contain embedded image_url content parts. Use one approach or the other.`,a.USAGE);Gi(i,o)}let d={input:{messages:i},parameters:{agent_options:{agent_id:r.agentId}},stream:!0},f=Ae(c);if(n.dryRun){I({endpoint:f,request:d},l);return}let p=await e.client.request({path:f,method:`POST`,body:d,stream:!0});if(u){let e=M(process.stdout),r=n.verbose;for await(let n of O(p)){if(n.data===`[DONE]`)break;if(n.event===`error`){let e=`Chat API error`,r;try{let t=JSON.parse(n.data);e=t.message||e,r=t.code}catch{}throw new t(e,a.GENERAL,r?`API error: ${r}`:void 0)}try{let t=JSON.parse(n.data);for(let n of t.output?.choices??[]){let t=n.message;if(t.extra?.step_change){let n=Ki[t.extra.step_change];n&&process.stdout.write(`${e.dim(n)}\n`)}if(r&&t.extra?.step_change&&process.stderr.write(M(process.stderr).dim(`[event] step_change=${t.extra.step_change} step=${t.extra?.step??``} group=${t.extra?.group??``}`)+`
304
304
  `),t.content&&process.stdout.write(t.content),n.finish_reason===`stop`)break}}catch{}}process.stdout.write(`
305
- `)}else{let e=``,r=``;for await(let n of k(p)){if(n.data===`[DONE]`)break;if(n.event===`error`){let e=`Chat API error`,r;try{let t=JSON.parse(n.data);e=t.message||e,r=t.code}catch{}throw new t(e,a.GENERAL,r?`API error: ${r}`:void 0)}try{let t=JSON.parse(n.data);t.request_id&&(r=t.request_id);for(let n of t.output?.choices??[])if(n.message?.content&&(e+=n.message.content),n.finish_reason===`stop`)break}catch{}}n.quiet||l===`text`?F(e):I({answer:e,request_id:r},l)}}});const si={target:{type:`string`,valueHint:`<server.tool>`,description:`Server code and tool name joined by a dot, e.g. market-cmapi00073529.SmartStockSelection`,required:!0},arg:{type:`array`,valueHint:`<kv>`,description:`Tool argument (repeatable). Values parsed as JSON if possible, else string.`},json:{type:`string`,valueHint:`<obj>`,description:`Full arguments object as JSON; merged with --arg (arg wins).`},query:{type:`string`,valueHint:`<text>`,description:`Shortcut for --arg query=<text> (mirrors many DashScope MCP tools).`},url:{type:`string`,valueHint:`<url>`,description:`Override the MCP endpoint URL (for non-Bailian servers)`}};function ci(e){let t=e.indexOf(`.`);if(t<=0||t===e.length-1)throw new p(`target must be <server-code>.<tool>, got "${e}".`);return{serverCode:e.slice(0,t),toolName:e.slice(t+1)}}function li(e){let t={};for(let n of e){let e=n.indexOf(`=`);if(e<=0)throw new p(`--arg must be in K=V form, got: ${n}`);let r=n.slice(0,e).trim(),i=n.slice(e+1);try{t[r]=JSON.parse(i)}catch{t[r]=i}}return t}function ui(e){let t;try{t=JSON.parse(e)}catch(e){throw new p(`--json is not valid JSON — ${e.message}`)}if(!t||typeof t!=`object`||Array.isArray(t))throw new p(`--json must decode to an object.`);return t}function di(e){let t=e.json?ui(e.json):{};return Object.assign(t,li(e.arg??[])),e.query!==void 0&&(t.query=e.query),t}function fi(e){try{ci(e.target),di(e)}catch(e){if(e instanceof p)return e.message;throw e}}var pi=w({description:`Call a tool on an MCP server (tools/call)`,auth:`apiKey`,usageArgs:`--target <server.tool> [--arg k=v ...] [--json '{...}'] [--url <url>]`,flags:si,exampleArgs:[`--target market-cmapi00073529.SmartStockSelection --query "Screen consumer stocks with ROE > 15%"`,`--target market-cmapi00073529.FinQuery --json '{"q":"Guizhou Maotai","limit":5}'`,`--target market-cmapi00073529.SmartFundSelection --arg riskLevel=R3 --arg minScale=10`],validate:fi,async run(e){let{settings:n,flags:r}=e,{serverCode:i,toolName:a}=ci(r.target),o=di(r),s=r.url||e.client.url(g(i)),c=T(n.output);if(n.dryRun){I({server:i,url:s,tool:a,arguments:o},c);return}let l=e.client.mcp(s);await l.initialize();let u=await l.callTool(a,o);if(u.isError)throw new t(`Tool error: ${u.content.map(e=>e.text||``).join(`
306
- `)}`);I(u,c)}});const mi=`zeldaEasy.broadscope-bailian.mcp-server.PageList`;var hi=w({description:`List MCP servers activated under your Bailian account`,auth:`console`,usageArgs:`[flags]`,flags:{name:{type:`string`,valueHint:`<text>`,description:`Filter by server name (substring match)`},type:{type:`string`,valueHint:`<type>`,description:`Server type: OFFICIAL | PRIVATE (default: OFFICIAL)`},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 30)`}},exampleArgs:[``,`--name finance`,`--output json`],async run(e){let{settings:n,identity:r,flags:i}=e,o=i.name||``,s=i.type||`OFFICIAL`,c=i.page||1,l=i.pageSize||30,u=T(n.output),d={reqDTO:{type:s,displayTools:!1,activated:1,pageNo:c,pageSize:l,serverName:o}};if(n.dryRun){I({api:mi,data:d,...se(n)},u);return}let f=(await e.client.console(mi,d))?.data??{};if(f.success===!1){let e=f.errorCode??`UnknownError`,n=f.errorMsg??e,i=e===`BailianGateway.Login.NotLogined`?`Run \`${r.binName} auth login --console\` to refresh your console session.`:void 0;throw new t(`Console gateway: ${n}`,a.AUTH,i)}let p=(f.DataV2??{}).data?.data??{},m=p.mcpServerDetailList??[];I({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}))},u)}}),gi=w({description:`List tools exposed by an MCP server (tools/list)`,auth:`apiKey`,usageArgs:`--server <code> [--url <url>]`,flags:{server:{type:`string`,valueHint:`<code>`,description:"Server code from `mcp list` (e.g. market-cmapi00073529)",required:!0},url:{type:`string`,valueHint:`<url>`,description:`Override the MCP endpoint URL (for non-Bailian servers)`}},exampleArgs:[`--server market-cmapi00073529`,`--server market-cmapi00073529 --output json`,`--server my-server --url https://example.com/mcp`],async run(e){let{settings:t,flags:n}=e,r=n.server,i=n.url||e.client.url(g(r)),a=T(t.output);if(t.dryRun){I({server:r,url:i,action:`tools/list`},a);return}let o=e.client.mcp(i);await o.initialize(),I({server:r,url:i,tools:await o.listTools()},a)}}),_i=w({description:`Search the web using DashScope MCP WebSearch service`,auth:`apiKey`,usageArgs:`--query <text> [flags]`,flags:{query:{type:`string`,valueHint:`<text>`,description:`Search query text`},count:{type:`number`,valueHint:`<n>`,description:`Number of search results (default: 10)`},listTools:{type:`switch`,description:`List available MCP tools and exit`}},exampleArgs:[`--query "Alibaba Cloud Bailian latest features"`,`--query "TypeScript 5.9 new features" --count 5`,`--query "Today's news"`,`--list-tools`],validate:e=>!e.listTools&&!e.query?`Missing required flag: --query`:void 0,async run(e){let{settings:n,flags:r}=e,i=T(n.output);if(r.listTools){if(n.dryRun){I({endpoint:e.client.url(Le()),action:`tools/list`},i);return}let t=e.client.mcp(Le());await t.initialize(),I({tools:await t.listTools()},i);return}let a=r.query;if(n.dryRun){I({endpoint:e.client.url(Le()),action:`tools/call`,tool:`bailian_web_search`,arguments:{query:a,count:r.count||void 0}},i);return}let o=e.client.mcp(Le()),s=wt(`Initializing search...`);n.quiet||s.start();try{await o.initialize(),n.quiet||s.update(`Searching...`);let e={query:a};r.count&&(e.count=r.count);let c=await o.callTool(`bailian_web_search`,e);if(c.isError)throw new t(`Search error: ${c.content.map(e=>e.text||``).join(`
307
- `)}`);if(n.quiet||s.stop(`Done.`),i===`json`)I(c,i);else for(let e of c.content)if(e.type===`text`&&e.text)try{let t=JSON.parse(e.text);t.pages&&Array.isArray(t.pages)?I({pages:t.pages,total:t.pages.length},i):I(t,i)}catch{I({text:e.text},i)}}catch(e){throw s.stop(`Failed.`),e}}});const vi=`${i.cn}/cosyvoice-clone-design-api`,yi=[{voice:`longanyang`,name:`龙安洋`,desc:`阳光大男孩`,lang:`中文/英文`},{voice:`longanhuan_v3`,name:`龙安欢`,desc:`欢脱元气女`,lang:`中文/英文`},{voice:`longantai_v3`,name:`龙安台`,desc:`嗲甜台湾女`,lang:`中文/英文`},{voice:`longhua_v3`,name:`龙华`,desc:`元气甜美女`,lang:`中文/英文`},{voice:`longcheng_v3`,name:`龙橙`,desc:`智慧青年男`,lang:`中文/英文`},{voice:`longze_v3`,name:`龙泽`,desc:`温暖元气男`,lang:`中文/英文`},{voice:`longzhe_v3`,name:`龙哲`,desc:`呆板大暖男`,lang:`中文/英文`},{voice:`longyan_v3`,name:`龙颜`,desc:`温暖春风女`,lang:`中文/英文`},{voice:`longxing_v3`,name:`龙星`,desc:`温婉邻家女`,lang:`中文/英文`},{voice:`longtian_v3`,name:`龙天`,desc:`磁性理智男`,lang:`中文/英文`},{voice:`longwan_v3`,name:`龙婉`,desc:`细腻柔声女`,lang:`中文/英文`},{voice:`longqiang_v3`,name:`龙嫱`,desc:`浪漫风情女`,lang:`中文/英文`},{voice:`longfeifei_v3`,name:`龙菲菲`,desc:`甜美娇气女`,lang:`中文/英文`},{voice:`longhao_v3`,name:`龙浩`,desc:`多情忧郁男`,lang:`中文/英文`},{voice:`longanrou_v3`,name:`龙安柔`,desc:`温柔娴静女`,lang:`中文/英文`},{voice:`longxiaochun_v3`,name:`龙小淳`,desc:`知性积极女`,lang:`中文/英文`},{voice:`longxiaoxia_v3`,name:`龙小夏`,desc:`沉稳权威女`,lang:`中文/英文`},{voice:`longyumi_v3`,name:`YUMI`,desc:`正经青年女`,lang:`中文/英文`},{voice:`longanyun_v3`,name:`龙安昀`,desc:`居家暖男`,lang:`中文/英文`},{voice:`longanwen_v3`,name:`龙安温`,desc:`优雅知性女`,lang:`中文/英文`},{voice:`longanli_v3`,name:`龙安莉`,desc:`利落从容女`,lang:`中文/英文`},{voice:`longanlang_v3`,name:`龙安朗`,desc:`清爽利落男`,lang:`中文/英文`},{voice:`longyingmu_v3`,name:`龙应沐`,desc:`优雅知性女`,lang:`中文/英文`},{voice:`longyingxun_v3`,name:`龙应询`,desc:`年轻青涩男`,lang:`中文/英文`},{voice:`longyingjing_v3`,name:`龙应静`,desc:`低调冷静女`,lang:`中文/英文`},{voice:`longyingling_v3`,name:`龙应聆`,desc:`温和共情女`,lang:`中文/英文`},{voice:`longyingtao_v3`,name:`龙应桃`,desc:`温柔淡定女`,lang:`中文/英文`},{voice:`longyingxiao_v3`,name:`龙应笑`,desc:`清甜推销女`,lang:`中文/英文`},{voice:`longfei_v3`,name:`龙飞`,desc:`热血磁性男`,lang:`中文/英文`},{voice:`longhuhu_v3`,name:`龙呼呼`,desc:`天真烂漫女童`,lang:`中文/英文`},{voice:`longpaopao_v3`,name:`龙泡泡`,desc:`飞天泡泡音`,lang:`中文/英文`},{voice:`longjielidou_v3`,name:`龙杰力豆`,desc:`阳光顽皮男`,lang:`中文/英文`},{voice:`longxian_v3`,name:`龙仙`,desc:`豪放可爱女`,lang:`中文/英文`},{voice:`longling_v3`,name:`龙铃`,desc:`稚气呆板女`,lang:`中文/英文`},{voice:`longshanshan_v3`,name:`龙闪闪`,desc:`戏剧化童声`,lang:`中文/英文`},{voice:`longniuniu_v3`,name:`龙牛牛`,desc:`阳光男童声`,lang:`中文/英文`},{voice:`longjiaxin_v3`,name:`龙嘉欣`,desc:`优雅粤语女`,lang:`粤语/英文`},{voice:`longjiayi_v3`,name:`龙嘉怡`,desc:`知性粤语女`,lang:`粤语/英文`},{voice:`longanyue_v3`,name:`龙安粤`,desc:`欢脱粤语男`,lang:`粤语/英文`},{voice:`longlaotie_v3`,name:`龙老铁`,desc:`东北直率男`,lang:`东北话/英文`},{voice:`longshange_v3`,name:`龙陕哥`,desc:`原味陕北男`,lang:`陕西话/英文`},{voice:`longanmin_v3`,name:`龙安闽`,desc:`清纯萝莉女`,lang:`闽南话/英文`},{voice:`loongabby_v3`,name:`loongabby`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongandy_v3`,name:`loongandy`,desc:`美式英文男`,lang:`美式英语`},{voice:`loongannie_v3`,name:`loongannie`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongava_v3`,name:`loongava`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongbeth_v3`,name:`loongbeth`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongbetty_v3`,name:`loongbetty`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongcally_v3`,name:`loongcally`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongcindy_v3`,name:`loongcindy`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongdavid_v3`,name:`loongdavid`,desc:`美式英文男`,lang:`美式英语`},{voice:`loongdonna_v3`,name:`loongdonna`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongemily_v3`,name:`loongemily`,desc:`英式英文女`,lang:`英式英语`},{voice:`loongeric_v3`,name:`loongeric`,desc:`英式英文男`,lang:`英式英语`},{voice:`loongluna_v3`,name:`loongluna`,desc:`英式英文女`,lang:`英式英语`},{voice:`loongluca_v3`,name:`loongluca`,desc:`英式英文男`,lang:`英式英语`},{voice:`loongriko_v3`,name:`Riko`,desc:`二次元霓虹女`,lang:`日语`},{voice:`loongtomoka_v3`,name:`loongtomoka`,desc:`日语女`,lang:`日语`},{voice:`loongtomoya_v3`,name:`loongtomoya`,desc:`日语男`,lang:`日语`},{voice:`loongyuuna_v3`,name:`Yuuna`,desc:`日语女`,lang:`日语`},{voice:`loongyuuma_v3`,name:`Yuuma`,desc:`日语男`,lang:`日语`},{voice:`loongkyong_v3`,name:`loongkyong`,desc:`韩语女`,lang:`韩语`},{voice:`loongjihun_v3`,name:`Jihun`,desc:`韩语男`,lang:`韩语`},{voice:`loongindah_v3`,name:`loongindah`,desc:`印尼女`,lang:`印尼语`}],bi={"cosyvoice-v3-flash":yi,"cosyvoice-v3-plus":yi,"cosyvoice-v3.5-flash":[],"cosyvoice-v3.5-plus":[],"cosyvoice-v2":[]};function xi(e){let t=bi[e];if(!t){process.stdout.write(`No built-in voice list available for model: ${e}\n`),process.stdout.write(`Browse voices in the console: ${xt}\n`);return}if(t.length===0){process.stdout.write(`Model ${e} has no system voices.\n`),process.stdout.write(`Use clone or design voices created via the CosyVoice API.
308
- `),process.stdout.write(`See: ${vi}\n`),process.stdout.write(`Browse voices in the console: ${xt}\n`);return}let n=(e,t)=>e.padEnd(t);process.stdout.write(`\nSystem voices for ${e}:\n`),process.stdout.write(`${n(`VOICE ID`,26)} ${n(`NAME`,10)} ${n(`DESCRIPTION`,16)} LANGUAGE\n`),process.stdout.write(`${`-`.repeat(26)} ${`-`.repeat(10)} ${`-`.repeat(16)} ${`-`.repeat(12)}\n`);for(let e of t)process.stdout.write(`${n(e.voice,26)} ${n(e.name,10)} ${n(e.desc,16)} ${e.lang}\n`);process.stdout.write(`\nTotal: ${t.length} voices\n`),process.stdout.write(`Preview and browse more voices in the console: \n${xt}\n`)}var Si=w({description:`Synthesize speech from text (CosyVoice TTS)`,auth:`apiKey`,usageArgs:`--text <text> [flags]`,flags:{text:{type:`string`,valueHint:`<text>`,description:`Text to synthesize into speech (or use --text-file)`},textFile:{type:`string`,valueHint:`<path>`,description:`Read text from a file instead of --text`},model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: cosyvoice-v3-flash). System voices available for cosyvoice-v3-flash`},voice:{type:`string`,valueHint:`<voice>`,description:`Voice ID. Use --list-voices to see built-in voices for cosyvoice-v3-flash; for v3.5-flash provide a clone/design voice ID`},listVoices:{type:`switch`,description:`List built-in system voices for the selected model and exit (console link shown in output)`},format:{type:`string`,valueHint:`<format>`,description:`Audio format: mp3, pcm, wav, opus (default: mp3)`,choices:[`mp3`,`pcm`,`wav`,`opus`]},sampleRate:{type:`string`,valueHint:`<rate>`,description:`Audio sample rate in Hz (e.g. 24000)`},volume:{type:`string`,valueHint:`<volume>`,description:`Volume 0-100 (default: 50)`},rate:{type:`string`,valueHint:`<rate>`,description:`Speech rate 0.5-2.0 (default: 1.0)`},pitch:{type:`string`,valueHint:`<pitch>`,description:`Pitch multiplier 0.5-2.0 (default: 1.0)`},seed:{type:`string`,valueHint:`<seed>`,description:`Random seed 0-65535 for reproducible synthesis`},language:{type:`string`,valueHint:`<lang>`,description:`Language hint (e.g. zh, en, ja, ko, fr, de)`},instruction:{type:`string`,valueHint:`<text>`,description:`Natural language instruction to control speech style (e.g. "Use a gentle tone")`},enableSsml:{type:`switch`,description:`Enable SSML markup parsing in input text`},out:{type:`string`,valueHint:`<path>`,description:`Save audio to file (default: auto-generate in temp dir)`},stream:{type:`switch`,description:`Stream raw PCM audio to stdout (pipe to player)`},...n},exampleArgs:[`--list-voices --model cosyvoice-v3-flash`,`--text "Hello, I am Qwen" --voice <voice_id>`,`--text "Hello world" --voice <voice_id> --language en`,`--text-file script.txt --out speech.wav --voice <voice_id>`,`--text "Today is a good day" --voice <voice_id> --instruction "Use a gentle tone"`,`--text "Hello" --voice <voice_id> --format wav --sample-rate 24000`,`# Stream to audio player (macOS)`,`--text "Hello" --voice <voice_id> --stream | afplay -`,`# Pipe to ffplay`,`--text "Hello" --voice <voice_id> --stream | ffplay -nodisp -autoexit -f s16le -ar 24000 -ac 1 -`],validate:e=>{if(!e.listVoices){if(!e.text&&!e.textFile)return`Provide --text or --text-file.`;if(!e.voice)return`Missing required flag: --voice (use --list-voices; browse more voices: ${xt})`}},async run(e){let{settings:n,flags:r}=e,i=r.model||n.defaultSpeechModel||`cosyvoice-v3-flash`;if(r.listVoices){xi(i);return}let o=r.text||``;if(!o&&r.textFile){let e=r.textFile;try{o=U(e,`utf-8`).trim()}catch{throw new t(`Cannot read text file: ${e}`,a.USAGE)}}let s=r.voice,c=r.language||void 0,l=r.instruction||void 0,u=r.format||void 0,d=r.sampleRate===void 0?void 0:Number(r.sampleRate),f=r.volume===void 0?void 0:Number(r.volume),p=r.rate===void 0?void 0:Number(r.rate),m=r.pitch===void 0?void 0:Number(r.pitch),h=r.seed===void 0?void 0:Number(r.seed),g=r.enableSsml===!0?!0:void 0,_=r.stream===!0,v=T(n.output),y={model:i,input:{text:o,voice:s,format:u,sample_rate:d,volume:f,rate:p,pitch:m,seed:h,language_hints:c?[c]:void 0,instruction:l,enable_ssml:g}};if(ot(y.input),n.dryRun){I({request:y},v);return}n.quiet||process.stderr.write(`[Model: ${i}] [Voice: ${s}]\n`),_?await wi(e.client,n,y,r,v):await Ci(e.client,n,y,r,v)}});async function Ci(e,n,r,i,o){let s=await V(R(i),n,()=>e.requestJson({path:at(),method:`POST`,body:r})),c=s.map(e=>e.output?.audio?.url).filter(Boolean);if(c.length===0)throw new t(`API returned no audio URL.`,a.GENERAL);let l=await import(`path`),u=A(n,{subDir:`speech`}),d=await Tt(c.map((e,t)=>{let n=i.out;if(!(n&&c.length===1)){let e=Date.now(),i=c.length>1?`_${String(t+1).padStart(3,`0`)}`:``,a=r.input.format??`mp3`;n=l.join(u,`tts_${e}${i}.${a}`)}return{url:e,destPath:n}}),P,{quiet:n.quiet});if(n.quiet)F(d.join(`
309
- `));else if(d.length===1){let e=s[0].output?.audio?.expires_at;I({saved:d[0],audio_url:c[0],model:r.model,voice:r.input.voice,...e?{url_expires_at:e}:{}},o)}else I({saved:d,audio_urls:c,total:d.length,model:r.model,voice:r.input.voice},o)}async function wi(e,t,n,r,i){let a=await e.request({path:at(),method:`POST`,body:n,stream:!0,headers:{Accept:`text/event-stream`,"X-DashScope-SSE":`enable`}}),o=r.out,s=o?Rt(o):null,c;try{for await(let e of k(a)){if(!e.data||e.data===`[DONE]`)continue;let n;try{n=JSON.parse(e.data)}catch{continue}let r=n.output?.audio?.data;if(r){let e=Buffer.from(r,`base64`);s?s.write(e)||await new Promise(e=>s.once(`drain`,()=>e())):process.stdout.write(e)}if(n.output?.finish_reason===`stop`){c=n.output?.audio?.url,c&&!t.quiet&&process.stderr.write(`\nFull audio URL: ${c}\n`);break}}}finally{s&&(await new Promise((e,t)=>{s.on(`finish`,e),s.on(`error`,t),s.end()}),!t.quiet&&o&&process.stderr.write(`Saved: ${o}\n`))}o&&I({saved:o,...c?{audio_url:c}:{},model:n.model,voice:n.input.voice},i)}var Ti=w({description:`Recognize speech from audio files (FunAudio-ASR)`,auth:`apiKey`,usageArgs:`--url <audio-url> [flags]`,flags:{url:{type:`array`,valueHint:`<url>`,description:`Audio file URL or local file path (repeatable, max 100)`,required:!0},model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: fun-asr)`},language:{type:`string`,valueHint:`<lang>`,description:`Language hint (e.g. zh, en, ja)`},diarization:{type:`switch`,description:`Enable automatic speaker diarization`},speakerCount:{type:`number`,valueHint:`<n>`,description:`Expected number of speakers (requires --diarization)`},vocabularyId:{type:`string`,valueHint:`<id>`,description:`Hot-word vocabulary ID for improved accuracy`},channelId:{type:`number`,valueHint:`<n>`,description:`Audio channel ID (default: 0)`},out:{type:`string`,valueHint:`<path>`,description:`Save full transcription result to JSON file`},...e,pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval in seconds (default: 2)`}},exampleArgs:[`--url https://example.com/audio.mp3`,`--url https://example.com/a.mp3 --url https://example.com/b.mp3`,`--url https://example.com/meeting.wav --diarization --speaker-count 3`,`--url https://example.com/audio.mp3 --language zh`,`--url https://example.com/audio.mp3 --vocabulary-id vocab-abc123`,`--url https://example.com/audio.mp3 --out result.json`,`--url https://example.com/audio.mp3 --async --quiet`],async run(e){let{settings:n,flags:r}=e,i=[];Array.isArray(r.url)?i=r.url:typeof r.url==`string`&&(i=[r.url]);let o=r.speakerCount,s=r.diarization===!0;if(o!==void 0&&!s)throw new t(`--speaker-count requires --diarization to be enabled.
310
- Hint: Add --diarization flag to enable speaker separation.`,a.USAGE);let c=r.model||`fun-asr`,l=T(n.output),u=await Promise.all(i.map(t=>e.client.uploadFile(t,c))),d=r.channelId,f=r.language,p=r.vocabularyId,m={model:c,input:{file_urls:u},parameters:{channel_id:d===void 0?[0]:[d],language_hints:f?[f]:void 0,diarization_enabled:s?!0:void 0,speaker_count:o,vocabulary_id:p}};if(ot(m.parameters),n.dryRun){I({request:m,mode:`async`},l);return}n.quiet||process.stderr.write(`[Model: ${c}] [Mode: async] [Files: ${u.length}]\n`),await Ei(e.client,n,m,r,l,u.length)}});async function Ei(e,n,r,i,o,s){let c=(await e.requestJson({path:it(),method:`POST`,body:r,async:!0})).output.task_id;if(i.async){I({task_id:c},o);return}let l=i.pollInterval??2,u=await B(e,n,{url:e.url(j(c)),intervalSec:l,timeoutSec:n.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>e.output.message}),d=u.output.results??[];if(d.length===0){I({task_id:c,status:u.output.task_status},o);return}let f=[];for(let e=0;e<d.length;e++){let n=d[e],r=s>1;if(r&&process.stdout.write(`=== [${e+1}/${d.length}] ${n.file_url??``} ===\n`),n.subtask_status===`FAILED`){let e=n.message??n.code??`unknown error`;process.stdout.write(`[FAILED] ${n.file_url??``} — ${e}\n`),r&&process.stdout.write(`
305
+ `)}else{let e=``,r=``;for await(let n of O(p)){if(n.data===`[DONE]`)break;if(n.event===`error`){let e=`Chat API error`,r;try{let t=JSON.parse(n.data);e=t.message||e,r=t.code}catch{}throw new t(e,a.GENERAL,r?`API error: ${r}`:void 0)}try{let t=JSON.parse(n.data);t.request_id&&(r=t.request_id);for(let n of t.output?.choices??[])if(n.message?.content&&(e+=n.message.content),n.finish_reason===`stop`)break}catch{}}n.quiet||l===`text`?F(e):I({answer:e,request_id:r},l)}}});const Ji={target:{type:`string`,valueHint:`<server.tool>`,description:`Server code and tool name joined by a dot, e.g. market-cmapi00073529.SmartStockSelection`,required:!0},arg:{type:`array`,valueHint:`<kv>`,description:`Tool argument (repeatable). Values parsed as JSON if possible, else string.`},json:{type:`string`,valueHint:`<obj>`,description:`Full arguments object as JSON; merged with --arg (arg wins).`},query:{type:`string`,valueHint:`<text>`,description:`Shortcut for --arg query=<text> (mirrors many DashScope MCP tools).`},url:{type:`string`,valueHint:`<url>`,description:`Override the MCP endpoint URL (for non-Bailian servers)`}};function Yi(e){let t=e.indexOf(`.`);if(t<=0||t===e.length-1)throw new p(`target must be <server-code>.<tool>, got "${e}".`);return{serverCode:e.slice(0,t),toolName:e.slice(t+1)}}function Xi(e){let t={};for(let n of e){let e=n.indexOf(`=`);if(e<=0)throw new p(`--arg must be in K=V form, got: ${n}`);let r=n.slice(0,e).trim(),i=n.slice(e+1);try{t[r]=JSON.parse(i)}catch{t[r]=i}}return t}function Zi(e){let t;try{t=JSON.parse(e)}catch(e){throw new p(`--json is not valid JSON — ${e.message}`)}if(!t||typeof t!=`object`||Array.isArray(t))throw new p(`--json must decode to an object.`);return t}function Qi(e){let t=e.json?Zi(e.json):{};return Object.assign(t,Xi(e.arg??[])),e.query!==void 0&&(t.query=e.query),t}function $i(e){try{Yi(e.target),Qi(e)}catch(e){if(e instanceof p)return e.message;throw e}}var ea=T({description:`Call a tool on an MCP server (tools/call)`,auth:`apiKey`,usageArgs:`--target <server.tool> [--arg k=v ...] [--json '{...}'] [--url <url>]`,flags:Ji,exampleArgs:[`--target market-cmapi00073529.SmartStockSelection --query "Screen consumer stocks with ROE > 15%"`,`--target market-cmapi00073529.FinQuery --json '{"q":"Guizhou Maotai","limit":5}'`,`--target market-cmapi00073529.SmartFundSelection --arg riskLevel=R3 --arg minScale=10`],validate:$i,async run(e){let{settings:n,flags:r}=e,{serverCode:i,toolName:a}=Yi(r.target),o=Qi(r),s=r.url||e.client.url(g(i)),c=E(n.output);if(n.dryRun){I({server:i,url:s,tool:a,arguments:o},c);return}let l=e.client.mcp(s);await l.initialize();let u=await l.callTool(a,o);if(u.isError)throw new t(`Tool error: ${u.content.map(e=>e.text||``).join(`
306
+ `)}`);I(u,c)}});const ta=`zeldaEasy.broadscope-bailian.mcp-server.PageList`;var na=T({description:`List MCP servers activated under your Bailian account`,auth:`console`,usageArgs:`[flags]`,flags:{name:{type:`string`,valueHint:`<text>`,description:`Filter by server name (substring match)`},type:{type:`string`,valueHint:`<type>`,description:`Server type: OFFICIAL | PRIVATE (default: OFFICIAL)`},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 30)`}},exampleArgs:[``,`--name finance`,`--output json`],async run(e){let{settings:n,identity:r,flags:i}=e,o=i.name||``,s=i.type||`OFFICIAL`,c=i.page||1,l=i.pageSize||30,u=E(n.output),d={reqDTO:{type:s,displayTools:!1,activated:1,pageNo:c,pageSize:l,serverName:o}};if(n.dryRun){I({api:ta,data:d,...se(n)},u);return}let f=(await e.client.console(ta,d))?.data??{};if(f.success===!1){let e=f.errorCode??`UnknownError`,n=f.errorMsg??e,i=e===`BailianGateway.Login.NotLogined`?`Run \`${r.binName} auth login --console\` to refresh your console session.`:void 0;throw new t(`Console gateway: ${n}`,a.AUTH,i)}let p=(f.DataV2??{}).data?.data??{},m=p.mcpServerDetailList??[];I({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}))},u)}}),ra=T({description:`List tools exposed by an MCP server (tools/list)`,auth:`apiKey`,usageArgs:`--server <code> [--url <url>]`,flags:{server:{type:`string`,valueHint:`<code>`,description:"Server code from `mcp list` (e.g. market-cmapi00073529)",required:!0},url:{type:`string`,valueHint:`<url>`,description:`Override the MCP endpoint URL (for non-Bailian servers)`}},exampleArgs:[`--server market-cmapi00073529`,`--server market-cmapi00073529 --output json`,`--server my-server --url https://example.com/mcp`],async run(e){let{settings:t,flags:n}=e,r=n.server,i=n.url||e.client.url(g(r)),a=E(t.output);if(t.dryRun){I({server:r,url:i,action:`tools/list`},a);return}let o=e.client.mcp(i);await o.initialize(),I({server:r,url:i,tools:await o.listTools()},a)}}),ia=T({description:`Search the web using DashScope MCP WebSearch service`,auth:`apiKey`,usageArgs:`--query <text> [flags]`,flags:{query:{type:`string`,valueHint:`<text>`,description:`Search query text`},count:{type:`number`,valueHint:`<n>`,description:`Number of search results (default: 10)`},listTools:{type:`switch`,description:`List available MCP tools and exit`}},exampleArgs:[`--query "Alibaba Cloud Bailian latest features"`,`--query "TypeScript 5.9 new features" --count 5`,`--query "Today's news"`,`--list-tools`],validate:e=>!e.listTools&&!e.query?`Missing required flag: --query`:void 0,async run(e){let{settings:n,flags:r}=e,i=E(n.output);if(r.listTools){if(n.dryRun){I({endpoint:e.client.url(Ve()),action:`tools/list`},i);return}let t=e.client.mcp(Ve());await t.initialize(),I({tools:await t.listTools()},i);return}let a=r.query;if(n.dryRun){I({endpoint:e.client.url(Ve()),action:`tools/call`,tool:`bailian_web_search`,arguments:{query:a,count:r.count||void 0}},i);return}let o=e.client.mcp(Ve()),s=Ot(`Initializing search...`);n.quiet||s.start();try{await o.initialize(),n.quiet||s.update(`Searching...`);let e={query:a};r.count&&(e.count=r.count);let c=await o.callTool(`bailian_web_search`,e);if(c.isError)throw new t(`Search error: ${c.content.map(e=>e.text||``).join(`
307
+ `)}`);if(n.quiet||s.stop(`Done.`),i===`json`)I(c,i);else for(let e of c.content)if(e.type===`text`&&e.text)try{let t=JSON.parse(e.text);t.pages&&Array.isArray(t.pages)?I({pages:t.pages,total:t.pages.length},i):I(t,i)}catch{I({text:e.text},i)}}catch(e){throw s.stop(`Failed.`),e}}});const aa=`${i.cn}/cosyvoice-clone-design-api`,oa=[{voice:`longanyang`,name:`龙安洋`,desc:`阳光大男孩`,lang:`中文/英文`},{voice:`longanhuan_v3`,name:`龙安欢`,desc:`欢脱元气女`,lang:`中文/英文`},{voice:`longantai_v3`,name:`龙安台`,desc:`嗲甜台湾女`,lang:`中文/英文`},{voice:`longhua_v3`,name:`龙华`,desc:`元气甜美女`,lang:`中文/英文`},{voice:`longcheng_v3`,name:`龙橙`,desc:`智慧青年男`,lang:`中文/英文`},{voice:`longze_v3`,name:`龙泽`,desc:`温暖元气男`,lang:`中文/英文`},{voice:`longzhe_v3`,name:`龙哲`,desc:`呆板大暖男`,lang:`中文/英文`},{voice:`longyan_v3`,name:`龙颜`,desc:`温暖春风女`,lang:`中文/英文`},{voice:`longxing_v3`,name:`龙星`,desc:`温婉邻家女`,lang:`中文/英文`},{voice:`longtian_v3`,name:`龙天`,desc:`磁性理智男`,lang:`中文/英文`},{voice:`longwan_v3`,name:`龙婉`,desc:`细腻柔声女`,lang:`中文/英文`},{voice:`longqiang_v3`,name:`龙嫱`,desc:`浪漫风情女`,lang:`中文/英文`},{voice:`longfeifei_v3`,name:`龙菲菲`,desc:`甜美娇气女`,lang:`中文/英文`},{voice:`longhao_v3`,name:`龙浩`,desc:`多情忧郁男`,lang:`中文/英文`},{voice:`longanrou_v3`,name:`龙安柔`,desc:`温柔娴静女`,lang:`中文/英文`},{voice:`longxiaochun_v3`,name:`龙小淳`,desc:`知性积极女`,lang:`中文/英文`},{voice:`longxiaoxia_v3`,name:`龙小夏`,desc:`沉稳权威女`,lang:`中文/英文`},{voice:`longyumi_v3`,name:`YUMI`,desc:`正经青年女`,lang:`中文/英文`},{voice:`longanyun_v3`,name:`龙安昀`,desc:`居家暖男`,lang:`中文/英文`},{voice:`longanwen_v3`,name:`龙安温`,desc:`优雅知性女`,lang:`中文/英文`},{voice:`longanli_v3`,name:`龙安莉`,desc:`利落从容女`,lang:`中文/英文`},{voice:`longanlang_v3`,name:`龙安朗`,desc:`清爽利落男`,lang:`中文/英文`},{voice:`longyingmu_v3`,name:`龙应沐`,desc:`优雅知性女`,lang:`中文/英文`},{voice:`longyingxun_v3`,name:`龙应询`,desc:`年轻青涩男`,lang:`中文/英文`},{voice:`longyingjing_v3`,name:`龙应静`,desc:`低调冷静女`,lang:`中文/英文`},{voice:`longyingling_v3`,name:`龙应聆`,desc:`温和共情女`,lang:`中文/英文`},{voice:`longyingtao_v3`,name:`龙应桃`,desc:`温柔淡定女`,lang:`中文/英文`},{voice:`longyingxiao_v3`,name:`龙应笑`,desc:`清甜推销女`,lang:`中文/英文`},{voice:`longfei_v3`,name:`龙飞`,desc:`热血磁性男`,lang:`中文/英文`},{voice:`longhuhu_v3`,name:`龙呼呼`,desc:`天真烂漫女童`,lang:`中文/英文`},{voice:`longpaopao_v3`,name:`龙泡泡`,desc:`飞天泡泡音`,lang:`中文/英文`},{voice:`longjielidou_v3`,name:`龙杰力豆`,desc:`阳光顽皮男`,lang:`中文/英文`},{voice:`longxian_v3`,name:`龙仙`,desc:`豪放可爱女`,lang:`中文/英文`},{voice:`longling_v3`,name:`龙铃`,desc:`稚气呆板女`,lang:`中文/英文`},{voice:`longshanshan_v3`,name:`龙闪闪`,desc:`戏剧化童声`,lang:`中文/英文`},{voice:`longniuniu_v3`,name:`龙牛牛`,desc:`阳光男童声`,lang:`中文/英文`},{voice:`longjiaxin_v3`,name:`龙嘉欣`,desc:`优雅粤语女`,lang:`粤语/英文`},{voice:`longjiayi_v3`,name:`龙嘉怡`,desc:`知性粤语女`,lang:`粤语/英文`},{voice:`longanyue_v3`,name:`龙安粤`,desc:`欢脱粤语男`,lang:`粤语/英文`},{voice:`longlaotie_v3`,name:`龙老铁`,desc:`东北直率男`,lang:`东北话/英文`},{voice:`longshange_v3`,name:`龙陕哥`,desc:`原味陕北男`,lang:`陕西话/英文`},{voice:`longanmin_v3`,name:`龙安闽`,desc:`清纯萝莉女`,lang:`闽南话/英文`},{voice:`loongabby_v3`,name:`loongabby`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongandy_v3`,name:`loongandy`,desc:`美式英文男`,lang:`美式英语`},{voice:`loongannie_v3`,name:`loongannie`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongava_v3`,name:`loongava`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongbeth_v3`,name:`loongbeth`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongbetty_v3`,name:`loongbetty`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongcally_v3`,name:`loongcally`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongcindy_v3`,name:`loongcindy`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongdavid_v3`,name:`loongdavid`,desc:`美式英文男`,lang:`美式英语`},{voice:`loongdonna_v3`,name:`loongdonna`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongemily_v3`,name:`loongemily`,desc:`英式英文女`,lang:`英式英语`},{voice:`loongeric_v3`,name:`loongeric`,desc:`英式英文男`,lang:`英式英语`},{voice:`loongluna_v3`,name:`loongluna`,desc:`英式英文女`,lang:`英式英语`},{voice:`loongluca_v3`,name:`loongluca`,desc:`英式英文男`,lang:`英式英语`},{voice:`loongriko_v3`,name:`Riko`,desc:`二次元霓虹女`,lang:`日语`},{voice:`loongtomoka_v3`,name:`loongtomoka`,desc:`日语女`,lang:`日语`},{voice:`loongtomoya_v3`,name:`loongtomoya`,desc:`日语男`,lang:`日语`},{voice:`loongyuuna_v3`,name:`Yuuna`,desc:`日语女`,lang:`日语`},{voice:`loongyuuma_v3`,name:`Yuuma`,desc:`日语男`,lang:`日语`},{voice:`loongkyong_v3`,name:`loongkyong`,desc:`韩语女`,lang:`韩语`},{voice:`loongjihun_v3`,name:`Jihun`,desc:`韩语男`,lang:`韩语`},{voice:`loongindah_v3`,name:`loongindah`,desc:`印尼女`,lang:`印尼语`}],sa={"cosyvoice-v3-flash":oa,"cosyvoice-v3-plus":oa,"cosyvoice-v3.5-flash":[],"cosyvoice-v3.5-plus":[],"cosyvoice-v2":[]};function ca(e){let t=sa[e];if(!t){process.stdout.write(`No built-in voice list available for model: ${e}\n`),process.stdout.write(`Browse voices in the console: ${Tt}\n`);return}if(t.length===0){process.stdout.write(`Model ${e} has no system voices.\n`),process.stdout.write(`Use clone or design voices created via the CosyVoice API.
308
+ `),process.stdout.write(`See: ${aa}\n`),process.stdout.write(`Browse voices in the console: ${Tt}\n`);return}let n=(e,t)=>e.padEnd(t);process.stdout.write(`\nSystem voices for ${e}:\n`),process.stdout.write(`${n(`VOICE ID`,26)} ${n(`NAME`,10)} ${n(`DESCRIPTION`,16)} LANGUAGE\n`),process.stdout.write(`${`-`.repeat(26)} ${`-`.repeat(10)} ${`-`.repeat(16)} ${`-`.repeat(12)}\n`);for(let e of t)process.stdout.write(`${n(e.voice,26)} ${n(e.name,10)} ${n(e.desc,16)} ${e.lang}\n`);process.stdout.write(`\nTotal: ${t.length} voices\n`),process.stdout.write(`Preview and browse more voices in the console: \n${Tt}\n`)}var la=T({description:`Synthesize speech from text (CosyVoice TTS)`,auth:`apiKey`,usageArgs:`--text <text> [flags]`,flags:{text:{type:`string`,valueHint:`<text>`,description:`Text to synthesize into speech (or use --text-file)`},textFile:{type:`string`,valueHint:`<path>`,description:`Read text from a file instead of --text`},model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: cosyvoice-v3-flash). System voices available for cosyvoice-v3-flash`},voice:{type:`string`,valueHint:`<voice>`,description:`Voice ID. Use --list-voices to see built-in voices for cosyvoice-v3-flash; for v3.5-flash provide a clone/design voice ID`},listVoices:{type:`switch`,description:`List built-in system voices for the selected model and exit (console link shown in output)`},format:{type:`string`,valueHint:`<format>`,description:`Audio format: mp3, pcm, wav, opus (default: mp3)`,choices:[`mp3`,`pcm`,`wav`,`opus`]},sampleRate:{type:`string`,valueHint:`<rate>`,description:`Audio sample rate in Hz (e.g. 24000)`},volume:{type:`string`,valueHint:`<volume>`,description:`Volume 0-100 (default: 50)`},rate:{type:`string`,valueHint:`<rate>`,description:`Speech rate 0.5-2.0 (default: 1.0)`},pitch:{type:`string`,valueHint:`<pitch>`,description:`Pitch multiplier 0.5-2.0 (default: 1.0)`},seed:{type:`string`,valueHint:`<seed>`,description:`Random seed 0-65535 for reproducible synthesis`},language:{type:`string`,valueHint:`<lang>`,description:`Language hint (e.g. zh, en, ja, ko, fr, de)`},instruction:{type:`string`,valueHint:`<text>`,description:`Natural language instruction to control speech style (e.g. "Use a gentle tone")`},enableSsml:{type:`switch`,description:`Enable SSML markup parsing in input text`},out:{type:`string`,valueHint:`<path>`,description:`Save audio to file (default: auto-generate in temp dir)`},stream:{type:`switch`,description:`Stream raw PCM audio to stdout (pipe to player)`},...n},exampleArgs:[`--list-voices --model cosyvoice-v3-flash`,`--text "Hello, I am Qwen" --voice <voice_id>`,`--text "Hello world" --voice <voice_id> --language en`,`--text-file script.txt --out speech.wav --voice <voice_id>`,`--text "Today is a good day" --voice <voice_id> --instruction "Use a gentle tone"`,`--text "Hello" --voice <voice_id> --format wav --sample-rate 24000`,`# Stream to audio player (macOS)`,`--text "Hello" --voice <voice_id> --stream | afplay -`,`# Pipe to ffplay`,`--text "Hello" --voice <voice_id> --stream | ffplay -nodisp -autoexit -f s16le -ar 24000 -ac 1 -`],validate:e=>{if(!e.listVoices){if(!e.text&&!e.textFile)return`Provide --text or --text-file.`;if(!e.voice)return`Missing required flag: --voice (use --list-voices; browse more voices: ${Tt})`}},async run(e){let{settings:n,flags:r}=e,i=r.model||n.defaultSpeechModel||`cosyvoice-v3-flash`;if(r.listVoices){ca(i);return}let o=r.text||``;if(!o&&r.textFile){let e=r.textFile;try{o=Kt(e,`utf-8`).trim()}catch{throw new t(`Cannot read text file: ${e}`,a.USAGE)}}let s=r.voice,c=r.language||void 0,l=r.instruction||void 0,u=r.format||void 0,d=r.sampleRate===void 0?void 0:Number(r.sampleRate),f=r.volume===void 0?void 0:Number(r.volume),p=r.rate===void 0?void 0:Number(r.rate),m=r.pitch===void 0?void 0:Number(r.pitch),h=r.seed===void 0?void 0:Number(r.seed),g=r.enableSsml===!0?!0:void 0,_=r.stream===!0,v=E(n.output),y={model:i,input:{text:o,voice:s,format:u,sample_rate:d,volume:f,rate:p,pitch:m,seed:h,language_hints:c?[c]:void 0,instruction:l,enable_ssml:g}};if(ut(y.input),n.dryRun){I({request:y},v);return}n.quiet||process.stderr.write(`[Model: ${i}] [Voice: ${s}]\n`),_?await da(e.client,n,y,r,v):await ua(e.client,n,y,r,v)}});async function ua(e,n,r,i,o){let s=await B(R(i),n,()=>e.requestJson({path:lt(),method:`POST`,body:r})),c=s.map(e=>e.output?.audio?.url).filter(Boolean);if(c.length===0)throw new t(`API returned no audio URL.`,a.GENERAL);let l=await import(`path`),u=A(n,{subDir:`speech`}),d=await kt(c.map((e,t)=>{let n=i.out;if(!(n&&c.length===1)){let e=Date.now(),i=c.length>1?`_${String(t+1).padStart(3,`0`)}`:``,a=r.input.format??`mp3`;n=l.join(u,`tts_${e}${i}.${a}`)}return{url:e,destPath:n}}),P,{quiet:n.quiet});if(n.quiet)F(d.join(`
309
+ `));else if(d.length===1){let e=s[0].output?.audio?.expires_at;I({saved:d[0],audio_url:c[0],model:r.model,voice:r.input.voice,...e?{url_expires_at:e}:{}},o)}else I({saved:d,audio_urls:c,total:d.length,model:r.model,voice:r.input.voice},o)}async function da(e,t,n,r,i){let a=await e.request({path:lt(),method:`POST`,body:n,stream:!0,headers:{Accept:`text/event-stream`,"X-DashScope-SSE":`enable`}}),o=r.out,s=o?Ut(o):null,c;try{for await(let e of O(a)){if(!e.data||e.data===`[DONE]`)continue;let n;try{n=JSON.parse(e.data)}catch{continue}let r=n.output?.audio?.data;if(r){let e=Buffer.from(r,`base64`);s?s.write(e)||await new Promise(e=>s.once(`drain`,()=>e())):process.stdout.write(e)}if(n.output?.finish_reason===`stop`){c=n.output?.audio?.url,c&&!t.quiet&&process.stderr.write(`\nFull audio URL: ${c}\n`);break}}}finally{s&&(await new Promise((e,t)=>{s.on(`finish`,e),s.on(`error`,t),s.end()}),!t.quiet&&o&&process.stderr.write(`Saved: ${o}\n`))}o&&I({saved:o,...c?{audio_url:c}:{},model:n.model,voice:n.input.voice},i)}var fa=T({description:`Recognize speech from audio files (FunAudio-ASR)`,auth:`apiKey`,usageArgs:`--url <audio-url> [flags]`,flags:{url:{type:`array`,valueHint:`<url>`,description:`Audio file URL or local file path (repeatable, max 100)`,required:!0},model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: fun-asr)`},language:{type:`string`,valueHint:`<lang>`,description:`Language hint (e.g. zh, en, ja)`},diarization:{type:`switch`,description:`Enable automatic speaker diarization`},speakerCount:{type:`number`,valueHint:`<n>`,description:`Expected number of speakers (requires --diarization)`},vocabularyId:{type:`string`,valueHint:`<id>`,description:`Hot-word vocabulary ID for improved accuracy`},channelId:{type:`number`,valueHint:`<n>`,description:`Audio channel ID (default: 0)`},out:{type:`string`,valueHint:`<path>`,description:`Save full transcription result to JSON file`},...e,pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval in seconds (default: 2)`}},exampleArgs:[`--url https://example.com/audio.mp3`,`--url https://example.com/a.mp3 --url https://example.com/b.mp3`,`--url https://example.com/meeting.wav --diarization --speaker-count 3`,`--url https://example.com/audio.mp3 --language zh`,`--url https://example.com/audio.mp3 --vocabulary-id vocab-abc123`,`--url https://example.com/audio.mp3 --out result.json`,`--url https://example.com/audio.mp3 --async --quiet`],async run(e){let{settings:n,flags:r}=e,i=[];Array.isArray(r.url)?i=r.url:typeof r.url==`string`&&(i=[r.url]);let o=r.speakerCount,s=r.diarization===!0;if(o!==void 0&&!s)throw new t(`--speaker-count requires --diarization to be enabled.
310
+ Hint: Add --diarization flag to enable speaker separation.`,a.USAGE);let c=r.model||`fun-asr`,l=E(n.output),u=await Promise.all(i.map(t=>e.client.uploadFile(t,c))),d=r.channelId,f=r.language,p=r.vocabularyId,m={model:c,input:{file_urls:u},parameters:{channel_id:d===void 0?[0]:[d],language_hints:f?[f]:void 0,diarization_enabled:s?!0:void 0,speaker_count:o,vocabulary_id:p}};if(ut(m.parameters),n.dryRun){I({request:m,mode:`async`},l);return}n.quiet||process.stderr.write(`[Model: ${c}] [Mode: async] [Files: ${u.length}]\n`),await pa(e.client,n,m,r,l,u.length)}});async function pa(e,n,r,i,o,s){let c=(await e.requestJson({path:ct(),method:`POST`,body:r,async:!0})).output.task_id;if(i.async){I({task_id:c},o);return}let l=i.pollInterval??2,u=await Pt(e,n,{url:e.url(j(c)),intervalSec:l,timeoutSec:n.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>e.output.message}),d=u.output.results??[];if(d.length===0){I({task_id:c,status:u.output.task_status},o);return}let f=[];for(let e=0;e<d.length;e++){let n=d[e],r=s>1;if(r&&process.stdout.write(`=== [${e+1}/${d.length}] ${n.file_url??``} ===\n`),n.subtask_status===`FAILED`){let e=n.message??n.code??`unknown error`;process.stdout.write(`[FAILED] ${n.file_url??``} — ${e}\n`),r&&process.stdout.write(`
311
311
  `);continue}if(!n.transcription_url){r&&process.stdout.write(`
312
- `);continue}let i=await fetch(n.transcription_url,{headers:st()});if(!i.ok)throw new t(`Failed to download transcription: HTTP ${i.status}`,a.GENERAL);let o=await i.json();f.push(o);let c=o.transcripts;if(c&&c.length>0)for(let e of c)if(e.sentences&&e.sentences.length>0)for(let t of e.sentences){let e=t.speaker_id===void 0?``:` [Speaker ${t.speaker_id}]`;process.stdout.write(`${t.text}${e}\n`)}else e.text&&process.stdout.write(e.text+`
312
+ `);continue}let i=await fetch(n.transcription_url,{headers:dt()});if(!i.ok)throw new t(`Failed to download transcription: HTTP ${i.status}`,a.GENERAL);let o=await i.json();f.push(o);let c=o.transcripts;if(c&&c.length>0)for(let e of c)if(e.sentences&&e.sentences.length>0)for(let t of e.sentences){let e=t.speaker_id===void 0?``:` [Speaker ${t.speaker_id}]`;process.stdout.write(`${t.text}${e}\n`)}else e.text&&process.stdout.write(e.text+`
313
313
  `);else F(JSON.stringify(o));r&&process.stdout.write(`
314
- `)}if(i.out){let e=i.out,t=f.length===1?f[0]:f;Ht(e,JSON.stringify(t,null,2)+`
315
- `),n.quiet||process.stderr.write(`Full result saved to: ${e}\n`)}}var Di=w({description:`Upload a local file to DashScope temporary storage (48h)`,auth:`apiKey`,usageArgs:`--file <path> --model <model>`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Local file to upload (image, video, audio)`,required:!0},model:{type:`string`,valueHint:`<model>`,description:`Target model name (file is bound to this model)`,required:!0}},exampleArgs:[`--file photo.jpg --model qwen3-vl-plus`,`--file video.mp4 --model wan2.1-t2v-plus`,`--file audio.wav --model qwen3-asr-flash`,`--file cat.png --model qwen-image-2.0`],async run(e){let{settings:t,flags:n}=e,r=n.file,i=n.model,a=T(t.output);if(t.dryRun){I({action:`upload`,file:r,model:i},a);return}let o=await e.client.uploadFile(r,i);t.quiet?F(o):I({url:o,model:i,expires_in:`48 hours`,note:`When using this URL in API calls, add header: X-DashScope-OssResourceResolve: enable`},a)}}),Oi=w({description:`Call a Bailian console API via the CLI gateway`,auth:`console`,usageArgs:`--api <api> --data <json> [flags]`,flags:{api:{type:`string`,valueHint:`<api>`,description:`API name (e.g. zeldaEasy.broadscope-bailian.memory-library.getLibraries)`,required:!0},data:{type:`string`,valueHint:`<json>`,description:`Request data as JSON string`,required:!0}},exampleArgs:[`--api zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota --data '{"queryFreeTierQuotaRequest":{"models":["qwen3-max"]}}'`,`--api some.api.name --data '{"key":"value"}' --console-region cn-beijing`],async run(e){let{settings:t,flags:n}=e,r=n.api,i=n.data,a;try{a=JSON.parse(i)}catch{throw new p(`--data must be valid JSON`)}let o=T(t.output);if(t.dryRun){I({api:r,data:a,...se(t)},o);return}I(await e.client.console(r,a),o)}});function ki(e){return e.toLocaleString(`en-US`)}function Z(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function Ai(e){return lt(e)}const ji={Reasoning:`Text`,TG:`Text`,VU:`Text`,IG:`Vision`,VG:`Vision`,"Realtime-Omni":`Multimodal`,"Multimodal-Omni":`Multimodal`,ASR:`Audio`,TTS:`Audio`,"Voice-Replication":`Audio`,"Realtime-Text-to-Speech":`Audio`,"Realtime-Voice-Replication":`Audio`,"Realtime-ASR":`Audio`,"Realtime-Audio-Translate":`Audio`,ME:`Embedding`,TR:`Embedding`};function Mi(e){for(let t of e){let e=ji[t];if(e)return e}return`-`}async function Ni(e){let t=[],n=1;for(;;){let r=await E((t,n)=>e.console(t,n),{pageNo:n,pageSize:50});if(t.push(...r.models),t.length>=r.total)break;n++}return t.filter(e=>typeof e.model==`string`&&e.model).map(e=>({name:e.model,type:Mi(e.capabilities||[])}))}const Pi=`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota`,Fi=`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierOnlyStatus`;function Ii(e,t){let n=e.data;if(!n)return[];let r=n.DataV2;return r?r.data?.data?.[t]||[]:n.data?.[t]||[]}function Li(e){return Ii(e,`freeTierQuotas`)}function Ri(e){return Ii(e,`freeTierOnlyStatuses`)}function zi(e){return Bi(e)||e.quotaInitTotal==null||e.quotaInitTotal<=0?null:Math.round(e.quotaTotal/e.quotaInitTotal*1e3)/10}function Bi(e){return e.quotaValidityPeriod>0&&e.quotaValidityPeriod<Date.now()}function Vi(e){let{quotas:t,stopMap:n,typeMap:r}=e,i=M(process.stdout);e.title&&process.stdout.write(i.purple(e.title)+`
316
- `);let a=[`Model`,`Type`,`Remaining`,`Total`,`Quota Left`,`Auto-Stop`],o=[],s=[],c=a.length-1,l=At({headers:a,rows:t.map(e=>{let t=e.quotaInitTotal!=null&&e.quotaTotal!=null,i=Bi(e),a=t?`${ki(e.quotaTotal)}${i?` (expired)`:``}`:`-`,c=t?ki(e.quotaInitTotal):`-`,l=zi(e);o.push(l),s.push(i?`expired`:l==null?`-`:null);let u=n.get(e.model),d=e.quotaStatus===`UNKNOWN`?`Unsupported`:u===!0?`ON`:u===!1?`OFF`:`-`;return[e.model,r.get(e.model)||`-`,a,c,``,d]}),align:[`left`,`left`,`right`,`right`,`left`,`left`],barColumns:[{index:4,percents:o,labels:s}],cellColor:(e,t,n)=>{if(t===c){if(n===`ON`)return i.green(n);if(n===`OFF`)return i.yellow(n)}}});for(let e of l)process.stdout.write(e+`
314
+ `)}if(i.out){let e=i.out,t=f.length===1?f[0]:f;Yt(e,JSON.stringify(t,null,2)+`
315
+ `),n.quiet||process.stderr.write(`Full result saved to: ${e}\n`)}}var ma=T({description:`Upload a local file to DashScope temporary storage (48h)`,auth:`apiKey`,usageArgs:`--file <path> --model <model>`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Local file to upload (image, video, audio)`,required:!0},model:{type:`string`,valueHint:`<model>`,description:`Target model name (file is bound to this model)`,required:!0}},exampleArgs:[`--file photo.jpg --model qwen3-vl-plus`,`--file video.mp4 --model wan2.1-t2v-plus`,`--file audio.wav --model qwen3-asr-flash`,`--file cat.png --model qwen-image-2.0`],async run(e){let{settings:t,flags:n}=e,r=n.file,i=n.model,a=E(t.output);if(t.dryRun){I({action:`upload`,file:r,model:i},a);return}let o=await e.client.uploadFile(r,i);t.quiet?F(o):I({url:o,model:i,expires_in:`48 hours`,note:`When using this URL in API calls, add header: X-DashScope-OssResourceResolve: enable`},a)}}),ha=T({description:`Call a Bailian console API via the CLI gateway`,auth:`console`,usageArgs:`--api <api> --data <json> [flags]`,flags:{api:{type:`string`,valueHint:`<api>`,description:`API name (e.g. zeldaEasy.broadscope-bailian.memory-library.getLibraries)`,required:!0},data:{type:`string`,valueHint:`<json>`,description:`Request data as JSON string`,required:!0}},exampleArgs:[`--api zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota --data '{"queryFreeTierQuotaRequest":{"models":["qwen3-max"]}}'`,`--api some.api.name --data '{"key":"value"}' --console-region cn-beijing`],async run(e){let{settings:t,flags:n}=e,r=n.api,i=n.data,a;try{a=JSON.parse(i)}catch{throw new p(`--data must be valid JSON`)}let o=E(t.output);if(t.dryRun){I({api:r,data:a,...se(t)},o);return}I(await e.client.console(r,a),o)}});function ga(e){return e.toLocaleString(`en-US`)}function q(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function _a(e){return pt(e)}const va={Reasoning:`Text`,TG:`Text`,VU:`Text`,IG:`Vision`,VG:`Vision`,"Realtime-Omni":`Multimodal`,"Multimodal-Omni":`Multimodal`,ASR:`Audio`,TTS:`Audio`,"Voice-Replication":`Audio`,"Realtime-Text-to-Speech":`Audio`,"Realtime-Voice-Replication":`Audio`,"Realtime-ASR":`Audio`,"Realtime-Audio-Translate":`Audio`,ME:`Embedding`,TR:`Embedding`};function ya(e){for(let t of e){let e=va[t];if(e)return e}return`-`}async function ba(e){let t=[],n=1;for(;;){let r=await fe((t,n)=>e.console(t,n),{pageNo:n,pageSize:50});if(t.push(...r.models),t.length>=r.total)break;n++}return t.filter(e=>typeof e.model==`string`&&e.model).map(e=>({name:e.model,type:ya(e.capabilities||[])}))}const xa=`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota`,Sa=`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierOnlyStatus`;function Ca(e,t){let n=e.data;if(!n)return[];let r=n.DataV2;return r?r.data?.data?.[t]||[]:n.data?.[t]||[]}function wa(e){return Ca(e,`freeTierQuotas`)}function Ta(e){return Ca(e,`freeTierOnlyStatuses`)}function Ea(e){return Da(e)||e.quotaInitTotal==null||e.quotaInitTotal<=0?null:Math.round(e.quotaTotal/e.quotaInitTotal*1e3)/10}function Da(e){return e.quotaValidityPeriod>0&&e.quotaValidityPeriod<Date.now()}function Oa(e){let{quotas:t,stopMap:n,typeMap:r}=e,i=M(process.stdout);e.title&&process.stdout.write(i.purple(e.title)+`
316
+ `);let a=[`Model`,`Type`,`Remaining`,`Total`,`Quota Left`,`Auto-Stop`],o=[],s=[],c=a.length-1,l=Ft({headers:a,rows:t.map(e=>{let t=e.quotaInitTotal!=null&&e.quotaTotal!=null,i=Da(e),a=t?`${ga(e.quotaTotal)}${i?` (expired)`:``}`:`-`,c=t?ga(e.quotaInitTotal):`-`,l=Ea(e);o.push(l),s.push(i?`expired`:l==null?`-`:null);let u=n.get(e.model),d=e.quotaStatus===`UNKNOWN`?`Unsupported`:u===!0?`ON`:u===!1?`OFF`:`-`;return[e.model,r.get(e.model)||`-`,a,c,``,d]}),align:[`left`,`left`,`right`,`right`,`left`,`left`],barColumns:[{index:4,percents:o,labels:s}],cellColor:(e,t,n)=>{if(t===c){if(n===`ON`)return i.green(n);if(n===`OFF`)return i.yellow(n)}}});for(let e of l)process.stdout.write(e+`
317
317
  `);e.moreHint&&process.stdout.write(i.dim(e.moreHint)+`
318
- `)}const Hi=`zeldaEasy.bailian-telemetry.model.getModelUsageStatistic`;async function Ui(e,t,n){let r;for(let i=0;i<30;i++){let i=r?{reqDTO:{...n,asyncTaskId:r}}:{reqDTO:n},a=await e.console(t,i),o=Ai(a);if(o.taskId&&Object.keys(o).length===1){r=o.taskId,await new Promise(e=>setTimeout(e,500));continue}return a}return null}function Wi(e){let t=Ai(e);if(t.callSuccessCount!==void 0||t.usages!==void 0)return t}const Gi={total_token:{en:`Total Tokens`,unit:`tokens`},input_token:{en:`Input Tokens`,unit:`tokens`},output_token:{en:`Output Tokens`,unit:`tokens`},input_token_cache:{en:`Cached Tokens`,unit:`tokens`},input_token_cache_read:{en:`Cache Read`,unit:`tokens`},input_token_cache_creation:{en:`Cache Creation`,unit:`tokens`},thinking_input_token:{en:`Thinking Input`,unit:`tokens`},thinking_output_token:{en:`Thinking Output`,unit:`tokens`},text_input_token:{en:`Text Input`,unit:`tokens`},purein_text_output_token:{en:`Text Output`,unit:`tokens`},embedding_token:{en:`Embedding`,unit:`tokens`},image_number:{en:`Images`,unit:`images`},video_duration:{en:`Video Duration`,unit:`sec`},content_duration:{en:`Audio Duration`,unit:`sec`},tts_text_number:{en:`TTS Chars`,unit:`chars`},total_token_avg:{en:`Avg Tokens/Req`}};function Ki(e){let t=Gi[e];if(!t)return e;let n=t.unit?` [${t.unit}]`:``;return`${t.en}${n}`}function qi(e,t,n,r,i=`Usage Overview`){let a=M(process.stdout);process.stdout.write(`${a.purple(i)} ${a.dim(`·`)} ${Z(t)} ~ ${Z(n)} ${a.dim(`(${r} days)`)}\n`);let o=[[`Models Called`,ki(e.modelCount??0)],[`Successful Calls`,ki(e.callSuccessCount??0)]];for(let t of e.usages??[])o.push([Ki(t.key),ki(t.value)]);let s=Math.max(...o.map(([e])=>N(e)));for(let[e,t]of o)process.stdout.write(`${a.bold(z(e,s+2))}${t}\n`)}var Ji=w({description:`Query free-tier quota for models (all models if --model is omitted)`,auth:`console`,usageArgs:`[--model <model>[,model2,...]] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name(s) to query, comma-separated for multiple; omit for all models`},expiring:{type:`string`,valueHint:`<days>`,description:`Only show quotas expiring within N days`},sort:{type:`string`,valueHint:`<field>`,description:`Sort by: remaining (ascending), expires (ascending)`,choices:[`remaining`,`expires`]},all:{type:`switch`,description:`Show all models instead of the top rows`}},exampleArgs:[``,`--model qwen3-max`,`--model qwen3-max,qwen-turbo`,`--expiring 30`,`--sort remaining`,`--all`,`--model qwen-turbo --output json`,`--model qwen3-max --console-region cn-beijing`],async run(e){let{identity:t,settings:n,flags:r}=e,i=r.model||void 0,a=Number(r.expiring)||0,o=r.sort||void 0,s=!!r.all,c=T(n.output),l,u=new Map;l=i?[...new Set(i.split(`,`).map(e=>e.trim()).filter(Boolean))]:[];let d={queryFreeTierQuotaRequest:{models:l}};if(n.dryRun){I({api:Pi,data:d},c);return}if(i){let t=await Promise.all(l.map(t=>E((t,n)=>e.client.console(t,n),{name:t,pageSize:50})));for(let e=0;e<l.length;e++){let n=t[e].models.find(t=>t.model===l[e]);n&&u.set(l[e],Mi(n.capabilities||[]))}}else{let t=await Ni(e.client);l=t.map(e=>e.name);for(let e of t)u.set(e.name,e.type);d.queryFreeTierQuotaRequest.models=l}let[f,p]=await Promise.all([e.client.console(Pi,d),e.client.console(Fi,{queryFreeTierOnlyStatusRequest:{models:l}})]),m=Li(f),h=i?m:m.filter(e=>e.quotaStatus===`VALID`&&e.quotaInitTotal>0);if(a>0){let e=Date.now()+a*24*60*60*1e3;h=h.filter(t=>t.quotaValidityPeriod>0&&t.quotaValidityPeriod<=e)}let g=o??(i?void 0:`remaining`);g===`remaining`?h.sort((e,t)=>(e.quotaInitTotal?e.quotaTotal/e.quotaInitTotal:0)-(t.quotaInitTotal?t.quotaTotal/t.quotaInitTotal:0)):g===`expires`&&h.sort((e,t)=>(e.quotaValidityPeriod??0)-(t.quotaValidityPeriod??0));let _=Ri(p),v=new Map(_.map(e=>[e.model,e.freeTierOnly]));if(c===`json`){I(h.map(e=>{let t=e.quotaInitTotal!=null&&e.quotaTotal!=null,n=t?e.quotaInitTotal-e.quotaTotal:0,r=v.get(e.model),i=e.quotaStatus===`UNKNOWN`?`unsupported`:r===!0?!0:r===!1?!1:null;return{model:e.model,type:u.get(e.model)||null,remaining:t?e.quotaTotal:null,total:t?e.quotaInitTotal:null,usagePercent:t&&e.quotaInitTotal>0?Math.round(n/e.quotaInitTotal*1e3)/10:null,remainingPercent:zi(e),expires:e.quotaValidityPeriod?Z(e.quotaValidityPeriod):null,autoStop:i}}),c);return}if(h.length===0){process.stdout.write(`No free-tier quota found.
319
- `);return}let y=!i&&!s?h.slice(0,15):h,b=h.length-y.length,x=g===`remaining`?` · sorted by urgency`:``;Vi({quotas:y,stopMap:v,typeMap:u,title:`Free Tier Quota · ${h.length} models${x}`,moreHint:b>0?`+ ${b} more · ${t.binName} usage free --all to browse all`:void 0})}});function Yi(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Xi(e){let t=Yi(e,`data`);if(!t)return e;let n=Yi(t,`DataV2`);if(n){let e=Yi(n,`data`);return(e?Yi(e,`data`):void 0)??e??n}return Yi(t,`data`)??t}async function Zi(e,t,n,r){let i;for(let a=0;a<20;a++){let a={[n]:i?{taskId:i}:{models:r}},o=await e.console(t,a),s=Xi(o);if(s.taskId&&Object.keys(s).length===1){i=s.taskId,await new Promise(e=>setTimeout(e,500));continue}return o}return null}async function Qi(e){let t=[],n=1;for(;;){let r=await E((t,n)=>e.console(t,n),{pageNo:n,pageSize:50});if(t.push(...r.models),t.length>=r.total)break;n++}return t.map(e=>e.model).filter(Boolean)}var $i=w({description:`Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable`,auth:`console`,usageArgs:`<--model <model>[,model2,...] | --all> [--off] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name(s), comma-separated for multiple`},all:{type:`switch`,description:`Apply to all free-tier models`},on:{type:`switch`,description:`Enable auto-stop (default behavior)`},off:{type:`switch`,description:`Disable auto-stop`}},exampleArgs:[`--model qwen3-max`,`--model qwen3-max,qwen-turbo`,`--all`,`--on --model qwen3-max`,`--off --model qwen3-max`,`--off --all`],validate:e=>!e.model&&!e.all?`Provide --model <model>[,model2,...] or --all.`:void 0,async run(e){let{settings:t,flags:n}=e,r=n.model||void 0,i=!!n.off,a=T(t.output),o;o=r?[...new Set(r.split(`,`).map(e=>e.trim()).filter(Boolean))]:[];let s=i?`zeldaEasy.broadscope-bailian.freeTrial.batchDeactivateFreeTierOnly`:`zeldaEasy.broadscope-bailian.freeTrial.batchActivateFreeTierOnly`,c=i?`BatchDeactivateFreeTierOnlyRequest`:`BatchActivateFreeTierOnlyRequest`;if(t.dryRun){I({api:s,data:{[c]:{models:o}}},a);return}if(r||(o=await Qi(e.client)),i){let[t,n]=await Promise.all([e.client.console(`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota`,{queryFreeTierQuotaRequest:{models:o}}),e.client.console(`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierOnlyStatus`,{queryFreeTierOnlyStatusRequest:{models:o}})]),r=Xi(t).freeTierQuotas??[],i=new Map(r.map(e=>[e.model,e])),a=Xi(n).freeTierOnlyStatuses??[],l=new Map(a.map(e=>[e.model,e.freeTierOnly]));for(let t of o){if(l.get(t)===!1){process.stderr.write(`Auto-stop is already disabled for "${t}".\n`);continue}let n=i.get(t);if(n&&n.quotaTotal>0&&l.get(t)===!0){process.stderr.write(`Cannot disable auto-stop for "${t}": free-tier quota has not been fully consumed. Please disable auto-stop after the quota is exhausted.\n`);continue}await Zi(e.client,s,c,[t]),process.stdout.write(`Disabled auto-stop for "${t}".\n`)}return}let l=[];for(let t of o){let n=await Zi(e.client,s,c,[t]);if(a===`json`){l.push(n);continue}if(n){let e=Xi(n).failureModels??[];e.length>0?process.stderr.write(`Failed to enable auto-stop for "${t}" (${e[0].errorCode}).\n`):process.stdout.write(`Enabled auto-stop for "${t}".\n`)}else process.stderr.write(`Warning: operation timed out for "${t}".\n`)}a===`json`&&I(l,a)}});const ea=`zeldaEasy.bailian-telemetry.model.getModelUsageStatistic`,ta=`zeldaEasy.bailian-telemetry.model.listModelUsageStatisticData`;function na(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function ra(e){let t=na(e,`data`);if(!t)return e;let n=na(t,`DataV2`);if(n){let e=na(n,`data`);return(e?na(e,`data`):void 0)??e??n}return na(t,`data`)??t}async function ia(e,t,n){let r;for(let i=0;i<30;i++){let i=r?{reqDTO:{...n,asyncTaskId:r}}:{reqDTO:n},a=await e.console(t,i),o=ra(a);if(o.taskId&&Object.keys(o).length===1){r=o.taskId,await new Promise(e=>setTimeout(e,500));continue}return a}return null}function aa(e,n){if(e.workspaceId)return e.workspaceId;throw new t(`workspace-id is required. Set via --workspace-id, BAILIAN_WORKSPACE_ID, or \`${n} config set workspace_id <id>\`.`,a.GENERAL,`Run \`${n} workspace list\` to view available workspaces.`)}function oa(e){return e.toLocaleString(`en-US`)}function Q(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function sa(e){let t=ra(e);if(t.callSuccessCount!==void 0||t.usages!==void 0)return t}function ca(e){let t=ra(e);return{list:t.list??[],totalCount:t.totalCount??0,maxResults:t.maxResults??0}}function la(e){let t={};if(e.usages&&Array.isArray(e.usages))for(let n of e.usages)n.key&&n.value!=null&&(t[n.key]=n.value);if(e.usage&&typeof e.usage==`object`)for(let[n,r]of Object.entries(e.usage))r!=null&&(t[n]=r);return t}const ua={total_token:{en:`Total Tokens`,unit:`tokens`},input_token:{en:`Input Tokens`,unit:`tokens`},output_token:{en:`Output Tokens`,unit:`tokens`},input_token_cache:{en:`Cached Tokens`,unit:`tokens`},input_token_cache_read:{en:`Cache Read`,unit:`tokens`},input_token_cache_creation:{en:`Cache Creation`,unit:`tokens`},thinking_input_token:{en:`Thinking Input`,unit:`tokens`},thinking_output_token:{en:`Thinking Output`,unit:`tokens`},text_input_token:{en:`Text Input`,unit:`tokens`},purein_text_output_token:{en:`Text Output`,unit:`tokens`},embedding_token:{en:`Embedding`,unit:`tokens`},image_number:{en:`Images`,unit:`images`},video_duration:{en:`Video Duration`,unit:`sec`},content_duration:{en:`Audio Duration`,unit:`sec`},tts_text_number:{en:`TTS Chars`,unit:`chars`},total_token_avg:{en:`Avg Tokens/Req`}};function da(e){let t=e.unit?` [${e.unit}]`:``;return`${e.en}${t}`}function fa(e,t,n,r){let i=M(process.stdout);process.stdout.write(`${i.dim(`Time Range Period:`)} ${Q(t)} ~ ${Q(n)} ${i.dim(`(${r} days)`)}\n\n`);let a=[[`Models Called`,oa(e.modelCount??0)],[`Successful Calls`,oa(e.callSuccessCount??0)]];for(let t of e.usages??[]){let e=ua[t.key],n=e?da(e):t.key;a.push([n,oa(t.value)])}let o=Math.max(...a.map(([e])=>N(e)));for(let[e,t]of a)process.stdout.write(`${i.bold(z(e,o+2))}${t}\n`)}function pa(e,t,n,r){let i=M(process.stdout);if(process.stdout.write(`${i.dim(`Time Range Period:`)} ${Q(t)} ~ ${Q(n)} ${i.dim(`(${r} days)`)}\n\n`),e.length===0){process.stdout.write(`No usage data found.
320
- `);return}let a=new Set,o=e.map(e=>{let t=la(e);for(let e of Object.keys(t))a.add(e);return t}),s=[...a].sort((e,t)=>{let n=[`total_token`,`input_token`,`output_token`,`input_token_cache`,`image_number`,`video_duration`,`content_duration`,`tts_text_number`],r=n.indexOf(e),i=n.indexOf(t);return(r===-1?999:r)-(i===-1?999:i)}),c=[`Model`,`Calls`,...s.map(e=>ua[e]?.en??e)],l=e.map((e,t)=>[e.model,oa(e.callSuccessCount??0),...s.map(e=>{let n=o[t][e];return n==null?`-`:oa(n)})]),u=c.map((e,t)=>Math.max(N(e),...l.map(e=>N(e[t])))),d=c.map((e,t)=>i.bold(z(e,u[t]))).join(` `),f=u.map(e=>i.dim(`─`.repeat(e))).join(`──`);process.stdout.write(d+`
318
+ `)}const ka=`zeldaEasy.bailian-telemetry.model.getModelUsageStatistic`;async function Aa(e,t,n){let r;for(let i=0;i<30;i++){let i=r?{reqDTO:{...n,asyncTaskId:r}}:{reqDTO:n},a=await e.console(t,i),o=_a(a);if(o.taskId&&Object.keys(o).length===1){r=o.taskId,await new Promise(e=>setTimeout(e,500));continue}return a}return null}function ja(e){let t=_a(e);if(t.callSuccessCount!==void 0||t.usages!==void 0)return t}const Ma={total_token:{en:`Total Tokens`,unit:`tokens`},input_token:{en:`Input Tokens`,unit:`tokens`},output_token:{en:`Output Tokens`,unit:`tokens`},input_token_cache:{en:`Cached Tokens`,unit:`tokens`},input_token_cache_read:{en:`Cache Read`,unit:`tokens`},input_token_cache_creation:{en:`Cache Creation`,unit:`tokens`},thinking_input_token:{en:`Thinking Input`,unit:`tokens`},thinking_output_token:{en:`Thinking Output`,unit:`tokens`},text_input_token:{en:`Text Input`,unit:`tokens`},purein_text_output_token:{en:`Text Output`,unit:`tokens`},embedding_token:{en:`Embedding`,unit:`tokens`},image_number:{en:`Images`,unit:`images`},video_duration:{en:`Video Duration`,unit:`sec`},content_duration:{en:`Audio Duration`,unit:`sec`},tts_text_number:{en:`TTS Chars`,unit:`chars`},total_token_avg:{en:`Avg Tokens/Req`}};function Na(e){let t=Ma[e];if(!t)return e;let n=t.unit?` [${t.unit}]`:``;return`${t.en}${n}`}function Pa(e,t,n,r,i=`Usage Overview`){let a=M(process.stdout);process.stdout.write(`${a.purple(i)} ${a.dim(`·`)} ${q(t)} ~ ${q(n)} ${a.dim(`(${r} days)`)}\n`);let o=[[`Models Called`,ga(e.modelCount??0)],[`Successful Calls`,ga(e.callSuccessCount??0)]];for(let t of e.usages??[])o.push([Na(t.key),ga(t.value)]);let s=Math.max(...o.map(([e])=>N(e)));for(let[e,t]of o)process.stdout.write(`${a.bold(z(e,s+2))}${t}\n`)}var Fa=T({description:`Query free-tier quota for models (all models if --model is omitted)`,auth:`console`,usageArgs:`[--model <model>[,model2,...]] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name(s) to query, comma-separated for multiple; omit for all models`},expiring:{type:`string`,valueHint:`<days>`,description:`Only show quotas expiring within N days`},sort:{type:`string`,valueHint:`<field>`,description:`Sort by: remaining (ascending), expires (ascending)`,choices:[`remaining`,`expires`]},all:{type:`switch`,description:`Show all models instead of the top rows`}},exampleArgs:[``,`--model qwen3-max`,`--model qwen3-max,qwen-turbo`,`--expiring 30`,`--sort remaining`,`--all`,`--model qwen-turbo --output json`,`--model qwen3-max --console-region cn-beijing`],async run(e){let{identity:t,settings:n,flags:r}=e,i=r.model||void 0,a=Number(r.expiring)||0,o=r.sort||void 0,s=!!r.all,c=E(n.output),l,u=new Map;l=i?[...new Set(i.split(`,`).map(e=>e.trim()).filter(Boolean))]:[];let d={queryFreeTierQuotaRequest:{models:l}};if(n.dryRun){I({api:xa,data:d},c);return}if(i){let t=await Promise.all(l.map(t=>fe((t,n)=>e.client.console(t,n),{name:t,pageSize:50})));for(let e=0;e<l.length;e++){let n=t[e].models.find(t=>t.model===l[e]);n&&u.set(l[e],ya(n.capabilities||[]))}}else{let t=await ba(e.client);l=t.map(e=>e.name);for(let e of t)u.set(e.name,e.type);d.queryFreeTierQuotaRequest.models=l}let[f,p]=await Promise.all([e.client.console(xa,d),e.client.console(Sa,{queryFreeTierOnlyStatusRequest:{models:l}})]),m=wa(f),h=i?m:m.filter(e=>e.quotaStatus===`VALID`&&e.quotaInitTotal>0);if(a>0){let e=Date.now()+a*24*60*60*1e3;h=h.filter(t=>t.quotaValidityPeriod>0&&t.quotaValidityPeriod<=e)}let g=o??(i?void 0:`remaining`);g===`remaining`?h.sort((e,t)=>(e.quotaInitTotal?e.quotaTotal/e.quotaInitTotal:0)-(t.quotaInitTotal?t.quotaTotal/t.quotaInitTotal:0)):g===`expires`&&h.sort((e,t)=>(e.quotaValidityPeriod??0)-(t.quotaValidityPeriod??0));let _=Ta(p),v=new Map(_.map(e=>[e.model,e.freeTierOnly]));if(c===`json`){I(h.map(e=>{let t=e.quotaInitTotal!=null&&e.quotaTotal!=null,n=t?e.quotaInitTotal-e.quotaTotal:0,r=v.get(e.model),i=e.quotaStatus===`UNKNOWN`?`unsupported`:r===!0?!0:r===!1?!1:null;return{model:e.model,type:u.get(e.model)||null,remaining:t?e.quotaTotal:null,total:t?e.quotaInitTotal:null,usagePercent:t&&e.quotaInitTotal>0?Math.round(n/e.quotaInitTotal*1e3)/10:null,remainingPercent:Ea(e),expires:e.quotaValidityPeriod?q(e.quotaValidityPeriod):null,autoStop:i}}),c);return}if(h.length===0){process.stdout.write(`No free-tier quota found.
319
+ `);return}let y=!i&&!s?h.slice(0,15):h,b=h.length-y.length,x=g===`remaining`?` · sorted by urgency`:``;Oa({quotas:y,stopMap:v,typeMap:u,title:`Free Tier Quota · ${h.length} models${x}`,moreHint:b>0?`+ ${b} more · ${t.binName} usage free --all to browse all`:void 0})}});function Ia(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function La(e){let t=Ia(e,`data`);if(!t)return e;let n=Ia(t,`DataV2`);if(n){let e=Ia(n,`data`);return(e?Ia(e,`data`):void 0)??e??n}return Ia(t,`data`)??t}async function Ra(e,t,n,r){let i;for(let a=0;a<20;a++){let a={[n]:i?{taskId:i}:{models:r}},o=await e.console(t,a),s=La(o);if(s.taskId&&Object.keys(s).length===1){i=s.taskId,await new Promise(e=>setTimeout(e,500));continue}return o}return null}async function za(e){let t=[],n=1;for(;;){let r=await fe((t,n)=>e.console(t,n),{pageNo:n,pageSize:50});if(t.push(...r.models),t.length>=r.total)break;n++}return t.map(e=>e.model).filter(Boolean)}var Ba=T({description:`Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable`,auth:`console`,usageArgs:`<--model <model>[,model2,...] | --all> [--off] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name(s), comma-separated for multiple`},all:{type:`switch`,description:`Apply to all free-tier models`},on:{type:`switch`,description:`Enable auto-stop (default behavior)`},off:{type:`switch`,description:`Disable auto-stop`}},exampleArgs:[`--model qwen3-max`,`--model qwen3-max,qwen-turbo`,`--all`,`--on --model qwen3-max`,`--off --model qwen3-max`,`--off --all`],validate:e=>!e.model&&!e.all?`Provide --model <model>[,model2,...] or --all.`:void 0,async run(e){let{settings:t,flags:n}=e,r=n.model||void 0,i=!!n.off,a=E(t.output),o;o=r?[...new Set(r.split(`,`).map(e=>e.trim()).filter(Boolean))]:[];let s=i?`zeldaEasy.broadscope-bailian.freeTrial.batchDeactivateFreeTierOnly`:`zeldaEasy.broadscope-bailian.freeTrial.batchActivateFreeTierOnly`,c=i?`BatchDeactivateFreeTierOnlyRequest`:`BatchActivateFreeTierOnlyRequest`;if(t.dryRun){I({api:s,data:{[c]:{models:o}}},a);return}if(r||(o=await za(e.client)),i){let[t,n]=await Promise.all([e.client.console(`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota`,{queryFreeTierQuotaRequest:{models:o}}),e.client.console(`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierOnlyStatus`,{queryFreeTierOnlyStatusRequest:{models:o}})]),r=La(t).freeTierQuotas??[],i=new Map(r.map(e=>[e.model,e])),a=La(n).freeTierOnlyStatuses??[],l=new Map(a.map(e=>[e.model,e.freeTierOnly]));for(let t of o){if(l.get(t)===!1){process.stderr.write(`Auto-stop is already disabled for "${t}".\n`);continue}let n=i.get(t);if(n&&n.quotaTotal>0&&l.get(t)===!0){process.stderr.write(`Cannot disable auto-stop for "${t}": free-tier quota has not been fully consumed. Please disable auto-stop after the quota is exhausted.\n`);continue}await Ra(e.client,s,c,[t]),process.stdout.write(`Disabled auto-stop for "${t}".\n`)}return}let l=[];for(let t of o){let n=await Ra(e.client,s,c,[t]);if(a===`json`){l.push(n);continue}if(n){let e=La(n).failureModels??[];e.length>0?process.stderr.write(`Failed to enable auto-stop for "${t}" (${e[0].errorCode}).\n`):process.stdout.write(`Enabled auto-stop for "${t}".\n`)}else process.stderr.write(`Warning: operation timed out for "${t}".\n`)}a===`json`&&I(l,a)}});const Va=`zeldaEasy.bailian-telemetry.model.getModelUsageStatistic`,Ha=`zeldaEasy.bailian-telemetry.model.listModelUsageStatisticData`;function Ua(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Wa(e){let t=Ua(e,`data`);if(!t)return e;let n=Ua(t,`DataV2`);if(n){let e=Ua(n,`data`);return(e?Ua(e,`data`):void 0)??e??n}return Ua(t,`data`)??t}async function Ga(e,t,n){let r;for(let i=0;i<30;i++){let i=r?{reqDTO:{...n,asyncTaskId:r}}:{reqDTO:n},a=await e.console(t,i),o=Wa(a);if(o.taskId&&Object.keys(o).length===1){r=o.taskId,await new Promise(e=>setTimeout(e,500));continue}return a}return null}function Ka(e,n){if(e.workspaceId)return e.workspaceId;throw new t(`workspace-id is required. Set via --workspace-id, BAILIAN_WORKSPACE_ID, or \`${n} config set workspace_id <id>\`.`,a.GENERAL,`Run \`${n} workspace list\` to view available workspaces.`)}function qa(e){return e.toLocaleString(`en-US`)}function J(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function Ja(e){let t=Wa(e);if(t.callSuccessCount!==void 0||t.usages!==void 0)return t}function Ya(e){let t=Wa(e);return{list:t.list??[],totalCount:t.totalCount??0,maxResults:t.maxResults??0}}function Xa(e){let t={};if(e.usages&&Array.isArray(e.usages))for(let n of e.usages)n.key&&n.value!=null&&(t[n.key]=n.value);if(e.usage&&typeof e.usage==`object`)for(let[n,r]of Object.entries(e.usage))r!=null&&(t[n]=r);return t}const Za={total_token:{en:`Total Tokens`,unit:`tokens`},input_token:{en:`Input Tokens`,unit:`tokens`},output_token:{en:`Output Tokens`,unit:`tokens`},input_token_cache:{en:`Cached Tokens`,unit:`tokens`},input_token_cache_read:{en:`Cache Read`,unit:`tokens`},input_token_cache_creation:{en:`Cache Creation`,unit:`tokens`},thinking_input_token:{en:`Thinking Input`,unit:`tokens`},thinking_output_token:{en:`Thinking Output`,unit:`tokens`},text_input_token:{en:`Text Input`,unit:`tokens`},purein_text_output_token:{en:`Text Output`,unit:`tokens`},embedding_token:{en:`Embedding`,unit:`tokens`},image_number:{en:`Images`,unit:`images`},video_duration:{en:`Video Duration`,unit:`sec`},content_duration:{en:`Audio Duration`,unit:`sec`},tts_text_number:{en:`TTS Chars`,unit:`chars`},total_token_avg:{en:`Avg Tokens/Req`}};function Qa(e){let t=e.unit?` [${e.unit}]`:``;return`${e.en}${t}`}function $a(e,t,n,r){let i=M(process.stdout);process.stdout.write(`${i.dim(`Time Range Period:`)} ${J(t)} ~ ${J(n)} ${i.dim(`(${r} days)`)}\n\n`);let a=[[`Models Called`,qa(e.modelCount??0)],[`Successful Calls`,qa(e.callSuccessCount??0)]];for(let t of e.usages??[]){let e=Za[t.key],n=e?Qa(e):t.key;a.push([n,qa(t.value)])}let o=Math.max(...a.map(([e])=>N(e)));for(let[e,t]of a)process.stdout.write(`${i.bold(z(e,o+2))}${t}\n`)}function eo(e,t,n,r){let i=M(process.stdout);if(process.stdout.write(`${i.dim(`Time Range Period:`)} ${J(t)} ~ ${J(n)} ${i.dim(`(${r} days)`)}\n\n`),e.length===0){process.stdout.write(`No usage data found.
320
+ `);return}let a=new Set,o=e.map(e=>{let t=Xa(e);for(let e of Object.keys(t))a.add(e);return t}),s=[...a].sort((e,t)=>{let n=[`total_token`,`input_token`,`output_token`,`input_token_cache`,`image_number`,`video_duration`,`content_duration`,`tts_text_number`],r=n.indexOf(e),i=n.indexOf(t);return(r===-1?999:r)-(i===-1?999:i)}),c=[`Model`,`Calls`,...s.map(e=>Za[e]?.en??e)],l=e.map((e,t)=>[e.model,qa(e.callSuccessCount??0),...s.map(e=>{let n=o[t][e];return n==null?`-`:qa(n)})]),u=c.map((e,t)=>Math.max(N(e),...l.map(e=>N(e[t])))),d=c.map((e,t)=>i.bold(z(e,u[t]))).join(` `),f=u.map(e=>i.dim(`─`.repeat(e))).join(`──`);process.stdout.write(d+`
321
321
  `),process.stdout.write(f+`
322
322
  `);for(let e of l){let t=e.map((e,t)=>z(e,u[t]));process.stdout.write(t.join(` `)+`
323
323
  `)}process.stdout.write(i.dim(`\nTotal: ${e.length} models`)+`
324
- `)}var ma=w({description:`Query model usage statistics`,auth:`console`,usageArgs:`[--model <model>] [--days <days>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name(s), comma-separated; omit for overview`},days:{type:`string`,valueHint:`<days>`,description:`Number of days (default: 7)`},type:{type:`string`,valueHint:`<type>`,description:`Model type: Text, Vision, Multimodal, Audio, Embedding`}},exampleArgs:[``,`--days 30`,`--model qwen-turbo`,`--model qwen-turbo --days 7`,`--model qwen3.6-plus,deepseek-v4-pro`,`--type Text --days 14`,`--output json`],async run(e){let{identity:n,settings:r,flags:i}=e,o=i.model||void 0,s=Number(i.days)||7,c=i.type||void 0,l=T(r.output),u=aa(r,n.binName),d=Date.now(),f=d-s*24*60*60*1e3;if(o){let t=[...new Set(o.split(`,`).map(e=>e.trim()).filter(Boolean))],n={startTime:f,endTime:d,modelCallSource:`Online`,filterWorkspaceId:u,maxResults:50,skip:0,sortField:`success_count`,sortOrder:`DESC`};if(c&&(n.obsModelType=c),r.dryRun){I({api:ta,data:{reqDTO:{...n,model:t.join(`,`)}}},l);return}let i=await Promise.all(t.map(t=>ia(e.client,ta,{...n,model:t}))),a=[];for(let e of i){if(!e)continue;let t=ca(e);a.push(...t.list)}if(l===`json`){let e=a.map(e=>{let t=la(e),n={model:e.model,successfulCalls:e.callSuccessCount??0};for(let[e,r]of Object.entries(t))n[e]=r;return n});I({period:{start:Q(f),end:Q(d),days:s},items:e},l);return}pa(a,f,d,s)}else{let n={startTime:f,endTime:d,modelCallSource:`Online`,filterWorkspaceId:u};if(c&&(n.obsModelType=c),r.dryRun){I({api:ea,data:{reqDTO:n}},l);return}let i=await ia(e.client,ea,n);if(!i)throw new t(`Request timed out.`,a.TIMEOUT);let o=sa(i);if(l===`json`){if(!o){I({period:{start:Q(f),end:Q(d),days:s},modelsCalled:0,successfulCalls:0},l);return}I({period:{start:Q(f),end:Q(d),days:s},modelsCalled:o.modelCount??0,successfulCalls:o.callSuccessCount??0,usages:(o.usages??[]).map(e=>({key:e.key,value:e.value,unit:e.unit,label:ua[e.key]?.en??e.key}))},l);return}if(!o){process.stdout.write(`No usage data found.
325
- `);return}fa(o,f,d,s)}}}),ha=w({description:`Show a unified usage summary: free-tier quota and recent usage overview`,auth:`console`,usageArgs:`[--days <days>] [flags]`,flags:{days:{type:`string`,valueHint:`<days>`,description:`Number of days for the usage overview (default: 7)`}},exampleArgs:[``,`--days 30`,`--output json`],async run(e){let{identity:n,settings:r,flags:i}=e,o=Number(i.days)||7,s=T(r.output),c=r.workspaceId,l=Date.now(),u=l-o*24*60*60*1e3;if(r.dryRun){I({freeTier:{api:Pi},usage:c?{api:Hi,data:{reqDTO:{startTime:u,endTime:l,modelCallSource:`Online`,filterWorkspaceId:c}}}:null},s);return}let d=await Ni(e.client),f=d.map(e=>e.name),p=new Map(d.map(e=>[e.name,e.type])),[m,h]=await Promise.all([e.client.console(Pi,{queryFreeTierQuotaRequest:{models:f}}),e.client.console(Fi,{queryFreeTierOnlyStatusRequest:{models:f}})]),g=Li(m).filter(e=>e.quotaStatus===`VALID`&&e.quotaInitTotal>0).sort((e,t)=>(e.quotaInitTotal?e.quotaTotal/e.quotaInitTotal:0)-(t.quotaInitTotal?t.quotaTotal/t.quotaInitTotal:0)),_=Ri(h),v=new Map(_.map(e=>[e.model,e.freeTierOnly])),y;if(c){let n=await Ui(e.client,Hi,{startTime:u,endTime:l,modelCallSource:`Online`,filterWorkspaceId:c});if(!n)throw new t(`Request timed out.`,a.TIMEOUT);y=Wi(n)}if(s===`json`){let e=g.map(e=>({model:e.model,type:p.get(e.model)||null,remaining:e.quotaTotal,total:e.quotaInitTotal,remainingPercent:zi(e),expires:e.quotaValidityPeriod?Z(e.quotaValidityPeriod):null}));I({period:{start:Z(u),end:Z(l),days:o},freeTier:e,usage:y?{modelsCalled:y.modelCount??0,successfulCalls:y.callSuccessCount??0,usages:(y.usages??[]).map(e=>({key:e.key,value:e.value,unit:e.unit,label:Gi[e.key]?.en??e.key}))}:null},s);return}let b=M(process.stdout);if(process.stdout.write(`${b.bold(`Usage Summary`)} ${b.dim(`·`)} ${Z(l)}\n\n`),g.length===0)process.stdout.write(b.dim(`No active free-tier quota.`)+`
326
- `);else{let e=g.slice(0,10),t=g.length-e.length;Vi({quotas:e,stopMap:v,typeMap:p,title:`Free Tier Quota · ${g.length} models · sorted by urgency`,moreHint:t>0?`+ ${t} more · ${n.binName} usage free to browse all`:void 0})}process.stdout.write(`
327
- `),c?y?qi(y,u,l,o):process.stdout.write(b.dim(`No usage data in this period.`)+`
324
+ `)}var to=T({description:`Query model usage statistics`,auth:`console`,usageArgs:`[--model <model>] [--days <days>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name(s), comma-separated; omit for overview`},days:{type:`string`,valueHint:`<days>`,description:`Number of days (default: 7)`},type:{type:`string`,valueHint:`<type>`,description:`Model type: Text, Vision, Multimodal, Audio, Embedding`}},exampleArgs:[``,`--days 30`,`--model qwen-turbo`,`--model qwen-turbo --days 7`,`--model qwen3.6-plus,deepseek-v4-pro`,`--type Text --days 14`,`--output json`],async run(e){let{identity:n,settings:r,flags:i}=e,o=i.model||void 0,s=Number(i.days)||7,c=i.type||void 0,l=E(r.output),u=Ka(r,n.binName),d=Date.now(),f=d-s*24*60*60*1e3;if(o){let t=[...new Set(o.split(`,`).map(e=>e.trim()).filter(Boolean))],n={startTime:f,endTime:d,modelCallSource:`Online`,filterWorkspaceId:u,maxResults:50,skip:0,sortField:`success_count`,sortOrder:`DESC`};if(c&&(n.obsModelType=c),r.dryRun){I({api:Ha,data:{reqDTO:{...n,model:t.join(`,`)}}},l);return}let i=await Promise.all(t.map(t=>Ga(e.client,Ha,{...n,model:t}))),a=[];for(let e of i){if(!e)continue;let t=Ya(e);a.push(...t.list)}if(l===`json`){let e=a.map(e=>{let t=Xa(e),n={model:e.model,successfulCalls:e.callSuccessCount??0};for(let[e,r]of Object.entries(t))n[e]=r;return n});I({period:{start:J(f),end:J(d),days:s},items:e},l);return}eo(a,f,d,s)}else{let n={startTime:f,endTime:d,modelCallSource:`Online`,filterWorkspaceId:u};if(c&&(n.obsModelType=c),r.dryRun){I({api:Va,data:{reqDTO:n}},l);return}let i=await Ga(e.client,Va,n);if(!i)throw new t(`Request timed out.`,a.TIMEOUT);let o=Ja(i);if(l===`json`){if(!o){I({period:{start:J(f),end:J(d),days:s},modelsCalled:0,successfulCalls:0},l);return}I({period:{start:J(f),end:J(d),days:s},modelsCalled:o.modelCount??0,successfulCalls:o.callSuccessCount??0,usages:(o.usages??[]).map(e=>({key:e.key,value:e.value,unit:e.unit,label:Za[e.key]?.en??e.key}))},l);return}if(!o){process.stdout.write(`No usage data found.
325
+ `);return}$a(o,f,d,s)}}}),no=T({description:`Show a unified usage summary: free-tier quota and recent usage overview`,auth:`console`,usageArgs:`[--days <days>] [flags]`,flags:{days:{type:`string`,valueHint:`<days>`,description:`Number of days for the usage overview (default: 7)`}},exampleArgs:[``,`--days 30`,`--output json`],async run(e){let{identity:n,settings:r,flags:i}=e,o=Number(i.days)||7,s=E(r.output),c=r.workspaceId,l=Date.now(),u=l-o*24*60*60*1e3;if(r.dryRun){I({freeTier:{api:xa},usage:c?{api:ka,data:{reqDTO:{startTime:u,endTime:l,modelCallSource:`Online`,filterWorkspaceId:c}}}:null},s);return}let d=await ba(e.client),f=d.map(e=>e.name),p=new Map(d.map(e=>[e.name,e.type])),[m,h]=await Promise.all([e.client.console(xa,{queryFreeTierQuotaRequest:{models:f}}),e.client.console(Sa,{queryFreeTierOnlyStatusRequest:{models:f}})]),g=wa(m).filter(e=>e.quotaStatus===`VALID`&&e.quotaInitTotal>0).sort((e,t)=>(e.quotaInitTotal?e.quotaTotal/e.quotaInitTotal:0)-(t.quotaInitTotal?t.quotaTotal/t.quotaInitTotal:0)),_=Ta(h),v=new Map(_.map(e=>[e.model,e.freeTierOnly])),y;if(c){let n=await Aa(e.client,ka,{startTime:u,endTime:l,modelCallSource:`Online`,filterWorkspaceId:c});if(!n)throw new t(`Request timed out.`,a.TIMEOUT);y=ja(n)}if(s===`json`){let e=g.map(e=>({model:e.model,type:p.get(e.model)||null,remaining:e.quotaTotal,total:e.quotaInitTotal,remainingPercent:Ea(e),expires:e.quotaValidityPeriod?q(e.quotaValidityPeriod):null}));I({period:{start:q(u),end:q(l),days:o},freeTier:e,usage:y?{modelsCalled:y.modelCount??0,successfulCalls:y.callSuccessCount??0,usages:(y.usages??[]).map(e=>({key:e.key,value:e.value,unit:e.unit,label:Ma[e.key]?.en??e.key}))}:null},s);return}let b=M(process.stdout);if(process.stdout.write(`${b.bold(`Usage Summary`)} ${b.dim(`·`)} ${q(l)}\n\n`),g.length===0)process.stdout.write(b.dim(`No active free-tier quota.`)+`
326
+ `);else{let e=g.slice(0,10),t=g.length-e.length;Oa({quotas:e,stopMap:v,typeMap:p,title:`Free Tier Quota · ${g.length} models · sorted by urgency`,moreHint:t>0?`+ ${t} more · ${n.binName} usage free to browse all`:void 0})}process.stdout.write(`
327
+ `),c?y?Pa(y,u,l,o):process.stdout.write(b.dim(`No usage data in this period.`)+`
328
328
  `):process.stdout.write(b.dim(`Usage overview skipped · set --workspace-id or \`${n.binName} config set workspace_id <id>\` to include it.`)+`
329
- `)}});async function ga(e){let t=await Zt(e,`utf-8`).catch(e=>{throw new p(`cannot read pipeline file: ${e.message}`)}),n=$t(e).toLowerCase(),r;if(n===`.yaml`||n===`.yml`){let{parse:e}=await import(`yaml`);r=e(t)}else try{r=JSON.parse(t)}catch{let{parse:e}=await import(`yaml`);r=e(t)}return r}var _a=w({description:`Run a pipeline workflow definition`,auth:`none`,usageArgs:`--file <path> [flags]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Pipeline definition file (YAML/JSON)`,required:!0},input:{type:`string`,valueHint:`<json>`,description:`Runtime input as inline JSON`},inputFile:{type:`string`,valueHint:`<path>`,description:`Runtime input from a JSON file`},concurrency:{type:`number`,valueHint:`<n>`,description:`Max parallel steps (default: 1)`},events:{type:`string`,valueHint:`<format>`,description:`Emit lifecycle events: jsonl`,choices:[`jsonl`]},stepTimeout:{type:`number`,valueHint:`<seconds>`,description:`Default step timeout in seconds`}},exampleArgs:[`--file workflow.yaml --input '{"brief":"hello"}'`,`--file workflow.json --input-file inputs.json --concurrency 3`,`--file workflow.yaml --dry-run`,`--file workflow.json --events jsonl`,`--file workflow.yaml --output json`],validate:e=>e.input&&e.inputFile?`use --input or --input-file, not both`:void 0,async run(e){let{settings:t,flags:n}=e,r=n.file;kt();let i=n.events,a=en(r),o=await ga(a),s=await va(n),c=Qt(a);if(i===`jsonl`){for await(let e of Mt(o,s,{concurrency:n.concurrency,basePath:c,dryRun:t.dryRun,timeoutSeconds:n.stepTimeout}))process.stdout.write(JSON.stringify(e)+`
330
- `);return}let l=await Et(o,s,{concurrency:n.concurrency,basePath:c,dryRun:t.dryRun,timeoutSeconds:n.stepTimeout,onEvent:t.verbose?ya:void 0});t.output===`json`?I(l,`json`):xa(l),l.status===`failed`&&(process.exitCode=1)}});async function va(e){let t=e.input,n=e.inputFile;if(t)return JSON.parse(t);if(n){let e=await Zt(en(n),`utf-8`);return JSON.parse(e)}return{}}function ya(e){let t=`[${e.type}]`;if(`stepCount`in e){process.stderr.write(`${t} ${e.stepCount} step${e.stepCount===1?``:`s`}\n`);return}`step`in e&&e.step?process.stderr.write(`${t} ${ba(e.step)}\n`):process.stderr.write(`${t}\n`)}function ba(e){return`${e.index!==void 0&&e.total!==void 0?`${e.index}/${e.total} `:``}${e.id} (${e.type})`}function xa(e){let t=e.status===`succeeded`?`+`:e.status===`failed`?`x`:`~`;process.stdout.write(`\nPipeline ${e.status} [${t}]\n\n`);for(let t of e.steps){let e=` [${t.status===`succeeded`?`+`:t.status===`failed`?`x`:t.status===`skipped`?`-`:`~`}] ${t.id} (${t.type}) — ${t.status}`;t.skipReason&&(e+=` (${t.skipReason})`),t.error&&(e+=`: ${t.error.message}`),process.stdout.write(e+`
329
+ `)}});async function ro(e){let t=await an(e,`utf-8`).catch(e=>{throw new p(`cannot read pipeline file: ${e.message}`)}),n=ln(e).toLowerCase(),r;if(n===`.yaml`||n===`.yml`){let{parse:e}=await import(`yaml`);r=e(t)}else try{r=JSON.parse(t)}catch{let{parse:e}=await import(`yaml`);r=e(t)}return r}var io=T({description:`Run a pipeline workflow definition`,auth:`none`,usageArgs:`--file <path> [flags]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Pipeline definition file (YAML/JSON)`,required:!0},input:{type:`string`,valueHint:`<json>`,description:`Runtime input as inline JSON`},inputFile:{type:`string`,valueHint:`<path>`,description:`Runtime input from a JSON file`},concurrency:{type:`number`,valueHint:`<n>`,description:`Max parallel steps (default: 1)`},events:{type:`string`,valueHint:`<format>`,description:`Emit lifecycle events: jsonl`,choices:[`jsonl`]},stepTimeout:{type:`number`,valueHint:`<seconds>`,description:`Default step timeout in seconds`}},exampleArgs:[`--file workflow.yaml --input '{"brief":"hello"}'`,`--file workflow.json --input-file inputs.json --concurrency 3`,`--file workflow.yaml --dry-run`,`--file workflow.json --events jsonl`,`--file workflow.yaml --output json`],validate:e=>e.input&&e.inputFile?`use --input or --input-file, not both`:void 0,async run(e){let{settings:t,flags:n}=e,r=n.file;Nt();let i=n.events,a=un(r),o=await ro(a),s=await ao(n),c=cn(a);if(i===`jsonl`){for await(let e of Lt(o,s,{concurrency:n.concurrency,basePath:c,dryRun:t.dryRun,timeoutSeconds:n.stepTimeout}))process.stdout.write(JSON.stringify(e)+`
330
+ `);return}let l=await At(o,s,{concurrency:n.concurrency,basePath:c,dryRun:t.dryRun,timeoutSeconds:n.stepTimeout,onEvent:t.verbose?oo:void 0});t.output===`json`?I(l,`json`):co(l),l.status===`failed`&&(process.exitCode=1)}});async function ao(e){let t=e.input,n=e.inputFile;if(t)return JSON.parse(t);if(n){let e=await an(un(n),`utf-8`);return JSON.parse(e)}return{}}function oo(e){let t=`[${e.type}]`;if(`stepCount`in e){process.stderr.write(`${t} ${e.stepCount} step${e.stepCount===1?``:`s`}\n`);return}`step`in e&&e.step?process.stderr.write(`${t} ${so(e.step)}\n`):process.stderr.write(`${t}\n`)}function so(e){return`${e.index!==void 0&&e.total!==void 0?`${e.index}/${e.total} `:``}${e.id} (${e.type})`}function co(e){let t=e.status===`succeeded`?`+`:e.status===`failed`?`x`:`~`;process.stdout.write(`\nPipeline ${e.status} [${t}]\n\n`);for(let t of e.steps){let e=` [${t.status===`succeeded`?`+`:t.status===`failed`?`x`:t.status===`skipped`?`-`:`~`}] ${t.id} (${t.type}) — ${t.status}`;t.skipReason&&(e+=` (${t.skipReason})`),t.error&&(e+=`: ${t.error.message}`),process.stdout.write(e+`
331
331
  `)}process.stdout.write(`
332
- `)}var Sa=w({description:`Validate a pipeline definition without executing`,auth:`none`,usageArgs:`--file <path>`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Pipeline definition file (YAML/JSON)`,required:!0}},exampleArgs:[`--file workflow.yaml`,`--file workflow.json --output json`],async run(e){let{settings:t,flags:n}=e,r=n.file;kt();let i=await ga(en(r)),a=Ct(i),o=a.length===0?St(i):[];if(t.output===`json`)I({valid:a.length===0,issues:a,...o.length>0?{hints:o}:{}},`json`),a.length>0&&(process.exitCode=1);else if(a.length===0){process.stdout.write(`Pipeline definition is valid.
332
+ `)}var lo=T({description:`Validate a pipeline definition without executing`,auth:`none`,usageArgs:`--file <path>`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Pipeline definition file (YAML/JSON)`,required:!0}},exampleArgs:[`--file workflow.yaml`,`--file workflow.json --output json`],async run(e){let{settings:t,flags:n}=e,r=n.file;Nt();let i=await ro(un(r)),a=Dt(i),o=a.length===0?Et(i):[];if(t.output===`json`)I({valid:a.length===0,issues:a,...o.length>0?{hints:o}:{}},`json`),a.length>0&&(process.exitCode=1);else if(a.length===0){process.stdout.write(`Pipeline definition is valid.
333
333
  `);for(let e of o)process.stderr.write(` hint: ${e}\n`)}else{process.stderr.write(`Pipeline validation failed:
334
- `);for(let e of a)process.stderr.write(` - ${e}\n`);process.exitCode=1}}});function Ca(e){return e>=1e6?`${(e/1e6).toFixed(e%1e6==0?0:1)}M`:e>=1e3?`${(e/1e3).toFixed(e%1e3==0?0:1)}K`:String(e)}const wa={Text:`Text`,Image:`Image`,Video:`Video`,Audio:`Audio`},Ta={TG:`Text Gen`,VU:`Vision`,IG:`Image Gen`,VG:`Video Gen`,TTS:`Text-to-Speech`,ASR:`Speech-to-Text`,Reasoning:`Reasoning`},Ea={low:`Cost-Effective`,medium:`Balanced`,high:`High Investment`},Da={flagship:`Flagship`,balanced:`Balanced`,"cost-optimized":`Value`},Oa={scoped:`Scoped`,comparison:`Comparison`,alternative:`Alternative`};function ka(e){return Nt(e)?nn:new rn({level:0})}function Aa(e){let t=ka(process.stdout),n=Nt(process.stdout),r=[];r.push(t.cyan.bold(`Intent Analysis`)),e.taskSummary&&(r.push(``),r.push(e.taskSummary)),e.scenarioHints.length&&(r.push(``),r.push(`${t.dim(`Scenario`)} ${e.scenarioHints.join(` · `)}`));let i=e.inputModality.map(e=>wa[e]??e),a=e.outputModality.map(e=>wa[e]??e);if(i.length||a.length){r.push(``);let e=[];i.length&&e.push(`${t.dim(`Input`)} ${i.join(`, `)}`),a.length&&e.push(`${t.dim(`Output`)} ${a.join(`, `)}`),r.push(e.join(` `))}let o=e.requiredCapabilities.map(e=>Ta[e]??e);o.length&&r.push(`${t.dim(`Capabilities`)} ${o.join(`, `)}`);let s=Ea[e.budget]??e.budget,c=Da[e.qualityPreference]??e.qualityPreference;r.push(``),r.push(`${t.dim(`Budget`)} ${s} ${t.dim(`Quality`)} ${c}`);let l=e.modelPreference;if(l&&l.mode!==`unconstrained`){r.push(``);let e=Oa[l.mode]??l.mode,n=[t.dim(`Mode`)+` ${t.yellow(e)}`];l.targets?.length&&n.push(t.dim(`Targets`)+` ${l.targets.join(`, `)}`),l.excludes?.length&&n.push(t.dim(`Excludes`)+` ${l.excludes.join(`, `)}`),r.push(n.join(` `))}if(e.segments?.length){r.push(``),r.push(t.dim(`Pipeline`));for(let[n,i]of e.segments.entries()){let e=i.outputModality.map(e=>wa[e]??e).join(`, `);r.push(` ${t.dim(`${n+1}.`)} ${i.step}${e?t.dim(` → ${e}`):``}`)}}return tn(r.join(`
335
- `),{padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0,left:1,right:0},borderColor:n?`cyan`:void 0,borderStyle:`round`,dimBorder:n})}const ja=[`Best Pick`,`Runner-Up`,`Alternative`];function Ma(e,t,n,r){let i=[n.green.bold,n.blue.bold,n.magenta.bold][t]??n.white.bold,a=ja[t]??`#${t+1}`,o=[];o.push(i(`⬢ #${t+1} — ${a}`)),o.push(``),o.push(`${n.bold(e.name)} ${n.dim(`(${e.model})`)}`),o.push(``),o.push(`${n.cyan(`Why`)} ${e.reason}`),e.highlights.length&&(o.push(``),o.push(e.highlights.map(e=>n.bgGray.white(` ${e} `)).join(` `)));let s=[];e.contextWindow&&s.push(`Context ${Ca(e.contextWindow)}`),e.maxOutputTokens&&s.push(`Max Output ${Ca(e.maxOutputTokens)}`),s.length&&(o.push(``),o.push(n.dim(s.join(` · `))));let c=v(e.docUrl);return c&&(o.push(``),o.push(n.dim(`Docs ${c}`))),tn(o.join(`
336
- `),{padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0,left:1,right:0},borderColor:r?`gray`:void 0,borderStyle:`round`,dimBorder:r})}function Na(e){let t=ka(process.stdout),n=Nt(process.stdout);return e.map((e,r)=>Ma(e,r,t,n)).join(`
337
- `)}function Pa(e,t){let n=ka(process.stdout),r=Nt(process.stdout),i=[];i.push(` ${n.yellow.bold(`⚡ Pipeline`)} ${e}`);for(let[e,{step:a,recommendations:o,warnings:s}]of t.entries()){if(i.push(``),i.push(n.bold(` ━━━ Step ${e+1}: ${a} ━━━`)),s?.length)for(let e of s)i.push(` ${n.yellow(`⚠`)} ${n.yellow(e)}`);i.push(``),i.push(o.map((e,t)=>Ma(e,t,n,r)).join(`
334
+ `);for(let e of a)process.stderr.write(` - ${e}\n`);process.exitCode=1}}});function uo(e){return e>=1e6?`${(e/1e6).toFixed(e%1e6==0?0:1)}M`:e>=1e3?`${(e/1e3).toFixed(e%1e3==0?0:1)}K`:String(e)}const fo={Text:`Text`,Image:`Image`,Video:`Video`,Audio:`Audio`},po={TG:`Text Gen`,VU:`Vision`,IG:`Image Gen`,VG:`Video Gen`,TTS:`Text-to-Speech`,ASR:`Speech-to-Text`,Reasoning:`Reasoning`},mo={low:`Cost-Effective`,medium:`Balanced`,high:`High Investment`},ho={flagship:`Flagship`,balanced:`Balanced`,"cost-optimized":`Value`},go={scoped:`Scoped`,comparison:`Comparison`,alternative:`Alternative`};function _o(e){return Rt(e)?fn:new pn({level:0})}function vo(e){let t=_o(process.stdout),n=Rt(process.stdout),r=[];r.push(t.cyan.bold(`Intent Analysis`)),e.taskSummary&&(r.push(``),r.push(e.taskSummary)),e.scenarioHints.length&&(r.push(``),r.push(`${t.dim(`Scenario`)} ${e.scenarioHints.join(` · `)}`));let i=e.inputModality.map(e=>fo[e]??e),a=e.outputModality.map(e=>fo[e]??e);if(i.length||a.length){r.push(``);let e=[];i.length&&e.push(`${t.dim(`Input`)} ${i.join(`, `)}`),a.length&&e.push(`${t.dim(`Output`)} ${a.join(`, `)}`),r.push(e.join(` `))}let o=e.requiredCapabilities.map(e=>po[e]??e);o.length&&r.push(`${t.dim(`Capabilities`)} ${o.join(`, `)}`);let s=mo[e.budget]??e.budget,c=ho[e.qualityPreference]??e.qualityPreference;r.push(``),r.push(`${t.dim(`Budget`)} ${s} ${t.dim(`Quality`)} ${c}`);let l=e.modelPreference;if(l&&l.mode!==`unconstrained`){r.push(``);let e=go[l.mode]??l.mode,n=[t.dim(`Mode`)+` ${t.yellow(e)}`];l.targets?.length&&n.push(t.dim(`Targets`)+` ${l.targets.join(`, `)}`),l.excludes?.length&&n.push(t.dim(`Excludes`)+` ${l.excludes.join(`, `)}`),r.push(n.join(` `))}if(e.segments?.length){r.push(``),r.push(t.dim(`Pipeline`));for(let[n,i]of e.segments.entries()){let e=i.outputModality.map(e=>fo[e]??e).join(`, `);r.push(` ${t.dim(`${n+1}.`)} ${i.step}${e?t.dim(` → ${e}`):``}`)}}return dn(r.join(`
335
+ `),{padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0,left:1,right:0},borderColor:n?`cyan`:void 0,borderStyle:`round`,dimBorder:n})}const yo=[`Best Pick`,`Runner-Up`,`Alternative`];function bo(e,t,n,r){let i=[n.green.bold,n.blue.bold,n.magenta.bold][t]??n.white.bold,a=yo[t]??`#${t+1}`,o=[];o.push(i(`⬢ #${t+1} — ${a}`)),o.push(``),o.push(`${n.bold(e.name)} ${n.dim(`(${e.model})`)}`),o.push(``),o.push(`${n.cyan(`Why`)} ${e.reason}`),e.highlights.length&&(o.push(``),o.push(e.highlights.map(e=>n.bgGray.white(` ${e} `)).join(` `)));let s=[];e.contextWindow&&s.push(`Context ${uo(e.contextWindow)}`),e.maxOutputTokens&&s.push(`Max Output ${uo(e.maxOutputTokens)}`),s.length&&(o.push(``),o.push(n.dim(s.join(` · `))));let c=v(e.docUrl);return c&&(o.push(``),o.push(n.dim(`Docs ${c}`))),dn(o.join(`
336
+ `),{padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0,left:1,right:0},borderColor:r?`gray`:void 0,borderStyle:`round`,dimBorder:r})}function xo(e){let t=_o(process.stdout),n=Rt(process.stdout);return e.map((e,r)=>bo(e,r,t,n)).join(`
337
+ `)}function So(e,t){let n=_o(process.stdout),r=Rt(process.stdout),i=[];i.push(` ${n.yellow.bold(`⚡ Pipeline`)} ${e}`);for(let[e,{step:a,recommendations:o,warnings:s}]of t.entries()){if(i.push(``),i.push(n.bold(` ━━━ Step ${e+1}: ${a} ━━━`)),s?.length)for(let e of s)i.push(` ${n.yellow(`⚠`)} ${n.yellow(e)}`);i.push(``),i.push(o.map((e,t)=>bo(e,t,n,r)).join(`
338
338
  `))}return i.join(`
339
- `)}function Fa(e){return e.type===`pipeline`?Pa(e.summary,e.steps):Na(e.recommendations)}function Ia(e){return e.type===`pipeline`?e.steps.length===0:e.recommendations.length===0}var La=w({description:`Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking)`,auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:{message:{type:`string`,valueHint:`<text>`,description:`Describe your requirements`,required:!0}},exampleArgs:[`--message "I need a visual-understanding chatbot"`,`--message "Build an Agent that auto-generates animations"`,`--message "Legal contract review, high precision required"`,`--message "Low-cost high-concurrency online customer service" --output text`,`--message "Long document summarization" --dry-run`],async run(e){let{settings:t,flags:n}=e,r=n.message,i=t.outputExplicit?T(t.output):`json`,a=wt(`Agent: Loading model data & analyzing intent...`);a.start();let o={onPrepareStart:()=>{}},s=!1,c=!1,l=xe(t,o).then(e=>(s=!0,c||a.update(`Agent: Model data loaded, analyzing intent...`),e)),d=m(e.client,r).then(e=>(c=!0,s||a.update(`Agent: Intent analyzed, loading model data...`),e)),[f,p]=await Promise.all([l,d]);a.stop(),p.confidence===0&&process.stderr.write(`Intent analysis timed out, using defaults...
340
- `),a.update(`Agent: Recalling candidates...`),a.start();let h=await Qe(e.client,f,r,u,p);if(a.stop(),t.dryRun){I({userInput:r,intent:{taskSummary:p.taskSummary,scenarioHints:p.scenarioHints,complexity:p.complexity,inputModality:p.inputModality,outputModality:p.outputModality,requiredCapabilities:p.requiredCapabilities,budget:p.budget,qualityPreference:p.qualityPreference,modelPreference:p.modelPreference?.mode===`unconstrained`?void 0:p.modelPreference,segments:p.segments,semanticQuery:p.semanticQuery},candidateCount:h.length,candidates:h.map(({model:e,score:t,hardScore:n,softScore:r})=>({model:e.model,score:t,hardScore:n,softScore:r})),top:3},i);return}a.update(`Agent: Ranking models...`),a.start();let g=await Ye(e.client,h,p,r,3);if(a.stop(),Ia(g)){F(`No suitable models found for this request.`);return}if(i!==`text`){I({intent:{taskSummary:p.taskSummary,scenarioHints:p.scenarioHints,complexity:p.complexity,inputModality:p.inputModality,outputModality:p.outputModality,requiredCapabilities:p.requiredCapabilities,budget:p.budget,qualityPreference:p.qualityPreference,modelPreference:p.modelPreference?.mode===`unconstrained`?void 0:p.modelPreference,segments:p.segments,semanticQuery:p.semanticQuery},result:g,candidates:h.length},i);return}F(Aa(p)),F(``),F(Fa(g))}});const Ra=/-\d{4}-\d{2}-\d{2}$/,za={model:{type:`string`,valueHint:`<model>`,description:`Show full details of a specific model family (switches to detail mode)`},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 10)`},provider:{type:`array`,valueHint:`<p>`,description:`Filter by provider (repeatable, e.g. --provider alibaba --provider deepseek)`},capability:{type:`array`,valueHint:`<c>`,description:`Filter by capability code (TG, Reasoning, VU, IG, VG, TTS, ASR, …)`},feature:{type:`array`,valueHint:`<f>`,description:`Filter by feature (function-calling, web-search, structured-outputs, …)`},contextWindow:{type:`array`,valueHint:`<w>`,description:`Filter by context window range bucket`},enrich:{type:`switch`,description:`Also fetch input parameter schema (predictConfig) for trunk models (detail mode only)`}};function Ba(e){return(e.model??``).replace(/^group-/,``)||e.name||`unknown`}function Va(e){if(!e?.length)return`-`;let t=e.find(e=>typeof e.type==`string`&&e.type.includes(`input`))??e[0];return`${t.type??``}:${String(t.price??`?`)}/${t.priceUnit??``}`}function Ha(e){let t=new Set,n=new Set,r=0,i=0,a,o=[];for(let s of e.items??[]){s.provider&&t.add(s.provider);for(let e of s.capabilities??[])n.add(e);r++,typeof s.contextWindow==`number`&&s.contextWindow>i&&(i=s.contextWindow),s.prices?.length&&(o.push(...s.prices),a||=s.prices.find(e=>typeof e.type==`string`&&e.type.includes(`input`))??s.prices[0])}return{providers:[...t].join(`,`),capabilities:[...n].join(`,`),modelCount:r,maxContext:i>0?i:void 0,price:a?Va([a]):void 0,prices:o}}function Ua(e){if(e.length===0)return[];let t=e.filter(e=>!Ra.test(e.model??``));return t.length>0?t:[...e].sort((e,t)=>String(t.model).localeCompare(String(e.model))).slice(0,1)}function Wa(e,t){if(e.length===0){F(`No model families found.`);return}let n=[`NAME`,`PROVIDER`,`CAPABILITIES`,`MODELS`,`MAX_CONTEXT`,`PRICE`],r=e.map(e=>{let t=Ha(e);return[e.name||Ba(e),t.providers||`-`,t.capabilities||`-`,String(t.modelCount),t.maxContext?String(t.maxContext):`-`,t.price??`-`]});for(let e of L(n,r))F(e);F(`\nTotal: ${t}`)}function Ga(e,t){return{items:e.map(e=>{let t=Ha(e),n=e.items?.[0];return{model:Ba(e),name:e.name,description:e.description,provider:t.providers,capabilities:[...new Set((e.items??[]).flatMap(e=>e.capabilities??[]))],modelCount:t.modelCount,maxContextWindow:t.maxContext,prices:t.prices.length>0?t.prices:void 0,qpmInfo:n?.qpmInfo}}),total:t}}function Ka(e,t){let n=e.items??[],r=Ua(n),i=n.length-r.length;F(e.name??e.model),e.description&&F(` ${e.description}`),e.updateAt&&F(` Updated: ${e.updateAt}`),F(``);let a=[`MODEL`,`PROVIDER`,`CAPABILITIES`,`CONTEXT`,`OUTPUT`,`CATEGORY`,`PRICE`],o=n.map(e=>[e.model??`-`,e.provider??`-`,(e.capabilities??[]).join(`,`)||`-`,e.contextWindow?String(e.contextWindow):`-`,e.maxOutputTokens?String(e.maxOutputTokens):`-`,e.category??`-`,Va(e.prices)]);for(let e of L(a,o))F(e);F(`\nTotal: ${n.length} models (${r.length} trunk, ${i} snapshots)`);for(let e of r){if(!e.prices?.length)continue;F(`\n── Pricing: ${e.model} ──`);let t=[`TYPE`,`PRICE`,`UNIT`],n=e.prices.map(e=>[e.type??`-`,String(e.price??`-`),e.priceUnit??`-`]);for(let e of L(t,n))F(e)}for(let e of r){if(!e.qpmInfo||Object.keys(e.qpmInfo).length===0)continue;F(`\n── Rate Limits: ${e.model} ──`);let t=[`TIER`,`RPM`,`TPM`,`TPM_FIELD`],n=Object.entries(e.qpmInfo).map(([e,t])=>{let n=t.count_limit_period||60,r=n?Math.floor((t.count_limit||0)*60/n):0,i=t.usage_limit_period||60,a=i?Math.floor((t.usage_limit||0)*60/i):0;return[e,r>0?String(r):`-`,a>0?String(a):`-`,t.usage_limit_field??`-`]});for(let e of L(t,n))F(e)}if(t)for(let e of r)!e.predictConfig||e.predictConfig.length===0||(F(`\n── predictConfig: ${e.model} ──`),Ja(e.predictConfig))}function qa(e,t){let n=e.items??[];return{model:e.model,name:e.name,description:e.description,updateAt:e.updateAt,items:n.map(e=>{let n={model:e.model,name:e.name,provider:e.provider,capabilities:e.capabilities,features:e.features,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutputTokens,maxInputTokens:e.maxInputTokens,category:e.category,openSource:e.openSource,docUrl:e.docUrl,versionTag:e.versionTag};return e.prices&&(n.prices=e.prices),e.qpmInfo&&(n.qpmInfo=e.qpmInfo),t&&e.predictConfig&&(n.predictConfig=e.predictConfig),n})}}function Ja(e){let t=[`PARAM`,`KEY`,`DEFAULT`,`RANGE`],n=e.map(e=>[e.name??`-`,e.key??`-`,e.default===void 0?`-`:JSON.stringify(e.default),e.range===void 0?`-`:JSON.stringify(e.range)]);for(let e of L(t,n))F(e)}var Ya=w({description:`Browse model families or show detailed model info in the Bailian model marketplace`,auth:`console`,usageArgs:`[--model <model>] [--page <n>] [--page-size <n>] [--provider <p>] [--capability <c>] [--feature <f>] [--enrich]`,flags:za,exampleArgs:[``,`--provider alibaba`,`--capability TG --capability Reasoning`,`--model qwen-max`,`--model qwen-max --enrich --output json`,`--feature function-calling --output json`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i=n.model;if(i){let a=!!n.enrich;if(t.dryRun){I({action:`model.detail`,model:i,enrich:a},r);return}let o=await ue(e.client.console.bind(e.client),i);if(!o){F(`Model "${i}" not found.`);return}if(a){let t=Ua(o.items??[]);await Promise.all(t.map(async t=>{if(!t.model)return;let n=await fe(e.client.console.bind(e.client),t.model);n&&(t.predictConfig=n)}))}if(r===`json`){I(qa(o,a),r);return}Ka(o,a);return}let a={pageNo:n.page,pageSize:n.pageSize??10,providers:n.provider?.length?n.provider:void 0,capabilities:n.capability?.length?n.capability:void 0,features:n.feature?.length?n.feature:void 0,contextWindows:n.contextWindow?.length?n.contextWindow:void 0};if(t.dryRun){I({action:`model.list`,...a},r);return}let{total:o,groups:s}=await de(e.client.console.bind(e.client),a);if(r===`json`){I(Ga(s,o),r);return}Wa(s,o)}});const Xa=`zeldaEasy.bailian-dash-workspace.space.listWorkspaces`;function Za(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Qa(e){let t=Za(e,`data`);if(!t)return e;let n=Za(t,`DataV2`);if(n){let e=Za(n,`data`);return(e?Za(e,`data`):void 0)??e??n}return Za(t,`data`)??t}function $a(e){let t=M(process.stdout),n=[`Name`,`Workspace ID`,`Default`],r=e.map(e=>[e.agentName,e.workspaceId,e.defaultAgent?`Yes`:`-`]),i=n.map((e,t)=>Math.max(N(e),...r.map(e=>N(e[t])))),a=n.map((e,n)=>t.bold(z(e,i[n]))).join(` `),o=i.map(e=>t.dim(`─`.repeat(e))).join(`──`);process.stdout.write(a+`
339
+ `)}function Co(e){return e.type===`pipeline`?So(e.summary,e.steps):xo(e.recommendations)}function wo(e){return e.type===`pipeline`?e.steps.length===0:e.recommendations.length===0}var To=T({description:`Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking)`,auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:{message:{type:`string`,valueHint:`<text>`,description:`Describe your requirements`,required:!0}},exampleArgs:[`--message "I need a visual-understanding chatbot"`,`--message "Build an Agent that auto-generates animations"`,`--message "Legal contract review, high precision required"`,`--message "Low-cost high-concurrency online customer service" --output text`,`--message "Long document summarization" --dry-run`],async run(e){let{settings:t,flags:n}=e,r=n.message,i=t.outputExplicit?E(t.output):`json`,a=Ot(`Agent: Loading model data & analyzing intent...`);a.start();let o={onPrepareStart:()=>{}},s=!1,c=!1,l=Ce(t,o).then(e=>(s=!0,c||a.update(`Agent: Model data loaded, analyzing intent...`),e)),d=m(e.client,r).then(e=>(c=!0,s||a.update(`Agent: Intent analyzed, loading model data...`),e)),[f,p]=await Promise.all([l,d]);a.stop(),p.confidence===0&&process.stderr.write(`Intent analysis timed out, using defaults...
340
+ `),a.update(`Agent: Recalling candidates...`),a.start();let h=await nt(e.client,f,r,u,p);if(a.stop(),t.dryRun){I({userInput:r,intent:{taskSummary:p.taskSummary,scenarioHints:p.scenarioHints,complexity:p.complexity,inputModality:p.inputModality,outputModality:p.outputModality,requiredCapabilities:p.requiredCapabilities,budget:p.budget,qualityPreference:p.qualityPreference,modelPreference:p.modelPreference?.mode===`unconstrained`?void 0:p.modelPreference,segments:p.segments,semanticQuery:p.semanticQuery},candidateCount:h.length,candidates:h.map(({model:e,score:t,hardScore:n,softScore:r})=>({model:e.model,score:t,hardScore:n,softScore:r})),top:3},i);return}a.update(`Agent: Ranking models...`),a.start();let g=await $e(e.client,h,p,r,3);if(a.stop(),wo(g)){F(`No suitable models found for this request.`);return}if(i!==`text`){I({intent:{taskSummary:p.taskSummary,scenarioHints:p.scenarioHints,complexity:p.complexity,inputModality:p.inputModality,outputModality:p.outputModality,requiredCapabilities:p.requiredCapabilities,budget:p.budget,qualityPreference:p.qualityPreference,modelPreference:p.modelPreference?.mode===`unconstrained`?void 0:p.modelPreference,segments:p.segments,semanticQuery:p.semanticQuery},result:g,candidates:h.length},i);return}F(vo(p)),F(``),F(Co(g))}});const Eo=/-\d{4}-\d{2}-\d{2}$/,Do={model:{type:`string`,valueHint:`<model>`,description:`Show full details of a specific model family (switches to detail mode)`},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 10)`},provider:{type:`array`,valueHint:`<p>`,description:`Filter by provider (repeatable, e.g. --provider alibaba --provider deepseek)`},capability:{type:`array`,valueHint:`<c>`,description:`Filter by capability code (TG, Reasoning, VU, IG, VG, TTS, ASR, …)`},feature:{type:`array`,valueHint:`<f>`,description:`Filter by feature (function-calling, web-search, structured-outputs, …)`},contextWindow:{type:`array`,valueHint:`<w>`,description:`Filter by context window range bucket`},enrich:{type:`switch`,description:`Also fetch input parameter schema (predictConfig) for trunk models (detail mode only)`}};function Oo(e){return(e.model??``).replace(/^group-/,``)||e.name||`unknown`}function ko(e){if(!e?.length)return`-`;let t=e.find(e=>typeof e.type==`string`&&e.type.includes(`input`))??e[0];return`${t.type??``}:${String(t.price??`?`)}/${t.priceUnit??``}`}function Ao(e){let t=new Set,n=new Set,r=0,i=0,a,o=[];for(let s of e.items??[]){s.provider&&t.add(s.provider);for(let e of s.capabilities??[])n.add(e);r++,typeof s.contextWindow==`number`&&s.contextWindow>i&&(i=s.contextWindow),s.prices?.length&&(o.push(...s.prices),a||=s.prices.find(e=>typeof e.type==`string`&&e.type.includes(`input`))??s.prices[0])}return{providers:[...t].join(`,`),capabilities:[...n].join(`,`),modelCount:r,maxContext:i>0?i:void 0,price:a?ko([a]):void 0,prices:o}}function jo(e){if(e.length===0)return[];let t=e.filter(e=>!Eo.test(e.model??``));return t.length>0?t:[...e].sort((e,t)=>String(t.model).localeCompare(String(e.model))).slice(0,1)}function Mo(e,t){if(e.length===0){F(`No model families found.`);return}let n=[`NAME`,`PROVIDER`,`CAPABILITIES`,`MODELS`,`MAX_CONTEXT`,`PRICE`],r=e.map(e=>{let t=Ao(e);return[e.name||Oo(e),t.providers||`-`,t.capabilities||`-`,String(t.modelCount),t.maxContext?String(t.maxContext):`-`,t.price??`-`]});for(let e of L(n,r))F(e);F(`\nTotal: ${t}`)}function No(e,t){return{items:e.map(e=>{let t=Ao(e),n=e.items?.[0];return{model:Oo(e),name:e.name,description:e.description,provider:t.providers,capabilities:[...new Set((e.items??[]).flatMap(e=>e.capabilities??[]))],modelCount:t.modelCount,maxContextWindow:t.maxContext,prices:t.prices.length>0?t.prices:void 0,qpmInfo:n?.qpmInfo}}),total:t}}function Po(e,t){let n=e.items??[],r=jo(n),i=n.length-r.length;F(e.name??e.model),e.description&&F(` ${e.description}`),e.updateAt&&F(` Updated: ${e.updateAt}`),F(``);let a=[`MODEL`,`PROVIDER`,`CAPABILITIES`,`CONTEXT`,`OUTPUT`,`CATEGORY`,`PRICE`],o=n.map(e=>[e.model??`-`,e.provider??`-`,(e.capabilities??[]).join(`,`)||`-`,e.contextWindow?String(e.contextWindow):`-`,e.maxOutputTokens?String(e.maxOutputTokens):`-`,e.category??`-`,ko(e.prices)]);for(let e of L(a,o))F(e);F(`\nTotal: ${n.length} models (${r.length} trunk, ${i} snapshots)`);for(let e of r){if(!e.prices?.length)continue;F(`\n── Pricing: ${e.model} ──`);let t=[`TYPE`,`PRICE`,`UNIT`],n=e.prices.map(e=>[e.type??`-`,String(e.price??`-`),e.priceUnit??`-`]);for(let e of L(t,n))F(e)}for(let e of r){if(!e.qpmInfo||Object.keys(e.qpmInfo).length===0)continue;F(`\n── Rate Limits: ${e.model} ──`);let t=[`TIER`,`RPM`,`TPM`,`TPM_FIELD`],n=Object.entries(e.qpmInfo).map(([e,t])=>{let n=t.count_limit_period||60,r=n?Math.floor((t.count_limit||0)*60/n):0,i=t.usage_limit_period||60,a=i?Math.floor((t.usage_limit||0)*60/i):0;return[e,r>0?String(r):`-`,a>0?String(a):`-`,t.usage_limit_field??`-`]});for(let e of L(t,n))F(e)}if(t)for(let e of r)!e.predictConfig||e.predictConfig.length===0||(F(`\n── predictConfig: ${e.model} ──`),Io(e.predictConfig))}function Fo(e,t){let n=e.items??[];return{model:e.model,name:e.name,description:e.description,updateAt:e.updateAt,items:n.map(e=>{let n={model:e.model,name:e.name,provider:e.provider,capabilities:e.capabilities,features:e.features,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutputTokens,maxInputTokens:e.maxInputTokens,category:e.category,openSource:e.openSource,docUrl:e.docUrl,versionTag:e.versionTag};return e.prices&&(n.prices=e.prices),e.qpmInfo&&(n.qpmInfo=e.qpmInfo),t&&e.predictConfig&&(n.predictConfig=e.predictConfig),n})}}function Io(e){let t=[`PARAM`,`KEY`,`DEFAULT`,`RANGE`],n=e.map(e=>[e.name??`-`,e.key??`-`,e.default===void 0?`-`:JSON.stringify(e.default),e.range===void 0?`-`:JSON.stringify(e.range)]);for(let e of L(t,n))F(e)}var Lo=T({description:`Browse model families or show detailed model info in the Bailian model marketplace`,auth:`console`,usageArgs:`[--model <model>] [--page <n>] [--page-size <n>] [--provider <p>] [--capability <c>] [--feature <f>] [--enrich]`,flags:Do,exampleArgs:[``,`--provider alibaba`,`--capability TG --capability Reasoning`,`--model qwen-max`,`--model qwen-max --enrich --output json`,`--feature function-calling --output json`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?E(t.output):`json`,i=n.model;if(i){let a=!!n.enrich;if(t.dryRun){I({action:`model.detail`,model:i,enrich:a},r);return}let o=await ue(e.client.console.bind(e.client),i);if(!o){F(`Model "${i}" not found.`);return}if(a){let t=jo(o.items??[]);await Promise.all(t.map(async t=>{if(!t.model)return;let n=await pe(e.client.console.bind(e.client),t.model);n&&(t.predictConfig=n)}))}if(r===`json`){I(Fo(o,a),r);return}Po(o,a);return}let a={pageNo:n.page,pageSize:n.pageSize??10,providers:n.provider?.length?n.provider:void 0,capabilities:n.capability?.length?n.capability:void 0,features:n.feature?.length?n.feature:void 0,contextWindows:n.contextWindow?.length?n.contextWindow:void 0};if(t.dryRun){I({action:`model.list`,...a},r);return}let{total:o,groups:s}=await de(e.client.console.bind(e.client),a);if(r===`json`){I(No(s,o),r);return}Mo(s,o)}});const Ro=`zeldaEasy.bailian-dash-workspace.space.listWorkspaces`;function zo(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Bo(e){let t=zo(e,`data`);if(!t)return e;let n=zo(t,`DataV2`);if(n){let e=zo(n,`data`);return(e?zo(e,`data`):void 0)??e??n}return zo(t,`data`)??t}function Vo(e){let t=M(process.stdout),n=[`Name`,`Workspace ID`,`Default`],r=e.map(e=>[e.agentName,e.workspaceId,e.defaultAgent?`Yes`:`-`]),i=n.map((e,t)=>Math.max(N(e),...r.map(e=>N(e[t])))),a=n.map((e,n)=>t.bold(z(e,i[n]))).join(` `),o=i.map(e=>t.dim(`─`.repeat(e))).join(`──`);process.stdout.write(a+`
341
341
  `),process.stdout.write(o+`
342
342
  `);for(let e of r){let n=e.map((e,n)=>n===2&&e===`Yes`?t.green(z(e,i[n])):z(e,i[n]));process.stdout.write(n.join(` `)+`
343
343
  `)}process.stdout.write(t.dim(`\nTotal: ${e.length}`)+`
344
- `)}var eo=w({description:`List all workspaces`,auth:`console`,usageArgs:`[flags]`,flags:{list:{type:`string`,valueHint:`<n>`,description:`Limit number of results`}},exampleArgs:[``,`--list 5`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=Number(n.list)||0,i=T(t.output);if(t.dryRun){I({api:Xa,data:{}},i);return}let a=Qa(await e.client.console(Xa,{})).data;if(!Array.isArray(a)||a.length===0){i===`json`?I([],i):process.stdout.write(`No workspace found.
345
- `);return}let o=a;if(r>0&&(o=o.slice(0,r)),i===`json`){I(o.map(e=>({workspaceId:e.workspaceId,name:e.agentName,default:e.defaultAgent})),i);return}$a(o)}});const to=`zeldaEasy.bailian-telemetry.monitor.getMonitorData`;function no(e,t){if(!e)return 0;let n=e.count_limit_period||t;return n?Math.floor(e.count_limit*60/n):0}function ro(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}function io(e){return e.toLocaleString(`en-US`)}async function ao(e,n,r){let i=Date.now(),o=i-r*60*1e3;try{let t=lt(await e.console(to,{reqDTO:{monitorType:`Advanced`,metricFilters:[{aggMethod:`sum_pm`,metricName:`model_total_amount`},{aggMethod:`sum_pm`,metricName:`model_call_count`}],labelFilters:{resourceId:n,resourceType:`model`},startTime:o,endTime:i}})),r=t.data??t;if(!Array.isArray(r))return{rpm:0,tpm:0};let a=0,s=0;for(let e of r){if(e.aggMethod!==`sum_pm`||!e.points?.length)continue;let t=e.points[e.points.length-1].value??0;e.metricName===`model_call_count`&&(a=Math.round(t)),e.metricName===`model_total_amount`&&(s=Math.round(t))}return{rpm:a,tpm:s}}catch(e){if(e instanceof t&&e.exitCode===a.AUTH)throw e;return{rpm:-1,tpm:-1}}}async function oo(e){let t=[],n=1;for(;;){let r={pageNo:n,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}},i=lt(await e.console(c,{input:r})),a=i.list??[],o=i.total??0;if(t.push(...a),t.length>=o||a.length===0)break;n++}return t}function so(e){let t=[`Model`,`Req/min`,`Token/min`,`RPM Left`,`TPM Left`],n=e.map(e=>e.rpmQuotaLeft),r=e.map(e=>e.rpmQuotaLabel),i=e.map(e=>e.tpmQuotaLeft),a=e.map(e=>e.tpmQuotaLabel),o=At({headers:t,rows:e.map(e=>[e.model,e.rpm,e.tpm,``,``]),align:[`left`,`right`,`right`,`left`,`left`],barColumns:[{index:3,percents:n,labels:r,width:15},{index:4,percents:i,labels:a,width:15}]});for(let e of o)process.stdout.write(e+`
346
- `)}var co=w({description:`View model RPM/TPM rate limits`,auth:`console`,usageArgs:`[--model <model>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name(s), comma-separated`}},exampleArgs:[``,`--model qwen3.6-plus`,`--model qwen3.6-plus,qwen-turbo`,`--output json`],async run(e){let{settings:n,flags:r}=e,i=r.model||void 0,a=T(n.output);if(n.dryRun){I({apis:[c,{api:to,note:`called per-model for text output with gauges`}],modelListInput:{input:{pageNo:1,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}}},a);return}let o=await oo(e.client);if(i){let e=new Set(i.split(`,`).map(e=>e.trim()).filter(Boolean));if(o=o.filter(t=>e.has(t.model)),o.length===0)throw new t(`no matching models found for "${i}".`)}if(a===`json`){I(o.map(e=>{let t=e.qpmInfo,n=t?.[`model-default`],r=t?.[`user-spec`],i=no(n),a=ro(n),o=no(r,n?.count_limit_period)||i,s=ro(r,n?.usage_limit_period)||a;return{model:e.model,rpm:o>0?o:null,tpm:s>0?s:null}}),a);return}let s=await Promise.all(o.map(t=>ao(e.client,t.model,2))),l=o.map((e,t)=>{let n=e.qpmInfo,r=n?.[`model-default`],i=n?.[`user-spec`],a=no(r),o=ro(r),c=no(i,r?.count_limit_period)||a,l=ro(i,r?.usage_limit_period)||o,u=s[t].rpm,d=s[t].tpm,f=null,p=null;u>=0&&c>0&&(f=Math.max(0,100-u/c*100),p=f.toFixed(1)+`%`);let m=null,h=null;return d>=0&&l>0&&(m=Math.max(0,100-d/l*100),h=m.toFixed(1)+`%`),{model:e.model,rpm:c>0?io(c):`-`,tpm:l>0?io(l):`-`,rpmQuotaLeft:f,tpmQuotaLeft:m,rpmQuotaLabel:p,tpmQuotaLabel:h}});if(l.length===0){process.stdout.write(`No models found.
347
- `);return}so(l)}});const lo=`zeldaEasy.broadscope-platform.modelInstance.updateFoundationModelLimits`;function uo(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}function fo(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function po(e){let t=fo(e,`data`);if(!t)return e;let n=fo(t,`DataV2`);if(n){let e=fo(n,`data`);return(e?fo(e,`data`):void 0)??e??n}return fo(t,`data`)??t}async function mo(e,t){return(po(await e.console(`zeldaHttp.dashscopeModel./zelda/api/v1/modelCenter/listFoundationModels`,{input:{pageNo:1,pageSize:50,name:t,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}})).list??[]).find(e=>e.model===t&&e.qpmInfo)}var ho=w({description:`Request a temporary quota increase`,auth:`console`,usageArgs:`--model <model> --tpm <value> [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name (required)`,required:!0},tpm:{type:`string`,valueHint:`<value>`,description:`Target TPM value (required)`,required:!0}},exampleArgs:[`--model qwen-turbo --tpm 100000`,`--model qwen3.6-plus --tpm 8000000`,`--model qwen-turbo --tpm 100000 --output json`],validate:e=>Number(e.tpm)>0?void 0:`--tpm must be a positive number.`,async run(e){let{identity:n,settings:r,flags:i}=e,o=i.model,s=Number(i.tpm),c=T(r.output);if(r.dryRun){I({api:lo,data:{input:{model:o,limit:{usage_limit:s}}}},c);return}let l=await mo(e.client,o);if(!l)throw new t(`model "${o}" not found or does not support self-service quota increase.`,a.GENERAL,`Run \`${n.binName} quota list\` to view available models.`);let u=l.qpmInfo[`model-default`],d=l.qpmInfo[`user-spec`],f=uo(u),m=uo(d,u?.usage_limit_period)||f,h=f*2;if(s<f||s>h)throw new p(`TPM value ${s.toLocaleString()} is out of range. Current: ${m.toLocaleString()}, Range: ${f.toLocaleString()} ~ ${h.toLocaleString()}.`);let g={input:{model:o,limit:{usage_limit:s},originalQpmInfo:l.qpmInfo}},_=async r=>{r&&(g.input.confirmedDowngrade=!0);try{return await e.client.console(lo,g)}catch(e){throw e instanceof t&&e.message.includes(`NotLogined`)?new t(`session expired.`,a.AUTH,`Run \`${n.binName} auth login --console\` to re-authenticate.`):e}},v=await _(),y=po(v);if(y.needConfirm){let e=y.confirmCode;if(e===`Refresh_Required`)throw new t(`rate limit has been updated externally. Please retry.`);e===`Downgrade`&&(v=await _(!0))}if(c===`json`){I(v,c);return}process.stdout.write(`Quota updated for "${o}": TPM ${m.toLocaleString()} → ${s.toLocaleString()}\n`)}});const go=`zeldaEasy.broadscope-platform.modelInstance.listModelLimitApplications`;function _o(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function vo(e){let t=_o(e,`data`);if(!t)return e;let n=_o(t,`DataV2`);if(n){let e=_o(n,`data`);return(e?_o(e,`data`):void 0)??e??n}return _o(t,`data`)??t}function yo(e){if(!e)return`-`;try{let t=new Date(e);return isNaN(t.getTime())?e:`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)} ${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`}catch{return e}}function bo(e){return e.toLocaleString(`en-US`)}function xo(e,t){let n=M(process.stdout),r=[`Model`,`Token Limit`,`Applied At`],i=e.map(e=>[e.deployedModel,bo(e.usageLimit),yo(e.gmtCreate)]),a=r.map((e,t)=>Math.max(N(e),...i.map(e=>N(e[t])))),o=r.map((e,t)=>n.bold(z(e,a[t]))).join(` `),s=a.map(e=>n.dim(`─`.repeat(e))).join(`──`);process.stdout.write(o+`
344
+ `)}var Ho=T({description:`List all workspaces`,auth:`console`,usageArgs:`[flags]`,flags:{list:{type:`string`,valueHint:`<n>`,description:`Limit number of results`}},exampleArgs:[``,`--list 5`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=Number(n.list)||0,i=E(t.output);if(t.dryRun){I({api:Ro,data:{}},i);return}let a=Bo(await e.client.console(Ro,{})).data;if(!Array.isArray(a)||a.length===0){i===`json`?I([],i):process.stdout.write(`No workspace found.
345
+ `);return}let o=a;if(r>0&&(o=o.slice(0,r)),i===`json`){I(o.map(e=>({workspaceId:e.workspaceId,name:e.agentName,default:e.defaultAgent})),i);return}Vo(o)}});const Uo=`zeldaEasy.bailian-telemetry.monitor.getMonitorData`;function Wo(e,t){if(!e)return 0;let n=e.count_limit_period||t;return n?Math.floor(e.count_limit*60/n):0}function Go(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}function Ko(e){return e.toLocaleString(`en-US`)}async function qo(e,n,r){let i=Date.now(),o=i-r*60*1e3;try{let t=pt(await e.console(Uo,{reqDTO:{monitorType:`Advanced`,metricFilters:[{aggMethod:`sum_pm`,metricName:`model_total_amount`},{aggMethod:`sum_pm`,metricName:`model_call_count`}],labelFilters:{resourceId:n,resourceType:`model`},startTime:o,endTime:i}})),r=t.data??t;if(!Array.isArray(r))return{rpm:0,tpm:0};let a=0,s=0;for(let e of r){if(e.aggMethod!==`sum_pm`||!e.points?.length)continue;let t=e.points[e.points.length-1].value??0;e.metricName===`model_call_count`&&(a=Math.round(t)),e.metricName===`model_total_amount`&&(s=Math.round(t))}return{rpm:a,tpm:s}}catch(e){if(e instanceof t&&e.exitCode===a.AUTH)throw e;return{rpm:-1,tpm:-1}}}async function Jo(e){let t=[],n=1;for(;;){let r={pageNo:n,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}},i=pt(await e.console(c,{input:r})),a=i.list??[],o=i.total??0;if(t.push(...a),t.length>=o||a.length===0)break;n++}return t}function Yo(e){let t=[`Model`,`Req/min`,`Token/min`,`RPM Left`,`TPM Left`],n=e.map(e=>e.rpmQuotaLeft),r=e.map(e=>e.rpmQuotaLabel),i=e.map(e=>e.tpmQuotaLeft),a=e.map(e=>e.tpmQuotaLabel),o=Ft({headers:t,rows:e.map(e=>[e.model,e.rpm,e.tpm,``,``]),align:[`left`,`right`,`right`,`left`,`left`],barColumns:[{index:3,percents:n,labels:r,width:15},{index:4,percents:i,labels:a,width:15}]});for(let e of o)process.stdout.write(e+`
346
+ `)}var Xo=T({description:`View model RPM/TPM rate limits`,auth:`console`,usageArgs:`[--model <model>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name(s), comma-separated`}},exampleArgs:[``,`--model qwen3.6-plus`,`--model qwen3.6-plus,qwen-turbo`,`--output json`],async run(e){let{settings:n,flags:r}=e,i=r.model||void 0,a=E(n.output);if(n.dryRun){I({apis:[c,{api:Uo,note:`called per-model for text output with gauges`}],modelListInput:{input:{pageNo:1,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}}},a);return}let o=await Jo(e.client);if(i){let e=new Set(i.split(`,`).map(e=>e.trim()).filter(Boolean));if(o=o.filter(t=>e.has(t.model)),o.length===0)throw new t(`no matching models found for "${i}".`)}if(a===`json`){I(o.map(e=>{let t=e.qpmInfo,n=t?.[`model-default`],r=t?.[`user-spec`],i=Wo(n),a=Go(n),o=Wo(r,n?.count_limit_period)||i,s=Go(r,n?.usage_limit_period)||a;return{model:e.model,rpm:o>0?o:null,tpm:s>0?s:null}}),a);return}let s=await Promise.all(o.map(t=>qo(e.client,t.model,2))),l=o.map((e,t)=>{let n=e.qpmInfo,r=n?.[`model-default`],i=n?.[`user-spec`],a=Wo(r),o=Go(r),c=Wo(i,r?.count_limit_period)||a,l=Go(i,r?.usage_limit_period)||o,u=s[t].rpm,d=s[t].tpm,f=null,p=null;u>=0&&c>0&&(f=Math.max(0,100-u/c*100),p=f.toFixed(1)+`%`);let m=null,h=null;return d>=0&&l>0&&(m=Math.max(0,100-d/l*100),h=m.toFixed(1)+`%`),{model:e.model,rpm:c>0?Ko(c):`-`,tpm:l>0?Ko(l):`-`,rpmQuotaLeft:f,tpmQuotaLeft:m,rpmQuotaLabel:p,tpmQuotaLabel:h}});if(l.length===0){process.stdout.write(`No models found.
347
+ `);return}Yo(l)}});const Zo=`zeldaEasy.broadscope-platform.modelInstance.updateFoundationModelLimits`;function Qo(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}function $o(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function es(e){let t=$o(e,`data`);if(!t)return e;let n=$o(t,`DataV2`);if(n){let e=$o(n,`data`);return(e?$o(e,`data`):void 0)??e??n}return $o(t,`data`)??t}async function ts(e,t){return(es(await e.console(`zeldaHttp.dashscopeModel./zelda/api/v1/modelCenter/listFoundationModels`,{input:{pageNo:1,pageSize:50,name:t,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}})).list??[]).find(e=>e.model===t&&e.qpmInfo)}var ns=T({description:`Request a temporary quota increase`,auth:`console`,usageArgs:`--model <model> --tpm <value> [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name (required)`,required:!0},tpm:{type:`string`,valueHint:`<value>`,description:`Target TPM value (required)`,required:!0}},exampleArgs:[`--model qwen-turbo --tpm 100000`,`--model qwen3.6-plus --tpm 8000000`,`--model qwen-turbo --tpm 100000 --output json`],validate:e=>Number(e.tpm)>0?void 0:`--tpm must be a positive number.`,async run(e){let{identity:n,settings:r,flags:i}=e,o=i.model,s=Number(i.tpm),c=E(r.output);if(r.dryRun){I({api:Zo,data:{input:{model:o,limit:{usage_limit:s}}}},c);return}let l=await ts(e.client,o);if(!l)throw new t(`model "${o}" not found or does not support self-service quota increase.`,a.GENERAL,`Run \`${n.binName} quota list\` to view available models.`);let u=l.qpmInfo[`model-default`],d=l.qpmInfo[`user-spec`],f=Qo(u),m=Qo(d,u?.usage_limit_period)||f,h=f*2;if(s<f||s>h)throw new p(`TPM value ${s.toLocaleString()} is out of range. Current: ${m.toLocaleString()}, Range: ${f.toLocaleString()} ~ ${h.toLocaleString()}.`);let g={input:{model:o,limit:{usage_limit:s},originalQpmInfo:l.qpmInfo}},_=async r=>{r&&(g.input.confirmedDowngrade=!0);try{return await e.client.console(Zo,g)}catch(e){throw e instanceof t&&e.message.includes(`NotLogined`)?new t(`session expired.`,a.AUTH,`Run \`${n.binName} auth login --console\` to re-authenticate.`):e}},v=await _(),y=es(v);if(y.needConfirm){let e=y.confirmCode;if(e===`Refresh_Required`)throw new t(`rate limit has been updated externally. Please retry.`);e===`Downgrade`&&(v=await _(!0))}if(c===`json`){I(v,c);return}process.stdout.write(`Quota updated for "${o}": TPM ${m.toLocaleString()} → ${s.toLocaleString()}\n`)}});const rs=`zeldaEasy.broadscope-platform.modelInstance.listModelLimitApplications`;function is(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function as(e){let t=is(e,`data`);if(!t)return e;let n=is(t,`DataV2`);if(n){let e=is(n,`data`);return(e?is(e,`data`):void 0)??e??n}return is(t,`data`)??t}function os(e){if(!e)return`-`;try{let t=new Date(e);return isNaN(t.getTime())?e:`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)} ${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`}catch{return e}}function ss(e){return e.toLocaleString(`en-US`)}function cs(e,t){let n=M(process.stdout),r=[`Model`,`Token Limit`,`Applied At`],i=e.map(e=>[e.deployedModel,ss(e.usageLimit),os(e.gmtCreate)]),a=r.map((e,t)=>Math.max(N(e),...i.map(e=>N(e[t])))),o=r.map((e,t)=>n.bold(z(e,a[t]))).join(` `),s=a.map(e=>n.dim(`─`.repeat(e))).join(`──`);process.stdout.write(o+`
348
348
  `),process.stdout.write(s+`
349
349
  `);for(let e of i)process.stdout.write(e.map((e,t)=>z(e,a[t])).join(` `)+`
350
350
  `);process.stdout.write(n.dim(`\nTotal: ${t} records`)+`
351
- `)}var So=w({description:`View quota change history`,auth:`console`,usageArgs:`[flags]`,flags:{page:{type:`string`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`string`,valueHint:`<n>`,description:`Page size (default: 10)`},model:{type:`string`,valueHint:`<model>`,description:`Filter by model name`}},exampleArgs:[``,`--page 2`,`--page-size 20`,`--model qwen-turbo`,`--output json`],async run(e){let{identity:n,settings:r,flags:i}=e,o=Number(i.page)||1,s=Number(i.pageSize)||10,c=i.model||void 0,l=T(r.output),u={input:{pageNo:o,pageSize:s}};if(r.dryRun){I({api:go,data:u},l);return}let d;try{d=await e.client.console(go,u)}catch(e){throw e instanceof t&&e.message.includes(`NotLogined`)?new t(`session expired.`,a.AUTH,`Run \`${n.binName} auth login --console\` to re-authenticate.`):e}let f=vo(d),p=f.records??[],m=f.items??p.length;if(c&&(p=p.filter(e=>e.deployedModel===c)),l===`json`){I({records:p.map(e=>({model:e.deployedModel,tokenLimit:e.usageLimit,appliedAt:yo(e.gmtCreate)})),total:c?p.length:m},l);return}if(p.length===0){process.stdout.write(`No quota change history found.
352
- `);return}xo(p,c?p.length:m)}});const Co=`zeldaEasy.bailian-telemetry.monitor.getMonitorData`;function wo(e,t){if(!e)return 0;let n=e.count_limit_period||t;return n?Math.floor(e.count_limit*60/n):0}function To(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}async function Eo(e){let t=[],n=1;for(;;){let r=lt(await e.console(c,{input:{pageNo:n,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}})),i=r.list??[],a=r.total??0;if(t.push(...i),t.length>=a||i.length===0)break;n++}return t}async function Do(e,n,r){let i=Date.now(),o=i-r*60*1e3;try{let t=lt(await e.console(Co,{reqDTO:{monitorType:`Advanced`,metricFilters:[{aggMethod:`sum_pm`,metricName:`model_total_amount`},{aggMethod:`sum_pm`,metricName:`model_call_count`}],labelFilters:{resourceId:n,resourceType:`model`},startTime:o,endTime:i}})),r=t.data??t;if(!Array.isArray(r))return{rpm:0,tpm:0};let a=0,s=0;for(let e of r){if(e.aggMethod!==`sum_pm`||!e.points?.length)continue;let t=e.points[e.points.length-1].value??0;e.metricName===`model_call_count`&&(a=Math.round(t)),e.metricName===`model_total_amount`&&(s=Math.round(t))}return{rpm:a,tpm:s}}catch(e){if(e instanceof t&&e.exitCode===a.AUTH)throw e;return{rpm:-1,tpm:-1}}}function Oo(e){let t=M(process.stdout),n=[`Model`,`RPM Used/Limit`,`TPM Used/Limit`,`Status`,`RPM Left`,`TPM Left`],r=e.map(e=>e.rpmQuotaLeft),i=e.map(e=>e.rpmQuotaLabel),a=e.map(e=>e.tpmQuotaLeft),o=e.map(e=>e.tpmQuotaLabel),s=At({headers:n,rows:e.map(e=>{let t=e.rpmUsage<0?`-`:`${e.rpmUsage}/${e.rpmLimit}`,n=e.tpmUsage<0?`-`:`${e.tpmUsage}/${e.tpmLimit}`,r=Math.max(e.rpmLimit>0?e.rpmUsage/e.rpmLimit*100:0,e.tpmLimit>0?e.tpmUsage/e.tpmLimit*100:0),i=e.rpmUsage<0?`-`:r>=100?`Rate Limited`:r>=80?`Near limit`:`Normal`;return[e.model,t,n,i,``,``]}),align:[`left`,`right`,`right`,`left`,`left`,`left`],barColumns:[{index:4,percents:r,labels:i,width:15},{index:5,percents:a,labels:o,width:15}],cellColor:(e,n,r)=>{if(n===3){if(r===`Rate Limited`)return t.red(r);if(r===`Near limit`)return t.yellow(r);if(r===`Normal`)return t.green(r)}}});for(let e of s)process.stdout.write(e+`
353
- `)}var ko=w({description:`Check current usage against rate limits`,auth:`console`,usageArgs:`[--model <model>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name(s), comma-separated`},period:{type:`string`,valueHint:`<minutes>`,description:`Query usage for the last N minutes (default: 2)`}},exampleArgs:[``,`--model qwen3.6-plus`,`--period 5`,`--model qwen3.6-plus,qwen-turbo`,`--output json`],validate:e=>(Number(e.period)||2)<1?`--period must be at least 1 minute.`:void 0,async run(e){let{settings:t,flags:n}=e,r=n.model||void 0,i=Number(n.period)||2,a=T(t.output);if(t.dryRun){I({apis:[c,Co],...se(t)},a);return}let o=await Eo(e.client);if(r){let e=new Set(r.split(`,`).map(e=>e.trim()).filter(Boolean));o=o.filter(t=>e.has(t.model))}if(o=o.filter(e=>e.qpmInfo),o.length===0){process.stdout.write(`No models found.
354
- `);return}let s=await Promise.all(o.map(t=>Do(e.client,t.model,i))),l=o.map((e,t)=>{let n=e.qpmInfo,r=n[`model-default`],i=n[`user-spec`],a=wo(i,r?.count_limit_period)||wo(r),o=To(i,r?.usage_limit_period)||To(r),c=s[t].rpm,l=s[t].tpm,u=null,d=null;c>=0&&a>0&&(u=Math.max(0,100-c/a*100),d=u.toFixed(1)+`%`);let f=null,p=null;return l>=0&&o>0&&(f=Math.max(0,100-l/o*100),p=f.toFixed(1)+`%`),{model:e.model,rpmUsage:c,rpmLimit:a,tpmUsage:l,tpmLimit:o,rpmQuotaLeft:u,tpmQuotaLeft:f,rpmQuotaLabel:d,tpmQuotaLabel:p}});if(a===`json`){I(l,a);return}Oo(l)}}),Ao=w({description:`Upload a dataset file (.jsonl or .zip) to Bailian`,auth:`apiKey`,usageArgs:`--file <path> [--purpose <name>] [--schema <chatml|dpo|cpt|tts|image>] [--no-validate] [--full-validate]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Local dataset file (.jsonl or .zip; ≤300MB text, ≤1GB image)`,required:!0},purpose:{type:`string`,valueHint:`<name>`,description:`Dataset purpose tag (default: "fine-tune"; e.g. "evaluation")`},schema:{type:`string`,valueHint:`<s>`,description:`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), "cpt" (raw text), "tts" (audio), or "image" (image generation). Default auto-detects per record.`},noValidate:{type:`switch`,description:`Skip the local JSONL pre-flight check (not recommended)`},fullValidate:{type:`switch`,description:`JSON.parse every line instead of sampling (slower)`}},exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file audio.zip --schema tts`,`--file eval.jsonl --purpose evaluation`,`--file train.jsonl --full-validate`,`--file train.jsonl --no-validate`],notes:[`Supports .jsonl (text) and .zip (audio/image archives with a data.jsonl`,`manifest). Five record schemas are recognized: chatml = {messages:[...]}`,`(SFT); dpo = {messages:[...], chosen, rejected}; cpt = {text:"..."}`,`(continual pre-training, raw text); tts = {wav_fn:"train/xxx.wav",`,`text:"..."} (audio fine-tuning); image = {img_path:"..."} (image`,`generation). With no --schema, a record carrying wav_fn is validated as`,`TTS, img_path as image, chosen/rejected as DPO, text (no messages) as CPT,`,`otherwise ChatML. Upload cap: 300MB text, 1GB image. Upload uses the`,`OpenAI-compatible /compatible-mode/v1/files endpoint so the purpose tag is`,`persisted (the DashScope-native /api/v1/files drops it).`],async run(e){let{identity:n,settings:r,flags:i}=e,c=i.file,l=i.purpose||`fine-tune`,u=Ge(i.schema);if(u===`video`)throw new t(`--schema video is not supported.`,a.USAGE,`Supported schemas: chatml, dpo, cpt, tts, image.`);let d=T(r.output),f=u===`image`;if(!i.noValidate){let e=f?s:o,l=await pt(c,{fullValidate:i.fullValidate,schema:u,maxBytes:e});if(!l.valid){let e=[`Dataset validation failed for ${c}`,...l.errors.slice(0,10).map(D)];throw l.errors.length>10&&e.push(` … and ${l.errors.length-10} more error(s).`),e.push(``,`Hint: re-run \`${n.binName} dataset validate --file <path>\` for the full report,`,` or pass --no-validate to skip this check at your own risk.`),new t(e.join(`
355
- `),a.GENERAL)}if(l.warnings.length>0&&!r.quiet){process.stderr.write(`Dataset validation passed with ${l.warnings.length} warning(s):\n`);for(let e of l.warnings.slice(0,5))process.stderr.write(`${D(e)}\n`);l.warnings.length>5&&process.stderr.write(` … and ${l.warnings.length-5} more.\n`)}}if(r.dryRun){I({action:`dataset.upload`,file:c,purpose:l,max_bytes:f?s:o,validate:!i.noValidate,schema:u??`auto`},d);return}let p=await dt(e.client,{filePath:c,purpose:l});r.quiet?F(p.file_id):d===`text`?F(`Uploaded ${p.name} → file_id=${p.file_id}`):I(p,d)}}),jo=w({description:`List uploaded dataset files`,auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--purpose <name>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 10, max 100)`},purpose:{type:`string`,valueHint:`<name>`,description:`Filter by purpose (e.g. "fine-tune", "evaluation"). Omit to list all.`}},exampleArgs:[``,`--purpose fine-tune`,`--purpose evaluation --page-size 20`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output);if(t.dryRun){I({action:`dataset.list`,page:n.page,page_size:n.pageSize,purpose:n.purpose},r);return}let i=await Me(e.client,{pageNo:n.page,pageSize:n.pageSize,purpose:n.purpose||void 0}),a=i.data?.files??[],o=i.data?.total,s=a.map(e=>({file_id:e.file_id??``,name:e.name??``,size:e.size===void 0?`?`:`${(e.size/1024).toFixed(1)} KB`,purpose:e.purpose??``}));if(r===`json`){I({items:s,total:o},r);return}if(s.length===0){F(`No dataset files found.`);return}let c=[`FILE_ID`,`NAME`,`SIZE`,`PURPOSE`],l=s.map(e=>[e.file_id,e.name,e.size,e.purpose]);for(let e of L(c,l))F(e);o!==void 0&&F(`\nTotal: ${o}`)}}),Mo=w({description:`Get details of a single dataset file`,auth:`apiKey`,usageArgs:`--file-id <id>`,flags:{fileId:{type:`string`,valueHint:`<id>`,description:`Dataset file ID (required)`,required:!0}},exampleArgs:[`--file-id file-xxx`,`--file-id file-xxx --output json`],async run(e){let{settings:t,flags:n}=e,r=n.fileId,i=T(t.output);if(t.dryRun){I({action:`dataset.get`,file_id:r},i);return}let a=(await ge(e.client,r)).data;if(!a){F(`No data returned for ${r}`);return}let o=a.size===void 0?`?`:`${(a.size/1024).toFixed(1)} KB`,s={file_id:a.file_id??r,name:a.name??``,size:o,md5:a.md5??``,purpose:a.purpose??``,created_at:a.gmt_create??``,description:a.description??``};if(i===`json`){I(s,i);return}F(`file_id: ${s.file_id}`),F(`name: ${s.name}`),F(`size: ${s.size}`),s.md5&&F(`md5: ${s.md5}`),s.purpose&&F(`purpose: ${s.purpose}`),s.created_at&&F(`created_at: ${s.created_at}`),s.description&&F(`description: ${s.description}`)}}),No=w({description:`Delete a dataset file by ID`,auth:`apiKey`,usageArgs:`--file-id <id>`,flags:{fileId:{type:`string`,valueHint:`<id>`,description:`Dataset file ID (required)`,required:!0}},exampleArgs:[`--file-id file-id-xxx`,`--file-id file-id-xxx --dry-run`],async run(e){let{settings:t,flags:n}=e,r=n.fileId,i=T(t.output);if(t.dryRun){I({action:`dataset.delete`,file_id:r},i);return}let a=await re(e.client,r);t.quiet||i===`text`?F(`Deleted ${r}.`):I(a,i)}});function Po(e){let t=[];return e.stats.totalRecords!==void 0&&t.push(`records: ${e.stats.totalRecords}`),e.stats.sampledRecords!==void 0&&t.push(`sampled: ${e.stats.sampledRecords}`),e.stats.bytes!==void 0&&t.push(`bytes: ${e.stats.bytes}`),e.stats.durationMs!==void 0&&t.push(`took: ${e.stats.durationMs}ms`),t}var Fo=w({description:`Locally validate a dataset file (.jsonl or .zip) without uploading`,auth:`none`,usageArgs:`--file <path> [--full-validate] [--schema <chatml|dpo|cpt|tts|image>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Local dataset file (.jsonl or .zip)`,required:!0},fullValidate:{type:`switch`,description:`JSON.parse every line instead of sampling (slower)`},schema:{type:`string`,valueHint:`<s>`,description:`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), "cpt" (raw text), "tts" (audio), or "image" (image generation). Default auto-detects per record.`}},exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file audio.zip --schema tts`,`--file eval.jsonl --full-validate`,`--file train.jsonl --output json`],notes:[`Default scan: every line gets a structural check, then ~160 lines (front 50,`,`evenly spaced 100, last 10) are JSON.parsed against the active schema.`,`Schemas: chatml = {messages:[...]} (SFT); dpo = {messages:[...], chosen,`,`rejected}; cpt = {text:"..."} (continual pre-training, raw text);`,`tts = {wav_fn:"train/xxx.wav", text:"..."} (audio fine-tuning);`,`image = {img_path:"..."} (image generation). With no --schema, a record`,`carrying wav_fn is validated as TTS, img_path as image, chosen/rejected`,`as DPO, text (no messages) as CPT, otherwise ChatML. Pass --schema to`,`require a specific shape on every record. ZIP archives (.zip) are`,`validated structurally (data.jsonl present, media references resolve) in`,`addition to per-record content checks. Use --full-validate to JSON.parse`,`every line.`],async run(e){let{settings:n,flags:r}=e,i=r.file,o=Ge(r.schema);if(o===`video`)throw new t(`--schema video is not supported.`,a.USAGE,`Supported schemas: chatml, dpo, cpt, tts, image.`);let s=T(n.output);if(n.dryRun){I({action:`dataset.validate`,file:i,full:r.fullValidate,schema:o??`auto`},s);return}let c=await pt(i,{fullValidate:r.fullValidate,schema:o});if(s===`json`)I(c,s);else if(n.quiet)F(c.valid?`ok`:`fail`);else{F(`Dataset validation ${c.valid?`PASSED`:`FAILED`} for ${c.filePath}`);let e=Po(c);if(e.length&&F(` ${e.join(` · `)}`),c.errors.length){F(`Errors (${c.errors.length}):`);for(let e of c.errors.slice(0,20))F(D(e));c.errors.length>20&&F(` … and ${c.errors.length-20} more.`)}if(c.warnings.length){F(`Warnings (${c.warnings.length}):`);for(let e of c.warnings.slice(0,10))F(D(e));c.warnings.length>10&&F(` … and ${c.warnings.length-10} more.`)}}if(!c.valid)throw new t(`Dataset validation failed: ${c.errors.length} error(s).`,a.GENERAL)}});function Io(e){return H(e)&&Vt(e).isFile()}async function Lo(e,n,r,i,o,s,c,l){let u=r.split(`,`).map(e=>e.trim()).filter(Boolean);if(u.length===0)throw new t(`--${i} must contain at least one entry.`,a.USAGE);let d=[],f=[],p,m,h=!0;for(let r of u){if(!Io(r)){d.push(r),h=!1;continue}if(d.push(r),f.push(r),e.dryRun)continue;let i=l&&l.path===r?l.modality:s,u=await o.validate(r,i,{model:c});if(!u.valid){let e=[`Dataset validation failed for ${r}`,...u.errors.slice(0,10).map(D)];throw u.errors.length>10&&e.push(` … and ${u.errors.length-10} more error(s).`),e.push(``,`Hint: re-run \`${n} dataset validate --file <path>\` for the full report,`,` or upload manually with \`${n} dataset upload --no-validate\` and`,` pass the resulting file-id here.`),new t(e.join(`
356
- `),a.GENERAL)}if(u.warnings.length>0&&!e.quiet){process.stderr.write(`Dataset validation passed with ${u.warnings.length} warning(s) for ${r}:\n`);for(let e of u.warnings.slice(0,5))process.stderr.write(`${D(e)}\n`);u.warnings.length>5&&process.stderr.write(` … and ${u.warnings.length-5} more.\n`)}let g=u.stats.totalRecords;typeof g==`number`&&(m=(m??0)+g),p===void 0&&(p=Vt(r).size)}return{fileIds:d,localPaths:f,firstSize:p,recordCount:h?m:void 0}}async function Ro(e,n,r,i,o){let s=[];for(let[c,l]of r.fileIds.entries()){if(!Io(l))continue;let u=await dt(e,{filePath:l,purpose:i});if(!u.file_id)throw new t(`Upload of ${l} succeeded but no file_id was returned.`,a.GENERAL);s.push(u),r.fileIds[c]=u.file_id,n.quiet||process.stderr.write(`Uploaded ${Ut(l)} → ${u.file_id} (auto from --${o})\n`)}return s}const zo={model:{type:`string`,valueHint:`<model>`,description:`Base model to fine-tune`,required:!0},datasets:{type:`string`,valueHint:`<ids|paths>`,description:`Comma-separated dataset file IDs or local paths (.jsonl for text, .zip for audio/image). Local paths are uploaded (validated) first, then their file-ids are used.`,required:!0},validations:{type:`string`,valueHint:`<ids|paths>`,description:`Comma-separated validation dataset file IDs or local paths (auto-uploaded like --datasets).`},modelName:{type:`string`,valueHint:`<name>`,description:`Output model name (after training)`},suffix:{type:`string`,valueHint:`<text>`,description:`Output suffix appended by the platform (finetuned_output_suffix)`}},Bo={...zo,trainingType:{type:`string`,valueHint:`<t>`,description:`Training type: ${f.join(` | `)} (default: ${r}). Mapping to the server happens at the interface boundary (e.g. sft-lora -> efficient_sft, dpo -> dpo_full).`},nEpochs:{type:`number`,valueHint:`<n>`,description:`Number of epochs (default: 3)`},batchSize:{type:`number`,valueHint:`<n>`,description:`Per-device batch size (clamped to [8, 1024]). Auto-set to 8 for small datasets (<100KB)`},learningRate:{type:`string`,valueHint:`<str>`,description:`Learning rate as a string to preserve precision (e.g. "1.6e-5")`},maxLength:{type:`number`,valueHint:`<n>`,description:`Max sequence length`}},Vo={...zo},Ho={...zo,generationType:{type:`string`,choices:[`t2i`,`i2i`],valueHint:`<t2i|i2i>`,description:`Generation type: t2i (default) | i2i. Sets generation_type/max_pixels. Required to train I2I from a file-id or with --dry-run (local data auto-detects input_img).`},learningRate:{type:`string`,valueHint:`<str>`,description:`Learning rate as a string to preserve precision (e.g. "3e-5")`}},Uo=[`Creating a job uploads any local datasets and consumes training quota.`,`Use --dry-run to preview the request body without submitting.`,"--datasets / --validations accept either file-ids (from `dataset upload`)",`or local paths. Local paths are validated and uploaded first, then their`,`file-ids are submitted — a one-step upload-and-train.`],Wo=[...Uo,"Training-type values use the `<method>` / `<method>-lora` convention:",`sft (full) | sft-lora (LoRA) | dpo (full) | dpo-lora (LoRA) | cpt. These map`,`to the server's training_type at the interface boundary, so the rest of the`,`CLI never sees the raw server strings.`,`Before submitting (non dry-run) the job, the model's training capability is`,`checked via listFoundationModels (no console login required); an unsupported`,`training type fails fast with the list the model actually supports.`,`n_epochs defaults to 3. Other hyper-parameters are platform defaults unless set.`,`Learning rate is forwarded as a string to avoid JSON-number precision loss.`,`Pre-submit gate: if the training dataset's sample count is not greater`,`than batch_size, the job is rejected before upload or quota consumption`,`(the platform would otherwise fail ~10 min in, after data processing).`],Go=[...Uo,`Audio TTS training runs sft-lora (efficient_sft) with fixed CosyVoice`,`hyper-parameter defaults; there are no training-type or hyper-parameter`,`knobs to set.`],Ko=[...Uo,`Image generation training runs sft-lora (efficient_sft) with fixed defaults;`,`only --learning-rate is overridable. T2I vs I2I is declared with`,`--generation-type (default t2i), which sets generation_type/max_pixels. For`,`local data the type is auto-detected (records with input_img train I2I);`,`pass --generation-type explicitly to train I2I from a file-id or in --dry-run.`];async function qo(e,n){let{identity:i,settings:o}=n,s=n.flags,c=s.model,l=s.datasets;if(e===`audio`){let e=l.split(`,`).map(e=>e.trim()).filter(Boolean);if(e.length>1)throw new t(`Audio (TTS) fine-tuning accepts exactly one training file, got ${e.length}.`,a.USAGE,`Merge your recordings into a single .zip (or pass one file-id).`)}let u=s.trainingType||r;if(!Ee(u))throw new t(`--training-type "${u}" is not supported.`,a.USAGE,`Supported values: ${f.join(`, `)} (default: ${r}).`);let d=Se(u),p=l.split(`,`).map(e=>e.trim()).find(e=>Io(e)),m=e;if(e===`image`){let e=s.generationType;(e===`i2i`||!e&&p&&!o.dryRun&&await oe(p)===`image-i2i`)&&(m=`image-i2i`)}let h=await Lo(o,i.binName,l,`datasets`,d,m,c,p?{path:p,modality:m}:void 0),g=h.fileIds,_=s.validations?await Lo(o,i.binName,s.validations,`validations`,d,m,c):void 0,v=_?.fileIds,y=s.modelName,b=s.suffix,x=d.resolveHyperParameters(m,s);if(s.batchSize!==void 0&&x.batch_size!==void 0&&!o.quiet&&!d.shouldSkipGate(`batch_size`,m)){let e=s.batchSize;x.batch_size!==e&&process.stderr.write(`warning: --batch-size ${e} clamped to ${x.batch_size} (server range [8, 1024] for the common training types).\n`)}if(s.batchSize!==void 0&&!o.quiet&&d.shouldSkipGate(`batch_size`,m)){let e=s.batchSize;x.batch_size!==void 0&&x.batch_size!==e&&process.stderr.write(`warning: --batch-size ${e} ignored for ${m} training (model uses a fixed batch_size of ${x.batch_size}).\n`)}if(m===`text`&&x.batch_size===void 0&&!o.dryRun){let e=h.firstSize??0;if(e===0)try{e=(await ge(n.client,g[0])).data?.size??0}catch{}e>0&&e<100*1024&&(x.batch_size=8)}if(!o.dryRun&&h.recordCount!==void 0&&!d.shouldSkipGate(`batch_size`,m)){let e=x.batch_size??16,n=qe({recordCount:h.recordCount,batchSize:e});if(!n.ok&&n.issue)throw new t(n.issue.message,a.GENERAL,n.hint)}if(!o.dryRun&&!d.shouldSkipCapabilityCheck(m)){let e;try{e=await le(o,c)}catch(e){o.quiet||process.stderr.write(`warning: model capability lookup failed (${e.message}); proceeding without local pre-flight.
357
- `)}if(e&&!Ie(e).includes(u)){let n=Ie(e);throw new t(`Model "${c}" does not support training type "${u}".`,a.USAGE,n.length?`This model supports: ${n.join(`, `)}.`:`This model reports no supported training types.`)}}o.dryRun||(await Ro(n.client,o,h,`fine-tune`,`datasets`),_&&await Ro(n.client,o,_,`fine-tune`,`validations`));let S={model:c,training_file_ids:g,training_type:d.serverTrainingType,hyper_parameters:x};v&&v.length>0&&(S.validation_file_ids=v),y&&(S.model_name=y),b&&(S.finetuned_output_suffix=b);let C=T(o.output);if(o.dryRun){let e=[...h.localPaths.map(e=>({field:`datasets`,path:e})),...(_?.localPaths??[]).map(e=>({field:`validations`,path:e}))];I(e.length>0?{action:`finetune.create`,body:S,pending_uploads:e}:{action:`finetune.create`,body:S},C);return}let te=await ee(n.client,S),w=te.output??te.data;o.quiet?w?.job_id&&F(w.job_id):C===`text`&&w?.job_id?(F(`Created fine-tune job: ${w.job_id}`),w.status&&F(`Status: ${w.status}`)):I(te,C)}const Jo=w({description:`Create a text model fine-tune job (sft | sft-lora | dpo | dpo-lora | cpt)`,auth:`apiKey`,usageArgs:`--model <model> --datasets <id|path,...> [--validations <id|path,...>] [--model-name <name>] [--suffix <text>] [--n-epochs <n>] [--batch-size <n>] [--learning-rate <str>] [--max-length <n>] [--training-type <sft|sft-lora|dpo|dpo-lora|cpt>]`,flags:Bo,exampleArgs:[`--model qwen3-8b --datasets file-xxx`,`--model qwen3-8b --datasets ./train.jsonl`,`--model qwen3-8b --datasets ./train.jsonl --validations ./eval.jsonl`,`--model qwen3-8b --datasets file-aaa,./extra.jsonl`,`--model qwen3-8b --datasets ./train.jsonl --training-type sft`,`--model qwen3-8b --datasets file-xxx --learning-rate "1.6e-5" --n-epochs 4`,`--model qwen3-8b --datasets file-xxx --output json`,`--model qwen3-8b --datasets file-xxx --dry-run`],notes:Wo,run:e=>qo(`text`,e)}),Yo=w({description:`Create an audio TTS model fine-tune job (sft-lora)`,auth:`apiKey`,usageArgs:`--model <model> --datasets <id|path> [--validations <id|path>] [--model-name <name>] [--suffix <text>]`,flags:Vo,exampleArgs:[`--model cosyvoice-v3-flash --datasets ./audio.zip`,`--model cosyvoice-v3-flash --datasets file-xxx`,`--model cosyvoice-v3-flash --datasets ./audio.zip --model-name my-tts`,`--model cosyvoice-v3-flash --datasets file-xxx --output json`,`--model cosyvoice-v3-flash --datasets ./audio.zip --dry-run`],notes:Go,run:e=>qo(`audio`,e)}),Xo=w({description:`Create an image generation model fine-tune job (sft-lora)`,auth:`apiKey`,usageArgs:`--model <model> --datasets <id|path> [--validations <id|path>] [--model-name <name>] [--suffix <text>] [--generation-type <t2i|i2i>] [--learning-rate <str>]`,flags:Ho,exampleArgs:[`--model wan2.7-image-pro --datasets ./images.zip`,`--model wan2.7-image-pro --datasets file-xxx`,`--model wan2.7-image-pro --datasets file-xxx --generation-type i2i`,`--model wan2.7-image-pro --datasets ./images.zip --model-name my-wan`,`--model wan2.7-image-pro --datasets file-xxx --output json`,`--model wan2.7-image-pro --datasets ./images.zip --dry-run`],notes:Ko,run:e=>qo(`image`,e)});var Zo=w({description:`List fine-tune jobs`,auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--status <s>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 10, max 100)`},status:{type:`string`,valueHint:`<s>`,description:`Filter by status (PENDING / RUNNING / SUCCEEDED / FAILED / CANCELED)`}},exampleArgs:[``,`--status RUNNING`,`--page-size 20 --output json`],async run(e){let{identity:t,settings:n,flags:r}=e,i=T(n.output),a=r.page,o=r.pageSize,s=r.status||void 0;if(n.dryRun){I({action:`finetune.list`,page:a,page_size:o,status:s},i);return}let c=await Fe(e.client,{pageNo:a,pageSize:o,status:s}),l=c.output??c.data,u=l?.jobs??[],d=l?.total,f=u.map(e=>({job_id:e.job_id??``,base_model:e.model??``,status:e.status??``,training_type:e.training_type??``,output_model:e.finetuned_output??``,created_at:e.create_time??e.gmt_create??``}));if(i===`json`){I({items:f,total:d},i);return}if(f.length===0){F(`No fine-tune jobs found.`);return}let p=[`JOB_ID`,`BASE_MODEL`,`STATUS`,`TRAINING_TYPE`,`OUTPUT_MODEL`,`CREATED_AT`],m=f.map(e=>[e.job_id,e.base_model,e.status,e.training_type,e.output_model,e.created_at]);for(let e of L(p,m))F(e);d!==void 0&&F(`\nTotal: ${d}`),F(`Tip: OUTPUT_MODEL is the input for \`${t.binName} deploy text create --model\``)}}),Qo=w({description:`Get details of a single fine-tune job`,auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --output json`],async run(e){let{identity:t,settings:n,flags:r}=e,i=r.jobId,a=T(n.output);if(n.dryRun){I({action:`finetune.get`,job_id:i},a);return}let o=await ve(e.client,i),s=o.output??o.data;if(!s){F(`No data returned for ${i}`);return}let c=s.hyper_parameters,l=[];c?.n_epochs!==void 0&&l.push(`n_epochs=${c.n_epochs}`),c?.batch_size!==void 0&&l.push(`batch_size=${c.batch_size}`),c?.learning_rate!==void 0&&l.push(`learning_rate=${c.learning_rate}`),c?.max_length!==void 0&&l.push(`max_length=${c.max_length}`);let u={job_id:s.job_id??i,base_model:s.model??``,status:s.status??``,training_type:s.training_type??``,training_files:s.training_file_ids??[],validation_files:s.validation_file_ids??[],hyper_params:l.length?l.join(` · `):``,output_model:s.finetuned_output??``,model_name:s.model_name??``,created_at:s.create_time??s.gmt_create??``,updated_at:s.end_time??s.gmt_modified??``};if(a===`json`){I(u,a);return}F(`job_id: ${u.job_id}`),u.base_model&&F(`base_model: ${u.base_model}`),u.status&&F(`status: ${u.status}`),u.training_type&&F(`training_type: ${u.training_type}`),u.training_files.length&&F(`training_files: ${u.training_files.join(`, `)}`),u.validation_files.length&&F(`validation_files: ${u.validation_files.join(`, `)}`),u.hyper_params&&F(`hyper_params: ${u.hyper_params}`),u.output_model&&F(`output_model: ${u.output_model} (→ ${t.binName} deploy text create --model)`),u.model_name&&F(`model_name: ${u.model_name}`),u.created_at&&F(`created_at: ${u.created_at}`),u.updated_at&&F(`updated_at: ${u.updated_at}`)}}),$o=w({description:`Cancel a running fine-tune job`,auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --dry-run`],notes:[`Only PENDING / RUNNING jobs can be cancelled. Completed / failed / already-`,`cancelled jobs return a server-side error (passed through verbatim).`],async run(e){let{settings:t,flags:n}=e,r=n.jobId,i=T(t.output);if(t.dryRun){I({action:`finetune.cancel`,job_id:r},i);return}let a=await b(e.client,r),o=a.output??a.data;t.quiet?F(r):i===`text`?F(`Cancelled ${r}${o?.status?` (status=${o.status})`:``}.`):I(a,i)}}),es=w({description:`Delete a fine-tune job record`,auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --dry-run`],notes:["Cancel a RUNNING job first via `finetune cancel` — the platform refuses",`to delete jobs that are still in flight.`],async run(e){let{settings:t,flags:n}=e,r=n.jobId,i=T(t.output);if(t.dryRun){I({action:`finetune.delete`,job_id:r},i);return}let a=await ae(e.client,r);t.quiet?F(r):i===`text`?F(`Deleted ${r}.`):I(a,i)}});function ts(e){if(typeof e==`string`)return e;let t=e,n=t.timestamp??t.time??t.create_time??``,r=t.level??``,i=t.message??t.msg??t.log??``;return i||n||r?[n,r,i].filter(Boolean).join(` `):JSON.stringify(e)}function ns(e,t){return ts(e).toLowerCase().includes(t)}async function rs(e,t,n){let r=[],i=1,a=0;for(let o=0;o<200;o++){let o=await ye(e,t,{pageNo:i,pageSize:n}),s=o.output??o.data,c=s?.logs??[];if(a=s?.total??a,c.length===0||(r.push(...c),a&&r.length>=a)||c.length<n)break;i++}return{entries:r,total:a}}var is=w({description:`Fetch training logs for a fine-tune job`,auth:`apiKey`,usageArgs:`--job-id <id> [--page <n>] [--page-size <n>] [--search <keyword>] [--tail <n>]`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Lines per page (default: server-defined)`},search:{type:`string`,valueHint:`<keyword>`,description:`Case-insensitive substring filter. When set, all log pages are fetched and filtered client-side (--page is ignored).`},tail:{type:`number`,valueHint:`<n>`,description:`Keep only the last N entries. When set, all log pages are fetched and the trailing N are kept (--page is ignored).`}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --page-size 100 --output json`,`--job-id ft-xxx --search checkpoint`,`--job-id ft-xxx --search error --output json`,`--job-id ft-xxx --tail 20`,`--job-id ft-xxx --search checkpoint --tail 5`],async run(e){let{settings:t,flags:n}=e,r=n.jobId,i=n.page,a=n.pageSize,o=n.search||void 0,s=n.tail,c=T(t.output);if(t.dryRun){I({action:`finetune.logs`,job_id:r,page:i,page_size:a,search:o,tail:s},c);return}if(o||s!==void 0){let{entries:n,total:i}=await rs(e.client,r,a??100),l=n,u;if(o){let e=o.toLowerCase();l=n.filter(t=>ns(t,e)),u=l.length}let d=s!==void 0&&s>=0?Math.min(s,l.length):void 0,f=d===void 0?l:l.slice(l.length-d);if(t.quiet||c===`text`){if(f.length===0){F(o?`No logs matched "${o}".`:`No logs returned.`);return}for(let e of f)F(ts(e));let e=[`${f.length} shown`];u!==void 0&&e.push(`matched ${u}`),e.push(`of ${n.length}`+(i?` (total ${i})`:``)),F(`\n${e.join(`, `)}`);return}I({...u===void 0?{}:{matched:u},scanned:n.length,total:i||n.length,...o?{search:o}:{},...d===void 0?{}:{tail:d},logs:f},c);return}let l=await ye(e.client,r,{pageNo:i,pageSize:a}),u=l.output??l.data,d=u?.logs??[];if(t.quiet||c===`text`){if(d.length===0){F(`No logs returned.`);return}for(let e of d)F(ts(e));u?.total!==void 0&&F(`\nTotal: ${u.total}`)}else I(l,c)}}),as=w({description:`List checkpoints produced by a fine-tune job`,auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --output json`],notes:["Use the returned `checkpoint` value with `finetune export` to publish",`a deployable model.`],async run(e){let{settings:t,flags:n}=e,r=n.jobId,i=T(t.output);if(t.dryRun){I({action:`finetune.checkpoints`,job_id:r},i);return}let a=await je(e.client,r),o=a.output??a.data,s=Array.isArray(o)?o:o?.checkpoints??[],c=Array.isArray(o)?o.length:o?.total??s.length,l=s.map(e=>({checkpoint:e.checkpoint??e.checkpoint_id??``,step:e.step===void 0?``:String(e.step),status:e.status??``}));if(i===`json`){I({items:l,total:c},i);return}if(l.length===0){F(`No checkpoints found.`);return}let u=[`CHECKPOINT`,`STEP`,`STATUS`],d=l.map(e=>[e.checkpoint,e.step,e.status]);for(let e of L(u,d))F(e);F(`\nTotal: ${c}`)}}),os=w({description:`Publish a checkpoint as a deployable model`,auth:`apiKey`,usageArgs:`--job-id <id> --checkpoint <name> --model-name <name>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0},checkpoint:{type:`string`,valueHint:`<name>`,description:"Checkpoint identifier from `finetune checkpoints` (required)",required:!0},modelName:{type:`string`,valueHint:`<name>`,description:`Deployable model name (required)`,required:!0}},exampleArgs:[`--job-id ft-xxx --checkpoint ckpt-3 --model-name my-qwen-sft`],notes:["Required before `deploy <modality> create` can target a checkpoint. The",`platform may auto-export the best checkpoint when a job reaches SUCCEEDED —`,`explicit export is the canonical path for non-best checkpoints.`],async run(e){let{identity:t,settings:n,flags:r}=e,i=r.jobId,a=r.checkpoint,o=r.modelName,s=T(n.output);if(n.dryRun){I({action:`finetune.export`,job_id:i,checkpoint:a,model_name:o},s);return}let c=await ce(e.client,i,a,o),l=(c.output??c.data)?.model_name??o;n.quiet?F(l):s===`text`?(F(`Exported ${i} / ${a} → model_name=${l}`),F(`Next: ${t.binName} deploy text create --model ${l} --name <display-name>`)):I(c,s)}});const ss=new Set([`SUCCEEDED`,`FAILED`,`CANCELED`]);function cs(){let e=new Date,t=e=>String(e).padStart(2,`0`);return`${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function ls(e){let t=Math.floor(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}function us(e,t){return new Promise((n,r)=>{if(t.aborted){r(Error(`aborted`));return}let i=()=>{clearTimeout(a),r(Error(`aborted`))},a=setTimeout(()=>{t.removeEventListener(`abort`,i),n()},e);t.addEventListener(`abort`,i,{once:!0})})}var ds=w({description:`Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal.`,auth:`apiKey`,usageArgs:`--job-id <id> [--follow] [--interval <sec>] [--poll-timeout <sec>]`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0},follow:{type:`switch`,description:`Block and poll until a terminal state (the legacy behavior). Without it, a single status probe is performed and the command returns immediately.`},interval:{type:`number`,valueHint:`<sec>`,description:`Seconds between polls with --follow (default: 10, min: 1). Ignored without --follow.`},pollTimeout:{type:`number`,valueHint:`<sec>`,description:`With --follow, stop polling after this many seconds (default: no limit). Ignored without --follow.`}},exampleArgs:[`--job-id ft-xxx # single probe, returns immediately`,`--job-id ft-xxx --output json # status probe for agents`,`--job-id ft-xxx --follow # block until terminal`,`--job-id ft-xxx --follow --interval 5`,`--job-id ft-xxx --follow --poll-timeout 3600`],notes:[`Default (no --follow) is a NON-BLOCKING single status probe: one fetch, then`,`return immediately. This is the mode meant for agents / scripts — the caller`,`owns the polling cadence, so the CLI never holds the terminal.`,`A terminal FAILED/CANCELED status raises a normal CLI error (non-zero exit);`,`a SUCCEEDED or still-running status returns 0. With --follow, exceeding`,`--poll-timeout raises a timeout error.`,`Use --follow for the blocking, human-terminal-follow experience; use the`,`default mode when driving the loop yourself (e.g. from an agent).`,"For per-step training output (not status), use `finetune logs`."],async run(e){let{settings:n,flags:r}=e,i=r.jobId,o=r.follow,s=Math.max(1,r.interval??10),c=r.pollTimeout,l=T(n.output);if(n.dryRun){I({action:`finetune.watch`,job_id:i,follow:o,interval:s,timeout:c},l);return}if(!o){let r=await ve(e.client,i),o=r.output??r.data,s=String(o?.status??``).toUpperCase(),c=ss.has(s);if(n.quiet?F(s||`UNKNOWN`):l===`text`?(F(`${cs()} ${i} ${s||`UNKNOWN`}`),s===`SUCCEEDED`&&F(`✓ ${i} ${s}`)):I({job_id:i,status:s||`UNKNOWN`,terminal:c},l),c&&s!==`SUCCEEDED`)throw new t(`Fine-tune job ${i} ended in status ${s}.`,a.GENERAL);return}let u=new AbortController,d=()=>u.abort();process.on(`SIGINT`,d);try{let r=``,o=Date.now();for(;;){let d=await ve(e.client,i,u.signal),f=d.output??d.data,p=String(f?.status??``).toUpperCase();if(l===`text`&&!n.quiet&&p!==r&&(F(`${cs()} ${i} ${p||`UNKNOWN`}`),r=p),ss.has(p)){let e=Date.now()-o;if(l!==`text`||n.quiet?I(d,l):p===`SUCCEEDED`&&F(`\n✓ ${i} ${p} (elapsed ${ls(e)})`),p!==`SUCCEEDED`)throw new t(`Fine-tune job ${i} ended in status ${p} (elapsed ${ls(e)}).`,a.GENERAL);return}if(c!==void 0&&(Date.now()-o)/1e3>=c)throw new t(`Watching fine-tune job ${i} timed out after ${ls(Date.now()-o)} (last status: ${p||`UNKNOWN`}).`,a.TIMEOUT);await us(s*1e3,u.signal)}}catch(e){if(u.signal.aborted){F(`
358
- Interrupted.`);return}throw e}finally{process.off(`SIGINT`,d)}}});async function fs(e){let t=se(e),n=(n,r)=>y({region:t.consoleRegion,site:t.consoleSite,switchAgent:t.consoleSwitchAgent},e.timeout,{api:n,data:r}),r=await E(n,{pageNo:1,pageSize:50}),i=[...r.models],a=Math.ceil(r.total/50);for(let e=2;e<=a;e++){let t=await E(n,{pageNo:e,pageSize:50});i.push(...t.models)}return i}const ps={full:`full-parameter`,lora:`LoRA`};function ms(e){if(!Ee(e))return e;let{method:t,variant:n}=ct(e);return`${ps[n]??n} ${t.toUpperCase()}`}var hs=w({description:`Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it)`,auth:`none`,usageArgs:`--model <m> | --training-type <t>`,flags:{model:{type:`string`,valueHint:`<m>`,description:`List training types supported by this base model.`},trainingType:{type:`string`,valueHint:`<t>`,description:`List models supporting this training type: ${f.join(` | `)}.`}},exampleArgs:[`--model qwen3-8b`,`--training-type sft-lora`,`--training-type cpt --output json`,`--training-type sft --quiet`],notes:[`Exactly one of --model / --training-type is required.`,"Training-type values use the `<method>` / `<method>-lora` convention:",`sft | sft-lora | dpo | dpo-lora | cpt. (cpt has no -lora variant server-side.)`,`Queries listFoundationModels, a public API — no console login needed.`],validate:e=>{if(e.model&&e.trainingType)return`--model and --training-type are mutually exclusive; pass one.`;if(!e.model&&!e.trainingType)return`one of --model / --training-type is required.`},async run(e){let{settings:t,flags:n}=e,r=n.model||void 0,i=n.trainingType||void 0,a=T(t.output);if(t.dryRun){I({action:`finetune.capability`,model:r,training_type:i},a);return}if(r){let e=await le(t,r);if(!e){F(`No foundation model found matching "${r}".`);return}let n=Ie(e);if(t.quiet){for(let e of n)F(e);return}if(a!==`text`){I({model:e.model??r,supported:n,supports:e.supports,trainingTypes:e.trainingTypes},a);return}F(`${e.model??r}`),F(n.length?`Supported training types:`:`No supported training types.`);for(let e of n)F(` ${e.padEnd(10)} ${ms(e)}`);return}if(!i||!Ee(i))throw new p(`--training-type "${i}" is not supported. Valid: ${f.join(`, `)}.`);let{method:o,variant:s}=ct(i),c=(await fs(t)).filter(e=>He(e,i)).map(e=>({model:e.model,name:e.name??e.model})).filter(e=>!!e.model).sort((e,t)=>e.model.localeCompare(t.model));if(t.quiet){for(let e of c)F(e.model);return}if(a!==`text`){I({training_type:i,method:o,variant:s,count:c.length,models:c},a);return}F(`Models supporting ${i} (${o} / ${s}): ${c.length}`);for(let e of c)F(` ${e.model}`)}});const gs={model:{type:`string`,valueHint:`<name>`,description:`Model name (catalog model or fine-tuned output) (required)`,required:!0},name:{type:`string`,valueHint:`<display_name>`,description:`Console display name for the deployment (required)`,required:!0},plan:{type:`string`,valueHint:`<plan>`,description:`Billing plan: lora (default, Token-billed) | ptu (Token-billed) | mu`},deploySpec:{type:`string`,valueHint:`<id>`,description:`Deploy spec (only used by plan=mu; auto-picked if omitted)`},capacity:{type:`number`,valueHint:`<n>`,description:`Resource units (plan=mu only; required by API; defaults to the template's unit)`},billingMethod:{type:`string`,valueHint:`<m>`,description:`Billing method (plan=mu only; default "POST_PAY", the only supported value)`},inputTpm:{type:`number`,valueHint:`<n>`,description:`PTU max input tokens/min (required for plan=ptu)`},outputTpm:{type:`number`,valueHint:`<n>`,description:`PTU max output tokens/min (required for plan=ptu)`},thinkingOutputTpm:{type:`number`,valueHint:`<n>`,description:`PTU max thinking-output tokens/min (optional, some models)`}},_s=`--model <model_name> --name <display_name> [--plan <plan>] [--deploy-spec <id>] [--capacity <n>] [--billing-method <m>] [--input-tpm <n>] [--output-tpm <n>] [--thinking-output-tpm <n>]`,vs=["Plan defaults to `lora` (Token-billed) for text/image and `mu` (model-unit-",`billed) for audio (CosyVoice TTS). Pass --plan to override.`,`For plan=ptu (Token-billed, provisioned throughput), --input-tpm and`,`--output-tpm are required (the platform rejects creation without an`,`explicit ptu_capacity despite the doc listing defaults).`,"For plan=mu, `capacity`, `billing_method` and `deploy_spec` are required.",`billing_method defaults to POST_PAY (only supported value); deploy_spec`,`and capacity are auto-picked from GET /deployments/models when omitted.`,"Use `bl deploy models --source base` to inspect available templates.",`After creation, status starts at PENDING and transitions to RUNNING.`,`Invoke the deployed model with: bl text chat --model <deployed_model>`,`WARNING: --model is overloaded across commands and refers to DIFFERENT`,"values. `bl deploy <modality> create --model` takes the exported model_name","(e.g. `qwen3-8b-ft-...`), but the create response also returns a","`deployed_model` field (the deployment instance id, e.g.","`qwen3-8b-5ecb5f068d79`). The inference call `bl text chat --model` must use","the `deployed_model` from the create response — NOT the `model_name` you","passed to `deploy <modality> create`. Do not reuse the value across the two",`commands.`];function ys(e,t){let n=t.plan||te(e),r=d[n];return r?r.validateFlags(t):`Unsupported plan "${n}". Supported plans: ${Object.keys(d).join(`, `)}.`}async function bs(e,t){let{identity:n,settings:r,flags:i}=t,a=i.model,o=i.name,s=i.plan||te(e),c=T(r.output),l={model_name:a,name:o,plan:s,...(await Ke(s).resolve({client:t.client,dryRun:r.dryRun,binName:n.binName,flags:i,model:a,name:o})).body};if(r.dryRun){I({action:`deploy.create`,body:l},c);return}let u=await C(t.client,l),d=u.output??u.data;r.quiet?F(d?.deployed_model??``):c===`text`?(F(`Created deployment.`),d?.deployed_model&&F(` deployed_model: ${d.deployed_model}`),d?.status&&F(` status: ${d.status}`),d?.plan&&F(` plan: ${d.plan}`),F(`\nNext: track readiness with: ${n.binName} deploy get --deployed-model ${d?.deployed_model??`<id>`}`)):I(u,c)}const xs=w({description:`Create a text model deployment`,auth:`apiKey`,usageArgs:_s,flags:gs,exampleArgs:[`--model my-qwen-sft --name my-sft-test`,`--model qwen3.6-flash-2026-04-16 --name my-flash --plan ptu --input-tpm 10000 --output-tpm 1000`,`--model qwen3-8b --name my-qwen3-mu --plan mu`,`--model qwen3-8b --name my-qwen3 --plan mu --deploy-spec MU1 --capacity 2`],notes:vs,validate:e=>ys(`text`,e),run:e=>bs(`text`,e)}),Ss=w({description:`Create an audio (TTS) model deployment`,auth:`apiKey`,usageArgs:_s,flags:gs,exampleArgs:[`--model my-cosyvoice-ft --name my-tts`,`--model my-cosyvoice-ft --name my-tts --deploy-spec dps-xxxx --capacity 1`,`--model my-cosyvoice-ft --name my-tts --dry-run`],notes:vs,validate:e=>ys(`audio`,e),run:e=>bs(`audio`,e)}),Cs=w({description:`Create an image generation model deployment`,auth:`apiKey`,usageArgs:_s,flags:gs,exampleArgs:[`--model my-wan-ft --name my-wan`,`--model my-wan-ft --name my-wan-mu --plan mu`,`--model my-wan-ft --name my-wan --dry-run`],notes:vs,validate:e=>ys(`image`,e),run:e=>bs(`image`,e)});var ws=w({description:`List model deployments`,auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--status <s>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 10, max 100)`},status:{type:`string`,valueHint:`<s>`,description:`Filter by status (PENDING / RUNNING / STOPPED / FAILED)`}},exampleArgs:[``,`--status RUNNING`,`--page-size 20 --output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.status||void 0;if(t.dryRun){I({action:`deploy.list`,page:n.page,page_size:n.pageSize,status:i},r);return}let a=await Pe(e.client,{pageNo:n.page,pageSize:n.pageSize,status:i}),o=a.output??a.data,s=o?.deployments??[],c=o?.total,l=s.map(e=>({deployed_model:e.deployed_model??``,model_name:e.model_name??``,status:e.status??``,plan:e.plan??``,capacity:e.capacity===void 0?``:String(e.capacity),created_at:e.gmt_create??``}));if(r===`json`){I({items:l,total:c},r);return}if(l.length===0){F(`No deployments found.`);return}let u=[`DEPLOYED_MODEL`,`MODEL_NAME`,`STATUS`,`PLAN`,`CAPACITY`,`CREATED_AT`],d=l.map(e=>[e.deployed_model,e.model_name,e.status,e.plan,e.capacity,e.created_at]);for(let e of L(u,d))F(e);c!==void 0&&F(`\nTotal: ${c}`)}}),Ts=w({description:`Get details of a single model deployment`,auth:`apiKey`,usageArgs:`--deployed-model <id>`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:`Deployed model identifier (required)`,required:!0}},exampleArgs:[`--deployed-model qwen-plus-2025-12-01-b6d61c71`,`--deployed-model qwen-plus-2025-12-01-b6d61c71 --output json`],async run(e){let{settings:t,flags:n}=e,r=n.deployedModel,i=T(t.output);if(t.dryRun){I({action:`deploy.get`,deployed_model:r},i);return}let a=await _e(e.client,r),o=a.output??a.data;if(!o){F(`No data returned for ${r}`);return}let s={deployed_model:o.deployed_model??r,deployed_name:o.name??``,model_name:o.model_name??``,base_model:o.base_model??``,status:o.status??``,plan:o.plan??``};if(o.model_unit_spec&&(s.model_unit_spec=o.model_unit_spec),o.charge_type&&(s.charge_type=o.charge_type),o.capacity!==void 0&&(s.capacity=o.capacity),o.base_capacity!==void 0&&(s.base_capacity=o.base_capacity),o.ready_capacity!==void 0&&(s.ready_capacity=o.ready_capacity),o.rpm_limit!==void 0&&(s.rpm_limit=o.rpm_limit),o.tpm_limit!==void 0&&(s.tpm_limit=o.tpm_limit),o.input_tpm!==void 0&&(s.input_tpm=o.input_tpm),o.output_tpm!==void 0&&(s.output_tpm=o.output_tpm),o.gmt_create&&(s.created_at=o.gmt_create),o.gmt_modified&&(s.updated_at=o.gmt_modified),i===`json`){I(s,i);return}let c=e=>`${e}:`.padEnd(18);for(let[e,t]of Object.entries(s)){if(t===``||t===void 0)continue;let n=typeof t==`string`?t:JSON.stringify(t);F(`${c(e)}${n}`)}}}),Es=w({description:`List models available for deployment`,auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--catalog-version <v>] [--source <custom|public>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 100)`},catalogVersion:{type:`string`,valueHint:`<v>`,description:`Catalog version filter (default: v1.0; required for new catalog models)`},source:{type:`string`,valueHint:`<s>`,description:`Model source filter: custom (fine-tuned) | base (catalog) | public`}},exampleArgs:[``,`--source base`,`--source custom --page-size 50`,`--catalog-version v1.0 --output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.catalogVersion===``?void 0:n.catalogVersion??`v1.0`,a=n.source||void 0;if(t.dryRun){I({action:`deploy.models`,page:n.page,page_size:n.pageSize,version:i,model_source:a},r);return}let o=await Ne(e.client,{pageNo:n.page,pageSize:n.pageSize,version:i,modelSource:a}),s=o.output??o.data,c=s?.models??[],l=s?.total;if(r===`json`){I({items:c.map(e=>{let t={model_name:e.model_name??``};return e.base_model&&(t.base_model=e.base_model),e.model_source&&(t.model_source=e.model_source),e.supported_plans&&e.supported_plans.length>0&&(t.supported_plans=e.supported_plans),e.plans&&e.plans.length>0&&(t.plans=e.plans.map(e=>{let t={plan:e.plan??``};return e.cu_specs&&e.cu_specs.length>0&&(t.cu_specs=e.cu_specs),e.templates&&e.templates.length>0&&(t.templates=e.templates.map(e=>{let t={};e.template_id&&(t.template_id=e.template_id),e.template_name&&(t.template_name=e.template_name),e.charge_type&&(t.charge_type=e.charge_type);let n=e.roles?.unified;return n?.model_unit_spec&&(t.model_unit_spec=n.model_unit_spec),n?.capacity_unit_per_instance!==void 0&&(t.capacity_unit_per_instance=n.capacity_unit_per_instance),(e.roles?.prefill||e.roles?.decode)&&(t.roles={prefill:e.roles?.prefill,decode:e.roles?.decode}),e.template_desc&&(t.template_desc=e.template_desc),t})),t})),t}),total:l},r);return}let u=c.map(e=>{let t=``;return t=e.supported_plans&&e.supported_plans.length>0?e.supported_plans.join(`,`):e.plans&&e.plans.length>0?e.plans.map(e=>{let t=e.plan??`?`;return e.templates&&e.templates.length>0?`${t}(${e.templates.length}t)`:e.cu_specs&&e.cu_specs.length>0?`${t}(${e.cu_specs.join(`/`)})`:t}).join(`,`):`-`,{model_name:e.model_name??``,base_model:e.base_model??``,source:e.model_source??``,plans:t}});if(u.length===0){F(`No deployable models found.`);return}let d=[`MODEL_NAME`,`BASE_MODEL`,`SOURCE`,`PLANS`],f=u.map(e=>[e.model_name,e.base_model,e.source,e.plans]);for(let e of L(d,f))F(e);l!==void 0&&F(`\nTotal: ${l}`)}}),Ds=w({description:`Scale a deployment's capacity`,auth:`apiKey`,usageArgs:`--deployed-model <id> --capacity <n> [--input-tpm <n>] [--output-tpm <n>]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:`Deployed model identifier (required)`,required:!0},capacity:{type:`number`,valueHint:`<n>`,description:`New capacity in plan units (must be a multiple of base_capacity)`},inputTpm:{type:`number`,valueHint:`<n>`,description:`PTU only — input tokens per minute`},outputTpm:{type:`number`,valueHint:`<n>`,description:`PTU only — output tokens per minute`}},exampleArgs:[`--deployed-model qwen-plus-...-b6d61c71 --capacity 8`,`--deployed-model dep-... --capacity 2`],validate:e=>e.capacity===void 0&&e.inputTpm===void 0&&e.outputTpm===void 0?`Provide at least one of --capacity / --input-tpm / --output-tpm.`:void 0,async run(e){let{settings:t,flags:n}=e,r=n.deployedModel,i=T(t.output),a={};if(n.capacity!==void 0&&(a.capacity=n.capacity),n.inputTpm!==void 0&&(a.input_tpm=n.inputTpm),n.outputTpm!==void 0&&(a.output_tpm=n.outputTpm),t.dryRun){I({action:`deploy.scale`,deployed_model:r,body:a},i);return}let o=await rt(e.client,r,a),s=o.output??o.data;t.quiet?F(r):i===`text`?F(`Scaled ${r}${s?.capacity===void 0?``:` (capacity=${s.capacity})`}.`):I(o,i)}}),Os=w({description:`Update a deployment's rate limits (rpm_limit / tpm_limit)`,auth:`apiKey`,usageArgs:`--deployed-model <id> [--rpm-limit <n>] [--tpm-limit <n>]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:`Deployed model identifier (required)`,required:!0},rpmLimit:{type:`number`,valueHint:`<n>`,description:`Requests per minute`},tpmLimit:{type:`number`,valueHint:`<n>`,description:`Tokens per minute`}},exampleArgs:[`--deployed-model dep-... --rpm-limit 1000`,`--deployed-model dep-... --rpm-limit 1000 --tpm-limit 200000`],notes:[`At least one of --rpm-limit / --tpm-limit must be provided.`],validate:e=>e.rpmLimit===void 0&&e.tpmLimit===void 0?`Provide at least one of --rpm-limit / --tpm-limit.`:void 0,async run(e){let{settings:t,flags:n}=e,r=n.deployedModel,i=T(t.output),a={};if(n.rpmLimit!==void 0&&(a.rpm_limit=n.rpmLimit),n.tpmLimit!==void 0&&(a.tpm_limit=n.tpmLimit),t.dryRun){I({action:`deploy.update`,deployed_model:r,body:a},i);return}let o=await ut(e.client,r,a),s=o.output??o.data;if(t.quiet)F(r);else if(i===`text`){let e=[];s?.rpm_limit!==void 0&&e.push(`rpm_limit=${s.rpm_limit}`),s?.tpm_limit!==void 0&&e.push(`tpm_limit=${s.tpm_limit}`),F(`Updated ${r}${e.length?` (${e.join(`, `)})`:``}.`)}else I(o,i)}}),ks=w({description:`Delete a model deployment (must be STOPPED or FAILED)`,auth:`apiKey`,usageArgs:`--deployed-model <id> [--skip-precheck]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:`Deployed model identifier (required)`,required:!0},skipPrecheck:{type:`switch`,description:`Skip the local STOPPED/FAILED status precheck`}},exampleArgs:[`--deployed-model dep-...`,`--deployed-model dep-... --dry-run`],async run(e){let{settings:n,flags:r}=e,i=r.deployedModel,o=T(n.output);if(n.dryRun){I({action:`deploy.delete`,deployed_model:i},o);return}if(!r.skipPrecheck)try{let n=await _e(e.client,i),r=((n.output??n.data)?.status??``).toUpperCase();if(r&&r!==`STOPPED`&&r!==`FAILED`)throw new t(`Deployment ${i} is ${r}. Only STOPPED / FAILED deployments can be deleted. Stop it first via the platform console, or pass --skip-precheck to attempt deletion anyway.`,a.USAGE)}catch(e){if(e instanceof t)throw e}let s=await ie(e.client,i);n.quiet?F(i):o===`text`?F(`Deleted ${i}.`):I(s,o)}});const As={callerUacAccountId:{type:`string`,valueHint:`<id>`,description:`Caller UAC account ID`},namespaceId:{type:`string`,valueHint:`<id>`,description:`Product namespace ID (Token Plan default: namespace-1)`}},js={workspaceId:{type:`string`,valueHint:`<id>`,description:`Workspace ID (env: BAILIAN_WORKSPACE_ID, config: workspace_id)`}},Ms={cn:`modelstudio.cn-beijing.aliyuncs.com`,intl:`modelstudio.ap-southeast-1.aliyuncs.com`};function Ns(e){for(let[t,n]of Object.entries(l))if(e===n||e.startsWith(`${n}/`))return t;return`cn`}function Ps(e){return Ms[Ns(e)]??Ms.cn}function Fs(e,n,r){let i=n.workspaceId||e.workspaceId;if(!i)throw new t(`Missing workspace ID.
359
- Set via: --workspace-id flag, env: BAILIAN_WORKSPACE_ID, or config: ${r} config set workspace_id <id>`,a.USAGE);return i}function Is(e,t){t.callerUacAccountId&&(e.CallerUacAccountId=t.callerUacAccountId),t.namespaceId&&(e.NamespaceId=t.namespaceId)}function Ls(e,t,n){let r=_(n),i=Ps(e);return{host:i,endpoint:`https://${i}${t}${r?`?${r}`:``}`,queryString:r,queryParams:n}}async function Rs(e){let{client:t,baseUrl:n,action:r,path:i,method:a,queryParams:o}=e,{host:s}=Ls(n,i,o);return t.openApiQueryJson({host:s,path:i,action:r,version:`2026-02-10`,method:a,queryParams:o})}const zs=`/tokenplan/subscription/seat-detail`;var Bs=w({description:`List Token Plan subscription seat details`,auth:`openapi`,usageArgs:`[flags]`,flags:{pageNo:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Page size (default: 10)`},...As,status:{type:`array`,valueHint:`<status>`,description:`Seat status filter (repeatable): CREATING, NORMAL, LIMIT, RELEASE, STOP, REFUNDED`},statusListStr:{type:`string`,valueHint:`<json>`,description:`StatusList as JSON string, e.g. '["NORMAL"]'`},seatId:{type:`string`,valueHint:`<id>`,description:`Filter by seat ID`},seatType:{type:`string`,valueHint:`<type>`,description:`Seat tier: standard, pro, or max`},queryAssigned:{type:`string`,valueHint:`<bool>`,description:`Filter by assignment: true=assigned, false=unassigned`}},exampleArgs:[``,`--page-size 20 --status NORMAL`,`--query-assigned true --seat-type standard`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=Vs(n);if(t.dryRun){let{endpoint:t,queryParams:n}=Ls(e.client.baseUrl,zs,i);I({endpoint:t,query:n},r);return}let a=await Rs({client:e.client,baseUrl:e.client.baseUrl,action:`GetSubscriptionSeatDetails`,path:zs,method:`GET`,queryParams:i}),o=a.Data?.Items??[];t.quiet||r===`text`?Hs(o,a.Data?.Total,a.Data?.PageNo,a.Data?.PageSize):I(a,r)}});function Vs(e){let n={};if(e.pageNo!==void 0&&(n.PageNo=String(e.pageNo)),e.pageSize!==void 0&&(n.PageSize=String(e.pageSize)),Is(n,e),e.statusListStr&&(n.StatusListStr=e.statusListStr),e.status&&e.status.length>0&&(n.StatusList=e.status),e.seatId&&(n.SeatId=e.seatId),e.seatType&&(n.SeatType=e.seatType),typeof e.queryAssigned==`string`&&e.queryAssigned.length>0){let r=e.queryAssigned.toLowerCase();if(r!==`true`&&r!==`false`)throw new t(`--query-assigned must be 'true' or 'false'.`,a.USAGE);n.QueryAssigned=r}return n}function Hs(e,t,n,r){if(e.length===0){F(`No seats found.`);return}let i=[z(`SeatId`,18),z(`Type`,10),z(`Status`,10),z(`Assigned`,12),z(`Account`,20)].join(` `);F(i),F(`-`.repeat(i.length));for(let t of e)F([z(t.SeatId??`-`,18),z(t.SpecType??`-`,10),z(t.Status??`-`,10),z(t.AssignedStatus??`-`,12),z(t.AccountName??t.AccountId??`-`,20)].join(` `));t!==void 0&&(F(``),F(`Total: ${t}${n===void 0?``:` | Page: ${n}`}${r===void 0?``:` | PageSize: ${r}`}`))}const Us=`/tokenplan/api-keys`;var Ws=w({description:`Create a Token Plan API key for a seat`,auth:`openapi`,usageArgs:`--account-id <id> --workspace-id <id> [flags]`,flags:{accountId:{type:`string`,valueHint:`<id>`,description:`Target member account ID`,required:!0},...js,description:{type:`string`,valueHint:`<text>`,description:`API key description`},...As},exampleArgs:[`--account-id acc_123 --workspace-id ws_456`,`--account-id acc_123 --workspace-id ws_456 --description 'Dev key'`],async run(e){let{identity:t,settings:n,flags:r}=e,i=T(n.output),a=Fs(n,r,t.binName),o=Gs(r,{accountId:r.accountId,workspaceId:a});if(n.dryRun){let{endpoint:t,queryParams:n}=Ls(e.client.baseUrl,Us,o);I({endpoint:t,query:n},i);return}let s=await Rs({client:e.client,baseUrl:e.client.baseUrl,action:`CreateTokenPlanKey`,path:Us,method:`POST`,queryParams:o});n.quiet||i===`text`?Ks(s):I(s,i)}});function Gs(e,t){let n={};return n.AccountId=t.accountId,n.WorkspaceId=t.workspaceId,e.description&&(n.Description=e.description),Is(n,e),n}function Ks(e){let t=e.Data;if(!t){F(`API key created.`);return}F(`${z(`ApiKeyId`,14)} ${t.ApiKeyId??`-`}`),F(`${z(`MaskedApiKey`,14)} ${t.MaskedApiKey??`-`}`),t.Description&&F(`${z(`Description`,14)} ${t.Description}`),t.PlainApiKey&&(F(``),F(`PlainApiKey (shown once): ${t.PlainApiKey}`))}const qs=`/tokenplan/subscription/seat-assignments`;var Js=w({description:`Batch assign Token Plan seats to members`,auth:`openapi`,usageArgs:`--workspace-id <id> --seat-type <type> --account-id <id> [flags]`,flags:{...js,seatType:{type:`string`,valueHint:`<type>`,description:`Seat tier: standard, pro, or max`,required:!0},accountId:{type:`array`,valueHint:`<id>`,description:`Target member account ID (repeatable)`},...As,locale:{type:`string`,valueHint:`<locale>`,description:`Language: zh-CN or en-US`}},exampleArgs:[`--workspace-id ws_456 --seat-type standard --account-id acc_123`,`--workspace-id ws_456 --seat-type pro --account-id acc_1 --account-id acc_2`],validate:e=>e.accountId&&e.accountId.length>0?void 0:`Missing required flag: --account-id`,async run(e){let{identity:t,settings:n,flags:r}=e,i=T(n.output),a=Ys(r,Fs(n,r,t.binName));if(n.dryRun){let{endpoint:t,queryParams:n}=Ls(e.client.baseUrl,qs,a);I({endpoint:t,query:n},i);return}let o=await Rs({client:e.client,baseUrl:e.client.baseUrl,action:`BatchAssignSeats`,path:qs,method:`POST`,queryParams:a});n.quiet||i===`text`?F(`Seats assigned successfully.`):I(o,i)}});function Ys(e,t){let n={};return n.WorkspaceId=t,e.seatType&&(n.SeatType=e.seatType),Is(n,e),e.locale&&(n.Locale=e.locale),e.accountId&&e.accountId.length>0&&(n.AccountIds=e.accountId),n}const Xs=`/tokenplan/organization/member-additions`;var Zs=w({description:`Add a member to a Token Plan organization`,auth:`openapi`,usageArgs:`--account-name <name> --org-id <id> [flags]`,flags:{accountName:{type:`string`,valueHint:`<name>`,description:`Member display name`,required:!0},orgId:{type:`string`,valueHint:`<id>`,description:`Organization ID`,required:!0},orgRoleCode:{type:`string`,valueHint:`<code>`,description:`Organization role: ORG_ADMIN or ORG_MEMBER (default: ORG_MEMBER)`},specType:{type:`string`,valueHint:`<type>`,description:`Seat tier to assign on creation: standard, pro, or max`},...As},exampleArgs:[`--account-name dev_user --org-id org_123`,`--account-name admin_user --org-id org_123 --org-role-code ORG_ADMIN`,`--account-name member1 --org-id org_123 --spec-type standard`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=Qs(n);if(t.dryRun){let{endpoint:t,queryParams:n}=Ls(e.client.baseUrl,Xs,i);I({endpoint:t,query:n},r);return}let a=await Rs({client:e.client,baseUrl:e.client.baseUrl,action:`AddOrganizationMember`,path:Xs,method:`POST`,queryParams:i});t.quiet||r===`text`?$s(a):I(a,r)}});function Qs(e){let t={};return e.accountName&&(t.AccountName=e.accountName),e.orgId&&(t.OrgId=e.orgId),t.OrgRoleCode=e.orgRoleCode||`ORG_MEMBER`,e.specType&&(t.SpecType=e.specType),Is(t,e),t}function $s(e){let t=e.Data;if(!t){F(`Member added.`);return}F(`${z(`AccountId`,14)} ${t.AccountId??`-`}`),F(`${z(`SeatAssigned`,14)} ${String(t.SeatAssigned??`-`)}`)}const $={loginInfo:`zeldaEasy.cornerstone-portal.cs-console.loginInfo`,initSpace:`zeldaEasy.bailian-dash-workspace.space.initSpace`,queryBuyResult:`zeldaEasy.bailian-commerce.bill.queryBuyPostpaidResult`,commodityOrderInfo:`zeldaEasy.bailian-commerce.bill.postpaidCommodityOrderInfo`,buyCommodity:`zeldaEasy.bailian-commerce.bill.buyPostpaidCommodity`},ec={accessKeyId:{type:`string`,valueHint:`<id>`,description:`Alibaba Cloud Access Key ID`},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:`Alibaba Cloud Access Key Secret`},securityToken:{type:`string`,valueHint:`<token>`,description:`Alibaba Cloud STS Security Token (optional)`}},tc=1e3;function nc(e){return new Promise(t=>setTimeout(t,e))}function rc(e){return e?.data?.DataV2?.data?.data}function ic(e){let t=e?.data?.data;if(!Array.isArray(t)||t.length===0)return;let n=(t.find(e=>e?.defaultAgent===!0)??t[0])?.tenantId,r=typeof n==`string`?Number(n):n;return typeof r==`number`&&Number.isFinite(r)?r:void 0}var ac=w({description:`Initialize Bailian workspace and activate postpaid services`,auth:`none`,usageArgs:`--access-key-id <id> --access-key-secret <secret> [--security-token <token>]`,flags:ec,exampleArgs:[`--access-key-id LTAIxxxxx --access-key-secret xxxxx`],async run(e){let{settings:n,flags:r}=e,i=T(n.output);if(n.dryRun){I({apis:[{step:0,api:`GenerateCLIAccessToken`,description:`Generate CLI access token from AK/SK`},{step:1,api:$.loginInfo,description:`Check login & workspace status`},{step:2,api:$.initSpace,description:`Initialize workspace (if needed)`},{step:3,api:`CreateUser`,description:`Create console user via BailianControl OpenAPI (CreateUser)`},{step:4,api:`ListWorkspaces`,description:`List workspaces to resolve agentId`},{step:5,api:`ResetPolicies4Agent`,description:`Authorize user permissions`},{step:6,api:$.queryBuyResult,description:`Query postpaid order status`},{step:7,api:$.commodityOrderInfo,description:`Query commodity activation status`},{step:8,api:$.buyCommodity,description:`Activate postpaid commodities (if needed)`}]},i);return}let{accessKeyId:o,accessKeySecret:s}=r;if(!o||!s)throw new t(`workspace init requires --access-key-id and --access-key-secret.`,a.USAGE);let c=r.securityToken||void 0,l=(await pe({identity:e.identity,settings:n,baseUrl:e.client.baseUrl,accessKeyId:o,accessKeySecret:s,securityToken:c})).cliAccessToken;if(!l)throw new t(`Failed to generate CLI access token from AK/SK.`,a.GENERAL);let u=se(n),d={region:u.consoleRegion,site:u.consoleSite,...u.consoleSwitchAgent==null?{}:{switchAgent:u.consoleSwitchAgent},token:l},f=n.verbose,p=async(e,r={})=>{f&&process.stderr.write(`> ${e}\n`);try{let t=await y(d,n.timeout,{api:e,data:r},n);return f&&process.stderr.write(`< ${JSON.stringify(t)}\n`),t}catch(e){if(f){let n=e instanceof t?e.rawResponse??e.message:String(e);process.stderr.write(`< ERROR: ${n}\n`)}throw e}};F(`Checking workspace status...`);let m=rc(await p($.loginInfo));m?.spaceInited===!0?F(`Workspace already initialized.`):(F(`Initializing workspace...`),await p($.initSpace),F(`Workspace initialized.`));let h=m?.aliyun?.uid;if(typeof h!=`string`||h.length===0)throw new t(`Console login info did not include aliyun.uid.`,a.GENERAL);let g={identity:e.identity,settings:n,baseUrl:e.client.baseUrl,regionId:u.consoleRegion,accessKeyId:o,accessKeySecret:s,securityToken:c};try{await S({...g,reqDTO:{outerKey:h,nickName:h,userName:h}})}catch(e){if(!(e instanceof t)||!/already exists/i.test(e.message))throw e;F(`Console user already exists, continuing.`)}F(`Resolving workspace agent...`);let _=ic(await Ae(g));if(_==null)throw new t(`Could not resolve agentId from ListWorkspaces response.`,a.GENERAL,`Re-run with --verbose to inspect the ListWorkspaces response body.`);F(`Authorizing user permissions...`),await et({...g,outerKey:h,agentId:_,policyIndexList:[1]}),await oc(p,i)}});async function oc(e,n){F(`Checking service activation status...`);let r;for(let t=0;t<20;t++){let n=rc(await e($.queryBuyResult));if(r=typeof n==`string`?n:n?.result,r!==`buying`)break;t===0&&F(`Service activation in progress, polling...`),await nc(tc)}if(r===`fail`)throw new t(`Service activation failed.`,a.GENERAL);if(r===`success`){await lc(e,n);return}await cc(e,n)}function sc(e){let t=rc(e);return Array.isArray(t)?t:[]}async function cc(e,t){let n=sc(await e($.commodityOrderInfo)),r=n.filter(e=>e.status===11);if(r.length>0){F(`Warning: Some services are overdue:`);for(let e of r)F(` - ${e.commodityCode}`)}let i=n.filter(e=>e.status===1);if(i.length>0){F(`Activating ${i.length} postpaid services...`),await e($.buyCommodity),await lc(e,t);return}I({status:`ready`,activeServices:n.filter(e=>e.status===10).map(e=>e.commodityCode)},t)}async function lc(e,n){F(`Waiting for services to activate...`);for(let t=0;t<20;t++){let t=sc(await e($.commodityOrderInfo));if(t.filter(e=>e.status!==10&&e.status!==11).length===0){let e=t.filter(e=>e.status===11);if(e.length>0){F(`Warning: Some services are overdue:`);for(let t of e)F(` - ${t.commodityCode}`)}I({status:`ready`,activeServices:t.filter(e=>e.status===10).map(e=>e.commodityCode)},n);return}await nc(tc)}throw new t(`Timed out waiting for services to activate.`,a.TIMEOUT)}var uc=w({description:`Install or upgrade an allowlisted Command Pack`,auth:`none`,usageArgs:`--package <name[@version]>`,flags:{package:{type:`string`,valueHint:`<name[@version]>`,description:`Allowlisted Command Pack package and optional version or tag`,required:!0}},exampleArgs:[`--package @ali/bailian-plugin-agent`,`--package @ali/bailian-plugin-agent@beta`],async run(e){I({installed:await e.commandPacks.install(e.flags.package)},T(e.settings.output))}}),dc=w({description:`Link an allowlisted local Command Pack for development`,auth:`none`,usageArgs:`--path <directory>`,flags:{path:{type:`string`,valueHint:`<directory>`,description:`Local Command Pack package directory`,required:!0}},exampleArgs:[`--path ../bailian-plugin-agent`],async run(e){I({linked:await e.commandPacks.link(e.flags.path)},T(e.settings.output))}}),fc=w({description:`List installed Command Packs and their load status`,auth:`none`,exampleArgs:[``,`--output json`],async run(e){let t=await e.commandPacks.list(),n=T(e.settings.output);if(n===`json`){I({command_packs:t},n);return}if(t.length===0){F(`No Command Packs installed.`);return}let r=t.map(e=>[e.name,e.version??`-`,e.source,e.status,e.commands.join(`, `)||e.error||`-`]);for(let e of L([`NAME`,`VERSION`,`SOURCE`,`STATUS`,`COMMANDS / ERROR`],r))F(e)}}),pc=w({description:`Remove an installed Command Pack`,auth:`none`,usageArgs:`--name <package>`,flags:{name:{type:`string`,valueHint:`<package>`,description:`Allowlisted Command Pack package name`,required:!0}},exampleArgs:[`--name @ali/bailian-plugin-agent`],async run(e){await e.commandPacks.remove(e.flags.name),I({removed:e.flags.name},T(e.settings.output))}});export{La as advisorRecommend,Hr as appCall,Wr as appList,An as authGenerateAccessToken,Dn as authLogin,kn as authLogout,On as authStatus,Lr as configAgent,gr as configList,hr as configSet,mr as configShow,wr as configUi,_r as configUse,Oi as consoleCall,No as datasetDelete,Mo as datasetGet,jo as datasetList,Ao as datasetUpload,Fo as datasetValidate,Ss as deployAudioCreate,ks as deployDelete,Ts as deployGet,Cs as deployImageCreate,ws as deployList,Es as deployModels,Ds as deployScale,xs as deployTextCreate,Os as deployUpdate,Di as fileUpload,Yo as finetuneAudioCreate,$o as finetuneCancel,hs as finetuneCapability,as as finetuneCheckpoints,es as finetuneDelete,os as finetuneExport,Qo as finetuneGet,Xo as finetuneImageCreate,Zo as finetuneList,is as finetuneLogs,Jo as finetuneTextCreate,ds as finetuneWatch,Yn as imageEdit,Un as imageGenerate,oi as knowledgeChat,Qr as knowledgeRetrieve,ei as knowledgeSearch,pi as mcpCall,hi as mcpList,gi as mcpTools,Gr as memoryAdd,Yr as memoryDelete,qr as memoryList,Xr as memoryProfileCreate,Zr as memoryProfileGet,Kr as memorySearch,Jr as memoryUpdate,Ya as modelList,_a as pipelineRun,Sa as pipelineValidate,uc as pluginInstall,dc as pluginLink,fc as pluginList,pc as pluginRemove,ko as quotaCheck,So as quotaHistory,co as quotaList,ho as quotaRequest,_i as searchWeb,Ti as speechRecognize,Si as speechSynthesize,Nn as textChat,Bn as textOmni,Zs as tokenPlanAddMember,Js as tokenPlanAssignSeats,Ws as tokenPlanCreateKey,Bs as tokenPlanListSeats,Vr as update,Ji as usageFree,$i as usageFreetier,ma as usageStats,ha as usageSummary,rr as videoDownload,er as videoEdit,$n as videoGenerate,tr as videoRef,nr as videoTaskGet,cr as visionDescribe,ac as workspaceInit,eo as workspaceList};
351
+ `)}var ls=T({description:`View quota change history`,auth:`console`,usageArgs:`[flags]`,flags:{page:{type:`string`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`string`,valueHint:`<n>`,description:`Page size (default: 10)`},model:{type:`string`,valueHint:`<model>`,description:`Filter by model name`}},exampleArgs:[``,`--page 2`,`--page-size 20`,`--model qwen-turbo`,`--output json`],async run(e){let{identity:n,settings:r,flags:i}=e,o=Number(i.page)||1,s=Number(i.pageSize)||10,c=i.model||void 0,l=E(r.output),u={input:{pageNo:o,pageSize:s}};if(r.dryRun){I({api:rs,data:u},l);return}let d;try{d=await e.client.console(rs,u)}catch(e){throw e instanceof t&&e.message.includes(`NotLogined`)?new t(`session expired.`,a.AUTH,`Run \`${n.binName} auth login --console\` to re-authenticate.`):e}let f=as(d),p=f.records??[],m=f.items??p.length;if(c&&(p=p.filter(e=>e.deployedModel===c)),l===`json`){I({records:p.map(e=>({model:e.deployedModel,tokenLimit:e.usageLimit,appliedAt:os(e.gmtCreate)})),total:c?p.length:m},l);return}if(p.length===0){process.stdout.write(`No quota change history found.
352
+ `);return}cs(p,c?p.length:m)}});const us=`zeldaEasy.bailian-telemetry.monitor.getMonitorData`;function ds(e,t){if(!e)return 0;let n=e.count_limit_period||t;return n?Math.floor(e.count_limit*60/n):0}function fs(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}async function ps(e){let t=[],n=1;for(;;){let r=pt(await e.console(c,{input:{pageNo:n,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}})),i=r.list??[],a=r.total??0;if(t.push(...i),t.length>=a||i.length===0)break;n++}return t}async function ms(e,n,r){let i=Date.now(),o=i-r*60*1e3;try{let t=pt(await e.console(us,{reqDTO:{monitorType:`Advanced`,metricFilters:[{aggMethod:`sum_pm`,metricName:`model_total_amount`},{aggMethod:`sum_pm`,metricName:`model_call_count`}],labelFilters:{resourceId:n,resourceType:`model`},startTime:o,endTime:i}})),r=t.data??t;if(!Array.isArray(r))return{rpm:0,tpm:0};let a=0,s=0;for(let e of r){if(e.aggMethod!==`sum_pm`||!e.points?.length)continue;let t=e.points[e.points.length-1].value??0;e.metricName===`model_call_count`&&(a=Math.round(t)),e.metricName===`model_total_amount`&&(s=Math.round(t))}return{rpm:a,tpm:s}}catch(e){if(e instanceof t&&e.exitCode===a.AUTH)throw e;return{rpm:-1,tpm:-1}}}function hs(e){let t=M(process.stdout),n=[`Model`,`RPM Used/Limit`,`TPM Used/Limit`,`Status`,`RPM Left`,`TPM Left`],r=e.map(e=>e.rpmQuotaLeft),i=e.map(e=>e.rpmQuotaLabel),a=e.map(e=>e.tpmQuotaLeft),o=e.map(e=>e.tpmQuotaLabel),s=Ft({headers:n,rows:e.map(e=>{let t=e.rpmUsage<0?`-`:`${e.rpmUsage}/${e.rpmLimit}`,n=e.tpmUsage<0?`-`:`${e.tpmUsage}/${e.tpmLimit}`,r=Math.max(e.rpmLimit>0?e.rpmUsage/e.rpmLimit*100:0,e.tpmLimit>0?e.tpmUsage/e.tpmLimit*100:0),i=e.rpmUsage<0?`-`:r>=100?`Rate Limited`:r>=80?`Near limit`:`Normal`;return[e.model,t,n,i,``,``]}),align:[`left`,`right`,`right`,`left`,`left`,`left`],barColumns:[{index:4,percents:r,labels:i,width:15},{index:5,percents:a,labels:o,width:15}],cellColor:(e,n,r)=>{if(n===3){if(r===`Rate Limited`)return t.red(r);if(r===`Near limit`)return t.yellow(r);if(r===`Normal`)return t.green(r)}}});for(let e of s)process.stdout.write(e+`
353
+ `)}var gs=T({description:`Check current usage against rate limits`,auth:`console`,usageArgs:`[--model <model>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name(s), comma-separated`},period:{type:`string`,valueHint:`<minutes>`,description:`Query usage for the last N minutes (default: 2)`}},exampleArgs:[``,`--model qwen3.6-plus`,`--period 5`,`--model qwen3.6-plus,qwen-turbo`,`--output json`],validate:e=>(Number(e.period)||2)<1?`--period must be at least 1 minute.`:void 0,async run(e){let{settings:t,flags:n}=e,r=n.model||void 0,i=Number(n.period)||2,a=E(t.output);if(t.dryRun){I({apis:[c,us],...se(t)},a);return}let o=await ps(e.client);if(r){let e=new Set(r.split(`,`).map(e=>e.trim()).filter(Boolean));o=o.filter(t=>e.has(t.model))}if(o=o.filter(e=>e.qpmInfo),o.length===0){process.stdout.write(`No models found.
354
+ `);return}let s=await Promise.all(o.map(t=>ms(e.client,t.model,i))),l=o.map((e,t)=>{let n=e.qpmInfo,r=n[`model-default`],i=n[`user-spec`],a=ds(i,r?.count_limit_period)||ds(r),o=fs(i,r?.usage_limit_period)||fs(r),c=s[t].rpm,l=s[t].tpm,u=null,d=null;c>=0&&a>0&&(u=Math.max(0,100-c/a*100),d=u.toFixed(1)+`%`);let f=null,p=null;return l>=0&&o>0&&(f=Math.max(0,100-l/o*100),p=f.toFixed(1)+`%`),{model:e.model,rpmUsage:c,rpmLimit:a,tpmUsage:l,tpmLimit:o,rpmQuotaLeft:u,tpmQuotaLeft:f,rpmQuotaLabel:d,tpmQuotaLabel:p}});if(a===`json`){I(l,a);return}hs(l)}}),_s=T({description:`Upload a dataset file (.jsonl or .zip) to Bailian`,auth:`apiKey`,usageArgs:`--file <path> [--purpose <name>] [--schema <chatml|dpo|cpt|tts|image>] [--no-validate] [--full-validate]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Local dataset file (.jsonl or .zip; ≤300MB text, ≤1GB image)`,required:!0},purpose:{type:`string`,valueHint:`<name>`,description:`Dataset purpose tag (default: "fine-tune"; e.g. "evaluation")`},schema:{type:`string`,valueHint:`<s>`,description:`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), "cpt" (raw text), "tts" (audio), or "image" (image generation). Default auto-detects per record.`},noValidate:{type:`switch`,description:`Skip the local JSONL pre-flight check (not recommended)`},fullValidate:{type:`switch`,description:`JSON.parse every line instead of sampling (slower)`}},exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file audio.zip --schema tts`,`--file eval.jsonl --purpose evaluation`,`--file train.jsonl --full-validate`,`--file train.jsonl --no-validate`],notes:[`Supports .jsonl (text) and .zip (audio/image archives with a data.jsonl`,`manifest). Five record schemas are recognized: chatml = {messages:[...]}`,`(SFT); dpo = {messages:[...], chosen, rejected}; cpt = {text:"..."}`,`(continual pre-training, raw text); tts = {wav_fn:"train/xxx.wav",`,`text:"..."} (audio fine-tuning); image = {img_path:"..."} (image`,`generation). With no --schema, a record carrying wav_fn is validated as`,`TTS, img_path as image, chosen/rejected as DPO, text (no messages) as CPT,`,`otherwise ChatML. Upload cap: 300MB text, 1GB image. Upload uses the`,`OpenAI-compatible /compatible-mode/v1/files endpoint so the purpose tag is`,`persisted (the DashScope-native /api/v1/files drops it).`],async run(e){let{identity:n,settings:r,flags:i}=e,c=i.file,l=i.purpose||`fine-tune`,u=Ye(i.schema);if(u===`video`)throw new t(`--schema video is not supported.`,a.USAGE,`Supported schemas: chatml, dpo, cpt, tts, image.`);let d=E(r.output),f=u===`image`;if(!i.noValidate){let e=f?s:o,l=await _t(c,{fullValidate:i.fullValidate,schema:u,maxBytes:e});if(!l.valid){let e=[`Dataset validation failed for ${c}`,...l.errors.slice(0,10).map(me)];throw l.errors.length>10&&e.push(` … and ${l.errors.length-10} more error(s).`),e.push(``,`Hint: re-run \`${n.binName} dataset validate --file <path>\` for the full report,`,` or pass --no-validate to skip this check at your own risk.`),new t(e.join(`
355
+ `),a.GENERAL)}if(l.warnings.length>0&&!r.quiet){process.stderr.write(`Dataset validation passed with ${l.warnings.length} warning(s):\n`);for(let e of l.warnings.slice(0,5))process.stderr.write(`${me(e)}\n`);l.warnings.length>5&&process.stderr.write(` … and ${l.warnings.length-5} more.\n`)}}if(r.dryRun){I({action:`dataset.upload`,file:c,purpose:l,max_bytes:f?s:o,validate:!i.noValidate,schema:u??`auto`},d);return}let p=await ht(e.client,{filePath:c,purpose:l});r.quiet?F(p.file_id):d===`text`?F(`Uploaded ${p.name} → file_id=${p.file_id}`):I(p,d)}}),vs=T({description:`List uploaded dataset files`,auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--purpose <name>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 10, max 100)`},purpose:{type:`string`,valueHint:`<name>`,description:`Filter by purpose (e.g. "fine-tune", "evaluation"). Omit to list all.`}},exampleArgs:[``,`--purpose fine-tune`,`--purpose evaluation --page-size 20`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=E(t.output);if(t.dryRun){I({action:`dataset.list`,page:n.page,page_size:n.pageSize,purpose:n.purpose},r);return}let i=await Fe(e.client,{pageNo:n.page,pageSize:n.pageSize,purpose:n.purpose||void 0}),a=i.data?.files??[],o=i.data?.total,s=a.map(e=>({file_id:e.file_id??``,name:e.name??``,size:e.size===void 0?`?`:`${(e.size/1024).toFixed(1)} KB`,purpose:e.purpose??``}));if(r===`json`){I({items:s,total:o},r);return}if(s.length===0){F(`No dataset files found.`);return}let c=[`FILE_ID`,`NAME`,`SIZE`,`PURPOSE`],l=s.map(e=>[e.file_id,e.name,e.size,e.purpose]);for(let e of L(c,l))F(e);o!==void 0&&F(`\nTotal: ${o}`)}}),ys=T({description:`Get details of a single dataset file`,auth:`apiKey`,usageArgs:`--file-id <id>`,flags:{fileId:{type:`string`,valueHint:`<id>`,description:`Dataset file ID (required)`,required:!0}},exampleArgs:[`--file-id file-xxx`,`--file-id file-xxx --output json`],async run(e){let{settings:t,flags:n}=e,r=n.fileId,i=E(t.output);if(t.dryRun){I({action:`dataset.get`,file_id:r},i);return}let a=(await ve(e.client,r)).data;if(!a){F(`No data returned for ${r}`);return}let o=a.size===void 0?`?`:`${(a.size/1024).toFixed(1)} KB`,s={file_id:a.file_id??r,name:a.name??``,size:o,md5:a.md5??``,purpose:a.purpose??``,created_at:a.gmt_create??``,description:a.description??``};if(i===`json`){I(s,i);return}F(`file_id: ${s.file_id}`),F(`name: ${s.name}`),F(`size: ${s.size}`),s.md5&&F(`md5: ${s.md5}`),s.purpose&&F(`purpose: ${s.purpose}`),s.created_at&&F(`created_at: ${s.created_at}`),s.description&&F(`description: ${s.description}`)}}),bs=T({description:`Delete a dataset file by ID`,auth:`apiKey`,usageArgs:`--file-id <id>`,flags:{fileId:{type:`string`,valueHint:`<id>`,description:`Dataset file ID (required)`,required:!0}},exampleArgs:[`--file-id file-id-xxx`,`--file-id file-id-xxx --dry-run`],async run(e){let{settings:t,flags:n}=e,r=n.fileId,i=E(t.output);if(t.dryRun){I({action:`dataset.delete`,file_id:r},i);return}let a=await re(e.client,r);t.quiet||i===`text`?F(`Deleted ${r}.`):I(a,i)}});function xs(e){let t=[];return e.stats.totalRecords!==void 0&&t.push(`records: ${e.stats.totalRecords}`),e.stats.sampledRecords!==void 0&&t.push(`sampled: ${e.stats.sampledRecords}`),e.stats.bytes!==void 0&&t.push(`bytes: ${e.stats.bytes}`),e.stats.durationMs!==void 0&&t.push(`took: ${e.stats.durationMs}ms`),t}var Ss=T({description:`Locally validate a dataset file (.jsonl or .zip) without uploading`,auth:`none`,usageArgs:`--file <path> [--full-validate] [--schema <chatml|dpo|cpt|tts|image>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Local dataset file (.jsonl or .zip)`,required:!0},fullValidate:{type:`switch`,description:`JSON.parse every line instead of sampling (slower)`},schema:{type:`string`,valueHint:`<s>`,description:`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), "cpt" (raw text), "tts" (audio), or "image" (image generation). Default auto-detects per record.`}},exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file audio.zip --schema tts`,`--file eval.jsonl --full-validate`,`--file train.jsonl --output json`],notes:[`Default scan: every line gets a structural check, then ~160 lines (front 50,`,`evenly spaced 100, last 10) are JSON.parsed against the active schema.`,`Schemas: chatml = {messages:[...]} (SFT); dpo = {messages:[...], chosen,`,`rejected}; cpt = {text:"..."} (continual pre-training, raw text);`,`tts = {wav_fn:"train/xxx.wav", text:"..."} (audio fine-tuning);`,`image = {img_path:"..."} (image generation). With no --schema, a record`,`carrying wav_fn is validated as TTS, img_path as image, chosen/rejected`,`as DPO, text (no messages) as CPT, otherwise ChatML. Pass --schema to`,`require a specific shape on every record. ZIP archives (.zip) are`,`validated structurally (data.jsonl present, media references resolve) in`,`addition to per-record content checks. Use --full-validate to JSON.parse`,`every line.`],async run(e){let{settings:n,flags:r}=e,i=r.file,o=Ye(r.schema);if(o===`video`)throw new t(`--schema video is not supported.`,a.USAGE,`Supported schemas: chatml, dpo, cpt, tts, image.`);let s=E(n.output);if(n.dryRun){I({action:`dataset.validate`,file:i,full:r.fullValidate,schema:o??`auto`},s);return}let c=await _t(i,{fullValidate:r.fullValidate,schema:o});if(s===`json`)I(c,s);else if(n.quiet)F(c.valid?`ok`:`fail`);else{F(`Dataset validation ${c.valid?`PASSED`:`FAILED`} for ${c.filePath}`);let e=xs(c);if(e.length&&F(` ${e.join(` · `)}`),c.errors.length){F(`Errors (${c.errors.length}):`);for(let e of c.errors.slice(0,20))F(me(e));c.errors.length>20&&F(` … and ${c.errors.length-20} more.`)}if(c.warnings.length){F(`Warnings (${c.warnings.length}):`);for(let e of c.warnings.slice(0,10))F(me(e));c.warnings.length>10&&F(` … and ${c.warnings.length-10} more.`)}}if(!c.valid)throw new t(`Dataset validation failed: ${c.errors.length} error(s).`,a.GENERAL)}});function Cs(e){return Wt(e)&&Jt(e).isFile()}async function ws(e,n,r,i,o,s,c,l){let u=r.split(`,`).map(e=>e.trim()).filter(Boolean);if(u.length===0)throw new t(`--${i} must contain at least one entry.`,a.USAGE);let d=[],f=[],p,m,h=!0;for(let r of u){if(!Cs(r)){d.push(r),h=!1;continue}if(d.push(r),f.push(r),e.dryRun)continue;let i=l&&l.path===r?l.modality:s,u=await o.validate(r,i,{model:c});if(!u.valid){let e=[`Dataset validation failed for ${r}`,...u.errors.slice(0,10).map(me)];throw u.errors.length>10&&e.push(` … and ${u.errors.length-10} more error(s).`),e.push(``,`Hint: re-run \`${n} dataset validate --file <path>\` for the full report,`,` or upload manually with \`${n} dataset upload --no-validate\` and`,` pass the resulting file-id here.`),new t(e.join(`
356
+ `),a.GENERAL)}if(u.warnings.length>0&&!e.quiet){process.stderr.write(`Dataset validation passed with ${u.warnings.length} warning(s) for ${r}:\n`);for(let e of u.warnings.slice(0,5))process.stderr.write(`${me(e)}\n`);u.warnings.length>5&&process.stderr.write(` … and ${u.warnings.length-5} more.\n`)}let g=u.stats.totalRecords;typeof g==`number`&&(m=(m??0)+g),p===void 0&&(p=Jt(r).size)}return{fileIds:d,localPaths:f,firstSize:p,recordCount:h?m:void 0}}async function Ts(e,n,r,i,o){let s=[];for(let[c,l]of r.fileIds.entries()){if(!Cs(l))continue;let u=await ht(e,{filePath:l,purpose:i});if(!u.file_id)throw new t(`Upload of ${l} succeeded but no file_id was returned.`,a.GENERAL);s.push(u),r.fileIds[c]=u.file_id,n.quiet||process.stderr.write(`Uploaded ${Xt(l)} → ${u.file_id} (auto from --${o})\n`)}return s}const Es={model:{type:`string`,valueHint:`<model>`,description:`Base model to fine-tune`,required:!0},datasets:{type:`string`,valueHint:`<ids|paths>`,description:`Comma-separated dataset file IDs or local paths (.jsonl for text, .zip for audio/image). Local paths are uploaded (validated) first, then their file-ids are used.`,required:!0},validations:{type:`string`,valueHint:`<ids|paths>`,description:`Comma-separated validation dataset file IDs or local paths (auto-uploaded like --datasets).`},modelName:{type:`string`,valueHint:`<name>`,description:`Output model name (after training)`},suffix:{type:`string`,valueHint:`<text>`,description:`Output suffix appended by the platform (finetuned_output_suffix)`}},Ds={...Es,trainingType:{type:`string`,valueHint:`<t>`,description:`Training type: ${f.join(` | `)} (default: ${r}). Mapping to the server happens at the interface boundary (e.g. sft-lora -> efficient_sft, dpo -> dpo_full).`},nEpochs:{type:`number`,valueHint:`<n>`,description:`Number of epochs (default: 3)`},batchSize:{type:`number`,valueHint:`<n>`,description:`Per-device batch size (clamped to [8, 1024]). Auto-set to 8 for small datasets (<100KB)`},learningRate:{type:`string`,valueHint:`<str>`,description:`Learning rate as a string to preserve precision (e.g. "1.6e-5")`},maxLength:{type:`number`,valueHint:`<n>`,description:`Max sequence length`}},Os={...Es},ks={...Es,generationType:{type:`string`,choices:[`t2i`,`i2i`],valueHint:`<t2i|i2i>`,description:`Generation type: t2i (default) | i2i. Sets generation_type/max_pixels. Required to train I2I from a file-id or with --dry-run (local data auto-detects input_img).`},learningRate:{type:`string`,valueHint:`<str>`,description:`Learning rate as a string to preserve precision (e.g. "3e-5")`}},As=[`Creating a job uploads any local datasets and consumes training quota.`,`Use --dry-run to preview the request body without submitting.`,"--datasets / --validations accept either file-ids (from `dataset upload`)",`or local paths. Local paths are validated and uploaded first, then their`,`file-ids are submitted — a one-step upload-and-train.`],js=[...As,"Training-type values use the `<method>` / `<method>-lora` convention:",`sft (full) | sft-lora (LoRA) | dpo (full) | dpo-lora (LoRA) | cpt. These map`,`to the server's training_type at the interface boundary, so the rest of the`,`CLI never sees the raw server strings.`,`Before submitting (non dry-run) the job, the model's training capability is`,`checked via listFoundationModels (no console login required); an unsupported`,`training type fails fast with the list the model actually supports.`,`n_epochs defaults to 3. Other hyper-parameters are platform defaults unless set.`,`Learning rate is forwarded as a string to avoid JSON-number precision loss.`,`Pre-submit gate: if the training dataset's sample count is not greater`,`than batch_size, the job is rejected before upload or quota consumption`,`(the platform would otherwise fail ~10 min in, after data processing).`],Ms=[...As,`Audio TTS training runs sft-lora (efficient_sft) with fixed CosyVoice`,`hyper-parameter defaults; there are no training-type or hyper-parameter`,`knobs to set.`],Ns=[...As,`Image generation training runs sft-lora (efficient_sft) with fixed defaults;`,`only --learning-rate is overridable. T2I vs I2I is declared with`,`--generation-type (default t2i), which sets generation_type/max_pixels. For`,`local data the type is auto-detected (records with input_img train I2I);`,`pass --generation-type explicitly to train I2I from a file-id or in --dry-run.`];async function Ps(e,n){let{identity:i,settings:o}=n,s=n.flags,c=s.model,l=s.datasets;if(e===`audio`){let e=l.split(`,`).map(e=>e.trim()).filter(Boolean);if(e.length>1)throw new t(`Audio (TTS) fine-tuning accepts exactly one training file, got ${e.length}.`,a.USAGE,`Merge your recordings into a single .zip (or pass one file-id).`)}let u=s.trainingType||r;if(!ke(u))throw new t(`--training-type "${u}" is not supported.`,a.USAGE,`Supported values: ${f.join(`, `)} (default: ${r}).`);let d=we(u),p=l.split(`,`).map(e=>e.trim()).find(e=>Cs(e)),m=e;if(e===`image`){let e=s.generationType;(e===`i2i`||!e&&p&&!o.dryRun&&await oe(p)===`image-i2i`)&&(m=`image-i2i`)}let h=await ws(o,i.binName,l,`datasets`,d,m,c,p?{path:p,modality:m}:void 0),g=h.fileIds,_=s.validations?await ws(o,i.binName,s.validations,`validations`,d,m,c):void 0,v=_?.fileIds,y=s.modelName,b=s.suffix,x=d.resolveHyperParameters(m,s);if(s.batchSize!==void 0&&x.batch_size!==void 0&&!o.quiet&&!d.shouldSkipGate(`batch_size`,m)){let e=s.batchSize;x.batch_size!==e&&process.stderr.write(`warning: --batch-size ${e} clamped to ${x.batch_size} (server range [8, 1024] for the common training types).\n`)}if(s.batchSize!==void 0&&!o.quiet&&d.shouldSkipGate(`batch_size`,m)){let e=s.batchSize;x.batch_size!==void 0&&x.batch_size!==e&&process.stderr.write(`warning: --batch-size ${e} ignored for ${m} training (model uses a fixed batch_size of ${x.batch_size}).\n`)}if(m===`text`&&x.batch_size===void 0&&!o.dryRun){let e=h.firstSize??0;if(e===0)try{e=(await ve(n.client,g[0])).data?.size??0}catch{}e>0&&e<100*1024&&(x.batch_size=8)}if(!o.dryRun&&h.recordCount!==void 0&&!d.shouldSkipGate(`batch_size`,m)){let e=x.batch_size??16,n=Ze({recordCount:h.recordCount,batchSize:e});if(!n.ok&&n.issue)throw new t(n.issue.message,a.GENERAL,n.hint)}if(!o.dryRun&&!d.shouldSkipCapabilityCheck(m)){let e;try{e=await le(o,c)}catch(e){o.quiet||process.stderr.write(`warning: model capability lookup failed (${e.message}); proceeding without local pre-flight.
357
+ `)}if(e&&!ze(e).includes(u)){let n=ze(e);throw new t(`Model "${c}" does not support training type "${u}".`,a.USAGE,n.length?`This model supports: ${n.join(`, `)}.`:`This model reports no supported training types.`)}}o.dryRun||(await Ts(n.client,o,h,`fine-tune`,`datasets`),_&&await Ts(n.client,o,_,`fine-tune`,`validations`));let S={model:c,training_file_ids:g,training_type:d.serverTrainingType,hyper_parameters:x};v&&v.length>0&&(S.validation_file_ids=v),y&&(S.model_name=y),b&&(S.finetuned_output_suffix=b);let C=E(o.output);if(o.dryRun){let e=[...h.localPaths.map(e=>({field:`datasets`,path:e})),...(_?.localPaths??[]).map(e=>({field:`validations`,path:e}))];I(e.length>0?{action:`finetune.create`,body:S,pending_uploads:e}:{action:`finetune.create`,body:S},C);return}let te=await ee(n.client,S),w=te.output??te.data;o.quiet?w?.job_id&&F(w.job_id):C===`text`&&w?.job_id?(F(`Created fine-tune job: ${w.job_id}`),w.status&&F(`Status: ${w.status}`)):I(te,C)}const Fs=T({description:`Create a text model fine-tune job (sft | sft-lora | dpo | dpo-lora | cpt)`,auth:`apiKey`,usageArgs:`--model <model> --datasets <id|path,...> [--validations <id|path,...>] [--model-name <name>] [--suffix <text>] [--n-epochs <n>] [--batch-size <n>] [--learning-rate <str>] [--max-length <n>] [--training-type <sft|sft-lora|dpo|dpo-lora|cpt>]`,flags:Ds,exampleArgs:[`--model qwen3-8b --datasets file-xxx`,`--model qwen3-8b --datasets ./train.jsonl`,`--model qwen3-8b --datasets ./train.jsonl --validations ./eval.jsonl`,`--model qwen3-8b --datasets file-aaa,./extra.jsonl`,`--model qwen3-8b --datasets ./train.jsonl --training-type sft`,`--model qwen3-8b --datasets file-xxx --learning-rate "1.6e-5" --n-epochs 4`,`--model qwen3-8b --datasets file-xxx --output json`,`--model qwen3-8b --datasets file-xxx --dry-run`],notes:js,run:e=>Ps(`text`,e)}),Is=T({description:`Create an audio TTS model fine-tune job (sft-lora)`,auth:`apiKey`,usageArgs:`--model <model> --datasets <id|path> [--validations <id|path>] [--model-name <name>] [--suffix <text>]`,flags:Os,exampleArgs:[`--model cosyvoice-v3-flash --datasets ./audio.zip`,`--model cosyvoice-v3-flash --datasets file-xxx`,`--model cosyvoice-v3-flash --datasets ./audio.zip --model-name my-tts`,`--model cosyvoice-v3-flash --datasets file-xxx --output json`,`--model cosyvoice-v3-flash --datasets ./audio.zip --dry-run`],notes:Ms,run:e=>Ps(`audio`,e)}),Ls=T({description:`Create an image generation model fine-tune job (sft-lora)`,auth:`apiKey`,usageArgs:`--model <model> --datasets <id|path> [--validations <id|path>] [--model-name <name>] [--suffix <text>] [--generation-type <t2i|i2i>] [--learning-rate <str>]`,flags:ks,exampleArgs:[`--model wan2.7-image-pro --datasets ./images.zip`,`--model wan2.7-image-pro --datasets file-xxx`,`--model wan2.7-image-pro --datasets file-xxx --generation-type i2i`,`--model wan2.7-image-pro --datasets ./images.zip --model-name my-wan`,`--model wan2.7-image-pro --datasets file-xxx --output json`,`--model wan2.7-image-pro --datasets ./images.zip --dry-run`],notes:Ns,run:e=>Ps(`image`,e)});var Rs=T({description:`List fine-tune jobs`,auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--status <s>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 10, max 100)`},status:{type:`string`,valueHint:`<s>`,description:`Filter by status (PENDING / RUNNING / SUCCEEDED / FAILED / CANCELED)`}},exampleArgs:[``,`--status RUNNING`,`--page-size 20 --output json`],async run(e){let{identity:t,settings:n,flags:r}=e,i=E(n.output),a=r.page,o=r.pageSize,s=r.status||void 0;if(n.dryRun){I({action:`finetune.list`,page:a,page_size:o,status:s},i);return}let c=await Re(e.client,{pageNo:a,pageSize:o,status:s}),l=c.output??c.data,u=l?.jobs??[],d=l?.total,f=u.map(e=>({job_id:e.job_id??``,base_model:e.model??``,status:e.status??``,training_type:e.training_type??``,output_model:e.finetuned_output??``,created_at:e.create_time??e.gmt_create??``}));if(i===`json`){I({items:f,total:d},i);return}if(f.length===0){F(`No fine-tune jobs found.`);return}let p=[`JOB_ID`,`BASE_MODEL`,`STATUS`,`TRAINING_TYPE`,`OUTPUT_MODEL`,`CREATED_AT`],m=f.map(e=>[e.job_id,e.base_model,e.status,e.training_type,e.output_model,e.created_at]);for(let e of L(p,m))F(e);d!==void 0&&F(`\nTotal: ${d}`),F(`Tip: OUTPUT_MODEL is the input for \`${t.binName} deploy text create --model\``)}}),zs=T({description:`Get details of a single fine-tune job`,auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --output json`],async run(e){let{identity:t,settings:n,flags:r}=e,i=r.jobId,a=E(n.output);if(n.dryRun){I({action:`finetune.get`,job_id:i},a);return}let o=await be(e.client,i),s=o.output??o.data;if(!s){F(`No data returned for ${i}`);return}let c=s.hyper_parameters,l=[];c?.n_epochs!==void 0&&l.push(`n_epochs=${c.n_epochs}`),c?.batch_size!==void 0&&l.push(`batch_size=${c.batch_size}`),c?.learning_rate!==void 0&&l.push(`learning_rate=${c.learning_rate}`),c?.max_length!==void 0&&l.push(`max_length=${c.max_length}`);let u={job_id:s.job_id??i,base_model:s.model??``,status:s.status??``,training_type:s.training_type??``,training_files:s.training_file_ids??[],validation_files:s.validation_file_ids??[],hyper_params:l.length?l.join(` · `):``,output_model:s.finetuned_output??``,model_name:s.model_name??``,created_at:s.create_time??s.gmt_create??``,updated_at:s.end_time??s.gmt_modified??``};if(a===`json`){I(u,a);return}F(`job_id: ${u.job_id}`),u.base_model&&F(`base_model: ${u.base_model}`),u.status&&F(`status: ${u.status}`),u.training_type&&F(`training_type: ${u.training_type}`),u.training_files.length&&F(`training_files: ${u.training_files.join(`, `)}`),u.validation_files.length&&F(`validation_files: ${u.validation_files.join(`, `)}`),u.hyper_params&&F(`hyper_params: ${u.hyper_params}`),u.output_model&&F(`output_model: ${u.output_model} (→ ${t.binName} deploy text create --model)`),u.model_name&&F(`model_name: ${u.model_name}`),u.created_at&&F(`created_at: ${u.created_at}`),u.updated_at&&F(`updated_at: ${u.updated_at}`)}}),Bs=T({description:`Cancel a running fine-tune job`,auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --dry-run`],notes:[`Only PENDING / RUNNING jobs can be cancelled. Completed / failed / already-`,`cancelled jobs return a server-side error (passed through verbatim).`],async run(e){let{settings:t,flags:n}=e,r=n.jobId,i=E(t.output);if(t.dryRun){I({action:`finetune.cancel`,job_id:r},i);return}let a=await b(e.client,r),o=a.output??a.data;t.quiet?F(r):i===`text`?F(`Cancelled ${r}${o?.status?` (status=${o.status})`:``}.`):I(a,i)}}),Vs=T({description:`Delete a fine-tune job record`,auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --dry-run`],notes:["Cancel a RUNNING job first via `finetune cancel` — the platform refuses",`to delete jobs that are still in flight.`],async run(e){let{settings:t,flags:n}=e,r=n.jobId,i=E(t.output);if(t.dryRun){I({action:`finetune.delete`,job_id:r},i);return}let a=await ae(e.client,r);t.quiet?F(r):i===`text`?F(`Deleted ${r}.`):I(a,i)}});function Hs(e){if(typeof e==`string`)return e;let t=e,n=t.timestamp??t.time??t.create_time??``,r=t.level??``,i=t.message??t.msg??t.log??``;return i||n||r?[n,r,i].filter(Boolean).join(` `):JSON.stringify(e)}function Us(e,t){return Hs(e).toLowerCase().includes(t)}async function Ws(e,t,n){let r=[],i=1,a=0;for(let o=0;o<200;o++){let o=await xe(e,t,{pageNo:i,pageSize:n}),s=o.output??o.data,c=s?.logs??[];if(a=s?.total??a,c.length===0||(r.push(...c),a&&r.length>=a)||c.length<n)break;i++}return{entries:r,total:a}}var Gs=T({description:`Fetch training logs for a fine-tune job`,auth:`apiKey`,usageArgs:`--job-id <id> [--page <n>] [--page-size <n>] [--search <keyword>] [--tail <n>]`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Lines per page (default: server-defined)`},search:{type:`string`,valueHint:`<keyword>`,description:`Case-insensitive substring filter. When set, all log pages are fetched and filtered client-side (--page is ignored).`},tail:{type:`number`,valueHint:`<n>`,description:`Keep only the last N entries. When set, all log pages are fetched and the trailing N are kept (--page is ignored).`}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --page-size 100 --output json`,`--job-id ft-xxx --search checkpoint`,`--job-id ft-xxx --search error --output json`,`--job-id ft-xxx --tail 20`,`--job-id ft-xxx --search checkpoint --tail 5`],async run(e){let{settings:t,flags:n}=e,r=n.jobId,i=n.page,a=n.pageSize,o=n.search||void 0,s=n.tail,c=E(t.output);if(t.dryRun){I({action:`finetune.logs`,job_id:r,page:i,page_size:a,search:o,tail:s},c);return}if(o||s!==void 0){let{entries:n,total:i}=await Ws(e.client,r,a??100),l=n,u;if(o){let e=o.toLowerCase();l=n.filter(t=>Us(t,e)),u=l.length}let d=s!==void 0&&s>=0?Math.min(s,l.length):void 0,f=d===void 0?l:l.slice(l.length-d);if(t.quiet||c===`text`){if(f.length===0){F(o?`No logs matched "${o}".`:`No logs returned.`);return}for(let e of f)F(Hs(e));let e=[`${f.length} shown`];u!==void 0&&e.push(`matched ${u}`),e.push(`of ${n.length}`+(i?` (total ${i})`:``)),F(`\n${e.join(`, `)}`);return}I({...u===void 0?{}:{matched:u},scanned:n.length,total:i||n.length,...o?{search:o}:{},...d===void 0?{}:{tail:d},logs:f},c);return}let l=await xe(e.client,r,{pageNo:i,pageSize:a}),u=l.output??l.data,d=u?.logs??[];if(t.quiet||c===`text`){if(d.length===0){F(`No logs returned.`);return}for(let e of d)F(Hs(e));u?.total!==void 0&&F(`\nTotal: ${u.total}`)}else I(l,c)}}),Ks=T({description:`List checkpoints produced by a fine-tune job`,auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --output json`],notes:["Use the returned `checkpoint` value with `finetune export` to publish",`a deployable model.`],async run(e){let{settings:t,flags:n}=e,r=n.jobId,i=E(t.output);if(t.dryRun){I({action:`finetune.checkpoints`,job_id:r},i);return}let a=await Pe(e.client,r),o=a.output??a.data,s=Array.isArray(o)?o:o?.checkpoints??[],c=Array.isArray(o)?o.length:o?.total??s.length,l=s.map(e=>({checkpoint:e.checkpoint??e.checkpoint_id??``,step:e.step===void 0?``:String(e.step),status:e.status??``}));if(i===`json`){I({items:l,total:c},i);return}if(l.length===0){F(`No checkpoints found.`);return}let u=[`CHECKPOINT`,`STEP`,`STATUS`],d=l.map(e=>[e.checkpoint,e.step,e.status]);for(let e of L(u,d))F(e);F(`\nTotal: ${c}`)}}),qs=T({description:`Publish a checkpoint as a deployable model`,auth:`apiKey`,usageArgs:`--job-id <id> --checkpoint <name> --model-name <name>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0},checkpoint:{type:`string`,valueHint:`<name>`,description:"Checkpoint identifier from `finetune checkpoints` (required)",required:!0},modelName:{type:`string`,valueHint:`<name>`,description:`Deployable model name (required)`,required:!0}},exampleArgs:[`--job-id ft-xxx --checkpoint ckpt-3 --model-name my-qwen-sft`],notes:["Required before `deploy <modality> create` can target a checkpoint. The",`platform may auto-export the best checkpoint when a job reaches SUCCEEDED —`,`explicit export is the canonical path for non-best checkpoints.`],async run(e){let{identity:t,settings:n,flags:r}=e,i=r.jobId,a=r.checkpoint,o=r.modelName,s=E(n.output);if(n.dryRun){I({action:`finetune.export`,job_id:i,checkpoint:a,model_name:o},s);return}let c=await ce(e.client,i,a,o),l=(c.output??c.data)?.model_name??o;n.quiet?F(l):s===`text`?(F(`Exported ${i} / ${a} → model_name=${l}`),F(`Next: ${t.binName} deploy text create --model ${l} --name <display-name>`)):I(c,s)}});const Js=new Set([`SUCCEEDED`,`FAILED`,`CANCELED`]);function Ys(){let e=new Date,t=e=>String(e).padStart(2,`0`);return`${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Xs(e){let t=Math.floor(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}function Zs(e,t){return new Promise((n,r)=>{if(t.aborted){r(Error(`aborted`));return}let i=()=>{clearTimeout(a),r(Error(`aborted`))},a=setTimeout(()=>{t.removeEventListener(`abort`,i),n()},e);t.addEventListener(`abort`,i,{once:!0})})}var Qs=T({description:`Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal.`,auth:`apiKey`,usageArgs:`--job-id <id> [--follow] [--interval <sec>] [--poll-timeout <sec>]`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:`Fine-tune job ID (required)`,required:!0},follow:{type:`switch`,description:`Block and poll until a terminal state (the legacy behavior). Without it, a single status probe is performed and the command returns immediately.`},interval:{type:`number`,valueHint:`<sec>`,description:`Seconds between polls with --follow (default: 10, min: 1). Ignored without --follow.`},pollTimeout:{type:`number`,valueHint:`<sec>`,description:`With --follow, stop polling after this many seconds (default: no limit). Ignored without --follow.`}},exampleArgs:[`--job-id ft-xxx # single probe, returns immediately`,`--job-id ft-xxx --output json # status probe for agents`,`--job-id ft-xxx --follow # block until terminal`,`--job-id ft-xxx --follow --interval 5`,`--job-id ft-xxx --follow --poll-timeout 3600`],notes:[`Default (no --follow) is a NON-BLOCKING single status probe: one fetch, then`,`return immediately. This is the mode meant for agents / scripts — the caller`,`owns the polling cadence, so the CLI never holds the terminal.`,`A terminal FAILED/CANCELED status raises a normal CLI error (non-zero exit);`,`a SUCCEEDED or still-running status returns 0. With --follow, exceeding`,`--poll-timeout raises a timeout error.`,`Use --follow for the blocking, human-terminal-follow experience; use the`,`default mode when driving the loop yourself (e.g. from an agent).`,"For per-step training output (not status), use `finetune logs`."],async run(e){let{settings:n,flags:r}=e,i=r.jobId,o=r.follow,s=Math.max(1,r.interval??10),c=r.pollTimeout,l=E(n.output);if(n.dryRun){I({action:`finetune.watch`,job_id:i,follow:o,interval:s,timeout:c},l);return}if(!o){let r=await be(e.client,i),o=r.output??r.data,s=String(o?.status??``).toUpperCase(),c=Js.has(s);if(n.quiet?F(s||`UNKNOWN`):l===`text`?(F(`${Ys()} ${i} ${s||`UNKNOWN`}`),s===`SUCCEEDED`&&F(`✓ ${i} ${s}`)):I({job_id:i,status:s||`UNKNOWN`,terminal:c},l),c&&s!==`SUCCEEDED`)throw new t(`Fine-tune job ${i} ended in status ${s}.`,a.GENERAL);return}let u=new AbortController,d=()=>u.abort();process.on(`SIGINT`,d);try{let r=``,o=Date.now();for(;;){let d=await be(e.client,i,u.signal),f=d.output??d.data,p=String(f?.status??``).toUpperCase();if(l===`text`&&!n.quiet&&p!==r&&(F(`${Ys()} ${i} ${p||`UNKNOWN`}`),r=p),Js.has(p)){let e=Date.now()-o;if(l!==`text`||n.quiet?I(d,l):p===`SUCCEEDED`&&F(`\n✓ ${i} ${p} (elapsed ${Xs(e)})`),p!==`SUCCEEDED`)throw new t(`Fine-tune job ${i} ended in status ${p} (elapsed ${Xs(e)}).`,a.GENERAL);return}if(c!==void 0&&(Date.now()-o)/1e3>=c)throw new t(`Watching fine-tune job ${i} timed out after ${Xs(Date.now()-o)} (last status: ${p||`UNKNOWN`}).`,a.TIMEOUT);await Zs(s*1e3,u.signal)}}catch(e){if(u.signal.aborted){F(`
358
+ Interrupted.`);return}throw e}finally{process.off(`SIGINT`,d)}}});async function $s(e){let t=se(e),n=(n,r)=>y({region:t.consoleRegion,site:t.consoleSite,switchAgent:t.consoleSwitchAgent},e.timeout,{api:n,data:r}),r=await fe(n,{pageNo:1,pageSize:50}),i=[...r.models],a=Math.ceil(r.total/50);for(let e=2;e<=a;e++){let t=await fe(n,{pageNo:e,pageSize:50});i.push(...t.models)}return i}const ec={full:`full-parameter`,lora:`LoRA`};function tc(e){if(!ke(e))return e;let{method:t,variant:n}=ft(e);return`${ec[n]??n} ${t.toUpperCase()}`}var nc=T({description:`Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it)`,auth:`none`,usageArgs:`--model <m> | --training-type <t>`,flags:{model:{type:`string`,valueHint:`<m>`,description:`List training types supported by this base model.`},trainingType:{type:`string`,valueHint:`<t>`,description:`List models supporting this training type: ${f.join(` | `)}.`}},exampleArgs:[`--model qwen3-8b`,`--training-type sft-lora`,`--training-type cpt --output json`,`--training-type sft --quiet`],notes:[`Exactly one of --model / --training-type is required.`,"Training-type values use the `<method>` / `<method>-lora` convention:",`sft | sft-lora | dpo | dpo-lora | cpt. (cpt has no -lora variant server-side.)`,`Queries listFoundationModels, a public API — no console login needed.`],validate:e=>{if(e.model&&e.trainingType)return`--model and --training-type are mutually exclusive; pass one.`;if(!e.model&&!e.trainingType)return`one of --model / --training-type is required.`},async run(e){let{settings:t,flags:n}=e,r=n.model||void 0,i=n.trainingType||void 0,a=E(t.output);if(t.dryRun){I({action:`finetune.capability`,model:r,training_type:i},a);return}if(r){let e=await le(t,r);if(!e){F(`No foundation model found matching "${r}".`);return}let n=ze(e);if(t.quiet){for(let e of n)F(e);return}if(a!==`text`){I({model:e.model??r,supported:n,supports:e.supports,trainingTypes:e.trainingTypes},a);return}F(`${e.model??r}`),F(n.length?`Supported training types:`:`No supported training types.`);for(let e of n)F(` ${e.padEnd(10)} ${tc(e)}`);return}if(!i||!ke(i))throw new p(`--training-type "${i}" is not supported. Valid: ${f.join(`, `)}.`);let{method:o,variant:s}=ft(i),c=(await $s(t)).filter(e=>Ke(e,i)).map(e=>({model:e.model,name:e.name??e.model})).filter(e=>!!e.model).sort((e,t)=>e.model.localeCompare(t.model));if(t.quiet){for(let e of c)F(e.model);return}if(a!==`text`){I({training_type:i,method:o,variant:s,count:c.length,models:c},a);return}F(`Models supporting ${i} (${o} / ${s}): ${c.length}`);for(let e of c)F(` ${e.model}`)}});const rc={model:{type:`string`,valueHint:`<name>`,description:`Model name (catalog model or fine-tuned output) (required)`,required:!0},name:{type:`string`,valueHint:`<display_name>`,description:`Console display name for the deployment (required)`,required:!0},plan:{type:`string`,valueHint:`<plan>`,description:`Billing plan: lora (default, Token-billed) | ptu (Token-billed) | mu`},deploySpec:{type:`string`,valueHint:`<id>`,description:`Deploy spec (only used by plan=mu; auto-picked if omitted)`},capacity:{type:`number`,valueHint:`<n>`,description:`Resource units (plan=mu only; required by API; defaults to the template's unit)`},billingMethod:{type:`string`,valueHint:`<m>`,description:`Billing method (plan=mu only; default "POST_PAY", the only supported value)`},inputTpm:{type:`number`,valueHint:`<n>`,description:`PTU max input tokens/min (required for plan=ptu)`},outputTpm:{type:`number`,valueHint:`<n>`,description:`PTU max output tokens/min (required for plan=ptu)`},thinkingOutputTpm:{type:`number`,valueHint:`<n>`,description:`PTU max thinking-output tokens/min (optional, some models)`}},ic=`--model <model_name> --name <display_name> [--plan <plan>] [--deploy-spec <id>] [--capacity <n>] [--billing-method <m>] [--input-tpm <n>] [--output-tpm <n>] [--thinking-output-tpm <n>]`,ac=["Plan defaults to `lora` (Token-billed) for text/image and `mu` (model-unit-",`billed) for audio (CosyVoice TTS). Pass --plan to override.`,`For plan=ptu (Token-billed, provisioned throughput), --input-tpm and`,`--output-tpm are required (the platform rejects creation without an`,`explicit ptu_capacity despite the doc listing defaults).`,"For plan=mu, `capacity`, `billing_method` and `deploy_spec` are required.",`billing_method defaults to POST_PAY (only supported value); deploy_spec`,`and capacity are auto-picked from GET /deployments/models when omitted.`,"Use `bl deploy models --source base` to inspect available templates.",`After creation, status starts at PENDING and transitions to RUNNING.`,`Invoke the deployed model with: bl text chat --model <deployed_model>`,`WARNING: --model is overloaded across commands and refers to DIFFERENT`,"values. `bl deploy <modality> create --model` takes the exported model_name","(e.g. `qwen3-8b-ft-...`), but the create response also returns a","`deployed_model` field (the deployment instance id, e.g.","`qwen3-8b-5ecb5f068d79`). The inference call `bl text chat --model` must use","the `deployed_model` from the create response — NOT the `model_name` you","passed to `deploy <modality> create`. Do not reuse the value across the two",`commands.`];function oc(e,t){let n=t.plan||w(e),r=d[n];return r?r.validateFlags(t):`Unsupported plan "${n}". Supported plans: ${Object.keys(d).join(`, `)}.`}async function sc(e,t){let{identity:n,settings:r,flags:i}=t,a=i.model,o=i.name,s=i.plan||w(e),c=E(r.output),l={model_name:a,name:o,plan:s,...(await Xe(s).resolve({client:t.client,dryRun:r.dryRun,binName:n.binName,flags:i,model:a,name:o})).body};if(r.dryRun){I({action:`deploy.create`,body:l},c);return}let u=await C(t.client,l),d=u.output??u.data;r.quiet?F(d?.deployed_model??``):c===`text`?(F(`Created deployment.`),d?.deployed_model&&F(` deployed_model: ${d.deployed_model}`),d?.status&&F(` status: ${d.status}`),d?.plan&&F(` plan: ${d.plan}`),F(`\nNext: track readiness with: ${n.binName} deploy get --deployed-model ${d?.deployed_model??`<id>`}`)):I(u,c)}const cc=T({description:`Create a text model deployment`,auth:`apiKey`,usageArgs:ic,flags:rc,exampleArgs:[`--model my-qwen-sft --name my-sft-test`,`--model qwen3.6-flash-2026-04-16 --name my-flash --plan ptu --input-tpm 10000 --output-tpm 1000`,`--model qwen3-8b --name my-qwen3-mu --plan mu`,`--model qwen3-8b --name my-qwen3 --plan mu --deploy-spec MU1 --capacity 2`],notes:ac,validate:e=>oc(`text`,e),run:e=>sc(`text`,e)}),lc=T({description:`Create an audio (TTS) model deployment`,auth:`apiKey`,usageArgs:ic,flags:rc,exampleArgs:[`--model my-cosyvoice-ft --name my-tts`,`--model my-cosyvoice-ft --name my-tts --deploy-spec dps-xxxx --capacity 1`,`--model my-cosyvoice-ft --name my-tts --dry-run`],notes:ac,validate:e=>oc(`audio`,e),run:e=>sc(`audio`,e)}),uc=T({description:`Create an image generation model deployment`,auth:`apiKey`,usageArgs:ic,flags:rc,exampleArgs:[`--model my-wan-ft --name my-wan`,`--model my-wan-ft --name my-wan-mu --plan mu`,`--model my-wan-ft --name my-wan --dry-run`],notes:ac,validate:e=>oc(`image`,e),run:e=>sc(`image`,e)});var dc=T({description:`List model deployments`,auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--status <s>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 10, max 100)`},status:{type:`string`,valueHint:`<s>`,description:`Filter by status (PENDING / RUNNING / STOPPED / FAILED)`}},exampleArgs:[``,`--status RUNNING`,`--page-size 20 --output json`],async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.status||void 0;if(t.dryRun){I({action:`deploy.list`,page:n.page,page_size:n.pageSize,status:i},r);return}let a=await Le(e.client,{pageNo:n.page,pageSize:n.pageSize,status:i}),o=a.output??a.data,s=o?.deployments??[],c=o?.total,l=s.map(e=>({deployed_model:e.deployed_model??``,model_name:e.model_name??``,status:e.status??``,plan:e.plan??``,capacity:e.capacity===void 0?``:String(e.capacity),created_at:e.gmt_create??``}));if(r===`json`){I({items:l,total:c},r);return}if(l.length===0){F(`No deployments found.`);return}let u=[`DEPLOYED_MODEL`,`MODEL_NAME`,`STATUS`,`PLAN`,`CAPACITY`,`CREATED_AT`],d=l.map(e=>[e.deployed_model,e.model_name,e.status,e.plan,e.capacity,e.created_at]);for(let e of L(u,d))F(e);c!==void 0&&F(`\nTotal: ${c}`)}}),fc=T({description:`Get details of a single model deployment`,auth:`apiKey`,usageArgs:`--deployed-model <id>`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:`Deployed model identifier (required)`,required:!0}},exampleArgs:[`--deployed-model qwen-plus-2025-12-01-b6d61c71`,`--deployed-model qwen-plus-2025-12-01-b6d61c71 --output json`],async run(e){let{settings:t,flags:n}=e,r=n.deployedModel,i=E(t.output);if(t.dryRun){I({action:`deploy.get`,deployed_model:r},i);return}let a=await ye(e.client,r),o=a.output??a.data;if(!o){F(`No data returned for ${r}`);return}let s={deployed_model:o.deployed_model??r,deployed_name:o.name??``,model_name:o.model_name??``,base_model:o.base_model??``,status:o.status??``,plan:o.plan??``};if(o.model_unit_spec&&(s.model_unit_spec=o.model_unit_spec),o.charge_type&&(s.charge_type=o.charge_type),o.capacity!==void 0&&(s.capacity=o.capacity),o.base_capacity!==void 0&&(s.base_capacity=o.base_capacity),o.ready_capacity!==void 0&&(s.ready_capacity=o.ready_capacity),o.rpm_limit!==void 0&&(s.rpm_limit=o.rpm_limit),o.tpm_limit!==void 0&&(s.tpm_limit=o.tpm_limit),o.input_tpm!==void 0&&(s.input_tpm=o.input_tpm),o.output_tpm!==void 0&&(s.output_tpm=o.output_tpm),o.gmt_create&&(s.created_at=o.gmt_create),o.gmt_modified&&(s.updated_at=o.gmt_modified),i===`json`){I(s,i);return}let c=e=>`${e}:`.padEnd(18);for(let[e,t]of Object.entries(s)){if(t===``||t===void 0)continue;let n=typeof t==`string`?t:JSON.stringify(t);F(`${c(e)}${n}`)}}}),pc=T({description:`List models available for deployment`,auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--catalog-version <v>] [--source <custom|public>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 100)`},catalogVersion:{type:`string`,valueHint:`<v>`,description:`Catalog version filter (default: v1.0; required for new catalog models)`},source:{type:`string`,valueHint:`<s>`,description:`Model source filter: custom (fine-tuned) | base (catalog) | public`}},exampleArgs:[``,`--source base`,`--source custom --page-size 50`,`--catalog-version v1.0 --output json`],async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.catalogVersion===``?void 0:n.catalogVersion??`v1.0`,a=n.source||void 0;if(t.dryRun){I({action:`deploy.models`,page:n.page,page_size:n.pageSize,version:i,model_source:a},r);return}let o=await Ie(e.client,{pageNo:n.page,pageSize:n.pageSize,version:i,modelSource:a}),s=o.output??o.data,c=s?.models??[],l=s?.total;if(r===`json`){I({items:c.map(e=>{let t={model_name:e.model_name??``};return e.base_model&&(t.base_model=e.base_model),e.model_source&&(t.model_source=e.model_source),e.supported_plans&&e.supported_plans.length>0&&(t.supported_plans=e.supported_plans),e.plans&&e.plans.length>0&&(t.plans=e.plans.map(e=>{let t={plan:e.plan??``};return e.cu_specs&&e.cu_specs.length>0&&(t.cu_specs=e.cu_specs),e.templates&&e.templates.length>0&&(t.templates=e.templates.map(e=>{let t={};e.template_id&&(t.template_id=e.template_id),e.template_name&&(t.template_name=e.template_name),e.charge_type&&(t.charge_type=e.charge_type);let n=e.roles?.unified;return n?.model_unit_spec&&(t.model_unit_spec=n.model_unit_spec),n?.capacity_unit_per_instance!==void 0&&(t.capacity_unit_per_instance=n.capacity_unit_per_instance),(e.roles?.prefill||e.roles?.decode)&&(t.roles={prefill:e.roles?.prefill,decode:e.roles?.decode}),e.template_desc&&(t.template_desc=e.template_desc),t})),t})),t}),total:l},r);return}let u=c.map(e=>{let t=``;return t=e.supported_plans&&e.supported_plans.length>0?e.supported_plans.join(`,`):e.plans&&e.plans.length>0?e.plans.map(e=>{let t=e.plan??`?`;return e.templates&&e.templates.length>0?`${t}(${e.templates.length}t)`:e.cu_specs&&e.cu_specs.length>0?`${t}(${e.cu_specs.join(`/`)})`:t}).join(`,`):`-`,{model_name:e.model_name??``,base_model:e.base_model??``,source:e.model_source??``,plans:t}});if(u.length===0){F(`No deployable models found.`);return}let d=[`MODEL_NAME`,`BASE_MODEL`,`SOURCE`,`PLANS`],f=u.map(e=>[e.model_name,e.base_model,e.source,e.plans]);for(let e of L(d,f))F(e);l!==void 0&&F(`\nTotal: ${l}`)}}),mc=T({description:`Scale a deployment's capacity`,auth:`apiKey`,usageArgs:`--deployed-model <id> --capacity <n> [--input-tpm <n>] [--output-tpm <n>]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:`Deployed model identifier (required)`,required:!0},capacity:{type:`number`,valueHint:`<n>`,description:`New capacity in plan units (must be a multiple of base_capacity)`},inputTpm:{type:`number`,valueHint:`<n>`,description:`PTU only — input tokens per minute`},outputTpm:{type:`number`,valueHint:`<n>`,description:`PTU only — output tokens per minute`}},exampleArgs:[`--deployed-model qwen-plus-...-b6d61c71 --capacity 8`,`--deployed-model dep-... --capacity 2`],validate:e=>e.capacity===void 0&&e.inputTpm===void 0&&e.outputTpm===void 0?`Provide at least one of --capacity / --input-tpm / --output-tpm.`:void 0,async run(e){let{settings:t,flags:n}=e,r=n.deployedModel,i=E(t.output),a={};if(n.capacity!==void 0&&(a.capacity=n.capacity),n.inputTpm!==void 0&&(a.input_tpm=n.inputTpm),n.outputTpm!==void 0&&(a.output_tpm=n.outputTpm),t.dryRun){I({action:`deploy.scale`,deployed_model:r,body:a},i);return}let o=await st(e.client,r,a),s=o.output??o.data;t.quiet?F(r):i===`text`?F(`Scaled ${r}${s?.capacity===void 0?``:` (capacity=${s.capacity})`}.`):I(o,i)}}),hc=T({description:`Update a deployment's rate limits (rpm_limit / tpm_limit)`,auth:`apiKey`,usageArgs:`--deployed-model <id> [--rpm-limit <n>] [--tpm-limit <n>]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:`Deployed model identifier (required)`,required:!0},rpmLimit:{type:`number`,valueHint:`<n>`,description:`Requests per minute`},tpmLimit:{type:`number`,valueHint:`<n>`,description:`Tokens per minute`}},exampleArgs:[`--deployed-model dep-... --rpm-limit 1000`,`--deployed-model dep-... --rpm-limit 1000 --tpm-limit 200000`],notes:[`At least one of --rpm-limit / --tpm-limit must be provided.`],validate:e=>e.rpmLimit===void 0&&e.tpmLimit===void 0?`Provide at least one of --rpm-limit / --tpm-limit.`:void 0,async run(e){let{settings:t,flags:n}=e,r=n.deployedModel,i=E(t.output),a={};if(n.rpmLimit!==void 0&&(a.rpm_limit=n.rpmLimit),n.tpmLimit!==void 0&&(a.tpm_limit=n.tpmLimit),t.dryRun){I({action:`deploy.update`,deployed_model:r,body:a},i);return}let o=await mt(e.client,r,a),s=o.output??o.data;if(t.quiet)F(r);else if(i===`text`){let e=[];s?.rpm_limit!==void 0&&e.push(`rpm_limit=${s.rpm_limit}`),s?.tpm_limit!==void 0&&e.push(`tpm_limit=${s.tpm_limit}`),F(`Updated ${r}${e.length?` (${e.join(`, `)})`:``}.`)}else I(o,i)}}),gc=T({description:`Delete a model deployment (must be STOPPED or FAILED)`,auth:`apiKey`,usageArgs:`--deployed-model <id> [--skip-precheck]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:`Deployed model identifier (required)`,required:!0},skipPrecheck:{type:`switch`,description:`Skip the local STOPPED/FAILED status precheck`}},exampleArgs:[`--deployed-model dep-...`,`--deployed-model dep-... --dry-run`],async run(e){let{settings:n,flags:r}=e,i=r.deployedModel,o=E(n.output);if(n.dryRun){I({action:`deploy.delete`,deployed_model:i},o);return}if(!r.skipPrecheck)try{let n=await ye(e.client,i),r=((n.output??n.data)?.status??``).toUpperCase();if(r&&r!==`STOPPED`&&r!==`FAILED`)throw new t(`Deployment ${i} is ${r}. Only STOPPED / FAILED deployments can be deleted. Stop it first via the platform console, or pass --skip-precheck to attempt deletion anyway.`,a.USAGE)}catch(e){if(e instanceof t)throw e}let s=await ie(e.client,i);n.quiet?F(i):o===`text`?F(`Deleted ${i}.`):I(s,o)}});const _c={callerUacAccountId:{type:`string`,valueHint:`<id>`,description:`Caller UAC account ID`},namespaceId:{type:`string`,valueHint:`<id>`,description:`Product namespace ID (Token Plan default: namespace-1)`}},vc={workspaceId:{type:`string`,valueHint:`<id>`,description:`Workspace ID (env: BAILIAN_WORKSPACE_ID, config: workspace_id)`}},yc={cn:`modelstudio.cn-beijing.aliyuncs.com`,intl:`modelstudio.ap-southeast-1.aliyuncs.com`};function bc(e){for(let[t,n]of Object.entries(l))if(e===n||e.startsWith(`${n}/`))return t;return`cn`}function xc(e){return yc[bc(e)]??yc.cn}function Sc(e,n,r){let i=n.workspaceId||e.workspaceId;if(!i)throw new t(`Missing workspace ID.
359
+ Set via: --workspace-id flag, env: BAILIAN_WORKSPACE_ID, or config: ${r} config set workspace_id <id>`,a.USAGE);return i}function Cc(e,t){t.callerUacAccountId&&(e.CallerUacAccountId=t.callerUacAccountId),t.namespaceId&&(e.NamespaceId=t.namespaceId)}function wc(e,t,n){let r=_(n),i=xc(e);return{host:i,endpoint:`https://${i}${t}${r?`?${r}`:``}`,queryString:r,queryParams:n}}async function Tc(e){let{client:t,baseUrl:n,action:r,path:i,method:a,queryParams:o}=e,{host:s}=wc(n,i,o);return t.openApiQueryJson({host:s,path:i,action:r,version:`2026-02-10`,method:a,queryParams:o})}const Ec=`/tokenplan/subscription/seat-detail`;var Dc=T({description:`List Token Plan subscription seat details`,auth:`openapi`,usageArgs:`[flags]`,flags:{pageNo:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Page size (default: 10)`},..._c,status:{type:`array`,valueHint:`<status>`,description:`Seat status filter (repeatable): CREATING, NORMAL, LIMIT, RELEASE, STOP, REFUNDED`},statusListStr:{type:`string`,valueHint:`<json>`,description:`StatusList as JSON string, e.g. '["NORMAL"]'`},seatId:{type:`string`,valueHint:`<id>`,description:`Filter by seat ID`},seatType:{type:`string`,valueHint:`<type>`,description:`Seat tier: standard, pro, or max`},queryAssigned:{type:`string`,valueHint:`<bool>`,description:`Filter by assignment: true=assigned, false=unassigned`}},exampleArgs:[``,`--page-size 20 --status NORMAL`,`--query-assigned true --seat-type standard`],async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=Oc(n);if(t.dryRun){let{endpoint:t,queryParams:n}=wc(e.client.baseUrl,Ec,i);I({endpoint:t,query:n},r);return}let a=await Tc({client:e.client,baseUrl:e.client.baseUrl,action:`GetSubscriptionSeatDetails`,path:Ec,method:`GET`,queryParams:i}),o=a.Data?.Items??[];t.quiet||r===`text`?kc(o,a.Data?.Total,a.Data?.PageNo,a.Data?.PageSize):I(a,r)}});function Oc(e){let n={};if(e.pageNo!==void 0&&(n.PageNo=String(e.pageNo)),e.pageSize!==void 0&&(n.PageSize=String(e.pageSize)),Cc(n,e),e.statusListStr&&(n.StatusListStr=e.statusListStr),e.status&&e.status.length>0&&(n.StatusList=e.status),e.seatId&&(n.SeatId=e.seatId),e.seatType&&(n.SeatType=e.seatType),typeof e.queryAssigned==`string`&&e.queryAssigned.length>0){let r=e.queryAssigned.toLowerCase();if(r!==`true`&&r!==`false`)throw new t(`--query-assigned must be 'true' or 'false'.`,a.USAGE);n.QueryAssigned=r}return n}function kc(e,t,n,r){if(e.length===0){F(`No seats found.`);return}let i=[z(`SeatId`,18),z(`Type`,10),z(`Status`,10),z(`Assigned`,12),z(`Account`,20)].join(` `);F(i),F(`-`.repeat(i.length));for(let t of e)F([z(t.SeatId??`-`,18),z(t.SpecType??`-`,10),z(t.Status??`-`,10),z(t.AssignedStatus??`-`,12),z(t.AccountName??t.AccountId??`-`,20)].join(` `));t!==void 0&&(F(``),F(`Total: ${t}${n===void 0?``:` | Page: ${n}`}${r===void 0?``:` | PageSize: ${r}`}`))}const Ac=`/tokenplan/api-keys`;var jc=T({description:`Create a Token Plan API key for a seat`,auth:`openapi`,usageArgs:`--account-id <id> --workspace-id <id> [flags]`,flags:{accountId:{type:`string`,valueHint:`<id>`,description:`Target member account ID`,required:!0},...vc,description:{type:`string`,valueHint:`<text>`,description:`API key description`},..._c},exampleArgs:[`--account-id acc_123 --workspace-id ws_456`,`--account-id acc_123 --workspace-id ws_456 --description 'Dev key'`],async run(e){let{identity:t,settings:n,flags:r}=e,i=E(n.output),a=Sc(n,r,t.binName),o=Mc(r,{accountId:r.accountId,workspaceId:a});if(n.dryRun){let{endpoint:t,queryParams:n}=wc(e.client.baseUrl,Ac,o);I({endpoint:t,query:n},i);return}let s=await Tc({client:e.client,baseUrl:e.client.baseUrl,action:`CreateTokenPlanKey`,path:Ac,method:`POST`,queryParams:o});n.quiet||i===`text`?Nc(s):I(s,i)}});function Mc(e,t){let n={};return n.AccountId=t.accountId,n.WorkspaceId=t.workspaceId,e.description&&(n.Description=e.description),Cc(n,e),n}function Nc(e){let t=e.Data;if(!t){F(`API key created.`);return}F(`${z(`ApiKeyId`,14)} ${t.ApiKeyId??`-`}`),F(`${z(`MaskedApiKey`,14)} ${t.MaskedApiKey??`-`}`),t.Description&&F(`${z(`Description`,14)} ${t.Description}`),t.PlainApiKey&&(F(``),F(`PlainApiKey (shown once): ${t.PlainApiKey}`))}const Pc=`/tokenplan/subscription/seat-assignments`;var Fc=T({description:`Batch assign Token Plan seats to members`,auth:`openapi`,usageArgs:`--workspace-id <id> --seat-type <type> --account-id <id> [flags]`,flags:{...vc,seatType:{type:`string`,valueHint:`<type>`,description:`Seat tier: standard, pro, or max`,required:!0},accountId:{type:`array`,valueHint:`<id>`,description:`Target member account ID (repeatable)`},..._c,locale:{type:`string`,valueHint:`<locale>`,description:`Language: zh-CN or en-US`}},exampleArgs:[`--workspace-id ws_456 --seat-type standard --account-id acc_123`,`--workspace-id ws_456 --seat-type pro --account-id acc_1 --account-id acc_2`],validate:e=>e.accountId&&e.accountId.length>0?void 0:`Missing required flag: --account-id`,async run(e){let{identity:t,settings:n,flags:r}=e,i=E(n.output),a=Ic(r,Sc(n,r,t.binName));if(n.dryRun){let{endpoint:t,queryParams:n}=wc(e.client.baseUrl,Pc,a);I({endpoint:t,query:n},i);return}let o=await Tc({client:e.client,baseUrl:e.client.baseUrl,action:`BatchAssignSeats`,path:Pc,method:`POST`,queryParams:a});n.quiet||i===`text`?F(`Seats assigned successfully.`):I(o,i)}});function Ic(e,t){let n={};return n.WorkspaceId=t,e.seatType&&(n.SeatType=e.seatType),Cc(n,e),e.locale&&(n.Locale=e.locale),e.accountId&&e.accountId.length>0&&(n.AccountIds=e.accountId),n}const Lc=`/tokenplan/organization/member-additions`;var Rc=T({description:`Add a member to a Token Plan organization`,auth:`openapi`,usageArgs:`--account-name <name> --org-id <id> [flags]`,flags:{accountName:{type:`string`,valueHint:`<name>`,description:`Member display name`,required:!0},orgId:{type:`string`,valueHint:`<id>`,description:`Organization ID`,required:!0},orgRoleCode:{type:`string`,valueHint:`<code>`,description:`Organization role: ORG_ADMIN or ORG_MEMBER (default: ORG_MEMBER)`},specType:{type:`string`,valueHint:`<type>`,description:`Seat tier to assign on creation: standard, pro, or max`},..._c},exampleArgs:[`--account-name dev_user --org-id org_123`,`--account-name admin_user --org-id org_123 --org-role-code ORG_ADMIN`,`--account-name member1 --org-id org_123 --spec-type standard`],async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=zc(n);if(t.dryRun){let{endpoint:t,queryParams:n}=wc(e.client.baseUrl,Lc,i);I({endpoint:t,query:n},r);return}let a=await Tc({client:e.client,baseUrl:e.client.baseUrl,action:`AddOrganizationMember`,path:Lc,method:`POST`,queryParams:i});t.quiet||r===`text`?Bc(a):I(a,r)}});function zc(e){let t={};return e.accountName&&(t.AccountName=e.accountName),e.orgId&&(t.OrgId=e.orgId),t.OrgRoleCode=e.orgRoleCode||`ORG_MEMBER`,e.specType&&(t.SpecType=e.specType),Cc(t,e),t}function Bc(e){let t=e.Data;if(!t){F(`Member added.`);return}F(`${z(`AccountId`,14)} ${t.AccountId??`-`}`),F(`${z(`SeatAssigned`,14)} ${String(t.SeatAssigned??`-`)}`)}const Vc=[`bailian`,`claude`,`qoder`,`ark`,`all`],Hc={bailian:` bailian:
360
+ # bl auth login --api-key <key> sets DASHSCOPE_API_KEY; --base-url <url> sets BAILIAN_BASE_URL
361
+ api_key: \${DASHSCOPE_API_KEY}
362
+ base_url: \${BAILIAN_BASE_URL}`,claude:` claude:
363
+ api_key: \${ANTHROPIC_API_KEY}`,qoder:` qoder:
364
+ api_key: \${QODER_PAT}
365
+ gateway: "https://api.qoder.com/api/v1/cloud"`,ark:` ark:
366
+ api_key: \${ARK_API_KEY}`},Uc={bailian:` model: qwen3.7-max`,claude:` model: claude-sonnet-4-6`,qoder:` model: ultimate`,ark:` model: doubao-seed-2-1-pro-260628`};function Wc(e){let t=e.provider===`all`?`${Hc.bailian}\n${Hc.claude}\n${Hc.qoder}\n${Hc.ark}`:Hc[e.provider],n=e.provider===`all`?` model:
367
+ bailian: qwen3.7-max
368
+ claude: claude-sonnet-4-6
369
+ qoder: ultimate
370
+ ark: doubao-seed-2-1-pro-260628`:Uc[e.provider],r=e.provider===`bailian`?`[bash, read, glob, grep]`:`[read, glob, grep, web_search, web_fetch]`;return`version: "1"
371
+
372
+ providers:
373
+ ${t}
374
+
375
+ defaults:
376
+ provider: ${e.provider===`all`?`all`:e.provider}
377
+
378
+ environments:
379
+ dev:
380
+ config:
381
+ type: cloud
382
+ networking:
383
+ type: unrestricted
384
+
385
+ agents:
386
+ ${e.agentName}:
387
+ description: "General-purpose assistant"
388
+ ${n}
389
+ instructions: |
390
+ You are a helpful assistant.
391
+ environment: dev
392
+ tools:
393
+ builtin: ${r}
394
+ `}var Gc=T({description:`Create a new agents.yaml template`,auth:`none`,usageArgs:`[--provider <name>] [--agent-name <name>] [--file <path>] [--force]`,flags:{provider:{type:`string`,valueHint:`<name>`,description:`Provider: bailian, claude, qoder, ark, all (default: bailian)`,choices:Vc},agentName:{type:`string`,valueHint:`<name>`,description:`Name of the first agent (default: assistant)`},file:{type:`string`,valueHint:`<path>`,description:`Output config path (default: agents.yaml)`},force:{type:`switch`,description:`Overwrite an existing config file`}},exampleArgs:[``,`--provider bailian --agent-name assistant`,`--provider all`],async run(e){let{settings:n,flags:r}=e,i=E(n.output),o=r.provider??`bailian`,s=r.agentName??`assistant`,c=r.file??`agents.yaml`;if(mn(c)&&!r.force)throw new t(`${c} already exists.`,a.USAGE,`Pass --force to overwrite.`);let l=`.gitignore`;if(n.dryRun){let e=!0;mn(l)&&(e=!(await an(l,`utf8`)).includes(`agents.state.json`)),I({would_create:c,provider:o,agent:s,would_update_gitignore:e},i);return}if(await on(c,Wc({provider:o,agentName:s}),`utf8`),mn(l)){let e=await an(l,`utf8`);e.includes(`agents.state.json`)||await on(l,e+`
395
+ # agents
396
+ agents.state.json
397
+ .env
398
+ `,`utf8`)}else await on(l,`# agents
399
+ agents.state.json
400
+ .env
401
+ `,`utf8`);i===`json`?I({created:c,provider:o,agent:s},i):(F(`Created ${c}`),(o===`bailian`||o===`all`)&&F("Credentials: run `bl auth login --api-key <key> --base-url <url>`, or set DASHSCOPE_API_KEY / BAILIAN_BASE_URL."),F("Next: edit agents.yaml, then run `bl managed-agent plan`."))}});const Kc=`/api/v1/agentstudio`,qc=[...new Set([...Object.values(gn).flatMap(e=>e.map(e=>e.key)),`BAILIAN_API_KEY`,`BAILIAN_BASE_URL`,`CLAUDE_API_KEY`,`QODER_API_KEY`])],Jc={bailian:"Run `bl auth login --api-key <key>`, pass --api-key, or set DASHSCOPE_API_KEY.",claude:`Set ANTHROPIC_API_KEY (or CLAUDE_API_KEY) in your shell or .env.`,ark:`Set ARK_API_KEY in your shell or .env.`,qoder:`Set QODER_PAT (or QODER_API_KEY) in your shell or .env.`},Y=["Bailian credentials come from bl's auth chain: --api-key > DASHSCOPE_API_KEY > `bl auth login` (active config profile).","Other providers read the env vars referenced in agents.yaml (e.g. ${ANTHROPIC_API_KEY}), including .env and ~/.agents/config.json.",`Resolved credentials are injected into the SDK in-memory and cleared from the environment; they never persist in process env.`],Yc=[`Runs fully offline against local files: no login or provider credentials required.`];function Xc(){bn();for(let e of qc)process.env[e]===void 0&&(process.env[e]=``)}function Zc(e,t){let n=e.bailian;if(!n||typeof n!=`object`)return;let r=n,i=t.client.exportApiCredential();if(i&&(r.api_key=i.token),`base_url`in r&&!r.base_url){let e=t.client.baseUrl.replace(/\/+$/,``);r.base_url=e.endsWith(Kc)?e:`${e}${Kc}`}`workspace_id`in r&&!r.workspace_id&&t.settings.workspaceId&&(r.workspace_id=t.settings.workspaceId)}function Qc(){for(let e of qc)delete process.env[e]}function $c(e){for(let t of Object.values(e)){if(!t||typeof t!=`object`)continue;let e=t;for(let[t,n]of Object.entries(e))n===null&&(e[t]=``)}}function el(e){for(let[n,r]of Object.entries(e)){if(!r||typeof r!=`object`)continue;let e=r;if(!(`api_key`in e))continue;let i=e.api_key;if(!(typeof i==`string`&&i.trim()))throw new t(`Provider '${n}' is configured but its API key is empty.`,a.AUTH,Jc[n]??`Provide credentials for provider '${n}'.`)}}function tl(e,t){let n=un(e);return{projectId:t??sn(cn(n))}}async function nl(e,t,n){let r=un(e),i=new _n({configPath:r,statePath:t}).getStatePath(tl(r,n));return vn.load(i)}let rl=!1;function il(e){if(rl)return;let t=hn.setDefaultFetch;typeof t==`function`&&(t(te(e)),rl=!0)}async function al(e,t,n={}){Xc();let r=await Fn(t,n);return $c(r.config.providers),Zc(r.config.providers,e),Qc(),(n.credentials??`all`)!==`none`&&el(r.config.providers),r}async function X(e,t,n={}){il(e);let{config:r,configPath:i,projectName:a}=await al(e,t,n);return{...xn({projectName:a,config:r,state:await nl(i,n.statePath,a),configPath:i,providers:r.providers}),configPath:i}}function ol(e,t){if(!(!t||t===`all`)&&!e.providers.has(t))throw new yn(`Provider '${t}' is not configured. Available providers: ${Array.from(e.providers.keys()).join(`, `)||`none`}.`)}function sl(e){let t=e;return typeof t.statusCode==`number`&&typeof t.responseBody==`string`}function cl(e){try{let t=JSON.parse(e);if(t&&typeof t==`object`)return t}catch{}return{message:e.trim()||void 0}}function ll(e){return/did not complete within the timeout/i.test(e.message)}async function Z(e){try{return await e()}catch(e){throw e instanceof t?e:e instanceof yn?ll(e)?new t(e.message,a.TIMEOUT,"The session may still be running — check `bl managed-agent session get --session-id <id>` or `session events`."):new t(e.message,a.USAGE):e instanceof Error&&sl(e)?Be(e.statusCode,cl(e.responseBody)):e instanceof TypeError&&e.message===`fetch failed`?e:e instanceof Error?new t(e.message,a.GENERAL):e}}var ul=T({description:`Validate an agents.yaml configuration (offline)`,auth:`none`,usageArgs:`[--file <path>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`}},exampleArgs:[``,`--file agents.yaml`],notes:Yc,async run(e){let{settings:n,flags:r}=e,i=E(n.output),o=r.file??`agents.yaml`,s=await Z(async()=>{let{config:t}=await al(e,o,{credentials:`none`});return Bn(t)}),c=s.filter(e=>e.severity===`error`).length;if(i===`json`)I({valid:c===0,diagnostics:s},i);else{for(let e of s){let t=e.resource?` (${e.resource.type}.${e.resource.name})`:``;F(`[${e.severity}] ${e.message}${t}`)}c===0&&F(`Configuration is valid.`)}if(c>0)throw new t(`Validation failed with ${c} error(s).`,a.GENERAL)}});function dl(e){return`${e.type}.${e.name} (${e.provider})`}async function Q(e){let t=console.log,n=console.info,r=(...e)=>{process.stderr.write(`${e.map(e=>String(e)).join(` `)}\n`)};console.log=r,console.info=r;try{return await e()}finally{console.log=t,console.info=n}}function fl(e){process.stderr.write(`${e.message}\n`)}var pl=T({description:`Show what changes would be applied to agent infrastructure`,auth:`apiKey`,usageArgs:`[--file <path>] [--provider <name>] [--no-refresh] [--refresh-only]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`},provider:{type:`string`,valueHint:`<name>`,description:`Target provider (default: all configured)`},noRefresh:{type:`switch`,description:`Skip refreshing state from remote before planning`},refreshOnly:{type:`switch`,description:`Refresh state and show drift without planning remote mutations`}},exampleArgs:[``,`--provider bailian`,`--no-refresh`],notes:[...Y,`--no-refresh and --dry-run plan offline from local config and state: no remote requests, no state writes, provider keys are not checked.`],async run(e){let{settings:n,flags:r}=e,i=E(n.output),o=r.file??`agents.yaml`,s=!!r.noRefresh||n.dryRun,c=(await Z(()=>Q(async()=>{let t=await X(e,o,{credentials:s?`none`:`all`});return ol(t,r.provider),Pn(t,{provider:r.provider,refresh:!s,quiet:i===`json`,onFeedback:i===`json`?void 0:fl})}))).plan,l=c.diagnostics.some(e=>e.severity===`error`);if(i===`json`){if(I(c,i),l)throw new t(`Plan contains errors.`,a.GENERAL);return}for(let e of c.diagnostics)F(`[${e.severity}] ${e.code}: ${e.message}`);if(l)throw new t(`Plan contains errors.`,a.GENERAL);let u=c.actions.filter(e=>e.action===`create`),d=c.actions.filter(e=>e.action===`update`),f=c.actions.filter(e=>e.action===`delete`);if(u.length+d.length+f.length===0){F(`No changes. Infrastructure is up-to-date.`),r.refreshOnly&&F(`Refresh-only mode: no remote mutations were performed.`);return}F(`
402
+ Planned actions:
403
+ `);for(let e of u)F(` + ${dl(e.address)}`);for(let e of d)F(` ~ ${dl(e.address)}`),e.reason&&F(` ${e.reason}`);for(let e of f)F(` - ${dl(e.address)}`);F(`\nPlan: ${u.length} to create, ${d.length} to update, ${f.length} to destroy.`),r.refreshOnly&&F(`Refresh-only mode: no remote mutations will be performed.`)}}),ml=T({description:`Apply planned changes to create/update/delete agent resources`,auth:`apiKey`,usageArgs:`[--file <path>] [--provider <name>] [--yes] [--concurrency <n>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`},provider:{type:`string`,valueHint:`<name>`,description:`Target provider (default: all configured)`},yes:{type:`switch`,description:`Confirm and apply without an interactive prompt (required to mutate)`},noRefresh:{type:`switch`,description:`Skip refreshing state from remote before planning`},concurrency:{type:`number`,valueHint:`<n>`,description:`Max independent resources to apply in parallel (default 6, max 10)`}},exampleArgs:[`--yes`,`--provider bailian --yes`],notes:Y,async run(e){let{settings:n,flags:r}=e,i=E(n.output),o=r.file??`agents.yaml`;if(n.dryRun){I({would_apply:{provider:r.provider??`all`,refresh:!r.noRefresh,concurrency:r.concurrency},config_file:o,hint:"Run `managed-agent plan` to preview the exact resource changes."},i);return}let s=await Z(()=>Q(async()=>{let t=await X(e,o);return ol(t,r.provider),Pn(t,{provider:r.provider,refresh:!r.noRefresh,quiet:!0,onFeedback:fl})})),c=s.plan,l=e=>{i===`json`?process.stderr.write(`${e}\n`):F(e)};if(c.diagnostics.some(e=>e.severity===`error`)){for(let e of c.diagnostics)e.severity===`error`&&l(`[error] ${e.code}: ${e.message}`);throw new t(`Cannot apply: resolve the errors above first.`,a.GENERAL)}let u=c.actions.filter(e=>e.action!==`no-op`);if(u.length===0){i===`json`?I({succeeded:0,failed:0,skipped:0,results:[]},i):F(`No changes. Infrastructure is up-to-date.`);return}let d=u.filter(e=>e.action===`create`).length,f=u.filter(e=>e.action===`update`).length,p=s.destructiveActions;for(let e of u)l(` ${e.action===`create`?`+`:e.action===`update`?`~`:`-`} ${dl(e.address)}`);if(!r.yes)throw new t(`Refusing to apply ${u.length} change(s) (${d} create, ${f} update, ${p.length} destroy) without confirmation.`,a.USAGE,"Review with `bl managed-agent plan`, then re-run with --yes to apply.");let m=await Z(()=>Q(()=>Tn(s,{onFeedback:fl,policy:`force`,concurrency:r.concurrency}))),h=m.results.filter(e=>e.status===`success`).length,g=m.results.filter(e=>e.status===`failed`).length,_=m.results.filter(e=>e.status===`skipped`).length;if(i===`json`?I({succeeded:h,failed:g,skipped:_,results:m.results},i):F(`\nApply finished: ${h} succeeded, ${g} failed, ${_} skipped.`),g>0)throw new t(`Apply failed.`,a.GENERAL)}}),hl=T({description:`Destroy all managed agent resources tracked in state`,auth:`apiKey`,usageArgs:`[--file <path>] [--yes] [--cascade]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`},yes:{type:`switch`,description:`Confirm and destroy without an interactive prompt (required)`},cascade:{type:`switch`,description:`Auto-delete dependent resources (e.g. sessions referencing an environment)`}},exampleArgs:[`--yes`,`--yes --cascade`],notes:Y,async run(e){let{settings:n,flags:r}=e,i=E(n.output),o=r.file??`agents.yaml`;if(n.dryRun){I({would_destroy:{cascade:!!r.cascade},config_file:o,hint:"Run `managed-agent state list` to see the resources tracked in state."},i);return}let s=await Z(()=>Q(async()=>Nn(await X(e,o)))),c=s.resources;if(c.length===0){i===`json`?I({destroyed:0,total:0},i):F(`No resources in state. Nothing to destroy.`);return}for(let e of c){let t=` - ${dl(e.address)} [${e.remote_id}]`;i===`json`?process.stderr.write(`${t}\n`):F(t)}if(!r.yes)throw new t(`Refusing to destroy ${c.length} resource(s) without confirmation.`,a.USAGE,`Re-run with --yes to destroy (add --cascade to remove dependents).`);let l=await Z(()=>Q(()=>wn(s,{cascade:r.cascade,onCascadeRequired:async()=>!!r.cascade,onResourceResult:e=>{let t=dl(e.resource.address);process.stderr.write(` ${e.status===`success`?`✓`:`✗`} ${t}\n`)}})));if(i===`json`?I({destroyed:l.destroyed,total:l.resources.length},i):F(`\n${l.partial?`Destroy incomplete`:`Destroy complete`}. ${l.destroyed}/${l.resources.length} resources removed.`),l.partial)throw new t(l.results.find(e=>e.status!==`success`)?.error||`Destroy incomplete: ${l.destroyed}/${l.resources.length} resources removed.`,a.GENERAL)}}),gl=T({description:`List resources tracked in agents state`,auth:`none`,usageArgs:`[--file <path>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`}},exampleArgs:[``,`--file agents.yaml`],notes:Yc,async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.file??`agents.yaml`,a=await Z(()=>Q(async()=>(await X(e,i,{credentials:`none`})).state.listResources()));if(r===`json`){I({resources:a},r);return}if(a.length===0){F(`No resources tracked in state.`);return}let o=[`TYPE`,`NAME`,`PROVIDER`,`REMOTE ID`],s=a.map(e=>[e.address.type,e.address.name,e.address.provider,e.remote_id??`(local)`]);for(let e of L(o,s))F(e);F(`\nTotal: ${a.length}`)}}),_l=T({description:`Show details of a resource in agents state`,auth:`none`,usageArgs:`--address <provider.type.name> [--file <path>]`,flags:{address:{type:`string`,valueHint:`<provider.type.name>`,description:`Resource state address (required)`,required:!0},file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`}},exampleArgs:[`--address bailian.agent.assistant`],notes:Yc,async run(e){let{settings:n,flags:r}=e,i=E(n.output),o=r.file??`agents.yaml`,s=await Z(()=>Q(async()=>{let t=await X(e,o,{credentials:`none`}),n=Mn(r.address,{requireProvider:!1});return t.state.findResource(n)}));if(!s)throw new t(`Resource not found: ${r.address}`,a.GENERAL);i===`json`?I(s,i):F(JSON.stringify(s,null,2))}}),vl=T({description:`Remove a resource from state without destroying it remotely`,auth:`none`,usageArgs:`--address <provider.type.name> [--file <path>]`,flags:{address:{type:`string`,valueHint:`<provider.type.name>`,description:`Resource state address (required)`,required:!0},file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`}},exampleArgs:[`--address bailian.agent.assistant`],notes:Yc,async run(e){let{settings:n,flags:r}=e,i=E(n.output),o=r.file??`agents.yaml`;if(n.dryRun){await Z(async()=>{Mn(r.address,{requireProvider:!1})}),I({would_remove:r.address,config_file:o},i);return}await Z(()=>Q(async()=>{let n=await X(e,o,{credentials:`none`}),i=Mn(r.address,{requireProvider:!1}),s=n.state.findResource(i);if(!s)throw new t(`Resource not found: ${r.address}`,a.GENERAL);n.state.removeResource(s.address),await n.state.save()}));let s=`Removed ${r.address} from state (remote resource not deleted).`;i===`json`?I({removed:r.address},i):F(s)}}),yl=T({description:`Import an existing remote resource into agents state`,auth:`apiKey`,usageArgs:`--address <provider.type.name> --remote-id <id> [--resource-version <n>] [--file <path>]`,flags:{address:{type:`string`,valueHint:`<provider.type.name>`,description:`Resource state address (required)`,required:!0},remoteId:{type:`string`,valueHint:`<id>`,description:`Existing remote resource ID to import (required)`,required:!0},resourceVersion:{type:`number`,valueHint:`<n>`,description:`Resource version (for versioned resources like agents)`},file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`}},exampleArgs:[`--address bailian.agent.assistant --remote-id agent-abc123`],notes:Y,async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.file??`agents.yaml`;if(t.dryRun){await Z(async()=>{Mn(n.address,{requireProvider:!0})}),I({would_import:n.address,remote_id:n.remoteId,resource_version:n.resourceVersion,config_file:i},r);return}await Z(()=>Q(async()=>{let t=Mn(n.address,{requireProvider:!0});await Dn(await X(e,i),t,n.remoteId,{resourceVersion:n.resourceVersion})})),r===`json`?I({imported:n.address,remote_id:n.remoteId},r):F(`Imported ${n.address} (remote_id: ${n.remoteId}) into state.`)}});function bl(e){return e.type!==`thinking`&&!(e.type===`message`&&e.role===`user`)}function xl(e,t){t||process.stderr.write(`\n[session ${e}]\n`)}function Sl(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.type===`error`&&n.content?.trim())return n.content}}function Cl(e,n){if(e===`failed`)throw new t(n??`Session failed.`,a.GENERAL)}async function wl(e,t,n={}){let r=[],i,a;for await(let n of e)if(t?r.push(n):Tl(n),n.type===`error`&&n.content?.trim()&&(a=n.content),n.type===`status`&&On(n.status)){i=n.status,xl(n.status??``,t);break}t&&process.stdout.write(`${JSON.stringify({...n,events:Vn(r)},null,2)}\n`),Cl(i,a)}function Tl(e){if(bl(e))if(e.type===`message`&&e.content)process.stdout.write(e.content);else if(e.type===`tool_use`)process.stderr.write(`\n[tool] ${e.tool_name}\n`);else if(e.type===`tool_result`&&e.content){let t=e.content.length>200?`${e.content.slice(0,200)}...`:e.content;process.stderr.write(`${t}\n`)}else e.type===`status`?e.status===`running`&&process.stderr.write(`
404
+ [session running]
405
+ `):e.type===`error`&&process.stderr.write(`\n[error] ${e.content??`unknown error`}\n`)}function El(e,t,n={}){if(t)process.stdout.write(`${JSON.stringify({...n,events:Vn(e.result.events),has_more:e.result.has_more,next_page:e.result.next_page},null,2)}\n`);else{for(let t of e.result.events)Tl(t);xl(e.terminalStatus,t)}Cl(e.terminalStatus,Sl(e.result.events))}function Dl(e){return e?e.split(`,`).map(e=>e.trim()).filter(Boolean):void 0}var Ol=T({description:`Create a new session for an agent`,auth:`apiKey`,usageArgs:`[--agent <name>] [--environment <name>] [--title <title>] [--file <path>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`},agent:{type:`string`,valueHint:`<name>`,description:`Agent name (auto-detected when only one agent is configured)`},environment:{type:`string`,valueHint:`<name>`,description:`Override agent's declared environment`},vault:{type:`string`,valueHint:`<name>`,description:`Override agent's declared vault`},memoryStores:{type:`string`,valueHint:`<names>`,description:`Override agent's memory stores (comma-separated)`},title:{type:`string`,valueHint:`<title>`,description:`Session title`},provider:{type:`string`,valueHint:`<name>`,description:`Target provider (multi-provider agents)`}},exampleArgs:[``,`--agent assistant`,`--agent assistant --title 'debug run'`],notes:Y,async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.file??`agents.yaml`;if(t.dryRun){I({would_create_session:{agent:n.agent??`auto`,provider:n.provider??`auto`,environment:n.environment,vault:n.vault,memory_stores:Dl(n.memoryStores),title:n.title},config_file:i},r);return}let{agentName:a,session:o}=await Z(()=>Q(async()=>Sn(await X(e,i),{agent:n.agent,provider:n.provider,environment:n.environment,vault:n.vault,memoryStores:Dl(n.memoryStores),title:n.title})));if(r===`json`){I({agent:a,session:o},r);return}F(`Session created: ${o.id}`),F(` Agent: ${a}`),F(` Environment: ${o.environment_id}`),F(` Status: ${o.status}`),o.vault_ids.length&&F(` Vaults: ${o.vault_ids.join(`, `)}`),o.memory_store_ids.length&&F(` Memory: ${o.memory_store_ids.join(`, `)}`)}});async function kl(e,t){let n=await e(),r=[...n.items],i=n.hasMore,a=n.nextPage;for(;t&&a;){let t=await e(a);r.push(...t.items),i=t.hasMore,a=t.nextPage}return{items:r,hasMore:i,nextPage:a}}var Al=T({description:`List sessions from the provider`,auth:`apiKey`,usageArgs:`[--agent <name>] [--all] [--provider <name>] [--file <path>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`},agent:{type:`string`,valueHint:`<name>`,description:`Filter by agent name`},all:{type:`switch`,description:`Fetch all pages by following the cursor`},provider:{type:`string`,valueHint:`<name>`,description:`Target provider`}},exampleArgs:[``,`--agent assistant`,`--all`],notes:Y,async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.file??`agents.yaml`,{items:a,hasMore:o}=await Z(()=>Q(async()=>{let t=await X(e,i);return kl(async e=>{let r=await An(t,{agent:n.agent,provider:n.provider,filter:e?{page:e}:void 0});return{items:r.summaries,hasMore:r.hasMore,nextPage:r.nextPage}},n.all)})),s=a.map(e=>e.session);if(r===`json`){I({sessions:s,has_more:o},r);return}if(s.length===0){F(`No sessions found.`);return}let c=new Map(a.filter(e=>e.agentName).map(e=>[e.session.id,e.agentName])),l=[`ID`,`TITLE`,`AGENT`,`STATUS`,`CREATED`],u=s.map(e=>[e.id,(e.title??``).slice(0,20),c.get(e.id)??e.agent_id.slice(0,12),e.status,e.created_at]);for(let e of L(l,u))F(e);F(`\nTotal: ${s.length}`),o&&F(`More sessions available. Use --all to fetch all.`)}}),jl=T({description:`Get details of a session`,auth:`apiKey`,usageArgs:`--session-id <id> [--provider <name>] [--file <path>]`,flags:{sessionId:{type:`string`,valueHint:`<id>`,description:`Session ID (required)`,required:!0},file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`},provider:{type:`string`,valueHint:`<name>`,description:`Target provider`}},exampleArgs:[`--session-id sess_abc123`],notes:Y,async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.file??`agents.yaml`,a=await Z(()=>Q(async()=>En(await X(e,i),n.sessionId,n.provider)));if(r===`json`){I(a,r);return}F(` ID: ${a.id}`),F(` Agent: ${a.agent_id}`),F(` Environment: ${a.environment_id}`),F(` Status: ${a.status}`),a.title&&F(` Title: ${a.title}`),F(` Created: ${a.created_at}`),F(` Updated: ${a.updated_at}`)}}),Ml=T({description:`Delete a session`,auth:`apiKey`,usageArgs:`--session-id <id> [--provider <name>] [--file <path>]`,flags:{sessionId:{type:`string`,valueHint:`<id>`,description:`Session ID (required)`,required:!0},file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`},provider:{type:`string`,valueHint:`<name>`,description:`Target provider`}},exampleArgs:[`--session-id sess_abc123`],notes:Y,async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.file??`agents.yaml`;if(t.dryRun){I({would_delete_session:n.sessionId,provider:n.provider??`auto`,config_file:i},r);return}await Z(()=>Q(async()=>{await Cn(await X(e,i),n.sessionId,n.provider)})),r===`json`?I({deleted:n.sessionId},r):F(`Session ${n.sessionId} deleted.`)}}),Nl=T({description:`Create a session, send a message, and stream the response`,auth:`apiKey`,usageArgs:`--prompt <text> [--agent <name>] [--no-stream] [--file <path>]`,flags:{prompt:{type:`string`,valueHint:`<text>`,description:`Prompt to send (required)`,required:!0},file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`},agent:{type:`string`,valueHint:`<name>`,description:`Agent name (auto-detected when only one agent is configured)`},environment:{type:`string`,valueHint:`<name>`,description:`Override agent's declared environment`},vault:{type:`string`,valueHint:`<name>`,description:`Override agent's declared vault`},memoryStores:{type:`string`,valueHint:`<names>`,description:`Override agent's memory stores (comma-separated)`},title:{type:`string`,valueHint:`<title>`,description:`Session title`},provider:{type:`string`,valueHint:`<name>`,description:`Target provider`},noStream:{type:`switch`,description:`Use polling instead of SSE streaming`}},exampleArgs:[`--prompt "hello"`,`--agent assistant --prompt "summarize this repo"`],notes:[...Y,"--output json emits one envelope: { session_id, provider, agent, events } — read session_id to chain `session send/get/events/delete`."],async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.file??`agents.yaml`,a=r===`json`,o={agent:n.agent,provider:n.provider,environment:n.environment,vault:n.vault,memoryStores:Dl(n.memoryStores),title:n.title};if(t.dryRun){I({would_run:{prompt:n.prompt,agent:n.agent??`auto`,provider:n.provider??`auto`,environment:n.environment,vault:n.vault,memory_stores:o.memoryStores,title:n.title,mode:n.noStream?`polling`:`streaming`},config_file:i},r);return}await Z(()=>Q(async()=>{let t=await X(e,i);if(n.noStream){let e=await zn(t,n.prompt,o);a||process.stderr.write(`Session created: ${e.session.id}\n`),El(e,a,{session_id:e.session.id,provider:e.provider,agent:e.agentName})}else{let e=await Rn(t,n.prompt,o);a||process.stderr.write(`Session created: ${e.session.id}\n`),await wl(e.events,a,{session_id:e.session.id,provider:e.provider,agent:e.agentName})}}))}}),Pl=T({description:`Send a message to an existing session and stream the response`,auth:`apiKey`,usageArgs:`--session-id <id> --message <text> [--no-stream] [--file <path>]`,flags:{sessionId:{type:`string`,valueHint:`<id>`,description:`Session ID (required)`,required:!0},message:{type:`string`,valueHint:`<text>`,description:`Message to send (required)`,required:!0},file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`},provider:{type:`string`,valueHint:`<name>`,description:`Target provider`},noStream:{type:`switch`,description:`Use polling instead of SSE streaming`}},exampleArgs:[`--session-id sess_abc123 --message "continue"`],notes:Y,async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.file??`agents.yaml`,a=r===`json`;if(t.dryRun){I({would_send:{session_id:n.sessionId,message:n.message,provider:n.provider??`auto`,mode:n.noStream?`polling`:`streaming`},config_file:i},r);return}await Z(()=>Q(async()=>{let t=await X(e,i);n.noStream?El(await In(t,n.sessionId,n.message,{provider:n.provider}),a,{session_id:n.sessionId}):await wl(await Ln(t,n.sessionId,n.message,{provider:n.provider}),a,{session_id:n.sessionId})}))}}),Fl=T({description:`List event history for a session`,auth:`apiKey`,usageArgs:`--session-id <id> [--limit <n>] [--all] [--file <path>]`,flags:{sessionId:{type:`string`,valueHint:`<id>`,description:`Session ID (required)`,required:!0},file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`},provider:{type:`string`,valueHint:`<name>`,description:`Target provider`},limit:{type:`number`,valueHint:`<n>`,description:`Maximum number of events to fetch`},all:{type:`switch`,description:`Fetch all pages by following the cursor`}},exampleArgs:[`--session-id sess_abc123`,`--session-id sess_abc123 --all`],notes:Y,async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.file??`agents.yaml`,{items:a,hasMore:o}=await Z(()=>Q(async()=>{let t=await X(e,i);return kl(async e=>{let r=await kn(t,n.sessionId,{provider:n.provider,limit:n.limit,page_token:e});return{items:r.events,hasMore:r.has_more,nextPage:r.next_page}},n.all)}));if(r===`json`){I({events:Vn(a),has_more:o},r);return}if(a.length===0){F(`No events found.`);return}let s=[`#`,`TYPE`,`CONTENT`],c=a.map((e,t)=>{let n=``;return n=e.type===`message`?(e.content??``).slice(0,60):e.type===`tool_use`?e.tool_name??``:e.type===`tool_result`?(e.content??``).slice(0,60):e.type===`status`?e.status??``:e.type===`error`?(e.content??``).slice(0,60):e.raw_type,[String(t+1),e.type,n]});for(let e of L(s,c))F(e);F(`\nTotal: ${a.length}`),o&&F(`More events available. Use --all to fetch all.`)}});const Il=[`custom`,`official`,`all`];var Ll=T({description:`List skills from the provider's skill catalog`,auth:`apiKey`,usageArgs:`[--source custom|official|all] [--provider <name>] [--file <path>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Config file path (default: agents.yaml)`},source:{type:`string`,valueHint:`<source>`,description:`Skill catalog: custom (workspace-uploaded, default), official (built-in), or all (both catalogs in one call)`},provider:{type:`string`,valueHint:`<name>`,description:`Target provider`}},exampleArgs:[``,`--source official`,`--source all --output json`,`--source custom --provider bailian`],notes:[...Y,`Providers without a skill listing API (e.g. ark) return an empty list.`,"For agent-driven skill selection, use `--source all --output json`: one call returns both catalogs with per-skill `source` and `description` fields to pick from.",`When generating a task that needs a suitable skill, call this command to match official or custom skills before wiring them into the task.`],validate:e=>e.source&&!Il.includes(e.source)?`--source must be one of: custom, official, all.`:void 0,async run(e){let{settings:t,flags:n}=e,r=E(t.output),i=n.file??`agents.yaml`,a=n.source??`custom`,o=await Z(()=>Q(async()=>{let t=await X(e,i);if(a!==`all`)return jn(t,{provider:n.provider,source:a});let[r,o]=await Promise.all([jn(t,{provider:n.provider,source:`custom`}),jn(t,{provider:n.provider,source:`official`})]);return[...r,...o]}));if(r===`json`){I({source:a,skills:o},r);return}if(o.length===0){F(a===`all`?`No skills found.`:`No ${a} skills found.`);return}let s=[`ID`,`NAME`,`SOURCE`,`STATUS`,`VERSION`,`CREATED`],c=o.map(e=>[e.id,e.name.slice(0,32),e.source,e.status,e.latest_version??`-`,e.created_at??`-`]);for(let e of L(s,c))F(e);F(`\nTotal: ${o.length} (${a})`)}});const $={loginInfo:`zeldaEasy.cornerstone-portal.cs-console.loginInfo`,initSpace:`zeldaEasy.bailian-dash-workspace.space.initSpace`,queryBuyResult:`zeldaEasy.bailian-commerce.bill.queryBuyPostpaidResult`,commodityOrderInfo:`zeldaEasy.bailian-commerce.bill.postpaidCommodityOrderInfo`,buyCommodity:`zeldaEasy.bailian-commerce.bill.buyPostpaidCommodity`},Rl={accessKeyId:{type:`string`,valueHint:`<id>`,description:`Alibaba Cloud Access Key ID`},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:`Alibaba Cloud Access Key Secret`},securityToken:{type:`string`,valueHint:`<token>`,description:`Alibaba Cloud STS Security Token (optional)`}},zl=1e3;function Bl(e){return new Promise(t=>setTimeout(t,e))}function Vl(e){return e?.data?.DataV2?.data?.data}function Hl(e){let t=e?.data?.data;if(!Array.isArray(t)||t.length===0)return;let n=(t.find(e=>e?.defaultAgent===!0)??t[0])?.tenantId,r=typeof n==`string`?Number(n):n;return typeof r==`number`&&Number.isFinite(r)?r:void 0}var Ul=T({description:`Initialize Bailian workspace and activate postpaid services`,auth:`none`,usageArgs:`--access-key-id <id> --access-key-secret <secret> [--security-token <token>]`,flags:Rl,exampleArgs:[`--access-key-id LTAIxxxxx --access-key-secret xxxxx`],async run(e){let{settings:n,flags:r}=e,i=E(n.output);if(n.dryRun){I({apis:[{step:0,api:`GenerateCLIAccessToken`,description:`Generate CLI access token from AK/SK`},{step:1,api:$.loginInfo,description:`Check login & workspace status`},{step:2,api:$.initSpace,description:`Initialize workspace (if needed)`},{step:3,api:`CreateUser`,description:`Create console user via BailianControl OpenAPI (CreateUser)`},{step:4,api:`ListWorkspaces`,description:`List workspaces to resolve agentId`},{step:5,api:`ResetPolicies4Agent`,description:`Authorize user permissions`},{step:6,api:$.queryBuyResult,description:`Query postpaid order status`},{step:7,api:$.commodityOrderInfo,description:`Query commodity activation status`},{step:8,api:$.buyCommodity,description:`Activate postpaid commodities (if needed)`}]},i);return}let{accessKeyId:o,accessKeySecret:s}=r;if(!o||!s)throw new t(`workspace init requires --access-key-id and --access-key-secret.`,a.USAGE);let c=r.securityToken||void 0,l=(await he({identity:e.identity,settings:n,baseUrl:e.client.baseUrl,accessKeyId:o,accessKeySecret:s,securityToken:c})).cliAccessToken;if(!l)throw new t(`Failed to generate CLI access token from AK/SK.`,a.GENERAL);let u=se(n),d={region:u.consoleRegion,site:u.consoleSite,...u.consoleSwitchAgent==null?{}:{switchAgent:u.consoleSwitchAgent},token:l},f=n.verbose,p=async(e,r={})=>{f&&process.stderr.write(`> ${e}\n`);try{let t=await y(d,n.timeout,{api:e,data:r},n);return f&&process.stderr.write(`< ${JSON.stringify(t)}\n`),t}catch(e){if(f){let n=e instanceof t?e.rawResponse??e.message:String(e);process.stderr.write(`< ERROR: ${n}\n`)}throw e}};F(`Checking workspace status...`);let m=Vl(await p($.loginInfo));m?.spaceInited===!0?F(`Workspace already initialized.`):(F(`Initializing workspace...`),await p($.initSpace),F(`Workspace initialized.`));let h=m?.aliyun?.uid;if(typeof h!=`string`||h.length===0)throw new t(`Console login info did not include aliyun.uid.`,a.GENERAL);let g={identity:e.identity,settings:n,baseUrl:e.client.baseUrl,regionId:u.consoleRegion,accessKeyId:o,accessKeySecret:s,securityToken:c};try{await S({...g,reqDTO:{outerKey:h,nickName:h,userName:h}})}catch(e){if(!(e instanceof t)||!/already exists/i.test(e.message))throw e;F(`Console user already exists, continuing.`)}F(`Resolving workspace agent...`);let _=Hl(await Ne(g));if(_==null)throw new t(`Could not resolve agentId from ListWorkspaces response.`,a.GENERAL,`Re-run with --verbose to inspect the ListWorkspaces response body.`);F(`Authorizing user permissions...`),await it({...g,outerKey:h,agentId:_,policyIndexList:[1]}),await Wl(p,i)}});async function Wl(e,n){F(`Checking service activation status...`);let r;for(let t=0;t<20;t++){let n=Vl(await e($.queryBuyResult));if(r=typeof n==`string`?n:n?.result,r!==`buying`)break;t===0&&F(`Service activation in progress, polling...`),await Bl(zl)}if(r===`fail`)throw new t(`Service activation failed.`,a.GENERAL);if(r===`success`){await ql(e,n);return}await Kl(e,n)}function Gl(e){let t=Vl(e);return Array.isArray(t)?t:[]}async function Kl(e,t){let n=Gl(await e($.commodityOrderInfo)),r=n.filter(e=>e.status===11);if(r.length>0){F(`Warning: Some services are overdue:`);for(let e of r)F(` - ${e.commodityCode}`)}let i=n.filter(e=>e.status===1);if(i.length>0){F(`Activating ${i.length} postpaid services...`),await e($.buyCommodity),await ql(e,t);return}I({status:`ready`,activeServices:n.filter(e=>e.status===10).map(e=>e.commodityCode)},t)}async function ql(e,n){F(`Waiting for services to activate...`);for(let t=0;t<20;t++){let t=Gl(await e($.commodityOrderInfo));if(t.filter(e=>e.status!==10&&e.status!==11).length===0){let e=t.filter(e=>e.status===11);if(e.length>0){F(`Warning: Some services are overdue:`);for(let t of e)F(` - ${t.commodityCode}`)}I({status:`ready`,activeServices:t.filter(e=>e.status===10).map(e=>e.commodityCode)},n);return}await Bl(zl)}throw new t(`Timed out waiting for services to activate.`,a.TIMEOUT)}var Jl=T({description:`Install or upgrade an allowlisted Command Pack`,auth:`none`,usageArgs:`--package <name[@version]>`,flags:{package:{type:`string`,valueHint:`<name[@version]>`,description:`Allowlisted Command Pack package and optional version or tag`,required:!0}},exampleArgs:[`--package @ali/bailian-plugin-agent`,`--package @ali/bailian-plugin-agent@beta`],async run(e){I({installed:await e.commandPacks.install(e.flags.package)},E(e.settings.output))}}),Yl=T({description:`Link an allowlisted local Command Pack for development`,auth:`none`,usageArgs:`--path <directory>`,flags:{path:{type:`string`,valueHint:`<directory>`,description:`Local Command Pack package directory`,required:!0}},exampleArgs:[`--path ../bailian-plugin-agent`],async run(e){I({linked:await e.commandPacks.link(e.flags.path)},E(e.settings.output))}}),Xl=T({description:`List installed Command Packs and their load status`,auth:`none`,exampleArgs:[``,`--output json`],async run(e){let t=await e.commandPacks.list(),n=E(e.settings.output);if(n===`json`){I({command_packs:t},n);return}if(t.length===0){F(`No Command Packs installed.`);return}let r=t.map(e=>[e.name,e.version??`-`,e.source,e.status,e.commands.join(`, `)||e.error||`-`]);for(let e of L([`NAME`,`VERSION`,`SOURCE`,`STATUS`,`COMMANDS / ERROR`],r))F(e)}}),Zl=T({description:`Remove an installed Command Pack`,auth:`none`,usageArgs:`--name <package>`,flags:{name:{type:`string`,valueHint:`<package>`,description:`Allowlisted Command Pack package name`,required:!0}},exampleArgs:[`--name @ali/bailian-plugin-agent`],async run(e){await e.commandPacks.remove(e.flags.name),I({removed:e.flags.name},E(e.settings.output))}});export{To as advisorRecommend,ki as appCall,ji as appList,pr as authGenerateAccessToken,ur as authLogin,fr as authLogout,dr as authStatus,wi as configAgent,ni as configList,ti as configSet,ei as configShow,ui as configUi,ri as configUse,ha as consoleCall,bs as datasetDelete,ys as datasetGet,vs as datasetList,_s as datasetUpload,Ss as datasetValidate,lc as deployAudioCreate,gc as deployDelete,fc as deployGet,uc as deployImageCreate,dc as deployList,pc as deployModels,mc as deployScale,cc as deployTextCreate,hc as deployUpdate,ma as fileUpload,Is as finetuneAudioCreate,Bs as finetuneCancel,nc as finetuneCapability,Ks as finetuneCheckpoints,Vs as finetuneDelete,qs as finetuneExport,zs as finetuneGet,Ls as finetuneImageCreate,Rs as finetuneList,Gs as finetuneLogs,Fs as finetuneTextCreate,Qs as finetuneWatch,Ir as imageEdit,Or as imageGenerate,qi as knowledgeChat,zi as knowledgeRetrieve,Vi as knowledgeSearch,ml as managedAgentApply,hl as managedAgentDestroy,Gc as managedAgentInit,pl as managedAgentPlan,Ol as managedAgentSessionCreate,Ml as managedAgentSessionDelete,Fl as managedAgentSessionEvents,jl as managedAgentSessionGet,Al as managedAgentSessionList,Nl as managedAgentSessionRun,Pl as managedAgentSessionSend,Ll as managedAgentSkillList,yl as managedAgentStateImport,gl as managedAgentStateList,vl as managedAgentStateRm,_l as managedAgentStateShow,ul as managedAgentValidate,ea as mcpCall,na as mcpList,ra as mcpTools,Mi as memoryAdd,Ii as memoryDelete,Pi as memoryList,Li as memoryProfileCreate,Ri as memoryProfileGet,Ni as memorySearch,Fi as memoryUpdate,Lo as modelList,io as pipelineRun,lo as pipelineValidate,Jl as pluginInstall,Yl as pluginLink,Xl as pluginList,Zl as pluginRemove,gs as quotaCheck,ls as quotaHistory,Xo as quotaList,ns as quotaRequest,ia as searchWeb,fa as speechRecognize,la as speechSynthesize,gr as textChat,Cr as textOmni,Rc as tokenPlanAddMember,Fc as tokenPlanAssignSeats,jc as tokenPlanCreateKey,Dc as tokenPlanListSeats,Oi as update,Fa as usageFree,Ba as usageFreetier,to as usageStats,no as usageSummary,Wr as videoDownload,Vr as videoEdit,Br as videoGenerate,Hr as videoRef,Ur as videoTaskGet,Jr as visionDescribe,Ul as workspaceInit,Ho as workspaceList};