bailian-cli-commands 1.15.0 → 1.16.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.d.mts +1400 -236
- package/dist/index.mjs +97 -87
- package/package.json +3 -3
package/dist/index.mjs
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import{ASYNC_FLAG as e,BailianError as t,CONCURRENT_FLAG as n,DEFAULT_INSTALL_PS1_URL as r,DEFAULT_INSTALL_SCRIPT_URL as i,DEFAULT_TRAINING_TYPE as a,DOCS_HOSTS as o,ExitCode as s,
|
|
1
|
+
import{ASYNC_FLAG as e,BailianError as t,CONCURRENT_FLAG as n,DEFAULT_INSTALL_PS1_URL as r,DEFAULT_INSTALL_SCRIPT_URL as i,DEFAULT_TRAINING_TYPE as a,DOCS_HOSTS as o,ExitCode as s,MAX_CPT_BYTES as c,MAX_DATASET_BYTES as l,MAX_MEDIA_ZIP_BYTES as u,MODEL_LIST_API as d,RAG_PATHS as f,REGIONS as p,SEMANTIC_TOP_K as m,STRATEGIES as h,TRAINING_TYPES_CLI as g,UsageError as _,analyzeIntent as v,anonymousConsoleCall as y,appCompletionPath as b,bailianMcpPath as x,buildAcsCanonicalQuery as S,buildAsrFlashRequest as C,buildAsyncAsrLanguageFields as ee,buildDocLink as te,callConsoleGateway as ne,cancelFineTune as re,chatPath as ie,collectAsrTranscriptionItems as ae,computeSkillStatuses as oe,createBailianControlUser as se,createDeployment as ce,createFineTune as le,createInstrumentedFetch as ue,defaultDeployPlan as de,defineCommand as w,deleteConfigProfile as fe,deleteDataset as pe,deleteDeployment as me,deleteFineTune as he,detectInstalledAgents as ge,detectModality as _e,detectOutputFormat as T,effectiveConsoleGatewayConfig as ve,estimateCptTokens as ye,estimateSftDpoTokens as be,exportCheckpoint as xe,extractAsrFlashText as Se,fanOutSkillToAgents as Ce,fetchModelCapability as we,fetchModelDetail as Te,fetchModelGroups as Ee,fetchModelListAll as De,fetchPredictConfig as Oe,fetchSkillsIndex as ke,fetchTrainingModelPrice as Ae,findDeploymentEntry as je,findModelByName as Me,formatIssue as Ne,generateCLIAccessToken as Pe,generateFilename as Fe,getConfigDir as Ie,getDataset as Le,getDeployment as Re,getFineTune as ze,getFineTuneLogs as Be,getModelProfilePreset as Ve,getModels as He,getProfile as Ue,getSkillRegistryBaseUrl as We,getUpdateInstallMethod as Ge,image2videoPath as Ke,imageFileToDataUri as qe,installSkillWithFanout as Je,isLocalFile as Ye,isStreamableHttpUnsupported as Xe,isTrainingTypeCli as Ze,knowledgeChatEndpoint as Qe,knowledgeRetrievePath as $e,knowledgeSearchEndpoint as et,listBailianControlWorkspaces as tt,listCheckpoints as nt,listDatasets as rt,listDeployableModels as it,listDeployments as at,listFineTunes as ot,listIndependentDeployedModels as st,listSkillDirsOnDisk as ct,listSupportedTrainingTypes as lt,mapApiError as ut,maskToken as dt,maybeSyncWikiData as ft,mcpWebSearchPath as pt,memoryAddPath as mt,memoryListPath as ht,memoryNodePath as gt,memorySearchPath as _t,modelSupportsTrainingType as vt,modelsLimitsPath as yt,modelsPermissionsPath as bt,normalizeConfigName as xt,normalizeModelBaseUrl as St,parseDatasetSchemaFlag as Ct,parseSSE as wt,parseSkillNames as Tt,pickPlanStrategy as Et,preflightBatchSizeGate as Dt,profileSchemaPath as Ot,ragEndpoint as E,rankModels as kt,readConfigFile as At,readSkillLock as jt,readTextFromPathOrStdin as Mt,recallSemantic as Nt,redactDataUri as D,removeSkillDir as Pt,requestJson as Ft,resetBailianControlPolicies4Agent as It,resolveAsrApi as Lt,resolveBooleanFlag as Rt,resolveImageEditApi as zt,resolveImageGenerateApi as Bt,resolveOutputDir as Vt,resolveWatermark as Ht,responsesPath as Ut,runWithConcurrency as Wt,scaleDeployment as Gt,speechRecognizePath as Kt,speechSynthesizePath as qt,startModelService as Jt,stopModelService as Yt,stripUndefined as Xt,taskPath as Zt,trainingTypeMethodVariant as Qt,unlinkSkillFromAgents as $t,unwrapResponse as en,updateDeployment as tn,uploadDataset as nn,userProfilePath as rn,validateDataset as an,videoGeneratePath as on,writeConfigFile as sn,writeSkillLock as cn}from"bailian-cli-core";import{API_KEY_PAGE as ln,BOOL_FLAG_PROMPT_EXTEND_API_DEFAULT as un,BOOL_FLAG_PROMPT_EXTEND_CLI_TRUE as dn,BOOL_FLAG_PROMPT_EXTEND_IMAGE_GENERATE as fn,BOOL_FLAG_WATERMARK as pn,VOICE_TTS_PAGE as mn,ansi as O,collectPipelineHints as hn,collectPipelineIssues as gn,confirmDangerousAction as _n,createSpinner as vn,displayWidth as yn,downloadFile as bn,downloadParallel as xn,emitBare as k,emitResult as A,executePipeline as Sn,fetchBinaryChannelVersion as Cn,fetchLatestVersion as wn,formatBytes as Tn,formatTable as j,getConcurrency as En,initPipelineSteps as Dn,isValidUpdateTargetVersion as On,mcpMarketplaceDetailPage as kn,normalizeBinaryVersion as An,padEnd as M,performBinaryUpdate as jn,poll as Mn,renderBoxTable as Nn,renderGauge as Pn,resolveImageSize as Fn,runConcurrent as In,streamPipelineEvents as Ln,supportsColor as Rn}from"bailian-cli-runtime";import{createHash as zn,randomBytes as Bn,timingSafeEqual as Vn}from"node:crypto";import Hn from"node:http";import{execFile as Un}from"node:child_process";import{copyFileSync as Wn,createWriteStream as Gn,existsSync as Kn,mkdirSync as qn,readFileSync as Jn,renameSync as Yn,statSync as Xn,writeFileSync as Zn}from"fs";import{basename as Qn,dirname as $n,extname as er,join as N}from"path";import{createReadStream as tr,existsSync as P,mkdirSync as nr,readFileSync as rr,readdirSync as ir,statSync as ar,unlinkSync as or,writeFileSync as sr}from"node:fs";import{basename as F,dirname as cr,extname as lr,join as I,relative as ur,resolve as dr,sep as fr}from"node:path";import{homedir as pr}from"node:os";import{inflateRawSync as mr}from"node:zlib";import hr from"yaml";import{parse as gr,stringify as _r}from"smol-toml";import{homedir as vr,platform as yr}from"os";import{execSync as br}from"child_process";import{readFile as xr,writeFile as Sr}from"node:fs/promises";import Cr from"boxen";import wr,{Chalk as Tr}from"chalk";import*as Er from"@openagentpack/sdk";import{AGENTS_PROVIDER_FIELDS as Dr,LocalFileStateBackend as Or,StateManager as kr,UserError as Ar,bootstrapRuntimeCredentialsSync as jr,createProjectRuntime as Mr,createSessionForAgent as Nr,deleteSession as Pr,destroyPlannedProjectResources as Fr,executePlannedProject as Ir,getSession as Lr,importResource as Rr,isTerminalSessionStatus as zr,listSessionEvents as Br,listSessionSummaries as Vr,listSkills as Hr,parseStateAddress as Ur,planDestroyProjectContext as Wr,planProjectContext as Gr,resolveProjectConfig as Kr,sendSessionMessagePolling as qr,sendSessionMessageStreaming as Jr,startSessionRun as Yr,startSessionRunPolling as Xr,validateProjectConfig as Zr}from"@openagentpack/sdk";import{sanitizeSessionEvents as Qr}from"@openagentpack/sdk/session-events";function $r(e){if(e instanceof t){if(e.exitCode===s.NETWORK||e.exitCode===s.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 ei(e,t,n){process.stderr.write(`Testing key... `);let r={identity:e.identity,settings:e.settings},i=St(n.baseUrl),a=n.persistBaseUrl?St(n.persistBaseUrl):void 0,o={url:i+ie(),method:`POST`,headers:{Authorization:`Bearer ${t}`},timeout:Math.min(e.settings.timeout,30),body:{model:`qwen3.8-max`,messages:[{role:`user`,content:`hi`}],max_tokens:1,stream:!1}};for(let e=1;e<=3;e++)try{await Ft(r,o);break}catch(t){if(e>=3||!$r(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_video_model:n.defaultVideoModel,default_image_to_video_model:n.defaultImageToVideoModel,default_reference_to_video_model:n.defaultReferenceToVideoModel,default_image_model:n.defaultImageModel})}function
|
|
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 ti(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 ni(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)=>{Un(n,r,{windowsHide:!0},n=>{n?t(n):e()})})}function ri(e){return ni(e)}const ii=RegExp(`\r
|
|
4
4
|
\r
|
|
5
5
|
|
|
|
6
6
|
|
|
7
|
-
`),
|
|
8
|
-
`);return}let{accessToken:r,apiKey:s,baseUrl:c,consoleSite:l,consoleRegion:u,consoleSwitchAgent:d,workspaceId:f}=await
|
|
7
|
+
`),ai={domestic:`https://bailian.console.aliyun.com`,international:`https://modelstudio.console.alibabacloud.com`};function oi(e){return e&&ai[e]||ai.domestic}function si(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 ci(e){let t=e.headers[`content-type`];return Array.isArray(t)?t[0]??``:typeof t==`string`?t:``}function li(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 ui(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(ii);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 di(e){for(let t of[`access_token`,`accessToken`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function fi(e){for(let t of[`api_key`,`apiKey`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function pi(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=di(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=di(a);if(e)return e}return null}function mi(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`multipart/form-data`)){let n=li(t);if(n){let t=ui(e,n);if(t)return t}}if(n.includes(`application/json`)||n.includes(`text/json`)){let t=pi(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=pi(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=li(t);if(i){let t=ui(e,i);if(t)return t}return null}function hi(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=fi(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=fi(a);if(e)return e}return null}function gi(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`application/json`)||n.includes(`text/json`)){let t=hi(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=hi(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 _i(e,...t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t.trim()}return null}function vi(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:_i(r,`base_url`,`baseUrl`),consoleSite:_i(r,`console_site`,`consoleSite`),consoleRegion:_i(r,`console_region`,`consoleRegion`),consoleSwitchAgent:_i(r,`console_switch_agent`,`consoleSwitchAgent`),workspaceId:_i(r,`workspace_id`,`workspaceId`)}:n}async function yi(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=ci(e),f;try{f=await si(e)}catch{return{accessToken:n?.trim()||null,apiKey:r?.trim()||null,...l}}let p=n?.trim()||mi(f,d),m=r?.trim()||gi(f,d),h=vi(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 bi(e){return ti(e)}async function xi(e,n,r){let i=Bn(16).toString(`hex`),a,o=Hn.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:s,baseUrl:c,consoleSite:l,consoleRegion:u,consoleSwitchAgent:d,workspaceId:f}=await yi(e),p=r||c||l||u||d||f;if(p||s)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};s?(await ei(n,s,{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){a=e,t.writeHead(500,{"Content-Type":`text/plain; charset=utf-8`}),t.end(`Failed to save credentials
|
|
9
9
|
`),o.close();return}t.writeHead(200,{"Content-Type":`text/plain; charset=utf-8`,"Access-Control-Allow-Origin":`*`}),t.end(`OK
|
|
10
|
-
`),(p||s)&&o.close()}catch{t.statusCode=500,t.end()}}),c;try{c=await
|
|
10
|
+
`),(p||s)&&o.close()}catch{t.statusCode=500,t.end()}}),c;try{c=await bi(o)}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)}`,s.USAGE)}let l=`${e}/console-login?notice=127.0.0.1:${c}?state=${encodeURIComponent(i)}`;r?.needApiKey&&(l+=`&needapikey=true`);try{await ri(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(()=>{o.close()},9e5);o.once(`close`,r),o.once(`error`,e=>{clearTimeout(i),n||(n=!0,t(e))})}),a)throw a}function
|
|
14
|
-
`)},r);return}if(r!==`text`){
|
|
13
|
+
`)}if(await new Promise((e,t)=>{let n=!1,r=()=>{n||(n=!0,clearTimeout(i),e())},i=setTimeout(()=>{o.close()},9e5);o.once(`close`,r),o.once(`error`,e=>{clearTimeout(i),n||(n=!0,t(e))})}),a)throw a}function Si(e){return typeof e==`string`&&e.trim().length>0}var Ci=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=Si(e.apiKey),n=e.console===!0,r=e.openApi===!0;if(!t&&Si(e.baseUrl))return`Use --base-url only with --api-key`;if(!n&&Si(e.consoleSite))return`Use --console-site only with --console`;if(!r&&(Si(e.accessKeyId)||Si(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&&(!Si(e.accessKeyId)||!Si(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?St(r.baseUrl):void 0;if(r.console){if(n.dryRun){k(`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 xi(oi(r.consoleSite||n.consoleSite||`domestic`),a,{needApiKey:!e});return}if(r.openApi){if(n.dryRun){k(`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){k(`Would validate and save API key.`);return}let c=Ve(n.configName),l=i.stored().baseUrl;await ei(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})}}),wi=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:dt(i.apiKey.token),base_url:i.apiKey.baseUrl}:void 0,o=i.console?{source:i.console.source,masked:dt(i.console.token),region:i.console.region,site:i.console.site}:void 0,s=i.openapi?{source:i.openapi.source,access_key_id:dt(i.openapi.accessKeyId),access_key_secret:dt(i.openapi.accessKeySecret)}:void 0,c=!!(a||o||s),l=n.configName??`default`,u=e.authStore.path;if(!c){A({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: ${ln}`].join(`
|
|
14
|
+
`)},r);return}if(r!==`text`){A({authenticated:!0,config:l,config_file:u,api_key:a,console:o,openapi:s},r);return}k(`Config: ${l}`),k(`Config file: ${u}`),k(`Authentication Status:`),k(a?` API key (model): ${a.source} ${a.masked}`:` API key (model): not configured`),k(o?` Console gateway: ${o.source} ${o.masked} (${o.region}, ${o.site})`:` Console gateway: not configured (run ${t.binName} auth login --console)`),k(s?` OpenAPI (AK/SK): ${s.source} ${s.access_key_id}`:` OpenAPI (AK/SK): not configured (run ${t.binName} auth login --open-api)`)}}),Ti=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?k(`Would clear access_token from ${r.path}`):k(`No console access_token to clear.`),k(`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
|
-
`);return}if(n.openApi){if(t.dryRun){i.openapi?
|
|
16
|
+
`);return}if(n.openApi){if(t.dryRun){i.openapi?k(`Would clear access_key_id / access_key_secret / security_token from ${r.path}`):k(`No OpenAPI AK/SK credentials to clear.`),k(`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
|
-
`);return}let a=i.apiKey||i.console||i.openapi||!!i.baseUrl;if(t.dryRun){
|
|
19
|
-
`)}}),
|
|
20
|
-
`))),o&&l.write(t.reasoning_content)),t.content&&(o&&r&&(l.write(`${f.reset}\n\nResponse:\n`),r=!1),n+=t.content,o&&d.write(t.content))}}catch{}}a===`responses`&&
|
|
21
|
-
`)}else if(a===`responses`){let n=await e.client.requestJson({path:
|
|
18
|
+
`);return}let a=i.apiKey||i.console||i.openapi||!!i.baseUrl;if(t.dryRun){k(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.`),k(`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
|
+
`)}}),Ei=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);A(await Pe({identity:t,settings:n,baseUrl:e.client.baseUrl,accessKeyId:r.accessKeyId,accessKeySecret:r.accessKeySecret,securityToken:r.securityToken||void 0}),i)}});function Di(e){return e.output.filter(e=>e.type===`message`).flatMap(e=>e.content??[]).filter(e=>e.type===`output_text`).map(e=>e.text??``).join(``)}function Oi(e){return e.type===`response.output_text.delta`?e.delta??``:``}function ki(e){return typeof e==`object`&&e?e:void 0}function Ai(e,t){let n=e?.[t];return typeof n==`string`&&n.trim()?n:void 0}function ji(e){let t=ki(ki(e.response)?.error),n=ki(e.error);return Ai(t,`message`)??Ai(n,`message`)??Ai(e,`message`)}function Mi(e){if(e.type===`response.failed`||e.type===`error`)throw new t(ji(e)??`Response failed.`,s.GENERAL);if(e.type===`response.incomplete`){let n=Ai(ki(ki(e.response)?.incomplete_details),`reason`);throw new t(ji(e)??(n?`Response incomplete: ${n}`:`Response incomplete.`),s.GENERAL)}return{delta:Oi(e),completed:e.type===`response.completed`}}function Ni(e){if(!e)throw new t(`Stream disconnected before completion: stream closed before response.completed.`,s.GENERAL)}const Pi={api:{type:`string`,valueHint:`<chat|responses>`,choices:[`chat`,`responses`],description:`API to call (default: chat)`},model:{type:`string`,valueHint:`<model>`,description:`Model ID (default: qwen3.8-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 Fi(e){let t=[],n;if(e.system&&(n=e.system),e.messagesFile){let r=Mt(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 Ii=w({description:`Send a text model request (OpenAI compatible, DashScope)`,auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:Pi,exampleArgs:[`--message "What is Qwen?"`,`--api responses --model qwen3.8-max --tool '{"type":"web_search"}' --message "Search for recent Alibaba Cloud news"`,`--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=>{if(!e.message&&!e.messagesFile)return`Provide --message or --messages-file.`;if(e.api===`responses`&&e.thinkingBudget!==void 0)return`--thinking-budget is not supported by the Responses API.`},async run(e){let{settings:t,flags:n}=e,{system:r,messages:i}=Fi(n),a=n.api??`chat`,o=n.model||t.defaultTextModel||`qwen3.8-max`,s=n.stream||process.stdout.isTTY,c=T(t.output),l=[];r&&l.push({role:`system`,content:r}),l.push(...i);let u;if(u=a===`responses`?{model:o,input:l,max_output_tokens:n.maxTokens??4096,stream:s}:{model:o,messages:l,max_tokens:n.maxTokens??4096,stream:s},n.temperature!==void 0&&(u.temperature=n.temperature),n.topP!==void 0&&(u.top_p=n.topP),n.enableThinking&&(u.enable_thinking=!0,a===`chat`&&`messages`in u&&n.thinkingBudget!==void 0&&(u.thinking_budget=n.thinkingBudget)),n.tool){let e=n.tool.map(e=>{try{return JSON.parse(e)}catch{let t=Jn(e,`utf-8`);return JSON.parse(t)}});u.tools=e}if(t.dryRun){A({request:u},c);return}if(s){let t=await e.client.request({path:a===`responses`?Ut():ie(),method:`POST`,body:u,stream:!0}),n=``,r=!1,i=!1,o=c===`text`,s=process.stdout.isTTY,l=c===`json`?process.stderr:s?process.stdout:process.stderr,d=process.stdout,f=O(l);for await(let e of wt(t)){if(e.data===`[DONE]`)break;if(a===`responses`){let t;try{t=JSON.parse(e.data)}catch{continue}let r=Mi(t);if(r.delta&&(n+=r.delta,o&&d.write(r.delta)),r.completed){i=!0;break}continue}try{let t=JSON.parse(e.data);for(let e of t.choices){let t=e.delta;t.reasoning_content&&(o&&!r&&(r=!0,l.write(f.dim(`Thinking:
|
|
20
|
+
`))),o&&l.write(t.reasoning_content)),t.content&&(o&&r&&(l.write(`${f.reset}\n\nResponse:\n`),r=!1),n+=t.content,o&&d.write(t.content))}}catch{}}a===`responses`&&Ni(i),r&&l.write(f.reset),c===`json`?A({content:n},c):d.write(`
|
|
21
|
+
`)}else if(a===`responses`){let n=await e.client.requestJson({path:Ut(),method:`POST`,body:u}),r=Di(n);t.quiet||c===`text`?k(r):A(n,c)}else{let n=await e.client.requestJson({path:ie(),method:`POST`,body:u}),r=n.choices?.[0]?.message?.content??``;t.quiet||c===`text`?k(r):A(n,c)}}});const Li=[{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 Ri(){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
|
|
24
|
-
`);let C;if(b&&!s){let e=Buffer.from(b,`base64`),r=
|
|
25
|
-
`));else{let t={urls:e,saved:l,total:e.length};i&&(t.task_id=i),a&&a.length>1&&(t.task_ids=a),
|
|
26
|
-
`)):
|
|
27
|
-
`)),r.async){
|
|
28
|
-
`)),r.async){P(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=>pn(e.client,n,{url:e.client.url(It(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.`,s.GENERAL);if(r.download){let e=r.download,{size:t}=await j(b[0].videoUrl,e,{quiet:n.quiet});n.quiet?M(e):P({task_id:b[0].taskId,video_url:b[0].videoUrl,status:`SUCCEEDED`,saved:e,size:on(t)},d);return}let{join:x}=await import(`path`),S=Ot(n,{subDir:`videos`}),C=[];await Promise.all(b.map(async({taskId:e,videoUrl:t})=>{let r=x(S,`${e}.mp4`);await j(t,r,{quiet:n.quiet}),C.push({task_id:e,video_url:t,saved:r})})),C.length===1?P(C[0],d):P({videos:C,total:C.length},d)}}),Ii=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){P({task_id:r},i);return}let a=await e.client.requestJson({path:It(r)});if(t.quiet){M(a.output.task_status);return}P({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)}}),Li=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,a=r.out,o=E(n.output);if(n.dryRun){P({task_id:i,action:`download`,out:a},o);return}let c=await e.client.requestJson({path:It(i)});if(c.output.task_status!==`SUCCEEDED`)throw new t(`Task is not complete (status: ${c.output.task_status}).`,s.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.`,s.GENERAL);let{size:u}=await j(l,a,{quiet:n.quiet});if(n.quiet){M(a);return}P({saved:a,size:on(u)},o)}});const Ri=new Set([`.mp4`,`.mov`,`.avi`,`.mkv`,`.webm`,`.flv`,`.wmv`]);function zi(e){let t=Pn(e).toLowerCase().split(`?`)[0];return!!(Ri.has(t)||/\.(mp4|mov|avi|mkv|webm|flv|wmv)(\?|$)/i.test(e))}async function Bi(e){return e.startsWith(`data:`)||e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`oss://`)?e:Le(e)}var Vi=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,a=r.video??[],o=r.model||(e.client.usesTokenPlanEndpoint()?n.defaultTextModel:void 0)||`qwen3-vl-plus`;i&&zi(i)&&(a.push(i),i=void 0);let c=a.length>0?`Describe the video.`:`Describe the image.`,l=r.prompt||c,u=E(n.output);if(n.dryRun){P({request:{prompt:l,image:i?bt(i):void 0,video:a.length?a.map(bt):void 0,model:o}},u);return}let d=[];if(a.length>0)for(let n of a){let r=n;if(ze(n)){if(!En(n))throw new t(`Video file not found: ${n}`,s.USAGE);r=await e.client.uploadFile(n,o)}d.push({type:`video_url`,video_url:{url:r}})}if(i){let t=await Bi(i),n=t;ze(i)&&t.startsWith(`data:`)&&An(i).size>5*1024*1024&&(n=await e.client.resolveImageInput(i,o)),d.push({type:`image_url`,image_url:{url:n}})}d.push({type:`text`,text:l});let f={model:o,messages:[{role:`user`,content:d}]},p=await e.client.requestJson({path:w(),method:`POST`,body:f}),m=p.choices?.[0]?.message?.content;if(u!==`text`){P(p,u);return}M(m||``)}});const Hi=[`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`],Ui=new Set([`api_key`,`access_token`,`access_key_id`,`access_key_secret`,`security_token`]),Wi=[`console_site`,`console_region`,`console_switch_agent`,`telemetry`],Gi=[...Hi,...Wi],Ki={output:[`text`,`json`],console_site:[`domestic`,`international`]},qi=new Set([`telemetry`]),Ji={default_text_model:`qwen3.8-max`,default_image_model:`qwen-image-3.0`,default_video_model:`happyhorse-1.1-t2v`,default_speech_model:`cosyvoice-v3-flash`,default_omni_model:`qwen3.5-omni-plus`},Yi={default_text_model:[{id:`qwen3.8-max`,role:`text/chat default`},{id:`qwen3-coder-plus`,role:`coding-oriented (agent config)`},{id:`qwen-flash`,role:`fast · advisor ranking`},{id:`qwen3.6-flash`,role:`fast · advisor intent`}],default_image_model:[{id:`qwen-image-3.0`,role:`image/generate default · sync`},{id:`qwen-image-2.0`,role:`image/generate · sync`},{id:`qwen-image-max`,role:`image/generate · sync`},{id:`qwen-image-edit-2.0`,role:`image/edit · sync`},{id:`wanx2.x`,role:`image/generate · async series`}],default_video_model:[{id:`happyhorse-1.1-t2v`,role:`video/generate default · text-to-video`},{id:`happyhorse-1.1-i2v`,role:`video/generate · image-to-video`}],default_speech_model:[{id:`cosyvoice-v3-flash`,role:`speech/synthesize (TTS) default`},{id:`fun-asr`,role:`speech/recognize (ASR)`}],default_omni_model:[{id:`qwen3.5-omni-plus`,role:`omni/chat default`},{id:`qwen3-vl-plus`,role:`vision/describe · multimodal input`}]},Xi={"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 Zi(e){return Xi[e]||e}function Qi(e,n){let r=Zi(e);if(!Hi.includes(r))throw new t(`Invalid config key "${e}". Valid keys: ${Hi.join(`, `)}`,s.USAGE);if(r===`output`&&![`text`,`json`].includes(n))throw new t(`Invalid output format "${n}". Valid values: text, json`,s.USAGE);if(r===`timeout`){let e=Number(n);if(isNaN(e)||e<=0)throw new t(`Invalid timeout "${n}". Must be a positive number.`,s.USAGE);return e}return r===`base_url`?ct(n):n}function $i(e,n){let r=Zi(e);if(Hi.includes(r))return Qi(e,n);if(r===`console_site`){if(![`domestic`,`international`].includes(n))throw new t(`Invalid console_site "${n}". Valid values: domestic, international`,s.USAGE);return n}if(r===`console_region`)return n;if(r===`console_switch_agent`){let e=Number(n);if(!Number.isFinite(e)||e<=0)throw new t(`Invalid console_switch_agent "${n}". Must be a positive number.`,s.USAGE);return e}if(r===`telemetry`){if(n!==`true`&&n!==`false`)throw new t(`Invalid telemetry "${n}". Valid values: true, false`,s.USAGE);return n===`true`}throw new t(`Invalid config key "${e}". Valid keys: ${Gi.join(`, `)}`,s.USAGE)}var ea=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 Ui)typeof o[e]==`string`&&(o[e]=D(o[e]));P(o,a)}}),ta=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=Zi(r),o=Qi(r,i),s=E(t.output);if(t.dryRun){P({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=Ui.has(a)?D(String(o)):o;P({[a]:n,config:t.configName??`default`,config_file:e.configStore.path},s)}}}),na=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`){P({active_config:t.active,profiles:n,config_file:e.configStore.path},r);return}let i=Math.max(4,...n.map(e=>e.length));M(`${`NAME`.padEnd(i)} ACTIVE`);for(let e of n)M(`${e.padEnd(i)} ${e===t.active?`*`:``}`)}}),ra=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){P({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||P({active_config:n,config_file:e.configStore.path},t)}});function B(e){try{return Ln(e,`utf-8`)}catch{return}}function V(e){let t=B(e);if(t!==void 0)try{let e=JSON.parse(t);return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}catch{return}}function H(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}function ia(e){let t=/^---\s*\n([\s\S]*?)\n---/.exec(e);if(!t)return{};try{return H(Xn.parse(t[1]))??{}}catch{return{}}}function aa(e,t=500){let n=0,r=e=>{if(n>=t)return;let i;try{i=Rn(e,{withFileTypes:!0})}catch{return}for(let a of i){if(n>=t)return;let i=z(e,a.name);a.isDirectory()?r(i):n+=1}};return r(e),n}function oa(e){return[{source:`global`,dir:z(e,`.agents`,`skills`)},{source:`claude-code`,dir:z(e,`.claude`,`skills`)},{source:`cursor`,dir:z(e,`.cursor`,`skills`)},{source:`qwen-code`,dir:z(e,`.qwen`,`skills`)},{source:`codex`,dir:z(e,`.codex`,`skills`)},{source:`opencode`,dir:z(e,`.config`,`opencode`,`skills`)},{source:`openclaw`,dir:z(e,`.openclaw`,`skills`)},{source:`openclaw`,dir:z(e,`.openclaw`,`workspace`,`skills`)},{source:`hermes`,dir:z(e,`.hermes`,`skills`)},{source:`gemini`,dir:z(e,`.gemini`,`skills`)},{source:`antigravity`,dir:z(e,`.gemini`,`antigravity`,`skills`)},{source:`windsurf`,dir:z(e,`.windsurf`,`skills`)},{source:`windsurf`,dir:z(e,`.codeium`,`windsurf`,`skills`)},{source:`qoderwork`,dir:z(e,`.qoderwork`,`skills`)},{source:`workbuddy`,dir:z(e,`.workbuddy`,`skills`)}]}function sa(e=Jn()){let t=new Map;for(let{source:n,dir:r}of oa(e)){let e;try{e=Rn(r,{withFileTypes:!0})}catch{continue}for(let i of e){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let e=z(r,i.name),a=z(e,`SKILL.md`);if(!R(a))continue;let o=t.get(i.name);if(o){o.sources.includes(n)||o.sources.push(n);continue}let s=ia(B(a)??``),c=H(s.metadata),l=typeof s.description==`string`?s.description.trim():``,u=c&&typeof c.version==`string`?c.version:typeof s.version==`string`?s.version:void 0;t.set(i.name,{id:i.name,name:typeof s.name==`string`&&s.name?s.name:i.name,description:l,version:u,fileCount:aa(e),path:e,sources:[n],origin:`local`})}}return[...t.values()].sort((e,t)=>e.name.localeCompare(t.name))}function ca(e,t=Jn()){let n=sa(t).find(t=>t.id===e);if(!n)return null;let r=B(z(n.path,`SKILL.md`))??``;return{...n,content:r}}const la=[{source:`global`,label:`All agents (~/.agents/skills)`,sub:[`.agents`,`skills`]},{source:`claude-code`,label:`Claude Code`,sub:[`.claude`,`skills`]},{source:`qwen-code`,label:`Qwen Code`,sub:[`.qwen`,`skills`]},{source:`codex`,label:`Codex`,sub:[`.codex`,`skills`]},{source:`opencode`,label:`OpenCode`,sub:[`.config`,`opencode`,`skills`]},{source:`openclaw`,label:`OpenClaw`,sub:[`.openclaw`,`skills`]},{source:`qoderwork`,label:`QoderWork`,sub:[`.qoderwork`,`skills`]},{source:`windsurf`,label:`Windsurf`,sub:[`.codeium`,`windsurf`,`skills`]},{source:`gemini`,label:`Gemini`,sub:[`.gemini`,`skills`]}];function ua(e,t){let n=la.find(t=>t.source===e);return n?z(t,...n.sub):null}function da(e){let t=-1,n=Math.max(0,e.length-22-65535);for(let r=e.length-22;r>=n;r--)if(e.readUInt32LE(r)===101010256){t=r;break}if(t<0)throw Error(`Not a valid .zip archive.`);let r=e.readUInt16LE(t+10),i=e.readUInt32LE(t+16),a=[];for(let t=0;t<r&&!(i+46>e.length||e.readUInt32LE(i)!==33639248);t++){let t=e.readUInt16LE(i+10),n=e.readUInt32LE(i+20),r=e.readUInt16LE(i+28),o=e.readUInt16LE(i+30),s=e.readUInt16LE(i+32),c=e.readUInt32LE(i+42),l=e.toString(`utf8`,i+46,i+46+r);if(i+=46+r+o+s,l.endsWith(`/`)||c+30>e.length||e.readUInt32LE(c)!==67324752)continue;let u=e.readUInt16LE(c+26),d=e.readUInt16LE(c+28),f=c+30+u+d,p=e.subarray(f,f+n),m;if(t===0)m=Buffer.from(p);else if(t===8)m=Yn(p);else throw Error(`Unsupported compression in archive (entry: `+l+`).`);a.push({name:l,data:m})}return a}function fa(e,t,n,r=Jn()){let i=ua(e,r);if(!i)throw Error(`Unknown skill install target.`);let a=da(t).map(e=>({name:e.name.replace(/\\/g,`/`).replace(/^\.\//,``).replace(/^\/+/,``),data:e.data})).filter(e=>e.name&&!e.name.endsWith(`/`)&&!e.name.split(`/`).includes(`..`));if(!a.length)throw Error(`The archive contains no usable files.`);let o=a.find(e=>e.name===`SKILL.md`||e.name.endsWith(`/SKILL.md`));if(!o)throw Error(`No SKILL.md found in the archive (root or a top-level folder).`);let s=o.name.lastIndexOf(`/`),c,l;if(s<0){if(c=(n||``).trim(),!c)throw Error(`SKILL.md is at the archive root — please provide a skill name.`);l=``}else l=o.name.slice(0,s+1),c=(n||``).trim()||l.split(`/`)[0];if(!/^[A-Za-z0-9._-]+$/.test(c))throw Error(`Invalid skill name: `+c);let u=z(i,c),d=Kn(u),f=0;for(let e of a){let t=e.name;if(l){if(!e.name.startsWith(l))continue;t=e.name.slice(l.length)}if(!t)continue;let n=Kn(z(u,t));n!==d&&!n.startsWith(d+qn)||(In(Un(n),{recursive:!0}),Vn(n,e.data),f++)}if(f===0)throw Error(`Nothing was extracted from the archive.`);return{installed:c,files:f,dir:u}}function pa(e){if(typeof e.command==`string`){let t=Array.isArray(e.args)?e.args.join(` `):``;return{transport:`stdio`,detail:`${e.command} ${t}`.trim()}}let t=typeof e.url==`string`?e.url:void 0;return t?{transport:(typeof e.type==`string`?e.type.toLowerCase():``)===`sse`?`sse`:`http`,detail:t}:{transport:`unknown`,detail:``}}function U(e,t,n,r,i){let a=H(e);if(a)for(let[e,o]of Object.entries(a)){let a=H(o)??{},{transport:s,detail:c}=pa(a);r.push({name:e,source:t,transport:s,detail:c,scope:n,origin:`local`,config:Ta(a),editable:i})}}function ma(e=Jn()){let t=[],n=V(z(e,`.claude.json`));if(n){U(n.mcpServers,`claude-code`,`global`,t,!0);let e=H(n.projects);if(e)for(let[n,r]of Object.entries(e)){let e=H(r);e?.mcpServers&&U(e.mcpServers,`claude-code`,n,t,!0)}}let r=V(z(e,`.qwen`,`settings.json`));r&&U(r.mcpServers,`qwen-code`,`global`,t,!0);let i=V(z(e,`.config`,`opencode`,`opencode.json`));i&&U(i.mcp,`opencode`,`global`,t,!0);let a=V(z(e,`.cursor`,`mcp.json`));a&&U(a.mcpServers,`cursor`,`global`,t,!0);let o=V(z(e,`.codeium`,`windsurf`,`mcp_config.json`));o&&U(o.mcpServers,`windsurf`,`global`,t,!0);let s=V(z(e,`.gemini`,`settings.json`));s&&U(s.mcpServers,`gemini`,`global`,t,!0);let c=V(z(e,`.qoderwork`,`mcp.json`));c&&U(c.mcpServers,`qoderwork`,`global`,t,!0);let l=V(z(e,`.openclaw`,`openclaw.json`));l&&U(l.mcpServers,`openclaw`,`global`,t,!0);let u=V(ha(e));u&&U(u.mcpServers,`claude-desktop`,`global`,t,!0);let d=B(z(e,`.codex`,`config.toml`));if(d)try{U(Zn(d).mcp_servers,`codex`,`global`,t,!1)}catch{}return t.sort((e,t)=>e.name.localeCompare(t.name)||e.source.localeCompare(t.source))}function ha(e){return process.platform===`darwin`?z(e,`Library`,`Application Support`,`Claude`,`claude_desktop_config.json`):process.platform===`win32`?z(process.env.APPDATA??z(e,`AppData`,`Roaming`),`Claude`,`claude_desktop_config.json`):z(e,`.config`,`Claude`,`claude_desktop_config.json`)}function ga(e,t,n){return e===`claude-code`?{file:z(n,`.claude.json`),mapKey:`mcpServers`,projectScoped:t!==`global`}:e===`qwen-code`?{file:z(n,`.qwen`,`settings.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`opencode`?{file:z(n,`.config`,`opencode`,`opencode.json`),mapKey:`mcp`,projectScoped:!1}:e===`cursor`?{file:z(n,`.cursor`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`windsurf`?{file:z(n,`.codeium`,`windsurf`,`mcp_config.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`gemini`?{file:z(n,`.gemini`,`settings.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`qoderwork`?{file:z(n,`.qoderwork`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`openclaw`?{file:z(n,`.openclaw`,`openclaw.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`claude-desktop`?{file:ha(n),mapKey:`mcpServers`,projectScoped:!1}:null}function _a(e,t){if(typeof e==`string`){if(e.includes(`•`)){if(typeof t==`string`)return t;throw Error(`Replace masked values (•••) with the real value before saving.`)}return e}if(Array.isArray(e)){let n=Array.isArray(t)?t:[];return e.map((e,t)=>_a(e,n[t]))}let n=H(e);if(n){let e=H(t)??{},r={};for(let[t,i]of Object.entries(n))r[t]=_a(i,e[t]);return r}return e}function va(e,t,n,r,i=Jn()){let a=ga(e,t,i);if(!a)throw Error(`This MCP source is read-only and cannot be edited here.`);let o=n.trim();if(!o)throw Error(`Server name is required.`);let s=H(r);if(!s)throw Error(`Config must be a JSON object.`);let c=V(a.file)??{},l=c;if(a.projectScoped){let e=H(c.projects)??{};c.projects=e;let n=H(e[t])??{};e[t]=n,l=n}let u=H(l[a.mapKey])??{};l[a.mapKey]=u,u[o]=_a(s,H(u[o])),In(Un(a.file),{recursive:!0}),Vn(a.file,JSON.stringify(c,null,2)+`
|
|
29
|
-
`,`utf-8`)}function
|
|
30
|
-
`,`utf-8`)}const ba=[{id:`claude-code`,label:`Claude Code`,paths:e=>[z(process.env.CLAUDE_CONFIG_DIR||z(e,`.claude`),`settings.json`),z(e,`.claude.json`)],detect:e=>{let t=H(V(z(process.env.CLAUDE_CONFIG_DIR||z(e,`.claude`),`settings.json`))?.env),n=t&&typeof t.ANTHROPIC_BASE_URL==`string`?t.ANTHROPIC_BASE_URL:void 0,r=t&&typeof t.ANTHROPIC_MODEL==`string`?t.ANTHROPIC_MODEL:void 0;return{configured:!!n,model:r}}},{id:`qwen-code`,label:`Qwen Code`,paths:e=>[z(e,`.qwen`,`settings.json`)],detect:e=>{let t=V(z(e,`.qwen`,`settings.json`)),n=H(t?.modelProviders),r=n?Object.values(n).some(e=>Array.isArray(e)&&e.some(e=>{let t=H(e)?.name;return typeof t==`string`&&(t===`bailian-cli`||t.startsWith(`[Bailian]`))})):!1,i=H(t?.model);return{configured:r,model:i&&typeof i.name==`string`?i.name:void 0}}},{id:`opencode`,label:`OpenCode`,paths:e=>[z(e,`.config`,`opencode`,`opencode.json`)],detect:e=>{let t=H(H(V(z(e,`.config`,`opencode`,`opencode.json`))?.provider)?.[`bailian-cli`]),n=H(t?.models);return{configured:!!t,model:n?Object.keys(n)[0]:void 0}}},{id:`openclaw`,label:`OpenClaw`,paths:e=>[z(e,`.openclaw`,`openclaw.json`)],detect:e=>{let t=H(H(H(V(z(e,`.openclaw`,`openclaw.json`))?.models)?.providers)?.[`bailian-cli`]),n=H((Array.isArray(t?.models)?t.models:[])[0]);return{configured:!!t,model:n&&typeof n.id==`string`?n.id:void 0}}},{id:`hermes`,label:`Hermes Agent`,paths:e=>[z(e,`.hermes`,`config.yaml`)],detect:e=>{let t=B(z(e,`.hermes`,`config.yaml`));if(!t)return{configured:!1};let n;try{n=H(Xn.parse(t))}catch{return{configured:!1}}let r=(Array.isArray(n?.custom_providers)?n.custom_providers:[]).some(e=>H(e)?.name===`bailian-cli`),i=H(n?.model),a=!!(i&&i.provider===`custom`&&typeof i.base_url==`string`&&i.base_url.includes(`aliyuncs.com`));return{configured:r||a,model:i&&typeof i.default==`string`?i.default:void 0}}},{id:`codex`,label:`Codex`,paths:e=>[z(e,`.codex`,`config.toml`),z(e,`.codex`,`auth.json`)],detect:e=>{let t=B(z(e,`.codex`,`config.toml`));if(!t)return{configured:!1};let n={};try{n=Zn(t)}catch{return{configured:!1}}return{configured:!!H(n.model_providers)?.[`bailian-cli`],model:typeof n.model==`string`?n.model:void 0}}}];function xa(e=Jn()){return ba.map(t=>{let n=t.paths(e),r=n.some(e=>R(e)),{configured:i,model:a}=r?t.detect(e):{configured:!1,model:void 0};return{id:t.id,label:t.label,installed:r,configured:i,model:a,paths:n,origin:`local`}})}function W(e,t,n,r=!1){typeof n==`string`&&n.trim()&&e.push({label:t,value:n.trim(),secret:r})}function Sa(e,t){let n=[];if(e===`claude-code`){let e=H(V(z(t,`.claude`,`settings.json`))?.env);W(n,`Model`,e?.ANTHROPIC_MODEL),W(n,`Base URL`,e?.ANTHROPIC_BASE_URL),W(n,`Auth Token`,e?.ANTHROPIC_AUTH_TOKEN,!0)}else if(e===`qwen-code`){let e=V(z(t,`.qwen`,`settings.json`)),r=H(e?.model),i=H(H(e?.security)?.auth),a=H(e?.env);W(n,`Model`,r?.name),W(n,`Base URL`,i?.baseUrl??r?.baseUrl),W(n,`Protocol`,i?.selectedType),W(n,`API Key`,i?.apiKey??a?.BAILIAN_CLI_API_KEY,!0)}else if(e===`opencode`){let e=H(H(V(z(t,`.config`,`opencode`,`opencode.json`))?.provider)?.[`bailian-cli`]),r=H(e?.options),i=H(e?.models);W(n,`Model`,i?Object.keys(i)[0]:void 0),W(n,`Base URL`,r?.baseURL),W(n,`Provider`,e?.npm),W(n,`API Key`,r?.apiKey,!0)}else if(e===`openclaw`){let e=H(H(H(V(z(t,`.openclaw`,`openclaw.json`))?.models)?.providers)?.[`bailian-cli`]);W(n,`Model`,H((Array.isArray(e?.models)?e.models:[])[0])?.id),W(n,`Base URL`,e?.baseUrl),W(n,`API`,e?.api),W(n,`API Key`,e?.apiKey,!0)}else if(e===`hermes`){let e=B(z(t,`.hermes`,`config.yaml`)),r;if(e)try{r=H(Xn.parse(e))}catch{r=void 0}let i=H((Array.isArray(r?.custom_providers)?r.custom_providers:[]).find(e=>H(e)?.name===`bailian-cli`));W(n,`Model`,H((Array.isArray(i?.models)?i.models:[])[0])?.id??H(r?.model)?.default),W(n,`Base URL`,i?.base_url),W(n,`API Mode`,i?.api_mode),W(n,`API Key`,i?.api_key,!0)}else if(e===`codex`){let e=B(z(t,`.codex`,`config.toml`)),r={};if(e)try{r=Zn(e)}catch{r={}}let i=H(H(r.model_providers)?.[`bailian-cli`]),a=V(z(t,`.codex`,`auth.json`));W(n,`Model`,r.model),W(n,`Base URL`,i?.base_url),W(n,`Wire API`,i?.wire_api),W(n,`API Key`,a?.OPENAI_API_KEY,!0)}return n}function Ca(e){let t=e.trim();return t.length<=8?`•`.repeat(Math.max(t.length,4)):t.slice(0,3)+`•`.repeat(Math.min(t.length-3,16))}const wa=/key|token|secret|password|passwd|auth|credential/i;function Ta(e,t=``){if(typeof e==`string`)return t&&wa.test(t)&&e.trim()?Ca(e):e;if(Array.isArray(e))return e.map(e=>Ta(e));let n=H(e);if(n){let e={};for(let[t,r]of Object.entries(n))e[t]=Ta(r,t);return e}return e}function Ea(e){return e.endsWith(`.json`)?`json`:e.endsWith(`.yaml`)||e.endsWith(`.yml`)?`yaml`:e.endsWith(`.toml`)?`toml`:`text`}function Da(e,t=Jn()){let n=ba.find(t=>t.id===e);if(!n)return null;let r=n.paths(t),i=r.some(e=>R(e)),{configured:a,model:o}=i?n.detect(t):{configured:!1,model:void 0},s=i?Sa(e,t).map(e=>e.secret?{...e,raw:e.value,value:Ca(e.value)}:e):[],c=r.map(e=>({path:e,exists:R(e)})),l=i?r.filter(e=>R(e)).map(e=>({path:e,lang:Ea(e),text:B(e)??``})).filter(e=>e.text.trim()):[];return{id:n.id,label:n.label,installed:i,configured:a,model:o,paths:r,origin:`local`,fields:s,files:c,settings:l}}const Oa={"claude-code":`claude`,"qwen-code":`qwen`,opencode:`opencode`,openclaw:`openclaw`,hermes:`hermes`,codex:`codex`};function ka(e){return Object.prototype.hasOwnProperty.call(Oa,e)?Oa[e]:void 0}const Aa={"qwen-code":e=>[`-i`,e],"claude-code":e=>[e],codex:e=>[e]};function ja(e){return Object.prototype.hasOwnProperty.call(Aa,e)}function Ma(e){let t=process.platform===`win32`?`where`:`which`;return new Promise(n=>{Cn(t,[e],{windowsHide:!0},e=>n(!e))})}function Na(e){let t=ka(e);return t?Ma(t):Promise.resolve(!1)}function Pa(e){return`'${e.replace(/'/g,`'\\''`)}'`}function Fa(e,t){let n=process.platform;return new Promise((r,i)=>{if(n===`darwin`){Cn(`osascript`,[`-e`,`tell application "Terminal" to do script "${`cd ${Pa(t)} && ${e}`.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"`,`-e`,`tell application "Terminal" to activate`],{windowsHide:!0},e=>e?i(e):r());return}if(n===`win32`){Cn(`cmd`,[`/c`,`start`,``,`cmd`,`/k`,`cd /d ${t} && ${e}`],{windowsHide:!0},e=>e?i(e):r());return}Cn(`x-terminal-emulator`,[`-e`,`bash`,`-lc`,`cd ${Pa(t)} && ${e}; exec $SHELL`],{windowsHide:!0},e=>e?i(Error(`No supported terminal emulator was found`)):r())})}async function Ia(e,t=process.cwd(),n){let r=ka(e);if(!r)throw Error(`Unknown agent: ${e}`);if(!await Ma(r))throw Error(`\`${r}\` was not found on your PATH — install ${e} first.`);let i=r,a=(n??``).trim();if(a){let t=Aa[e];if(!t)throw Error(`${e} does not support dispatching a task prompt.`);i=[r,...t(a).map(Pa)].join(` `)}return await Fa(i,t),{launched:!0,command:i}}const La=[{id:`image-generate`,title:`文生图`,description:`一键生成一张示例图片并保存到输出目录。`,category:`图像`,prompt:"请使用 bl 的图像生成能力(如 `bl image generate` 命令)生成一张示例图片:一只在雨中撑伞的柯基,水彩风格,光线柔和。保存到输出目录后告诉我文件路径。"},{id:`image-describe`,title:`图片理解`,description:`从输出目录任选一张图片,详细描述内容与风格。`,category:`图像`,prompt:`请在输出目录(默认 output/images)中任选一张图片,用中文详细描述它的内容、主体、构图、色彩与风格,并推测它适合的使用场景。若目录为空请说明。`},{id:`image-alt-batch`,title:`批量 Alt 文本`,description:`为输出目录下的图片批量生成无障碍 alt 文本。`,category:`图像`,prompt:`请扫描输出目录(默认 output/images)下的所有图片,逐张生成简洁、准确的 alt 无障碍描述,最后以「文件名 → alt 文本」的表格汇总。若目录为空请说明。`},{id:`image-to-code`,title:`截图转代码`,description:`把输出目录里的界面截图还原成 HTML+CSS。`,category:`图像`,prompt:`请在输出目录(默认 output/images)中查找一张界面截图,用 HTML + CSS 尽可能还原它的布局、间距与配色,输出为一个可直接在浏览器打开的单文件,并简述还原思路。若没有找到截图请说明。`},{id:`speech-generate`,title:`文字转语音`,description:`把一句示例文字合成为自然语音。`,category:`音频`,prompt:"请使用 bl 的语音合成能力(如 `bl speech` 相关命令)把下面这句话合成为自然语音,保存到输出目录,并告诉我音频文件路径:欢迎使用阿里云百炼命令行工具,让多模态创作更简单。"},{id:`audio-summarize`,title:`音频转写总结`,description:`转写输出目录里的音频并提炼要点。`,category:`音频`,prompt:`请在输出目录(默认 output/speech)中找到一个音频文件,转写其内容,先给出完整文字,再用要点列表总结关键信息。若目录为空或缺少转写能力,请说明并尝试用可用的能力完成。`},{id:`video-generate`,title:`文生视频`,description:`一键生成一段示例短视频。`,category:`视频`,prompt:"请使用 bl 的视频生成能力(如 `bl video generate` 命令)生成一段示例短视频:日落时分海边奔跑的少年,电影质感,慢动作。保存到输出目录后告诉我视频文件路径。"},{id:`video-storyboard`,title:`视频分镜脚本`,description:`围绕示例主题产出可用于文生视频的分镜。`,category:`视频`,prompt:`围绕主题「城市清晨的第一杯咖啡」,为一支 15-30 秒的短视频撰写分镜脚本:逐镜头给出画面描述、时长、字幕或旁白,并为每个镜头附上可直接用于文生视频的英文 prompt。`},{id:`media-prompt-craft`,title:`多模态提示词`,description:`把一个示例创意扩展成图/视频/语音提示词。`,category:`多模态`,prompt:`把创意「未来赛博城市的夜市」扩展成三组高质量生成提示词:1) 文生图;2) 文生视频;3) 语音风格描述。每组给出中英对照,并简要说明关键参数建议。`},{id:`image-story-narration`,title:`图片配音文案`,description:`为输出目录里的图片写解说词并给出可合成文本。`,category:`多模态`,prompt:`请在输出目录(默认 output/images)中任选一张图片,为它撰写一段 60 秒左右的中文解说词(适合配音),语气生动。随后给出可直接用于语音合成的纯文本版本。若目录为空请说明。`},{id:`summarize-project`,title:`总结当前项目`,description:`让 agent 阅读当前目录,总结架构、技术栈与主要模块。`,category:`代码`,prompt:`请阅读当前工作目录的项目结构和关键源码,用简洁的中文总结:1) 它是做什么的;2) 技术栈;3) 主要模块及其职责;4) 值得注意的设计。先浏览再下结论,不要臆测。`},{id:`write-tests`,title:`为核心模块写单测`,description:`自动挑选缺测试的核心模块并补全单元测试。`,category:`代码`,prompt:`请在当前项目中挑选一个核心且缺少测试(或测试薄弱)的模块,为它编写全面的单元测试,覆盖主要逻辑分支和边界情况,并遵循本项目现有的测试框架与风格。先阅读相关文件及其依赖,再编写测试。`},{id:`code-review`,title:`代码审查`,description:`审查当前项目核心代码,指出问题与改进建议。`,category:`代码`,prompt:`请审查当前项目的核心源码,指出潜在的 bug、安全隐患、性能与可维护性问题,并给出具体、可操作的改进建议,按严重程度排序。先浏览项目结构,选取关键文件再审查。`},{id:`explain-code`,title:`解释核心代码`,description:`挑选入口或核心模块,解释其实现与依赖。`,category:`代码`,prompt:`请挑选当前项目的入口文件或核心模块,解释它的实现:职责是什么、关键流程如何运转、依赖了哪些模块。用清晰的中文说明,必要时给出调用关系。`},{id:`generate-readme`,title:`生成 README`,description:`阅读代码后生成结构清晰、与实现一致的 README.md。`,category:`文档`,prompt:`为当前工作目录的项目生成一个结构清晰的 README.md,包含:项目简介、安装步骤、使用示例、目录结构说明。请先阅读现有代码与配置再撰写,内容必须与实际实现一致。`}];function Ra(e){return La.find(t=>t.id===e)}function za(e,t){return e.prompt.replace(/\{\{(\w+)\}\}/g,(e,n)=>{let r=t[n];return typeof r==`string`?r.trim():``})}const Ba=new Uint8Array(512),Va=new Uint8Array(256);(()=>{let e=1;for(let t=0;t<255;t++)Ba[t]=e,Va[e]=t,e<<=1,e&256&&(e^=285);for(let e=255;e<512;e++)Ba[e]=Ba[e-255]})();function Ha(e,t){return e===0||t===0?0:Ba[Va[e]+Va[t]]}function Ua(e){let t=[1];for(let n=0;n<e;n++){let e=Array.from({length:t.length+1},()=>0);for(let r=0;r<t.length;r++)e[r]^=t[r],e[r+1]^=Ha(t[r],Ba[n]);t=e}return t.map(e=>Va[e])}function Wa(e,t){let n=Ua(t),r=new Uint8Array(e.length+t);r.set(e,0);for(let t=0;t<e.length;t++){let e=r[t];if(e!==0){let i=Va[e];for(let e=0;e<n.length;e++)r[t+e]^=Ba[(n[e]+i)%255]}}return Array.from(r.slice(e.length))}const Ga=[[19,7],[34,10],[55,15],[80,20],[108,26]];function Ka(e){let t=12+e*8;for(let e=0;e<Ga.length;e++)if(Ga[e][0]*8>=t)return e+1;throw Error(`qr: data too large for supported versions (max 108 bytes)`)}function qa(e,t){let[n]=Ga[t-1],r=[],i=(e,t)=>{for(let n=t-1;n>=0;n--)r.push(e>>n&1)};i(4,4),i(e.length,8);for(let t of e)i(t,8);let a=n*8;for(i(0,Math.min(4,a-r.length));r.length%8!=0;)r.push(0);let o=[];for(let e=0;e<r.length;e+=8){let t=0;for(let n=0;n<8;n++)t=t<<1|r[e+n];o.push(t)}let s=[236,17];for(let e=0;o.length<n;e++)o.push(s[e%2]);return o.concat(Wa(o,Ga[t-1][1]))}function Ja(e){return{size:e,mod:new Uint8Array(e*e),fn:new Uint8Array(e*e)}}function Ya(e,t,n,r){e.mod[t*e.size+n]=r,e.fn[t*e.size+n]=1}function Xa(e,t,n){for(let r=-1;r<=7;r++)for(let i=-1;i<=7;i++){let a=t+r,o=n+i;a<0||a>=e.size||o<0||o>=e.size||Ya(e,a,o,+(r>=0&&r<=6&&i>=0&&i<=6&&(r===0||r===6||i===0||i===6||r>=2&&r<=4&&i>=2&&i<=4)))}}function Za(e,t,n){for(let r=-2;r<=2;r++)for(let i=-2;i<=2;i++){let a=Math.max(Math.abs(r),Math.abs(i));Ya(e,t+r,n+i,a===1?0:1)}}function Qa(e,t){let n=e.size;for(let t=0;t<n;t++)Ya(e,6,t,+(t%2==0)),Ya(e,t,6,+(t%2==0));if(Xa(e,0,0),Xa(e,0,n-7),Xa(e,n-7,0),t>=2){let t=n-7;Za(e,t,t)}for(let t=0;t<9;t++)t!==6&&(e.fn[8*n+t]=1),t!==6&&(e.fn[t*n+8]=1);e.fn[8*n+6]=1,e.fn[6*n+8]=1;for(let t=0;t<8;t++)e.fn[(n-1-t)*n+8]=1;for(let t=0;t<8;t++)e.fn[8*n+(n-1-t)]=1;Ya(e,n-8,8,1)}function $a(e,t){let n=e.size,r=[];for(let e of t)for(let t=7;t>=0;t--)r.push(e>>t&1);let i=0,a=!0;for(let t=n-1;t>=1;t-=2){t===6&&(t=5);for(let o=0;o<n;o++){let s=a?n-1-o:o;for(let a of[0,1]){let o=t-a;e.fn[s*n+o]||(e.mod[s*n+o]=i<r.length?r[i++]:0)}}a=!a}}const eo=[(e,t)=>(e+t)%2==0,e=>e%2==0,(e,t)=>t%3==0,(e,t)=>(e+t)%3==0,(e,t)=>(Math.floor(e/2)+Math.floor(t/3))%2==0,(e,t)=>e*t%2+e*t%3==0,(e,t)=>(e*t%2+e*t%3)%2==0,(e,t)=>((e+t)%2+e*t%3)%2==0];function to(e,t){let n=eo[t];for(let t=0;t<e.size;t++)for(let r=0;r<e.size;r++)!e.fn[t*e.size+r]&&n(t,r)&&(e.mod[t*e.size+r]^=1)}function no(e){let t=e.size,n=(n,r)=>e.mod[n*t+r],r=0;for(let e=0;e<t;e++){let i=1,a=1;for(let o=1;o<t;o++)n(e,o)===n(e,o-1)?i++:(i>=5&&(r+=i-2),i=1),n(o,e)===n(o-1,e)?a++:(a>=5&&(r+=a-2),a=1);i>=5&&(r+=i-2),a>=5&&(r+=a-2)}for(let e=0;e<t-1;e++)for(let i=0;i<t-1;i++){let t=n(e,i);t===n(e,i+1)&&t===n(e+1,i)&&t===n(e+1,i+1)&&(r+=3)}let i=[1,0,1,1,1,0,1,0,0,0,0],a=[0,0,0,0,1,0,1,1,1,0,1],o=(e,t,n)=>{for(let r=0;r<n.length;r++)if(e(t+r)!==n[r])return!1;return!0};for(let e=0;e<t;e++)for(let s=0;s<=t-11;s++)(o(t=>n(e,t),s,i)||o(t=>n(e,t),s,a))&&(r+=40),(o(t=>n(t,e),s,i)||o(t=>n(t,e),s,a))&&(r+=40);let s=0;for(let n=0;n<t*t;n++)s+=e.mod[n];let c=s*100/(t*t),l=Math.floor(Math.abs(c-50)/5);return r+=l*10,r}function ro(e){let t=8|e,n=t<<10;for(let e=14;e>=10;e--)n>>e&1&&(n^=1335<<e-10);return(t<<10|n)^21522}function io(e,t){let n=e.size,r=ro(t),i=e=>r>>e&1;for(let t=0;t<=5;t++)e.mod[t*n+8]=i(t);e.mod[7*n+8]=i(6),e.mod[8*n+8]=i(7),e.mod[8*n+7]=i(8);for(let t=9;t<15;t++)e.mod[8*n+(14-t)]=i(t);for(let t=0;t<8;t++)e.mod[(n-1-t)*n+8]=i(t);for(let t=8;t<15;t++)e.mod[8*n+(n-15+t)]=i(t);e.mod[(n-8)*n+8]=1}function ao(e){let t=new TextEncoder().encode(e),n=Ka(t.length),r=qa(t,n),i=Ja(17+4*n);Qa(i,n),$a(i,r);let a=0,o=1/0;for(let e=0;e<8;e++){to(i,e),io(i,e);let t=no(i);t<o&&(o=t,a=e),to(i,e)}to(i,a),io(i,a);let s=[];for(let e=0;e<i.size;e++){let t=[];for(let n=0;n<i.size;n++)t.push(i.mod[e*i.size+n]===1);s.push(t)}return s}function oo(e){let t=ao(e),n=t.length,r=n+8,i=``;for(let e=0;e<n;e++)for(let r=0;r<n;r++)t[e][r]&&(i+=`<rect x="${r+4}" y="${e+4}" width="1" height="1"/>`);return`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${r} ${r}" shape-rendering="crispEdges" role="img" aria-label="QR code"><rect width="${r}" height="${r}" fill="#ffffff"/><g fill="#000000">${i}</g></svg>`}function so(e){let{identity:t,settings:n,authStore:r}=e;return{status(){let e=r.describe(),t={apiKey:!!e.apiKey,console:!!e.console,openapi:!!e.openapi},n;e.console?n=D(e.console.token):e.apiKey?n=D(e.apiKey.token):e.openapi&&(n=D(e.openapi.accessKeyId));let i=e.console?`console`:e.apiKey?`apiKey`:e.openapi?`openapi`:null;return{authenticated:t.apiKey||t.console||t.openapi,methods:t,primary:i,region:e.console?.region,site:e.console?.site,masked:n}},startConsoleLogin(){let e=Vr(r.describe().console?.site),i=!!r.stored().apiKey;ni(e,{identity:t,settings:n,authStore:r},{needApiKey:!i}).catch(e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(`console login failed: ${t}\n`)})},logout(){return r.logout(`all`)}}}const co={".png":`image`,".jpg":`image`,".jpeg":`image`,".webp":`image`,".gif":`image`,".bmp":`image`,".svg":`image`,".mp4":`video`,".mov":`video`,".webm":`video`,".mkv":`video`,".avi":`video`,".mp3":`audio`,".wav":`audio`,".m4a":`audio`,".aac":`audio`,".flac":`audio`,".ogg":`audio`},lo={".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".webp":`image/webp`,".gif":`image/gif`,".bmp":`image/bmp`,".svg":`image/svg+xml`,".mp4":`video/mp4`,".mov":`video/quicktime`,".webm":`video/webm`,".mkv":`video/x-matroska`,".avi":`video/x-msvideo`,".mp3":`audio/mpeg`,".wav":`audio/wav`,".m4a":`audio/mp4`,".aac":`audio/aac`,".flac":`audio/flac`,".ogg":`audio/ogg`};function uo(e=Jn()){return z(e,`bailian-output`)}function fo(e){return co[e.toLowerCase()]??`other`}function po(e){return lo[e.toLowerCase()]??`application/octet-stream`}function mo(e,t,n){let r;try{r=Rn(e,{withFileTypes:!0})}catch{return}for(let i of r){let r=z(e,i.name);i.isDirectory()?t>0&&mo(r,t-1,n):(i.isFile()||i.isSymbolicLink())&&n.push(r)}}function ho(e=uo()){let t=[];if(!R(e))return{base:e,assets:t};let n=[];mo(e,8,n);for(let r of n){let n;try{n=zn(r)}catch{continue}if(!n.isFile())continue;let i=Gn(e,r),a=i.split(qn),o=a.length>1?a[0]:`other`,s=Wn(r);t.push({name:r.split(qn).pop()??r,category:o,kind:fo(s),relPath:i,size:n.size,mtime:n.mtimeMs,ext:s.replace(/^\./,``).toLowerCase()})}return t.sort((e,t)=>t.mtime-e.mtime),{base:e,assets:t}}function go(e,t){if(typeof t!=`string`||t.length===0)return null;let n=Kn(e),r=Kn(n,t);return r!==n&&!r.startsWith(n+qn)?null:r}const _o={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 G(e){return e instanceof t||e instanceof Error?e.message:String(e)}function K(e,t,n){e.writeHead(t,{"Content-Type":`application/json; charset=utf-8`}),e.end(JSON.stringify(n))}function vo(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,t=>{if(r+=t.length,r>1048576){n(Error(`payload too large`)),e.destroy();return}i.push(t)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function yo(e,t){return new Promise((n,r)=>{let i=0,a=[];e.on(`data`,n=>{if(i+=n.length,i>t){r(Error(`payload too large`)),e.destroy();return}a.push(n)}),e.on(`end`,()=>n(Buffer.concat(a))),e.on(`error`,r)})}function bo(e,t){if(!e)return!1;let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&xn(n,r)}function xo(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[Zi(n)]=$i(n,e))}return t}function So(e,t){let n=new Set(Gi),r={};for(let[t,i]of Object.entries(e))n.has(t)||(r[t]=i);return{...r,...t}}function Co(e,t,n=uo(),r){return Sn.createServer(async(i,a)=>{try{let o=(i.headers.host||``).split(`:`)[0];if(o!==`127.0.0.1`&&o!==`localhost`){a.writeHead(403,{"Content-Type":`text/plain; charset=utf-8`}),a.end(`forbidden host
|
|
31
|
-
`);return}let s=new URL(i.url??`/`,`http://127.0.0.1`);if(!
|
|
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 Li)process.stdout.write(`${e(t.voice,12)} ${e(t.name,14)} ${e(t.desc,14)} ${t.lang}\n`);process.stdout.write(`\nTotal: ${Li.length} voices\n`)}const zi={wav:`wav`,mp3:`mp3`,amr:`amr`,aac:`aac`,m4a:`aac`,ogg:`ogg`,"3gp":`3gp`,"3gpp":`3gpp`},Bi=Object.keys(zi);function Vi(e){let n=e.split(`?`)[0].split(`#`)[0],r=er(n).slice(1).toLowerCase();if(!r)throw new t(`Cannot infer audio format from "${e}". Use a file/URL whose path ends with: ${Bi.join(`, `)}.`,s.USAGE);let i=zi[r];if(!i)throw new t(`Unsupported audio extension ".${r}" for "${e}". Supported extensions: ${Bi.join(`, `)}.`,s.USAGE);return i}function Hi(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 Ui=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){Ri();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:Vi(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){A({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:ie(),method:`POST`,body:_,stream:!0}),y=``,b=``,x=process.stdout.isTTY,S=process.stdout;for await(let e of wt(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,x&&S.write(t.content)),t.audio?.data&&(b+=t.audio.data)}}catch{}}x&&y&&S.write(`
|
|
24
|
+
`);let C;if(b&&!s){let e=Buffer.from(b,`base64`),r=Hi(e.length),i=Buffer.concat([r,e]),a=n.audioOut;if(!a){let{join:e}=await import(`path`);a=e(Vt(t,{subDir:`omni`}),`omni_${Date.now()}.wav`)}Zn(a,i),C=a,t.quiet||process.stderr.write(`Audio saved: ${a}\n`)}if(!x||c===`json`){let e={content:y};C&&(e.audio_saved=C,e.voice=a),A(e,c)}}}),Wi=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-3.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:fn},watermark:{type:`boolean`,valueHint:`<bool>`,description:pn},...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 "plush doll" --model z-image-turbo --size 1024*1024`,`--prompt "sunset" --model wanx2.0-t2i-turbo --size 1024*1024`,`--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-3.0`,a=Bt(i),o=Fn(n.size||`1:1`,a.sizeProfile),s=n.n??1,c=En(n),l=Rt(n.promptExtend,a.promptExtendDefault,`prompt-extend`),u=Ht(n.watermark),d={size:o,n:s,seed:n.seed,prompt_extend:l,watermark:u},f=a.inputStyle===`prompt`?{model:i,input:{prompt:r,negative_prompt:n.negativePrompt||void 0},parameters:d}:{model:i,input:{messages:[{role:`user`,content:[{text:r}]}]},parameters:{...d,negative_prompt:n.negativePrompt||void 0}},p=T(t.output);if(t.dryRun){A({request:f,mode:a.useSync?`sync`:`async`,path:a.path},p);return}t.quiet||process.stderr.write(`[Model: ${i}] [Mode: ${a.useSync?`sync`:`async`}]\n`),a.useSync?await Gi(e.client,t,a.path,f,n,p,c):await Ki(e.client,t,a.path,f,n,p,c)}});async function Gi(e,n,r,i,a,o,c){let l=(await In(c,n,()=>e.requestJson({path:r,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.`,s.GENERAL);await qi(l,a,n,o)}async function Ki(e,n,r,i,a,o,c){let l=(await In(c,n,()=>e.requestJson({path:r,method:`POST`,body:i,async:!0}),`tasks`)).map(e=>e.output.task_id);if(a.async){A({task_ids:l},o);return}let u=a.pollInterval??3,d=l.map(t=>Mn(e,n,{url:e.url(Zt(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.`,s.GENERAL);await qi(p,a,n,o,l.length===1?l[0]:void 0,l)}async function qi(e,t,n,r,i,a){let o=Vt(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),s=t.prompt||``,c=t.outPrefix||Fe(`image`,s),l=await xn(e.length>1?e.map((e,t)=>({url:e,destPath:N(o,`${c}_${String(t+1).padStart(3,`0`)}.png`)})):[{url:e[0],destPath:N(o,`${c}.png`)}],bn,{quiet:n.quiet});if(n.quiet)k(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),A(t,r)}}var Ji=w({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-3.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`},function:{type:`string`,valueHint:`<name>`,description:`wanx*-imageedit function (default: description_edit). Examples: stylization_all, description_edit`},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:dn},watermark:{type:`boolean`,valueHint:`<bool>`,description:pn},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 "Place the subject on a table" --model wan2.5-i2i-preview`,`--image ./photo.png --prompt "转换成绘本风格" --model wanx2.1-imageedit --function stylization_all`,`--image ./photo.png --prompt "Replace the background with a beach" --watermark false`],async run(e){let{settings:n,flags:r}=e,i=[];Array.isArray(r.image)?i=r.image:typeof r.image==`string`&&(i=[r.image]);let a=r.prompt,o=r.model||n.defaultImageModel||`qwen-image-3.0`,c=zt(o),l=await Promise.all(i.map(t=>e.client.resolveImageInput(t,o))),u=r.n??1,d=Rt(r.promptExtend,c.promptExtendDefault,`prompt-extend`),f=Ht(r.watermark),p={size:Fn(r.size,c.sizeProfile),n:u,seed:r.seed,prompt_extend:d,watermark:f},m;if(c.inputStyle===`function-base-image`){let e=l[0];if(!e)throw new t(`wanx*-imageedit requires at least one --image as base_image_url.`,s.USAGE);m={model:o,input:{function:r.function||`description_edit`,prompt:a,base_image_url:e},parameters:p}}else if(c.inputStyle===`prompt-images`)m={model:o,input:{prompt:a,images:l,negative_prompt:r.negativePrompt||void 0},parameters:p};else{let e=l.map(e=>({image:e}));e.push({text:a}),m={model:o,input:{messages:[{role:`user`,content:e}]},parameters:{...p,negative_prompt:r.negativePrompt||void 0}}}Xt(m.parameters);let h=T(n.output);if(n.dryRun){let e=m;`messages`in m.input?e={...m,input:{messages:m.input.messages.map(e=>({...e,content:e.content.map(e=>e.image?{...e,image:D(e.image)}:e)}))}}:`images`in m.input?e={...m,input:{...m.input,images:m.input.images?.map(e=>D(e))}}:`base_image_url`in m.input&&(e={...m,input:{...m.input,base_image_url:D(m.input.base_image_url),mask_image_url:m.input.mask_image_url?D(m.input.mask_image_url):void 0}}),A({request:e,mode:c.useSync?`sync`:`async`,path:c.path},h);return}n.quiet||process.stderr.write(`[Model: ${o}] [Mode: ${c.useSync?`sync`:`async`}] [Images: ${l.length}]\n`);let g=En(r);c.useSync?await Yi(e.client,n,c.path,m,r,h,g):await Xi(e.client,n,c.path,m,r,h,g)}});async function Yi(e,n,r,i,a,o,c){let l=(await In(c,n,()=>e.requestJson({path:r,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(`Edit completed but no images returned.`,s.GENERAL);await Zi(l,a,n,o)}async function Xi(e,n,r,i,a,o,c){let l=(await In(c,n,()=>e.requestJson({path:r,method:`POST`,body:i,async:!0}),`tasks`)).map(e=>e.output.task_id);if(a.async){A({task_ids:l},o);return}let u=a.pollInterval??3,d=l.map(t=>Mn(e,n,{url:e.url(Zt(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.`,s.GENERAL);await Zi(p,a,n,o)}async function Zi(e,t,n,r){let i=Vt(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),a=t.outPrefix||Fe(`edited`,t.prompt),o=await xn(e.length>1?e.map((e,t)=>({url:e,destPath:N(i,`${a}_${String(t+1).padStart(3,`0`)}.png`)})):[{url:e[0],destPath:N(i,`${a}.png`)}],bn,{quiet:n.quiet});n.quiet?k(o.join(`
|
|
26
|
+
`)):A({urls:e,saved:o,total:e.length},r)}var Qi=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`},lastFrame:{type:`string`,valueHint:`<url>`,description:`Last frame image URL (with --image, enables kf2v first+last frame mode)`},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:un},watermark:{type:`boolean`,valueHint:`<bool>`,description:pn},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,a=r.model||(r.image?n.defaultImageToVideoModel||`happyhorse-1.1-i2v`:n.defaultVideoModel||`happyhorse-1.1-t2v`),o=T(n.output),c=r.image,l=r.lastFrame,u;c&&(u=await e.client.resolveImageInput(c,a));let d;l&&(d=await e.client.resolveImageInput(l,a));let f=!!(u&&d),p=Ht(r.watermark),m=Rt(r.promptExtend,void 0,`prompt-extend`),h={model:a,input:{prompt:i,negative_prompt:r.negativePrompt||void 0,...f?{first_frame_url:u,last_frame_url:d}:u?/wan[x]?2\.[1-6]/i.test(a)?{img_url:u}:{media:[{type:`first_frame`,url:u}]}:{}},parameters:{resolution:r.resolution||void 0,ratio:r.ratio||void 0,duration:r.duration||void 0,prompt_extend:m,watermark:p,seed:r.seed}};if(n.dryRun){let e=h;if(f)e={...h,input:{...h.input,first_frame_url:D(u??``),last_frame_url:D(d??``)}};else if(u){let t=D(u);e={...h,input:{...h.input,.../wan[x]?2\.[1-6]/i.test(a)?{img_url:t}:{media:[{type:`first_frame`,url:t}]}}}}A({request:e},o);return}let g=(await In(En(r),n,()=>e.client.requestJson({path:f?Ke():on(),method:`POST`,body:h,async:!0}),`tasks`)).map(e=>e.output.task_id);if(n.quiet||process.stderr.write(`[Model: ${a}]\n`),r.async){A(g.length===1?{task_id:g[0]}:{task_ids:g},o);return}let _=r.pollInterval??5,v=g.map(t=>{let r=e.client.url(Zt(t));return Mn(e.client,n,{url:r,intervalSec:_,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}})}),y=await Promise.all(v),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.`,s.GENERAL);if(r.download){let e=r.download,{size:t}=await bn(b[0].videoUrl,e,{quiet:n.quiet});n.quiet?k(e):A({task_id:b[0].taskId,video_url:b[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Tn(t)},o);return}let x=Vt(n,{subDir:`videos`}),{join:S}=await import(`path`),C=[];await Promise.all(b.map(async({taskId:e,videoUrl:t})=>{let r=S(x,`${e}.mp4`);await bn(t,r,{quiet:n.quiet}),C.push({task_id:e,video_url:t,saved:r})})),C.length===1?A(C[0],o):A({videos:C,total:C.length},o)}}),$i=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:un},watermark:{type:`boolean`,valueHint:`<bool>`,description:pn},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,a=r.prompt,o=r.model||`happyhorse-1.0-video-edit`,c=T(n.output),l=[{type:`video`,url:await e.client.uploadFile(i,o)}],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,o);l.push({type:`reference_image`,url:t})}}let d=Rt(r.promptExtend,void 0,`prompt-extend`),f=Ht(r.watermark),p={model:o,input:{prompt:a||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){A({request:p},c);return}let m=(await In(En(r),n,()=>e.client.requestJson({path:on(),method:`POST`,body:p,async:!0}),`tasks`)).map(e=>e.output.task_id);if(n.quiet||(process.stderr.write(`[Model: ${o}]\n`),process.stderr.write(`Note: Video editing typically takes 5-8 minutes. Please be patient.
|
|
27
|
+
`)),r.async){A(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=>Mn(e.client,n,{url:e.client.url(Zt(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.`,s.GENERAL);if(r.download){let e=r.download,{size:t}=await bn(v[0].videoUrl,e,{quiet:n.quiet});n.quiet?k(e):A({task_id:v[0].taskId,video_url:v[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Tn(t)},c);return}let y=await import(`path`),b=Vt(n,{subDir:`videos`}),x=[];await Promise.all(v.map(async({taskId:e,videoUrl:t})=>{let r=y.join(b,`${e}.mp4`);await bn(t,r,{quiet:n.quiet}),x.push({task_id:e,video_url:t,saved:r})})),x.length===1?A(x[0],c):A({videos:x,total:x.length},c)}}),ea=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:un},watermark:{type:`boolean`,valueHint:`<bool>`,description:pn},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,a=r.image||[],o=r.refVideo||[],c=r.imageVoice||[],l=r.videoVoice||[],u=r.model||n.defaultReferenceToVideoModel||`happyhorse-1.1-r2v`,d=T(n.output),f=[];for(let t=0;t<a.length;t++){let n={type:`reference_image`,url:await e.client.resolveImageInput(a[t],u)};c[t]&&(n.reference_voice=await e.client.uploadFile(c[t],u)),f.push(n)}for(let t=0;t<o.length;t++){let n={type:`reference_video`,url:await e.client.uploadFile(o[t],u)};l[t]&&(n.reference_voice=await e.client.uploadFile(l[t],u)),f.push(n)}let p=Rt(r.promptExtend,void 0,`prompt-extend`),m=Ht(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){A({request:{...h,input:{...h.input,media:h.input.media.map(e=>({...e,url:D(e.url),reference_voice:e.reference_voice?D(e.reference_voice):void 0}))}}},d);return}let g=(await In(En(r),n,()=>e.client.requestJson({path:on(),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){A(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=>Mn(e.client,n,{url:e.client.url(Zt(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.`,s.GENERAL);if(r.download){let e=r.download,{size:t}=await bn(b[0].videoUrl,e,{quiet:n.quiet});n.quiet?k(e):A({task_id:b[0].taskId,video_url:b[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Tn(t)},d);return}let{join:x}=await import(`path`),S=Vt(n,{subDir:`videos`}),C=[];await Promise.all(b.map(async({taskId:e,videoUrl:t})=>{let r=x(S,`${e}.mp4`);await bn(t,r,{quiet:n.quiet}),C.push({task_id:e,video_url:t,saved:r})})),C.length===1?A(C[0],d):A({videos:C,total:C.length},d)}}),ta=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){A({task_id:r},i);return}let a=await e.client.requestJson({path:Zt(r)});if(t.quiet){k(a.output.task_status);return}A({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)}}),na=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,a=r.out,o=T(n.output);if(n.dryRun){A({task_id:i,action:`download`,out:a},o);return}let c=await e.client.requestJson({path:Zt(i)});if(c.output.task_status!==`SUCCEEDED`)throw new t(`Task is not complete (status: ${c.output.task_status}).`,s.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.`,s.GENERAL);let{size:u}=await bn(l,a,{quiet:n.quiet});if(n.quiet){k(a);return}A({saved:a,size:Tn(u)},o)}});const ra=new Set([`.mp4`,`.mov`,`.avi`,`.mkv`,`.webm`,`.flv`,`.wmv`]);function ia(e){let t=er(e).toLowerCase().split(`?`)[0];return!!(ra.has(t)||/\.(mp4|mov|avi|mkv|webm|flv|wmv)(\?|$)/i.test(e))}async function aa(e){return e.startsWith(`data:`)||e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`oss://`)?e:qe(e)}var oa=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,a=r.video??[],o=r.model||(e.client.usesTokenPlanEndpoint()?n.defaultTextModel:void 0)||`qwen3-vl-plus`;i&&ia(i)&&(a.push(i),i=void 0);let c=a.length>0?`Describe the video.`:`Describe the image.`,l=r.prompt||c,u=T(n.output);if(n.dryRun){A({request:{prompt:l,image:i?D(i):void 0,video:a.length?a.map(D):void 0,model:o}},u);return}let d=[];if(a.length>0)for(let n of a){let r=n;if(Ye(n)){if(!Kn(n))throw new t(`Video file not found: ${n}`,s.USAGE);r=await e.client.uploadFile(n,o)}d.push({type:`video_url`,video_url:{url:r}})}if(i){let t=await aa(i),n=t;Ye(i)&&t.startsWith(`data:`)&&Xn(i).size>5*1024*1024&&(n=await e.client.resolveImageInput(i,o)),d.push({type:`image_url`,image_url:{url:n}})}d.push({type:`text`,text:l});let f={model:o,messages:[{role:`user`,content:d}]},p=await e.client.requestJson({path:ie(),method:`POST`,body:f}),m=p.choices?.[0]?.message?.content;if(u!==`text`){A(p,u);return}k(m||``)}});const sa=[`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`],ca=new Set([`api_key`,`access_token`,`access_key_id`,`access_key_secret`,`security_token`]),la=[`console_site`,`console_region`,`console_switch_agent`,`telemetry`],ua=[...sa,...la],da={output:[`text`,`json`],console_site:[`domestic`,`international`]},fa=new Set([`telemetry`]),pa={default_text_model:`qwen3.8-max`,default_image_model:`qwen-image-3.0`,default_video_model:`happyhorse-1.1-t2v`,default_speech_model:`cosyvoice-v3-flash`,default_omni_model:`qwen3.5-omni-plus`},ma={default_text_model:[{id:`qwen3.8-max`,role:`text/chat default`},{id:`qwen3-coder-plus`,role:`coding-oriented (agent config)`},{id:`qwen-flash`,role:`fast · advisor ranking`},{id:`qwen3.6-flash`,role:`fast · advisor intent`}],default_image_model:[{id:`qwen-image-3.0`,role:`image/generate default · sync`},{id:`qwen-image-2.0`,role:`image/generate · sync`},{id:`qwen-image-max`,role:`image/generate · sync`},{id:`qwen-image-edit-2.0`,role:`image/edit · sync`},{id:`wanx2.x`,role:`image/generate · async series`}],default_video_model:[{id:`happyhorse-1.1-t2v`,role:`video/generate default · text-to-video`},{id:`happyhorse-1.1-i2v`,role:`video/generate · image-to-video`}],default_speech_model:[{id:`cosyvoice-v3-flash`,role:`speech/synthesize (TTS) default`},{id:`fun-asr`,role:`speech/recognize (ASR)`}],default_omni_model:[{id:`qwen3.5-omni-plus`,role:`omni/chat default`},{id:`qwen3-vl-plus`,role:`vision/describe · multimodal input`}]},ha={"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 ga(e){return ha[e]||e}function _a(e,n){let r=ga(e);if(!sa.includes(r))throw new t(`Invalid config key "${e}". Valid keys: ${sa.join(`, `)}`,s.USAGE);if(r===`output`&&![`text`,`json`].includes(n))throw new t(`Invalid output format "${n}". Valid values: text, json`,s.USAGE);if(r===`timeout`){let e=Number(n);if(isNaN(e)||e<=0)throw new t(`Invalid timeout "${n}". Must be a positive number.`,s.USAGE);return e}return r===`base_url`?St(n):n}function va(e,n){let r=ga(e);if(sa.includes(r))return _a(e,n);if(r===`console_site`){if(![`domestic`,`international`].includes(n))throw new t(`Invalid console_site "${n}". Valid values: domestic, international`,s.USAGE);return n}if(r===`console_region`)return n;if(r===`console_switch_agent`){let e=Number(n);if(!Number.isFinite(e)||e<=0)throw new t(`Invalid console_switch_agent "${n}". Must be a positive number.`,s.USAGE);return e}if(r===`telemetry`){if(n!==`true`&&n!==`false`)throw new t(`Invalid telemetry "${n}". Valid values: true, false`,s.USAGE);return n===`true`}throw new t(`Invalid config key "${e}". Valid keys: ${ua.join(`, `)}`,s.USAGE)}var ya=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 ca)typeof o[e]==`string`&&(o[e]=dt(o[e]));A(o,a)}}),ba=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=ga(r),o=_a(r,i),s=T(t.output);if(t.dryRun){A({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=ca.has(a)?dt(String(o)):o;A({[a]:n,config:t.configName??`default`,config_file:e.configStore.path},s)}}}),xa=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`){A({active_config:t.active,profiles:n,config_file:e.configStore.path},r);return}let i=Math.max(4,...n.map(e=>e.length));k(`${`NAME`.padEnd(i)} ACTIVE`);for(let e of n)k(`${e.padEnd(i)} ${e===t.active?`*`:``}`)}}),Sa=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){A({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||A({active_config:n,config_file:e.configStore.path},t)}});function Ca(e){try{return rr(e,`utf-8`)}catch{return}}function L(e){let t=Ca(e);if(t!==void 0)try{let e=JSON.parse(t);return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}catch{return}}function R(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}function wa(e){let t=/^---\s*\n([\s\S]*?)\n---/.exec(e);if(!t)return{};try{return R(hr.parse(t[1]))??{}}catch{return{}}}function Ta(e,t=500){let n=0,r=e=>{if(n>=t)return;let i;try{i=ir(e,{withFileTypes:!0})}catch{return}for(let a of i){if(n>=t)return;let i=I(e,a.name);a.isDirectory()?r(i):n+=1}};return r(e),n}function Ea(e){return[{source:`global`,dir:I(e,`.agents`,`skills`)},{source:`claude-code`,dir:I(e,`.claude`,`skills`)},{source:`cursor`,dir:I(e,`.cursor`,`skills`)},{source:`qwen-code`,dir:I(e,`.qwen`,`skills`)},{source:`codex`,dir:I(e,`.codex`,`skills`)},{source:`opencode`,dir:I(e,`.config`,`opencode`,`skills`)},{source:`openclaw`,dir:I(e,`.openclaw`,`skills`)},{source:`openclaw`,dir:I(e,`.openclaw`,`workspace`,`skills`)},{source:`hermes`,dir:I(e,`.hermes`,`skills`)},{source:`gemini`,dir:I(e,`.gemini`,`skills`)},{source:`antigravity`,dir:I(e,`.gemini`,`antigravity`,`skills`)},{source:`windsurf`,dir:I(e,`.windsurf`,`skills`)},{source:`windsurf`,dir:I(e,`.codeium`,`windsurf`,`skills`)},{source:`qoderwork`,dir:I(e,`.qoderwork`,`skills`)},{source:`workbuddy`,dir:I(e,`.workbuddy`,`skills`)}]}function Da(e=pr()){let t=new Map;for(let{source:n,dir:r}of Ea(e)){let e;try{e=ir(r,{withFileTypes:!0})}catch{continue}for(let i of e){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let e=I(r,i.name),a=I(e,`SKILL.md`);if(!P(a))continue;let o=t.get(i.name);if(o){o.sources.includes(n)||o.sources.push(n);continue}let s=wa(Ca(a)??``),c=R(s.metadata),l=typeof s.description==`string`?s.description.trim():``,u=c&&typeof c.version==`string`?c.version:typeof s.version==`string`?s.version:void 0;t.set(i.name,{id:i.name,name:typeof s.name==`string`&&s.name?s.name:i.name,description:l,version:u,fileCount:Ta(e),path:e,sources:[n],origin:`local`})}}return[...t.values()].sort((e,t)=>e.name.localeCompare(t.name))}function Oa(e,t=pr()){let n=Da(t).find(t=>t.id===e);if(!n)return null;let r=Ca(I(n.path,`SKILL.md`))??``;return{...n,content:r}}const ka=[{source:`global`,label:`All agents (~/.agents/skills)`,sub:[`.agents`,`skills`]},{source:`claude-code`,label:`Claude Code`,sub:[`.claude`,`skills`]},{source:`qwen-code`,label:`Qwen Code`,sub:[`.qwen`,`skills`]},{source:`codex`,label:`Codex`,sub:[`.codex`,`skills`]},{source:`opencode`,label:`OpenCode`,sub:[`.config`,`opencode`,`skills`]},{source:`openclaw`,label:`OpenClaw`,sub:[`.openclaw`,`skills`]},{source:`qoderwork`,label:`QoderWork`,sub:[`.qoderwork`,`skills`]},{source:`windsurf`,label:`Windsurf`,sub:[`.codeium`,`windsurf`,`skills`]},{source:`gemini`,label:`Gemini`,sub:[`.gemini`,`skills`]}];function Aa(e,t){let n=ka.find(t=>t.source===e);return n?I(t,...n.sub):null}function ja(e){let t=-1,n=Math.max(0,e.length-22-65535);for(let r=e.length-22;r>=n;r--)if(e.readUInt32LE(r)===101010256){t=r;break}if(t<0)throw Error(`Not a valid .zip archive.`);let r=e.readUInt16LE(t+10),i=e.readUInt32LE(t+16),a=[];for(let t=0;t<r&&!(i+46>e.length||e.readUInt32LE(i)!==33639248);t++){let t=e.readUInt16LE(i+10),n=e.readUInt32LE(i+20),r=e.readUInt16LE(i+28),o=e.readUInt16LE(i+30),s=e.readUInt16LE(i+32),c=e.readUInt32LE(i+42),l=e.toString(`utf8`,i+46,i+46+r);if(i+=46+r+o+s,l.endsWith(`/`)||c+30>e.length||e.readUInt32LE(c)!==67324752)continue;let u=e.readUInt16LE(c+26),d=e.readUInt16LE(c+28),f=c+30+u+d,p=e.subarray(f,f+n),m;if(t===0)m=Buffer.from(p);else if(t===8)m=mr(p);else throw Error(`Unsupported compression in archive (entry: `+l+`).`);a.push({name:l,data:m})}return a}function Ma(e,t,n,r=pr()){let i=Aa(e,r);if(!i)throw Error(`Unknown skill install target.`);let a=ja(t).map(e=>({name:e.name.replace(/\\/g,`/`).replace(/^\.\//,``).replace(/^\/+/,``),data:e.data})).filter(e=>e.name&&!e.name.endsWith(`/`)&&!e.name.split(`/`).includes(`..`));if(!a.length)throw Error(`The archive contains no usable files.`);let o=a.find(e=>e.name===`SKILL.md`||e.name.endsWith(`/SKILL.md`));if(!o)throw Error(`No SKILL.md found in the archive (root or a top-level folder).`);let s=o.name.lastIndexOf(`/`),c,l;if(s<0){if(c=(n||``).trim(),!c)throw Error(`SKILL.md is at the archive root — please provide a skill name.`);l=``}else l=o.name.slice(0,s+1),c=(n||``).trim()||l.split(`/`)[0];if(!/^[A-Za-z0-9._-]+$/.test(c))throw Error(`Invalid skill name: `+c);let u=I(i,c),d=dr(u),f=0;for(let e of a){let t=e.name;if(l){if(!e.name.startsWith(l))continue;t=e.name.slice(l.length)}if(!t)continue;let n=dr(I(u,t));n!==d&&!n.startsWith(d+fr)||(nr(cr(n),{recursive:!0}),sr(n,e.data),f++)}if(f===0)throw Error(`Nothing was extracted from the archive.`);return{installed:c,files:f,dir:u}}function Na(e){if(typeof e.command==`string`){let t=Array.isArray(e.args)?e.args.join(` `):``;return{transport:`stdio`,detail:`${e.command} ${t}`.trim()}}let t=typeof e.url==`string`?e.url:void 0;return t?{transport:(typeof e.type==`string`?e.type.toLowerCase():``)===`sse`?`sse`:`http`,detail:t}:{transport:`unknown`,detail:``}}function z(e,t,n,r,i){let a=R(e);if(a)for(let[e,o]of Object.entries(a)){let a=R(o)??{},{transport:s,detail:c}=Na(a);r.push({name:e,source:t,transport:s,detail:c,scope:n,origin:`local`,config:Ga(a),editable:i})}}function Pa(e=pr()){let t=[],n=L(I(e,`.claude.json`));if(n){z(n.mcpServers,`claude-code`,`global`,t,!0);let e=R(n.projects);if(e)for(let[n,r]of Object.entries(e)){let e=R(r);e?.mcpServers&&z(e.mcpServers,`claude-code`,n,t,!0)}}let r=L(I(e,`.qwen`,`settings.json`));r&&z(r.mcpServers,`qwen-code`,`global`,t,!0);let i=L(I(e,`.config`,`opencode`,`opencode.json`));i&&z(i.mcp,`opencode`,`global`,t,!0);let a=L(I(e,`.cursor`,`mcp.json`));a&&z(a.mcpServers,`cursor`,`global`,t,!0);let o=L(I(e,`.codeium`,`windsurf`,`mcp_config.json`));o&&z(o.mcpServers,`windsurf`,`global`,t,!0);let s=L(I(e,`.gemini`,`settings.json`));s&&z(s.mcpServers,`gemini`,`global`,t,!0);let c=L(I(e,`.qoderwork`,`mcp.json`));c&&z(c.mcpServers,`qoderwork`,`global`,t,!0);let l=L(I(e,`.openclaw`,`openclaw.json`));l&&z(l.mcpServers,`openclaw`,`global`,t,!0);let u=L(Fa(e));u&&z(u.mcpServers,`claude-desktop`,`global`,t,!0);let d=Ca(I(e,`.codex`,`config.toml`));if(d)try{z(gr(d).mcp_servers,`codex`,`global`,t,!1)}catch{}return t.sort((e,t)=>e.name.localeCompare(t.name)||e.source.localeCompare(t.source))}function Fa(e){return process.platform===`darwin`?I(e,`Library`,`Application Support`,`Claude`,`claude_desktop_config.json`):process.platform===`win32`?I(process.env.APPDATA??I(e,`AppData`,`Roaming`),`Claude`,`claude_desktop_config.json`):I(e,`.config`,`Claude`,`claude_desktop_config.json`)}function Ia(e,t,n){return e===`claude-code`?{file:I(n,`.claude.json`),mapKey:`mcpServers`,projectScoped:t!==`global`}:e===`qwen-code`?{file:I(n,`.qwen`,`settings.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`opencode`?{file:I(n,`.config`,`opencode`,`opencode.json`),mapKey:`mcp`,projectScoped:!1}:e===`cursor`?{file:I(n,`.cursor`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`windsurf`?{file:I(n,`.codeium`,`windsurf`,`mcp_config.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`gemini`?{file:I(n,`.gemini`,`settings.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`qoderwork`?{file:I(n,`.qoderwork`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`openclaw`?{file:I(n,`.openclaw`,`openclaw.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`claude-desktop`?{file:Fa(n),mapKey:`mcpServers`,projectScoped:!1}:null}function La(e,t){if(typeof e==`string`){if(e.includes(`•`)){if(typeof t==`string`)return t;throw Error(`Replace masked values (•••) with the real value before saving.`)}return e}if(Array.isArray(e)){let n=Array.isArray(t)?t:[];return e.map((e,t)=>La(e,n[t]))}let n=R(e);if(n){let e=R(t)??{},r={};for(let[t,i]of Object.entries(n))r[t]=La(i,e[t]);return r}return e}function Ra(e,t,n,r,i=pr()){let a=Ia(e,t,i);if(!a)throw Error(`This MCP source is read-only and cannot be edited here.`);let o=n.trim();if(!o)throw Error(`Server name is required.`);let s=R(r);if(!s)throw Error(`Config must be a JSON object.`);let c=L(a.file)??{},l=c;if(a.projectScoped){let e=R(c.projects)??{};c.projects=e;let n=R(e[t])??{};e[t]=n,l=n}let u=R(l[a.mapKey])??{};l[a.mapKey]=u,u[o]=La(s,R(u[o])),nr(cr(a.file),{recursive:!0}),sr(a.file,JSON.stringify(c,null,2)+`
|
|
29
|
+
`,`utf-8`)}function za(e,t,n,r=pr()){let i=Ia(e,t,r);if(!i)throw Error(`This MCP source is read-only and cannot be edited here.`);let a=L(i.file);if(!a)throw Error(`Config file not found.`);let o=a;if(i.projectScoped){let e=R(a.projects);o=e?R(e[t]):void 0}let s=o?R(o[i.mapKey]):void 0;if(!s||!(n in s))throw Error(`Server not found: `+n);delete s[n],o&&Object.keys(s).length===0&&delete o[i.mapKey],sr(i.file,JSON.stringify(a,null,2)+`
|
|
30
|
+
`,`utf-8`)}const Ba=[{id:`claude-code`,label:`Claude Code`,paths:e=>[I(process.env.CLAUDE_CONFIG_DIR||I(e,`.claude`),`settings.json`),I(e,`.claude.json`)],detect:e=>{let t=R(L(I(process.env.CLAUDE_CONFIG_DIR||I(e,`.claude`),`settings.json`))?.env),n=t&&typeof t.ANTHROPIC_BASE_URL==`string`?t.ANTHROPIC_BASE_URL:void 0,r=t&&typeof t.ANTHROPIC_MODEL==`string`?t.ANTHROPIC_MODEL:void 0;return{configured:!!n,model:r}}},{id:`qwen-code`,label:`Qwen Code`,paths:e=>[I(e,`.qwen`,`settings.json`)],detect:e=>{let t=L(I(e,`.qwen`,`settings.json`)),n=R(t?.modelProviders),r=n?Object.values(n).some(e=>Array.isArray(e)&&e.some(e=>{let t=R(e)?.name;return typeof t==`string`&&(t===`bailian-cli`||t.startsWith(`[Bailian]`))})):!1,i=R(t?.model);return{configured:r,model:i&&typeof i.name==`string`?i.name:void 0}}},{id:`opencode`,label:`OpenCode`,paths:e=>[I(e,`.config`,`opencode`,`opencode.json`)],detect:e=>{let t=R(R(L(I(e,`.config`,`opencode`,`opencode.json`))?.provider)?.[`bailian-cli`]),n=R(t?.models);return{configured:!!t,model:n?Object.keys(n)[0]:void 0}}},{id:`openclaw`,label:`OpenClaw`,paths:e=>[I(e,`.openclaw`,`openclaw.json`)],detect:e=>{let t=R(R(R(L(I(e,`.openclaw`,`openclaw.json`))?.models)?.providers)?.[`bailian-cli`]),n=R((Array.isArray(t?.models)?t.models:[])[0]);return{configured:!!t,model:n&&typeof n.id==`string`?n.id:void 0}}},{id:`hermes`,label:`Hermes Agent`,paths:e=>[I(e,`.hermes`,`config.yaml`)],detect:e=>{let t=Ca(I(e,`.hermes`,`config.yaml`));if(!t)return{configured:!1};let n;try{n=R(hr.parse(t))}catch{return{configured:!1}}let r=(Array.isArray(n?.custom_providers)?n.custom_providers:[]).some(e=>R(e)?.name===`bailian-cli`),i=R(n?.model),a=!!(i&&i.provider===`custom`&&typeof i.base_url==`string`&&i.base_url.includes(`aliyuncs.com`));return{configured:r||a,model:i&&typeof i.default==`string`?i.default:void 0}}},{id:`codex`,label:`Codex`,paths:e=>[I(e,`.codex`,`config.toml`),I(e,`.codex`,`auth.json`)],detect:e=>{let t=Ca(I(e,`.codex`,`config.toml`));if(!t)return{configured:!1};let n={};try{n=gr(t)}catch{return{configured:!1}}return{configured:!!R(n.model_providers)?.[`bailian-cli`],model:typeof n.model==`string`?n.model:void 0}}}];function Va(e=pr()){return Ba.map(t=>{let n=t.paths(e),r=n.some(e=>P(e)),{configured:i,model:a}=r?t.detect(e):{configured:!1,model:void 0};return{id:t.id,label:t.label,installed:r,configured:i,model:a,paths:n,origin:`local`}})}function B(e,t,n,r=!1){typeof n==`string`&&n.trim()&&e.push({label:t,value:n.trim(),secret:r})}function Ha(e,t){let n=[];if(e===`claude-code`){let e=R(L(I(t,`.claude`,`settings.json`))?.env);B(n,`Model`,e?.ANTHROPIC_MODEL),B(n,`Base URL`,e?.ANTHROPIC_BASE_URL),B(n,`Auth Token`,e?.ANTHROPIC_AUTH_TOKEN,!0)}else if(e===`qwen-code`){let e=L(I(t,`.qwen`,`settings.json`)),r=R(e?.model),i=R(R(e?.security)?.auth),a=R(e?.env);B(n,`Model`,r?.name),B(n,`Base URL`,i?.baseUrl??r?.baseUrl),B(n,`Protocol`,i?.selectedType),B(n,`API Key`,i?.apiKey??a?.BAILIAN_CLI_API_KEY,!0)}else if(e===`opencode`){let e=R(R(L(I(t,`.config`,`opencode`,`opencode.json`))?.provider)?.[`bailian-cli`]),r=R(e?.options),i=R(e?.models);B(n,`Model`,i?Object.keys(i)[0]:void 0),B(n,`Base URL`,r?.baseURL),B(n,`Provider`,e?.npm),B(n,`API Key`,r?.apiKey,!0)}else if(e===`openclaw`){let e=R(R(R(L(I(t,`.openclaw`,`openclaw.json`))?.models)?.providers)?.[`bailian-cli`]);B(n,`Model`,R((Array.isArray(e?.models)?e.models:[])[0])?.id),B(n,`Base URL`,e?.baseUrl),B(n,`API`,e?.api),B(n,`API Key`,e?.apiKey,!0)}else if(e===`hermes`){let e=Ca(I(t,`.hermes`,`config.yaml`)),r;if(e)try{r=R(hr.parse(e))}catch{r=void 0}let i=R((Array.isArray(r?.custom_providers)?r.custom_providers:[]).find(e=>R(e)?.name===`bailian-cli`));B(n,`Model`,R((Array.isArray(i?.models)?i.models:[])[0])?.id??R(r?.model)?.default),B(n,`Base URL`,i?.base_url),B(n,`API Mode`,i?.api_mode),B(n,`API Key`,i?.api_key,!0)}else if(e===`codex`){let e=Ca(I(t,`.codex`,`config.toml`)),r={};if(e)try{r=gr(e)}catch{r={}}let i=R(R(r.model_providers)?.[`bailian-cli`]),a=L(I(t,`.codex`,`auth.json`));B(n,`Model`,r.model),B(n,`Base URL`,i?.base_url),B(n,`Wire API`,i?.wire_api),B(n,`API Key`,a?.OPENAI_API_KEY,!0)}return n}function Ua(e){let t=e.trim();return t.length<=8?`•`.repeat(Math.max(t.length,4)):t.slice(0,3)+`•`.repeat(Math.min(t.length-3,16))}const Wa=/key|token|secret|password|passwd|auth|credential/i;function Ga(e,t=``){if(typeof e==`string`)return t&&Wa.test(t)&&e.trim()?Ua(e):e;if(Array.isArray(e))return e.map(e=>Ga(e));let n=R(e);if(n){let e={};for(let[t,r]of Object.entries(n))e[t]=Ga(r,t);return e}return e}function Ka(e){return e.endsWith(`.json`)?`json`:e.endsWith(`.yaml`)||e.endsWith(`.yml`)?`yaml`:e.endsWith(`.toml`)?`toml`:`text`}function qa(e,t=pr()){let n=Ba.find(t=>t.id===e);if(!n)return null;let r=n.paths(t),i=r.some(e=>P(e)),{configured:a,model:o}=i?n.detect(t):{configured:!1,model:void 0},s=i?Ha(e,t).map(e=>e.secret?{...e,raw:e.value,value:Ua(e.value)}:e):[],c=r.map(e=>({path:e,exists:P(e)})),l=i?r.filter(e=>P(e)).map(e=>({path:e,lang:Ka(e),text:Ca(e)??``})).filter(e=>e.text.trim()):[];return{id:n.id,label:n.label,installed:i,configured:a,model:o,paths:r,origin:`local`,fields:s,files:c,settings:l}}const Ja={"claude-code":`claude`,"qwen-code":`qwen`,opencode:`opencode`,openclaw:`openclaw`,hermes:`hermes`,codex:`codex`};function Ya(e){return Object.prototype.hasOwnProperty.call(Ja,e)?Ja[e]:void 0}const Xa={"qwen-code":e=>[`-i`,e],"claude-code":e=>[e],codex:e=>[e]};function Za(e){return Object.prototype.hasOwnProperty.call(Xa,e)}function Qa(e){let t=process.platform===`win32`?`where`:`which`;return new Promise(n=>{Un(t,[e],{windowsHide:!0},e=>n(!e))})}function $a(e){let t=Ya(e);return t?Qa(t):Promise.resolve(!1)}function eo(e){return`'${e.replace(/'/g,`'\\''`)}'`}function to(e,t){let n=process.platform;return new Promise((r,i)=>{if(n===`darwin`){Un(`osascript`,[`-e`,`tell application "Terminal" to do script "${`cd ${eo(t)} && ${e}`.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"`,`-e`,`tell application "Terminal" to activate`],{windowsHide:!0},e=>e?i(e):r());return}if(n===`win32`){Un(`cmd`,[`/c`,`start`,``,`cmd`,`/k`,`cd /d ${t} && ${e}`],{windowsHide:!0},e=>e?i(e):r());return}Un(`x-terminal-emulator`,[`-e`,`bash`,`-lc`,`cd ${eo(t)} && ${e}; exec $SHELL`],{windowsHide:!0},e=>e?i(Error(`No supported terminal emulator was found`)):r())})}async function no(e,t=process.cwd(),n){let r=Ya(e);if(!r)throw Error(`Unknown agent: ${e}`);if(!await Qa(r))throw Error(`\`${r}\` was not found on your PATH — install ${e} first.`);let i=r,a=(n??``).trim();if(a){let t=Xa[e];if(!t)throw Error(`${e} does not support dispatching a task prompt.`);i=[r,...t(a).map(eo)].join(` `)}return await to(i,t),{launched:!0,command:i}}const ro=[{id:`image-generate`,title:`文生图`,description:`一键生成一张示例图片并保存到输出目录。`,category:`图像`,prompt:"请使用 bl 的图像生成能力(如 `bl image generate` 命令)生成一张示例图片:一只在雨中撑伞的柯基,水彩风格,光线柔和。保存到输出目录后告诉我文件路径。"},{id:`image-describe`,title:`图片理解`,description:`从输出目录任选一张图片,详细描述内容与风格。`,category:`图像`,prompt:`请在输出目录(默认 output/images)中任选一张图片,用中文详细描述它的内容、主体、构图、色彩与风格,并推测它适合的使用场景。若目录为空请说明。`},{id:`image-alt-batch`,title:`批量 Alt 文本`,description:`为输出目录下的图片批量生成无障碍 alt 文本。`,category:`图像`,prompt:`请扫描输出目录(默认 output/images)下的所有图片,逐张生成简洁、准确的 alt 无障碍描述,最后以「文件名 → alt 文本」的表格汇总。若目录为空请说明。`},{id:`image-to-code`,title:`截图转代码`,description:`把输出目录里的界面截图还原成 HTML+CSS。`,category:`图像`,prompt:`请在输出目录(默认 output/images)中查找一张界面截图,用 HTML + CSS 尽可能还原它的布局、间距与配色,输出为一个可直接在浏览器打开的单文件,并简述还原思路。若没有找到截图请说明。`},{id:`speech-generate`,title:`文字转语音`,description:`把一句示例文字合成为自然语音。`,category:`音频`,prompt:"请使用 bl 的语音合成能力(如 `bl speech` 相关命令)把下面这句话合成为自然语音,保存到输出目录,并告诉我音频文件路径:欢迎使用阿里云百炼命令行工具,让多模态创作更简单。"},{id:`audio-summarize`,title:`音频转写总结`,description:`转写输出目录里的音频并提炼要点。`,category:`音频`,prompt:`请在输出目录(默认 output/speech)中找到一个音频文件,转写其内容,先给出完整文字,再用要点列表总结关键信息。若目录为空或缺少转写能力,请说明并尝试用可用的能力完成。`},{id:`video-generate`,title:`文生视频`,description:`一键生成一段示例短视频。`,category:`视频`,prompt:"请使用 bl 的视频生成能力(如 `bl video generate` 命令)生成一段示例短视频:日落时分海边奔跑的少年,电影质感,慢动作。保存到输出目录后告诉我视频文件路径。"},{id:`video-storyboard`,title:`视频分镜脚本`,description:`围绕示例主题产出可用于文生视频的分镜。`,category:`视频`,prompt:`围绕主题「城市清晨的第一杯咖啡」,为一支 15-30 秒的短视频撰写分镜脚本:逐镜头给出画面描述、时长、字幕或旁白,并为每个镜头附上可直接用于文生视频的英文 prompt。`},{id:`media-prompt-craft`,title:`多模态提示词`,description:`把一个示例创意扩展成图/视频/语音提示词。`,category:`多模态`,prompt:`把创意「未来赛博城市的夜市」扩展成三组高质量生成提示词:1) 文生图;2) 文生视频;3) 语音风格描述。每组给出中英对照,并简要说明关键参数建议。`},{id:`image-story-narration`,title:`图片配音文案`,description:`为输出目录里的图片写解说词并给出可合成文本。`,category:`多模态`,prompt:`请在输出目录(默认 output/images)中任选一张图片,为它撰写一段 60 秒左右的中文解说词(适合配音),语气生动。随后给出可直接用于语音合成的纯文本版本。若目录为空请说明。`},{id:`summarize-project`,title:`总结当前项目`,description:`让 agent 阅读当前目录,总结架构、技术栈与主要模块。`,category:`代码`,prompt:`请阅读当前工作目录的项目结构和关键源码,用简洁的中文总结:1) 它是做什么的;2) 技术栈;3) 主要模块及其职责;4) 值得注意的设计。先浏览再下结论,不要臆测。`},{id:`write-tests`,title:`为核心模块写单测`,description:`自动挑选缺测试的核心模块并补全单元测试。`,category:`代码`,prompt:`请在当前项目中挑选一个核心且缺少测试(或测试薄弱)的模块,为它编写全面的单元测试,覆盖主要逻辑分支和边界情况,并遵循本项目现有的测试框架与风格。先阅读相关文件及其依赖,再编写测试。`},{id:`code-review`,title:`代码审查`,description:`审查当前项目核心代码,指出问题与改进建议。`,category:`代码`,prompt:`请审查当前项目的核心源码,指出潜在的 bug、安全隐患、性能与可维护性问题,并给出具体、可操作的改进建议,按严重程度排序。先浏览项目结构,选取关键文件再审查。`},{id:`explain-code`,title:`解释核心代码`,description:`挑选入口或核心模块,解释其实现与依赖。`,category:`代码`,prompt:`请挑选当前项目的入口文件或核心模块,解释它的实现:职责是什么、关键流程如何运转、依赖了哪些模块。用清晰的中文说明,必要时给出调用关系。`},{id:`generate-readme`,title:`生成 README`,description:`阅读代码后生成结构清晰、与实现一致的 README.md。`,category:`文档`,prompt:`为当前工作目录的项目生成一个结构清晰的 README.md,包含:项目简介、安装步骤、使用示例、目录结构说明。请先阅读现有代码与配置再撰写,内容必须与实际实现一致。`}];function io(e){return ro.find(t=>t.id===e)}function ao(e,t){return e.prompt.replace(/\{\{(\w+)\}\}/g,(e,n)=>{let r=t[n];return typeof r==`string`?r.trim():``})}const oo=new Uint8Array(512),so=new Uint8Array(256);(()=>{let e=1;for(let t=0;t<255;t++)oo[t]=e,so[e]=t,e<<=1,e&256&&(e^=285);for(let e=255;e<512;e++)oo[e]=oo[e-255]})();function co(e,t){return e===0||t===0?0:oo[so[e]+so[t]]}function lo(e){let t=[1];for(let n=0;n<e;n++){let e=Array.from({length:t.length+1},()=>0);for(let r=0;r<t.length;r++)e[r]^=t[r],e[r+1]^=co(t[r],oo[n]);t=e}return t.map(e=>so[e])}function uo(e,t){let n=lo(t),r=new Uint8Array(e.length+t);r.set(e,0);for(let t=0;t<e.length;t++){let e=r[t];if(e!==0){let i=so[e];for(let e=0;e<n.length;e++)r[t+e]^=oo[(n[e]+i)%255]}}return Array.from(r.slice(e.length))}const fo=[[19,7],[34,10],[55,15],[80,20],[108,26]];function po(e){let t=12+e*8;for(let e=0;e<fo.length;e++)if(fo[e][0]*8>=t)return e+1;throw Error(`qr: data too large for supported versions (max 108 bytes)`)}function mo(e,t){let[n]=fo[t-1],r=[],i=(e,t)=>{for(let n=t-1;n>=0;n--)r.push(e>>n&1)};i(4,4),i(e.length,8);for(let t of e)i(t,8);let a=n*8;for(i(0,Math.min(4,a-r.length));r.length%8!=0;)r.push(0);let o=[];for(let e=0;e<r.length;e+=8){let t=0;for(let n=0;n<8;n++)t=t<<1|r[e+n];o.push(t)}let s=[236,17];for(let e=0;o.length<n;e++)o.push(s[e%2]);return o.concat(uo(o,fo[t-1][1]))}function ho(e){return{size:e,mod:new Uint8Array(e*e),fn:new Uint8Array(e*e)}}function go(e,t,n,r){e.mod[t*e.size+n]=r,e.fn[t*e.size+n]=1}function _o(e,t,n){for(let r=-1;r<=7;r++)for(let i=-1;i<=7;i++){let a=t+r,o=n+i;a<0||a>=e.size||o<0||o>=e.size||go(e,a,o,+(r>=0&&r<=6&&i>=0&&i<=6&&(r===0||r===6||i===0||i===6||r>=2&&r<=4&&i>=2&&i<=4)))}}function vo(e,t,n){for(let r=-2;r<=2;r++)for(let i=-2;i<=2;i++){let a=Math.max(Math.abs(r),Math.abs(i));go(e,t+r,n+i,a===1?0:1)}}function yo(e,t){let n=e.size;for(let t=0;t<n;t++)go(e,6,t,+(t%2==0)),go(e,t,6,+(t%2==0));if(_o(e,0,0),_o(e,0,n-7),_o(e,n-7,0),t>=2){let t=n-7;vo(e,t,t)}for(let t=0;t<9;t++)t!==6&&(e.fn[8*n+t]=1),t!==6&&(e.fn[t*n+8]=1);e.fn[8*n+6]=1,e.fn[6*n+8]=1;for(let t=0;t<8;t++)e.fn[(n-1-t)*n+8]=1;for(let t=0;t<8;t++)e.fn[8*n+(n-1-t)]=1;go(e,n-8,8,1)}function bo(e,t){let n=e.size,r=[];for(let e of t)for(let t=7;t>=0;t--)r.push(e>>t&1);let i=0,a=!0;for(let t=n-1;t>=1;t-=2){t===6&&(t=5);for(let o=0;o<n;o++){let s=a?n-1-o:o;for(let a of[0,1]){let o=t-a;e.fn[s*n+o]||(e.mod[s*n+o]=i<r.length?r[i++]:0)}}a=!a}}const xo=[(e,t)=>(e+t)%2==0,e=>e%2==0,(e,t)=>t%3==0,(e,t)=>(e+t)%3==0,(e,t)=>(Math.floor(e/2)+Math.floor(t/3))%2==0,(e,t)=>e*t%2+e*t%3==0,(e,t)=>(e*t%2+e*t%3)%2==0,(e,t)=>((e+t)%2+e*t%3)%2==0];function So(e,t){let n=xo[t];for(let t=0;t<e.size;t++)for(let r=0;r<e.size;r++)!e.fn[t*e.size+r]&&n(t,r)&&(e.mod[t*e.size+r]^=1)}function Co(e){let t=e.size,n=(n,r)=>e.mod[n*t+r],r=0;for(let e=0;e<t;e++){let i=1,a=1;for(let o=1;o<t;o++)n(e,o)===n(e,o-1)?i++:(i>=5&&(r+=i-2),i=1),n(o,e)===n(o-1,e)?a++:(a>=5&&(r+=a-2),a=1);i>=5&&(r+=i-2),a>=5&&(r+=a-2)}for(let e=0;e<t-1;e++)for(let i=0;i<t-1;i++){let t=n(e,i);t===n(e,i+1)&&t===n(e+1,i)&&t===n(e+1,i+1)&&(r+=3)}let i=[1,0,1,1,1,0,1,0,0,0,0],a=[0,0,0,0,1,0,1,1,1,0,1],o=(e,t,n)=>{for(let r=0;r<n.length;r++)if(e(t+r)!==n[r])return!1;return!0};for(let e=0;e<t;e++)for(let s=0;s<=t-11;s++)(o(t=>n(e,t),s,i)||o(t=>n(e,t),s,a))&&(r+=40),(o(t=>n(t,e),s,i)||o(t=>n(t,e),s,a))&&(r+=40);let s=0;for(let n=0;n<t*t;n++)s+=e.mod[n];let c=s*100/(t*t),l=Math.floor(Math.abs(c-50)/5);return r+=l*10,r}function wo(e){let t=8|e,n=t<<10;for(let e=14;e>=10;e--)n>>e&1&&(n^=1335<<e-10);return(t<<10|n)^21522}function To(e,t){let n=e.size,r=wo(t),i=e=>r>>e&1;for(let t=0;t<=5;t++)e.mod[t*n+8]=i(t);e.mod[7*n+8]=i(6),e.mod[8*n+8]=i(7),e.mod[8*n+7]=i(8);for(let t=9;t<15;t++)e.mod[8*n+(14-t)]=i(t);for(let t=0;t<8;t++)e.mod[(n-1-t)*n+8]=i(t);for(let t=8;t<15;t++)e.mod[8*n+(n-15+t)]=i(t);e.mod[(n-8)*n+8]=1}function Eo(e){let t=new TextEncoder().encode(e),n=po(t.length),r=mo(t,n),i=ho(17+4*n);yo(i,n),bo(i,r);let a=0,o=1/0;for(let e=0;e<8;e++){So(i,e),To(i,e);let t=Co(i);t<o&&(o=t,a=e),So(i,e)}So(i,a),To(i,a);let s=[];for(let e=0;e<i.size;e++){let t=[];for(let n=0;n<i.size;n++)t.push(i.mod[e*i.size+n]===1);s.push(t)}return s}function Do(e){let t=Eo(e),n=t.length,r=n+8,i=``;for(let e=0;e<n;e++)for(let r=0;r<n;r++)t[e][r]&&(i+=`<rect x="${r+4}" y="${e+4}" width="1" height="1"/>`);return`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${r} ${r}" shape-rendering="crispEdges" role="img" aria-label="QR code"><rect width="${r}" height="${r}" fill="#ffffff"/><g fill="#000000">${i}</g></svg>`}function Oo(e){let{identity:t,settings:n,authStore:r}=e;return{status(){let e=r.describe(),t={apiKey:!!e.apiKey,console:!!e.console,openapi:!!e.openapi},n;e.console?n=dt(e.console.token):e.apiKey?n=dt(e.apiKey.token):e.openapi&&(n=dt(e.openapi.accessKeyId));let i=e.console?`console`:e.apiKey?`apiKey`:e.openapi?`openapi`:null;return{authenticated:t.apiKey||t.console||t.openapi,methods:t,primary:i,region:e.console?.region,site:e.console?.site,masked:n}},startConsoleLogin(){let e=oi(r.describe().console?.site),i=!!r.stored().apiKey;xi(e,{identity:t,settings:n,authStore:r},{needApiKey:!i}).catch(e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(`console login failed: ${t}\n`)})},logout(){return r.logout(`all`)}}}const ko={".png":`image`,".jpg":`image`,".jpeg":`image`,".webp":`image`,".gif":`image`,".bmp":`image`,".svg":`image`,".mp4":`video`,".mov":`video`,".webm":`video`,".mkv":`video`,".avi":`video`,".mp3":`audio`,".wav":`audio`,".m4a":`audio`,".aac":`audio`,".flac":`audio`,".ogg":`audio`},Ao={".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".webp":`image/webp`,".gif":`image/gif`,".bmp":`image/bmp`,".svg":`image/svg+xml`,".mp4":`video/mp4`,".mov":`video/quicktime`,".webm":`video/webm`,".mkv":`video/x-matroska`,".avi":`video/x-msvideo`,".mp3":`audio/mpeg`,".wav":`audio/wav`,".m4a":`audio/mp4`,".aac":`audio/aac`,".flac":`audio/flac`,".ogg":`audio/ogg`};function jo(e=pr()){return I(e,`bailian-output`)}function Mo(e){return ko[e.toLowerCase()]??`other`}function No(e){return Ao[e.toLowerCase()]??`application/octet-stream`}function Po(e,t,n){let r;try{r=ir(e,{withFileTypes:!0})}catch{return}for(let i of r){let r=I(e,i.name);i.isDirectory()?t>0&&Po(r,t-1,n):(i.isFile()||i.isSymbolicLink())&&n.push(r)}}function Fo(e=jo()){let t=[];if(!P(e))return{base:e,assets:t};let n=[];Po(e,8,n);for(let r of n){let n;try{n=ar(r)}catch{continue}if(!n.isFile())continue;let i=ur(e,r),a=i.split(fr),o=a.length>1?a[0]:`other`,s=lr(r);t.push({name:r.split(fr).pop()??r,category:o,kind:Mo(s),relPath:i,size:n.size,mtime:n.mtimeMs,ext:s.replace(/^\./,``).toLowerCase()})}return t.sort((e,t)=>t.mtime-e.mtime),{base:e,assets:t}}function Io(e,t){if(typeof t!=`string`||t.length===0)return null;let n=dr(e),r=dr(n,t);return r!==n&&!r.startsWith(n+fr)?null:r}const Lo={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 V(e){return e instanceof t||e instanceof Error?e.message:String(e)}function H(e,t,n){e.writeHead(t,{"Content-Type":`application/json; charset=utf-8`}),e.end(JSON.stringify(n))}function Ro(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,t=>{if(r+=t.length,r>1048576){n(Error(`payload too large`)),e.destroy();return}i.push(t)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function zo(e,t){return new Promise((n,r)=>{let i=0,a=[];e.on(`data`,n=>{if(i+=n.length,i>t){r(Error(`payload too large`)),e.destroy();return}a.push(n)}),e.on(`end`,()=>n(Buffer.concat(a))),e.on(`error`,r)})}function Bo(e,t){if(!e)return!1;let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&Vn(n,r)}function Vo(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[ga(n)]=va(n,e))}return t}function Ho(e,t){let n=new Set(ua),r={};for(let[t,i]of Object.entries(e))n.has(t)||(r[t]=i);return{...r,...t}}function Uo(e,t,n=jo(),r){return Hn.createServer(async(i,a)=>{try{let o=(i.headers.host||``).split(`:`)[0];if(o!==`127.0.0.1`&&o!==`localhost`){a.writeHead(403,{"Content-Type":`text/plain; charset=utf-8`}),a.end(`forbidden host
|
|
31
|
+
`);return}let s=new URL(i.url??`/`,`http://127.0.0.1`);if(!Bo(s.searchParams.get(`token`),e)){a.writeHead(401,{"Content-Type":`text/plain; charset=utf-8`}),a.end(`unauthorized
|
|
32
32
|
`);return}let c=i.method??`GET`,l=s.pathname;if(l===`/`&&c===`GET`){a.writeHead(200,{"Content-Type":`text/html; charset=utf-8`,"Cache-Control":`no-store`,"X-Content-Type-Options":`nosniff`,"Content-Security-Policy":`default-src 'self'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src 'self' data: https://img.alicdn.com https://oss.aliyuncs.com; media-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'none'; frame-ancestors 'none'`}),a.end(`<!doctype html>
|
|
33
33
|
<html lang="en">
|
|
34
34
|
<head>
|
|
@@ -2631,94 +2631,104 @@ Omni output voices:
|
|
|
2631
2631
|
<\/script>
|
|
2632
2632
|
</body>
|
|
2633
2633
|
</html>
|
|
2634
|
-
`);return}if(l===`/api/qr`&&c===`GET`){let e=(s.searchParams.get(`data`)??``).slice(0,512);if(!e){
|
|
2635
|
-
`)}catch(e){if(console.error(`[config ui] request failed:`,e),a.headersSent){a.end();return}
|
|
2636
|
-
`;)n+=1;continue}if(i===`/`&&a===`*`){for(n+=2;n<e.length&&!(e[n]===`*`&&e[n+1]===`/`);)n+=1;n+=2;continue}t+=i,n+=1}let i=``;for(n=0,r=!1;n<t.length;){let e=t[n];if(r){if(i+=e,e===`\\`){i+=t[n+1]??``,n+=2;continue}e===`"`&&(r=!1),n+=1;continue}if(e===`"`&&(r=!0),e===`,`){let e=n+1;for(;e<t.length&&/\s/.test(t[e]);)e+=1;if(t[e]===`}`||t[e]===`]`){n+=1;continue}}i+=e,n+=1}return i}function
|
|
2637
|
-
`,{mode:384}),
|
|
2638
|
-
`);let l=
|
|
2639
|
-
`),t.dryRun){
|
|
2634
|
+
`);return}if(l===`/api/qr`&&c===`GET`){let e=(s.searchParams.get(`data`)??``).slice(0,512);if(!e){H(a,400,{error:`missing data`});return}try{let t=Do(e);a.writeHead(200,{"Content-Type":`image/svg+xml; charset=utf-8`,"Cache-Control":`no-store`}),a.end(t)}catch(e){H(a,400,{error:V(e)})}return}if(l===`/api/config`&&c===`GET`){let e=t.profiles();H(a,200,{configFile:t.path,keys:ua,secretKeys:[...ca],enums:da,booleanKeys:[...fa],fieldDefaults:{...pa,base_url:p.cn,output_dir:jo(),timeout:`300`},modelCatalog:ma,activeProfile:e.active,default:e.default,named:e.named});return}if(l===`/api/skills`&&c===`GET`){H(a,200,{skills:Da()});return}if(l===`/api/skill`&&c===`GET`){let e=Oa(s.searchParams.get(`id`)??``);if(!e){H(a,404,{error:`not found`});return}H(a,200,e);return}if(l===`/api/skill/install`&&c===`POST`){let e=s.searchParams.get(`source`)??``,t=s.searchParams.get(`name`)??``;try{H(a,200,Ma(e,await zo(i,25165824),t))}catch(e){H(a,400,{error:V(e)})}return}if(l===`/api/mcp`&&c===`GET`){H(a,200,{servers:Pa()});return}if(l===`/api/mcp`&&c===`POST`){let e=await Ro(i),t;try{t=JSON.parse(e)}catch{H(a,400,{error:`invalid JSON body`});return}let n=t,r=typeof n.source==`string`?n.source:``,o=typeof n.scope==`string`&&n.scope?n.scope:`global`,s=typeof n.name==`string`?n.name:``;try{Ra(r,o,s,n.config),H(a,200,{saved:s.trim()})}catch(e){H(a,400,{error:V(e)})}return}if(l===`/api/mcp`&&c===`DELETE`){let e=s.searchParams.get(`source`)??``,t=s.searchParams.get(`scope`)||`global`,n=s.searchParams.get(`name`)??``;try{za(e,t,n),H(a,200,{deleted:n})}catch(e){H(a,400,{error:V(e)})}return}if(l===`/api/health`&&c===`GET`){let e=Number(process.versions.node.split(`.`)[0]);H(a,200,{node:process.version,nodeOk:Number.isFinite(e)&&e>=18,platform:process.platform,cwd:process.cwd()});return}if(l===`/api/agents`&&c===`GET`){let e=Va(),t=await Promise.all(e.map(e=>$a(e.id)));H(a,200,{agents:e.map((e,n)=>({...e,launchable:t[n],dispatchable:t[n]&&Za(e.id)}))});return}if(l===`/api/agent`&&c===`GET`){let e=qa(s.searchParams.get(`id`)??``);if(!e){H(a,404,{error:`not found`});return}H(a,200,e);return}if(l===`/api/agent/open`&&c===`POST`){let e=qa(s.searchParams.get(`id`)??``),t=s.searchParams.get(`path`)??``,n=e?.settings.some(e=>e.path===t)??!1;if(!e||!n||!P(t)){H(a,404,{error:`not found`});return}try{await ni(t),H(a,200,{opened:t})}catch(e){H(a,400,{error:V(e)})}return}if(l===`/api/scenarios`&&c===`GET`){let e=Va(),t=await Promise.all(e.map(e=>$a(e.id)));H(a,200,{scenarios:ro,agents:e.map((e,n)=>({id:e.id,label:e.label,dispatchable:t[n]&&Za(e.id)})).filter(e=>e.dispatchable)});return}if(l===`/api/auth/status`&&c===`GET`){H(a,200,r?r.status():{authenticated:!1,methods:{apiKey:!1,console:!1,openapi:!1},primary:null});return}if(l===`/api/auth/login`&&c===`POST`){if(!r){H(a,400,{error:`login unavailable`});return}r.startConsoleLogin(),H(a,200,{started:!0});return}if(l===`/api/auth/logout`&&c===`POST`){if(!r){H(a,400,{error:`logout unavailable`});return}try{H(a,200,{loggedOut:await r.logout()})}catch(e){H(a,400,{error:V(e)})}return}if(l===`/api/assets`&&c===`GET`){H(a,200,Fo(n));return}if(l===`/api/asset/file`&&c===`GET`){let e=Io(n,s.searchParams.get(`path`)??``),t=e&&P(e)?ar(e):null;if(!e||!t||!t.isFile()){H(a,404,{error:`not found`});return}a.writeHead(200,{"Content-Type":No(lr(e)),"Content-Length":t.size,"Cache-Control":`no-store`});let r=tr(e);r.on(`error`,()=>{a.headersSent||a.writeHead(500),a.end()}),r.pipe(a);return}if(l===`/api/asset`&&c===`DELETE`){let e=s.searchParams.get(`path`)??``,t=Io(n,e);if(!t||!P(t)||!ar(t).isFile()){H(a,404,{error:`not found`});return}try{or(t),H(a,200,{deleted:e})}catch(e){H(a,400,{error:V(e)})}return}if(l===`/api/asset/open`&&c===`POST`){let e=s.searchParams.get(`path`)??``,t=Io(n,e);if(!t||!P(t)||!ar(t).isFile()){H(a,404,{error:`not found`});return}try{await ni(t),H(a,200,{opened:e})}catch(e){H(a,400,{error:V(e)})}return}if(l===`/api/agent/launch`&&c===`POST`){try{H(a,200,await no(s.searchParams.get(`id`)??``))}catch(e){H(a,400,{error:V(e)})}return}if(l===`/api/agent/dispatch`&&c===`POST`){let e=await Ro(i),t;try{t=JSON.parse(e)}catch{H(a,400,{error:`invalid JSON body`});return}let n=t,r=typeof n.agent==`string`?n.agent:``;if(!Za(r)){H(a,400,{error:`agent cannot be dispatched a prompt`});return}let o,s=n.custom;if(s&&typeof s==`object`&&!Array.isArray(s)){let e=s,t=typeof e.prompt==`string`?e.prompt.trim():``;if(!t){H(a,400,{error:`custom scenario needs a prompt`});return}let n=[];if(Array.isArray(e.inputs)){for(let t of e.inputs)if(t&&typeof t==`object`){let e=t,r=typeof e.key==`string`?e.key.trim():``;if(r){let t=typeof e.label==`string`&&e.label.trim()?e.label.trim():r;n.push({key:r,label:t})}}}o={id:`custom`,title:typeof e.title==`string`&&e.title.trim()?e.title.trim():`Custom`,description:``,category:`自定义`,prompt:t,inputs:n}}else o=typeof n.scenario==`string`?io(n.scenario):void 0;if(!o){H(a,400,{error:`unknown scenario`});return}let c={};if(n.values&&typeof n.values==`object`&&!Array.isArray(n.values))for(let[e,t]of Object.entries(n.values))typeof t==`string`&&(c[e]=t);for(let e of o.inputs??[])if(!c[e.key]||!c[e.key].trim()){H(a,400,{error:`Missing input: ${e.label}`});return}let l=ao(o,c);try{let e=await no(r,process.cwd(),l);H(a,200,{launched:!0,agent:r,scenario:o.id,command:e.command})}catch(e){H(a,400,{error:V(e)})}return}if(l===`/api/active`&&c===`POST`){let e=await Ro(i),n;try{n=JSON.parse(e)}catch{H(a,400,{error:`invalid JSON body`});return}let r=n;try{H(a,200,{activeProfile:await t.activate(r.name)})}catch(e){H(a,400,{error:V(e)})}return}if(l===`/api/profile`&&c===`POST`){let e=await Ro(i),t;try{t=JSON.parse(e)}catch{H(a,400,{error:`invalid JSON body`});return}let n=t;if(!n.data||typeof n.data!=`object`||Array.isArray(n.data)){H(a,400,{error:`missing or invalid 'data'`});return}let r,o;try{r=xt(n.name),o=Vo(n.data)}catch(e){H(a,400,{error:V(e)});return}let s=Ho(At(r),o);await sn(s,r),H(a,200,{saved:s});return}if(l===`/api/profile`&&c===`DELETE`){try{H(a,200,{deleted:await fe(s.searchParams.get(`name`)??void 0),activeProfile:t.profiles().active})}catch(e){H(a,400,{error:V(e)})}return}a.writeHead(404,{"Content-Type":`text/plain; charset=utf-8`}),a.end(`not found
|
|
2635
|
+
`)}catch(e){if(console.error(`[config ui] request failed:`,e),a.headersSent){a.end();return}H(a,500,{error:V(e)})}})}var Wo=w({description:`Open a local web UI to manage config profiles`,auth:`none`,usageArgs:`[--port <port>] [--no-open]`,flags:Lo,exampleArgs:[``,`--port 8787`,`--no-open`],async run(e){let{settings:n,flags:r}=e,i=T(n.output);if(n.dryRun){A({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`,`GET /api/skills -> list installed agent skills`,`GET /api/skill -> read one skill's SKILL.md detail`,`POST /api/skill/install -> install a skill from an uploaded .zip into a skills root`,`GET /api/mcp -> list local MCP servers`,`POST /api/mcp -> create or update one MCP server (writes its source config)`,`DELETE /api/mcp -> remove one MCP server from its source config`,`GET /api/health -> runtime environment info (node, platform, cwd)`,`GET /api/agents -> list coding agent frameworks`,`GET /api/agent -> one agent's config detail (secrets masked)`,`POST /api/agent/open -> open one agent's config file with the OS default app`,`GET /api/auth/status -> current auth state`,`POST /api/auth/login -> start console login (opens browser)`,`POST /api/auth/logout -> clear all stored credentials`,`GET /api/assets -> list generated assets`,`GET /api/asset/file -> stream one asset file`,`POST /api/asset/open -> open one asset with the OS default app`,`POST /api/agent/launch -> launch a coding agent CLI in a new terminal`,`GET /api/scenarios -> list Playground scenarios and dispatchable agents`,`POST /api/agent/dispatch -> dispatch a scenario prompt to a connected agent`,`POST /api/profile -> save a profile`,`POST /api/active -> activate a profile`,`DELETE /api/profile -> delete a named profile`,`DELETE /api/asset -> delete one asset file`]},i);return}let a=Bn(16).toString(`hex`),o=n.outputDir||jo(),c=Uo(a,e.configStore,o,Oo(e)),l;try{l=await ti(c,r.port??0)}catch(e){throw new t(`Could not bind to 127.0.0.1 (no free port or permission denied): ${V(e)}`,s.USAGE)}let u=`http://127.0.0.1:${l}/?token=${a}`;if(!r.noOpen)try{await ri(u),k(`Opened the config UI in your default browser.`)}catch{k(`Could not open the browser automatically. Open the URL below manually.`)}k(`Config UI running at ${u}`),k(`Note: credentials are shown in cleartext in the browser (localhost only).`),k(`Press Ctrl+C to stop.`),await new Promise(e=>{let t=()=>c.close(()=>e());process.once(`SIGINT`,t),process.once(`SIGTERM`,t),c.once(`close`,()=>e())})}});function Go(e){let t=``,n=0,r=!1;for(;n<e.length;){let i=e[n],a=e[n+1];if(r){if(t+=i,i===`\\`){t+=a??``,n+=2;continue}i===`"`&&(r=!1),n+=1;continue}if(i===`"`){r=!0,t+=i,n+=1;continue}if(i===`/`&&a===`/`){for(;n<e.length&&e[n]!==`
|
|
2636
|
+
`;)n+=1;continue}if(i===`/`&&a===`*`){for(n+=2;n<e.length&&!(e[n]===`*`&&e[n+1]===`/`);)n+=1;n+=2;continue}t+=i,n+=1}let i=``;for(n=0,r=!1;n<t.length;){let e=t[n];if(r){if(i+=e,e===`\\`){i+=t[n+1]??``,n+=2;continue}e===`"`&&(r=!1),n+=1;continue}if(e===`"`&&(r=!0),e===`,`){let e=n+1;for(;e<t.length&&/\s/.test(t[e]);)e+=1;if(t[e]===`}`||t[e]===`]`){n+=1;continue}}i+=e,n+=1}return i}function Ko(e){if(!Kn(e))return{};try{return JSON.parse(Jn(e,`utf-8`))}catch{return{}}}function qo(e){if(!Kn(e))return{};try{return JSON.parse(Go(Jn(e,`utf-8`)))}catch{return{}}}function Jo(e,t){qn($n(e),{recursive:!0});let n=e+`.tmp`;Zn(n,JSON.stringify(t,null,2)+`
|
|
2637
|
+
`,{mode:384}),Yn(n,e)}function Yo(e,t){qn($n(e),{recursive:!0});let n=e+`.tmp`;Zn(n,t,{mode:384}),Yn(n,e)}function Xo(e){Kn(e)&&Wn(e,`${e}.bak.${Math.floor(Date.now()/1e3)}`)}function Zo(e){return e.includes(`/apps/anthropic`)}function Qo(e){let n=e.trim().replace(/\/+$/,``);if(Zo(n))return{url:n};if(n.includes(`/compatible-mode`))return{url:n.replace(/\/compatible-mode(?:\/v\d+)?/,`/apps/anthropic`),rewrittenFrom:e.trim()};try{let t=new URL(n),r=t.hostname;if((r.includes(`dashscope`)||r.includes(`maas.aliyuncs.com`)||r.includes(`token-plan`))&&(t.pathname===`/`||t.pathname===``))return{url:`${t.origin}/apps/anthropic`,rewrittenFrom:e.trim()}}catch{}throw new t(`Claude Code requires an Anthropic-compatible base URL, got "${e}".`,s.USAGE,`Use a URL ending in /apps/anthropic (not /compatible-mode/v1). Example: https://dashscope.aliyuncs.com/apps/anthropic`)}function $o(e){let n=e.trim();if(!/^[a-z0-9-]+$/.test(n))throw new t(`Invalid --region "${e}".`,s.USAGE,`Use a Model Studio region id, e.g. cn-beijing or ap-southeast-1.`);return`https://token-plan.${n}.maas.aliyuncs.com/compatible-mode/v1`}function es(e,t,n){let r=e[t];(r===void 0||r.trim()===``)&&(e[t]=n)}var ts={label:`Claude Code`,write({baseUrl:e,apiKey:t,model:n}){let r=N(process.env.CLAUDE_CONFIG_DIR||N(vr(),`.claude`),`settings.json`),i=N(vr(),`.claude.json`),a=[],o=Qo(e);o.rewrittenFrom&&a.push(`Rewrote base URL for Claude Code: "${o.rewrittenFrom}" → "${o.url}" (Claude Code needs /apps/anthropic, not OpenAI compatible-mode).`),Xo(r);let s=Ko(r),c=s.env??{};c.ANTHROPIC_BASE_URL=o.url,c.ANTHROPIC_AUTH_TOKEN=t,delete c.ANTHROPIC_API_KEY,c.ANTHROPIC_MODEL=n,es(c,`ANTHROPIC_DEFAULT_HAIKU_MODEL`,n),es(c,`ANTHROPIC_DEFAULT_SONNET_MODEL`,n),es(c,`ANTHROPIC_DEFAULT_OPUS_MODEL`,n),es(c,`CLAUDE_CODE_SUBAGENT_MODEL`,n),s.env=c,Jo(r,s),Xo(i);let l=Ko(i);return l.hasCompletedOnboarding=!0,Jo(i,l),{paths:[r,i],nextStep:"Run `claude` to start using Claude Code with DashScope.",warnings:a.length>0?a:void 0}}};const ns=`DASHSCOPE_API_KEY`;function rs(e){return`[Bailian] ${e}`}function is(e){if(e.envKey===ns)return!0;let t=typeof e.name==`string`?e.name:``;return t===`bailian-cli`||t.startsWith(`[Bailian]`)}var as={label:`Qwen Code`,write({baseUrl:e,apiKey:t,model:n}){let r=N(vr(),`.qwen`,`settings.json`),i=Zo(e)?`anthropic`:`openai`,a=[];Xo(r);let o=Ko(r);o.$version=3;let s=o.env??{};s[ns]=t,o.env=s;let c=process.env[ns];c!==void 0&&c!==t&&a.push(`Shell/environment ${ns} is set and overrides settings.json. Unset it (e.g. \`unset ${ns}\`) so the key written here takes effect.`);let l=o.modelProviders??{},u=l[i]??[],d=u.find(e=>is(e)&&e.id===n),f=u.find(e=>!is(e)&&e.id===n);if(d){d.baseUrl=e,d.envKey=ns;let t=typeof d.name==`string`?d.name.trim():``;(!t||t===`bailian-cli`)&&(d.name=rs(n))}else if(f){let e=typeof f.name==`string`&&f.name.length>0?f.name:String(f.id);a.push(`Model id "${n}" already exists as "${e}"; left unchanged (Qwen Code loads only the first entry per id). Remove or rename that entry if you want bailian-cli to own this model.`)}else u.push({id:n,name:rs(n),baseUrl:e,envKey:ns});l[i]=u,o.modelProviders=l;let p=o.security??{};return p.auth={selectedType:i,apiKey:t,baseUrl:e},o.security=p,o.model={name:n,baseUrl:e},Jo(r,o),{paths:[r],nextStep:"Run `qwen` to start using Qwen Code with DashScope.",warnings:a.length>0?a:void 0}}},os={label:`OpenCode`,write({baseUrl:e,apiKey:t,model:n}){let r=N(vr(),`.config`,`opencode`,`opencode.json`);Xo(r);let i=qo(r);i.$schema||=`https://opencode.ai/config.json`;let a=i.provider??{};return a[`bailian-cli`]={npm:Zo(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,Jo(r,i),{paths:[r],nextStep:"Run `opencode` then type `/models` to select your model."}}};const ss=`bailian-cli`;function cs(e){let t=e.model;if(!t||typeof t!=`object`)return;let n=t.primary;return typeof n==`string`&&n.trim()!==``?n.trim():void 0}var ls={label:`OpenClaw`,write({baseUrl:e,apiKey:t,model:n,contextWindow:r}){let i=N(vr(),`.openclaw`,`openclaw.json`),a=[],o=`${ss}/${n}`;Xo(i);let s=Ko(i),c=s.models??{};c.mode=`merge`;let l=c.providers??{};l[ss]={baseUrl:e,apiKey:t,api:Zo(e)?`anthropic-messages`:`openai-completions`,models:[{id:n,name:n,contextWindow:r??256e3,cost:{input:0,output:0,cacheRead:0,cacheWrite:0}}]},c.providers=l,s.models=c;let u=s.agents??{},d=u.defaults??{},f=d.models??{};f[o]=f[o]??{},d.models=f;let p=cs(d);return p?p.startsWith(`${ss}/`)?d.model={primary:o}:a.push(`Left existing primary model unchanged ("${p}"). Added provider "${ss}" — switch to "${o}" in OpenClaw if you want to use it.`):d.model={primary:o},u.defaults=d,s.agents=u,Jo(i,s),{paths:[i],nextStep:"Run `openclaw gateway restart`, then `openclaw` to start using OpenClaw with DashScope.",warnings:a.length>0?a:void 0}}},us={label:`Hermes Agent`,write({baseUrl:e,apiKey:t,model:n}){let r=N(vr(),`.hermes`,`config.yaml`);Xo(r);let i={};if(Kn(r))try{i=hr.parse(Jn(r,`utf-8`))??{}}catch{i={}}let a={default:n,provider:`custom`,base_url:e,api_key:t};return Zo(e)&&(a.api_mode=`anthropic_messages`),i.model=a,Yo(r,hr.stringify(i)),{paths:[r],nextStep:'Run `hermes chat -q "hello"` to verify.'}}};const ds=`bailian-cli`,fs={"claude-code":ts,"qwen-code":as,opencode:os,openclaw:ls,hermes:us,codex:{label:`Codex`,write({baseUrl:e,apiKey:t,model:n,wireApi:r}){let i=N(vr(),`.codex`,`config.toml`),a=[];Xo(i);let o={};if(Kn(i))try{o=gr(Jn(i,`utf-8`))}catch{o={}}o.model_provider=ds,o.model=n;let s=r===`chat`?`chat`:`responses`;s===`chat`&&a.push('Current Codex releases refuse to load `wire_api = "chat"`; only use --wire-api chat with legacy Codex <= 0.80.0 (e.g. `npm install -g @openai/codex@0.80.0`).');let c=o.model_providers??{};c[ds]={...c[ds]??{},name:ds,base_url:e,env_key:`OPENAI_API_KEY`,wire_api:s,requires_openai_auth:!0},o.model_providers=c,Yo(i,_r(o)+`
|
|
2638
|
+
`);let l=N(vr(),`.codex`,`auth.json`);Xo(l);let u=Ko(l);return u.OPENAI_API_KEY=t,Jo(l,u),{paths:[i,l],nextStep:"Run `codex` to start using Codex with DashScope.",warnings:a.length>0?a:void 0}}}},ps=Object.keys(fs),ms=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.`,hs=new Map(ms.split(``).map((e,t)=>[e,t])),gs=/^[A-Za-z0-9._-]+$/;function _s(){return new t(`Invalid obfuscated API key.`,s.USAGE,`--key expects the obfuscated key copied from the web console (starts with "o1_").`)}function vs(e){let t=[];for(let n of e){let e=hs.get(n);if(e===void 0)throw _s();t.push(e)}return t}function ys(e){return e.map(e=>ms[e]).join(``)}function bs(e,t){return Math.imul((e^t)>>>0,16777619)>>>0}function xs(e){let t=e>>>0;return t^=t<<13,t^=t>>>17,t^=t<<5,t>>>0}function Ss(e,t,n,r){let i=(2166136261^Math.imul(n+1,2654435761))>>>0;i=bs(i,e.length),i=bs(i,r);for(let e of t)i=bs(i,(hs.get(e)??-1)+1);for(let t of e)i=bs(i,t+1);i^=i>>>16,i=Math.imul(i,2246822507)>>>0,i^=i>>>13,i=Math.imul(i,3266489909)>>>0,i^=i>>>16,i=i>>>0||1831565813;let a=[];for(let e=0;e<r;e+=1)i=i+Math.imul(e+1,2654435761)>>>0,i=xs(i),a.push(i%65);return a}function Cs(e,t){let n=vs(e),r=Math.floor(n.length/2),i=n.slice(0,r),a=n.slice(r);for(let e=7;e>=0;--e){let n=i,r=Ss(n,t,e,a.length);i=a.map((e,t)=>(e-r[t]+65)%65),a=n}return ys([...i,...a])}function ws(e){let t=4294967295;for(let n=0;n<e.length;n+=1){t^=e.charCodeAt(n);for(let e=0;e<8;e+=1){let e=-(t&1);t=t>>>1^3988292384&e}}return(t^4294967295)>>>0}function Ts(e,t){let n=e>>>0,r=Array(t).fill(ms[0]);for(let e=t-1;e>=0;--e)r[e]=ms[n%65],n=Math.floor(n/65);if(n!==0)throw _s();return r.join(``)}function Es(e){if(e.length!==6||!gs.test(e))throw _s()}function Ds(e){if(e.length<16||!e.startsWith(`o1_`))throw _s();let t=e.slice(3);if(!gs.test(t))throw _s();let n=t.slice(0,6),r=t.slice(6,-6),i=t.slice(-6);if(Es(n),!r)throw _s();let a=Cs(r,n);if(!gs.test(a)||i!==Ts(ws(a),6))throw _s();return a}var Os=w({description:`Configure a coding agent to use DashScope API`,auth:`none`,usageArgs:`--agent <name> (--base-url <url> | --region <region>) (--api-key <key> | --key <encoded>) --model <model>`,flags:{agent:{type:`string`,valueHint:`<name>`,description:`Target agent: ${ps.join(`, `)}`,required:!0,choices:ps},baseUrl:{type:`string`,valueHint:`<url>`,description:`API base URL`},region:{type:`string`,valueHint:`<region>`,description:`Model Studio region (e.g. cn-beijing, ap-southeast-1); converted into --base-url. Token Plan only`},apiKey:{type:`string`,valueHint:`<key>`,description:`API key`},key:{type:`string`,valueHint:`<encoded>`,description:`Obfuscated API key from the web console (starts with "o1_"); decoded into --api-key`},model:{type:`string`,valueHint:`<model>`,description:`Default model name`,required:!0},contextWindow:{type:`number`,valueHint:`<tokens>`,description:`OpenClaw only: model context window in tokens (default: 256000)`},wireApi:{type:`string`,valueHint:`<api>`,description:`Codex only: wire protocol (default: responses). "chat" only works with legacy Codex <= 0.80.0`,choices:[`chat`,`responses`]}},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`],validate(e){if(!e.baseUrl&&!e.region)return`one of --base-url or --region is required`;if(e.baseUrl&&e.region)return`--base-url and --region are mutually exclusive`;if(!e.apiKey&&!e.key)return`one of --api-key or --key is required`;if(e.apiKey&&e.key)return`--api-key and --key are mutually exclusive`},async run(e){let{settings:t,flags:n}=e,r=n.agent,{model:i,contextWindow:a,wireApi:o}=n,s=n.region?$o(n.region):n.baseUrl,c=n.key?Ds(n.key):n.apiKey,l=fs[r],u=T(t.output);if(r===`hermes`&&yr()===`win32`&&process.stderr.write(`Warning: Hermes Agent does not support native Windows. Please use WSL2.
|
|
2639
|
+
`),t.dryRun){A({agent:r,label:l.label,base_url:s,api_key:dt(c),model:i},u);return}let d={baseUrl:s,apiKey:c,model:i,contextWindow:a,wireApi:o},f=l.write(d);if(!t.quiet){k(`${l.label} configured successfully.`);for(let e of f.paths)k(` Written: ${e}`);k(` ${f.nextStep}`);for(let e of f.warnings??[])process.stderr.write(`Warning: ${e}\n`)}}});const ks=`bl skill init`;function As(e){process.stderr.write(`
|
|
2640
2640
|
Updating agent skill...
|
|
2641
|
-
`);try{
|
|
2642
|
-
`),s===`brew`||s===`winget`){let e=s===`brew`?`brew upgrade bailian-cli`:`winget upgrade Aliyun.BailianCLI`;process.stderr.write(`${o.yellow(`This CLI was installed via ${s}. Update with:`)}\n ${e}\n`),l&&process.stderr.write(`${o.dim(`Note: --to is not supported for ${s} installs.`)}\n`);return}let u=l??await
|
|
2641
|
+
`);try{br(ks,{stdio:`inherit`}),process.stderr.write(`${e.green(`✓ Agent skill updated.`)}\n`)}catch{process.stderr.write(`${e.yellow(`Agent skill update skipped. Run manually: ${ks}`)}\n`)}}function js(e){try{Zn(N(Ie(),`update-state.json`),JSON.stringify({lastChecked:Date.now(),latestVersion:e}))}catch{}}async function Ms(e,t){return e===`binary`?await Cn(`latest`,5e3)??await wn(5e3,t):wn(5e3,t)}function Ns(){return process.platform===`win32`?` irm ${r} | iex\n`:` curl -fsSL ${i} | bash\n`}var Ps=w({description:`Update the CLI to the latest or a specified version`,auth:`none`,usageArgs:`[--to <version>]`,flags:{to:{type:`string`,valueHint:`<version>`,description:`Install this exact version instead of the latest`}},exampleArgs:[``,`--to 0.1.14`],validate(e){if(e.to!==void 0){if(!e.to.trim())return`--to requires a non-empty version`;if(!On(e.to))return`--to must be a semver version (e.g. 1.13.0, v1.13.0, 0.0.0-beta-<sha>-<YYYYMMDDHHMM>), got: ${e.to.trim()}`}},async run(e){let{identity:n}=e,r=n.npmPackage,i=n.binName,a=n.version,o=O(process.stderr),s=Ge(n),c=e.flags.to?.trim(),l=c?An(c):void 0;if(process.stderr.write(`Current version: ${o.yellow(a)}\n`),process.stderr.write(`Install method: ${o.dim(s)}\n`),l?process.stderr.write(`Target version: ${o.green(l)}\n`):process.stderr.write(`Checking for updates...
|
|
2642
|
+
`),s===`brew`||s===`winget`){let e=s===`brew`?`brew upgrade bailian-cli`:`winget upgrade Aliyun.BailianCLI`;process.stderr.write(`${o.yellow(`This CLI was installed via ${s}. Update with:`)}\n ${e}\n`),l&&process.stderr.write(`${o.dim(`Note: --to is not supported for ${s} installs.`)}\n`);return}let u=l??await Ms(s,r);if(!u){process.stderr.write(`${o.yellow(`Could not determine the latest version.`)}\n`);return}if(u===a){let e=l?`\u2713 Already at ${a}.`:`\u2713 Already up to date (${a}).`;process.stderr.write(`${o.green(e)}\n`),s===`npm`&&As(o);return}if(l?process.stderr.write(`
|
|
2643
2643
|
`):process.stderr.write(`Latest version: ${o.green(u)}\n\n`),s===`binary`){process.stderr.write(`Updating via binary channel...
|
|
2644
2644
|
|
|
2645
|
-
`);try{let e=await
|
|
2646
|
-
`),process.stderr.write(` ${r}\n\n`)}return}let d=`npm install -g ${l?`${r}@${l}`:`${r}@latest`}`;process.stderr.write(`Updating ${r} via npm...\n\n`);try{
|
|
2645
|
+
`);try{let e=await jn(u);process.stderr.write(`\n${o.green(`\u2713 Update complete: ${a} \u2192 ${e}`)}\n`),js(e),As(o)}catch(e){let n=e instanceof Error?e.message:String(e),r=e instanceof t&&e.hint?e.hint.replace(/^Re-run:\s*/i,``):Ns().trim();process.stderr.write(`\nAutomatic binary update failed: ${n}\n`),process.stderr.write(`Re-run the install script:
|
|
2646
|
+
`),process.stderr.write(` ${r}\n\n`)}return}let d=`npm install -g ${l?`${r}@${l}`:`${r}@latest`}`;process.stderr.write(`Updating ${r} via npm...\n\n`);try{br(d,{stdio:`inherit`});try{let e=br(`${i} --version 2>/dev/null`,{encoding:`utf-8`}).trim().replace(RegExp(`^${i}\\s+`),``);process.stderr.write(`\n${o.green(`\u2713 Update complete: ${a} \u2192 ${e}`)}\n`),js(e)}catch{process.stderr.write(`\n${o.green(`✓ Update complete.`)}\n`)}As(o)}catch{process.stderr.write(`
|
|
2647
2647
|
Automatic update failed. Please run manually:
|
|
2648
|
-
`),process.stderr.write(` ${d}\n\n`)}}}),
|
|
2649
|
-
`)}else{let n=await e.client.requestJson({path:_(r),method:`POST`,body:s}),i=n.output?.text??``;t.quiet||o===`text`?M(i):P(n,o)}}});const gs=`zeldaEasy.broadscope-bailian.app-control.list`;var _s=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){P({api:gs,data:s},o);return}let c=await e.client.console(gs,s),l=c?.data?.DataV2?.data?.data?.list??[];P({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)}}),vs=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 h(`--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){P({endpoint:e.client.url(nt()),request:r},i);return}let a=await e.client.requestJson({path:nt(),method:`POST`,body:r});t.quiet||i===`text`?M(`Memory added. IDs: ${a.memory_ids?.join(`, `)||`none`}`):P(a,i)}}),ys=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 h(`--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){P({endpoint:e.client.url(at()),request:r},i);return}let a=await e.client.requestJson({path:at(),method:`POST`,body:r});if(t.quiet||i===`text`)if(!a.memory_nodes||a.memory_nodes.length===0)M(`No memory nodes found.`);else for(let e of a.memory_nodes)M(`[${e.memory_node_id}] ${e.content}`);else P(a,i)}}),bs=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=`${rt()}?${a.toString()}`;if(t.dryRun){P({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)M(`No memory nodes found.`);else{for(let e of s.memory_nodes)M(`[${e.memory_node_id}] ${e.content}`);s.total!==void 0&&M(`\nTotal: ${s.total}`)}else P(s,i)}}),xs=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){P({endpoint:e.client.url(it(r)),method:`PATCH`,request:i},a);return}let o=await e.client.requestJson({path:it(r),method:`PATCH`,body:i});t.quiet||a===`text`?M(`Memory node ${r} updated.`):P(o,a)}}),Ss=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=`${it(r)}?${o.toString()}`;if(t.dryRun){P({endpoint:e.client.url(s),method:`DELETE`},a);return}let c=await e.client.requestJson({path:s,method:`DELETE`});t.quiet||a===`text`?M(`Memory node ${r} deleted.`):P(c,a)}}),Cs=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 h(`--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){P({endpoint:e.client.url(mt()),request:o},s);return}let c=await e.client.requestJson({path:mt(),method:`POST`,body:o});t.quiet||s===`text`?M(`Profile schema created: ${c.profile_schema_id}`):P(c,s)}}),ws=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=`${Vt(r)}?${o.toString()}`;if(t.dryRun){P({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)M(`${e.name}: ${e.value??`(empty)`}`);else M(`No profile data found.`);else P(c,a)}}),Ts=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.
|
|
2650
|
-
`),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){
|
|
2648
|
+
`),process.stderr.write(` ${d}\n\n`)}}}),Fs=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 _(`--biz-params must be valid JSON`)}if(t.dryRun){A({endpoint:e.client.url(b(r)),request:s},o);return}if(a){let i=await e.client.request({path:b(r),method:`POST`,body:s,headers:{"X-DashScope-SSE":`enable`},stream:!0}),a=``,c=``,l=o===`text`,u=O(process.stderr);for await(let e of wt(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`?A({text:a,session_id:c},o):process.stdout.write(`
|
|
2649
|
+
`)}else{let n=await e.client.requestJson({path:b(r),method:`POST`,body:s}),i=n.output?.text??``;t.quiet||o===`text`?k(i):A(n,o)}}});const Is=`zeldaEasy.broadscope-bailian.app-control.list`;var Ls=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){A({api:Is,data:s},o);return}let c=await e.client.console(Is,s),l=c?.data?.DataV2?.data?.data?.list??[];A({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)}}),Rs=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 _(`--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){A({endpoint:e.client.url(mt()),request:r},i);return}let a=await e.client.requestJson({path:mt(),method:`POST`,body:r});t.quiet||i===`text`?k(`Memory added. IDs: ${a.memory_ids?.join(`, `)||`none`}`):A(a,i)}}),zs=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 _(`--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){A({endpoint:e.client.url(_t()),request:r},i);return}let a=await e.client.requestJson({path:_t(),method:`POST`,body:r});if(t.quiet||i===`text`)if(!a.memory_nodes||a.memory_nodes.length===0)k(`No memory nodes found.`);else for(let e of a.memory_nodes)k(`[${e.memory_node_id}] ${e.content}`);else A(a,i)}}),Bs=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=`${ht()}?${a.toString()}`;if(t.dryRun){A({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)k(`No memory nodes found.`);else{for(let e of s.memory_nodes)k(`[${e.memory_node_id}] ${e.content}`);s.total!==void 0&&k(`\nTotal: ${s.total}`)}else A(s,i)}}),Vs=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){A({endpoint:e.client.url(gt(r)),method:`PATCH`,request:i},a);return}let o=await e.client.requestJson({path:gt(r),method:`PATCH`,body:i});t.quiet||a===`text`?k(`Memory node ${r} updated.`):A(o,a)}}),Hs=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=`${gt(r)}?${o.toString()}`;if(t.dryRun){A({endpoint:e.client.url(s),method:`DELETE`},a);return}let c=await e.client.requestJson({path:s,method:`DELETE`});t.quiet||a===`text`?k(`Memory node ${r} deleted.`):A(c,a)}}),Us=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 _(`--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){A({endpoint:e.client.url(Ot()),request:o},s);return}let c=await e.client.requestJson({path:Ot(),method:`POST`,body:o});t.quiet||s===`text`?k(`Profile schema created: ${c.profile_schema_id}`):A(c,s)}}),Ws=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=`${rn(r)}?${o.toString()}`;if(t.dryRun){A({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)k(`${e.name}: ${e.value??`(empty)`}`);else k(`No profile data found.`);else A(c,a)}}),Gs=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.
|
|
2650
|
+
`),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){A({endpoint:e.client.url($e()),request:i},r);return}let a=await e.client.requestJson({path:$e(),method:`POST`,body:i}),o=a.data?.nodes||[];t.quiet||r===`text`?Ks(o.map(e=>({text:e.text,score:e.score}))):A(a,r)}});function Ks(e){if(e.length===0)k(`No results found.`);else for(let t=0;t<e.length;t++){let n=e[t];k(`[${t+1}] (score: ${n.score.toFixed(4)})`),k(n.text),k(``)}}const U={workspaceId:{type:`string`,valueHint:`<id>`,description:`Workspace ID for API endpoint URL (or set BAILIAN_WORKSPACE_ID)`}},qs={pageNumber:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Page size per request`}};function W(e){let n=e.flags.workspaceId||e.settings.workspaceId;if(!n)throw new t(`Workspace ID is required.`,s.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: ${e.identity.binName} config set workspace_id <id>`);return n}function Js(e){if(!process.stdout.isTTY)return e;let t=process.stdout.columns??120;return e.length>t?`${e.slice(0,Math.max(0,t-1))}…`:e}function Ys(e){return e.data?.ingestion_status??`UNKNOWN`}function Xs(e){return(e.data?.rows??[]).filter(e=>[e.code,e.status].some(e=>typeof e==`string`&&e.includes(`FAILED`)))}function Zs(e){let t=e.data?.rows??[];if(t.length===0)return!1;let n=e.data?.total_count;return typeof n==`number`&&t.length<n?!1:t.every(e=>{let t=e.code??e.status??``;return t===`FINISH`||t.includes(`FAILED`)})}function Qs(e,t){let n=e.data?.rows??[],r=Xs(e),i=new Set(r.map(e=>e.doc_id)),a=n.filter(e=>!i.has(e.doc_id)),o=r.map(e=>`${e.doc_name??e.doc_id??`?`}: ${e.message??e.code??`unknown`}`).join(`; `),s=a.map(e=>e.doc_name??e.doc_id??`?`).join(`, `),c=[];return o&&c.push(`failed: ${o}`),s&&c.push(`succeeded: ${s}`),c.length>0?`${t} (${c.join(`; `)})`:t}function $s(e,t,n){let r=new URL(E(e,f.indexJobStatus));return r.searchParams.set(`index_id`,t),r.searchParams.set(`job_id`,n),r}async function ec(e,t,n){return Mn(e,t,{url:n.statusUrl,intervalSec:n.intervalSec,timeoutSec:t.timeout,isComplete:e=>{let t=e;return Ys(t)===`COMPLETED`||Zs(t)},isFailed:()=>!1,getStatus:e=>{let t=e,n=Ys(t),r=Xs(t).length,i=t.data?.total_count;return typeof i==`number`&&i>0?`${n} (${r}/${i} failed)`:r>0?`${n} (${r} failed)`:n}})}function tc(e,n){return!(e instanceof t)||e.hint?e:new t(e.message,e.exitCode,n,{cause:e,api:e.api,rawResponse:e.rawResponse})}function nc(e,t){let n=e.data?.[t];if(typeof n==`string`)return n;let r=e[t];return typeof r==`string`?r:void 0}var rc=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},...U,agentVersion:{type:`string`,valueHint:`<version>`,description:`Service version to call: beta (draft for debugging) or a published number; default is the latest published version`},image:{type:`array`,valueHint:`<url>`,description:`Image URL for multimodal retrieval (repeatable)`}},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>`.","`--agent-version beta` calls the draft config for debugging before it is deployed."],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`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={query:n.query,agent_id:n.agentId};n.agentVersion&&(a.agent_version=n.agentVersion),n.image&&n.image.length>0&&(a.images=n.image);let o=et(r);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=s.data?.nodes||[];if(t.quiet||i===`text`)if(c.length===0)k(`No results found.`);else for(let e=0;e<c.length;e++){let t=c[e];k(`[${e+1}] (score: ${t.score.toFixed(4)})`),k(t.text),k(``)}else A(s,i)}});const ic={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},...U,agentVersion:{type:`string`,valueHint:`<version>`,description:`Service version to call: beta (draft for debugging) or a published number; default is the latest published version`},image:{type:`array`,valueHint:`<url>`,description:`Image URL (repeatable). Attached to the last user message as multimodal content`}};function ac(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 oc(e){for(let t of e)if(Array.isArray(t.content)&&t.content.some(e=>e.type===`image_url`))return!0;return!1}function sc(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 cc={tool_calling:`🔍 Retrieving...`,plan_start:`🤔 Planning...`,generation_start:`✍️ Generating...`};var lc=w({description:`Chat with a Bailian knowledge base (RAG Q&A with streaming)`,auth:`apiKey`,usageArgs:`--message <text> --agent-id <id> [flags]`,flags:ic,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.`,"`--agent-version beta` calls the draft config for debugging before it is deployed."],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=ac(r),a=r.image,o=!!a&&a.length>0;i.length===0&&o&&(i=[{role:`user`,content:``}]);let c=W(e),l=T(n.output),u=l===`text`&&!!process.stdout.isTTY;if(o){if(oc(i))throw new t(`Cannot use --image when messages already contain embedded image_url content parts. Use one approach or the other.`,s.USAGE);sc(i,a)}let d={input:{messages:i},parameters:{agent_options:{agent_id:r.agentId,...r.agentVersion?{agent_version:r.agentVersion}:{}}},stream:!0},f=Qe(c);if(n.dryRun){A({endpoint:f,request:d},l);return}let p=await e.client.request({path:f,method:`POST`,body:d,stream:!0});if(u){let e=O(process.stdout),r=n.verbose;for await(let n of wt(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,s.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=cc[t.extra.step_change];n&&process.stdout.write(`${e.dim(n)}\n`)}if(r&&t.extra?.step_change&&process.stderr.write(O(process.stderr).dim(`[event] step_change=${t.extra.step_change} step=${t.extra?.step??``} group=${t.extra?.group??``}`)+`
|
|
2651
2651
|
`),t.content&&process.stdout.write(t.content),n.finish_reason===`stop`)break}}catch{}}process.stdout.write(`
|
|
2652
|
-
`)}else{let e=``,r=``;for await(let n of ut(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,s.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`?M(e):P({answer:e,request_id:r},l)}}});function Ps(e){if(!(e instanceof t))return!1;let n=e.message;return/^MCP request failed:\s*404\b/i.test(n)?/未开通|MCP不存在|MCP_IS_INVALID/i.test(n):!1}function Fs(e){let t=[`Activate (or re-activate) the ${e} MCP in the Bailian MCP marketplace, then retry.`];return e===`WebSearch`&&t.push(`If it was previously on SSE, cancel and activate again to upgrade to Streamable HTTP.`),t.push(`Open: ${un(e)}`),t.join(`
|
|
2653
|
-
`)
|
|
2654
|
-
`)}`);P(s,c)}catch(e){throw r.url||Is(e,i),e}finally{l?.close?.()}}});const Ws=`zeldaEasy.broadscope-bailian.mcp-server.PageList`;var Gs=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,a=i.name||``,o=i.type||`OFFICIAL`,c=i.page||1,l=i.pageSize||30,u=E(n.output),d={reqDTO:{type:o,displayTools:!1,activated:1,pageNo:c,pageSize:l,serverName:a}};if(n.dryRun){P({api:Ws,data:d,...me(n)},u);return}let f=(await e.client.console(Ws,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}`,s.AUTH,i)}let p=(f.DataV2??{}).data?.data??{},m=p.mcpServerDetailList??[];P({total:p.total??0,servers:m.map(e=>({code:e.serverCode??``,name:e.serverName??``,description:e.description,type:e.type??``,source:e.source,bizType:e.bizType,installType:e.installType,streamable:e.streamable===!0}))},u)}}),Ks=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 (non-Bailian). Tries Streamable HTTP first, then classic SSE on the same URL.`}},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(v(r)),a=E(t.output);if(t.dryRun){P({server:r,url:i,action:`tools/list`},a);return}let o;try{let t=await e.client.connectBailianMcp(r,n.url);o=t.client;let i=await t.client.listTools();P({server:r,url:t.url,tools:i},a)}catch(e){throw n.url||Is(e,r),e}finally{o?.close?.()}}});function qs(e){Is(e,`WebSearch`)}var Js=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){P({endpoint:e.client.url(tt()),action:`tools/list`},i);return}try{let t=e.client.mcp(tt());await t.initialize(),P({tools:await t.listTools()},i)}catch(e){qs(e)}return}let a=r.query;if(n.dryRun){P({endpoint:e.client.url(tt()),action:`tools/call`,tool:`bailian_web_search`,arguments:{query:a,count:r.count||void 0}},i);return}let o=e.client.mcp(tt()),s=en(`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(`
|
|
2655
|
-
`)}`)
|
|
2656
|
-
|
|
2657
|
-
`));else if(d.length===1){let e=o[0].output?.audio?.expires_at;P({saved:d[0],audio_url:c[0],model:r.model,voice:r.input.voice,...e?{url_expires_at:e}:{}},a)}else P({saved:d,audio_urls:c,total:d.length,model:r.model,voice:r.input.voice},a)}async function tc(e,t,n,r,i){let a=await e.request({path:Pt(),method:`POST`,body:n,stream:!0,headers:{Accept:`text/event-stream`,"X-DashScope-SSE":`enable`}}),o=r.out,s=o?Tn(o):null,c;try{for await(let e of ut(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&&P({saved:o,...c?{audio_url:c}:{},model:n.model,voice:n.input.voice},i)}const nc={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). Async: fun-asr / *-filetrans / paraformer-*; sync: qwen3-asr-flash* / fun-asr-flash* / qwen-audio-*-asr-flash`},language:{type:`string`,valueHint:`<lang>`,description:`Language hint (e.g. zh, en, ja). Classic async/input-audio: language_hints; qwen3-filetrans: language; qwen3 sync: asr_options.language`},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)`}};function rc(e,n,r){let i=[];if(e.diarization===!0&&i.push(`--diarization`),e.speakerCount!==void 0&&i.push(`--speaker-count`),r===`qwen3`&&e.vocabularyId!==void 0&&i.push(`--vocabulary-id`),e.channelId!==void 0&&i.push(`--channel-id`),e.async===!0&&i.push(`--async`),e.pollInterval!==void 0&&i.push(`--poll-interval`),i.length>0)throw new t(`Model "${n}" uses sync Flash ASR and does not support: ${i.join(`, `)}.\nHint: Use an async filetrans model (e.g. fun-asr, qwen3-asr-flash-filetrans) for those flags.`,s.USAGE)}var ic=T({description:`Recognize speech from audio files (FunAudio-ASR / Qwen-ASR Flash)`,auth:`apiKey`,usageArgs:`--url <audio-url> [flags]`,flags:nc,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`,`--url https://example.com/audio.mp3 --model qwen-audio-3.0-asr-flash --language en`],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 a=r.speakerCount,o=r.diarization===!0;if(a!==void 0&&!o)throw new t(`--speaker-count requires --diarization to be enabled.
|
|
2658
|
-
|
|
2659
|
-
`)
|
|
2660
|
-
`)
|
|
2652
|
+
`)}else{let e=``,r=``;for await(let n of wt(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,s.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`?k(e):A({answer:e,request_id:r},l)}}}),uc=w({description:`List knowledge bases in the workspace`,auth:`apiKey`,usageArgs:`[flags]`,flags:{name:{type:`string`,valueHint:`<text>`,description:`Filter by knowledge base name (fuzzy match, 1-20 chars)`},...qs,...U},notes:[`Auth: uses DashScope API Key (Bearer token).`,"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or config workspace_id.",`Use the returned id as --index-id in knowledge base / document management commands.`],exampleArgs:[`--workspace-id ws-xxx`,`--name demo --page-number 2 --page-size 50`],validate(e){if(e.name!==void 0&&(e.name.length<1||e.name.length>20))return`--name must be 1-20 characters`;if(e.pageSize!==void 0&&(e.pageSize<1||e.pageSize>100))return`--page-size must be between 1 and 100`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a=new URL(E(r,f.indexList));n.name&&a.searchParams.set(`pipeline_name`,n.name),a.searchParams.set(`page_number`,String(n.pageNumber??1)),a.searchParams.set(`page_size`,String(n.pageSize??20));let o=a.toString();if(t.dryRun){A({endpoint:o,request:null},i);return}let s=await e.client.requestJson({path:o,method:`GET`}),c=s.data?.rows??[];if(t.quiet){for(let e of c)k(e.id);return}if(i===`text`){if(c.length===0)k(`No knowledge bases found.`);else for(let e of c)k(Js([e.id,e.name,e.embeddingModelName??`-`,e.chunkSize??`-`,e.description??``].join(` `)));k(`total: ${s.data?.total??c.length}`)}else A(s,i)}});const dc={indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base ID`,required:!0},...U};function fc(e,t){let n=new URL(E(e,f.indexList));return n.searchParams.set(`pipeline_id`,t),n.searchParams.set(`page_number`,`1`),n.searchParams.set(`page_size`,`1`),n.toString()}async function pc(e,n,r){let i=(await e.requestJson({path:fc(n,r),method:`GET`})).data?.rows?.[0];if(!i)throw new t(`Knowledge base not found: ${r}`,s.GENERAL,`Check the id — list knowledge bases in this workspace to verify it.`);return i}function G(e,t){return` ${e}: ${t??`-`}`}var mc=w({description:`Show knowledge base configuration details`,auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:dc,notes:[`Indexing settings are immutable; changing them requires recreating the knowledge base.`],exampleArgs:[`--index-id idx-xxx --workspace-id ws-xxx`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output);if(t.dryRun){A({endpoint:fc(r,n.indexId),request:null},i);return}let a=await pc(e.client,r,n.indexId);if(t.quiet){k(a.id??``);return}if(i!==`text`){A(a,i);return}k(`Basic:`),k(G(`id`,a.id)),k(G(`name`,a.name)),k(G(`description`,a.description)),k(G(`dataType`,a.dataType)),k(`Indexing: [immutable — recreate required to change]`),k(G(`embeddingModelName`,a.embeddingModelName)),k(G(`embeddingDimension`,a.embeddingDimension)),k(G(`chunkSize`,a.chunkSize)),k(G(`overlapSize`,a.overlapSize)),k(G(`chunkMode`,a.chunkMode)),k(G(`separator`,a.separator)),k(`Retrieval:`),k(G(`rerankModelName`,a.rerankModelName)),k(G(`rerankMinScore`,a.rerankMinScore)),k(G(`rerankTopN`,a.rerankTopN)),k(G(`rerankMode`,a.rerankMode)),k(G(`enableRewrite`,a.enableRewrite)),k(G(`denseSimilarityTopK`,a.denseSimilarityTopK)),k(G(`sparseSimilarityTopK`,a.sparseSimilarityTopK)),k(`Data:`),k(G(`sourceType`,a.sourceType)),k(G(`connectorId`,a.connectorId))}}),hc=w({description:`List documents in a knowledge base with parse/index status`,auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:{indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base ID`,required:!0},...qs,...U},notes:[`Documents with status FAILED are highlighted in text mode — use the import job status command to inspect failures.`,`Page size defaults to 10 (server default), max 100.`],exampleArgs:[`--index-id idx-xxx --workspace-id ws-xxx`,`--index-id idx-xxx --page-size 100`],validate(e){if(e.pageSize!==void 0&&(e.pageSize<1||e.pageSize>100))return`--page-size must be between 1 and 100`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a=new URL(E(r,f.indexFiles));a.searchParams.set(`index_id`,n.indexId),a.searchParams.set(`page_num`,String(n.pageNumber??1)),a.searchParams.set(`page_size`,String(n.pageSize??10));let o=a.toString();if(t.dryRun){A({endpoint:o,request:null},i);return}let s=await e.client.requestJson({path:o,method:`GET`}),c=s.data?.rows??[];if(t.quiet){for(let e of c)k(e.doc_id??``);return}if(i===`text`){let e=O(process.stdout);if(c.length===0)k(`No documents found.`);else for(let t of c){let n=Js([t.doc_id,t.status,t.doc_name,t.doc_type??`-`,t.size??`-`].join(` `));k(t.status===`FAILED`?e.red(n):n)}k(`total: ${s.data?.total_count??c.length}`)}else A(s,i)}});const gc={indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base ID`,required:!0},jobId:{type:`string`,valueHint:`<id>`,description:`Import job ID (ingestionId returned by import commands)`,required:!0},...qs,wait:{type:`switch`,description:`Poll until the job reaches a terminal state`},pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 5)`},...U};function _c(e){let t=O(process.stdout);k(`status: ${e.data?.ingestion_status??`UNKNOWN`}`);for(let n of e.data?.rows??[]){let e=n.code??n.status??`?`,r=` ${n.doc_id??`?`} ${e} ${n.doc_name??``}`;k(e.includes(`FAILED`)?t.red(r):r)}}var vc=w({description:`Check knowledge base import job status`,auth:`apiKey`,usageArgs:`--index-id <id> --job-id <id> [flags]`,flags:gc,notes:[`Both --index-id and --job-id are required (passing only one returns SystemError).`,`If you see a SystemError, the job may not exist — check the ingestion id in the document list output.`,`Overall job states are PENDING / RUNNING / COMPLETED; per-document failures (for example PARSE_FAILED) exit non-zero with the error message passed through.`],exampleArgs:[`--index-id idx-xxx --job-id job-xxx --workspace-id ws-xxx`,`--index-id idx-xxx --job-id job-xxx --wait --poll-interval 10`],async run(e){let{settings:n,flags:r}=e,i=W(e),a=T(n.output),o=new URL(E(i,f.indexJobStatus));o.searchParams.set(`index_id`,r.indexId),o.searchParams.set(`job_id`,r.jobId),r.pageNumber!==void 0&&o.searchParams.set(`page_number`,String(r.pageNumber)),r.pageSize!==void 0&&o.searchParams.set(`page_size`,String(r.pageSize));let c=o.toString();if(n.dryRun){A({endpoint:c,request:null},a);return}let l;if(l=r.wait?await ec(e.client,n,{statusUrl:c,intervalSec:r.pollInterval??5}):await e.client.requestJson({path:c,method:`GET`}),Xs(l).length>0)throw new t(Qs(l,`Import job reported document failures.`),s.GENERAL);if(n.quiet){k(l.data?.ingestion_status??`UNKNOWN`);return}a===`text`?_c(l):A(l,a)}});const K=1024*1024,yc={".doc":{maxBytes:150*K,enforce:`block`},".docx":{maxBytes:150*K,enforce:`block`},".ppt":{maxBytes:150*K,enforce:`block`},".pptx":{maxBytes:150*K,enforce:`block`},".pdf":{maxBytes:150*K,enforce:`block`},".png":{maxBytes:20*K,enforce:`block`},".jpg":{maxBytes:20*K,enforce:`block`},".jpeg":{maxBytes:20*K,enforce:`block`},".bmp":{maxBytes:20*K,enforce:`block`},".gif":{maxBytes:20*K,enforce:`block`},".xls":{maxBytes:10*K,enforce:`warn`},".xlsx":{maxBytes:10*K,enforce:`warn`},".csv":{maxBytes:10*K,enforce:`warn`},".md":{maxBytes:10*K,enforce:`warn`},".txt":{maxBytes:10*K,enforce:`warn`},".html":{maxBytes:10*K,enforce:`warn`}};function bc(e){return lr(e).toLowerCase()in yc}const xc=new Set([`node_modules`,`.git`,`.svn`,`.hg`,`__pycache__`,`.venv`,`venv`,`.env`,`.tox`,`dist`,`build`,`.cache`,`.next`,`.nuxt`]);function Sc(e){let n=[],r=[];function i(e){let a;try{a=ir(e,{withFileTypes:!0})}catch(n){let r=n.code??`unknown`;throw new t(`Cannot read directory: ${e}`,s.GENERAL,`File system error (${r}) — check the path and permissions.`)}for(let t of a){let a=I(e,t.name);if(t.isDirectory()){xc.has(t.name)||i(a);continue}t.isFile()&&(bc(t.name)?n.push(a):r.push(a))}}for(let r of e){let e;try{e=ar(r)}catch(e){let n=e.code??`unknown`;throw new t(`Cannot read path: ${r}`,s.GENERAL,`File system error (${n}) — check the path and permissions.`)}e.isDirectory()?i(r):e.isFile()&&n.push(r)}return{files:n,skipped:r}}function Cc(e){let n=lr(e).toLowerCase(),r=yc[n];if(!r)throw new t(`Unsupported file type: ${n||F(e)}`,s.USAGE,`Supported formats: ${Object.keys(yc).join(` `)}`);let i;try{i=ar(e).size}catch(n){let r=n.code??`unknown`;throw new t(`Cannot read file: ${e}`,s.GENERAL,`File system error (${r}) — check the path and permissions.`)}if(i>r.maxBytes){let a=r.maxBytes/K;if(r.enforce===`block`)throw new t(`File exceeds the ${a} MB limit for ${n}: ${F(e)}`,s.USAGE);return{sizeBytes:i,warning:`${F(e)} exceeds the recommended 10 MB for ${n}; the server may reject or truncate it.`}}return{sizeBytes:i}}const wc=new Set([`.doc`,`.docx`,`.ppt`,`.pptx`,`.pdf`,`.xls`,`.xlsx`,`.png`,`.jpg`,`.jpeg`,`.bmp`,`.gif`]);function Tc(e,n){let r;try{r=rr(e)}catch(r){let i=r.code??`unknown`,a=`File system error (${i}) — check the path and permissions.`;throw n&&i===`ENOENT`&&!lr(e)&&!e.includes(`/`)&&!e.includes(`\\`)&&(a+=` If you meant to pass text content directly, use ${n} instead of --content-file.`),new t(`Cannot read file: ${e}`,s.GENERAL,a)}try{return new TextDecoder(`utf-8`,{fatal:!0}).decode(r)}catch{let n=lr(e).toLowerCase(),r=wc.has(n)?`Document formats cannot be used as chunk content. Upload documents via the document upload command; to edit a chunk, save the text as .md/.txt first.`:`Convert the file to UTF-8 encoding and retry.`;throw new t(`File is not valid UTF-8 plain text: ${F(e)}`,s.USAGE,r)}}var Ec=w({description:`Upload local files or directories to the data center and optionally import into a knowledge base`,auth:`apiKey`,usageArgs:`--file <path> [flags]`,flags:{file:{type:`array`,valueHint:`<path>`,description:`Local file or directory path (repeatable). Directories are scanned recursively; unsupported formats are skipped`,required:!0},indexId:{type:`string`,valueHint:`<id>`,description:`Import into this knowledge base after registration (one job for all files)`},categoryId:{type:`string`,valueHint:`<id>`,description:`Target data-center category; defaults to the workspace default category`},tag:{type:`array`,valueHint:`<text>`,description:`File tag (repeatable), applied to every uploaded file`},wait:{type:`switch`,description:`Poll the import job to a terminal state (needs --index-id)`},pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 5)`},...U},notes:[`Pipeline: apply upload lease → PUT to OSS → register file → (with --index-id) create import job.`,`Without --category-id the workspace default category is resolved automatically.`,`Directories are scanned recursively; node_modules, .git, and similar are skipped automatically.`,`Multiple files are processed sequentially; on failure, already-registered file ids are listed in the error hint.`],exampleArgs:[`--file ./a.md --workspace-id ws-xxx`,`--file ./a.md --file ./b.pdf --index-id idx-xxx --wait`,`--file ./docs/ --workspace-id ws-xxx`,`--file ./docs/ --dry-run --verbose`],validate(e){if(e.wait&&!e.indexId)return`--wait requires --index-id`},async run(e){let{settings:n,flags:r}=e,i=W(e),a=T(n.output),{files:o,skipped:c}=Sc(r.file);if(o.length===0)throw new t(`No supported files found`,s.USAGE,`Supported formats: .pdf .doc .docx .ppt .pptx .xls .xlsx .csv .md .txt .html .png .jpg .jpeg .bmp .gif`);let l=o.map(e=>{let t=Cc(e);return t.warning&&process.stderr.write(`Warning: ${t.warning}\n`),{filePath:e,sizeBytes:t.sizeBytes}});if(n.dryRun){let e=r.categoryId??`default`,t=l.flatMap(t=>[{step:`applyFileUploadLease`,endpoint:E(i,f.applyFileUploadLease),request:{category:e,fileName:F(t.filePath),sizeBytes:String(t.sizeBytes),contentMd5:`<md5-base64>`}},{step:`ossPut`,endpoint:`<lease.param.url>`,request:{method:`PUT`,headers:`<lease.param.headers>`}},{step:`addFile`,endpoint:E(i,f.addFile),request:{leaseId:`<leaseId>`,category:e,parser:`AUTO_SELECT`,...r.tag?.length?{tags:r.tag}:{}}}]);r.indexId&&t.push({step:`createImportJob`,endpoint:E(i,f.indexJobCreate),request:{indexId:r.indexId,sourceType:`DATA_CENTER_FILE`,docIds:[`<fileId>`]}}),A({steps:t,skipped:c},a);return}let u=r.categoryId??`default`,d=[];for(let n of l)try{let a=rr(n.filePath),o=zn(`md5`).update(a).digest(`base64`),c=await e.client.requestJson({path:E(i,f.applyFileUploadLease),method:`POST`,body:{category:u,fileName:F(n.filePath),sizeBytes:String(n.sizeBytes),contentMd5:o}}),l=c.data?.leaseId,p=c.data?.param;if(!l||!p?.url)throw new t(`Upload lease response missing leaseId/url for ${n.filePath}`,s.GENERAL);let m;try{m=await fetch(p.url,{method:p.method??`PUT`,headers:p.headers,body:a})}catch(e){let r=e.cause?.code;throw new t(`OSS upload failed for ${F(n.filePath)}`,s.NETWORK,r?`Network error (${r}).`:void 0,{cause:e})}if(!m.ok){let e=await m.text().catch(()=>``);throw new t(`OSS upload rejected (HTTP ${m.status}) for ${F(n.filePath)}${e?`: ${e.slice(0,300)}`:``}`,s.GENERAL)}let h=(await e.client.requestJson({path:E(i,f.addFile),method:`POST`,body:{leaseId:l,category:u,parser:`AUTO_SELECT`,...r.tag?.length?{tags:r.tag}:{}}})).data?.fileId;if(!h)throw new t(`addFile response missing fileId for ${n.filePath}`,s.GENERAL);d.push({path:n.filePath,fileId:h})}catch(e){throw d.length>0?tc(e,`Already registered: ${d.map(e=>e.fileId).join(`, `)}`):e}let p,m;if(r.indexId&&(p=(await e.client.requestJson({path:E(i,f.indexJobCreate),method:`POST`,body:{indexId:r.indexId,sourceType:`DATA_CENTER_FILE`,docIds:d.map(e=>e.fileId)}})).data?.ingestionId,r.wait&&p)){let a=await ec(e.client,n,{statusUrl:$s(i,r.indexId,p).toString(),intervalSec:r.pollInterval??5});if(m=Ys(a),Xs(a).length>0)throw new t(Qs(a,`Import job reported document failures.`),s.GENERAL,`Registered file ids: ${d.map(e=>e.fileId).join(`, `)}`)}if(n.quiet){for(let e of d)k(e.fileId);return}if(a===`text`){for(let e of d)k(`${F(e.path)} ${e.fileId} registered`);p&&k(`job: ${p}`),m&&k(`status: ${m}`);let e=[`Uploaded ${d.length} file${d.length===1?``:`s`}`];if(c.length>0&&e.push(`skipped ${c.length} unsupported`),k(`\n${e.join(`, `)}.`),n.verbose&&c.length>0){k(`Skipped files:`);for(let e of c)k(` ${F(e)}`)}return}A({files:d.map(e=>({path:e.path,fileId:e.fileId})),skipped:c,...r.indexId?{index_id:r.indexId}:{},...p?{ingestion_id:p}:{},...m?{final_status:m}:{}},a)}});const Dc={name:{type:`string`,valueHint:`<text>`,description:`Knowledge base name (1-20 chars, unique in workspace)`,required:!0},docId:{type:`array`,valueHint:`<id>`,description:`Data-center file id to import (repeatable); mutually exclusive with --category-id`},categoryId:{type:`array`,valueHint:`<id>`,description:`Import every file under this category (repeatable); mutually exclusive with --doc-id`},embeddingModel:{type:`string`,valueHint:`<name>`,description:`Embedding model name (default: text-embedding-v4)`},chunkSize:{type:`number`,valueHint:`<n>`,description:`Chunk size in characters (default: 600, recommended 300-800)`},wait:{type:`switch`,description:`Poll the initial import job to a terminal state`},pollInterval:{type:`number`,valueHint:`<seconds>`,description:`Polling interval when waiting (default: 5)`},...U};function Oc(e){return e.docId?.length?{sourceType:`DATA_CENTER_FILE`,docIds:e.docId,dataSources:[{sourceType:`DATA_CENTER_FILE`}]}:{sourceType:`DATA_CENTER_CATEGORY`,categoryIds:e.categoryId,dataSources:[{sourceType:`DATA_CENTER_CATEGORY`}]}}var kc=w({description:`Create a knowledge base and import data-center files or categories`,auth:`apiKey`,usageArgs:`--name <text> (--doc-id <id> | --category-id <id>) [flags]`,flags:Dc,notes:[`Structure/sink types are fixed to the default document knowledge base (unstructured, BUILT_IN storage).`,`Returns the knowledge base id (pipelineId) and the initial import job id (ingestionId).`,`Use the import job status command (or --wait) to track the initial import.`],exampleArgs:[`--name demo --doc-id file-xxx --workspace-id ws-xxx`,`--name demo --category-id cate-xxx --wait`],validate(e){if(e.name.length<1||e.name.length>20)return`--name must be 1-20 characters`;let t=!!e.docId?.length,n=!!e.categoryId?.length;if(t&&n)return`Use either --doc-id or --category-id, not both`;if(!t&&!n)return`Provide --doc-id or --category-id as the data source`},async run(e){let{settings:n,flags:r}=e,i=W(e),a=T(n.output),o={name:r.name,structureType:`unstructured`,sinkType:`BUILT_IN`,embeddingModelName:r.embeddingModel??`text-embedding-v4`,chunkSize:r.chunkSize??600,...Oc(r)},c=E(i,f.indexCreateV2);if(n.dryRun){A({endpoint:c,request:o},a);return}let l=await e.client.requestJson({path:c,method:`POST`,body:o}),u=l.data?.pipelineId,d=l.data?.ingestionId,p;if(r.wait&&u&&d){let a=await ec(e.client,n,{statusUrl:$s(i,u,d).toString(),intervalSec:r.pollInterval??5});if(p=Ys(a),Xs(a).length>0)throw new t(Qs(a,`Initial import reported document failures.`),s.GENERAL,`Knowledge base created: ${u}`,{api:{requestId:a.request_id}})}if(n.quiet){k(u??``);return}if(a===`text`){k(`index_id: ${u??`-`}`),d&&k(`ingestion_id: ${d}`),p&&k(`status: ${p}`),k(`Next: check the import job status, then search against this knowledge base.`);return}A(p?{...l,final_status:p}:l,a)}}),Ac=w({description:`Update knowledge base name, description or rerank threshold`,auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:{indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base ID`,required:!0},name:{type:`string`,valueHint:`<text>`,description:`New knowledge base name (1-20 chars)`},description:{type:`string`,valueHint:`<text>`,description:`New knowledge base description`},rerankMinScore:{type:`number`,valueHint:`<score>`,description:`Rerank minimum score threshold, range 0-1 (chunks below are filtered)`},...U},notes:[`Indexing settings (embedding model, chunk size, etc.) are immutable — recreate the knowledge base to change them.`],exampleArgs:[`--index-id idx-xxx --description 'product docs v2' --workspace-id ws-xxx`,`--index-id idx-xxx --rerank-min-score 0.3`],validate(e){if(e.name===void 0&&e.description===void 0&&e.rerankMinScore===void 0)return`Nothing to update — pass --name, --description or --rerank-min-score`;if(e.name!==void 0&&(e.name.length<1||e.name.length>20))return`--name must be 1-20 characters`;if(e.rerankMinScore!==void 0&&(e.rerankMinScore<0||e.rerankMinScore>1))return`--rerank-min-score must be between 0 and 1`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={id:n.indexId,...n.name===void 0?{}:{name:n.name},...n.description===void 0?{}:{description:n.description},...n.rerankMinScore===void 0?{}:{rerankMinScore:n.rerankMinScore}},o=E(r,f.indexUpdate);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a});if(!t.quiet){if(i===`text`){k(`updated: ${n.indexId}`);return}A(s,i)}}});const jc={indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base ID`,required:!0},yes:{type:`switch`,description:`Skip the confirmation prompt`},...U};async function Mc(e,t,n){let r=``,i=``;try{r=` name: ${(await pc(e.client,t,n)).name}`}catch{}try{let r=new URL(E(t,f.indexFiles));r.searchParams.set(`index_id`,n),r.searchParams.set(`page_num`,`1`),r.searchParams.set(`page_size`,`1`);let a=(await e.client.requestJson({path:r.toString(),method:`GET`})).data?.total_count;typeof a==`number`&&(i=` documents: ${a}`)}catch{}return`Delete knowledge base ${n}${r}${i}\nThis permanently removes the knowledge base with all documents and chunks. It cannot be undone.`}var Nc=w({description:`Delete a knowledge base with all its documents and chunks`,auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:jc,notes:[`Irreversible — the knowledge base and all indexed content are permanently removed.`,`Files in the data center are not affected; only the knowledge base index is deleted.`],exampleArgs:[`--index-id idx-xxx --workspace-id ws-xxx`,`--index-id idx-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={index_id:n.indexId},o=E(r,f.indexDelete);if(t.dryRun){A({endpoint:o,request:a},i);return}await _n(n.yes?``:await Mc(e,r,n.indexId),n.yes??!1);let s=await e.client.requestJson({path:o,method:`POST`,body:a});if(!t.quiet){if(i===`text`){k(`deleted: ${n.indexId}`);return}A(s,i)}}});const Pc={indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base ID`,required:!0},docId:{type:`array`,valueHint:`<id>`,description:`Document ID to delete (repeatable)`,required:!0},yes:{type:`switch`,description:`Skip the confirmation prompt`},...U};function Fc(e,t){let n=t.length<=5?t.join(`
|
|
2653
|
+
`):`${t.slice(0,5).join(`
|
|
2654
|
+
`)}\n ... (${t.length} documents total)`;return`Delete ${t.length} document(s) from knowledge base ${e}:\n ${n}\nDocuments and all their chunks are permanently removed from the index. This cannot be undone.`}var Ic=w({description:`Delete documents and their chunks from a knowledge base`,auth:`apiKey`,usageArgs:`--index-id <id> --doc-id <id> [flags]`,flags:Pc,notes:[`Removes documents from the knowledge base index only; the source files remain in the data center.`,"Use the doc_id from `knowledge doc list --quiet`, not the fileId from `knowledge doc upload`. For documents created via `knowledge create --doc-id`, the doc_id equals the fileId; for documents imported via `knowledge doc upload --index-id`, the doc_id may include a workspace suffix.",`Deletion may take up to ~30s to propagate — the document may still appear in the doc list briefly.`,`The output lists the ids actually deleted.`],exampleArgs:[`--index-id idx-xxx --doc-id file-xxx --workspace-id ws-xxx`,`--index-id idx-xxx --doc-id file-a --doc-id file-b --yes`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={index_id:n.indexId,doc_ids:n.docId},o=E(r,f.indexDeleteFile);if(t.dryRun){A({endpoint:o,request:a},i);return}await _n(Fc(n.indexId,n.docId),n.yes??!1);let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=s.data?.deleted??[];if(t.quiet){for(let e of c)k(e);return}if(i===`text`){k(`deleted: ${c.length} document(s)`);for(let e of c)k(` ${e}`);c.length!==n.docId.length&&process.stderr.write(`Warning: requested ${n.docId.length} deletion(s) but the server reported ${c.length}.\n`);return}A(s,i)}}),Lc=w({description:`Batch update tags on data-center files`,auth:`apiKey`,usageArgs:`--doc-id <id> --tag <text> [flags]`,flags:{docId:{type:`array`,valueHint:`<id>`,description:`Data-center file ID to tag (repeatable, 1-20 per call)`,required:!0},tag:{type:`array`,valueHint:`<text>`,description:`Tag applied to every --doc-id (repeatable, each up to 32 chars)`,required:!0},mode:{type:`string`,valueHint:`<mode>`,description:`Update mode: append (default) or overwrite`},...U},notes:[`The same tag set is applied to every --doc-id; run the command multiple times for different tag sets.`,`Server limits: up to 100 tags per file, total tag length up to 700 chars, tag up to 32 chars.`],exampleArgs:[`--doc-id file-xxx --tag project-a --tag draft --workspace-id ws-xxx`,`--doc-id file-a --doc-id file-b --tag final --mode overwrite`],validate(e){if(e.docId.length>20)return`--doc-id accepts at most 20 ids per call`;if(e.mode!==void 0&&e.mode!==`append`&&e.mode!==`overwrite`)return`--mode must be append or overwrite`;if(e.tag.length>100)return`At most 100 tags per file`;let t=e.tag.find(e=>e.length>32);if(t)return`Tag exceeds 32 characters: ${t}`;if(e.tag.reduce((e,t)=>e+t.length,0)>700)return`Total tag length exceeds 700 characters`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={fileInfos:n.docId.map(e=>({fileId:e,tags:n.tag})),updateMode:(n.mode??`append`).toUpperCase()},o=E(r,f.batchUpdateFileTag);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a});if(!t.quiet){if(i===`text`){k(`tagged: ${n.docId.length} file(s) with [${n.tag.join(`, `)}]`);return}A(s,i)}}});const Rc={scene:{type:`string`,valueHint:`<scene>`,description:`Service scene: chat (Q&A) or search (retrieval). Required by the server`,required:!0},status:{type:`string`,valueHint:`<status>`,description:`Filter by status: draft, deployed (includes edited) or deleted`},name:{type:`string`,valueHint:`<text>`,description:`Filter by service name (fuzzy match)`},agentId:{type:`string`,valueHint:`<id>`,description:`Filter by exact agent ID`},indexId:{type:`string`,valueHint:`<id>`,description:`Filter by exact linked knowledge base (pipeline) ID`},...qs,...U},zc=[`chat`,`search`],Bc=[`draft`,`deployed`,`deleted`];var Vc=w({description:`List retrieval / Q&A services (agents) in the workspace`,auth:`apiKey`,usageArgs:`--scene <chat|search> [flags]`,flags:Rc,notes:[`A scene (chat or search) is required — run once per scene to see both.`,`Use the returned agent_id with the search or chat commands, or with service management commands.`],exampleArgs:[`--scene chat --workspace-id ws-xxx`,`--scene search --status deployed`],validate(e){if(!zc.includes(e.scene))return`--scene must be chat or search`;if(e.status!==void 0&&!Bc.includes(e.status))return`--status must be draft, deployed or deleted`;if(e.pageSize!==void 0&&(e.pageSize<1||e.pageSize>100))return`--page-size must be between 1 and 100`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={agent_scene:n.scene,...n.status?{agent_status:n.status}:{},...n.name?{agent_name:n.name}:{},...n.agentId?{agent_id:n.agentId}:{},...n.indexId?{pipeline_id:n.indexId}:{},page_number:n.pageNumber??1,page_size:n.pageSize??10},o=E(r,f.agentList);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=s.data?.rows??[];if(t.quiet){for(let e of c)k(e.agent_id??``);return}if(i===`text`){if(c.length===0)k(`No services found.`);else for(let e of c){let t=(e.pipeline_list??[]).map(e=>e.pipeline_name).filter(Boolean).join(`,`);k(Js([e.agent_id,e.agent_status,e.agent_version,e.agent_name,t?`(kb: ${t})`:``].filter(Boolean).join(` `)))}k(`total: ${s.data?.total_count??c.length}`),k(n.scene===`search`?`Use an agent_id above with the knowledge search command.`:`Use an agent_id above with the knowledge chat command.`)}else A(s,i)}});const Hc={agentId:{type:`string`,valueHint:`<id>`,description:`Service (agent) ID`,required:!0},agentVersion:{type:`string`,valueHint:`<version>`,description:`Specific version to inspect (beta or a published number); omit for all versions`},...U};function Uc(e){k(`Version ${e.agent_version??`?`}:`),e.agent_version_desc&&k(` desc: ${e.agent_version_desc}`),e.publish_time!==void 0&&k(` published: ${e.publish_time}`);let t=e.agent_config;if(t){t.agent_policy&&k(` policy: ${t.agent_policy}`),t.agent_model&&k(` model: ${t.agent_model}`),t.temperature!==void 0&&k(` temperature: ${t.temperature}`);for(let e of t.kb_search_configs??[])k(` kb: ${typeof e.id==`string`?e.id:`?`}${typeof e.name==`string`?` (${e.name})`:``}`)}}var Wc=w({description:`Show service (agent) details including per-version configuration`,auth:`apiKey`,usageArgs:`--agent-id <id> [flags]`,flags:Hc,notes:[`Without --agent-version all versions are returned (beta draft plus published numbers).`,`The version value is passed through as-is; the valid set is server-side state.`],exampleArgs:[`--agent-id aid-xxx --workspace-id ws-xxx`,`--agent-id aid-xxx --agent-version beta`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={agent_id:n.agentId,...n.agentVersion?{agent_version:n.agentVersion}:{}},o=E(r,f.agentGet);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=s.data;if(t.quiet){k(c?.agent_id??``);return}if(i!==`text`){A(s,i);return}k(`Basic:`),k(` id: ${c?.agent_id??`-`}`),k(` name: ${c?.agent_name??`-`}`),k(` desc: ${c?.agent_desc??`-`}`),k(` scene: ${c?.agent_scene??`-`}`),k(` status: ${c?.agent_status??`-`}`);for(let e of c?.agent_details??[])Uc(e)}}),Gc=w({description:`Create a retrieval / Q&A service (initial status: draft, version: beta)`,auth:`apiKey`,usageArgs:`--name <text> --scene <chat|search> [flags]`,flags:{name:{type:`string`,valueHint:`<text>`,description:`Service name (up to 200 chars, unique per scene in the workspace)`,required:!0},scene:{type:`string`,valueHint:`<scene>`,description:`Service scene: chat (Q&A) or search (retrieval)`,required:!0},description:{type:`string`,valueHint:`<text>`,description:`Service description (up to 1000 chars)`},indexId:{type:`string`,valueHint:`<id>`,description:`Bind this knowledge base; other settings use server defaults`},...U},notes:[`Without an explicit configuration the server applies its default agent settings.`,`The draft (beta) version can be tested via --agent-version beta on search/chat before deploying.`,`Requires the knowledge-base create permission in the workspace.`],exampleArgs:[`--name my-qa --scene chat --workspace-id ws-xxx`,`--name my-search --scene search --index-id idx-xxx`],validate(e){if(e.name.length>200)return`--name must be at most 200 characters`;if(e.scene!==`chat`&&e.scene!==`search`)return`--scene must be chat or search`;if(e.description!==void 0&&e.description.length>1e3)return`--description must be at most 1000 characters`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={agent_name:n.name,agent_scene:n.scene,...n.description?{agent_desc:n.description}:{},...n.indexId?{agent_config:{kb_search_configs:[{id:n.indexId}]}}:{}},o=E(r,f.agentCreate);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=nc(s,`agent_id`);if(t.quiet){k(c??``);return}if(i===`text`){k(`created: ${c??`-`} (status: ${nc(s,`agent_status`)??`draft`}, version: ${nc(s,`agent_version`)??`beta`})`),k(`Test the draft with --agent-version beta on search/chat, then deploy it to publish.`);return}A(s,i)}});const Kc=[`true`,`false`],qc={agentId:{type:`string`,valueHint:`<id>`,description:`Service (agent) ID`,required:!0},name:{type:`string`,valueHint:`<text>`,description:`New service name (up to 200 chars)`},description:{type:`string`,valueHint:`<text>`,description:`New service description (up to 1000 chars)`},agentVersion:{type:`string`,valueHint:`<version>`,description:`Target version (default: beta draft). Published versions only accept --version-desc`},versionDesc:{type:`string`,valueHint:`<text>`,description:`Version description`},policy:{type:`string`,valueHint:`<policy>`,description:`Agent policy: turbo (fast) or agentic (multi-turn)`},model:{type:`string`,valueHint:`<name>`,description:`Generation model code (must be in the platform allowlist)`},temperature:{type:`number`,valueHint:`<n>`,description:`Sampling temperature, range 0-2`},maxLlmCalls:{type:`number`,valueHint:`<n>`,description:`Max LLM calls per request, range 1-30`},enableSessionFile:{type:`string`,valueHint:`<bool>`,description:`Enable session files: true or false`},enableRefusal:{type:`string`,valueHint:`<bool>`,description:`Enable refusal answers: true or false`},enableAntiLeak:{type:`string`,valueHint:`<bool>`,description:`Enable anti prompt-leak: true or false`},enableRichText:{type:`string`,valueHint:`<bool>`,description:`Enable rich text output: true or false`},enableCitation:{type:`string`,valueHint:`<bool>`,description:`Enable citations: true or false`},configFile:{type:`string`,valueHint:`<path>`,description:`JSON file replacing the whole agent_config (for nested settings like kb_search_configs); mutually exclusive with scalar config flags`},...U};function Jc(e){let t={};return e.policy!==void 0&&(t.agent_policy=e.policy),e.model!==void 0&&(t.agent_model=e.model),e.temperature!==void 0&&(t.temperature=e.temperature),e.maxLlmCalls!==void 0&&(t.max_num_llm_calls=e.maxLlmCalls),e.enableSessionFile!==void 0&&(t.enable_session_file=e.enableSessionFile),e.enableRefusal!==void 0&&(t.enable_refusal=e.enableRefusal),e.enableAntiLeak!==void 0&&(t.enable_anti_leak=e.enableAntiLeak),e.enableRichText!==void 0&&(t.enable_rich_text=e.enableRichText),e.enableCitation!==void 0&&(t.enable_citation=e.enableCitation),t}function Yc(e){let n;try{n=rr(e,`utf-8`)}catch(n){let r=n.code??`unknown`;throw new t(`Cannot read config file: ${e}`,s.GENERAL,`File system error (${r}) — check the path and permissions.`)}let r;try{r=JSON.parse(n)}catch{throw new t(`--config-file must contain valid JSON.`,s.USAGE)}if(typeof r!=`object`||!r||Array.isArray(r))throw new t(`--config-file must contain a JSON object.`,s.USAGE);let i=r;return Zc(i),i}const Xc=new Set([`agent_policy`,`agent_model`,`enable_session_file`,`enable_refusal`,`enable_anti_leak`,`enable_rich_text`,`enable_citation`,`temperature`,`max_num_llm_calls`,`max_completion_tokens`,`session_file_max_parse_length`,`enable_kb_router`,`kb_router_model`,`rerank_top_n`,`hybrid_rerank`,`kb_search_configs`]);function Zc(e){if(e.agent_policy!==void 0&&![`turbo`,`agentic`].includes(e.agent_policy))throw new t(`agent_policy must be turbo or agentic`,s.USAGE);if(e.temperature!==void 0&&(e.temperature<0||e.temperature>2))throw new t(`temperature must be between 0 and 2`,s.USAGE);if(e.max_num_llm_calls!==void 0&&(e.max_num_llm_calls<1||e.max_num_llm_calls>30))throw new t(`max_num_llm_calls must be between 1 and 30`,s.USAGE);if(e.rerank_top_n!==void 0&&(e.rerank_top_n<1||e.rerank_top_n>20))throw new t(`rerank_top_n must be between 1 and 20`,s.USAGE);for(let t of e.kb_search_configs??[]){let e=t.rerank;e?.rerank_instruct&&e.rerank_mode!==`custom`&&process.stderr.write(`Warning: rerank_instruct is only effective with rerank_mode=custom; the server clears it otherwise.
|
|
2655
|
+
`)}for(let t of Object.keys(e))Xc.has(t)||process.stderr.write(`Warning: unknown agent_config field passed through: ${t}\n`)}async function Qc(e,t,n){return((await e.requestJson({path:E(t,f.agentGet),method:`POST`,body:{agent_id:n,agent_version:`beta`}})).data?.agent_details??[]).find(e=>e.agent_version===`beta`)?.agent_config??{}}var $c=w({description:`Update service name, description or draft configuration`,auth:`apiKey`,usageArgs:`--agent-id <id> [flags]`,flags:qc,notes:[`Configuration changes only apply to the beta draft; published versions accept --version-desc only.`,`To change the configuration of a published version, first update the beta draft (this command without --agent-version or with --agent-version beta), then run service deploy to publish a new version.`,`Scalar config flags merge into the current draft config (read-merge-write); --config-file replaces the whole config and is mutually exclusive with them.`,`After updating the draft, verify with --agent-version beta on search/chat, then deploy.`,`Requires the knowledge-base modify permission in the workspace.`],exampleArgs:[`--agent-id aid-xxx --temperature 0.7 --workspace-id ws-xxx`,`--agent-id aid-xxx --config-file ./agent-config.json`,`--agent-id aid-xxx --agent-version 1 --version-desc 'first stable release'`],validate(e){let t=Object.keys(Jc(e)).length>0;if(!(e.name!==void 0||e.description!==void 0||e.versionDesc!==void 0||e.configFile!==void 0||t))return`Nothing to update — pass a name/description/version-desc or config flags`;if(e.configFile!==void 0&&t)return`--config-file is mutually exclusive with scalar config flags`;if(e.agentVersion!==void 0&&e.agentVersion!==`beta`&&(t||e.configFile!==void 0))return`Published versions only accept --version-desc; update the beta draft to change config`;if(e.name!==void 0&&e.name.length>200)return`--name must be at most 200 characters`;if(e.description!==void 0&&e.description.length>1e3)return`--description must be at most 1000 characters`;if(e.policy!==void 0&&![`turbo`,`agentic`].includes(e.policy))return`--policy must be turbo or agentic`;if(e.temperature!==void 0&&(e.temperature<0||e.temperature>2))return`--temperature must be between 0 and 2`;if(e.maxLlmCalls!==void 0&&(e.maxLlmCalls<1||e.maxLlmCalls>30))return`--max-llm-calls must be between 1 and 30`;for(let[t,n]of[[`--enable-session-file`,e.enableSessionFile],[`--enable-refusal`,e.enableRefusal],[`--enable-anti-leak`,e.enableAntiLeak],[`--enable-rich-text`,e.enableRichText],[`--enable-citation`,e.enableCitation]])if(n!==void 0&&!Kc.includes(n))return`${t} must be true or false`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a=Jc(n),o=n.configFile!==void 0||Object.keys(a).length>0,s;n.configFile===void 0?Object.keys(a).length>0&&(t.dryRun?s={...a}:(s={...await Qc(e.client,r,n.agentId),...a},Zc(s))):s=Yc(n.configFile);let c={agent_id:n.agentId,...n.name===void 0?{}:{agent_name:n.name},...n.description===void 0?{}:{agent_desc:n.description},...n.agentVersion===void 0?{}:{agent_version:n.agentVersion},...n.versionDesc===void 0?{}:{agent_version_desc:n.versionDesc},...s===void 0?{}:{agent_config:s}},l=E(r,f.agentUpdate);if(t.dryRun){A({endpoint:l,request:c,...o&&n.configFile===void 0?{note:`scalar config flags are merged into the current beta config at run time`}:{}},i);return}let u=await e.client.requestJson({path:l,method:`POST`,body:c});if(!t.quiet){if(i===`text`){k(`updated: ${n.agentId}`),o&&k(`Draft config changed — verify with --agent-version beta, then deploy.`);return}A(u,i)}}});const el={agentId:{type:`string`,valueHint:`<id>`,description:`Service (agent) ID`,required:!0},versionDesc:{type:`string`,valueHint:`<text>`,description:`Description for the newly published version`},yes:{type:`switch`,description:`Skip the confirmation prompt`},...U};async function tl(e,t,n){let r=``,i=``;try{let a=await e.requestJson({path:E(t,f.agentGet),method:`POST`,body:{agent_id:n}}),o=a.data?.agent_name,s=a.data?.agent_status;o&&(r+=` name: ${o}`),s&&(r+=` status: ${s}`,s===`edited`&&(i=`
|
|
2656
|
+
WARNING: a published version is live — deploying replaces its behavior with the current draft.`))}catch{}return`Deploy service ${n}${r}${i}\nPublishing changes what live callers get from this service.`}var nl=w({description:`Publish the beta draft of a service as a new version`,auth:`apiKey`,usageArgs:`--agent-id <id> [flags]`,flags:el,notes:[`The version number auto-increments; status becomes deployed.`,`Publishing affects live callers — the confirmation prompt guards against accidents.`,`Requires the knowledge-base modify permission in the workspace.`],exampleArgs:[`--agent-id aid-xxx --workspace-id ws-xxx`,`--agent-id aid-xxx --version-desc 'tuned rerank params' --yes`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={agent_id:n.agentId,...n.versionDesc?{agent_version_desc:n.versionDesc}:{}},o=E(r,f.agentDeploy);if(t.dryRun){A({endpoint:o,request:a},i);return}await _n(n.yes?``:await tl(e.client,r,n.agentId),n.yes??!1);let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=nc(s,`agent_version`);if(t.quiet){k(c??``);return}if(i===`text`){k(`deployed: ${n.agentId} version ${c??`-`}`);return}A(s,i)}});const rl={agentId:{type:`string`,valueHint:`<id>`,description:`Service (agent) ID`,required:!0},yes:{type:`switch`,description:`Skip the confirmation prompt`},...U};async function il(e,t,n){let r=``,i=``;try{let a=await e.requestJson({path:E(t,f.agentGet),method:`POST`,body:{agent_id:n}}),o=a.data?.agent_name,s=a.data?.agent_status;o&&(r+=` name: ${o}`),s&&(r+=` status: ${s}`,(s===`deployed`||s===`edited`)&&(i=`
|
|
2657
|
+
WARNING: this service is LIVE — deleting it breaks existing callers.`))}catch{}return`Delete service ${n}${r}${i}\nDeletion cannot be undone; the agent_id can no longer be used for search or chat calls.`}var al=w({description:`Delete a retrieval / Q&A service (soft delete, idempotent)`,auth:`apiKey`,usageArgs:`--agent-id <id> [flags]`,flags:rl,notes:[`Deletion cannot be undone; the agent_id becomes unusable for search and chat calls.`,`Idempotent — deleting an already-deleted service does not fail.`,`Requires the knowledge-base delete permission in the workspace.`],exampleArgs:[`--agent-id aid-xxx --workspace-id ws-xxx`,`--agent-id aid-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={agent_id:n.agentId},o=E(r,f.agentDelete);if(t.dryRun){A({endpoint:o,request:a},i);return}await _n(n.yes?``:await il(e.client,r,n.agentId),n.yes??!1);let s=await e.client.requestJson({path:o,method:`POST`,body:a});if(!t.quiet){if(i===`text`){k(`deleted: ${n.agentId} (status: ${nc(s,`agent_status`)??`deleted`})`);return}A(s,i)}}}),ol=w({description:`Copy a service into a new draft (name gets a copy_ prefix)`,auth:`apiKey`,usageArgs:`--agent-id <id> [flags]`,flags:{agentId:{type:`string`,valueHint:`<id>`,description:`Source service (agent) ID to copy`,required:!0},...U},notes:[`The copy starts as a beta draft; test it with --agent-version beta, then deploy to publish.`,`Requires the knowledge-base create permission in the workspace.`],exampleArgs:[`--agent-id aid-xxx --workspace-id ws-xxx`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={agent_id:n.agentId},o=E(r,f.agentCopy);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=nc(s,`agent_id`);if(t.quiet){k(c??``);return}if(i===`text`){k(`new agent_id: ${c??`-`} (name: ${nc(s,`agent_name`)??`-`}, status: ${nc(s,`agent_status`)??`draft`})`),k(`Test the draft with --agent-version beta on search/chat, then deploy it to publish.`);return}A(s,i)}});const sl={indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base ID`,required:!0},docId:{type:`string`,valueHint:`<id>`,description:`Owning document ID from the doc list command; required in practice for all knowledge base types`},content:{type:`string`,valueHint:`<text>`,description:`Chunk body text, up to 6000 chars (document-type); alternative to --content-file`},contentFile:{type:`string`,valueHint:`<path>`,description:`Read chunk body from a UTF-8 plain text file (.md/.txt etc.)`},title:{type:`string`,valueHint:`<text>`,description:`Chunk title, up to 50 chars (document-type)`},imageUrl:{type:`array`,valueHint:`<url>`,description:`Chunk image URL (repeatable, up to 10; document-type)`},field:{type:`array`,valueHint:`<key=value>`,description:`Arbitrary field entry (repeatable) for table/image knowledge bases where keys are Excel column headers; mutually exclusive with content/title/image flags`},...U};function cl(e){let n={};for(let r of e){let e=r.indexOf(`=`);if(e<=0)throw new t(`--field must be key=value, got: ${r}`,s.USAGE);n[r.slice(0,e)]=r.slice(e+1)}return n}var ll=w({description:`Add a chunk directly to a knowledge base`,auth:`apiKey`,usageArgs:`--index-id <id> (--content <text> | --field <k=v>) [flags]`,flags:sl,notes:[`Document / table / image knowledge bases are supported; audio-video ones are not.`,`--doc-id is required in practice for all knowledge base types. Use the document-level id from the doc list command; the per-row doc_id in chunk list output is not accepted.`,`Image-type documents do not support text chunks. Target a text-type document (docx/pdf/txt) instead.`,`The API is idempotent but rate-limited to 10 calls per second — throttle batch scripts.`,`The response carries no chunk id; list chunks afterwards to find the new one.`,`For table/image knowledge bases use --field with Excel column headers as keys; values are passed through as strings.`],exampleArgs:[`--index-id idx-xxx --content "chunk text" --title intro --workspace-id ws-xxx`,`--index-id idx-xxx --field 列A=v1 --field 列B=v2`],validate(e){let t=e.content!==void 0||e.contentFile!==void 0||e.title!==void 0||!!e.imageUrl?.length,n=!!e.field?.length;if(t&&n)return`--field is mutually exclusive with --content/--content-file/--title/--image-url`;if(!t&&!n)return`Provide chunk content via --content/--content-file or --field entries`;if(e.content!==void 0&&e.contentFile!==void 0)return`Use either --content or --content-file, not both`;if(e.content!==void 0&&e.content.length>6e3)return`--content must be at most 6000 characters`;if(e.title!==void 0&&e.title.length>50)return`--title must be at most 50 characters`;if(e.imageUrl!==void 0&&e.imageUrl.length>10)return`--image-url accepts at most 10 entries`},async run(e){let{settings:n,flags:r}=e,i=W(e),a=T(n.output),o;if(r.field?.length)o=cl(r.field);else{let e=r.contentFile===void 0?r.content:Tc(r.contentFile,`--content`);if(typeof e==`string`&&e.length>6e3)throw new t(`Chunk content must be at most 6000 characters`,s.USAGE);o={...e===void 0?{}:{content:e},...r.title===void 0?{}:{title:r.title},...r.imageUrl?.length?{image_urls:r.imageUrl}:{}}}let c={pipelineId:r.indexId,...r.docId?{dataId:r.docId}:{},field:o},l=E(i,f.chunkCreate);if(n.dryRun){A({endpoint:l,request:c},a);return}let u=await e.client.requestJson({path:l,method:`POST`,body:c});if(!n.quiet){if(a===`text`){k(`chunk created (pipeline: ${r.indexId})`),k(`List chunks to find the new chunk id.`);return}A(u,a)}}}),ul=w({description:`List chunks in a knowledge base with content and status`,auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:{indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base ID`,required:!0},docId:{type:`string`,valueHint:`<id>`,description:`Only show chunks belonging to this document`},...qs,...U},notes:[`Use metadata._id as the chunk id and metadata.doc_id as the document id in chunk update/delete commands.`,`Page size defaults to 20 (server default), max 100.`],exampleArgs:[`--index-id idx-xxx --workspace-id ws-xxx`,`--index-id idx-xxx --doc-id file-xxx --page-size 50`],validate(e){if(e.pageSize!==void 0&&(e.pageSize<1||e.pageSize>100))return`--page-size must be between 1 and 100`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={indexId:n.indexId,pageNum:n.pageNumber??1,pageSize:n.pageSize??20,...n.docId?{docId:n.docId}:{}},o=E(r,f.chunkList);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=s.data?.nodes??[];if(t.quiet){for(let e of c)k(e.metadata?._id??``);return}if(i===`text`){if(c.length===0)k(`No chunks found.`);else for(let e of c){let t=e.metadata??{},n=t._chunk_status_message?` status: ${t._chunk_status_message}`:``,r=t.is_displayed_chunk_content===!1?` [excluded from retrieval]`:``;k(`[chunk] ${t._id??`?`} (doc: ${t.doc_name??`?`}, doc_id: ${t.doc_id??`?`})${n}${r}`);let i=t.content??e.text??``;k(` ${i.length>200?`${i.slice(0,200)}…`:i}`)}k(`total: ${s.data?.total??c.length}`)}else A(s,i)}});const dl={indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base ID`,required:!0},chunkId:{type:`string`,valueHint:`<id>`,description:`Chunk ID (metadata._id from the chunk list output)`,required:!0},docId:{type:`string`,valueHint:`<id>`,description:`Document ID owning the chunk (metadata.doc_id from the chunk list output)`,required:!0},content:{type:`string`,valueHint:`<text>`,description:`New chunk content, 10-6000 chars; alternative to --content-file`},contentFile:{type:`string`,valueHint:`<path>`,description:`Read new content from a UTF-8 plain text file (.md/.txt etc.)`},title:{type:`string`,valueHint:`<text>`,description:`Chunk title, 0-50 chars (empty string clears it; omit to keep unchanged)`},exclude:{type:`switch`,description:`Exclude this chunk from retrieval`},include:{type:`switch`,description:`Include this chunk in retrieval (default)`},...U};async function fl(e,n,r,i,a){for(let t=1;t<=10;t++){let o=(await e.requestJson({path:E(n,f.chunkList),method:`POST`,body:{indexId:r,docId:a,pageNum:t,pageSize:100}})).data?.nodes??[],s=o.find(e=>e.metadata?._id===i),c=s?.metadata?.content??s?.text;if(typeof c==`string`)return c;if(o.length<100)break}throw new t(`Chunk not found: ${i}`,s.GENERAL,`Check the chunk id via the chunk list command.`)}var pl=w({description:`Update chunk content or toggle its retrieval visibility`,auth:`apiKey`,usageArgs:`--index-id <id> --chunk-id <id> --doc-id <id> [flags]`,flags:dl,notes:[`Content must be 10-6000 characters and within the knowledge base's max chunk size.`,`--content-file expects a UTF-8 plain text file; document formats (.docx/.pdf) are not parsed here.`,`Toggling --exclude/--include without new content re-submits the existing content automatically.`],exampleArgs:[`--index-id idx-xxx --chunk-id chunk-xxx --doc-id file-xxx --content "corrected text"`,`--index-id idx-xxx --chunk-id chunk-xxx --doc-id file-xxx --exclude`],validate(e){if(e.content!==void 0&&e.contentFile!==void 0)return`Use either --content or --content-file, not both`;if(e.exclude&&e.include)return`--exclude and --include are mutually exclusive`;if(!(e.content!==void 0||e.contentFile!==void 0)&&!e.exclude&&!e.include&&e.title===void 0)return`Nothing to update — pass --content/--content-file, --title, --exclude or --include`;if(e.content!==void 0&&(e.content.length<10||e.content.length>6e3))return`--content must be 10-6000 characters`;if(e.title!==void 0&&e.title.length>50)return`--title must be at most 50 characters`},async run(e){let{settings:n,flags:r}=e,i=W(e),a=T(n.output),o=r.contentFile===void 0?r.content:Tc(r.contentFile,`--content`);if(o!==void 0&&(o.length<10||o.length>6e3))throw new t(`Chunk content must be 10-6000 characters`,s.USAGE);o===void 0&&(o=n.dryRun?`<current-content (fetched at run time)>`:await fl(e.client,i,r.indexId,r.chunkId,r.docId));let c={pipelineId:r.indexId,chunkId:r.chunkId,dataId:r.docId,content:o,isDisplayedChunkContent:!r.exclude,...r.title===void 0?{}:{title:r.title}},l=E(i,f.chunkUpdate);if(n.dryRun){A({endpoint:l,request:c},a);return}let u=await e.client.requestJson({path:l,method:`POST`,body:c});if(!n.quiet){if(a===`text`){k(`updated: ${r.chunkId}`);return}A(u,a)}}});const ml={indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base ID`,required:!0},chunkId:{type:`array`,valueHint:`<id>`,description:`Chunk ID to delete (repeatable; batches of 10 are sent automatically)`,required:!0},yes:{type:`switch`,description:`Skip the confirmation prompt`},...U};function hl(e,t=10){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}var gl=w({description:`Delete chunks from a knowledge base (irreversible)`,auth:`apiKey`,usageArgs:`--index-id <id> --chunk-id <id> [flags]`,flags:ml,notes:[`Accepts at most 10 chunk ids per call; larger sets are batched automatically.`],exampleArgs:[`--index-id idx-xxx --chunk-id chunk-a --chunk-id chunk-b --workspace-id ws-xxx`,`--index-id idx-xxx --chunk-id chunk-a --yes`],async run(e){let{settings:n,flags:r}=e,i=W(e),a=T(n.output),o=hl(r.chunkId),s=E(i,f.chunkDelete);if(n.dryRun){A({endpoint:s,batches:o.map(e=>({request:{pipelineId:r.indexId,chunkIds:e}}))},a);return}await _n(`Delete ${r.chunkId.length} chunk(s) from knowledge base ${r.indexId} in ${o.length} batch(es).\nChunks are permanently removed. This cannot be undone.`,r.yes??!1);let c=0;for(let n of o)try{await e.client.requestJson({path:s,method:`POST`,body:{pipelineId:r.indexId,chunkIds:n}}),c+=n.length}catch(e){throw c>0&&e instanceof t&&!e.hint?new t(e.message,e.exitCode,`${c} chunk(s) in earlier batches were already deleted.`,{cause:e,api:e.api,rawResponse:e.rawResponse}):e}if(!n.quiet){if(a===`text`){k(`deleted: ${c} chunk(s) in ${o.length} batch(es)`);return}A({deleted_count:c,batches:o.length},a)}}});const _l={indexId:{type:`string`,valueHint:`<id>`,description:`Knowledge base ID`,required:!0},start:{type:`string`,valueHint:`<time>`,description:`Range start: Unix seconds or ISO date, must be in the past (default: 24 hours ago)`},end:{type:`string`,valueHint:`<time>`,description:`Range end: Unix seconds or ISO date, must be in the past (default: now)`},...U};function vl(e){if(/^\d+$/.test(e))return e.length>=13?String(Math.floor(Number(e)/1e3)):e;let n=/^\d{4}-\d{2}-\d{2}([T ].*)?$/.test(e)?Date.parse(e):NaN;if(Number.isNaN(n))throw new t(`Invalid time value: ${e}`,s.USAGE,`Pass Unix seconds (e.g. 1780900000) or an ISO date (e.g. 2026-07-30T00:00:00Z).`);return String(Math.floor(n/1e3))}var yl=w({description:`Show knowledge base storage and QPS monitoring data`,auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:_l,notes:[`Defaults to the last 24 hours when --start/--end are omitted.`,`Timestamps are normalized to epoch seconds as required by the server.`,`Future timestamps are rejected for --start and clamped to now for --end, since the monitor API only returns past data.`],exampleArgs:[`--index-id idx-xxx --workspace-id ws-xxx`,`--index-id idx-xxx --start 2026-07-30 --end 2026-07-31`],async run(e){let{settings:n,flags:r}=e,i=W(e),a=T(n.output),o=Math.floor(Date.now()/1e3),c=r.start?vl(r.start):String(o-24*3600),l=r.end?vl(r.end):String(o);if(Number(c)>o)throw new t(`Start time is in the future; the monitor API only accepts past or current timestamps.`,s.USAGE,`Use a start date/time at or before now, or omit --start to default to 24 hours ago.`);let u=Number(l)>o;u&&(l=String(o));let d={indexId:r.indexId,startTimestamp:c,endTimestamp:l},p=E(i,f.indexMonitor);if(n.dryRun){A({endpoint:p,request:d},a);return}let m=await e.client.requestJson({path:p,method:`POST`,body:d});if(a!==`text`){A(m,a);return}u&&k(`note: end time was in the future, clamped to now.`);let h=m.data?.storageMonitorData,g=m.data?.qpsMonitorData;k(`plan: ${m.data?.pipelineCommercialType??`-`}`),k(`storage: ${h?.indexStorageUsage??`-`} / ${h?.indexStorageLimit??`-`}`),k(`peak qps: ${g?.peakQps??`-`}`),k(`qps windows: ${g?.monitorData?.length??0} data point(s)`)}}),bl=w({description:`List data-center categories`,auth:`apiKey`,usageArgs:`[flags]`,flags:{collectionId:{type:`string`,valueHint:`<id>`,description:`Filter by exact collection ID`},parentId:{type:`string`,valueHint:`<id>`,description:`List sub-categories of this exact parent category`},name:{type:`string`,valueHint:`<text>`,description:`Filter by category name (exact match, unlike the knowledge base list)`},nextToken:{type:`string`,valueHint:`<token>`,description:`Cursor for the next page (from previous output)`},maxResult:{type:`number`,valueHint:`<n>`,description:`Items per page (default: 20)`},...U},notes:[`Categories marked [default] are where files land when no category is specified.`,`Pagination is cursor-based: reuse the printed next token to continue.`],exampleArgs:[`--workspace-id ws-xxx`,`--name my-category`,`--next-token <token>`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={type:`UNSTRUCTURED`,...n.collectionId?{connectorId:n.collectionId}:{},...n.parentId?{parentId:n.parentId}:{},...n.name?{categoryName:n.name}:{},...n.nextToken?{nextToken:n.nextToken}:{},...n.maxResult===void 0?{}:{maxResult:n.maxResult}},o=E(r,f.listCategory);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=s.data?.categoryList??[];if(t.quiet){for(let e of c)k(e.categoryId??``);return}if(i===`text`){if(c.length===0)k(`No categories found.`);else for(let e of c){let t=e.isDefault?` [default]`:``;k(Js(`${e.categoryId} ${e.categoryName}${t}`))}let e=s.data?.nextToken;e&&k(`next: --next-token ${e}`)}else A(s,i)}}),xl=w({description:`Create a data-center category`,auth:`apiKey`,usageArgs:`--name <text> [flags]`,flags:{name:{type:`string`,valueHint:`<text>`,description:`Category name (1-20 chars)`,required:!0},parentId:{type:`string`,valueHint:`<id>`,description:`Create as a sub-category of this category`},collectionId:{type:`string`,valueHint:`<id>`,description:`Create under this collection (defaults to the platform collection)`},...U},notes:[`Use categories to organize data-center files by business domain.`],exampleArgs:[`--name product-docs --workspace-id ws-xxx`,`--name sub --parent-id cate-xxx`],validate(e){if(e.name.length<1||e.name.length>20)return`--name must be 1-20 characters`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={categoryName:n.name,categoryType:`UNSTRUCTURED`,...n.parentId?{parentCategoryId:n.parentId}:{},...n.collectionId?{connectorId:n.collectionId}:{}},o=E(r,f.addCategory);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=s.data?.categoryId;if(t.quiet){k(c??``);return}if(i===`text`){k(`created: ${c??`-`} (${n.name})`);return}A(s,i)}}),Sl=w({description:`Delete a data-center category`,auth:`apiKey`,usageArgs:`--category-id <id> [flags]`,flags:{categoryId:{type:`string`,valueHint:`<id>`,description:`Category ID to delete`,required:!0},yes:{type:`switch`,description:`Skip the confirmation prompt`},...U},notes:[`Behavior for categories containing files or sub-categories is server-defined — the server error is passed through as-is.`],exampleArgs:[`--category-id cate-xxx --workspace-id ws-xxx`,`--category-id cate-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={categoryId:n.categoryId},o=E(r,f.deleteCategory);if(t.dryRun){A({endpoint:o,request:a},i);return}await _n(`Delete category ${n.categoryId}\nThis cannot be undone.`,n.yes??!1);let s=await e.client.requestJson({path:o,method:`POST`,body:a});if(!t.quiet){if(i===`text`){k(`deleted: ${n.categoryId}`);return}A(s,i)}}}),Cl=w({description:`List files in a data-center category`,auth:`apiKey`,usageArgs:`--category-id <id> [flags]`,flags:{categoryId:{type:`string`,valueHint:`<id>`,description:`Category to list (find ids via the category list command); exact match`,required:!0},name:{type:`string`,valueHint:`<text>`,description:`Filter by exact file name without its extension (a.md → pass a)`},fileId:{type:`array`,valueHint:`<id>`,description:`Filter by exact file ID (repeatable)`},nextToken:{type:`string`,valueHint:`<token>`,description:`Cursor for the next page (from previous output)`},maxResult:{type:`number`,valueHint:`<n>`,description:`Items per page`},...U},notes:[`A real category id is required — the default value is not resolved here. Find the id via the category list command.`,`--name matches the exact file name without its extension (for a.md pass a); partial keywords return no results.`,`Pagination is cursor-based: reuse the printed next token to continue.`],exampleArgs:[`--category-id cate-xxx --workspace-id ws-xxx`,`--category-id cate-xxx --name report`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={categoryId:n.categoryId,...n.name?{fileName:n.name}:{},...n.fileId?.length?{fileIds:n.fileId}:{},...n.nextToken?{nextToken:n.nextToken}:{},...n.maxResult===void 0?{}:{maxResult:n.maxResult}},o=E(r,f.listFile);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=s.data?.fileList??[];if(t.quiet){for(let e of c)k(e.fileId??``);return}if(i===`text`){if(c.length===0)k(`No files found.`);else for(let e of c)k(Js([e.fileId,e.status??`-`,e.fileName,e.sizeBytes??`-`].join(` `)));let e=s.data?.nextToken;e&&k(`next: --next-token ${e}`)}else A(s,i)}}),wl=w({description:`Show data-center file details (size, MD5, tags, timestamps)`,auth:`apiKey`,usageArgs:`--file-id <id> [flags]`,flags:{fileId:{type:`string`,valueHint:`<id>`,description:`Data-center file ID`,required:!0},...U},exampleArgs:[`--file-id file-xxx --workspace-id ws-xxx`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={fileId:n.fileId},o=E(r,f.describeFile);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=s.data;if(t.quiet){k(c?.fileId??``);return}if(i!==`text`){A(s,i);return}k(`id: ${c?.fileId??`-`}`),k(`name: ${c?.fileName??`-`}`),k(`type: ${c?.fileType??`-`}`),k(`size: ${c?.sizeBytes??`-`}`),k(`status: ${c?.status??`-`}`),k(`parser: ${c?.parser??`-`}`),k(`category: ${c?.category??`-`}`),k(`uploaded: ${c?.uploadTime??`-`}`),k(`tags: ${(Array.isArray(c?.tags)?c.tags.join(`, `):c?.tags??`-`)||`-`}`)}});const Tl={fileId:{type:`string`,valueHint:`<id>`,description:`Data-center file ID to delete`,required:!0},yes:{type:`switch`,description:`Skip the confirmation prompt`},...U};async function El(e,t,n){let r=``;try{let i=await e.requestJson({path:E(t,f.describeFile),method:`POST`,body:{fileId:n}});i.data?.fileName&&(r=` name: ${i.data.fileName}`)}catch{}return`Delete data-center file ${n}${r}\nPERMANENT: if the file is referenced by knowledge bases, their document indexes break too. This differs from removing a document from one knowledge base.`}var Dl=w({description:`Permanently delete a file from the data center`,auth:`apiKey`,usageArgs:`--file-id <id> [flags]`,flags:Tl,notes:[`Irreversible. If knowledge bases reference this file, their related document indexes become invalid.`,`To remove a document from a single knowledge base only, use the document delete command instead.`],exampleArgs:[`--file-id file-xxx --workspace-id ws-xxx`,`--file-id file-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={fileId:n.fileId},o=E(r,f.deleteFile);if(t.dryRun){A({endpoint:o,request:a},i);return}await _n(n.yes?``:await El(e.client,r,n.fileId),n.yes??!1);let s=await e.client.requestJson({path:o,method:`POST`,body:a});if(!t.quiet){if(i===`text`){k(`deleted: ${n.fileId}`);return}A(s,i)}}}),Ol=w({description:`Create a FILE data collection`,auth:`apiKey`,usageArgs:`--name <text> --description <text> [flags]`,flags:{name:{type:`string`,valueHint:`<text>`,description:`Collection name`,required:!0},description:{type:`string`,valueHint:`<text>`,description:`Collection description (required by the server)`,required:!0},storeType:{type:`string`,valueHint:`<type>`,description:`Storage: platform (managed) or custom (your own OSS bucket)`},ossRegion:{type:`string`,valueHint:`<id>`,description:`OSS region id (required with --store-type custom)`},ossBucket:{type:`string`,valueHint:`<name>`,description:`OSS bucket name (required with --store-type custom)`},...U},notes:[`Store type defaults to platform (managed storage); custom uses your authorized OSS bucket.`,`Custom buckets must carry the bucket tag bailian-connector-access=ReadAndWrite (Bailian's tag-based access control); without it the server rejects creation with a misleading 'setBucketCORS failed' error.`,`There is no collection delete API — create collections deliberately.`],exampleArgs:[`--name my-collection --description 'team docs' --workspace-id ws-xxx`,`--name oss-coll --description 'own bucket' --store-type custom --oss-region cn-beijing --oss-bucket my-bucket`],validate(e){if(e.name.length<1||e.name.length>20)return`--name must be 1-20 characters`;let t=e.storeType??`platform`;if(t!==`platform`&&t!==`custom`)return`--store-type must be platform or custom`;if(t===`custom`&&(!e.ossRegion||!e.ossBucket))return`--store-type custom requires --oss-region and --oss-bucket`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a=(n.storeType??`platform`).toUpperCase(),o={connectorType:`FILE`,connectorName:n.name,description:n.description,fileConnectorConfig:{storeType:a,...a===`CUSTOM`?{regionId:n.ossRegion,bucketName:n.ossBucket}:{}}},s=E(r,f.addConnector);if(t.dryRun){A({endpoint:s,request:o},i);return}let c=await e.client.requestJson({path:s,method:`POST`,body:o}),l=c.data?.connectorId;if(t.quiet){k(l??``);return}if(i===`text`){k(`created: ${l??`-`} (${n.name}, ${a})`);return}A(c,i)}}),kl=w({description:`Show data collection details`,auth:`apiKey`,usageArgs:`(--collection-id <id> | --name <text>) [flags]`,flags:{collectionId:{type:`string`,valueHint:`<id>`,description:`Collection ID; alternative to --name`},name:{type:`string`,valueHint:`<text>`,description:`Collection name; alternative to --collection-id`},...U},exampleArgs:[`--collection-id conn-xxx --workspace-id ws-xxx`,`--name my-collection`],validate(e){if(!e.collectionId&&!e.name)return`Pass --collection-id or --name`;if(e.collectionId&&e.name)return`Use either --collection-id or --name, not both`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={...n.collectionId?{connectorId:n.collectionId}:{},...n.name?{connectorName:n.name}:{}},o=E(r,f.getConnector);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=s.data;if(t.quiet){k(c?.connectorId??``);return}if(i===`text`){k(`id: ${c?.connectorId??`-`}`),k(`name: ${c?.connectorName??`-`}`),k(`description: ${c?.description??`-`}`);return}A(s,i)}}),Al=w({description:`Batch import files from an authorized OSS bucket into the data center`,auth:`apiKey`,usageArgs:`--bucket <name> --region <id> --oss-key <key> [flags]`,flags:{bucket:{type:`string`,valueHint:`<name>`,description:`Authorized OSS bucket name`,required:!0},region:{type:`string`,valueHint:`<id>`,description:`OSS region id (e.g. cn-beijing)`,required:!0},ossKey:{type:`array`,valueHint:`<key>`,description:`OSS object key to import (repeatable, 1-10 per call)`,required:!0},categoryId:{type:`string`,valueHint:`<id>`,description:`Target data-center category (default: the default category)`},tag:{type:`array`,valueHint:`<text>`,description:`File tag applied to every imported file (repeatable, up to 10)`},overwrite:{type:`switch`,description:`Overwrite files previously imported from the same OSS keys`},...U},notes:[`The bucket must be authorized to the platform service role beforehand; permission errors from the server are passed through with a pointer to check AliyunServiceRoleForBailian in the RAM console.`,`File names are derived from the OSS key basename.`,`--overwrite replaces the previously imported file and issues a NEW fileId (the old one becomes invalid) — verified live.`],exampleArgs:[`--bucket my-bucket --region cn-beijing --oss-key docs/a.pdf --workspace-id ws-xxx`,`--bucket my-bucket --region cn-beijing --oss-key docs/a.pdf --oss-key docs/b.docx --overwrite`],validate(e){if(e.ossKey.length>10)return`--oss-key accepts at most 10 entries per call`;if(e.tag!==void 0&&e.tag.length>10)return`--tag accepts at most 10 entries`},async run(e){let{settings:t,flags:n}=e,r=W(e),i=T(t.output),a={categoryId:n.categoryId??`default`,categoryType:`UNSTRUCTURED`,ossBucket:n.bucket,ossRegionId:n.region,fileDetails:n.ossKey.map(e=>({fileName:F(e),ossKey:e})),...n.tag?.length?{tags:n.tag}:{},...n.overwrite?{overWriteFileByOssKey:!0}:{}},o=E(r,f.addFilesFromAuthorizedOss);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=s.data?.addFileResultList??[],l=c.map(e=>e.fileId).filter(e=>!!e);if(t.quiet){for(let e of l)k(e);return}if(i===`text`){k(`imported: ${l.length} file(s)`);for(let e of c)k(` ${e.fileId??`-`} ${e.status??`-`} ${e.ossKey??``}`);return}A(s,i)}});function jl(e){if(!(e instanceof t))return!1;let n=e.message;return/^MCP request failed:\s*404\b/i.test(n)?/未开通|MCP不存在|MCP_IS_INVALID/i.test(n):!1}function Ml(e){let t=[`Activate (or re-activate) the ${e} MCP in the Bailian MCP marketplace, then retry.`];return e===`WebSearch`&&t.push(`If it was previously on SSE, cancel and activate again to upgrade to Streamable HTTP.`),t.push(`Open: ${kn(e)}`),t.join(`
|
|
2658
|
+
`)}function Nl(e,n){throw!(e instanceof t)||e.hint?e:jl(e)||n===`WebSearch`&&Xe(e)?new t(e.message,e.exitCode,Ml(n),{cause:e,api:e.api,rawResponse:e.rawResponse}):e}const Pl={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 (non-Bailian). Tries Streamable HTTP first, then classic SSE on the same URL.`}};function Fl(e){let t=e.indexOf(`.`);if(t<=0||t===e.length-1)throw new _(`target must be <server-code>.<tool>, got "${e}".`);return{serverCode:e.slice(0,t),toolName:e.slice(t+1)}}function Il(e){let t={};for(let n of e){let e=n.indexOf(`=`);if(e<=0)throw new _(`--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 Ll(e){let t;try{t=JSON.parse(e)}catch(e){throw new _(`--json is not valid JSON — ${e.message}`)}if(!t||typeof t!=`object`||Array.isArray(t))throw new _(`--json must decode to an object.`);return t}function Rl(e){let t=e.json?Ll(e.json):{};return Object.assign(t,Il(e.arg??[])),e.query!==void 0&&(t.query=e.query),t}function zl(e){try{Fl(e.target),Rl(e)}catch(e){if(e instanceof _)return e.message;throw e}}var Bl=w({description:`Call a tool on an MCP server (tools/call)`,auth:`apiKey`,usageArgs:`--target <server.tool> [--arg k=v ...] [--json '{...}'] [--url <url>]`,flags:Pl,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:zl,async run(e){let{settings:n,flags:r}=e,{serverCode:i,toolName:a}=Fl(r.target),o=Rl(r),s=r.url||e.client.url(x(i)),c=T(n.output);if(n.dryRun){A({server:i,url:s,tool:a,arguments:o},c);return}let l;try{let n=await e.client.connectBailianMcp(i,r.url);l=n.client;let s=await n.client.callTool(a,o);if(s.isError)throw new t(`Tool error: ${s.content.map(e=>e.text||``).join(`
|
|
2659
|
+
`)}`);A(s,c)}catch(e){throw r.url||Nl(e,i),e}finally{l?.close?.()}}});const Vl=`zeldaEasy.broadscope-bailian.mcp-server.PageList`;var Hl=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,a=i.name||``,o=i.type||`OFFICIAL`,c=i.page||1,l=i.pageSize||30,u=T(n.output),d={reqDTO:{type:o,displayTools:!1,activated:1,pageNo:c,pageSize:l,serverName:a}};if(n.dryRun){A({api:Vl,data:d,...ve(n)},u);return}let f=(await e.client.console(Vl,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}`,s.AUTH,i)}let p=(f.DataV2??{}).data?.data??{},m=p.mcpServerDetailList??[];A({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)}}),Ul=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 (non-Bailian). Tries Streamable HTTP first, then classic SSE on the same URL.`}},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(x(r)),a=T(t.output);if(t.dryRun){A({server:r,url:i,action:`tools/list`},a);return}let o;try{let t=await e.client.connectBailianMcp(r,n.url);o=t.client;let i=await t.client.listTools();A({server:r,url:t.url,tools:i},a)}catch(e){throw n.url||Nl(e,r),e}finally{o?.close?.()}}});function Wl(e){Nl(e,`WebSearch`)}var Gl=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){A({endpoint:e.client.url(pt()),action:`tools/list`},i);return}try{let t=e.client.mcp(pt());await t.initialize(),A({tools:await t.listTools()},i)}catch(e){Wl(e)}return}let a=r.query;if(n.dryRun){A({endpoint:e.client.url(pt()),action:`tools/call`,tool:`bailian_web_search`,arguments:{query:a,count:r.count||void 0}},i);return}let o=e.client.mcp(pt()),s=vn(`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(`
|
|
2660
|
+
`)}`);if(n.quiet||s.stop(`Done.`),i===`json`)A(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)?A({pages:t.pages,total:t.pages.length},i):A(t,i)}catch{A({text:e.text},i)}}catch(e){s.stop(`Failed.`),Wl(e)}}});const Kl=`${o.cn}/cosyvoice-clone-design-api`,ql=[{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:`印尼语`}],Jl={"cosyvoice-v3-flash":ql,"cosyvoice-v3-plus":ql,"cosyvoice-v3.5-flash":[],"cosyvoice-v3.5-plus":[],"cosyvoice-v2":[]};function Yl(e){let t=Jl[e];if(!t){process.stdout.write(`No built-in voice list available for model: ${e}\n`),process.stdout.write(`Browse voices in the console: ${mn}\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.
|
|
2661
|
+
`),process.stdout.write(`See: ${Kl}\n`),process.stdout.write(`Browse voices in the console: ${mn}\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${mn}\n`)}var Xl=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: ${mn})`}},async run(e){let{settings:n,flags:r}=e,i=r.model||n.defaultSpeechModel||`cosyvoice-v3-flash`;if(r.listVoices){Yl(i);return}let a=r.text||``;if(!a&&r.textFile){let e=r.textFile;try{a=Jn(e,`utf-8`).trim()}catch{throw new t(`Cannot read text file: ${e}`,s.USAGE)}}let o=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:a,voice:o,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(Xt(y.input),n.dryRun){A({request:y},v);return}n.quiet||process.stderr.write(`[Model: ${i}] [Voice: ${o}]\n`),_?await Ql(e.client,n,y,r,v):await Zl(e.client,n,y,r,v)}});async function Zl(e,n,r,i,a){let o=await In(En(i),n,()=>e.requestJson({path:qt(),method:`POST`,body:r})),c=o.map(e=>e.output?.audio?.url).filter(Boolean);if(c.length===0)throw new t(`API returned no audio URL.`,s.GENERAL);let l=await import(`path`),u=Vt(n,{subDir:`speech`}),d=await xn(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}}),bn,{quiet:n.quiet});if(n.quiet)k(d.join(`
|
|
2662
|
+
`));else if(d.length===1){let e=o[0].output?.audio?.expires_at;A({saved:d[0],audio_url:c[0],model:r.model,voice:r.input.voice,...e?{url_expires_at:e}:{}},a)}else A({saved:d,audio_urls:c,total:d.length,model:r.model,voice:r.input.voice},a)}async function Ql(e,t,n,r,i){let a=await e.request({path:qt(),method:`POST`,body:n,stream:!0,headers:{Accept:`text/event-stream`,"X-DashScope-SSE":`enable`}}),o=r.out,s=o?Gn(o):null,c;try{for await(let e of wt(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&&A({saved:o,...c?{audio_url:c}:{},model:n.model,voice:n.input.voice},i)}const $l={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). Async: fun-asr / *-filetrans / paraformer-*; sync: qwen3-asr-flash* / fun-asr-flash* / qwen-audio-*-asr-flash`},language:{type:`string`,valueHint:`<lang>`,description:`Language hint (e.g. zh, en, ja). Classic async/input-audio: language_hints; qwen3-filetrans: language; qwen3 sync: asr_options.language`},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)`}};function eu(e,n,r){let i=[];if(e.diarization===!0&&i.push(`--diarization`),e.speakerCount!==void 0&&i.push(`--speaker-count`),r===`qwen3`&&e.vocabularyId!==void 0&&i.push(`--vocabulary-id`),e.channelId!==void 0&&i.push(`--channel-id`),e.async===!0&&i.push(`--async`),e.pollInterval!==void 0&&i.push(`--poll-interval`),i.length>0)throw new t(`Model "${n}" uses sync Flash ASR and does not support: ${i.join(`, `)}.\nHint: Use an async filetrans model (e.g. fun-asr, qwen3-asr-flash-filetrans) for those flags.`,s.USAGE)}var tu=w({description:`Recognize speech from audio files (FunAudio-ASR / Qwen-ASR Flash)`,auth:`apiKey`,usageArgs:`--url <audio-url> [flags]`,flags:$l,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`,`--url https://example.com/audio.mp3 --model qwen-audio-3.0-asr-flash --language en`],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 a=r.speakerCount,o=r.diarization===!0;if(a!==void 0&&!o)throw new t(`--speaker-count requires --diarization to be enabled.
|
|
2663
|
+
Hint: Add --diarization flag to enable speaker separation.`,s.USAGE);let c=r.model||`fun-asr`,l=Lt(c);if(l.kind===`unsupported`)throw new t(l.unsupportedReason??`Unsupported ASR model: ${c}`,s.USAGE);if(l.kind===`sync-flash`&&(eu(r,c,l.flashFamily),i.length!==1))throw new t(`Model "${c}" is a sync Flash ASR model and accepts exactly one --url (got ${i.length}).\nHint: Pass a single audio URL, or use an async filetrans model for batch files.`,s.USAGE);if(l.kind===`async-filetrans`&&l.asyncInputStyle===`file_url`&&i.length!==1)throw new t(`Model "${c}" accepts exactly one --url (got ${i.length}).\nHint: qwen3-asr-flash-filetrans* requires a single file_url.`,s.USAGE);let u=T(n.output),d=await Promise.all(i.map(t=>e.client.uploadFile(t,c)));if(l.kind===`sync-flash`){await nu(e.client,n,r,u,c,l,d[0]);return}let f=r.channelId,p=r.vocabularyId,m=ee(l.asyncLanguageStyle??`language_hints`,r.language),h={model:c,input:l.asyncInputStyle===`file_url`?{file_url:d[0]}:{file_urls:d},parameters:{channel_id:f===void 0?[0]:[f],...m,diarization_enabled:o?!0:void 0,speaker_count:a,vocabulary_id:p}};if(Xt(h.parameters),n.dryRun){A({request:h,mode:`async`,path:Kt()},u);return}n.quiet||process.stderr.write(`[Model: ${c}] [Mode: async] [Files: ${d.length}]\n`),await ru(e.client,n,h,r,u,d.length)}});async function nu(e,t,n,r,i,a,o){let s=a.flashFamily,c=C({model:i,audioUrl:o,language:n.language,vocabularyId:n.vocabularyId,flashFamily:s});if(t.dryRun){A({request:c,mode:`sync`,path:a.path},r);return}t.quiet||process.stderr.write(`[Model: ${i}] [Mode: sync] [Files: 1]\n`);let l=await e.requestJson({path:a.path,method:`POST`,headers:{"X-DashScope-SSE":`disable`},body:c}),u=Se(l,s);u?process.stdout.write(u.endsWith(`
|
|
2664
|
+
`)?u:`${u}\n`):k(JSON.stringify(l)),n.out&&(Zn(n.out,JSON.stringify(l,null,2)+`
|
|
2665
|
+
`),t.quiet||process.stderr.write(`Full result saved to: ${n.out}\n`))}async function ru(e,n,r,i,a,o){let c=(await e.requestJson({path:Kt(),method:`POST`,body:r,async:!0})).output.task_id;if(i.async){A({task_id:c},a);return}let l=i.pollInterval??2,u=await Mn(e,n,{url:e.url(Zt(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=ae(u.output);if(d.length===0){A({task_id:c,status:u.output.task_status},a);return}let f=[];for(let e=0;e<d.length;e++){let n=d[e],r=o>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(`
|
|
2661
2666
|
`);continue}if(!n.transcription_url){r&&process.stdout.write(`
|
|
2662
2667
|
`);continue}let i=await fetch(n.transcription_url);if(!i.ok)throw new t(`Failed to download transcription: HTTP ${i.status}`,s.GENERAL);let a=await i.json();f.push(a);let c=a.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+`
|
|
2663
|
-
`);else
|
|
2664
|
-
`)}if(i.out){let e=i.out,t=f.length===1?f[0]:f;
|
|
2665
|
-
`),n.quiet||process.stderr.write(`Full result saved to: ${e}\n`)}}var
|
|
2666
|
-
`);let a=[`Model`,`Type`,`Remaining`,`Total`,`Quota Left`,`Auto-Stop`],o=[],s=[],c=a.length-1,l=
|
|
2668
|
+
`);else k(JSON.stringify(a));r&&process.stdout.write(`
|
|
2669
|
+
`)}if(i.out){let e=i.out,t=f.length===1?f[0]:f;Zn(e,JSON.stringify(t,null,2)+`
|
|
2670
|
+
`),n.quiet||process.stderr.write(`Full result saved to: ${e}\n`)}}var iu=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-3.0`],async run(e){let{settings:t,flags:n}=e,r=n.file,i=n.model,a=T(t.output);if(t.dryRun){A({action:`upload`,file:r,model:i},a);return}let o=await e.client.uploadFile(r,i);t.quiet?k(o):A({url:o,model:i,expires_in:`48 hours`,note:`When using this URL in API calls, add header: X-DashScope-OssResourceResolve: enable`},a)}}),au=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.bailian-commerce.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 _(`--data must be valid JSON`)}let o=T(t.output);if(t.dryRun){A({api:r,data:a,...ve(t)},o);return}A(await e.client.console(r,a),o)}});function q(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 ou(e){let t=new Date(e),n=String(t.getHours()).padStart(2,`0`),r=String(t.getMinutes()).padStart(2,`0`),i=String(t.getSeconds()).padStart(2,`0`);return`${J(e)} ${n}:${r}:${i}`}function su(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>\`.`,s.GENERAL,`Run \`${n} workspace list\` to view available workspaces.`)}function cu(e){return en(e)}const lu={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 uu(e){for(let t of e){let e=lu[t];if(e)return e}return`-`}async function du(e){return(await De((t,n)=>e.console(t,n))).filter(e=>typeof e.model==`string`&&e.model).map(e=>({name:e.model,type:uu(e.capabilities||[])}))}const fu=`zeldaEasy.bailian-commerce.freeTrial.queryFreeTierQuota`,pu=`zeldaEasy.bailian-commerce.freeTrial.queryFreeTierOnlyStatus`;function mu(e,t){let n=e.data;if(!n)return[];let r=n.DataV2;return r?r.data?.data?.[t]||[]:n.data?.[t]||[]}function hu(e){return mu(e,`freeTierQuotas`)}function gu(e){return mu(e,`freeTierOnlyStatuses`)}function _u(e){return vu(e)||e.quotaInitTotal==null||e.quotaInitTotal<=0?null:Math.round(e.quotaTotal/e.quotaInitTotal*1e3)/10}function vu(e){return e.quotaValidityPeriod>0&&e.quotaValidityPeriod<Date.now()}function yu(e){let{quotas:t,stopMap:n,typeMap:r}=e,i=O(process.stdout);e.title&&process.stdout.write(i.purple(e.title)+`
|
|
2671
|
+
`);let a=[`Model`,`Type`,`Remaining`,`Total`,`Quota Left`,`Auto-Stop`],o=[],s=[],c=a.length-1,l=Nn({headers:a,rows:t.map(e=>{let t=e.quotaInitTotal!=null&&e.quotaTotal!=null,i=vu(e),a=t?`${q(e.quotaTotal)}${i?` (expired)`:``}`:`-`,c=t?q(e.quotaInitTotal):`-`,l=_u(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+`
|
|
2667
2672
|
`);e.moreHint&&process.stdout.write(i.dim(e.moreHint)+`
|
|
2668
|
-
`)}const
|
|
2669
|
-
`);return}let y=!i&&!s?h.slice(0,15):h,b=h.length-y.length,x=g===`remaining`?` · sorted by urgency`:``;
|
|
2670
|
-
`);return}let a=new Set,o=e.map(e=>{let t=
|
|
2673
|
+
`)}const bu=`zeldaEasy.bailian-telemetry.model.getModelUsageStatistic`,xu=`zeldaEasy.bailian-telemetry.model.listModelUsageStatisticData`;async function Su(e,t,n,r=30){let i;for(let a=0;a<r;a++){let r=await e.console(t,n(i)),a=en(r);if(a.taskId&&Object.keys(a).length===1){i=a.taskId,await new Promise(e=>setTimeout(e,500));continue}return r}return null}async function Cu(e,t,n){return Su(e,t,e=>e?{reqDTO:{...n,asyncTaskId:e}}:{reqDTO:n})}async function wu(e,t,n,r){return Su(e,t,e=>({[n]:e?{taskId:e}:{models:r}}),20)}function Tu(e){let t=cu(e);if(t.callSuccessCount!==void 0||t.usages!==void 0)return t}function Eu(e){let t=cu(e);return{list:t.list??[],totalCount:t.totalCount??0,maxResults:t.maxResults??0}}function Du(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 Ou={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 ku(e){let t=Ou[e];if(!t)return e;let n=t.unit?` [${t.unit}]`:``;return`${t.en}${n}`}function Au(e,t,n,r,i=`Usage Overview`){let a=O(process.stdout);process.stdout.write(`${a.purple(i)} ${a.dim(`·`)} ${J(t)} ~ ${J(n)} ${a.dim(`(${r} days)`)}\n`);let o=[[`Models Called`,q(e.modelCount??0)],[`Successful Calls`,q(e.callSuccessCount??0)]];for(let t of e.usages??[])o.push([ku(t.key),q(t.value)]);let s=Math.max(...o.map(([e])=>yn(e)));for(let[e,t]of o)process.stdout.write(`${a.bold(M(e,s+2))}${t}\n`)}var ju=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){A({api:fu,data:d},c);return}if(i){let t=await Promise.all(l.map(t=>Me((t,n)=>e.client.console(t,n),t)));for(let e=0;e<l.length;e++){let n=t[e];n&&u.set(l[e],uu(n.capabilities||[]))}}else{let t=await du(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(fu,d),e.client.console(pu,{queryFreeTierOnlyStatusRequest:{models:l}})]),m=hu(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 _=gu(p),v=new Map(_.map(e=>[e.model,e.freeTierOnly]));if(c===`json`){A(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:_u(e),expires:e.quotaValidityPeriod?J(e.quotaValidityPeriod):null,autoStop:i}}),c);return}if(h.length===0){process.stdout.write(`No free-tier quota found.
|
|
2674
|
+
`);return}let y=!i&&!s?h.slice(0,15):h,b=h.length-y.length,x=g===`remaining`?` · sorted by urgency`:``;yu({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})}}),Mu=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.bailian-commerce.freeTrial.batchDeactivateFreeTierOnly`:`zeldaEasy.bailian-commerce.freeTrial.batchActivateFreeTierOnly`,c=i?`BatchDeactivateFreeTierOnlyRequest`:`BatchActivateFreeTierOnlyRequest`;if(t.dryRun){A({api:s,data:{[c]:{models:o}}},a);return}if(r||(o=(await du(e.client)).map(e=>e.name)),i){let[t,n]=await Promise.all([e.client.console(fu,{queryFreeTierQuotaRequest:{models:o}}),e.client.console(pu,{queryFreeTierOnlyStatusRequest:{models:o}})]),r=hu(t),i=new Map(r.map(e=>[e.model,e])),a=gu(n),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 wu(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 wu(e.client,s,c,[t]);if(a===`json`){l.push(n);continue}if(n){let e=en(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`&&A(l,a)}});function Nu(e){let t=e.unit?` [${e.unit}]`:``;return`${e.en}${t}`}function Pu(e,t,n,r){let i=O(process.stdout);process.stdout.write(`${i.dim(`Time Range Period:`)} ${J(t)} ~ ${J(n)} ${i.dim(`(${r} days)`)}\n\n`);let a=[[`Models Called`,q(e.modelCount??0)],[`Successful Calls`,q(e.callSuccessCount??0)]];for(let t of e.usages??[]){let e=Ou[t.key],n=e?Nu(e):t.key;a.push([n,q(t.value)])}let o=Math.max(...a.map(([e])=>yn(e)));for(let[e,t]of a)process.stdout.write(`${i.bold(M(e,o+2))}${t}\n`)}function Fu(e,t,n,r){let i=O(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.
|
|
2675
|
+
`);return}let a=new Set,o=e.map(e=>{let t=Du(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=>Ou[e]?.en??e)],l=e.map((e,t)=>[e.model,q(e.callSuccessCount??0),...s.map(e=>{let n=o[t][e];return n==null?`-`:q(n)})]),u=c.map((e,t)=>Math.max(yn(e),...l.map(e=>yn(e[t])))),d=c.map((e,t)=>i.bold(M(e,u[t]))).join(` `),f=u.map(e=>i.dim(`─`.repeat(e))).join(`──`);process.stdout.write(d+`
|
|
2671
2676
|
`),process.stdout.write(f+`
|
|
2672
|
-
`);for(let e of l){let t=e.map((e,t)=>
|
|
2677
|
+
`);for(let e of l){let t=e.map((e,t)=>M(e,u[t]));process.stdout.write(t.join(` `)+`
|
|
2673
2678
|
`)}process.stdout.write(i.dim(`\nTotal: ${e.length} models`)+`
|
|
2674
|
-
`)}var
|
|
2675
|
-
`);return}
|
|
2676
|
-
`);else{let e=g.slice(0,10),t=g.length-e.length;
|
|
2677
|
-
`),c?y?
|
|
2679
|
+
`)}var Iu=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,a=i.model||void 0,o=Number(i.days)||7,c=i.type||void 0,l=T(r.output),u=su(r,n.binName),d=Date.now(),f=d-o*24*60*60*1e3;if(a){let t=[...new Set(a.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){A({api:xu,data:{reqDTO:{...n,model:t.join(`,`)}}},l);return}let i=await Promise.all(t.map(t=>Cu(e.client,xu,{...n,model:t}))),s=[];for(let e of i){if(!e)continue;let t=Eu(e);s.push(...t.list)}if(l===`json`){let e=s.map(e=>{let t=Du(e),n={model:e.model,successfulCalls:e.callSuccessCount??0};for(let[e,r]of Object.entries(t))n[e]=r;return n});A({period:{start:J(f),end:J(d),days:o},items:e},l);return}Fu(s,f,d,o)}else{let n={startTime:f,endTime:d,modelCallSource:`Online`,filterWorkspaceId:u};if(c&&(n.obsModelType=c),r.dryRun){A({api:bu,data:{reqDTO:n}},l);return}let i=await Cu(e.client,bu,n);if(!i)throw new t(`Request timed out.`,s.TIMEOUT);let a=Tu(i);if(l===`json`){if(!a){A({period:{start:J(f),end:J(d),days:o},modelsCalled:0,successfulCalls:0},l);return}A({period:{start:J(f),end:J(d),days:o},modelsCalled:a.modelCount??0,successfulCalls:a.callSuccessCount??0,usages:(a.usages??[]).map(e=>({key:e.key,value:e.value,unit:e.unit,label:Ou[e.key]?.en??e.key}))},l);return}if(!a){process.stdout.write(`No usage data found.
|
|
2680
|
+
`);return}Pu(a,f,d,o)}}}),Lu=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,a=Number(i.days)||7,o=T(r.output),c=r.workspaceId,l=Date.now(),u=l-a*24*60*60*1e3;if(r.dryRun){A({freeTier:{api:fu},usage:c?{api:bu,data:{reqDTO:{startTime:u,endTime:l,modelCallSource:`Online`,filterWorkspaceId:c}}}:null},o);return}let d=await du(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(fu,{queryFreeTierQuotaRequest:{models:f}}),e.client.console(pu,{queryFreeTierOnlyStatusRequest:{models:f}})]),g=hu(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)),_=gu(h),v=new Map(_.map(e=>[e.model,e.freeTierOnly])),y;if(c){let n=await Cu(e.client,bu,{startTime:u,endTime:l,modelCallSource:`Online`,filterWorkspaceId:c});if(!n)throw new t(`Request timed out.`,s.TIMEOUT);y=Tu(n)}if(o===`json`){let e=g.map(e=>({model:e.model,type:p.get(e.model)||null,remaining:e.quotaTotal,total:e.quotaInitTotal,remainingPercent:_u(e),expires:e.quotaValidityPeriod?J(e.quotaValidityPeriod):null}));A({period:{start:J(u),end:J(l),days:a},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:Ou[e.key]?.en??e.key}))}:null},o);return}let b=O(process.stdout);if(process.stdout.write(`${b.bold(`Usage Summary`)} ${b.dim(`·`)} ${J(l)}\n\n`),g.length===0)process.stdout.write(b.dim(`No active free-tier quota.`)+`
|
|
2681
|
+
`);else{let e=g.slice(0,10),t=g.length-e.length;yu({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(`
|
|
2682
|
+
`),c?y?Au(y,u,l,a):process.stdout.write(b.dim(`No usage data in this period.`)+`
|
|
2678
2683
|
`):process.stdout.write(b.dim(`Usage overview skipped · set --workspace-id or \`${n.binName} config set workspace_id <id>\` to include it.`)+`
|
|
2679
|
-
`)}});function
|
|
2680
|
-
`);return}
|
|
2681
|
-
`);return}let l=await
|
|
2684
|
+
`)}});function Ru(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function zu(e){let t=Math.round(e*1e3)/10;return`${Number.isInteger(t)?t:t.toFixed(1)}%`}function Bu(e,t){let n=Math.max(0,e-t),r=Math.floor(n/6e4);if(r===0)return`now`;let i=Math.floor(r/1440),a=Math.floor(r%1440/60),o=r%60,s=[];return i>0&&s.push(`${i}d`),a>0&&s.push(`${a}h`),(o>0||s.length===0)&&s.push(`${o}m`),s.join(` `)}function Vu(e,t,n){let r=O(process.stdout),i=(e=``,t)=>{let n=Math.max(0,76-yn(` ${e}`));process.stdout.write(`│ ${t?t(e):e}${` `.repeat(n)}│\n`)},a=e=>{let t=Math.max(0,76-yn(` ${e.plain}`));process.stdout.write(`│ ${e.colored}${` `.repeat(t)}│\n`)},o=e=>{if(i(e.label,r.bold),e.percentage===void 0){i(e.emptyMessage,r.dim);return}let t=`${zu(e.percentage)} used`;if(a(Pn(e.percentage*100,t)),e.detail&&i(e.detail,r.dim),e.resetTime===void 0){i(`Resets: not applicable (no usage yet)`,r.dim);return}i(`Resets: ${ou(e.resetTime)} (in ${Bu(e.resetTime,n)})`,r.dim)};process.stdout.write(`┌${`─`.repeat(76)}┐\n`),i(e,r.cyan),i(`Generated at: ${ou(n)} (local time)`,r.dim);for(let e of t)process.stdout.write(`├${`─`.repeat(76)}┤\n`),o(e);process.stdout.write(`└${`─`.repeat(76)}┘\n`)}const Hu=`zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/usage`;function Uu(e){let t=en(e),n={},r=Ru(t.per5HourPercentage);r!==void 0&&(n.per5HourPercentage=r);let i=Ru(t.per5HourResetTime);i!==void 0&&(n.per5HourResetTime=i);let a=Ru(t.per1WeekPercentage);a!==void 0&&(n.per1WeekPercentage=a);let o=Ru(t.per1WeekResetTime);return o!==void 0&&(n.per1WeekResetTime=o),n}function Wu(e,t){Vu(`Token Plan Usage`,[{label:`5-hour quota`,emptyMessage:`The 5-hour limit may be unlimited; verify in the Bailian Token Plan console.`,percentage:e.per5HourPercentage,resetTime:e.per5HourResetTime},{label:`1-week quota`,emptyMessage:`The 1-week limit may be unlimited; verify in the Bailian Token Plan console.`,percentage:e.per1WeekPercentage,resetTime:e.per1WeekResetTime}],t)}var Gu=w({description:`Show Token Plan quota usage`,auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],async run(e){let{settings:t}=e,n=T(t.output);if(t.dryRun){A({api:Hu,data:{}},n);return}let r=Uu(await e.client.console(Hu,{}));if(n===`json`){A(r,n);return}Wu(r,Date.now())}});const Ku=`zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2`,qu={domestic:`sfm_codingplan_public_cn`,international:`sfm_codingplan_public_intl`};function Ju(e,t){let n={};if(!e)return n;let r=Ru(e[`${t}UsedQuota`]);r!==void 0&&(n.usedQuota=r);let i=Ru(e[`${t}TotalQuota`]);i!==void 0&&(n.totalQuota=i);let a=Ru(e[`${t}QuotaNextRefreshTime`]);return a!==void 0&&(n.resetTime=a),r!==void 0&&i!==void 0&&i>0&&(n.percentage=r/i),n}function Yu(e){let t=en(e),n=(Array.isArray(t.codingPlanInstanceInfos)?t.codingPlanInstanceInfos:[]).find(e=>e.status===`VALID`);if(!n)return;let r=n.codingPlanQuotaInfo,i={per5Hour:Ju(r,`per5Hour`),perWeek:Ju(r,`perWeek`),perBillMonth:Ju(r,`perBillMonth`)};return typeof n.instanceType==`string`&&n.instanceType&&(i.instanceType=n.instanceType),i}function Xu(e,t){let n={label:e,emptyMessage:`No quota data for this window; verify in the Bailian Coding Plan console.`,percentage:t.percentage,resetTime:t.resetTime};return t.usedQuota!==void 0&&t.totalQuota!==void 0&&(n.detail=`Used: ${q(t.usedQuota)} / ${q(t.totalQuota)}`),n}function Zu(e,t){Vu(`Coding Plan Usage${e.instanceType?` (${e.instanceType})`:``}`,[Xu(`5-hour quota`,e.per5Hour),Xu(`1-week quota`,e.perWeek),Xu(`Monthly quota`,e.perBillMonth)],t)}var Qu=w({description:`Show Coding Plan quota usage`,auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],async run(e){let{settings:t}=e,n=T(t.output),r={queryCodingPlanInstanceInfoRequest:{commodityCode:qu[t.consoleSite??`domestic`],onlyLatestOne:!0}};if(t.dryRun){A({api:Ku,data:r},n);return}let i=Yu(await e.client.console(Ku,r));if(n===`json`){A(i??{},n);return}if(!i){process.stdout.write(`No active Coding Plan subscription found.
|
|
2685
|
+
`);return}Zu(i,Date.now())}});async function $u(e){let t=await xr(e,`utf-8`).catch(e=>{throw new _(`cannot read pipeline file: ${e.message}`)}),n=lr(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 ed=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;Dn();let i=n.events,a=dr(r),o=await $u(a),s=await td(n),c=cr(a);if(i===`jsonl`){for await(let e of Ln(o,s,{concurrency:n.concurrency,basePath:c,dryRun:t.dryRun,timeoutSeconds:n.stepTimeout}))process.stdout.write(JSON.stringify(e)+`
|
|
2686
|
+
`);return}let l=await Sn(o,s,{concurrency:n.concurrency,basePath:c,dryRun:t.dryRun,timeoutSeconds:n.stepTimeout,onEvent:t.verbose?nd:void 0});t.output===`json`?A(l,`json`):id(l),l.status===`failed`&&(process.exitCode=1)}});async function td(e){let t=e.input,n=e.inputFile;if(t)return JSON.parse(t);if(n){let e=await xr(dr(n),`utf-8`);return JSON.parse(e)}return{}}function nd(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} ${rd(e.step)}\n`):process.stderr.write(`${t}\n`)}function rd(e){return`${e.index!==void 0&&e.total!==void 0?`${e.index}/${e.total} `:``}${e.id} (${e.type})`}function id(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+`
|
|
2682
2687
|
`)}process.stdout.write(`
|
|
2683
|
-
`)}var
|
|
2688
|
+
`)}var ad=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;Dn();let i=await $u(dr(r)),a=gn(i),o=a.length===0?hn(i):[];if(t.output===`json`)A({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.
|
|
2684
2689
|
`);for(let e of o)process.stderr.write(` hint: ${e}\n`)}else{process.stderr.write(`Pipeline validation failed:
|
|
2685
|
-
`);for(let e of a)process.stderr.write(` - ${e}\n`);process.exitCode=1}}});function
|
|
2686
|
-
`),{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
|
|
2687
|
-
`),{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
|
|
2688
|
-
`)}function
|
|
2690
|
+
`);for(let e of a)process.stderr.write(` - ${e}\n`);process.exitCode=1}}});function od(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 sd={Text:`Text`,Image:`Image`,Video:`Video`,Audio:`Audio`},cd={TG:`Text Gen`,VU:`Vision`,IG:`Image Gen`,VG:`Video Gen`,TTS:`Text-to-Speech`,ASR:`Speech-to-Text`,Reasoning:`Reasoning`},ld={low:`Cost-Effective`,medium:`Balanced`,high:`High Investment`},ud={flagship:`Flagship`,balanced:`Balanced`,"cost-optimized":`Value`},dd={scoped:`Scoped`,comparison:`Comparison`,alternative:`Alternative`};function fd(e){return Rn(e)?wr:new Tr({level:0})}function pd(e){let t=fd(process.stdout),n=Rn(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=>sd[e]??e),a=e.outputModality.map(e=>sd[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=>cd[e]??e);o.length&&r.push(`${t.dim(`Capabilities`)} ${o.join(`, `)}`);let s=ld[e.budget]??e.budget,c=ud[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=dd[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=>sd[e]??e).join(`, `);r.push(` ${t.dim(`${n+1}.`)} ${i.step}${e?t.dim(` → ${e}`):``}`)}}return Cr(r.join(`
|
|
2691
|
+
`),{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 md=[`Best Pick`,`Runner-Up`,`Alternative`];function hd(e,t,n,r){let i=[n.green.bold,n.blue.bold,n.magenta.bold][t]??n.white.bold,a=md[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 ${od(e.contextWindow)}`),e.maxOutputTokens&&s.push(`Max Output ${od(e.maxOutputTokens)}`),s.length&&(o.push(``),o.push(n.dim(s.join(` · `))));let c=te(e.docUrl);return c&&(o.push(``),o.push(n.dim(`Docs ${c}`))),Cr(o.join(`
|
|
2692
|
+
`),{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 gd(e){let t=fd(process.stdout),n=Rn(process.stdout);return e.map((e,r)=>hd(e,r,t,n)).join(`
|
|
2693
|
+
`)}function _d(e,t){let n=fd(process.stdout),r=Rn(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)=>hd(e,t,n,r)).join(`
|
|
2689
2694
|
`))}return i.join(`
|
|
2690
|
-
`)}function
|
|
2691
|
-
`),a.update(`Agent: Recalling candidates...`),a.start();let
|
|
2695
|
+
`)}function vd(e){return e.type===`pipeline`?_d(e.summary,e.steps):gd(e.recommendations)}function yd(e){return e.type===`pipeline`?e.steps.length===0:e.recommendations.length===0}var bd=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;await ft();let i=t.outputExplicit?T(t.output):`json`,a=vn(`Agent: Loading model data & analyzing intent...`);a.start();let o={onPrepareStart:()=>{}},s=!1,c=!1,l=He(t,o).then(e=>(s=!0,c||a.update(`Agent: Model data loaded, analyzing intent...`),e)),u=v(e.client,r).then(e=>(c=!0,s||a.update(`Agent: Intent analyzed, loading model data...`),e)),[d,f]=await Promise.all([l,u]);a.stop(),f.confidence===0&&process.stderr.write(`Intent analysis timed out, using defaults...
|
|
2696
|
+
`),a.update(`Agent: Recalling candidates...`),a.start();let p=await Nt(e.client,d,r,m,f);if(a.stop(),t.dryRun){A({userInput:r,intent:{taskSummary:f.taskSummary,scenarioHints:f.scenarioHints,complexity:f.complexity,inputModality:f.inputModality,outputModality:f.outputModality,requiredCapabilities:f.requiredCapabilities,budget:f.budget,qualityPreference:f.qualityPreference,modelPreference:f.modelPreference?.mode===`unconstrained`?void 0:f.modelPreference,segments:f.segments,semanticQuery:f.semanticQuery},candidateCount:p.length,candidates:p.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 h=await kt(e.client,p,f,r,3);if(a.stop(),yd(h)){k(`No suitable models found for this request.`);return}if(i!==`text`){A({intent:{taskSummary:f.taskSummary,scenarioHints:f.scenarioHints,complexity:f.complexity,inputModality:f.inputModality,outputModality:f.outputModality,requiredCapabilities:f.requiredCapabilities,budget:f.budget,qualityPreference:f.qualityPreference,modelPreference:f.modelPreference?.mode===`unconstrained`?void 0:f.modelPreference,segments:f.segments,semanticQuery:f.semanticQuery},result:h,candidates:p.length},i);return}k(pd(f)),k(``),k(vd(h))}});const xd=/-\d{4}-\d{2}-\d{2}$/,Sd={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 Cd(e){return(e.model??``).replace(/^group-/,``)||e.name||`unknown`}function wd(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 Td(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?wd([a]):void 0,prices:o}}function Ed(e){if(e.length===0)return[];let t=e.filter(e=>!xd.test(e.model??``));return t.length>0?t:[...e].sort((e,t)=>String(t.model).localeCompare(String(e.model))).slice(0,1)}function Dd(e,t){if(e.length===0){k(`No model families found.`);return}let n=[`NAME`,`PROVIDER`,`CAPABILITIES`,`MODELS`,`MAX_CONTEXT`,`PRICE`],r=e.map(e=>{let t=Td(e);return[e.name||Cd(e),t.providers||`-`,t.capabilities||`-`,String(t.modelCount),t.maxContext?String(t.maxContext):`-`,t.price??`-`]});for(let e of j(n,r))k(e);k(`\nTotal: ${t}`)}function Od(e,t){return{items:e.map(e=>{let t=Td(e),n=e.items?.[0];return{model:Cd(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 kd(e,t){let n=e.items??[],r=Ed(n),i=n.length-r.length;k(e.name??e.model),e.description&&k(` ${e.description}`),e.updateAt&&k(` Updated: ${e.updateAt}`),k(``);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??`-`,wd(e.prices)]);for(let e of j(a,o))k(e);k(`\nTotal: ${n.length} models (${r.length} trunk, ${i} snapshots)`);for(let e of r){if(!e.prices?.length)continue;k(`\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 j(t,n))k(e)}for(let e of r){if(!e.qpmInfo||Object.keys(e.qpmInfo).length===0)continue;k(`\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 j(t,n))k(e)}if(t)for(let e of r)!e.predictConfig||e.predictConfig.length===0||(k(`\n── predictConfig: ${e.model} ──`),jd(e.predictConfig))}function Ad(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 jd(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 j(t,n))k(e)}var Md=w({description:`Browse model families or show detailed model info in the Bailian model marketplace`,auth:`none`,usageArgs:`[--model <model>] [--page <n>] [--page-size <n>] [--provider <p>] [--capability <c>] [--feature <f>] [--enrich]`,flags:Sd,exampleArgs:[``,`--provider alibaba`,`--capability TG --capability Reasoning`,`--model qwen-max`,`--model qwen-max --enrich --output json`,`--feature function-calling --output json`],notes:[`Both the catalog and --enrich parameter-schema endpoints are public — no console login needed.`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i=n.model,a=y(t);if(i){let e=!!n.enrich;if(t.dryRun){A({action:`model.detail`,model:i,enrich:e},r);return}let o=await Te(a,i);if(!o){k(`Model "${i}" not found.`);return}if(e){let e=Ed(o.items??[]);await Promise.all(e.map(async e=>{if(!e.model)return;let t=await Oe(a,e.model);t&&(e.predictConfig=t)}))}if(r===`json`){A(Ad(o,e),r);return}kd(o,e);return}let o={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){A({action:`model.list`,...o},r);return}let{total:s,groups:c}=await Ee(a,o);if(r===`json`){A(Od(c,s),r);return}Dd(c,s)}});const Nd=`zeldaEasy.bailian-dash-workspace.space.listWorkspaces`;function Pd(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Fd(e){let t=Pd(e,`data`);if(!t)return e;let n=Pd(t,`DataV2`);if(n){let e=Pd(n,`data`);return(e?Pd(e,`data`):void 0)??e??n}return Pd(t,`data`)??t}function Id(e){let t=O(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(yn(e),...r.map(e=>yn(e[t])))),a=n.map((e,n)=>t.bold(M(e,i[n]))).join(` `),o=i.map(e=>t.dim(`─`.repeat(e))).join(`──`);process.stdout.write(a+`
|
|
2692
2697
|
`),process.stdout.write(o+`
|
|
2693
|
-
`);for(let e of r){let n=e.map((e,n)=>n===2&&e===`Yes`?t.green(
|
|
2698
|
+
`);for(let e of r){let n=e.map((e,n)=>n===2&&e===`Yes`?t.green(M(e,i[n])):M(e,i[n]));process.stdout.write(n.join(` `)+`
|
|
2694
2699
|
`)}process.stdout.write(t.dim(`\nTotal: ${e.length}`)+`
|
|
2695
|
-
`)}var
|
|
2696
|
-
`);return}let o=a;if(r>0&&(o=o.slice(0,r)),i===`json`){
|
|
2697
|
-
`)}
|
|
2698
|
-
`);
|
|
2700
|
+
`)}var Ld=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){A({api:Nd,data:{}},i);return}let a=Fd(await e.client.console(Nd,{})).data;if(!Array.isArray(a)||a.length===0){i===`json`?A([],i):process.stdout.write(`No workspace found.
|
|
2701
|
+
`);return}let o=a;if(r>0&&(o=o.slice(0,r)),i===`json`){A(o.map(e=>({workspaceId:e.workspaceId,name:e.agentName,default:e.defaultAgent})),i);return}Id(o)}});function Rd(e){return[...new Set(e.split(`,`).map(e=>e.trim()).filter(Boolean))]}function zd(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!==void 0&&r!==``&&t.set(n,String(r));let n=t.toString();return n?`?${n}`:``}function Bd(e,t){if(e==null)return`-`;let n=t??60;return n===1?`${q(e)}/s`:n===60?`${q(e)}/min`:`${q(e)}/${n}s`}function Vd(e){return e?Bd(e.request_limit,e.request_limit_period):`-`}function Hd(e){return e?Bd(e.usage_limit,e.usage_limit_period):`-`}function Ud(e){return!e||e.async_user_queue_limit==null&&e.async_user_concurrency_limit==null?`-`:`${e.async_user_queue_limit==null?`-`:q(e.async_user_queue_limit)}/${e.async_user_concurrency_limit==null?`-`:q(e.async_user_concurrency_limit)}`}function Wd(e,t){if(e.length===0){process.stdout.write(`No rate limits found.
|
|
2702
|
+
`);return}let n=Nn({headers:[`Model`,`Req Limit`,`Usage Limit`,`WS Req`,`WS Usage`,`Async Q/C`],rows:e.map(e=>[e.model,Vd(e.model_limit),Hd(e.model_limit),Vd(e.workspace_limit),Hd(e.workspace_limit),Ud(e.model_limit)]),align:[`left`,`right`,`right`,`right`,`right`,`right`]});for(let e of n)process.stdout.write(e+`
|
|
2703
|
+
`);process.stdout.write(`\nTotal: ${t}\n`)}var Gd=w({description:`View model rate limits (QPM/TPM, account and workspace level)`,auth:`apiKey`,usageArgs:`[--model <model>] [--name <name>] [--page <n>] [--page-size <n>]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name(s), comma-separated (exact match)`},name:{type:`string`,valueHint:`<name>`,description:`Fuzzy search by model name`},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 20)`}},exampleArgs:[``,`--model qwen3-max`,`--model qwen3-max,qwen-plus`,`--name qwen --page-size 50`,`--output json`],notes:["Usage-vs-limit pressure checks live in `quota check` (console auth)."],async run(e){let{settings:t,flags:n}=e,r=n.model||void 0,i=n.name||void 0,a=T(t.output),o=e.client.url(yt());if(t.dryRun){A(r?{requests:Rd(r).map(e=>({endpoint:o,method:`GET`,query:{model:e,page_size:100}}))}:{endpoint:o,method:`GET`,query:{name:i,page_no:n.page||1,page_size:n.pageSize||20}},a);return}let s,c;if(r)s=(await Promise.all(Rd(r).map(t=>e.client.requestJson({path:yt()+zd({model:t,page_size:100})})))).flatMap(e=>e.output?.quotas??[]),c=s.length;else{let t=await e.client.requestJson({path:yt()+zd({name:i,page_no:n.page||1,page_size:n.pageSize||20})});s=t.output?.quotas??[],c=t.output?.total??s.length}if(a===`json`){A({items:s,total:c},a);return}Wd(s,c)}}),Kd=w({description:`Update model rate limits (QPM/TPM), or clear them with --delete`,auth:`apiKey`,usageArgs:`--model <model> [--rpm <n>] [--tpm <n>] [--delete]`,flags:{model:{type:`string`,valueHint:`<model>`,description:`Model name (required)`,required:!0},rpm:{type:`number`,valueHint:`<n>`,description:`Max requests per minute (QPM)`},tpm:{type:`number`,valueHint:`<n>`,description:`Max tokens per minute (TPM)`},delete:{type:`switch`,description:`Clear all custom rate limits for the model`}},exampleArgs:[`--model qwen-plus --rpm 60 --tpm 100000`,`--model qwen3-max --tpm 500000`,`--model qwen-plus --delete`,`--model qwen-plus --rpm 60 --output json`],notes:[`Fields you omit keep their current values (server-side OVERLAY merge); --delete clears all custom limits.`,`Setting TPM without an existing QPM limit is rejected server-side — pass --rpm first or together.`],validate:e=>{if(e.delete&&(e.rpm!==void 0||e.tpm!==void 0))return`--delete cannot be combined with --rpm/--tpm.`;if(!e.delete&&e.rpm===void 0&&e.tpm===void 0)return`one of --rpm / --tpm / --delete is required.`;if(e.rpm!==void 0&&e.rpm<0)return`--rpm must be a non-negative number.`;if(e.tpm!==void 0&&e.tpm<0)return`--tpm must be a non-negative number.`},async run(e){let{settings:t,flags:n}=e,r=n.model,i=T(t.output),a={model:r};n.delete?a.operation_type=`DELETE`:(n.rpm!==void 0&&(a.request_limit=n.rpm,a.request_limit_period=60),n.tpm!==void 0&&(a.usage_limit=n.tpm,a.usage_limit_period=60));let o={models:[a]};if(t.dryRun){A({endpoint:e.client.url(yt()),method:`POST`,request:o},i);return}let s=await e.client.requestJson({path:yt(),method:`POST`,body:o});if(i===`json`){A({model:r,...s},i);return}if(n.delete){process.stdout.write(`Rate limits cleared for "${r}".\n`);return}let c=[];n.rpm!==void 0&&c.push(`QPM ${q(n.rpm)}`),n.tpm!==void 0&&c.push(`TPM ${q(n.tpm)}`),process.stdout.write(`Rate limits updated for "${r}": ${c.join(`, `)}\n`)}});const qd=`zeldaEasy.broadscope-platform.modelInstance.listModelLimitApplications`;function Jd(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Yd(e){let t=Jd(e,`data`);if(!t)return e;let n=Jd(t,`DataV2`);if(n){let e=Jd(n,`data`);return(e?Jd(e,`data`):void 0)??e??n}return Jd(t,`data`)??t}function Xd(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 Zd(e,t){let n=O(process.stdout),r=[`Model`,`Token Limit`,`Applied At`],i=e.map(e=>[e.deployedModel,q(e.usageLimit),Xd(e.gmtCreate)]),a=r.map((e,t)=>Math.max(yn(e),...i.map(e=>yn(e[t])))),o=r.map((e,t)=>n.bold(M(e,a[t]))).join(` `),s=a.map(e=>n.dim(`─`.repeat(e))).join(`──`);process.stdout.write(o+`
|
|
2699
2704
|
`),process.stdout.write(s+`
|
|
2700
|
-
`);for(let e of i)process.stdout.write(e.map((e,t)=>
|
|
2705
|
+
`);for(let e of i)process.stdout.write(e.map((e,t)=>M(e,a[t])).join(` `)+`
|
|
2701
2706
|
`);process.stdout.write(n.dim(`\nTotal: ${t} records`)+`
|
|
2702
|
-
`)}var
|
|
2703
|
-
`);return}
|
|
2704
|
-
`)}var
|
|
2705
|
-
`);return}let s=await Promise.all(o.map(t=>
|
|
2706
|
-
`)
|
|
2707
|
-
|
|
2708
|
-
`)}if(e&&!Qe(e).includes(u)){let n=Qe(e);throw new t(`Model "${c}" does not support training type "${u}".`,s.USAGE,n.length?`This model supports: ${n.join(`, `)}.`:`This model reports no supported training types.`)}}i.dryRun||(await Cu(n.client,i,h,`fine-tune`,`datasets`),_&&await Cu(n.client,i,_,`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(i.output);if(i.dryRun){let e=[...h.localPaths.map(e=>({field:`datasets`,path:e})),...(_?.localPaths??[]).map(e=>({field:`validations`,path:e}))];P(e.length>0?{action:`finetune.create`,body:S,pending_uploads:e}:{action:`finetune.create`,body:S},C);return}let ee=await ae(n.client,S),w=ee.output??ee.data;i.quiet?w?.job_id&&M(w.job_id):C===`text`&&w?.job_id?(M(`Created fine-tune job: ${w.job_id}`),w.status&&M(`Status: ${w.status}`),N(ee.request_id,i.quiet)):P(ee,C)}const Nu=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:Tu,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:ku,run:e=>Mu(`text`,e)}),Pu=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:Eu,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:Au,run:e=>Mu(`audio`,e)}),Fu=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:Du,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:ju,run:e=>Mu(`image`,e)});var Iu=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){P({action:`finetune.list`,page:a,page_size:o,status:s},i);return}let c=await Xe(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`){P({items:f,total:d,request_id:c.request_id},i);return}if(f.length===0){M(`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 F(p,m))M(e);d!==void 0&&M(`\nTotal: ${d}`),M(`Tip: OUTPUT_MODEL is the input for \`${t.binName} deploy text create --model\``),N(c.request_id,n.quiet)}}),Lu=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){P({action:`finetune.get`,job_id:i},a);return}let o=await Ae(e.client,i),s=o.output??o.data;if(!s){M(`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`){P({...u,request_id:o.request_id},a);return}M(`job_id: ${u.job_id}`),u.base_model&&M(`base_model: ${u.base_model}`),u.status&&M(`status: ${u.status}`),u.training_type&&M(`training_type: ${u.training_type}`),u.training_files.length&&M(`training_files: ${u.training_files.join(`, `)}`),u.validation_files.length&&M(`validation_files: ${u.validation_files.join(`, `)}`),u.hyper_params&&M(`hyper_params: ${u.hyper_params}`),u.output_model&&M(`output_model: ${u.output_model} (→ ${t.binName} deploy text create --model)`),u.model_name&&M(`model_name: ${u.model_name}`),u.created_at&&M(`created_at: ${u.created_at}`),u.updated_at&&M(`updated_at: ${u.updated_at}`),N(o.request_id,n.quiet)}}),Ru=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){P({action:`finetune.cancel`,job_id:r},i);return}let a=await ee(e.client,r),o=a.output??a.data;t.quiet?M(r):i===`text`?(M(`Cancelled ${r}${o?.status?` (status=${o.status})`:``}.`),N(a.request_id,t.quiet)):P(a,i)}}),zu=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){P({action:`finetune.delete`,job_id:r},i);return}let a=await de(e.client,r);t.quiet?M(r):i===`text`?(M(`Deleted ${r}.`),N(a.request_id,t.quiet)):P(a,i)}});function Bu(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 Vu(e,t){return Bu(e).toLowerCase().includes(t)}async function Hu(e,t,n){let r=[],i=1,a=0;for(let o=0;o<200;o++){let o=await je(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 Uu=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){P({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 Hu(e.client,r,a??100),l=n,u;if(o){let e=o.toLowerCase();l=n.filter(t=>Vu(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){M(o?`No logs matched "${o}".`:`No logs returned.`);return}for(let e of f)M(Bu(e));let e=[`${f.length} shown`];u!==void 0&&e.push(`matched ${u}`),e.push(`of ${n.length}`+(i?` (total ${i})`:``)),M(`\n${e.join(`, `)}`);return}P({...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 je(e.client,r,{pageNo:i,pageSize:a}),u=l.output??l.data,d=u?.logs??[];if(t.quiet||c===`text`){if(d.length===0){M(`No logs returned.`);return}for(let e of d)M(Bu(e));u?.total!==void 0&&M(`\nTotal: ${u.total}`),N(l.request_id,t.quiet)}else P(l,c)}}),Wu=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){P({action:`finetune.checkpoints`,job_id:r},i);return}let a=await Ke(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`){P({items:l,total:c,request_id:a.request_id},i);return}if(l.length===0){M(`No checkpoints found.`);return}let u=[`CHECKPOINT`,`STEP`,`STATUS`],d=l.map(e=>[e.checkpoint,e.step,e.status]);for(let e of F(u,d))M(e);M(`\nTotal: ${c}`),N(a.request_id,t.quiet)}}),Gu=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){P({action:`finetune.export`,job_id:i,checkpoint:a,model_name:o},s);return}let c=await he(e.client,i,a,o),l=(c.output??c.data)?.model_name??o;n.quiet?M(l):s===`text`?(M(`Exported ${i} / ${a} → model_name=${l}`),M(`Next: ${t.binName} deploy text create --model ${l} --name <display-name>`),N(c.request_id,n.quiet)):P(c,s)}});const Ku=new Set([`SUCCEEDED`,`FAILED`,`CANCELED`]);function qu(){let e=new Date,t=e=>String(e).padStart(2,`0`);return`${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Ju(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 Yu(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 Xu=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,a=r.follow,o=Math.max(1,r.interval??10),c=r.pollTimeout,l=E(n.output);if(n.dryRun){P({action:`finetune.watch`,job_id:i,follow:a,interval:o,timeout:c},l);return}if(!a){let r=await Ae(e.client,i),a=r.output??r.data,o=String(a?.status??``).toUpperCase(),c=Ku.has(o);if(n.quiet?M(o||`UNKNOWN`):l===`text`?(M(`${qu()} ${i} ${o||`UNKNOWN`}`),o===`SUCCEEDED`&&M(`✓ ${i} ${o}`),N(r.request_id,n.quiet)):P({job_id:i,status:o||`UNKNOWN`,terminal:c,request_id:r.request_id},l),c&&o!==`SUCCEEDED`)throw new t(`Fine-tune job ${i} ended in status ${o}.`,s.GENERAL);return}let u=new AbortController,d=()=>u.abort();process.on(`SIGINT`,d);try{let r=``,a=Date.now();for(;;){let d=await Ae(e.client,i,u.signal),f=d.output??d.data,p=String(f?.status??``).toUpperCase();if(l===`text`&&!n.quiet&&p!==r&&(M(`${qu()} ${i} ${p||`UNKNOWN`}`),r=p),Ku.has(p)){let e=Date.now()-a;if(l!==`text`||n.quiet?P(d,l):p===`SUCCEEDED`&&(M(`\n✓ ${i} ${p} (elapsed ${Ju(e)})`),N(d.request_id,n.quiet)),p!==`SUCCEEDED`)throw new t(`Fine-tune job ${i} ended in status ${p} (elapsed ${Ju(e)}).`,s.GENERAL);return}if(c!==void 0&&(Date.now()-a)/1e3>=c)throw new t(`Watching fine-tune job ${i} timed out after ${Ju(Date.now()-a)} (last status: ${p||`UNKNOWN`}).`,s.TIMEOUT);await Yu(o*1e3,u.signal)}}catch(e){if(u.signal.aborted){M(`
|
|
2709
|
-
Interrupted.`);return}throw e}finally{process.off(`SIGINT`,d)}}});async function Zu(e){let t=me(e),n=(n,r)=>C({region:t.consoleRegion,site:t.consoleSite,switchAgent:t.consoleSwitchAgent},e.timeout,{api:n,data:r}),r=await xe(n,{pageNo:1,pageSize:50}),i=[...r.models],a=Math.ceil(r.total/50);for(let e=2;e<=a;e++){let t=await xe(n,{pageNo:e,pageSize:50});i.push(...t.models)}return i}const Qu={full:`full-parameter`,lora:`LoRA`};function $u(e){if(!Ve(e))return e;let{method:t,variant:n}=Lt(e);return`${Qu[n]??n} ${t.toUpperCase()}`}var ed=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: ${m.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){P({action:`finetune.capability`,model:r,training_type:i},a);return}if(r){let e=await ve(t,r);if(!e){M(`No foundation model found matching "${r}".`);return}let n=Qe(e);if(t.quiet){for(let e of n)M(e);return}if(a!==`text`){P({model:e.model??r,supported:n,supports:e.supports,trainingTypes:e.trainingTypes},a);return}M(`${e.model??r}`),M(n.length?`Supported training types:`:`No supported training types.`);for(let e of n)M(` ${e.padEnd(10)} ${$u(e)}`);return}if(!i||!Ve(i))throw new h(`--training-type "${i}" is not supported. Valid: ${m.join(`, `)}.`);let{method:o,variant:s}=Lt(i),c=(await Zu(t)).filter(e=>ot(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)M(e.model);return}if(a!==`text`){P({training_type:i,method:o,variant:s,count:c.length,models:c},a);return}M(`Models supporting ${i} (${o} / ${s}): ${c.length}`);for(let e of c)M(` ${e.model}`)}});const td={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)`}},nd=`--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>]`,rd=["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 id(e,t){let n=t.plan||se(e),r=p[n];return r?r.validateFlags(t):`Unsupported plan "${n}". Supported plans: ${Object.keys(p).join(`, `)}.`}async function ad(e,t){let{identity:n,settings:r,flags:i}=t,a=i.model,o=i.name,s=i.plan||se(e),c=E(r.output),l={model_name:a,name:o,plan:s,...(await ft(s).resolve({client:t.client,dryRun:r.dryRun,binName:n.binName,flags:i,model:a,name:o})).body};if(r.dryRun){P({action:`deploy.create`,body:l},c);return}let u=await ie(t.client,l),d=u.output??u.data;r.quiet?M(d?.deployed_model??``):c===`text`?(M(`Created deployment.`),d?.deployed_model&&M(` deployed_model: ${d.deployed_model}`),d?.status&&M(` status: ${d.status}`),d?.plan&&M(` plan: ${d.plan}`),M(`\nNext: track readiness with: ${n.binName} deploy get --deployed-model ${d?.deployed_model??`<id>`}`),N(u.request_id,r.quiet)):P(u,c)}const od=T({description:`Create a text model deployment`,auth:`apiKey`,usageArgs:nd,flags:td,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:rd,validate:e=>id(`text`,e),run:e=>ad(`text`,e)}),sd=T({description:`Create an audio (TTS) model deployment`,auth:`apiKey`,usageArgs:nd,flags:td,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:rd,validate:e=>id(`audio`,e),run:e=>ad(`audio`,e)}),cd=T({description:`Create an image generation model deployment`,auth:`apiKey`,usageArgs:nd,flags:td,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:rd,validate:e=>id(`image`,e),run:e=>ad(`image`,e)});var ld=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){P({action:`deploy.list`,page:n.page,page_size:n.pageSize,status:i},r);return}let a=await Ye(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`){P({items:l,total:c,request_id:a.request_id},r);return}if(l.length===0){M(`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 F(u,d))M(e);c!==void 0&&M(`\nTotal: ${c}`),N(a.request_id,t.quiet)}}),ud=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){P({action:`deploy.get`,deployed_model:r},i);return}let a=await ke(e.client,r),o=a.output??a.data;if(!o){M(`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`){P({...s,request_id:a.request_id},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);M(`${c(e)}${n}`)}N(a.request_id,t.quiet)}}),dd=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){P({action:`deploy.models`,page:n.page,page_size:n.pageSize,version:i,model_source:a},r);return}let o=await Je(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`){P({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,request_id:o.request_id},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){M(`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 F(d,f))M(e);l!==void 0&&M(`\nTotal: ${l}`),N(o.request_id,t.quiet)}}),fd=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){P({action:`deploy.scale`,deployed_model:r,body:a},i);return}let o=await Mt(e.client,r,a),s=o.output??o.data;t.quiet?M(r):i===`text`?(M(`Scaled ${r}${s?.capacity===void 0?``:` (capacity=${s.capacity})`}.`),N(o.request_id,t.quiet)):P(o,i)}}),pd=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){P({action:`deploy.update`,deployed_model:r,body:a},i);return}let o=await zt(e.client,r,a),s=o.output??o.data;if(t.quiet)M(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}`),M(`Updated ${r}${e.length?` (${e.join(`, `)})`:``}.`),N(o.request_id,t.quiet)}else P(o,i)}}),md=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,a=E(n.output);if(n.dryRun){P({action:`deploy.delete`,deployed_model:i},a);return}if(!r.skipPrecheck)try{let n=await ke(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.`,s.USAGE)}catch(e){if(e instanceof t)throw e}let o=await ue(e.client,i);n.quiet?M(i):a===`text`?(M(`Deleted ${i}.`),N(o.request_id,n.quiet)):P(o,a)}});const hd={callerUacAccountId:{type:`string`,valueHint:`<id>`,description:`Caller UAC account ID`},namespaceId:{type:`string`,valueHint:`<id>`,description:`Product namespace ID (Token Plan default: namespace-1)`}},gd={workspaceId:{type:`string`,valueHint:`<id>`,description:`Workspace ID (env: BAILIAN_WORKSPACE_ID, config: workspace_id)`}},_d={cn:`modelstudio.cn-beijing.aliyuncs.com`,intl:`modelstudio.ap-southeast-1.aliyuncs.com`};function vd(e){for(let[t,n]of Object.entries(d))if(e===n||e.startsWith(`${n}/`))return t;return`cn`}function yd(e){return _d[vd(e)]??_d.cn}function bd(e,n,r){let i=n.workspaceId||e.workspaceId;if(!i)throw new t(`Missing workspace ID.
|
|
2710
|
-
|
|
2707
|
+
`)}var Qd=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,a=Number(i.page)||1,o=Number(i.pageSize)||10,c=i.model||void 0,l=T(r.output),u={input:{pageNo:a,pageSize:o}};if(r.dryRun){A({api:qd,data:u},l);return}let d;try{d=await e.client.console(qd,u)}catch(e){throw e instanceof t&&e.message.includes(`NotLogined`)?new t(`session expired.`,s.AUTH,`Run \`${n.binName} auth login --console\` to re-authenticate.`):e}let f=Yd(d),p=f.records??[],m=f.items??p.length;if(c&&(p=p.filter(e=>e.deployedModel===c)),l===`json`){A({records:p.map(e=>({model:e.deployedModel,tokenLimit:e.usageLimit,appliedAt:Xd(e.gmtCreate)})),total:c?p.length:m},l);return}if(p.length===0){process.stdout.write(`No quota change history found.
|
|
2708
|
+
`);return}Zd(p,c?p.length:m)}});const $d=`zeldaEasy.bailian-telemetry.monitor.getMonitorData`;function ef(e,t){if(!e)return 0;let n=e.count_limit_period||t;return n?Math.floor(e.count_limit*60/n):0}function tf(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 nf(e){let t=[],n=1;for(;;){let r=en(await e.console(d,{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 rf(e,n,r){let i=Date.now(),a=i-r*60*1e3;try{let t=en(await e.console($d,{reqDTO:{monitorType:`Advanced`,metricFilters:[{aggMethod:`sum_pm`,metricName:`model_total_amount`},{aggMethod:`sum_pm`,metricName:`model_call_count`}],labelFilters:{resourceId:n,resourceType:`model`},startTime:a,endTime:i}})),r=t.data??t;if(!Array.isArray(r))return{rpm:0,tpm:0};let o=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`&&(o=Math.round(t)),e.metricName===`model_total_amount`&&(s=Math.round(t))}return{rpm:o,tpm:s}}catch(e){if(e instanceof t&&e.exitCode===s.AUTH)throw e;return{rpm:-1,tpm:-1}}}function af(e){let t=O(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=Nn({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+`
|
|
2709
|
+
`)}var of=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){A({apis:[d,$d],...ve(t)},a);return}let o=await nf(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.
|
|
2710
|
+
`);return}let s=await Promise.all(o.map(t=>rf(e.client,t.model,i))),c=o.map((e,t)=>{let n=e.qpmInfo,r=n[`model-default`],i=n[`user-spec`],a=ef(i,r?.count_limit_period)||ef(r),o=tf(i,r?.usage_limit_period)||tf(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`){A(c,a);return}af(c)}});function sf(e){return e==null?`-`:e?`yes`:`no`}function cf(e,t,n){if(e.length===0){process.stdout.write(`No model permissions found.\n${n}\n`);return}let r=Nn({headers:[`Model`,`Name`,`Inference`,`Fine-tune`,`Deploy`],rows:e.map(e=>[e.model,e.name??`-`,sf(e.permissions?.inference),sf(e.permissions?.fine_tune),sf(e.permissions?.deploy)]),align:[`left`,`left`,`right`,`right`,`right`]});for(let e of r)process.stdout.write(e+`
|
|
2711
|
+
`);process.stdout.write(`\nTotal: ${t}\n`)}var lf=w({description:`List model permissions (inference / fine-tune / deploy) in the workspace`,auth:`apiKey`,usageArgs:`[--scope <scope>] [--model <model>] [--name <name>] [--page <n>] [--page-size <n>]`,flags:{scope:{type:`string`,valueHint:`<scope>`,choices:[`authorized`,`authorizable`],description:`Authorization scope: authorizable (default, full catalog), authorized`},model:{type:`string`,valueHint:`<model>`,description:`Model ID (exact match)`},name:{type:`string`,valueHint:`<name>`,description:`Fuzzy search by model name or ID`},page:{type:`number`,valueHint:`<n>`,description:`Page number (default: 1)`},pageSize:{type:`number`,valueHint:`<n>`,description:`Results per page (default: 20)`}},exampleArgs:[``,`--model qwen-plus`,`--scope authorized`,`--name qwen --page-size 50`,`--output text`],notes:["Default scope is `authorizable` (the full grantable catalog); use `--scope authorized` to see only models already granted.","Output defaults to JSON; pass `--output text` for a table. Permission values are tri-state: true / false / null (never set).",`Values mirror the server's grant records as-is for the workspace bound to your API key. A model reporting false/null can still be callable (access may come from other channels); see the Model Studio authorization docs for the exact semantics.`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i=n.scope??`authorizable`,a={authorization_scope:i.toUpperCase(),model:n.model||void 0,name:n.name||void 0,page_no:n.page||1,page_size:n.pageSize||20};if(t.dryRun){A({endpoint:e.client.url(bt()),method:`GET`,query:a},r);return}let o=await e.client.requestJson({path:bt()+zd(a)}),s=o.output?.permissions??[],c=o.output?.total??s.length;if(r===`json`){A({items:s,total:c},r);return}let l=e.identity.binName;cf(s,c,i===`authorized`?`Nothing granted yet in this workspace. Browse grantable models with \`${l} permission list --scope authorizable\`, then grant with \`${l} permission grant --model <model>\`.`:`Adjust --name/--model filters, or check pagination with --page/--page-size.`)}});const uf=[`inference`,`finetune`,`deploy`];function df(e){if(!e)return[`inference`];let t=Rd(e);if(t.length===0)return{error:`--action must not be empty.`};for(let e of t)if(!uf.includes(e))return{error:`--action "${e}" is invalid; use ${uf.join(`, `)}.`};return t}function ff(e){if(e.all&&e.model)return`--all cannot be combined with --model.`;if(!e.all&&!e.model)return`one of --model / --all is required.`;let t=df(e.action);if(`error`in t)return t.error;if(e.all&&(t.length!==1||t[0]!==`inference`))return`--all only supports the inference action.`;if(e.model){let t=Rd(e.model);if(t.length===0)return`--model must not be empty.`;if(t.length>20)return`--model accepts at most 20 models per call.`}}async function pf(e,t,n){let r=e.settings.outputExplicit?T(e.settings.output):`json`,i=df(t.action),a=t.model?Rd(t.model):[],o=t.all?{access_all_entities:n?`OPEN`:`CLOSE`}:{models:a.map(e=>{let t={model:e};for(let e of i)t[e]=n;return t})};if(e.settings.dryRun){A({endpoint:e.client.url(bt()),method:`POST`,request:o},r);return}let s=await e.client.requestJson({path:bt(),method:`POST`,body:o}),c=n?`granted`:`revoked`;if(r===`json`){A({...t.all?{all:!0,action:`inference`}:{models:a,actions:i},[c]:!0,request_id:s.request_id},r);return}if(t.all){process.stdout.write(n?`Inference permission granted for all models in the workspace (including future ones).
|
|
2712
|
+
`:`One-key authorization closed; historical inference grants cleared.
|
|
2713
|
+
`);return}process.stdout.write(`Permissions ${c} (${i.join(`, `)}): ${a.join(`, `)}\n`)}var mf=w({description:`Grant model permissions (inference / finetune / deploy)`,auth:`apiKey`,usageArgs:`--model <models> [--action <actions>] | --all`,flags:{model:{type:`string`,valueHint:`<models>`,description:`Model ID(s), comma-separated (max 20)`},action:{type:`string`,valueHint:`<actions>`,description:`Permission action(s), comma-separated: inference, finetune, deploy (default: inference)`},all:{type:`switch`,description:`One-key grant inference for all models in the workspace (including future ones)`}},exampleArgs:[`--model qwen-plus`,`--model qwen-plus,qwen3-max --action inference,finetune`,`--all`,`--model qwen-plus --dry-run --output json`],notes:[`Grants apply to the business workspace your API key belongs to.`,`--all maps to the server one-key switch (access_all_entities: OPEN) and only covers inference.`,`Actions you omit keep their current grants (server-side tri-state patch).`],validate:e=>ff(e),async run(e){await pf(e,e.flags,!0)}}),hf=w({description:`Revoke model permissions (inference / finetune / deploy)`,auth:`apiKey`,usageArgs:`--model <models> [--action <actions>] | --all --yes`,flags:{model:{type:`string`,valueHint:`<models>`,description:`Model ID(s), comma-separated (max 20)`},action:{type:`string`,valueHint:`<actions>`,description:`Permission action(s), comma-separated: inference, finetune, deploy (default: inference)`},all:{type:`switch`,description:`Close one-key authorization and clear ALL historical inference grants`},yes:{type:`switch`,description:`Confirm --all without an interactive prompt (required)`}},exampleArgs:[`--model qwen-plus`,`--model qwen-plus,qwen3-max --action inference,finetune`,`--all --yes`,`--model qwen-plus --dry-run --output json`],notes:[`Grants apply to the business workspace your API key belongs to.`,`--all maps to the server one-key switch (access_all_entities: CLOSE): it clears every historical inference grant and cannot be undone, so it requires --yes.`,`Actions you omit keep their current grants (server-side tri-state patch).`],validate:e=>ff(e),async run(e){let{flags:n,settings:r}=e;if(n.all&&!n.yes&&!r.dryRun)throw new t(`Refusing to clear all historical inference grants without confirmation.`,s.USAGE,`Re-run with --yes to close one-key authorization (or preview with --dry-run).`);await pf(e,n,!1)}}),gf=w({description:`Upload a dataset file (.jsonl or .zip) to Bailian`,auth:`apiKey`,usageArgs:`--file <path> [--purpose <name>] [--schema <chatml|dpo|cpt|tts|image|video>] [--no-validate] [--full-validate]`,flags:{file:{type:`string`,valueHint:`<path>`,description:`Local dataset file (.jsonl or .zip; ≤200MB SFT/DPO, ≤300MB CPT, ≤2GB media zip)`,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), "image" (image generation), or "video" (video 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). Six 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); video = {first_frame_path:...} (video 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: 200MB SFT/DPO text, 300MB CPT, 2GB media zip. 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,a=i.file,o=i.purpose||`fine-tune`,d=Ct(i.schema),f=d===`image`||d===`video`?u:d===`cpt`?c:l;if(!i.noValidate){let e=await an(a,{fullValidate:i.fullValidate,schema:d,maxBytes:f});if(!e.valid){let r=[`Dataset validation failed for ${a}`,...e.errors.slice(0,10).map(Ne)];throw e.errors.length>10&&r.push(` … and ${e.errors.length-10} more error(s).`),r.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(r.join(`
|
|
2714
|
+
`),s.GENERAL)}if(e.warnings.length>0&&!r.quiet){process.stderr.write(`Dataset validation passed with ${e.warnings.length} warning(s):\n`);for(let t of e.warnings.slice(0,5))process.stderr.write(`${Ne(t)}\n`);e.warnings.length>5&&process.stderr.write(` … and ${e.warnings.length-5} more.\n`)}}if(r.dryRun){A({action:`dataset.upload`,file:a,purpose:o,max_bytes:f,validate:!i.noValidate,schema:d??`auto`},`json`);return}let{request_id:p,...m}=await nn(e.client,{filePath:a,purpose:o});r.quiet?k(m.file_id):A({...m,request_id:p},`json`)}}),_f=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;if(t.dryRun){A({action:`dataset.list`,page:n.page,page_size:n.pageSize,purpose:n.purpose},`json`);return}let r=await rt(e.client,{pageNo:n.page,pageSize:n.pageSize,purpose:n.purpose||void 0}),i=r.data?.files??[],a=r.data?.total,o=i.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(t.quiet)for(let e of o)k(e.file_id);else A({items:o,total:a,request_id:r.request_id},`json`)}}),vf=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;if(t.dryRun){A({action:`dataset.get`,file_id:r},`json`);return}let i=await Le(e.client,r),a=i.data;if(!a){k(`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??``};t.quiet?k(s.file_id):A({...s,request_id:i.request_id},`json`)}}),yf=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;if(t.dryRun){A({action:`dataset.delete`,file_id:r},`json`);return}let i=await pe(e.client,r);t.quiet?k(r):A(i,`json`)}}),bf=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|video>]`,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), "image" (image generation), or "video" (video 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 wan-i2v-training-dataset.zip --schema video`,`--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);`,`video = {first_frame_path:"...", video_path:"..."} (video generation,`,`i2v first-frame or kf2v first+last-frame with last_frame_path). With no`,`--schema, a record carrying wav_fn is validated as TTS, img_path as image,`,`first_frame_path/video_path as video, 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,a=Ct(r.schema);if(n.dryRun){A({action:`dataset.validate`,file:i,full:r.fullValidate,schema:a??`auto`},`json`);return}let o=await an(i,{fullValidate:r.fullValidate,schema:a});if(n.quiet?k(o.valid?`ok`:`fail`):A(o,`json`),!o.valid)throw new t(`Dataset validation failed: ${o.errors.length} error(s).`,s.GENERAL)}});function xf(e){return Kn(e)&&Xn(e).isFile()}async function Sf(e,n,r,i,a,o,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.`,s.USAGE);let d=[],f=[],p,m,h=!0;for(let r of u){if(!xf(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:o,u=await a.validate(r,i,{model:c});if(!u.valid){let e=[`Dataset validation failed for ${r}`,...u.errors.slice(0,10).map(Ne)];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(`
|
|
2715
|
+
`),s.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(`${Ne(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=Xn(r).size)}return{fileIds:d,localPaths:f,firstSize:p,recordCount:h?m:void 0}}async function Cf(e,n,r,i,a){let o=[];for(let[c,l]of r.fileIds.entries()){if(!xf(l))continue;let u=await nn(e,{filePath:l,purpose:i});if(!u.file_id)throw new t(`Upload of ${l} succeeded but no file_id was returned.`,s.GENERAL);o.push(u),r.fileIds[c]=u.file_id,n.quiet||process.stderr.write(`Uploaded ${Qn(l)} → ${u.file_id} (auto from --${a})\n`)}return o}const wf={baseModel:{type:`string`,valueHint:`<model>`,description:`Base model to fine-tune (e.g. qwen3-8b; not the output model name)`,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)`}},Tf={...wf,trainingType:{type:`string`,valueHint:`<t>`,description:`Training type: ${g.join(` | `)} (default: ${a}). 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`}},Ef={...wf},Df={...wf,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")`}},Of={...wf,nEpochs:{type:`number`,valueHint:`<n>`,description:`Training epochs (default: 50)`},batchSize:{type:`number`,valueHint:`<n>`,description:`Batch size (default: model-specific, 1 for wan2.7, 4 for wan2.5/2.2)`},learningRate:{type:`string`,valueHint:`<str>`,description:`Learning rate as a string to preserve precision (default: "2e-5")`}},kf=[`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.`],Af=[...kf,"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).`],jf=[...kf,`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.`],Mf=[...kf,`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 Nf(e,n){let{identity:r,settings:i}=n,o=n.flags,c=o.baseModel,l=o.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}.`,s.USAGE,`Merge your recordings into a single .zip (or pass one file-id).`)}let u=o.trainingType||a;if(!Ze(u))throw new t(`--training-type "${u}" is not supported.`,s.USAGE,`Supported values: ${g.join(`, `)} (default: ${a}).`);let d=Ue(u),f=l.split(`,`).map(e=>e.trim()).find(e=>xf(e)),p=e;if(e===`image`){let e=o.generationType;(e===`i2i`||!e&&f&&!i.dryRun&&await _e(f)===`image-i2i`)&&(p=`image-i2i`)}e===`video`&&f&&!i.dryRun&&await _e(f)===`video-kf2v`&&(p=`video-kf2v`);let m=await Sf(i,r.binName,l,`datasets`,d,p,c,f?{path:f,modality:p}:void 0),h=m.fileIds,_=o.validations?await Sf(i,r.binName,o.validations,`validations`,d,p,c):void 0,v=_?.fileIds,y=o.modelName,b=o.suffix,x=d.resolveHyperParameters(p,o);if(o.batchSize!==void 0&&x.batch_size!==void 0&&!i.quiet&&!d.shouldSkipGate(`batch_size`,p)){let e=o.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(o.batchSize!==void 0&&!i.quiet&&d.shouldSkipGate(`batch_size`,p)){let e=o.batchSize;x.batch_size!==void 0&&x.batch_size!==e&&process.stderr.write(`warning: --batch-size ${e} ignored for ${p} training (model uses a fixed batch_size of ${x.batch_size}).\n`)}if(p===`text`&&x.batch_size===void 0&&!i.dryRun){let e=m.firstSize??0;if(e===0)try{e=(await Le(n.client,h[0])).data?.size??0}catch{}e>0&&e<100*1024&&(x.batch_size=8)}if(!i.dryRun&&m.recordCount!==void 0&&!d.shouldSkipGate(`batch_size`,p)){let e=x.batch_size??16,n=Dt({recordCount:m.recordCount,batchSize:e});if(!n.ok&&n.issue)throw new t(n.issue.message,s.GENERAL,n.hint)}if(!i.dryRun&&!d.shouldSkipCapabilityCheck(p)){let e;try{e=await we(i,c)}catch(e){i.quiet||process.stderr.write(`warning: model capability lookup failed (${e.message}); proceeding without local pre-flight.
|
|
2716
|
+
`)}if(e&&!lt(e).includes(u)){let n=lt(e);throw new t(`Model "${c}" does not support training type "${u}".`,s.USAGE,n.length?`This model supports: ${n.join(`, `)}.`:`This model reports no supported training types.`)}}i.dryRun||(await Cf(n.client,i,m,`fine-tune`,`datasets`),_&&await Cf(n.client,i,_,`fine-tune`,`validations`));let S={model:c,training_file_ids:h,training_type:d.serverTrainingType,hyper_parameters:x};if(v&&v.length>0&&(S.validation_file_ids=v),y&&(S.model_name=y),b&&(S.finetuned_output_suffix=b),i.dryRun){let e=[...m.localPaths.map(e=>({field:`datasets`,path:e})),...(_?.localPaths??[]).map(e=>({field:`validations`,path:e}))];A(e.length>0?{action:`finetune.create`,body:S,pending_uploads:e}:{action:`finetune.create`,body:S},`json`);return}let C=await le(n.client,S),ee=C.output??C.data;i.quiet?ee?.job_id&&k(ee.job_id):A(C,`json`)}const Pf=w({description:`Create a text model fine-tune job (sft | sft-lora | dpo | dpo-lora | cpt)`,auth:`apiKey`,usageArgs:`--base-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:Tf,exampleArgs:[`--base-model qwen3-8b --datasets file-xxx`,`--base-model qwen3-8b --datasets ./train.jsonl`,`--base-model qwen3-8b --datasets ./train.jsonl --validations ./eval.jsonl`,`--base-model qwen3-8b --datasets file-aaa,./extra.jsonl`,`--base-model qwen3-8b --datasets ./train.jsonl --training-type sft`,`--base-model qwen3-8b --datasets file-xxx --learning-rate "1.6e-5" --n-epochs 4`,`--base-model qwen3-8b --datasets file-xxx --output json`,`--base-model qwen3-8b --datasets file-xxx --dry-run`],notes:Af,run:e=>Nf(`text`,e)}),Ff=w({description:`Create an audio TTS model fine-tune job (sft-lora)`,auth:`apiKey`,usageArgs:`--base-model <model> --datasets <id|path> [--validations <id|path>] [--model-name <name>] [--suffix <text>]`,flags:Ef,exampleArgs:[`--base-model cosyvoice-v3-flash --datasets ./audio.zip`,`--base-model cosyvoice-v3-flash --datasets file-xxx`,`--base-model cosyvoice-v3-flash --datasets ./audio.zip --model-name my-tts`,`--base-model cosyvoice-v3-flash --datasets file-xxx --output json`,`--base-model cosyvoice-v3-flash --datasets ./audio.zip --dry-run`],notes:jf,run:e=>Nf(`audio`,e)}),If=w({description:`Create an image generation model fine-tune job (sft-lora)`,auth:`apiKey`,usageArgs:`--base-model <model> --datasets <id|path> [--validations <id|path>] [--model-name <name>] [--suffix <text>] [--generation-type <t2i|i2i>] [--learning-rate <str>]`,flags:Df,exampleArgs:[`--base-model wan2.7-image-pro --datasets ./images.zip`,`--base-model wan2.7-image-pro --datasets file-xxx`,`--base-model wan2.7-image-pro --datasets file-xxx --generation-type i2i`,`--base-model wan2.7-image-pro --datasets ./images.zip --model-name my-wan`,`--base-model wan2.7-image-pro --datasets file-xxx --output json`,`--base-model wan2.7-image-pro --datasets ./images.zip --dry-run`],notes:Mf,run:e=>Nf(`image`,e)}),Lf=w({description:`Create a video generation model fine-tune job (Wan i2v/kf2v, efficient_sft)`,auth:`apiKey`,usageArgs:`--base-model <model> --datasets <id|path> [--validations <id|path>] [--model-name <name>] [--suffix <text>] [--n-epochs <n>] [--batch-size <n>] [--learning-rate <str>]`,flags:Of,exampleArgs:[`--base-model wan2.7-i2v --datasets file-xxx`,`--base-model wan2.7-i2v --datasets ./i2v-data.zip`,`--base-model wan2.2-kf2v-flash --datasets file-xxx --n-epochs 100`,`--base-model wan2.7-i2v --datasets file-xxx --dry-run`],notes:[...kf,`Video generation training (Wan i2v/kf2v) runs efficient_sft with model-`,`specific defaults: wan2.7 (batch_size=1, max_pixels=102400), wan2.5/2.2`,`(batch_size=4, max_pixels per model). Override with --batch-size/--n-epochs.`,`Datasets are .zip archives with data.jsonl + frame images + videos.`,`Recommended: ≥10 training samples, 20-100 for stable results.`],run:e=>Nf(`video`,e)});var Rf=w({description:`List fine-tune jobs`,auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--status <s>] [--base-model <model>]`,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)`},baseModel:{type:`string`,valueHint:`<model>`,description:`Filter by base model ID (server-side)`}},exampleArgs:[``,`--status RUNNING`,`--base-model qwen3-8b`,`--page-size 20`],async run(e){let{settings:t,flags:n}=e,r=n.page,i=n.pageSize,a=n.status||void 0,o=n.baseModel||void 0;if(t.dryRun){A({action:`finetune.list`,page:r,page_size:i,status:a,model:o},`json`);return}let s=await ot(e.client,{pageNo:r,pageSize:i,status:a,model:o}),c=s.output??s.data,l=c?.jobs??[],u=c?.total;A({items:l.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??``})),total:u,request_id:s.request_id},`json`)}});async function zf(e,t){let n=ve(e),r=en(await ne({region:n.consoleRegion,site:n.consoleSite,switchAgent:n.consoleSwitchAgent},e.timeout,{api:d,data:{input:{pageNo:1,pageSize:10,group:!0,model:t,queryPrice:!0,querySampleCode:!1,queryGroupByModel:!0,queryQuota:!1,queryQpmInfo:!1,queryApplyStatus:!1,queryPermissions:!1,queryActivationStatus:!1}}})).list??[];for(let e of r){let n=e.items??[];for(let e of n)if(e.model===t)return(e.prices??[]).find(e=>e.type===`ft`)??null;if(e.model===t)return(e.prices??[]).find(e=>e.type===`ft`)??null}return null}async function Bf(e,t,n){try{let r=await zf(e,t),i=Number(r?.price);if(!Number.isFinite(i)||i<=0)return null;let a=r?.priceUnit??`每百万tokens`,o=n/1e6*i;return{cost:Number(o.toFixed(4)),unitPrice:i,priceUnit:a}}catch{return null}}var Vf=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{settings:t,flags:n}=e,r=n.jobId;if(t.dryRun){A({action:`finetune.get`,job_id:r},`json`);return}let i=await ze(e.client,r),a=i.output??i.data;if(!a){A({job_id:r,error:`No data returned`},`json`);return}let o=a.hyper_parameters,s=[];o?.n_epochs!==void 0&&s.push(`n_epochs=${o.n_epochs}`),o?.batch_size!==void 0&&s.push(`batch_size=${o.batch_size}`),o?.learning_rate!==void 0&&s.push(`learning_rate=${o.learning_rate}`),o?.max_length!==void 0&&s.push(`max_length=${o.max_length}`);let c=typeof a.usage==`number`?a.usage:void 0,l={job_id:a.job_id??r,base_model:a.model??``,status:a.status??``,training_type:a.training_type??``,training_files:a.training_file_ids??[],validation_files:a.validation_file_ids??[],hyper_params:s.length?s.join(` · `):``,output_model:a.finetuned_output??``,model_name:a.model_name??``,created_at:a.create_time??a.gmt_create??``,updated_at:a.end_time??a.gmt_modified??``,usage_tokens:c??``,charge_type:typeof a.charge_type==`string`?a.charge_type:``};if(c!==void 0&&c>0&&a.model){let e=await Bf(t,a.model,c);e&&(l.training_cost=e.cost,l.cost_basis=`${e.unitPrice} 元/${e.priceUnit}`)}A({...l,request_id:i.request_id},`json`)}}),Hf=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;if(t.dryRun){A({action:`finetune.cancel`,job_id:r},`json`);return}let i=await re(e.client,r);t.quiet?k(r):A(i,`json`)}}),Uf=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;if(t.dryRun){A({action:`finetune.delete`,job_id:r},`json`);return}let i=await he(e.client,r);t.quiet?k(r):A(i,`json`)}});function Wf(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 Gf(e,t){return Wf(e).toLowerCase().includes(t)}async function Kf(e,t,n){let r=[],i=1,a=0;for(let o=0;o<200;o++){let o=await Be(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 qf=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;if(t.dryRun){A({action:`finetune.logs`,job_id:r,page:i,page_size:a,search:o,tail:s},`json`);return}if(o||s!==void 0){let{entries:t,total:n}=await Kf(e.client,r,a??100),i=t,c;if(o){let e=o.toLowerCase();i=t.filter(t=>Gf(t,e)),c=i.length}let l=s!==void 0&&s>=0?Math.min(s,i.length):void 0,u=l===void 0?i:i.slice(i.length-l);A({...c===void 0?{}:{matched:c},scanned:t.length,total:n||t.length,...o?{search:o}:{},...l===void 0?{}:{tail:l},logs:u},`json`);return}A(await Be(e.client,r,{pageNo:i,pageSize:a}),`json`)}}),Jf=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:["`model_name` (shown for SUCCEEDED checkpoints) is the direct input for `deploy create --model-name`.","Checkpoints expire ~15 days after creation; `expire_time` shows the deadline. Export or deploy before expiry."],async run(e){let{settings:t,flags:n}=e,r=n.jobId;if(t.dryRun){A({action:`finetune.checkpoints`,job_id:r},`json`);return}let i=await nt(e.client,r),a=i.output??i.data,o=Array.isArray(a)?a:a?.checkpoints??[],s=Array.isArray(a)?a.length:a?.total??o.length,c=o.map(e=>({checkpoint:e.checkpoint??e.checkpoint_id??``,step:e.step===void 0?``:String(e.step),status:e.status??``,model_name:e.model_name??``,expire_time:e.expire_time??``}));A({items:c,total:s,request_id:i.request_id},`json`);let l=Date.now(),u=c.filter(e=>{if(!e.expire_time)return!1;let t=new Date(e.expire_time).getTime();if(Number.isNaN(t))return!1;let n=t-l;return n>0&&n<2592e5});u.length>0&&process.stderr.write(`\n[warning] ${u.length} checkpoint(s) will expire within 72 hours. Export or deploy before expiry to avoid losing the model artifact.
|
|
2717
|
+
`)}}),Yf=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{settings:t,flags:n}=e,r=n.jobId,i=n.checkpoint,a=n.modelName;if(t.dryRun){A({action:`finetune.export`,job_id:r,checkpoint:i,model_name:a},`json`);return}let o=await xe(e.client,r,i,a),s=(o.output??o.data)?.model_name??a;t.quiet?k(s):A(o,`json`)}});const Xf=new Set([`SUCCEEDED`,`FAILED`,`CANCELED`]);function Zf(){let e=new Date,t=e=>String(e).padStart(2,`0`);return`${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Qf(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 $f(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 ep=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,a=r.follow,o=Math.max(1,r.interval??10),c=r.pollTimeout;if(n.dryRun){A({action:`finetune.watch`,job_id:i,follow:a,interval:o,timeout:c},`json`);return}if(!a){let r=await ze(e.client,i),a=r.output??r.data,o=String(a?.status??``).toUpperCase(),c=Xf.has(o);if(n.quiet)k(o||`UNKNOWN`);else{let e={job_id:i,status:o||`UNKNOWN`,terminal:c,request_id:r.request_id},t=typeof a?.usage==`number`?a.usage:void 0;if(c&&t&&t>0&&a?.model){e.usage_tokens=t;let r=await Bf(n,a.model,t);r&&(e.training_cost=r.cost,e.cost_basis=`${r.unitPrice} 元/${r.priceUnit}`)}A(e,`json`)}if(c&&o!==`SUCCEEDED`)throw new t(`Fine-tune job ${i} ended in status ${o}.`,s.GENERAL);return}let l=new AbortController,u=()=>l.abort();process.on(`SIGINT`,u);try{let r=``,a=Date.now();for(;;){let u=await ze(e.client,i,l.signal),d=u.output??u.data,f=String(d?.status??``).toUpperCase();if(!n.quiet&&f!==r&&(process.stderr.write(`${Zf()} ${i} ${f||`UNKNOWN`}\n`),r=f),Xf.has(f)){let e=Date.now()-a;if(n.quiet)k(f||`UNKNOWN`);else{let e=typeof d?.usage==`number`?d.usage:void 0,t={...u};if(e&&e>0&&d?.model){let r=await Bf(n,d.model,e);r&&(t.training_cost=r.cost,t.usage_tokens=e,t.cost_basis=`${r.unitPrice} 元/${r.priceUnit}`)}A(t,`json`)}if(f!==`SUCCEEDED`)throw new t(`Fine-tune job ${i} ended in status ${f} (elapsed ${Qf(e)}).`,s.GENERAL);return}if(c!==void 0&&(Date.now()-a)/1e3>=c)throw new t(`Watching fine-tune job ${i} timed out after ${Qf(Date.now()-a)} (last status: ${f||`UNKNOWN`}).`,s.TIMEOUT);await $f(o*1e3,l.signal)}}catch(e){if(l.signal.aborted){process.stderr.write(`
|
|
2718
|
+
Interrupted.
|
|
2719
|
+
`);return}throw e}finally{process.off(`SIGINT`,u)}}});async function tp(e){return await De(y(e))}var np=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:`--base-model <m> | --training-type <t>`,flags:{baseModel:{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: ${g.join(` | `)}.`}},exampleArgs:[`--base-model qwen3-8b`,`--training-type sft-lora`,`--training-type cpt --output json`,`--training-type sft --quiet`],notes:[`Exactly one of --base-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.baseModel&&e.trainingType)return`--base-model and --training-type are mutually exclusive; pass one.`;if(!e.baseModel&&!e.trainingType)return`one of --base-model / --training-type is required.`},async run(e){let{settings:t,flags:n}=e,r=n.baseModel||void 0,i=n.trainingType||void 0;if(t.dryRun){A({action:`finetune.capability`,model:r,training_type:i},`json`);return}if(r){let e=await we(t,r);if(!e){A({model:r,error:`No foundation model found matching "${r}".`},`json`);return}let n=lt(e);if(t.quiet){for(let e of n)k(e);return}A({model:e.model??r,supported:n,supports:e.supports,trainingTypes:e.trainingTypes},`json`);return}if(!i||!Ze(i))throw new _(`--training-type "${i}" is not supported. Valid: ${g.join(`, `)}.`);let{method:a,variant:o}=Qt(i),s=(await tp(t)).filter(e=>vt(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 s)k(e.model);return}A({training_type:i,method:a,variant:o,count:s.length,models:s},`json`)}});const rp={baseModel:{type:`string`,valueHint:`<model>`,description:`Base model to fine-tune (e.g. qwen3-8b; not the output model name)`,required:!0},datasets:{type:`string`,valueHint:`<ids>`,description:`Training dataset file IDs, comma-separated (required)`,required:!0},trainingType:{type:`string`,valueHint:`<type>`,description:`Training type: sft | dpo | cpt (default: sft)`},nEpochs:{type:`number`,valueHint:`<n>`,description:`Number of training epochs (default: 3)`}},ip=[`sft`,`dpo`,`cpt`];var ap=w({description:`Estimate the training cost for a fine-tune job (token billing)`,auth:`console`,usageArgs:`--base-model <model> --datasets <ids> [--training-type <type>] [--n-epochs <n>]`,flags:rp,exampleArgs:[`--base-model qwen3-8b --datasets file-ft-xxx`,`--base-model qwen3-8b --datasets file-ft-xxx,file-ft-yyy --n-epochs 2`,`--base-model qwen3-8b --datasets file-ft-xxx --training-type cpt`],notes:[`Estimate only — the server computes token usage from the datasets; final cost is subject to the bill.`,`Covers token billing for sft / dpo / cpt. Training-unit (MTU) billing is not supported by this command.`,`Hyper-parameters other than --n-epochs are fixed at representative defaults for estimation.`],async run(e){let{settings:n,flags:r}=e,i=r.baseModel,a=r.datasets.split(`,`).map(e=>e.trim()).filter(Boolean),o=(r.trainingType??`sft`).toLowerCase(),c=r.nEpochs??3;if(!ip.includes(o))throw new t(`Unsupported training type "${o}". Supported: ${ip.join(`, `)}.`,s.USAGE);if(a.length===0)throw new t(`--datasets must contain at least one file ID.`,s.USAGE);if(n.dryRun){A({action:`finetune.price`,model:i,datasets:a,trainingType:o,nEpochs:c},`json`);return}let l=await Ae(e.client,i),u=Number(l.price);if(!Number.isFinite(u))throw new t(`No training price found for model "${i}".`,s.GENERAL,void 0,{rawResponse:JSON.stringify(l)});let d=o===`cpt`?await ye(e.client,i,a.join(`,`),c):await be(e.client,a,{nEpochs:c,batchSize:16,maxLength:8192}),f=d.estimatedDatasetConsumedTokensMinPerEpoch??0,p=d.estimatedDatasetConsumedTokensMaxPerEpoch??0,m=d.estimatedMixedConsumedTokensMinPerEpoch??0,h=d.estimatedMixedConsumedTokensMaxPerEpoch??0,g=(f+m)*c,_=(p+h)*c,v=g/1e3*u,y=_/1e3*u;A({model:i,training_type:o,n_epochs:c,unit_price:u,price_unit:l.priceUnit??`千Token`,estimated_tokens:{min:g,max:_},estimated_fee_yuan:{min:Number(v.toFixed(4)),max:Number(y.toFixed(4))},disclaimer:`Server-side estimate; final cost is subject to the bill.`},`json`)}});const op={modelName:{type:`string`,valueHint:`<model_name>`,description:`Model to deploy — fine-tuned output name or catalog model (required)`,required:!0},displayName:{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)`}},sp=`--model-name <model_name> --display-name <display_name> [--plan <plan>] [--deploy-spec <id>] [--capacity <n>] [--billing-method <m>] [--input-tpm <n>] [--output-tpm <n>] [--thinking-output-tpm <n>]`,cp=["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>`,"NOTE: --model-name is the model being deployed (e.g. `qwen3-8b-ft-...`).","The create response also returns a `deployed_model` field — the deployment","instance id (e.g. `qwen3-8b-5ecb5f068d79`). Use that id for inference","(`bl text chat --model <deployed_model>`) and lifecycle commands","(`deploy get/scale/pause/resume/delete --deployed-model <id>`)."];function lp(e,t){let n=t.plan||de(e),r=h[n];return r?r.validateFlags(t):`Unsupported plan "${n}". Supported plans: ${Object.keys(h).join(`, `)}.`}async function up(e,t){let{identity:n,settings:r,flags:i}=t,a=i.modelName,o=i.displayName,s=i.plan||de(e),c={model_name:a,name:o,plan:s,...(await Et(s).resolve({client:t.client,dryRun:r.dryRun,binName:n.binName,flags:i,model:a,name:o})).body};if(r.dryRun){A({action:`deploy.create`,body:c},`json`);return}let l=await ce(t.client,c),u=l.output??l.data;r.quiet?k(u?.deployed_model??``):A(l,`json`)}const dp=w({description:`Create a text model deployment`,auth:`apiKey`,usageArgs:sp,flags:op,exampleArgs:[`--model-name my-qwen-sft --display-name my-sft-test`,`--model-name qwen3.6-flash-2026-04-16 --display-name my-flash --plan ptu --input-tpm 10000 --output-tpm 1000`,`--model-name qwen3-8b --display-name my-qwen3-mu --plan mu`,`--model-name qwen3-8b --display-name my-qwen3 --plan mu --deploy-spec MU1 --capacity 2`],notes:cp,validate:e=>lp(`text`,e),run:e=>up(`text`,e)}),fp=w({description:`Create an audio (TTS) model deployment`,auth:`apiKey`,usageArgs:sp,flags:op,exampleArgs:[`--model-name my-cosyvoice-ft --display-name my-tts`,`--model-name my-cosyvoice-ft --display-name my-tts --deploy-spec dps-xxxx --capacity 1`,`--model-name my-cosyvoice-ft --display-name my-tts --dry-run`],notes:cp,validate:e=>lp(`audio`,e),run:e=>up(`audio`,e)}),pp=w({description:`Create an image generation model deployment`,auth:`apiKey`,usageArgs:sp,flags:op,exampleArgs:[`--model-name my-wan-ft --display-name my-wan`,`--model-name my-wan-ft --display-name my-wan-mu --plan mu`,`--model-name my-wan-ft --display-name my-wan --dry-run`],notes:cp,validate:e=>lp(`image`,e),run:e=>up(`image`,e)});var mp=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=n.status||void 0;if(t.dryRun){A({action:`deploy.list`,page:n.page,page_size:n.pageSize,status:r},`json`);return}let i=await at(e.client,{pageNo:n.page,pageSize:n.pageSize,status:r}),a=i.output??i.data,o=a?.deployments??[],s=a?.total;A({items:o.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??``})),total:s,request_id:i.request_id},`json`)}}),hp=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;if(t.dryRun){A({action:`deploy.get`,deployed_model:r},`json`);return}let i=await Re(e.client,r),a=i.output??i.data;if(!a){A({deployed_model:r,request_id:i.request_id},`json`);return}let o={deployed_model:a.deployed_model??r,deployed_name:a.name??``,model_name:a.model_name??``,base_model:a.base_model??``,status:a.status??``,plan:a.plan??``};a.model_unit_spec&&(o.model_unit_spec=a.model_unit_spec),a.charge_type&&(o.charge_type=a.charge_type),a.capacity!==void 0&&(o.capacity=a.capacity),a.base_capacity!==void 0&&(o.base_capacity=a.base_capacity),a.ready_capacity!==void 0&&(o.ready_capacity=a.ready_capacity),a.rpm_limit!==void 0&&(o.rpm_limit=a.rpm_limit),a.tpm_limit!==void 0&&(o.tpm_limit=a.tpm_limit),a.input_tpm!==void 0&&(o.input_tpm=a.input_tpm),a.output_tpm!==void 0&&(o.output_tpm=a.output_tpm),a.gmt_create&&(o.created_at=a.gmt_create),a.gmt_modified&&(o.updated_at=a.gmt_modified),A({...o,request_id:i.request_id},`json`)}}),gp=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=n.catalogVersion===``?void 0:n.catalogVersion??`v1.0`,i=n.source||void 0;if(t.dryRun){A({action:`deploy.models`,page:n.page,page_size:n.pageSize,version:r,model_source:i},`json`);return}let a=await it(e.client,{pageNo:n.page,pageSize:n.pageSize,version:r,modelSource:i}),o=a.output??a.data,s=o?.models??[],c=o?.total;A({items:s.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:c,request_id:a.request_id},`json`)}}),_p=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={};if(n.capacity!==void 0&&(i.capacity=n.capacity),n.inputTpm!==void 0&&(i.input_tpm=n.inputTpm),n.outputTpm!==void 0&&(i.output_tpm=n.outputTpm),t.dryRun){A({action:`deploy.scale`,deployed_model:r,body:i},`json`);return}let a=await Gt(e.client,r,i);t.quiet?k(r):A(a,`json`)}}),vp=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={};if(n.rpmLimit!==void 0&&(i.rpm_limit=n.rpmLimit),n.tpmLimit!==void 0&&(i.tpm_limit=n.tpmLimit),t.dryRun){A({action:`deploy.update`,deployed_model:r,body:i},`json`);return}let a=await tn(e.client,r,i);t.quiet?k(r):A(a,`json`)}}),yp=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;if(n.dryRun){A({action:`deploy.delete`,deployed_model:i},`json`);return}if(!r.skipPrecheck)try{let n=await Re(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. Run \`bl deploy pause --deployed-model ${i}\` to pause it first, or pass --skip-precheck to attempt deletion anyway.`,s.USAGE)}catch(e){if(e instanceof t)throw e}let a=await me(e.client,i);n.quiet?k(i):A(a,`json`)}}),bp=w({description:`Pause a running model deployment (stops billing for mu/ptu)`,auth:`console`,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 RUNNING/PENDING status precheck`}},exampleArgs:[`--deployed-model dep-...`,`--deployed-model dep-... --skip-precheck`,`--deployed-model dep-... --dry-run`],notes:["While paused, billing ceases for mu/ptu plans. Use `deploy resume` to bring it back online or `deploy delete` to remove.",`Precheck verifies status is RUNNING/PENDING before issuing the pause; pass --skip-precheck to bypass.`],async run(e){let{settings:n,flags:r}=e,i=r.deployedModel;if(n.dryRun){A({action:`deploy.pause`,deployed_model:i},`json`);return}if(!r.skipPrecheck)try{let n=je(await st(e.client),i);if(n){let e=(n.status??``).toUpperCase();if(e&&e!==`RUNNING`&&e!==`PENDING`)throw new t(`Deployment ${i} is ${e}. Only RUNNING / PENDING deployments can be paused. Pass --skip-precheck to attempt the pause anyway.`,s.USAGE)}}catch(e){if(e instanceof t)throw e}let a=await Yt(e.client,i);n.quiet?k(i):A({deployed_model:i,action:`pause`,...a},`json`)}}),xp=w({description:`Resume a paused model deployment (brings service back online)`,auth:`console`,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 status precheck`}},exampleArgs:[`--deployed-model dep-...`,`--deployed-model dep-... --skip-precheck`,`--deployed-model dep-... --dry-run`],notes:[`Precheck verifies status is STOPPED before issuing the resume; pass --skip-precheck to bypass.`,`For mu/ptu plans, billing resumes once the service is back online.`],async run(e){let{settings:n,flags:r}=e,i=r.deployedModel;if(n.dryRun){A({action:`deploy.resume`,deployed_model:i},`json`);return}if(!r.skipPrecheck)try{let n=je(await st(e.client),i);if(n){let e=(n.status??``).toUpperCase();if(e&&e!==`STOPPED`)throw new t(`Deployment ${i} is ${e}. Only STOPPED deployments can be resumed. Pass --skip-precheck to attempt the resume anyway.`,s.USAGE)}}catch(e){if(e instanceof t)throw e}let a=await Jt(e.client,i);n.quiet?k(i):A({deployed_model:i,action:`resume`,...a},`json`)}});const Sp={callerUacAccountId:{type:`string`,valueHint:`<id>`,description:`Caller UAC account ID`},namespaceId:{type:`string`,valueHint:`<id>`,description:`Product namespace ID (Token Plan default: namespace-1)`}},Cp={workspaceId:{type:`string`,valueHint:`<id>`,description:`Workspace ID (env: BAILIAN_WORKSPACE_ID, config: workspace_id)`}},wp={cn:`modelstudio.cn-beijing.aliyuncs.com`,intl:`modelstudio.ap-southeast-1.aliyuncs.com`};function Tp(e){for(let[t,n]of Object.entries(p))if(e===n||e.startsWith(`${n}/`))return t;return`cn`}function Ep(e){return wp[Tp(e)]??wp.cn}function Dp(e,n,r){let i=n.workspaceId||e.workspaceId;if(!i)throw new t(`Missing workspace ID.
|
|
2720
|
+
Set via: --workspace-id flag, env: BAILIAN_WORKSPACE_ID, or config: ${r} config set workspace_id <id>`,s.USAGE);return i}function Op(e,t){t.callerUacAccountId&&(e.CallerUacAccountId=t.callerUacAccountId),t.namespaceId&&(e.NamespaceId=t.namespaceId)}function kp(e,t,n){let r=S(n),i=Ep(e);return{host:i,endpoint:`https://${i}${t}${r?`?${r}`:``}`,queryString:r,queryParams:n}}async function Ap(e){let{client:t,baseUrl:n,action:r,path:i,method:a,queryParams:o}=e,{host:s}=kp(n,i,o);return t.openApiQueryJson({host:s,path:i,action:r,version:`2026-02-10`,method:a,queryParams:o})}const jp=`/tokenplan/subscription/seat-detail`;var Mp=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)`},...Sp,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=Np(n);if(t.dryRun){let{endpoint:t,queryParams:n}=kp(e.client.baseUrl,jp,i);A({endpoint:t,query:n},r);return}let a=await Ap({client:e.client,baseUrl:e.client.baseUrl,action:`GetSubscriptionSeatDetails`,path:jp,method:`GET`,queryParams:i}),o=a.Data?.Items??[];t.quiet||r===`text`?Pp(o,a.Data?.Total,a.Data?.PageNo,a.Data?.PageSize):A(a,r)}});function Np(e){let n={};if(e.pageNo!==void 0&&(n.PageNo=String(e.pageNo)),e.pageSize!==void 0&&(n.PageSize=String(e.pageSize)),Op(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'.`,s.USAGE);n.QueryAssigned=r}return n}function Pp(e,t,n,r){if(e.length===0){k(`No seats found.`);return}let i=[M(`SeatId`,18),M(`Type`,10),M(`Status`,10),M(`Assigned`,12),M(`Account`,20)].join(` `);k(i),k(`-`.repeat(i.length));for(let t of e)k([M(t.SeatId??`-`,18),M(t.SpecType??`-`,10),M(t.Status??`-`,10),M(t.AssignedStatus??`-`,12),M(t.AccountName??t.AccountId??`-`,20)].join(` `));t!==void 0&&(k(``),k(`Total: ${t}${n===void 0?``:` | Page: ${n}`}${r===void 0?``:` | PageSize: ${r}`}`))}const Fp=`/tokenplan/api-keys`;var Ip=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},...Cp,description:{type:`string`,valueHint:`<text>`,description:`API key description`},...Sp},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=Dp(n,r,t.binName),o=Lp(r,{accountId:r.accountId,workspaceId:a});if(n.dryRun){let{endpoint:t,queryParams:n}=kp(e.client.baseUrl,Fp,o);A({endpoint:t,query:n},i);return}let s=await Ap({client:e.client,baseUrl:e.client.baseUrl,action:`CreateTokenPlanKey`,path:Fp,method:`POST`,queryParams:o});n.quiet||i===`text`?Rp(s):A(s,i)}});function Lp(e,t){let n={};return n.AccountId=t.accountId,n.WorkspaceId=t.workspaceId,e.description&&(n.Description=e.description),Op(n,e),n}function Rp(e){let t=e.Data;if(!t){k(`API key created.`);return}k(`${M(`ApiKeyId`,14)} ${t.ApiKeyId??`-`}`),k(`${M(`MaskedApiKey`,14)} ${t.MaskedApiKey??`-`}`),t.Description&&k(`${M(`Description`,14)} ${t.Description}`),t.PlainApiKey&&(k(``),k(`PlainApiKey (shown once): ${t.PlainApiKey}`))}const zp=`/tokenplan/subscription/seat-assignments`;var Bp=w({description:`Batch assign Token Plan seats to members`,auth:`openapi`,usageArgs:`--workspace-id <id> --seat-type <type> --account-id <id> [flags]`,flags:{...Cp,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)`},...Sp,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=Vp(r,Dp(n,r,t.binName));if(n.dryRun){let{endpoint:t,queryParams:n}=kp(e.client.baseUrl,zp,a);A({endpoint:t,query:n},i);return}let o=await Ap({client:e.client,baseUrl:e.client.baseUrl,action:`BatchAssignSeats`,path:zp,method:`POST`,queryParams:a});n.quiet||i===`text`?k(`Seats assigned successfully.`):A(o,i)}});function Vp(e,t){let n={};return n.WorkspaceId=t,e.seatType&&(n.SeatType=e.seatType),Op(n,e),e.locale&&(n.Locale=e.locale),e.accountId&&e.accountId.length>0&&(n.AccountIds=e.accountId),n}const Hp=`/tokenplan/organization/member-additions`;var Up=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`},...Sp},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=Wp(n);if(t.dryRun){let{endpoint:t,queryParams:n}=kp(e.client.baseUrl,Hp,i);A({endpoint:t,query:n},r);return}let a=await Ap({client:e.client,baseUrl:e.client.baseUrl,action:`AddOrganizationMember`,path:Hp,method:`POST`,queryParams:i});t.quiet||r===`text`?Gp(a):A(a,r)}});function Wp(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),Op(t,e),t}function Gp(e){let t=e.Data;if(!t){k(`Member added.`);return}k(`${M(`AccountId`,14)} ${t.AccountId??`-`}`),k(`${M(`SeatAssigned`,14)} ${String(t.SeatAssigned??`-`)}`)}const Kp=[`bailian`,`claude`,`qoder`,`ark`,`all`],qp={bailian:` bailian:
|
|
2711
2721
|
# bl auth login --api-key <key> sets DASHSCOPE_API_KEY; --base-url <url> sets BAILIAN_BASE_URL
|
|
2712
2722
|
api_key: \${DASHSCOPE_API_KEY}
|
|
2713
2723
|
base_url: \${BAILIAN_BASE_URL}`,claude:` claude:
|
|
2714
2724
|
api_key: \${ANTHROPIC_API_KEY}`,qoder:` qoder:
|
|
2715
2725
|
api_key: \${QODER_PAT}
|
|
2716
2726
|
gateway: "https://api.qoder.com/api/v1/cloud"`,ark:` ark:
|
|
2717
|
-
api_key: \${ARK_API_KEY}`},
|
|
2727
|
+
api_key: \${ARK_API_KEY}`},Jp={bailian:` model: qwen3.8-max`,claude:` model: claude-sonnet-4-6`,qoder:` model: ultimate`,ark:` model: doubao-seed-2-1-pro-260628`};function Yp(e){let t=e.provider===`all`?`${qp.bailian}\n${qp.claude}\n${qp.qoder}\n${qp.ark}`:qp[e.provider],n=e.provider===`all`?` model:
|
|
2718
2728
|
bailian: qwen3.8-max
|
|
2719
2729
|
claude: claude-sonnet-4-6
|
|
2720
2730
|
qoder: ultimate
|
|
2721
|
-
ark: doubao-seed-2-1-pro-260628`:
|
|
2731
|
+
ark: doubao-seed-2-1-pro-260628`:Jp[e.provider],r=e.provider===`bailian`?`[bash, read, glob, grep]`:`[read, glob, grep, web_search, web_fetch]`;return`version: "1"
|
|
2722
2732
|
|
|
2723
2733
|
providers:
|
|
2724
2734
|
${t}
|
|
@@ -2742,15 +2752,15 @@ ${n}
|
|
|
2742
2752
|
environment: dev
|
|
2743
2753
|
tools:
|
|
2744
2754
|
builtin: ${r}
|
|
2745
|
-
`}var
|
|
2755
|
+
`}var Xp=w({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:Kp},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=T(n.output),a=r.provider??`bailian`,o=r.agentName??`assistant`,c=r.file??`agents.yaml`;if(P(c)&&!r.force)throw new t(`${c} already exists.`,s.USAGE,`Pass --force to overwrite.`);let l=`.gitignore`;if(n.dryRun){let e=!0;P(l)&&(e=!(await xr(l,`utf8`)).includes(`agents.state.json`)),A({would_create:c,provider:a,agent:o,would_update_gitignore:e},i);return}if(await Sr(c,Yp({provider:a,agentName:o}),`utf8`),P(l)){let e=await xr(l,`utf8`);e.includes(`agents.state.json`)||await Sr(l,e+`
|
|
2746
2756
|
# agents
|
|
2747
2757
|
agents.state.json
|
|
2748
2758
|
.env
|
|
2749
|
-
`,`utf8`)}else await
|
|
2759
|
+
`,`utf8`)}else await Sr(l,`# agents
|
|
2750
2760
|
agents.state.json
|
|
2751
2761
|
.env
|
|
2752
|
-
`,`utf8`);i===`json`?
|
|
2762
|
+
`,`utf8`);i===`json`?A({created:c,provider:a,agent:o},i):(k(`Created ${c}`),(a===`bailian`||a===`all`)&&k("Credentials: run `bl auth login --api-key <key> --base-url <url>`, or set DASHSCOPE_API_KEY / BAILIAN_BASE_URL."),k("Next: edit agents.yaml, then run `bl managed-agent plan`."))}});const Zp=`/api/v1/agentstudio`,Qp=[...new Set([...Object.values(Dr).flatMap(e=>e.map(e=>e.key)),`BAILIAN_API_KEY`,`BAILIAN_BASE_URL`,`CLAUDE_API_KEY`,`QODER_API_KEY`])],$p={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.`],em=[`Runs fully offline against local files: no login or provider credentials required.`];function tm(){jr();for(let e of Qp)process.env[e]===void 0&&(process.env[e]=``)}function nm(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(Zp)?e:`${e}${Zp}`}`workspace_id`in r&&!r.workspace_id&&t.settings.workspaceId&&(r.workspace_id=t.settings.workspaceId)}function rm(){for(let e of Qp)delete process.env[e]}function im(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 am(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.`,s.AUTH,$p[n]??`Provide credentials for provider '${n}'.`)}}function om(e,t){let n=dr(e);return{projectId:t??F(cr(n))}}async function sm(e,t,n){let r=dr(e),i=new Or({configPath:r,statePath:t}).getStatePath(om(r,n));return kr.load(i)}let cm=!1;function lm(e){if(cm)return;let t=Er.setDefaultFetch;typeof t==`function`&&(t(ue(e)),cm=!0)}async function um(e,t,n={}){tm();let r=await Kr(t,n);return im(r.config.providers),nm(r.config.providers,e),rm(),(n.credentials??`all`)!==`none`&&am(r.config.providers),r}async function X(e,t,n={}){lm(e);let{config:r,configPath:i,projectName:a}=await um(e,t,n);return{...Mr({projectName:a,config:r,state:await sm(i,n.statePath,a),configPath:i,providers:r.providers}),configPath:i}}function dm(e,t){if(!(!t||t===`all`)&&!e.providers.has(t))throw new Ar(`Provider '${t}' is not configured. Available providers: ${Array.from(e.providers.keys()).join(`, `)||`none`}.`)}function fm(e){let t=e;return typeof t.statusCode==`number`&&typeof t.responseBody==`string`}function pm(e){try{let t=JSON.parse(e);if(t&&typeof t==`object`)return t}catch{}return{message:e.trim()||void 0}}function mm(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 Ar?mm(e)?new t(e.message,s.TIMEOUT,"The session may still be running — check `bl managed-agent session get --session-id <id>` or `session events`."):new t(e.message,s.USAGE):e instanceof Error&&fm(e)?ut(e.statusCode,pm(e.responseBody)):e instanceof TypeError&&e.message===`fetch failed`?e:e instanceof Error?new t(e.message,s.GENERAL):e}}var hm=w({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:em,async run(e){let{settings:n,flags:r}=e,i=T(n.output),a=r.file??`agents.yaml`,o=await Z(async()=>{let{config:t}=await um(e,a,{credentials:`none`});return Zr(t)}),c=o.filter(e=>e.severity===`error`).length;if(i===`json`)A({valid:c===0,diagnostics:o},i);else{for(let e of o){let t=e.resource?` (${e.resource.type}.${e.resource.name})`:``;k(`[${e.severity}] ${e.message}${t}`)}c===0&&k(`Configuration is valid.`)}if(c>0)throw new t(`Validation failed with ${c} error(s).`,s.GENERAL)}});function gm(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 _m(e){process.stderr.write(`${e.message}\n`)}var vm=w({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=T(n.output),a=r.file??`agents.yaml`,o=!!r.noRefresh||n.dryRun,c=(await Z(()=>Q(async()=>{let t=await X(e,a,{credentials:o?`none`:`all`});return dm(t,r.provider),Gr(t,{provider:r.provider,refresh:!o,quiet:i===`json`,onFeedback:i===`json`?void 0:_m})}))).plan,l=c.diagnostics.some(e=>e.severity===`error`);if(i===`json`){if(A(c,i),l)throw new t(`Plan contains errors.`,s.GENERAL);return}for(let e of c.diagnostics)k(`[${e.severity}] ${e.code}: ${e.message}`);if(l)throw new t(`Plan contains errors.`,s.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){k(`No changes. Infrastructure is up-to-date.`),r.refreshOnly&&k(`Refresh-only mode: no remote mutations were performed.`);return}k(`
|
|
2753
2763
|
Planned actions:
|
|
2754
|
-
`);for(let e of u)
|
|
2764
|
+
`);for(let e of u)k(` + ${gm(e.address)}`);for(let e of d)k(` ~ ${gm(e.address)}`),e.reason&&k(` ${e.reason}`);for(let e of f)k(` - ${gm(e.address)}`);k(`\nPlan: ${u.length} to create, ${d.length} to update, ${f.length} to destroy.`),r.refreshOnly&&k(`Refresh-only mode: no remote mutations will be performed.`)}}),ym=w({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=T(n.output),a=r.file??`agents.yaml`;if(n.dryRun){A({would_apply:{provider:r.provider??`all`,refresh:!r.noRefresh,concurrency:r.concurrency},config_file:a,hint:"Run `managed-agent plan` to preview the exact resource changes."},i);return}let o=await Z(()=>Q(async()=>{let t=await X(e,a);return dm(t,r.provider),Gr(t,{provider:r.provider,refresh:!r.noRefresh,quiet:!0,onFeedback:_m})})),c=o.plan,l=e=>{i===`json`?process.stderr.write(`${e}\n`):k(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.`,s.GENERAL)}let u=c.actions.filter(e=>e.action!==`no-op`);if(u.length===0){i===`json`?A({succeeded:0,failed:0,skipped:0,results:[]},i):k(`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=o.destructiveActions;for(let e of u)l(` ${e.action===`create`?`+`:e.action===`update`?`~`:`-`} ${gm(e.address)}`);if(!r.yes)throw new t(`Refusing to apply ${u.length} change(s) (${d} create, ${f} update, ${p.length} destroy) without confirmation.`,s.USAGE,"Review with `bl managed-agent plan`, then re-run with --yes to apply.");let m=await Z(()=>Q(()=>Ir(o,{onFeedback:_m,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`?A({succeeded:h,failed:g,skipped:_,results:m.results},i):k(`\nApply finished: ${h} succeeded, ${g} failed, ${_} skipped.`),g>0)throw new t(`Apply failed.`,s.GENERAL)}}),bm=w({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=T(n.output),a=r.file??`agents.yaml`;if(n.dryRun){A({would_destroy:{cascade:!!r.cascade},config_file:a,hint:"Run `managed-agent state list` to see the resources tracked in state."},i);return}let o=await Z(()=>Q(async()=>Wr(await X(e,a)))),c=o.resources;if(c.length===0){i===`json`?A({destroyed:0,total:0},i):k(`No resources in state. Nothing to destroy.`);return}for(let e of c){let t=` - ${gm(e.address)} [${e.remote_id}]`;i===`json`?process.stderr.write(`${t}\n`):k(t)}if(!r.yes)throw new t(`Refusing to destroy ${c.length} resource(s) without confirmation.`,s.USAGE,`Re-run with --yes to destroy (add --cascade to remove dependents).`);let l=await Z(()=>Q(()=>Fr(o,{cascade:r.cascade,onCascadeRequired:async()=>!!r.cascade,onResourceResult:e=>{let t=gm(e.resource.address);process.stderr.write(` ${e.status===`success`?`✓`:`✗`} ${t}\n`)}})));if(i===`json`?A({destroyed:l.destroyed,total:l.resources.length},i):k(`\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.`,s.GENERAL)}}),xm=w({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:em,async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`,a=await Z(()=>Q(async()=>(await X(e,i,{credentials:`none`})).state.listResources()));if(r===`json`){A({resources:a},r);return}if(a.length===0){k(`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 j(o,s))k(e);k(`\nTotal: ${a.length}`)}}),Sm=w({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:em,async run(e){let{settings:n,flags:r}=e,i=T(n.output),a=r.file??`agents.yaml`,o=await Z(()=>Q(async()=>{let t=await X(e,a,{credentials:`none`}),n=Ur(r.address,{requireProvider:!1});return t.state.findResource(n)}));if(!o)throw new t(`Resource not found: ${r.address}`,s.GENERAL);i===`json`?A(o,i):k(JSON.stringify(o,null,2))}}),Cm=w({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:em,async run(e){let{settings:n,flags:r}=e,i=T(n.output),a=r.file??`agents.yaml`;if(n.dryRun){await Z(async()=>{Ur(r.address,{requireProvider:!1})}),A({would_remove:r.address,config_file:a},i);return}await Z(()=>Q(async()=>{let n=await X(e,a,{credentials:`none`}),i=Ur(r.address,{requireProvider:!1}),o=n.state.findResource(i);if(!o)throw new t(`Resource not found: ${r.address}`,s.GENERAL);n.state.removeResource(o.address),await n.state.save()}));let o=`Removed ${r.address} from state (remote resource not deleted).`;i===`json`?A({removed:r.address},i):k(o)}}),wm=w({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=T(t.output),i=n.file??`agents.yaml`;if(t.dryRun){await Z(async()=>{Ur(n.address,{requireProvider:!0})}),A({would_import:n.address,remote_id:n.remoteId,resource_version:n.resourceVersion,config_file:i},r);return}await Z(()=>Q(async()=>{let t=Ur(n.address,{requireProvider:!0});await Rr(await X(e,i),t,n.remoteId,{resourceVersion:n.resourceVersion})})),r===`json`?A({imported:n.address,remote_id:n.remoteId},r):k(`Imported ${n.address} (remote_id: ${n.remoteId}) into state.`)}});function Tm(e){return e.type!==`thinking`&&!(e.type===`message`&&e.role===`user`)}function Em(e,t){t||process.stderr.write(`\n[session ${e}]\n`)}function Dm(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 Om(e,n){if(e===`failed`)throw new t(n??`Session failed.`,s.GENERAL)}async function km(e,t,n={}){let r=[],i,a;for await(let n of e)if(t?r.push(n):Am(n),n.type===`error`&&n.content?.trim()&&(a=n.content),n.type===`status`&&zr(n.status)){i=n.status,Em(n.status??``,t);break}t&&process.stdout.write(`${JSON.stringify({...n,events:Qr(r)},null,2)}\n`),Om(i,a)}function Am(e){if(Tm(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(`
|
|
2755
2765
|
[session running]
|
|
2756
|
-
`):e.type===`error`&&process.stderr.write(`\n[error] ${e.content??`unknown error`}\n`)}function Tf(e,t,n={}){if(t)process.stdout.write(`${JSON.stringify({...n,events:Nr(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)wf(t);bf(e.terminalStatus,t)}Sf(e.terminalStatus,xf(e.result.events))}function Ef(e){return e?e.split(`,`).map(e=>e.trim()).filter(Boolean):void 0}var Df=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){P({would_create_session:{agent:n.agent??`auto`,provider:n.provider??`auto`,environment:n.environment,vault:n.vault,memory_stores:Ef(n.memoryStores),title:n.title},config_file:i},r);return}let{agentName:a,session:o}=await Z(()=>Q(async()=>mr(await X(e,i),{agent:n.agent,provider:n.provider,environment:n.environment,vault:n.vault,memoryStores:Ef(n.memoryStores),title:n.title})));if(r===`json`){P({agent:a,session:o},r);return}M(`Session created: ${o.id}`),M(` Agent: ${a}`),M(` Environment: ${o.environment_id}`),M(` Status: ${o.status}`),o.vault_ids.length&&M(` Vaults: ${o.vault_ids.join(`, `)}`),o.memory_store_ids.length&&M(` Memory: ${o.memory_store_ids.join(`, `)}`)}});async function Of(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 kf=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 Of(async e=>{let r=await Sr(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`){P({sessions:s,has_more:o},r);return}if(s.length===0){M(`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 F(l,u))M(e);M(`\nTotal: ${s.length}`),o&&M(`More sessions available. Use --all to fetch all.`)}}),Af=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()=>vr(await X(e,i),n.sessionId,n.provider)));if(r===`json`){P(a,r);return}M(` ID: ${a.id}`),M(` Agent: ${a.agent_id}`),M(` Environment: ${a.environment_id}`),M(` Status: ${a.status}`),a.title&&M(` Title: ${a.title}`),M(` Created: ${a.created_at}`),M(` Updated: ${a.updated_at}`)}}),jf=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){P({would_delete_session:n.sessionId,provider:n.provider??`auto`,config_file:i},r);return}await Z(()=>Q(async()=>{await hr(await X(e,i),n.sessionId,n.provider)})),r===`json`?P({deleted:n.sessionId},r):M(`Session ${n.sessionId} deleted.`)}}),Mf=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:Ef(n.memoryStores),title:n.title};if(t.dryRun){P({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 jr(t,n.prompt,o);a||process.stderr.write(`Session created: ${e.session.id}\n`),Tf(e,a,{session_id:e.session.id,provider:e.provider,agent:e.agentName})}else{let e=await Ar(t,n.prompt,o);a||process.stderr.write(`Session created: ${e.session.id}\n`),await Cf(e.events,a,{session_id:e.session.id,provider:e.provider,agent:e.agentName})}}))}}),Nf=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){P({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?Tf(await Or(t,n.sessionId,n.message,{provider:n.provider}),a,{session_id:n.sessionId}):await Cf(await kr(t,n.sessionId,n.message,{provider:n.provider}),a,{session_id:n.sessionId})}))}}),Pf=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 Of(async e=>{let r=await xr(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`){P({events:Nr(a),has_more:o},r);return}if(a.length===0){M(`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 F(s,c))M(e);M(`\nTotal: ${a.length}`),o&&M(`More events available. Use --all to fetch all.`)}});const Ff=[`custom`,`official`,`all`];var If=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&&!Ff.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 Cr(t,{provider:n.provider,source:a});let[r,o]=await Promise.all([Cr(t,{provider:n.provider,source:`custom`}),Cr(t,{provider:n.provider,source:`official`})]);return[...r,...o]}));if(r===`json`){P({source:a,skills:o},r);return}if(o.length===0){M(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 F(s,c))M(e);M(`\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`},Lf={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)`}},Rf=1e3;function zf(e){return new Promise(t=>setTimeout(t,e))}function Bf(e){return e?.data?.DataV2?.data?.data}function Vf(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 Hf=T({description:`Initialize Bailian workspace and activate postpaid services`,auth:`none`,usageArgs:`--access-key-id <id> --access-key-secret <secret> [--security-token <token>]`,flags:Lf,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){P({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:a,accessKeySecret:o}=r;if(!a||!o)throw new t(`workspace init requires --access-key-id and --access-key-secret.`,s.USAGE);let c=r.securityToken||void 0,l=(await Te({identity:e.identity,settings:n,baseUrl:e.client.baseUrl,accessKeyId:a,accessKeySecret:o,securityToken:c})).cliAccessToken;if(!l)throw new t(`Failed to generate CLI access token from AK/SK.`,s.GENERAL);let u=me(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 C(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}};M(`Checking workspace status...`);let m=Bf(await p($.loginInfo));m?.spaceInited===!0?M(`Workspace already initialized.`):(M(`Initializing workspace...`),await p($.initSpace),M(`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.`,s.GENERAL);let g={identity:e.identity,settings:n,baseUrl:e.client.baseUrl,regionId:u.consoleRegion,accessKeyId:a,accessKeySecret:o,securityToken:c};try{await re({...g,reqDTO:{outerKey:h,nickName:h,userName:h}})}catch(e){if(!(e instanceof t)||!/already exists/i.test(e.message))throw e;M(`Console user already exists, continuing.`)}M(`Resolving workspace agent...`);let _=Vf(await Ge(g));if(_==null)throw new t(`Could not resolve agentId from ListWorkspaces response.`,s.GENERAL,`Re-run with --verbose to inspect the ListWorkspaces response body.`);M(`Authorizing user permissions...`),await Ct({...g,outerKey:h,agentId:_,policyIndexList:[1]}),await Uf(p,i)}});async function Uf(e,n){M(`Checking service activation status...`);let r;for(let t=0;t<20;t++){let n=Bf(await e($.queryBuyResult));if(r=typeof n==`string`?n:n?.result,r!==`buying`)break;t===0&&M(`Service activation in progress, polling...`),await zf(Rf)}if(r===`fail`)throw new t(`Service activation failed.`,s.GENERAL);if(r===`success`){await Kf(e,n);return}await Gf(e,n)}function Wf(e){let t=Bf(e);return Array.isArray(t)?t:[]}async function Gf(e,t){let n=Wf(await e($.commodityOrderInfo)),r=n.filter(e=>e.status===11);if(r.length>0){M(`Warning: Some services are overdue:`);for(let e of r)M(` - ${e.commodityCode}`)}let i=n.filter(e=>e.status===1);if(i.length>0){M(`Activating ${i.length} postpaid services...`),await e($.buyCommodity),await Kf(e,t);return}P({status:`ready`,activeServices:n.filter(e=>e.status===10).map(e=>e.commodityCode)},t)}async function Kf(e,n){M(`Waiting for services to activate...`);for(let t=0;t<20;t++){let t=Wf(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){M(`Warning: Some services are overdue:`);for(let t of e)M(` - ${t.commodityCode}`)}P({status:`ready`,activeServices:t.filter(e=>e.status===10).map(e=>e.commodityCode)},n);return}await zf(Rf)}throw new t(`Timed out waiting for services to activate.`,s.TIMEOUT)}var qf=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){P({installed:await e.commandPacks.install(e.flags.package)},E(e.settings.output))}}),Jf=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){P({linked:await e.commandPacks.link(e.flags.path)},E(e.settings.output))}}),Yf=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`){P({command_packs:t},n);return}if(t.length===0){M(`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 F([`NAME`,`VERSION`,`SOURCE`,`STATUS`,`COMMANDS / ERROR`],r))M(e)}}),Xf=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),P({removed:e.flags.name},E(e.settings.output))}}),Zf=T({description:`Install skills from the Bailian skill registry into local agents`,auth:`none`,usageArgs:`--all | --name <name,...>`,flags:{all:{type:`switch`,description:`Install all skills from the registry`},name:{type:`string`,valueHint:`<name,...>`,description:`Comma-separated skill names to install`}},validate(e){if(e.all&&e.name)return`Use either --all or --name, not both`;if(!e.all&&!e.name)return`Specify --all to install everything or --name <name,...> for specific skills`},exampleArgs:[`--all`,`--name spark-video,bailian-model-recommend`],async run(e){let n=e.settings.outputExplicit?e.settings.output:`json`,r=await Ce(),i=Object.keys(r.skills),a=e.flags.all?`all`:dt(e.flags.name,!1),o=a===`all`?i:a,c=_t(),l=fe(),u=await jt(o.map(e=>async()=>{let t=r.skills[e];if(!t)return{name:e,status:`failed`,reason:`skill not found in registry`};try{let n=await Re(e,t,l,c.skills[e]?.links??[]);return c.skills[e]=n.lockEntry,{name:e,status:`installed`,publishedAt:t.publishedAt,agents:n.linkedAgents}}catch(t){return{name:e,status:`failed`,reason:t instanceof Error?t.message:String(t)}}}),3);if(Gt(c),n===`json`)P({registry:Fe(),agents:l.map(e=>e.id),skills:u},n);else if(u.length===0)M(`Skill registry is empty; no skills to install.`);else{let e=u.map(e=>[e.name,e.status,e.publishedAt?e.publishedAt.slice(0,10):`-`,e.status===`installed`?e.agents?.join(`, `)||`-`:e.reason??`-`]);for(let t of F([`NAME`,`STATUS`,`PUBLISHED`,`AGENTS / REASON`],e))M(t)}let d=u.filter(e=>e.status===`failed`);if(d.length>0)throw new t(`${d.length}/${u.length} skill(s) failed to install`,s.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill add`)}}),Qf=T({description:`Update installed skills to the latest registry versions`,auth:`none`,usageArgs:`[--all] [--name <name,...>]`,flags:{all:{type:`switch`,description:`Update all installed skills (default when neither --all nor --name is given)`},name:{type:`string`,valueHint:`<name,...>`,description:`Comma-separated skill names to update (must be already installed)`}},validate(e){if(e.all&&e.name)return`Use either --all or --name, not both`},exampleArgs:[``,`--all`,`--name spark-video`],async run(e){let n=e.settings.outputExplicit?e.settings.output:`json`,r=e.flags.all||!e.flags.name?`all`:dt(e.flags.name,!1),i=await Ce(),a=_t(),o=new Set(Ze()),c=fe(),l=[],u=[];if(r===`all`)for(let[e,t]of Object.entries(a.skills)){let n=i.skills[e];if(!n){l.push({name:e,status:`skipped`,reason:`delisted from remote; local copy retained`});continue}if(n.contentHash===t.contentHash&&o.has(e)){let n=_e(e,c,t.links??[]);a.skills[e]={...t,links:n.links},l.push({name:e,status:`up-to-date`,publishedAt:t.publishedAt});continue}u.push(e)}else for(let e of r){if(!a.skills[e]){l.push({name:e,status:`failed`,reason:`not installed; run bl skill add --name `+e+` first`});continue}u.push(e)}let d=await jt(u.map(e=>async()=>{let t=i.skills[e];if(!t)return{name:e,status:`failed`,reason:`skill not found in registry`};try{let n=await Re(e,t,c,a.skills[e]?.links??[]);return a.skills[e]=n.lockEntry,{name:e,status:`updated`,publishedAt:t.publishedAt}}catch(t){return{name:e,status:`failed`,reason:t instanceof Error?t.message:String(t)}}}),3);if(l.push(...d),Gt(a),n===`json`)P({registry:Fe(),skills:l},n);else if(l.length===0)M(`No skills installed locally; run bl skill add first.`);else{let e=l.map(e=>[e.name,e.status,e.publishedAt?e.publishedAt.slice(0,10):`-`]);for(let t of F([`NAME`,`STATUS`,`PUBLISHED`],e))M(t);let t=l.filter(e=>(e.status===`skipped`||e.status===`failed`)&&e.reason);if(t.length>0){M(``);for(let e of t)M(` ${e.name}: ${e.reason}`)}}let f=l.filter(e=>e.status===`failed`);if(f.length>0)throw new t(`${f.length} skill(s) failed to update`,s.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill update`)}}),$f=T({description:`Remove locally installed skills (registry is untouched)`,auth:`none`,usageArgs:`--name <all|name,...>`,flags:{name:{type:`string`,valueHint:`<all|name,...>`,description:`Skills to remove: all or comma-separated skill names`,required:!0}},exampleArgs:[`--name spark-video`,`--name all`],async run(e){let n=e.settings.outputExplicit?e.settings.output:`json`,r=dt(e.flags.name,!1),i=_t(),a=r===`all`?Object.keys(i.skills):r;if(a.length===0){P({skills:[]},n),n===`text`&&M(`No skills installed locally; nothing to remove.`);return}let o=new Set(Ze()),c=[];for(let e of a){let t=i.skills[e];if(!t){c.push({name:e,status:`failed`,reason:o.has(e)?`directory not managed by bl skill (untracked); remove manually if needed`:`not installed`});continue}try{let n=Rt(e,t.links??[]);xt(e),delete i.skills[e],c.push({name:e,status:`removed`,removedLinks:n.length})}catch(t){c.push({name:e,status:`failed`,reason:t instanceof Error?t.message:String(t)})}}if(Gt(i),n===`json`)P({skills:c},n);else{let e=c.map(e=>[e.name,e.status,e.status===`removed`?`reclaimed ${e.removedLinks} agent link(s)`:e.reason??`-`]);for(let t of F([`NAME`,`STATUS`,`DETAIL`],e))M(t)}let l=c.filter(e=>e.status===`failed`);if(l.length>0)throw new t(`${l.length}/${c.length} skill(s) failed to remove`,s.GENERAL,`Check the reason for failed skills in the output; use bl skill list to verify local install status`)}});function ep(e){return e?e.length>60?`${e.slice(0,59)}…`:e:`-`}var tp=T({description:`List registry skills and diff against local installs`,auth:`none`,exampleArgs:[``,`--output json`],notes:[`STATUS: installed | outdated | not-installed | missing (lock has it, dir deleted) | untracked (dir exists, not managed)`],async run(e){let t=e.settings.outputExplicit?e.settings.output:`json`,n=await Ce(),r=ne(n,_t(),Ze());if(t===`json`){P({registry:Fe(),...n.updatedAt?{updatedAt:n.updatedAt}:{},skills:r},t);return}if(r.length===0){M(`Skill registry is empty and no skills are installed locally.`);return}let i=r.map(e=>[e.name,e.status,e.publishedAt?e.publishedAt.slice(0,19).replace(`T`,` `):`-`,ep(e.description)]);for(let e of F([`NAME`,`STATUS`,`UPDATEDAT`,`DESCRIPTION`],i))M(e)}}),np=T({description:`Install all bailian-* skills (one-shot bootstrap for new environments)`,auth:`none`,usageArgs:``,exampleArgs:[``],notes:[`Fetches the registry index and installs every skill whose name starts with bailian-`,`Equivalent to: bl skill add --all (filtered to bailian-* skills)`],async run(e){let n=e.settings.outputExplicit?e.settings.output:`json`,r=await Ce(),i=Object.keys(r.skills).filter(e=>e.startsWith(`bailian-`)),a=_t(),o=fe(),c=await jt(i.map(e=>async()=>{let t=r.skills[e];try{let n=await Re(e,t,o,a.skills[e]?.links??[]);return a.skills[e]=n.lockEntry,{name:e,status:`installed`,publishedAt:t.publishedAt,agents:n.linkedAgents}}catch(t){return{name:e,status:`failed`,reason:t instanceof Error?t.message:String(t)}}}),3);if(Gt(a),n===`json`)P({registry:Fe(),agents:o.map(e=>e.id),skills:c},n);else if(c.length===0)M(`No bailian-* skills found in the registry.`);else{let e=c.map(e=>[e.name,e.status,e.publishedAt?e.publishedAt.slice(0,10):`-`,e.status===`installed`?e.agents?.join(`, `)||`-`:e.reason??`-`]);for(let t of F([`NAME`,`STATUS`,`PUBLISHED`,`AGENTS / REASON`],e))M(t)}let l=c.filter(e=>e.status===`failed`);if(l.length>0)throw new t(`${l.length}/${c.length} skill(s) failed to install`,s.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill init`)}});export{Cl as advisorRecommend,hs as appCall,_s as appList,si as authGenerateAccessToken,ii as authLogin,oi as authLogout,ai as authStatus,cs as configAgent,na as configList,ta as configSet,ea as configShow,wo as configUi,ra as configUse,cc as consoleCall,vu as datasetDelete,_u as datasetGet,gu as datasetList,hu as datasetUpload,bu as datasetValidate,sd as deployAudioCreate,md as deployDelete,ud as deployGet,cd as deployImageCreate,ld as deployList,dd as deployModels,fd as deployScale,od as deployTextCreate,pd as deployUpdate,sc as fileUpload,Pu as finetuneAudioCreate,Ru as finetuneCancel,ed as finetuneCapability,Wu as finetuneCheckpoints,zu as finetuneDelete,Gu as finetuneExport,Lu as finetuneGet,Fu as finetuneImageCreate,Iu as finetuneList,Uu as finetuneLogs,Nu as finetuneTextCreate,Xu as finetuneWatch,ki as imageEdit,Ti as imageGenerate,Ns as knowledgeChat,Ts as knowledgeRetrieve,Ds as knowledgeSearch,pf as managedAgentApply,mf as managedAgentDestroy,Ud as managedAgentInit,ff as managedAgentPlan,Df as managedAgentSessionCreate,jf as managedAgentSessionDelete,Pf as managedAgentSessionEvents,Af as managedAgentSessionGet,kf as managedAgentSessionList,Mf as managedAgentSessionRun,Nf as managedAgentSessionSend,If as managedAgentSkillList,vf as managedAgentStateImport,hf as managedAgentStateList,_f as managedAgentStateRm,gf as managedAgentStateShow,lf as managedAgentValidate,Us as mcpCall,Gs as mcpList,Ks as mcpTools,vs as memoryAdd,Ss as memoryDelete,bs as memoryList,Cs as memoryProfileCreate,ws as memoryProfileGet,ys as memorySearch,xs as memoryUpdate,Fl as modelList,rl as pipelineRun,cl as pipelineValidate,qf as pluginInstall,Jf as pluginLink,Yf as pluginList,Xf as pluginRemove,mu as quotaCheck,su as quotaHistory,Jl as quotaList,eu as quotaRequest,Js as searchWeb,Zf as skillAdd,np as skillInit,tp as skillList,$f as skillRemove,Qf as skillUpdate,ic as speechRecognize,$s as speechSynthesize,_i as textChat,wi as textOmni,Id as tokenPlanAddMember,Nd as tokenPlanAssignSeats,kd as tokenPlanCreateKey,Td as tokenPlanListSeats,ms as update,tl as usageCodingPlan,Pc as usageFree,Fc as usageFreetier,zc as usageStats,Bc as usageSummary,Jc as usageTokenPlan,Li as videoDownload,Pi as videoEdit,Ni as videoGenerate,Fi as videoRef,Ii as videoTaskGet,Vi as visionDescribe,Hf as workspaceInit,Bl as workspaceList};
|
|
2766
|
+
`):e.type===`error`&&process.stderr.write(`\n[error] ${e.content??`unknown error`}\n`)}function jm(e,t,n={}){if(t)process.stdout.write(`${JSON.stringify({...n,events:Qr(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)Am(t);Em(e.terminalStatus,t)}Om(e.terminalStatus,Dm(e.result.events))}function Mm(e){return e?e.split(`,`).map(e=>e.trim()).filter(Boolean):void 0}var Nm=w({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=T(t.output),i=n.file??`agents.yaml`;if(t.dryRun){A({would_create_session:{agent:n.agent??`auto`,provider:n.provider??`auto`,environment:n.environment,vault:n.vault,memory_stores:Mm(n.memoryStores),title:n.title},config_file:i},r);return}let{agentName:a,session:o}=await Z(()=>Q(async()=>Nr(await X(e,i),{agent:n.agent,provider:n.provider,environment:n.environment,vault:n.vault,memoryStores:Mm(n.memoryStores),title:n.title})));if(r===`json`){A({agent:a,session:o},r);return}k(`Session created: ${o.id}`),k(` Agent: ${a}`),k(` Environment: ${o.environment_id}`),k(` Status: ${o.status}`),o.vault_ids.length&&k(` Vaults: ${o.vault_ids.join(`, `)}`),o.memory_store_ids.length&&k(` Memory: ${o.memory_store_ids.join(`, `)}`)}});async function Pm(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 Fm=w({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=T(t.output),i=n.file??`agents.yaml`,{items:a,hasMore:o}=await Z(()=>Q(async()=>{let t=await X(e,i);return Pm(async e=>{let r=await Vr(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`){A({sessions:s,has_more:o},r);return}if(s.length===0){k(`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 j(l,u))k(e);k(`\nTotal: ${s.length}`),o&&k(`More sessions available. Use --all to fetch all.`)}}),Im=w({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=T(t.output),i=n.file??`agents.yaml`,a=await Z(()=>Q(async()=>Lr(await X(e,i),n.sessionId,n.provider)));if(r===`json`){A(a,r);return}k(` ID: ${a.id}`),k(` Agent: ${a.agent_id}`),k(` Environment: ${a.environment_id}`),k(` Status: ${a.status}`),a.title&&k(` Title: ${a.title}`),k(` Created: ${a.created_at}`),k(` Updated: ${a.updated_at}`)}}),Lm=w({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=T(t.output),i=n.file??`agents.yaml`;if(t.dryRun){A({would_delete_session:n.sessionId,provider:n.provider??`auto`,config_file:i},r);return}await Z(()=>Q(async()=>{await Pr(await X(e,i),n.sessionId,n.provider)})),r===`json`?A({deleted:n.sessionId},r):k(`Session ${n.sessionId} deleted.`)}}),Rm=w({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=T(t.output),i=n.file??`agents.yaml`,a=r===`json`,o={agent:n.agent,provider:n.provider,environment:n.environment,vault:n.vault,memoryStores:Mm(n.memoryStores),title:n.title};if(t.dryRun){A({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 Xr(t,n.prompt,o);a||process.stderr.write(`Session created: ${e.session.id}\n`),jm(e,a,{session_id:e.session.id,provider:e.provider,agent:e.agentName})}else{let e=await Yr(t,n.prompt,o);a||process.stderr.write(`Session created: ${e.session.id}\n`),await km(e.events,a,{session_id:e.session.id,provider:e.provider,agent:e.agentName})}}))}}),zm=w({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=T(t.output),i=n.file??`agents.yaml`,a=r===`json`;if(t.dryRun){A({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?jm(await qr(t,n.sessionId,n.message,{provider:n.provider}),a,{session_id:n.sessionId}):await km(await Jr(t,n.sessionId,n.message,{provider:n.provider}),a,{session_id:n.sessionId})}))}}),Bm=w({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=T(t.output),i=n.file??`agents.yaml`,{items:a,hasMore:o}=await Z(()=>Q(async()=>{let t=await X(e,i);return Pm(async e=>{let r=await Br(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`){A({events:Qr(a),has_more:o},r);return}if(a.length===0){k(`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 j(s,c))k(e);k(`\nTotal: ${a.length}`),o&&k(`More events available. Use --all to fetch all.`)}});const Vm=[`custom`,`official`,`all`];var Hm=w({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&&!Vm.includes(e.source)?`--source must be one of: custom, official, all.`:void 0,async run(e){let{settings:t,flags:n}=e,r=T(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 Hr(t,{provider:n.provider,source:a});let[r,o]=await Promise.all([Hr(t,{provider:n.provider,source:`custom`}),Hr(t,{provider:n.provider,source:`official`})]);return[...r,...o]}));if(r===`json`){A({source:a,skills:o},r);return}if(o.length===0){k(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 j(s,c))k(e);k(`\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`},Um={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)`}},Wm=1e3;function Gm(e){return new Promise(t=>setTimeout(t,e))}function Km(e){return e?.data?.DataV2?.data?.data}function qm(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 Jm=w({description:`Initialize Bailian workspace and activate postpaid services`,auth:`none`,usageArgs:`--access-key-id <id> --access-key-secret <secret> [--security-token <token>]`,flags:Um,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){A({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:a,accessKeySecret:o}=r;if(!a||!o)throw new t(`workspace init requires --access-key-id and --access-key-secret.`,s.USAGE);let c=r.securityToken||void 0,l=(await Pe({identity:e.identity,settings:n,baseUrl:e.client.baseUrl,accessKeyId:a,accessKeySecret:o,securityToken:c})).cliAccessToken;if(!l)throw new t(`Failed to generate CLI access token from AK/SK.`,s.GENERAL);let u=ve(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 ne(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}};k(`Checking workspace status...`);let m=Km(await p($.loginInfo));m?.spaceInited===!0?k(`Workspace already initialized.`):(k(`Initializing workspace...`),await p($.initSpace),k(`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.`,s.GENERAL);let g={identity:e.identity,settings:n,baseUrl:e.client.baseUrl,regionId:u.consoleRegion,accessKeyId:a,accessKeySecret:o,securityToken:c};try{await se({...g,reqDTO:{outerKey:h,nickName:h,userName:h}})}catch(e){if(!(e instanceof t)||!/already exists/i.test(e.message))throw e;k(`Console user already exists, continuing.`)}k(`Resolving workspace agent...`);let _=qm(await tt(g));if(_==null)throw new t(`Could not resolve agentId from ListWorkspaces response.`,s.GENERAL,`Re-run with --verbose to inspect the ListWorkspaces response body.`);k(`Authorizing user permissions...`),await It({...g,outerKey:h,agentId:_,policyIndexList:[1]}),await Ym(p,i)}});async function Ym(e,n){k(`Checking service activation status...`);let r;for(let t=0;t<20;t++){let n=Km(await e($.queryBuyResult));if(r=typeof n==`string`?n:n?.result,r!==`buying`)break;t===0&&k(`Service activation in progress, polling...`),await Gm(Wm)}if(r===`fail`)throw new t(`Service activation failed.`,s.GENERAL);if(r===`success`){await Qm(e,n);return}await Zm(e,n)}function Xm(e){let t=Km(e);return Array.isArray(t)?t:[]}async function Zm(e,t){let n=Xm(await e($.commodityOrderInfo)),r=n.filter(e=>e.status===11);if(r.length>0){k(`Warning: Some services are overdue:`);for(let e of r)k(` - ${e.commodityCode}`)}let i=n.filter(e=>e.status===1);if(i.length>0){k(`Activating ${i.length} postpaid services...`),await e($.buyCommodity),await Qm(e,t);return}A({status:`ready`,activeServices:n.filter(e=>e.status===10).map(e=>e.commodityCode)},t)}async function Qm(e,n){k(`Waiting for services to activate...`);for(let t=0;t<20;t++){let t=Xm(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){k(`Warning: Some services are overdue:`);for(let t of e)k(` - ${t.commodityCode}`)}A({status:`ready`,activeServices:t.filter(e=>e.status===10).map(e=>e.commodityCode)},n);return}await Gm(Wm)}throw new t(`Timed out waiting for services to activate.`,s.TIMEOUT)}var $m=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){A({installed:await e.commandPacks.install(e.flags.package)},T(e.settings.output))}}),eh=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){A({linked:await e.commandPacks.link(e.flags.path)},T(e.settings.output))}}),th=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`){A({command_packs:t},n);return}if(t.length===0){k(`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 j([`NAME`,`VERSION`,`SOURCE`,`STATUS`,`COMMANDS / ERROR`],r))k(e)}}),nh=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),A({removed:e.flags.name},T(e.settings.output))}}),rh=w({description:`Install skills from the Bailian skill registry into local agents`,auth:`none`,usageArgs:`--all | --name <name,...>`,flags:{all:{type:`switch`,description:`Install all skills from the registry`},name:{type:`string`,valueHint:`<name,...>`,description:`Comma-separated skill names to install`}},validate(e){if(e.all&&e.name)return`Use either --all or --name, not both`;if(!e.all&&!e.name)return`Specify --all to install everything or --name <name,...> for specific skills`},exampleArgs:[`--all`,`--name spark-video,bailian-model-recommend`],async run(e){let n=e.settings.outputExplicit?e.settings.output:`json`,r=await ke(),i=Object.keys(r.skills),a=e.flags.all?`all`:Tt(e.flags.name,!1),o=a===`all`?i:a,c=jt(),l=ge(),u=await Wt(o.map(e=>async()=>{let t=r.skills[e];if(!t)return{name:e,status:`failed`,reason:`skill not found in registry`};try{let n=await Je(e,t,l,c.skills[e]?.links??[]);return c.skills[e]=n.lockEntry,{name:e,status:`installed`,publishedAt:t.publishedAt,agents:n.linkedAgents}}catch(t){return{name:e,status:`failed`,reason:t instanceof Error?t.message:String(t)}}}),3);if(cn(c),n===`json`)A({registry:We(),agents:l.map(e=>e.id),skills:u},n);else if(u.length===0)k(`Skill registry is empty; no skills to install.`);else{let e=u.map(e=>[e.name,e.status,e.publishedAt?e.publishedAt.slice(0,10):`-`,e.status===`installed`?e.agents?.join(`, `)||`-`:e.reason??`-`]);for(let t of j([`NAME`,`STATUS`,`PUBLISHED`,`AGENTS / REASON`],e))k(t)}let d=u.filter(e=>e.status===`failed`);if(d.length>0)throw new t(`${d.length}/${u.length} skill(s) failed to install`,s.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill add`)}}),ih=w({description:`Update installed skills to the latest registry versions`,auth:`none`,usageArgs:`[--all] [--name <name,...>]`,flags:{all:{type:`switch`,description:`Update all installed skills (default when neither --all nor --name is given)`},name:{type:`string`,valueHint:`<name,...>`,description:`Comma-separated skill names to update (must be already installed)`}},validate(e){if(e.all&&e.name)return`Use either --all or --name, not both`},exampleArgs:[``,`--all`,`--name spark-video`],async run(e){let n=e.settings.outputExplicit?e.settings.output:`json`,r=e.flags.all||!e.flags.name?`all`:Tt(e.flags.name,!1),i=await ke(),a=jt(),o=new Set(ct()),c=ge(),l=[],u=[];if(r===`all`)for(let[e,t]of Object.entries(a.skills)){let n=i.skills[e];if(!n){l.push({name:e,status:`skipped`,reason:`delisted from remote; local copy retained`});continue}if(n.contentHash===t.contentHash&&o.has(e)){let n=Ce(e,c,t.links??[]);a.skills[e]={...t,links:n.links},l.push({name:e,status:`up-to-date`,publishedAt:t.publishedAt});continue}u.push(e)}else for(let e of r){if(!a.skills[e]){l.push({name:e,status:`failed`,reason:`not installed; run bl skill add --name `+e+` first`});continue}u.push(e)}let d=await Wt(u.map(e=>async()=>{let t=i.skills[e];if(!t)return{name:e,status:`failed`,reason:`skill not found in registry`};try{let n=await Je(e,t,c,a.skills[e]?.links??[]);return a.skills[e]=n.lockEntry,{name:e,status:`updated`,publishedAt:t.publishedAt}}catch(t){return{name:e,status:`failed`,reason:t instanceof Error?t.message:String(t)}}}),3);if(l.push(...d),cn(a),n===`json`)A({registry:We(),skills:l},n);else if(l.length===0)k(`No skills installed locally; run bl skill add first.`);else{let e=l.map(e=>[e.name,e.status,e.publishedAt?e.publishedAt.slice(0,10):`-`]);for(let t of j([`NAME`,`STATUS`,`PUBLISHED`],e))k(t);let t=l.filter(e=>(e.status===`skipped`||e.status===`failed`)&&e.reason);if(t.length>0){k(``);for(let e of t)k(` ${e.name}: ${e.reason}`)}}let f=l.filter(e=>e.status===`failed`);if(f.length>0)throw new t(`${f.length} skill(s) failed to update`,s.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill update`)}}),ah=w({description:`Remove locally installed skills (registry is untouched)`,auth:`none`,usageArgs:`--name <all|name,...>`,flags:{name:{type:`string`,valueHint:`<all|name,...>`,description:`Skills to remove: all or comma-separated skill names`,required:!0}},exampleArgs:[`--name spark-video`,`--name all`],async run(e){let n=e.settings.outputExplicit?e.settings.output:`json`,r=Tt(e.flags.name,!1),i=jt(),a=r===`all`?Object.keys(i.skills):r;if(a.length===0){A({skills:[]},n),n===`text`&&k(`No skills installed locally; nothing to remove.`);return}let o=new Set(ct()),c=[];for(let e of a){let t=i.skills[e];if(!t){c.push({name:e,status:`failed`,reason:o.has(e)?`directory not managed by bl skill (untracked); remove manually if needed`:`not installed`});continue}try{let n=$t(e,t.links??[]);Pt(e),delete i.skills[e],c.push({name:e,status:`removed`,removedLinks:n.length})}catch(t){c.push({name:e,status:`failed`,reason:t instanceof Error?t.message:String(t)})}}if(cn(i),n===`json`)A({skills:c},n);else{let e=c.map(e=>[e.name,e.status,e.status===`removed`?`reclaimed ${e.removedLinks} agent link(s)`:e.reason??`-`]);for(let t of j([`NAME`,`STATUS`,`DETAIL`],e))k(t)}let l=c.filter(e=>e.status===`failed`);if(l.length>0)throw new t(`${l.length}/${c.length} skill(s) failed to remove`,s.GENERAL,`Check the reason for failed skills in the output; use bl skill list to verify local install status`)}});function oh(e){return e?e.length>60?`${e.slice(0,59)}…`:e:`-`}var sh=w({description:`List registry skills and diff against local installs`,auth:`none`,exampleArgs:[``,`--output json`],notes:[`STATUS: installed | outdated | not-installed | missing (lock has it, dir deleted) | untracked (dir exists, not managed)`],async run(e){let t=e.settings.outputExplicit?e.settings.output:`json`,n=await ke(),r=oe(n,jt(),ct());if(t===`json`){A({registry:We(),...n.updatedAt?{updatedAt:n.updatedAt}:{},skills:r},t);return}if(r.length===0){k(`Skill registry is empty and no skills are installed locally.`);return}let i=r.map(e=>[e.name,e.status,e.publishedAt?e.publishedAt.slice(0,19).replace(`T`,` `):`-`,oh(e.description)]);for(let e of j([`NAME`,`STATUS`,`UPDATEDAT`,`DESCRIPTION`],i))k(e)}});const ch=`json`,lh={success:`success`,partial:`partial`,failed:`failed`};var uh=w({description:`Install all bailian-* skills (one-shot bootstrap for new environments)`,auth:`none`,usageArgs:``,exampleArgs:[``],notes:[`Fetches the registry index and installs every skill whose name starts with bailian-`,`Equivalent to: bl skill add --all (filtered to bailian-* skills)`],async run(e){let n=e.settings.outputExplicit?e.settings.output:ch,r=await ke(),i=Object.keys(r.skills).filter(e=>e.startsWith(`bailian-`)),a=jt(),o=ge(),c=await Wt(i.map(e=>async()=>{let t=r.skills[e];try{let n=await Je(e,t,o,a.skills[e]?.links??[]);return a.skills[e]=n.lockEntry,{name:e,status:lh.success}}catch(t){return{name:e,status:lh.failed,reason:t instanceof Error?t.message:String(t)}}}),3);cn(a);let l=c.filter(e=>e.status===lh.success),u=c.filter(e=>e.status===lh.failed),d=u.length===0?lh.success:l.length===0?lh.failed:lh.partial;if(n===ch){let e=o.map(e=>e.id),t={status:d,skills:l.map(e=>e.name)};u.length>0&&(t.failed=u.map(t=>({name:t.name,reason:t.reason,agents:e}))),A(t,n)}else if(c.length===0)k(`No bailian-* skills found in the registry.`);else if(k(d===lh.success?`Installed ${l.length} bailian-* skills.`:`Installed ${l.length}/${c.length} bailian-* skills.`),u.length>0){k(`Failed:`);for(let e of u)k(` ${e.name}: ${e.reason}`)}if(u.length>0)throw new t(`${u.length}/${c.length} skill(s) failed to install`,s.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill init`)}});export{bd as advisorRecommend,Fs as appCall,Ls as appList,Ei as authGenerateAccessToken,Ci as authLogin,Ti as authLogout,wi as authStatus,Os as configAgent,xa as configList,ba as configSet,ya as configShow,Wo as configUi,Sa as configUse,au as consoleCall,yf as datasetDelete,vf as datasetGet,_f as datasetList,gf as datasetUpload,bf as datasetValidate,fp as deployAudioCreate,yp as deployDelete,hp as deployGet,pp as deployImageCreate,mp as deployList,gp as deployModels,bp as deployPause,xp as deployResume,_p as deployScale,dp as deployTextCreate,vp as deployUpdate,iu as fileUpload,Ff as finetuneAudioCreate,Hf as finetuneCancel,np as finetuneCapability,Jf as finetuneCheckpoints,Uf as finetuneDelete,Yf as finetuneExport,Vf as finetuneGet,If as finetuneImageCreate,Rf as finetuneList,qf as finetuneLogs,ap as finetunePrice,Pf as finetuneTextCreate,Lf as finetuneVideoCreate,ep as finetuneWatch,Ji as imageEdit,Wi as imageGenerate,xl as knowledgeCategoryAdd,Sl as knowledgeCategoryDelete,bl as knowledgeCategoryList,lc as knowledgeChat,ll as knowledgeChunkAdd,gl as knowledgeChunkDelete,ul as knowledgeChunkList,pl as knowledgeChunkUpdate,Ol as knowledgeCollectionCreate,kl as knowledgeCollectionGet,Ic as knowledgeDocDelete,Al as knowledgeDocImportOss,hc as knowledgeDocList,vc as knowledgeDocStatus,Lc as knowledgeDocTag,Ec as knowledgeDocUpload,Dl as knowledgeFileDelete,wl as knowledgeFileGet,Cl as knowledgeFileList,kc as knowledgeKbCreate,Nc as knowledgeKbDelete,mc as knowledgeKbInfo,uc as knowledgeKbList,yl as knowledgeKbStats,Ac as knowledgeKbUpdate,Gs as knowledgeRetrieve,rc as knowledgeSearch,ol as knowledgeServiceCopy,Gc as knowledgeServiceCreate,al as knowledgeServiceDelete,nl as knowledgeServiceDeploy,Wc as knowledgeServiceGet,Vc as knowledgeServiceList,$c as knowledgeServiceUpdate,ym as managedAgentApply,bm as managedAgentDestroy,Xp as managedAgentInit,vm as managedAgentPlan,Nm as managedAgentSessionCreate,Lm as managedAgentSessionDelete,Bm as managedAgentSessionEvents,Im as managedAgentSessionGet,Fm as managedAgentSessionList,Rm as managedAgentSessionRun,zm as managedAgentSessionSend,Hm as managedAgentSkillList,wm as managedAgentStateImport,xm as managedAgentStateList,Cm as managedAgentStateRm,Sm as managedAgentStateShow,hm as managedAgentValidate,Bl as mcpCall,Hl as mcpList,Ul as mcpTools,Rs as memoryAdd,Hs as memoryDelete,Bs as memoryList,Us as memoryProfileCreate,Ws as memoryProfileGet,zs as memorySearch,Vs as memoryUpdate,Md as modelList,mf as permissionGrant,lf as permissionList,hf as permissionRevoke,ed as pipelineRun,ad as pipelineValidate,$m as pluginInstall,eh as pluginLink,th as pluginList,nh as pluginRemove,of as quotaCheck,Qd as quotaHistory,Gd as quotaList,Kd as quotaUpdate,Gl as searchWeb,rh as skillAdd,uh as skillInit,sh as skillList,ah as skillRemove,ih as skillUpdate,tu as speechRecognize,Xl as speechSynthesize,Ii as textChat,Ui as textOmni,Up as tokenPlanAddMember,Bp as tokenPlanAssignSeats,Ip as tokenPlanCreateKey,Mp as tokenPlanListSeats,Ps as update,Qu as usageCodingPlan,ju as usageFree,Mu as usageFreetier,Iu as usageStats,Lu as usageSummary,Gu as usageTokenPlan,na as videoDownload,$i as videoEdit,Qi as videoGenerate,ea as videoRef,ta as videoTaskGet,oa as visionDescribe,Jm as workspaceInit,Ld as workspaceList};
|